mirror of
https://github.com/SlimeVR/SlimeVR-Server.git
synced 2026-04-06 02:01:58 +02:00
Start using fluent syntaxing (#423)
This commit is contained in:
@@ -3,7 +3,10 @@
|
||||
"version": "0.5.1",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@fluent/bundle": "^0.17.1",
|
||||
"@fluent/react": "^0.14.1",
|
||||
"@fontsource/poppins": "^4.5.8",
|
||||
"@formatjs/intl-localematcher": "^0.2.32",
|
||||
"@tauri-apps/api": "^1.0.2",
|
||||
"@vitejs/plugin-react": "^2.2.0",
|
||||
"browserslist": "^4.18.1",
|
||||
@@ -15,11 +18,8 @@
|
||||
"file-loader": "^6.2.0",
|
||||
"flatbuffers": "^22.10.26",
|
||||
"fs-extra": "^10.0.0",
|
||||
"i18next": "^22.0.6",
|
||||
"i18next-browser-languagedetector": "^7.0.1",
|
||||
"i18next-fluent": "^2.0.0",
|
||||
"i18next-fluent-backend": "^0.0.3",
|
||||
"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",
|
||||
@@ -30,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",
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
## Websocket status
|
||||
### 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 = weconnyecting to teh sewvew
|
||||
websocket-connection_lost = oopsie woopsie~ connyection wost to teh sewvew ;m;... uwu am twying to weconnyect owo!
|
||||
|
||||
@@ -115,35 +122,65 @@ tracker-infos-url = twackaw uawl
|
||||
## Tracker settings
|
||||
tracker-settings-back = go bak to twackaws liwst
|
||||
tracker-settings-title = twackaw sewtings
|
||||
tracker-settings-assignment_section-title = assiwnment
|
||||
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-title = meownting pawsition
|
||||
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-name_section-title = twackaw name
|
||||
# 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-placeholder = ewimewl's weft pawb
|
||||
tracker-settings-name_section-description = owo whats dis?
|
||||
tracker-settings-name_section-input_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-title = whewe doo yew want dis twayckaw to be?? >~>
|
||||
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
|
||||
tracker_selection_menu-title = which twayckaw to assyign to the { $bodyPart }?
|
||||
# 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-title = whewe doo yew want dis twayckaw to be?
|
||||
mounting_selection_menu = whewe doo yew want dis twayckaw to be?
|
||||
mounting_selection_menu-close = cwose
|
||||
|
||||
## Sidebar settings
|
||||
@@ -151,56 +188,81 @@ 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-title = steamvr~
|
||||
settings-general-steamvr = steamvr~
|
||||
settings-general-steamvr-subtitle = steamvr twayckaws~
|
||||
settings-general-steamvr-description-p0 = enyable or dysabywe specific twacking pawts.
|
||||
settings-general-steamvr-description-p1 = usefuw if yew want mowwe contwoww owew what swimevr does.
|
||||
# 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-title = twayckaw mechanics~
|
||||
settings-general-tracker_mechanics = twayckaw mechanics~
|
||||
settings-general-tracker_mechanics-subtitle = fiwtering~
|
||||
settings-general-tracker_mechanics-description-p0 = chooce teh fiwwtewing type fow youw twackaws.
|
||||
settings-general-tracker_mechanics-description-p1 = pwediction pwedicts movment while smowthing smowthens movment.
|
||||
settings-general-tracker_mechanics-filtering_type-title = fiwtewing type~
|
||||
settings-general-tracker_mechanics-filtering_type-none-label = no fiwwtewing~
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-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-label = smowthing
|
||||
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-label = pwediction~
|
||||
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-amount-label = amownt
|
||||
settings-general-tracker_mechanics-amount = amownt
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings-title = fk sewttings
|
||||
settings-general-fk_settings-leg_tweak-title = leg tweeks
|
||||
## 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-arm_fk-title = awm fk
|
||||
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-title = skeweton sewttings
|
||||
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-title = gestauw cantwol
|
||||
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
|
||||
settings-general-gesture_control-taps = baps
|
||||
# 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
|
||||
@@ -212,21 +274,23 @@ settings-general-gesture_control-mountingResetDelay = mountwing weset deway
|
||||
settings-general-gesture_control-mountingResetTaps = baps for mountwing weset
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface-title = intewface
|
||||
settings-general-interface-dev_mode-title = devwowwewow mode
|
||||
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-title = shewyaw device deteccion
|
||||
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-title = sewect wanguage
|
||||
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-title = shewyaw console
|
||||
settings-serial-description-p0 = this is a wiwve infowmation feed fow shewyaw comyunicaytion
|
||||
settings-serial-description-p1 = may be usefuw if yuw need to know teh fiwmwawe is acting up
|
||||
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
|
||||
@@ -235,39 +299,50 @@ settings-serial-serial_select = sewect a shewyaw pawt
|
||||
settings-serial-auto_dropdown_item = awto
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router-title = OSC wouwter
|
||||
settings-osc-router-description-p0 = fowwawd osc messages fwom anothew pwogwam
|
||||
settings-osc-router-description-p1 = usefuww fow uwsing anothew osc pwogwam with VRChat fow exampwe
|
||||
settings-osc-router-enable-title = enaybwe
|
||||
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-title = network pawts
|
||||
settings-osc-router-network-description-p0 = set the pawts fow wistening awnd sending data
|
||||
settings-osc-router-network-description-p1 = these can be the same as othew powts uwsed in the swimevr sewvew
|
||||
settings-osc-router-network-port_in-label = pawt in
|
||||
settings-osc-router-network-port_in-placeholder = pawt in (defawwt: 9002)
|
||||
settings-osc-router-network-port_out-label = pawt out
|
||||
settings-osc-router-network-port_out-placeholder = pawt out (defawwt: 9000)
|
||||
settings-osc-router-network-address-title = network addwess
|
||||
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-description-p0 = change vwchat-specific settwings to wweceive hmd data awnd send
|
||||
settings-osc-vrchat-description-p1 = twayckaws data fow fbt (wawwks on quest standalone).
|
||||
settings-osc-vrchat-enable-title = enaybwe
|
||||
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-title = network pawts
|
||||
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
|
||||
settings-osc-vrchat-network-port_in-placeholder = pawt in (defawwt: 9001)
|
||||
settings-osc-vrchat-network-port_out-label = pawt out
|
||||
settings-osc-vrchat-network-port_out-placeholder = pawt out (defawwt: 9000)
|
||||
settings-osc-vrchat-network-address-title = network addwess
|
||||
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-title = trayckawws
|
||||
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
|
||||
@@ -282,21 +357,31 @@ onboarding-wip = wowwk in pwowgress
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = gaww bawwk to intwoduction
|
||||
onboarding-wifi_creds-title = input wifi cwedentials
|
||||
onboarding-wifi_creds-description-p0 = teh twawckaws will use these cwedentials to connect wirelessly
|
||||
onboarding-wifi_creds-description-p1 = pwease use teh cwedentials that yaww awe cwowently cownyected to
|
||||
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-title = weset tutowial
|
||||
onboarding-reset_tutorial = weset tutowial
|
||||
onboarding-reset_tutorial-description = dis featuwe isn't done, just pwess continyue
|
||||
|
||||
## Setup start
|
||||
onboarding-home-title = wewcome to swimevr
|
||||
onboarding-home-description-p0 = bwinging fuww-bawdy twacking
|
||||
onboarding-home-description-p1 = to everyone
|
||||
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
|
||||
@@ -322,20 +407,35 @@ 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
|
||||
onboarding-connect_tracker-connected_trackers = { $amount } twackers cownyected
|
||||
# $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
|
||||
onboarding-assign_trackers-assigned = { $assigned } of { $trackers } twackaws assigned
|
||||
# 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-title = manual meownting
|
||||
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
|
||||
@@ -390,7 +490,11 @@ onboarding-automatic_proportions-recording-steps-2 = twist upwe wowdy wowft, the
|
||||
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
|
||||
onboarding-automatic_proportions-recording-timer = { $time } secondsy wowft
|
||||
# $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
|
||||
@@ -1,4 +1,11 @@
|
||||
## Websocket status
|
||||
### 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 = Connecting to the server
|
||||
websocket-connection_lost = Connection lost to the server. Trying to reconnect...
|
||||
|
||||
@@ -115,35 +122,65 @@ tracker-infos-url = Tracker URL
|
||||
## Tracker settings
|
||||
tracker-settings-back = Go back to trackers list
|
||||
tracker-settings-title = Tracker settings
|
||||
tracker-settings-assignment_section-title = Assignment
|
||||
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-title = Mounting position
|
||||
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-name_section-title = Tracker name
|
||||
# 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-placeholder = NightyBeast's left leg
|
||||
tracker-settings-name_section-description = Give it a cute nickname :)
|
||||
tracker-settings-name_section-input_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-title = Where do you want this tracker to be?
|
||||
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
|
||||
tracker_selection_menu-title = Which tracker to assign to the { $bodyPart }?
|
||||
# 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-title = Where do you want this tracker to be?
|
||||
mounting_selection_menu = Where do you want this tracker to be?
|
||||
mounting_selection_menu-close = Close
|
||||
|
||||
## Sidebar settings
|
||||
@@ -158,10 +195,15 @@ settings-sidebar-utils = Utilities
|
||||
settings-sidebar-serial = Serial console
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr-title = SteamVR
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR trackers
|
||||
settings-general-steamvr-description-p0 = Enable or disable specific SteamVR trackers.
|
||||
settings-general-steamvr-description-p1 = Useful for games or apps that only support certain 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
|
||||
@@ -170,30 +212,39 @@ settings-general-steamvr-trackers-elbows = Elbows
|
||||
settings-general-steamvr-trackers-hands = Hands
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics-title = Tracker mechanics
|
||||
settings-general-tracker_mechanics = Tracker mechanics
|
||||
settings-general-tracker_mechanics-subtitle = Filtering
|
||||
settings-general-tracker_mechanics-description-p0 = Choose the filtering type for your trackers.
|
||||
settings-general-tracker_mechanics-description-p1 = Prediction predicts movement while smoothing smoothens movement.
|
||||
settings-general-tracker_mechanics-filtering_type-title = Filtering type
|
||||
settings-general-tracker_mechanics-filtering_type-none-label = No filtering
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-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-label = Smoothing
|
||||
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-label = Prediction
|
||||
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-amount-label = Amount
|
||||
settings-general-tracker_mechanics-amount = Amount
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings-title = Tracking settings
|
||||
settings-general-fk_settings-leg_tweak-title = Leg tweaks
|
||||
## 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-title = Arm tracking
|
||||
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-title = Skeleton settings
|
||||
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
|
||||
@@ -202,12 +253,16 @@ 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-title = Gesture control
|
||||
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.
|
||||
settings-general-gesture_control-taps = taps
|
||||
# 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
|
||||
@@ -219,21 +274,23 @@ settings-general-gesture_control-mountingResetDelay = Mounting reset delay
|
||||
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface-title = Interface
|
||||
settings-general-interface-dev_mode-title = Developer Mode
|
||||
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-title = Serial device detection
|
||||
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-title = Select language
|
||||
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-title = Serial Console
|
||||
settings-serial-description-p0 = This is a live information feed for serial communication.
|
||||
settings-serial-description-p1 = May be useful if you need to know the firmware is acting up.
|
||||
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
|
||||
@@ -242,39 +299,50 @@ settings-serial-serial_select = Select a serial port
|
||||
settings-serial-auto_dropdown_item = Auto
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router-title = OSC router
|
||||
settings-osc-router-description-p0 = Forward OSC messages from another program.
|
||||
settings-osc-router-description-p1 = Useful for using another OSC program with VRChat for example.
|
||||
settings-osc-router-enable-title = Enable
|
||||
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-title = Network ports
|
||||
settings-osc-router-network-description-p0 = Set the ports for listening and sending data.
|
||||
settings-osc-router-network-description-p1 = These can be the same as other ports used in the SlimeVR server.
|
||||
settings-osc-router-network-port_in-label = Port In
|
||||
settings-osc-router-network-port_in-placeholder = Port in (default: 9002)
|
||||
settings-osc-router-network-port_out-label = Port Out
|
||||
settings-osc-router-network-port_out-placeholder = Port out (default: 9000)
|
||||
settings-osc-router-network-address-title = Network address
|
||||
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-description-p0 = Change VRChat-specific settings to receive HMD data and send
|
||||
settings-osc-vrchat-description-p1 = trackers data for FBT (works on Quest standalone).
|
||||
settings-osc-vrchat-enable-title = Enable
|
||||
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-title = Network ports
|
||||
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
|
||||
settings-osc-vrchat-network-port_in-placeholder = Port in (default: 9001)
|
||||
settings-osc-vrchat-network-port_out-label = Port Out
|
||||
settings-osc-vrchat-network-port_out-placeholder = Port out (default: 9000)
|
||||
settings-osc-vrchat-network-address-title = Network address
|
||||
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-title = Trackers
|
||||
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
|
||||
@@ -289,21 +357,31 @@ onboarding-wip = Work in progress
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = Go Back to introduction
|
||||
onboarding-wifi_creds-title = Input WiFi credentials
|
||||
onboarding-wifi_creds-description-p0 = The Trackers will use these credentials to connect wirelessly
|
||||
onboarding-wifi_creds-description-p1 = please use the credentials that you are currently connected to
|
||||
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-title = Reset tutorial
|
||||
onboarding-reset_tutorial = Reset tutorial
|
||||
onboarding-reset_tutorial-description = This feature isn't done, just press continue
|
||||
|
||||
## Setup start
|
||||
onboarding-home-title = Welcome to SlimeVR
|
||||
onboarding-home-description-p0 = Bringing full-body tracking
|
||||
onboarding-home-description-p1 = to everyone
|
||||
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
|
||||
@@ -329,20 +407,35 @@ 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
|
||||
onboarding-connect_tracker-connected_trackers = { $amount } trackers connected
|
||||
# $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
|
||||
onboarding-assign_trackers-assigned = { $assigned } of { $trackers } trackers assigned
|
||||
# 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-title = Manual Mounting
|
||||
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
|
||||
@@ -397,7 +490,11 @@ onboarding-automatic_proportions-recording-steps-2 = Twist upper body left, then
|
||||
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
|
||||
onboarding-automatic_proportions-recording-timer = { $time } seconds left
|
||||
# $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
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
## Websocket status
|
||||
### 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 = Conectando al servidor
|
||||
websocket-connection_lost = Conexión al servidor perdida. Intentando reconectar...
|
||||
|
||||
@@ -115,35 +122,65 @@ 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-title = Asignación
|
||||
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-title = Posición de montura
|
||||
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-name_section-title = Nombre del sensor
|
||||
# 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-placeholder = Pierna izquierda de NightyBeast
|
||||
tracker-settings-name_section-description = Dale un apodo bonito :)
|
||||
tracker-settings-name_section-input_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-title = ¿Dónde quieres que esté este sensor?
|
||||
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
|
||||
tracker_selection_menu-title = ¿Asignar { $bodyPart } a qué sensor?
|
||||
# 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-title = ¿Dónde quieres colocar el sensor?
|
||||
mounting_selection_menu = ¿Dónde quieres colocar el sensor?
|
||||
mounting_selection_menu-close = Cerrar
|
||||
|
||||
## Sidebar settings
|
||||
@@ -158,10 +195,15 @@ settings-sidebar-utils = Utilidades
|
||||
settings-sidebar-serial = Consola serial
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr-title = SteamVR
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = Sensores en SteamVR
|
||||
settings-general-steamvr-description-p0 = Habilita o deshabilita sensores de SteamVR en específico.
|
||||
settings-general-steamvr-description-p1 = Útil para juegos y aplicaciones que solo soportan ciertos sensores..
|
||||
# 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
|
||||
@@ -170,40 +212,57 @@ settings-general-steamvr-trackers-elbows = Codos
|
||||
settings-general-steamvr-trackers-hands = Manos
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics-title = Mecánicas del sensor
|
||||
settings-general-tracker_mechanics = Mecánicas del sensor
|
||||
settings-general-tracker_mechanics-subtitle = Filtrado
|
||||
settings-general-tracker_mechanics-description-p0 = Selecciona un tipo de filtro para tus sensores.
|
||||
settings-general-tracker_mechanics-description-p1 = Predicción predice el movimiento mientras que el suavizado suaviza el movimiento.
|
||||
settings-general-tracker_mechanics-filtering_type-title = Tipos de filtro
|
||||
settings-general-tracker_mechanics-filtering_type-none-label = Sin filtro
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-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-label = Suavizado
|
||||
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-label = Predicción
|
||||
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-amount-label = Cantidad
|
||||
settings-general-tracker_mechanics-amount = Cantidad
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings-title = Ajustes de sensores
|
||||
settings-general-fk_settings-leg_tweak-title = Corrección de piernas
|
||||
## 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-title = Trackeo de brazos
|
||||
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-title = Ajustes de esqueleto
|
||||
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-title = Control de gestos
|
||||
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.
|
||||
settings-general-gesture_control-taps = toques
|
||||
# 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
|
||||
@@ -215,21 +274,23 @@ settings-general-gesture_control-mountingResetDelay = Retraso de reinicio de mon
|
||||
settings-general-gesture_control-mountingResetTaps = Toques para reinicio de montura
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface-title = Interfaz
|
||||
settings-general-interface-dev_mode-title = Modo desarrollador
|
||||
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-title = Detección de dispositivo serial
|
||||
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-title = Selecciona un idioma
|
||||
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-title = Consola serial
|
||||
settings-serial-description-p0 = Esta es la comunicación serial actualizada en vivo.
|
||||
settings-serial-description-p1 = Puede ser util para saber si el firmware tiene problemas.
|
||||
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
|
||||
@@ -238,39 +299,50 @@ settings-serial-serial_select = Selecciona un puerto serial
|
||||
settings-serial-auto_dropdown_item = Auto
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router-title = Router OSC
|
||||
settings-osc-router-description-p0 = Redirecciona mensajes OSC recibidos de otro programa.
|
||||
settings-osc-router-description-p1 = Útil para usar otro programa OSC con VRChat por ejemplo.
|
||||
settings-osc-router-enable-title = Habilitar
|
||||
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-title = Puertos de conexión
|
||||
settings-osc-router-network-description-p0 = Establece los puertos de entrada y salida de datos
|
||||
settings-osc-router-network-description-p1 = Estos pueden ser lo mismos puertos usados en el servidor de SlimeVR.
|
||||
settings-osc-router-network-port_in-label = Puerto de entrada
|
||||
settings-osc-router-network-port_in-placeholder = Puerto de entrada (por defecto: 9002)
|
||||
settings-osc-router-network-port_out-label = Puerto de salida
|
||||
settings-osc-router-network-port_out-placeholder = Puerto de salida (por defecto: 9000)
|
||||
settings-osc-router-network-address-title = Dirección de red
|
||||
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-description-p0 = Cambiar ajustes específicos de VRChat para recibir datos del HMD y enviar
|
||||
settings-osc-vrchat-description-p1 = datos de los sensores para seguimiento de cuerpo completo (funciona en Quest nativo).
|
||||
settings-osc-vrchat-enable-title = Habilitar
|
||||
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-title = Puertos de conexión
|
||||
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
|
||||
settings-osc-vrchat-network-port_in-placeholder = Puerto de entrada (por defecto: 9001)
|
||||
settings-osc-vrchat-network-port_out-label = Puerto de salida
|
||||
settings-osc-vrchat-network-port_out-placeholder = Puerto de salida (por defecto: 9000)
|
||||
settings-osc-vrchat-network-address-title = Dirección de red
|
||||
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-title = Sensores
|
||||
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
|
||||
@@ -285,21 +357,31 @@ onboarding-wip = Trabajo en progreso
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = Volver a la introducción
|
||||
onboarding-wifi_creds-title = Ingresar credenciales del WiFi
|
||||
onboarding-wifi_creds-description-p0 = Los sensores utilizarán estas credenciales para conectarse inalámbricamente.
|
||||
onboarding-wifi_creds-description-p1 = Por favor usa las credenciales del WiFi al cuál estás conectado actualmente.
|
||||
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-title = Reiniciar tutorial
|
||||
onboarding-reset_tutorial = Reiniciar tutorial
|
||||
onboarding-reset_tutorial-description = Esta aún parte no está finalizada, por favor presione continuar
|
||||
|
||||
## Setup start
|
||||
onboarding-home-title = Bienvenido a SlimeVR
|
||||
onboarding-home-description-p0 = ¡Acercando el seguimiento
|
||||
onboarding-home-description-p1 = de cuerpo completo a todos!
|
||||
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
|
||||
@@ -325,20 +407,35 @@ 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
|
||||
onboarding-connect_tracker-connected_trackers = Sensores conectados: { $amount }
|
||||
# $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
|
||||
onboarding-assign_trackers-assigned = Sensores asignados: { $assigned } de { $trackers }
|
||||
# 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-title = Montura manual
|
||||
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
|
||||
@@ -393,7 +490,11 @@ onboarding-automatic_proportions-recording-steps-2 = Gira tu torso hacia la izqu
|
||||
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
|
||||
onboarding-automatic_proportions-recording-timer = Quedan { $time } segundos
|
||||
# $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
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
## Websocket status
|
||||
### 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 = Connexion au serveur..
|
||||
websocket-connection_lost = Connexion avec le serveur perdue. Reconnexion...
|
||||
|
||||
@@ -115,35 +122,65 @@ 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-title = Assignement 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-title = Orientation du capteur
|
||||
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-name_section-title = Nom personalisé
|
||||
# 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-placeholder = Patte gauche d'Erimel
|
||||
tracker-settings-name_section-description = Donnez-lui un joli surnom :3
|
||||
tracker-settings-name_section-input_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-title = Où assigner ce capteur?
|
||||
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
|
||||
tracker_selection_menu-title = Quel capteur attribuer à { $bodyPart }?
|
||||
# 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-title = Dans quelle direction pointe ce capteur?
|
||||
mounting_selection_menu = Dans quelle direction pointe ce capteur?
|
||||
mounting_selection_menu-close = Fermer
|
||||
|
||||
## Sidebar settings
|
||||
@@ -158,10 +195,15 @@ settings-sidebar-utils = Utilitaires
|
||||
settings-sidebar-serial = Console série
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr-title = SteamVR
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = Capteurs SteamVR
|
||||
settings-general-steamvr-description-p0 = Activez ou désactivez des capteurs SteamVR.
|
||||
settings-general-steamvr-description-p1 = Utile pour les jeux ou applications qui ne supportent que certains capteurs.
|
||||
# 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
|
||||
@@ -170,40 +212,57 @@ settings-general-steamvr-trackers-elbows = Coudes
|
||||
settings-general-steamvr-trackers-hands = Mains
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics-title = Paramètres des capteurs
|
||||
settings-general-tracker_mechanics = Paramètres des capteurs
|
||||
settings-general-tracker_mechanics-subtitle = Filtrage
|
||||
settings-general-tracker_mechanics-description-p0 = Choisissez le type de filtrage pour vos capteurs.
|
||||
settings-general-tracker_mechanics-description-p1 = La prédiction prédit les mouvements tandis que la fluidification rend les mouvements plus fluides.
|
||||
settings-general-tracker_mechanics-filtering_type-title = Type de filtrage
|
||||
settings-general-tracker_mechanics-filtering_type-none-label = Pas de filtrage
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-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-label = Fluidification
|
||||
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-label = Prédiction
|
||||
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-amount-label = Intensité du filtrage
|
||||
settings-general-tracker_mechanics-amount = Intensité du filtrage
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings-title = Paramètres de la capture
|
||||
settings-general-fk_settings-leg_tweak-title = Ajustement des jambes
|
||||
## 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-title = Capture des bras
|
||||
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-title = Paramètres du squelette
|
||||
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-title = Contrôle gestuel
|
||||
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.
|
||||
settings-general-gesture_control-taps = tapes
|
||||
# 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
|
||||
@@ -215,21 +274,23 @@ settings-general-gesture_control-mountingResetDelay = Délai de réinitialisatio
|
||||
settings-general-gesture_control-mountingResetTaps = Tapes pour la réinitialisation de l'alignement
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface-title = Interface
|
||||
settings-general-interface-dev_mode-title = Mode développeur
|
||||
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-title = Détection de périphérique série
|
||||
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-title = Sélectionner la langue
|
||||
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-title = Console série
|
||||
settings-serial-description-p0 = Il s'agit d'un flux d'informations en direct pour la communication en série.
|
||||
settings-serial-description-p1 = Peut être utile pour savoir si un capteur fonctionne correctement.
|
||||
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
|
||||
@@ -238,39 +299,50 @@ settings-serial-serial_select = Sélectionnez un port série
|
||||
settings-serial-auto_dropdown_item = Automatique
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router-title = Routeur OSC
|
||||
settings-osc-router-description-p0 = Transférez les messages OSC provenant d'un autre programme
|
||||
settings-osc-router-description-p1 = Utile pour utiliser un autre programme OSC avec VRChat par exemple.
|
||||
settings-osc-router-enable-title = Activer
|
||||
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-title = Ports réseau
|
||||
settings-osc-router-network-description-p0 = Définissez les ports pour écouter et envoyer des données.
|
||||
settings-osc-router-network-description-p1 = 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
|
||||
settings-osc-router-network-port_in-placeholder = Port de réception (par défaut: 9002)
|
||||
settings-osc-router-network-port_out-label = Port d'envoi
|
||||
settings-osc-router-network-port_out-placeholder = Port d'envoi (par défaut: 9000)
|
||||
settings-osc-router-network-address-title = Adresse réseau
|
||||
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-description-p0 = Modifiez les paramètres spécifiques à VRChat pour recevoir et envoyer
|
||||
settings-osc-vrchat-description-p1 = des capteurs par OSC (fonctionne sur Quest sans PC).
|
||||
settings-osc-vrchat-enable-title = Activer
|
||||
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-title = Connexions réseau
|
||||
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
|
||||
settings-osc-vrchat-network-port_in-placeholder = Port de réception (par défaut : 9001)
|
||||
settings-osc-vrchat-network-port_out-label = Port de sortie
|
||||
settings-osc-vrchat-network-port_out-placeholder = Port d'envoi (par défaut : 9000)
|
||||
settings-osc-vrchat-network-address-title = Adresse réseau
|
||||
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-title = capteurs
|
||||
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
|
||||
@@ -285,21 +357,31 @@ onboarding-wip = Pas encore implémenté
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = Retour à l'introduction
|
||||
onboarding-wifi_creds-title = Saisir les identifiants Wi-Fi
|
||||
onboarding-wifi_creds-description-p0 = Les capteurs utiliseront ces informations d'identification pour se connecter au réseau.
|
||||
onboarding-wifi_creds-description-p1 = Veuillez utiliser les identifiants avec lesquels vous êtes actuellement connecté.
|
||||
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-title = Didacticiel de réinitialisation
|
||||
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-title = Bienvenue sur SlimeVR
|
||||
onboarding-home-description-p0 = Rendre la capture des mouvements
|
||||
onboarding-home-description-p1 = accessible à toutes et tous!
|
||||
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
|
||||
@@ -325,20 +407,35 @@ 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
|
||||
onboarding-connect_tracker-connected_trackers = { $amount } capteurs connectés
|
||||
# $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.
|
||||
onboarding-assign_trackers-assigned = { $assigned } capteur(s) sur { $trackers } attribué(s)
|
||||
# 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-title = Alignement manuel
|
||||
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
|
||||
@@ -393,7 +490,11 @@ onboarding-automatic_proportions-recording-steps-2 = Tournez le haut du corps ve
|
||||
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
|
||||
onboarding-automatic_proportions-recording-timer = { $time } secondes restantes
|
||||
# $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
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
## Websocket status
|
||||
### 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 = Connessione al server in corso
|
||||
websocket-connection_lost = Connessione con il server persa. Tentativo di riconnessione in corso...
|
||||
|
||||
@@ -115,35 +122,65 @@ 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-title = Assegnazione
|
||||
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-title = posizionamento di montaggio
|
||||
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-name_section-title = Nome del tracker
|
||||
# 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-placeholder = Gamba destra di NightyQueer
|
||||
tracker-settings-name_section-description = Scegli un nomignolo carino :)
|
||||
tracker-settings-name_section-input_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-title = Con che parte del corpo vuoi utilizzare il tracker?
|
||||
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
|
||||
tracker_selection_menu-title = Quale tracker vuoi assegnare a: { $bodyPart }?
|
||||
# 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-title = Come è posizionato il tracker?
|
||||
mounting_selection_menu = Come è posizionato il tracker?
|
||||
mounting_selection_menu-close = Chiudi
|
||||
|
||||
## Sidebar settings
|
||||
@@ -158,10 +195,15 @@ settings-sidebar-utils = Strumenti
|
||||
settings-sidebar-serial = Serial console
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr-title = SteamVR
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = Tracker di SteamVR
|
||||
settings-general-steamvr-description-p0 = Abilita o disabilita specifici tracker di SteamVR.
|
||||
settings-general-steamvr-description-p1 = Utile per alcuni giochi che utilizzano solo alcuni 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
|
||||
@@ -170,58 +212,85 @@ settings-general-steamvr-trackers-elbows = Gomiti
|
||||
settings-general-steamvr-trackers-hands = Mani
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics-title = Comportamento del tracker
|
||||
settings-general-tracker_mechanics = Comportamento del tracker
|
||||
settings-general-tracker_mechanics-subtitle = Filtro movimenti
|
||||
settings-general-tracker_mechanics-description-p0 = Scegli la tipologia di filtraggio movimenti per il tuo tracker.
|
||||
settings-general-tracker_mechanics-description-p1 = Predizione anticipa i movimenti, mentre Attenuazione attenua movimenti eccessivi.
|
||||
settings-general-tracker_mechanics-filtering_type-title = Tipologia di filtraggio
|
||||
settings-general-tracker_mechanics-filtering_type-none-label = Non usare alcun filtraggio
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-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-label = Attenuazione
|
||||
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-label = Predizione
|
||||
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-amount-label = Quantità
|
||||
settings-general-tracker_mechanics-amount = Quantità
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings-title = Impostazioni FK
|
||||
settings-general-fk_settings-leg_tweak-title = Impostazioni Gambe
|
||||
## 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-title = FK Braccia
|
||||
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-title = Impostazioni scheletro
|
||||
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-title = Controllo dei gesti
|
||||
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.
|
||||
settings-general-gesture_control-enable = Reset veloce con il doppio tocco
|
||||
settings-general-gesture_control-delay = Ritardo
|
||||
# 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-title = Interfaccia
|
||||
settings-general-interface-dev_mode-title = Modalità sviluppatore
|
||||
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-title = Rilevazione nuovi dispositivi seriali
|
||||
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-title = Seleziona la lingua
|
||||
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-title = Serial Console
|
||||
settings-serial-description-p0 = Questo è un feed di informazioni in tempo reale per la comunicazione seriale.
|
||||
settings-serial-description-p1 = Può essere utile se ti serve capire se il firmware sta avendo problemi.
|
||||
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
|
||||
@@ -230,39 +299,50 @@ settings-serial-serial_select = Seleziona una porta seriale
|
||||
settings-serial-auto_dropdown_item = Automatico
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router-title = OSC router
|
||||
settings-osc-router-description-p0 = Inoltra messaggi OSC da un altro programma.
|
||||
settings-osc-router-description-p1 = Utile per utilizzare un altro programma OSC con VRChat, per esempio.
|
||||
settings-osc-router-enable-title = Attiva
|
||||
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-title = Porte di rete
|
||||
settings-osc-router-network-description-p0 = Impostare le porte di rete per l'ascolto e l'invio dei dati
|
||||
settings-osc-router-network-description-p1 = 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
|
||||
settings-osc-router-network-port_in-placeholder = Porta in ingresso (predefinito: 9002)
|
||||
settings-osc-router-network-port_out-label = Porta in uscita
|
||||
settings-osc-router-network-port_out-placeholder = Porta in uscita (predefinito: 9000)
|
||||
settings-osc-router-network-address-title = Indirizzo di rete
|
||||
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-description-p0 = Modifica le impostazioni specifiche a VRChat per ricevere e inviare dati del HMD
|
||||
settings-osc-vrchat-description-p1 = Dati dei tracker per FBT (funziona su Quest standalone).
|
||||
settings-osc-vrchat-enable-title = Attiva
|
||||
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-title = Porte di rete
|
||||
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
|
||||
settings-osc-vrchat-network-port_in-placeholder = Porta in ingresso (predefinito: 9002)
|
||||
settings-osc-vrchat-network-port_out-label = Porta in uscita
|
||||
settings-osc-vrchat-network-port_out-placeholder = Porta in uscita (predefinito: 9000)
|
||||
settings-osc-vrchat-network-address-title = Indirizzo di rete
|
||||
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-title = Tracker
|
||||
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
|
||||
@@ -277,21 +357,31 @@ onboarding-wip = Lavori in corso
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = Torna all'introduzione
|
||||
onboarding-wifi_creds-title = Inserisci credenziali WiFi
|
||||
onboarding-wifi_creds-description-p0 = I tracker utilizzeranno queste credenziali per connettersi in modalità wireless
|
||||
onboarding-wifi_creds-description-p1 = Si prega di utilizzare le stesse credenziali con cui si è attualmente connessi
|
||||
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-title = Tutorial di ripristino
|
||||
onboarding-reset_tutorial = Tutorial di ripristino
|
||||
onboarding-reset_tutorial-description = Questa funzionalità non è completa, premi continua
|
||||
|
||||
## Setup start
|
||||
onboarding-home-title = Benvenuti a SlimeVR
|
||||
onboarding-home-description-p0 = Portiamo full-body tracking
|
||||
onboarding-home-description-p1 = a tuttə
|
||||
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
|
||||
@@ -317,20 +407,35 @@ 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
|
||||
onboarding-connect_tracker-connected_trackers = { $amount } di tracker connessi
|
||||
# $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
|
||||
onboarding-assign_trackers-assigned = { $assigned } di { $trackers } tracker assegnati
|
||||
# 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-title = Posizionamento manuale
|
||||
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
|
||||
@@ -385,7 +490,11 @@ onboarding-automatic_proportions-recording-steps-2 = Ruota la parte superiore de
|
||||
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
|
||||
onboarding-automatic_proportions-recording-timer = { $time } secondi rimanenti
|
||||
# $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
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
## Websocket status
|
||||
### 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 = サーバー接続中
|
||||
websocket-connection_lost = サーバーへの接続が失われました。再接続を試みています...
|
||||
|
||||
@@ -115,35 +122,65 @@ tracker-infos-url = トラッカーURL
|
||||
## Tracker settings
|
||||
tracker-settings-back = トラッカーリストへ戻る
|
||||
tracker-settings-title = トラッカー設定
|
||||
tracker-settings-assignment_section-title = 割り当て
|
||||
tracker-settings-assignment_section = 割り当て
|
||||
tracker-settings-assignment_section-description = トラッカーが体のどの部位に装着されているか
|
||||
tracker-settings-assignment_section-edit = 割り当ての編集
|
||||
tracker-settings-mounting_section-title = 装着方向
|
||||
tracker-settings-mounting_section = 装着方向
|
||||
tracker-settings-mounting_section-description = トラッカーをどの方向に装着していますか?
|
||||
tracker-settings-mounting_section-edit = 装着向きの編集
|
||||
tracker-settings-name_section-title = トラッカー名称
|
||||
# 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-placeholder = NightyBeast's left leg
|
||||
tracker-settings-name_section-description = 自由に名称をつけてください
|
||||
tracker-settings-name_section-input_placeholder = NightyBeast's left leg
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = 名称無し
|
||||
tracker-part_card-unassigned = 未割り当て
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu-title = このトラッカーをどこに配置しますか?
|
||||
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
|
||||
tracker_selection_menu-title = { $bodyPart }どのトラッカーを割り当てますか?
|
||||
# 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-title = このトラッカーをどこに配置しますか?
|
||||
mounting_selection_menu = このトラッカーをどこに配置しますか?
|
||||
mounting_selection_menu-close = 閉じる
|
||||
|
||||
## Sidebar settings
|
||||
@@ -151,73 +188,109 @@ 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-title = SteamVR
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVRのトラッカー
|
||||
settings-general-steamvr-description-p0 = 有効化したい部位にチャックを入れてください。
|
||||
settings-general-steamvr-description-p1 = SlimeVRが行うことをよりコントロールしたい場合に便利です。
|
||||
# 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-title = トラッカーメカニズム
|
||||
settings-general-tracker_mechanics = トラッカーメカニズム
|
||||
settings-general-tracker_mechanics-subtitle = フィルター機能
|
||||
settings-general-tracker_mechanics-description-p0 = トラッカーのフィルタリングの種類を選択します。
|
||||
settings-general-tracker_mechanics-description-p1 = Predictionは動きを予測し、Smoothingは動きを滑らかにする。
|
||||
settings-general-tracker_mechanics-filtering_type-title = フィルタータイプ
|
||||
settings-general-tracker_mechanics-filtering_type-none-label = No filtering
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-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-label = Smoothing
|
||||
settings-general-tracker_mechanics-filtering_type-smoothing = Smoothing
|
||||
settings-general-tracker_mechanics-filtering_type-smoothing-description = 動きを滑らかにしますが、若干の遅れが発生します
|
||||
settings-general-tracker_mechanics-filtering_type-prediction-label = Prediction
|
||||
settings-general-tracker_mechanics-filtering_type-prediction = Prediction
|
||||
settings-general-tracker_mechanics-filtering_type-prediction-description = レイテンシーを減らし、動きをよりキビキビさせますが、ジッターが増加する場合があります。
|
||||
settings-general-tracker_mechanics-amount-label = 数値
|
||||
settings-general-tracker_mechanics-amount = 数値
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings-title = FK設定
|
||||
settings-general-fk_settings-leg_tweak-title = 脚の微調整
|
||||
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-arm_fk-title = アームFK
|
||||
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-title = スケルトン設定
|
||||
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-title = ジェスチャーコントロール
|
||||
settings-general-gesture_control = ジェスチャーコントロール
|
||||
settings-general-gesture_control-subtitle = ダブルタップクイックリセット
|
||||
settings-general-gesture_control-description = ダブルタップクイックリセットの有効・無効を設定します。有効にすると、最も高い胴体トラッカー上の任意の場所をダブルタップすると、クイックリセットが起動します。ディレイは、タップされてからリセットされるまでの時間です。
|
||||
settings-general-gesture_control-enable = ダブルタップクイックリセット
|
||||
settings-general-gesture_control-delay = ディレイ
|
||||
# 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-title = インターフェース
|
||||
settings-general-interface-dev_mode-title = 開発者モード
|
||||
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-title = シリアルデバイスの検出
|
||||
settings-general-interface-serial_detection = シリアルデバイスの検出
|
||||
settings-general-interface-serial_detection-description = このオプションは、トラッカーとなり得る新しいシリアルデバイスを接続するたびにポップアップを表示します。これはトラッカーの設定プロセスを改善するのに役立ちます。
|
||||
settings-general-interface-serial_detection-label = シリアルデバイスの検出
|
||||
settings-general-interface-lang-title = 言語を選択
|
||||
settings-general-interface-lang = 言語を選択
|
||||
settings-general-interface-lang-description = 使用したいデフォルトの言語を変更する
|
||||
settings-general-interface-lang-placeholder = 使用する言語を選択する
|
||||
|
||||
## Serial settings
|
||||
settings-serial-title = シリアルコンソール
|
||||
settings-serial-description-p0 = シリアル通信のライブ情報フィードです。
|
||||
settings-serial-description-p1 = ファームウェアの動作を知る必要がある場合に有用かもしれません。
|
||||
settings-serial = シリアルコンソール
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
シリアル通信のライブ情報フィードです。
|
||||
ファームウェアの動作を知る必要がある場合に有用かもしれません。
|
||||
settings-serial-connection_lost = シリアルへの接続が失われました、再接続中...
|
||||
settings-serial-reboot = リブート
|
||||
settings-serial-factory_reset = ファクトリーリセット
|
||||
@@ -225,22 +298,51 @@ 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-description-p0 = HMDのデータを受信して送信するためにVRChat固有の設定を変更する。
|
||||
settings-osc-vrchat-description-p1 = FBT用のトラッカーデータ(Questスタンドアロンで動作します)
|
||||
settings-osc-vrchat-enable-title = 有効
|
||||
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-title = ネットワークポート
|
||||
settings-osc-vrchat-network = ネットワークポート
|
||||
settings-osc-vrchat-network-description = VRChatへのデータを送受信するためのポートを設定します。
|
||||
settings-osc-vrchat-network-port_in-label = ポートイン
|
||||
settings-osc-vrchat-network-port_in-placeholder = ポートイン (デフォルト: 9001)
|
||||
settings-osc-vrchat-network-port_out-label = ポートアウト
|
||||
settings-osc-vrchat-network-port_out-placeholder = ポートアウト (デフォルト: 9000)
|
||||
settings-osc-vrchat-network-address-title = ネットワークアドレス
|
||||
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-title = トラッカー
|
||||
settings-osc-vrchat-network-trackers = トラッカー
|
||||
settings-osc-vrchat-network-trackers-description = データの送受信を切り替える。
|
||||
settings-osc-vrchat-network-trackers-chest = 胸
|
||||
settings-osc-vrchat-network-trackers-waist = 腰
|
||||
@@ -255,21 +357,31 @@ onboarding-wip = 実行中
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = 戻る
|
||||
onboarding-wifi_creds-title = WiFiの認証情報の入力
|
||||
onboarding-wifi_creds-description-p0 = トラッカーはこれらの認証情報を使ってwifiに接続します。
|
||||
onboarding-wifi_creds-description-p1 = 現在接続している認証情報を使用してください。
|
||||
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-title = リセットチュートリアル
|
||||
onboarding-reset_tutorial = リセットチュートリアル
|
||||
onboarding-reset_tutorial-description = この機能は終了していません。続けるを押してください。
|
||||
|
||||
## Setup start
|
||||
onboarding-home-title = Welcome to SlimeVR
|
||||
onboarding-home-description-p0 = Bringing full-body tracking
|
||||
onboarding-home-description-p1 = to everyone
|
||||
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
|
||||
@@ -295,20 +407,35 @@ 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 = サーバーに接続されました
|
||||
onboarding-connect_tracker-connected_trackers = { $amount } トラッカーが接続されました
|
||||
# $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 = どのトラッカーをどこに置くか選んでみましょう。トラッカーを配置したい場所をクリックしてください。
|
||||
onboarding-assign_trackers-assigned = { $assigned } of { $trackers } trackers assigned
|
||||
# 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-title = マニュアルマウント
|
||||
onboarding-manual_mounting = マニュアルマウント
|
||||
onboarding-manual_mounting-description = すべてのトラッカーをクリックし、どの方向にマウントするかを選択
|
||||
onboarding-manual_mounting-auto_mounting = 自動マウント
|
||||
onboarding-manual_mounting-next = 次のステップ
|
||||
@@ -363,7 +490,11 @@ onboarding-automatic_proportions-recording-steps-2 = 上半身を左にひねり
|
||||
onboarding-automatic_proportions-recording-steps-3 = 上半身を右にひねり、左に曲げる
|
||||
onboarding-automatic_proportions-recording-steps-4 = タイマーが終わるまで体をくねらせる
|
||||
onboarding-automatic_proportions-recording-processing = 結果を処理中
|
||||
onboarding-automatic_proportions-recording-timer = あと { $time } 秒
|
||||
# $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 = 記録結果
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
## Websocket status
|
||||
### 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 = 서버에 연결하는 중...
|
||||
websocket-connection_lost = 서버와의 연결이 끊어졌어요. 다시 연결하는 중...
|
||||
|
||||
@@ -115,35 +122,65 @@ tracker-infos-url = 트래커 URL
|
||||
## Tracker settings
|
||||
tracker-settings-back = 트래커 목록으로 돌아가기
|
||||
tracker-settings-title = 트래커 설정
|
||||
tracker-settings-assignment_section-title = 트래커 위치 지정
|
||||
tracker-settings-assignment_section = 트래커 위치 지정
|
||||
tracker-settings-assignment_section-description = 트래커가 위치한 신체 부위
|
||||
tracker-settings-assignment_section-edit = 위치 수정
|
||||
tracker-settings-mounting_section-title = 착용 방향
|
||||
tracker-settings-mounting_section = 착용 방향
|
||||
tracker-settings-mounting_section-description = 트래커는 어디에 착용하나요?
|
||||
tracker-settings-mounting_section-edit = 방향 수정
|
||||
tracker-settings-name_section-title = 트래커 이름
|
||||
# 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-placeholder = NightyBeast's left leg
|
||||
tracker-settings-name_section-description = 귀여운 이름을 지어주세요! >_<
|
||||
tracker-settings-name_section-input_placeholder = NightyBeast's left leg
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = 이름 없음
|
||||
tracker-part_card-unassigned = 할당되지 않음
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu-title = 트래커가 어디에 있나요?
|
||||
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
|
||||
tracker_selection_menu-title = { $bodyPart }에 어떤 트래커를 할당할까요?
|
||||
# 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-title = 트래커가 어디에 있나요?
|
||||
mounting_selection_menu = 트래커가 어디에 있나요?
|
||||
mounting_selection_menu-close = 닫기
|
||||
|
||||
## Sidebar settings
|
||||
@@ -158,69 +195,102 @@ settings-sidebar-utils = 유틸리티
|
||||
settings-sidebar-serial = 시리얼 콘솔
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr-title = SteamVR
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR 트래커
|
||||
settings-general-steamvr-description-p0 = SteamVR 트래커를 켜거나 끄세요
|
||||
settings-general-steamvr-description-p1 = 특정 트래커 구성만 허용하는 게임 또는 앱에서 유용해요.
|
||||
# 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-title = 트래커 역학
|
||||
settings-general-tracker_mechanics = 트래커 역학
|
||||
settings-general-tracker_mechanics-subtitle = 필터링
|
||||
settings-general-tracker_mechanics-description-p0 = 트래커의 필터링 유형을 선택하세요.
|
||||
settings-general-tracker_mechanics-description-p1 = Prediction은 움직임을 예측하고 Smoothing은 움직임을 부드럽게 해요.
|
||||
settings-general-tracker_mechanics-filtering_type-title = 필터링 타입
|
||||
settings-general-tracker_mechanics-filtering_type-none-label = 필터링 없음
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-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-label = Smoothing
|
||||
settings-general-tracker_mechanics-filtering_type-smoothing = Smoothing
|
||||
settings-general-tracker_mechanics-filtering_type-smoothing-description = 움직임을 부드럽게 하지만 약간의 대기 시간이 추가돼요.
|
||||
settings-general-tracker_mechanics-filtering_type-prediction-label = Prediction
|
||||
settings-general-tracker_mechanics-filtering_type-prediction = Prediction
|
||||
settings-general-tracker_mechanics-filtering_type-prediction-description = 대기 시간이 줄어들고 움직임이 더 빨라지지만 지터가 증가할 수 있어요.
|
||||
settings-general-tracker_mechanics-amount-label = 강도
|
||||
settings-general-tracker_mechanics-amount = 강도
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings-title = FK 설정
|
||||
settings-general-fk_settings-leg_tweak-title = 다리 보정
|
||||
## 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-title = 팔 운동학
|
||||
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-title = 골격 설정
|
||||
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-title = 제스처 제어
|
||||
settings-general-gesture_control = 제스처 제어
|
||||
settings-general-gesture_control-subtitle = 두 번 탭해서 퀵 리셋하기
|
||||
settings-general-gesture_control-description = 활성화하면 가장 높이 있는 트래커의 아무 곳이나 두 번 탭해서 퀵 리셋을 활성화할 수 있어요. 두번 탭하는 간격은 딜레이로 조절할 수 있어요.
|
||||
settings-general-gesture_control-enable = 두번 탭해서 퀵 리셋
|
||||
settings-general-gesture_control-delay = 딜레이
|
||||
# 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-title = 인터페이스
|
||||
settings-general-interface-dev_mode-title = 개발자 모드
|
||||
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-title = 시리얼 디바이스 감지
|
||||
settings-general-interface-serial_detection = 시리얼 디바이스 감지
|
||||
settings-general-interface-serial_detection-description = 이 옵션은 트래커일 수도 있는 새로운 시리얼 디바이스를 연결할 때마다 팝업을 표시해요. 트래커 설정 프로세스를 개선하는 데 도움이 될 거에요.
|
||||
settings-general-interface-serial_detection-label = 시리얼 디바이스 감지
|
||||
settings-general-interface-lang-title = 언어 선택
|
||||
settings-general-interface-lang = 언어 선택
|
||||
settings-general-interface-lang-description = 사용하고 싶은 기본 언어를 선택하세요.
|
||||
settings-general-interface-lang-placeholder = 사용할 언어를 선택하세요
|
||||
|
||||
## Serial settings
|
||||
settings-serial-title = 시리얼 콘솔
|
||||
settings-serial-description-p0 = 이 라이브 피드에서 시리얼 디바이스와 통신할 수 있어요.
|
||||
settings-serial-description-p1 = 펌웨어가 제대로 작동하는지 알아야 할 때 유용할 거에요.
|
||||
settings-serial = 시리얼 콘솔
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
이 라이브 피드에서 시리얼 디바이스와 통신할 수 있어요.
|
||||
펌웨어가 제대로 작동하는지 알아야 할 때 유용할 거에요.
|
||||
settings-serial-connection_lost = 시리얼 연결 끊김, 다시 연결 중...
|
||||
settings-serial-reboot = 재부팅
|
||||
settings-serial-factory_reset = 공장 초기화
|
||||
@@ -229,39 +299,50 @@ settings-serial-serial_select = 시리얼 포트 선택
|
||||
settings-serial-auto_dropdown_item = 자동
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router-title = OSC 라우터
|
||||
settings-osc-router-description-p0 = 다른 프로그램에서 오는 OSC 메시지를 전달해요.
|
||||
settings-osc-router-description-p1 = 예를 들어 VRChat과 함께 다른 OSC 프로그램을 사용하는 데 유용할 거에요.
|
||||
settings-osc-router-enable-title = 활성화
|
||||
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-title = 네트워크 포트
|
||||
settings-osc-router-network-description-p0 = 데이터 수신 및 전송을 위한 포트 설정
|
||||
settings-osc-router-network-description-p1 = 이들은 SlimeVR 서버에서 사용되는 다른 포트와 동일할 수 있어요.
|
||||
settings-osc-router-network-port_in-label = 들어오는 포트
|
||||
settings-osc-router-network-port_in-placeholder = Port in (기본값: 9002)
|
||||
settings-osc-router-network-port_out-label = 나가는 포트
|
||||
settings-osc-router-network-port_out-placeholder = Port out (기본값: 9000)
|
||||
settings-osc-router-network-address-title = 네트워크 주소
|
||||
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-description-p0 = HMD 데이터 수신 및 전송을 위한 VRChat 관련 설정 변경
|
||||
settings-osc-vrchat-description-p1 = FBT용 트래커 데이터(Quest 단독에서 작동)
|
||||
settings-osc-vrchat-enable-title = 활성화
|
||||
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-title = 네트워크 포트
|
||||
settings-osc-vrchat-network = 네트워크 포트
|
||||
settings-osc-vrchat-network-description = VRChat과 데이터를 주고받는 포트 설정
|
||||
settings-osc-vrchat-network-port_in-label = 들어오는 포트
|
||||
settings-osc-vrchat-network-port_in-placeholder = Port in (기본값: 9001)
|
||||
settings-osc-vrchat-network-port_out-label = 나가는 포트
|
||||
settings-osc-vrchat-network-port_out-placeholder = Port out (기본값: 9000)
|
||||
settings-osc-vrchat-network-address-title = 네트워크 주소
|
||||
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-title = 트래커
|
||||
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
|
||||
@@ -276,21 +357,31 @@ onboarding-wip = 아직 공사 중이에요
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = 처음으로 돌아가기
|
||||
onboarding-wifi_creds-title = WiFi 자격 증명을 입력하세요
|
||||
onboarding-wifi_creds-description-p0 = 트래커는 이 자격 증명을 사용하여 무선으로 연결해요
|
||||
onboarding-wifi_creds-description-p1 = 지금 연결되어 있는 자격 증명을 사용해주세요
|
||||
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-title = 리셋 튜토리얼
|
||||
onboarding-reset_tutorial = 리셋 튜토리얼
|
||||
onboarding-reset_tutorial-description = 이 기능은 아직 완성되지 않았어요, 지금은 일단 계속하기를 눌러주세요!
|
||||
|
||||
## Setup start
|
||||
onboarding-home-title = SlimeVR에 어서오세요!
|
||||
onboarding-home-description-p0 = Bringing full-body tracking
|
||||
onboarding-home-description-p1 = to everyone
|
||||
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
|
||||
@@ -316,20 +407,35 @@ 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 = 서버에 연결됨
|
||||
onboarding-connect_tracker-connected_trackers = 트래커 { $amount }개 연결됨
|
||||
# $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 = 이제, 어떤 트래커가 어디에 있는지 선택할 시간이에요. 트래커를 배치할 위치를 클릭해보세요
|
||||
onboarding-assign_trackers-assigned = { $assigned }/{ $trackers } 트래커 할당됨
|
||||
# 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-title = 수동으로 착용 방향 설정
|
||||
onboarding-manual_mounting = 수동으로 착용 방향 설정
|
||||
onboarding-manual_mounting-description = 트래커를 클릭한 다음, 트래커가 바라보는 방향을 선택해주세요
|
||||
onboarding-manual_mounting-auto_mounting = 자동으로 착용 방향 설정
|
||||
onboarding-manual_mounting-next = 다음 단계
|
||||
@@ -384,7 +490,11 @@ onboarding-automatic_proportions-recording-steps-2 = 상체를 왼쪽으로 비
|
||||
onboarding-automatic_proportions-recording-steps-3 = 상체를 오른쪽으로 비틀고 왼쪽으로 구부리세요.
|
||||
onboarding-automatic_proportions-recording-steps-4 = 타이머가 종료될 때까지 이리저리 움직여 보세요.
|
||||
onboarding-automatic_proportions-recording-processing = 결과 처리 중
|
||||
onboarding-automatic_proportions-recording-timer = { $time } 초 남음
|
||||
# $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 = 기록 결과
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
## Websocket status
|
||||
### 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 = Łączenie z serwerem
|
||||
websocket-connection_lost = Połączenie z serwerem zostało utracone. Próba ponownego połączenia...
|
||||
|
||||
@@ -115,35 +122,65 @@ 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-title = Przydzielanie
|
||||
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-title = Położenie Trackera
|
||||
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-name_section-title = Nazwa Trackera
|
||||
# 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-placeholder = Lewa noga Yexo
|
||||
tracker-settings-name_section-description = Daj mu słodką nazwę :)
|
||||
tracker-settings-name_section-input_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-title = Gdzie chcesz żeby ten tracker był?
|
||||
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
|
||||
tracker_selection_menu-title = Który tracker ustawić na { $bodyPart }?
|
||||
# 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-title = Gdzie chciałbyś ten tracker?
|
||||
mounting_selection_menu = Gdzie chciałbyś ten tracker?
|
||||
mounting_selection_menu-close = Zamknij
|
||||
|
||||
## Sidebar settings
|
||||
@@ -151,15 +188,22 @@ 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-title = SteamVR
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR trackers
|
||||
settings-general-steamvr-description-p0 = Włącz lub Wyłącz specyficzne pozycje trackowania.
|
||||
settings-general-steamvr-description-p1 = Przydatne jeżeli chcesz więcej kontroli nad SlimeVR.
|
||||
# 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
|
||||
@@ -168,57 +212,85 @@ settings-general-steamvr-trackers-elbows = Łokcie
|
||||
settings-general-steamvr-trackers-hands = Ręce
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics-title = Tracker mechanics
|
||||
settings-general-tracker_mechanics = Tracker mechanics
|
||||
settings-general-tracker_mechanics-subtitle = Filtrowanie
|
||||
settings-general-tracker_mechanics-description-p0 = Wybierz Filtry dla twoich trackerów.
|
||||
settings-general-tracker_mechanics-description-p1 = Przewidywanie przewiduje ruchy a Wygładzanie stara się wygładzić ruchy.
|
||||
settings-general-tracker_mechanics-filtering_type-title = Filtry
|
||||
settings-general-tracker_mechanics-filtering_type-none-label = Brak Filtrów
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-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-label = Wygładzanie
|
||||
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-label = Przewidywanie
|
||||
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-amount-label = Ilość
|
||||
settings-general-tracker_mechanics-amount = Ilość
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings-title = FK settings
|
||||
settings-general-fk_settings-leg_tweak-title = Leg tweaks
|
||||
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-arm_fk-title = Arm FK
|
||||
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-title = Skeleton settings
|
||||
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-title = Kontrola Gestami
|
||||
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.
|
||||
settings-general-gesture_control-enable = Dotknij 2 razy by wykonać szybki reset
|
||||
settings-general-gesture_control-delay = Opóźnienie
|
||||
# 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-title = Interfejs
|
||||
settings-general-interface-dev_mode-title = Tryb Dewelopera
|
||||
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-title = Wykrywanie urządzeń
|
||||
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-title = Wybierz Język
|
||||
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-title = Serial Console
|
||||
settings-serial-description-p0 = This is a live information feed for serial communication.
|
||||
settings-serial-description-p1 = May be useful if you need to know the firmware is acting up.
|
||||
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
|
||||
@@ -226,23 +298,52 @@ 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-description-p0 = Change VRChat-specific settings to receive HMD data and send
|
||||
settings-osc-vrchat-description-p1 = trackers data for FBT (works on Quest standalone).
|
||||
settings-osc-vrchat-enable-title = Enable
|
||||
settings-osc-vrchat-enable-description = Toggle the sending and receiving of data
|
||||
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-title = 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
|
||||
settings-osc-vrchat-network-port_in-placeholder = Port in (default: 9001)
|
||||
settings-osc-vrchat-network-port_out-label = Port Out
|
||||
settings-osc-vrchat-network-port_out-placeholder = Port out (default: 9000)
|
||||
settings-osc-vrchat-network-address-title = 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 = 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-title = Trackers
|
||||
settings-osc-vrchat-network-trackers-description = Toggle the sending and receiving of data
|
||||
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
|
||||
@@ -256,21 +357,31 @@ onboarding-wip = W trakcie prac
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = Cofnij się do początku
|
||||
onboarding-wifi_creds-title = Wpisz dane WiFi
|
||||
onboarding-wifi_creds-description-p0 = Trackery będą używać tej sieci do łączenia się z serwerem
|
||||
onboarding-wifi_creds-description-p1 = proszę używać sieci do której jest się połączonym
|
||||
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-title = Zresetuj poradnik
|
||||
onboarding-reset_tutorial = Zresetuj poradnik
|
||||
onboarding-reset_tutorial-description = Ta funkcja jeszcze nie jest skończona.
|
||||
|
||||
## Setup start
|
||||
onboarding-home-title = Witamy w SlimeVR
|
||||
onboarding-home-description-p0 = Full-body tracking
|
||||
onboarding-home-description-p1 = dla każdego
|
||||
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
|
||||
@@ -296,20 +407,35 @@ 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
|
||||
onboarding-connect_tracker-connected_trackers = { $amount } połączonych trackerów
|
||||
# $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ć
|
||||
onboarding-assign_trackers-assigned = { $assigned } przydzielonych trackerów z { $trackers }
|
||||
# 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-title = Pozycjonowanie Manualne
|
||||
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
|
||||
@@ -364,7 +490,11 @@ onboarding-automatic_proportions-recording-steps-2 = Przekręć ciało w lewo ,p
|
||||
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
|
||||
onboarding-automatic_proportions-recording-timer = Pozostały czas { $time } sekundy
|
||||
# $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
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
## Websocket status
|
||||
### 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 = Conectando ao servidor
|
||||
websocket-connection_lost = Conexão perdida com o servidor. Reconectando...
|
||||
|
||||
@@ -115,35 +122,65 @@ 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-title = Atribuição
|
||||
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-title = Posicionamento
|
||||
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-name_section-title = Nome do tracker
|
||||
# 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-placeholder = Coxa esquerda de NightyBeast
|
||||
tracker-settings-name_section-description = Dê um apelido fofo :)
|
||||
tracker-settings-name_section-input_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-title = Aonde você quer que esse tracker fique?
|
||||
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
|
||||
tracker_selection_menu-title = Qual tracker atribuir a { $bodyPart }?
|
||||
# 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-title = Aonde você quer que esse tracker fique?
|
||||
mounting_selection_menu = Aonde você quer que esse tracker fique?
|
||||
mounting_selection_menu-close = Fechar
|
||||
|
||||
## Sidebar settings
|
||||
@@ -158,10 +195,15 @@ settings-sidebar-utils = Utilidades
|
||||
settings-sidebar-serial = Console Serial
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr-title = SteamVR
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = Trackers do SteamVR
|
||||
settings-general-steamvr-description-p0 = Ativar ou desativar partes específicas do tracking.
|
||||
settings-general-steamvr-description-p1 = Útil se você quer mais controle do que o SlimeVR faz.
|
||||
# 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
|
||||
@@ -170,30 +212,39 @@ settings-general-steamvr-trackers-elbows = Cotovelos
|
||||
settings-general-steamvr-trackers-hands = Mãos
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics-title = Mecânicas do Tracker
|
||||
settings-general-tracker_mechanics = Mecânicas do Tracker
|
||||
settings-general-tracker_mechanics-subtitle = Filtros
|
||||
settings-general-tracker_mechanics-description-p0 = Escolha o tipo de filtro para seus trackers.
|
||||
settings-general-tracker_mechanics-description-p1 = Predição prediz movimentação enquanto suavização suaviza o movimento.
|
||||
settings-general-tracker_mechanics-filtering_type-title = Tipo de filtro
|
||||
settings-general-tracker_mechanics-filtering_type-none-label = Sem filtro
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-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-label = Suavização
|
||||
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-label = Predição
|
||||
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-amount-label = Quantidade
|
||||
settings-general-tracker_mechanics-amount = Quantidade
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings-title = Opções de Tracker
|
||||
settings-general-fk_settings-leg_tweak-title = Ajustes de perna
|
||||
## 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-title = Opções do Braço
|
||||
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-title = Opções do esqueleto
|
||||
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
|
||||
@@ -202,12 +253,16 @@ 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-title = Controle de gestos
|
||||
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.
|
||||
settings-general-gesture_control-taps = toques
|
||||
# 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
|
||||
@@ -219,21 +274,23 @@ settings-general-gesture_control-mountingResetDelay = Delay do reset de posiçã
|
||||
settings-general-gesture_control-mountingResetTaps = Toques para o reset de posição
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface-title = Interface
|
||||
settings-general-interface-dev_mode-title = Modo de desenvolvedor
|
||||
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-title = Detecção de dispositivo serial
|
||||
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-title = Selecione o idioma
|
||||
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-title = Console Serial
|
||||
settings-serial-description-p0 = Este é um feed de informações ao vivo para comunicação serial.
|
||||
settings-serial-description-p1 = Pode ser útil se você precisar saber se o firmware está tendo problemas.
|
||||
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
|
||||
@@ -242,39 +299,50 @@ settings-serial-serial_select = Selecione uma porta serial
|
||||
settings-serial-auto_dropdown_item = Auto
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router-title = Roteador OSC
|
||||
settings-osc-router-description-p0 = Encaminhar mensagens OSC de outro programa.
|
||||
settings-osc-router-description-p1 = Útil para usar outro programa OSC com VRChat, por exemplo.
|
||||
settings-osc-router-enable-title = Ativar
|
||||
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-title = Portas de rede
|
||||
settings-osc-router-network-description-p0 = Defina as portas para receber e enviar dados
|
||||
settings-osc-router-network-description-p1 = Esses podem ser as mesmas portas usadas no servidor do SlimeVR
|
||||
settings-osc-router-network-port_in-label = Porta de entrada
|
||||
settings-osc-router-network-port_in-placeholder = Porta de entrada (padrão: 9002)
|
||||
settings-osc-router-network-port_out-label = Porta de saída
|
||||
settings-osc-router-network-port_out-placeholder = Porta de saída (padrão: 9000)
|
||||
settings-osc-router-network-address-title = Endereço de rede
|
||||
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-description-p0 = Mudar opções específicas do VRChat para receber e mandar dados do HMD
|
||||
settings-osc-vrchat-description-p1 = dados de trackers para FBT (funciona no Quest standalone).
|
||||
settings-osc-vrchat-enable-title = Ativar
|
||||
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-title = Portas de rede
|
||||
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
|
||||
settings-osc-vrchat-network-port_in-placeholder = Porta de entrada (padrão: 9001)
|
||||
settings-osc-vrchat-network-port_out-label = Porta de saída
|
||||
settings-osc-vrchat-network-port_out-placeholder = Porta de saída (padrão: 9000)
|
||||
settings-osc-vrchat-network-address-title = Endereço de rede
|
||||
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-title = Trackers
|
||||
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
|
||||
@@ -289,21 +357,31 @@ onboarding-wip = Trabalho em progresso
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = Voltar para introdução
|
||||
onboarding-wifi_creds-title = Insira as credenciais de WiFi
|
||||
onboarding-wifi_creds-description-p0 = Os Trackers vão usar essas credenciais para conectar à rede sem fio
|
||||
onboarding-wifi_creds-description-p1 = Use as credenciais da rede em que você está atualmente conectado
|
||||
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-title = Resetar Tutorial
|
||||
onboarding-reset_tutorial = Resetar Tutorial
|
||||
onboarding-reset_tutorial-description = Esse recurso não está concluído, apenas aperte continue
|
||||
|
||||
## Setup start
|
||||
onboarding-home-title = Bem vindo ao SlimeVR
|
||||
onboarding-home-description-p0 = Trazendo full-body tracking
|
||||
onboarding-home-description-p1 = para todos
|
||||
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
|
||||
@@ -329,20 +407,35 @@ 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
|
||||
onboarding-connect_tracker-connected_trackers = { $amount } tracker(s) conectado(s)
|
||||
# $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
|
||||
onboarding-assign_trackers-assigned = { $assigned } de { $trackers } trackers atribuídos
|
||||
# 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-title = Posicionamento Manual
|
||||
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
|
||||
@@ -397,7 +490,11 @@ onboarding-automatic_proportions-recording-steps-2 = Gire seu tronco para esquer
|
||||
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
|
||||
onboarding-automatic_proportions-recording-timer = { $time } segundo(s) restante(s)
|
||||
# $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
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
## Websocket status
|
||||
### 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 = Đ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...
|
||||
|
||||
@@ -115,35 +122,65 @@ 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-title = Giao bộ phận
|
||||
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-title = Vị trí đặt 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-name_section-title = Tên tracker
|
||||
# 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-placeholder = Menaced's left leg
|
||||
tracker-settings-name_section-description = Hãy cho một tên đẹp :)
|
||||
tracker-settings-name_section-input_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-title = Bạn muốn giao tracker này cho bộ phận nào?
|
||||
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
|
||||
tracker_selection_menu-title = Tracker nào để giao cho { $bodyPart }?
|
||||
# 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 = 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-title = Bạn muốn giao tracker này ở đâu?
|
||||
mounting_selection_menu = Bạn muốn giao tracker này ở đâu?
|
||||
mounting_selection_menu-close = Đóng
|
||||
|
||||
## Sidebar settings
|
||||
@@ -151,73 +188,109 @@ 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-title = SteamVR
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR trackers
|
||||
settings-general-steamvr-description-p0 = Bặt hoặc tắt tracker SteamVR.
|
||||
settings-general-steamvr-description-p1 = Hữu dụng nếu bạn muốn điều khiển cách SlimeVR hoạt động.
|
||||
# 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-title = Cơ khí tracker
|
||||
settings-general-tracker_mechanics = Cơ khí tracker
|
||||
settings-general-tracker_mechanics-subtitle = Lọc rung
|
||||
settings-general-tracker_mechanics-description-p0 = Chọn kiểu lọc rung cho tracker.
|
||||
settings-general-tracker_mechanics-description-p1 = Dự đoán đoán cử động trong khi lọc rung cử động.
|
||||
settings-general-tracker_mechanics-filtering_type-title = Kiểu lọc
|
||||
settings-general-tracker_mechanics-filtering_type-none-label = Không lọc
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-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-label = Làm mượt
|
||||
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-label = Dự đoán
|
||||
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-amount-label = Số luọng
|
||||
settings-general-tracker_mechanics-amount = Số luọng
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings-title = Cài đặt FK
|
||||
settings-general-fk_settings-leg_tweak-title = Chỉnh chân
|
||||
## 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-arm_fk-title = Tay FK
|
||||
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-title = Cài đặt cơ thể
|
||||
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-title = Điều khiển cử chỉ
|
||||
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.
|
||||
settings-general-gesture_control-enable = Bấm hai lần để reset nhanh
|
||||
settings-general-gesture_control-delay = Chậm trễ
|
||||
# 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-title = Giao diện
|
||||
settings-general-interface-dev_mode-title = Chế độ nhà phát triển
|
||||
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-title = Phát hiện thiết bị Serial
|
||||
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-title = Chọn ngôn ngữ (Change language)
|
||||
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-title = Bảng điều khiển serial
|
||||
settings-serial-description-p0 = Đâu là thông tin trực tiếp về giao tiếp với Serial.
|
||||
settings-serial-description-p1 = Hữu dụng nếu muốn biết phần mềm firmware có vấn đề không.
|
||||
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
|
||||
@@ -225,22 +298,51 @@ 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-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
|
||||
settings-osc-vrchat-description-p1 = thông tin tracker để track toàn thân (Hoạt động trên Quest một mình standalone).
|
||||
settings-osc-vrchat-enable-title = Bật
|
||||
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-title = Cổng mạng
|
||||
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
|
||||
settings-osc-vrchat-network-port_in-placeholder = Cổng vào (Cố định: 9001)
|
||||
settings-osc-vrchat-network-port_out-label = Cổng ra
|
||||
settings-osc-vrchat-network-port_out-placeholder = Cổng ra (Cố định: 9000)
|
||||
settings-osc-vrchat-network-address-title = Địa chỉ mạng
|
||||
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-title = Trackers
|
||||
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
|
||||
@@ -255,21 +357,31 @@ 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-title = Bỏ thông tin Wi-Fi ở đây
|
||||
onboarding-wifi_creds-description-p0 = Tracker sẽ sử dụng thông tin sau để kết nối không dây
|
||||
onboarding-wifi_creds-description-p1 = vui lòng bỏ thông tin bạn muốn kết nối
|
||||
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-title = Làm lại hướng dẫn
|
||||
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-title = Chào mừng đến với SlimeVR!
|
||||
onboarding-home-description-p0 = Đem đến đo toàn thân
|
||||
onboarding-home-description-p1 = tới tất cả
|
||||
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
|
||||
@@ -295,20 +407,35 @@ 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ủ
|
||||
onboarding-connect_tracker-connected_trackers = { $amount } tracker đã kết nối
|
||||
# $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 = 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
|
||||
onboarding-assign_trackers-assigned = { $assigned } trong { $trackers } tracker đã được giao
|
||||
# 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 = 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-title = Đặt thủ công
|
||||
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
|
||||
@@ -363,7 +490,11 @@ onboarding-automatic_proportions-recording-steps-2 = Vặn thân trên sang trá
|
||||
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ả
|
||||
onboarding-automatic_proportions-recording-timer = Còn { $time } giây
|
||||
# $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 = 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ả
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
## Websocket status
|
||||
### 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 = 正在连接到服务器
|
||||
websocket-connection_lost = 与服务器的连接丢失,正在尝试重新连接...
|
||||
|
||||
@@ -115,35 +122,65 @@ tracker-infos-url = 追踪器地址
|
||||
## Tracker settings
|
||||
tracker-settings-back = 返回追踪器列表
|
||||
tracker-settings-title = 追踪器设置
|
||||
tracker-settings-assignment_section-title = 分配追踪器
|
||||
tracker-settings-assignment_section = 分配追踪器
|
||||
tracker-settings-assignment_section-description = 该追踪器要被分配到身体的哪个部位?
|
||||
tracker-settings-assignment_section-edit = 编辑分配
|
||||
tracker-settings-mounting_section-title = 佩戴位置
|
||||
tracker-settings-mounting_section = 佩戴位置
|
||||
tracker-settings-mounting_section-description = 该追踪器被佩戴在哪里?
|
||||
tracker-settings-mounting_section-edit = 编辑佩戴
|
||||
tracker-settings-name_section-title = 追踪器名称
|
||||
# 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-placeholder = CC 封印着漆黑之力的漆黑左臂
|
||||
tracker-settings-name_section-description = 给它起一个可爱的名字吧=w=~
|
||||
tracker-settings-name_section-input_placeholder = CC 封印着漆黑之力的漆黑左臂
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = 未命名
|
||||
tracker-part_card-unassigned = 未分配
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu-title = 你想把追踪器放在哪里?
|
||||
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
|
||||
tracker_selection_menu-title = 要将哪个追踪器分配给 { $bodypart }?
|
||||
# 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-title = 你想把追踪器放在哪里?
|
||||
mounting_selection_menu = 你想把追踪器放在哪里?
|
||||
mounting_selection_menu-close = 关闭
|
||||
|
||||
## Sidebar settings
|
||||
@@ -158,10 +195,15 @@ settings-sidebar-utils = 工具
|
||||
settings-sidebar-serial = 串行控制器
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr-title = SteamVR
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR 追踪器
|
||||
settings-general-steamvr-description-p0 = 启用或禁用特定的追踪器
|
||||
settings-general-steamvr-description-p1 = 对于只支持特定追踪器的应用会很有用。
|
||||
# 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 = 脚部
|
||||
@@ -170,58 +212,85 @@ settings-general-steamvr-trackers-elbows = 肘部
|
||||
settings-general-steamvr-trackers-hands = 手部
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics-title = 追踪器设置
|
||||
settings-general-tracker_mechanics = 追踪器设置
|
||||
settings-general-tracker_mechanics-subtitle = 滤波
|
||||
settings-general-tracker_mechanics-description-p0 = 选择追踪器的滤波类型。
|
||||
settings-general-tracker_mechanics-description-p1 = 预测型将会对你的运动加以预测,而平滑型将会让你的运动更加平滑。
|
||||
settings-general-tracker_mechanics-filtering_type-title = 滤波类型
|
||||
settings-general-tracker_mechanics-filtering_type-none-label = 无滤波
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-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-label = 平滑型
|
||||
settings-general-tracker_mechanics-filtering_type-smoothing = 平滑型
|
||||
settings-general-tracker_mechanics-filtering_type-smoothing-description = 让运动更加平滑,但会增加一些延迟。
|
||||
settings-general-tracker_mechanics-filtering_type-prediction-label = 预测型
|
||||
settings-general-tracker_mechanics-filtering_type-prediction = 预测型
|
||||
settings-general-tracker_mechanics-filtering_type-prediction-description = 减少延迟并使移动更敏捷,但可能会增加一些抖动。
|
||||
settings-general-tracker_mechanics-amount-label = 滤波强度
|
||||
settings-general-tracker_mechanics-amount = 滤波强度
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings-title = FK 设置
|
||||
settings-general-fk_settings-leg_tweak-title = 腿部调整
|
||||
## 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-title = 手臂 FK
|
||||
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-title = 骨架设置
|
||||
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-title = 手势控制
|
||||
settings-general-gesture_control = 手势控制
|
||||
settings-general-gesture_control-subtitle = 双击快速重置
|
||||
settings-general-gesture_control-description = 启用或禁用双击快速重置。启用时,双击身上佩戴的最高的追踪器上的任何位置将激活快速重置。延迟是指记录到敲击和重置之间的时间。
|
||||
settings-general-gesture_control-enable = 双击快速重置
|
||||
settings-general-gesture_control-delay = 延迟
|
||||
# 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-title = 交互界面
|
||||
settings-general-interface-dev_mode-title = 开发者模式
|
||||
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-title = 串口设备检测
|
||||
settings-general-interface-serial_detection = 串口设备检测
|
||||
settings-general-interface-serial_detection-description = 每次插入可能是追踪器的新串口设备时,此选项都会显示一个弹出窗口。这有助于改进追踪器的设置过程。
|
||||
settings-general-interface-serial_detection-label = 串口设备检测
|
||||
settings-general-interface-lang-title = 选择语言
|
||||
settings-general-interface-lang = 选择语言
|
||||
settings-general-interface-lang-description = 更改要使用的默认语言
|
||||
settings-general-interface-lang-placeholder = 选择要使用的语言
|
||||
|
||||
## Serial settings
|
||||
settings-serial-title = 串口控制台
|
||||
settings-serial-description-p0 = 这是用于串口通信的实时信息馈送。
|
||||
settings-serial-description-p1 = 如果你需要了解固件是否出现问题,这将会很有用。
|
||||
settings-serial = 串口控制台
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
这是用于串口通信的实时信息馈送。
|
||||
如果你需要了解固件是否出现问题,这将会很有用。
|
||||
settings-serial-connection_lost = 串口连接丢失,正在重新连接..
|
||||
settings-serial-reboot = 重新启动
|
||||
settings-serial-factory_reset = 恢复出厂设置
|
||||
@@ -230,39 +299,50 @@ settings-serial-serial_select = 选择串行端口
|
||||
settings-serial-auto_dropdown_item = 自动
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router-title = OSC 路由
|
||||
settings-osc-router-description-p0 = 从另一个程序转发 OSC 信息。
|
||||
settings-osc-router-description-p1 = 在使用另一个 VRChat 的 OSC 程序时会很有用。
|
||||
settings-osc-router-enable-title = 启用
|
||||
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-title = 网络端口
|
||||
settings-osc-router-network-description-p0 = 设置用于监听和向 VRChat 发送数据的端口
|
||||
settings-osc-router-network-description-p1 = 这些端口可以与 SlimeVR 服务器中使用的其他端口相同。
|
||||
settings-osc-router-network-port_in-label = 输入端口
|
||||
settings-osc-router-network-port_in-placeholder = 输入端口(默认 9002)
|
||||
settings-osc-router-network-port_out-label = 输出端口
|
||||
settings-osc-router-network-port_out-placeholder = 输出端口(默认 9000)
|
||||
settings-osc-router-network-address-title = 网络地址
|
||||
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-description-p0 = 改变 VRChat 的特定设置以接收和发送头显数据。
|
||||
settings-osc-vrchat-description-p1 = 用于全身追踪的追踪器数据(在 Quest 端生效)。
|
||||
settings-osc-vrchat-enable-title = 启用
|
||||
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-title = 网络端口
|
||||
settings-osc-vrchat-network = 网络端口
|
||||
settings-osc-vrchat-network-description = 设置用于监听和向 VRChat 发送数据的端口
|
||||
settings-osc-vrchat-network-port_in-label = 输入端口
|
||||
settings-osc-vrchat-network-port_in-placeholder = 输入端口(默认 9001)
|
||||
settings-osc-vrchat-network-port_out-label = 输出端口
|
||||
settings-osc-vrchat-network-port_out-placeholder = 输出端口(默认 9000)
|
||||
settings-osc-vrchat-network-address-title = 网络地址
|
||||
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-title = 追踪器
|
||||
settings-osc-vrchat-network-trackers = 追踪器
|
||||
settings-osc-vrchat-network-trackers-description = 切换数据的发送和接收
|
||||
settings-osc-vrchat-network-trackers-chest = 胸部
|
||||
settings-osc-vrchat-network-trackers-waist = 腰部
|
||||
@@ -277,21 +357,31 @@ onboarding-wip = 仍在开发中
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = 返回简介
|
||||
onboarding-wifi_creds-title = 输入 WiFi 凭据
|
||||
onboarding-wifi_creds-description-p0 = 追踪器将使用这些凭据连接到 WiFi
|
||||
onboarding-wifi_creds-description-p1 = 请使用当前连接到 WiFi 的凭据
|
||||
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-title = 重置教程
|
||||
onboarding-reset_tutorial = 重置教程
|
||||
onboarding-reset_tutorial-description = 此功能尚未开发完成,请继续就好
|
||||
|
||||
## Setup start
|
||||
onboarding-home-title = 欢迎来到 SlimeVR
|
||||
onboarding-home-description-p0 = 将全身追踪
|
||||
onboarding-home-description-p1 = 带给每一个人
|
||||
onboarding-home = 欢迎来到 SlimeVR
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
将全身追踪
|
||||
带给每一个人
|
||||
onboarding-home-start = 我准备好了!
|
||||
|
||||
## Enter VR part of setup
|
||||
@@ -317,20 +407,35 @@ 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 = 已连接到服务器
|
||||
onboarding-connect_tracker-connected_trackers = { $Amount } 个追踪器已连接
|
||||
# $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 = 让我们选择哪个追踪器在哪里。单击要放置追踪器的部位
|
||||
onboarding-assign_trackers-assigned = { $assigned } / { $trackers } 个已分配的追踪器
|
||||
# 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-title = 手动佩戴
|
||||
onboarding-manual_mounting = 手动佩戴
|
||||
onboarding-manual_mounting-description = 单击每个追踪器并选择它们的配电方式
|
||||
onboarding-manual_mounting-auto_mounting = 自动佩戴
|
||||
onboarding-manual_mounting-next = 下一步
|
||||
@@ -385,7 +490,11 @@ onboarding-automatic_proportions-recording-steps-2 = 向左扭转上身,然后
|
||||
onboarding-automatic_proportions-recording-steps-3 = 向右扭转上身,然后向左弯。
|
||||
onboarding-automatic_proportions-recording-steps-4 = 持续摆动身体,直到计时器结束。
|
||||
onboarding-automatic_proportions-recording-processing = 正在处理结果
|
||||
onboarding-automatic_proportions-recording-timer = 剩余 { $time } 秒
|
||||
# $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 = 录制结果
|
||||
|
||||
88
gui/scripts/check-missing.js
Executable file
88
gui/scripts/check-missing.js
Executable file
@@ -0,0 +1,88 @@
|
||||
#!/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 process = require('process');
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const { FluentBundle, FluentResource } = require('@fluent/bundle');
|
||||
|
||||
const PATH = '../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}/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}/${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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
|
||||
@@ -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 = () => {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
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,
|
||||
@@ -38,7 +38,7 @@ const statusLabelMap = {
|
||||
};
|
||||
|
||||
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
|
||||
@@ -161,10 +161,10 @@ export function ConnectTrackersPage() {
|
||||
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(
|
||||
@@ -180,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>
|
||||
@@ -237,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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { RpcMessage, SkeletonResetAllRequestT } from 'solarxr-protocol';
|
||||
import {
|
||||
AutoboneContextC,
|
||||
@@ -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>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import classNames from 'classnames';
|
||||
import {
|
||||
MouseEventHandler,
|
||||
@@ -6,7 +7,6 @@ import {
|
||||
useMemo,
|
||||
useState,
|
||||
} from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import {
|
||||
ChangeSkeletonConfigRequestT,
|
||||
RpcMessage,
|
||||
@@ -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,
|
||||
})) || []
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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(
|
||||
{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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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(
|
||||
{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>
|
||||
|
||||
@@ -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,7 +71,7 @@ export function VerifyResultsStep({
|
||||
))}
|
||||
{!hasCalibration && hasRecording && (
|
||||
<Typography>
|
||||
{t(
|
||||
{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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { useMemo, useState } from 'react';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import {
|
||||
AssignTrackerRequestT,
|
||||
BodyPart,
|
||||
@@ -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();
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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]);
|
||||
});
|
||||
}, []);
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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,
|
||||
@@ -26,6 +25,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: {
|
||||
@@ -104,7 +104,7 @@ const defaultValues = {
|
||||
};
|
||||
|
||||
export function GeneralSettings() {
|
||||
const { t } = useTranslation();
|
||||
const { l10n } = useLocalization();
|
||||
const { config, setConfig } = useConfig();
|
||||
const { state } = useLocation();
|
||||
const pageRef = useRef<HTMLFormElement | null>(null);
|
||||
@@ -271,16 +271,22 @@ 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
|
||||
@@ -288,42 +294,42 @@ export function GeneralSettings() {
|
||||
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.waist"
|
||||
label={t('settings-general-steamvr-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={t('settings-general-steamvr-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>
|
||||
</>
|
||||
@@ -331,30 +337,36 @@ 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-subtitle')}
|
||||
</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-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(
|
||||
desciption={l10n.getString(
|
||||
'settings-general-tracker_mechanics-filtering_type-none-description'
|
||||
)}
|
||||
value={FilteringType.NONE}
|
||||
@@ -362,10 +374,10 @@ export function GeneralSettings() {
|
||||
<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(
|
||||
desciption={l10n.getString(
|
||||
'settings-general-tracker_mechanics-filtering_type-smoothing-description'
|
||||
)}
|
||||
value={FilteringType.SMOOTHING}
|
||||
@@ -373,10 +385,10 @@ export function GeneralSettings() {
|
||||
<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(
|
||||
desciption={l10n.getString(
|
||||
'settings-general-tracker_mechanics-filtering_type-prediction-description'
|
||||
)}
|
||||
value={FilteringType.PREDICTION}
|
||||
@@ -386,7 +398,9 @@ export function GeneralSettings() {
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="filtering.amount"
|
||||
label={t('settings-general-tracker_mechanics-amount-label')}
|
||||
label={l10n.getString(
|
||||
'settings-general-tracker_mechanics-amount'
|
||||
)}
|
||||
valueLabelFormat={(value) => `${Math.round(value * 100)} %`}
|
||||
min={0.1}
|
||||
max={1.0}
|
||||
@@ -398,14 +412,16 @@ export function GeneralSettings() {
|
||||
<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">
|
||||
@@ -414,14 +430,16 @@ 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(
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-leg_tweak-skating_correction'
|
||||
)}
|
||||
/>
|
||||
@@ -430,8 +448,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}
|
||||
@@ -441,11 +459,13 @@ export function GeneralSettings() {
|
||||
</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">
|
||||
@@ -454,17 +474,21 @@ 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(
|
||||
{l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-description'
|
||||
)}
|
||||
</Typography>
|
||||
@@ -475,7 +499,7 @@ export function GeneralSettings() {
|
||||
outlined
|
||||
control={control}
|
||||
name="toggles.extendedSpine"
|
||||
label={t(
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-extended_spine'
|
||||
)}
|
||||
/>
|
||||
@@ -484,7 +508,7 @@ export function GeneralSettings() {
|
||||
outlined
|
||||
control={control}
|
||||
name="toggles.extendedPelvis"
|
||||
label={t(
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-extended_pelvis'
|
||||
)}
|
||||
/>
|
||||
@@ -493,17 +517,21 @@ export function GeneralSettings() {
|
||||
outlined
|
||||
control={control}
|
||||
name="toggles.extendedKnee"
|
||||
label={t(
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-extended_knees'
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
<Typography bold>
|
||||
{t('settings-general-fk_settings-vive_emulation-title')}
|
||||
{l10n.getString(
|
||||
'settings-general-fk_settings-vive_emulation-title'
|
||||
)}
|
||||
</Typography>
|
||||
<div className="flex flex-col pt-2 pb-4">
|
||||
<Typography color="secondary">
|
||||
{t('settings-general-fk_settings-vive_emulation-description')}
|
||||
{l10n.getString(
|
||||
'settings-general-fk_settings-vive_emulation-description'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 gap-3 pb-5">
|
||||
@@ -512,7 +540,9 @@ export function GeneralSettings() {
|
||||
outlined
|
||||
control={control}
|
||||
name="toggles-viveEmulation"
|
||||
label={t('settings-general-fk_settings-vive_emulation-label')}
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-vive_emulation-label'
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
@@ -523,14 +553,14 @@ 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-3 gap-5 pb-2">
|
||||
@@ -539,28 +569,36 @@ export function GeneralSettings() {
|
||||
outlined
|
||||
control={control}
|
||||
name="tapDetection.tapQuickResetEnabled"
|
||||
label={t('settings-general-gesture_control-quickResetEnabled')}
|
||||
label={l10n.getString(
|
||||
'settings-general-gesture_control-quickResetEnabled'
|
||||
)}
|
||||
/>
|
||||
<CheckBox
|
||||
variant="toggle"
|
||||
outlined
|
||||
control={control}
|
||||
name="tapDetection.tapResetEnabled"
|
||||
label={t('settings-general-gesture_control-resetEnabled')}
|
||||
label={l10n.getString(
|
||||
'settings-general-gesture_control-resetEnabled'
|
||||
)}
|
||||
/>
|
||||
<CheckBox
|
||||
variant="toggle"
|
||||
outlined
|
||||
control={control}
|
||||
name="tapDetection.tapMountingResetEnabled"
|
||||
label={t('settings-general-gesture_control-mountingResetEnabled')}
|
||||
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.tapQuickResetDelay"
|
||||
label={t('settings-general-gesture_control-quickResetDelay')}
|
||||
label={l10n.getString(
|
||||
'settings-general-gesture_control-quickResetDelay'
|
||||
)}
|
||||
valueLabelFormat={(value) => `${Math.round(value * 10) / 10} s`}
|
||||
min={0.2}
|
||||
max={3.0}
|
||||
@@ -569,7 +607,9 @@ export function GeneralSettings() {
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="tapDetection.tapResetDelay"
|
||||
label={t('settings-general-gesture_control-resetDelay')}
|
||||
label={l10n.getString(
|
||||
'settings-general-gesture_control-resetDelay'
|
||||
)}
|
||||
valueLabelFormat={(value) => `${Math.round(value * 10) / 10} s`}
|
||||
min={0.2}
|
||||
max={3.0}
|
||||
@@ -578,7 +618,9 @@ export function GeneralSettings() {
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="tapDetection.tapMountingResetDelay"
|
||||
label={t('settings-general-gesture_control-mountingResetDelay')}
|
||||
label={l10n.getString(
|
||||
'settings-general-gesture_control-mountingResetDelay'
|
||||
)}
|
||||
valueLabelFormat={(value) => `${Math.round(value * 10) / 10} s`}
|
||||
min={0.2}
|
||||
max={3.0}
|
||||
@@ -589,11 +631,13 @@ export function GeneralSettings() {
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="tapDetection.tapQuickResetTaps"
|
||||
label={t('settings-general-gesture_control-quickResetTaps')}
|
||||
label={l10n.getString(
|
||||
'settings-general-gesture_control-quickResetTaps'
|
||||
)}
|
||||
valueLabelFormat={(value) =>
|
||||
`${Math.round(value)} ${t(
|
||||
'settings-general-gesture_control-taps'
|
||||
)}`
|
||||
l10n.getString('settings-general-gesture_control-taps', {
|
||||
amount: Math.round(value),
|
||||
})
|
||||
}
|
||||
min={2}
|
||||
max={3}
|
||||
@@ -602,11 +646,13 @@ export function GeneralSettings() {
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="tapDetection.tapResetTaps"
|
||||
label={t('settings-general-gesture_control-resetTaps')}
|
||||
label={l10n.getString(
|
||||
'settings-general-gesture_control-resetTaps'
|
||||
)}
|
||||
valueLabelFormat={(value) =>
|
||||
`${Math.round(value)} ${t(
|
||||
'settings-general-gesture_control-taps'
|
||||
)}`
|
||||
l10n.getString('settings-general-gesture_control-taps', {
|
||||
amount: Math.round(value),
|
||||
})
|
||||
}
|
||||
min={2}
|
||||
max={3}
|
||||
@@ -615,11 +661,13 @@ export function GeneralSettings() {
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="tapDetection.tapMountingResetTaps"
|
||||
label={t('settings-general-gesture_control-mountingResetTaps')}
|
||||
label={l10n.getString(
|
||||
'settings-general-gesture_control-mountingResetTaps'
|
||||
)}
|
||||
valueLabelFormat={(value) =>
|
||||
`${Math.round(value)} ${t(
|
||||
'settings-general-gesture_control-taps'
|
||||
)}`
|
||||
l10n.getString('settings-general-gesture_control-taps', {
|
||||
amount: Math.round(value),
|
||||
})
|
||||
}
|
||||
min={2}
|
||||
max={3}
|
||||
@@ -632,17 +680,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">
|
||||
@@ -651,7 +701,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>
|
||||
@@ -659,11 +711,13 @@ 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(
|
||||
{l10n.getString(
|
||||
'settings-general-interface-serial_detection-description'
|
||||
)}
|
||||
</Typography>
|
||||
@@ -674,7 +728,7 @@ export function GeneralSettings() {
|
||||
control={control}
|
||||
outlined
|
||||
name="interface.watchNewDevices"
|
||||
label={t(
|
||||
label={l10n.getString(
|
||||
'settings-general-interface-serial_detection-label'
|
||||
)}
|
||||
/>
|
||||
@@ -684,11 +738,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">
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
|
||||
@@ -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,
|
||||
@@ -19,6 +18,7 @@ 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();
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
|
||||
@@ -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,14 +41,16 @@ 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>
|
||||
@@ -58,7 +60,7 @@ export function SingleTrackerBodyAssignmentMenu({
|
||||
to="/onboarding/trackers-assign"
|
||||
state={{ alonePage: true }}
|
||||
>
|
||||
{t('body_assignment_menu-manage_trackers')}
|
||||
{l10n.getString('body_assignment_menu-manage_trackers')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -73,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>
|
||||
|
||||
@@ -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>
|
||||
)) || <></>
|
||||
);
|
||||
|
||||
@@ -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,7 @@ import { Typography } from '../commons/Typography';
|
||||
import { MountingSelectionMenu } from '../onboarding/pages/mounting/MountingSelectionMenu';
|
||||
import { SingleTrackerBodyAssignmentMenu } from './SingleTrackerBodyAssignmentMenu';
|
||||
import { TrackerCard } from './TrackerCard';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
|
||||
export const rotationToQuatMap = {
|
||||
FRONT: 180,
|
||||
@@ -34,7 +34,7 @@ const rotationsLabels = {
|
||||
};
|
||||
|
||||
export function TrackerSettingsPage() {
|
||||
const { t } = useTranslation();
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
const { sendRPCPacket } = useWebsocketAPI();
|
||||
const [firstLoad, setFirstLoad] = useState(false);
|
||||
@@ -166,7 +166,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 +174,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 +188,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,22 +200,26 @@ 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(
|
||||
{l10n.getString(
|
||||
'body_part-' +
|
||||
BodyPart[tracker?.tracker.info?.bodyPart || BodyPart.NONE]
|
||||
)}
|
||||
@@ -226,42 +230,46 @@ 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>
|
||||
<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')}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
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',
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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,
|
||||
})) || []
|
||||
);
|
||||
|
||||
@@ -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: () =>
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
),
|
||||
};
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
import i18next from 'i18next';
|
||||
import Fluent from 'i18next-fluent';
|
||||
// @ts-expect-error - this package doesn't contain typings but we dont need it
|
||||
import Backend from 'i18next-fluent-backend';
|
||||
import LanguageDetector from 'i18next-browser-languagedetector';
|
||||
import { initReactI18next } from 'react-i18next';
|
||||
|
||||
export const defaultNS = 'translation';
|
||||
|
||||
export const langs = [
|
||||
{
|
||||
name: '🇺🇸 English',
|
||||
key: 'en',
|
||||
},
|
||||
{
|
||||
name: '🌎 Español Latinoamericano',
|
||||
key: 'es-419'
|
||||
},
|
||||
{
|
||||
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-OWO',
|
||||
},
|
||||
];
|
||||
|
||||
i18next
|
||||
.use(Fluent)
|
||||
.use(Backend)
|
||||
.use(LanguageDetector)
|
||||
.use(initReactI18next)
|
||||
.init({
|
||||
fallbackLng: 'en',
|
||||
defaultNS,
|
||||
backend: {
|
||||
loadPath: '/i18n/{{lng}}/{{ns}}.ftl',
|
||||
},
|
||||
});
|
||||
|
||||
if (import.meta.hot) {
|
||||
// detect hot reload translation file changes
|
||||
import.meta.hot.on('locales-update', async () => {
|
||||
await i18next.reloadResources();
|
||||
await i18next.changeLanguage(i18next.language);
|
||||
});
|
||||
}
|
||||
|
||||
export default i18next;
|
||||
125
gui/src/i18n/config.tsx
Normal file
125
gui/src/i18n/config.tsx
Normal file
@@ -0,0 +1,125 @@
|
||||
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: '🇫🇷 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;
|
||||
}
|
||||
}
|
||||
|
||||
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,
|
||||
langs.map((x) => x.key),
|
||||
DEFAULT_LOCALE
|
||||
);
|
||||
setCurrentLocales([currentLocale]);
|
||||
|
||||
const fetchedMessages = await fetchMessages(currentLocales);
|
||||
|
||||
const bundles = lazilyParsedBundles([fetchedMessages]);
|
||||
localStorage.setItem('i18nextLng', currentLocale);
|
||||
setL10n(new ReactLocalization(bundles));
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
const lang = 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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
837
package-lock.json
generated
837
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -12,12 +12,11 @@
|
||||
"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 && patch-package"
|
||||
"prepare": "husky install && npm run update-solarxr"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@typescript-eslint/parser": "^5.43.0",
|
||||
"husky": "^8.0.2",
|
||||
"patch-package": "^6.5.0",
|
||||
"typescript": "^4.9.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
diff --git a/node_modules/i18next-fluent-backend/dist/es/index.js b/node_modules/i18next-fluent-backend/dist/es/index.js
|
||||
index 70a582a..477986a 100644
|
||||
--- a/node_modules/i18next-fluent-backend/dist/es/index.js
|
||||
+++ b/node_modules/i18next-fluent-backend/dist/es/index.js
|
||||
@@ -6,7 +6,7 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
|
||||
|
||||
import * as utils from './utils.js';
|
||||
import ajax from './ajax.js';
|
||||
-import ftl2js from 'fluent_conv/lib/ftl2js';
|
||||
+import ftl2js from 'fluent_conv/esm/ftl2js';
|
||||
|
||||
function getDefaults() {
|
||||
return {
|
||||
Reference in New Issue
Block a user