diff --git a/src-ui/app/app.module.ts b/src-ui/app/app.module.ts index 1291bfee..ed9ab6cc 100644 --- a/src-ui/app/app.module.ts +++ b/src-ui/app/app.module.ts @@ -226,7 +226,9 @@ import { BrightnessAutomationDetailsComponent } from './views/dashboard-view/vie import { DurationInputSettingComponent } from './components/duration-input-setting/duration-input-setting.component'; import { CCTControlService } from './services/cct-control/cct-control.service'; import { CCTControlModalComponent } from './components/cct-control-modal/cct-control-modal.component'; -import { SettingsBrightnessCctViewComponent } from './views/dashboard-view/views/settings-brightness-cct-view/settings-brightness-cct-view.component'; +import { + SettingsBrightnessCctViewComponent, +} from './views/dashboard-view/views/settings-brightness-cct-view/settings-brightness-cct-view.component'; import { CCTInputSettingComponent } from './components/cct-input-setting/cct-input-setting.component'; [ diff --git a/src-ui/app/services/brightness-cct-automation.service.ts b/src-ui/app/services/brightness-cct-automation.service.ts index e2271f88..13159e5d 100644 --- a/src-ui/app/services/brightness-cct-automation.service.ts +++ b/src-ui/app/services/brightness-cct-automation.service.ts @@ -4,14 +4,17 @@ import { SleepService } from './sleep.service'; import { BehaviorSubject, combineLatest, + debounceTime, delay, distinctUntilChanged, + filter, firstValueFrom, interval, map, merge, Observable, of, + pairwise, skip, startWith, switchMap, @@ -40,6 +43,7 @@ import { SetBrightnessOrCCTReason } from './brightness-control/brightness-contro import { invoke } from '@tauri-apps/api'; import { error } from 'tauri-plugin-log-api'; import { listen } from '@tauri-apps/api/event'; +import { OpenVRService } from './openvr.service'; @Injectable({ providedIn: 'root', @@ -95,10 +99,21 @@ export class BrightnessCctAutomationService { private softwareBrightnessControl: SoftwareBrightnessControlService, private cctControl: CCTControlService, private eventLog: EventLogService, - private sleepPreparation: SleepPreparationService + private sleepPreparation: SleepPreparationService, + private openvr: OpenVRService ) {} async init() { + // Run automations when the HMD gets connected + this.openvr.devices + .pipe( + map((devices) => devices.find((d) => d.class === 'HMD')?.serialNumber ?? null), + distinctUntilChanged(), + pairwise(), + filter(([prev, current]) => prev === null && current !== null), + debounceTime(3000) + ) + .subscribe(() => this.onHmdConnect()); // Run automations when the sleep mode changes this.sleepService.mode .pipe( @@ -206,10 +221,49 @@ export class BrightnessCctAutomationService { ); } + private async onHmdConnect() { + const config = await firstValueFrom(this.automationConfigService.configs).then( + (c) => c.BRIGHTNESS_AUTOMATIONS + ); + // If sunrise/sunset times are both enabled, use the relevant values configured for those + if ( + config.AT_SUNSET.enabled && + config.AT_SUNRISE.enabled && + config.AT_SUNSET.activationTime && + config.AT_SUNRISE.activationTime + ) { + const d = new Date(); + const currentHour = d.getHours(); + const currentMinute = d.getMinutes(); + const [sunriseHour, sunriseMinute] = config.AT_SUNRISE.activationTime.split(':'); + const [sunsetHour, sunsetMinute] = config.AT_SUNSET.activationTime.split(':'); + const currentTime = currentHour * 3600 + currentMinute * 60; + const sunriseTime = parseInt(sunriseHour) * 3600 + parseInt(sunriseMinute) * 60; + const sunsetTime = parseInt(sunsetHour) * 3600 + parseInt(sunsetMinute) * 60; + const timesInverted = sunriseTime >= sunsetTime; + const firstTime = timesInverted ? sunsetTime : sunriseTime; + const secondTime = timesInverted ? sunriseTime : sunsetTime; + let runAutomation: BrightnessEvent; + if (currentTime < firstTime || currentTime >= secondTime) { + runAutomation = timesInverted ? 'AT_SUNRISE' : 'AT_SUNSET'; + } else { + runAutomation = timesInverted ? 'AT_SUNSET' : 'AT_SUNRISE'; + } + await this.onAutomationTrigger(runAutomation, config[runAutomation], true, false); + } + // Otherwise, use the values configured for the sleep mode automations (if they're enabled) + else if (await firstValueFrom(this.sleepService.mode)) { + await this.onAutomationTrigger('SLEEP_MODE_ENABLE', config.SLEEP_MODE_ENABLE, true, false); + } else { + await this.onAutomationTrigger('SLEEP_MODE_DISABLE', config.SLEEP_MODE_DISABLE, true, false); + } + } + private async onAutomationTrigger( automationType: BrightnessEvent, config: BrightnessEventAutomationConfig, - forceInstant = false + forceInstant = false, + logging = true ) { // Stop if the automation is disabled if (!config.enabled || (!config.changeBrightness && !config.changeColorTemperature)) return; @@ -238,7 +292,7 @@ export class BrightnessCctAutomationService { await this.cctControl.setCCT(config.colorTemperature, { logReason }); } const eventLogReason = eventLogReasonMap[automationType]; - if (eventLogReason) { + if (logging && eventLogReason) { this.eventLog.logEvent({ type: 'cctChanged', reason: eventLogReason, @@ -314,7 +368,7 @@ export class BrightnessCctAutomationService { } } const eventLogReason = eventLogReasonMap[automationType]; - if (eventLogReason) { + if (logging && eventLogReason) { if (advancedMode) { this.eventLog.logEvent({ type: 'softwareBrightnessChanged', @@ -358,15 +412,15 @@ export class BrightnessCctAutomationService { const sunsetTime = config.AT_SUNSET.activationTime ?? this.autoSunsetTime; if ( config.AT_SUNSET.enabled && - ((config.AT_SUNSET.onlyWhenSleepDisabled && !this.sleepMode) || this.sleepMode) && - sunsetTime === currentTime + sunsetTime === currentTime && + (!config.AT_SUNSET.onlyWhenSleepDisabled || !this.sleepMode) ) { await this.onAutomationTrigger('AT_SUNSET', config.AT_SUNSET); } if ( config.AT_SUNRISE.enabled && - ((config.AT_SUNRISE.onlyWhenSleepDisabled && !this.sleepMode) || this.sleepMode) && - sunriseTime === currentTime + sunriseTime === currentTime && + (!config.AT_SUNRISE.onlyWhenSleepDisabled || !this.sleepMode) ) { await this.onAutomationTrigger('AT_SUNRISE', config.AT_SUNRISE); } diff --git a/src-ui/app/services/fade-distance-automation.service.ts b/src-ui/app/services/fade-distance-automation.service.ts index d02a565b..7e6ae917 100644 --- a/src-ui/app/services/fade-distance-automation.service.ts +++ b/src-ui/app/services/fade-distance-automation.service.ts @@ -2,7 +2,15 @@ import { Injectable } from '@angular/core'; import { AutomationConfigService } from './automation-config.service'; import { SleepService } from './sleep.service'; import { EventLogService } from './event-log.service'; -import { distinctUntilChanged, firstValueFrom, skip } from 'rxjs'; +import { + debounceTime, + distinctUntilChanged, + filter, + firstValueFrom, + map, + pairwise, + skip, +} from 'rxjs'; import { OpenVRService } from './openvr.service'; import { EventLogChaperoneFadeDistanceChanged } from '../models/event-log-entry'; @@ -21,9 +29,22 @@ export class ChaperoneFadeDistanceAutomationService { this.sleepService.mode .pipe(skip(1), distinctUntilChanged()) .subscribe((sleepMode) => this.onSleepModeChange(sleepMode)); + // Run automations when the HMD gets connected + this.openvr.devices + .pipe( + map((devices) => devices.find((d) => d.class === 'HMD')?.serialNumber ?? null), + distinctUntilChanged(), + pairwise(), + filter(([prev, current]) => prev === null && current !== null), + debounceTime(3000) + ) + .subscribe(() => this.onHmdConnect()); } - private async onSleepModeChange(sleepMode: boolean) { + private async onHmdConnect() { + this.onSleepModeChange(await firstValueFrom(this.sleepService.mode), false); + } + private async onSleepModeChange(sleepMode: boolean, logging = true) { const config = await firstValueFrom(this.automationConfigService.configs).then((c) => sleepMode ? c.CHAPERONE_FADE_DISTANCE_ON_SLEEP_MODE_ENABLE @@ -37,10 +58,12 @@ export class ChaperoneFadeDistanceAutomationService { return; } await this.openvr.setFadeDistance(config.fadeDistance); - this.eventLog.logEvent({ - type: 'chaperoneFadeDistanceChanged', - reason: sleepMode ? 'SLEEP_MODE_ENABLED' : 'SLEEP_MODE_DISABLED', - fadeDistance: config.fadeDistance, - } as EventLogChaperoneFadeDistanceChanged); + if (logging) { + this.eventLog.logEvent({ + type: 'chaperoneFadeDistanceChanged', + reason: sleepMode ? 'SLEEP_MODE_ENABLED' : 'SLEEP_MODE_DISABLED', + fadeDistance: config.fadeDistance, + } as EventLogChaperoneFadeDistanceChanged); + } } } diff --git a/src-ui/app/services/hmd-specific-automations/bigscreen-beyond-fan-automation.service.ts b/src-ui/app/services/hmd-specific-automations/bigscreen-beyond-fan-automation.service.ts index 05c19b57..81244449 100644 --- a/src-ui/app/services/hmd-specific-automations/bigscreen-beyond-fan-automation.service.ts +++ b/src-ui/app/services/hmd-specific-automations/bigscreen-beyond-fan-automation.service.ts @@ -80,22 +80,29 @@ export class BigscreenBeyondFanAutomationService { }) ) .subscribe(); - // Attempt to set the fan speed to the value saved by the beyond driver utility, whenever the headset is detected + // Handle fan speed when the HMD is being connected this._connected .pipe(distinctUntilChanged(), debounceTime(500), filter(Boolean)) - .subscribe(async () => { - const savedFanSpeed = await this.getBeyondDriverSavedFanSpeed(); - if (savedFanSpeed !== null) await this.setFanSpeed(savedFanSpeed, true); - }); + .subscribe(() => this.onHmdConnect()); // Setup the automations this.handleFanSafety(); this.sleepService.mode .pipe(distinctUntilChanged(), skip(1)) .subscribe((sleepMode) => this.onSleepModeChange(sleepMode)); this.sleepPreparation.onSleepPreparation.subscribe(() => this.onSleepPreparation()); - this._connected.pipe(filter(Boolean), distinctUntilChanged()).subscribe(async () => { - await this.onSleepModeChange(await firstValueFrom(this.sleepService.mode)); - }); + } + + private async onHmdConnect() { + const sleepMode = await firstValueFrom(this.sleepService.mode); + let setFanValue; + if (this.config.onSleepEnable && sleepMode) { + setFanValue = this.config.onSleepEnableFanSpeed; + } else if (this.config.onSleepDisable && !sleepMode) { + setFanValue = this.config.onSleepDisableFanSpeed; + } else { + setFanValue = await this.getBeyondDriverSavedFanSpeed(); + } + if (setFanValue !== null) await this.setFanSpeed(setFanValue, true); } private async onSleepModeChange(sleepMode: boolean) { diff --git a/src-ui/app/services/hmd-specific-automations/bigscreen-beyond-led-automation.service.ts b/src-ui/app/services/hmd-specific-automations/bigscreen-beyond-led-automation.service.ts index 2355462c..cec3ff27 100644 --- a/src-ui/app/services/hmd-specific-automations/bigscreen-beyond-led-automation.service.ts +++ b/src-ui/app/services/hmd-specific-automations/bigscreen-beyond-led-automation.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, + debounceTime, distinctUntilChanged, filter, firstValueFrom, @@ -64,14 +65,24 @@ export class BigscreenBeyondLedAutomationService { ) ) .subscribe(); + // Handle LED color when the HMD is being connected + this.connected + .pipe(distinctUntilChanged(), debounceTime(500), filter(Boolean)) + .subscribe(() => this.onHmdConnect()); // Setup the automations this.sleepService.mode .pipe(distinctUntilChanged(), skip(1)) .subscribe((sleepMode) => this.onSleepModeChange(sleepMode)); this.sleepPreparation.onSleepPreparation.subscribe(() => this.onSleepPreparation()); - this.connected.pipe(filter(Boolean), distinctUntilChanged()).subscribe(async () => { - await this.onSleepModeChange(await firstValueFrom(this.sleepService.mode)); - }); + } + + private async onHmdConnect() { + const sleepMode = await firstValueFrom(this.sleepService.mode); + if (sleepMode && this.config.onSleepEnable) { + await this.setLedColor(this.config.onSleepEnableRgb, false); + } else if (!sleepMode && this.config.onSleepDisable) { + await this.setLedColor(this.config.onSleepDisableRgb, false); + } } private async onSleepModeChange(sleepMode: boolean) { diff --git a/src-ui/app/services/render-resolution-automation.service.ts b/src-ui/app/services/render-resolution-automation.service.ts index 8b5d4dd7..ffb2b6b6 100644 --- a/src-ui/app/services/render-resolution-automation.service.ts +++ b/src-ui/app/services/render-resolution-automation.service.ts @@ -2,7 +2,15 @@ import { Injectable } from '@angular/core'; import { AutomationConfigService } from './automation-config.service'; import { SleepService } from './sleep.service'; import { EventLogService } from './event-log.service'; -import { distinctUntilChanged, firstValueFrom, skip } from 'rxjs'; +import { + debounceTime, + distinctUntilChanged, + filter, + firstValueFrom, + map, + pairwise, + skip, +} from 'rxjs'; import { EventLogRenderResolutionChanged } from '../models/event-log-entry'; import { OpenVRService } from './openvr.service'; @@ -21,9 +29,19 @@ export class RenderResolutionAutomationService { this.sleepService.mode .pipe(skip(1), distinctUntilChanged()) .subscribe((sleepMode) => this.onSleepModeChange(sleepMode)); + // Run automations when the HMD gets connected + this.openvr.devices + .pipe( + map((devices) => devices.find((d) => d.class === 'HMD')?.serialNumber ?? null), + distinctUntilChanged(), + pairwise(), + filter(([prev, current]) => prev === null && current !== null), + debounceTime(3000) + ) + .subscribe(() => this.onHmdConnect()); } - private async onSleepModeChange(sleepMode: boolean) { + private async onSleepModeChange(sleepMode: boolean, logging = true) { const config = await firstValueFrom(this.automationConfigService.configs).then((c) => sleepMode ? c.RENDER_RESOLUTION_ON_SLEEP_MODE_ENABLE @@ -33,10 +51,16 @@ export class RenderResolutionAutomationService { const openvrStatus = await firstValueFrom(this.openvr.status); if (openvrStatus !== 'INITIALIZED') return; await this.openvr.setSupersampleScale(config.resolution ? config.resolution / 100 : null); - this.eventLog.logEvent({ - type: 'renderResolutionChanged', - reason: sleepMode ? 'SLEEP_MODE_ENABLED' : 'SLEEP_MODE_DISABLED', - resolution: config.resolution, - } as EventLogRenderResolutionChanged); + if (logging) { + this.eventLog.logEvent({ + type: 'renderResolutionChanged', + reason: sleepMode ? 'SLEEP_MODE_ENABLED' : 'SLEEP_MODE_DISABLED', + resolution: config.resolution, + } as EventLogRenderResolutionChanged); + } + } + + private async onHmdConnect() { + await this.onSleepModeChange(await firstValueFrom(this.sleepService.mode), false); } } diff --git a/src-ui/app/views/dashboard-view/views/brightness-automations-view/tabs/new-brightness-automations-tab/brightness-automations-list/brightness-automations-list.component.html b/src-ui/app/views/dashboard-view/views/brightness-automations-view/tabs/new-brightness-automations-tab/brightness-automations-list/brightness-automations-list.component.html index 9b31fc09..4dd411ec 100644 --- a/src-ui/app/views/dashboard-view/views/brightness-automations-view/tabs/new-brightness-automations-tab/brightness-automations-list/brightness-automations-list.component.html +++ b/src-ui/app/views/dashboard-view/views/brightness-automations-view/tabs/new-brightness-automations-tab/brightness-automations-list/brightness-automations-list.component.html @@ -5,8 +5,8 @@

brightness-automations.events

{{ - event.icon - }} + event.icon + }}
{{ 'brightness-automations.' + event.name + '.title' | translate }} @@ -32,3 +32,14 @@

brightness-automations.events

+
+
+
+ info +
+
+ brightness-automations.onHmdConnectInfo +
+
diff --git a/src-ui/app/views/dashboard-view/views/brightness-automations-view/tabs/new-brightness-automations-tab/brightness-automations-list/brightness-automations-list.component.scss b/src-ui/app/views/dashboard-view/views/brightness-automations-view/tabs/new-brightness-automations-tab/brightness-automations-list/brightness-automations-list.component.scss index 37fcf5ec..d184c689 100644 --- a/src-ui/app/views/dashboard-view/views/brightness-automations-view/tabs/new-brightness-automations-tab/brightness-automations-list/brightness-automations-list.component.scss +++ b/src-ui/app/views/dashboard-view/views/brightness-automations-view/tabs/new-brightness-automations-tab/brightness-automations-list/brightness-automations-list.component.scss @@ -4,3 +4,7 @@ padding: 2em; height: 100%; } + +.alert { + margin-top: 1em; +} diff --git a/src-ui/app/views/dashboard-view/views/hmd-automations-view/tabs/hmd-automations-bigscreen-beyond-tab/hmd-automations-bigscreen-beyond-tab.component.html b/src-ui/app/views/dashboard-view/views/hmd-automations-view/tabs/hmd-automations-bigscreen-beyond-tab/hmd-automations-bigscreen-beyond-tab.component.html index 1e1b2bc3..28768631 100644 --- a/src-ui/app/views/dashboard-view/views/hmd-automations-view/tabs/hmd-automations-bigscreen-beyond-tab/hmd-automations-bigscreen-beyond-tab.component.html +++ b/src-ui/app/views/dashboard-view/views/hmd-automations-view/tabs/hmd-automations-bigscreen-beyond-tab/hmd-automations-bigscreen-beyond-tab.component.html @@ -64,18 +64,18 @@

hmd-automations.bigscreenBeyond.fanControl.title

brightness-automations.hmdSettings.bigscreenBeyond.forceFanSafety.titlesettings.brightnessCct.bigscreenBeyond.forceFanSafety.title warning brightness-automations.hmdSettings.bigscreenBeyond.forceFanSafety.descriptionsettings.brightnessCct.bigscreenBeyond.forceFanSafety.description
diff --git a/src-ui/app/views/dashboard-view/views/settings-brightness-cct-view/settings-brightness-cct-view.component.ts b/src-ui/app/views/dashboard-view/views/settings-brightness-cct-view/settings-brightness-cct-view.component.ts index 42cc602b..9528d353 100644 --- a/src-ui/app/views/dashboard-view/views/settings-brightness-cct-view/settings-brightness-cct-view.component.ts +++ b/src-ui/app/views/dashboard-view/views/settings-brightness-cct-view/settings-brightness-cct-view.component.ts @@ -1,4 +1,4 @@ -import { Component, DestroyRef } from '@angular/core'; +import { Component, DestroyRef, OnInit } from '@angular/core'; import { APP_SETTINGS_DEFAULT, AppSettings } from '../../../../models/settings'; import { AppSettingsService } from '../../../../services/app-settings.service'; import { HardwareBrightnessControlService } from '../../../../services/brightness-control/hardware-brightness-control.service'; @@ -13,7 +13,7 @@ import { clamp } from '../../../../utils/number-utils'; templateUrl: './settings-brightness-cct-view.component.html', styleUrl: './settings-brightness-cct-view.component.scss', }) -export class SettingsBrightnessCctViewComponent { +export class SettingsBrightnessCctViewComponent implements OnInit { protected appSettings: AppSettings = structuredClone(APP_SETTINGS_DEFAULT); constructor( diff --git a/src-ui/assets/i18n/cn.json b/src-ui/assets/i18n/cn.json index 36f07a3c..97f50e94 100644 --- a/src-ui/assets/i18n/cn.json +++ b/src-ui/assets/i18n/cn.json @@ -146,10 +146,6 @@ "description": "调整显示屏本身的亮度", "title": "将硬件亮度更改为" }, - "softwareBrightness": { - "description": "调整 VR 头显的图像亮度", - "title": "将软件亮度更改为" - }, "mode": { "advanced": "高级模式", "simple": "简单模式" @@ -158,9 +154,9 @@ "message": "OyasumiVR 有两种控制 VR 头戴设备亮度的方法:软件控制和硬件控制:\n\n 软件控制适用于所有头戴设备。它通过调整软件内的亮度来调整你的 VR 头戴设备的亮度。\n\n 硬件控制只适用于支持的头戴设备(Valve Index,Bigscreen Beyond)。它直接在支持的范围内调整你的头戴设备的显示屏亮度。\n\n 在简单模式下,如果不支持硬件亮度,OyasumiVR 将平滑地过渡到控制软件和硬件亮度,或者只控制软件亮度。\n\n 如果你更喜欢直接控制,高级模式允许你分别控制软件和硬件亮度,从而允许你为每个设备设置精确的亮度值。", "title": "亮度调节模式" }, - "tabs": { - "automations": "自动化", - "hmdSettings": "HMD 设置" + "softwareBrightness": { + "description": "调整 VR 头显的图像亮度", + "title": "将软件亮度更改为" }, "title": "亮度自动化" }, @@ -2391,4 +2387,4 @@ }, "title": "VRChat 麦克风自动化" } -} +} \ No newline at end of file diff --git a/src-ui/assets/i18n/en.json b/src-ui/assets/i18n/en.json index 6950dc45..7afb776f 100644 --- a/src-ui/assets/i18n/en.json +++ b/src-ui/assets/i18n/en.json @@ -198,6 +198,7 @@ "message": "OyasumiVR has two methods of controlling the brightness of your VR headset: Software control and hardware control:\n\nSoftware control is available for every headset. It adjusts the brightness of your VR headset by adjusting the brightness of the image.\n\nHardware control is only available for supported headsets (Valve Index, Bigscreen Beyond). It adjusts the brightness of your headset's display directly within the supported range.\n\nIn simple mode, OyasumiVR will smoothly transition between controlling software and hardware brightness, or just software brightness if hardware brightness is unsupported.\n\nIf you prefer direct control, advanced mode allows you to control both software- and hardware brightness separately from each other, allowing you to set exact brightness values for each.", "title": "Brightness Control Mode" }, + "onHmdConnectInfo": "When you enable both the \"At sunset\" and \"At sunrise\" automations, they will automatically run when you connect your headset, depending on the time of day. If not, the values from the \"When I go to sleep\" and \"When I wake up\" automations will be used instead!", "onlyWhenSleepModeDisabled": { "description": "Only run this automation while the sleep mode is disabled", "title": "Only while sleep mode is disabled" diff --git a/src-ui/assets/i18n/es.json b/src-ui/assets/i18n/es.json index 0f7ebc5a..95473127 100644 --- a/src-ui/assets/i18n/es.json +++ b/src-ui/assets/i18n/es.json @@ -112,10 +112,6 @@ "description": "Ajusta el brillo de la pantalla.", "title": "Cambia el brillo del hardware a" }, - "softwareBrightness": { - "description": "Ajusta el brillo de la imagen mostrada en tu casco de realidad virtual", - "title": "Cambia el brillo del software a" - }, "mode": { "advanced": "Modo avanzado", "simple": "Modo simple" @@ -124,9 +120,9 @@ "message": "OyasumiVR dispone de dos métodos para controlar el brillo de tu casco de RV: Control por software y control por hardware:\n\nEl control por software está disponible para todos los cascos. Ajusta el brillo de tu casco de RV ajustando el brillo de la imagen.\n\nEl control por hardware sólo está disponible para los cascos compatibles (Valve Index, Bigscreen Beyond). Ajusta el brillo de la pantalla de tus cascos directamente dentro del rango soportado.\n\nEn el modo simple, OyasumiVR hará una transición suave entre el control del brillo por software y por hardware, o sólo el brillo por software si el brillo por hardware no está soportado.\n\nSi prefieres el control directo, el modo avanzado te permite controlar tanto el brillo del software como el del hardware por separado, permitiéndote establecer los valores exactos de brillo para cada uno.", "title": "Modo de control de brillo" }, - "tabs": { - "automations": "Automatizaciones", - "hmdSettings": "Ajustes HMD" + "softwareBrightness": { + "description": "Ajusta el brillo de la imagen mostrada en tu casco de realidad virtual", + "title": "Cambia el brillo del software a" }, "title": "Automatización del brillo" }, @@ -1951,4 +1947,4 @@ }, "title": "Silenciamiento del micrófono VRChat" } -} +} \ No newline at end of file diff --git a/src-ui/assets/i18n/fr.json b/src-ui/assets/i18n/fr.json index c2aefa5e..8b00ff92 100644 --- a/src-ui/assets/i18n/fr.json +++ b/src-ui/assets/i18n/fr.json @@ -854,4 +854,4 @@ "unknown": "Inconnu" } } -} +} \ No newline at end of file diff --git a/src-ui/assets/i18n/id.json b/src-ui/assets/i18n/id.json index d87891f5..0b80fcb2 100644 --- a/src-ui/assets/i18n/id.json +++ b/src-ui/assets/i18n/id.json @@ -63,9 +63,6 @@ "title": "Atur Kecerahan ke" }, "copyBrightness": "Salin nilai\nkecerahan saat ini", - "softwareBrightness": { - "description": "Menyesuaikan kecerahan gambar yang ditampilkan di headset VR Anda" - }, "mode": { "advanced": "Mode lanjutan", "simple": "Mode simpel" @@ -73,6 +70,9 @@ "modeInfoModal": { "title": "Mode Kontrol Kecerahan" }, + "softwareBrightness": { + "description": "Menyesuaikan kecerahan gambar yang ditampilkan di headset VR Anda" + }, "title": "Automasi Kecerahan" }, "chaperone-automations": { @@ -1580,4 +1580,4 @@ "unmuted": "Dibunyikan" } } -} +} \ No newline at end of file diff --git a/src-ui/assets/i18n/ja.json b/src-ui/assets/i18n/ja.json index eb06de1d..1e89e3ad 100644 --- a/src-ui/assets/i18n/ja.json +++ b/src-ui/assets/i18n/ja.json @@ -146,10 +146,6 @@ "description": "ディスプレイの輝度を調整します", "title": "ハードウェアの輝度を調整する" }, - "softwareBrightness": { - "description": "HMDに表示される映像の明るさを調整します", - "title": "ソフトウェアの明るさを変更する" - }, "mode": { "advanced": "高度", "simple": "シンプル" @@ -158,9 +154,9 @@ "message": "ソフトウェア側とハードウェア側を制御する2つの方法があります。\n\nソフトウェア制御は画面に表示される映像の明るさを調整します。これは全てのHMDで利用可能です。\n\nハードウェア制御はHMDの輝度を直接調整します。サポートされているHMD(Valve Index, Bigscreen Beyond)でのみ利用可能です。\n\nシンプルモードではソフトウェアとハードウェアの明るさのバランスを自動的に変更します。ただし、サポート外のHMDを使用している場合はソフトウェア側のみ制御されます。\n\n高度なモードではそれぞれ任意の値が設定可能です。", "title": "輝度調整モード" }, - "tabs": { - "automations": "自動化", - "hmdSettings": "HMD設定" + "softwareBrightness": { + "description": "HMDに表示される映像の明るさを調整します", + "title": "ソフトウェアの明るさを変更する" }, "title": "明るさの自動化" }, @@ -2391,4 +2387,4 @@ }, "title": "VRChatマイクミュートの自動化" } -} +} \ No newline at end of file diff --git a/src-ui/assets/i18n/ko.json b/src-ui/assets/i18n/ko.json index f4954e5d..7a65231f 100644 --- a/src-ui/assets/i18n/ko.json +++ b/src-ui/assets/i18n/ko.json @@ -146,10 +146,6 @@ "description": "디스플레이 자체의 밝기를 조절해요.", "title": "조절할 하드웨어 밝기" }, - "softwareBrightness": { - "description": "VR 헤드셋에 표시되는 이미지의 밝기를 조절해요.", - "title": "조절할 소프트웨어 밝기" - }, "mode": { "advanced": "고급 모드", "simple": "단순 모드" @@ -158,9 +154,9 @@ "message": "OyasumiVR에는 VR 헤드셋의 밝기를 제어하는 두 가지 방식이 있어요: 각각 소프트웨어 제어 방식과 하드웨어 제어 방식이에요:\n\n소프트웨어 제어는 모든 헤드셋에서 사용할 수 있어요. 이미지의 밝기를 조절하여 VR 헤드셋의 밝기를 조절합니다.\n\n하드웨어 제어는 지원되는 헤드셋( Valve Index, Bigscreen Beyond)에서만 사용할 수 있어요. 지원되는 범위 내에서 헤드셋 디스플레이의 밝기를 직접 조절합니다.\n\n단순 모드에서는 OyasumiVR이 소프트웨어와 하드웨어 밝기를 유연하게 제어하며, 하드웨어 밝기가 지원되지 않는 경우 소프트웨어 밝기로만 제어합니다. \n\n직접적인 제어를 선호하는 경우 고급 모드를 사용하면 소프트웨어와 하드웨어 밝기를 각각 개별적으로 제어할 수 있어 각각에 대한 정확한 밝기 값을 설정할 수 있습니다.", "title": "밝기 제어 모드" }, - "tabs": { - "automations": "자동화", - "hmdSettings": "HMD 설정" + "softwareBrightness": { + "description": "VR 헤드셋에 표시되는 이미지의 밝기를 조절해요.", + "title": "조절할 소프트웨어 밝기" }, "title": "밝기 자동화" }, @@ -2391,4 +2387,4 @@ }, "title": "VRChat 마이크 음소거 자동화" } -} +} \ No newline at end of file diff --git a/src-ui/assets/i18n/nl.json b/src-ui/assets/i18n/nl.json index c6b231f4..a880eb61 100644 --- a/src-ui/assets/i18n/nl.json +++ b/src-ui/assets/i18n/nl.json @@ -146,10 +146,6 @@ "description": "Past de helderheid van het fysieke scherm aan", "title": "Zet de hardware helderheid naar" }, - "softwareBrightness": { - "description": "Past de helderheid aan van het beeld dat in je VR headset word getoont", - "title": "Zet de software helderheid naar" - }, "mode": { "advanced": "Geavanceerde Modus", "simple": "Simpele Modus" @@ -158,9 +154,9 @@ "message": "OyasumiVR kan op twee manieren de helderheid van je VR headset aansturen: Software besturing en Hardware besturing:\n\nSoftware besturing is beschikbaar voor elke headset. Het past de helderheid aan door de helderheid van het getoonde beeld aan te passen.\n\nHardware besturing is alleen beschikbaar voor ondersteunde headsets (Valve Index, Bigscreen Beyond). Het past de helderheid aan door direct het scherm in je headset aan te sturen, binnen de mogelijke waarden.\n\nIn de simpele modus, OyasumiVR zal vloeiend schakelen tussen software- en hardware besturing, of alleen software besturing als hardware besturing niet word ondersteund.\n\nAls je liever directe controle hebt, kun je met de geavanceerde modus software en hardware helderheid los van elkaar instellen, met de mogelijkheid om exacte waarden te gebruiken.", "title": "Modus voor Helderheidsbesturing" }, - "tabs": { - "automations": "Automatiseringen", - "hmdSettings": "HMD Instellingen" + "softwareBrightness": { + "description": "Past de helderheid aan van het beeld dat in je VR headset word getoont", + "title": "Zet de software helderheid naar" }, "title": "Helderheid Automatiseringen" }, @@ -2391,4 +2387,4 @@ }, "title": "VRChat Microfoon Dempings Automatiseringen" } -} +} \ No newline at end of file diff --git a/src-ui/assets/i18n/ru.json b/src-ui/assets/i18n/ru.json index a070eb33..2a42c74f 100644 --- a/src-ui/assets/i18n/ru.json +++ b/src-ui/assets/i18n/ru.json @@ -146,10 +146,6 @@ "description": "Регулирует яркость самого дисплея", "title": "Изменить аппаратную яркость на" }, - "softwareBrightness": { - "description": "Управляет яркостью изображения, отображаемого в Вашей VR гарнитуре", - "title": "Программно изменить яркость на" - }, "mode": { "advanced": "Продвинутый режим", "simple": "Простой режим" @@ -158,9 +154,9 @@ "message": "OyasumiVR имеет два метода управления яркостью вашей гарнитуры VR: программное управление и аппаратное управление:\n\nПрограммное управление доступно для каждой гарнитуры. Оно регулирует яркость в вашей гарнитуре VR, изменяя яркость изображения.\n\nАппаратное управление доступно только для поддерживаемых гарнитур (Valve Index, Bigscreen Beyond). Оно регулирует яркость дисплея вашей гарнитуры непосредственно в пределах поддерживаемого диапазона.\n\nВ простом режиме OyasumiVR плавно переключается между управлением программной и аппаратной яркостью или только программной яркостью, если аппаратная яркость не поддерживается.\n\nЕсли вы предпочитаете прямое управление, расширенный режим позволяет вам управлять как программной, так и аппаратной яркостью отдельно друг от друга, позволяя установить точные значения яркости для каждого.", "title": "Режим контроля яркости" }, - "tabs": { - "automations": "Автоматизации", - "hmdSettings": "Настройки VR шлема" + "softwareBrightness": { + "description": "Управляет яркостью изображения, отображаемого в Вашей VR гарнитуре", + "title": "Программно изменить яркость на" }, "title": "Автоматизация яркости" }, @@ -2391,4 +2387,4 @@ }, "title": "Автоматизация отключения микрофона VRChat" } -} +} \ No newline at end of file diff --git a/src-ui/assets/i18n/tw.json b/src-ui/assets/i18n/tw.json index df4d254d..c50bb125 100644 --- a/src-ui/assets/i18n/tw.json +++ b/src-ui/assets/i18n/tw.json @@ -109,10 +109,6 @@ "description": "調整顯示器本身的亮度", "title": "更改硬體亮度為" }, - "softwareBrightness": { - "description": "調整 VR 頭顯影像的亮度", - "title": "更改軟體亮度為" - }, "mode": { "advanced": "進階模式", "simple": "簡單模式" @@ -121,9 +117,9 @@ "message": "當使用 OyasumiVR 來控制 VR 頭戴式顯示器的亮度時,可以選擇兩種不同的控制方法:軟體控制與硬體控制。\n\n軟體控制適用於所有類型的頭戴式顯示器,它透過調整影像的亮度來改變顯示器的亮度。\n\n硬體控制則只適用於特定支援的顯示器(如 Valve Index、Bigscreen Beyond),此方法會直接在支援的範圍內調整顯示器顯示的亮度。\n\n在簡易模式下,OyasumiVR 會平滑地在軟體和硬體亮度控制之間進行切換,或者在不支援硬體亮度的情況下只控制軟體亮度。\n\n如果你偏好直接控制,進階模式允許你分別獨立控制軟體和硬體亮度,讓你可以為每一種設置確切的亮度值。", "title": "亮度控制模式" }, - "tabs": { - "automations": "自動化", - "hmdSettings": "頭顯設定" + "softwareBrightness": { + "description": "調整 VR 頭顯影像的亮度", + "title": "更改軟體亮度為" }, "title": "亮度自動調整" }, @@ -1948,4 +1944,4 @@ }, "title": "VRChat 麥克風靜音自動化" } -} +} \ No newline at end of file diff --git a/src-ui/assets/i18n/uk.json b/src-ui/assets/i18n/uk.json index eb82711d..57b107f2 100644 --- a/src-ui/assets/i18n/uk.json +++ b/src-ui/assets/i18n/uk.json @@ -146,10 +146,6 @@ "description": "Регулює яскравість самого дисплея", "title": "Змінити апаратну яскравість на" }, - "softwareBrightness": { - "description": "Керує яскравістю зображення, що відображається у вашій VR гарнітурі", - "title": "Програмно змінити яскравість на" - }, "mode": { "advanced": "Професійний режим", "simple": "Простий режим" @@ -158,9 +154,9 @@ "message": "OyasumiVR має два методи керування яскравістю вашої гарнітури VR: програмне керування та апаратне керування:\n\nПрограмне керування доступне для кожної гарнітури. Воно регулює яскравість у вашій гарнітурі VR, змінюючи яскравість зображення.\n\nАпаратне керування доступне тільки для підтримуваних гарнітур (Valve Index, Bigscreen Beyond). Воно регулює яскравість дисплея вашої гарнітури безпосередньо в межах підтримуваного діапазону.\n\nУ простому режимі OyasumiVR плавно перемикається між керуванням програмною та апаратною яскравістю або тільки програмною яскравістю, якщо апаратна яскравість не підтримується.\n\nЯкщо ви віддаєте перевагу прямому управлінню, розширений режим дає вам змогу керувати як програмною, так і апаратною яскравістю, окремо одне від одного, даючи змогу встановити точні значення яскравості для кожного.", "title": "Режим контролю яскравості" }, - "tabs": { - "automations": "Автоматизації", - "hmdSettings": "Налаштування VR шолому" + "softwareBrightness": { + "description": "Керує яскравістю зображення, що відображається у вашій VR гарнітурі", + "title": "Програмно змінити яскравість на" }, "title": "Автоматизація яскравості" }, @@ -2391,4 +2387,4 @@ }, "title": "Автоматизація вимкнення мікрофона VRChat" } -} +} \ No newline at end of file