Compare commits

...

17 Commits

Author SHA1 Message Date
lucas lelievre
8881746941 New Pontoon translations (#1391) 2025-05-18 16:19:03 +02:00
Meow Wei
d3ee82cccc Pontoon: Update Traditional Chinese (zh-Hant) localization of GUI
Co-authored-by: Meow Wei <medicalwei@gmail.com>
2025-05-16 03:00:27 +00:00
Meow Wei
947f440600 Pontoon: Update Traditional Chinese (zh-Hant) localization of GUI
Co-authored-by: Meow Wei <medicalwei@gmail.com>
2025-05-16 03:00:27 +00:00
Mama-Gen
8e887395f1 Pontoon: Update Brazilian Portuguese (pt-BR) localization of GUI
Co-authored-by: Mama-Gen <tiodapamonha145@gmail.com>
2025-05-16 03:00:27 +00:00
Meow Wei
3f42b8ab51 Pontoon: Update Traditional Chinese (zh-Hant) localization of GUI
Co-authored-by: Meow Wei <medicalwei@gmail.com>
2025-05-16 03:00:27 +00:00
Meow Wei
52a8e24d9e Pontoon: Update Traditional Chinese (zh-Hant) localization of GUI
Co-authored-by: Meow Wei <medicalwei@gmail.com>
2025-05-16 03:00:27 +00:00
Meow Wei
80248e82f9 Pontoon: Update Traditional Chinese (zh-Hant) localization of GUI
Co-authored-by: Meow Wei <medicalwei@gmail.com>
2025-05-16 03:00:27 +00:00
Meow Wei
647964fe99 Pontoon: Update Traditional Chinese (zh-Hant) localization of GUI
Co-authored-by: Meow Wei <medicalwei@gmail.com>
2025-05-16 03:00:27 +00:00
Meow Wei
010018b400 Pontoon: Update Traditional Chinese (zh-Hant) localization of GUI
Co-authored-by: Meow Wei <medicalwei@gmail.com>
2025-05-16 03:00:27 +00:00
nekomona
4783eab37c Pontoon: Update Simplified Chinese (zh-Hans) localization of GUI
Co-authored-by: nekomona <nekomona@163.com>
Co-authored-by: Luarshey <smallkay063@outlook.com>
2025-05-16 03:00:27 +00:00
unlogisch
f693d562ba Pontoon: Update German (de) localization of GUI
Co-authored-by: unlogisch <unlogisch@gmx.ch>
2025-05-16 03:00:27 +00:00
Uriel
964b19be01 Fix manual proportions not running in old browser versions (#1435) 2025-05-16 00:00:05 -03:00
loucass003
00c768919d Lint 2025-05-14 14:50:54 +02:00
loucass003
c9415b2c02 Check if vrcConfigSetting is suported in the settings 2025-05-14 14:46:55 +02:00
loucass003
93d666a233 Update wifi profile warning link to something usefull 2025-05-13 17:17:50 +02:00
Aleksandra M
cc8538a332 Add note to update gui dependencies when change SolarXR protocol (#1432) 2025-05-12 21:26:36 +02:00
lucas lelievre
f9d619f93a Show warnings when network is set to public on windows (#1425) 2025-05-12 22:24:18 +03:00
17 changed files with 403 additions and 113 deletions

View File

@@ -105,6 +105,7 @@ When touching SolarXR:
- After editing files, you should run `cd solarxr-protocol`, then either run
`./generate-flatbuffer.ps1` (Windows) or `./generate-flatbuffer.sh` (Linux/OSX)
- Make sure to commit your changes inside the submodule.
- To make sure the gui use the latest generated code, run `pnpm i`.
## Code Licensing
SlimeVR uses dual MIT and Apache-2.0 license. Be sure that any code that you reference,

View File

@@ -306,6 +306,7 @@ tracker-settings-forget = Tracker Vergessen
tracker-settings-forget-description = Entfernt den Tracker vom SlimeVR Server und verhindert, dass er sich wieder verbindet, bis der Server neu gestartet wurde. Die Konfiguration des Trackers geht nicht verloren.
tracker-settings-forget-label = Tracker Vergessen
tracker-settings-update-unavailable = Kann nicht aktualisiert werden (DIY)
tracker-settings-update-low-battery = Aktualisierung nicht möglich. Akku unter 50 %
tracker-settings-update-up_to_date = Auf dem neusten Stand
tracker-settings-update-available = { $versionName } ist jetzt Verfügbar
tracker-settings-update = Jetzt aktualisieren
@@ -1297,7 +1298,7 @@ firmware_tool-build_step = Building
firmware_tool-build_step-description = Die Firmware wird erstellt, bitte warten.
firmware_tool-flashing_step = Flashen
firmware_tool-flashing_step-description = Ihre Tracker werden geflasht, bitte folgen Sie den Anweisungen auf dem Bildschirm.
firmware_tool-flashing_step-warning = Trennen Sie den Tracker während des Upload-Prozesses nicht vom Computer und starten Sie ihn nicht neu, es sei denn, Sie werden dazu aufgefordert. Andernfalls könnte Ihr Board unbrauchbar werden.
firmware_tool-flashing_step-warning-v2 = Trennen oder schalten Sie den Tracker während des Upload-Vorgangs nicht aus, es sei denn, Sie werden dazu aufgefordert, da dies den Tracker unbrauchbar machen kann.
firmware_tool-flashing_step-flash_more = Weitere Tracker flashen
firmware_tool-flashing_step-exit = Schließen
@@ -1315,7 +1316,7 @@ firmware_tool-build-ERROR = Die Firmware konnte nicht erstellt werden
## Firmware update status
firmware_update-status-DOWNLOADING = Lade die Firmware herunter
firmware_update-status-NEED_MANUAL_REBOOT = Bitte starten Sie den Tracker neu
firmware_update-status-NEED_MANUAL_REBOOT-v2 = Bitte schalten Sie Ihren Tracker aus und wieder ein.
firmware_update-status-AUTHENTICATING = Authentifizierung mit dem Mikrokontroller
firmware_update-status-UPLOADING = Lade die Firmware hoch
firmware_update-status-SYNCING_WITH_MCU = Synchronisieren mit dem Mikrokontroller

View File

@@ -1242,6 +1242,7 @@ status_system-StatusSteamVRDisconnected = { $type ->
}
status_system-StatusTrackerError = The { $trackerName } tracker has an error.
status_system-StatusUnassignedHMD = The VR headset should be assigned as a head tracker.
status_system-StatusPublicNetwork = Your network profile is currently set to Public. This is not recomended for SlimeVR to function properly. <PublicFixLink>See how to fix it here.</PublicFixLink>
## Firmware tool globals

View File

@@ -41,7 +41,7 @@ body_part-RIGHT_UPPER_ARM = Braço superior direito
body_part-RIGHT_LOWER_ARM = Antebraço direito
body_part-RIGHT_HAND = Mão Direita
body_part-RIGHT_UPPER_LEG = Coxa direita
body_part-RIGHT_LOWER_LEG = Canela direita
body_part-RIGHT_LOWER_LEG = Tornozelo direito
body_part-RIGHT_FOOT = Pé direito
body_part-UPPER_CHEST = Peito Superior
body_part-CHEST = Peito
@@ -52,7 +52,7 @@ body_part-LEFT_UPPER_ARM = Braço superior esquerdo
body_part-LEFT_LOWER_ARM = Antebraço esquerdo
body_part-LEFT_HAND = Mão esquerda
body_part-LEFT_UPPER_LEG = Coxa esquerda
body_part-LEFT_LOWER_LEG = Canela esquerda
body_part-LEFT_LOWER_LEG = Tornozelo esquerdo
body_part-LEFT_FOOT = Pé esquerdo
body_part-LEFT_THUMB_METACARPAL = Metacarpo do polegar esquerdo
body_part-LEFT_THUMB_PROXIMAL = Proximal do polegar esquerdo
@@ -540,6 +540,9 @@ settings-general-gesture_control-numberTrackersOverThreshold-description = Aumen
## Appearance settings
settings-interface-appearance = Aparência
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-theme = Cor do tema
settings-general-interface-show-navbar-onboarding = Mostrar "{ navbar-onboarding }" na barra de navegação
settings-general-interface-show-navbar-onboarding-description = Isso muda se o botão "{ navbar-onboarding }" for exibido na barra de navegação.
@@ -945,18 +948,18 @@ onboarding-assign_trackers-warning-RIGHT_FOOT =
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
onboarding-assign_trackers-warning-LEFT_LOWER_LEG =
{ $unassigned ->
[0] Canela esquerda está atribuída, porém a coxa esquerda e peito, quadril ou cintura também precisam ser atribuídos!
[1] Canela esquerda está atribuída, porém peito, quadril ou cintura também precisam ser atribuídos!
[2] Canela esquerda está atribuída, porém a coxa direita também precisa ser atribuída!
*[unknown] Canela esquerda está atribuída, porém a parte do corpo desconhecida não atribuída também precisa ser atribuída!
[2] Tornozelo esquerdo está atribuído, porém a coxa direita também precisa ser atribuída!
[1] Tornozelo esquerdo está atribuído, porém peito, quadril ou cintura também precisam ser atribuídos!
[0] Tornozelo esquerdo está atribuído, porém a coxa esquerda e peito, quadril ou cintura também precisam ser atribuídos!
*[unknown] Tornozelo esquerdo está atribuído, porém a parte do corpo desconhecida não atribuída também precisa ser atribuída!
}
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
onboarding-assign_trackers-warning-RIGHT_LOWER_LEG =
{ $unassigned ->
[0] Canela direita está atribuída, porém a coxa direita e peito, quadril ou cintura também precisam ser atribuídos!
[1] Canela direita está atribuída, porém peito, quadril ou cintura também precisam ser atribuídos!
[2] Canela direita está atribuída, porém a coxa direita também precisa ser atribuída!
*[unknown] Canela direita está atribuída, porém a parte do corpo desconhecida não atribuída também precisa ser atribuída!
[2] Tornozelo direito está atribuído, porém a coxa direita também precisa ser atribuída!
[1] Tornozelo direito está atribuído, porém peito, quadril ou cintura também precisam ser atribuídos!
[0] Tornozelo direito está atribuído, porém a coxa direita e peito, quadril ou cintura também precisam ser atribuídos!
*[unknown] Tornozelo direito está atribuído, porém a parte do corpo desconhecida não atribuída também precisa ser atribuída!
}
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
onboarding-assign_trackers-warning-LEFT_UPPER_LEG =
@@ -1037,15 +1040,10 @@ onboarding-automatic_mounting-put_trackers_on-next = Coloquei todos os meus trac
onboarding-manual_proportions-back = Voltar para o tutorial de reset
onboarding-manual_proportions-title = Proporções de corpo manuais
onboarding-manual_proportions-precision = Ajuste de precisão
onboarding-manual_proportions-auto = Calibragem Automática
onboarding-manual_proportions-ratio = Ajustar por grupos de proporções
onboarding-manual_proportions-fine_tuning_button = Melhorar automaticamente as proporções
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Por favor, conecte seu headset VR para utilizar a melhoria automatica
onboarding-manual_proportions-export = Exportar proporções
onboarding-manual_proportions-import = Importar proporções
onboarding-manual_proportions-import-success = Importado
onboarding-manual_proportions-import-failed = Falhou
onboarding-manual_proportions-file_type = Arquivo de proporções do corpo
## Tracker automatic proportions setup
@@ -1270,7 +1268,6 @@ firmware_tool-build_step = Compilando
firmware_tool-build_step-description = O firmware está sendo compilado, aguarde
firmware_tool-flashing_step = Atualizando
firmware_tool-flashing_step-description = Seus trackers estão atualizando, por favor, siga as instruções na tela
firmware_tool-flashing_step-warning = Não desconecte nem reinicie o tracker durante o processo de upload, a menos que seja solicitado, pois isso pode tornar sua placa inutilizável
firmware_tool-flashing_step-flash_more = Atualizar mais trackers
firmware_tool-flashing_step-exit = Sair
@@ -1288,7 +1285,6 @@ firmware_tool-build-ERROR = Não foi possível compilar o firmware
## Firmware update status
firmware_update-status-DOWNLOADING = Baixando o firmware
firmware_update-status-NEED_MANUAL_REBOOT = Favor reiniciar o tracker
firmware_update-status-AUTHENTICATING = Autenticando com o mcu
firmware_update-status-UPLOADING = Fazendo upload do firmware
firmware_update-status-SYNCING_WITH_MCU = Sincronizando com o mcu

View File

@@ -9,6 +9,11 @@
websocket-connecting = 正在连接到服务器
websocket-connection_lost = 与服务器的连接丢失,正在尝试重新连接...
websocket-connection_lost-desc = 看起来 SlimeVR 服务器崩溃了。检查日志并重新启动程序
websocket-timedout = 无法连接到服务器
websocket-timedout-desc = 看起来 SlimeVR 服务器崩溃或超时了。检查日志并重新启动程序
websocket-error-close = 退出 SlimeVR
websocket-error-logs = 打开日志文件夹
## Update notification
@@ -92,7 +97,15 @@ board_type-ESP01 = ESP-01
board_type-SLIMEVR = SlimeVR
board_type-LOLIN_C3_MINI = Lolin C3 Mini
board_type-BEETLE32C3 = Beetle ESP32-C3
board_type-ES32C3DEVKITM1 = Espressif ESP32-C3 DevKitM-1
board_type-ESP32C3DEVKITM1 = Espressif ESP32-C3 DevKitM-1
board_type-OWOTRACK = owoTrack
board_type-WRANGLER = Wrangler Joycons
board_type-MOCOPI = 索尼 Mocopi
board_type-WEMOSWROOM02 = Wemos Wroom-02 D1 Mini
board_type-XIAO_ESP32C3 = Seeed Studio XIAO ESP32C3
board_type-HARITORA = Haritora
board_type-ESP32C6DEVKITC1 = Espressif ESP32-C6 DevKitC-1
board_type-GLOVE_IMU_SLIMEVR_DEV = SlimeVR开发版IMU手套
## Proportions
@@ -125,14 +138,13 @@ skeleton_bone-ELBOW_OFFSET = 肘部偏移
## Tracker reset buttons
reset-reset_all = 重置身体比例
reset-reset_all_warning =
<b>警告:</b> 这会将您的身体比例重置为仅基于身高的默认比例
reset-reset_all_warning-v2 =
<b>警告:</b> 您的骨骼比例重置为您配置的身高的默认
您确定要执行此操作吗?
reset-reset_all_warning-reset = 重置身体比例
reset-reset_all_warning-cancel = 取消
reset-reset_all_warning_default =
<b>警告:</b> 您当前没有设置身高,
这样将使用默认身高计算身体比例。
reset-reset_all_warning_default-v2 =
<b>警告:</b> 您的身高尚未配置,您的骨骼比例将重置为默认身高下的默认值。
您确定要执行此操作吗?
reset-full = 完整重置
reset-mounting = 重置佩戴
@@ -294,6 +306,7 @@ tracker-settings-forget = 忘记追踪器
tracker-settings-forget-description = 从 SlimeVR 服务器中移除该追踪器,并在服务器重启前不再连接这一追踪器。追踪器的配置信息不会被清除。
tracker-settings-forget-label = 忘记追踪器
tracker-settings-update-unavailable = 无法升级DIY
tracker-settings-update-low-battery = 无法更新。当前电池电量低于 50%
tracker-settings-update-up_to_date = 已是最新
tracker-settings-update-available = { $versionName } 现在可用
tracker-settings-update = 立即更新
@@ -373,6 +386,7 @@ settings-sidebar-utils = 工具
settings-sidebar-serial = 串口控制台
settings-sidebar-appearance = 外观
settings-sidebar-notifications = 通知
settings-sidebar-behavior = 行为
settings-sidebar-firmware-tool = DIY固件工具
settings-sidebar-advanced = 高级选项
@@ -514,9 +528,6 @@ settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = 平
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = 平均膝盖与小腿间航向轴和横滚轴的数值
settings-general-fk_settings-self_localization-title = 动作捕捉模式
settings-general-fk_settings-self_localization-description = 动作捕捉模式允许在没有头戴设备或其他追踪器的情况下粗略地跟踪骨架姿态。请注意,本功能需要脚部和头部追踪器,且现阶段依然是实验性的。
settings-general-fk_settings-vive_emulation-title = Vive 模拟
settings-general-fk_settings-vive_emulation-description = 模拟Vive追踪器的腰部丢追问题。 注:这是一个玩笑功能,会劣化追踪质量。)
settings-general-fk_settings-vive_emulation-label = 开启 Vive 模拟
## Gesture control settings (tracker tapping)
@@ -548,9 +559,6 @@ settings-general-gesture_control-numberTrackersOverThreshold-description = 如
## Appearance settings
settings-interface-appearance = 外观
settings-general-interface-dev_mode = 开发者模式
settings-general-interface-dev_mode-description = 如果你需要深入的资料或对连接的追踪器进行进阶调整,开启此模式将会非常有用。
settings-general-interface-dev_mode-label = 开发者模式
settings-general-interface-theme = 主题颜色
settings-general-interface-show-navbar-onboarding = 在导航栏上显示 “{ navbar-onboarding }”
settings-general-interface-show-navbar-onboarding-description = 本选项设置是否将 "{ navbar-onboarding }" 按钮显示在导航栏上。
@@ -583,6 +591,13 @@ settings-general-interface-feedback_sound-volume = 提示音音量
settings-general-interface-connected_trackers_warning = 已连接追踪器警告
settings-general-interface-connected_trackers_warning-description = 启用本选项后,每次当退出 SlimeVR 时仍有追踪器连接着会显示通知,提醒你在使用完毕时关闭追踪器电源来节省电池电量。
settings-general-interface-connected_trackers_warning-label = 退出时,有追踪器连接中则显示警告
## Behavior settings
settings-interface-behavior = 行为
settings-general-interface-dev_mode = 开发者模式
settings-general-interface-dev_mode-description = 如果你需要深入的资料或对连接的追踪器进行进阶调整,开启此模式将会非常有用。
settings-general-interface-dev_mode-label = 开发者模式
settings-general-interface-use_tray = 最小化至任务栏
settings-general-interface-use_tray-description = 关闭 SlimeVR 窗口时SlimeVR 服务器将会隐藏至任务栏图标而不会直接退出,可以继续使用。
settings-general-interface-use_tray-label = 最小化至任务栏
@@ -594,6 +609,14 @@ settings-general-interface-discord_presence-message =
[0] { "" }
*[other] 正在使用 { $amount } 个追踪器
}
settings-interface-behavior-error_tracking = 通过 Sentry.io 收集错误信息
settings-interface-behavior-error_tracking-description_v2 =
<h1>您是否同意收集匿名的错误信息?</h1>
<b>我们不会收集您的个人信息</b> ,例如您的 IP 地址或 WiFi 信息。SlimeVR 重视您的隐私!
为了提供最佳用户体验,我们会收集匿名错误报告、性能指标和操作系统信息。这有助于我们检测 SlimeVR 的错误和问题。这些指标将通过 Sentry.io 收集。
settings-interface-behavior-error_tracking-label = 向开发人员发送错误信息
## Serial settings
@@ -656,6 +679,13 @@ settings-osc-vrchat-description-v1 =
settings-osc-vrchat-enable = 启用
settings-osc-vrchat-enable-description = 切换数据的发送和接收
settings-osc-vrchat-enable-label = 启用
settings-osc-vrchat-oscqueryEnabled = 启用 OSCQuery
settings-osc-vrchat-oscqueryEnabled-description =
OSCQuery 会自动检测正在运行的 VRChat 并向其发送数据。
它还可以向 VRChat 通告自身,以便接收头戴显示器和控制器数据。
要允许从 VRChat 接收头戴显示器和控制器数据,请进入主菜单的设置
并启用“允许发送头部和手腕VR追踪OSC数据”。
settings-osc-vrchat-oscqueryEnabled-label = 启用 OSCQuery
settings-osc-vrchat-network = 网络端口
settings-osc-vrchat-network-description-v1 = 设置传输OSC数据的端口。用于VRChat时无需修改。
settings-osc-vrchat-network-port_in =
@@ -733,9 +763,12 @@ settings-utils-advanced-reset_warning =
}
settings-utils-advanced-reset_warning-reset = 重置设置
settings-utils-advanced-reset_warning-cancel = 取消
settings-utils-advanced-open_data = 数据文件夹
settings-utils-advanced-open_data-description = 在文件管理器中打开SlimeVR的数据文件夹,查看配置文件与日志文件
settings-utils-advanced-open_data-v1 = 配置文件夹
settings-utils-advanced-open_data-description-v1 = 在文件管理器中打开SlimeVR的配置文件夹,查看配置文件。
settings-utils-advanced-open_data-label = 打开文件夹
settings-utils-advanced-open_logs = 日志文件夹
settings-utils-advanced-open_logs-description = 在文件管理器中打开SlimeVR的日志文件夹查看SlimeVR的日志文件。
settings-utils-advanced-open_logs-label = 打开文件夹
## Setup/onboarding menu
@@ -1007,47 +1040,20 @@ onboarding-automatic_mounting-put_trackers_on-title = 穿戴好追踪器
onboarding-automatic_mounting-put_trackers_on-description = 为了校准佩戴方向,我们将使用你刚才分配的追踪器。戴上你所有的追踪器,你可以在右边的图中看到哪个追踪器对应哪个。
onboarding-automatic_mounting-put_trackers_on-next = 所有的追踪器都已开启!
## Tracker proportions method choose
onboarding-choose_proportions = 使用哪种方法校准身体比例?
# Multiline string
onboarding-choose_proportions-description-v1 =
身体比例记录了你身体各部分的尺寸。它们被用来计算虚拟追踪器的位置。
如果保存的身体比例和实际身体尺寸不匹配,追踪精度将会下降,并且会出现脚在地面滑动,或是身体和虚拟形象动作不一致的情况。
<b>身体比例设置只要进行一次!</b> 除非身体比例存在错误或是身体尺寸发生了改变,否则不需要重复进行身体比例设置。
onboarding-choose_proportions-auto_proportions = 自动调整身体比例
# Italicized text
onboarding-choose_proportions-auto_proportions-subtitle = 推荐
onboarding-choose_proportions-auto_proportions-descriptionv3 =
这将录制你的运动样本并通过算法来推测你的身体比例。
<b>需要戴上头戴设备,并确保设备已连接到 SlimeVR</b>
onboarding-choose_proportions-manual_proportions = 手动调整身体比例
# Italicized text
onboarding-choose_proportions-manual_proportions-subtitle = 用于精细调整
onboarding-choose_proportions-manual_proportions-description = 这将需要你手动修改以调整你的身体比例
onboarding-choose_proportions-scaled_proportions = 标准身体比例
# Italized text
onboarding-choose_proportions-scaled_proportions-subtitle = 推荐新用户使用
# Multiline string
onboarding-choose_proportions-scaled_proportions-description =
这将根据您的身高和平均人体比例设置身体比例,可以获得基本的全身跟踪效果。
<b>这需要将您的头戴显示器 HMD 连接到 SlimeVR 并戴在头上!</b>
onboarding-choose_proportions-scaled_proportions-button = 标准身体比例
onboarding-choose_proportions-export = 导出身体比例
onboarding-choose_proportions-import = 导入身体比例
onboarding-choose_proportions-import-success = 导入成功
onboarding-choose_proportions-import-failed = 导入失败
onboarding-choose_proportions-file_type = 身体比例文件
## Tracker manual proportions setup
## Tracker manual proportions setupa
onboarding-manual_proportions-back = 返回重置教程
onboarding-manual_proportions-title = 手动调整身体比例
onboarding-manual_proportions-precision = 精确调整
onboarding-manual_proportions-auto = 自动校准
onboarding-manual_proportions-ratio = 按比例分组调整
onboarding-manual_proportions-fine_tuning_button = 自动微调身体比例
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = 请连接 VR头戴显示器 以使用自动微调
onboarding-manual_proportions-export = 导出身体比例
onboarding-manual_proportions-import = 导入身体比例
onboarding-manual_proportions-import-success = 导入成功
onboarding-manual_proportions-import-failed = 导入失败
onboarding-manual_proportions-file_type = 身体比例文件
## Tracker automatic proportions setup
@@ -1068,10 +1074,10 @@ onboarding-automatic_proportions-requirements-descriptionv2 =
你的头戴设备正在向 SlimeVR 服务器回报位置信息(通常需要 SteamVR 正在运行且通过 SlimeVR 的 SteamVR 驱动连接到 SlimeVR
你的追踪器正常工作并能反应实际运动(进行过完整重置和佩戴重置,踢腿、弯腰、坐下等动作时虚拟骨骼向正确的方向弯曲)。
onboarding-automatic_proportions-requirements-next = 我已阅读
onboarding-automatic_proportions-check_height-title-v2 = 测量你的身高
onboarding-automatic_proportions-check_height-title-v3 = 测量你的头戴显示器的高度
onboarding-automatic_proportions-check_height-description-v2 = 您的头戴显示器 HMD 高度应略小于您的身高,因为头戴显示器会测量您眼睛的高度。此测量值将用作计算您身体比例的基准。
# All the text is in bold!
onboarding-automatic_proportions-check_height-calculation_warning-v2 = 在 <u>直</u> 时开始测量以计算您的身高。小心不要将手举到高于头显,它们可能会影响测量结果!
onboarding-automatic_proportions-check_height-calculation_warning-v3 = 在 <u>直</u> 时开始测量以计算您的身高。注意不要将手举头显,不然可能会影响测量结果!
onboarding-automatic_proportions-check_height-guardian_tip =
如果你正在使用一体机进行串流,请确保开启并设置了安全边界,
以获取正确的高度信息。
@@ -1086,9 +1092,10 @@ onboarding-automatic_proportions-check_height-next_step = 数值没问题
onboarding-automatic_proportions-check_floor_height-title = 测量您的地板高度(可选)
onboarding-automatic_proportions-check_floor_height-description = 在某些情况下,头戴显示器可能无法正确设置地板高度,从而导致头显测得的身高高于实际身高。您可以测量地板的“高度”以校正头显的高度。
# All the text is in bold!
onboarding-automatic_proportions-check_floor_height-calculation_warning = 如果您确定您的地板高度是正确的,则可以跳过此步骤。
onboarding-automatic_proportions-check_floor_height-calculation_warning-v2 = 开始测量并将控制器放在地板上以测量地板高度。如果您确定您的地板高度是正确的,则可以跳过此步骤。
# Shows an element below it
onboarding-automatic_proportions-check_floor_height-floor_height = 您的地板高度为:
onboarding-automatic_proportions-check_floor_height-full_height = 估计您的身高为:
onboarding-automatic_proportions-check_floor_height-measure-start = 开始测量
onboarding-automatic_proportions-check_floor_height-measure-stop = 停止测量
onboarding-automatic_proportions-check_floor_height-measure-reset = 重试测量
@@ -1134,10 +1141,18 @@ onboarding-automatic_proportions-smol_warning-cancel = 返回
onboarding-scaled_proportions-title = 标准身体比例
onboarding-scaled_proportions-description = 为了让 SlimeVR 追踪器正常使用,我们需要知道你的骨头的长度。将会使用人体平均骨骼比例,并缩放至您的身高。
onboarding-scaled_proportions-manual_height-title = 配置您的身高
onboarding-scaled_proportions-manual_height-description = 您的头戴显示器 HMD 高度应略小于您的身高,因为头戴显示器会测量您眼睛的高度。此高度将用作计算您身体比例的基准。
onboarding-scaled_proportions-manual_height-description-v2 = 此身高将用作您身体比例的基准。
onboarding-scaled_proportions-manual_height-missing_steamvr = SteamVR 当前未连接到 SlimeVR因此不能基于您的头戴显示器进行测量。 <b>请连接后再继续操作或查看文档!</b>
onboarding-scaled_proportions-manual_height-height = 您的头戴显示器的高度是
onboarding-scaled_proportions-manual_height-height-v2 = 您的身高为
onboarding-scaled_proportions-manual_height-estimated_height = 估计您的头显高度为:
onboarding-scaled_proportions-manual_height-next_step = 保存并继续
onboarding-scaled_proportions-manual_height-warning =
您当前正在手动设置缩放身体比例!
<b>建议只在您不使用头戴显示器时使用此模式</b>
为了能够使用自动缩放身体比例,请:
onboarding-scaled_proportions-manual_height-warning-no_hmd = 连接 VR 头戴显示器
onboarding-scaled_proportions-manual_height-warning-no_controllers = 确保您的控制器已连接并正确分配到手部
## Tracker scaled proportions reset
@@ -1267,7 +1282,7 @@ firmware_tool-build_step = 构建中
firmware_tool-build_step-description = 固件正在构建中,请稍候
firmware_tool-flashing_step = 固件烧录中
firmware_tool-flashing_step-description = 正在向追踪器烧录固件,请按照屏幕上的指示操作
firmware_tool-flashing_step-warning = 除非特别指示,在固件传输过程中请勿断开或重启追踪器,否则可能会导致您的电路板无法使用
firmware_tool-flashing_step-warning-v2 = 除非特别指示,在固件传输过程中请勿断开或关闭追踪器,否则可能会导致您的电路板无法使用
firmware_tool-flashing_step-flash_more = 烧录更多的追踪器
firmware_tool-flashing_step-exit = 退出
@@ -1285,7 +1300,7 @@ firmware_tool-build-ERROR = 无法构建固件
## Firmware update status
firmware_update-status-DOWNLOADING = 正在下载固件
firmware_update-status-NEED_MANUAL_REBOOT = 等待用户重启追踪器
firmware_update-status-NEED_MANUAL_REBOOT-v2 = 请关闭您的追踪器,然后再重新打开
firmware_update-status-AUTHENTICATING = 正在确认追踪器连接
firmware_update-status-UPLOADING = 正在传输固件
firmware_update-status-SYNCING_WITH_MCU = 正在与追踪器同步
@@ -1339,3 +1354,13 @@ unknown_device-modal-description =
要将它连接到 SlimeVR 吗?
unknown_device-modal-confirm = 是的!
unknown_device-modal-forget = 忽略它
## Error collection consent modal
error_collection_modal-title = 我们可以收集错误信息吗?
error_collection_modal-description_v2 =
{ settings-interface-behavior-error_tracking-description_v2 }
您可以稍后在设置页面的行为部分中更改此设置。
error_collection_modal-confirm = 我同意
error_collection_modal-cancel = 还是算了

View File

@@ -111,29 +111,120 @@ board_type-GLOVE_IMU_SLIMEVR_DEV = SlimeVR Dev IMU 手套
skeleton_bone-NONE = 無
skeleton_bone-HEAD = 頭部偏移
skeleton_bone-HEAD-desc =
這是從頭戴顯示器到頭中央的距離。
若要調整,請左右搖頭(如不同意、否定般的樣子)並不要移動身體,檢查其他
追蹤器的數值跳動並變更此參數,直到數值跳動小到可以忽略不計。
skeleton_bone-NECK = 頸部長度
skeleton_bone-NECK-desc =
這是從頭中央到脖子底部的距離。
若要調整,請上下點頭(如同意、肯定般的樣子)並不要移動身體,檢查其他
追蹤器的數值跳動並變更此參數,直到數值跳動小到可以忽略不計。
skeleton_bone-torso_group = 軀幹長度
skeleton_bone-torso_group-desc =
這是從脖子底部到臀部的距離。
若要調整,請站立並調整此參數,直到虛擬的臀部與實際臀部對齊。
skeleton_bone-UPPER_CHEST = 上胸長度
skeleton_bone-UPPER_CHEST-desc =
這是從脖子底部到胸部中間的距離。
若要調整,請適當調整軀幹長度,檢查各種姿勢(坐下、彎腰、躺下等)並進行
修改,直到虛擬的脊椎與實際脊椎對齊。
skeleton_bone-CHEST_OFFSET = 胸部偏移
skeleton_bone-CHEST_OFFSET-desc =
調整胸部追蹤器的上下補償。某些遊戲或是應用程式可能會期待追蹤器比較上面
或下面,可以透過調整本數值來校正。
skeleton_bone-CHEST = 胸部長度
skeleton_bone-CHEST-desc =
這是從胸部中間到脊椎中間的距離。
若要調整,請適當調整軀幹長度,檢查各種姿勢(坐下、彎腰、躺下等)並進行
修改,直到虛擬的脊椎與實際脊椎對齊。
skeleton_bone-WAIST = 腰部長度
skeleton_bone-WAIST-desc =
這是從脊椎中間到肚臍的距離。
若要調整,請適當調整軀幹長度,檢查各種姿勢(坐下、彎腰、躺下等)並進行
修改,直到虛擬的脊椎與實際脊椎對齊。
skeleton_bone-HIP = 臀部長度
skeleton_bone-HIP-desc =
這是從肚臍到臀部的距離。
若要調整,請適當調整軀幹長度,檢查各種姿勢(坐下、彎腰、躺下等)並進行
修改,直到虛擬的脊椎與實際脊椎對齊。
skeleton_bone-HIP_OFFSET = 臀部偏移
skeleton_bone-HIP_OFFSET-desc =
調整臀部追蹤器的上下補償。某些遊戲或是應用程式可能會期待追蹤器在腰部,
可以透過調整本數值來校正。
skeleton_bone-HIPS_WIDTH = 臀部寬度
skeleton_bone-HIPS_WIDTH-desc =
這是兩腿之間的起始距離。
若要調整,請站直進行完整重置後,修改到虛擬的腿部與實際腿部對齊。
skeleton_bone-leg_group = 腿部長度
skeleton_bone-leg_group-desc =
這是從臀部到腳部的距離。
若要調整,請適當調整軀幹長度後,修改此數值,直到虛擬的腳部
與實際腳部的高度一致。
skeleton_bone-UPPER_LEG = 大腿長度
skeleton_bone-UPPER_LEG-desc =
這是從臀部到膝蓋的距離。
若要調整,請適當調整腿部長度後,修改此數值,直到虛擬的膝蓋
與實際膝蓋的高度一致。
skeleton_bone-LOWER_LEG = 小腿長度
skeleton_bone-LOWER_LEG-desc =
這是從膝蓋到腳踝的距離。
若要調整,請適當調整腿部長度後,修改此數值,直到虛擬的膝蓋
與實際膝蓋的高度一致。
skeleton_bone-FOOT_LENGTH = 腳部長度
skeleton_bone-FOOT_LENGTH-desc =
這是從腳踝到腳趾的距離。
若要調整,請踮起腳尖,修改此數值,直到虛擬的腳部與實際腳部對齊。
skeleton_bone-FOOT_SHIFT = 腳部偏移
skeleton_bone-FOOT_SHIFT-desc =
這是從膝蓋到腳踝的水平距離。
這個數值可以校正站直時小腿會向後移動的問題。
若要調整,請將腳部長度設為 0進行完整重置後再修改直到虛擬腳部與
腳踝中間對齊。
skeleton_bone-SKELETON_OFFSET = 骨骼偏移
skeleton_bone-SKELETON_OFFSET-desc =
調整全部追蹤器的向前或向後補償。某些遊戲或是應用程式可能會期待追蹤器
比較前面,可以透過調整本數值來校正。
skeleton_bone-SHOULDERS_DISTANCE = 肩膀距離
skeleton_bone-SHOULDERS_DISTANCE-desc =
這是從脖子底部到肩膀的垂直距離。
若要調整,請將上臂長度設為 0 再修改,直到虛擬的肘部追蹤器與
實際的肩膀垂直對齊。
skeleton_bone-SHOULDERS_WIDTH = 肩膀寬度
skeleton_bone-SHOULDERS_WIDTH-desc =
這是從脖子底部到肩膀的水平距離。
若要調整,請將上臂長度設為 0 再修改,直到虛擬的肘部追蹤器與
實際的肩膀水平對齊。
skeleton_bone-arm_group = 手臂長度
skeleton_bone-arm_group-desc =
這是從肩膀到手腕的距離。
若要調整,請適當調整肩膀距離,將手部距離 Y 設定為 0 再修改,
直到虛擬的手部追蹤器與手腕對齊。
skeleton_bone-UPPER_ARM = 上臂長度
skeleton_bone-UPPER_ARM-desc =
這是從肩膀到手肘的距離。
若要調整,請適當調整手臂長度後,修改此數值,直到虛擬的
手肘追蹤器與實際手肘的位置一致。
skeleton_bone-LOWER_ARM = 前臂長度
skeleton_bone-LOWER_ARM-desc =
這是從手肘到手腕的距離。
若要調整,請適當調整手臂長度後,修改此數值,直到虛擬的
手肘追蹤器與實際手肘的位置一致。
skeleton_bone-HAND_Y = 手部距離Y
skeleton_bone-HAND_Y-desc =
這是從手腕到手中間的垂直距離。
若要調整以進行動作捕捉,請適當調整手臂長度後修改此數值,直到虛擬的手部追蹤器
與實際的手中間垂直對齊。
若要調整以從控制器進行肘部跟蹤,請將手臂長度設為 0 後修改此數值,直到虛擬的肘
部追蹤器與實際的手腕垂直對齊。
skeleton_bone-HAND_Z = 手部距離Z
skeleton_bone-HAND_Z-desc =
這是從手腕到手中間的水平距離。
若要調整以進行動作捕捉,請將此值設定為 0。
若要調整以從控制器進行肘部跟蹤,請將手臂長度設為 0 後修改此數值,直到虛擬的肘
部追蹤器與實際的手腕水平對齊。
skeleton_bone-ELBOW_OFFSET = 肘部偏移
skeleton_bone-ELBOW_OFFSET-desc = 將虛擬的肘部追蹤器向上或向下調整,以避免 VRChat 將肘部追蹤器綁到胸部。
## Tracker reset buttons
@@ -199,7 +290,7 @@ widget-developer_mode = 開發者選項
widget-developer_mode-high_contrast = 高對比 UI
widget-developer_mode-precise_rotation = 顯示精確旋轉
widget-developer_mode-fast_data_feed = 快速資料更新
widget-developer_mode-filter_slimes_and_hmd = 只顯示 Slime 追蹤器與頭戴顯示器
widget-developer_mode-filter_slimes_and_hmd = 只顯示 SlimeVR 追蹤器與頭戴顯示器
widget-developer_mode-sort_by_name = 依名稱排序
widget-developer_mode-raw_slime_rotation = 顯示原始旋轉
widget-developer_mode-more_info = 更多資訊
@@ -306,6 +397,7 @@ tracker-settings-forget = 忘記追蹤器
tracker-settings-forget-description = 從 SlimeVR 伺服器程式中移除該追蹤器,且直到重新啟動伺服器前不會再次連接。該追蹤器的設定不會遺失。
tracker-settings-forget-label = 忘記追蹤器
tracker-settings-update-unavailable = 無法更新 (DIY)
tracker-settings-update-low-battery = 無法更新,電池電量低於 50%
tracker-settings-update-up_to_date = 已為最新版本
tracker-settings-update-available = 版本 { $versionName } 可供更新
tracker-settings-update = 立即更新
@@ -387,6 +479,7 @@ settings-sidebar-appearance = 外觀
settings-sidebar-notifications = 通知
settings-sidebar-behavior = 行為
settings-sidebar-firmware-tool = DIY 韌體工具
settings-sidebar-vrc_warnings = VRChat 配置警告
settings-sidebar-advanced = 進階
## SteamVR settings
@@ -558,6 +651,9 @@ settings-general-gesture_control-numberTrackersOverThreshold-description = 如
## Appearance settings
settings-interface-appearance = 外觀
settings-general-interface-dev_mode = 開發者模式
settings-general-interface-dev_mode-description = 本功能會提供更深入的資料,也能與已連線的追蹤器進行更進一步的控制。
settings-general-interface-dev_mode-label = 開發者模式
settings-general-interface-theme = 佈景主題色彩
settings-general-interface-show-navbar-onboarding = 在導覽列上顯示「{ navbar-onboarding }」
settings-general-interface-show-navbar-onboarding-description = 本選項變更 「{ navbar-onboarding }」 按鈕是否要顯示在導覽列上。
@@ -574,7 +670,7 @@ settings-interface-appearance-font-slime_font = 預設字體
settings-interface-appearance-font_size = 文字縮放
settings-interface-appearance-font_size-description = 本設定會影響整個 UI 的文字大小,除了本設定面板以外。
settings-interface-appearance-decorations = 使用系統原生的視窗邊框
settings-interface-appearance-decorations-description = 不顯示標題列 UI替換成作業系統提供的標題列。
settings-interface-appearance-decorations-description = 不顯示標題列 UI使用作業系統提供的標題列。
settings-interface-appearance-decorations-label = 使用原生的視窗邊框
## Notification settings
@@ -678,8 +774,8 @@ settings-osc-vrchat-oscqueryEnabled = 啟用 OSCQuery
settings-osc-vrchat-oscqueryEnabled-description =
OSCQuery 會自動偵測並發送數據給正在執行中的 VRChat 程式。
也會把自己廣告給其他應用程式,以接收頭戴顯示器與控制器的數據。
要允許從 VRChat 接收頭戴顯示器與控制器的數據,請進入主功能表的設定
啟用「允許透過 OSC 發送頭部與腕部的 VR 追蹤數據」。
要允許從 VRChat 接收頭戴顯示器與控制器的數據,請進入主選單的設定
在「追蹤 & IK」下啟用「允許透過 OSC 發送頭部與腕部的 VR 追蹤數據」。
settings-osc-vrchat-oscqueryEnabled-label = 啟用 OSCQuery
settings-osc-vrchat-network = 連接埠
settings-osc-vrchat-network-description-v1 = 設定收發追蹤器資料的連接埠埠號,使用 VRChat 不須更改。
@@ -855,6 +951,17 @@ onboarding-connect_tracker-connection_status-looking_for_server = 正在尋找
onboarding-connect_tracker-connection_status-connection_error = 無法連線到 Wi-Fi
onboarding-connect_tracker-connection_status-could_not_find_server = 未尋找到可用的伺服器
onboarding-connect_tracker-connection_status-done = 已連線到伺服器
onboarding-connect_tracker-connection_status-no_serial_log = 無法從追蹤器取得紀錄訊息
onboarding-connect_tracker-connection_status-no_serial_device_found = 無法透過 USB 找到追蹤器
onboarding-connect_serial-error-modal-no_serial_log = 追蹤器電源開了嗎?
onboarding-connect_serial-error-modal-no_serial_log-desc = 請確認追蹤器電源已開啟,並連接到這台電腦上
onboarding-connect_serial-error-modal-no_serial_device_found = 找不到追蹤器
onboarding-connect_serial-error-modal-no_serial_device_found-desc =
請使用隨附的 USB 傳輸線將追蹤器連接到你的電腦後,再打開追蹤器電源。
如果還是不行,請嘗試以下操作:
- 使用另一條 USB 傳輸線
- 使用另一個 USB 插座
- 重新安裝 SlimeVR 伺服器程式然後在安裝元件部分將「USB drivers」打勾
# $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",
@@ -1039,16 +1146,16 @@ onboarding-automatic_mounting-put_trackers_on-next = 我所有的追蹤器都戴
onboarding-manual_proportions-back = 返回重置教學
onboarding-manual_proportions-title = 手動調整軀幹比例
onboarding-manual_proportions-precision = 精確調整
onboarding-manual_proportions-auto = 進行自動校正
onboarding-manual_proportions-ratio = 依比例分組調整
onboarding-manual_proportions-fine_tuning_button = 自動微調軀幹比例
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = 請連接 VR 頭戴顯示器以使用此功能
onboarding-manual_proportions-export = 匯出軀幹比例
onboarding-manual_proportions-import = 匯入軀幹比例
onboarding-manual_proportions-import-success = 匯入成功
onboarding-manual_proportions-import-failed = 匯入失敗
onboarding-manual_proportions-file_type = 軀幹比例描述檔
onboarding-manual_proportions-normal_increment = 正常調整
onboarding-manual_proportions-precise_increment = 精確調整
onboarding-manual_proportions-grouped_proportions = 分組調整軀幹比例
onboarding-manual_proportions-all_proportions = 全部軀幹比例
onboarding-manual_proportions-estimated_height = 預估的使用者身高
## Tracker automatic proportions setup
@@ -1277,7 +1384,7 @@ firmware_tool-build_step = 建置中
firmware_tool-build_step-description = 韌體正在建置中,請稍後
firmware_tool-flashing_step = 燒錄中
firmware_tool-flashing_step-description = 追蹤器燒錄中,請遵循畫面上的指示
firmware_tool-flashing_step-warning = 除非特別指示,燒錄中請勿移除或是重啟追蹤器,否則可能導致主板無法使用
firmware_tool-flashing_step-warning-v2 = 除非特別指示,燒錄中請勿移除或是關閉追蹤器,否則可能導致主板無法使用
firmware_tool-flashing_step-flash_more = 燒錄更多追蹤器
firmware_tool-flashing_step-exit = 離開
@@ -1295,7 +1402,7 @@ firmware_tool-build-ERROR = 無法建置韌體
## Firmware update status
firmware_update-status-DOWNLOADING = 正在下載韌體
firmware_update-status-NEED_MANUAL_REBOOT = 請重新啟動追蹤器
firmware_update-status-NEED_MANUAL_REBOOT-v2 = 請關閉追蹤器的電源再打開
firmware_update-status-AUTHENTICATING = 正在與 MCU 認證
firmware_update-status-UPLOADING = 正在上傳韌體
firmware_update-status-SYNCING_WITH_MCU = 正在與 MCU 同步
@@ -1350,6 +1457,46 @@ unknown_device-modal-description =
要將它連接到 SlimeVR 嗎?
unknown_device-modal-confirm = 好喔!
unknown_device-modal-forget = 別管它
# VRChat config warnings
vrc_config-page-title = VRChat 設定警告
vrc_config-page-desc = 本頁會顯示 VRChat 的設定並顯示哪些設定與 SlimeVR 不相容。非常建議您根據這裡顯示的警告來修改設定,以獲得最佳的 SlimeVR 使用體驗。
vrc_config-page-help = 找不到設定在哪裡嗎?
vrc_config-page-help-desc = 請查閱<a>本主題的相關文件</a>
vrc_config-page-big_menu = 追蹤 & IK主選單
vrc_config-page-big_menu-desc = 主選單中與 IK (逆向運動學)相關的設定
vrc_config-page-wrist_menu = 追蹤 & IK快速選單
vrc_config-page-wrist_menu-desc = 快速選單中與 IK (逆向運動學)相關的設定
vrc_config-on = 開啟
vrc_config-off = 關閉
vrc_config-invalid = VRChat 的設定設錯了!
vrc_config-show_more = 顯示更多
vrc_config-setting_name = VRChat 設定名稱
vrc_config-recommended_value = 建議設定
vrc_config-current_value = 目前設定
vrc_config-mute = 將警告靜音
vrc_config-mute-btn = 靜音
vrc_config-unmute-btn = 取消靜音
vrc_config-legacy_mode = 使用傳統 IK 解決方案
vrc_config-disable_shoulder_tracking = 停用肩膀追蹤
vrc_config-shoulder_width_compensation = 肩寬補償
vrc_config-spine_mode = FBT 脊椎模式
vrc_config-tracker_model = FBT 追蹤器形狀
vrc_config-avatar_measurement_type = 角色測量
vrc_config-calibration_range = 校正範圍
vrc_config-calibration_visuals = 顯示 FBT 校正範圍
vrc_config-user_height = 用戶真實身高
vrc_config-spine_mode-UNKNOWN = 不明
vrc_config-spine_mode-LOCK_BOTH = 同時鎖定
vrc_config-spine_mode-LOCK_HEAD = 鎖定頭部
vrc_config-spine_mode-LOCK_HIP = 鎖定臀部
vrc_config-tracker_model-UNKNOWN = 不明
vrc_config-tracker_model-AXIS = 軸
vrc_config-tracker_model-BOX = 箱型
vrc_config-tracker_model-SPHERE = 球型
vrc_config-tracker_model-SYSTEM = 系統
vrc_config-avatar_measurement_type-UNKNOWN = 不明
vrc_config-avatar_measurement_type-HEIGHT = 身高
vrc_config-avatar_measurement_type-ARM_SPAN = 臂展
## Error collection consent modal

View File

@@ -21,6 +21,7 @@ import { ClearMountingButton } from './ClearMountingButton';
import { ToggleableSkeletonVisualizerWidget } from './widgets/SkeletonVisualizerWidget';
import { useAtomValue } from 'jotai';
import { flatTrackersAtom } from '@/store/app-store';
import { A } from './commons/A';
function UnprioritizedStatuses() {
const { l10n } = useLocalization();
@@ -38,6 +39,11 @@ function UnprioritizedStatuses() {
id={`status_system-${StatusData[status.dataType]}`}
vars={parseStatusToLocale(status, trackers, l10n)}
key={status.id}
elems={{
PublicFixLink: (
<A href="https://docs.slimevr.dev/common-issues.html#network-profile-is-currently-set-to-public"></A>
),
}}
>
<TipBox whitespace={false} hideIcon>
{`Warning, you should fix ${StatusData[status.dataType]}`}

View File

@@ -5,6 +5,7 @@ import { useNavigate } from 'react-router-dom';
import {
RpcMessage,
StartWifiProvisioningRequestT,
StatusData,
StopWifiProvisioningRequestT,
WifiProvisioningStatus,
WifiProvisioningStatusResponseT,
@@ -15,7 +16,7 @@ import { ArrowLink } from '@/components/commons/ArrowLink';
import { Button } from '@/components/commons/Button';
import { LoaderIcon, SlimeState } from '@/components/commons/icon/LoaderIcon';
import { ProgressBar } from '@/components/commons/ProgressBar';
import { TipBox } from '@/components/commons/TipBox';
import { TipBox, WarningBox } from '@/components/commons/TipBox';
import { Typography } from '@/components/commons/Typography';
import { TrackerCard } from '@/components/tracker/TrackerCard';
import { useIsRestCalibrationTrackers } from '@/hooks/imu-logic';
@@ -23,6 +24,8 @@ import './ConnectTracker.scss';
import { useAtomValue } from 'jotai';
import { connectedIMUTrackersAtom } from '@/store/app-store';
import { BaseModal } from '@/components/commons/BaseModal';
import { useStatusContext } from '@/hooks/status-system';
import { A } from '@/components/commons/A';
const statusLabelMap = {
[WifiProvisioningStatus.NONE]:
@@ -72,6 +75,8 @@ const statusProgressMap = {
export function ConnectTrackersPage() {
const { l10n } = useLocalization();
const { statuses } = useStatusContext();
const connectedIMUTrackers = useAtomValue(connectedIMUTrackersAtom);
const { applyProgress, state } = useOnboarding();
const navigate = useNavigate();
@@ -159,6 +164,12 @@ export function ConnectTrackersPage() {
[connectedIMUTrackers.length]
);
const filteredStatuses = useMemo(() => {
return Object.entries(statuses).filter(
([, value]) => value.dataType == StatusData.StatusPublicNetwork
);
}, [statuses]);
return (
<>
<BaseModal
@@ -231,7 +242,23 @@ export function ConnectTrackersPage() {
>
<TipBox>Conditional tip</TipBox>
</Localized>
{filteredStatuses.map(([, status]) => (
<div className="pt-4">
<Localized
key={status.id}
id={`status_system-${StatusData[status.dataType]}`}
elems={{
PublicFixLink: (
<A href="https://docs.slimevr.dev/common-issues.html#network-profile-is-currently-set-to-public"></A>
),
}}
>
<WarningBox whitespace={false}>
{`Warning, you should fix ${StatusData[status.dataType]}`}
</WarningBox>
</Localized>
</div>
))}
<div
className={classNames(
'rounded-xl h-24 flex gap-2 p-3 lg:w-full mt-4 relative',

View File

@@ -8,9 +8,11 @@ import { useForm } from 'react-hook-form';
import { useLocalization } from '@fluent/react';
import { useLocation, useNavigate } from 'react-router-dom';
import './SettingsLayout.scss';
import { useVRCConfig } from '@/hooks/vrc-config';
export function SettingSelectorMobile() {
const { l10n } = useLocalization();
const { state: vrcConfigState } = useVRCConfig();
const navigate = useNavigate();
const { pathname } = useLocation();
@@ -44,10 +46,14 @@ export function SettingSelectorMobile() {
label: l10n.getString('settings-sidebar-firmware-tool'),
value: { url: '/settings/firmware-tool' },
},
{
label: l10n.getString('settings-sidebar-vrc_warnings'),
value: { url: '/vrc-warnings' },
},
...(vrcConfigState?.isSupported
? [
{
label: l10n.getString('settings-sidebar-vrc_warnings'),
value: { url: '/vrc-warnings' },
},
]
: []),
{
label: l10n.getString('settings-sidebar-advanced'),
value: { url: '/settings/advanced' },

View File

@@ -3,6 +3,7 @@ import { ReactNode, useMemo } from 'react';
import { NavLink, useLocation, useMatch } from 'react-router-dom';
import { Typography } from '@/components/commons/Typography';
import { useLocalization } from '@fluent/react';
import { useVRCConfig } from '@/hooks/vrc-config';
export function SettingsLink({
to,
@@ -41,6 +42,7 @@ export function SettingsLink({
export function SettingsSidebar() {
const { l10n } = useLocalization();
const { state: vrcConfigState } = useVRCConfig();
return (
<div className="flex flex-col px-5 py-5 gap-3 overflow-y-auto bg-background-70 rounded-lg h-full">
@@ -107,11 +109,13 @@ export function SettingsSidebar() {
{l10n.getString('settings-sidebar-firmware-tool')}
</SettingsLink>
</div>
<div className="flex flex-col gap-2">
<SettingsLink to="/vrc-warnings">
{l10n.getString('settings-sidebar-vrc_warnings')}
</SettingsLink>
</div>
{vrcConfigState?.isSupported && (
<div className="flex flex-col gap-2">
<SettingsLink to="/vrc-warnings">
{l10n.getString('settings-sidebar-vrc_warnings')}
</SettingsLink>
</div>
)}
<div className="flex flex-col gap-2">
<SettingsLink to="/settings/advanced">
{l10n.getString('settings-sidebar-advanced')}

View File

@@ -36,11 +36,10 @@ function SceneRenderer({
mag: Vector3Object;
model: string;
}) {
const magDir = new Vector3(mag.x, mag.y, mag.z);
const magLen = magDir.length();
const magMag = Math.sqrt(magLen / 100); // normalize magnituge
if (magLen > 0)
magDir.multiplyScalar(1/ magLen);
const magDir = new Vector3(mag.x, mag.y, mag.z);
const magLen = magDir.length();
const magMag = Math.sqrt(magLen / 100); // normalize magnituge
if (magLen > 0) magDir.multiplyScalar(1 / magLen);
return (
<Canvas
@@ -118,9 +117,7 @@ export function IMUVisualizerWidget({ tracker }: { tracker: TrackerDataT }) {
tracker?.linearAcceleration ||
tracker?.rawAcceleration ||
new THREE.Vector3();
const mag =
tracker?.rawMagneticVector ||
new THREE.Vector3();
const mag = tracker?.rawMagneticVector || new THREE.Vector3();
return (
<div className="bg-background-70 flex flex-col p-3 rounded-lg gap-2">
@@ -167,9 +164,7 @@ export function IMUVisualizerWidget({ tracker }: { tracker: TrackerDataT }) {
<Typography color="secondary">
{l10n.getString('tracker-infos-magnetometer')}
</Typography>
<Typography>
{formatVector3(tracker.rawMagneticVector, 1)}
</Typography>
<Typography>{formatVector3(tracker.rawMagneticVector, 1)}</Typography>
</div>
)}

View File

@@ -75,7 +75,7 @@ export function useManualProportions({ type }: { type: 'linear' | 'ratio' }): {
}
return [
...BONE_MAPPING.keys().map((groupName) => {
...[...BONE_MAPPING.keys()].map((groupName) => {
const groupBones = BONE_MAPPING.get(groupName);
if (!groupBones) throw 'invalid state - this value should always exits';
const total = config.skeletonParts
@@ -101,7 +101,8 @@ export function useManualProportions({ type }: { type: 'linear' | 'ratio' }): {
}),
...config.skeletonParts
.filter(
({ bone }) => !BONE_MAPPING.values().find((bones) => bones.includes(bone))
({ bone }) =>
![...BONE_MAPPING.values()].find((bones) => bones.includes(bone))
)
.map(
({ bone, value }) =>

View File

@@ -124,6 +124,7 @@ export function parseStatusToLocale(
case StatusData.NONE:
case StatusData.StatusTrackerReset:
case StatusData.StatusUnassignedHMD:
case StatusData.StatusPublicNetwork:
return {};
case StatusData.StatusSteamVRDisconnected: {
const data = status.data as StatusSteamVRDisconnectedT;

View File

@@ -1,4 +1,4 @@
import { useEffect, useMemo, useState } from 'react';
import { useLayoutEffect, useMemo, useState } from 'react';
import { useWebsocketAPI } from './websocket-api';
import {
RpcMessage,
@@ -48,7 +48,7 @@ export function useVRCConfig() {
const { config, setConfig } = useConfig();
const [state, setState] = useState<VRCConfigState | null>(null);
useEffect(() => {
useLayoutEffect(() => {
sendRPCPacket(RpcMessage.VRCConfigStateRequest, new VRCConfigStateRequestT());
}, []);

View File

@@ -129,6 +129,8 @@ fun main(args: Array<String>) {
)
vrServer.start()
NetworkProfileChecker(vrServer)
// Start service for USB HID trackers
TrackersHID(
"Sensors HID service",
@@ -143,6 +145,7 @@ fun main(args: Array<String>) {
}
}
}
vrServer.join()
scanner.join()
LogManager.closeLogger()

View File

@@ -0,0 +1,76 @@
package dev.slimevr.desktop
import dev.slimevr.VRServer
import io.eiren.util.OperatingSystem
import solarxr_protocol.rpc.StatusData
import solarxr_protocol.rpc.StatusDataUnion
import solarxr_protocol.rpc.StatusPublicNetworkT
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
import kotlin.concurrent.scheduleAtFixedRate
enum class NetworkProfile {
PRIVATE,
PUBLIC,
}
fun checkNetworkProfile(): NetworkProfile? {
if (OperatingSystem.currentPlatform != OperatingSystem.WINDOWS) {
return null
}
try {
// Full command as a single string
val command = "powershell.exe -Command \"(Get-NetConnectionProfile).NetworkCategory\""
// Use ProcessBuilder with the full command passed through the shell
val processBuilder = ProcessBuilder(command.split(" "))
processBuilder.redirectErrorStream(true)
val process = processBuilder.start()
// Capture the output
val output = BufferedReader(InputStreamReader(process.inputStream)).useLines { lines ->
lines.joinToString("\n")
}
val exitCode = process.waitFor()
if (exitCode != 0) {
return null
}
return when (output.trim()) {
"Private" -> NetworkProfile.PRIVATE
"Public" -> NetworkProfile.PUBLIC
else -> null
}
} catch (e: Exception) {
return null
}
}
class NetworkProfileChecker(private val server: VRServer) {
private val updateTickTimer = Timer("NetworkProfileCheck")
private var lastPublicNetworkStatus: UInt = 0u
private var currentNetworkProfile: NetworkProfile? = null
init {
if (OperatingSystem.currentPlatform == OperatingSystem.WINDOWS) {
this.updateTickTimer.scheduleAtFixedRate(0, 3000) {
val profile = checkNetworkProfile()
if (profile != currentNetworkProfile) {
currentNetworkProfile = profile
if (lastPublicNetworkStatus == 0u && profile == NetworkProfile.PUBLIC) {
lastPublicNetworkStatus = server.statusSystem.addStatus(
StatusDataUnion().apply {
type = StatusData.StatusPublicNetwork
value = StatusPublicNetworkT()
},
false,
)
} else if (lastPublicNetworkStatus != 0u && profile != NetworkProfile.PUBLIC) {
server.statusSystem.removeStatus(lastPublicNetworkStatus)
lastPublicNetworkStatus = 0u
}
}
}
}
}
}