diff --git a/.gitattributes b/.gitattributes index 85604bbb7..c3fe173fb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,3 +2,5 @@ fluxer_static/** -text -diff fluxer_static/**/*.md text diff packages/fonts/files/** -text -diff +fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/*.wasm -text -diff +fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/*.tar.gz -text -diff diff --git a/biome.json b/biome.json index af384bf47..2ffc09b15 100644 --- a/biome.json +++ b/biome.json @@ -143,6 +143,10 @@ ], "linter": {"rules": {"style": {"noRestrictedImports": "off"}}} }, + { + "includes": ["fluxer_app/src/**/*.worklet.js"], + "javascript": {"globals": ["AudioWorkletProcessor", "registerProcessor", "sampleRate", "currentTime"]} + }, { "includes": ["**/*.astro"], "linter": {"rules": {"correctness": {"noUnusedImports": "off", "noUnusedVariables": "off"}}}, diff --git a/fluxer_app/package.json b/fluxer_app/package.json index 10b5efb7c..bda1de229 100644 --- a/fluxer_app/package.json +++ b/fluxer_app/package.json @@ -206,7 +206,6 @@ "codemirror": "^6.0.2", "colorjs.io": "catalog:", "combokeys": "catalog:", - "deepfilternet3-noise-filter": "catalog:", "eventemitter3": "catalog:", "fast-png": "^8.0.0", "favico.js": "catalog:", diff --git a/fluxer_app/pkgs/livekit-client/src/room/PCTransport.test.ts b/fluxer_app/pkgs/livekit-client/src/room/PCTransport.test.ts index de4de0f6f..e36c984d5 100644 --- a/fluxer_app/pkgs/livekit-client/src/room/PCTransport.test.ts +++ b/fluxer_app/pkgs/livekit-client/src/room/PCTransport.test.ts @@ -11,6 +11,7 @@ import { conformBundledCodecFmtp, ensureAudioNackAndStereo, ensureOpusFmtp, + ensureOpusStereoReception, ensureVideoDDExtension, placeholderMidsFromTransceivers, videoSectionCanReceiveAV1, @@ -182,6 +183,45 @@ describe('ensureAudioNackAndStereo', () => { }); }); +describe('ensureOpusStereoReception', () => { + it.each(['recvonly', 'sendrecv'] as const)( + 'receives stereo in a %s section without declaring stereo capture', + (direction) => { + const media = opusMedia('useinbandfec=1;stereo=0;sprop-stereo=0;maxaveragebitrate=48000'); + media.direction = direction; + ensureOpusStereoReception(media); + expect(opusConfig(media)).toBe('useinbandfec=1;sprop-stereo=0;maxaveragebitrate=48000;stereo=1'); + }, + ); + + it('uses the default sendrecv direction when no direction is present', () => { + const media = opusMedia('useinbandfec=1'); + ensureOpusStereoReception(media); + expect(opusConfig(media)).toBe('useinbandfec=1;stereo=1'); + }); + + it.each(['sendonly', 'inactive'] as const)('preserves a %s section', (direction) => { + const media = opusMedia('useinbandfec=1;stereo=0;sprop-stereo=0'); + media.direction = direction; + ensureOpusStereoReception(media); + expect(opusConfig(media)).toBe('useinbandfec=1;stereo=0;sprop-stereo=0'); + }); + + it('preserves rejected sections and other media or codecs', () => { + const rejected = opusMedia('useinbandfec=1'); + rejected.port = 0; + ensureOpusStereoReception(rejected); + expect(opusConfig(rejected)).toBe('useinbandfec=1'); + const video = videoMedia('camera', [{payload: 96, config: 'profile-level-id=42e01f'}]); + ensureOpusStereoReception(video); + expect(video.fmtp[0]?.config).toBe('profile-level-id=42e01f'); + const pcm = opusMedia('useinbandfec=1'); + pcm.rtp[0]!.codec = 'PCMU'; + ensureOpusStereoReception(pcm); + expect(opusConfig(pcm)).toBe('useinbandfec=1'); + }); +}); + describe('collectStereoMids', () => { it('matches the offer media section by msid before the transceiver has a mid', () => { const media = [offerMedia('0', 'mic-track'), offerMedia('1', 'screenshare-track')]; diff --git a/fluxer_app/pkgs/livekit-client/src/room/PCTransport.ts b/fluxer_app/pkgs/livekit-client/src/room/PCTransport.ts index 024877909..2934f4383 100644 --- a/fluxer_app/pkgs/livekit-client/src/room/PCTransport.ts +++ b/fluxer_app/pkgs/livekit-client/src/room/PCTransport.ts @@ -410,6 +410,7 @@ export default class PCTransport extends (EventEmitter as new () => TypedEmitter if (placeholderMids.size > 0) { conformBundledCodecFmtp(sdpParsed.media, (media) => placeholderMids.has(getMidString(media.mid!))); } + sdpParsed.media.forEach(ensureOpusStereoReception); if (this.latestOfferId > offerId) { this.log.warn('latestOfferId mismatch', { latestOfferId: this.latestOfferId, @@ -830,6 +831,16 @@ export function ensureAudioNackAndStereo( } } +export function ensureOpusStereoReception(media: MediaDescription): void { + if (media.type !== 'audio' || media.port === 0 || media.direction === 'sendonly' || media.direction === 'inactive') { + return; + } + const opusPayload = getCodecPayload(media, 'opus'); + if (opusPayload <= 0) return; + const fmtp = ensureFmtp(media, opusPayload); + fmtp.config = setFmtpParameter(fmtp.config, 'stereo', '1'); +} + export function collectStereoMids( trackBitrates: Array, media: Array, diff --git a/fluxer_app/pkgs/livekit-client/src/room/participant/LocalParticipant.test.ts b/fluxer_app/pkgs/livekit-client/src/room/participant/LocalParticipant.test.ts index d13592f6a..df236c65e 100644 --- a/fluxer_app/pkgs/livekit-client/src/room/participant/LocalParticipant.test.ts +++ b/fluxer_app/pkgs/livekit-client/src/room/participant/LocalParticipant.test.ts @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2024 LiveKit, Inc. +// +// SPDX-License-Identifier: Apache-2.0 import {type AddTrackRequest, AudioTrackFeature, ParticipantPermission, TrackInfo} from '@livekit/protocol'; import {EventEmitter} from 'events'; import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest'; @@ -6,6 +9,7 @@ import {publishDefaults, roomOptionDefaults} from '../defaults.ts'; import {TrackEvent} from '../events.ts'; import type RTCEngine from '../RTCEngine.ts'; import LocalAudioTrack from '../track/LocalAudioTrack.ts'; +import type {AudioProcessorOptions, TrackProcessor} from '../track/processor/types.ts'; import {Track} from '../track/Track.ts'; import LocalParticipant from './LocalParticipant.ts'; @@ -125,3 +129,167 @@ describe('microphone publication stereo metadata', () => { }, ); }); + +let nextTrackId = 0; + +class FakeMediaStreamTrack { + readonly id = `track-${nextTrackId++}`; + readonly kind = 'audio'; + enabled = true; + muted = false; + readyState: MediaStreamTrackState = 'live'; + appliedConstraints: MediaTrackConstraints = {}; + + constructor(private readonly settings: MediaTrackSettings = {}) {} + + getConstraints(): MediaTrackConstraints { + return this.appliedConstraints; + } + + getSettings(): MediaTrackSettings { + return this.settings; + } + + async applyConstraints(): Promise {} + + addEventListener(): void {} + + removeEventListener(): void {} + + stop(): void { + this.readyState = 'ended'; + } +} + +class FakeProcessor implements TrackProcessor { + name = 'fake-processor'; + processedTrack?: MediaStreamTrack; + readonly contexts: Array = []; + destroyed = 0; + + constructor(private readonly failInit = false) {} + + async init(opts: AudioProcessorOptions): Promise { + this.contexts.push(opts.audioContext); + if (this.failInit) throw new Error('processor init failed'); + this.processedTrack = new FakeMediaStreamTrack() as unknown as MediaStreamTrack; + } + + async restart(): Promise {} + + async destroy(): Promise { + this.destroyed++; + } +} + +const audioContext = {state: 'running'} as unknown as AudioContext; +const getUserMediaCalls: Array = []; +let getUserMediaResult: (constraints: MediaStreamConstraints) => Promise<{getTracks: () => Array}>; + +function createParticipant(): LocalParticipant { + const engine = { + on() { + return engine; + }, + logContext: {}, + }; + const participant = new LocalParticipant( + 'participant-sid', + 'participant-identity', + engine as never, + {audioCaptureDefaults: {}, videoCaptureDefaults: {}} as never, + {} as never, + {} as never, + {} as never, + {} as never, + ); + participant.setAudioContext(audioContext); + return participant; +} + +function nextCapture(settings: MediaTrackSettings = {}): FakeMediaStreamTrack { + const track = new FakeMediaStreamTrack(settings); + getUserMediaResult = async (constraints) => { + track.appliedConstraints = typeof constraints.audio === 'object' ? constraints.audio : {}; + return {getTracks: () => [track as unknown as MediaStreamTrack]}; + }; + return track; +} + +describe('LocalParticipant microphone processor and device loss', () => { + beforeEach(() => { + getUserMediaCalls.length = 0; + vi.stubGlobal( + 'MediaStream', + class { + constructor(readonly tracks: Array) {} + }, + ); + vi.stubGlobal('MediaStreamTrack', FakeMediaStreamTrack); + vi.stubGlobal('navigator', { + mediaDevices: { + getUserMedia: (constraints: MediaStreamConstraints) => { + getUserMediaCalls.push(constraints); + return getUserMediaResult(constraints); + }, + }, + }); + }); + + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it('gives the audio processor the participant audio context when creating a microphone track', async () => { + nextCapture(); + const processor = new FakeProcessor(); + const [track] = await createParticipant().createTracks({audio: {processor}}); + expect(processor.contexts).toEqual([audioContext]); + expect((track as LocalAudioTrack).getProcessor()).toBe(processor); + expect(track?.mediaStreamTrack).toBe(processor.processedTrack); + }); + + it('returns the unprocessed microphone track when the processor cannot start', async () => { + const raw = nextCapture(); + const processor = new FakeProcessor(true); + const [track] = await createParticipant().createTracks({audio: {processor}}); + expect((track as LocalAudioTrack).getProcessor()).toBeUndefined(); + expect(track?.mediaStreamTrack).toBe(raw as unknown as MediaStreamTrack); + expect(processor.destroyed).toBeGreaterThan(0); + }); + + it('destroys the audio processor when the microphone cannot be captured', async () => { + getUserMediaResult = async () => { + throw new Error('NotReadableError'); + }; + const processor = new FakeProcessor(); + await expect(createParticipant().createTracks({audio: {processor}})).rejects.toThrow('NotReadableError'); + expect(processor.contexts).toEqual([]); + expect(processor.destroyed).toBe(1); + }); + + it('keeps echo cancellation, noise suppression, gain control and channels when the device is lost', async () => { + nextCapture({deviceId: 'usb-mic'}); + const participant = createParticipant(); + const [track] = await participant.createTracks({ + audio: { + deviceId: 'usb-mic', + echoCancellation: false, + noiseSuppression: false, + autoGainControl: false, + channelCount: {ideal: 2}, + }, + }); + getUserMediaCalls.length = 0; + nextCapture({deviceId: 'default'}); + await (participant as unknown as {handleTrackEnded: (track: unknown) => Promise}).handleTrackEnded(track); + expect(getUserMediaCalls).toHaveLength(1); + expect(getUserMediaCalls[0]?.audio).toMatchObject({ + deviceId: 'default', + echoCancellation: false, + noiseSuppression: false, + autoGainControl: false, + channelCount: {ideal: 2}, + }); + }); +}); diff --git a/fluxer_app/pkgs/livekit-client/src/room/participant/LocalParticipant.ts b/fluxer_app/pkgs/livekit-client/src/room/participant/LocalParticipant.ts index 8ae43e7cb..84eee12b7 100644 --- a/fluxer_app/pkgs/livekit-client/src/room/participant/LocalParticipant.ts +++ b/fluxer_app/pkgs/livekit-client/src/room/participant/LocalParticipant.ts @@ -71,6 +71,7 @@ import type { VideoCaptureOptions, } from '../track/options.ts'; import {isBackupCodec, ScreenSharePresets, VideoPresets} from '../track/options.ts'; +import type {AudioProcessorOptions, TrackProcessor} from '../track/processor/types.ts'; import {Track} from '../track/Track.ts'; import { getLogContextFromTrack, @@ -627,12 +628,25 @@ export default class LocalParticipant extends Participant { this.roomOptions?.audioCaptureDefaults, this.roomOptions?.videoCaptureDefaults, ); + const audioProcessor = + typeof mergedOptionsWithProcessors.audio === 'object' ? mergedOptionsWithProcessors.audio.processor : undefined; + if (audioProcessor && typeof mergedOptionsWithProcessors.audio === 'object') { + mergedOptionsWithProcessors.audio = {...mergedOptionsWithProcessors.audio, processor: undefined}; + } try { - const tracks = await createLocalTracks(mergedOptionsWithProcessors, { - loggerName: this.roomOptions.loggerName, - loggerContextCb: () => this.logContext, - }); + let tracks: Array; + try { + tracks = await createLocalTracks(mergedOptionsWithProcessors, { + loggerName: this.roomOptions.loggerName, + loggerContextCb: () => this.logContext, + }); + } catch (err) { + await audioProcessor?.destroy().catch((destroyError) => { + this.log.warn('failed to destroy an unused audio processor', {...this.logContext, error: destroyError}); + }); + throw err; + } const localTracks = tracks.map((track) => { if (isAudioTrack(track)) { this.microphoneError = undefined; @@ -646,6 +660,11 @@ export default class LocalParticipant extends Participant { } return track; }); + if (audioProcessor) { + for (const track of localTracks) { + if (isLocalAudioTrack(track)) await this.installCreatedAudioProcessor(track, audioProcessor); + } + } return localTracks; } catch (err) { if (err instanceof Error) { @@ -661,6 +680,21 @@ export default class LocalParticipant extends Participant { } } + private async installCreatedAudioProcessor( + track: LocalAudioTrack, + processor: TrackProcessor, + ): Promise { + try { + await track.setProcessor(processor); + } catch (error) { + this.log.warn('audio processor could not start, publishing the unprocessed track', { + ...this.logContext, + error, + }); + track.emit(TrackEvent.TrackProcessorUpdate); + } + } + async createScreenTracks(options?: ScreenShareCaptureOptions): Promise> { if (options === undefined) { options = {}; @@ -1851,7 +1885,7 @@ export default class LocalParticipant extends Participant { if (!track.isMuted) { this.log.debug('track ended, attempting to use a different device', getLogContextFromTrack(track)); if (isLocalAudioTrack(track)) { - await track.restartTrack({deviceId: 'default'}); + await track.restartTrack({...(track.constraints as AudioCaptureOptions), deviceId: 'default'}); } else { await track.restartTrack(); } diff --git a/fluxer_app/pkgs/livekit-client/src/room/track/LocalAudioTrack.test.ts b/fluxer_app/pkgs/livekit-client/src/room/track/LocalAudioTrack.test.ts new file mode 100644 index 000000000..7793b1fcb --- /dev/null +++ b/fluxer_app/pkgs/livekit-client/src/room/track/LocalAudioTrack.test.ts @@ -0,0 +1,180 @@ +// SPDX-FileCopyrightText: 2024 LiveKit, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest'; +import LocalAudioTrack from './LocalAudioTrack.ts'; +import type {AudioProcessorOptions, TrackProcessor} from './processor/types.ts'; +import type {Track} from './Track.ts'; + +let nextTrackId = 0; + +class FakeMediaStreamTrack { + readonly id = `track-${nextTrackId++}`; + readonly kind = 'audio'; + enabled = true; + muted = false; + readyState: MediaStreamTrackState = 'live'; + + getConstraints(): MediaTrackConstraints { + return {}; + } + + getSettings(): MediaTrackSettings { + return {}; + } + + async applyConstraints(): Promise {} + + addEventListener(): void {} + + removeEventListener(): void {} + + stop(): void { + this.readyState = 'ended'; + } +} + +interface SenderHandoff { + track: MediaStreamTrack | null; + enabled: boolean | null; +} + +class FakeSender { + track: MediaStreamTrack | null = null; + readonly handoffs: Array = []; + duringReplace: (() => Promise) | null = null; + + async replaceTrack(track: MediaStreamTrack | null): Promise { + this.handoffs.push({track, enabled: track?.enabled ?? null}); + const duringReplace = this.duringReplace; + this.duringReplace = null; + await duringReplace?.(); + this.track = track; + } +} + +class FakeProcessor implements TrackProcessor { + name = 'fake-processor'; + processedTrack?: MediaStreamTrack; + readonly inputs: Array = []; + + async init(opts: AudioProcessorOptions): Promise { + this.inputs.push(opts.track); + this.processedTrack = new FakeMediaStreamTrack() as unknown as MediaStreamTrack; + } + + async restart(opts: AudioProcessorOptions): Promise { + this.inputs.push(opts.track); + } + + async destroy(): Promise {} +} + +function asMediaStreamTrack(track: FakeMediaStreamTrack): MediaStreamTrack { + return track as unknown as MediaStreamTrack; +} + +async function createPublishedTrack() { + const raw = new FakeMediaStreamTrack(); + const track = new LocalAudioTrack(asMediaStreamTrack(raw), undefined, false, {} as AudioContext); + await track.runWithTrackChangeLock(async () => {}); + const sender = new FakeSender(); + track.sender = sender as unknown as RTCRtpSender; + await sender.replaceTrack(asMediaStreamTrack(raw)); + sender.handoffs.length = 0; + return {raw, track, sender}; +} + +async function installProcessor(track: LocalAudioTrack): Promise { + const processor = new FakeProcessor(); + await track.setProcessor(processor); + return processor; +} + +describe('LocalAudioTrack mute with a processor', () => { + beforeEach(() => { + vi.stubGlobal( + 'MediaStream', + class { + constructor(readonly tracks: Array) {} + }, + ); + }); + + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it('keeps the raw capture enabled and disables the processed track on mute', async () => { + const {raw, track} = await createPublishedTrack(); + const processor = await installProcessor(track); + await track.mute(); + expect(raw.enabled).toBe(true); + expect(processor.processedTrack?.enabled).toBe(false); + }); + + it('re-enables the processed track on unmute', async () => { + const {raw, track} = await createPublishedTrack(); + const processor = await installProcessor(track); + await track.mute(); + await track.unmute(); + expect(raw.enabled).toBe(true); + expect(processor.processedTrack?.enabled).toBe(true); + }); + + it('disables the raw capture on mute without a processor', async () => { + const {raw, track} = await createPublishedTrack(); + await track.mute(); + expect(raw.enabled).toBe(false); + }); + + it('hands the sender a disabled processed track when the processor is installed while muted', async () => { + const {raw, track, sender} = await createPublishedTrack(); + await track.mute(); + const processor = await installProcessor(track); + expect(sender.handoffs).toEqual([{track: processor.processedTrack, enabled: false}]); + expect(raw.enabled).toBe(true); + expect(processor.processedTrack?.enabled).toBe(false); + }); + + it('ends muted when a mute lands while the processed track is being handed to the sender', async () => { + const {raw, track, sender} = await createPublishedTrack(); + sender.duringReplace = async () => { + await track.mute(); + expect(raw.enabled).toBe(false); + }; + const processor = await installProcessor(track); + expect(track.isMuted).toBe(true); + expect(sender.track).toBe(processor.processedTrack); + expect(processor.processedTrack?.enabled).toBe(false); + expect(raw.enabled).toBe(true); + }); + + it('never hands an enabled track to the sender when the processor stops while muted', async () => { + const {raw, track, sender} = await createPublishedTrack(); + await installProcessor(track); + await track.mute(); + sender.handoffs.length = 0; + await track.stopProcessor(); + expect(sender.handoffs.length).toBeGreaterThan(0); + expect(sender.handoffs.every((handoff) => handoff.enabled !== true)).toBe(true); + expect(sender.track).toBe(asMediaStreamTrack(raw)); + expect(raw.enabled).toBe(false); + }); + + it('keeps the new raw capture enabled and the sender track disabled when restarting while muted', async () => { + const {track, sender} = await createPublishedTrack(); + const processor = await installProcessor(track); + await track.mute(); + sender.handoffs.length = 0; + const restarted = new FakeMediaStreamTrack(); + vi.stubGlobal('navigator', { + mediaDevices: {getUserMedia: async () => ({getTracks: () => [restarted]})}, + }); + await track.restartTrack(); + expect(processor.inputs.at(-1)).toBe(asMediaStreamTrack(restarted)); + expect(restarted.enabled).toBe(true); + expect(sender.handoffs).toEqual([{track: processor.processedTrack, enabled: false}]); + expect(processor.processedTrack?.enabled).toBe(false); + }); +}); diff --git a/fluxer_app/pkgs/livekit-client/src/room/track/LocalAudioTrack.ts b/fluxer_app/pkgs/livekit-client/src/room/track/LocalAudioTrack.ts index f583435f8..6eec2df90 100644 --- a/fluxer_app/pkgs/livekit-client/src/room/track/LocalAudioTrack.ts +++ b/fluxer_app/pkgs/livekit-client/src/room/track/LocalAudioTrack.ts @@ -38,6 +38,13 @@ export default class LocalAudioTrack extends LocalTrack { this.checkForSilence(); } + protected override muteTargetFor( + rawTrack: MediaStreamTrack, + processedTrack: MediaStreamTrack | undefined, + ): MediaStreamTrack { + return processedTrack ?? rawTrack; + } + override async mute(): Promise { const unlock = await this.muteLock.lock(); try { @@ -189,8 +196,12 @@ export default class LocalAudioTrack extends LocalTrack { } const processedTrack = processor.processedTrack; try { - if (processedTrack) await this.sender?.replaceTrack(processedTrack); + if (processedTrack) { + processedTrack.enabled = !this.isMuted; + await this.sender?.replaceTrack(processedTrack); + } this.processor = processor; + this.applyMuteState(this._mediaStreamTrack, processedTrack); if (processedTrack) { processedTrack.addEventListener('enable-lk-krisp-noise-filter', this.handleKrispNoiseFilterEnable); processedTrack.addEventListener('disable-lk-krisp-noise-filter', this.handleKrispNoiseFilterDisable); @@ -199,6 +210,7 @@ export default class LocalAudioTrack extends LocalTrack { } catch (error) { const cleanupErrors: Array = []; if (this.processor === processor) this.processor = undefined; + this.applyMuteState(this._mediaStreamTrack, undefined); processedTrack?.removeEventListener('enable-lk-krisp-noise-filter', this.handleKrispNoiseFilterEnable); processedTrack?.removeEventListener('disable-lk-krisp-noise-filter', this.handleKrispNoiseFilterDisable); try { diff --git a/fluxer_app/pkgs/livekit-client/src/room/track/LocalTrack.ts b/fluxer_app/pkgs/livekit-client/src/room/track/LocalTrack.ts index 82bc43640..dca774f8c 100644 --- a/fluxer_app/pkgs/livekit-client/src/room/track/LocalTrack.ts +++ b/fluxer_app/pkgs/livekit-client/src/room/track/LocalTrack.ts @@ -160,10 +160,23 @@ export default abstract class LocalTrack { attachToElement(processedTrack ?? newTrack, el); @@ -264,7 +278,6 @@ export default abstract class LocalTrack { filename: isProduction ? 'assets/[contenthash:16].worklet.js' : 'assets/[name].[hash].worklet.js', }, }, + { + test: /[\\/]src[\\/].+\.worklet\.js$/, + type: 'asset/resource', + generator: { + filename: isProduction ? 'assets/[contenthash:16].worklet.js' : 'assets/[name].[hash].worklet.js', + }, + }, { test: /\.(tsx|ts|jsx|js)$/, - exclude: /node_modules/, + exclude: [/node_modules/, /\.worklet\.js$/], type: 'javascript/auto', parser: { dynamicImport: true, @@ -383,6 +390,13 @@ export default () => { ...(workerWasmPublicPath ? {publicPath: workerWasmPublicPath} : {}), }, }, + { + test: /[\\/]deepfilternet3[\\/][^\\/]+\.tar\.gz$/, + type: 'asset/resource', + generator: { + filename: isProduction ? 'assets/[contenthash:16].tar.gz' : 'assets/[name].[hash].tar.gz', + }, + }, { test: /\.onnx$/, type: 'asset/resource', diff --git a/fluxer_app/src/features/i18n/locales/ar/messages.po b/fluxer_app/src/features/i18n/locales/ar/messages.po index 33f64ba84..e2d78adc9 100644 --- a/fluxer_app/src/features/i18n/locales/ar/messages.po +++ b/fluxer_app/src/features/i18n/locales/ar/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "يحتاج {productName} إلى الوصول إلى الكاميرا لعرض أجهزتك." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "يحتاج {productName} إلى الوصول إلى الميكروفون لعرض أجهزتك." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, zero {عضو} one {عضو} t msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} متصل" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "تعذر بدء {requestedLabel}. سيتم استخدام {effectiveLabel} بدلاً منه." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "مشاركة النشاط" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "حد النشاط" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "العنوان" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "اضبط كل إعداد بنفسك: إزالة الضوضاء، وإلغاء الصدى، والكسب." @@ -3606,11 +3610,11 @@ msgstr "السماح بـ {everyoneMention} و{hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "اسمح لـ {PRODUCT_NAME} بالوصول إلى الكاميرا في {MACOS_SYSTEM_SETTINGS_NAME} ← {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} ← {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "اسمح لـ {PRODUCT_NAME} بالوصول إلى الميكروفون الخاص بك في {MACOS_SYSTEM_SETTINGS_NAME} ← {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} ← {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "اسمح لـ {PRODUCT_NAME} بالوصول إلى الميكروفون الخاص بك. تحقق من شريط عنوان المتصفح أو الإعدادات." @@ -3713,7 +3717,7 @@ msgstr "السماح للأعضاء الذين لا يملكون إذن {readMes msgid "Allow mentions for this role" msgstr "السماح بالإشارة إلى هذا الدور" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "السماح بالوصول إلى الميكروفون" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "معاينة الصوت" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "معالجة الصوت" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "اكتشاف اللغة تلقائيًا" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "تعيين حد النشاط تلقائيًا" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "اختصارات مدمجة" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "إزالة الضوضاء المدمجة في متصفحك أو نظامك." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "تنظيف الرابط" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "ينقي صوت الميكروفون لضمان وضوح الكلام." @@ -8985,7 +8989,7 @@ msgstr "وصّل كاميرا أو جهاز التقاط افتراضي، ثم msgid "Connect a display, then try again." msgstr "وصّل شاشة، ثم حاول مرة أخرى." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "وصّل ميكروفونًا وحاول مرة أخرى." @@ -10672,8 +10676,8 @@ msgstr "مصدر مخصص" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "قص" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "يقطع الصوت الأخفض من عتبة شدة محددة بأقل استهلاك للمعالج." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "زر التنزيل" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "تنزيل تطبيق سطح المكتب" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "تمكين" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "تمكين إذن {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "صوت النظام بالكامل" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "صوت الدخول" @@ -14330,8 +14334,8 @@ msgstr "وقت المساء" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "يوازن مستوى صوت الميكروفون حتى لا يكون صوتك منخفضًا جدًا." @@ -17360,7 +17364,7 @@ msgstr "أحتاج إلى طريقة أخرى" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "فهمت" @@ -17792,7 +17796,7 @@ msgstr "في" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "في وضع \"نظام التشغيل\"، تكون القواميس المذكورة أعلاه إرشادية فقط. سيمرر {PRODUCT_NAME} علامات اللغة هذه إلى مدقق الإملاء في نظام التشغيل عندما يكون ذلك مدعومًا. يتم تجاهل العلامات التي لا يتعرف عليها." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "في المتصفح، لا تعمل ميزة الضغط للتحدث إلا عندما تكون علامة تبويب {PRODUCT_NAME} نشطة. ثبّت تطبيق سطح المكتب لاستخدام الضغط للتحدث على مستوى النظام." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "تم تغيير الوصول إلى الإدخال. أغلق {productName} تمامًا وأعد تشغيله حتى تتمكن الاختصارات على مستوى النظام من استخدامه." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "الإدخال والإخراج" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "حافظ على سريتها. ستؤدي إعادة الإنشاء إلى تعطيل عمليات التكامل الحالية." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "يستمر الإرسال لفترة وجيزة بعد إفلات زر الضغط للتحدث." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "السمة الفاتحة" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "مرشح كلاسيكي خفيف يعمل على أي جهاز." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "المظهر والشكل" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "يبدو أنك تستخدم {0}. قد تؤدي إضافة معالجة {PRODUCT_NAME} فوقه إلى تذبذب مستوى الصوت أو تشويهه. يمرّر الإدخال المباشر الصوت كما هو دون أي تعديل." @@ -21035,7 +21039,7 @@ msgstr "ميكروفون" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "اختبار الميكروفون" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "الشبكة والأداء" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "مرشح عصبي يزيل معظم الضوضاء الخلفية." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "مرشح عصبي بنطاق ترددي كامل للصوت." @@ -22690,7 +22694,7 @@ msgstr "لم يتم العثور على نتائج مطابقة" msgid "No mentions yet" msgstr "لا توجد إشارات بعد" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "لم يتم العثور على ميكروفون" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "الضوضاء" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "بوابة الضوضاء" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "لا شيء" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "لا شيء" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "مفتاح الضغط للتحدث" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "الضغط للتحدث" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "الضغط للتحدث (محدود)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "يتم تجاهل الضغط للتحدث في وضع الإدخال المباشر. بدّل إلى الصوت المركّز أو المخصص لاستخدامه." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "الضغط للتحدث مفعّل. اضغط باستمرار على {pushToTalkHint} للتحدث." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "لا يعمل الضغط للتحدث إلا عندما تكون نافذة {productName} نشطة حتى تفعيل {permissionName}. بعد تغيير الإذن، أغلق {productName} تمامًا وأعد تشغيله لتتمكن الاختصارات على مستوى النظام من استخدامه." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "لا يعمل الضغط للتحدث إلا عندما تكون علامة تبويب المتصفح نشطة." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "مُوصى به" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "مُوصى به. ينقّي صوت الميكروفون ليكون الكلام واضحًا." @@ -26561,7 +26565,7 @@ msgstr "نسبي" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "تأخير الإفلات" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "اختر الحساب الذي تريد تسجيل الدخول به على جهازك الجديد." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "تحديد وضع معالجة الصوت" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "تم تعطيل إرسال الرسائل في هذا المجتمع" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "يرسل كلا قناتي ميكروفون ستيريو. يتطلب إيقاف تشغيل كل المعالجة وقناة بسرعة 128 كيلوبت في الثانية أو أعلى." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "يرسل صوت الميكروفون الخام بدون معالجة." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "يرسل صوتك دون أي تعديل. مناسب إذا كنت تستخدم برامج صوت خارجية." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "يرسل صوت الميكروفون دون أي إزالة للضوضاء." @@ -30136,7 +30140,7 @@ msgstr "رموز مختصرة" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "الخطوة 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "ميكروفون ستيريو" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "تم منع العضو من سماع الآخرين في هذا المجتمع" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "يمنع صوت مكبرات الصوت من العودة إلى الميكروفون." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "جودة قوية بتكلفة معالجة معتدلة. خيار احتياطي جيد على Chromium لمشاركة الشاشة." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "أقوى مرشح عصبي للكلام. يحصر الصوت في نطاق الكلام." @@ -32539,7 +32543,7 @@ msgstr "التبديل إلى التخطيط المريح" msgid "Switch to dense layout" msgstr "التبديل إلى التخطيط المضغوط" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "التبديل إلى الإدخال المباشر" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "سرعة تحويل النص إلى كلام" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "اضبط المعالجة بنفسك." @@ -37106,6 +37110,10 @@ msgstr "يستخدم مركز إشعارات نظام التشغيل. للتحك msgid "Uses:" msgstr "الاستخدامات:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "استخدام {effectiveLabel} حتى يصبح {requestedLabel} جاهزًا." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "المشاركون في المكالمة الصوتية" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "معالجة الصوت" @@ -38118,6 +38126,10 @@ msgstr "إلغاء تعطيل السمع" msgid "Voice unmute" msgstr "إلغاء كتم الصوت" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "يستخدم الصوت جهاز الإخراج الخاص بنظامك في هذا المتصفح. قم بتغييره في إعدادات نظامك." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "ملغاة" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "أي المحادثات" msgid "Which rule was broken?" msgstr "ما القاعدة التي تم خرقها؟" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "عند تشغيل الضغط للتحدث، يتحكم اختصارك في الميكروفون، لذلك يكون زر كتم الصوت معطّلًا." diff --git a/fluxer_app/src/features/i18n/locales/auto-i18n-reviewed-unchanged.json b/fluxer_app/src/features/i18n/locales/auto-i18n-reviewed-unchanged.json index c7b997176..79469e402 100644 --- a/fluxer_app/src/features/i18n/locales/auto-i18n-reviewed-unchanged.json +++ b/fluxer_app/src/features/i18n/locales/auto-i18n-reviewed-unchanged.json @@ -3288,9 +3288,15 @@ { "msgid": "Used in Custom mode. The Gaming and Screen share presets set their own hint." }, + { + "msgid": "Using {effectiveLabel} until {requestedLabel} is ready." + }, { "msgid": "Virtual microphone" }, + { + "msgid": "Voice uses your system output device in this browser. Change it in your system settings." + }, { "msgid": "Volume sliders" }, @@ -3996,6 +4002,9 @@ { "msgid": "{remaining, plural, one {+# more} other {+# more}}" }, + { + "msgid": "{requestedLabel} could not start. Using {effectiveLabel} instead." + }, { "msgctxt": "audit-log-member-profile", "msgid": "Changed the community banner." diff --git a/fluxer_app/src/features/i18n/locales/bg/messages.po b/fluxer_app/src/features/i18n/locales/bg/messages.po index 79b82d8ba..b156b5256 100644 --- a/fluxer_app/src/features/i18n/locales/bg/messages.po +++ b/fluxer_app/src/features/i18n/locales/bg/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} се нуждае от достъп до камерата, за да покаже списък с устройствата ти." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} се нуждае от достъп до микрофона, за да покаже списък с устройствата ти." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {член} other {чле msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} онлайн" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} не може да стартира. Използва се {effectiveLabel} вместо това." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Споделяне на активност" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Праг на активност" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Адрес" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Настрой всяка опция ръчно: потискане на шума, потискане на ехото и усилване." @@ -3606,11 +3610,11 @@ msgstr "Разрешаване на {everyoneMention} и {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Разреши на {PRODUCT_NAME} достъп до камерата ти в {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Разреши на {PRODUCT_NAME} достъп до микрофона ти в {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Разреши на {PRODUCT_NAME} достъп до микрофона ти. Провери адресната лента или настройките на браузъра си." @@ -3713,7 +3717,7 @@ msgstr "Позволява на членовете без разрешениет msgid "Allow mentions for this role" msgstr "Разрешаване на споменавания за тази роля" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Разреши микрофона" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Преглед на аудио" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Обработка на аудио" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Автоматично разпознаване на език" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Автоматично задаване на праг за активност" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Вградени клавишни комбинации" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Вградено потискане на шума от браузъра или системата." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Изчистване на линк" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Изчиства звука от микрофона ти за ясна реч." @@ -8985,7 +8989,7 @@ msgstr "Свържи камера или виртуално устройство msgid "Connect a display, then try again." msgstr "Свържи дисплей и опитай отново." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Свържи микрофон и опитай отново." @@ -10672,8 +10676,8 @@ msgstr "Персонализиран източник" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Изрежи" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Отрязва звука под зададен праг на сила с минимално натоварване на процесора." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Бутон за изтегляне" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Изтегляне на настолното приложение" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Активиране" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Включи разрешението {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Звук от цялата система" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Звук при влизане" @@ -14330,8 +14334,8 @@ msgstr "Вечер" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Изравнява силата на микрофона ти, за да не звучиш твърде тихо." @@ -17360,7 +17364,7 @@ msgstr "Имам нужда от друг начин" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Разбрах" @@ -17792,7 +17796,7 @@ msgstr "В" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "В режим „Операционна система“ посочените по-горе речници са препоръчителни. {PRODUCT_NAME} ще предаде тези езикови етикети на проверката на правописа на твоята ОС, когато това се поддържа. Етикетите, които тя не разпознава, се игнорират." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "В браузър „Натисни и говори“ работи само докато разделът на {PRODUCT_NAME} е активен. Инсталирай настолното приложение за „Натисни и говори“ в цялата система." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Достъпът до въвеждане беше променен. Затвори напълно и рестартирай {productName}, за да могат системните клавишни комбинации да го използват." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Вход и изход" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Пази ги на сигурно място. Генерирането на нови ще прекъсне съществуващите интеграции." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Продължава да предава за кратко след отпускане на бутона." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Светла тема" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Лек класически филтър, който работи на всяко устройство." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Външен вид" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Изглежда, че използваш {0}. Наслагването на обработката на {PRODUCT_NAME} отгоре може да причини пулсиране или изкривяване на звука. Директният вход предава звука ти непроменен." @@ -21035,7 +21039,7 @@ msgstr "Микрофон" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Тест на микрофон" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Мрежа и производителност" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Невронен филтър, който премахва повечето фонов шум." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Невронен филтър, пълна честотна лента на звука." @@ -22690,7 +22694,7 @@ msgstr "Няма намерени съвпадения" msgid "No mentions yet" msgstr "Все още няма споменавания" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Не е намерен микрофон" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Шум" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Шумов гейт" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Няма" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Без потискане" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Клавиш за „Натисни и говори“" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Натисни и говори" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Натисни и говори (ограничено)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "„Натисни и говори“ се игнорира при директен вход. Превключи на „Фокусиран глас“ или „По избор“, за да го използваш." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Включено е „Натисни и говори“. Задръж {pushToTalkHint}, за да говориш." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "„Натисни и говори“ работи само докато {productName} е на фокус, докато не активираш {permissionName}. След като промениш разрешението, затвори напълно и рестартирай {productName}, за да могат системните бързи клавиши да го използват." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "„Натисни и говори“ работи само докато разделът на браузъра е на фокус." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Препоръчително" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Препоръчително. Изчиства звука от микрофона ти за ясна реч." @@ -26561,7 +26565,7 @@ msgstr "Относително време" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Забавяне при отпускане" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Избери акаунта, с който искаш да влезеш на новото си устройство." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Избери режим за обработка на глас" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Изпращането на съобщения е деактивирано в тази общност" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Изпраща и двата канала на стерео микрофон. Изисква всички обработки да са изключени и каналът да е с 128 kbps или повече." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Изпраща звука от микрофона без никаква обработка." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Изпраща звука ти без промени. Най-добре е, ако използваш външен аудио софтуер." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Изпраща звука от микрофона ти без шумопотискане." @@ -30136,7 +30140,7 @@ msgstr "Кратки кодове" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Стъпка 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Стерео микрофон" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Спря члена да чува другите в тази общност" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Спира звука от високоговорителите да се връща в микрофона ти." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Високо качество при умерено натоварване на процесора. Добър резервен вариант за споделяне на екран в Chromium." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Най-силният неврален филтър за реч. Ограничава звука до диапазона на речта." @@ -32539,7 +32543,7 @@ msgstr "Превключване към удобен изглед" msgid "Switch to dense layout" msgstr "Превключване към сбит изглед" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Превключване към директен вход" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Скорост на говор" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Настрой обработката сам." @@ -37106,6 +37110,10 @@ msgstr "Използва центъра за известия на операц msgid "Uses:" msgstr "Използвания:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Използва се {effectiveLabel}, докато {requestedLabel} не е готов." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Участници в гласов чат" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Обработка на глас" @@ -38118,6 +38126,10 @@ msgstr "Включване на звука в гласов чат" msgid "Voice unmute" msgstr "Включване на микрофона в гласов чат" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Гласът използва системното ви изходно устройство в този браузър. Променете го в настройките на системата си." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Анулирана" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Кои разговори" msgid "Which rule was broken?" msgstr "Кое правило беше нарушено?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Докато „Натисни и говори“ е включено, микрофонът ти се управлява от клавишната комбинация, така че бутонът за изключване на микрофона е неактивен." diff --git a/fluxer_app/src/features/i18n/locales/cs/messages.po b/fluxer_app/src/features/i18n/locales/cs/messages.po index 2628aeb04..66da36a5f 100644 --- a/fluxer_app/src/features/i18n/locales/cs/messages.po +++ b/fluxer_app/src/features/i18n/locales/cs/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "Aplikace {productName} potřebuje přístup ke kameře, aby mohla zobrazit vaše zařízení." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "Aplikace {productName} potřebuje přístup k mikrofonu, aby mohla zobrazit vaše zařízení." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {člen} few {členové} msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} se nemohl spustit. Používá se místo něj {effectiveLabel}." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Sdílení aktivit" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Práh aktivity" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adresa" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Upravte si každé nastavení sami: potlačení šumu, potlačení ozvěny a zesílení." @@ -3606,11 +3610,11 @@ msgstr "Povolit zmínky {everyoneMention} a {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Povolte aplikaci {PRODUCT_NAME} přístup k vaší kameře v {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Povolte aplikaci {PRODUCT_NAME} přístup k mikrofonu v: {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Povolte aplikaci {PRODUCT_NAME} přístup k mikrofonu. Zkontrolujte adresní řádek nebo nastavení prohlížeče." @@ -3713,7 +3717,7 @@ msgstr "Povolit členům bez oprávnění {readMessageHistoryPermissionLabel} zo msgid "Allow mentions for this role" msgstr "Povolit zmínky pro tuto roli" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Povolit mikrofon" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Náhled zvuku" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Zpracování zvuku" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Automaticky rozpoznat jazyk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Automaticky nastavit práh aktivity" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Vestavěné zkratky" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Vestavěné potlačení šumu v prohlížeči nebo systému." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Vyčistit odkaz" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Vyčistí zvuk mikrofonu, aby vám bylo dobře rozumět." @@ -8985,7 +8989,7 @@ msgstr "Připojte kameru nebo virtuální záznamové zařízení a zkuste to zn msgid "Connect a display, then try again." msgstr "Připojte displej a zkuste to znovu." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Připojte mikrofon a zkuste to znovu." @@ -10672,8 +10676,8 @@ msgstr "Vlastní zdroj" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Vyjmout" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Potlačuje zvuk pod zvolenou úrovní hlasitosti s minimální zátěží procesoru." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Tlačítko pro stažení" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Stáhnout desktopovou aplikaci" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Zapnout" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Povolit oprávnění {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Veškerý zvuk systému" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Zvuk při vstupu" @@ -14330,8 +14334,8 @@ msgstr "Večer" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Vyrovnává hlasitost mikrofonu, abyste nebyli příliš potichu." @@ -17360,7 +17364,7 @@ msgstr "Potřebuji jiný způsob" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Rozumím" @@ -17792,7 +17796,7 @@ msgstr "V" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "V režimu „Operační systém“ slouží výše uvedené slovníky pouze jako doporučení. Aplikace {PRODUCT_NAME} předá tyto jazykové značky systémové kontrole pravopisu, pokud to podporuje. Značky, které nerozpozná, ignoruje." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "V prohlížeči funguje funkce Stisknutím mluvit pouze tehdy, když je karta {PRODUCT_NAME} aktivní. Pro použití této funkce v celém systému si nainstalujte desktopovou aplikaci." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Přístup ke vstupním zařízením byl změněn. Aplikaci {productName} úplně ukončete a znovu spusťte, aby globální zkratky mohly toto oprávnění využít." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Vstup a výstup" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Uchovávejte je v bezpečí. Opětovné vygenerování přeruší stávající integrace." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Udržovat vysílání krátce po uvolnění tlačítka." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Světlý motiv" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Nenáročný klasický filtr fungující na jakémkoli zařízení." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Vzhled a ovládání" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Zdá se, že používáte {0}. Přidání dalšího zpracování zvuku v aplikaci {PRODUCT_NAME} může způsobit kolísání hlasitosti nebo zkreslení. Přímý vstup propouští zvuk beze změn." @@ -21035,7 +21039,7 @@ msgstr "Mikrofon" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Test mikrofonu" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Síť a výkon" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Neuronový filtr, který odstraní většinu okolního hluku." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Neuronový filtr s plným zvukovým pásmem." @@ -22690,7 +22694,7 @@ msgstr "Nic nebylo nalezeno" msgid "No mentions yet" msgstr "Zatím žádné zmínky" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Mikrofon nenalezen" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Hluk" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Šumová brána" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Žádné" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Žádné" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Klávesa pro režim Stisknutím mluvit" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Stisknutím mluvit" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Stisknutím mluvit (omezená funkčnost)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "V režimu Přímý vstup se nastavení Stisknutím mluvit ignoruje. Chcete-li ho použít, přepněte na režim Hlas v popředí nebo Vlastní." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Režim Stisknutím mluvit je zapnutý. Chcete-li mluvit, podržte {pushToTalkHint}." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Dokud nepovolíte oprávnění {permissionName}, funguje režim Stisknutím mluvit jen při aktivním okně aplikace {productName}. Po změně oprávnění aplikaci {productName} zcela ukončete a znovu spusťte, aby oprávnění mohly využívat systémové klávesové zkratky." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Režim Stisknutím mluvit funguje pouze při aktivní kartě prohlížeče." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Doporučeno" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Doporučeno. Upravuje zvuk mikrofonu pro srozumitelnou řeč." @@ -26561,7 +26565,7 @@ msgstr "Relativní" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Prodleva uvolnění" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Vyberte účet, ke kterému se chcete přihlásit na novém zařízení." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Vyberte režim zpracování hlasu" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "V této komunitě je odesílání zpráv zakázáno" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Odesílá oba kanály stereofonního mikrofonu. Vyžaduje vypnuté veškeré zpracování a kanál s rychlostí 128 kb/s nebo vyšší." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Odesílá nezpracovaný zvuk z mikrofonu bez úprav." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Odesílá váš zvuk beze změn. Nejlepší, pokud používáte externí zvukový software." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Odesílá zvuk z mikrofonu bez potlačení šumu." @@ -30136,7 +30140,7 @@ msgstr "Zkratky" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Krok 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereofonní mikrofon" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Členovi bylo znemožněno slyšet ostatní v této komunitě" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Zabrání tomu, aby se zvuk z reproduktorů vracel do mikrofonu." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Vysoká kvalita při střední zátěži CPU. Dobrá záložní volba pro sdílení obrazovky v prohlížeči Chromium." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Nejsilnější neuronový filtr pro řeč, omezuje zvuk na rozsah řeči." @@ -32539,7 +32543,7 @@ msgstr "Přepnout na pohodlné rozvržení" msgid "Switch to dense layout" msgstr "Přepnout na zhuštěné rozvržení" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Přepnout na přímý vstup" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Rychlost převodu textu na řeč" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Upravte si zpracování podle sebe." @@ -37106,6 +37110,10 @@ msgstr "Používá oznamovací centrum OS. Pro nastavení oznámení pro jednotl msgid "Uses:" msgstr "Použití:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Používám {effectiveLabel}, dokud nebude {requestedLabel} připraveno." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Účastníci hlasového chatu" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Zpracování hlasu" @@ -38118,6 +38126,10 @@ msgstr "Zapnutí zvuku hovoru" msgid "Voice unmute" msgstr "Zapnutí mikrofonu" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Hlas používá výchozí výstupní zařízení vašeho systému v tomto prohlížeči. Změňte jej v nastavení systému." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Zrušeno" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Které konverzace" msgid "Which rule was broken?" msgstr "Které pravidlo bylo porušeno?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Když je zapnutý režim Stisknutím mluvit, mikrofon ovládá klávesová zkratka, takže tlačítko ztlumení není dostupné." diff --git a/fluxer_app/src/features/i18n/locales/da/messages.po b/fluxer_app/src/features/i18n/locales/da/messages.po index db5fd2403..fcee4aa79 100644 --- a/fluxer_app/src/features/i18n/locales/da/messages.po +++ b/fluxer_app/src/features/i18n/locales/da/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} skal have adgang til kameraet for at vise dine enheder." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} skal have adgang til mikrofonen for at vise dine enheder." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {medlem} other {medlemme msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} kunne ikke starte. Bruger {effectiveLabel} i stedet." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Aktivitetsdeling" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Aktivitetstærskel" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adresse" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Juster selv hver indstilling: støjundertrykkelse, ekkoannullering og forstærkning." @@ -3606,11 +3610,11 @@ msgstr "Tillad {everyoneMention} og {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Tillad {PRODUCT_NAME} at få adgang til dit kamera i {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Tillad {PRODUCT_NAME} at få adgang til din mikrofon i {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Giv {PRODUCT_NAME} adgang til din mikrofon. Tjek din browsers adresselinje eller indstillinger." @@ -3713,7 +3717,7 @@ msgstr "Tillad medlemmer uden tilladelsen {readMessageHistoryPermissionLabel} at msgid "Allow mentions for this role" msgstr "Tillad omtaler for denne rolle" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Tillad mikrofon" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Lydforhåndsvisning" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Lydbehandling" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Registrer sprog automatisk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Indstil aktivitetstærskel automatisk" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Indbyggede genveje" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Indbygget støjundertrykkelse fra din browser eller dit system." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Rent link" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Renser mikrofonens lyd, så talen bliver tydelig." @@ -8985,7 +8989,7 @@ msgstr "Tilslut et kamera eller en virtuel optagelsesenhed, og prøv igen." msgid "Connect a display, then try again." msgstr "Tilslut en skærm, og prøv igen." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Tilslut en mikrofon og prøv igen." @@ -10672,8 +10676,8 @@ msgstr "Brugerdefineret" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Klip" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Fjerner lyd under en lydstyrketærskel med minimalt CPU-forbrug." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Download-knap" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Download computerappen" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Slå til" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Slå tilladelsen {permissionName} til" @@ -14220,7 +14224,7 @@ msgstr "Hele systemets lyd" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Ankomstlyd" @@ -14330,8 +14334,8 @@ msgstr "Aften" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Udjævner mikrofonens lydstyrke, så din tale ikke er for lav." @@ -17360,7 +17364,7 @@ msgstr "Jeg har brug for en anden mulighed" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Jeg forstår" @@ -17792,7 +17796,7 @@ msgstr "I" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "I tilstanden \"Operativsystem\" er ordbøgerne ovenfor vejledende. {PRODUCT_NAME} sender disse sprogkoder til din OS-stavekontrol, når det understøttes. Koder, den ikke genkender, ignoreres." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "I en browser virker Tryk for at tale kun, når fanen {PRODUCT_NAME} er i fokus. Installer computerappen for at bruge Tryk for at tale i hele systemet." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Inputadgangen er ændret. Luk {productName} helt ned og genstart appen, så genveje i hele systemet kan bruge den." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Input og output" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Opbevar dem sikkert. Hvis du genererer nye, holder eksisterende integrationer op med at virke." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Fortsæt med at sende kort tid efter, at knappen slippes." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Lyst tema" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Et klassisk filter med lavt ressourceforbrug, der virker på enhver enhed." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Udseende og funktionalitet" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Det ser ud til, at du bruger {0}. Ekstra lydbehandling fra {PRODUCT_NAME} kan få lyden til at pumpe eller blive forvrænget. Direkte input sender din lyd igennem uændret." @@ -21035,7 +21039,7 @@ msgstr "Mikrofon" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Mikrofontest" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Netværk og ydeevne" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Neuralt filter, der fjerner det meste baggrundsstøj." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Neuralt filter, fuld lydbåndbredde." @@ -22690,7 +22694,7 @@ msgstr "Ingen resultater fundet" msgid "No mentions yet" msgstr "Ingen omtaler endnu" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Mikrofon ikke fundet" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Støj" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Støjport" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Ingen" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Ingen" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Tast til Tryk for at tale" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Tryk for at tale" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Tryk for at tale (begrænset)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Tryk for at tale ignoreres ved direkte input. Skift til Fokuseret tale eller Tilpasset for at bruge det." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Tryk for at tale er slået til. Hold {pushToTalkHint} nede for at tale." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Tryk for at tale virker kun, når {productName} er i fokus, indtil {permissionName} er aktiveret. Når du har ændret tilladelsen, skal du lukke {productName} helt ned og genstarte appen, så genvejstaster i hele systemet kan bruge den." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Tryk for at tale virker kun, når browserfanen er i fokus." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Anbefalet" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Anbefales. Renser mikrofonlyden, så talen bliver tydelig." @@ -26561,7 +26565,7 @@ msgstr "Relativ" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Forsinkelse efter tastslip" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Vælg den konto, du vil logge ind med på din nye enhed." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Vælg tilstand for talebehandling" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Afsendelse af beskeder er deaktiveret i dette fællesskab" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Sender begge kanaler fra en stereomikrofon. Kræver, at al behandling er slået fra og en kanal på 128 kbps eller højere." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Sender rå mikrofonlyd uden behandling." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Sender din lyd uændret. Bedst, hvis du bruger ekstern lydsoftware." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Sender din mikrofonlyd uden støjreduktion." @@ -30136,7 +30140,7 @@ msgstr "Emojikoder" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Trin 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereomikrofon" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Forhindrede medlemmet i at høre andre i dette community" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Forhindrer, at lyden fra dine højttalere sendes tilbage til din mikrofon." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "God kvalitet med moderat CPU-forbrug. Et godt alternativ til skærmdeling i Chromium." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Det kraftigste neurale filter til tale. Begrænser lyden til talens frekvensområde." @@ -32539,7 +32543,7 @@ msgstr "Skift til rummeligt layout" msgid "Switch to dense layout" msgstr "Skift til kompakt visning" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Skift til direkte input" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS-hastighed" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Juster selv behandlingen." @@ -37106,6 +37110,10 @@ msgstr "Bruger operativsystemets notifikationscenter. Højreklik på et fælless msgid "Uses:" msgstr "Anvendelser:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Bruger {effectiveLabel}, indtil {requestedLabel} er klar." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Deltagere i taleopkald" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Talebehandling" @@ -38118,6 +38126,10 @@ msgstr "Slå lyden til i taleopkald" msgid "Voice unmute" msgstr "Slå mikrofonen til" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Stemmen bruger din systems lydenhed i denne browser. Skift den i dine systemindstillinger." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Annulleret" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Hvilke samtaler" msgid "Which rule was broken?" msgstr "Hvilken regel blev brudt?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Når Tryk for at tale er slået til, styrer genvejen din mikrofon, så knappen til at slå mikrofonen fra er deaktiveret." diff --git a/fluxer_app/src/features/i18n/locales/de/messages.po b/fluxer_app/src/features/i18n/locales/de/messages.po index 620b31566..7cb24bd93 100644 --- a/fluxer_app/src/features/i18n/locales/de/messages.po +++ b/fluxer_app/src/features/i18n/locales/de/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} benötigt Kamerazugriff, um deine Geräte aufzulisten." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} benötigt Mikrofonzugriff, um deine Geräte aufzulisten." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {Mitglied} other {Mitgli msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} konnte nicht gestartet werden. stattdessen wird {effectiveLabel} verwendet." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Aktivitätsfreigabe" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Aktivitätsschwelle" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adresse" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Jede Einstellung selbst anpassen: Rauschunterdrückung, Echokompensation und Verstärkung." @@ -3606,11 +3610,11 @@ msgstr "{everyoneMention} und {hereMention} erlauben" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Erlaube {PRODUCT_NAME} unter {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME} den Zugriff auf deine Kamera." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Erlaube {PRODUCT_NAME} den Zugriff auf dein Mikrofon in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Erlaube {PRODUCT_NAME}, auf dein Mikrofon zuzugreifen. Überprüfe die Adressleiste oder die Einstellungen deines Browsers." @@ -3713,7 +3717,7 @@ msgstr "Erlaube Mitgliedern ohne die Berechtigung „{readMessageHistoryPermissi msgid "Allow mentions for this role" msgstr "Erwähnungen für diese Rolle zulassen" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Mikrofonzugriff erlauben" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Audiovorschau" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Audioverarbeitung" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Sprache automatisch erkennen" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Aktivitätsschwelle automatisch festlegen" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Integrierte Tastenkombinationen" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Integrierte Rauschunterdrückung deines Browsers oder Systems." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Link bereinigen" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Verbessert das Mikrofonsignal für klare Sprache." @@ -8985,7 +8989,7 @@ msgstr "Schließe eine Kamera oder ein virtuelles Aufnahmegerät an und versuche msgid "Connect a display, then try again." msgstr "Schließe einen Bildschirm an und versuche es erneut." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Verbinde ein Mikrofon und versuche es erneut." @@ -10672,8 +10676,8 @@ msgstr "Benutzerdefiniert" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Ausschneiden" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Unterdrückt Audiosignale unterhalb einer Lautstärkeschwelle bei minimaler CPU-Auslastung." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Herunterladen-Button" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Desktop-App herunterladen" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Aktivieren" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "{permissionName}-Berechtigung aktivieren" @@ -14220,7 +14224,7 @@ msgstr "Gesamtes System-Audio" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Beitrittston" @@ -14330,8 +14334,8 @@ msgstr "Abend" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Gleicht deine Mikrofonlautstärke aus, damit du nicht zu leise bist." @@ -17360,7 +17364,7 @@ msgstr "Ich brauche eine andere Möglichkeit" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Ich verstehe" @@ -17792,7 +17796,7 @@ msgstr "In" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "Im Modus „Betriebssystem“ dienen die oben aufgeführten Wörterbücher als Empfehlungen. {PRODUCT_NAME} übergibt diese Sprach-Tags, sofern unterstützt, an die Rechtschreibprüfung deines Betriebssystems. Nicht erkannte Tags werden ignoriert." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "Im Browser funktioniert Push-to-Talk nur, wenn der Tab \"{PRODUCT_NAME}\" im Fokus ist. Installiere die Desktop-App für systemweites Push-to-Talk." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Der Eingabezugriff wurde geändert. Beende {productName} vollständig und starte es neu, damit systemweite Tastenkombinationen ihn verwenden können." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Ein- und Ausgabe" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Bitte sicher aufbewahren. Eine Neuerstellung unterbricht bestehende Integrationen." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Auch nach Loslassen des Knopfes noch kurzzeitig übertragen." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Helles Design" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Leichter klassischer Filter, funktioniert auf jedem Gerät." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Aussehen und Verhalten" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Es sieht so aus, als würdest du {0} verwenden. Wenn du die Verarbeitung von {PRODUCT_NAME} zusätzlich aktivierst, kann dies zu Pumpen oder Verzerrungen führen. Eine direkte Eingabe leitet dein Audio unverändert weiter." @@ -21035,7 +21039,7 @@ msgstr "Mikrofon" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Mikrofon-Test" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Netzwerk und Leistung" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Neuronales Filter, das die meisten Hintergrundgeräusche entfernt." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Neuronales Filter, volle Audiobandbreite." @@ -22690,7 +22694,7 @@ msgstr "Keine Treffer gefunden" msgid "No mentions yet" msgstr "Noch keine Erwähnungen" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Kein Mikrofon gefunden" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Geräusch" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Noise-Gate" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Keine" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Keine" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Push-to-Talk-Taste" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Push-to-Talk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Push-to-Talk (begrenzt)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Push-to-Talk wird bei direkter Eingabe ignoriert. Wechsle zu „Fokussierter Sprachchat“ oder „Benutzerdefiniert“, um es zu verwenden." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Push-to-Talk ist aktiviert. Halte {pushToTalkHint} gedrückt, um zu sprechen." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Push-to-Talk funktioniert nur, während {productName} im Fokus ist, bis {permissionName} aktiviert wird. Beende {productName} nach der Berechtigungsänderung vollständig und starte es neu, damit systemweite Tastenkombinationen die Berechtigung nutzen können." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Push-to-Talk funktioniert nur, während der Browser-Tab im Fokus ist." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Empfohlen" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Empfohlen. Filtert dein Mikrofonsignal für klare Sprache." @@ -26561,7 +26565,7 @@ msgstr "Relativ" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Verzögerung beim Loslassen" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Wähle das Konto aus, mit dem du dich auf deinem neuen Gerät anmelden möchtest." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Sprachverarbeitungsmodus auswählen" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Das Senden von Nachrichten ist in dieser Community deaktiviert" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Sendet beide Kanäle eines Stereo-Mikrofons. Benötigt alle Verarbeitungen aus und einen Kanal mit 128 KBit/s oder höher." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Sendet rohes Mikrofon-Audio ohne Verarbeitung." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Sendet dein Audio unverändert. Am besten geeignet, wenn du externe Audiosoftware verwendest." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Sendet dein Mikrofon-Audio ohne Unterdrückung." @@ -30136,7 +30140,7 @@ msgstr "Kurzcodes" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Schritt 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereomikrofon" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Das Mitglied daran gehindert, andere in dieser Community zu hören" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Verhindert, dass deine Lautsprecher in dein Mikrofon zurückkoppeln." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Starke Qualität bei moderatem CPU-Verbrauch. Guter Chromium-Fallback für Bildschirmfreigabe." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Stärkster neuronaler Filter für Sprache, begrenzt Audio auf den Sprachbereich." @@ -32539,7 +32543,7 @@ msgstr "Zu \"Komfortabel\" wechseln" msgid "Switch to dense layout" msgstr "Zu kompakter Ansicht wechseln" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Direkte Eingabe nutzen" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS-Geschwindigkeit" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Passe die Verarbeitung selbst an." @@ -37106,6 +37110,10 @@ msgstr "Verwendet die Benachrichtigungszentrale des Betriebssystems. Für Benach msgid "Uses:" msgstr "Nutzungen:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Verwende {effectiveLabel}, bis {requestedLabel} bereit ist." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Sprachchat-Teilnehmer" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Sprachverarbeitung" @@ -38118,6 +38126,10 @@ msgstr "Ton im Sprachchat einschalten" msgid "Voice unmute" msgstr "Stummschaltung aufheben" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Die Sprachausgabe verwendet in diesem Browser Ihr Systemausgabegerät. Ändern Sie dies in Ihren Systemeinstellungen." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Storniert" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Welche Unterhaltungen" msgid "Which rule was broken?" msgstr "Welche Regel wurde gebrochen?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Solange Push-to-Talk aktiviert ist, steuert deine Tastenkombination dein Mikrofon, daher ist die Stummschaltfläche deaktiviert." diff --git a/fluxer_app/src/features/i18n/locales/el/messages.po b/fluxer_app/src/features/i18n/locales/el/messages.po index b02398297..ce88e9edb 100644 --- a/fluxer_app/src/features/i18n/locales/el/messages.po +++ b/fluxer_app/src/features/i18n/locales/el/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "Το {productName} χρειάζεται πρόσβαση στην κάμερα για να εμφανίσει τις συσκευές σας." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "Το {productName} χρειάζεται πρόσβαση στο μικρόφωνο για να εμφανίσει τις συσκευές σας." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {μέλος} other {μέ msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} σε σύνδεση" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "Το {requestedLabel} δεν μπόρεσε να ξεκινήσει. Χρησιμοποιείται αντ' αυτού το {effectiveLabel}." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Κοινή χρήση δραστηριοτήτων" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Όριο δραστηριότητας" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Διεύθυνση" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Προσαρμόστε κάθε ρύθμιση μόνοι σας: καταστολή θορύβου, ακύρωση ηχούς και ενίσχυση." @@ -3606,11 +3610,11 @@ msgstr "Να επιτρέπονται οι αναφορές {everyoneMention} κ msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Επιτρέψτε στο {PRODUCT_NAME} να έχει πρόσβαση στην κάμερά σας στις {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Επιτρέψτε στο {PRODUCT_NAME} να έχει πρόσβαση στο μικρόφωνό σας στις {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Επιτρέψτε στο {PRODUCT_NAME} να έχει πρόσβαση στο μικρόφωνό σας. Ελέγξτε τη γραμμή διευθύνσεων ή τις ρυθμίσεις του προγράμματος περιήγησής σας." @@ -3713,7 +3717,7 @@ msgstr "Να επιτρέπεται στα μέλη χωρίς το δικαίω msgid "Allow mentions for this role" msgstr "Να επιτρέπονται οι αναφορές για αυτόν τον ρόλο" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Να επιτρέπεται το μικρόφωνο" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Προεπισκόπηση ήχου" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Επεξεργασία ήχου" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Αυτόματη ανίχνευση γλώσσας" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Αυτόματη ρύθμιση ορίου δραστηριότητας" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Ενσωματωμένες συντομεύσεις" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Ενσωματωμένη καταστολή από το πρόγραμμα περιήγησής σας ή το σύστημά σας." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Εκκαθάριση συνδέσμου" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Καθαρίζει το μικρόφωνό σας για καθαρή ομιλία." @@ -8985,7 +8989,7 @@ msgstr "Συνδέστε μια κάμερα ή μια συσκευή εικον msgid "Connect a display, then try again." msgstr "Συνδέστε μια οθόνη και δοκιμάστε ξανά." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Συνδέστε ένα μικρόφωνο και δοκιμάστε ξανά." @@ -10672,8 +10676,8 @@ msgstr "Προσαρμοσμένη πηγή" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Αποκοπή" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Κόβει τον ήχο κάτω από ένα όριο έντασης, με ελάχιστη χρήση CPU." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Κουμπί λήψης" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Λήψη εφαρμογής για υπολογιστή" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Ενεργοποίηση" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Ενεργοποίηση άδειας {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Ήχος ολόκληρου του συστήματος" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Ήχος εισόδου" @@ -14330,8 +14334,8 @@ msgstr "Βράδυ" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Εξομαλύνει την ένταση του μικροφώνου σας, ώστε να μην ακούγεστε πολύ σιγά." @@ -17360,7 +17364,7 @@ msgstr "Χρειάζομαι άλλον τρόπο" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Καταλαβαίνω" @@ -17792,7 +17796,7 @@ msgstr "Σε" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "Στη λειτουργία \"Λειτουργικό σύστημα\", τα λεξικά που αναφέρονται παραπάνω είναι ενδεικτικά. Το {PRODUCT_NAME} θα περάσει αυτές τις ετικέτες γλώσσας στον ορθογραφικό έλεγχο του λειτουργικού σας συστήματος, εφόσον υποστηρίζεται. Οι ετικέτες που δεν αναγνωρίζει αγνοούνται." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "Σε ένα πρόγραμμα περιήγησης, η λειτουργία push-to-talk λειτουργεί μόνο όταν η καρτέλα {PRODUCT_NAME} είναι ενεργή. Εγκαταστήστε την εφαρμογή υπολογιστή για push-to-talk σε όλο το σύστημα." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Η πρόσβαση εισόδου άλλαξε. Κλείστε εντελώς και επανεκκινήστε το {productName} ώστε να μπορούν να χρησιμοποιηθούν οι συντομεύσεις σε όλο το σύστημα." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Είσοδος και έξοδος" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Κράτησέ τα ασφαλή. Η αναδημιουργία θα διακόψει τις υπάρχουσες ενσωματώσεις." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Συνεχίζει τη μετάδοση για λίγο αφού αφήσετε το πλήκτρο." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Ανοιχτό θέμα" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Ελαφρύ κλασικό φίλτρο, λειτουργεί σε οποιαδήποτε συσκευή." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Εμφάνιση και αίσθηση" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Φαίνεται ότι χρησιμοποιείτε {0}. Η προσθήκη της επεξεργασίας του {PRODUCT_NAME} από πάνω μπορεί να προκαλέσει διακυμάνσεις έντασης ή παραμόρφωση. Η άμεση είσοδος περνάει τον ήχο σας χωρίς επεξεργασία." @@ -21035,7 +21039,7 @@ msgstr "Μικρόφωνο" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Δοκιμή μικροφώνου" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Δικτύωση και επιδόσεις" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Νευρωνικό φίλτρο που αφαιρεί τους περισσότερους θορύβους περιβάλλοντος." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Νευρωνικό φίλτρο, πλήρες εύρος ζώνης ήχου." @@ -22690,7 +22694,7 @@ msgstr "Δεν βρέθηκαν αποτελέσματα" msgid "No mentions yet" msgstr "Δεν υπάρχουν αναφορές ακόμα" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Δεν βρέθηκε μικρόφωνο" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Θόρυβος" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Πύλη θορύβου" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Καμία" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Καμία" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Πλήκτρο «Push to talk»" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Push-to-talk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Push-to-talk (περιορισμένο)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Η λειτουργία push-to-talk αγνοείται στην άμεση εισαγωγή. Μεταβείτε σε εστιασμένη φωνή ή προσαρμοσμένη για να τη χρησιμοποιήσετε." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Η λειτουργία push-to-talk είναι ενεργή. Κρατήστε πατημένο το {pushToTalkHint} για να μιλήσετε." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Η λειτουργία push-to-talk λειτουργεί μόνο όταν το {productName} είναι σε πρώτο πλάνο, μέχρι να ενεργοποιηθεί η άδεια {permissionName}. Αφού αλλάξετε την άδεια, κλείστε εντελώς και επανεκκινήστε το {productName}, ώστε να μπορούν να χρησιμοποιηθούν οι συντομεύσεις πλήκτρων σε όλο το σύστημα." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Η λειτουργία push-to-talk λειτουργεί μόνο όταν η καρτέλα του προγράμματος περιήγησης είναι εστιασμένη." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Προτεινόμενο" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Προτείνεται. Καθαρίζει το μικρόφωνό σας για καθαρή ομιλία." @@ -26561,7 +26565,7 @@ msgstr "Σχετική" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Καθυστέρηση απελευθέρωσης" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Επιλέξτε τον λογαριασμό με τον οποίο θέλετε να συνδεθείτε στη νέα σας συσκευή." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Επιλέξτε λειτουργία επεξεργασίας φωνής" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Η αποστολή μηνυμάτων έχει απενεργοποιηθεί σε αυτήν την κοινότητα" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Στέλνει και τα δύο κανάλια ενός στερεοφωνικού μικροφώνου. Απαιτείται απενεργοποίηση όλων των επεξεργασιών και κανάλι στα 128 kbps ή υψηλότερο." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Στέλνει ακατέργαστο ήχο μικροφώνου χωρίς επεξεργασία." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Στέλνει τον ήχο σας χωρίς επεξεργασία. Ιδανικό αν χρησιμοποιείτε εξωτερικό λογισμικό ήχου." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Στέλνει τον ήχο του μικροφώνου σας χωρίς καμία καταστολή." @@ -30136,7 +30140,7 @@ msgstr "Κωδικοί emoji" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Βήμα 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Στερεοφωνικό μικρόφωνο" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Αφαιρέθηκε από το μέλος η δυνατότητα να ακούει τους άλλους σε αυτήν την κοινότητα" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Εμποδίζει τον ήχο των ηχείων σας να επιστρέφει στο μικρόφωνό σας." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Υψηλή ποιότητα με μέτριο κόστος CPU. Καλή εφεδρική επιλογή για κοινή χρήση οθόνης στο Chromium." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Το ισχυρότερο νευρωνικό φίλτρο για ομιλία. Περιορίζει τον ήχο στο εύρος της ομιλίας." @@ -32539,7 +32543,7 @@ msgstr "Εναλλαγή σε άνετη διάταξη" msgid "Switch to dense layout" msgstr "Εναλλαγή σε συμπαγή διάταξη" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Εναλλαγή σε απευθείας εισαγωγή" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Ταχύτητα TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Ρυθμίζετε εσείς την επεξεργασία." @@ -37106,6 +37110,10 @@ msgstr "Χρησιμοποιεί το κέντρο ειδοποιήσεων το msgid "Uses:" msgstr "Χρήσεις:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Χρησιμοποιώντας {effectiveLabel} μέχρι να είναι έτοιμο το {requestedLabel}." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Συμμετέχοντες φωνητικής συνομιλίας" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Επεξεργασία φωνής" @@ -38118,6 +38126,10 @@ msgstr "Κατάργηση σίγασης ήχου" msgid "Voice unmute" msgstr "Κατάργηση σίγασης μικροφώνου" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Η φωνή χρησιμοποιεί τη συσκευή εξόδου του συστήματός σας σε αυτό το πρόγραμμα περιήγησης. Αλλάξτε την στις ρυθμίσεις του συστήματός σας." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Άκυρο" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Ποιες συνομιλίες" msgid "Which rule was broken?" msgstr "Ποιος κανόνας παραβιάστηκε;" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Όσο η λειτουργία push-to-talk είναι ενεργή, η συντόμευσή σας ελέγχει το μικρόφωνό σας, οπότε το κουμπί σίγασης είναι απενεργοποιημένο." diff --git a/fluxer_app/src/features/i18n/locales/en-GB/messages.po b/fluxer_app/src/features/i18n/locales/en-GB/messages.po index 8dc8dfbf5..de0016e5e 100644 --- a/fluxer_app/src/features/i18n/locales/en-GB/messages.po +++ b/fluxer_app/src/features/i18n/locales/en-GB/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} needs camera access to list your devices." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} needs microphone access to list your devices." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {member} other {members} msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} could not start. Using {effectiveLabel} instead." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Activity sharing" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Activity threshold" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Address" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Adjust each setting yourself: noise suppression, echo cancellation, and gain." @@ -3606,11 +3610,11 @@ msgstr "Allow {everyoneMention} and {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." @@ -3713,7 +3717,7 @@ msgstr "Allow members without the {readMessageHistoryPermissionLabel} permission msgid "Allow mentions for this role" msgstr "Allow mentions for this role" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Allow microphone" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Audio preview" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Audio processing" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Auto-detect language" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Auto-set activity threshold" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Built-in shortcuts" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Built-in suppression from your browser or system." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Clean link" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Cleans up your mic for clear speech." @@ -8985,7 +8989,7 @@ msgstr "Connect a camera or virtual capture device, then try again." msgid "Connect a display, then try again." msgstr "Connect a display, then try again." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Connect a microphone and try again." @@ -10672,8 +10676,8 @@ msgstr "Custom" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Cut" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Cuts audio below a loudness threshold with minimal CPU usage." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Download button" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Download desktop app" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Enable" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Enable {permissionName} permission" @@ -14220,7 +14224,7 @@ msgstr "Entire system audio" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Entrance sound" @@ -14330,8 +14334,8 @@ msgstr "Evening time" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Evens out your mic volume so you are not too quiet." @@ -17360,7 +17364,7 @@ msgstr "I need another way" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "I understand" @@ -17792,7 +17796,7 @@ msgstr "In" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognise are ignored." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Input access was changed. Fully quit and restart {productName} so system-wide shortcuts can use it." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Input and output" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Keep these safe. Regenerating will break existing integrations." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Keep transmitting briefly after release." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Light theme" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Lightweight classic filter that works on any device." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Look and feel" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." @@ -21035,7 +21039,7 @@ msgstr "Mic" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Mic test" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Networking and performance" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Neural filter that removes most background noise." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Neural filter, full audio bandwidth." @@ -22690,7 +22694,7 @@ msgstr "No matches found" msgid "No mentions yet" msgstr "No mentions yet" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "No microphone found" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Noise" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Noise gate" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "None" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "None" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Push to talk key" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Push-to-talk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Push-to-talk (limited)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Push-to-talk is on. Hold {pushToTalkHint} to speak." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Push-to-talk only works while the browser tab is focused." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Recommended" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Recommended. Cleans up your mic for clear speech." @@ -26561,7 +26565,7 @@ msgstr "Relative" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Release delay" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Select the account you want to sign in with on your new device." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Select voice processing mode" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Sending messages is disabled in this community" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Sends raw mic audio with no processing." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Sends your audio untouched. Best if you're using external audio software." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Sends your microphone audio with no suppression." @@ -30136,7 +30140,7 @@ msgstr "Shortcodes" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Step 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereo microphone" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Stopped the member from hearing others in this community" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Stops your speakers from looping back into your mic." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Strong quality at moderate CPU cost. Good Chromium fallback for screen sharing." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Strongest neural filter for speech. Limits audio to the speech range." @@ -32539,7 +32543,7 @@ msgstr "Switch to comfy layout" msgid "Switch to dense layout" msgstr "Switch to dense layout" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Switch to direct input" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS speed" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Tune the processing yourself." @@ -37106,6 +37110,10 @@ msgstr "Uses the OS notification centre. For per-channel/per-community controls, msgid "Uses:" msgstr "Uses:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Using {effectiveLabel} until {requestedLabel} is ready." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Voice participants" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Voice processing" @@ -38118,6 +38126,11 @@ msgstr "Voice undeafen" msgid "Voice unmute" msgstr "Voice unmute" +# auto-i18n: reviewed unchanged +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Voice uses your system output device in this browser. Change it in your system settings." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38141,7 @@ msgstr "Void" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38814,7 @@ msgstr "Which conversations" msgid "Which rule was broken?" msgstr "Which rule was broken?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." diff --git a/fluxer_app/src/features/i18n/locales/en-US/messages.po b/fluxer_app/src/features/i18n/locales/en-US/messages.po index 7b35919a8..cbd85bd65 100644 --- a/fluxer_app/src/features/i18n/locales/en-US/messages.po +++ b/fluxer_app/src/features/i18n/locales/en-US/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} needs camera access to list your devices." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} needs microphone access to list your devices." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {member} other {members} msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} could not start. Using {effectiveLabel} instead." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Activity sharing" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Activity threshold" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Address" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Adjust each setting yourself: noise suppression, echo cancellation, and gain." @@ -3606,11 +3610,11 @@ msgstr "Allow {everyoneMention} and {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." @@ -3713,7 +3717,7 @@ msgstr "Allow members without the {readMessageHistoryPermissionLabel} permission msgid "Allow mentions for this role" msgstr "Allow mentions for this role" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Allow microphone" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Audio preview" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Audio processing" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Auto-detect language" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Auto-set activity threshold" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Built-in shortcuts" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Built-in suppression from your browser or system." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Clean link" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Cleans up your mic for clear speech." @@ -8985,7 +8989,7 @@ msgstr "Connect a camera or virtual capture device, then try again." msgid "Connect a display, then try again." msgstr "Connect a display, then try again." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Connect a microphone and try again." @@ -10672,8 +10676,8 @@ msgstr "Custom" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Cut" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Cuts audio below a loudness threshold with minimal CPU usage." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Download button" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Download desktop app" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Enable" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Enable {permissionName} permission" @@ -14220,7 +14224,7 @@ msgstr "Entire system audio" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Entrance sound" @@ -14330,8 +14334,8 @@ msgstr "Evening time" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Evens out your mic volume so you are not too quiet." @@ -17360,7 +17364,7 @@ msgstr "I need another way" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "I understand" @@ -17792,7 +17796,7 @@ msgstr "In" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Input access was changed. Fully quit and restart {productName} so system-wide shortcuts can use it." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Input and output" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Keep these safe. Regenerating will break existing integrations." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Keep transmitting briefly after release." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Light theme" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Lightweight classic filter that works on any device." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Look and feel" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." @@ -21035,7 +21039,7 @@ msgstr "Mic" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Mic test" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Networking and performance" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Neural filter that removes most background noise." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Neural filter, full audio bandwidth." @@ -22690,7 +22694,7 @@ msgstr "No matches found" msgid "No mentions yet" msgstr "No mentions yet" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "No microphone found" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Noise" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Noise gate" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "None" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "None" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Push to talk key" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Push-to-talk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Push-to-talk (limited)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Push-to-talk is on. Hold {pushToTalkHint} to speak." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Push-to-talk only works while the browser tab is focused." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Recommended" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Recommended. Cleans up your mic for clear speech." @@ -26561,7 +26565,7 @@ msgstr "Relative" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Release delay" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Select the account you want to sign in with on your new device." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Select voice processing mode" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Sending messages is disabled in this community" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Sends raw mic audio with no processing." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Sends your audio untouched. Best if you're using external audio software." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Sends your microphone audio with no suppression." @@ -30136,7 +30140,7 @@ msgstr "Shortcodes" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Step 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereo microphone" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Stopped the member from hearing others in this community" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Stops your speakers from looping back into your mic." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Strong quality at moderate CPU cost. Good Chromium fallback for screen sharing." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Strongest neural filter for speech. Limits audio to the speech range." @@ -32539,7 +32543,7 @@ msgstr "Switch to comfy layout" msgid "Switch to dense layout" msgstr "Switch to dense layout" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Switch to direct input" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS speed" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Tune the processing yourself." @@ -37106,6 +37110,10 @@ msgstr "Uses the OS notification center. For per-channel/per-community controls, msgid "Uses:" msgstr "Uses:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Using {effectiveLabel} until {requestedLabel} is ready." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Voice participants" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Voice processing" @@ -38118,6 +38126,10 @@ msgstr "Voice undeafen" msgid "Voice unmute" msgstr "Voice unmute" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Voice uses your system output device in this browser. Change it in your system settings." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Void" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Which conversations" msgid "Which rule was broken?" msgstr "Which rule was broken?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." diff --git a/fluxer_app/src/features/i18n/locales/es-419/messages.po b/fluxer_app/src/features/i18n/locales/es-419/messages.po index 2c980a7e7..20ae2c53d 100644 --- a/fluxer_app/src/features/i18n/locales/es-419/messages.po +++ b/fluxer_app/src/features/i18n/locales/es-419/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} necesita acceso a la cámara para mostrar tus dispositivos." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} necesita acceso al micrófono para mostrar tus dispositivos." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {miembro} other {miembro msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} en línea" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "No se pudo iniciar {requestedLabel}. Usando {effectiveLabel} en su lugar." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Compartir actividad" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Umbral de actividad" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Dirección" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Ajusta cada opción tú mismo: supresión de ruido, cancelación de eco y ganancia." @@ -3606,11 +3610,11 @@ msgstr "Permitir {everyoneMention} y {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Permite que {PRODUCT_NAME} acceda a tu cámara en {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Permite que {PRODUCT_NAME} acceda a tu micrófono en {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Permite que {PRODUCT_NAME} acceda a tu micrófono. Revisa la barra de direcciones o la configuración de tu navegador." @@ -3713,7 +3717,7 @@ msgstr "Permitir que los miembros sin el permiso {readMessageHistoryPermissionLa msgid "Allow mentions for this role" msgstr "Permitir menciones para este rol" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Permitir micrófono" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Vista previa de audio" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Procesamiento de audio" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Detectar idioma automáticamente" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Establecer umbral de actividad automáticamente" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Atajos integrados" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Supresión integrada de tu navegador o sistema." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Limpiar enlace" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Mejora tu micrófono para que tu voz se escuche con claridad." @@ -8985,7 +8989,7 @@ msgstr "Conecta una cámara o un dispositivo de captura virtual y vuelve a inten msgid "Connect a display, then try again." msgstr "Conecta una pantalla y vuelve a intentarlo." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Conecta un micrófono e inténtalo de nuevo." @@ -10672,8 +10676,8 @@ msgstr "Personalizado" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Cortar" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Silencia el audio por debajo de un umbral de volumen con un uso mínimo de CPU." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Botón de descarga" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Descargar la aplicación de escritorio" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Habilitar" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Habilitar el permiso de {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Audio de todo el sistema" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Sonido de entrada" @@ -14330,8 +14334,8 @@ msgstr "Noche" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Ajusta el volumen de tu micrófono para que no suenes demasiado bajo." @@ -17360,7 +17364,7 @@ msgstr "Necesito otra opción" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Entiendo" @@ -17792,7 +17796,7 @@ msgstr "En" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "En el modo \"Sistema operativo\", los diccionarios que se muestran arriba son orientativos. {PRODUCT_NAME} pasará estas etiquetas de idioma al corrector ortográfico de tu sistema operativo cuando sea compatible. Las etiquetas que no reconozca serán ignoradas." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "En un navegador, la función pulsar para hablar solo funciona mientras la pestaña de {PRODUCT_NAME} esté activa. Instala la aplicación de escritorio para usar pulsar para hablar en todo el sistema." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Se cambió el acceso de entrada. Cierra {productName} por completo y vuelve a abrirlo para que los atajos de todo el sistema puedan usarlo." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Entrada y salida" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Guarda estas credenciales en un lugar seguro. Si las regeneras, las integraciones existentes dejarán de funcionar." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Continúa transmitiendo brevemente después de soltar el botón." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Tema claro" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Filtro clásico ligero que funciona en cualquier dispositivo." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Apariencia y estilo" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Parece que estás usando {0}. Si agregas el procesamiento de {PRODUCT_NAME} encima, puede causar bombeo o distorsión. La entrada directa pasa tu audio sin modificaciones." @@ -21035,7 +21039,7 @@ msgstr "Micrófono" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Prueba de micrófono" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Red y rendimiento" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Filtro neuronal que elimina la mayor parte del ruido de fondo." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Filtro neuronal, ancho de banda de audio completo." @@ -22690,7 +22694,7 @@ msgstr "No se encontraron resultados" msgid "No mentions yet" msgstr "Aún no hay menciones" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "No se encontró ningún micrófono" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Ruido" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Puerta de ruido" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Ninguno" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Ninguna" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Tecla para pulsar y hablar" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Pulsar para hablar" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Pulsar para hablar (limitado)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "La función pulsar para hablar se ignora en la entrada directa. Cambia a voz enfocada o personalizada para usarla." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Pulsar para hablar está activado. Mantén presionado {pushToTalkHint} para hablar." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Pulsar para hablar solo funciona mientras la ventana de {productName} está activa hasta que se active {permissionName}. Después de cambiar el permiso, cierra por completo y reinicia {productName} para que los atajos de todo el sistema puedan usarlo." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Pulsar para hablar solo funciona cuando la pestaña del navegador está activa." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Recomendado" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Recomendado. Reduce el ruido del micrófono para que la voz se escuche con claridad." @@ -26561,7 +26565,7 @@ msgstr "Relativo" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Retraso de liberación" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Selecciona la cuenta con la que quieres iniciar sesión en tu nuevo dispositivo." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Seleccionar modo de procesamiento de voz" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "No se pueden enviar mensajes en esta comunidad" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Envía ambos canales de un micrófono estéreo. Requiere que todo el procesamiento esté desactivado y un canal a 128 kbps o superior." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Envía el audio puro del micrófono sin procesar." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Envía tu audio sin modificar. Ideal si usas software de audio externo." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Envía el audio de tu micrófono sin supresión." @@ -30136,7 +30140,7 @@ msgstr "Códigos cortos" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Paso 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Micrófono estéreo" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Se impidió que el miembro escuchara a otros en esta comunidad" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Evita que el audio de tus parlantes se escuche en tu micrófono." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Buena calidad con costo moderado de CPU. Buena alternativa de Chromium para compartir pantalla." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "El filtro neuronal más potente para el habla. Limita el audio al rango de frecuencias de la voz." @@ -32539,7 +32543,7 @@ msgstr "Cambiar a diseño cómodo" msgid "Switch to dense layout" msgstr "Cambiar a diseño compacto" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Cambiar a entrada directa" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Velocidad de TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Ajusta el procesamiento tú mismo." @@ -37106,6 +37110,10 @@ msgstr "Usa el centro de notificaciones del sistema operativo. Para controles po msgid "Uses:" msgstr "Usos:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Usando {effectiveLabel} hasta que {requestedLabel} esté listo." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Participantes en la llamada" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Procesamiento de voz" @@ -38118,6 +38126,10 @@ msgstr "Activar sonido" msgid "Voice unmute" msgstr "Activar micrófono" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "La voz usa el dispositivo de salida de tu sistema en este navegador. Cámbialo en la configuración de tu sistema." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Anulada" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Qué conversaciones" msgid "Which rule was broken?" msgstr "¿Qué regla se rompió?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Mientras la función pulsar para hablar esté activada, tu atajo controlará el micrófono, por lo que el botón de silenciar estará deshabilitado." diff --git a/fluxer_app/src/features/i18n/locales/es-ES/messages.po b/fluxer_app/src/features/i18n/locales/es-ES/messages.po index 9e092803c..64dc66766 100644 --- a/fluxer_app/src/features/i18n/locales/es-ES/messages.po +++ b/fluxer_app/src/features/i18n/locales/es-ES/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} necesita acceso a la cámara para mostrar tus dispositivos." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} necesita acceso al micrófono para mostrar tus dispositivos." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {miembro} other {miembro msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} en línea" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "No se pudo iniciar {requestedLabel}. Se usará {effectiveLabel} en su lugar." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Compartir actividad" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Umbral de actividad" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Dirección" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Ajusta cada opción tú mismo: supresión de ruido, cancelación de eco y ganancia." @@ -3606,11 +3610,11 @@ msgstr "Permitir {everyoneMention} y {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Permite que {PRODUCT_NAME} acceda a tu cámara en {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Permite que {PRODUCT_NAME} acceda a tu micrófono en {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Permite que {PRODUCT_NAME} acceda a tu micrófono. Comprueba la barra de direcciones o los ajustes de tu navegador." @@ -3713,7 +3717,7 @@ msgstr "Permitir que los miembros sin el permiso {readMessageHistoryPermissionLa msgid "Allow mentions for this role" msgstr "Permitir menciones para este rol" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Permitir micrófono" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Previsualización de audio" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Procesamiento de audio" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Detectar idioma automáticamente" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Establecer umbral de actividad automáticamente" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Atajos integrados" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Supresión integrada de tu navegador o sistema." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Limpiar enlace" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Mejora el micrófono para que la voz se escuche con claridad." @@ -8985,7 +8989,7 @@ msgstr "Conecta una cámara o un dispositivo de captura virtual y vuelve a inten msgid "Connect a display, then try again." msgstr "Conecta una pantalla y vuelve a intentarlo." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Conecta un micrófono y vuelve a intentarlo." @@ -10672,8 +10676,8 @@ msgstr "Fuente personalizada" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Cortar" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Silencia el audio por debajo de un umbral de volumen con un uso mínimo de CPU." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Botón de descarga" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Descargar aplicación de escritorio" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Habilitar" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Habilitar el permiso {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Audio de todo el sistema" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Sonido de entrada" @@ -14330,8 +14334,8 @@ msgstr "Tarde" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Iguala el volumen de tu micrófono para que no suenes demasiado bajo." @@ -17360,7 +17364,7 @@ msgstr "Necesito otra opción" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Entendido" @@ -17792,7 +17796,7 @@ msgstr "En" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "En el modo \"Sistema operativo\", los diccionarios indicados anteriormente son orientativos. {PRODUCT_NAME} pasará estas etiquetas de idioma al corrector ortográfico de tu sistema operativo cuando sea compatible. Las etiquetas que no reconozca se ignorarán." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "En un navegador, la función pulsar para hablar solo funciona si la pestaña de {PRODUCT_NAME} está activa. Instala la aplicación de escritorio para usar la función pulsar para hablar en todo el sistema." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Se ha cambiado el acceso de entrada. Cierra {productName} por completo y vuelve a abrirlo para que los atajos de todo el sistema puedan usarlo." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Entrada y salida" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Guarda estas credenciales en un lugar seguro. Si las regeneras, las integraciones existentes dejarán de funcionar." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Sigue transmitiendo brevemente después de soltar el botón." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Tema claro" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Filtro clásico ligero que funciona en cualquier dispositivo." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Apariencia y estilo" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Parece que estás usando {0}. Añadir el procesamiento de {PRODUCT_NAME} puede causar bombeo o distorsión. La entrada directa transmite el audio sin modificar." @@ -21035,7 +21039,7 @@ msgstr "Micrófono" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Prueba de micrófono" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Red y rendimiento" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Filtro neuronal que elimina la mayor parte del ruido de fondo." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Filtro neuronal, ancho de banda de audio completo." @@ -22690,7 +22694,7 @@ msgstr "No se encontraron coincidencias" msgid "No mentions yet" msgstr "Aún no hay menciones" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "No se ha encontrado ningún micrófono" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Ruido" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Puerta de ruido" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Ninguno" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Ninguna" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Tecla para pulsar y hablar" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Pulsar para hablar" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Pulsar para hablar (limitado)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "La función \"Pulsar para hablar\" se ignora en la entrada directa. Cambia a voz enfocada o personalizada para usarla." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Pulsar para hablar está activado. Mantén pulsado {pushToTalkHint} para hablar." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Pulsar para hablar solo funciona mientras la ventana de {productName} está activa hasta que se active {permissionName}. Después de cambiar el permiso, cierra por completo y reinicia {productName} para que los atajos de todo el sistema puedan usarlo." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Pulsar para hablar solo funciona si la pestaña del navegador está activa." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Recomendado" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Recomendado. Reduce el ruido del micrófono para que la voz se escuche con claridad." @@ -26561,7 +26565,7 @@ msgstr "Relativo" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Retraso de la liberación" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Selecciona la cuenta con la que quieres iniciar sesión en tu nuevo dispositivo." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Selecciona el modo de procesamiento de voz" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "El envío de mensajes está deshabilitado en esta comunidad" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Envía ambos canales de un micrófono estéreo. Requiere que todo el procesamiento esté desactivado y un canal a 128 kbps o superior." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Envía el audio del micrófono sin procesar." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Envía tu audio sin modificar. Es la mejor opción si usas software de audio externo." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Envía el audio de tu micrófono sin ninguna supresión." @@ -30136,7 +30140,7 @@ msgstr "Códigos cortos" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Paso 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Micrófono estéreo" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Se ha impedido que el miembro escuche a otros en esta comunidad" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Evita que el sonido de los altavoces se cuele por el micro." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Buena calidad con un coste de CPU moderado. Buena alternativa de Chromium para compartir pantalla." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "El filtro neuronal más potente para el habla. Limita el audio al rango de frecuencias de la voz." @@ -32539,7 +32543,7 @@ msgstr "Cambiar a diseño cómodo" msgid "Switch to dense layout" msgstr "Cambiar a diseño compacto" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Cambiar a entrada directa" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Velocidad de TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Ajusta el procesamiento tú mismo." @@ -37106,6 +37110,10 @@ msgstr "Usa el centro de notificaciones del sistema operativo. Para los controle msgid "Uses:" msgstr "Usos:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Usando {effectiveLabel} hasta que {requestedLabel} esté listo." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Participantes en el chat de voz" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Procesamiento de voz" @@ -38118,6 +38126,10 @@ msgstr "Activar sonido" msgid "Voice unmute" msgstr "Activar micrófono" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "La voz utiliza el dispositivo de salida de tu sistema en este navegador. Cámbialo en la configuración de tu sistema." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Anulada" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Qué conversaciones" msgid "Which rule was broken?" msgstr "¿Qué regla se ha infringido?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Mientras la función pulsar para hablar esté activada, tu atajo controla el micrófono, por lo que el botón de silenciar está deshabilitado." diff --git a/fluxer_app/src/features/i18n/locales/fi/messages.po b/fluxer_app/src/features/i18n/locales/fi/messages.po index 2c8cf582f..4b14eb23a 100644 --- a/fluxer_app/src/features/i18n/locales/fi/messages.po +++ b/fluxer_app/src/features/i18n/locales/fi/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} tarvitsee kameran käyttöoikeuden, jotta se voi näyttää laitteesi." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} tarvitsee mikrofonin käyttöoikeuden, jotta se voi näyttää laitteesi." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {jäsen} other {jäsent msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} paikalla" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} ei voinut käynnistyä. Käytetään sen sijaan {effectiveLabel}." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Aktiviteetin jakaminen" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Aktiivisuuskynnys" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Osoite" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Säädä kaikki asetukset itse: melunvaimennus, kaiunpoisto ja vahvistus." @@ -3606,11 +3610,11 @@ msgstr "Salli {everyoneMention} ja {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Salli {PRODUCT_NAME}-sovelluksen käyttää kameraasi kohdassa {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Salli {PRODUCT_NAME}-sovelluksen käyttää mikrofonia kohdassa {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Salli {PRODUCT_NAME}-sovelluksen käyttää mikrofonia. Tarkista selaimesi osoitepalkki tai asetukset." @@ -3713,7 +3717,7 @@ msgstr "Salli jäsenten, joilla ei ole {readMessageHistoryPermissionLabel} -käy msgid "Allow mentions for this role" msgstr "Salli maininnat tälle roolille" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Salli mikrofonin käyttö" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Äänen esikatselu" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Äänenkäsittely" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Tunnista kieli automaattisesti" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Aseta aktiivisuuskynnys automaattisesti" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Sisäänrakennetut pikanäppäimet" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Sisäänrakennettu vaimennus selaimesi tai järjestelmäsi kautta." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Puhdista linkki" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Siistii mikrofonin ääntä, jotta puhe kuuluu selkeästi." @@ -8985,7 +8989,7 @@ msgstr "Liitä kamera tai virtuaalinen tallennuslaite ja yritä sitten uudelleen msgid "Connect a display, then try again." msgstr "Liitä näyttö ja yritä uudelleen." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Liitä mikrofoni ja yritä uudelleen." @@ -10672,8 +10676,8 @@ msgstr "Mukautettu" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Leikkaa" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Katkaisee äänen, joka jää äänenvoimakkuusrajan alle, ja kuormittaa suoritinta hyvin vähän." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Lataa-painike" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Lataa työpöytäsovellus" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Ota käyttöön" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Ota käyttöön {permissionName}-käyttöoikeus" @@ -14220,7 +14224,7 @@ msgstr "Koko järjestelmän ääni" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Sisääntuloääni" @@ -14330,8 +14334,8 @@ msgstr "Ilta-aika" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Tasoittaa mikrofonisi äänenvoimakkuutta, jotta et ole liian hiljainen." @@ -17360,7 +17364,7 @@ msgstr "Tarvitsen toisen tavan" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Ymmärrän" @@ -17792,7 +17796,7 @@ msgstr "Kanavalla" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "Käyttöjärjestelmä-tilassa yllä luetellut sanakirjat ovat ohjeellisia. {PRODUCT_NAME} välittää nämä kielitunnisteet käyttöjärjestelmän oikolukijalle, jos se tukee niitä. Tunnisteet, joita se ei tunnista, ohitetaan." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "Selaimessa push-to-talk toimii vain, kun {PRODUCT_NAME}-välilehti on aktiivinen. Asenna työpöytäsovellus, jos haluat käyttää push-to-talkia koko järjestelmässä." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Syötteen käyttöoikeutta muutettiin. Sulje {productName} kokonaan ja käynnistä se uudelleen, jotta järjestelmänlaajuiset pikanäppäimet voivat käyttää sitä." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Tulo ja lähtö" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Pidä nämä turvassa. Uuden luominen rikkoo olemassa olevat integraatiot." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Jatka lähettämistä hetken näppäimen vapauttamisen jälkeen." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Vaalea teema" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Kevyt klassinen suodatin, toimii kaikilla laitteilla." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Ulkoasu ja tuntuma" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Näyttää siltä, että käytät ohjelmaa {0}. Jos lisäät {PRODUCT_NAME}-käsittelyn sen päälle, ääni voi pumpata tai vääristyä. Suora syöte välittää äänen muokkaamattomana." @@ -21035,7 +21039,7 @@ msgstr "Mikrofoni" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Mikrofonitesti" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Verkko ja suorituskyky" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Neuraalinen suodatin, joka poistaa suurimman osan taustamelusta." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Neuraalinen suodatin, täysi äänikaista." @@ -22690,7 +22694,7 @@ msgstr "Ei tuloksia" msgid "No mentions yet" msgstr "Ei vielä mainintoja" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Mikrofonia ei löydy" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Melu" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Kohinasulku" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Ei mitään" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Ei mitään" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Puhu painamalla -näppäin" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Push-to-talk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Puhu painamalla (rajoitettu)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Push-to-talk ohitetaan suorassa syötteessä. Käytä sitä vaihtamalla kohdennettuun ääneen tai mukautettuun tilaan." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Push-to-talk on käytössä. Pidä {pushToTalkHint} pohjassa puhuaksesi." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Push-to-talk toimii vain, kun {productName} on aktiivisena, kunnes {permissionName} on otettu käyttöön. Kun olet muuttanut lupaa, sulje ja käynnistä {productName} uudelleen, jotta järjestelmänlaajuiset pikanäppäimet voivat käyttää sitä." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Push-to-talk toimii vain, kun selainvälilehti on aktiivinen." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Suositeltu" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Suositeltu. Puhdistaa mikrofonin selkeää puhetta varten." @@ -26561,7 +26565,7 @@ msgstr "Suhteellinen" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Vapautusviive" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Valitse tili, jolla haluat kirjautua sisään uudella laitteellasi." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Valitse äänenkäsittelytila" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Viestien lähettäminen on poistettu käytöstä tässä yhteisössä" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Lähettää stereomikrofonin molemmat kanavat. Vaatii kaikkien käsittelyjen poiskytkemisen ja kanavan vähintään 128 kbps nopeudella." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Lähettää mikrofonin raa'an äänen ilman käsittelyä." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Lähettää äänesi muokkaamattomana. Paras, jos käytät ulkoista ääniohjelmistoa." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Lähettää mikrofonisi äänen ilman vaimennusta." @@ -30136,7 +30140,7 @@ msgstr "Pikakoodit" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Vaihe 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereomikrofoni" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Esti jäsentä kuulemasta muita tässä yhteisössä" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Estää kaiuttimien äänen kiertämisen takaisin mikrofoniin." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Hyvä laatu kohtuullisella suorittimen kuormituksella. Toimiva varavaihtoehto näytön jakoon Chromiumissa." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Vahvin neurosuodatin puheelle. Rajoittaa äänen puhealueelle." @@ -32539,7 +32543,7 @@ msgstr "Vaihda väljään asetteluun" msgid "Switch to dense layout" msgstr "Vaihda tiiviiseen asetteluun" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Vaihda suoraan syöttöön" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS-nopeus" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Säädä käsittelyä itse." @@ -37106,6 +37110,10 @@ msgstr "Käyttää käyttöjärjestelmän ilmoituskeskusta. Kanava- tai yhteisö msgid "Uses:" msgstr "Käyttökerrat:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Käytetään {effectiveLabel}-asetusta, kunnes {requestedLabel} on valmis." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Äänipuhelun osallistujat" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Äänenkäsittely" @@ -38118,6 +38126,10 @@ msgstr "Äänten mykistyksen poisto" msgid "Voice unmute" msgstr "Mikrofonin mykistyksen poisto" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Ääni käyttää tässä selaimessa järjestelmäsi äänilähtölaitetta. Muuta sitä järjestelmäasetuksissasi." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Mitätöity" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Mitkä keskustelut" msgid "Which rule was broken?" msgstr "Mitä sääntöä rikottiin?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Kun paina ja puhu -toiminto on käytössä, pikanäppäin ohjaa mikrofonia, joten mykistyspainike on poissa käytöstä." diff --git a/fluxer_app/src/features/i18n/locales/fr/messages.po b/fluxer_app/src/features/i18n/locales/fr/messages.po index 6f3fb825f..4cdcea1a2 100644 --- a/fluxer_app/src/features/i18n/locales/fr/messages.po +++ b/fluxer_app/src/features/i18n/locales/fr/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} a besoin d'accéder à votre caméra pour afficher vos appareils." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} a besoin d'accéder à votre microphone pour afficher vos appareils." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {membre} other {membres} msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} en ligne" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} n'a pas pu démarrer. Utilisation de {effectiveLabel} à la place." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Partage d’activité" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Seuil d'activité" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adresse" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Ajustez chaque paramètre vous-même : suppression du bruit, annulation de l'écho et gain." @@ -3606,11 +3610,11 @@ msgstr "Autoriser {everyoneMention} et {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Autorisez {PRODUCT_NAME} à accéder à votre caméra dans {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Autorisez {PRODUCT_NAME} à accéder à votre micro dans {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Autorisez {PRODUCT_NAME} à accéder à votre microphone. Vérifiez la barre d'adresse ou les paramètres de votre navigateur." @@ -3713,7 +3717,7 @@ msgstr "Autoriser les membres sans la permission {readMessageHistoryPermissionLa msgid "Allow mentions for this role" msgstr "Autoriser les mentions pour ce rôle" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Autoriser l’accès au micro" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Aperçu audio" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Traitement audio" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Détection automatique de la langue" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Définir automatiquement le seuil d'activité" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Raccourcis intégrés" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Suppression du bruit intégrée au navigateur ou au système." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Nettoyer le lien" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Améliore le son du micro pour une voix claire." @@ -8985,7 +8989,7 @@ msgstr "Connectez une caméra ou un appareil de capture virtuel, puis réessayez msgid "Connect a display, then try again." msgstr "Connectez un écran, puis réessayez." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Connectez un microphone et réessayez." @@ -10672,8 +10676,8 @@ msgstr "Personnalisé" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Couper" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Coupe le son sous un seuil de volume avec une utilisation minimale du processeur." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Bouton de téléchargement" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Télécharger l’application de bureau" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Activer" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Activer la permission {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Audio du système entier" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Son d’entrée" @@ -14330,8 +14334,8 @@ msgstr "Soir" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Équilibre le volume de votre micro pour que votre voix reste bien audible." @@ -17360,7 +17364,7 @@ msgstr "J'ai besoin d'une autre option" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "J'ai compris" @@ -17792,7 +17796,7 @@ msgstr "Dans" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "En mode « Système d’exploitation », les dictionnaires ci-dessus sont indicatifs. {PRODUCT_NAME} transmet ces codes de langue au correcteur orthographique de votre système lorsque celui-ci le permet. Les codes non reconnus sont ignorés." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "Dans un navigateur, la fonction \" Appuyer pour parler \" ne fonctionne que lorsque l'onglet {PRODUCT_NAME} est actif. Installez l'application de bureau pour utiliser cette fonction à l'échelle du système." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "L’accès aux entrées a été modifié. Quittez complètement puis redémarrez {productName} pour que les raccourcis système puissent l’utiliser." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Entrée et sortie" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Gardez-les en sécurité. La régénération interrompra les intégrations existantes." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Continuer à transmettre brièvement après avoir relâché le bouton." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Thème clair" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Filtre classique léger, fonctionne sur n'importe quel appareil." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Apparence" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Il semble que vous utilisiez {0}. Empiler le traitement de {PRODUCT_NAME} par-dessus peut provoquer des pompages ou des distorsions. L'entrée directe transmet votre audio sans modification." @@ -21035,7 +21039,7 @@ msgstr "Micro" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Test micro" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Réseau et performances" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Filtre neuronal qui supprime la plupart des bruits de fond." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Filtre neuronal, bande passante audio complète." @@ -22690,7 +22694,7 @@ msgstr "Aucun résultat" msgid "No mentions yet" msgstr "Aucune mention pour l'instant" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Aucun microphone détecté" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Bruit" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Réduction du bruit par seuil" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Aucun" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Aucune" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Touche \" Appuyer pour parler \"" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Appuyer pour parler" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Appuyer pour parler (limité)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "« Appuyer pour parler » est ignoré en mode « Entrée directe ». Passez en mode « Optimisé pour la voix » ou « Personnalisé » pour l’utiliser." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "« Appuyer pour parler » est activé. Maintenez {pushToTalkHint} enfoncé pour parler." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Le mode « Appuyer pour parler » ne fonctionne que lorsque {productName} est au premier plan, jusqu'à ce que l'autorisation {permissionName} soit activée. Après avoir modifié l'autorisation, quittez et redémarrez complètement {productName} pour que les raccourcis clavier système puissent l'utiliser." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "« Appuyer pour parler » fonctionne uniquement lorsque l’onglet du navigateur est actif." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Recommandé" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Recommandé. Améliore le son du micro pour une voix claire." @@ -26561,7 +26565,7 @@ msgstr "Relatif" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Délai de relâchement" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Sélectionnez le compte avec lequel vous souhaitez vous connecter sur votre nouvel appareil." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Sélectionner le mode de traitement vocal" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "L'envoi de messages est désactivé dans cette communauté" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Envoie les deux canaux d'un microphone stéréo. Nécessite que tout le traitement soit désactivé et un canal à 128 kbps ou plus." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Envoie l'audio brut du micro sans traitement." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Envoie votre audio tel quel. Idéal si vous utilisez un logiciel audio externe." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Envoie le son de votre micro sans réduction du bruit." @@ -30136,7 +30140,7 @@ msgstr "Codes courts" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Étape 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Microphone stéréo" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "A empêché le membre d'entendre les autres dans cette communauté" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Empêche le son de vos haut-parleurs de revenir dans votre micro." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Bonne qualité avec un coût CPU modéré. Bonne solution de secours Chromium pour le partage d'écran." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Filtre neuronal le plus puissant pour la parole, limite l'audio à la plage de la parole." @@ -32539,7 +32543,7 @@ msgstr "Passer à la mise en page confortable" msgid "Switch to dense layout" msgstr "Passer à la mise en page dense" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Passer en mode Entrée directe" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Vitesse de la synthèse vocale" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Réglez le traitement vous-même." @@ -37106,6 +37110,10 @@ msgstr "Utilise le centre de notifications du système d'exploitation. Pour les msgid "Uses:" msgstr "Utilisations :" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Utilisation de {effectiveLabel} jusqu'à ce que {requestedLabel} soit prêt." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Participants à l'appel" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Traitement de la voix" @@ -38118,6 +38126,10 @@ msgstr "Son réactivé" msgid "Voice unmute" msgstr "Micro réactivé" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "La voix utilise votre périphérique de sortie système dans ce navigateur. Modifiez-le dans vos paramètres système." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Annulée" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Quelles conversations" msgid "Which rule was broken?" msgstr "Quelle règle a été enfreinte ?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Lorsque « Appuyer pour parler » est activé, votre raccourci contrôle le micro. Le bouton « Couper le micro » est donc désactivé." diff --git a/fluxer_app/src/features/i18n/locales/he/messages.po b/fluxer_app/src/features/i18n/locales/he/messages.po index 25cefaeff..f387d1505 100644 --- a/fluxer_app/src/features/i18n/locales/he/messages.po +++ b/fluxer_app/src/features/i18n/locales/he/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} זקוק לגישה למצלמה כדי להציג את המכשירים שלך." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} זקוק לגישה למיקרופון כדי להציג את המכשירים שלך." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {חבר} other {חברי msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} מחוברים" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} לא הצליח להתחיל. משתמש ב-{effectiveLabel} במקום זאת." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "שיתוף פעילות" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "סף פעילות" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "כתובת" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "התאם כל הגדרה בעצמך: דיכוי רעשים, ביטול הד והגברה." @@ -3606,11 +3610,11 @@ msgstr "אפשר {everyoneMention} ו-{hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "אפשר ל-{PRODUCT_NAME} לגשת למצלמה שלך ב-{MACOS_SYSTEM_SETTINGS_NAME} ← {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} ← {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "אפשר ל-{PRODUCT_NAME} לגשת למיקרופון שלך ב-{MACOS_SYSTEM_SETTINGS_NAME} ← {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} ← {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "אפשר ל-{PRODUCT_NAME} לגשת למיקרופון שלך. בדוק את שורת הכתובת או את ההגדרות של הדפדפן." @@ -3713,7 +3717,7 @@ msgstr "אפשר לחברים ללא הרשאת {readMessageHistoryPermissionLab msgid "Allow mentions for this role" msgstr "אפשר אזכורים לתפקיד זה" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "אפשר מיקרופון" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "תצוגה מקדימה של שמע" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "עיבוד שמע" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "זיהוי שפה אוטומטי" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "קביעה אוטומטית של סף הפעילות" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "קיצורי דרך מובנים" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "דיכוי מובנה מהדפדפן או מהמערכת שלך." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "ניקוי קישור" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "מנקה את המיקרופון שלך לדיבור ברור." @@ -8985,7 +8989,7 @@ msgstr "חבר מצלמה או התקן לכידה וירטואלי, ואז נס msgid "Connect a display, then try again." msgstr "חבר צג, ואז נסה שוב." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "חבר מיקרופון ונסה שוב." @@ -10672,8 +10676,8 @@ msgstr "מותאם אישית" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "גזור" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "חותך אודיו מתחת לסף עוצמה, עלות CPU מינימלית." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "כפתור הורדה" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "הורדת אפליקציית המחשב" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "הפעלה" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "הפעלת הרשאת {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "כל צלילי המערכת" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "צליל כניסה" @@ -14330,8 +14334,8 @@ msgstr "ערב" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "מאזן את עוצמת המיקרופון שלך כדי שלא תישמע שקט מדי." @@ -17360,7 +17364,7 @@ msgstr "אני צריך דרך אחרת" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "אני מבין/ה" @@ -17792,7 +17796,7 @@ msgstr "בערוץ" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "במצב \"מערכת הפעלה\", המילונים המפורטים לעיל הם בגדר המלצה. {PRODUCT_NAME} יעביר את תגי השפה האלה לבודק האיות של מערכת ההפעלה שלך כאשר הדבר נתמך. הוא יתעלם מתגים שאינו מזהה." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "בדפדפן, דיבור בלחיצה (push-to-talk) פועל רק כשהכרטיסייה של {PRODUCT_NAME} ממוקדת. התקן את אפליקציית המחשב כדי להשתמש בדיבור בלחיצה בכל המערכת." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "גישת הקלט שונתה. צא לגמרי מ-{productName} והפעל מחדש כדי שקיצורי דרך כלל-מערכתיים יוכלו להשתמש בה." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "קלט ופלט" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "שמור עליהם במקום בטוח. יצירה מחדש תשבור אינטגרציות קיימות." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "המשך לשדר לזמן קצר לאחר השחרור." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "ערכת נושא בהירה" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "פילטר קלאסי קל משקל, עובד על כל מכשיר." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "מראה ותחושה" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "נראה שאתה משתמש ב-{0}. הוספת עיבוד של {PRODUCT_NAME} עלולה לגרום לעיוות או להגברת יתר. קלט ישיר מעביר את השמע שלך ללא שינוי." @@ -21035,7 +21039,7 @@ msgstr "מיקרופון" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "בדיקת מיקרופון" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "רשת וביצועים" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "פילטר נוירוני שמסיר את רוב רעשי הרקע." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "פילטר נוירוני, רוחב פס שמע מלא." @@ -22690,7 +22694,7 @@ msgstr "לא נמצאו התאמות" msgid "No mentions yet" msgstr "אין אזכורים עדיין" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "לא נמצא מיקרופון" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "רעש" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "שער רעש" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "ללא" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "ללא" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "מקש 'דיבור בלחיצה'" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "דיבור בלחיצה" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "דיבור בלחיצה (מוגבל)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "דיבור בלחיצה אינו פעיל בקלט ישיר. עבור לקול ממוקד או למצב מותאם אישית כדי להשתמש בו." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "הדיבור בלחיצה מופעל. החזק את {pushToTalkHint} כדי לדבר." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "דיבור בלחיצה פועל רק כש-{productName} ממוקד, עד שההרשאה {permissionName} מופעלת. לאחר שינוי ההרשאה, יש לצאת מ-{productName} לחלוטין ולהפעיל אותו מחדש כדי שקיצורי מקשים כלל-מערכתיים יוכלו להשתמש בה." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "דיבור בלחיצה עובד רק כשהכרטיסייה בדפדפן ממוקדת." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "מומלץ" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "מומלץ. מנקה את המיקרופון שלך לדיבור ברור." @@ -26561,7 +26565,7 @@ msgstr "יחסי" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "השהיית שחרור" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "בחר את החשבון שברצונך להתחבר איתו במכשיר החדש שלך." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "בחר מצב עיבוד קולי" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "שליחת הודעות מושבתת בקהילה זו" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "שולח את שני הערוצים של מיקרופון סטריאו. דורש שכל העיבוד כבוי וערוץ במהירות 128 קילו-ביט לשנייה או יותר." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "שולח אודיו גולמי מהמיקרופון ללא עיבוד." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "שולח את האודיו שלך ללא שינוי. מומלץ אם אתה משתמש בתוכנת אודיו חיצונית." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "שולח את אודיו המיקרופון שלך ללא דיכוי." @@ -30136,7 +30140,7 @@ msgstr "קודי קיצור" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "שלב 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "מיקרופון סטריאו" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "מניעת האפשרות מהחבר לשמוע אחרים בקהילה זו" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "מונע מקול הרמקולים לחזור אל המיקרופון שלך." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "איכות גבוהה בעלות מעבד בינונית. חלופה טובה ב-Chromium לשיתוף מסך." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "הפילטר הנוירוני החזק ביותר לדיבור, מגביל את האודיו לטווח הדיבור." @@ -32539,7 +32543,7 @@ msgstr "החלף לפריסה נוחה" msgid "Switch to dense layout" msgstr "החלף לפריסה דחוסה" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "החלף לקלט ישיר" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "מהירות TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "כייל את העיבוד בעצמך." @@ -37106,6 +37110,10 @@ msgstr "משתמש במרכז ההתראות של מערכת ההפעלה. לב msgid "Uses:" msgstr "שימושים:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "שימוש ב-{effectiveLabel} עד ש- {requestedLabel} יהיה מוכן." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "משתתפים בשיחה הקולית" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "עיבוד קולי" @@ -38118,6 +38126,10 @@ msgstr "ביטול השתקת שמע" msgid "Voice unmute" msgstr "ביטול השתקת מיקרופון" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "הקול משתמש בהתקן הפלט של המערכת שלך בדפדפן זה. שנה אותו בהגדרות המערכת שלך." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "בוטל" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "אילו שיחות" msgid "Which rule was broken?" msgstr "איזה כלל הופר?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "כאשר דיבור בלחיצה מופעל, קיצור הדרך שולט במיקרופון שלך, ולכן כפתור ההשתקה מושבת." diff --git a/fluxer_app/src/features/i18n/locales/hi/messages.po b/fluxer_app/src/features/i18n/locales/hi/messages.po index a196d606b..922b4f744 100644 --- a/fluxer_app/src/features/i18n/locales/hi/messages.po +++ b/fluxer_app/src/features/i18n/locales/hi/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} को आपके डिवाइस दिखाने के लिए कैमरे का एक्सेस चाहिए।" #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} को आपके डिवाइस दिखाने के लिए माइक्रोफ़ोन का एक्सेस चाहिए।" @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {सदस्य} other msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} ऑनलाइन" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} शुरू नहीं हो सका। इसके बजाय {effectiveLabel} का उपयोग किया जा रहा है।" + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "गतिविधि शेयरिंग" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "गतिविधि थ्रेशोल्ड" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "पता" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "हर सेटिंग खुद एडजस्ट करें: शोर दबाना, इको कैंसलेशन और गेन।" @@ -3606,11 +3610,11 @@ msgstr "{everyoneMention} और {hereMention} की अनुमति दे msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "{PRODUCT_NAME} को {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME} में अपने कैमरे का उपयोग करने की अनुमति दें।" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "{PRODUCT_NAME} को {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME} में अपने माइक्रोफ़ोन का उपयोग करने की अनुमति दें।" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "{PRODUCT_NAME} को अपने माइक्रोफ़ोन का इस्तेमाल करने की अनुमति दें। अपने ब्राउज़र के एड्रेस बार या सेटिंग्स में जाँच करें।" @@ -3713,7 +3717,7 @@ msgstr "जिन सदस्यों के पास {readMessageHistoryPerm msgid "Allow mentions for this role" msgstr "इस रोल के लिए मेंशन की अनुमति दें" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "माइक्रोफ़ोन का एक्सेस दें" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "ऑडियो प्रीव्यू" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "ऑडियो प्रोसेसिंग" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "भाषा अपने आप पहचानें" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "गतिविधि थ्रेशोल्ड अपने आप सेट करें" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "बिल्ट-इन शॉर्टकट" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "आपके ब्राउज़र या सिस्टम का बिल्ट-इन नॉइज़ सप्रेशन।" @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "लिंक साफ़ करें" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "स्पष्ट बातचीत के लिए आपके माइक को साफ़ करता है।" @@ -8985,7 +8989,7 @@ msgstr "कैमरा या वर्चुअल कैप्चर डि msgid "Connect a display, then try again." msgstr "एक डिस्प्ले कनेक्ट करें, फिर दोबारा प्रयास करें।" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "माइक्रोफ़ोन कनेक्ट करें और फिर से प्रयास करें।" @@ -10672,8 +10676,8 @@ msgstr "कस्टम" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "काटें" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "बहुत कम CPU इस्तेमाल के साथ तय लाउडनेस थ्रेशोल्ड से नीचे का ऑडियो काट देता है।" @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "डाउनलोड बटन" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "डेस्कटॉप ऐप डाउनलोड करें" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "चालू करें" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "{permissionName} अनुमति चालू करें" @@ -14220,7 +14224,7 @@ msgstr "पूरे सिस्टम का ऑडियो" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "एंट्रेंस साउंड" @@ -14330,8 +14334,8 @@ msgstr "शाम का समय" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "यह आपके माइक्रोफ़ोन की आवाज़ को बराबर करता है ताकि आपकी आवाज़ बहुत धीमी न लगे।" @@ -17360,7 +17364,7 @@ msgstr "मुझे कोई दूसरा तरीका चाहिए" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "मैं समझ गया/गई" @@ -17792,7 +17796,7 @@ msgstr "चैनल" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "\"ऑपरेटिंग सिस्टम\" मोड में, ऊपर दी गई डिक्शनरी सिर्फ़ सलाह के तौर पर हैं। सपोर्ट होने पर {PRODUCT_NAME} ये भाषा टैग आपके OS स्पेलचेकर को भेजेगा। जिन टैग को वह नहीं पहचानता, उन्हें अनदेखा कर दिया जाता है।" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "ब्राउज़र में, पुश-टू-टॉक तभी काम करता है जब {PRODUCT_NAME} टैब फ़ोकस में हो। सिस्टम-वाइड पुश-टू-टॉक के लिए डेस्कटॉप ऐप इंस्टॉल करें।" @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "इनपुट एक्सेस बदल दिया गया है। {productName} को पूरी तरह से बंद करें और फिर से शुरू करें ताकि सिस्टम-वाइड शॉर्टकट इसका उपयोग कर सकें।" #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "इनपुट और आउटपुट" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "इन्हें सुरक्षित रखें। फिर से जनरेट करने पर मौजूदा इंटिग्रेशन टूट जाएँगे।" #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "रिलीज़ करने के बाद भी थोड़ी देर तक ट्रांसमिट करते रहें।" @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "लाइट थीम" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "हल्का क्लासिक फ़िल्टर, किसी भी डिवाइस पर काम करता है।" @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "दिखावट और अनुभव" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "लगता है आप {0} का उपयोग कर रहे हैं। {PRODUCT_NAME} की प्रोसेसिंग को इसके ऊपर रखने से पंपिंग या डिस्टॉर्शन हो सकता है। डायरेक्ट इनपुट आपके ऑडियो को बिना किसी बदलाव के पास करता है।" @@ -21035,7 +21039,7 @@ msgstr "माइक" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "माइक टेस्ट" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "नेटवर्किंग और परफ़ॉर्मेंस" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "बैकग्राउंड का ज़्यादातर शोर हटाने वाला न्यूरल फ़िल्टर।" #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "न्यूरल फ़िल्टर, पूर्ण ऑडियो बैंडविड्थ।" @@ -22690,7 +22694,7 @@ msgstr "कोई मिलान नहीं मिला" msgid "No mentions yet" msgstr "अभी तक कोई मेंशन नहीं है" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "कोई माइक्रोफ़ोन नहीं मिला" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "शोर" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "नॉइज़ गेट" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "कोई नहीं" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "कोई नहीं" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "पुश टू टॉक कुंजी" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "पुश-टू-टॉक" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "पुश-टू-टॉक (सीमित)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "सीधा इनपुट मोड में पुश-टू-टॉक को अनदेखा किया जाता है। इसे इस्तेमाल करने के लिए फ़ोकस्ड वॉइस या कस्टम पर स्विच करें।" @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "पुश-टू-टॉक चालू है। बोलने के लिए {pushToTalkHint} दबाए रखें।" #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "{permissionName} सक्षम होने तक पुश-टू-टॉक केवल तभी काम करता है जब {productName} फ़ोकस में हो। अनुमति बदलने के बाद, {productName} को पूरी तरह से बंद करें और पुनरारंभ करें ताकि सिस्टम-व्यापी हॉटकी इसका उपयोग कर सकें।" #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "पुश-टू-टॉक तभी काम करता है जब ब्राउज़र टैब फ़ोकस में हो।" @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "सुझाया गया" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "सुझाया गया। स्पष्ट आवाज़ के लिए आपके माइक ऑडियो को साफ़ करता है।" @@ -26561,7 +26565,7 @@ msgstr "रिलेटिव" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "रिलीज़ में देरी" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "वह खाता चुनें जिससे आप अपने नए डिवाइस पर साइन इन करना चाहते हैं।" #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "वॉइस प्रोसेसिंग मोड चुनें" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "इस कम्युनिटी में मैसेज भेजना बंद है" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "स्टीरियो माइक्रोफ़ोन के दोनों चैनल भेजता है। इसके लिए सभी प्रोसेसिंग बंद और 128 kbps या उससे अधिक का चैनल चाहिए।" #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "बिना किसी प्रोसेसिंग के रॉ माइक ऑडियो भेजता है।" #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "आपका ऑडियो बिना किसी बदलाव के भेजता है। अगर आप बाहरी ऑडियो सॉफ़्टवेयर का उपयोग कर रहे हैं तो यह सबसे अच्छा है।" #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "आपके माइक्रोफ़ोन का ऑडियो बिना किसी सप्रेशन के भेजता है।" @@ -30136,7 +30140,7 @@ msgstr "शॉर्टकोड" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "चरण 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "स्टीरियो माइक्रोफ़ोन" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "सदस्य को इस कम्युनिटी में दूसरों को सुनने से रोक दिया" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "आपके स्पीकर को आपके माइक में वापस लूप होने से रोकता है।" @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "मध्यम CPU लागत पर बढ़िया क्वालिटी। स्क्रीन शेयरिंग के लिए अच्छा Chromium फ़ॉलबैक।" #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "स्पीच के लिए सबसे मज़बूत न्यूरल फ़िल्टर। ऑडियो को स्पीच रेंज तक सीमित करता है।" @@ -32539,7 +32543,7 @@ msgstr "आरामदायक लेआउट पर स्विच कर msgid "Switch to dense layout" msgstr "सघन लेआउट पर स्विच करें" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "सीधे इनपुट पर स्विच करें" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS स्पीड" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "प्रोसेसिंग को खुद ट्यून करें।" @@ -37106,6 +37110,10 @@ msgstr "OS के सूचना केंद्र का उपयोग क msgid "Uses:" msgstr "उपयोग:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "{effectiveLabel} तैयार होने तक {requestedLabel} का उपयोग किया जा रहा है।" + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "वॉइस प्रतिभागी" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "वॉइस प्रोसेसिंग" @@ -38118,6 +38126,10 @@ msgstr "वॉइस अनडीफ़ेन" msgid "Voice unmute" msgstr "वॉइस अनम्यूट" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "यह आवाज़ इस ब्राउज़र में आपके सिस्टम आउटपुट डिवाइस का उपयोग करती है। इसे अपनी सिस्टम सेटिंग में बदलें।" + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "रद्द किया गया" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "कौन सी बातचीत" msgid "Which rule was broken?" msgstr "कौन सा नियम तोड़ा गया?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "जब तक पुश-टू-टॉक चालू है, आपका शॉर्टकट आपके माइक्रोफ़ोन को नियंत्रित करता है, इसलिए म्यूट बटन अक्षम है।" diff --git a/fluxer_app/src/features/i18n/locales/hr/messages.po b/fluxer_app/src/features/i18n/locales/hr/messages.po index 10d7a097a..9c4c09321 100644 --- a/fluxer_app/src/features/i18n/locales/hr/messages.po +++ b/fluxer_app/src/features/i18n/locales/hr/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "Aplikacija {productName} treba pristup kameri za prikaz vaših uređaja." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "Aplikacija {productName} treba pristup mikrofonu za prikaz vaših uređaja." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {član} few {člana} oth msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} na mreži" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} se nije mogao pokrenuti. Umjesto toga koristi se {effectiveLabel}." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Dijeljenje aktivnosti" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Prag aktivnosti" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adresa" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Sami prilagodite svaku postavku: potiskivanje buke, poništavanje jeke i pojačanje." @@ -3606,11 +3610,11 @@ msgstr "Dopusti {everyoneMention} i {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Dopustite aplikaciji {PRODUCT_NAME} pristup vašoj kameri u {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Dopustite aplikaciji {PRODUCT_NAME} pristup mikrofonu u {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Dopustite aplikaciji {PRODUCT_NAME} pristup mikrofonu. Provjerite adresnu traku ili postavke preglednika." @@ -3713,7 +3717,7 @@ msgstr "Dopusti članovima bez dopuštenja {readMessageHistoryPermissionLabel} d msgid "Allow mentions for this role" msgstr "Dopusti spominjanje za ovu ulogu" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Dopusti mikrofon" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Pretpregled zvuka" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Obrada zvuka" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Automatsko prepoznavanje jezika" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Automatsko postavljanje praga aktivnosti" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Ugrađeni prečaci" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Ugrađeno suzbijanje buke iz vašeg preglednika ili sustava." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Očisti poveznicu" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Pročišćava mikrofon za jasan govor." @@ -8985,7 +8989,7 @@ msgstr "Povežite kameru ili virtualni uređaj za snimanje, pa pokušajte ponovn msgid "Connect a display, then try again." msgstr "Povežite zaslon, a zatim pokušajte ponovno." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Povežite mikrofon i pokušajte ponovno." @@ -10672,8 +10676,8 @@ msgstr "Prilagođeno" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Izreži" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Reže zvuk ispod praga glasnoće uz minimalnu potrošnju procesora." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Gumb za preuzimanje" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Preuzmi aplikaciju za stolno računalo" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Omogući" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Omogući dopuštenje {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Zvuk cijelog sustava" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Zvuk ulaska" @@ -14330,8 +14334,8 @@ msgstr "Večernje vrijeme" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Ujednačava glasnoću mikrofona kako ne biste bili pretihi." @@ -17360,7 +17364,7 @@ msgstr "Trebam drugi način" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Razumijem" @@ -17792,7 +17796,7 @@ msgstr "U" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "U načinu rada \"Operativni sustav\" gore navedeni rječnici su savjetodavni. {PRODUCT_NAME} će proslijediti ove jezične oznake provjeri pravopisa vašeg OS-a kada je podržano. Oznake koje ne prepoznaje bit će zanemarene." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "U pregledniku pritisni za govor radi samo dok je kartica {PRODUCT_NAME} aktivna. Instalirajte desktop aplikaciju za značajku pritisni za govor na cijelom sustavu." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Pristup unosu je promijenjen. U potpunosti zatvorite i ponovno pokrenite {productName} kako bi ga prečaci na razini sustava mogli koristiti." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Ulaz i izlaz" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Čuvajte ih na sigurnom. Ponovno generiranje prekinut će postojeće integracije." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Nastavi s prijenosom još nakratko nakon otpuštanja tipke." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Svijetla tema" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Lagani klasični filtar, radi na bilo kojem uređaju." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Izgled i dojam" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Čini se da koristite {0}. Dodatna obrada u {PRODUCT_NAME}u povrh toga može uzrokovati pumpanje ili izobličenje zvuka. Izravan unos propušta vaš zvuk netaknutim." @@ -21035,7 +21039,7 @@ msgstr "Mikrofon" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Test mikrofona" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Mreža i performanse" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Neuralni filtar koji uklanja većinu pozadinske buke." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Neuralni filtar, puni frekvencijski raspon." @@ -22690,7 +22694,7 @@ msgstr "Nema rezultata" msgid "No mentions yet" msgstr "Još nema spominjanja" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Nije pronađen mikrofon" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Buka" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Prag šuma" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Ništa" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Ništa" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Tipka za pritisni za govor" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Pritisni za govor" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Pritisni za govor (ograničeno)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Pritisni za govor zanemaruje se u izravnom unosu. Prebacite se na fokusirani glas ili prilagođeno da biste ga koristili." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Uključena je opcija pritisni za govor. Držite {pushToTalkHint} da biste govorili." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Pritisni za govor radi samo dok je {productName} u fokusu, sve dok se ne omogući {permissionName}. Nakon promjene dopuštenja, u potpunosti zatvorite i ponovno pokrenite {productName} kako bi ga prečaci na razini sustava mogli koristiti." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Pritisni za govor radi samo dok je kartica preglednika u fokusu." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Preporučeno" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Preporučeno. Pročišćava mikrofon za jasan govor." @@ -26561,7 +26565,7 @@ msgstr "Relativno" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Odgoda otpuštanja" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Odaberite račun s kojim se želite prijaviti na novom uređaju." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Odaberite način obrade glasa" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Slanje poruka onemogućeno je u ovoj zajednici" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Šalje oba kanala stereo mikrofona. Potrebno je isključiti svu obradu i kanal od 128 kbps ili više." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Šalje sirovi zvuk mikrofona bez ikakve obrade." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Šalje vaš zvuk netaknut. Najbolje ako koristite vanjski audio softver." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Šalje zvuk vašeg mikrofona bez suzbijanja buke." @@ -30136,7 +30140,7 @@ msgstr "Kratki kodovi" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Korak 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereo mikrofon" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Članu je onemogućeno slušanje drugih u ovoj zajednici" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Sprječava vraćanje zvuka zvučnika u mikrofon." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Visoka kvaliteta uz umjerenu potrošnju procesora. Dobra zamjena za dijeljenje zaslona u Chromiumu." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Najjači neuralni filtar za govor. Ograničava zvuk na govorni raspon." @@ -32539,7 +32543,7 @@ msgstr "Prebaci na ugodan izgled" msgid "Switch to dense layout" msgstr "Prebaci na zgusnuti izgled" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Prebaci na izravan unos" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Brzina TTS-a" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Sami podesite obradu." @@ -37106,6 +37110,10 @@ msgstr "Koristi centar za obavijesti OS-a. Za kontrole po kanalu/zajednici, desn msgid "Uses:" msgstr "Broj korištenja:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Koristim {effectiveLabel} dok {requestedLabel} ne bude spreman." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Sudionici glasovnog poziva" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Obrada glasa" @@ -38118,6 +38126,10 @@ msgstr "Uključivanje zvuka" msgid "Voice unmute" msgstr "Uključivanje mikrofona" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Glas koristi vaš sistemski izlazni uređaj u ovom pregledniku. Promijenite ga u sistemskim postavkama." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Poništeno" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Koje razgovore" msgid "Which rule was broken?" msgstr "Koje je pravilo prekršeno?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Dok je uključena značajka pritisni za govor, vaš prečac upravlja mikrofonom, pa je gumb za isključivanje mikrofona onemogućen." diff --git a/fluxer_app/src/features/i18n/locales/hu/messages.po b/fluxer_app/src/features/i18n/locales/hu/messages.po index 9c34048ea..e0a12ee50 100644 --- a/fluxer_app/src/features/i18n/locales/hu/messages.po +++ b/fluxer_app/src/features/i18n/locales/hu/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "A(z) {productName} alkalmazásnak kamera-hozzáférésre van szüksége az eszközök listázásához." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "A(z) {productName} mikrofon-hozzáférést igényel az eszközök listázásához." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {tag} other {tag}}" msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "A(z) {requestedLabel} nem indítható. Helyette a(z) {effectiveLabel} használata következik." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Tevékenységmegosztás" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Tevékenységi küszöb" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Cím" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Állítsd be az egyes beállításokat magad: zajszűrés, visszhangszűrés és erősítés." @@ -3606,11 +3610,11 @@ msgstr "{everyoneMention} és {hereMention} engedélyezése" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Engedélyezd a(z) {PRODUCT_NAME} számára a kamera használatát itt: {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Engedélyezd a(z) {PRODUCT_NAME} számára a mikrofonod elérését a(z) {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME} útvonalon." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Engedélyezd, hogy a(z) {PRODUCT_NAME} hozzáférjen a mikrofonodhoz. Ellenőrizd a böngésződ címsorát vagy beállításait." @@ -3713,7 +3717,7 @@ msgstr "Engedélyezd a {readMessageHistoryPermissionLabel} jogosultsággal nem r msgid "Allow mentions for this role" msgstr "Említések engedélyezése ehhez a szerepkörhöz" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Mikrofon engedélyezése" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Hang előnézete" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Hangfeldolgozás" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Nyelv automatikus észlelése" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Tevékenységi küszöb automatikus beállítása" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Beépített billentyűparancsok" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "A böngésző vagy a rendszer beépített zajszűrése." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Link tisztítása" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Tisztábbá teszi a mikrofonod hangját, hogy a beszéd jól érthető legyen." @@ -8985,7 +8989,7 @@ msgstr "Csatlakoztass egy kamerát vagy virtuális rögzítőeszközt, majd pró msgid "Connect a display, then try again." msgstr "Csatlakoztass egy kijelzőt, majd próbáld újra." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Csatlakoztass egy mikrofont, és próbáld újra." @@ -10672,8 +10676,8 @@ msgstr "Egyéni" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Kivágás" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Elnémítja a megadott hangerőküszöb alatti hangot, minimális processzorterheléssel." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Letöltés gomb" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Asztali alkalmazás letöltése" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Engedélyezés" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "{permissionName} jogosultság engedélyezése" @@ -14220,7 +14224,7 @@ msgstr "Teljes rendszerhang" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Belépési hang" @@ -14330,8 +14334,8 @@ msgstr "Este" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Kiegyenlíti a mikrofonod hangerejét, hogy ne legyél túl halk." @@ -17360,7 +17364,7 @@ msgstr "Másik módra van szükségem" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Értem" @@ -17792,7 +17796,7 @@ msgstr "Ebben" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "„Operációs rendszer” módban a fent felsorolt szótárak tájékoztató jellegűek. A(z) {PRODUCT_NAME} átadja ezeket a nyelvi címkéket az operációs rendszer helyesírás-ellenőrzőjének, ha támogatott. Azokat a címkéket, amelyeket nem ismer fel, figyelmen kívül hagyja." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "Böngészőben az adásgomb csak akkor működik, ha a(z) {PRODUCT_NAME} lap fókuszban van. Telepítsd az asztali alkalmazást a rendszerszintű adásgomb használatához." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Megváltozott a bemeneti hozzáférés. Teljesen zárd be, majd indítsd újra a(z) {productName} alkalmazást, hogy a rendszerszintű billentyűparancsok használhassák." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Bemenet és kimenet" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Őrizd meg őket biztonságosan. Az újragenerálás működésképtelenné teszi a meglévő integrációkat." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "A gomb elengedése után is tartsa aktívnak a jelet egy rövid ideig." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Világos téma" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Kis erőforrásigényű klasszikus szűrő, amely bármilyen eszközön működik." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Megjelenés és érzet" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Úgy tűnik, ezt használod: {0}. Ha erre a(z) {PRODUCT_NAME} hangfeldolgozása is rákerül, az hangerő-ingadozást vagy torzítást okozhat. A közvetlen bemenet változtatás nélkül továbbítja a hangodat." @@ -21035,7 +21039,7 @@ msgstr "Mikrofon" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Mikrofonteszt" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Hálózat és teljesítmény" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Neuronális szűrő, amely eltávolítja a legtöbb háttérzajt." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Neurális szűrő a teljes hangfrekvencia-tartományban." @@ -22690,7 +22694,7 @@ msgstr "Nincs találat" msgid "No mentions yet" msgstr "Még nincsenek említések" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Nem található mikrofon" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Zaj" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Zajkapu" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Nincs" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Nincs" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Adásgomb billentyűje" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Adásgomb" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Adásgomb (korlátozott)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Közvetlen bemenet használatakor az adásgomb nem működik. A használatához válts Beszédkiemelés vagy Egyéni módra." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Az adásgomb be van kapcsolva. A beszédhez tartsd lenyomva ezt: {pushToTalkHint}" #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Amíg nincs engedélyezve a(z) {permissionName}, az adásgomb csak akkor működik, ha a(z) {productName} fókuszban van. Az engedély módosítása után teljesen zárd be, majd indítsd újra a(z) {productName} alkalmazást, hogy a rendszerszintű billentyűparancsok használhassák." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Az adásgomb csak akkor működik, ha a böngészőlap fókuszban van." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Ajánlott" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Ajánlott. Megtisztítja a mikrofon hangját az érthető beszédhez." @@ -26561,7 +26565,7 @@ msgstr "Relatív" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Késleltetés felengedéskor" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Válaszd ki a fiókot, amellyel be szeretnél jelentkezni az új eszközödön." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Hangfeldolgozási mód kiválasztása" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Az üzenetküldés le van tiltva ebben a közösségben" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Mindkét sztereó mikrofoncsatornát küldi. Minden feldolgozás kikapcsolása és legalább 128 kbps csatorna szükséges." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Nyers mikrofonhang küldése feldolgozás nélkül." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Érintetlenül küldi a hangot. Akkor a legjobb, ha külső audioszoftvert használsz." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "A mikrofonod hangját zajszűrés nélkül továbbítja." @@ -30136,7 +30140,7 @@ msgstr "Rövidkódok" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "4. lépés" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Sztereó mikrofon" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Megakadályozta, hogy a tag hallja a többieket ebben a közösségben" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Megakadályozza, hogy a hangszórókból érkező hang visszajusson a mikrofonba." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Jó minőség mérsékelt CPU-használattal. Megfelelő tartalék megoldás Chromiumon a képernyőmegosztáshoz." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Legerősebb neurális szűrő a beszédhez, a hangot a beszéd tartományára korlátozza." @@ -32539,7 +32543,7 @@ msgstr "Átváltás kényelmes elrendezésre" msgid "Switch to dense layout" msgstr "Váltás sűrű elrendezésre" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Váltás közvetlen bemenetre" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS-sebesség" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Hangold be a feldolgozást." @@ -37106,6 +37110,10 @@ msgstr "Az operációs rendszer értesítési központját használja. A csatorn msgid "Uses:" msgstr "Használat:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "A(z) {effectiveLabel} használata, amíg a(z) {requestedLabel} nem lesz kész." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Hanghívás résztvevői" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Hangfeldolgozás" @@ -38118,6 +38126,10 @@ msgstr "Bejövő hang visszakapcsolása" msgid "Voice unmute" msgstr "Mikrofon némításának feloldása" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "A hang a böngészőben az alapértelmezett rendszerkimeneti eszközödet használja. Módosítsd a rendszerbeállításaidban." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Érvénytelenítve" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Mely beszélgetések" msgid "Which rule was broken?" msgstr "Melyik szabályt szegték meg?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Amíg az adásgomb be van kapcsolva, a billentyűparancs vezérli a mikrofonodat, ezért a némítás gomb nem használható." diff --git a/fluxer_app/src/features/i18n/locales/id/messages.po b/fluxer_app/src/features/i18n/locales/id/messages.po index c4ae2eb18..a9d5406be 100644 --- a/fluxer_app/src/features/i18n/locales/id/messages.po +++ b/fluxer_app/src/features/i18n/locales/id/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} memerlukan akses kamera untuk menampilkan daftar perangkatmu." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} memerlukan akses mikrofon untuk menampilkan daftar perangkatmu." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {anggota} other {anggota msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} tidak dapat dimulai. Menggunakan {effectiveLabel} sebagai gantinya." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Berbagi aktivitas" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Ambang aktivitas" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Alamat" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Sesuaikan sendiri setiap pengaturan: peredam bising, pembatalan gema, dan penguatan." @@ -3606,11 +3610,11 @@ msgstr "Izinkan {everyoneMention} dan {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Izinkan {PRODUCT_NAME} mengakses kameramu di {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Izinkan {PRODUCT_NAME} mengakses mikrofonmu di {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Izinkan {PRODUCT_NAME} mengakses mikrofonmu. Periksa bilah alamat atau pengaturan browsermu." @@ -3713,7 +3717,7 @@ msgstr "Izinkan anggota tanpa izin {readMessageHistoryPermissionLabel} untuk mel msgid "Allow mentions for this role" msgstr "Izinkan sebutan untuk peran ini" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Izinkan mikrofon" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Pratinjau audio" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Pemrosesan audio" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Deteksi bahasa otomatis" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Ambang aktivitas otomatis" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Pintasan bawaan" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Penekanan bawaan dari browser atau sistemmu." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Bersihkan tautan" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Membersihkan mikrofonmu agar suara lebih jernih." @@ -8985,7 +8989,7 @@ msgstr "Hubungkan kamera atau perangkat perekam virtual, lalu coba lagi." msgid "Connect a display, then try again." msgstr "Sambungkan layar, lalu coba lagi." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Sambungkan mikrofon dan coba lagi." @@ -10672,8 +10676,8 @@ msgstr "Kustom" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Potong" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Memotong audio di bawah ambang kenyaringan dengan penggunaan CPU minimal." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Tombol unduh" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Unduh aplikasi desktop" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Aktifkan" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Aktifkan izin {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Seluruh audio sistem" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Suara masuk" @@ -14330,8 +14334,8 @@ msgstr "Waktu malam" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Meratakan volume mikrofonmu agar suaramu tidak terlalu pelan." @@ -17360,7 +17364,7 @@ msgstr "Saya butuh cara lain" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Saya mengerti" @@ -17792,7 +17796,7 @@ msgstr "Di" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "Dalam mode \"Sistem operasi\", kamus yang tercantum di atas bersifat saran. {PRODUCT_NAME} akan meneruskan tag bahasa ini ke pemeriksa ejaan OS kamu jika didukung. Tag yang tidak dikenali akan diabaikan." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "Di browser, push-to-talk hanya berfungsi saat tab {PRODUCT_NAME} sedang aktif. Instal aplikasi desktop untuk push-to-talk di seluruh sistem." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Akses input telah diubah. Keluar sepenuhnya dan mulai ulang {productName} agar pintasan sistem dapat menggunakannya." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Input dan output" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Jaga kerahasiaan ini. Membuat ulang akan merusak integrasi yang ada." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Terus mengirimkan sinyal sebentar setelah tombol dilepas." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Tema terang" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Filter klasik ringan, berfungsi di perangkat apa pun." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Tampilan dan nuansa" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Sepertinya kamu menggunakan {0}. Menumpuk pemrosesan {PRODUCT_NAME} di atasnya dapat menyebabkan pumping atau distorsi. Input langsung meneruskan audiomu tanpa perubahan." @@ -21035,7 +21039,7 @@ msgstr "Mic" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Tes mikrofon" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Jaringan dan performa" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Filter neural yang menghilangkan sebagian besar suara bising di latar belakang." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Filter neural, bandwidth audio penuh." @@ -22690,7 +22694,7 @@ msgstr "Tidak ada yang cocok" msgid "No mentions yet" msgstr "Belum ada sebutan" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Tidak ada mikrofon yang ditemukan" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Kebisingan" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Noise gate" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Tidak ada" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Tidak ada" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Tombol push to talk" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Push-to-talk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Push-to-talk (terbatas)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Push-to-talk diabaikan dalam input langsung. Beralih ke suara terfokus atau kustom untuk menggunakannya." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Push-to-talk aktif. Tahan {pushToTalkHint} untuk bicara." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Push-to-talk hanya berfungsi saat {productName} dalam fokus hingga {permissionName} diaktifkan. Setelah mengubah izin, tutup sepenuhnya dan mulai ulang {productName} agar hotkey di seluruh sistem dapat menggunakannya." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Push-to-talk hanya berfungsi saat tab browser sedang aktif." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Direkomendasikan" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Direkomendasikan. Membersihkan mikrofonmu agar suara lebih jernih." @@ -26561,7 +26565,7 @@ msgstr "Relatif" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Jeda lepas tombol" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Pilih akun yang ingin kamu gunakan untuk masuk di perangkat barumu." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Pilih mode pemrosesan suara" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Pengiriman pesan dinonaktifkan di komunitas ini" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Mengirimkan kedua saluran mikrofon stereo. Membutuhkan semua pemrosesan nonaktif dan saluran pada 128 kbps atau lebih tinggi." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Mengirim audio mikrofon mentah tanpa pemrosesan." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Mengirim audiomu tanpa perubahan. Paling cocok jika kamu menggunakan perangkat lunak audio eksternal." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Mengirimkan audio mikrofonmu tanpa penekanan." @@ -30136,7 +30140,7 @@ msgstr "Kode singkat" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Langkah 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Mikrofon stereo" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Membuat anggota tidak dapat mendengar orang lain di komunitas ini" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Mencegah suara speaker terekam kembali oleh mikrofonmu." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Kualitas bagus dengan beban CPU sedang. Cadangan yang bagus di Chromium untuk berbagi layar." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Filter neural terkuat untuk ucapan, membatasi audio ke rentang ucapan." @@ -32539,7 +32543,7 @@ msgstr "Beralih ke tata letak nyaman" msgid "Switch to dense layout" msgstr "Beralih ke tata letak rapat" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Beralih ke input langsung" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Kecepatan TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Sesuaikan pemrosesan sendiri." @@ -37106,6 +37110,10 @@ msgstr "Menggunakan pusat notifikasi OS. Untuk kontrol per-saluran/per-komunitas msgid "Uses:" msgstr "Penggunaan:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Menggunakan {effectiveLabel} hingga {requestedLabel} siap." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Peserta obrolan suara" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Pemrosesan suara" @@ -38118,6 +38126,10 @@ msgstr "Aktifkan suara masuk" msgid "Voice unmute" msgstr "Aktifkan mikrofon" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Suara menggunakan perangkat output sistem Anda di browser ini. Ubah di pengaturan sistem Anda." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Dibatalkan" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Percakapan mana" msgid "Which rule was broken?" msgstr "Aturan mana yang dilanggar?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Saat push-to-talk aktif, pintasanmu yang mengontrol mikrofon, jadi tombol bisukan dinonaktifkan." diff --git a/fluxer_app/src/features/i18n/locales/it/messages.po b/fluxer_app/src/features/i18n/locales/it/messages.po index a8417b299..6a26ca27f 100644 --- a/fluxer_app/src/features/i18n/locales/it/messages.po +++ b/fluxer_app/src/features/i18n/locales/it/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} ha bisogno dell'accesso alla fotocamera per elencare i tuoi dispositivi." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} ha bisogno dell'accesso al microfono per elencare i tuoi dispositivi." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {membro} other {membri}} msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} non è stato possibile avviarlo. Utilizzo di {effectiveLabel} in alternativa." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Condivisione attività" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Soglia attività" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Indirizzo" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Regola tu stesso ogni impostazione: soppressione del rumore, cancellazione dell'eco e guadagno." @@ -3606,11 +3610,11 @@ msgstr "Consenti {everyoneMention} e {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Consenti a {PRODUCT_NAME} di accedere alla tua fotocamera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Consenti a {PRODUCT_NAME} di accedere al microfono in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Consenti a {PRODUCT_NAME} di accedere al microfono. Controlla la barra degli indirizzi o le impostazioni del browser." @@ -3713,7 +3717,7 @@ msgstr "Consenti ai membri senza il permesso {readMessageHistoryPermissionLabel} msgid "Allow mentions for this role" msgstr "Consenti menzioni per questo ruolo" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Consenti accesso al microfono" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Anteprima audio" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Elaborazione audio" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Rileva lingua automaticamente" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Soglia attività automatica" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Scorciatoie integrate" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Soppressione integrata dal tuo browser o sistema." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Pulisci link" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Ripulisce l’audio del microfono per rendere più chiara la voce." @@ -8985,7 +8989,7 @@ msgstr "Collega una fotocamera o un dispositivo di acquisizione virtuale, quindi msgid "Connect a display, then try again." msgstr "Collega un display, poi riprova." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Connetti un microfono e riprova." @@ -10672,8 +10676,8 @@ msgstr "Personalizzato" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Taglia" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Elimina l’audio al di sotto di una soglia di volume con un utilizzo minimo della CPU." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Pulsante di download" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Scarica l'app desktop" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Abilita" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Abilita l'autorizzazione {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Audio dell’intero sistema" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Suono d'ingresso" @@ -14330,8 +14334,8 @@ msgstr "Sera" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Uniforma il volume del microfono per evitare che la tua voce sia troppo bassa." @@ -17360,7 +17364,7 @@ msgstr "Ho bisogno di un altro metodo" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Ho capito" @@ -17792,7 +17796,7 @@ msgstr "In" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "In modalità \"Sistema operativo\", i dizionari elencati sopra sono indicativi. {PRODUCT_NAME} passerà questi tag lingua al correttore ortografico del tuo sistema operativo, se supportato. I tag non riconosciuti verranno ignorati." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "In un browser, il push-to-talk funziona solo quando la scheda di {PRODUCT_NAME} è attiva. Installa l’app desktop per usare il push-to-talk a livello di sistema." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "L'accesso all'input è stato modificato. Esci completamente e riavvia {productName} in modo che possa usare le scorciatoie di sistema." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Input e output" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Conservale al sicuro. La rigenerazione interromperà le integrazioni esistenti." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Continua a trasmettere per breve tempo dopo aver rilasciato il pulsante." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Tema chiaro" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Filtro classico leggero, funziona su qualsiasi dispositivo." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Aspetto" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Sembra che tu stia usando {0}. L'elaborazione di {PRODUCT_NAME} in aggiunta può causare pumping o distorsione. L'input diretto lascia il tuo audio inalterato." @@ -21035,7 +21039,7 @@ msgstr "Microfono" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Prova microfono" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Rete e prestazioni" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Filtro neurale che rimuove la maggior parte dei rumori di sottofondo." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Filtro neurale, larghezza di banda audio completa." @@ -22690,7 +22694,7 @@ msgstr "Nessun risultato" msgid "No mentions yet" msgstr "Nessuna menzione ancora" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Nessun microfono trovato" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Rumore" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Noise gate" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Nessuno" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Nessuno" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Tasto \"Premi per parlare\"" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Push-to-talk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Premi per parlare (limitato)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Il push-to-talk viene ignorato in modalità \"Input diretto\". Passa a \"Voce isolata\" o \"Personalizzato\" per usarlo." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Push-to-talk attivo. Tieni premuto {pushToTalkHint} per parlare." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Il push-to-talk funziona solo quando {productName} è in primo piano finché non viene abilitato {permissionName}. Dopo aver modificato l'autorizzazione, chiudi completamente e riavvia {productName} in modo che i tasti di scelta rapida a livello di sistema possano usarlo." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Il \"Premi per parlare\" funziona solo quando la scheda del browser è attiva." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Consigliato" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Consigliato. Migliora l'audio del microfono per una voce più chiara." @@ -26561,7 +26565,7 @@ msgstr "Relativo" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Ritardo di rilascio" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Seleziona l'account con cui vuoi accedere sul tuo nuovo dispositivo." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Seleziona la modalità di elaborazione vocale" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "L'invio di messaggi è disabilitato in questa community" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Invia entrambi i canali di un microfono stereo. Richiede l'elaborazione disattivata e un canale a 128 kbps o superiore." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Invia l'audio grezzo del microfono senza elaborazione." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Invia l'audio senza modifiche. Ideale se usi software audio esterni." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Invia l’audio del tuo microfono senza soppressione del rumore." @@ -30136,7 +30140,7 @@ msgstr "Codici brevi" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Passaggio 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Microfono stereo" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Impedito al membro di sentire gli altri in questa community" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Impedisce all'audio degli altoparlanti di rientrare nel microfono." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Qualità elevata con un consumo moderato di CPU. Ottima opzione di riserva per la condivisione dello schermo su Chromium." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Filtro neurale più potente per la voce, limita l'audio all'intervallo vocale." @@ -32539,7 +32543,7 @@ msgstr "Passa al layout ampio" msgid "Switch to dense layout" msgstr "Passa al layout compatto" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Passa all'input diretto" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Velocità TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Regola tu stesso l'elaborazione." @@ -37106,6 +37110,10 @@ msgstr "Usa il centro notifiche del sistema operativo. Per i controlli dei singo msgid "Uses:" msgstr "Utilizzi:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Utilizzo di {effectiveLabel} finché {requestedLabel} non sarà pronto." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Partecipanti alla chat vocale" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Elaborazione voce" @@ -38118,6 +38126,10 @@ msgstr "Audio riattivato" msgid "Voice unmute" msgstr "Microfono riattivato" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "La voce utilizza il dispositivo di output del tuo sistema in questo browser. Modificalo nelle impostazioni di sistema." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Annullato" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Quali conversazioni" msgid "Which rule was broken?" msgstr "Quale regola è stata infranta?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Quando il push-to-talk è attivo, la scorciatoia controlla il microfono, quindi il pulsante per disattivarlo è disabilitato." diff --git a/fluxer_app/src/features/i18n/locales/ja/messages.po b/fluxer_app/src/features/i18n/locales/ja/messages.po index d3504182f..944f3f40a 100644 --- a/fluxer_app/src/features/i18n/locales/ja/messages.po +++ b/fluxer_app/src/features/i18n/locales/ja/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName}がデバイスを一覧表示するには、カメラへのアクセスが必要です。" #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName}がデバイスを一覧表示するには、マイクへのアクセスが必要です。" @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount}{memberCount, plural, one {人のメンバー} othe msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount}人がオンライン" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} を開始できませんでした。代わりに {effectiveLabel} を使用します。" + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "アクティビティの共有" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "アクティビティしきい値" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "アドレス" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "ノイズ抑制、エコーキャンセル、ゲインを自分で調整します。" @@ -3606,11 +3610,11 @@ msgstr "{everyoneMention}と{hereMention}を許可する" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "{MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME} で、{PRODUCT_NAME}がカメラにアクセスすることを許可してください。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "{PRODUCT_NAME}がマイクにアクセスできるようにするには、{MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}で設定してください。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "{PRODUCT_NAME}がマイクにアクセスすることを許可してください。ブラウザのアドレスバーまたは設定を確認してください。" @@ -3713,7 +3717,7 @@ msgstr "「{readMessageHistoryPermissionLabel}」権限がないメンバーが msgid "Allow mentions for this role" msgstr "このロールへのメンションを許可" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "マイクを許可" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "音声プレビュー" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "音声処理" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "言語を自動検出" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "アクティビティしきい値を自動設定" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "組み込みショートカット" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "ブラウザまたはシステムに組み込まれたノイズ抑制機能です。" @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "リンクを整理" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "マイクの音声をクリアにします。" @@ -8985,7 +8989,7 @@ msgstr "カメラまたは仮想キャプチャデバイスを接続してから msgid "Connect a display, then try again." msgstr "ディスプレイを接続してから、もう一度お試しください。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "マイクを接続して、もう一度お試しください。" @@ -10672,8 +10676,8 @@ msgstr "カスタム" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "切り取り" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "ラウドネスのしきい値を下回る音声をカットします。CPU負荷は最小限です。" @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "ダウンロードボタン" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "デスクトップ版アプリをダウンロード" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "有効にする" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "{permissionName}の権限を有効にする" @@ -14220,7 +14224,7 @@ msgstr "システム全体の音声" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "入室サウンド" @@ -14330,8 +14334,8 @@ msgstr "夜" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "マイクの音量を均一にして、小さくなりすぎないようにします。" @@ -17360,7 +17364,7 @@ msgstr "別の方法を試す" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "内容を理解しました" @@ -17792,7 +17796,7 @@ msgstr "チャンネル内" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "「OS」モードでは、上記の辞書は参考として扱われます。{PRODUCT_NAME}は、サポートされている場合、これらの言語タグをOSのスペルチェッカーに渡します。認識されないタグは無視されます。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "ブラウザでは、プッシュトゥトークは{PRODUCT_NAME}タブがフォーカスされている間のみ機能します。システム全体でプッシュトゥトークを使用するには、デスクトップアプリをインストールしてください。" @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "入力アクセスが変更されました。システム全体のショートカットが使用できるように、{productName}を完全に終了して再起動してください。" #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "入力と出力" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "これらは安全に保管してください。再生成すると、既存の連携が動作しなくなります。" #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "ボタンを離した後も、しばらく送信し続けます。" @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "ライトテーマ" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "軽量なクラシックフィルター。あらゆるデバイスで動作します。" @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "見た目と操作感" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "{0}をお使いのようです。その上に{PRODUCT_NAME}の処理を重ねると、ポンピングや歪みが発生する可能性があります。ダイレクト入力では、オーディオはそのまま通過します。" @@ -21035,7 +21039,7 @@ msgstr "マイク" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "マイクテスト" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "ネットワークとパフォーマンス" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "バックグラウンドノイズのほとんどを除去するニューラルフィルター。" #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "ニューラルフィルター、フルオーディオ帯域幅。" @@ -22690,7 +22694,7 @@ msgstr "一致する項目はありません" msgid "No mentions yet" msgstr "メンションはまだありません" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "マイクが見つかりません" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "ノイズ" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "ノイズゲート" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "なし" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "なし" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "プッシュトゥトークキー" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "プッシュトゥトーク" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "プッシュトゥトーク(制限あり)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "ダイレクト入力ではプッシュトゥトークは無視されます。使用するには「音声にフォーカス」または「カスタム」に切り替えてください。" @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "プッシュトゥトークがオンです。{pushToTalkHint}を押している間は話せます。" #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "{permissionName}を有効にするまで、{productName}はフォーカスされている間のみプッシュトゥトークが機能します。権限を変更した後、システム全体のホットキーを使用できるように、{productName}を完全に終了して再起動してください。" #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "プッシュトゥトークは、ブラウザのタブがアクティブな場合にのみ機能します。" @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "おすすめ" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "おすすめ。マイクの音声をクリアにして、聞き取りやすくします。" @@ -26561,7 +26565,7 @@ msgstr "相対" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "離した後の遅延" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "新しいデバイスでサインインするアカウントを選択してください。" #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "音声処理モードを選択" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "このコミュニティではメッセージを送信できません" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "ステレオマイクの全チャンネルを送信します。すべての処理をオフにし、チャンネルを128kbps以上に設定する必要があります。" #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "マイク音声を処理せずにそのまま送信します。" #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "音声を加工せずに送信します。外部のオーディオソフトウェアを使用している場合に最適です。" #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "ノイズ抑制をかけずにマイクの音声を送信します。" @@ -30136,7 +30140,7 @@ msgstr "ショートコード" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "ステップ4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "ステレオマイク" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "このコミュニティで他のメンバーの声が聞こえないようにしました" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "スピーカーの音がマイクに入り込むのを防ぎます。" @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "CPU負荷を抑えつつ高品質を維持。画面共有時のChromiumの代替として有効です。" #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "音声の範囲にオーディオを制限する、最も強力なニューラルフィルターです。" @@ -32539,7 +32543,7 @@ msgstr "ゆったり表示に切り替える" msgid "Switch to dense layout" msgstr "コンパクト表示に切り替える" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "直接入力に切り替える" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS再生速度" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "処理を自分で調整します。" @@ -37106,6 +37110,10 @@ msgstr "OSの通知センターを使用します。チャンネルごと、コ msgid "Uses:" msgstr "使用回数:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "{effectiveLabel} が準備できるまで {requestedLabel} を使用します。" + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "通話の参加者" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "音声処理" @@ -38118,6 +38126,10 @@ msgstr "スピーカーミュート解除" msgid "Voice unmute" msgstr "音声ミュート解除" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "このブラウザでは、ボイスはシステムの出力デバイスを使用します。システム設定で変更してください。" + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "無効" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "会話の種類" msgid "Which rule was broken?" msgstr "違反しているルールはどれですか?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "プッシュトゥトークがオンの場合、ショートカットでマイクを操作するため、ミュートボタンは無効になります。" diff --git a/fluxer_app/src/features/i18n/locales/ko/messages.po b/fluxer_app/src/features/i18n/locales/ko/messages.po index 301291f1b..280377cf0 100644 --- a/fluxer_app/src/features/i18n/locales/ko/messages.po +++ b/fluxer_app/src/features/i18n/locales/ko/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName}에서 기기 목록을 보려면 카메라 접근 권한이 필요합니다." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName}에서 기기 목록을 보려면 마이크 접근 권한이 필요합니다." @@ -1866,6 +1866,10 @@ msgstr "멤버 {renderedMemberCount}{memberCount, plural, one {명} other {명}} msgid "{renderedPresenceCount} online" msgstr "온라인 {renderedPresenceCount}명" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel}을(를) 시작할 수 없습니다. 대신 {effectiveLabel}을(를) 사용합니다." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "활동 공유" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "활동 임계값" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "주소" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "노이즈 억제, 에코 제거, 게인 등 각 설정을 직접 조정하세요." @@ -3606,11 +3610,11 @@ msgstr "{everyoneMention} 및 {hereMention} 허용" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "{PRODUCT_NAME}이(가) {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}에서 카메라에 접근하도록 허용하세요." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "{PRODUCT_NAME}이(가) 마이크에 접근하도록 허용하려면 {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}에서 설정해 주세요." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "{PRODUCT_NAME}에서 마이크에 접근하도록 허용해 주세요. 브라우저 주소 표시줄 또는 설정을 확인하세요." @@ -3713,7 +3717,7 @@ msgstr "{readMessageHistoryPermissionLabel} 권한이 없는 멤버가 특정 msgid "Allow mentions for this role" msgstr "이 역할에 대한 멘션 허용" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "마이크 허용" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "오디오 미리보기" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "오디오 처리" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "언어 자동 감지" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "활동 임계값 자동 설정" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "내장 단축키" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "브라우저 또는 시스템의 기본 제공 기능으로 노이즈를 줄입니다." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "링크 정리" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "마이크 소리를 다듬어 음성을 선명하게 만듭니다." @@ -8985,7 +8989,7 @@ msgstr "카메라 또는 가상 캡처 장치를 연결한 후 다시 시도하 msgid "Connect a display, then try again." msgstr "디스플레이를 연결한 다음 다시 시도하세요." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "마이크를 연결하고 다시 시도하세요." @@ -10672,8 +10676,8 @@ msgstr "사용자 지정" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "잘라내기" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "음량 임계값보다 작은 소리를 차단하며 CPU 사용량이 매우 적습니다." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "다운로드 버튼" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "데스크톱 앱 다운로드" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "활성화" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "{permissionName} 권한 허용" @@ -14220,7 +14224,7 @@ msgstr "시스템 오디오 전체" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "입장음" @@ -14330,8 +14334,8 @@ msgstr "저녁 시간" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "마이크 볼륨을 일정하게 조절하여 너무 작게 들리지 않도록 합니다." @@ -17360,7 +17364,7 @@ msgstr "다른 방법이 필요해요" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "확인했습니다" @@ -17792,7 +17796,7 @@ msgstr "채널 내" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "\"운영체제\" 모드에서는 위에 나열된 사전이 권장 사항입니다. {PRODUCT_NAME}은 지원되는 경우 이러한 언어 태그를 OS 맞춤법 검사기에 전달합니다. 인식하지 못하는 태그는 무시됩니다." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "브라우저에서는 {PRODUCT_NAME} 탭이 활성화된 경우에만 PTT(Push-to-talk)가 작동합니다. 시스템 전체에서 PTT를 사용하려면 데스크톱 앱을 설치하세요." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "입력 접근 권한이 변경되었습니다. 시스템 전체 단축키를 사용할 수 있도록 {productName}을(를) 완전히 종료한 후 다시 시작하세요." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "입력 및 출력" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "안전하게 보관하세요. 재생성하면 기존 연동이 중단됩니다." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "버튼을 놓은 후에도 잠시 동안 전송을 유지합니다." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "라이트 테마" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "모든 기기에서 작동하는 가벼운 클래식 필터입니다." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "모양 및 느낌" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "{0}을(를) 사용 중이신 것 같습니다. {PRODUCT_NAME}의 처리를 추가하면 펌핑 또는 왜곡이 발생할 수 있습니다. 직접 입력은 오디오를 그대로 통과시킵니다." @@ -21035,7 +21039,7 @@ msgstr "마이크" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "마이크 테스트" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "네트워킹 및 성능" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "배경 소음을 대부분 제거하는 신경망 필터입니다." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "신경망 필터, 전체 오디오 대역폭." @@ -22690,7 +22694,7 @@ msgstr "일치하는 항목 없음" msgid "No mentions yet" msgstr "아직 멘션이 없습니다" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "마이크를 찾을 수 없습니다" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "노이즈" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "노이즈 게이트" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "없음" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "사용 안 함" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "눌러서 말하기 키" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "눌러서 말하기" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "눌러서 말하기 (제한됨)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "원본 입력에서는 눌러서 말하기가 무시됩니다. 사용하려면 음성 포커스 또는 사용자 지정으로 전환하세요." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "눌러서 말하기가 켜져 있습니다. {pushToTalkHint} 키를 누른 채 말하세요." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "{permissionName}을(를) 활성화하기 전까지는 {productName}이(가) 포커스된 상태에서만 눌러서 말하기가 작동합니다. 권한을 변경한 후에는 {productName}을(를) 완전히 종료하고 다시 시작해야 시스템 전체 단축키를 사용할 수 있습니다." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "눌러서 말하기는 브라우저 탭이 활성화된 상태에서만 작동합니다." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "권장" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "권장. 마이크 소리를 다듬어 말소리를 선명하게 만듭니다." @@ -26561,7 +26565,7 @@ msgstr "상대 시간" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "해제 지연 시간" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "새 기기에서 로그인할 계정을 선택하세요." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "음성 처리 모드 선택" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "이 커뮤니티에서는 메시지 전송이 비활성화되어 있습니다" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "스테레오 마이크의 두 채널을 모두 보냅니다. 모든 처리를 끄고 채널당 128kbps 이상이 필요합니다." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "처리되지 않은 마이크 오디오를 전송합니다." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "오디오를 그대로 보냅니다. 외부 오디오 소프트웨어를 사용하는 경우에 가장 적합합니다." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "마이크 오디오를 전혀 필터링하지 않고 전송합니다." @@ -30136,7 +30140,7 @@ msgstr "단축 코드" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "4단계" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "스테레오 마이크" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "이 커뮤니티에서 멤버가 다른 사람의 소리를 듣지 못하도록 차단했습니다" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "스피커 소리가 마이크로 다시 들어가는 것을 방지합니다." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "CPU 사용량은 보통이면서 품질이 우수합니다. 화면 공유 시 Chromium 대체 코덱으로 적합합니다." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "음성에 가장 강력한 신경망 필터입니다. 오디오를 음성 대역으로 제한합니다." @@ -32539,7 +32543,7 @@ msgstr "편안한 레이아웃으로 전환" msgid "Switch to dense layout" msgstr "간결한 레이아웃으로 전환" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "직접 입력으로 전환" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS 속도" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "직접 처리 방식을 설정하세요." @@ -37106,6 +37110,10 @@ msgstr "OS 알림 센터를 사용합니다. 채널/커뮤니티별 설정은 msgid "Uses:" msgstr "사용 횟수:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "{effectiveLabel}이 준비될 때까지 {requestedLabel}을(를) 사용합니다." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "음성 참여자" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "음성 처리" @@ -38118,6 +38126,10 @@ msgstr "음성 소리 켜기" msgid "Voice unmute" msgstr "음성 음소거 해제" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "음성에는 이 브라우저의 시스템 출력 기기가 사용됩니다. 시스템 설정에서 변경하세요." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "무효" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "대화 선택" msgid "Which rule was broken?" msgstr "어떤 규칙이 위반되었나요?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "눌러서 말하기가 켜져 있는 동안에는 단축키로 마이크를 제어하므로 음소거 버튼이 비활성화됩니다." diff --git a/fluxer_app/src/features/i18n/locales/lt/messages.po b/fluxer_app/src/features/i18n/locales/lt/messages.po index 5de48ed5b..50339c8fb 100644 --- a/fluxer_app/src/features/i18n/locales/lt/messages.po +++ b/fluxer_app/src/features/i18n/locales/lt/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} reikia prieigos prie kameros, kad būtų galima parodyti jūsų įrenginius." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} reikia prieigos prie mikrofono, kad būtų galima parodyti jūsų įrenginius." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {narys} few {nariai} man msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} prisijungę" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "Nepavyko paleisti {requestedLabel}. Vietoj jo naudojamas {effectiveLabel}." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Dalijimasis veikla" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Aktyvumo slenkstis" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adresas" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Reguliuokite kiekvieną nustatymą patys: triukšmo slopinimą, aido slopinimą ir stiprinimą." @@ -3606,11 +3610,11 @@ msgstr "Leisti {everyoneMention} ir {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Leiskite {PRODUCT_NAME} pasiekti jūsų kamerą: {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Leiskite {PRODUCT_NAME} pasiekti jūsų mikrofoną: {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Leiskite {PRODUCT_NAME} pasiekti jūsų mikrofoną. Patikrinkite naršyklės adreso juostą arba nustatymus." @@ -3713,7 +3717,7 @@ msgstr "Leisti nariams be leidimo „{readMessageHistoryPermissionLabel}“ maty msgid "Allow mentions for this role" msgstr "Leisti paminėti šį vaidmenį" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Leisti naudoti mikrofoną" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Garso peržiūra" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Garso apdorojimas" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Automatiškai aptikti kalbą" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Automatiškai nustatyti aktyvumo slenkstį" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Integruoti spartieji klavišai" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Integruotas jūsų naršyklės arba sistemos slopinimas." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "nuorodų valymas" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Išvalo mikrofono garsą, kad kalba būtų aiški." @@ -8985,7 +8989,7 @@ msgstr "Prijunkite kamerą arba virtualų fiksavimo įrenginį ir bandykite dar msgid "Connect a display, then try again." msgstr "Prijunkite ekraną ir bandykite dar kartą." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Prijunkite mikrofoną ir bandykite dar kartą." @@ -10672,8 +10676,8 @@ msgstr "Pasirinktinis šaltinis" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Iškirpti" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Nukerta garsą, tylesnį už nustatytą ribą, ir beveik nenaudoja procesoriaus." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Atsisiuntimo mygtukas" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Atsisiųsti darbalaukio programėlę" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Įjungti" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Įjungti {permissionName} leidimą" @@ -14220,7 +14224,7 @@ msgstr "Visos sistemos garsas" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Įėjimo garsas" @@ -14330,8 +14334,8 @@ msgstr "Vakaras" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Sulygina mikrofono garsumą, kad jūsų balsas nebūtų per tylus." @@ -17361,7 +17365,7 @@ msgstr "Man reikia kito būdo" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Supratau" @@ -17793,7 +17797,7 @@ msgstr "Kanale" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "Režimu „Operacinė sistema“ aukščiau išvardyti žodynai yra tik patariamieji. {PRODUCT_NAME} perduos šias kalbų žymas jūsų OS rašybos tikrintuvui, kai tai bus palaikoma. Žymų, kurių jis neatpažįsta, bus nepaisoma." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "Naršyklėje funkcija „Kalbėti paspaudus“ veikia tik tada, kai {PRODUCT_NAME} skirtukas yra aktyvus. Įdiekite darbalaukio programą, kad ji veiktų visoje sistemoje." @@ -18084,7 +18088,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Pakeista įvesties prieiga. Visiškai išjunkite ir iš naujo paleiskite „{productName}“, kad sistemos spartieji klavišai galėtų ja naudotis." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Įvestis ir išvestis" @@ -18951,7 +18955,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Saugokite juos. Sugeneravus iš naujo, esamos integracijos nutrūks." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Tęsti perdavimą trumpą laiką po mygtuko atleidimo." @@ -19418,7 +19422,7 @@ msgid "Light theme" msgstr "Šviesi tema" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Lengvas klasikinis filtras, veikia bet kuriame įrenginyje." @@ -19783,7 +19787,7 @@ msgid "Look and feel" msgstr "Išvaizda ir stilius" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Panašu, kad naudojate „{0}“. Papildomas „{PRODUCT_NAME}“ apdorojimas gali sukelti garso pulsavimą arba iškraipymus. Tiesioginė įvestis perduoda jūsų garsą nepakeistą." @@ -21036,7 +21040,7 @@ msgstr "Mikrofonas" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Mikrofono patikra" @@ -22115,12 +22119,12 @@ msgid "Networking and performance" msgstr "Tinklas ir našumas" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Neuroninis filtras, pašalinantis daugumą foninio triukšmo." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Neuroninis filtras, visa garso dažnių juosta." @@ -22691,7 +22695,7 @@ msgstr "Nieko nerasta" msgid "No mentions yet" msgstr "Kol kas nėra paminėjimų" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Mikrofonas nerastas" @@ -22986,7 +22990,7 @@ msgid "Noise" msgstr "Triukšmas" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Triukšmo slenkstis" @@ -23023,7 +23027,7 @@ msgid "None" msgstr "Nėra" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Nėra" @@ -25991,18 +25995,18 @@ msgid "Push to talk key" msgstr "Kalbėjimo paspaudus klavišas" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Kalbėjimas paspaudus" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Kalbėjimas paspaudus (ribotas)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Kalbėjimas paspaudus tiesioginėje įvestyje ignoruojamas. Norėdami jį naudoti, perjunkite į fokusuotą balsą arba pasirinktinį." @@ -26012,12 +26016,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Įjungtas kalbėjimas paspaudus. Laikykite {pushToTalkHint}, kad kalbėtumėte." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Kalbėjimas paspaudus veikia tik tada, kai „{productName}“ langas yra aktyvus, kol neįjungtas „{permissionName}“. Pakeitę leidimą, visiškai išjunkite ir iš naujo paleiskite „{productName}“, kad sistemos spartieji klavišai galėtų jį naudoti." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Kalbėjimas paspaudus veikia tik tada, kai naršyklės skirtukas yra aktyvus." @@ -26302,7 +26306,7 @@ msgid "Recommended" msgstr "Rekomenduojama" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Rekomenduojama. Išvalo mikrofoną, kad kalba būtų aiški." @@ -26562,7 +26566,7 @@ msgstr "Santykinis" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Atleidimo delsa" @@ -29288,7 +29292,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Pasirinkite paskyrą, su kuria norite prisijungti naujame įrenginyje." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Pasirinkite balso apdorojimo režimą" @@ -29608,22 +29612,22 @@ msgid "Sending messages is disabled in this community" msgstr "Šioje bendruomenėje žinučių siuntimas išjungtas" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Siunčia abu stereo mikrofono kanalus. Reikia išjungti visą apdorojimą ir naudoti 128 kbps ar didesnį kanalo bitų dažnį." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Siunčia neapdorotą mikrofono garsą be apdorojimo." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Siunčia jūsų garsą be pakeitimų. Geriausia, jei naudojate išorinę garso programinę įrangą." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Siunčia jūsų mikrofono garsą be jokio slopinimo." @@ -30137,7 +30141,7 @@ msgstr "Trumpieji kodai" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31933,7 +31937,7 @@ msgid "Step 4" msgstr "4 žingsnis" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereofoninis mikrofonas" @@ -32205,7 +32209,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Sustabdytas nario gebėjimas girdėti kitus šioje bendruomenėje" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Neleidžia garsiakalbių garsui grįžti atgal į mikrofoną." @@ -32335,7 +32339,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Gera kokybė, vidutinės procesoriaus sąnaudos. Geras atsarginis Chromium variantas ekranui bendrinti." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Stipriausias neuroninis kalbos filtras. Apriboja garsą iki kalbos diapazono." @@ -32540,7 +32544,7 @@ msgstr "Perjungti į patogų išdėstymą" msgid "Switch to dense layout" msgstr "Perjungti į tankų išdėstymą" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Perjungti į tiesioginį įvedimą" @@ -35127,7 +35131,7 @@ msgid "TTS speed" msgstr "TTS greitis" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Sureguliuokite apdorojimą patys." @@ -37107,6 +37111,10 @@ msgstr "Naudoja OS pranešimų centrą. Norėdami valdyti pranešimus pagal kana msgid "Uses:" msgstr "Naudojimų skaičius:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Kol {requestedLabel} bus paruoštas, naudojamas {effectiveLabel}." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38073,8 +38081,8 @@ msgid "Voice participants" msgstr "Balso pokalbio dalyviai" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Balso apdorojimas" @@ -38119,6 +38127,10 @@ msgstr "Garso įjungimas" msgid "Voice unmute" msgstr "Mikrofono įjungimas" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Šioje naršyklėje balso pokalbiams naudojamas sistemos garso išvesties įrenginys. Pakeiskite jį sistemos nustatymuose." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38129,7 +38141,7 @@ msgstr "Anuliuota" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38802,7 +38814,7 @@ msgstr "Kurie pokalbiai" msgid "Which rule was broken?" msgstr "Kokia taisyklė buvo pažeista?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Kai įjungtas kalbėjimas paspaudus, mikrofoną valdo jūsų spartusis klavišas, todėl nutildymo mygtukas išjungtas." diff --git a/fluxer_app/src/features/i18n/locales/nl/messages.po b/fluxer_app/src/features/i18n/locales/nl/messages.po index 97e32d43b..000f8511e 100644 --- a/fluxer_app/src/features/i18n/locales/nl/messages.po +++ b/fluxer_app/src/features/i18n/locales/nl/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} heeft cameratoegang nodig om je apparaten weer te geven." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} heeft microfoontoegang nodig om je apparaten weer te geven." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {lid} other {leden}}" msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} kon niet starten. In plaats daarvan wordt {effectiveLabel} gebruikt." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Activiteit delen" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Activiteitsdrempel" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adres" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Pas elke instelling zelf aan: ruisonderdrukking, echo-onderdrukking en versterking." @@ -3606,11 +3610,11 @@ msgstr "Sta {everyoneMention} en {hereMention} toe" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Sta {PRODUCT_NAME} toe om je camera te gebruiken in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Geef {PRODUCT_NAME} toegang tot je microfoon via {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Sta {PRODUCT_NAME} toe om je microfoon te gebruiken. Controleer de adresbalk of instellingen van je browser." @@ -3713,7 +3717,7 @@ msgstr "Sta leden zonder de machtiging \"{readMessageHistoryPermissionLabel}\" t msgid "Allow mentions for this role" msgstr "Vermeldingen voor deze rol toestaan" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Microfoontoegang toestaan" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Audiovoorbeeld" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Audioverwerking" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Taal automatisch detecteren" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Activiteitsdrempel automatisch instellen" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Ingebouwde sneltoetsen" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Ingebouwde ruisonderdrukking van je browser of systeem." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Link opschonen" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Maakt je microfoongeluid helderder zodat je goed verstaanbaar bent." @@ -8985,7 +8989,7 @@ msgstr "Sluit een camera of virtueel opnameapparaat aan en probeer het opnieuw." msgid "Connect a display, then try again." msgstr "Sluit een beeldscherm aan en probeer het opnieuw." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Sluit een microfoon aan en probeer het opnieuw." @@ -10672,8 +10676,8 @@ msgstr "Aangepast" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Knippen" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Dempt geluid onder een volumedrempel met minimaal CPU-gebruik." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Downloadknop" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Desktopapp downloaden" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Inschakelen" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Machtiging {permissionName} inschakelen" @@ -14220,7 +14224,7 @@ msgstr "Volledige systeemaudio" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Binnenkomstgeluid" @@ -14330,8 +14334,8 @@ msgstr "Avond" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Maakt je microfoonvolume gelijkmatiger zodat je niet te zacht klinkt." @@ -17360,7 +17364,7 @@ msgstr "Ik heb een andere manier nodig" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Ik begrijp het" @@ -17792,7 +17796,7 @@ msgstr "In" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "In de modus \"Besturingssysteem\" zijn de hierboven vermelde woordenboeken alleen bedoeld als suggestie. {PRODUCT_NAME} geeft deze taaltags door aan de spellingcontrole van je besturingssysteem, als dat wordt ondersteund. Onbekende tags worden genegeerd." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "In een browser werkt push-to-talk alleen als het tabblad van {PRODUCT_NAME} actief is. Installeer de desktopapp voor systeembrede push-to-talk." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "De invoertoegang is gewijzigd. Sluit {productName} volledig af en start de app opnieuw op, zodat systeembrede sneltoetsen deze toegang kunnen gebruiken." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Invoer en uitvoer" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Bewaar deze goed. Als je ze opnieuw genereert, werken bestaande integraties niet meer." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Blijf kort uitzenden nadat de knop is losgelaten." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Licht thema" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Lichtgewicht klassiek filter dat op elk apparaat werkt." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Uiterlijk" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Het lijkt erop dat je {0} gebruikt. Als je daar de audioverwerking van {PRODUCT_NAME} bovenop toepast, kan dit pompend geluid of vervorming veroorzaken. Directe invoer stuurt je audio onbewerkt door." @@ -21035,7 +21039,7 @@ msgstr "Microfoon" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Microfoontest" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Netwerk en prestaties" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Neuraal filter dat de meeste achtergrondruis verwijdert." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Neuraal filter met het volledige frequentiebereik voor audio." @@ -22690,7 +22694,7 @@ msgstr "Geen resultaten gevonden" msgid "No mentions yet" msgstr "Nog geen vermeldingen" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Geen microfoon gevonden" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Ruis" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Ruispoort" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Geen" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Geen" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Push-to-talk-toets" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Push-to-talk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Push-to-talk (beperkt)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Push-to-talk wordt genegeerd bij directe invoer. Schakel over naar gerichte spraak of aangepast om het te gebruiken." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Push-to-talk is ingeschakeld. Houd {pushToTalkHint} ingedrukt om te spreken." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Push-to-talk werkt alleen als {productName} actief is totdat {permissionName} is ingeschakeld. Sluit {productName} na het wijzigen van de toestemming volledig af en start de app opnieuw op, zodat systeembrede sneltoetsen kunnen werken." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Push-to-talk werkt alleen als het browsertabblad is geselecteerd." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Aanbevolen" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Aanbevolen. Verbetert je microfoongeluid voor duidelijke spraak." @@ -26561,7 +26565,7 @@ msgstr "Relatief" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Vertraging bij loslaten" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Selecteer het account waarmee je wilt inloggen op je nieuwe apparaat." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Selecteer spraakverwerkingsmodus" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Berichten versturen is uitgeschakeld in deze community" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Verstuurt beide kanalen van een stereomicrofoon. Vereist dat alle verwerking is uitgeschakeld en een kanaal van 128 kbps of hoger." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Verstuurt onbewerkte microfoonaudio zonder verwerking." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Verstuurt je audio onbewerkt. Het beste als je externe audiosoftware gebruikt." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Verstuurt je microfoonaudio zonder ruisonderdrukking." @@ -30136,7 +30140,7 @@ msgstr "Korte codes" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Stap 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereomicrofoon" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Ervoor gezorgd dat het lid anderen in deze community niet meer hoort" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Voorkomt dat het geluid uit je luidsprekers weer door je microfoon wordt opgepikt." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Goede kwaliteit bij gemiddeld CPU-gebruik. Een goed alternatief voor schermdelen in Chromium." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Sterkste neurale filter voor spraak, beperkt audio tot het spraakbereik." @@ -32539,7 +32543,7 @@ msgstr "Overschakelen naar comfortabele lay-out" msgid "Switch to dense layout" msgstr "Overschakelen naar compacte lay-out" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Overschakelen naar directe invoer" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS-snelheid" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Pas de verwerking zelf aan." @@ -37106,6 +37110,10 @@ msgstr "Gebruikt het meldingencentrum van het besturingssysteem. Klik voor inste msgid "Uses:" msgstr "Aantal keren gebruikt:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "{effectiveLabel} wordt gebruikt totdat {requestedLabel} klaar is." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Deelnemers spraakoproep" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Spraakverwerking" @@ -38118,6 +38126,10 @@ msgstr "Geluid inschakelen" msgid "Voice unmute" msgstr "Microfoon inschakelen" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Spraak gebruikt in deze browser het uitvoerapparaat van je systeem. Wijzig dit in je systeeminstellingen." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Ongeldig" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Welke gesprekken" msgid "Which rule was broken?" msgstr "Welke regel is overtreden?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Zolang push-to-talk is ingeschakeld, bedient je sneltoets je microfoon. Daarom is de knop om te dempen uitgeschakeld." diff --git a/fluxer_app/src/features/i18n/locales/no/messages.po b/fluxer_app/src/features/i18n/locales/no/messages.po index 15df6c2f8..a56c44ebc 100644 --- a/fluxer_app/src/features/i18n/locales/no/messages.po +++ b/fluxer_app/src/features/i18n/locales/no/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} trenger tilgang til kameraet for å vise enhetene dine." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} trenger mikrofontilgang for å vise enhetene dine." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {medlem} other {medlemme msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} pålogget" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} kunne ikke starte. Bruker {effectiveLabel} i stedet." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Aktivitetsdeling" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Aktivitetsterskel" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adresse" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Juster hver innstilling selv: støydemping, ekkodemping og forsterkning." @@ -3606,11 +3610,11 @@ msgstr "Tillat {everyoneMention} og {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Tillat {PRODUCT_NAME} å få tilgang til kameraet ditt i {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Gi {PRODUCT_NAME} tilgang til mikrofonen din i {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Tillat {PRODUCT_NAME} å få tilgang til mikrofonen din. Sjekk nettleserens adressefelt eller innstillinger." @@ -3713,7 +3717,7 @@ msgstr "Tillat medlemmer uten tillatelsen {readMessageHistoryPermissionLabel} å msgid "Allow mentions for this role" msgstr "Tillat omtaler for denne rollen" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Tillat mikrofontilgang" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Forhåndsvisning av lyd" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Lydbehandling" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Gjenkjenn språk automatisk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Angi aktivitetsterskel automatisk" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Innebygde snarveier" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Innebygd støydemping fra nettleseren eller systemet ditt." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Rens lenke" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Renser mikrofonlyden for tydelig tale." @@ -8985,7 +8989,7 @@ msgstr "Koble til et kamera eller en virtuell opptaksenhet, og prøv deretter p msgid "Connect a display, then try again." msgstr "Koble til en skjerm, og prøv igjen." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Koble til en mikrofon og prøv igjen." @@ -10672,8 +10676,8 @@ msgstr "Egendefinert" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Klipp ut" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Kutter lyd under en lydstyrketerskel med minimal CPU-bruk." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Last ned-knapp" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Last ned skrivebordsappen" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Aktiver" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Aktiver tillatelsen {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "All systemlyd" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Ankomstlyd" @@ -14330,8 +14334,8 @@ msgstr "Kveldstid" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Jevner ut mikrofonvolumet ditt slik at du ikke er for stille." @@ -17360,7 +17364,7 @@ msgstr "Jeg trenger en annen måte" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Jeg forstår" @@ -17792,7 +17796,7 @@ msgstr "I" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "I modusen «Operativsystem» er ordbøkene ovenfor veiledende. {PRODUCT_NAME} sender disse språkkodene til operativsystemets stavekontroll når det støttes. Koder som ikke gjenkjennes, blir ignorert." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "I en nettleser fungerer «Trykk for å snakke» bare når {PRODUCT_NAME}-fanen er i fokus. Installer skrivebordsappen for å bruke «Trykk for å snakke» i hele systemet." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Inndatatilgangen er endret. Avslutt {productName} helt og start appen på nytt slik at systemomfattende snarveier får tilgang." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Lyd inn og ut" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Oppbevar disse trygt. Hvis du genererer dem på nytt, vil eksisterende integrasjoner slutte å fungere." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Fortsett å sende lyd en kort stund etter at du slipper knappen." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Lyst tema" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Et klassisk filter med lav ressursbruk som fungerer på alle enheter." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Utseende og følelse" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Det ser ut som du bruker {0}. Hvis du legger til lydbehandlingen fra {PRODUCT_NAME} i tillegg, kan det føre til pumping eller forvrengning. Direkte inndata sender lyden din uendret gjennom." @@ -21035,7 +21039,7 @@ msgstr "Mikrofon" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Mikrofontest" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Nettverk og ytelse" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Nevralt filter som fjerner mesteparten av bakgrunnsstøyen." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Nevralt filter, full lydbåndbredde." @@ -22690,7 +22694,7 @@ msgstr "Ingen treff" msgid "No mentions yet" msgstr "Ingen omtaler ennå" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Ingen mikrofon funnet" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Støy" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Støyport" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Ingen" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Ingen" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Tast for trykk for å snakke" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Trykk for å snakke" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Trykk for å snakke (begrenset)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Trykk for å snakke ignoreres med «Direkte inndata». Bytt til «Tale i fokus» eller «Egendefinert» for å bruke det." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Trykk for å snakke er på. Hold inne {pushToTalkHint} for å snakke." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Trykk for å snakke fungerer bare når {productName} er i fokus, til {permissionName} er aktivert. Etter at du har endret tillatelsen, må du avslutte {productName} helt og starte appen på nytt slik at hurtigtaster kan brukes i hele systemet." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Trykk for å snakke fungerer bare når nettleserfanen er aktiv." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Anbefalt" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Anbefalt. Renser mikrofonlyden for tydelig tale." @@ -26561,7 +26565,7 @@ msgstr "Relativ" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Forsinkelse ved tastslipp" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Velg kontoen du vil logge på med på den nye enheten din." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Velg modus for talebehandling" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Sending av meldinger er deaktivert i dette fellesskapet" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Sender begge kanalene fra en stereomikrofon. Krever at all prosessering er av og en kanal på 128 kbps eller høyere." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Sender rå mikrofonlyd uten behandling." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Sender lyden din uendret. Best hvis du bruker ekstern lydprogramvare." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Sender mikrofonlyden din uten støyreduksjon." @@ -30136,7 +30140,7 @@ msgstr "Emojikoder" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Trinn 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereomikrofon" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Stoppet medlemmet fra å høre andre i dette fellesskapet" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Hindrer at lyden fra høyttalerne dine sendes tilbake til mikrofonen din." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "God kvalitet med moderat CPU-bruk. Et godt reservealternativ for skjermdeling i Chromium." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Det kraftigste nevrale filteret for tale. Begrenser lyden til frekvensområdet for tale." @@ -32539,7 +32543,7 @@ msgstr "Bytt til romslig oppsett" msgid "Switch to dense layout" msgstr "Bytt til kompakt oppsett" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Bytt til direkte inndata" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS-hastighet" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Juster behandlingen selv." @@ -37106,6 +37110,10 @@ msgstr "Bruker varslingssenteret i operativsystemet. For innstillinger per kanal msgid "Uses:" msgstr "Antall bruk:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Bruker {effectiveLabel} til {requestedLabel} er klar." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Taledeltakere" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Talebehandling" @@ -38118,6 +38126,10 @@ msgstr "Lyden slått på" msgid "Voice unmute" msgstr "Mikrofonen slått på" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Tale bruker systemets utdataenhet i denne nettleseren. Endre den i systeminnstillingene." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Annullert" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Hvilke samtaler" msgid "Which rule was broken?" msgstr "Hvilken regel ble brutt?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Når «Trykk for å snakke» er på, styrer snarveien mikrofonen din, så dempeknappen er deaktivert." diff --git a/fluxer_app/src/features/i18n/locales/pl/messages.po b/fluxer_app/src/features/i18n/locales/pl/messages.po index d32f60900..4697f0ae7 100644 --- a/fluxer_app/src/features/i18n/locales/pl/messages.po +++ b/fluxer_app/src/features/i18n/locales/pl/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} potrzebuje dostępu do kamery, aby wyświetlić Twoje urządzenia." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} potrzebuje dostępu do mikrofonu, aby wyświetlić Twoje urządzenia." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {członek} few {członk msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "Nie udało się uruchomić {requestedLabel}. Zamiast tego używany jest {effectiveLabel}." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Udostępnianie aktywności" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Próg aktywności" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adres" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Dostosuj samodzielnie każde ustawienie: redukcję szumów, tłumienie echa i wzmocnienie." @@ -3606,11 +3610,11 @@ msgstr "Zezwól na {everyoneMention} i {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Zezwól aplikacji {PRODUCT_NAME} na dostęp do kamery w obszarze {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Zezwól aplikacji {PRODUCT_NAME} na dostęp do mikrofonu w: {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Zezwól aplikacji {PRODUCT_NAME} na dostęp do mikrofonu. Sprawdź pasek adresu lub ustawienia przeglądarki." @@ -3713,7 +3717,7 @@ msgstr "Zezwól członkom bez uprawnienia „{readMessageHistoryPermissionLabel} msgid "Allow mentions for this role" msgstr "Zezwól na wzmianki dla tej roli" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Zezwól na dostęp do mikrofonu" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Odsłuch dźwięku" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Przetwarzanie dźwięku" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Automatyczne wykrywanie języka" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Automatyczne ustawianie progu aktywności" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Wbudowane skróty" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Redukcja szumów wbudowana w przeglądarkę lub system." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Wyczyść link" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Oczyszcza dźwięk mikrofonu, aby mowa była wyraźna." @@ -8985,7 +8989,7 @@ msgstr "Podłącz kamerę lub wirtualne urządzenie do przechwytywania, a nastę msgid "Connect a display, then try again." msgstr "Podłącz wyświetlacz, a następnie spróbuj ponownie." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Podłącz mikrofon i spróbuj ponownie." @@ -10672,8 +10676,8 @@ msgstr "Niestandardowe źródło" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Wytnij" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Wycisza dźwięk poniżej progu głośności, minimalnie obciążając procesor." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Przycisk pobierania" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Pobierz aplikację komputerową" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Włącz" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Włącz uprawnienie {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Dźwięk z całego systemu" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Dźwięk wejścia" @@ -14330,8 +14334,8 @@ msgstr "Wieczór" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Wyrównuje głośność mikrofonu, aby Twój głos nie był zbyt cichy." @@ -17360,7 +17364,7 @@ msgstr "Potrzebuję innej metody" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Rozumiem" @@ -17792,7 +17796,7 @@ msgstr "W" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "W trybie „System operacyjny” powyższa lista słowników ma charakter orientacyjny. {PRODUCT_NAME} przekaże te oznaczenia języków do systemowego modułu sprawdzania pisowni, jeśli jest to obsługiwane. Nierozpoznane oznaczenia zostaną zignorowane." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "W przeglądarce funkcja „naciśnij i mów” działa tylko wtedy, gdy karta {PRODUCT_NAME} jest aktywna. Zainstaluj aplikację komputerową, aby korzystać z tej funkcji w całym systemie." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Zmieniono dostęp do urządzeń wejściowych. Całkowicie zamknij i uruchom ponownie {productName}, aby skróty globalne mogły z niego korzystać." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Wejście i wyjście" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Zachowaj je w bezpiecznym miejscu. Wygenerowanie nowych spowoduje przerwanie istniejących integracji." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Kontynuuj transmisję przez krótki czas po zwolnieniu przycisku." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Jasny motyw" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Lekki, klasyczny filtr działający na każdym urządzeniu." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Wygląd i styl" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Wygląda na to, że używasz {0}. Dodatkowe przetwarzanie dźwięku przez {PRODUCT_NAME} może powodować pompowanie głośności lub zniekształcenia. Tryb „Bezpośrednie wejście” przepuszcza dźwięk bez zmian." @@ -21035,7 +21039,7 @@ msgstr "Mikrofon" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Test mikrofonu" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Sieć i wydajność" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Filtr neuronowy usuwający większość dźwięków z tła." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Filtr neuronowy, pełne pasmo audio." @@ -22690,7 +22694,7 @@ msgstr "Brak wyników" msgid "No mentions yet" msgstr "Brak wzmianek" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Nie znaleziono mikrofonu" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Szum" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Bramka szumów" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Brak" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Brak" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Przycisk „naciśnij i mów”" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Naciśnij i mów" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Naciśnij i mów (ograniczone)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Funkcja „naciśnij i mów” jest ignorowana w trybie „Bezpośrednie wejście”. Aby z niej korzystać, przełącz profil na „Wyrazisty głos” lub „Niestandardowy”." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Funkcja „naciśnij i mów” jest włączona. Przytrzymaj {pushToTalkHint}, aby mówić." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Dopóki nie włączysz uprawnienia „{permissionName}”, funkcja „naciśnij i mów” działa tylko wtedy, gdy {productName} jest aktywny. Po zmianie uprawnienia całkowicie zamknij i uruchom ponownie {productName}, aby skróty globalne mogły z niego korzystać." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Naciśnij i mów działa tylko, gdy karta przeglądarki jest aktywna." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Zalecane" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Zalecane. Oczyszcza dźwięk z mikrofonu, aby mowa była wyraźna." @@ -26561,7 +26565,7 @@ msgstr "Względny" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Opóźnienie zwolnienia" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Wybierz konto, na które chcesz się zalogować na nowym urządzeniu." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Wybierz tryb przetwarzania głosu" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Wysyłanie wiadomości jest wyłączone w tej społeczności" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Wysyła oba kanały mikrofonu stereo. Wymaga wyłączenia wszystkich procesów i kanału o przepustowości 128 kb/s lub wyższej." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Wysyła surowy dźwięk z mikrofonu bez przetwarzania." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Wysyła dźwięk bez zmian. Najlepiej, jeśli używasz zewnętrznego oprogramowania audio." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Wysyła dźwięk z Twojego mikrofonu bez tłumienia szumu." @@ -30136,7 +30140,7 @@ msgstr "Krótkie kody" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Krok 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Mikrofon stereofoniczny" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Wyłączono członkowi możliwość słyszenia innych w tej społeczności" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Zapobiega zapętleniu dźwięku z głośników do mikrofonu." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Dobra jakość przy umiarkowanym zużyciu procesora. Dobra opcja awaryjna Chromium do udostępniania ekranu." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Najsilniejszy filtr neuronowy dla mowy, ogranicza dźwięk do zakresu mowy." @@ -32539,7 +32543,7 @@ msgstr "Przełącz na wygodny układ" msgid "Switch to dense layout" msgstr "Przełącz na zwarty układ" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Przełącz na bezpośrednie wejście" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Szybkość TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Dostosuj przetwarzanie samodzielnie." @@ -37106,6 +37110,10 @@ msgstr "Korzysta z centrum powiadomień systemu operacyjnego. Aby dostosować po msgid "Uses:" msgstr "Użycia:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Do czasu gotowości {requestedLabel} używany jest {effectiveLabel}." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Uczestnicy rozmowy głosowej" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Przetwarzanie głosu" @@ -38118,6 +38126,10 @@ msgstr "Włączenie dźwięku" msgid "Voice unmute" msgstr "Włączenie mikrofonu" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "W tej przeglądarce rozmowy głosowe korzystają z systemowego urządzenia wyjściowego. Zmień je w ustawieniach systemu." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Anulowano" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Które rozmowy" msgid "Which rule was broken?" msgstr "Która zasada została złamana?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Gdy funkcja „Naciśnij i mów” jest włączona, skrót steruje mikrofonem, więc przycisk wyciszenia jest nieaktywny." diff --git a/fluxer_app/src/features/i18n/locales/pt-BR/messages.po b/fluxer_app/src/features/i18n/locales/pt-BR/messages.po index 56b8606e5..396b89397 100644 --- a/fluxer_app/src/features/i18n/locales/pt-BR/messages.po +++ b/fluxer_app/src/features/i18n/locales/pt-BR/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "O {productName} precisa de acesso à câmera para listar seus dispositivos." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "O {productName} precisa de acesso ao microfone para listar seus dispositivos." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, =0 {membros} one {membro} ot msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "Não foi possível iniciar {requestedLabel}. Usando {effectiveLabel} no lugar." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Compartilhamento de atividade" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Limite de atividade" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Endereço" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Ajuste cada configuração: supressão de ruído, cancelamento de eco e ganho." @@ -3606,11 +3610,11 @@ msgstr "Permitir {everyoneMention} e {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Permita que o {PRODUCT_NAME} acesse sua câmera em {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Permita que o {PRODUCT_NAME} acesse seu microfone em {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Permita que o {PRODUCT_NAME} acesse seu microfone. Verifique a barra de endereço ou as configurações do seu navegador." @@ -3713,7 +3717,7 @@ msgstr "Permitir que membros sem a permissão {readMessageHistoryPermissionLabel msgid "Allow mentions for this role" msgstr "Permitir menções a este cargo" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Permitir acesso ao microfone" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Prévia do áudio" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Processamento de áudio" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Detectar idioma automaticamente" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Definir limite de atividade automaticamente" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Atalhos integrados" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Supressão integrada do seu navegador ou sistema." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Limpar link" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Melhora o áudio do microfone para uma fala mais nítida." @@ -8985,7 +8989,7 @@ msgstr "Conecte uma câmera ou dispositivo de captura virtual e tente novamente. msgid "Connect a display, then try again." msgstr "Conecte um monitor e tente novamente." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Conecte um microfone e tente novamente." @@ -10672,8 +10676,8 @@ msgstr "Personalizado" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Recortar" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Corta o áudio abaixo de um limite de volume com uso mínimo da CPU." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Botão de download" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Baixar app para computador" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Ativar" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Ativar a permissão {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Áudio do sistema inteiro" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Som de entrada" @@ -14330,8 +14334,8 @@ msgstr "Noite" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Equilibra o volume do microfone para que sua voz não fique baixa demais." @@ -17360,7 +17364,7 @@ msgstr "Preciso de outra forma" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Entendi" @@ -17792,7 +17796,7 @@ msgstr "Em" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "No modo \"Sistema operacional\", os dicionários listados acima são apenas sugestões. O {PRODUCT_NAME} passará essas tags de idioma para o corretor ortográfico do seu SO quando compatível. As tags que ele não reconhece são ignoradas." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "No navegador, \"Apertar para falar\" só funciona enquanto a aba do {PRODUCT_NAME} estiver em foco. Instale o aplicativo para computador para usar esse recurso em todo o sistema." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "O acesso de entrada foi alterado. Feche completamente e reinicie o {productName} para aplicar a permissão aos atalhos de todo o sistema." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Entrada e saída" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Mantenha-os em segurança. Gerar novamente vai quebrar as integrações existentes." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Continue transmitindo por um breve período após soltar o botão." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Tema claro" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Filtro clássico leve, funciona em qualquer dispositivo." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Aparência" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Parece que você está usando {0}. Usar o processamento do {PRODUCT_NAME} em conjunto pode causar bombeamento ou distorção. A entrada direta passa seu áudio sem alterações." @@ -21035,7 +21039,7 @@ msgstr "Microfone" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Teste de microfone" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Rede e desempenho" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Filtro neural que remove a maior parte do ruído de fundo." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Filtro neural, largura de banda total do áudio." @@ -22690,7 +22694,7 @@ msgstr "Nenhum resultado encontrado" msgid "No mentions yet" msgstr "Nenhuma menção ainda" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Nenhum microfone encontrado" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Ruído" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Gate de ruído" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Nenhum" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Nenhuma" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Tecla para apertar e falar" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Apertar para falar" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Apertar para falar (limitado)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "\"Apertar para falar\" é ignorado no modo Entrada direta. Mude para Voz focada ou Personalizado para usar o recurso." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "\"Apertar para falar\" está ativado. Mantenha {pushToTalkHint} pressionado para falar." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "\"Apertar para falar\" só funciona enquanto o {productName} estiver em foco até que a permissão {permissionName} seja ativada. Depois de alterar a permissão, feche completamente e reinicie o {productName} para aplicá-la aos atalhos de todo o sistema." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "O \"Apertar para falar\" só funciona enquanto a aba do navegador estiver em foco." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Recomendado" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Recomendado. Melhora o áudio do microfone para uma fala mais nítida." @@ -26561,7 +26565,7 @@ msgstr "Relativo" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Atraso após soltar a tecla" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Selecione a conta com a qual você deseja entrar no seu novo dispositivo." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Selecionar modo de processamento de voz" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "O envio de mensagens está desativado nesta comunidade" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Envia ambos os canais de um microfone estéreo. Requer que todo o processamento esteja desativado e um canal a 128 kbps ou superior." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Envia o áudio bruto do microfone sem processamento." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Envia seu áudio sem alterações. Ideal se você estiver usando um software de áudio externo." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Envia o áudio do seu microfone sem supressão." @@ -30136,7 +30140,7 @@ msgstr "Códigos curtos" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Etapa 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Microfone estéreo" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Impediu que o membro ouvisse os outros nesta comunidade" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Impede que o áudio dos seus alto-falantes retorne para o microfone." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Boa qualidade com uso moderado de CPU. Boa alternativa no Chromium para compartilhamento de tela." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Filtro neural mais intenso para fala. Limita o áudio à faixa de frequências da voz." @@ -32539,7 +32543,7 @@ msgstr "Mudar para o layout confortável" msgid "Switch to dense layout" msgstr "Mudar para layout compacto" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Mudar para entrada direta" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Velocidade da fala" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Ajuste o processamento você mesmo." @@ -37106,6 +37110,10 @@ msgstr "Usa a central de notificações do sistema operacional. Para controles p msgid "Uses:" msgstr "Usos:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Usando {effectiveLabel} até que {requestedLabel} esteja pronto." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Participantes da chamada de voz" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Processamento de voz" @@ -38118,6 +38126,10 @@ msgstr "Áudio reativado" msgid "Voice unmute" msgstr "Microfone reativado" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Neste navegador, as chamadas de voz usam o dispositivo de saída do sistema. Altere-o nas configurações do sistema." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Anulado" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Quais conversas" msgid "Which rule was broken?" msgstr "Qual regra foi quebrada?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Enquanto apertar para falar estiver ativado, seu atalho controlará o microfone, por isso o botão de silenciar ficará desativado." diff --git a/fluxer_app/src/features/i18n/locales/ro/messages.po b/fluxer_app/src/features/i18n/locales/ro/messages.po index f7caf676b..22b5a2b91 100644 --- a/fluxer_app/src/features/i18n/locales/ro/messages.po +++ b/fluxer_app/src/features/i18n/locales/ro/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} are nevoie de acces la cameră pentru a-ți afișa dispozitivele." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} are nevoie de acces la microfon pentru a-ți afișa dispozitivele." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {membru} few {membri} ot msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} nu a putut porni. Se folosește {effectiveLabel} în schimb." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Partajarea activității" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Prag de activitate" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adresă" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Ajustează manual fiecare setare: suprimarea zgomotului, anularea ecoului și amplificarea." @@ -3606,11 +3610,11 @@ msgstr "Permite {everyoneMention} și {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Permite aplicației {PRODUCT_NAME} să îți acceseze camera în {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Permite aplicației {PRODUCT_NAME} să îți acceseze microfonul în {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Permite aplicației {PRODUCT_NAME} să îți acceseze microfonul. Verifică bara de adrese sau setările browserului." @@ -3713,7 +3717,7 @@ msgstr "Permite membrilor fără permisiunea {readMessageHistoryPermissionLabel} msgid "Allow mentions for this role" msgstr "Permite menționări pentru acest rol" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Permite accesul la microfon" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Previzualizare audio" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Procesare audio" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Detectare automată a limbii" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Setează automat pragul de activitate" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Comenzi rapide încorporate" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Suprimare încorporată din browserul sau sistemul tău." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Curăță linkul" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Curăță microfonul pentru o vorbire clară." @@ -8985,7 +8989,7 @@ msgstr "Conectează o cameră sau un dispozitiv de captură virtual, apoi încea msgid "Connect a display, then try again." msgstr "Conectează un ecran, apoi încearcă din nou." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Conectează un microfon și încearcă din nou." @@ -10672,8 +10676,8 @@ msgstr "Personalizat" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Decupează" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Taie sunetul sub un prag de volum, cu un consum minim de procesor." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Buton de descărcare" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Descarcă aplicația pentru desktop" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Activează" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Activează permisiunea {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Sunetul întregului sistem" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Sunet de intrare" @@ -14330,8 +14334,8 @@ msgstr "Seara" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Nivelează volumul microfonului, ca să nu se audă prea încet." @@ -17360,7 +17364,7 @@ msgstr "Am nevoie de o altă metodă" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Am înțeles" @@ -17792,7 +17796,7 @@ msgstr "În" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "În modul „Sistem de operare”, dicționarele enumerate mai sus sunt consultative. {PRODUCT_NAME} va transmite aceste etichete de limbă verificatorului ortografic al sistemului tău de operare, atunci când este acceptat. Etichetele pe care nu le recunoaște sunt ignorate." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "Într-un browser, push-to-talk funcționează doar când fila {PRODUCT_NAME} este activă. Instalează aplicația desktop pentru push-to-talk la nivel de sistem." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Accesul la intrare a fost modificat. Închide complet și repornește {productName} pentru ca scurtăturile la nivel de sistem să-l poată utiliza." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Intrare și ieșire" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Păstrează-le în siguranță. Regenerarea va întrerupe integrările existente." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Continuă transmisia pentru scurt timp după eliberare." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Temă luminoasă" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Filtru clasic și ușor, care funcționează pe orice dispozitiv." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Aspect și stil" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Se pare că folosești {0}. Suprapunerea procesării audio de la {PRODUCT_NAME} poate cauza distorsiuni sau efecte de pompare. Intrarea directă transmite sunetul netratat." @@ -21035,7 +21039,7 @@ msgstr "Microfon" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Test microfon" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Rețea și performanță" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Filtru neural care elimină majoritatea zgomotului de fundal." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Filtru neural, lățime de bandă completă a sunetului." @@ -22690,7 +22694,7 @@ msgstr "Niciun rezultat găsit" msgid "No mentions yet" msgstr "Încă nu există mențiuni" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Nu s-a găsit niciun microfon" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Zgomot" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Filtru de zgomot" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Niciunul" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Fără" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Tastă push-to-talk" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Push-to-talk" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Push-to-talk (limitat)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Push-to-talk este ignorat în modul intrare directă. Comută pe voce focalizată sau pe profilul personalizat ca să îl poți folosi." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Push-to-talk este activat. Ține apăsat {pushToTalkHint} ca să vorbești." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Push-to-talk funcționează doar când {productName} este în prim-plan, până la activarea {permissionName}. După modificarea permisiunii, închide complet și repornește {productName} pentru ca tastele rapide la nivel de sistem să o poată utiliza." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Push-to-talk funcționează doar când fila browserului este activă." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Recomandat" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Recomandat. Îți curăță sunetul microfonului pentru o voce clară." @@ -26561,7 +26565,7 @@ msgstr "Relativ" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Întârziere la eliberare" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Selectează contul cu care vrei să te conectezi pe noul tău dispozitiv." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Selectează modul de procesare a vocii" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Trimiterea mesajelor este dezactivată în această comunitate" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Trimite ambele canale ale unui microfon stereo. Necesită dezactivarea tuturor procesărilor și un canal la 128 kbps sau mai mare." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Trimite sunetul brut al microfonului, fără procesare." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Trimite sunetul tău nemodificat. Cel mai bine dacă folosești software audio extern." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Trimite sunetul microfonului tău fără nicio suprimare." @@ -30136,7 +30140,7 @@ msgstr "Coduri scurte" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Pasul 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Microfon stereo" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "A făcut ca membrul să nu îi mai audă pe ceilalți în această comunitate" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Împiedică sunetul din difuzoare să ajungă în microfon." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Calitate ridicată la un consum CPU moderat. Alternativă bună pe Chromium pentru partajarea ecranului." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Cel mai puternic filtru neuronal pentru vorbire. Limitează sunetul la intervalul vorbirii." @@ -32539,7 +32543,7 @@ msgstr "Treci la aspectul confortabil" msgid "Switch to dense layout" msgstr "Treci la aspectul compact" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Treci la intrarea directă" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Viteză TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Reglează tu procesarea." @@ -37106,6 +37110,10 @@ msgstr "Folosește centrul de notificări al sistemului de operare. Pentru contr msgid "Uses:" msgstr "Utilizări:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Se folosește {effectiveLabel} până când {requestedLabel} este gata." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Participanți la apelul vocal" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Procesarea vocii" @@ -38118,6 +38126,10 @@ msgstr "Activare sunet" msgid "Voice unmute" msgstr "Activare microfon" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "În acest browser, apelurile vocale folosesc dispozitivul de ieșire al sistemului. Schimbă-l din setările sistemului." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Anulată" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Ce conversații" msgid "Which rule was broken?" msgstr "Ce regulă a fost încălcată?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Cât timp push-to-talk este activat, microfonul este controlat de scurtătură, așa că butonul de dezactivare a microfonului nu este disponibil." diff --git a/fluxer_app/src/features/i18n/locales/ru/messages.po b/fluxer_app/src/features/i18n/locales/ru/messages.po index 2b2e8660a..d94f96747 100644 --- a/fluxer_app/src/features/i18n/locales/ru/messages.po +++ b/fluxer_app/src/features/i18n/locales/ru/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} требуется доступ к камере, чтобы показать список ваших устройств." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} требуется доступ к микрофону, чтобы показать список ваших устройств." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {участник} few { msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} в сети" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "Не удалось запустить {requestedLabel}. Вместо него используется {effectiveLabel}." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Показ активности" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Порог активности" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Адрес" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Настройте каждый параметр самостоятельно: шумоподавление, эхоподавление и усиление." @@ -3606,11 +3610,11 @@ msgstr "Разрешить {everyoneMention} и {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Разрешите {PRODUCT_NAME} доступ к вашей камере в {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Разрешите {PRODUCT_NAME} доступ к микрофону в {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Разрешите {PRODUCT_NAME} доступ к микрофону. Проверьте адресную строку или настройки браузера." @@ -3713,7 +3717,7 @@ msgstr "Разрешить участникам без разрешения «{r msgid "Allow mentions for this role" msgstr "Разрешить упоминания для этой роли" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Разрешить доступ к микрофону" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Предпросмотр аудио" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Обработка аудио" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Автоопределение языка" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Автоматически устанавливать порог активности" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Встроенные сочетания клавиш" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Встроенное шумоподавление от вашего браузера или системы." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Очистка ссылок" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Очищает звук микрофона для четкой речи." @@ -8985,7 +8989,7 @@ msgstr "Подключите камеру или виртуальное устр msgid "Connect a display, then try again." msgstr "Подключите дисплей и попробуйте снова." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Подключите микрофон и попробуйте снова." @@ -10672,8 +10676,8 @@ msgstr "Другой источник" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Вырезать" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Отсекает звук ниже порога громкости при минимальной нагрузке на ЦП." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Кнопка «Скачать»" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Скачать приложение для компьютера" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Включить" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Включить разрешение «{permissionName}»" @@ -14220,7 +14224,7 @@ msgstr "Весь звук системы" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Звук входа" @@ -14330,8 +14334,8 @@ msgstr "Вечер" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Выравнивает громкость вашего микрофона, чтобы вас было хорошо слышно." @@ -17360,7 +17364,7 @@ msgstr "Мне нужен другой способ" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Понятно" @@ -17792,7 +17796,7 @@ msgstr "В канале" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "В режиме «Операционная система» перечисленные выше словари являются рекомендательными. {PRODUCT_NAME} будет передавать эти языковые теги системной проверке орфографии, если она это поддерживает. Теги, которые она не распознаёт, игнорируются." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "В браузере режим «Нажми и говори» работает только при активной вкладке {PRODUCT_NAME}. Установите приложение для ПК, чтобы использовать его во всей системе." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Доступ к вводу изменен. Полностью закройте и перезапустите {productName}, чтобы системные сочетания клавиш могли его использовать." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Ввод и вывод" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Храните их в безопасности. Повторная генерация нарушит существующие интеграции." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Продолжает передавать звук ещё немного после отпускания клавиши." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Светлая тема" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Легкий классический фильтр, работает на любом устройстве." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Внешний вид" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Похоже, вы используете {0}. Дополнительная обработка звука в {PRODUCT_NAME} может привести к искажениям. Прямой ввод передает ваш звук без изменений." @@ -21035,7 +21039,7 @@ msgstr "Микрофон" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Тест микрофона" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Сеть и производительность" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Нейронный фильтр, удаляющий большинство фоновых шумов." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Нейронный фильтр, сохраняет весь диапазон звука." @@ -22690,7 +22694,7 @@ msgstr "Совпадений не найдено" msgid "No mentions yet" msgstr "Пока нет упоминаний" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Микрофон не найден" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Шум" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Шумовой гейт" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Нет" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Нет" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Клавиша «Нажми и говори»" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Нажми и говори" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Нажми и говори (с ограничениями)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Режим «Нажми и говори» игнорируется при прямом вводе. Переключитесь на «Фокусировку голоса» или «Пользовательский», чтобы использовать его." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Включен режим «Нажми и говори». Удерживайте {pushToTalkHint}, чтобы говорить." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Функция «Нажми и говори» работает, только когда приложение {productName} активно, пока не будет включено разрешение {permissionName}. После изменения разрешения полностью закройте и перезапустите {productName}, чтобы системные горячие клавиши могли его использовать." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Режим «Нажми и говори» работает только при активной вкладке браузера." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Рекомендуется" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Рекомендуется. Очищает звук микрофона для чёткой речи." @@ -26561,7 +26565,7 @@ msgstr "Относительный" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Задержка отпускания" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Выберите аккаунт, с которым хотите войти на новом устройстве." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Выберите режим обработки голоса" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Отправка сообщений в этом сообществе отключена" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Отправляет оба канала стереомикрофона. Требуется отключить всю обработку и установить скорость канала 128 Кбит/с или выше." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Отправляет звук с микрофона без какой-либо обработки." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Отправляет ваш звук без изменений. Лучший вариант, если вы используете внешние аудиопрограммы." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Отправляет аудио с вашего микрофона без шумоподавления." @@ -30136,7 +30140,7 @@ msgstr "Шорткоды" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Шаг 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Стереомикрофон" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Участнику запрещено слышать других в этом сообществе" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Предотвращает попадание звука из динамиков в микрофон." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Высокое качество при умеренной нагрузке на процессор. Хороший запасной вариант Chromium для демонстрации экрана." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Самый мощный нейронный фильтр для речи. Ограничивает звук диапазоном речи." @@ -32539,7 +32543,7 @@ msgstr "Переключиться на просторный вид" msgid "Switch to dense layout" msgstr "Переключиться на компактный вид" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Переключиться на прямой ввод" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Скорость TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Настройте обработку самостоятельно." @@ -37106,6 +37110,10 @@ msgstr "Использует центр уведомлений ОС. Чтобы msgid "Uses:" msgstr "Число использований:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Используется {effectiveLabel}, пока {requestedLabel} не будет готов." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Участники голосового чата" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Обработка голоса" @@ -38118,6 +38126,10 @@ msgstr "Включение звука" msgid "Voice unmute" msgstr "Включение микрофона" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "В этом браузере для голосовых вызовов используется системное устройство вывода. Измените его в настройках системы." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Аннулировано" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Какие чаты" msgid "Which rule was broken?" msgstr "Какое правило было нарушено?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Когда включён режим «Нажми и говори», микрофоном управляет сочетание клавиш, поэтому кнопка отключения микрофона неактивна." diff --git a/fluxer_app/src/features/i18n/locales/sv-SE/messages.po b/fluxer_app/src/features/i18n/locales/sv-SE/messages.po index adac49b86..29e649d15 100644 --- a/fluxer_app/src/features/i18n/locales/sv-SE/messages.po +++ b/fluxer_app/src/features/i18n/locales/sv-SE/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} behöver åtkomst till kameran för att visa dina enheter." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} behöver mikrofonåtkomst för att visa dina enheter." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {medlem} other {medlemma msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} online" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} kunde inte starta. Använder {effectiveLabel} i stället." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Delning av aktivitet" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Aktivitetströskel" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adress" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Justera varje inställning själv: brusreducering, ekoreducering och förstärkning." @@ -3606,11 +3610,11 @@ msgstr "Tillåt {everyoneMention} och {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Tillåt {PRODUCT_NAME} att komma åt din kamera i {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Tillåt att {PRODUCT_NAME} får åtkomst till din mikrofon i {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Tillåt {PRODUCT_NAME} att komma åt din mikrofon. Kontrollera webbläsarens adressfält eller inställningar." @@ -3713,7 +3717,7 @@ msgstr "Tillåt medlemmar utan behörigheten {readMessageHistoryPermissionLabel} msgid "Allow mentions for this role" msgstr "Tillåt omnämnanden för den här rollen" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Tillåt mikrofon" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Ljudförhandsgranskning" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Ljudbehandling" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Identifiera språk automatiskt" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Ställ in aktivitetströskel automatiskt" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Inbyggda genvägar" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Inbyggd brusreducering från din webbläsare eller system." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Rensa länk" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Rensar mikrofonsignalen för tydligt tal." @@ -8985,7 +8989,7 @@ msgstr "Anslut en kamera eller virtuell inspelningsenhet och försök igen." msgid "Connect a display, then try again." msgstr "Anslut en skärm och försök igen." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Anslut en mikrofon och försök igen." @@ -10672,8 +10676,8 @@ msgstr "Anpassad källa" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Klipp ut" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Tar bort ljud under en viss ljudnivå med minimal CPU-användning." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Nedladdningsknapp" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Ladda ner datorappen" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Aktivera" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Aktivera behörigheten {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Hela systemljudet" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Anslutningsljud" @@ -14330,8 +14334,8 @@ msgstr "Kvällstid" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Jämnar ut din mikrofonvolym så att du inte är för tyst." @@ -17360,7 +17364,7 @@ msgstr "Jag behöver ett annat sätt" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Jag förstår" @@ -17792,7 +17796,7 @@ msgstr "I" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "I läget \"Operativsystem\" är ordlistorna ovan vägledande. {PRODUCT_NAME} skickar dessa språktaggar till din OS-stavningskontroll om det stöds. Taggar som inte känns igen ignoreras." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "I en webbläsare fungerar tryck för att prata bara när fliken {PRODUCT_NAME} har fokus. Installera datorappen för att använda tryck för att prata i hela systemet." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Inmatningsåtkomsten har ändrats. Avsluta {productName} helt och starta om appen så att globala kortkommandon får tillgång till inmatningen." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "In- och utdata" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Förvara dem säkert. Om du skapar nya slutar befintliga integrationer att fungera." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Fortsätt sända en kort stund efter att knappen släppts." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Ljust tema" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Resurssnålt klassiskt filter som fungerar på alla enheter." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Utseende och känsla" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Det verkar som att du använder {0}. Om du lägger till ljudbehandlingen i {PRODUCT_NAME} ovanpå den kan det orsaka pumpning eller distorsion. Direktinmatning skickar ditt ljud oförändrat." @@ -21035,7 +21039,7 @@ msgstr "Mikrofon" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Mikrofontest" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Nätverk och prestanda" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Neuralt filter som tar bort det mesta bakgrundsljudet." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Neuralfilter, full bandbredd för ljudet." @@ -22690,7 +22694,7 @@ msgstr "Inga träffar" msgid "No mentions yet" msgstr "Inga omnämnanden än" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Ingen mikrofon hittades" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Brus" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Brusgrind" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Ingen" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Ingen" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Tangent för tryck för att prata" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Tryck för att prata" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Tryck för att prata (begränsat)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Tryck för att prata ignoreras vid direktinmatning. Växla till fokuserat röstläge eller anpassat läge för att använda funktionen." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Tryck för att prata är på. Håll ned {pushToTalkHint} för att prata." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Tryck för att prata fungerar bara när {productName} har fokus tills {permissionName} har aktiverats. Avsluta {productName} helt och starta om appen efter ändringen så att globala kortkommandon kan använda behörigheten." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Tryck för att prata fungerar bara när webbläsarfliken har fokus." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Rekommenderas" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Rekommenderas. Rensar mikrofonsignalen för tydligt tal." @@ -26561,7 +26565,7 @@ msgstr "Relativ" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Fördröjning efter att tangenten släpps" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Välj det konto du vill logga in med på din nya enhet." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Välj röstbehandlingsläge" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Det går inte att skicka meddelanden i den här communityn" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Skickar båda kanalerna från en stereomikrofon. Kräver att all bearbetning är avstängd och en kanal på 128 kbps eller högre." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Skickar rått mikrofonljud utan bearbetning." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Skickar ditt ljud oförändrat. Bäst om du använder extern ljudprogramvara." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Skickar ditt mikrofonljud utan brusreducering." @@ -30136,7 +30140,7 @@ msgstr "Kortkoder" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Steg 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereomikrofon" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Hindrade medlemmen från att höra andra i den här communityn" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Hindrar ljudet från högtalarna från att matas tillbaka till mikrofonen." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Hög kvalitet till måttlig CPU-kostnad. Bra Chromium-reservlösning för skärmdelning." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Starkaste neurala filtret för tal, begränsar ljudet till talområdet." @@ -32539,7 +32543,7 @@ msgstr "Byt till rymlig layout" msgid "Switch to dense layout" msgstr "Växla till kompakt layout" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Byt till direktinmatning" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS-hastighet" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Justera bearbetningen själv." @@ -37106,6 +37110,10 @@ msgstr "Använder operativsystemets aviseringscenter. För inställningar per ka msgid "Uses:" msgstr "Användningar:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Använder {effectiveLabel} tills {requestedLabel} är redo." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Röstdeltagare" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Röstbearbetning" @@ -38118,6 +38126,10 @@ msgstr "Slå på ljudet" msgid "Voice unmute" msgstr "Slå på mikrofonen" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Röstsamtal använder systemets ljudutgång i den här webbläsaren. Ändra den i systeminställningarna." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Ogiltig" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Vilka konversationer" msgid "Which rule was broken?" msgstr "Vilken regel bröts?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "När tryck för att prata är på styr kortkommandot mikrofonen, så knappen för att stänga av mikrofonen är inaktiverad." diff --git a/fluxer_app/src/features/i18n/locales/th/messages.po b/fluxer_app/src/features/i18n/locales/th/messages.po index 400c55339..104147ffa 100644 --- a/fluxer_app/src/features/i18n/locales/th/messages.po +++ b/fluxer_app/src/features/i18n/locales/th/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} ต้องการสิทธิ์เข้าถึงกล้องเพื่อแสดงรายการอุปกรณ์ของคุณ" #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} ต้องการสิทธิ์เข้าถึงไมโครโฟนเพื่อแสดงรายการอุปกรณ์ของคุณ" @@ -1866,6 +1866,10 @@ msgstr "สมาชิก {renderedMemberCount} {memberCount, plural, one {ค msgid "{renderedPresenceCount} online" msgstr "ออนไลน์ {renderedPresenceCount} คน" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "ไม่สามารถเริ่ม {requestedLabel} ได้ กำลังใช้ {effectiveLabel} แทน" + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "การแชร์กิจกรรม" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "เกณฑ์กิจกรรม" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "ที่อยู่" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "ปรับการตั้งค่าแต่ละรายการด้วยตัวเอง: การลดเสียงรบกวน การตัดเสียงสะท้อน และเกน" @@ -3606,11 +3610,11 @@ msgstr "อนุญาต {everyoneMention} และ {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "อนุญาตให้ {PRODUCT_NAME} เข้าถึงกล้องของคุณใน {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "อนุญาตให้ {PRODUCT_NAME} เข้าถึงไมโครโฟนของคุณใน {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "อนุญาตให้ {PRODUCT_NAME} เข้าถึงไมโครโฟนของคุณ ตรวจสอบแถบที่อยู่หรือการตั้งค่าของเบราว์เซอร์ของคุณ" @@ -3713,7 +3717,7 @@ msgstr "อนุญาตให้สมาชิกที่ไม่มีส msgid "Allow mentions for this role" msgstr "อนุญาตให้กล่าวถึงบทบาทนี้" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "อนุญาตให้ใช้ไมโครโฟน" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "ตัวอย่างเสียง" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "การประมวลผลเสียง" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "ตรวจจับภาษาอัตโนมัติ" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "ตั้งค่าเกณฑ์กิจกรรมอัตโนมัติ" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "ปุ่มลัดในตัว" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "การระงับสัญญาณรบกวนในตัวจากเบราว์เซอร์หรือระบบของคุณ" @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "ล้างลิงก์" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "ปรับปรุงไมโครโฟนของคุณเพื่อให้เสียงพูดชัดเจน" @@ -8985,7 +8989,7 @@ msgstr "เชื่อมต่อกล้องหรืออุปกรณ msgid "Connect a display, then try again." msgstr "เชื่อมต่อจอแสดงผล แล้วลองอีกครั้ง" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "เชื่อมต่อไมโครโฟนแล้วลองอีกครั้ง" @@ -10672,8 +10676,8 @@ msgstr "กำหนดเอง" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "ตัด" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "ตัดเสียงที่เบากว่าเกณฑ์ที่กำหนด ใช้ CPU น้อยที่สุด" @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "ปุ่มดาวน์โหลด" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "ดาวน์โหลดแอปเดสก์ท็อป" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "เปิดใช้งาน" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "เปิดใช้งานสิทธิ์ {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "เสียงทั้งระบบ" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "เสียงเข้าห้อง" @@ -14330,8 +14334,8 @@ msgstr "ช่วงเย็น" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "ปรับระดับเสียงไมโครโฟนของคุณให้สม่ำเสมอ เพื่อไม่ให้เสียงเบาเกินไป" @@ -17360,7 +17364,7 @@ msgstr "ฉันต้องการวิธีอื่น" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "ฉันเข้าใจ" @@ -17792,7 +17796,7 @@ msgstr "ใน" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "ในโหมด \"ระบบปฏิบัติการ\" พจนานุกรมที่แสดงด้านบนเป็นเพียงคำแนะนำ {PRODUCT_NAME} จะส่งแท็กภาษาเหล่านี้ไปยังโปรแกรมตรวจการสะกดของระบบปฏิบัติการของคุณ หากระบบปฏิบัติการรองรับ แท็กที่ระบบไม่รู้จักจะถูกละเว้น" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "ในเบราว์เซอร์ การกดเพื่อพูดจะทำงานเมื่อแท็บ {PRODUCT_NAME} โฟกัสอยู่เท่านั้น ติดตั้งแอปเดสก์ท็อปเพื่อใช้การกดเพื่อพูดได้ทั่วทั้งระบบ" @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "การเข้าถึงอินพุตมีการเปลี่ยนแปลง โปรดออกจาก {productName} โดยสมบูรณ์แล้วเริ่มใหม่ เพื่อให้สามารถใช้ปุ่มลัดทั่วทั้งระบบได้" #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "อินพุตและเอาต์พุต" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "เก็บข้อมูลนี้ไว้ให้ปลอดภัย การสร้างใหม่จะทำให้การเชื่อมต่อที่มีอยู่ใช้งานไม่ได้" #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "ยังคงส่งสัญญาณต่อสักครู่หลังปล่อยปุ่มค้างไว้" @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "ธีมสว่าง" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "ตัวกรองคลาสสิกน้ำหนักเบา ใช้ได้กับทุกอุปกรณ์" @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "รูปลักษณ์และการแสดงผล" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "ดูเหมือนว่าคุณกำลังใช้ {0} การประมวลผลของ {PRODUCT_NAME} เพิ่มเติมอาจทำให้เกิดเสียงปั๊มหรือเสียงผิดเพี้ยนได้ อินพุตโดยตรงจะส่งสัญญาณเสียงของคุณไปโดยไม่มีการเปลี่ยนแปลง" @@ -21035,7 +21039,7 @@ msgstr "ไมค์" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "ทดสอบไมโครโฟน" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "เครือข่ายและประสิทธิภาพ" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "ฟิลเตอร์แบบโครงข่ายประสาทเทียมที่ช่วยลดเสียงรบกวนรอบข้างส่วนใหญ่" #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "ฟิลเตอร์แบบโครงข่ายประสาทเทียม แบนด์วิดท์เสียงเต็ม" @@ -22690,7 +22694,7 @@ msgstr "ไม่พบผลลัพธ์" msgid "No mentions yet" msgstr "ยังไม่มีการกล่าวถึง" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "ไม่พบไมโครโฟน" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "เสียงรบกวน" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "การตัดเสียงรบกวน" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "ไม่มี" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "ไม่มี" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "ปุ่มกดเพื่อพูด" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "กดเพื่อพูด" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "กดเพื่อพูด (จำกัด)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "กดเพื่อพูดจะไม่ทำงานในโหมดอินพุตโดยตรง หากต้องการใช้งาน ให้เปลี่ยนเป็นเน้นเสียงพูดหรือกำหนดเอง" @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "โหมดกดเพื่อพูดเปิดอยู่ กด {pushToTalkHint} ค้างไว้เพื่อพูด" #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "กดเพื่อพูดจะทำงานเมื่อ {productName} อยู่ในโฟกัสเท่านั้น จนกว่าจะเปิดใช้งาน {permissionName} หลังจากเปลี่ยนสิทธิ์แล้ว ให้ออกจาก {productName} และเริ่มใหม่ทั้งหมด เพื่อให้ปุ่มลัดทั่วทั้งระบบสามารถใช้งานได้" #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "กดเพื่อพูดจะทำงานเมื่อแท็บเบราว์เซอร์อยู่ในโฟกัสเท่านั้น" @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "แนะนำ" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "แนะนำ: ปรับปรุงไมโครโฟนของคุณเพื่อให้เสียงพูดชัดเจน" @@ -26561,7 +26565,7 @@ msgstr "แบบสัมพัทธ์" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "หน่วงเวลาหลังปล่อยปุ่ม" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "เลือกบัญชีที่คุณต้องการลงชื่อเข้าใช้บนอุปกรณ์ใหม่ของคุณ" #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "เลือกโหมดประมวลผลเสียง" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "การส่งข้อความในคอมมูนิตี้นี้ถูกปิดอยู่" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "ส่งทั้งสองช่องสัญญาณของไมโครโฟนสเตอริโอ ต้องปิดการประมวลผลทั้งหมดและตั้งค่าช่องสัญญาณที่ 128 kbps ขึ้นไป" #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "ส่งสัญญาณเสียงไมโครโฟนดิบโดยไม่มีการประมวลผล" #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "ส่งเสียงของคุณโดยไม่มีการปรับแต่ง เหมาะที่สุดหากคุณใช้ซอฟต์แวร์เสียงภายนอก" #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "ส่งเสียงไมโครโฟนของคุณโดยไม่ลดเสียงรบกวน" @@ -30136,7 +30140,7 @@ msgstr "รหัสย่อ" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "ขั้นตอนที่ 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "ไมโครโฟนสเตอริโอ" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "หยุดไม่ให้สมาชิกได้ยินผู้อื่นในคอมมูนิตี้นี้" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "ป้องกันเสียงจากลำโพงย้อนเข้าไมโครโฟนของคุณ" @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "คุณภาพดี ใช้ CPU ปานกลาง เป็นตัวเลือกสำรองที่ดีสำหรับการแชร์หน้าจอบน Chromium" #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "ฟิลเตอร์แบบโครงข่ายประสาทเทียมที่แรงที่สุดสำหรับเสียงพูด จำกัดเสียงให้อยู่ในช่วงความถี่ของเสียงพูด" @@ -32539,7 +32543,7 @@ msgstr "เปลี่ยนเป็นเลย์เอาต์สบาย msgid "Switch to dense layout" msgstr "เปลี่ยนเป็นเลย์เอาต์แบบกระชับ" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "เปลี่ยนเป็นอินพุตโดยตรง" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "ความเร็ว TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "ปรับแต่งการประมวลผลได้เอง" @@ -37106,6 +37110,10 @@ msgstr "ใช้ศูนย์การแจ้งเตือนของร msgid "Uses:" msgstr "จำนวนครั้งที่ใช้:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "กำลังใช้ {effectiveLabel} จนกว่า {requestedLabel} จะพร้อม" + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "ผู้เข้าร่วมการโทรด้วยเสียง" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "การประมวลผลเสียง" @@ -38118,6 +38126,10 @@ msgstr "เลิกปิดเสียงทั้งหมด" msgid "Voice unmute" msgstr "เปิดไมโครโฟน" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "การสนทนาด้วยเสียงในเบราว์เซอร์นี้ใช้อุปกรณ์เอาต์พุตของระบบ เปลี่ยนได้ในการตั้งค่าระบบ" + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "เป็นโมฆะ" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "การสนทนาใดบ้าง" msgid "Which rule was broken?" msgstr "ละเมิดกฎข้อไหน?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "ขณะที่เปิดใช้งานการกดเพื่อพูด ปุ่มลัดจะควบคุมไมโครโฟนของคุณ ดังนั้นปุ่มปิดไมโครโฟนจะถูกปิดใช้งาน" diff --git a/fluxer_app/src/features/i18n/locales/tr/messages.po b/fluxer_app/src/features/i18n/locales/tr/messages.po index 5ce4988de..1d5a7adaa 100644 --- a/fluxer_app/src/features/i18n/locales/tr/messages.po +++ b/fluxer_app/src/features/i18n/locales/tr/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} uygulamasının cihazlarınızı listelemek için kamera erişimine ihtiyacı var." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} uygulamasının cihazlarınızı listelemek için mikrofon erişimine ihtiyacı var." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {üye} other {üye}}" msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} çevrimiçi" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} başlatılamadı. Bunun yerine {effectiveLabel} kullanılıyor." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Etkinlik paylaşımı" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Etkinlik eşiği" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Adres" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Gürültü engelleme, yankı giderme ve kazanç ayarlarını kendiniz yapın." @@ -3606,11 +3610,11 @@ msgstr "{everyoneMention} ve {hereMention} etiketlerine izin ver" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "{PRODUCT_NAME} uygulamasının kameranıza erişmesine izin vermek için {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME} yolunu izleyin." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "{PRODUCT_NAME} uygulamasının mikrofonunuza erişmesine izin vermek için {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME} yolunu izleyin." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "{PRODUCT_NAME} uygulamasının mikrofonunuza erişmesine izin verin. Tarayıcınızın adres çubuğunu veya ayarlarını kontrol edin." @@ -3713,7 +3717,7 @@ msgstr "{readMessageHistoryPermissionLabel} izni olmayan üyelerin belirli bir t msgid "Allow mentions for this role" msgstr "Bu rolden bahsedilmesine izin ver" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Mikrofona izin ver" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Ses önizlemesi" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Ses işleme" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Dili otomatik algıla" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Etkinlik eşiğini otomatik ayarla" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Yerleşik kısayollar" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Tarayıcınızın veya sisteminizin yerleşik gürültü engellemesi." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Bağlantıyı temizle" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Net konuşma için mikrofonunuzu temizler." @@ -8985,7 +8989,7 @@ msgstr "Bir kamera veya sanal yakalama cihazı bağlayın, ardından tekrar dene msgid "Connect a display, then try again." msgstr "Bir ekran bağlayın, sonra tekrar deneyin." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Mikrofon bağlayıp tekrar deneyin." @@ -10672,8 +10676,8 @@ msgstr "Özel" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Kes" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Belirli bir ses seviyesinin altındaki sesi çok az CPU kullanarak keser." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "İndir düğmesi" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Masaüstü uygulamasını indir" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Etkinleştir" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "{permissionName} iznini etkinleştir" @@ -14220,7 +14224,7 @@ msgstr "Tüm sistem sesi" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Giriş sesi" @@ -14330,8 +14334,8 @@ msgstr "Akşam" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Mikrofon ses düzeyinizi dengeler, böylece sesiniz çok kısık çıkmaz." @@ -17360,7 +17364,7 @@ msgstr "Başka bir yola ihtiyacım var" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Anladım" @@ -17792,7 +17796,7 @@ msgstr "İçinde" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "\"İşletim sistemi\" modunda, yukarıda listelenen sözlükler tavsiye niteliğindedir. {PRODUCT_NAME}, desteklendiğinde bu dil etiketlerini işletim sisteminizin yazım denetleyicisine iletecektir. Tanımadığı etiketler yok sayılır." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "Tarayıcıda bas-konuş özelliği yalnızca {PRODUCT_NAME} sekmesi odaklıyken çalışır. Sistem genelinde bas-konuş özelliğini kullanmak için masaüstü uygulamasını yükleyin." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Giriş erişimi değiştirildi. Sistem genelindeki kısayolların kullanabilmesi için {productName} uygulamasını tamamen kapatıp yeniden başlatın." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Giriş ve çıkış" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Bunları güvende tutun. Yeniden oluşturmak mevcut entegrasyonları bozacaktır." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Tuşu bıraktıktan sonra kısa bir süre iletime devam et." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Açık tema" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Herhangi bir cihazda çalışan hafif klasik filtre." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Görünüm ve his" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "{0} kullanıyor gibisiniz. Bunun üzerine bir de {PRODUCT_NAME} ses işlemesi eklemek ses dalgalanmasına veya bozulmaya neden olabilir. Doğrudan giriş, sesinizi olduğu gibi iletir." @@ -21035,7 +21039,7 @@ msgstr "Mikrofon" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Mikrofon testi" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Ağ ve performans" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Arka plan gürültüsünün çoğunu gideren sinir ağı filtresi." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Sinir ağı filtresi, tam ses bant genişliği." @@ -22690,7 +22694,7 @@ msgstr "Eşleşme bulunamadı" msgid "No mentions yet" msgstr "Henüz bahsetme yok" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Mikrofon bulunamadı" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Gürültü" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Gürültü kapısı" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Yok" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Yok" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Bas konuş tuşu" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Bas konuş" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Bas konuş (sınırlı)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Bas konuş özelliği doğrudan girişte yok sayılır. Kullanmak için odaklanmış sese veya özel seçeneğine geçin." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Bas konuş açık. Konuşmak için {pushToTalkHint} tuşunu basılı tutun." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "{permissionName} etkinleştirilene kadar bas-konuş özelliği yalnızca {productName} odaklıyken çalışır. İzni değiştirdikten sonra, sistem genelindeki kısayol tuşlarının kullanabilmesi için {productName} uygulamasını tamamen kapatıp yeniden başlatın." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Bas konuş özelliği yalnızca tarayıcı sekmesi odaklıyken çalışır." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Önerilen" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Önerilen. Mikrofonunuzu temizleyerek net konuşma sağlar." @@ -26561,7 +26565,7 @@ msgstr "Göreceli" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Bırakma gecikmesi" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Yeni cihazınızda oturum açmak istediğiniz hesabı seçin." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Ses işleme modunu seçin" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Bu toplulukta mesaj gönderme devre dışı bırakıldı" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Stereo mikrofonunuzun her iki kanalını da gönderir. Tüm işlemelerin kapalı olmasını ve kanalın 128 kbps veya daha yüksek olmasını gerektirir." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Ham mikrofon sesini işlem yapmadan gönderir." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Sesinizi olduğu gibi gönderir. Harici ses yazılımı kullanıyorsanız en iyisidir." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Mikrofon sesinizi hiçbir engelleme olmadan gönderir." @@ -30136,7 +30140,7 @@ msgstr "Kısa kodlar" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "4. Adım" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Stereo mikrofon" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Üyenin bu toplulukta başkalarını duyması engellendi" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Hoparlörlerinizin sesinin mikrofonunuza geri gitmesini engeller." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Orta düzeyde CPU maliyetiyle güçlü kalite. Ekran paylaşımı için iyi bir Chromium alternatifi." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Konuşma için en güçlü sinirsel filtre. Sesi konuşma aralığıyla sınırlar." @@ -32539,7 +32543,7 @@ msgstr "Rahat düzene geç" msgid "Switch to dense layout" msgstr "Yoğun düzene geç" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Doğrudan girişe geç" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS hızı" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "İşlemeyi kendiniz ayarlayın." @@ -37106,6 +37110,10 @@ msgstr "İşletim sistemi bildirim merkezini kullanır. Kanal/topluluk bazında msgid "Uses:" msgstr "Kullanım:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "{requestedLabel} hazır olana kadar {effectiveLabel} kullanılıyor." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Sesli sohbete katılanlar" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Ses işleme" @@ -38118,6 +38126,10 @@ msgstr "Sağırlaştırma kaldırıldı" msgid "Voice unmute" msgstr "Mikrofon açıldı" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Bu tarayıcıda sesli görüşmeler sisteminizin çıkış cihazını kullanır. Sistem ayarlarınızdan değiştirebilirsiniz." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "İptal edildi" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Hangi sohbetler" msgid "Which rule was broken?" msgstr "Hangi kural ihlal edildi?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Bas konuş açıkken kısayolunuz mikrofonunuzu kontrol eder, bu yüzden sesi kapatma düğmesi devre dışı olur." diff --git a/fluxer_app/src/features/i18n/locales/uk/messages.po b/fluxer_app/src/features/i18n/locales/uk/messages.po index 9483b0291..5e8baaf0a 100644 --- a/fluxer_app/src/features/i18n/locales/uk/messages.po +++ b/fluxer_app/src/features/i18n/locales/uk/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "Щоб відобразити ваші пристрої, застосунку {productName} потрібен доступ до камери." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "Щоб переглянути список пристроїв, застосунку {productName} потрібен доступ до мікрофона." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {учасник} few {у msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} онлайн" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "Не вдалося запустити {requestedLabel}. Натомість використовується {effectiveLabel}." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Поширення інформації про активність" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Поріг активності" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Адреса" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Налаштуйте кожну опцію самостійно: приглушення шуму, ехокомпенсація та підсилення." @@ -3606,11 +3610,11 @@ msgstr "Дозволити згадки {everyoneMention} та {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Дозвольте {PRODUCT_NAME} доступ до камери в «{MACOS_SYSTEM_SETTINGS_NAME}» → «{MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME}» → «{MACOS_CAMERA_PERMISSION_NAME}»." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Дозвольте {PRODUCT_NAME} доступ до мікрофона в «{MACOS_SYSTEM_SETTINGS_NAME}» → «{MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME}» → «{MACOS_MICROPHONE_PERMISSION_NAME}»." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Дозвольте {PRODUCT_NAME} доступ до мікрофона. Перевірте адресний рядок або налаштування свого браузера." @@ -3713,7 +3717,7 @@ msgstr "Дозволити учасникам без дозволу «{readMessa msgid "Allow mentions for this role" msgstr "Дозволити згадки для цієї ролі" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Дозволити мікрофон" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Попередній перегляд аудіо" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Обробка аудіо" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Автоматично визначати мову" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Автоматично встановлювати поріг активності" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Вбудовані швидкі клавіші" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Вбудоване шумозаглушення з вашого браузера або системи." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Очистити посилання" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Очищає звук вашого мікрофона для чіткого мовлення." @@ -8985,7 +8989,7 @@ msgstr "Підключіть камеру або віртуальний прис msgid "Connect a display, then try again." msgstr "Підключіть дисплей, а потім спробуйте ще раз." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Підключіть мікрофон і спробуйте ще раз." @@ -10672,8 +10676,8 @@ msgstr "Власне джерело" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Вирізати" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Зрізає звук нижче порогу гучності з мінімальним навантаженням на процесор." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Кнопка завантаження" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Завантажити десктопний застосунок" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Увімкнути" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Увімкнути дозвіл «{permissionName}»" @@ -14220,7 +14224,7 @@ msgstr "Весь системний звук" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Звук входу" @@ -14330,8 +14334,8 @@ msgstr "Вечірній час" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Вирівнює гучність мікрофона, щоб ви не були занадто тихими." @@ -17360,7 +17364,7 @@ msgstr "Мені потрібен інший спосіб" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Я розумію" @@ -17792,7 +17796,7 @@ msgstr "У" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "У режимі «Операційна система» наведені вище словники мають рекомендаційний характер. {PRODUCT_NAME} передаватиме ці мовні теги засобу перевірки правопису вашої ОС, якщо він це підтримує. Теги, які він не розпізнає, ігноруються." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "У браузері функція «Натисни і говори» працює лише тоді, коли вкладка {PRODUCT_NAME} активна. Установіть десктопний застосунок для використання функції «Натисни і говори» в усій системі." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Доступ до введення змінено. Повністю вийдіть і перезапустіть {productName}, щоб системні комбінації клавіш могли його використовувати." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Введення та виведення" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Зберігайте їх у безпеці. Повторне генерування призведе до порушення наявних інтеграцій." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Ще трохи передавати звук після відпускання клавіші." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Світла тема" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Легкий класичний фільтр, працює на будь-якому пристрої." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Зовнішній вигляд" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Схоже, ви використовуєте {0}. Накладання обробки {PRODUCT_NAME} може спричинити накачування або спотворення. Прямий вхід передає ваш звук без змін." @@ -21035,7 +21039,7 @@ msgstr "Мікрофон" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Тест мікрофона" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Мережа та продуктивність" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Нейронний фільтр, що видаляє більшість фонових шумів." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Нейронний фільтр, повний діапазон звуку." @@ -22690,7 +22694,7 @@ msgstr "Нічого не знайдено" msgid "No mentions yet" msgstr "Згадок поки немає" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Мікрофон не знайдено" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Шум" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Шумовий гейт" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Немає" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Немає" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Клавіша «Натисни і говори»" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Натисни і говори" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Натисни і говори (обмежено)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Режим «Натисни і говори» не діє, коли вибрано обробку голосу «Прямий вхід». Перейдіть на «Чіткий голос» або «Власна», щоб скористатися ним." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Режим «Натисни і говори» увімкнено. Утримуйте {pushToTalkHint}, щоб говорити." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Функція «Натисни і говори» працює, лише коли застосунок «{productName}» активний, доки не буде ввімкнено дозвіл «{permissionName}». Після зміни дозволу повністю закрийте та перезапустіть застосунок «{productName}», щоб системні гарячі клавіші могли його використовувати." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Функція «Натисни і говори» працює, лише коли вкладка браузера активна." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Рекомендовано" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Рекомендовано. Очищає звук мікрофона для чіткої мови." @@ -26561,7 +26565,7 @@ msgstr "Відносний" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Затримка відпускання" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Виберіть обліковий запис, за допомогою якого ви хочете увійти на новому пристрої." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Виберіть режим обробки голосу" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Надсилання повідомлень у цій спільноті вимкнено" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Надсилає обидва канали стереомікрофона. Потребує вимкнення всієї обробки та каналу зі швидкістю 128 Кбіт/с або вище." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Надсилає звук мікрофона без жодної обробки." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Надсилає ваш звук без змін. Найкраще, якщо ви використовуєте зовнішні аудіопрограми." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Надсилає аудіо з вашого мікрофона без приглушення." @@ -30136,7 +30140,7 @@ msgstr "Шорткоди" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Крок 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Стереомікрофон" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Заборонено учаснику чути інших у цій спільноті" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Запобігає зацикленню звуку з динаміків у мікрофон." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Висока якість за помірної витрати ЦП. Хороший запасний варіант Chromium для демонстрації екрана." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Найпотужніший нейронний фільтр для мовлення. Обмежує звук діапазоном мовлення." @@ -32539,7 +32543,7 @@ msgstr "Перейти до зручного вигляду" msgid "Switch to dense layout" msgstr "Перейти до щільного вигляду" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Перейти на прямий вхід" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Швидкість TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Налаштуйте обробку самостійно." @@ -37106,6 +37110,10 @@ msgstr "Використовує центр сповіщень ОС. Щоб на msgid "Uses:" msgstr "Кількість використань:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Використовується {effectiveLabel}, доки {requestedLabel} не буде готовий." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Учасники голосового чату" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Обробка голосу" @@ -38118,6 +38126,10 @@ msgstr "Увімкнення звуку в голосовому чаті" msgid "Voice unmute" msgstr "Увімкнення мікрофона" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "У цьому браузері голосові виклики використовують системний пристрій виведення. Змініть його в налаштуваннях системи." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Анульовано" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Які розмови" msgid "Which rule was broken?" msgstr "Яке правило було порушено?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Коли ввімкнено режим «Натисни і говори», мікрофоном керує ваша комбінація клавіш, тому кнопка вимкнення мікрофона неактивна." diff --git a/fluxer_app/src/features/i18n/locales/vi/messages.po b/fluxer_app/src/features/i18n/locales/vi/messages.po index c7c6851d2..b43b1b3c5 100644 --- a/fluxer_app/src/features/i18n/locales/vi/messages.po +++ b/fluxer_app/src/features/i18n/locales/vi/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} cần quyền truy cập camera để liệt kê thiết bị của bạn." #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} cần quyền truy cập micrô để liệt kê thiết bị của bạn." @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {thành viên} other {th msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} đang hoạt động" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "Không thể khởi động {requestedLabel}. Đang dùng {effectiveLabel} thay thế." + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "Chia sẻ hoạt động" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "Ngưỡng hoạt động" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "Địa chỉ" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "Tự điều chỉnh từng cài đặt: khử tiếng ồn, loại bỏ tiếng vọng và độ lợi." @@ -3606,11 +3610,11 @@ msgstr "Cho phép {everyoneMention} và {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "Cho phép {PRODUCT_NAME} truy cập camera của bạn trong {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "Cho phép {PRODUCT_NAME} truy cập micrô của bạn trong {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "Cho phép {PRODUCT_NAME} truy cập micrô của bạn. Kiểm tra thanh địa chỉ hoặc cài đặt trình duyệt của bạn." @@ -3713,7 +3717,7 @@ msgstr "Cho phép thành viên không có quyền {readMessageHistoryPermissionL msgid "Allow mentions for this role" msgstr "Cho phép nhắc đến vai trò này" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "Cho phép truy cập micro" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "Xem trước âm thanh" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "Xử lý âm thanh" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "Tự động phát hiện ngôn ngữ" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "Tự động đặt ngưỡng hoạt động" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "Phím tắt tích hợp" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "Tính năng khử tiếng ồn tích hợp từ trình duyệt hoặc hệ thống của bạn." @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "Dọn dẹp liên kết" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "Xử lý âm thanh micrô để giọng nói rõ ràng hơn." @@ -8985,7 +8989,7 @@ msgstr "Kết nối camera hoặc thiết bị ghi hình ảo, rồi thử lại msgid "Connect a display, then try again." msgstr "Kết nối một màn hình, rồi thử lại." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "Kết nối micrô và thử lại." @@ -10672,8 +10676,8 @@ msgstr "Tùy chỉnh" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "Cắt" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "Cắt âm thanh dưới ngưỡng âm lượng, dùng rất ít CPU." @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "Nút tải xuống" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "Tải ứng dụng máy tính" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "Bật" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "Bật quyền {permissionName}" @@ -14220,7 +14224,7 @@ msgstr "Toàn bộ âm thanh hệ thống" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "Âm thanh vào phòng" @@ -14330,8 +14334,8 @@ msgstr "Buổi tối" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "Làm đều âm lượng mic của bạn để không bị quá nhỏ." @@ -17360,7 +17364,7 @@ msgstr "Tôi cần một cách khác" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "Tôi đã hiểu" @@ -17792,7 +17796,7 @@ msgstr "Trong" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "Ở chế độ \"Hệ điều hành\", các từ điển được liệt kê ở trên chỉ mang tính chất gợi ý. {PRODUCT_NAME} sẽ chuyển các thẻ ngôn ngữ này đến trình kiểm tra chính tả của hệ điều hành nếu được hỗ trợ. Các thẻ không được nhận dạng sẽ bị bỏ qua." -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "Trong trình duyệt, tính năng nhấn để nói chỉ hoạt động khi tab {PRODUCT_NAME} đang hoạt động. Hãy cài đặt ứng dụng máy tính để dùng nhấn để nói trên toàn hệ thống." @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "Quyền truy cập đầu vào đã thay đổi. Hãy thoát hoàn toàn và khởi động lại {productName} để các phím tắt toàn hệ thống có thể sử dụng quyền này." #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "Đầu vào và đầu ra" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "Hãy bảo mật những thông tin này. Việc tạo lại sẽ làm hỏng các tích hợp hiện có." #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "Tiếp tục truyền trong một khoảng thời gian ngắn sau khi nhả nút." @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "Giao diện sáng" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "Bộ lọc cổ điển nhẹ, hoạt động trên mọi thiết bị." @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "Giao diện người dùng" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "Có vẻ như bạn đang dùng {0}. Việc xếp chồng xử lý của {PRODUCT_NAME} lên trên có thể gây ra hiện tượng bơm tiếng hoặc méo tiếng. Đầu vào trực tiếp sẽ truyền âm thanh của bạn mà không bị thay đổi." @@ -21035,7 +21039,7 @@ msgstr "Mic" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "Kiểm tra mic" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "Mạng và hiệu suất" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "Bộ lọc nơ-ron loại bỏ hầu hết tiếng ồn nền." #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "Bộ lọc nơ-ron, băng thông âm thanh đầy đủ." @@ -22690,7 +22694,7 @@ msgstr "Không tìm thấy kết quả nào" msgid "No mentions yet" msgstr "Chưa có lượt nhắc đến nào" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "Không tìm thấy micrô" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "Tiếng ồn" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "Cổng lọc nhiễu" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "Không" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "Không" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "Phím nhấn để nói" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "Nhấn để nói" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "Nhấn để nói (giới hạn)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "Nhấn để nói sẽ bị bỏ qua ở chế độ đầu vào trực tiếp. Chuyển sang giọng nói tập trung hoặc tùy chỉnh để sử dụng." @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "Đã bật chế độ nhấn để nói. Giữ {pushToTalkHint} để nói." #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "Nhấn để nói chỉ hoạt động khi cửa sổ {productName} đang hoạt động cho đến khi {permissionName} được bật. Sau khi thay đổi quyền, hãy thoát hoàn toàn và khởi động lại {productName} để các phím tắt toàn hệ thống có thể dùng quyền này." #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "Nhấn để nói chỉ hoạt động khi tab trình duyệt đang hoạt động." @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "Được đề xuất" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "Được đề xuất. Xử lý âm thanh micrô để giọng nói rõ ràng hơn." @@ -26561,7 +26565,7 @@ msgstr "Tương đối" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "Độ trễ nhả nút" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "Chọn tài khoản bạn muốn đăng nhập trên thiết bị mới của mình." #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "Chọn chế độ xử lý giọng nói" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "Đã tắt tính năng gửi tin nhắn trong cộng đồng này" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "Gửi cả hai kênh của micrô stereo. Yêu cầu tắt mọi xử lý và kênh có tốc độ 128 kbps trở lên." #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "Gửi âm thanh mic thô không qua xử lý." #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "Gửi âm thanh của bạn nguyên bản. Tốt nhất nếu bạn đang dùng phần mềm âm thanh bên ngoài." #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "Gửi âm thanh micrô của bạn mà không khử tiếng ồn." @@ -30136,7 +30140,7 @@ msgstr "Mã ngắn" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "Bước 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "Micrô stereo" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "Đã ngăn thành viên nghe người khác trong cộng đồng này" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "Ngăn âm thanh từ loa vọng ngược vào micrô." @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "Chất lượng tốt với chi phí CPU vừa phải. Lựa chọn dự phòng tốt trên Chromium khi chia sẻ màn hình." #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "Bộ lọc thần kinh mạnh nhất cho giọng nói, giới hạn âm thanh trong phạm vi giọng nói." @@ -32539,7 +32543,7 @@ msgstr "Chuyển sang bố cục thoải mái" msgid "Switch to dense layout" msgstr "Chuyển sang bố cục dày đặc" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "Chuyển sang nhập trực tiếp" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "Tốc độ TTS" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "Tự điều chỉnh quá trình xử lý." @@ -37106,6 +37110,10 @@ msgstr "Sử dụng trung tâm thông báo của hệ điều hành. Để kiể msgid "Uses:" msgstr "Lượt dùng:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "Đang dùng {effectiveLabel} cho đến khi {requestedLabel} sẵn sàng." + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "Người tham gia trò chuyện thoại" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "Xử lý giọng nói" @@ -38118,6 +38126,10 @@ msgstr "Bật tiếng nghe" msgid "Voice unmute" msgstr "Bật micrô" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "Trò chuyện thoại sử dụng thiết bị đầu ra của hệ thống trong trình duyệt này. Hãy thay đổi thiết bị trong cài đặt hệ thống." + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "Đã hủy" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "Những cuộc trò chuyện nào" msgid "Which rule was broken?" msgstr "Quy tắc nào đã bị vi phạm?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "Khi bật tính năng nhấn để nói, phím tắt sẽ điều khiển micrô của bạn, vì vậy nút tắt tiếng sẽ bị vô hiệu hóa." diff --git a/fluxer_app/src/features/i18n/locales/zh-CN/messages.po b/fluxer_app/src/features/i18n/locales/zh-CN/messages.po index eb6543011..667006b2b 100644 --- a/fluxer_app/src/features/i18n/locales/zh-CN/messages.po +++ b/fluxer_app/src/features/i18n/locales/zh-CN/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} 需要摄像头权限才能列出你的设备。" #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} 需要麦克风权限才能列出你的设备。" @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, other {位成员}}" msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} 人在线" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} 无法启动。正在改用 {effectiveLabel}。" + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "活动共享" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "活动阈值" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "地址" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "自行调整各项设置:降噪、回声消除和增益。" @@ -3606,11 +3610,11 @@ msgstr "允许提及{everyoneMention}和{hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "请在“{MACOS_SYSTEM_SETTINGS_NAME}”→“{MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME}”→“{MACOS_CAMERA_PERMISSION_NAME}”中允许 {PRODUCT_NAME} 访问你的摄像头。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "请在“{MACOS_SYSTEM_SETTINGS_NAME}”→“{MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME}”→“{MACOS_MICROPHONE_PERMISSION_NAME}”中允许 {PRODUCT_NAME} 访问你的麦克风。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "允许 {PRODUCT_NAME} 访问你的麦克风。请检查浏览器地址栏或设置。" @@ -3713,7 +3717,7 @@ msgstr "允许没有 {readMessageHistoryPermissionLabel} 权限的成员查看 msgid "Allow mentions for this role" msgstr "允许提及此身份组" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "允许使用麦克风" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "音频预览" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "音频处理" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "自动检测语言" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "自动设置活动阈值" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "内置快捷键" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "浏览器或系统内置的降噪功能。" @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "清理链接" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "优化麦克风收音,让语音更清晰。" @@ -8985,7 +8989,7 @@ msgstr "连接摄像头或虚拟捕捉设备后重试。" msgid "Connect a display, then try again." msgstr "连接显示器后重试。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "连接麦克风后重试。" @@ -10672,8 +10676,8 @@ msgstr "自定义" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "剪切" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "切断低于响度阈值的音频,CPU 占用极低。" @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "下载按钮" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "下载桌面应用" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "启用" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "启用“{permissionName}”权限" @@ -14220,7 +14224,7 @@ msgstr "整个系统音频" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "入场音效" @@ -14330,8 +14334,8 @@ msgstr "晚上" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "均衡麦克风音量,避免声音过小。" @@ -17360,7 +17364,7 @@ msgstr "我需要其他方式" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "我知道了" @@ -17792,7 +17796,7 @@ msgstr "在" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "在“操作系统”模式下,上方列出的词典仅供参考。如果支持,{PRODUCT_NAME} 会将这些语言标签传递给你的操作系统拼写检查器。无法识别的标签将被忽略。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "在浏览器中,按住说话功能仅在 {PRODUCT_NAME} 标签页处于焦点时可用。请安装桌面应用以使用系统范围的按住说话功能。" @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "输入访问权限已更改。请完全退出并重新启动 {productName},系统级快捷键才能使用该权限。" #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "输入和输出" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "请妥善保管。重新生成会破坏现有集成。" #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "松开按键后继续传输一小段时间。" @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "浅色主题" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "轻量级经典滤镜,适用于任何设备。" @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "外观风格" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "看起来你正在使用 {0}。在此基础上再叠加 {PRODUCT_NAME} 的音频处理可能会导致抽吸或失真。直接输入会原样传递你的音频。" @@ -21035,7 +21039,7 @@ msgstr "麦克风" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "麦克风测试" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "网络和性能" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "神经网络滤波器,可消除大部分背景噪音。" #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "神经网络滤波器,全音频带宽。" @@ -22690,7 +22694,7 @@ msgstr "未找到匹配项" msgid "No mentions yet" msgstr "暂无提及" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "未找到麦克风" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "噪音" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "噪声门" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "无" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "无" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "按住说话按键" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "按住说话" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "按住说话(功能受限)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "直接输入模式下会忽略按住说话。请切换到人声优化或自定义模式后使用。" @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "按住说话已开启。按住 {pushToTalkHint} 讲话。" #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "在启用“{permissionName}”之前,按住说话仅在 {productName} 处于焦点时可用。更改权限后,请完全退出并重新启动 {productName},系统级热键才能使用此功能。" #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "按住说话功能仅在浏览器标签页处于焦点时可用。" @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "推荐" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "推荐。优化麦克风,让语音更清晰。" @@ -26561,7 +26565,7 @@ msgstr "相对" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "松开延迟" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "选择你想在新设备上登录的账号。" #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "选择语音处理模式" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "此社区已禁用发送消息" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "发送立体声麦克风的两个声道。需要关闭所有处理,并将声道设置为 128 kbps 或更高。" #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "发送原始麦克风音频,不进行任何处理。" #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "直接发送你的音频,不做任何处理。如果你正在使用外部音频软件,推荐此选项。" #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "发送你的麦克风音频,不做降噪处理。" @@ -30136,7 +30140,7 @@ msgstr "短代码" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "第 4 步" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "立体声麦克风" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "已阻止该成员在此社区中收听他人" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "防止扬声器声音循环回麦克风。" @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "画质出色,CPU 占用适中。屏幕共享时是不错的 Chromium 备用方案。" #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "最强的神经网络滤波器,将音频限制在语音范围内。" @@ -32539,7 +32543,7 @@ msgstr "切换为舒适布局" msgid "Switch to dense layout" msgstr "切换为紧凑布局" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "切换到直接输入" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS 语速" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "自行调整处理方式。" @@ -37106,6 +37110,10 @@ msgstr "使用系统通知中心。如需按频道或按社区设置,请右键 msgid "Uses:" msgstr "使用次数:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "在 {requestedLabel} 准备就绪之前使用 {effectiveLabel}。" + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "语音参与者" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "语音处理" @@ -38118,6 +38126,10 @@ msgstr "语音解除拒听" msgid "Voice unmute" msgstr "语音取消静音" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "此浏览器中的语音通话使用系统输出设备。请在系统设置中更改。" + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "已作废" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "哪些对话" msgid "Which rule was broken?" msgstr "违反了哪条规则?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "开启按住说话时,快捷键会控制你的麦克风,因此静音按钮已禁用。" diff --git a/fluxer_app/src/features/i18n/locales/zh-TW/messages.po b/fluxer_app/src/features/i18n/locales/zh-TW/messages.po index 181ddb06d..fa74f9510 100644 --- a/fluxer_app/src/features/i18n/locales/zh-TW/messages.po +++ b/fluxer_app/src/features/i18n/locales/zh-TW/messages.po @@ -1753,7 +1753,7 @@ msgid "{productName} needs camera access to list your devices." msgstr "{productName} 需要相機存取權限才能列出您的裝置。" #. Voice settings notice shown when microphone permission has not been granted. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:138 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:141 msgid "{productName} needs microphone access to list your devices." msgstr "{productName} 需要麥克風存取權限才能列出您的裝置。" @@ -1866,6 +1866,10 @@ msgstr "{renderedMemberCount} {memberCount, plural, one {位成員} other {位 msgid "{renderedPresenceCount} online" msgstr "{renderedPresenceCount} 位在線上" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:103 +msgid "{requestedLabel} could not start. Using {effectiveLabel} instead." +msgstr "{requestedLabel} 無法啟動。正在改用 {effectiveLabel}。" + #. Compact stream info pill label. {resolution} is a technical token such as 1080p or 4K. {fps} is the frame rate. FPS is a technical token. #: src/features/voice/components/StreamInfoPill.tsx:14 msgid "{resolution} {fps} FPS" @@ -2869,7 +2873,7 @@ msgid "Activity sharing" msgstr "活動分享" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:473 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:488 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102 msgid "Activity threshold" msgstr "語音偵測靈敏度" @@ -3337,7 +3341,7 @@ msgid "Address" msgstr "電子郵件地址" #. Description for the custom profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:96 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:99 msgid "Adjust each setting yourself: noise suppression, echo cancellation, and gain." msgstr "自行調整每個設定:雜訊抑制、回音消除和增益。" @@ -3606,11 +3610,11 @@ msgstr "允許 {everyoneMention} 和 {hereMention}" msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}." msgstr "在「{MACOS_SYSTEM_SETTINGS_NAME}」→「{MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME}」→「{MACOS_CAMERA_PERMISSION_NAME}」中允許 {PRODUCT_NAME} 存取您的相機。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:546 msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}." msgstr "請在「{MACOS_SYSTEM_SETTINGS_NAME}」→「{MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME}」→「{MACOS_MICROPHONE_PERMISSION_NAME}」中允許 {PRODUCT_NAME} 存取您的麥克風。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:551 msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings." msgstr "允許 {PRODUCT_NAME} 存取您的麥克風。請檢查瀏覽器的網址列或設定。" @@ -3713,7 +3717,7 @@ msgstr "允許沒有「{readMessageHistoryPermissionLabel}」權限的成員查 msgid "Allow mentions for this role" msgstr "允許提及此身分組" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:555 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:571 msgid "Allow microphone" msgstr "允許麥克風" @@ -4777,7 +4781,7 @@ msgid "Audio preview" msgstr "音訊預覽" #. Voice settings modal title for microphone processing options. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:48 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:51 msgid "Audio processing" msgstr "音訊處理" @@ -4987,8 +4991,8 @@ msgid "Auto-detect language" msgstr "自動偵測語言" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:460 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:119 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:475 msgid "Auto-set activity threshold" msgstr "自動設定活動門檻" @@ -6069,7 +6073,7 @@ msgid "Built-in shortcuts" msgstr "內建快速鍵" #. Description for the standard noise suppression option, which uses the platform suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:11 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:16 msgid "Built-in suppression from your browser or system." msgstr "瀏覽器或系統內建的雜訊抑制。" @@ -7841,7 +7845,7 @@ msgid "Clean link" msgstr "乾淨連結" #. Description for the focused-voice option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:31 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:34 msgid "Cleans up your mic for clear speech." msgstr "讓您的麥克風更清晰地收音。" @@ -8985,7 +8989,7 @@ msgstr "請連接相機或虛擬擷取裝置,然後再試一次。" msgid "Connect a display, then try again." msgstr "請連接顯示器後再試一次。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:556 msgid "Connect a microphone and try again." msgstr "請連接麥克風後再試一次。" @@ -10672,8 +10676,8 @@ msgstr "自訂" #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. #. Voice input processing profile where the user configures processing manually. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:91 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:39 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:94 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:42 #: src/features/voice/components/VoiceSettingsMenus.tsx:70 msgctxt "voice-processing-profile" msgid "Custom" @@ -10937,7 +10941,7 @@ msgid "Cut" msgstr "剪下" #. Description for the noise gate suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:34 msgid "Cuts audio below a loudness threshold with minimal CPU usage." msgstr "切除低於響度閾值的音訊,CPU 用量極低。" @@ -12757,7 +12761,7 @@ msgid "Download button" msgstr "下載按鈕" #. Button or menu action label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:104 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:107 msgid "Download desktop app" msgstr "下載桌面版應用程式" @@ -13568,7 +13572,7 @@ msgid "Enable" msgstr "啟用" #. Voice settings CTA label for opening a platform permission prompt. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:124 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:127 msgid "Enable {permissionName} permission" msgstr "啟用「{permissionName}」權限" @@ -14220,7 +14224,7 @@ msgstr "整個系統音訊" #. Voice menu submenu label that contains per-user entrance sound mute and volume controls. #: src/features/ui/action_menu/items/VoiceParticipantMenuData.tsx:181 #: src/features/ui/action_menu/items/VoiceParticipantMenuItems.tsx:310 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:189 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:192 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:150 msgid "Entrance sound" msgstr "進場音效" @@ -14330,8 +14334,8 @@ msgstr "晚上" #. Description for the automatic gain control toggle in the voice processing settings. #. Description for the automatic gain control toggle in the voice processing settings. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:173 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:60 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:176 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:63 msgid "Evens out your mic volume so you are not too quiet." msgstr "讓您的麥克風音量更平均,避免太小聲。" @@ -17360,7 +17364,7 @@ msgstr "我需要其他方式" #. Short label in the voice tab. Keep it concise. #: src/features/channel/components/MatureContentChannelGate.tsx:207 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:108 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:111 msgid "I understand" msgstr "我了解了" @@ -17792,7 +17796,7 @@ msgstr "在" msgid "In \"Operating system\" mode, dictionaries listed above are advisory. {PRODUCT_NAME} will pass these language tags to your OS spellchecker when supported. Tags it doesn't recognize are ignored." msgstr "在「作業系統」模式中,上方列出的字典僅供參考。如果支援,{PRODUCT_NAME} 會將這些語言標籤傳遞給您的作業系統拼字檢查工具。無法辨識的標籤將會被忽略。" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:307 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:322 msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk." msgstr "在瀏覽器中,「按住說話」只有在 {PRODUCT_NAME} 分頁為焦點時才能運作。請安裝桌面版應用程式,以使用全系統的按住說話功能。" @@ -18083,7 +18087,7 @@ msgid "Input access was changed. Fully quit and restart {productName} so system- msgstr "輸入存取權已變更。請完全結束並重新啟動 {productName},全系統快速鍵才能使用。" #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:177 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:180 msgid "Input and output" msgstr "輸入與輸出" @@ -18950,7 +18954,7 @@ msgid "Keep these safe. Regenerating will break existing integrations." msgstr "請妥善保管。重新產生金鑰會導致現有的整合服務中斷。" #. Description for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:79 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:82 msgid "Keep transmitting briefly after release." msgstr "放開按鍵後仍會短暫繼續傳送。" @@ -19417,7 +19421,7 @@ msgid "Light theme" msgstr "淺色主題" #. Description for the Speex noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:33 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:38 msgid "Lightweight classic filter that works on any device." msgstr "輕量級經典濾鏡,適用於任何裝置。" @@ -19782,7 +19786,7 @@ msgid "Look and feel" msgstr "外觀和風格" #. placeholder {0}: externalProcessor.name -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:671 msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched." msgstr "看來您正在使用 {0}。在此之上再疊加 {PRODUCT_NAME} 的處理,可能會導致音量忽大忽小或失真。直接輸入會原封不動地傳送您的音訊。" @@ -21035,7 +21039,7 @@ msgstr "麥克風" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:185 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:188 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:142 msgid "Mic test" msgstr "麥克風測試" @@ -22114,12 +22118,12 @@ msgid "Networking and performance" msgstr "網路與效能" #. Description for the enhanced (DeepFilterNet3) noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:7 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:12 msgid "Neural filter that removes most background noise." msgstr "神經網路濾波器,可移除大部分背景噪音。" #. Description for the RNNoise noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:37 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:42 msgid "Neural filter, full audio bandwidth." msgstr "神經網路濾波器,完整音訊頻寬。" @@ -22690,7 +22694,7 @@ msgstr "沒有找到符合的項目" msgid "No mentions yet" msgstr "還沒有被提及的訊息" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:525 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:541 msgid "No microphone found" msgstr "找不到麥克風" @@ -22985,7 +22989,7 @@ msgid "Noise" msgstr "噪音" #. Noise suppression option label for the noise gate backend. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:24 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:29 msgctxt "noise-suppression-option" msgid "Noise gate" msgstr "雜訊閘" @@ -23022,7 +23026,7 @@ msgid "None" msgstr "無" #. Noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:15 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 msgctxt "noise-suppression-option" msgid "None" msgstr "無" @@ -25990,18 +25994,18 @@ msgid "Push to talk key" msgstr "按住說話按鍵" #. Switch label in the voice tab toggling push-to-talk mode. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:112 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:346 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:115 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 #: src/features/voice/components/VoiceSettingsMenus.tsx:419 msgid "Push-to-talk" msgstr "按住說話" #. Short label in the voice tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:100 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:103 msgid "Push-to-talk (limited)" msgstr "按住說話(受限)" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:676 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:701 msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it." msgstr "直接輸入模式會忽略按住說話。請切換為語音聚焦或自訂才能使用。" @@ -26011,12 +26015,12 @@ msgid "Push-to-talk is on. Hold {pushToTalkHint} to speak." msgstr "已開啟「按住說話」。按住 {pushToTalkHint} 即可說話。" #. Voice settings warning shown when macOS Input Monitoring is required for system-wide push-to-talk. {productName} is the app name and {permissionName} is the macOS permission name. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:132 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:135 msgid "Push-to-talk only works while {productName} is focused until {permissionName} is enabled. After changing the permission, fully quit and restart {productName} so system-wide hotkeys can use it." msgstr "在啟用「{permissionName}」之前,按住說話僅在 {productName} 視窗使用中時有效。變更權限後,請完全結束並重新啟動 {productName},系統層級的快速鍵才能使用此功能。" #. Voice settings warning shown when push-to-talk is enabled in a browser. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:128 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:131 msgid "Push-to-talk only works while the browser tab is focused." msgstr "按住說話僅在瀏覽器分頁使用中時有效。" @@ -26301,7 +26305,7 @@ msgid "Recommended" msgstr "推薦" #. Description for the focused voice profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:83 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:86 msgid "Recommended. Cleans up your mic for clear speech." msgstr "建議使用。讓您的麥克風更清晰地收音。" @@ -26561,7 +26565,7 @@ msgstr "相對" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Short label for push-to-talk release delay. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:75 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:78 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:94 msgid "Release delay" msgstr "放開後延遲" @@ -29287,7 +29291,7 @@ msgid "Select the account you want to sign in with on your new device." msgstr "選擇您想在新裝置上登入的帳號。" #. Aria label for the voice processing radio group in the voice settings tab. Keep it concise. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:120 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:123 msgid "Select voice processing mode" msgstr "選取語音處理模式" @@ -29607,22 +29611,22 @@ msgid "Sending messages is disabled in this community" msgstr "此社群已停用訊息傳送功能" #. Description for the stereo microphone switch in the voice settings. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:49 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:54 msgid "Sends both channels of a stereo microphone. Needs all processing off and a channel at 128 kbps or higher." msgstr "傳送立體聲麥克風的兩個聲道。需要關閉所有處理,且聲道速率為 128 kbps 或更高。" #. Description for the studio / direct-input option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:35 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:38 msgid "Sends raw mic audio with no processing." msgstr "傳送未經處理的原始麥克風音訊。" #. Description for the direct input profile option in the voice tab. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:87 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:90 msgid "Sends your audio untouched. Best if you're using external audio software." msgstr "直接傳送您的音訊。如果您使用外部音訊軟體,此為最佳選擇。" #. Description for the noise suppression option that disables suppression. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:20 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:25 msgid "Sends your microphone audio with no suppression." msgstr "將您的麥克風音訊傳送出去,不進行任何降噪處理。" @@ -30136,7 +30140,7 @@ msgstr "短代碼" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #: src/features/user/components/modals/tabs/keybinds_tab/CustomKeybindRow.tsx:121 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:361 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:376 #: src/features/user/components/settings_utils/search_index/KeybindsIndex.ts:38 #: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:110 msgid "Shortcut" @@ -31932,7 +31936,7 @@ msgid "Step 4" msgstr "步驟 4" #. Switch label in the voice settings that sends both channels of a stereo microphone. Keep it concise. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:45 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:50 msgid "Stereo microphone" msgstr "立體聲麥克風" @@ -32204,7 +32208,7 @@ msgid "Stopped the member from hearing others in this community" msgstr "已讓該成員無法在此社群中聽到其他人說話" #. Description for the echo cancellation toggle in the custom voice processing settings. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:56 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:59 msgid "Stops your speakers from looping back into your mic." msgstr "避免喇叭的聲音回傳到您的麥克風。" @@ -32334,7 +32338,7 @@ msgid "Strong quality at moderate CPU cost. Good Chromium fallback for screen sh msgstr "畫質佳,CPU 耗用中等。Chromium 螢幕分享的理想備用方案。" #. Description for the GTCRN noise suppression option. -#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:41 +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:46 msgid "Strongest neural filter for speech. Limits audio to the speech range." msgstr "最強的語音神經網路濾波器。將音訊限制在語音範圍內。" @@ -32539,7 +32543,7 @@ msgstr "切換成舒適版面配置" msgid "Switch to dense layout" msgstr "切換成緊湊版面配置" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:666 msgid "Switch to direct input" msgstr "切換為直接輸入" @@ -35126,7 +35130,7 @@ msgid "TTS speed" msgstr "TTS 語速" #. Description for the custom option in the voice processing settings radio group. -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:44 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:47 msgid "Tune the processing yourself." msgstr "自行調整處理方式。" @@ -37106,6 +37110,10 @@ msgstr "使用作業系統的通知中心。如要設定個別頻道或社群的 msgid "Uses:" msgstr "使用次數:" +#: src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts:102 +msgid "Using {effectiveLabel} until {requestedLabel} is ready." +msgstr "在 {requestedLabel} 準備就緒之前使用 {effectiveLabel}。" + #. Developer nagbar status: banner follows real account state. #: src/features/devtools/components/NagbarControls.ts:106 msgid "Using actual account state" @@ -38072,8 +38080,8 @@ msgid "Voice participants" msgstr "語音參與者" #. Voice settings radio group label for microphone processing profile. -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:639 -#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:52 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:661 +#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55 msgid "Voice processing" msgstr "語音處理" @@ -38118,6 +38126,10 @@ msgstr "語音解除耳機靜音" msgid "Voice unmute" msgstr "語音取消靜音" +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:590 +msgid "Voice uses your system output device in this browser. Change it in your system settings." +msgstr "此瀏覽器中的語音通話使用系統輸出裝置。請在系統設定中變更。" + #. Billing invoice status for an invoice canceled before payment. #: src/features/app/components/dialogs/components/plutonium/InvoiceList.tsx:29 msgid "Void" @@ -38128,7 +38140,7 @@ msgstr "已作廢" #. Settings search synonym. Used to match this term when the user types it in the settings search bar. #. Subsection title in the voice tab. Keep it concise. #: src/features/i18n/utils/CommonMessageDescriptors.ts:378 -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:181 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:184 #: src/features/user/components/settings_utils/search_index/NotificationsIndex.ts:86 #: src/features/user/components/settings_utils/section_registry/SharedDescriptors.ts:183 msgid "Volume" @@ -38801,7 +38813,7 @@ msgstr "哪些對話" msgid "Which rule was broken?" msgstr "違反了哪一條規則?" -#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:355 +#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:370 msgid "While push-to-talk is on, your shortcut controls your microphone, so the mute button is disabled." msgstr "啟用「按住說話」時,您的快速鍵會控制麥克風,因此靜音按鈕會停用。" diff --git a/fluxer_app/src/features/user/components/modals/tabs/UserVoiceTab.tsx b/fluxer_app/src/features/user/components/modals/tabs/UserVoiceTab.tsx index 6329b1ee5..8cab727ac 100644 --- a/fluxer_app/src/features/user/components/modals/tabs/UserVoiceTab.tsx +++ b/fluxer_app/src/features/user/components/modals/tabs/UserVoiceTab.tsx @@ -33,11 +33,13 @@ import {useMediaPermission} from '@app/features/user/components/modals/tabs/hook import styles from '@app/features/user/components/modals/tabs/UserVoiceTab.module.css'; import * as VoiceSettingsCommands from '@app/features/voice/commands/VoiceSettingsCommands'; import MediaEngine from '@app/features/voice/engine/MediaEngineFacade'; +import {supportsVoiceOutputDeviceSelection} from '@app/features/voice/engine/VoiceSharedAudioContext'; import type VoiceSettings from '@app/features/voice/state/VoiceSettings'; import { type ExternalAudioProcessorMatch, findExternalProcessorForDevice, } from '@app/features/voice/utils/ExternalAudioProcessor'; +import {prefetchDeepFilterAssets} from '@app/features/voice/utils/noise_suppression/DeepFilter'; import type {VoiceNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionBackends'; import { getNoiseSuppressionChoiceValues, @@ -48,6 +50,7 @@ import { } from '@app/features/voice/utils/noise_suppression/NoiseSuppressionChoices'; import { getNoiseSuppressionChoiceLabel, + getNoiseSuppressionFallbackMessage, STEREO_MICROPHONE_DESCRIPTION_DESCRIPTOR, STEREO_MICROPHONE_DESCRIPTOR, } from '@app/features/voice/utils/noise_suppression/NoiseSuppressionLabels'; @@ -245,7 +248,10 @@ export const VoiceTab: React.FC = observer(({voiceSettings, autoR const defaultPttCombo = getDefaultKeybind('voice_push_to_talk', i18n); const inputHasLabels = hasDeviceLabels(inputDevices); const effectiveInputDeviceId = resolveEffectiveDeviceId(inputDeviceId, inputDevices) ?? 'default'; - const effectiveOutputDeviceId = resolveEffectiveDeviceId(outputDeviceId, outputDevices) ?? 'default'; + const canSelectOutputDevice = supportsVoiceOutputDeviceSelection(); + const effectiveOutputDeviceId = canSelectOutputDevice + ? (resolveEffectiveDeviceId(outputDeviceId, outputDevices) ?? 'default') + : 'default'; const activeInputDevice = inputDevices.find((d) => d.deviceId === effectiveInputDeviceId) ?? null; const activeInputLabel = activeInputDevice?.label || null; const voiceProcessingMode = voiceSettings.getVoiceProcessingModeForDeviceLabel(activeInputLabel); @@ -256,6 +262,9 @@ export const VoiceTab: React.FC = observer(({voiceSettings, autoR useEffect(() => { if (pttReleaseDelay !== selectedPttReleaseDelay) Keybind.setPushToTalkReleaseDelay(selectedPttReleaseDelay); }, [pttReleaseDelay, selectedPttReleaseDelay]); + useEffect(() => { + prefetchDeepFilterAssets(); + }, [voiceProcessingMode]); const handleInputDeviceChange = (value: string) => { VoiceSettingsCommands.update({inputDeviceId: value}); }; @@ -267,8 +276,13 @@ export const VoiceTab: React.FC = observer(({voiceSettings, autoR [deviceState, i18n.locale], ); const outputDeviceOptions = useMemo( - () => buildSettingsDeviceOptions(deviceState, 'audiooutput', i18n), - [deviceState, i18n.locale], + () => + buildSettingsDeviceOptions( + canSelectOutputDevice ? deviceState : {...deviceState, outputDevices: []}, + 'audiooutput', + i18n, + ), + [canSelectOutputDevice, deviceState, i18n.locale], ); const resetSliderLabel = i18n._(RESET_SLIDER_TO_DEFAULT_VALUE_DESCRIPTOR); const profileOptions: Array> = [ @@ -289,6 +303,7 @@ export const VoiceTab: React.FC = observer(({voiceSettings, autoR }, ]; const noiseSuppressionChoice = getSelectedNoiseSuppressionChoice(); + const noiseSuppressionFallbackMessage = getNoiseSuppressionFallbackMessage(i18n); const noiseSuppressionOptions: Array> = getNoiseSuppressionChoiceValues().map((backend) => ({ value: backend, @@ -496,6 +511,7 @@ export const VoiceTab: React.FC = observer(({voiceSettings, autoR )} label={i18n._(VOICE_NOISE_SUPPRESSION_DESCRIPTOR)} + description={noiseSuppressionFallbackMessage} value={noiseSuppressionChoice} options={noiseSuppressionOptions} onChange={setNoiseSuppressionChoice} @@ -569,8 +585,14 @@ export const VoiceTab: React.FC = observer(({voiceSettings, autoR /> Voice uses your system output device in this browser. Change it in your system settings. + ) : null + } value={effectiveOutputDeviceId} options={outputDeviceOptions} + disabled={!canSelectOutputDevice} onChange={(value) => VoiceSettingsCommands.update({outputDeviceId: value})} controlWidth="wide" menuMinWidth={280} @@ -660,6 +682,9 @@ export const VoiceTab: React.FC = observer(({voiceSettings, autoR aria-label={i18n._(SELECT_VOICE_PROCESSING_DESCRIPTOR)} data-flx="user.voice-tab.radio-group.voice-processing-mode-change" /> + {voiceProcessingMode === 'voice' && noiseSuppressionFallbackMessage && ( +

{noiseSuppressionFallbackMessage}

+ )} {voiceProcessingMode === 'voice' && (
{renderPttControls()} diff --git a/fluxer_app/src/features/user/components/modals/tabs/hooks/MicTestAudioGraph.ts b/fluxer_app/src/features/user/components/modals/tabs/hooks/MicTestAudioGraph.ts index 143fe9a7a..f71def61f 100644 --- a/fluxer_app/src/features/user/components/modals/tabs/hooks/MicTestAudioGraph.ts +++ b/fluxer_app/src/features/user/components/modals/tabs/hooks/MicTestAudioGraph.ts @@ -1,90 +1,40 @@ // SPDX-License-Identifier: AGPL-3.0-or-later -import {Logger} from '@app/features/platform/utils/AppLogger'; import {createVoiceSoftClipNode} from '@app/features/voice/engine/VoiceSharedAudioContext'; -import {buildDeepFilterAudioChain, type DeepFilterAudioChain} from '@app/features/voice/utils/DeepFilterNoiseProcessor'; -import { - buildNoiseSuppressionWorkletChain, - type NoiseSuppressionWorkletChain, -} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionChain'; -import type {NoiseSuppressionWorkletBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionWorkletTypes'; - -const logger = new Logger('MicTestAudioGraph'); +import {type VoiceInputConfig, VoiceInputGraph} from '@app/features/voice/utils/VoiceInputProcessor'; export interface MicTestAudioGraph { - source: MediaStreamAudioSourceNode; analyser: AnalyserNode; - inputGain: GainNode; - delay: DelayNode; outputGain: GainNode; - softClipInput: GainNode; softClipOutput: AudioNode; playbackTarget: AudioNode; - dispose: () => Promise; + configure: () => Promise; + dispose: () => void; } interface CreateMicTestAudioGraphOptions { - audioContext: AudioContext; + signal: AbortSignal; + source: MediaStreamAudioSourceNode; sourceTrack: MediaStreamTrack; - inputGain: number; + resolveConfig: () => VoiceInputConfig; outputGain: number; playbackTarget: AudioNode; playbackDelaySeconds: number; - deepFilter: boolean; - workletBackend: NoiseSuppressionWorkletBackend | null; } -export async function createMicTestAudioGraph({ - audioContext, +export function createMicTestAudioGraph({ + signal, + source, sourceTrack, - inputGain, + resolveConfig, outputGain, playbackTarget, playbackDelaySeconds, - deepFilter, - workletBackend, -}: CreateMicTestAudioGraphOptions): Promise { - const source = audioContext.createMediaStreamSource(new MediaStream([sourceTrack])); - const inputGainNode = audioContext.createGain(); - inputGainNode.gain.value = inputGain; - source.connect(inputGainNode); - - let deepFilterChain: DeepFilterAudioChain | null = null; - let workletChain: NoiseSuppressionWorkletChain | null = null; - let suppressedSource: MediaStreamAudioSourceNode | null = null; - let monitorHead: AudioNode = inputGainNode; - try { - if (deepFilter) { - deepFilterChain = await buildDeepFilterAudioChain(audioContext); - inputGainNode.connect(deepFilterChain.inputDestination); - suppressedSource = audioContext.createMediaStreamSource(new MediaStream([deepFilterChain.processedTrack])); - monitorHead = suppressedSource; - } else if (workletBackend) { - workletChain = await buildNoiseSuppressionWorkletChain({ - audioContext, - backend: workletBackend, - }); - inputGainNode.connect(workletChain.inputDestination); - suppressedSource = audioContext.createMediaStreamSource(new MediaStream([workletChain.processedTrack])); - monitorHead = suppressedSource; - } - } catch (error) { - inputGainNode.disconnect(); - source.disconnect(); - suppressedSource?.disconnect(); - if (deepFilterChain) { - await deepFilterChain.dispose().catch((disposeError) => { - logger.debug('Failed to dispose DeepFilter chain after mic test graph init failure', disposeError); - }); - } - if (workletChain) { - await workletChain.dispose().catch((disposeError) => { - logger.debug('Failed to dispose noise suppression chain after mic test graph init failure', disposeError); - }); - } - throw error; - } - +}: CreateMicTestAudioGraphOptions): MicTestAudioGraph { + signal.throwIfAborted(); + const audioContext = source.context as AudioContext; + const inputGraph = new VoiceInputGraph(audioContext, 1, resolveConfig); + inputGraph.setSourceNode(sourceTrack, source); const analyser = audioContext.createAnalyser(); const delay = audioContext.createDelay(Math.max(1, playbackDelaySeconds + 0.25)); const outputGainNode = audioContext.createGain(); @@ -95,42 +45,33 @@ export async function createMicTestAudioGraph({ const softClip = createVoiceSoftClipNode(audioContext); const softClipInput = softClip?.input ?? outputGainNode; const softClipOutput: AudioNode = softClip?.output ?? outputGainNode; - monitorHead.connect(analyser); + inputGraph.output.connect(analyser); analyser.connect(delay); delay.connect(outputGainNode); if (softClip) outputGainNode.connect(softClip.input); softClipOutput.connect(playbackTarget); + void inputGraph.configure(); - const dispose = async () => { - source.disconnect(); + let disposed = false; + const dispose = () => { + if (disposed) return; + disposed = true; + signal.removeEventListener('abort', dispose); + inputGraph.dispose(); analyser.disconnect(); - inputGainNode.disconnect(); delay.disconnect(); outputGainNode.disconnect(); softClipInput.disconnect(); softClipOutput.disconnect(); - suppressedSource?.disconnect(); - if (deepFilterChain) { - await deepFilterChain.dispose().catch((error) => { - logger.warn('Failed to dispose DeepFilter chain for mic test graph', error); - }); - } - if (workletChain) { - await workletChain.dispose().catch((error) => { - logger.warn('Failed to dispose noise suppression chain for mic test graph', error); - }); - } }; + signal.addEventListener('abort', dispose, {once: true}); return { - source, analyser, - inputGain: inputGainNode, - delay, outputGain: outputGainNode, - softClipInput, softClipOutput, playbackTarget, + configure: () => inputGraph.configure(), dispose, }; } diff --git a/fluxer_app/src/features/user/components/modals/tabs/hooks/useMicTest.tsx b/fluxer_app/src/features/user/components/modals/tabs/hooks/useMicTest.tsx index edf514283..2dbd8d8f2 100644 --- a/fluxer_app/src/features/user/components/modals/tabs/hooks/useMicTest.tsx +++ b/fluxer_app/src/features/user/components/modals/tabs/hooks/useMicTest.tsx @@ -9,29 +9,23 @@ import { type MicTestAudioGraph, } from '@app/features/user/components/modals/tabs/hooks/MicTestAudioGraph'; import { - getNoiseSuppressionBackendDescriptor, - type VoiceNoiseSuppressionBackend, -} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionBackends'; -import {readNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; -import type {NoiseSuppressionWorkletBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionWorkletTypes'; + acquireIdleVoiceInputSource, + type VoiceInputContextLease, +} from '@app/features/voice/engine/VoiceInputAudioContext'; +import {beginMicrophoneSession} from '@app/features/voice/utils/noise_suppression/DeepFilter'; +import NoiseSuppressionAvailability from '@app/features/voice/utils/noise_suppression/NoiseSuppressionAvailability'; +import type {VoiceNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionBackends'; +import {readRequestedNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; import { applyContentHintToTrack, resolveVoiceProcessing, type VoiceProcessingMode, } from '@app/features/voice/utils/VoiceProcessingProfile'; -import { - boostedVoiceVolumePercentToTrackVolume, - inputVoiceVolumePercentToGain, -} from '@app/features/voice/utils/VoiceVolumeUtils'; -import {useCallback, useEffect, useMemo, useRef, useState} from 'react'; +import {boostedVoiceVolumePercentToTrackVolume} from '@app/features/voice/utils/VoiceVolumeUtils'; +import {useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore} from 'react'; const logger = new Logger('useMicTest'); -interface SinkableAudioContext extends AudioContext { - setSinkId?: (sinkId: string | {type: 'none'}) => Promise; -} - -const TEST_AUDIO_CONTEXT_SAMPLE_RATE = 48000; const MIC_TEST_MONITOR_DELAY_SECONDS = 0.9; export interface MicTestSettings { @@ -44,10 +38,8 @@ export interface MicTestSettings { voiceProcessingMode: VoiceProcessingMode; } -function resolveMicTestWorkletBackend(backend: VoiceNoiseSuppressionBackend): NoiseSuppressionWorkletBackend | null { - return getNoiseSuppressionBackendDescriptor(backend).engine === 'worklet' - ? (backend as NoiseSuppressionWorkletBackend) - : null; +function readEffectiveNoiseSuppressionBackend(): VoiceNoiseSuppressionBackend { + return NoiseSuppressionAvailability.resolveEffectiveBackend(readRequestedNoiseSuppressionBackend()); } function normalizeOutputDeviceId(deviceId: string): string { @@ -59,7 +51,8 @@ export const useMicTest = (settings: MicTestSettings) => { const [isStarting, setIsStarting] = useState(false); const [level, setLevel] = useState(0); const [peakLevel, setPeakLevel] = useState(0); - const audioContextRef = useRef(null); + const inputLeaseRef = useRef(null); + const inputVolumeRef = useRef(settings.inputVolume); const graphRef = useRef(null); const playbackDestinationRef = useRef(null); const audioElementRef = useRef(null); @@ -68,10 +61,14 @@ export const useMicTest = (settings: MicTestSettings) => { const timeDomainDataRef = useRef | null>(null); const peakLevelRef = useRef(0); const isStartingRef = useRef(false); - const restartPendingRef = useRef(false); + const attemptRef = useRef(0); + const abortRef = useRef(null); const activeCaptureSignatureRef = useRef(null); const micExplicitlyDenied = MediaPermission.microphoneExplicitlyDenied; - const noiseSuppressionBackend = readNoiseSuppressionBackend(); + const noiseSuppressionBackend = useSyncExternalStore( + NoiseSuppressionAvailability.subscribe, + readEffectiveNoiseSuppressionBackend, + ); const captureSignature = useMemo( () => JSON.stringify({ @@ -114,7 +111,12 @@ export const useMicTest = (settings: MicTestSettings) => { animationFrameRef.current = requestAnimationFrame(updateLevel); }, []); const stop = useCallback(() => { - if (animationFrameRef.current) { + attemptRef.current++; + abortRef.current?.abort(); + abortRef.current = null; + isStartingRef.current = false; + setIsStarting(false); + if (animationFrameRef.current !== null) { cancelAnimationFrame(animationFrameRef.current); animationFrameRef.current = null; } @@ -125,11 +127,7 @@ export const useMicTest = (settings: MicTestSettings) => { } const graph = graphRef.current; graphRef.current = null; - if (graph) { - void graph.dispose().catch((error) => { - logger.warn('Failed to dispose mic test graph', error); - }); - } + graph?.dispose(); const playbackDestination = playbackDestinationRef.current; playbackDestinationRef.current = null; if (playbackDestination) { @@ -140,12 +138,8 @@ export const useMicTest = (settings: MicTestSettings) => { micStreamRef.current.getTracks().forEach((track) => track.stop()); micStreamRef.current = null; } - const audioContext = audioContextRef.current; - audioContextRef.current = null; - if (audioContext && audioContext.state !== 'closed') { - void audioContext.close(); - audioContextRef.current = null; - } + inputLeaseRef.current?.release(); + inputLeaseRef.current = null; timeDomainDataRef.current = null; peakLevelRef.current = 0; setIsTesting(false); @@ -158,11 +152,17 @@ export const useMicTest = (settings: MicTestSettings) => { handleMediaPermissionBlocked('microphone'); return; } + stop(); + const attempt = ++attemptRef.current; + const controller = new AbortController(); + abortRef.current = controller; + const isCurrent = () => attempt === attemptRef.current && !controller.signal.aborted; isStartingRef.current = true; setIsStarting(true); try { - stop(); + beginMicrophoneSession(controller.signal); const nativeResult = await ensureMacPermission('microphone', {behavior: 'interactive'}); + if (!isCurrent()) return; switch (nativeResult) { case 'granted': case 'unsupported-platform': @@ -177,8 +177,7 @@ export const useMicTest = (settings: MicTestSettings) => { return exhaustive; } } - const profile = resolveVoiceProcessing(settings, readNoiseSuppressionBackend(), false); - const workletBackend = resolveMicTestWorkletBackend(profile.noiseSuppressionBackend); + const profile = resolveVoiceProcessing(settings, readEffectiveNoiseSuppressionBackend(), false); const baseAudioConstraints: MediaTrackConstraints & {voiceIsolation?: boolean} = { echoCancellation: profile.echoCancellation, noiseSuppression: profile.browserNoiseSuppression, @@ -197,35 +196,48 @@ export const useMicTest = (settings: MicTestSettings) => { try { stream = await navigator.mediaDevices.getUserMedia({audio: buildAudioConstraints(true)}); } catch (error) { + if (!isCurrent()) return; if (!useExactDeviceId || !(error instanceof Error) || error.name !== 'OverconstrainedError') { throw error; } stream = await navigator.mediaDevices.getUserMedia({audio: buildAudioConstraints(false)}); } + if (!isCurrent()) { + stream.getTracks().forEach((track) => track.stop()); + return; + } micStreamRef.current = stream; const sourceTrack = stream.getAudioTracks()[0]; if (!sourceTrack) { throw new Error('getUserMedia returned no audio tracks for mic test'); } applyContentHintToTrack(sourceTrack, profile.contentHint); - const audioContext = new AudioContext({sampleRate: TEST_AUDIO_CONTEXT_SAMPLE_RATE}); - audioContextRef.current = audioContext; - if (audioContext.state === 'suspended') { - await audioContext.resume(); + const acquired = acquireIdleVoiceInputSource(sourceTrack); + if (!acquired) { + throw new Error('No AudioContext is available for the mic test'); } + inputLeaseRef.current = acquired.lease; + const audioContext = acquired.lease.context; + inputVolumeRef.current = settings.inputVolume; const outputSinkId = normalizeOutputDeviceId(settings.outputDeviceId); const playbackDestination = audioContext.createMediaStreamDestination(); playbackDestinationRef.current = playbackDestination; let playbackTarget: AudioNode = playbackDestination; - graphRef.current = await createMicTestAudioGraph({ - audioContext, + graphRef.current = createMicTestAudioGraph({ + signal: controller.signal, + source: acquired.source, sourceTrack, - inputGain: inputVoiceVolumePercentToGain(settings.inputVolume), + resolveConfig: () => ({ + backend: resolveVoiceProcessing(settings, readEffectiveNoiseSuppressionBackend(), false) + .noiseSuppressionBackend, + inputVolumePercent: inputVolumeRef.current, + gateEnabled: false, + gateAuto: true, + gateThresholdRms: 0, + }), outputGain: boostedVoiceVolumePercentToTrackVolume(settings.outputVolume), playbackTarget, playbackDelaySeconds: MIC_TEST_MONITOR_DELAY_SECONDS, - deepFilter: profile.deepFilter, - workletBackend, }); timeDomainDataRef.current = new Float32Array(graphRef.current.analyser.fftSize); const audioElement = new Audio(); @@ -241,9 +253,11 @@ export const useMicTest = (settings: MicTestSettings) => { logger.warn('Failed to set mic test media element output device', error); } } + if (!isCurrent()) return; try { await audioElement.play(); } catch (error) { + if (!isCurrent()) return; logger.warn('Failed to start mic test media element playback; falling back to AudioContext destination', error); audioElement.pause(); audioElement.srcObject = null; @@ -253,17 +267,10 @@ export const useMicTest = (settings: MicTestSettings) => { playbackDestinationRef.current = null; graphRef.current.softClipOutput.disconnect(); playbackTarget = audioContext.destination; - const sinkableAudioContext = audioContext as SinkableAudioContext; - if (settings.outputDeviceId !== 'default' && sinkableAudioContext.setSinkId) { - try { - await sinkableAudioContext.setSinkId(outputSinkId); - } catch (sinkError) { - logger.warn('Failed to set mic test AudioContext output device', sinkError); - } - } graphRef.current.softClipOutput.connect(playbackTarget); graphRef.current.playbackTarget = playbackTarget; } + if (!isCurrent()) return; setIsTesting(true); activeCaptureSignatureRef.current = captureSignature; updateLevel(); @@ -271,6 +278,7 @@ export const useMicTest = (settings: MicTestSettings) => { logger.info('Applied DeepFilterNet3 noise suppression for mic test'); } } catch (error) { + if (!isCurrent()) return; logger.error('Error starting mic test', error); if (error instanceof Error && (error.name === 'NotAllowedError' || error.name === 'PermissionDeniedError')) { MediaPermission.markMicrophoneExplicitlyDenied(); @@ -278,18 +286,17 @@ export const useMicTest = (settings: MicTestSettings) => { } stop(); } finally { - isStartingRef.current = false; - setIsStarting(false); - if (restartPendingRef.current) { - restartPendingRef.current = false; - void start(); + if (isCurrent()) { + isStartingRef.current = false; + setIsStarting(false); } } }, [captureSignature, settings, updateLevel, stop, micExplicitlyDenied]); useEffect(() => { if (!isTesting) return; if (graphRef.current) { - graphRef.current.inputGain.gain.value = inputVoiceVolumePercentToGain(settings.inputVolume); + inputVolumeRef.current = settings.inputVolume; + void graphRef.current.configure(); graphRef.current.outputGain.gain.value = boostedVoiceVolumePercentToTrackVolume(settings.outputVolume); } }, [isTesting, settings.inputVolume, settings.outputVolume]); @@ -302,10 +309,6 @@ export const useMicTest = (settings: MicTestSettings) => { return; } activeCaptureSignatureRef.current = captureSignature; - if (isStartingRef.current) { - restartPendingRef.current = true; - return; - } void start(); }, [captureSignature, isTesting, start]); useEffect(() => { diff --git a/fluxer_app/src/features/voice/commands/VoiceSettingsCommands.ts b/fluxer_app/src/features/voice/commands/VoiceSettingsCommands.ts index 12c90854e..50b8e951b 100644 --- a/fluxer_app/src/features/voice/commands/VoiceSettingsCommands.ts +++ b/fluxer_app/src/features/voice/commands/VoiceSettingsCommands.ts @@ -81,14 +81,6 @@ interface VoiceSettingsUpdateOptions { refreshCameraBackground?: boolean; } -const MICROPHONE_REFRESH_KEYS: Array = [ - 'inputDeviceId', - 'echoCancellation', - 'autoGainControl', - 'noiseSuppressionBackend', - 'stereoMicrophone', - 'voiceProcessingMode', -]; const CAMERA_BACKGROUND_REFRESH_KEYS: Array = [ 'backgroundImageId', 'backgroundImages', @@ -102,10 +94,6 @@ const SCREEN_SHARE_CODEC_NEGOTIATION_REFRESH_KEYS: Array settings[key] !== undefined); -} - function shouldRefreshCameraBackground(settings: VoiceSettingsPatch): boolean { return CAMERA_BACKGROUND_REFRESH_KEYS.some((key) => settings[key] !== undefined); } @@ -145,11 +129,7 @@ function shouldRefreshCameraCapture( return CAMERA_CAPTURE_REFRESH_KEYS.some((key) => settings[key] !== undefined && before[key] !== after[key]); } -function applyUpdatedVoiceSettings( - settings: VoiceSettingsPatch, - refreshInput: boolean, - options: VoiceSettingsUpdateOptions = {}, -): void { +function applyUpdatedVoiceSettings(settings: VoiceSettingsPatch, options: VoiceSettingsUpdateOptions = {}): void { const cameraCaptureBefore = readCameraCaptureRefreshValues(); VoiceSettings.updateSettings(settings); if (settings.muteStreamAudio !== undefined) { @@ -160,12 +140,6 @@ function applyUpdatedVoiceSettings( MediaEngine.applyAllLocalAudioPreferences(); } } - if (settings.inputVolume !== undefined && !refreshInput) { - MediaEngine.applyLocalInputVolume(); - } - if (refreshInput) { - refreshMicrophone(); - } if (options.refreshCameraBackground !== false && shouldRefreshCameraBackground(settings)) { refreshCameraBackground(); } @@ -179,24 +153,21 @@ function applyUpdatedVoiceSettings( export function setVoiceProcessingModeForDeviceLabel(label: string, mode: VoiceProcessingMode): void { VoiceSettings.setVoiceProcessingModeForDeviceLabel(label, mode); - refreshMicrophone(); } export function clearVoiceProcessingModeForDeviceLabel(label: string): void { VoiceSettings.clearVoiceProcessingModeForDeviceLabel(label); - refreshMicrophone(); } export function setActiveInputVoiceProcessingMode(mode: VoiceProcessingMode): void { const label = getActiveInputDeviceLabel(VoiceSettings); if (label) { VoiceSettings.setVoiceProcessingModeForDeviceLabel(label, mode); - refreshMicrophone(); } else { - applyUpdatedVoiceSettings({voiceProcessingMode: mode}, true); + applyUpdatedVoiceSettings({voiceProcessingMode: mode}); } } export function update(settings: VoiceSettingsPatch, options?: VoiceSettingsUpdateOptions): void { - applyUpdatedVoiceSettings(settings, shouldRefreshMicrophone(settings), options); + applyUpdatedVoiceSettings(settings, options); } diff --git a/fluxer_app/src/features/voice/components/useStatsForNerds.ts b/fluxer_app/src/features/voice/components/useStatsForNerds.ts index e7bb4520a..f508b4942 100644 --- a/fluxer_app/src/features/voice/components/useStatsForNerds.ts +++ b/fluxer_app/src/features/voice/components/useStatsForNerds.ts @@ -12,7 +12,7 @@ import ScreenShareCodecNegotiation, { import {getPublishedScreenShareMaxBitrateBps} from '@app/features/voice/engine/voice_screen_share_manager/shared'; import VoiceSettings from '@app/features/voice/state/VoiceSettings'; import {getNativeAudioCaptureDiagnosticState} from '@app/features/voice/utils/NativeAudioCaptureBridge'; -import {readNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; +import {readVoiceInputDiagnostics} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; import {getScreenShareBitrateBps, resolveStreamingModeSettings} from '@app/features/voice/utils/ScreenShareOptions'; import {hasHigherVideoQuality} from '@app/features/voice/utils/VideoQualityEntitlement'; import { @@ -184,12 +184,7 @@ export function useStatsForNerds({enabled = true}: UseStatsForNerdsOptions = {}) voiceServerEndpoint: MediaEngine.voiceServerEndpoint ?? 'n/a', reconnectionCount: MediaEngine.reconnectionCount, }, - audio: { - echoCancellation: VoiceSettings.echoCancellation, - autoGainControl: VoiceSettings.autoGainControl, - noiseSuppressionBackend: readNoiseSuppressionBackend(), - processingMode: VoiceSettings.voiceProcessingMode, - }, + audio: readVoiceInputDiagnostics(), screenShareSettings: { resolution: effectiveScreenShareSettings.resolution, frameRate: effectiveScreenShareSettings.frameRate, diff --git a/fluxer_app/src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx b/fluxer_app/src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx index 33e379f56..4606fe68c 100644 --- a/fluxer_app/src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx +++ b/fluxer_app/src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx @@ -15,7 +15,10 @@ import { getSelectedNoiseSuppressionChoice, setNoiseSuppressionChoice, } from '@app/features/voice/utils/noise_suppression/NoiseSuppressionChoices'; -import {getNoiseSuppressionChoiceLabel} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionLabels'; +import { + getNoiseSuppressionChoiceLabel, + getNoiseSuppressionFallbackMessage, +} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionLabels'; import { VOICE_AUTOMATIC_GAIN_CONTROL_DESCRIPTOR, VOICE_DIRECT_INPUT_PROFILE_DESCRIPTOR, @@ -65,6 +68,7 @@ export const AudioProcessingModal = observer(() => { const {i18n} = useLingui(); const mode = getActiveVoiceProcessingMode(VoiceSettings); const noiseSuppressionChoice = getSelectedNoiseSuppressionChoice(); + const noiseSuppressionFallbackMessage = getNoiseSuppressionFallbackMessage(i18n); const modeOptions: Array> = [ { value: 'voice', @@ -110,6 +114,7 @@ export const AudioProcessingModal = observer(() => { aria-label={i18n._(VOICE_PROCESSING_DESCRIPTOR)} data-flx="voice.voice-connection-status.audio-processing-modal.radio-group.update" /> + {mode === 'voice' && noiseSuppressionFallbackMessage &&

{noiseSuppressionFallbackMessage}

} {mode === 'custom' && (
{ > label={i18n._(VOICE_NOISE_SUPPRESSION_DESCRIPTOR)} + description={noiseSuppressionFallbackMessage} value={noiseSuppressionChoice} options={noiseSuppressionOptions} onChange={setNoiseSuppressionChoice} diff --git a/fluxer_app/src/features/voice/components/voice_connection_status/MockedVoiceConnectionStatus.tsx b/fluxer_app/src/features/voice/components/voice_connection_status/MockedVoiceConnectionStatus.tsx index 825fc5845..6b0f196df 100644 --- a/fluxer_app/src/features/voice/components/voice_connection_status/MockedVoiceConnectionStatus.tsx +++ b/fluxer_app/src/features/voice/components/voice_connection_status/MockedVoiceConnectionStatus.tsx @@ -26,7 +26,7 @@ import { LATENCY_GRAPH_DESCRIPTOR, } from '@app/features/voice/components/voice_connection_status/shared'; import VoiceSettings from '@app/features/voice/state/VoiceSettings'; -import {readNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; +import {readEffectiveNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; import { VOICE_DISCONNECT_DESCRIPTOR, VOICE_IN_CHAT_DESCRIPTOR, @@ -53,7 +53,7 @@ export const MockedVoiceConnectionStatus = observer(() => { const {i18n} = useLingui(); const voiceSettings = VoiceSettings; const processingMode = getActiveVoiceProcessingMode(voiceSettings); - const noiseSuppressionBackend = readNoiseSuppressionBackend(); + const noiseSuppressionBackend = readEffectiveNoiseSuppressionBackend(); const isProcessingActive = isAudioProcessingActive(processingMode, noiseSuppressionBackend); const showVoiceConnectionId = voiceSettings.showVoiceConnectionId; const openNoiseSuppressionModal = useCallback(() => { diff --git a/fluxer_app/src/features/voice/components/voice_connection_status/VoiceConnectionStatusInner.tsx b/fluxer_app/src/features/voice/components/voice_connection_status/VoiceConnectionStatusInner.tsx index cccdf6c23..ca53abade 100644 --- a/fluxer_app/src/features/voice/components/voice_connection_status/VoiceConnectionStatusInner.tsx +++ b/fluxer_app/src/features/voice/components/voice_connection_status/VoiceConnectionStatusInner.tsx @@ -34,7 +34,7 @@ import { import {VoiceDetailsPopout} from '@app/features/voice/components/voice_connection_status/VoiceDetailsPopout'; import MediaEngine, {useMediaEngineVersion} from '@app/features/voice/engine/MediaEngineFacade'; import VoiceSettings from '@app/features/voice/state/VoiceSettings'; -import {readNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; +import {readEffectiveNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; import {VOICE_DISCONNECT_DESCRIPTOR, VOICE_IN_CHAT_DESCRIPTOR} from '@app/features/voice/utils/VoiceMessageDescriptors'; import {getActiveVoiceProcessingMode} from '@app/features/voice/utils/VoiceProcessingProfile'; import {msg} from '@lingui/core/macro'; @@ -111,7 +111,7 @@ const ResolvedVoiceConnectionStatusInner = observer(function ResolvedVoiceConnec const storeIsConnected = MediaEngine.connected; const voiceSettings = VoiceSettings; const processingMode = getActiveVoiceProcessingMode(voiceSettings); - const noiseSuppressionBackend = readNoiseSuppressionBackend(); + const noiseSuppressionBackend = readEffectiveNoiseSuppressionBackend(); const isProcessingActive = isAudioProcessingActive(processingMode, noiseSuppressionBackend); const showVoiceConnectionId = voiceSettings.showVoiceConnectionId; const openNoiseSuppressionModal = useCallback(() => { diff --git a/fluxer_app/src/features/voice/engine/MediaEngineFacade.ts b/fluxer_app/src/features/voice/engine/MediaEngineFacade.ts index 2617a8e3c..7ddf2d20b 100644 --- a/fluxer_app/src/features/voice/engine/MediaEngineFacade.ts +++ b/fluxer_app/src/features/voice/engine/MediaEngineFacade.ts @@ -723,16 +723,6 @@ class MediaEngineFacade extends Store { return measured !== null ? measured : this.estimatedLatency; } - refreshMicrophoneFromSettings(): void { - void this.refreshMicrophoneFromCurrentEngine().catch((error) => { - logger.warn('Failed to refresh microphone from settings', {error}); - }); - } - - private async refreshMicrophoneFromCurrentEngine(): Promise { - await voiceEngineV2AppMediaExecutionAdapter.refreshMicrophone(this.room, {forceRepublish: true}); - } - refreshCameraBackgroundFromSettings(): void { void this.refreshCameraBackgroundFromCurrentEngine().catch((error) => { logger.warn('Failed to refresh camera background from settings', {error}); @@ -2235,10 +2225,6 @@ class MediaEngineFacade extends Store { voiceEngineV2AppMediaExecutionAdapter.applyAllLocalAudioPreferences(this.room); } - applyLocalInputVolume(): void { - voiceEngineV2AppMediaExecutionAdapter.applyLocalInputVolume(this.room); - } - setLocalVideoDisabled(identity: string, disabled: boolean): void { voiceEngineV2AppMediaExecutionAdapter.setLocalVideoDisabled(identity, disabled, this.room, this.connectionId); } @@ -2335,11 +2321,13 @@ class MediaEngineFacade extends Store { return bindVoiceEngineV2AppAudioPreferencesSync( room, { - refreshMicrophone: async () => this.refreshMicrophoneFromCurrentEngine(), - refreshLocalVoiceInputProcessor: async () => { - await voiceEngineV2AppMediaExecutionAdapter.refreshLocalVoiceInputProcessor(room); - }, - applyLocalInputVolume: () => voiceEngineV2AppMediaExecutionAdapter.applyLocalInputVolume(room), + requestMicrophoneRefresh: (targetRoom, request) => + voiceEngineV2AppMediaExecutionAdapter.requestMicrophoneRefresh(targetRoom, request), + configureVoiceInput: (targetRoom) => voiceEngineV2AppMediaExecutionAdapter.configureVoiceInput(targetRoom), + handleInputKeybindChange: (targetRoom) => + voiceEngineV2AppMediaExecutionAdapter.handlePushToTalkModeChange(targetRoom, () => + this.getCurrentUserVoiceState(), + ), applyAllLocalAudioPreferences: () => voiceEngineV2AppMediaExecutionAdapter.applyAllLocalAudioPreferences(room), }, logger, diff --git a/fluxer_app/src/features/voice/engine/VoiceInputAudioContext.ts b/fluxer_app/src/features/voice/engine/VoiceInputAudioContext.ts new file mode 100644 index 000000000..e6ce320ff --- /dev/null +++ b/fluxer_app/src/features/voice/engine/VoiceInputAudioContext.ts @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +import {Logger} from '@app/features/platform/utils/AppLogger'; +import {createVoiceAudioContext} from '@app/features/voice/engine/VoiceSharedAudioContext'; +import NoiseSuppressionAvailability from '@app/features/voice/utils/noise_suppression/NoiseSuppressionAvailability'; + +const logger = new Logger('VoiceInputAudioContext'); +const VOICE_INPUT_SAMPLE_RATE = 48000; +const RESUME_GESTURE_EVENTS = ['pointerdown', 'keydown'] as const; +const IDLE_SUSPEND_DELAY_MS = 500; +const IDLE_CLOSE_DELAY_MS = 60_000; +const RATE_KEYED_CANDIDATE_RATES = [48000, 44100, 32000, 24000, 16000]; + +export interface VoiceInputContextLease { + readonly context: AudioContext; + release(): void; +} + +export interface VoiceInputSourceLease { + readonly lease: VoiceInputContextLease; + readonly source: MediaStreamAudioSourceNode; +} + +interface VoiceInputContextEntry { + readonly context: AudioContext; + readonly resumeOnGesture: () => void; + holders: number; + sourceHolders: number; + suspendTimer: ReturnType | null; + closeTimer: ReturnType | null; + suspending: boolean; +} + +let rateKeyedMode = false; +const entries = new Set(); + +function needsResume(entry: VoiceInputContextEntry): boolean { + return entry.holders > 0 && entry.context.state !== 'running' && entry.context.state !== 'closed'; +} + +function resumeEntry(entry: VoiceInputContextEntry): void { + if (!needsResume(entry) && !(entry.holders > 0 && entry.suspending)) return; + void entry.context.resume().catch((error) => { + logger.debug('Voice input AudioContext resume rejected', {error}); + }); +} + +function syncEntryResume(entry: VoiceInputContextEntry): void { + const armGesture = needsResume(entry); + for (const type of RESUME_GESTURE_EVENTS) { + if (armGesture) window.addEventListener(type, entry.resumeOnGesture, {capture: true}); + else window.removeEventListener(type, entry.resumeOnGesture, {capture: true}); + } + resumeEntry(entry); +} + +function createEntry(options: AudioContextOptions, shared: boolean): VoiceInputContextEntry | null { + const context = createVoiceAudioContext({latencyHint: 'interactive', ...options}); + if (!context) return null; + const entry: VoiceInputContextEntry = { + context, + holders: 0, + sourceHolders: 0, + suspendTimer: null, + closeTimer: null, + suspending: false, + resumeOnGesture: () => resumeEntry(entry), + }; + context.addEventListener('statechange', () => { + if (context.state === 'closed') entries.delete(entry); + syncEntryResume(entry); + }); + if (shared) entries.add(entry); + return entry; +} + +function closeEntry(entry: VoiceInputContextEntry): void { + if (entry.suspendTimer !== null) clearTimeout(entry.suspendTimer); + if (entry.closeTimer !== null) clearTimeout(entry.closeTimer); + entries.delete(entry); + if (entry.context.state === 'closed') return; + void entry.context.close().catch((error) => { + logger.debug('Failed to close a voice input AudioContext', {error}); + }); +} + +function readTrackSampleRate(track: MediaStreamTrack | null): number | null { + const sampleRate = track?.getSettings().sampleRate; + return typeof sampleRate === 'number' && sampleRate > 0 ? sampleRate : null; +} + +function resolveEntry(): VoiceInputContextEntry | null { + for (const entry of entries) return entry; + return createEntry(rateKeyedMode ? {} : {sampleRate: VOICE_INPUT_SAMPLE_RATE}, true); +} + +export function isVoiceInputSourceLive(): boolean { + for (const entry of entries) { + if (entry.sourceHolders > 0) return true; + } + return false; +} + +function isUnsupportedRateError(error: unknown): boolean { + return error instanceof DOMException && error.name === 'NotSupportedError'; +} + +function suspendIdleEntry(entry: VoiceInputContextEntry): void { + entry.suspendTimer = null; + if (entry.holders > 0 || entry.context.state === 'closed') return; + entry.suspending = true; + void entry.context + .suspend() + .catch((error) => { + logger.debug('Voice input AudioContext suspend rejected', {error}); + }) + .finally(() => { + entry.suspending = false; + if (entry.holders === 0 && entry.context.state !== 'closed') { + if (entry.closeTimer !== null) clearTimeout(entry.closeTimer); + entry.closeTimer = setTimeout(() => { + entry.closeTimer = null; + if (entry.holders === 0) closeEntry(entry); + }, IDLE_CLOSE_DELAY_MS); + } + }); +} + +function leaseEntry(entry: VoiceInputContextEntry, holdsSource: boolean): VoiceInputContextLease { + if (entry.closeTimer !== null) { + clearTimeout(entry.closeTimer); + entry.closeTimer = null; + } + if (entry.suspendTimer !== null) { + clearTimeout(entry.suspendTimer); + entry.suspendTimer = null; + } + entry.holders++; + if (holdsSource) entry.sourceHolders++; + if (entries.has(entry)) NoiseSuppressionAvailability.setInputContextRate(entry.context.sampleRate); + if (entry.holders === 1) syncEntryResume(entry); + let released = false; + return { + context: entry.context, + release: () => { + if (released) return; + released = true; + entry.holders--; + if (holdsSource) entry.sourceHolders--; + if (entry.holders > 0) return; + syncEntryResume(entry); + if (!entries.has(entry)) { + closeEntry(entry); + return; + } + entry.suspendTimer = setTimeout(() => suspendIdleEntry(entry), IDLE_SUSPEND_DELAY_MS); + }, + }; +} + +export function acquireVoiceInputContext(): VoiceInputContextLease | null { + const entry = resolveEntry(); + return entry ? leaseEntry(entry, false) : null; +} + +export function acquireIdleVoiceInputContext(): VoiceInputContextLease | null { + return isVoiceInputSourceLive() ? null : acquireVoiceInputContext(); +} + +function createSource(entry: VoiceInputContextEntry, track: MediaStreamTrack): MediaStreamAudioSourceNode | null { + try { + return entry.context.createMediaStreamSource(new MediaStream([track])); + } catch (error) { + if (!isUnsupportedRateError(error)) throw error; + return null; + } +} + +function acquireRateKeyedSource(track: MediaStreamTrack, shared: boolean): VoiceInputSourceLease | null { + const trackRate = readTrackSampleRate(track); + for (const rate of trackRate === null ? RATE_KEYED_CANDIDATE_RATES : [trackRate]) { + const existing = shared ? [...entries].find((entry) => entry.context.sampleRate === rate) : undefined; + const entry = existing ?? createEntry({sampleRate: rate}, shared); + if (!entry) continue; + const source = createSource(entry, track); + if (source) return {lease: leaseEntry(entry, true), source}; + if (!existing) closeEntry(entry); + } + return null; +} + +function acquireSource(track: MediaStreamTrack, shared: boolean): VoiceInputSourceLease | null { + if (rateKeyedMode) return acquireRateKeyedSource(track, shared); + const entry = shared ? resolveEntry() : createEntry({sampleRate: VOICE_INPUT_SAMPLE_RATE}, false); + if (!entry) return null; + const source = createSource(entry, track); + if (source) return {lease: leaseEntry(entry, true), source}; + logger.info('Voice input cannot read the microphone at 48 kHz; using a context at the capture rate'); + rateKeyedMode = true; + entries.delete(entry); + if (entry.holders === 0) closeEntry(entry); + return acquireRateKeyedSource(track, shared); +} + +export function acquireVoiceInputSource(track: MediaStreamTrack): VoiceInputSourceLease | null { + return acquireSource(track, true); +} + +export function acquireIdleVoiceInputSource(track: MediaStreamTrack): VoiceInputSourceLease | null { + return acquireSource(track, !isVoiceInputSourceLive()); +} + +export function discardVoiceInputContext(context: AudioContext): void { + for (const entry of entries) { + if (entry.context !== context) continue; + entries.delete(entry); + if (entry.holders === 0) closeEntry(entry); + return; + } +} diff --git a/fluxer_app/src/features/voice/engine/VoiceLocalSpeakingGate.ts b/fluxer_app/src/features/voice/engine/VoiceLocalSpeakingGate.ts index 3334b33d0..ff5ecea2b 100644 --- a/fluxer_app/src/features/voice/engine/VoiceLocalSpeakingGate.ts +++ b/fluxer_app/src/features/voice/engine/VoiceLocalSpeakingGate.ts @@ -1,14 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0-or-later -import { - getLocalSpeakingThresholdRms, - LOCAL_MAX_RMS, - LOCAL_MIN_RMS, -} from '@app/features/voice/engine/VoiceSpeakingThreshold'; - -const VOICE_ACTIVITY_NOISE_FLOOR_HEADROOM = 3; -const VOICE_ACTIVITY_NOISE_FLOOR_SMOOTHING = 0.05; - export interface LocalSpeakingOverrideInput { pushToTalkActive: boolean; pushToMuteActive: boolean; @@ -27,45 +18,3 @@ export function resolveLocalSpeakingOverrideState(input: LocalSpeakingOverrideIn if (effectivelyMuted) return false; return null; } - -export interface VoiceActivityGateInput { - rms: number; - thresholdRms: number; - nowMs: number; - silenceStartedAtMs: number | null; - gateOpen: boolean; - releaseDelayMs: number; -} - -export interface VoiceActivityGateState { - open: boolean; - silenceStartedAtMs: number | null; -} - -export function resolveVoiceActivityGateState(input: VoiceActivityGateInput): VoiceActivityGateState { - if (input.rms >= input.thresholdRms) { - return {open: true, silenceStartedAtMs: null}; - } - const silenceStartedAtMs = input.silenceStartedAtMs ?? input.nowMs; - return { - open: input.gateOpen && input.nowMs - silenceStartedAtMs < input.releaseDelayMs, - silenceStartedAtMs, - }; -} - -export function resolveVoiceActivityThresholdRms(input: { - autoSensitivity: boolean; - vadThreshold: number; - noiseFloorRms: number; -}): number { - if (!input.autoSensitivity) { - return getLocalSpeakingThresholdRms(input.vadThreshold); - } - const tracked = input.noiseFloorRms * VOICE_ACTIVITY_NOISE_FLOOR_HEADROOM; - if (!Number.isFinite(tracked)) return LOCAL_MIN_RMS; - return Math.min(LOCAL_MAX_RMS, Math.max(LOCAL_MIN_RMS, tracked)); -} - -export function updateVoiceActivityNoiseFloorRms(noiseFloorRms: number, rms: number): number { - return noiseFloorRms * (1 - VOICE_ACTIVITY_NOISE_FLOOR_SMOOTHING) + rms * VOICE_ACTIVITY_NOISE_FLOOR_SMOOTHING; -} diff --git a/fluxer_app/src/features/voice/engine/VoiceOutputDeviceSync.ts b/fluxer_app/src/features/voice/engine/VoiceOutputDeviceSync.ts index d2acfc3da..a72b08084 100644 --- a/fluxer_app/src/features/voice/engine/VoiceOutputDeviceSync.ts +++ b/fluxer_app/src/features/voice/engine/VoiceOutputDeviceSync.ts @@ -2,6 +2,10 @@ import {isPendingMigratedDeviceId} from '@app/features/app/domain_migration/DomainMigrationDeviceRemap'; import {Logger} from '@app/features/platform/utils/AppLogger'; +import { + canRouteVoiceAudioContextOutput, + setVoiceAudioContextOutput, +} from '@app/features/voice/engine/VoiceSharedAudioContext'; import {VoiceTrackKind} from '@app/features/voice/engine/VoiceTrackSource'; import VoiceSettings from '@app/features/voice/state/VoiceSettings'; import {voiceDeviceManager} from '@app/features/voice/utils/VoiceDeviceManager'; @@ -59,7 +63,7 @@ function canRoomSwitchAudioOutput(room: Room): boolean { if (!isRoomWebAudioMixEnabled(room)) return supportsMediaElementSetSinkId(); const audioContext = getRoomAudioContext(room); if (!audioContext) return true; - return typeof audioContext.setSinkId === 'function'; + return typeof audioContext.setSinkId === 'function' || canRouteVoiceAudioContextOutput(audioContext); } function resolveLiveKitSwitchDeviceId(room: Room, deviceId: string): string { @@ -104,12 +108,14 @@ async function resolveAvailableOutputDeviceId(deviceId: string): Promise async function applyOutputDeviceToWebAudioMixer(room: Room, deviceId: string): Promise { const audioContext = getRoomAudioContext(room); - if (!audioContext?.setSinkId) { + if (!audioContext) { return; } + const applySink = (sinkId: string) => + audioContext.setSinkId ? audioContext.setSinkId(sinkId) : setVoiceAudioContextOutput(audioContext, sinkId); const sinkId = normalizeSinkIdForBrowserApi(deviceId); try { - await audioContext.setSinkId(sinkId); + await applySink(sinkId); } catch (error) { if (isDeviceMissingError(error)) { logger.warn('Web Audio mixer sink no longer available', {deviceId}); @@ -118,7 +124,7 @@ async function applyOutputDeviceToWebAudioMixer(room: Room, deviceId: string): P VoiceSettings.updateSettings({outputDeviceId: 'default'}); } try { - await audioContext.setSinkId(''); + await applySink(''); } catch (fallbackError) { logger.warn('Failed to fall back Web Audio mixer sink to default', {deviceId, error: fallbackError}); } @@ -162,7 +168,9 @@ export async function applyOutputDeviceToRoom(room: Room, deviceId: string): Pro const resolvedDeviceId = await resolveAvailableOutputDeviceId(deviceId); if (canRoomSwitchAudioOutput(room)) { try { - await room.switchActiveDevice('audiooutput', resolveLiveKitSwitchDeviceId(room, resolvedDeviceId)); + if (!isRoomWebAudioMixEnabled(room) || getRoomAudioContext(room)?.setSinkId) { + await room.switchActiveDevice('audiooutput', resolveLiveKitSwitchDeviceId(room, resolvedDeviceId)); + } } catch (error) { logger.warn('LiveKit failed to apply audio output device', {deviceId: resolvedDeviceId, error}); } diff --git a/fluxer_app/src/features/voice/engine/VoiceSharedAudioContext.ts b/fluxer_app/src/features/voice/engine/VoiceSharedAudioContext.ts index 76aa18567..fe797479e 100644 --- a/fluxer_app/src/features/voice/engine/VoiceSharedAudioContext.ts +++ b/fluxer_app/src/features/voice/engine/VoiceSharedAudioContext.ts @@ -11,6 +11,78 @@ type AudioContextConstructor = typeof AudioContext; const MASTER_SOFT_CLIP_KNEE = 0.8; const MASTER_SOFT_CLIP_CURVE_POINTS = 8192; +interface VoiceOutputRoute { + output: AudioNode; + hardwareDestination: AudioNode; + destination: MediaStreamAudioDestinationNode | null; + element: HTMLAudioElement | null; + operation: Promise; +} + +const voiceOutputRoutes = new WeakMap(); + +export function supportsVoiceOutputElementRouting(): boolean { + if (typeof HTMLMediaElement === 'undefined' || !('setSinkId' in HTMLMediaElement.prototype)) return false; + if (typeof navigator === 'undefined') return false; + const firefoxVersion = Number(/Firefox\/(\d+)/.exec(navigator.userAgent)?.[1]); + return firefoxVersion >= (/Macintosh|Mac OS X/.test(navigator.userAgent) ? 145 : 123); +} + +export function supportsVoiceOutputDeviceSelection(): boolean { + return ( + (typeof AudioContext !== 'undefined' && 'setSinkId' in AudioContext.prototype) || + supportsVoiceOutputElementRouting() + ); +} + +export function canRouteVoiceAudioContextOutput(context: AudioContext): boolean { + return voiceOutputRoutes.has(context) && supportsVoiceOutputElementRouting(); +} + +export function setVoiceAudioContextOutput(context: AudioContext, sinkId: string): Promise { + const route = voiceOutputRoutes.get(context); + if (!route || !supportsVoiceOutputElementRouting()) return Promise.resolve(); + route.operation = route.operation + .catch(() => {}) + .then(async () => { + if (context.state === 'closed') return; + if (!sinkId) { + if (!route.destination) return; + route.output.disconnect(route.destination); + route.output.connect(route.hardwareDestination); + route.element?.pause(); + if (route.element) route.element.srcObject = null; + route.destination.stream.getTracks().forEach((track) => track.stop()); + route.destination = null; + route.element = null; + return; + } + if (route.element) { + await route.element.setSinkId(sinkId); + return; + } + const destination = context.createMediaStreamDestination(); + const element = new Audio(); + element.autoplay = true; + element.srcObject = destination.stream; + try { + await element.setSinkId(sinkId); + await element.play(); + if (voiceOutputRoutes.get(context) !== route) throw new Error('Voice playback context closed'); + route.output.disconnect(route.hardwareDestination); + route.output.connect(destination); + route.destination = destination; + route.element = element; + } catch (error) { + element.pause(); + element.srcObject = null; + destination.stream.getTracks().forEach((track) => track.stop()); + throw error; + } + }); + return route.operation; +} + function softClipSample(x: number): number { const magnitude = Math.abs(x); if (magnitude <= MASTER_SOFT_CLIP_KNEE) return x; @@ -50,6 +122,23 @@ function installMasterSoftClip(context: AudioContext): void { configurable: true, get: () => softClip.input, }); + const route: VoiceOutputRoute = { + output: softClip.output, + hardwareDestination, + destination: null, + element: null, + operation: Promise.resolve(), + }; + voiceOutputRoutes.set(context, route); + context.addEventListener('statechange', () => { + if (context.state !== 'closed') return; + route.element?.pause(); + if (route.element) route.element.srcObject = null; + route.destination?.stream.getTracks().forEach((track) => track.stop()); + route.element = null; + route.destination = null; + voiceOutputRoutes.delete(context); + }); } catch (error) { logger.warn('Failed to install master soft clip on shared voice AudioContext', {error}); } diff --git a/fluxer_app/src/features/voice/engine/VoiceSpeakingThreshold.ts b/fluxer_app/src/features/voice/engine/VoiceSpeakingThreshold.ts index a60da3cc4..f88dede1b 100644 --- a/fluxer_app/src/features/voice/engine/VoiceSpeakingThreshold.ts +++ b/fluxer_app/src/features/voice/engine/VoiceSpeakingThreshold.ts @@ -1,6 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0-or-later -export const LOCAL_MIN_RMS = 0.003; +export const LOCAL_MIN_RMS = 0.0003; +export const LOCAL_AUTO_MIN_RMS = 0.000003; const LOCAL_DEFAULT_RMS = 0.008; export const LOCAL_MAX_RMS = 0.04; const REMOTE_MIN_RMS = 0.002; @@ -29,7 +30,11 @@ function interpolateThreshold(slider: number, min: number, def: number, max: num } export function getLocalSpeakingThresholdRms(slider: number): number { - return interpolateThreshold(slider, LOCAL_MIN_RMS, LOCAL_DEFAULT_RMS, LOCAL_MAX_RMS); + const value = clampSlider(slider); + if (value <= SLIDER_DEFAULT) { + return LOCAL_MIN_RMS * (LOCAL_DEFAULT_RMS / LOCAL_MIN_RMS) ** (value / SLIDER_DEFAULT); + } + return interpolateThreshold(value, LOCAL_MIN_RMS, LOCAL_DEFAULT_RMS, LOCAL_MAX_RMS); } export function getRemoteSpeakingThresholdRms(slider: number): number { diff --git a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppAudioPreferencesSyncBinding.ts b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppAudioPreferencesSyncBinding.ts index 9a003a9d9..9d81a1563 100644 --- a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppAudioPreferencesSyncBinding.ts +++ b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppAudioPreferencesSyncBinding.ts @@ -1,17 +1,21 @@ // SPDX-License-Identifier: AGPL-3.0-or-later import assert from 'node:assert/strict'; +import Keybind from '@app/features/input/state/InputKeybind'; import VoiceDevicePermissionState from '@app/features/voice/engine/VoiceDevicePermissionState'; import { createVoiceEngineV2AppAudioSettingsSnapshot, hasVoiceEngineV2InputProcessorSettingsChanged, hasVoiceEngineV2MicrophoneCaptureSettingsChanged, + hasVoiceEngineV2MicrophonePublishSettingsChanged, type VoiceEngineV2AppAudioSettingsSnapshot, } from '@app/features/voice/engine/v2/VoiceEngineV2AppAudioSettingsSync'; import ParticipantVolume from '@app/features/voice/state/ParticipantVolume'; import StreamAudioPrefs from '@app/features/voice/state/StreamAudioPrefs'; import VoiceSettings from '@app/features/voice/state/VoiceSettings'; +import NoiseSuppressionAvailability from '@app/features/voice/utils/noise_suppression/NoiseSuppressionAvailability'; import type {Room} from 'livekit-client'; +import {reaction} from 'mobx'; export interface VoiceEngineV2AppAudioPreferencesSnapshot { readonly audioSettings: VoiceEngineV2AppAudioSettingsSnapshot; @@ -19,12 +23,13 @@ export interface VoiceEngineV2AppAudioPreferencesSnapshot { readonly participantMutes: Readonly>; readonly connectionVolumes: Readonly>>>; readonly streamAudioRevision: number; + readonly pushToMuteActive: boolean; } export interface VoiceEngineV2AppAudioPreferencesMediaAdapter { - refreshMicrophone(room: Room): Promise; - refreshLocalVoiceInputProcessor(room: Room): Promise; - applyLocalInputVolume(room: Room): void; + requestMicrophoneRefresh(room: Room, request: {republish: boolean}): Promise; + configureVoiceInput(room: Room): void; + handleInputKeybindChange(room: Room): void; applyAllLocalAudioPreferences(room: Room): void; } @@ -44,36 +49,37 @@ export function createVoiceEngineV2AppAudioPreferencesSnapshot(): VoiceEngineV2A participantMutes: ParticipantVolume.localMutes, connectionVolumes: ParticipantVolume.connectionVolumesByLocalConnectionId, streamAudioRevision: StreamAudioPrefs.audioPrefsRevision, + pushToMuteActive: Keybind.isPushToMuteEffective(), }; } export function createVoiceEngineV2AppAudioPreferencesSyncSources(): VoiceEngineV2AppAudioPreferencesSyncSources { return { - stores: [VoiceSettings, VoiceDevicePermissionState, ParticipantVolume, StreamAudioPrefs], + stores: [ + VoiceSettings, + VoiceDevicePermissionState, + ParticipantVolume, + StreamAudioPrefs, + NoiseSuppressionAvailability, + { + subscribe: (listener) => reaction(() => [Keybind.transmitMode, Keybind.isPushToMuteEffective()], listener), + }, + ], getSnapshot: createVoiceEngineV2AppAudioPreferencesSnapshot, }; } -function refreshMicrophoneCapture( +function refreshMicrophone( room: Room, adapter: VoiceEngineV2AppAudioPreferencesMediaAdapter, logger: VoiceEngineV2AppAudioPreferencesLogger, + republish: boolean, ): void { - void adapter.refreshMicrophone(room).catch((error) => { + void adapter.requestMicrophoneRefresh(room, {republish}).catch((error) => { logger.warn('Failed to refresh microphone after audio settings change', {error}); }); } -function refreshVoiceInputProcessor( - room: Room, - adapter: VoiceEngineV2AppAudioPreferencesMediaAdapter, - logger: VoiceEngineV2AppAudioPreferencesLogger, -): void { - void adapter.refreshLocalVoiceInputProcessor(room).catch((error) => { - logger.warn('Failed to refresh voice input processor after audio settings change', {error}); - }); -} - export function syncVoiceEngineV2AppAudioPreferences( room: Room, adapter: VoiceEngineV2AppAudioPreferencesMediaAdapter, @@ -83,17 +89,17 @@ export function syncVoiceEngineV2AppAudioPreferences( ): void { assert.ok(room !== null && typeof room === 'object', 'audio preferences sync room must be an object'); assert.equal( - typeof adapter.refreshMicrophone, + typeof adapter.requestMicrophoneRefresh, 'function', - 'audio preferences sync adapter missing refreshMicrophone', + 'audio preferences sync adapter missing requestMicrophoneRefresh', ); assert.equal(typeof logger.warn, 'function', 'audio preferences sync logger missing warn'); - if (hasVoiceEngineV2MicrophoneCaptureSettingsChanged(previous.audioSettings, current.audioSettings)) { - refreshMicrophoneCapture(room, adapter, logger); + if (previous.pushToMuteActive !== current.pushToMuteActive) adapter.handleInputKeybindChange(room); + const republish = hasVoiceEngineV2MicrophonePublishSettingsChanged(previous.audioSettings, current.audioSettings); + if (republish || hasVoiceEngineV2MicrophoneCaptureSettingsChanged(previous.audioSettings, current.audioSettings)) { + refreshMicrophone(room, adapter, logger, republish); } else if (hasVoiceEngineV2InputProcessorSettingsChanged(previous.audioSettings, current.audioSettings)) { - refreshVoiceInputProcessor(room, adapter, logger); - } else if (current.audioSettings.inputVolume !== previous.audioSettings.inputVolume) { - adapter.applyLocalInputVolume(room); + adapter.configureVoiceInput(room); } if ( current.audioSettings.outputVolume !== previous.audioSettings.outputVolume || diff --git a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppAudioSettingsSync.ts b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppAudioSettingsSync.ts index b6480ee66..791c3cb6e 100644 --- a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppAudioSettingsSync.ts +++ b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppAudioSettingsSync.ts @@ -79,6 +79,15 @@ export function createVoiceEngineV2AppAudioSettingsSnapshot(): VoiceEngineV2AppA }; } +export function hasVoiceEngineV2MicrophonePublishSettingsChanged( + previous: VoiceEngineV2AppAudioSettingsSnapshot, + current: VoiceEngineV2AppAudioSettingsSnapshot, +): boolean { + assertAudioSettingsSnapshot(previous, 'previous'); + assertAudioSettingsSnapshot(current, 'current'); + return previous.stereoCapture !== current.stereoCapture; +} + export function hasVoiceEngineV2MicrophoneCaptureSettingsChanged( previous: VoiceEngineV2AppAudioSettingsSnapshot, current: VoiceEngineV2AppAudioSettingsSnapshot, @@ -86,12 +95,10 @@ export function hasVoiceEngineV2MicrophoneCaptureSettingsChanged( assertAudioSettingsSnapshot(previous, 'previous'); assertAudioSettingsSnapshot(current, 'current'); if (previous.effectiveInputDeviceId !== current.effectiveInputDeviceId) return true; - if (previous.processingMode !== current.processingMode) return true; if (previous.echoCancellation !== current.echoCancellation) return true; if (previous.browserNoiseSuppression !== current.browserNoiseSuppression) return true; if (previous.autoGainControl !== current.autoGainControl) return true; if (previous.contentHint !== current.contentHint) return true; - if (previous.stereoCapture !== current.stereoCapture) return true; return false; } @@ -101,9 +108,11 @@ export function hasVoiceEngineV2InputProcessorSettingsChanged( ): boolean { assertAudioSettingsSnapshot(previous, 'previous'); assertAudioSettingsSnapshot(current, 'current'); - if (previous.deepFilter !== current.deepFilter) return true; + if (previous.noiseSuppressionBackend !== current.noiseSuppressionBackend) return true; if (previous.voiceActivityGate !== current.voiceActivityGate) return true; if (previous.vadAutoSensitivity !== current.vadAutoSensitivity) return true; - if (previous.noiseSuppressionBackend !== current.noiseSuppressionBackend) return true; + if (previous.vadThreshold !== current.vadThreshold) return true; + if (previous.inputVolume !== current.inputVolume) return true; + if (previous.processingMode !== current.processingMode) return true; return false; } diff --git a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppLiveKitExecutionAdapter.ts b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppLiveKitExecutionAdapter.ts index e50e5ea14..c954b7b8e 100644 --- a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppLiveKitExecutionAdapter.ts +++ b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppLiveKitExecutionAdapter.ts @@ -3,6 +3,7 @@ import {Logger} from '@app/features/platform/utils/AppLogger'; import {buildVoiceEngineV2AppCameraPermissionDeniedError} from '@app/features/voice/engine/v2/VoiceEngineV2AppCameraPermissionDeniedError'; import type {VoiceEngineV2AppCameraTransitionOutcome} from '@app/features/voice/engine/v2/VoiceEngineV2AppCameraTransition'; +import {beginMicrophoneSession} from '@app/features/voice/utils/noise_suppression/DeepFilter'; import type { LiveKitPort, StatsPort, @@ -200,6 +201,7 @@ export class VoiceEngineV2AppLiveKitExecutionAdapter implements LiveKitPort { throw buildOperatingError('connect', 'options.token is missing'); } this.logger.info('connect requested', {url: options.url}); + beginMicrophoneSession(); const voiceServerDelegate = this.connection.connectToVoiceServer; if (typeof voiceServerDelegate === 'function') { try { diff --git a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMediaExecutionAdapter.tsx b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMediaExecutionAdapter.tsx index 70d639da8..1244134e0 100644 --- a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMediaExecutionAdapter.tsx +++ b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMediaExecutionAdapter.tsx @@ -19,6 +19,7 @@ import {Store} from '@app/features/voice/engine/Store'; import VoiceDevicePermissionState from '@app/features/voice/engine/VoiceDevicePermissionState'; import type {EffectiveAudioState} from '@app/features/voice/engine/VoiceEffectiveAudioState'; import {getEffectiveAudioState} from '@app/features/voice/engine/VoiceEffectiveAudioState'; +import {acquireVoiceInputContext, type VoiceInputContextLease} from '@app/features/voice/engine/VoiceInputAudioContext'; import { createVoiceMicrophoneFailureLatchSnapshot, isVoiceMicrophoneFailureLatchActive, @@ -42,10 +43,6 @@ import { type VoiceMediaEvent, type VoiceMediaSnapshot, } from '@app/features/voice/engine/VoiceMediaStateMachine'; -import { - getLocalSpeakingThresholdRms, - SPEAKING_LOCAL_RELEASE_MS, -} from '@app/features/voice/engine/VoiceSpeakingThreshold'; import type {VoiceStateSyncPartial} from '@app/features/voice/engine/VoiceStateSyncTypes'; import { enforceLocalMediaPublicationCap, @@ -73,17 +70,9 @@ import { type VoiceEngineV2AppCameraTransitionOutcome, } from '@app/features/voice/engine/v2/VoiceEngineV2AppCameraTransition'; import { - chooseMicrophoneRefreshStrategy, - computeSpeakingDetectorRms, createInitialMicrophoneEnableState, - createInitialMicrophoneRefreshState, type MicrophoneEnableContext, type MicrophoneEnableState, - type MicrophoneRefreshContext, - type MicrophoneRefreshState, - readSpeakingDetectorThresholdRms, - type SpeakingDetectorGraph, - type SpeakingDetectorTickOptions, } from '@app/features/voice/engine/v2/VoiceEngineV2AppMicrophoneTransaction'; import { selectVoiceEngineV2AppEffectiveSelfMuteFromAudioControls, @@ -103,12 +92,11 @@ import { buildCameraPublishOptions, findVideoPublishCodecPolicyViolation, } from '@app/features/voice/utils/CodecCapabilityDetector'; +import {awaitMicrophoneSessionWarmup} from '@app/features/voice/utils/noise_suppression/DeepFilter'; +import NoiseSuppressionAvailability from '@app/features/voice/utils/noise_suppression/NoiseSuppressionAvailability'; +import {readCaptureNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; import {applyBackgroundProcessor, clearCameraVideoProcessor} from '@app/features/voice/utils/VideoBackgroundProcessor'; -import { - removeVoiceInputProcessor, - syncVoiceInputProcessor, - updateVoiceInputGain, -} from '@app/features/voice/utils/VoiceInputProcessor'; +import {readVoiceInputProcessor, VoiceInputTrackProcessor} from '@app/features/voice/utils/VoiceInputProcessor'; import { isVoicePermissionMuteActive, isVoiceSpeakPermissionDenied, @@ -135,10 +123,9 @@ import type { TrackPublishOptions, VideoCaptureOptions, } from 'livekit-client'; -import {Track} from 'livekit-client'; +import {Track, TrackEvent} from 'livekit-client'; const logger = new Logger('VoiceEngineV2AppMediaExecutionAdapter'); -const LOCAL_SPEAKING_ANALYSER_INTERVAL_MS = 50; const CAMERA_PUBLISH_CODEC_CORRECTION_MAX = 1; export const REPUBLISH_MICROPHONE_GUARD_MS = 150; type VoiceMuteReason = VoiceEngineV2AppVoiceMuteReason; @@ -148,8 +135,30 @@ export interface SetCameraEnabledOptions { sendUpdate?: boolean; } -export interface RefreshMicrophoneOptions { - forceRepublish?: boolean; +export interface MicrophoneRefreshRequest { + republish: boolean; +} + +interface QueuedMicrophoneRefresh { + republish: boolean; + promise: Promise; +} + +function readConstraintValue(constraint: T | {exact?: T; ideal?: T} | undefined): T | undefined { + if (constraint !== null && typeof constraint === 'object' && !Array.isArray(constraint)) { + const range = constraint as {exact?: T; ideal?: T}; + return range.exact ?? range.ideal; + } + return constraint as T | undefined; +} + +function microphoneCaptureMatches(constraints: MediaTrackConstraints, options: AudioCaptureOptions): boolean { + return ( + readConstraintValue(constraints.deviceId) === readConstraintValue(options.deviceId) && + readConstraintValue(constraints.echoCancellation) === readConstraintValue(options.echoCancellation) && + readConstraintValue(constraints.noiseSuppression) === readConstraintValue(options.noiseSuppression) && + readConstraintValue(constraints.autoGainControl) === readConstraintValue(options.autoGainControl) + ); } function extractUserIdFromVoiceIdentity(identity: string): string | null { @@ -221,15 +230,12 @@ function getEffectiveSelfMuteForVoiceStatePayloadFromV2AudioControls(): boolean } export class VoiceEngineV2AppMediaExecutionAdapter extends Store { - private speakingAudioContext: AudioContext | null = null; - private speakingSourceNode: MediaStreamAudioSourceNode | null = null; - private speakingAnalyserNode: AnalyserNode | null = null; - private speakingTimerId: number | null = null; - private speakingSilenceStartedAt: number | null = null; - private speakingTrackEndedCleanup: (() => void) | null = null; + private speakingDetectorCleanup: (() => void) | null = null; private mediaStateSnapshot: VoiceMediaSnapshot = createVoiceMediaSnapshot(); private microphoneEnablePromise: Promise | null = null; private microphoneRefreshQueue: Promise = Promise.resolve(); + private queuedMicrophoneRefresh: QueuedMicrophoneRefresh | null = null; + private voiceInputRecovery: {lease: VoiceInputContextLease; cleanup: () => void} | null = null; private cameraBackgroundRefreshQueue: Promise = Promise.resolve(); private cameraCaptureRefreshQueue: Promise = Promise.resolve(); private sourceLifecycleBridge: VoiceEngineV2AppSourceLifecycleBridge | null = null; @@ -664,131 +670,180 @@ export class VoiceEngineV2AppMediaExecutionAdapter extends Store { } } - async refreshMicrophone(room: Room | null, options: RefreshMicrophoneOptions = {}): Promise { - assertNullableObjectLike(room, 'refreshMicrophone.room'); - assertObjectLike(options, 'refreshMicrophone.options'); + requestMicrophoneRefresh(room: Room | null, request: MicrophoneRefreshRequest): Promise { + assertNullableObjectLike(room, 'requestMicrophoneRefresh.room'); + assertObjectLike(request, 'requestMicrophoneRefresh.request'); this.observeMicrophoneFailureLatchScope(this.getActiveChannelId()); - const refresh = async () => this.refreshMicrophoneNow(room, options); - const pendingRefresh = this.microphoneRefreshQueue.then(refresh, refresh); - this.microphoneRefreshQueue = pendingRefresh.catch(() => {}); - return pendingRefresh; + const queued = this.queuedMicrophoneRefresh; + if (queued) { + queued.republish ||= request.republish; + return queued.promise; + } + const next: QueuedMicrophoneRefresh = {republish: request.republish, promise: Promise.resolve()}; + next.promise = this.microphoneRefreshQueue.then(() => { + if (this.queuedMicrophoneRefresh === next) this.queuedMicrophoneRefresh = null; + return this.runMicrophoneRefresh(room, next.republish); + }); + this.queuedMicrophoneRefresh = next; + this.microphoneRefreshQueue = next.promise.catch(() => {}); + return next.promise; } - private async refreshMicrophoneNow(room: Room | null, options: RefreshMicrophoneOptions = {}): Promise { + private async runMicrophoneRefresh(room: Room | null, republish: boolean): Promise { + await this.microphoneEnablePromise?.catch(() => {}); if (!room?.localParticipant || !this.hasMicrophonePublication(room)) { return; } - this.transitionMediaState({ - type: 'refresh.request', - hasPublication: true, - forceRepublish: options.forceRepublish, - }); + this.transitionMediaState({type: 'refresh.request', hasPublication: true, forceRepublish: republish}); const audioTrack = this.getLocalAudioTrack(room); if (!audioTrack) { return; } + if (republish) { + await this.republishMicrophoneAfterSettingsChange(room); + return; + } + const processor = readVoiceInputProcessor(audioTrack); + const browserNoiseSuppressionTurnsOff = + readConstraintValue(audioTrack.constraints.noiseSuppression) === true && + this.getMicrophoneCaptureOptions().noiseSuppression === false; + if (browserNoiseSuppressionTurnsOff) { + await processor?.configure(); + } const captureOptions = this.getMicrophoneCaptureOptions(); - const strategy = chooseMicrophoneRefreshStrategy(options); - if (strategy === 'force-republish') { - await this.attemptMicrophoneForceRepublish(room, captureOptions); - return; + if (!microphoneCaptureMatches(audioTrack.constraints, captureOptions)) { + try { + await audioTrack.restartTrack(captureOptions); + this.transitionMediaState({type: 'refresh.restart.success'}); + logger.debug('Restarted microphone capture with new settings', {captureOptions}); + } catch (error) { + this.transitionMediaState({type: 'refresh.restart.failure'}); + logger.warn('Failed to restart microphone capture; re-publishing mic from scratch', {error, captureOptions}); + await this.republishMicrophoneAfterSettingsChange(room); + return; + } } - const ctx: MicrophoneRefreshContext = {room, options, audioTrack, captureOptions}; - const state: MicrophoneRefreshState = createInitialMicrophoneRefreshState(); - await this.prepareMicrophoneRefreshHold(ctx, state); - try { - await this.restartActiveMicrophoneTrack(ctx, state); - } catch (error) { - this.transitionMediaState({type: 'refresh.restart.failure'}); - logger.warn('Failed to restart microphone capture; re-publishing mic from scratch', { - error, - captureOptions, - }); - } - if (state.restartSucceeded) { - await this.releaseMicrophoneRefreshHold(state); - return; - } - await this.republishMicrophoneAfterRestartFailure(room); + await this.refreshMicrophonePublishSettings(room, this.getActiveChannelId()); + this.applyMicrophoneContentHint(audioTrack); + await processor?.configure(); + if (processor) processor.reportRuntime(); + else this.reportRawMicrophoneRuntime(audioTrack); } - private async attemptMicrophoneForceRepublish(room: Room, captureOptions: AudioCaptureOptions): Promise { - assertObjectLike(room, 'attemptMicrophoneForceRepublish.room'); - assertObjectLike(captureOptions, 'attemptMicrophoneForceRepublish.captureOptions'); + private reportRawMicrophoneRuntime(track: LocalAudioTrack): void { + const rawTrack = track.mediaStreamTrack; + NoiseSuppressionAvailability.setVoiceInputRuntime( + track, + readCaptureNoiseSuppressionBackend(rawTrack), + rawTrack.getSettings(), + null, + ); + } + + private applyMicrophoneContentHint(audioTrack: LocalAudioTrack): void { + const profile = resolveVoiceProcessingFromStateForDeviceLabel(VoiceSettings, this.resolveActiveInputDeviceLabel()); + if (audioTrack.mediaStreamTrack) { + applyContentHintToTrack(audioTrack.mediaStreamTrack, profile.contentHint); + } + } + + private async republishMicrophoneAfterSettingsChange(room: Room): Promise { + assertObjectLike(room, 'republishMicrophoneAfterSettingsChange.room'); try { await this.republishMicrophone(room); this.transitionMediaState({type: 'refresh.republish.success'}); - logger.debug('Re-published microphone capture settings', {captureOptions}); } catch (recoveryError) { this.transitionMediaState({type: 'refresh.republish.failure'}); - logger.error('Failed to re-publish microphone after capture settings change', recoveryError); + logger.error('Failed to re-publish microphone', recoveryError); } } - private async prepareMicrophoneRefreshHold( - ctx: MicrophoneRefreshContext, - state: MicrophoneRefreshState, - ): Promise { - assertObjectLike(ctx, 'prepareMicrophoneRefreshHold.ctx'); - assertObjectLike(state, 'prepareMicrophoneRefreshHold.state'); - const primaryMicPublication = - Array.from(ctx.room.localParticipant.audioTrackPublications.values()).find( - (pub) => pub.track === ctx.audioTrack, - ) ?? null; - state.primaryMicPublication = primaryMicPublication; - state.shouldUnmuteAfter = primaryMicPublication ? !primaryMicPublication.isMuted : false; - if (state.shouldUnmuteAfter) { - await primaryMicPublication?.mute().catch((muteError) => { - logger.warn('Failed to hold mic muted while refreshing voice input processor', {muteError}); - }); + configureVoiceInput(room: Room | null): void { + assertNullableObjectLike(room, 'configureVoiceInput.room'); + if (!room?.localParticipant) return; + if (this.voiceInputRecovery?.lease.context.state === 'running') { + void this.reinstallVoiceInputProcessor(room); } + void readVoiceInputProcessor(this.getLocalAudioTrack(room))?.configure(); } - private async restartActiveMicrophoneTrack( - ctx: MicrophoneRefreshContext, - state: MicrophoneRefreshState, - ): Promise { - assertObjectLike(ctx, 'restartActiveMicrophoneTrack.ctx'); - assertObjectLike(state, 'restartActiveMicrophoneTrack.state'); - await ctx.audioTrack.restartTrack(ctx.captureOptions); - await this.refreshMicrophonePublishSettings(ctx.room, this.getActiveChannelId()); - await syncVoiceInputProcessor(ctx.audioTrack); - this.applyMicrophoneRefreshSnapshot(ctx); - state.restartSucceeded = true; - this.transitionMediaState({type: 'refresh.restart.success'}); - logger.debug('Refreshed microphone capture settings'); - } - - private applyMicrophoneRefreshSnapshot(ctx: MicrophoneRefreshContext): void { - assertObjectLike(ctx, 'applyMicrophoneRefreshSnapshot.ctx'); - assertObjectLike(ctx.audioTrack, 'applyMicrophoneRefreshSnapshot.audioTrack'); - const profile = resolveVoiceProcessingFromStateForDeviceLabel(VoiceSettings, this.resolveActiveInputDeviceLabel()); - if (ctx.audioTrack.mediaStreamTrack) { - applyContentHintToTrack(ctx.audioTrack.mediaStreamTrack, profile.contentHint); - } - this.startLocalSpeakingDetector(ctx.room, ctx.audioTrack.mediaStreamTrack ?? null); - } - - private async releaseMicrophoneRefreshHold(state: MicrophoneRefreshState): Promise { - assertObjectLike(state, 'releaseMicrophoneRefreshHold.state'); - if (!state.shouldUnmuteAfter) return; - const selfMute = getEffectiveSelfMuteForVoiceStatePayloadFromV2AudioControls(); - const selfDeaf = LocalVoiceState.getSelfDeaf(); - if (selfMute || selfDeaf) return; - await state.primaryMicPublication?.unmute().catch((unmuteError) => { - logger.warn('Failed to resume mic after refreshing voice input processor', {unmuteError}); + private createMicrophoneProcessor(room: Room, channelId: string | null): VoiceInputTrackProcessor { + const profile = this.resolveActiveMicrophoneProfile(); + const stereo = sendsStereoMicrophone(this.resolveMicrophoneChannelBitrate(channelId), profile.stereoCapture); + return new VoiceInputTrackProcessor(stereo ? 2 : 1, { + onSourceRateChanged: () => { + void this.requestMicrophoneRefresh(room, {republish: true}); + }, + onGraphFailed: (processor) => { + NoiseSuppressionAvailability.setVoiceInputGraphUnavailable(true); + const removeProcessor = async (): Promise => { + await this.microphoneEnablePromise?.catch(() => {}); + const track = this.getLocalAudioTrack(room); + await track?.stopProcessorIfCurrent(processor); + }; + void removeProcessor().catch((error) => { + logger.warn('Failed to remove the unavailable voice input processor', {error}); + }); + }, + onGraphStalled: (processor) => { + logger.warn('Voice input AudioContext is not running; sending the microphone without processing'); + NoiseSuppressionAvailability.setVoiceInputGraphUnavailable(true); + void (async () => { + await this.microphoneEnablePromise?.catch(() => {}); + const track = this.getLocalAudioTrack(room); + if (await track?.stopProcessorIfCurrent(processor)) this.beginVoiceInputRecovery(room); + })().catch((error) => { + logger.warn('Failed to remove the stalled voice input processor', {error}); + }); + }, }); } - private async republishMicrophoneAfterRestartFailure(room: Room): Promise { - assertObjectLike(room, 'republishMicrophoneAfterRestartFailure.room'); - try { - await this.republishMicrophone(room); - this.transitionMediaState({type: 'refresh.republish.success'}); - } catch (recoveryError) { - this.transitionMediaState({type: 'refresh.republish.failure'}); - logger.error('Failed to recover microphone after restart failure', recoveryError); - } + private beginVoiceInputRecovery(room: Room): void { + NoiseSuppressionAvailability.setVoiceInputGraphUnavailable(true); + if (this.voiceInputRecovery) return; + const lease = acquireVoiceInputContext(); + if (!lease) return; + const onStateChange = (): void => { + if (lease.context.state === 'running') void this.reinstallVoiceInputProcessor(room); + }; + lease.context.addEventListener('statechange', onStateChange); + this.voiceInputRecovery = { + lease, + cleanup: () => { + lease.context.removeEventListener('statechange', onStateChange); + lease.release(); + }, + }; + onStateChange(); + } + + private endVoiceInputRecovery(): void { + this.voiceInputRecovery?.cleanup(); + this.voiceInputRecovery = null; + NoiseSuppressionAvailability.setVoiceInputGraphUnavailable(false); + } + + private reinstallVoiceInputProcessor(room: Room): Promise { + const reinstall = async (): Promise => { + if (!this.voiceInputRecovery) return; + const audioTrack = this.getLocalAudioTrack(room); + if (!audioTrack) return; + if (readVoiceInputProcessor(audioTrack)) { + this.endVoiceInputRecovery(); + return; + } + try { + await audioTrack.setProcessor(this.createMicrophoneProcessor(room, this.getActiveChannelId())); + this.endVoiceInputRecovery(); + logger.info('Voice input processor reinstalled'); + } catch (error) { + logger.warn('Voice input processor reinstall failed; the microphone stays unprocessed', {error}); + } + }; + const pending = this.microphoneRefreshQueue.then(reinstall); + this.microphoneRefreshQueue = pending.catch(() => {}); + return pending; } private async republishMicrophone(room: Room): Promise { @@ -874,7 +929,6 @@ export class VoiceEngineV2AppMediaExecutionAdapter extends Store { return; } await this.publishMicrophoneAudioTrack(ctx, state); - await this.installVoiceInputProcessor(ctx, state); this.attachLocalSpeakingDetectorForPublish(ctx, state); MediaPermission.updateMicrophonePermissionGranted(); this.transitionMediaState({type: 'microphone.enable.success'}); @@ -903,42 +957,43 @@ export class VoiceEngineV2AppMediaExecutionAdapter extends Store { private async publishMicrophoneAudioTrack(ctx: MicrophoneEnableContext, state: MicrophoneEnableState): Promise { assertObjectLike(ctx, 'publishMicrophoneAudioTrack.ctx'); assertObjectLike(state, 'publishMicrophoneAudioTrack.state'); - await ctx.room.localParticipant.setMicrophoneEnabled( - true, - this.getMicrophoneCaptureOptions(ctx.options, ctx.channelId), - this.getMicrophonePublishOptions(ctx.channelId), - ); - state.microphoneWasPublished = true; - await this.refreshMicrophonePublishSettings(ctx.room, ctx.channelId); - const audioTrack = this.getLocalAudioTrack(ctx.room); - state.audioTrack = audioTrack; - state.primaryMicPublication = audioTrack - ? (Array.from(ctx.room.localParticipant.audioTrackPublications.values()).find( - (pub) => pub.track === audioTrack, - ) ?? null) - : null; - state.shouldUnmuteAfter = state.primaryMicPublication ? !state.primaryMicPublication.isMuted : false; - this.bindMicrophoneLifecycle(state.audioTrack?.mediaStreamTrack); + await awaitMicrophoneSessionWarmup(); + const tracks = await ctx.room.localParticipant.createTracks({ + audio: { + ...this.getMicrophoneCaptureOptions(ctx.options, ctx.channelId), + processor: this.createMicrophoneProcessor(ctx.room, ctx.channelId), + }, + }); + try { + for (const track of tracks) await track.mute(); + for (const track of tracks) { + await ctx.room.localParticipant.publishTrack(track, this.getMicrophonePublishOptions(ctx.channelId)); + state.microphoneWasPublished = true; + } + await this.refreshMicrophonePublishSettings(ctx.room, ctx.channelId); + const audioTrack = this.getLocalAudioTrack(ctx.room); + state.audioTrack = audioTrack; + if (audioTrack) { + let muted: boolean; + do { + muted = this.shouldMuteMicrophonePublication(); + if (muted) await audioTrack.mute(); + else await audioTrack.unmute(); + } while (muted !== this.shouldMuteMicrophonePublication()); + if (!readVoiceInputProcessor(audioTrack)) { + logger.warn('Voice input processor unavailable; publishing the raw mic track'); + this.beginVoiceInputRecovery(ctx.room); + } + } + this.bindMicrophoneLifecycle(audioTrack?.mediaStream?.getAudioTracks()[0]); + } catch (error) { + for (const track of tracks) track.stop(); + throw error; + } } - private async installVoiceInputProcessor(ctx: MicrophoneEnableContext, state: MicrophoneEnableState): Promise { - assertObjectLike(ctx, 'installVoiceInputProcessor.ctx'); - assertObjectLike(state, 'installVoiceInputProcessor.state'); - if (state.primaryMicPublication && state.shouldUnmuteAfter) { - await state.primaryMicPublication.mute().catch((error) => { - logger.warn('Failed to hold mic muted while installing voice input processor', {error}); - }); - } - await syncVoiceInputProcessor(state.audioTrack); - if (state.primaryMicPublication && state.shouldUnmuteAfter) { - const selfMute = getEffectiveSelfMuteForVoiceStatePayloadFromV2AudioControls(); - const selfDeaf = LocalVoiceState.getSelfDeaf(); - if (!selfMute && !selfDeaf) { - await state.primaryMicPublication.unmute().catch((error) => { - logger.warn('Failed to resume mic after installing voice input processor', {error}); - }); - } - } + private shouldMuteMicrophonePublication(): boolean { + return getEffectiveSelfMuteForVoiceStatePayloadFromV2AudioControls() || this.getEffectiveAudioState().effectiveMute; } private attachLocalSpeakingDetectorForPublish(ctx: MicrophoneEnableContext, state: MicrophoneEnableState): void { @@ -948,7 +1003,7 @@ export class VoiceEngineV2AppMediaExecutionAdapter extends Store { if (state.audioTrack?.mediaStreamTrack) { applyContentHintToTrack(state.audioTrack.mediaStreamTrack, profile.contentHint); } - this.startLocalSpeakingDetector(ctx.room, state.audioTrack?.mediaStreamTrack ?? null); + this.startLocalSpeakingDetector(ctx.room); } private async rollbackMicrophoneEnable( @@ -995,12 +1050,12 @@ export class VoiceEngineV2AppMediaExecutionAdapter extends Store { const tracks = microphonePublications .map((pub) => pub.track) .filter((track): track is LocalAudioTrack => Boolean(track)); - await removeVoiceInputProcessor(); this.stopLocalSpeakingDetector(room); await Promise.allSettled(tracks.map((track) => participant.unpublishTrack(track))); logger.info('Successfully disabled microphone', {tracksUnpublished: tracks.length}); } this.unbindMicrophoneLifecycle(); + this.endVoiceInputRecovery(); this.transitionMediaState({type: 'microphone.disable.success'}); } catch (e) { this.transitionMediaState({type: 'microphone.disable.failure'}); @@ -1348,8 +1403,8 @@ export class VoiceEngineV2AppMediaExecutionAdapter extends Store { resetStreamTracking(): void { assert.ok(this.mediaStateSnapshot !== null, 'resetStreamTracking pre-condition: snapshot present'); - void removeVoiceInputProcessor(); this.stopLocalSpeakingDetector(); + this.endVoiceInputRecovery(); this.transitionMediaState({type: 'media.reset'}); } @@ -1391,30 +1446,6 @@ export class VoiceEngineV2AppMediaExecutionAdapter extends Store { ParticipantVolume.applySettingsToRoom(room); } - applyLocalInputVolume(room: Room | null): void { - assertNullableObjectLike(room, 'applyLocalInputVolume.room'); - if (!room?.localParticipant) { - return; - } - const audioTrack = this.getLocalAudioTrack(room); - updateVoiceInputGain(audioTrack); - } - - async refreshLocalVoiceInputProcessor(room: Room | null): Promise { - assertNullableObjectLike(room, 'refreshLocalVoiceInputProcessor.room'); - if (!room?.localParticipant) { - return; - } - const audioTrack = this.getLocalAudioTrack(room); - await syncVoiceInputProcessor(audioTrack); - if (!audioTrack?.mediaStreamTrack) { - return; - } - const profile = resolveVoiceProcessingFromStateForDeviceLabel(VoiceSettings, this.resolveActiveInputDeviceLabel()); - applyContentHintToTrack(audioTrack.mediaStreamTrack, profile.contentHint); - this.startLocalSpeakingDetector(room, audioTrack.mediaStreamTrack); - } - setLocalVideoDisabled(identity: string, disabled: boolean, room: Room | null, connectionId: string | null): void { assertNonEmptyString(identity, 'setLocalVideoDisabled.identity'); assertBoolean(disabled, 'setLocalVideoDisabled.disabled'); @@ -1546,9 +1577,6 @@ export class VoiceEngineV2AppMediaExecutionAdapter extends Store { this.syncVoiceState({self_mute: targetMute}); this.updateMediaAudioControls(); this.syncLocalSpeakingOverride(room); - void this.refreshLocalVoiceInputProcessor(room).catch((error) => { - logger.warn('Failed to refresh voice input processor after transmit mode change', {error}); - }); } getMuteReason(voiceState: VoiceState | null, guildId?: string | null, channelId?: string | null): VoiceMuteReason { @@ -1695,182 +1723,43 @@ export class VoiceEngineV2AppMediaExecutionAdapter extends Store { if (!room?.localParticipant) return; const speaking = this.getLocalSpeakingOverrideState(room); if (speaking === null) return; - this.speakingSilenceStartedAt = null; this.setLocalParticipantAudioLevelSpeaking(room, speaking); } - private startLocalSpeakingDetector(room: Room, track: MediaStreamTrack | null): void { + private startLocalSpeakingDetector(room: Room): void { this.stopLocalSpeakingDetector(room); - if (!track || track.readyState === 'ended' || !room.localParticipant) { - return; - } - const AudioContextCtor = - window.AudioContext || (window as typeof window & {webkitAudioContext?: typeof AudioContext}).webkitAudioContext; - if (!AudioContextCtor) { - return; - } - try { - const graph = this.buildSpeakingDetectorAudioGraph(AudioContextCtor, track); - this.commitSpeakingDetectorGraph(graph); - const tick = this.createSpeakingDetectorTick({ - room, - track, - graph, - getThresholdRms: () => getLocalSpeakingThresholdRms(VoiceSettings.getVadThreshold()), - releaseDelayMs: SPEAKING_LOCAL_RELEASE_MS, - localParticipantIdentity: room.localParticipant.identity, - }); - this.bindSpeakingDetectorTrackEndedListener(room, track); - this.speakingTimerId = window.setTimeout(tick, LOCAL_SPEAKING_ANALYSER_INTERVAL_MS); - this.transitionMediaState({type: 'speakingDetector.attach'}); - } catch (error) { - logger.warn('Failed to start local speaking detector', {error}); - this.stopLocalSpeakingDetector(room); - } - } - - private buildSpeakingDetectorAudioGraph( - AudioContextCtor: typeof AudioContext, - track: MediaStreamTrack, - ): SpeakingDetectorGraph { - assert.equal( - typeof AudioContextCtor, - 'function', - 'buildSpeakingDetectorAudioGraph.AudioContextCtor must be constructor', - ); - assertObjectLike(track, 'buildSpeakingDetectorAudioGraph.track'); - const audioContext = new AudioContextCtor({latencyHint: 'interactive'}); - const sourceNode = audioContext.createMediaStreamSource(new MediaStream([track])); - const analyserNode = audioContext.createAnalyser(); - analyserNode.fftSize = 256; - analyserNode.smoothingTimeConstant = 0.15; - sourceNode.connect(analyserNode); - if (audioContext.state === 'suspended') { - void audioContext.resume().catch((error) => { - logger.debug('Local speaking AudioContext resume rejected', {error}); - }); - } - const samples = new Uint8Array(analyserNode.fftSize); - return {audioContext, sourceNode, analyserNode, samples}; - } - - private commitSpeakingDetectorGraph(graph: SpeakingDetectorGraph): void { - assertObjectLike(graph, 'commitSpeakingDetectorGraph.graph'); - this.speakingAudioContext = graph.audioContext; - this.speakingSourceNode = graph.sourceNode; - this.speakingAnalyserNode = graph.analyserNode; - this.speakingSilenceStartedAt = null; - } - - private bindSpeakingDetectorTrackEndedListener(room: Room, track: MediaStreamTrack): void { - assertObjectLike(room, 'bindSpeakingDetectorTrackEndedListener.room'); - assertObjectLike(track, 'bindSpeakingDetectorTrackEndedListener.track'); - const onTrackEnded = (): void => { - this.transitionMediaState({type: 'microphone.publication.ended'}); - this.stopLocalSpeakingDetector(room); - }; - track.addEventListener('ended', onTrackEnded, {once: true}); - this.speakingTrackEndedCleanup = () => { - track.removeEventListener('ended', onTrackEnded); - }; - } - - private createSpeakingDetectorTick(options: SpeakingDetectorTickOptions): () => void { - assertObjectLike(options, 'createSpeakingDetectorTick.options'); - assertNonEmptyString( - options.localParticipantIdentity, - 'createSpeakingDetectorTick.options.localParticipantIdentity', - ); - const setSpeaking = (speaking: boolean): void => { - this.setLocalParticipantAudioLevelSpeaking(options.room, speaking); - }; - const tick = (): void => { - this.speakingTimerId = null; - if (this.speakingAnalyserNode !== options.graph.analyserNode) return; - if (options.track.readyState === 'ended') { - this.stopLocalSpeakingDetector(options.room); + const track = this.getLocalAudioTrack(room); + if (!track || !room.localParticipant) return; + let stopLevel: (() => void) | null = null; + const bind = (): void => { + stopLevel?.(); + stopLevel = null; + this.setLocalParticipantAudioLevelSpeaking(room, this.getLocalSpeakingOverrideState(room) ?? false); + const processor = readVoiceInputProcessor(track); + if (!processor) { + this.reportRawMicrophoneRuntime(track); return; } - const localSpeakingOverride = this.getLocalSpeakingOverrideState(options.room); - if (localSpeakingOverride !== null) { - this.applySpeakingDetectorOverride(options, localSpeakingOverride, setSpeaking); - this.speakingTimerId = window.setTimeout(tick, LOCAL_SPEAKING_ANALYSER_INTERVAL_MS); - return; - } - this.applySpeakingDetectorSample(options, setSpeaking); - this.speakingTimerId = window.setTimeout(tick, LOCAL_SPEAKING_ANALYSER_INTERVAL_MS); + processor.reportRuntime(); + stopLevel = processor.onLevel((level) => { + this.setLocalParticipantAudioLevelSpeaking(room, this.getLocalSpeakingOverrideState(room) ?? level.speaking); + }); }; - return tick; - } - - private applySpeakingDetectorOverride( - options: SpeakingDetectorTickOptions, - localSpeakingOverride: boolean, - setSpeaking: (speaking: boolean) => void, - ): void { - assertObjectLike(options, 'applySpeakingDetectorOverride.options'); - assertBoolean(localSpeakingOverride, 'applySpeakingDetectorOverride.localSpeakingOverride'); - this.speakingSilenceStartedAt = null; - if (this.getLocalParticipantAudioLevelSpeaking(options.localParticipantIdentity) !== localSpeakingOverride) { - setSpeaking(localSpeakingOverride); - } - } - - private applySpeakingDetectorSample( - options: SpeakingDetectorTickOptions, - setSpeaking: (speaking: boolean) => void, - ): void { - assertObjectLike(options, 'applySpeakingDetectorSample.options'); - assert.ok(options.releaseDelayMs >= 0, 'applySpeakingDetectorSample.options.releaseDelayMs must be non-negative'); - const {graph, releaseDelayMs, localParticipantIdentity} = options; - const threshold = readSpeakingDetectorThresholdRms(options.getThresholdRms); - graph.analyserNode.getByteTimeDomainData(graph.samples); - const rms = computeSpeakingDetectorRms(graph.samples); - const now = performance.now(); - if (rms >= threshold) { - this.speakingSilenceStartedAt = null; - if (!this.getLocalParticipantAudioLevelSpeaking(localParticipantIdentity)) { - setSpeaking(true); - } - return; - } - this.speakingSilenceStartedAt ??= now; - if ( - this.getLocalParticipantAudioLevelSpeaking(localParticipantIdentity) && - now - this.speakingSilenceStartedAt >= releaseDelayMs - ) { - setSpeaking(false); - } + track.on(TrackEvent.TrackProcessorUpdate, bind); + this.speakingDetectorCleanup = () => { + track.off(TrackEvent.TrackProcessorUpdate, bind); + stopLevel?.(); + NoiseSuppressionAvailability.clearVoiceInputRuntime(track); + }; + bind(); + this.transitionMediaState({type: 'speakingDetector.attach'}); } private stopLocalSpeakingDetector(room?: Room | null): void { this.transitionMediaState({type: 'speakingDetector.detach'}); - if (this.speakingTimerId !== null) { - window.clearTimeout(this.speakingTimerId); - this.speakingTimerId = null; - } - this.speakingTrackEndedCleanup?.(); - this.speakingTrackEndedCleanup = null; - try { - this.speakingSourceNode?.disconnect(); - } catch (error) { - logger.debug('Failed to disconnect local speaking source node', {error}); - } - try { - this.speakingAnalyserNode?.disconnect(); - } catch (error) { - logger.debug('Failed to disconnect local speaking analyser node', {error}); - } - void this.speakingAudioContext?.close().catch((error) => { - logger.debug('Failed to close local speaking AudioContext', {error}); - }); - this.speakingAudioContext = null; - this.speakingSourceNode = null; - this.speakingAnalyserNode = null; - this.speakingSilenceStartedAt = null; - if (room) { - this.setLocalParticipantAudioLevelSpeaking(room, false); - } + this.speakingDetectorCleanup?.(); + this.speakingDetectorCleanup = null; + if (room) this.setLocalParticipantAudioLevelSpeaking(room, false); } } diff --git a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMicrophoneTransaction.ts b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMicrophoneTransaction.ts index 6f79e07ad..16b7b7cc2 100644 --- a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMicrophoneTransaction.ts +++ b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMicrophoneTransaction.ts @@ -1,8 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0-or-later -import assert from 'node:assert/strict'; import type {VoiceEngineV2MicrophoneOptions} from '@fluxer/voice_engine_v2'; -import type {AudioCaptureOptions, LocalAudioTrack, LocalTrackPublication, Room} from 'livekit-client'; +import type {LocalAudioTrack, Room} from 'livekit-client'; export interface MicrophoneEnableContext { readonly room: Room; @@ -13,101 +12,11 @@ export interface MicrophoneEnableContext { export interface MicrophoneEnableState { microphoneWasPublished: boolean; audioTrack: LocalAudioTrack | null; - primaryMicPublication: LocalTrackPublication | null; - shouldUnmuteAfter: boolean; } -export interface MicrophoneRefreshContext { - readonly room: Room; - readonly options: {forceRepublish?: boolean}; - readonly audioTrack: LocalAudioTrack; - readonly captureOptions: AudioCaptureOptions; -} - -export interface MicrophoneRefreshState { - primaryMicPublication: LocalTrackPublication | null; - shouldUnmuteAfter: boolean; - restartSucceeded: boolean; -} - -export interface SpeakingDetectorGraph { - readonly audioContext: AudioContext; - readonly sourceNode: MediaStreamAudioSourceNode; - readonly analyserNode: AnalyserNode; - readonly samples: Uint8Array; -} - -export interface SpeakingDetectorTickOptions { - readonly room: Room; - readonly track: MediaStreamTrack; - readonly graph: SpeakingDetectorGraph; - readonly getThresholdRms: () => number; - readonly releaseDelayMs: number; - readonly localParticipantIdentity: string; -} - -export type MicrophoneRefreshStrategy = 'force-republish' | 'restart-in-place'; - export function createInitialMicrophoneEnableState(): MicrophoneEnableState { return { microphoneWasPublished: false, audioTrack: null, - primaryMicPublication: null, - shouldUnmuteAfter: false, }; } - -export function createInitialMicrophoneRefreshState(): MicrophoneRefreshState { - return { - primaryMicPublication: null, - shouldUnmuteAfter: false, - restartSucceeded: false, - }; -} - -export function chooseMicrophoneRefreshStrategy(options: {forceRepublish?: boolean}): MicrophoneRefreshStrategy { - assert.ok( - options !== null && typeof options === 'object', - 'chooseMicrophoneRefreshStrategy.options must be an object', - ); - if (options.forceRepublish === true) return 'force-republish'; - return 'restart-in-place'; -} - -export function computeSpeakingDetectorRms(samples: Uint8Array): number { - assert.ok(samples !== null && samples !== undefined, 'computeSpeakingDetectorRms.samples must not be null'); - assert.ok(samples.length > 0, 'computeSpeakingDetectorRms.samples must be non-empty'); - let sumSquares = 0; - for (let i = 0; i < samples.length; i++) { - const normalized = (samples[i]! - 128) / 128; - sumSquares += normalized * normalized; - } - return Math.sqrt(sumSquares / samples.length); -} - -export function readSpeakingDetectorThresholdRms(getThresholdRms: () => number): number { - assert.equal( - typeof getThresholdRms, - 'function', - 'readSpeakingDetectorThresholdRms.getThresholdRms must be a function', - ); - const threshold = getThresholdRms(); - assert.equal(typeof threshold, 'number', 'readSpeakingDetectorThresholdRms.threshold must be a number'); - assert.ok(Number.isFinite(threshold), 'readSpeakingDetectorThresholdRms.threshold must be finite'); - assert.ok(threshold >= 0, 'readSpeakingDetectorThresholdRms.threshold must be non-negative'); - return threshold; -} - -export function shouldReleaseSpeakingHold(args: { - silenceStartedAt: number | null; - now: number; - releaseDelayMs: number; - currentlySpeaking: boolean; -}): boolean { - assert.ok(args !== null && typeof args === 'object', 'shouldReleaseSpeakingHold.args must be an object'); - assert.equal(typeof args.now, 'number', 'shouldReleaseSpeakingHold.args.now must be a number'); - assert.ok(args.releaseDelayMs >= 0, 'shouldReleaseSpeakingHold.args.releaseDelayMs must be non-negative'); - if (!args.currentlySpeaking) return false; - if (args.silenceStartedAt === null) return false; - return args.now - args.silenceStartedAt >= args.releaseDelayMs; -} diff --git a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppPermissionAdapter.ts b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppPermissionAdapter.ts index 38770258d..a46bc74c8 100644 --- a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppPermissionAdapter.ts +++ b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppPermissionAdapter.ts @@ -22,7 +22,6 @@ import { } from '@app/features/voice/engine/VoiceTrackPublicationUtils'; import {asVoiceTrackSource, VoiceTrackSource} from '@app/features/voice/engine/VoiceTrackSource'; import {clearCameraVideoProcessor} from '@app/features/voice/utils/VideoBackgroundProcessor'; -import {removeVoiceInputProcessor} from '@app/features/voice/utils/VoiceInputProcessor'; import {getVoiceChannelPermissions, type VoiceChannelPermissions} from '@app/features/voice/utils/VoicePermissionUtils'; import type {LocalAudioTrack, LocalVideoTrack, Room} from 'livekit-client'; @@ -322,7 +321,6 @@ class VoiceEngineV2AppPermissionAdapter extends Store { .map((pub) => pub.track) .filter((track): track is LocalAudioTrack => Boolean(track)); if (tracks.length > 0) { - await removeVoiceInputProcessor(); await Promise.allSettled(tracks.map((track) => localParticipant.unpublishTrack(track))); } break; diff --git a/fluxer_app/src/features/voice/state/VoiceSettings.ts b/fluxer_app/src/features/voice/state/VoiceSettings.ts index c4268e8f4..d24485a5a 100644 --- a/fluxer_app/src/features/voice/state/VoiceSettings.ts +++ b/fluxer_app/src/features/voice/state/VoiceSettings.ts @@ -363,6 +363,29 @@ function applyVideoQualityNormalisationMigration(parsed: Record return changed; } +export function applyLegacyNoiseSuppressionNoneMigrationV1(parsed: Record): boolean { + let changed = false; + if ( + parsed.noiseSuppressionBackendPrefV1 == null && + parsed.noiseSuppression === false && + parsed.deepFilterNoiseSuppressionPrefV2 !== true + ) { + parsed.noiseSuppressionBackendPrefV1 = 'none'; + changed = true; + } + for (const key of [ + 'noiseSuppression', + 'deepFilterNoiseSuppressionPrefV2', + 'deepFilterNoiseSuppressionLevelPrefV2', + 'noiseSuppressionStandardDefaultMigratedV1', + ]) { + if (!(key in parsed)) continue; + delete parsed[key]; + changed = true; + } + return changed; +} + function validateNoiseSuppressionBackend(value: unknown): VoiceNoiseSuppressionBackend | null { return isVoiceNoiseSuppressionBackend(value) ? value : null; } @@ -559,6 +582,7 @@ class VoiceSettings { changed = applyScreenShareHevcOptOutMigrationV1(parsed) || changed; changed = applyScreenShareSoftwareQualityRetiredMigrationV1(parsed) || changed; changed = applyScreenShareBackupCodecModeRetiredMigrationV1(parsed) || changed; + changed = applyLegacyNoiseSuppressionNoneMigrationV1(parsed) || changed; if (changed) { AppStorage.setItem('VoiceSettings', JSON.stringify(parsed)); } diff --git a/fluxer_app/src/features/voice/utils/AudioPublishOptions.ts b/fluxer_app/src/features/voice/utils/AudioPublishOptions.ts index 4d87c345e..45c791e35 100644 --- a/fluxer_app/src/features/voice/utils/AudioPublishOptions.ts +++ b/fluxer_app/src/features/voice/utils/AudioPublishOptions.ts @@ -33,7 +33,7 @@ export function buildMicrophonePublishOptions( }, dtx: false, red: true, - forceStereo: sendsStereoMicrophone(maxBitrate, stereoCapture) ? undefined : false, + forceStereo: sendsStereoMicrophone(maxBitrate, stereoCapture), }; } diff --git a/fluxer_app/src/features/voice/utils/DeepFilterNoiseProcessor.ts b/fluxer_app/src/features/voice/utils/DeepFilterNoiseProcessor.ts deleted file mode 100644 index d26d97bc8..000000000 --- a/fluxer_app/src/features/voice/utils/DeepFilterNoiseProcessor.ts +++ /dev/null @@ -1,179 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later - -import RuntimeConfig from '@app/features/app/state/RuntimeConfig'; -import {Logger} from '@app/features/platform/utils/AppLogger'; -import {createVoiceAudioContext} from '@app/features/voice/engine/VoiceSharedAudioContext'; -import {DeepFilterNoiseFilterProcessor} from 'deepfilternet3-noise-filter'; - -const logger = new Logger('DeepFilterNoiseProcessor'); -const DEEP_FILTER_MODEL_SAMPLE_RATE = 48000; -const HIGH_PASS_FREQUENCY_HZ = 60; -const HIGH_PASS_Q = Math.SQRT1_2; -const LIMITER_THRESHOLD_DB = -3; -const LIMITER_KNEE_DB = 0; -const LIMITER_RATIO = 20; -const LIMITER_ATTACK_SEC = 0.003; -const LIMITER_RELEASE_SEC = 0.05; -const DEEP_FILTER_NOISE_REDUCTION_LEVEL = 30; - -function createDeepFilterProcessor(): DeepFilterNoiseFilterProcessor { - return new DeepFilterNoiseFilterProcessor({ - sampleRate: DEEP_FILTER_MODEL_SAMPLE_RATE, - noiseReductionLevel: DEEP_FILTER_NOISE_REDUCTION_LEVEL, - enabled: true, - assetConfig: { - cdnUrl: `${RuntimeConfig.staticCdnEndpoint}/libs/deepfilternet3`, - }, - }); -} - -export function resolveDeepFilterAudioContext( - sourceContext: AudioContext, - feedTrack: MediaStreamTrack, -): AudioContext | null { - const modelRateContext = createVoiceAudioContext({ - latencyHint: 'interactive', - sampleRate: DEEP_FILTER_MODEL_SAMPLE_RATE, - }); - if (!modelRateContext) return null; - if (modelRateContext.sampleRate === sourceContext.sampleRate) return modelRateContext; - try { - modelRateContext.createMediaStreamSource(new MediaStream([feedTrack])).disconnect(); - return modelRateContext; - } catch (error) { - logger.info('DeepFilter cannot read the capture graph at the model rate; running it at the capture rate', { - modelSampleRate: modelRateContext.sampleRate, - captureSampleRate: sourceContext.sampleRate, - error, - }); - } - void modelRateContext.close().catch((error) => { - logger.debug('Failed to close the rejected DeepFilter AudioContext', error); - }); - return createVoiceAudioContext({latencyHint: 'interactive', sampleRate: sourceContext.sampleRate}); -} - -export interface DeepFilterAudioChain { - processedTrack: MediaStreamTrack; - inputDestination: MediaStreamAudioDestinationNode; - dispose: () => Promise; -} - -function safeDisconnect(node: AudioNode | null | undefined): void { - if (!node) return; - try { - node.disconnect(); - } catch {} -} - -function safeStopTrack(track: MediaStreamTrack | null | undefined): void { - if (!track) return; - try { - track.stop(); - } catch {} -} - -export async function buildDeepFilterAudioChain(audioContext: AudioContext): Promise { - const inputDestination = audioContext.createMediaStreamDestination(); - const inputTrack = inputDestination.stream.getAudioTracks()[0]; - if (!inputTrack) { - throw new Error('buildDeepFilterAudioChain: missing input destination track'); - } - const hpfSource = audioContext.createMediaStreamSource(new MediaStream([inputTrack])); - const highPass = audioContext.createBiquadFilter(); - highPass.type = 'highpass'; - highPass.frequency.value = HIGH_PASS_FREQUENCY_HZ; - highPass.Q.value = HIGH_PASS_Q; - hpfSource.connect(highPass); - const deepFilterFeedDestination = audioContext.createMediaStreamDestination(); - highPass.connect(deepFilterFeedDestination); - const deepFilterFeedTrack = deepFilterFeedDestination.stream.getAudioTracks()[0]; - if (!deepFilterFeedTrack) { - safeDisconnect(hpfSource); - safeDisconnect(highPass); - safeDisconnect(inputDestination); - safeDisconnect(deepFilterFeedDestination); - safeStopTrack(inputTrack); - throw new Error('buildDeepFilterAudioChain: missing DeepFilter feed track'); - } - const processor = createDeepFilterProcessor(); - processor.audioContext = resolveDeepFilterAudioContext(audioContext, deepFilterFeedTrack); - const disposeDeepFilterInputGraph = () => { - safeDisconnect(inputDestination); - safeDisconnect(hpfSource); - safeDisconnect(highPass); - safeDisconnect(deepFilterFeedDestination); - safeStopTrack(inputTrack); - safeStopTrack(deepFilterFeedTrack); - }; - try { - await processor.init({track: deepFilterFeedTrack}); - } catch (error) { - disposeDeepFilterInputGraph(); - try { - await processor.destroy(); - } catch (destroyError) { - logger.debug('DeepFilter destroy after init failure threw', destroyError); - } - throw error; - } - if (!processor.processedTrack) { - disposeDeepFilterInputGraph(); - try { - await processor.destroy(); - } catch (destroyError) { - logger.debug('DeepFilter destroy after missing processedTrack threw', destroyError); - } - throw new Error('DeepFilter init produced no processedTrack'); - } - const limiterSource = audioContext.createMediaStreamSource(new MediaStream([processor.processedTrack])); - const limiter = audioContext.createDynamicsCompressor(); - limiter.threshold.value = LIMITER_THRESHOLD_DB; - limiter.knee.value = LIMITER_KNEE_DB; - limiter.ratio.value = LIMITER_RATIO; - limiter.attack.value = LIMITER_ATTACK_SEC; - limiter.release.value = LIMITER_RELEASE_SEC; - limiterSource.connect(limiter); - const outputDestination = audioContext.createMediaStreamDestination(); - limiter.connect(outputDestination); - const processedTrack = outputDestination.stream.getAudioTracks()[0]; - if (!processedTrack) { - disposeDeepFilterInputGraph(); - safeDisconnect(limiterSource); - safeDisconnect(limiter); - safeDisconnect(outputDestination); - safeStopTrack(processor.processedTrack); - try { - await processor.destroy(); - } catch (destroyError) { - logger.debug('DeepFilter destroy after missing output track threw', destroyError); - } - throw new Error('buildDeepFilterAudioChain: missing limiter output track'); - } - let disposed = false; - const dispose = async () => { - if (disposed) return; - disposed = true; - safeDisconnect(inputDestination); - safeDisconnect(hpfSource); - safeDisconnect(highPass); - safeDisconnect(deepFilterFeedDestination); - safeDisconnect(limiterSource); - safeDisconnect(limiter); - safeDisconnect(outputDestination); - try { - await processor.destroy(); - } catch (error) { - logger.warn('Failed to destroy DeepFilter processor in chain dispose', error); - } - safeStopTrack(inputTrack); - safeStopTrack(deepFilterFeedTrack); - safeStopTrack(processor.processedTrack); - safeStopTrack(processedTrack); - }; - return { - processedTrack, - inputDestination, - dispose, - }; -} diff --git a/fluxer_app/src/features/voice/utils/MediaDeviceStartupPreload.ts b/fluxer_app/src/features/voice/utils/MediaDeviceStartupPreload.ts index 442467cf8..0ff0d056c 100644 --- a/fluxer_app/src/features/voice/utils/MediaDeviceStartupPreload.ts +++ b/fluxer_app/src/features/voice/utils/MediaDeviceStartupPreload.ts @@ -3,6 +3,7 @@ import MediaPermission from '@app/features/permissions/system/state/MediaPermission'; import {Logger} from '@app/features/platform/utils/AppLogger'; import VoiceDevicePermissionState from '@app/features/voice/engine/VoiceDevicePermissionState'; +import {scheduleDeepFilterPrefetch} from '@app/features/voice/utils/noise_suppression/DeepFilter'; import type {VoiceMediaPermissionType} from '@app/features/voice/utils/VoiceDeviceManager'; const logger = new Logger('MediaDeviceStartupPreload'); @@ -10,10 +11,14 @@ const logger = new Logger('MediaDeviceStartupPreload'); export function startMediaDeviceStartupPreload(): () => void { let stopped = false; let lastPermissionStateKey: string | null = null; + let cancelDeepFilterPrefetch: (() => void) | null = null; const preloadDevices = () => { if (stopped) return; const grantedPermissionTypes: Array = []; - if (MediaPermission.isMicrophoneGranted()) grantedPermissionTypes.push('audio'); + if (MediaPermission.isMicrophoneGranted()) { + grantedPermissionTypes.push('audio'); + cancelDeepFilterPrefetch ??= scheduleDeepFilterPrefetch(); + } if (MediaPermission.isCameraGranted()) grantedPermissionTypes.push('video'); const permissionStateKey = [ MediaPermission.isInitialized() ? 'initialized' : 'pending', @@ -39,5 +44,6 @@ export function startMediaDeviceStartupPreload(): () => void { return () => { stopped = true; disposePermissionListener(); + cancelDeepFilterPrefetch?.(); }; } diff --git a/fluxer_app/src/features/voice/utils/StatsForNerdsCopy.ts b/fluxer_app/src/features/voice/utils/StatsForNerdsCopy.ts index 852fb2b01..4a368bc8e 100644 --- a/fluxer_app/src/features/voice/utils/StatsForNerdsCopy.ts +++ b/fluxer_app/src/features/voice/utils/StatsForNerdsCopy.ts @@ -32,7 +32,7 @@ import { getNativeAudioBridgeStats, getNativeAudioCaptureDiagnosticState, } from '@app/features/voice/utils/NativeAudioCaptureBridge'; -import {readNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; +import {readVoiceInputDiagnostics} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; import {getDisplayShareEnvironment} from '@app/features/voice/utils/ScreenShareEnvironment'; import {getRecentScreenShares} from '@app/features/voice/utils/ScreenShareLifecycleLog'; import {getScreenShareBitrateBps, resolveStreamingModeSettings} from '@app/features/voice/utils/ScreenShareOptions'; @@ -277,9 +277,7 @@ async function collectVoiceSettingsMetadata(): Promise> effectiveScreenShareAudioDeviceIdHash: await hashString(VoiceSettings.getEffectiveScreenShareAudioDeviceId()), inputVolume: VoiceSettings.getInputVolume(), outputVolume: VoiceSettings.getOutputVolume(), - echoCancellation: VoiceSettings.getEchoCancellation(), - autoGainControl: VoiceSettings.getAutoGainControl(), - noiseSuppressionBackend: readNoiseSuppressionBackend(), + ...readVoiceInputDiagnostics(), voiceProcessingMode: VoiceSettings.getVoiceProcessingMode(), vadThreshold: VoiceSettings.getVadThreshold(), vadAutoSensitivity: VoiceSettings.getVadAutoSensitivity(), @@ -494,12 +492,7 @@ export function collectStatsForNerdsSnapshot(): StatsForNerdsData { voiceServerEndpoint: MediaEngine.voiceServerEndpoint ?? 'n/a', reconnectionCount: MediaEngine.reconnectionCount, }, - audio: { - echoCancellation: VoiceSettings.echoCancellation, - autoGainControl: VoiceSettings.autoGainControl, - noiseSuppressionBackend: readNoiseSuppressionBackend(), - processingMode: VoiceSettings.voiceProcessingMode, - }, + audio: readVoiceInputDiagnostics(), screenShareSettings: { resolution: effectiveScreenShareSettings.resolution, frameRate: effectiveScreenShareSettings.frameRate, diff --git a/fluxer_app/src/features/voice/utils/VoiceActivityGate.ts b/fluxer_app/src/features/voice/utils/VoiceActivityGate.ts new file mode 100644 index 000000000..befe80f25 --- /dev/null +++ b/fluxer_app/src/features/voice/utils/VoiceActivityGate.ts @@ -0,0 +1,83 @@ +import { + LOCAL_AUTO_MIN_RMS, + LOCAL_MAX_RMS, + SPEAKING_LOCAL_RELEASE_MS, +} from '@app/features/voice/engine/VoiceSpeakingThreshold'; + +const GATE_STARTUP_TIMEOUT_MS = 8000; +const modules = new WeakMap>(); + +export interface VoiceActivityGateConfig { + apply: boolean; + auto: boolean; + manualThresholdRms: number; +} + +export interface VoiceInputLevel { + rms: number; + floorRms: number; + thresholdRms: number; + speaking: boolean; + nonFinite: boolean; + frame: number; + contextTime: number; +} + +export function loadVoiceActivityGate(context: AudioContext, signal: AbortSignal): Promise { + let pending = modules.get(context); + if (!pending) { + pending = import('@app/features/voice/utils/noise_suppression/NoiseSuppressionWorkletAssets').then((assets) => + context.audioWorklet.addModule(assets.VOICE_GATE_WORKLET_URL), + ); + modules.set(context, pending); + void pending.catch(() => { + if (modules.get(context) === pending) modules.delete(context); + }); + } + const loading = pending; + return new Promise((resolve, reject) => { + const finish = (error?: unknown): void => { + clearTimeout(timer); + signal.removeEventListener('abort', onAbort); + if (error === undefined) resolve(); + else reject(error); + }; + const onAbort = (): void => finish(signal.reason); + const timer = setTimeout( + () => finish(new Error('Voice activity gate did not load in time')), + GATE_STARTUP_TIMEOUT_MS, + ); + signal.addEventListener('abort', onAbort, {once: true}); + if (signal.aborted) onAbort(); + void loading.then(() => finish(), finish); + }); +} + +export function createVoiceActivityGate( + context: AudioContext, + channelCount: 1 | 2, + config: VoiceActivityGateConfig, + onLevel: (level: VoiceInputLevel) => void, + onFailure: () => void, +): AudioWorkletNode { + const node = new AudioWorkletNode(context, 'fluxer-voice-gate', { + numberOfInputs: 1, + numberOfOutputs: 1, + outputChannelCount: [channelCount], + channelCount, + channelCountMode: 'explicit', + channelInterpretation: 'speakers', + processorOptions: { + ...config, + channelCount, + minRms: LOCAL_AUTO_MIN_RMS, + maxRms: LOCAL_MAX_RMS, + releaseMs: SPEAKING_LOCAL_RELEASE_MS, + }, + }); + node.port.onmessage = ({data}: MessageEvent) => { + if (data.type === 'level') onLevel(data); + }; + node.onprocessorerror = onFailure; + return node; +} diff --git a/fluxer_app/src/features/voice/utils/VoiceInputProcessor.ts b/fluxer_app/src/features/voice/utils/VoiceInputProcessor.ts index 002c0cdf1..2e1da8a5b 100644 --- a/fluxer_app/src/features/voice/utils/VoiceInputProcessor.ts +++ b/fluxer_app/src/features/voice/utils/VoiceInputProcessor.ts @@ -1,460 +1,588 @@ // SPDX-License-Identifier: AGPL-3.0-or-later -import assert from 'node:assert/strict'; import Keybind from '@app/features/input/state/InputKeybind'; import {Logger} from '@app/features/platform/utils/AppLogger'; import { - resolveVoiceActivityGateState, - resolveVoiceActivityThresholdRms, - updateVoiceActivityNoiseFloorRms, -} from '@app/features/voice/engine/VoiceLocalSpeakingGate'; -import {SPEAKING_LOCAL_RELEASE_MS} from '@app/features/voice/engine/VoiceSpeakingThreshold'; -import {computeSpeakingDetectorRms} from '@app/features/voice/engine/v2/VoiceEngineV2AppMicrophoneTransaction'; + acquireVoiceInputSource, + discardVoiceInputContext, + type VoiceInputContextLease, +} from '@app/features/voice/engine/VoiceInputAudioContext'; +import {createVoiceSoftClipNode} from '@app/features/voice/engine/VoiceSharedAudioContext'; +import {getLocalSpeakingThresholdRms} from '@app/features/voice/engine/VoiceSpeakingThreshold'; import VoiceSettings from '@app/features/voice/state/VoiceSettings'; -import {buildDeepFilterAudioChain, type DeepFilterAudioChain} from '@app/features/voice/utils/DeepFilterNoiseProcessor'; -import {getNoiseSuppressionBackendDescriptor} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionBackends'; import { - buildNoiseSuppressionWorkletChain, - type NoiseSuppressionWorkletChain, -} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionChain'; + acquireDeepFilterNode, + hasIdleDeepFilterNode, + reportVoiceInputLevel, +} from '@app/features/voice/utils/noise_suppression/DeepFilter'; +import NoiseSuppressionAvailability from '@app/features/voice/utils/noise_suppression/NoiseSuppressionAvailability'; +import { + getNoiseSuppressionBackendDescriptor, + type VoiceNoiseSuppressionBackend, +} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionBackends'; +import {createNoiseSuppressionWorkletNode} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionChain'; +import {readCaptureNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; import type {NoiseSuppressionWorkletBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionWorkletTypes'; +import { + createVoiceActivityGate, + loadVoiceActivityGate, + type VoiceActivityGateConfig, + type VoiceInputLevel, +} from '@app/features/voice/utils/VoiceActivityGate'; import { getActiveInputDeviceLabel, - type ResolvedVoiceProcessing, resolveVoiceProcessingFromStateForDeviceLabel, } from '@app/features/voice/utils/VoiceProcessingProfile'; import {inputVoiceVolumePercentToGain} from '@app/features/voice/utils/VoiceVolumeUtils'; -import type {AudioProcessorOptions, LocalAudioTrack, ProcessorOptions, Track, TrackProcessor} from 'livekit-client'; +import type {ProcessorOptions, Track, TrackProcessor} from 'livekit-client'; const logger = new Logger('VoiceInputProcessor'); -const GATE_ANALYSER_FFT_SIZE = 256; -const GATE_TICK_INTERVAL_MS = 50; -const GATE_ATTACK_TIME_CONSTANT = 0.005; -const GATE_RELEASE_TIME_CONSTANT = 0.02; +const VOLUME_TIME_CONSTANT = 0.01; +const SLOT_CROSSFADE_SECONDS = 0.02; +const SLOT_RELEASE_DELAY_MS = 30; +const CONTEXT_STALL_TIMEOUT_MS = 3000; +const PAUSE_POLL_MS = 20; +const PAUSE_MIN_MS = 150; +const PAUSE_WAIT_MAX_MS = 3000; -class VoiceInputTrackProcessor implements TrackProcessor { - name = 'fluxer-voice-input-processor'; - processedTrack?: MediaStreamTrack; - private sourceNode: MediaStreamAudioSourceNode | null = null; - private gainNode: GainNode | null = null; - private passthroughDestination: MediaStreamAudioDestinationNode | null = null; - private deepFilterChain: DeepFilterAudioChain | null = null; - private workletChain: NoiseSuppressionWorkletChain | null = null; - private buildGeneration = 0; - private pendingBuild: AbortController | null = null; - private cancelled = false; - private audioContext: AudioContext | null = null; - private gateNode: GainNode | null = null; - private gateAnalyserNode: AnalyserNode | null = null; - private gateSamples: Uint8Array | null = null; - private gateTimerId: number | null = null; - private gateOpen = false; - private gateSilenceStartedAtMs: number | null = null; - private gateNoiseFloorRms = 0; +export type VoiceInputChannelCount = 1 | 2; + +export interface VoiceInputConfig { + backend: VoiceNoiseSuppressionBackend; + inputVolumePercent: number; + gateEnabled: boolean; + gateAuto: boolean; + gateThresholdRms: number; +} + +export function isVoiceActivityGateEnabled(): boolean { + const profile = resolveVoiceProcessingFromStateForDeviceLabel( + VoiceSettings, + getActiveInputDeviceLabel(VoiceSettings), + ); + return Keybind.transmitMode === 'voice_activity' && profile.mode !== 'studio' && !profile.stereoCapture; +} + +export function resolveVoiceInputConfig(): VoiceInputConfig { + const profile = resolveVoiceProcessingFromStateForDeviceLabel( + VoiceSettings, + getActiveInputDeviceLabel(VoiceSettings), + ); + return { + backend: profile.noiseSuppressionBackend, + inputVolumePercent: VoiceSettings.getInputVolume(), + gateEnabled: isVoiceActivityGateEnabled(), + gateAuto: profile.mode !== 'custom' || VoiceSettings.getVadAutoSensitivity(), + gateThresholdRms: getLocalSpeakingThresholdRms(VoiceSettings.getVadThreshold()), + }; +} + +type SuppressionSlotKey = 'passthrough' | 'deep_filter' | NoiseSuppressionWorkletBackend; + +interface SuppressionSlot { + readonly key: SuppressionSlotKey; + readonly output: GainNode; + dispose(): void; +} + +function isAbortError(error: unknown): boolean { + return error instanceof DOMException && error.name === 'AbortError'; +} + +function disconnectEdge(from: AudioNode, to: AudioNode): void { + try { + from.disconnect(to); + } catch {} +} + +function rampGain(param: AudioParam, target: number, context: BaseAudioContext): void { + const t0 = context.currentTime; + param.cancelScheduledValues(t0); + param.setValueAtTime(param.value, t0); + param.linearRampToValueAtTime(target, t0 + SLOT_CROSSFADE_SECONDS); +} + +export class VoiceInputGraph { + readonly output: AudioNode; + private sourceTrack: MediaStreamTrack | null = null; + private source: MediaStreamAudioSourceNode | null = null; + private readonly inputMix: GainNode; + private slot: SuppressionSlot; + private readonly retiringSlots = new Map>(); + private readonly gate: GainNode; + private readonly volume: GainNode; + private readonly softClip: {input: GainNode; output: WaveShaperNode} | null; + private gateNode: AudioWorkletNode | null = null; + private gateLoad: Promise | null = null; + private gateFailed = false; + private level: VoiceInputLevel | null = null; + private configureRun: Promise | null = null; + private configureDirty = false; + private readonly buildController = new AbortController(); + private disposed = false; constructor( - private inputVolumePercent: number, - private deepFilterEnabled: boolean, - private gateEnabled: boolean, - private workletBackend: NoiseSuppressionWorkletBackend | null, - ) {} - - matchesMode( - deepFilterEnabled: boolean, - gateEnabled: boolean, - workletBackend: NoiseSuppressionWorkletBackend | null, - ): boolean { - return ( - this.deepFilterEnabled === deepFilterEnabled && - this.gateEnabled === gateEnabled && - this.workletBackend === workletBackend - ); + readonly context: AudioContext, + private readonly channelCount: VoiceInputChannelCount, + private readonly resolveConfig: () => VoiceInputConfig, + private readonly onLevel: (level: VoiceInputLevel) => void = () => {}, + private readonly onGateFailure: () => void = () => {}, + private readonly onRuntimeChange: () => void = () => {}, + ) { + this.inputMix = context.createGain(); + this.inputMix.channelCount = channelCount; + this.inputMix.channelCountMode = 'explicit'; + this.inputMix.channelInterpretation = 'speakers'; + this.slot = this.createPassthroughSlot(1); + this.gate = context.createGain(); + this.volume = context.createGain(); + this.softClip = createVoiceSoftClipNode(context); + this.slot.output.connect(this.gate); + this.gate.connect(this.volume); + if (this.softClip) this.volume.connect(this.softClip.input); + this.output = this.softClip?.output ?? this.volume; + const config = resolveConfig(); + this.gate.gain.value = 1; + this.volume.gain.value = inputVoiceVolumePercentToGain(config.inputVolumePercent); + this.applyParameters(config); } - updateInputVolumePercent(nextPercent: number): void { - this.inputVolumePercent = nextPercent; - if (this.gainNode) { - this.gainNode.gain.value = inputVoiceVolumePercentToGain(nextPercent); + setSource(track: MediaStreamTrack): void { + this.replaceSource(track, this.context.createMediaStreamSource(new MediaStream([track]))); + } + + setSourceNode(track: MediaStreamTrack, source: MediaStreamAudioSourceNode): void { + this.replaceSource(track, source); + } + + clearSource(): void { + this.source?.disconnect(); + this.source = null; + this.sourceTrack = null; + } + + private replaceSource(track: MediaStreamTrack, source: MediaStreamAudioSourceNode): void { + if (this.disposed) { + source.disconnect(); + return; + } + source.connect(this.inputMix); + this.source?.disconnect(); + this.source = source; + this.sourceTrack = track; + this.gateNode?.port.postMessage({type: 'reset'}); + this.onRuntimeChange(); + } + + private recreateSource(): void { + const track = this.sourceTrack; + if (track?.readyState !== 'live') return; + try { + this.setSource(track); + } catch (error) { + logger.debug('Could not recreate the voice input source after a suppression build', {error}); } } - async init(opts: ProcessorOptions): Promise { - const audioContext = opts.audioContext ?? this.audioContext; - assert.ok(audioContext, 'Voice input processor requires an audio context before initialization'); - this.audioContext = audioContext; - await this.rebuild({...opts, audioContext}); + reportRuntime(owner: object): void { + if (this.disposed || !this.sourceTrack) return; + const backend = + this.slot.key === 'passthrough' ? readCaptureNoiseSuppressionBackend(this.sourceTrack) : this.slot.key; + NoiseSuppressionAvailability.setVoiceInputRuntime(owner, backend, this.sourceTrack.getSettings(), this.context); } - async restart(opts: ProcessorOptions): Promise { - await this.init(opts); + private readLevelRms(): number { + return this.level?.rms ?? 0; } - async destroy(): Promise { - this.cancelPendingBuild(); - await this.teardown(); + configure(): Promise { + if (this.disposed) return Promise.resolve(); + this.configureDirty = true; + this.configureRun ??= Promise.resolve().then(() => this.drainConfigure()); + return this.configureRun; } - cancelPendingBuild(): void { - this.cancelled = true; - this.buildGeneration++; - this.pendingBuild?.abort(); - } - - private async rebuild(opts: AudioProcessorOptions): Promise { - if (this.cancelled) throw new DOMException('Voice input build cancelled', 'AbortError'); - const teardown = this.teardown(); - const generation = this.buildGeneration; - await teardown; - if (generation !== this.buildGeneration) throw new DOMException('Voice input build cancelled', 'AbortError'); - const controller = new AbortController(); - this.pendingBuild = controller; + private async drainConfigure(): Promise { try { - this.sourceNode = opts.audioContext.createMediaStreamSource(new MediaStream([opts.track])); - this.gainNode = opts.audioContext.createGain(); - this.gainNode.gain.value = inputVoiceVolumePercentToGain(this.inputVolumePercent); - this.sourceNode.connect(this.gainNode); - const chainTail = this.gateEnabled ? this.startVoiceActivityGate(opts.audioContext) : this.gainNode; - if (this.workletBackend != null) { - const chain = await this.buildWorkletChain(opts, this.workletBackend, generation, controller.signal); - if (generation !== this.buildGeneration) { - await chain?.dispose(); - throw new DOMException('Voice input build cancelled', 'AbortError'); - } - if (chain) { - this.workletChain = chain; - chainTail.connect(chain.inputDestination); - this.processedTrack = chain.processedTrack; + this.gateLoad ??= this.installGate(); + while (!this.disposed && this.configureDirty) { + this.configureDirty = false; + const config = this.resolveConfig(); + this.applyParameters(config); + const key = this.resolveSlotKey(config.backend); + if (key === this.slot.key) continue; + const slot = this.reviveRetiringSlot(key) ?? (await this.buildSlot(key)); + if (!slot) continue; + if (this.disposed) { + slot.dispose(); return; } - } - if (this.deepFilterEnabled) { - const chain = await buildDeepFilterAudioChain(opts.audioContext); - if (generation !== this.buildGeneration) { - await chain.dispose(); - throw new DOMException('Voice input build cancelled', 'AbortError'); + if (this.resolveSlotKey(this.resolveConfig().backend) !== key) { + this.retireSlot(slot); + this.configureDirty = true; + continue; } - this.deepFilterChain = chain; - chainTail.connect(chain.inputDestination); - this.processedTrack = chain.processedTrack; - return; + this.swapSlot(slot); } - this.passthroughDestination = opts.audioContext.createMediaStreamDestination(); - chainTail.connect(this.passthroughDestination); - const passthroughTrack = this.passthroughDestination.stream.getAudioTracks()[0]; - if (!passthroughTrack) { - throw new Error('Voice input processor produced no passthrough output track'); - } - this.processedTrack = passthroughTrack; - } catch (error) { - if (generation === this.buildGeneration) await this.teardown(); - throw error; } finally { - if (this.pendingBuild === controller) this.pendingBuild = null; + this.configureRun = null; } } - private async buildWorkletChain( - opts: AudioProcessorOptions, - backend: NoiseSuppressionWorkletBackend, - generation: number, - signal: AbortSignal, - ): Promise { + private resolveSlotKey(backend: VoiceNoiseSuppressionBackend): SuppressionSlotKey { + if (this.channelCount === 2) return 'passthrough'; + const engine = getNoiseSuppressionBackendDescriptor(backend).engine; + if (engine === 'deep_filter') return 'deep_filter'; + if (engine === 'worklet') return backend as NoiseSuppressionWorkletBackend; + return 'passthrough'; + } + + private gateConfig(config: VoiceInputConfig): VoiceActivityGateConfig { + return { + apply: config.gateEnabled && this.channelCount === 1, + auto: config.gateAuto, + manualThresholdRms: config.gateThresholdRms, + }; + } + + private applyParameters(config: VoiceInputConfig): void { + this.volume.gain.setTargetAtTime( + inputVoiceVolumePercentToGain(config.inputVolumePercent), + this.context.currentTime, + VOLUME_TIME_CONSTANT, + ); + if (this.gateNode) this.gateNode.port.postMessage({type: 'config', ...this.gateConfig(config)}); + } + + private async installGate(): Promise { try { - return await buildNoiseSuppressionWorkletChain({ - audioContext: opts.audioContext, - backend, - signal, - onRuntimeFailure: (error) => { - if (generation !== this.buildGeneration) return; - if (!ownsVoiceInputProcessor(this)) return; - logger.warn('Noise suppression worklet failed while running; rebuilding without it', {backend, error}); - markNoiseSuppressionBackendFailed(backend); - void restartVoiceInputProcessorAfterWorkletFailure(this); + await loadVoiceActivityGate(this.context, this.buildController.signal); + if (this.disposed) return; + const node = createVoiceActivityGate( + this.context, + this.channelCount, + this.gateConfig(this.resolveConfig()), + (level) => { + if (this.disposed) return; + this.level = level; + reportVoiceInputLevel(this.context, level.contextTime); + this.onLevel(level); }, - }); + () => this.failGate(), + ); + this.gateNode = node; + disconnectEdge(this.gate, this.volume); + this.gate.connect(node); + node.connect(this.volume); + this.gate.gain.value = 1; } catch (error) { - if (generation !== this.buildGeneration) throw error; - if (signal.aborted) throw error; - logger.warn('Noise suppression worklet chain build failed; continuing without suppression', {backend, error}); - markNoiseSuppressionBackendFailed(backend); + if (this.disposed || this.buildController.signal.aborted) return; + logger.warn('Voice activity gate could not start', {error}); + this.failGate(); + } + } + + private failGate(): void { + if (this.disposed || this.gateFailed) return; + this.gateFailed = true; + discardVoiceInputContext(this.context); + this.destroyGate(); + this.gate.disconnect(); + this.gate.connect(this.volume); + this.gate.gain.value = 1; + this.onGateFailure(); + } + + private destroyGate(): void { + const node = this.gateNode; + if (!node) return; + disconnectEdge(this.gate, node); + node.onprocessorerror = null; + node.port.onmessage = null; + node.port.postMessage({type: 'dispose'}); + node.port.close(); + node.disconnect(); + this.gateNode = null; + } + + private createPassthroughSlot(initialGain: number): SuppressionSlot { + const output = this.context.createGain(); + output.gain.value = initialGain; + this.inputMix.connect(output); + return { + key: 'passthrough', + output, + dispose: () => { + disconnectEdge(this.inputMix, output); + output.disconnect(); + }, + }; + } + + private async buildSlot(key: SuppressionSlotKey): Promise { + if (key === 'passthrough') return this.createPassthroughSlot(0); + try { + return key === 'deep_filter' ? await this.buildDeepFilterSlot() : await this.buildWorkletSlot(key); + } catch (error) { + if (!this.disposed && !isAbortError(error)) { + logger.warn('Noise suppression could not start; keeping the current voice input chain', {backend: key, error}); + } return null; } } - private startVoiceActivityGate(audioContext: BaseAudioContext): AudioNode { - const gainNode = this.gainNode; - if (!gainNode || !this.sourceNode) { - throw new Error('Voice input processor gate requires a built input chain'); + private async waitForSpeechPause(signal: AbortSignal): Promise { + const threshold = this.level?.thresholdRms ?? this.resolveConfig().gateThresholdRms; + const deadline = performance.now() + PAUSE_WAIT_MAX_MS; + let quietSince: number | null = null; + while (!signal.aborted && performance.now() < deadline) { + const at = performance.now(); + if (this.readLevelRms() >= threshold) quietSince = null; + else if (at - (quietSince ??= at) >= PAUSE_MIN_MS) return; + await new Promise((resolve) => setTimeout(resolve, PAUSE_POLL_MS)); } - const gateNode = audioContext.createGain(); - gateNode.gain.value = 0; - gainNode.connect(gateNode); - const analyserNode = audioContext.createAnalyser(); - analyserNode.fftSize = GATE_ANALYSER_FFT_SIZE; - this.sourceNode.connect(analyserNode); - this.gateNode = gateNode; - this.gateAnalyserNode = analyserNode; - this.gateSamples = new Uint8Array(analyserNode.fftSize); - this.gateOpen = false; - this.gateSilenceStartedAtMs = null; - this.gateNoiseFloorRms = 0; - this.gateTimerId = window.setInterval(() => { - this.tickVoiceActivityGate(audioContext); - }, GATE_TICK_INTERVAL_MS); - return gateNode; } - private tickVoiceActivityGate(audioContext: BaseAudioContext): void { - const analyserNode = this.gateAnalyserNode; - const samples = this.gateSamples; - const gateNode = this.gateNode; - if (!analyserNode || !samples || !gateNode) return; - analyserNode.getByteTimeDomainData(samples); - const rms = computeSpeakingDetectorRms(samples); - const next = resolveVoiceActivityGateState({ - rms, - thresholdRms: resolveVoiceActivityThresholdRms({ - autoSensitivity: VoiceSettings.getVadAutoSensitivity(), - vadThreshold: VoiceSettings.getVadThreshold(), - noiseFloorRms: this.gateNoiseFloorRms, - }), - nowMs: performance.now(), - silenceStartedAtMs: this.gateSilenceStartedAtMs, - gateOpen: this.gateOpen, - releaseDelayMs: SPEAKING_LOCAL_RELEASE_MS, - }); - this.gateSilenceStartedAtMs = next.silenceStartedAtMs; - if (!next.open) { - this.gateNoiseFloorRms = updateVoiceActivityNoiseFloorRms(this.gateNoiseFloorRms, rms); + private async buildDeepFilterSlot(): Promise { + const signal = this.buildController.signal; + if (this.source && !hasIdleDeepFilterNode(this.context)) await this.waitForSpeechPause(signal); + const lease = await acquireDeepFilterNode(this.context, signal, () => void this.configure()); + const output = this.context.createGain(); + output.gain.value = 0; + const dispose = () => { + disconnectEdge(this.inputMix, lease.node); + disconnectEdge(lease.node, output); + output.disconnect(); + lease.release(); + }; + this.inputMix.connect(lease.node); + lease.node.connect(output); + await lease.primed(signal); + if (this.disposed) { + dispose(); + throw new DOMException('Voice input graph disposed', 'AbortError'); } - if (next.open === this.gateOpen) return; - this.gateOpen = next.open; - gateNode.gain.setTargetAtTime( - next.open ? 1 : 0, - audioContext.currentTime, - next.open ? GATE_ATTACK_TIME_CONSTANT : GATE_RELEASE_TIME_CONSTANT, + if (lease.builtOverLiveSource) this.recreateSource(); + return {key: 'deep_filter', output, dispose}; + } + + private async buildWorkletSlot(backend: NoiseSuppressionWorkletBackend): Promise { + const worklet = await createNoiseSuppressionWorkletNode(this.context, backend, { + signal: this.buildController.signal, + onRuntimeFailure: (error) => { + logger.warn('Noise suppression worklet failed while running; using browser noise suppression', { + backend, + error, + }); + NoiseSuppressionAvailability.markBackendFailed(backend, 'runtime', Date.now()); + void this.configure(); + }, + }).catch((error: unknown) => { + if (!this.buildController.signal.aborted) { + NoiseSuppressionAvailability.markBackendFailed(backend, 'build', Date.now()); + } + throw error; + }); + const output = this.context.createGain(); + output.gain.value = 0; + this.inputMix.connect(worklet.node); + worklet.node.connect(output); + return { + key: backend, + output, + dispose: () => { + disconnectEdge(this.inputMix, worklet.node); + output.disconnect(); + worklet.dispose(); + }, + }; + } + + private swapSlot(next: SuppressionSlot): void { + const previous = this.slot; + next.output.connect(this.gate); + rampGain(next.output.gain, 1, this.context); + rampGain(previous.output.gain, 0, this.context); + this.slot = next; + this.onRuntimeChange(); + this.gateNode?.port.postMessage({type: 'reset'}); + this.retireSlot(previous); + } + + private retireSlot(slot: SuppressionSlot): void { + this.retiringSlots.set( + slot, + setTimeout(() => { + this.retiringSlots.delete(slot); + slot.dispose(); + }, SLOT_RELEASE_DELAY_MS), ); } - private async teardown(): Promise { - this.buildGeneration++; - this.pendingBuild?.abort(); - this.pendingBuild = null; - if (this.gateTimerId !== null) { - window.clearInterval(this.gateTimerId); - this.gateTimerId = null; + private reviveRetiringSlot(key: SuppressionSlotKey): SuppressionSlot | null { + for (const [slot, timer] of this.retiringSlots) { + if (slot.key !== key) continue; + clearTimeout(timer); + this.retiringSlots.delete(slot); + return slot; } - this.sourceNode?.disconnect(); - this.gainNode?.disconnect(); - this.gateNode?.disconnect(); - this.gateAnalyserNode?.disconnect(); - this.passthroughDestination?.disconnect(); - const workletChain = this.workletChain; - const deepFilterChain = this.deepFilterChain; - const processedTrack = this.processedTrack; - this.sourceNode = null; - this.gainNode = null; - this.gateNode = null; - this.gateAnalyserNode = null; - this.gateSamples = null; - this.gateOpen = false; - this.gateSilenceStartedAtMs = null; - this.gateNoiseFloorRms = 0; - this.passthroughDestination = null; - this.deepFilterChain = null; - this.workletChain = null; - this.processedTrack = undefined; - if (workletChain) { - try { - await workletChain.dispose(); - } catch (error) { - logger.warn('Failed to dispose noise suppression worklet chain for voice input', error); - } - } - if (deepFilterChain) { - try { - await deepFilterChain.dispose(); - } catch (error) { - logger.warn('Failed to dispose DeepFilter chain for voice input', error); - } - } - if (processedTrack && processedTrack.readyState !== 'ended') { - try { - processedTrack.stop(); - } catch (error) { - logger.warn('Failed to stop processed voice input track', error); - } + return null; + } + + dispose(): void { + if (this.disposed) return; + this.disposed = true; + this.buildController.abort(new DOMException('Voice input graph disposed', 'AbortError')); + this.destroyGate(); + for (const [slot, timer] of this.retiringSlots) { + clearTimeout(timer); + slot.dispose(); } + this.retiringSlots.clear(); + this.slot.dispose(); + this.clearSource(); + this.inputMix.disconnect(); + this.gate.disconnect(); + this.volume.disconnect(); + this.softClip?.input.disconnect(); + this.softClip?.output.disconnect(); } } -interface VoiceInputProcessorBinding { - track: LocalAudioTrack; - processor: VoiceInputTrackProcessor; +export interface VoiceInputProcessorEvents { + onSourceRateChanged(processor: VoiceInputTrackProcessor): void; + onGraphStalled(processor: VoiceInputTrackProcessor): void; + onGraphFailed(processor: VoiceInputTrackProcessor): void; } -let activeTrack: LocalAudioTrack | null = null; -let activeProcessor: VoiceInputTrackProcessor | null = null; -let pendingProcessor: VoiceInputProcessorBinding | null = null; -let desiredTrack: LocalAudioTrack | null = null; -let synchronizationGeneration = 0; -const failedWorkletBackends = new Set(); +export class VoiceInputTrackProcessor implements TrackProcessor { + readonly name = 'fluxer-voice-input-processor'; + processedTrack?: MediaStreamTrack; + private state: 'idle' | 'live' | 'destroyed' = 'idle'; + private readonly levelListeners = new Set<(level: VoiceInputLevel) => void>(); + private latestLevel: VoiceInputLevel | null = null; + private hasRunningLevel = false; + private lease: VoiceInputContextLease | null = null; + private graph: VoiceInputGraph | null = null; + private destination: MediaStreamAudioDestinationNode | null = null; + private stallTimer: ReturnType | null = null; + private readonly onContextStateChange = () => this.watchContextState(); -function ownsVoiceInputProcessor(processor: VoiceInputTrackProcessor): boolean { - return processor === activeProcessor || processor === pendingProcessor?.processor; -} + constructor( + private readonly channelCount: VoiceInputChannelCount, + private readonly events: VoiceInputProcessorEvents, + ) {} -function markNoiseSuppressionBackendFailed(backend: NoiseSuppressionWorkletBackend): void { - failedWorkletBackends.add(backend); -} - -async function restartVoiceInputProcessorAfterWorkletFailure(processor: VoiceInputTrackProcessor): Promise { - const track = processor === activeProcessor ? activeTrack : pendingProcessor?.track; - if (!track) return; - try { - const removal = removeVoiceInputProcessor(track); - const generation = synchronizationGeneration; - await removal; - if (generation !== synchronizationGeneration) return; - await syncVoiceInputProcessor(track); - } catch (error) { - logger.warn('Failed to rebuild the voice input processor after a noise suppression failure', error); + async init(opts: ProcessorOptions): Promise { + if (this.state !== 'idle') throw new Error(`Voice input processor cannot start while ${this.state}`); + const acquired = acquireVoiceInputSource(opts.track); + if (!acquired) throw new Error('Voice input processor has no AudioContext'); + this.lease = acquired.lease; + const context = acquired.lease.context; + this.graph = new VoiceInputGraph( + context, + this.channelCount, + resolveVoiceInputConfig, + (level) => this.emitLevel(level, true), + () => this.events.onGraphFailed(this), + () => this.reportRuntime(), + ); + this.graph.setSourceNode(opts.track, acquired.source); + this.destination = context.createMediaStreamDestination(); + this.destination.channelCount = this.channelCount; + this.destination.channelCountMode = 'explicit'; + this.destination.channelInterpretation = 'speakers'; + this.graph.output.connect(this.destination); + const processedTrack = this.destination.stream.getAudioTracks()[0]; + if (!processedTrack) throw new Error('Voice input processor produced no output track'); + this.processedTrack = processedTrack; + this.state = 'live'; + this.reportRuntime(); + context.addEventListener('statechange', this.onContextStateChange); + this.watchContextState(); + void this.graph.configure(); } -} -function resolveActiveVoiceProcessing(): ResolvedVoiceProcessing { - return resolveVoiceProcessingFromStateForDeviceLabel(VoiceSettings, getActiveInputDeviceLabel(VoiceSettings)); -} - -function resolveWorkletBackend(profile: ResolvedVoiceProcessing): NoiseSuppressionWorkletBackend | null { - const descriptor = getNoiseSuppressionBackendDescriptor(profile.noiseSuppressionBackend); - if (descriptor.engine !== 'worklet') return null; - const backend = profile.noiseSuppressionBackend as NoiseSuppressionWorkletBackend; - return failedWorkletBackends.has(backend) ? null : backend; -} - -export function isVoiceActivityGateEnabled(): boolean { - if (Keybind.transmitMode !== 'voice_activity') return false; - if (Keybind.isPushToMuteEffective()) return false; - return resolveActiveVoiceProcessing().mode !== 'studio'; -} - -function shouldUseVoiceInputProcessor(): boolean { - const profile = resolveActiveVoiceProcessing(); - return ( - profile.deepFilter || - resolveWorkletBackend(profile) != null || - VoiceSettings.getInputVolume() !== 100 || - isVoiceActivityGateEnabled() - ); -} - -export async function syncVoiceInputProcessor(track: LocalAudioTrack | null): Promise { - const generation = ++synchronizationGeneration; - desiredTrack = track; - if (!track) { - await stopCurrentVoiceInputProcessors(); - return; - } - const profile = resolveActiveVoiceProcessing(); - const deepFilterEnabled = profile.deepFilter; - const workletBackend = resolveWorkletBackend(profile); - const inputVolumePercent = VoiceSettings.getInputVolume(); - const gateEnabled = isVoiceActivityGateEnabled(); - if (!shouldUseVoiceInputProcessor()) { - await stopCurrentVoiceInputProcessors(); - return; - } - if (activeTrack === track && activeProcessor?.matchesMode(deepFilterEnabled, gateEnabled, workletBackend)) { - activeProcessor.updateInputVolumePercent(inputVolumePercent); - return; - } - await stopCurrentVoiceInputProcessors(); - if (generation !== synchronizationGeneration) return; - const processor = new VoiceInputTrackProcessor(inputVolumePercent, deepFilterEnabled, gateEnabled, workletBackend); - try { - if (!(await installVoiceInputProcessor({track, processor}, generation))) return; - } catch (error) { - logger.warn('Voice input processor install failed; publication remains on raw mic track', { - error, - deepFilterEnabled, - workletBackend, - inputVolumePercent, - }); - throw error; - } - logger.debug('Applied voice input processor', { - inputVolumePercent, - deepFilterEnabled, - gateEnabled, - workletBackend, - }); -} - -async function installVoiceInputProcessor(binding: VoiceInputProcessorBinding, generation: number): Promise { - const {track, processor} = binding; - pendingProcessor = binding; - try { - await track.setProcessor(processor); - } catch (error) { + async restart(opts: ProcessorOptions): Promise { + const graph = this.graph; + if (this.state !== 'live' || !graph) return; try { - await processor.destroy(); - } catch (destroyError) { - logger.debug('Failed to destroy voice input processor after install failure', destroyError); + graph.setSource(opts.track); + } catch (error) { + logger.warn('Voice input cannot read the restarted microphone in its AudioContext', {error}); + graph.clearSource(); + this.events.onSourceRateChanged(this); } - if (generation !== synchronizationGeneration) return false; - throw error; - } finally { - if (pendingProcessor === binding) pendingProcessor = null; } - if (generation !== synchronizationGeneration) { - await stopVoiceInputProcessor(binding); - return false; - } - activeTrack = track; - activeProcessor = processor; - return true; -} -export function updateVoiceInputGain(track: LocalAudioTrack | null): void { - if (!shouldUseVoiceInputProcessor()) { - void removeVoiceInputProcessor(track); - return; + configure(): Promise { + if (this.state !== 'live' || !this.graph) return Promise.resolve(); + return this.graph.configure(); } - if (activeTrack === track && activeProcessor) { - activeProcessor.updateInputVolumePercent(VoiceSettings.getInputVolume()); - return; - } - void syncVoiceInputProcessor(track); -} -export async function removeVoiceInputProcessor(track?: LocalAudioTrack | null): Promise { - if (track != null && desiredTrack !== track) return; - synchronizationGeneration++; - desiredTrack = null; - await stopCurrentVoiceInputProcessors(); -} - -async function stopVoiceInputProcessor({track, processor}: VoiceInputProcessorBinding): Promise { - processor.cancelPendingBuild(); - try { - if (await track.stopProcessorIfCurrent(processor)) return; - } catch (error) { - logger.warn('Failed to stop voice input processor', error); + reportRuntime(): void { + if (this.state === 'live') this.graph?.reportRuntime(this); } - try { - await processor.destroy(); - } catch (error) { - logger.warn('Failed to destroy voice input processor after stop failure', error); + + onLevel(listener: (level: VoiceInputLevel) => void): () => void { + this.levelListeners.add(listener); + if (this.latestLevel) listener(this.latestLevel); + return () => { + this.levelListeners.delete(listener); + }; + } + + private emitLevel(level: VoiceInputLevel, fromWorklet = false): void { + if (this.state !== 'live') return; + if (fromWorklet && !this.hasRunningLevel && this.lease?.context.state === 'running') { + this.hasRunningLevel = true; + NoiseSuppressionAvailability.setVoiceInputGraphUnavailable(false); + } + this.latestLevel = level; + for (const listener of this.levelListeners) listener(level); + } + + private watchContextState(): void { + const context = this.lease?.context; + if (this.state !== 'live' || !context) return; + if (context.state === 'running') { + this.clearStallTimer(); + return; + } + if (this.latestLevel) this.emitLevel({...this.latestLevel, rms: 0, speaking: false}); + this.stallTimer ??= setTimeout(() => { + this.stallTimer = null; + if (this.state === 'live' && context.state !== 'running') this.events.onGraphStalled(this); + }, CONTEXT_STALL_TIMEOUT_MS); + } + + private clearStallTimer(): void { + if (this.stallTimer === null) return; + clearTimeout(this.stallTimer); + this.stallTimer = null; + } + + async destroy(): Promise { + if (this.state === 'destroyed') return; + if (this.latestLevel) this.emitLevel({...this.latestLevel, rms: 0, speaking: false}); + this.levelListeners.clear(); + this.state = 'destroyed'; + NoiseSuppressionAvailability.clearVoiceInputRuntime(this); + this.clearStallTimer(); + this.lease?.context.removeEventListener('statechange', this.onContextStateChange); + this.graph?.dispose(); + this.destination?.disconnect(); + if (this.processedTrack && this.processedTrack.readyState !== 'ended') this.processedTrack.stop(); + this.lease?.release(); + this.graph = null; + this.destination = null; + this.lease = null; } } -async function stopCurrentVoiceInputProcessors(): Promise { - const pending = pendingProcessor; - const active = activeTrack && activeProcessor ? {track: activeTrack, processor: activeProcessor} : null; - pendingProcessor = null; - activeTrack = null; - activeProcessor = null; - if (pending) await stopVoiceInputProcessor(pending); - if (active) await stopVoiceInputProcessor(active); +export function readVoiceInputProcessor( + track: {getProcessor(): unknown} | null | undefined, +): VoiceInputTrackProcessor | null { + const processor = track?.getProcessor(); + return processor instanceof VoiceInputTrackProcessor ? processor : null; } diff --git a/fluxer_app/src/features/voice/utils/VoiceProcessingProfile.ts b/fluxer_app/src/features/voice/utils/VoiceProcessingProfile.ts index 60eccf53c..4a2a5fe46 100644 --- a/fluxer_app/src/features/voice/utils/VoiceProcessingProfile.ts +++ b/fluxer_app/src/features/voice/utils/VoiceProcessingProfile.ts @@ -2,6 +2,7 @@ import VoiceDevicePermissionState from '@app/features/voice/engine/VoiceDevicePermissionState'; import type VoiceSettings from '@app/features/voice/state/VoiceSettings'; +import NoiseSuppressionAvailability from '@app/features/voice/utils/noise_suppression/NoiseSuppressionAvailability'; import { getNoiseSuppressionBackendDescriptor, type VoiceNoiseSuppressionBackend, @@ -37,10 +38,14 @@ function resolveBaseVoiceProcessing( settings: VoiceProcessingSettingsLike, backend: VoiceNoiseSuppressionBackend, ): ResolvedVoiceProcessing { + const effectiveBackend = + settings.voiceProcessingMode === 'voice' + ? NoiseSuppressionAvailability.resolveEffectiveBackend(resolveNoiseSuppressionBackend(null)) + : backend; const noiseSuppression = { - browserNoiseSuppression: getNoiseSuppressionBackendDescriptor(backend).browserNoiseSuppression, - deepFilter: backend === 'deep_filter', - noiseSuppressionBackend: backend, + browserNoiseSuppression: getNoiseSuppressionBackendDescriptor(effectiveBackend).browserNoiseSuppression, + deepFilter: effectiveBackend === 'deep_filter', + noiseSuppressionBackend: effectiveBackend, stereoCapture: false, }; switch (settings.voiceProcessingMode) { @@ -104,7 +109,9 @@ function resolveVoiceProcessingFromStateForMode( echoCancellation: store.echoCancellation, autoGainControl: store.autoGainControl, }, - resolveNoiseSuppressionBackend(store.getNoiseSuppressionBackend()), + NoiseSuppressionAvailability.resolveEffectiveBackend( + resolveNoiseSuppressionBackend(store.getNoiseSuppressionBackend()), + ), store.getStereoMicrophone() === true, ); } diff --git a/fluxer_app/src/features/voice/utils/VoiceStatsForNerdsPresenter.ts b/fluxer_app/src/features/voice/utils/VoiceStatsForNerdsPresenter.ts index 1db86791a..680e6cb75 100644 --- a/fluxer_app/src/features/voice/utils/VoiceStatsForNerdsPresenter.ts +++ b/fluxer_app/src/features/voice/utils/VoiceStatsForNerdsPresenter.ts @@ -71,6 +71,10 @@ export interface StatsForNerdsData { echoCancellation: boolean; autoGainControl: boolean; noiseSuppressionBackend: VoiceNoiseSuppressionBackend; + requestedNoiseSuppressionBackend: VoiceNoiseSuppressionBackend; + browserNoiseSuppression: boolean; + voiceInputGraphUnavailable: boolean; + deepFilterLevels: {inputRms: number; outputRms: number; contextTime: number} | null; processingMode: string; }; screenShareSettings: { diff --git a/fluxer_app/src/features/voice/utils/noise_suppression/DeepFilter.ts b/fluxer_app/src/features/voice/utils/noise_suppression/DeepFilter.ts new file mode 100644 index 000000000..203deeb26 --- /dev/null +++ b/fluxer_app/src/features/voice/utils/noise_suppression/DeepFilter.ts @@ -0,0 +1,601 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +import {Logger} from '@app/features/platform/utils/AppLogger'; +import {acquireIdleVoiceInputContext, isVoiceInputSourceLive} from '@app/features/voice/engine/VoiceInputAudioContext'; +import VoiceSettings from '@app/features/voice/state/VoiceSettings'; +import NoiseSuppressionAvailability, { + type NoiseSuppressionFailureReason, +} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionAvailability'; +import {getNoiseSuppressionBackendDescriptor} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionBackends'; +import {readRequestedNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; +import {getActiveVoiceProcessingMode} from '@app/features/voice/utils/VoiceProcessingProfile'; + +const logger = new Logger('DeepFilter'); + +const DEEP_FILTER_WASM_URL = new URL('./deepfilternet3/df_bg.wasm', import.meta.url).href; +const DEEP_FILTER_MODEL_URL = new URL('./deepfilternet3/DeepFilterNet3_onnx.tar.gz', import.meta.url).href; +const DEEP_FILTER_PROCESSOR_NAME = 'fluxer-deep-filter'; +const DEEP_FILTER_ASSET_IDLE_MS = 20_000; +const DEEP_FILTER_ASSET_TOTAL_MS = 10 * 60_000; +const DEEP_FILTER_BUILD_TIMEOUT_MS = 8000; +const DEEP_FILTER_ATTEN_LIM_DB = 30; +const DEEP_FILTER_INPUT_GAIN = 10; +const DEEP_FILTER_OUTPUT_GAIN = 0.1; +const DEEP_FILTER_HIGH_PASS_HZ = 60; +const DEEP_FILTER_PREFETCH_IDLE_TIMEOUT_MS = 20_000; +const DEEP_FILTER_PRIMED_TIMEOUT_MS = 500; +const DEEP_FILTER_IDLE_DISPOSE_MS = 60_000; +const DEEP_FILTER_JOIN_WAIT_MS = 2000; +const LEVEL_FAULT_MIN_INPUT_RMS = 10 ** (-50 / 20); +const LEVEL_FAULT_REPORTS = 4; +const LIVENESS_CHECK_INTERVAL_MS = 250; +const LIVENESS_MAX_CHECK_DELAY_MS = 2000; +const LIVENESS_MAX_REPORT_GAP_SECONDS = 2; +const GZIP_MAGIC = [0x1f, 0x8b]; +const TAR_MAGIC = [0x75, 0x73, 0x74, 0x61, 0x72]; +const TAR_MAGIC_OFFSET = 257; + +interface DeepFilterAssets { + module: WebAssembly.Module; + modelBytes: ArrayBuffer; +} + +interface DeepFilterNodeHandle { + node: AudioWorkletNode; + flushAndAwaitPrimed: (signal: AbortSignal) => Promise; + watch: (onFault: (error: Error) => void) => () => void; + dispose: () => void; +} + +export interface DeepFilterNodeLease { + node: AudioWorkletNode; + builtOverLiveSource: boolean; + primed: (signal: AbortSignal) => Promise; + release: () => void; +} + +type DeepFilterWorkletMessage = + | {type: 'ready'; frameLength: number} + | {type: 'primed'} + | {type: 'error'; message: string} + | {type: 'health'; inputRms: number; outputRms: number; nonFinite: boolean; frame: number; contextTime: number}; + +class DeepFilterUnavailableError extends Error { + constructor( + readonly reason: NoiseSuppressionFailureReason, + message: string, + ) { + super(message); + this.name = 'DeepFilterUnavailableError'; + } +} + +function isDeepFilterWorkletMessage(value: unknown): value is DeepFilterWorkletMessage { + if (!value || typeof value !== 'object') return false; + const type = (value as {type?: unknown}).type; + return type === 'ready' || type === 'primed' || type === 'error' || type === 'health'; +} + +function markDeepFilterFailed(reason: NoiseSuppressionFailureReason, error: unknown): void { + logger.warn('DeepFilterNet is unavailable; using browser noise suppression', {reason, error}); + NoiseSuppressionAvailability.markBackendFailed('deep_filter', reason, Date.now()); +} + +function toDeepFilterBuildFailure(error: unknown): DeepFilterUnavailableError { + if (error instanceof DeepFilterUnavailableError) return error; + return new DeepFilterUnavailableError('build', error instanceof Error ? error.message : String(error)); +} + +function raceAbort(pending: Promise, signal: AbortSignal): Promise { + if (signal.aborted) return Promise.reject(signal.reason); + return new Promise((resolve, reject) => { + const onAbort = () => reject(signal.reason); + signal.addEventListener('abort', onAbort, {once: true}); + pending.then( + (value) => { + signal.removeEventListener('abort', onAbort); + resolve(value); + }, + (error: unknown) => { + signal.removeEventListener('abort', onAbort); + reject(error); + }, + ); + }); +} + +async function fetchAssetBody(url: string, controller: AbortController): Promise> { + let idleTimer: ReturnType | undefined; + const stopIdleTimer = () => clearTimeout(idleTimer); + const restartIdleTimer = () => { + stopIdleTimer(); + idleTimer = setTimeout(() => { + controller.abort( + new DeepFilterUnavailableError('assets', `No data from ${url} for ${DEEP_FILTER_ASSET_IDLE_MS} ms`), + ); + }, DEEP_FILTER_ASSET_IDLE_MS); + }; + controller.signal.addEventListener('abort', stopIdleTimer, {once: true}); + restartIdleTimer(); + try { + const response = await fetch(url, {credentials: 'same-origin', signal: controller.signal}); + if (!response.ok || !response.body) { + throw new DeepFilterUnavailableError('assets', `${url} returned status ${response.status}`); + } + restartIdleTimer(); + return response.body.pipeThrough( + new TransformStream({ + transform(chunk, stream) { + restartIdleTimer(); + stream.enqueue(chunk); + }, + flush: stopIdleTimer, + }), + ); + } catch (error) { + stopIdleTimer(); + throw error; + } +} + +async function compileDeepFilterWasm(body: ReadableStream): Promise { + const response = new Response(body, {headers: {'content-type': 'application/wasm'}}); + if (typeof WebAssembly.compileStreaming === 'function') return WebAssembly.compileStreaming(response); + return WebAssembly.compile(await response.arrayBuffer()); +} + +function hasBytesAt(bytes: Uint8Array, offset: number, expected: ReadonlyArray): boolean { + return expected.every((value, index) => bytes[offset + index] === value); +} + +async function readDeepFilterModel(body: ReadableStream): Promise { + const buffer = await new Response(body).arrayBuffer(); + const bytes = new Uint8Array(buffer); + if (hasBytesAt(bytes, 0, GZIP_MAGIC)) return buffer; + if (hasBytesAt(bytes, TAR_MAGIC_OFFSET, TAR_MAGIC)) { + throw new DeepFilterUnavailableError('model_encoding', 'DeepFilterNet model arrived decompressed'); + } + throw new DeepFilterUnavailableError('assets', 'DeepFilterNet model is not a gzip archive'); +} + +async function fetchDeepFilterAssets(): Promise { + const controller = new AbortController(); + const totalTimer = setTimeout(() => { + controller.abort(new DeepFilterUnavailableError('assets', 'DeepFilterNet assets took too long to download')); + }, DEEP_FILTER_ASSET_TOTAL_MS); + try { + const [module, modelBytes] = await Promise.all([ + fetchAssetBody(DEEP_FILTER_WASM_URL, controller).then(compileDeepFilterWasm), + fetchAssetBody(DEEP_FILTER_MODEL_URL, controller).then(readDeepFilterModel), + ]); + return {module, modelBytes}; + } catch (error) { + controller.abort(error); + const cause: unknown = controller.signal.reason; + if (cause instanceof DeepFilterUnavailableError) throw cause; + throw new DeepFilterUnavailableError('assets', cause instanceof Error ? cause.message : String(cause)); + } finally { + clearTimeout(totalTimer); + } +} + +let assetsLoad: Promise | null = null; + +export function loadDeepFilterAssets(signal?: AbortSignal): Promise { + if (!assetsLoad) { + const load = fetchDeepFilterAssets(); + assetsLoad = load; + NoiseSuppressionAvailability.setDeepFilterAssetState('loading'); + load.then( + () => { + if (assetsLoad === load) NoiseSuppressionAvailability.setDeepFilterAssetState('ready'); + }, + (error: unknown) => { + if (assetsLoad !== load) return; + assetsLoad = null; + markDeepFilterFailed(error instanceof DeepFilterUnavailableError ? error.reason : 'assets', error); + NoiseSuppressionAvailability.setDeepFilterAssetState('idle'); + }, + ); + } + return signal ? raceAbort(assetsLoad, signal) : assetsLoad; +} + +function isDeepFilterRequested(): boolean { + return ( + getActiveVoiceProcessingMode(VoiceSettings) !== 'studio' && readRequestedNoiseSuppressionBackend() === 'deep_filter' + ); +} + +export function prefetchDeepFilterAssets(): void { + if (!isDeepFilterRequested()) return; + if (NoiseSuppressionAvailability.failures.get('deep_filter')?.active) return; + if (NoiseSuppressionAvailability.deepFilterAssets !== 'idle') return; + void loadDeepFilterAssets().catch(() => {}); +} + +export function scheduleDeepFilterPrefetch(): () => void { + if (typeof window.requestIdleCallback === 'function') { + const handle = window.requestIdleCallback(prefetchDeepFilterAssets, { + timeout: DEEP_FILTER_PREFETCH_IDLE_TIMEOUT_MS, + }); + return () => window.cancelIdleCallback(handle); + } + const handle = window.setTimeout(prefetchDeepFilterAssets, DEEP_FILTER_PREFETCH_IDLE_TIMEOUT_MS); + return () => window.clearTimeout(handle); +} + +const workletModules = new WeakMap>(); + +function addDeepFilterWorkletModule(context: BaseAudioContext): Promise { + let pending = workletModules.get(context); + if (!pending) { + pending = import('@app/features/voice/utils/noise_suppression/NoiseSuppressionWorkletAssets').then((assets) => + context.audioWorklet.addModule(assets.DEEP_FILTER_WORKLET_URL), + ); + workletModules.set(context, pending); + pending.catch(() => { + if (workletModules.get(context) === pending) workletModules.delete(context); + }); + } + return pending; +} + +type DeepFilterMessageListener = (message: DeepFilterWorkletMessage) => void; + +function listenToDeepFilterNode(node: AudioWorkletNode): (listener: DeepFilterMessageListener) => () => void { + const listeners = new Set(); + node.port.onmessage = (event: MessageEvent) => { + if (!isDeepFilterWorkletMessage(event.data)) return; + for (const listener of [...listeners]) listener(event.data); + }; + return (listener) => { + listeners.add(listener); + return () => { + listeners.delete(listener); + }; + }; +} + +function awaitDeepFilterReady( + node: AudioWorkletNode, + listen: (listener: DeepFilterMessageListener) => () => void, + signal: AbortSignal, +): Promise { + return new Promise((resolve, reject) => { + const finish = (error?: unknown) => { + stopListening(); + node.onprocessorerror = null; + signal.removeEventListener('abort', onAbort); + if (error === undefined) resolve(); + else reject(error); + }; + const onAbort = () => finish(signal.reason); + signal.addEventListener('abort', onAbort, {once: true}); + const stopListening = listen((message) => { + if (message.type === 'ready') finish(); + else if (message.type === 'error') { + finish(new DeepFilterUnavailableError('build', `DeepFilterNet worklet failed: ${message.message}`)); + } + }); + node.onprocessorerror = () => + finish(new DeepFilterUnavailableError('build', 'DeepFilterNet worklet raised an error')); + }); +} + +const voiceInputLevelTimes = new WeakMap(); + +export function reportVoiceInputLevel(context: BaseAudioContext, contextTime: number): void { + if (!Number.isFinite(contextTime)) return; + voiceInputLevelTimes.set(context, contextTime); +} + +function watchDeepFilterNode( + context: BaseAudioContext, + node: AudioWorkletNode, + listen: (listener: DeepFilterMessageListener) => () => void, + onFault: (error: Error) => void, +): () => void { + let lastReportContextTime = context.currentTime; + let levelFaultReports = 0; + let lastCheckAtMs = performance.now(); + const checkLiveness = () => { + const now = performance.now(); + const checkWasDelayed = now - lastCheckAtMs > LIVENESS_MAX_CHECK_DELAY_MS; + lastCheckAtMs = now; + if (checkWasDelayed) return; + if (context.state !== 'running') { + lastReportContextTime = context.currentTime; + levelFaultReports = 0; + return; + } + const levelTime = voiceInputLevelTimes.get(context); + if ( + context.currentTime - lastReportContextTime > LIVENESS_MAX_REPORT_GAP_SECONDS && + levelTime !== undefined && + levelTime - lastReportContextTime > LIVENESS_MAX_REPORT_GAP_SECONDS && + context.currentTime - levelTime < LIVENESS_MAX_REPORT_GAP_SECONDS + ) { + onFault(new Error('DeepFilterNet stopped processing audio')); + } + }; + const livenessTimer = setInterval(checkLiveness, LIVENESS_CHECK_INTERVAL_MS); + const stopListening = listen((message) => { + if (message.type === 'error') { + onFault(new Error(`DeepFilterNet worklet failed: ${message.message}`)); + return; + } + if (message.type !== 'health') return; + lastReportContextTime = message.contextTime; + NoiseSuppressionAvailability.setDeepFilterLevels(context, message.inputRms, message.outputRms, message.contextTime); + const silentOutput = message.outputRms === 0 || message.nonFinite; + levelFaultReports = message.inputRms > LEVEL_FAULT_MIN_INPUT_RMS && silentOutput ? levelFaultReports + 1 : 0; + if (levelFaultReports >= LEVEL_FAULT_REPORTS) onFault(new Error('DeepFilterNet output went silent')); + }); + node.onprocessorerror = () => onFault(new Error('DeepFilterNet worklet raised an error')); + return () => { + clearInterval(livenessTimer); + stopListening(); + node.onprocessorerror = null; + }; +} + +function awaitDeepFilterPrimed( + listen: (listener: DeepFilterMessageListener) => () => void, + signal: AbortSignal, +): Promise { + return new Promise((resolve) => { + const finish = () => { + clearTimeout(timer); + stopListening(); + signal.removeEventListener('abort', finish); + resolve(); + }; + const timer = setTimeout(finish, DEEP_FILTER_PRIMED_TIMEOUT_MS); + signal.addEventListener('abort', finish, {once: true}); + const stopListening = listen((message) => { + if (message.type === 'primed') finish(); + }); + }); +} + +async function createDeepFilterNode(context: AudioContext): Promise { + const isClosed = () => context.state === 'closed'; + if (isClosed()) throw new DOMException('Voice input AudioContext closed', 'AbortError'); + const supportedSampleRates = getNoiseSuppressionBackendDescriptor('deep_filter').supportedSampleRates ?? []; + if (!supportedSampleRates.includes(context.sampleRate)) { + const error = new DeepFilterUnavailableError('sample_rate', `DeepFilterNet cannot run at ${context.sampleRate} Hz`); + markDeepFilterFailed(error.reason, error); + throw error; + } + const assets = await loadDeepFilterAssets(); + const controller = new AbortController(); + const onStateChange = () => { + if (isClosed()) { + controller.abort(new DOMException('Voice input AudioContext closed', 'AbortError')); + } + }; + context.addEventListener('statechange', onStateChange); + onStateChange(); + let runningMs = 0; + let previousTick = performance.now(); + const deadline = setInterval(() => { + const now = performance.now(); + if (context.state === 'running') runningMs += now - previousTick; + previousTick = now; + if (runningMs >= DEEP_FILTER_BUILD_TIMEOUT_MS) { + controller.abort(new DeepFilterUnavailableError('build', 'DeepFilterNet did not start in time')); + } + }, 100); + let node: AudioWorkletNode | null = null; + let listen: ((listener: DeepFilterMessageListener) => () => void) | null = null; + try { + await raceAbort(addDeepFilterWorkletModule(context), controller.signal); + node = new AudioWorkletNode(context, DEEP_FILTER_PROCESSOR_NAME, { + numberOfInputs: 1, + numberOfOutputs: 1, + outputChannelCount: [1], + channelCount: 1, + channelCountMode: 'explicit', + channelInterpretation: 'speakers', + processorOptions: { + wasmModule: assets.module, + modelBytes: assets.modelBytes, + attenLimDb: DEEP_FILTER_ATTEN_LIM_DB, + inputGain: DEEP_FILTER_INPUT_GAIN, + outputGain: DEEP_FILTER_OUTPUT_GAIN, + highPassHz: DEEP_FILTER_HIGH_PASS_HZ, + }, + }); + listen = listenToDeepFilterNode(node); + await awaitDeepFilterReady(node, listen, controller.signal); + } catch (error) { + if (node) { + node.port.postMessage({type: 'dispose'}); + node.port.close(); + node.disconnect(); + } + if (isClosed()) throw new DOMException('Voice input AudioContext closed', 'AbortError'); + const failure = toDeepFilterBuildFailure(error); + markDeepFilterFailed(failure.reason, failure); + throw failure; + } finally { + clearInterval(deadline); + context.removeEventListener('statechange', onStateChange); + } + NoiseSuppressionAvailability.clearBackendFailure('deep_filter'); + const readyNode = node; + const readyListen = listen; + return { + node: readyNode, + flushAndAwaitPrimed: (signal) => { + const primed = awaitDeepFilterPrimed(readyListen, signal); + readyNode.port.postMessage({type: 'flush'}); + return primed; + }, + watch: (onFault) => watchDeepFilterNode(context, readyNode, readyListen, onFault), + dispose: () => { + readyNode.disconnect(); + readyNode.port.postMessage({type: 'dispose'}); + readyNode.port.close(); + }, + }; +} + +interface DeepFilterPoolEntry { + readonly build: Promise; + readonly stopWatchingContext: () => void; + holder: symbol | null; + idleTimer: ReturnType | undefined; + faulted: boolean; + disposed: boolean; + builtOverLiveSource: boolean; +} + +const deepFilterPools = new WeakMap>(); + +function getDeepFilterPool(context: BaseAudioContext): Set { + const pool = deepFilterPools.get(context) ?? new Set(); + deepFilterPools.set(context, pool); + return pool; +} + +function disposePoolEntry(pool: Set, entry: DeepFilterPoolEntry): void { + if (entry.disposed) return; + entry.disposed = true; + entry.faulted = true; + entry.stopWatchingContext(); + clearTimeout(entry.idleTimer); + pool.delete(entry); + void entry.build.then( + (handle) => handle.dispose(), + () => {}, + ); +} + +function createPoolEntry(context: AudioContext, pool: Set): DeepFilterPoolEntry { + const onStateChange = () => { + if (context.state === 'closed') disposePoolEntry(pool, entry); + }; + const entry: DeepFilterPoolEntry = { + build: createDeepFilterNode(context), + stopWatchingContext: () => context.removeEventListener('statechange', onStateChange), + holder: null, + idleTimer: undefined, + faulted: false, + disposed: false, + builtOverLiveSource: false, + }; + pool.add(entry); + context.addEventListener('statechange', onStateChange); + onStateChange(); + entry.build.then( + () => { + entry.builtOverLiveSource = isVoiceInputSourceLive(); + }, + () => { + disposePoolEntry(pool, entry); + }, + ); + return entry; +} + +function releasePoolEntry(pool: Set, entry: DeepFilterPoolEntry, token: symbol): void { + if (entry.holder !== token) return; + entry.holder = null; + if (entry.faulted) { + disposePoolEntry(pool, entry); + return; + } + entry.idleTimer = setTimeout(() => disposePoolEntry(pool, entry), DEEP_FILTER_IDLE_DISPOSE_MS); +} + +export function hasIdleDeepFilterNode(context: BaseAudioContext): boolean { + for (const entry of getDeepFilterPool(context)) { + if (entry.holder === null && !entry.faulted) return true; + } + return false; +} + +export async function acquireDeepFilterNode( + context: AudioContext, + signal: AbortSignal, + onFault: () => void, +): Promise { + await loadDeepFilterAssets(signal); + signal.throwIfAborted(); + const pool = getDeepFilterPool(context); + const idle = [...pool].find((candidate) => candidate.holder === null && !candidate.faulted); + const entry = idle ?? createPoolEntry(context, pool); + const token = Symbol('deep-filter-lease'); + entry.holder = token; + clearTimeout(entry.idleTimer); + let handle: DeepFilterNodeHandle; + try { + handle = await raceAbort(entry.build, signal); + } catch (error) { + releasePoolEntry(pool, entry, token); + throw error; + } + const builtOverLiveSource = entry.builtOverLiveSource; + entry.builtOverLiveSource = false; + const stopWatching = handle.watch((error) => { + if (entry.holder !== token || entry.faulted) return; + entry.faulted = true; + pool.delete(entry); + markDeepFilterFailed('runtime', error); + onFault(); + }); + return { + node: handle.node, + builtOverLiveSource, + primed: (primedSignal) => handle.flushAndAwaitPrimed(primedSignal), + release: () => { + if (entry.holder !== token) return; + stopWatching(); + releasePoolEntry(pool, entry, token); + }, + }; +} + +let microphoneSessionWarmup: Promise | null = null; + +async function buildIdleDeepFilterNode(context: AudioContext, signal?: AbortSignal): Promise { + const joinWait = new AbortController(); + const joinDeadline = setTimeout(() => joinWait.abort(), DEEP_FILTER_JOIN_WAIT_MS); + const onAbort = () => joinWait.abort(signal?.reason); + signal?.addEventListener('abort', onAbort, {once: true}); + if (signal?.aborted) onAbort(); + try { + await loadDeepFilterAssets(joinWait.signal); + if (isVoiceInputSourceLive()) return; + const lease = await acquireDeepFilterNode(context, joinWait.signal, () => {}); + lease.release(); + } finally { + clearTimeout(joinDeadline); + signal?.removeEventListener('abort', onAbort); + } +} + +async function warmDeepFilterNode(signal?: AbortSignal): Promise { + const lease = acquireIdleVoiceInputContext(); + if (!lease) return; + await buildIdleDeepFilterNode(lease.context, signal) + .catch(() => {}) + .finally(() => lease.release()); +} + +export function beginMicrophoneSession(signal?: AbortSignal): void { + NoiseSuppressionAvailability.releaseExpiredFailures(Date.now()); + prefetchDeepFilterAssets(); + if (!isDeepFilterRequested() || NoiseSuppressionAvailability.failures.get('deep_filter')?.active) return; + const warmup = warmDeepFilterNode(signal); + microphoneSessionWarmup = warmup; + void warmup.finally(() => { + if (microphoneSessionWarmup === warmup) microphoneSessionWarmup = null; + }); +} + +export function awaitMicrophoneSessionWarmup(): Promise { + return microphoneSessionWarmup ?? Promise.resolve(); +} diff --git a/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionAvailability.ts b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionAvailability.ts new file mode 100644 index 000000000..3a8a61385 --- /dev/null +++ b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionAvailability.ts @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +import { + getNoiseSuppressionBackendDescriptor, + type VoiceNoiseSuppressionBackend, +} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionBackends'; +import {makeAutoObservable} from 'mobx'; + +export type DeepFilterAssetState = 'idle' | 'loading' | 'ready'; + +export type NoiseSuppressionFailureReason = 'assets' | 'model_encoding' | 'build' | 'runtime' | 'sample_rate'; + +export type NoiseSuppressionFallback = 'loading' | 'failed'; + +export interface NoiseSuppressionFailure { + count: number; + retryAtMs: number; + reason: NoiseSuppressionFailureReason; + active: boolean; +} + +const FAILURE_BACKOFF_BASE_MS = 30_000; +const FAILURE_BACKOFF_MAX_MS = 15 * 60_000; + +class NoiseSuppressionAvailability { + deepFilterAssets: DeepFilterAssetState = 'idle'; + failures = new Map(); + inputContextRate: number | null = null; + voiceInputGraphUnavailable = false; + runningBackend: VoiceNoiseSuppressionBackend | null = null; + captureSettings: MediaTrackSettings | null = null; + deepFilterLevels: {inputRms: number; outputRms: number; contextTime: number} | null = null; + private runtimeOwner: object | null = null; + private runtimeContext: BaseAudioContext | null = null; + private listeners = new Set<() => void>(); + + constructor() { + makeAutoObservable( + this, + {listeners: false, notifyListeners: false, runtimeOwner: false, runtimeContext: false}, + {autoBind: true}, + ); + } + + subscribe(listener: () => void): () => void { + this.listeners.add(listener); + return () => { + this.listeners.delete(listener); + }; + } + + private notifyListeners(): void { + for (const listener of [...this.listeners]) { + listener(); + } + } + + isBackendUsable(backend: VoiceNoiseSuppressionBackend): boolean { + if (this.failures.get(backend)?.active) return false; + const descriptor = getNoiseSuppressionBackendDescriptor(backend); + if (descriptor.engine === 'worklet' || descriptor.engine === 'deep_filter') { + if (this.voiceInputGraphUnavailable) return false; + const rates = descriptor.supportedSampleRates; + if (this.inputContextRate !== null && rates !== null && !rates.includes(this.inputContextRate)) return false; + } + return backend !== 'deep_filter' || this.deepFilterAssets === 'ready'; + } + + resolveEffectiveBackend(requested: VoiceNoiseSuppressionBackend): VoiceNoiseSuppressionBackend { + return this.isBackendUsable(requested) ? requested : 'standard'; + } + + getFallback(requested: VoiceNoiseSuppressionBackend): NoiseSuppressionFallback | null { + if (this.failures.get(requested)?.active) return 'failed'; + if (requested === 'deep_filter' && this.deepFilterAssets !== 'ready') return 'loading'; + if (!this.isBackendUsable(requested)) return 'failed'; + return null; + } + + setVoiceInputRuntime( + owner: object, + backend: VoiceNoiseSuppressionBackend, + captureSettings: MediaTrackSettings, + context: BaseAudioContext | null, + ): void { + if (backend !== 'deep_filter' || this.runtimeContext !== context) this.deepFilterLevels = null; + this.runtimeOwner = owner; + this.runtimeContext = context; + this.runningBackend = backend; + this.captureSettings = captureSettings; + } + + clearVoiceInputRuntime(owner: object): void { + if (this.runtimeOwner !== owner) return; + this.runtimeOwner = null; + this.runtimeContext = null; + this.runningBackend = null; + this.captureSettings = null; + this.deepFilterLevels = null; + } + + setDeepFilterLevels(context: BaseAudioContext, inputRms: number, outputRms: number, contextTime: number): void { + if (this.runtimeContext !== context || this.runningBackend !== 'deep_filter') return; + this.deepFilterLevels = {inputRms, outputRms, contextTime}; + } + + setDeepFilterAssetState(state: DeepFilterAssetState): void { + if (this.deepFilterAssets === state) return; + this.deepFilterAssets = state; + this.notifyListeners(); + } + + setInputContextRate(rate: number): void { + if (this.inputContextRate === rate) return; + this.inputContextRate = rate; + this.notifyListeners(); + } + + setVoiceInputGraphUnavailable(unavailable: boolean): void { + if (this.voiceInputGraphUnavailable === unavailable) return; + this.voiceInputGraphUnavailable = unavailable; + this.notifyListeners(); + } + + markBackendFailed(backend: VoiceNoiseSuppressionBackend, reason: NoiseSuppressionFailureReason, nowMs: number): void { + const count = (this.failures.get(backend)?.count ?? 0) + 1; + const backoffMs = Math.min(FAILURE_BACKOFF_BASE_MS * 2 ** (count - 1), FAILURE_BACKOFF_MAX_MS); + this.failures.set(backend, {count, retryAtMs: nowMs + backoffMs, reason, active: true}); + this.notifyListeners(); + } + + clearBackendFailure(backend: VoiceNoiseSuppressionBackend): void { + if (!this.failures.delete(backend)) return; + this.notifyListeners(); + } + + releaseExpiredFailures(nowMs: number): void { + let changed = false; + for (const [backend, failure] of this.failures) { + if (!failure.active || failure.retryAtMs > nowMs) continue; + this.failures.set(backend, {...failure, active: false}); + changed = true; + } + if (changed) this.notifyListeners(); + } +} + +export default new NoiseSuppressionAvailability(); diff --git a/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionBackends.ts b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionBackends.ts index 4f3e4aa13..5524120b9 100644 --- a/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionBackends.ts +++ b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionBackends.ts @@ -84,8 +84,8 @@ const DESCRIPTORS: Readonly Promise; +export interface NoiseSuppressionWorkletNode { + node: AudioWorkletNode; + dispose: () => void; } interface WorkletSignal { @@ -29,22 +24,9 @@ interface WorkletSignal { message?: string; } -export interface NoiseSuppressionWorkletOptions { - audioContext: AudioContext; - backend: NoiseSuppressionWorkletBackend; - signal?: AbortSignal; - onRuntimeFailure?: (error: Error) => void; -} - -interface WorkletResources { - inputDestination: MediaStreamAudioDestinationNode; - feedTrack: MediaStreamTrack; - context: AudioContext; - node?: AudioWorkletNode; - source?: MediaStreamAudioSourceNode; - output?: MediaStreamAudioDestinationNode; - processedTrack?: MediaStreamTrack; - disposal?: Promise; +export interface NoiseSuppressionWorkletNodeOptions { + signal: AbortSignal; + onRuntimeFailure: (error: Error) => void; } function isWorkletSignal(value: unknown): value is WorkletSignal { @@ -102,50 +84,6 @@ function buildProcessorOptions( return {maxChannels: 1, wasmBinary}; } -function safeDisconnect(node: AudioNode | null | undefined): void { - if (!node) return; - try { - node.disconnect(); - } catch {} -} - -function safeStopTrack(track: MediaStreamTrack | null | undefined): void { - if (!track) return; - try { - track.stop(); - } catch {} -} - -export function resolveNoiseSuppressionWorkletContext( - backend: NoiseSuppressionWorkletBackend, - captureContext: AudioContext, - feedTrack: MediaStreamTrack, -): AudioContext | null { - const targetSampleRate = resolveNoiseSuppressionContextSampleRate(backend, captureContext.sampleRate); - if (targetSampleRate === captureContext.sampleRate) { - return createVoiceAudioContext({latencyHint: 'interactive', sampleRate: captureContext.sampleRate}); - } - const bridged = createVoiceAudioContext({latencyHint: 'interactive', sampleRate: targetSampleRate}); - if (!bridged) return null; - if (bridged.sampleRate !== targetSampleRate) { - void bridged.close().catch(() => undefined); - return null; - } - try { - bridged.createMediaStreamSource(new MediaStream([feedTrack])).disconnect(); - return bridged; - } catch (error) { - logger.info('Noise suppression cannot read the capture graph at the model rate', { - backend, - targetSampleRate, - captureSampleRate: captureContext.sampleRate, - error, - }); - } - void bridged.close().catch(() => undefined); - return null; -} - function awaitStartupStep(pending: Promise, signal: AbortSignal): Promise { return new Promise((resolve, reject) => { const onAbort = () => reject(signal.reason); @@ -202,77 +140,58 @@ function awaitWorkletReady( }); } -function createWorkletResources(audioContext: AudioContext, backend: NoiseSuppressionWorkletBackend): WorkletResources { - const inputDestination = audioContext.createMediaStreamDestination(); - inputDestination.channelCount = 1; - inputDestination.channelCountMode = 'explicit'; - inputDestination.channelInterpretation = 'speakers'; - const feedTrack = inputDestination.stream.getAudioTracks()[0]; - if (!feedTrack) { - safeDisconnect(inputDestination); - throw new Error('buildNoiseSuppressionWorkletChain: missing capture feed track'); - } - const workletContext = resolveNoiseSuppressionWorkletContext(backend, audioContext, feedTrack); - if (!workletContext) { - safeDisconnect(inputDestination); - safeStopTrack(feedTrack); - throw new Error(`buildNoiseSuppressionWorkletChain: no usable audio context for "${backend}"`); - } - return {inputDestination, feedTrack, context: workletContext}; -} +const workletModules = new WeakMap>>(); -async function releaseWorkletResources(resources: WorkletResources): Promise { - const {node, source, output, inputDestination, feedTrack, processedTrack, context} = resources; - if (node) { - node.port.onmessage = null; - node.onprocessorerror = null; - try { - node.port.postMessage('destroy'); - node.port.close(); - } catch (error) { - logger.debug('Failed to close noise suppression worklet port', error); - } - } - safeDisconnect(node); - safeDisconnect(source); - safeDisconnect(output); - safeDisconnect(inputDestination); - safeStopTrack(processedTrack); - safeStopTrack(feedTrack); - try { - await context.close(); - } catch (error) { - logger.debug('Failed to close noise suppression audio context', error); - } -} - -function disposeWorkletResources(resources: WorkletResources): Promise { - resources.disposal ??= releaseWorkletResources(resources); - return resources.disposal; -} - -async function installWorklet( - resources: WorkletResources, - options: NoiseSuppressionWorkletOptions, - signal: AbortSignal, +function addWorkletModule( + context: BaseAudioContext, + backend: NoiseSuppressionWorkletBackend, + url: string, ): Promise { - const {backend} = options; + const modules = workletModules.get(context) ?? new Map>(); + workletModules.set(context, modules); + let pending = modules.get(backend); + if (!pending) { + pending = context.audioWorklet.addModule(url); + modules.set(backend, pending); + const added = pending; + added.catch(() => { + if (modules.get(backend) === added) modules.delete(backend); + }); + } + return pending; +} + +function closeWorkletNode(node: AudioWorkletNode): void { + node.port.onmessage = null; + node.onprocessorerror = null; + try { + node.port.postMessage('destroy'); + node.port.close(); + } catch (error) { + logger.debug('Failed to close noise suppression worklet port', error); + } + node.disconnect(); +} + +async function startWorkletNode( + context: AudioContext, + backend: NoiseSuppressionWorkletBackend, + signal: AbortSignal, +): Promise { const assets = await awaitStartupStep( import('@app/features/voice/utils/noise_suppression/NoiseSuppressionWorkletAssets'), signal, ); - signal.throwIfAborted(); const wasmUrl = resolveWasmUrl(assets, backend); const [, wasmBinary] = await awaitStartupStep( Promise.all([ - resources.context.audioWorklet.addModule(assets.NOISE_SUPPRESSION_WORKLET_MODULE_URLS[backend]), + addWorkletModule(context, backend, assets.NOISE_SUPPRESSION_WORKLET_MODULE_URLS[backend]), wasmUrl === null ? Promise.resolve(null) : fetchWasmBinary(wasmUrl, signal), ]), signal, ); signal.throwIfAborted(); - resources.source = resources.context.createMediaStreamSource(new MediaStream([resources.feedTrack])); - const node = new AudioWorkletNode(resources.context, NOISE_SUPPRESSION_WORKLET_PROCESSOR_NAMES[backend], { + const node = new AudioWorkletNode(context, NOISE_SUPPRESSION_WORKLET_PROCESSOR_NAMES[backend], { numberOfInputs: 1, numberOfOutputs: 1, outputChannelCount: [1], @@ -281,25 +200,38 @@ async function installWorklet( channelInterpretation: 'speakers', processorOptions: buildProcessorOptions(backend, wasmBinary), }); - resources.node = node; - await awaitWorkletReady(node, backend, signal); - signal.throwIfAborted(); - const output = resources.context.createMediaStreamDestination(); - resources.output = output; - resources.processedTrack = output.stream.getAudioTracks()[0]; - if (!resources.processedTrack) { - throw new Error('buildNoiseSuppressionWorkletChain: missing processed output track'); + try { + await awaitWorkletReady(node, backend, signal); + } catch (error) { + closeWorkletNode(node); + throw error; } - output.channelCount = 1; - output.channelCountMode = 'explicit'; - output.channelInterpretation = 'speakers'; - resources.source.connect(node); - node.connect(output); - let failed = false; + return node; +} + +export async function createNoiseSuppressionWorkletNode( + context: AudioContext, + backend: NoiseSuppressionWorkletBackend, + options: NoiseSuppressionWorkletNodeOptions, +): Promise { + options.signal.throwIfAborted(); + const controller = new AbortController(); + const onAbort = () => controller.abort(options.signal.reason); + options.signal.addEventListener('abort', onAbort, {once: true}); + const timeoutId = window.setTimeout(() => { + controller.abort(new Error(`Noise suppression worklet "${backend}" startup timed out`)); + }, NOISE_SUPPRESSION_STARTUP_TIMEOUT_MS); + let node: AudioWorkletNode; + try { + node = await startWorkletNode(context, backend, controller.signal); + } finally { + window.clearTimeout(timeoutId); + options.signal.removeEventListener('abort', onAbort); + } + let disposed = false; const reportFailure = (error: Error) => { - if (failed || resources.disposal) return; - failed = true; - options.onRuntimeFailure?.(error); + if (disposed) return; + options.onRuntimeFailure(error); }; node.port.onmessage = (event: MessageEvent) => { if (!isWorkletSignal(event.data) || event.data.type !== 'error') return; @@ -307,38 +239,12 @@ async function installWorklet( }; node.onprocessorerror = () => reportFailure(new Error(`Noise suppression worklet "${backend}" raised a processor error`)); -} - -export async function buildNoiseSuppressionWorkletChain( - options: NoiseSuppressionWorkletOptions, -): Promise { - options.signal?.throwIfAborted(); - const controller = new AbortController(); - const onAbort = () => controller.abort(options.signal?.reason); - options.signal?.addEventListener('abort', onAbort, {once: true}); - const timeoutId = window.setTimeout(() => { - controller.abort(new Error(`Noise suppression worklet "${options.backend}" startup timed out`)); - }, NOISE_SUPPRESSION_STARTUP_TIMEOUT_MS); - let resources: WorkletResources | undefined; - try { - resources = createWorkletResources(options.audioContext, options.backend); - await installWorklet(resources, options, controller.signal); - const {inputDestination, processedTrack} = resources; - if (!processedTrack) { - throw new Error('buildNoiseSuppressionWorkletChain: missing processed output track'); - } - const readyResources = resources; - return { - inputDestination, - processedTrack, - dispose: () => disposeWorkletResources(readyResources), - }; - } catch (error) { - controller.abort(error); - if (resources) void disposeWorkletResources(resources); - throw error; - } finally { - window.clearTimeout(timeoutId); - options.signal?.removeEventListener('abort', onAbort); - } + return { + node, + dispose: () => { + if (disposed) return; + disposed = true; + closeWorkletNode(node); + }, + }; } diff --git a/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionChoices.ts b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionChoices.ts index a0b3f1a8f..939e5a8f4 100644 --- a/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionChoices.ts +++ b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionChoices.ts @@ -2,6 +2,8 @@ import * as VoiceSettingsCommands from '@app/features/voice/commands/VoiceSettingsCommands'; import VoiceSettings from '@app/features/voice/state/VoiceSettings'; +import {prefetchDeepFilterAssets} from '@app/features/voice/utils/noise_suppression/DeepFilter'; +import NoiseSuppressionAvailability from '@app/features/voice/utils/noise_suppression/NoiseSuppressionAvailability'; import { isNoiseSuppressionBackendSupported, VOICE_NOISE_SUPPRESSION_BACKENDS, @@ -26,7 +28,9 @@ export function getSelectedNoiseSuppressionChoice(): VoiceNoiseSuppressionBacken } export function setNoiseSuppressionChoice(backend: VoiceNoiseSuppressionBackend): void { + NoiseSuppressionAvailability.clearBackendFailure(backend); VoiceSettingsCommands.update({noiseSuppressionBackend: backend}); + prefetchDeepFilterAssets(); } export function isStereoMicrophoneChoiceAvailable(deviceLabel: string | null): boolean { diff --git a/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts index aec27296a..b300fe02b 100644 --- a/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts +++ b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionLabels.ts @@ -1,6 +1,11 @@ // SPDX-License-Identifier: AGPL-3.0-or-later +import NoiseSuppressionAvailability from '@app/features/voice/utils/noise_suppression/NoiseSuppressionAvailability'; import type {VoiceNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionBackends'; +import { + readEffectiveNoiseSuppressionBackend, + readRequestedNoiseSuppressionBackend, +} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionRuntime'; import type {I18n, MessageDescriptor} from '@lingui/core'; import {msg} from '@lingui/core/macro'; @@ -87,4 +92,15 @@ export function getNoiseSuppressionChoiceDescriptionDescriptor( return DESCRIPTIONS[backend]; } +export function getNoiseSuppressionFallbackMessage(i18n: I18n): string | null { + const requested = readRequestedNoiseSuppressionBackend(); + const fallback = NoiseSuppressionAvailability.getFallback(requested); + if (!fallback) return null; + const requestedLabel = getNoiseSuppressionChoiceLabel(i18n, requested); + const effectiveLabel = getNoiseSuppressionChoiceLabel(i18n, readEffectiveNoiseSuppressionBackend()); + return fallback === 'loading' + ? i18n._(msg`Using ${effectiveLabel} until ${requestedLabel} is ready.`) + : i18n._(msg`${requestedLabel} could not start. Using ${effectiveLabel} instead.`); +} + export {STEREO_MICROPHONE_DESCRIPTION_DESCRIPTOR, STEREO_MICROPHONE_DESCRIPTOR}; diff --git a/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionRuntime.ts b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionRuntime.ts index 49406321a..7640c29b2 100644 --- a/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionRuntime.ts +++ b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionRuntime.ts @@ -1,9 +1,56 @@ // SPDX-License-Identifier: AGPL-3.0-or-later import VoiceSettings from '@app/features/voice/state/VoiceSettings'; +import NoiseSuppressionAvailability from '@app/features/voice/utils/noise_suppression/NoiseSuppressionAvailability'; import type {VoiceNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionBackends'; import {resolveNoiseSuppressionBackend} from '@app/features/voice/utils/noise_suppression/NoiseSuppressionSelection'; +import { + getActiveInputDeviceLabel, + getActiveVoiceProcessingMode, + resolveVoiceProcessingFromStateForDeviceLabel, +} from '@app/features/voice/utils/VoiceProcessingProfile'; export function readNoiseSuppressionBackend(): VoiceNoiseSuppressionBackend { return resolveNoiseSuppressionBackend(VoiceSettings.getNoiseSuppressionBackend()); } + +export function readRequestedNoiseSuppressionBackend(): VoiceNoiseSuppressionBackend { + const mode = getActiveVoiceProcessingMode(VoiceSettings); + if (mode === 'studio') return 'none'; + return resolveNoiseSuppressionBackend(mode === 'voice' ? null : VoiceSettings.getNoiseSuppressionBackend()); +} + +export function readEffectiveNoiseSuppressionBackend(): VoiceNoiseSuppressionBackend { + return ( + NoiseSuppressionAvailability.runningBackend ?? + resolveVoiceProcessingFromStateForDeviceLabel(VoiceSettings, getActiveInputDeviceLabel(VoiceSettings)) + .noiseSuppressionBackend + ); +} + +export function readVoiceInputDiagnostics() { + const profile = resolveVoiceProcessingFromStateForDeviceLabel( + VoiceSettings, + getActiveInputDeviceLabel(VoiceSettings), + ); + const capture = NoiseSuppressionAvailability.captureSettings; + return { + echoCancellation: + capture?.echoCancellation === undefined ? profile.echoCancellation : Boolean(capture.echoCancellation), + browserNoiseSuppression: capture?.noiseSuppression ?? profile.browserNoiseSuppression, + autoGainControl: capture?.autoGainControl ?? profile.autoGainControl, + noiseSuppressionBackend: readEffectiveNoiseSuppressionBackend(), + requestedNoiseSuppressionBackend: readRequestedNoiseSuppressionBackend(), + processingMode: profile.mode, + voiceInputGraphUnavailable: NoiseSuppressionAvailability.voiceInputGraphUnavailable, + deepFilterLevels: NoiseSuppressionAvailability.deepFilterLevels, + }; +} + +export function readCaptureNoiseSuppressionBackend(track: MediaStreamTrack): 'standard' | 'none' { + const actual = track.getSettings().noiseSuppression; + if (actual !== undefined) return actual ? 'standard' : 'none'; + const constraint = track.getConstraints().noiseSuppression; + const enabled = typeof constraint === 'object' ? (constraint.exact ?? constraint.ideal) : constraint; + return enabled === true ? 'standard' : 'none'; +} diff --git a/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionWorkletAssets.ts b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionWorkletAssets.ts index e338b05f9..594c9d911 100644 --- a/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionWorkletAssets.ts +++ b/fluxer_app/src/features/voice/utils/noise_suppression/NoiseSuppressionWorkletAssets.ts @@ -23,3 +23,7 @@ export const NOISE_SUPPRESSION_WASM_URLS = { rnnoiseSimd: rnnoiseSimdWasmUrl, speex: speexWasmUrl, } as const; + +export const DEEP_FILTER_WORKLET_URL = new URL('./deepFilterProcessor.worklet.js', import.meta.url).href; + +export const VOICE_GATE_WORKLET_URL = new URL('../voiceGateProcessor.worklet.js', import.meta.url).href; diff --git a/fluxer_app/src/features/voice/utils/noise_suppression/deepFilterProcessor.worklet.js b/fluxer_app/src/features/voice/utils/noise_suppression/deepFilterProcessor.worklet.js new file mode 100644 index 000000000..90adc8fef --- /dev/null +++ b/fluxer_app/src/features/voice/utils/noise_suppression/deepFilterProcessor.worklet.js @@ -0,0 +1,350 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +const PROCESSOR_NAME = 'fluxer-deep-filter'; +const RENDER_QUANTUM = 128; +const WARM_UP_FRAMES = 8; +const HEALTH_REPORT_FRAMES = 50; +const MAX_NON_FINITE_FRAMES = 3; + +class Utf8Decoder { + decode(bytes) { + if (!bytes) return ''; + let out = ''; + for (let i = 0; i < bytes.length; ) { + const c = bytes[i++]; + if (c < 0x80) out += String.fromCharCode(c); + else if (c < 0xe0) out += String.fromCharCode(((c & 0x1f) << 6) | (bytes[i++] & 0x3f)); + else if (c < 0xf0) + out += String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i++] & 0x3f) << 6) | (bytes[i++] & 0x3f)); + else { + const cp = + (((c & 0x07) << 18) | ((bytes[i++] & 0x3f) << 12) | ((bytes[i++] & 0x3f) << 6) | (bytes[i++] & 0x3f)) - + 0x10000; + out += String.fromCharCode(0xd800 + (cp >> 10), 0xdc00 + (cp & 0x3ff)); + } + } + return out; + } +} + +function createDeepFilterBindings(module) { + let wasm = null; + let float32Memory = null; + let uint8Memory = null; + let vectorLength = 0; + const decoder = typeof TextDecoder === 'undefined' ? new Utf8Decoder() : new TextDecoder('utf-8'); + const frameOutputs = new Map(); + + const getFloat32Memory = () => { + if (float32Memory === null || float32Memory.byteLength === 0) float32Memory = new Float32Array(wasm.memory.buffer); + return float32Memory; + }; + const getUint8Memory = () => { + if (uint8Memory === null || uint8Memory.byteLength === 0) uint8Memory = new Uint8Array(wasm.memory.buffer); + return uint8Memory; + }; + const getFloat32Slice = (ptr, len) => { + const start = (ptr >>> 0) / 4; + return getFloat32Memory().subarray(start, start + len); + }; + const getUint8Slice = (ptr, len) => { + const start = ptr >>> 0; + return getUint8Memory().subarray(start, start + len); + }; + const passUint8Array = (array) => { + const ptr = wasm.__wbindgen_malloc_command_export(array.length, 1) >>> 0; + getUint8Memory().set(array, ptr); + vectorLength = array.length; + return ptr; + }; + const passFloat32Array = (array) => { + const ptr = wasm.__wbindgen_malloc_command_export(array.length * 4, 4) >>> 0; + getFloat32Memory().set(array, ptr / 4); + vectorLength = array.length; + return ptr; + }; + const storeException = (error) => { + const index = wasm.__externref_table_alloc_command_export(); + wasm.__wbindgen_externrefs.set(index, error); + wasm.__wbindgen_exn_store_command_export(index); + }; + + const imports = { + './df_bg.js': { + __wbg___wbindgen_throw_344f42d3211c4765(ptr, len) { + throw new Error(decoder.decode(getUint8Slice(ptr, len))); + }, + __wbg_getRandomValues_cc7f052a444bb2ce(ptr, len) { + try { + globalThis.crypto.getRandomValues(getUint8Slice(ptr, len)); + } catch (error) { + storeException(error); + } + }, + __wbg_new_from_slice_ddf8b82c4d6af38e(ptr, len) { + let output = frameOutputs.get(len); + if (!output) { + output = new Float32Array(len); + frameOutputs.set(len, output); + } + output.set(getFloat32Slice(ptr, len)); + return output; + }, + __wbindgen_init_externref_table() { + const table = wasm.__wbindgen_externrefs; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + }, + }, + }; + + const instance = new WebAssembly.Instance(module, imports); + wasm = instance.exports; + wasm.__wbindgen_start(); + + return { + create(modelBytes, attenLimDb) { + const ptr = passUint8Array(modelBytes); + return wasm.df_create(ptr, vectorLength, attenLimDb) >>> 0; + }, + frameLength(handle) { + return wasm.df_get_frame_length(handle) >>> 0; + }, + processFrame(handle, input) { + const ptr = passFloat32Array(input); + return wasm.df_process_frame(handle, ptr, vectorLength); + }, + free(handle) { + wasm.__wbg_dfstate_free(handle, 1); + }, + }; +} + +function createHighPass(cutoffHz, rate) { + if (!(cutoffHz > 0)) return null; + const omega = (2 * Math.PI * cutoffHz) / rate; + const alpha = Math.sin(omega) / (2 * Math.SQRT1_2); + const cos = Math.cos(omega); + const a0 = 1 + alpha; + return { + b0: (1 + cos) / 2 / a0, + b1: -(1 + cos) / a0, + b2: (1 + cos) / 2 / a0, + a1: (-2 * cos) / a0, + a2: (1 - alpha) / a0, + x1: 0, + x2: 0, + y1: 0, + y2: 0, + }; +} + +class DeepFilterProcessor extends AudioWorkletProcessor { + constructor(options) { + super(); + const config = options.processorOptions; + this.inputGain = config.inputGain; + this.outputGain = config.outputGain; + this.highPassHz = config.highPassHz; + this.highPass = createHighPass(this.highPassHz, sampleRate); + this.bindings = null; + this.handle = 0; + this.frameLength = 0; + this.running = false; + this.disposed = false; + this.primed = false; + this.nonFiniteFrames = 0; + this.healthFrames = 0; + this.healthInputEnergy = 0; + this.healthOutputEnergy = 0; + this.healthSamples = 0; + this.healthNonFinite = false; + this.processedFrames = 0; + this.silence = new Float32Array(RENDER_QUANTUM); + this.port.onmessage = (event) => this.handleMessage(event.data); + try { + this.bindings = createDeepFilterBindings(config.wasmModule); + this.handle = this.bindings.create(new Uint8Array(config.modelBytes), config.attenLimDb); + this.frameLength = this.bindings.frameLength(this.handle); + this.ringSize = this.frameLength * 4; + this.inputRing = new Float32Array(this.ringSize); + this.outputRing = new Float32Array(this.ringSize); + this.frame = new Float32Array(this.frameLength); + for (let i = 0; i < WARM_UP_FRAMES; i++) this.bindings.processFrame(this.handle, this.frame); + this.resetRings(); + this.running = true; + this.port.postMessage({type: 'ready', frameLength: this.frameLength}); + } catch (error) { + this.port.postMessage({type: 'error', message: String(error?.message ?? error)}); + } + } + + resetRings() { + this.inputRing.fill(0); + this.outputRing.fill(0); + this.inputWrite = 0; + this.inputRead = 0; + this.outputWrite = 0; + this.outputRead = 0; + this.primed = false; + if (this.highPass) { + this.highPass.x1 = 0; + this.highPass.x2 = 0; + this.highPass.y1 = 0; + this.highPass.y2 = 0; + } + } + + handleMessage(message) { + if (!message || typeof message !== 'object') return; + if (message.type === 'flush' && this.running) { + this.resetRings(); + return; + } + if (message.type === 'dispose') this.dispose(); + } + + dispose() { + if (this.disposed) return; + this.disposed = true; + this.running = false; + if (this.bindings && this.handle) { + try { + this.bindings.free(this.handle); + } catch {} + } + this.bindings = null; + this.handle = 0; + } + + fail(message) { + this.running = false; + this.port.postMessage({type: 'error', message}); + } + + available(write, read) { + return (write - read + this.ringSize) % this.ringSize; + } + + writeInput(input) { + const highPass = this.highPass; + const gain = this.inputGain; + for (let i = 0; i < input.length; i++) { + let sample = input[i]; + if (!Number.isFinite(sample)) { + sample = 0; + this.healthNonFinite = true; + } + this.healthInputEnergy += sample * sample; + if (highPass) { + const filtered = + highPass.b0 * sample + + highPass.b1 * highPass.x1 + + highPass.b2 * highPass.x2 - + highPass.a1 * highPass.y1 - + highPass.a2 * highPass.y2; + highPass.x2 = highPass.x1; + highPass.x1 = sample; + highPass.y2 = highPass.y1; + highPass.y1 = filtered; + sample = filtered; + } + this.inputRing[this.inputWrite] = sample * gain; + this.inputWrite = (this.inputWrite + 1) % this.ringSize; + } + this.healthSamples += input.length; + } + + processFrames() { + const frameLength = this.frameLength; + while (this.available(this.inputWrite, this.inputRead) >= frameLength) { + for (let i = 0; i < frameLength; i++) { + this.frame[i] = this.inputRing[this.inputRead]; + this.inputRead = (this.inputRead + 1) % this.ringSize; + } + const processed = this.bindings.processFrame(this.handle, this.frame); + let finite = true; + for (let i = 0; i < processed.length; i++) { + if (!Number.isFinite(processed[i])) { + finite = false; + break; + } + } + if (finite) { + this.nonFiniteFrames = 0; + } else { + this.nonFiniteFrames++; + this.healthNonFinite = true; + if (this.nonFiniteFrames >= MAX_NON_FINITE_FRAMES) { + this.fail('DeepFilterNet produced non-finite output'); + return; + } + } + for (let i = 0; i < processed.length; i++) { + const sample = finite ? processed[i] * this.outputGain : 0; + this.healthOutputEnergy += sample * sample; + this.outputRing[this.outputWrite] = sample; + this.outputWrite = (this.outputWrite + 1) % this.ringSize; + } + this.processedFrames++; + this.healthFrames++; + if (this.healthFrames >= HEALTH_REPORT_FRAMES) this.reportHealth(); + } + } + + reportHealth() { + const samples = Math.max(1, this.healthSamples); + this.port.postMessage({ + type: 'health', + inputRms: Math.sqrt(this.healthInputEnergy / samples), + outputRms: Math.sqrt(this.healthOutputEnergy / samples), + nonFinite: this.healthNonFinite, + frame: this.processedFrames, + contextTime: currentTime, + }); + this.healthFrames = 0; + this.healthInputEnergy = 0; + this.healthOutputEnergy = 0; + this.healthSamples = 0; + this.healthNonFinite = false; + } + + process(inputs, outputs) { + if (this.disposed) return false; + const input = inputs[0]?.[0] ?? this.silence; + const output = outputs[0]?.[0]; + if (!output) return true; + if (!this.running) { + output.set(input); + return true; + } + try { + this.writeInput(input); + this.processFrames(); + } catch (error) { + this.fail(String(error?.message ?? error)); + output.set(input); + return true; + } + if (!this.running) { + output.set(input); + return true; + } + if (this.available(this.outputWrite, this.outputRead) < RENDER_QUANTUM) return true; + for (let i = 0; i < RENDER_QUANTUM; i++) { + output[i] = this.outputRing[this.outputRead]; + this.outputRead = (this.outputRead + 1) % this.ringSize; + } + if (!this.primed) { + this.primed = true; + this.port.postMessage({type: 'primed'}); + } + return true; + } +} + +registerProcessor(PROCESSOR_NAME, DeepFilterProcessor); diff --git a/fluxer_static/libs/deepfilternet3/v2/models/DeepFilterNet3_onnx.tar.gz b/fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/DeepFilterNet3_onnx.tar.gz similarity index 100% rename from fluxer_static/libs/deepfilternet3/v2/models/DeepFilterNet3_onnx.tar.gz rename to fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/DeepFilterNet3_onnx.tar.gz diff --git a/fluxer_static/libs/deepfilternet3/LICENSE-APACHE b/fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/LICENSE-APACHE similarity index 100% rename from fluxer_static/libs/deepfilternet3/LICENSE-APACHE rename to fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/LICENSE-APACHE diff --git a/fluxer_static/libs/deepfilternet3/LICENSE-MIT b/fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/LICENSE-MIT similarity index 100% rename from fluxer_static/libs/deepfilternet3/LICENSE-MIT rename to fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/LICENSE-MIT diff --git a/fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/NOTICE.md b/fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/NOTICE.md new file mode 100644 index 000000000..cbd73361c --- /dev/null +++ b/fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/NOTICE.md @@ -0,0 +1,16 @@ +# DeepFilterNet3 licenses + +The files in this directory are third-party DeepFilterNet3 WASM/model assets, +including derived Mezon noise suppression distribution artifacts. The app build +emits them as content-hashed assets. + +They are distributed under MIT or Apache-2.0 terms. The copied license texts are +available in `LICENSE-MIT` and `LICENSE-APACHE`. + +| File | Source | Changes | +| --- | --- | --- | +| `df_bg.wasm` | libDF WASM build shipped by `deepfilternet3-noise-filter` 1.3.0 | One constant changed: `max_db_df_thresh` 20 to 30. SHA-256 `c42dcfa05c64ff21d23fe3e3a35e934323e4fd85c303b6a9f8a21bed05f7fb74`. | +| `DeepFilterNet3_onnx.tar.gz` | DeepFilterNet3 ONNX model | Unmodified. SHA-256 `c94d91f70911001c946e0fabb4aa9adc37045f45a03b56008cb0c8244cb63616`. | +| `../deepFilterProcessor.worklet.js` | AudioWorklet processor and wasm-bindgen 0.2.126 glue from `deepfilternet3-noise-filter` 1.3.0 | Rewritten around the same bindings: mono input, input sanitising, high-pass filter, ready, error and health messages. | + +No Fluxer license notice grants rights to third-party trademarks or brand names. diff --git a/fluxer_static/libs/deepfilternet3/v3/pkg/df_bg.wasm b/fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/df_bg.wasm similarity index 99% rename from fluxer_static/libs/deepfilternet3/v3/pkg/df_bg.wasm rename to fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/df_bg.wasm index 2b7782bfc..f06421612 100644 Binary files a/fluxer_static/libs/deepfilternet3/v3/pkg/df_bg.wasm and b/fluxer_app/src/features/voice/utils/noise_suppression/deepfilternet3/df_bg.wasm differ diff --git a/fluxer_app/src/features/voice/utils/voiceGateProcessor.worklet.js b/fluxer_app/src/features/voice/utils/voiceGateProcessor.worklet.js new file mode 100644 index 000000000..8affe2133 --- /dev/null +++ b/fluxer_app/src/features/voice/utils/voiceGateProcessor.worklet.js @@ -0,0 +1,150 @@ +const FLOOR_PERCENTILE = 0.1; +const FLOOR_BIAS = 1.5; +const FLOOR_WINDOW_SECONDS = 2; +const SEED_SECONDS = 0.3; +const LOOKAHEAD_SECONDS = 0.01; +const ATTACK_SECONDS = 0.005; +const RELEASE_SECONDS = 0.02; + +class VoiceGateProcessor extends AudioWorkletProcessor { + constructor(options) { + super(); + const config = options.processorOptions; + this.apply = config.apply; + this.auto = config.auto; + this.manualThresholdRms = config.manualThresholdRms; + this.minRms = config.minRms; + this.maxRms = config.maxRms; + this.releaseFrames = Math.round((config.releaseMs / 1000) * sampleRate); + this.channelCount = config.channelCount; + this.delayFrames = this.channelCount === 1 ? Math.round(LOOKAHEAD_SECONDS * sampleRate) : 0; + this.delay = new Float32Array(this.delayFrames); + this.delayIndex = 0; + this.energy = new Float64Array(4); + this.energyIndex = 0; + this.energyCount = 0; + this.energySum = 0; + this.histogram = new Uint16Array(240); + this.floorBins = new Uint8Array(Math.ceil((FLOOR_WINDOW_SECONDS * sampleRate) / 128)); + this.floorIndex = 0; + this.floorCount = 0; + this.silenceFrames = 0; + this.frame = 0; + this.seedUntilFrame = SEED_SECONDS * sampleRate; + this.reportFrame = 0; + this.gain = this.auto || !this.apply ? 1 : 0; + this.attackStep = 1 / (ATTACK_SECONDS * sampleRate); + this.releaseFactor = Math.exp(-1 / (RELEASE_SECONDS * sampleRate)); + this.speaking = false; + this.nonFinite = false; + this.disposed = false; + this.port.onmessage = ({data}) => { + if (data.type === 'dispose') this.disposed = true; + if (data.type === 'reset') this.resetFloor(); + if (data.type !== 'config') return; + this.apply = data.apply; + this.auto = data.auto; + this.manualThresholdRms = data.manualThresholdRms; + }; + } + + resetFloor() { + this.energy.fill(0); + this.energySum = 0; + this.energyCount = 0; + this.histogram.fill(0); + this.floorCount = 0; + this.seedUntilFrame = this.frame + SEED_SECONDS * sampleRate; + if (this.auto) { + this.speaking = false; + this.silenceFrames = 0; + this.gain = 1; + } + } + + trackFloor(rms) { + const bin = Math.min(239, Math.max(0, Math.floor((20 * Math.log10(Math.max(1e-6, rms)) + 120) * 2))); + if (this.floorCount === this.floorBins.length) this.histogram[this.floorBins[this.floorIndex]]--; + else this.floorCount++; + this.floorBins[this.floorIndex] = bin; + this.floorIndex = (this.floorIndex + 1) % this.floorBins.length; + this.histogram[bin]++; + const target = Math.ceil(this.floorCount * FLOOR_PERCENTILE); + let count = 0; + let floorBin = 0; + while (floorBin < 239) { + count += this.histogram[floorBin]; + if (count >= target) break; + floorBin++; + } + return Math.min(this.maxRms, Math.max(this.minRms / 3, 10 ** ((floorBin / 2 - 120) / 20) * FLOOR_BIAS)); + } + + process(inputs, outputs) { + if (this.disposed) return false; + const input = inputs[0]; + const output = outputs[0]; + const length = output[0]?.length ?? 128; + let energy = 0; + for (let channel = 0; channel < output.length; channel++) { + const source = input[channel]; + for (let index = 0; index < length; index++) { + const sample = source?.[index] ?? 0; + if (Number.isFinite(sample)) energy += sample * sample; + else this.nonFinite = true; + } + } + energy /= Math.max(1, output.length * length); + this.energySum += energy - this.energy[this.energyIndex]; + this.energy[this.energyIndex] = energy; + this.energyIndex = (this.energyIndex + 1) % this.energy.length; + this.energyCount = Math.min(this.energy.length, this.energyCount + 1); + const rms = Math.sqrt(Math.max(0, this.energySum / this.energyCount)); + const floorRms = this.trackFloor(rms); + const thresholdRms = this.auto + ? Math.min(this.maxRms, Math.max(this.minRms, floorRms * 3)) + : this.manualThresholdRms; + const wasSpeaking = this.speaking; + if (this.auto && this.frame < this.seedUntilFrame) { + this.speaking = false; + this.silenceFrames = 0; + } else if (Math.sqrt(energy) >= thresholdRms) { + this.speaking = true; + this.silenceFrames = 0; + } else if (rms < thresholdRms * 0.7) { + this.silenceFrames += length; + if (this.silenceFrames >= this.releaseFrames) this.speaking = false; + } else this.silenceFrames = 0; + const open = !this.apply || this.speaking || (this.auto && this.frame < this.seedUntilFrame); + for (let index = 0; index < length; index++) { + this.gain = open ? Math.min(1, this.gain + this.attackStep) : this.gain * this.releaseFactor; + for (let channel = 0; channel < output.length; channel++) { + const value = input[channel]?.[index] ?? 0; + const sample = Number.isFinite(value) ? value : 0; + if (this.delayFrames > 0) { + output[channel][index] = this.delay[this.delayIndex] * this.gain; + this.delay[this.delayIndex] = sample; + } else output[channel][index] = sample * this.gain; + } + if (this.delayFrames > 0) this.delayIndex = (this.delayIndex + 1) % this.delayFrames; + } + this.frame += length; + if (wasSpeaking !== this.speaking || this.frame >= this.reportFrame) { + this.port.postMessage({ + type: 'level', + rms, + floorRms, + thresholdRms, + speaking: this.speaking, + nonFinite: this.nonFinite, + frame: this.frame, + contextTime: currentTime, + }); + this.reportFrame = this.frame + sampleRate / 15; + this.nonFinite = false; + } + return true; + } +} + +registerProcessor('fluxer-voice-gate', VoiceGateProcessor); diff --git a/fluxer_static/Dockerfile b/fluxer_static/Dockerfile index 2860d3b77..a979d4707 100644 --- a/fluxer_static/Dockerfile +++ b/fluxer_static/Dockerfile @@ -25,7 +25,6 @@ COPY --chown=65532:65532 fluxer_static/badges /srv/fluxer-static/badges COPY --chown=65532:65532 fluxer_static/desktop /srv/fluxer-static/desktop COPY --chown=65532:65532 fluxer_static/embeds /srv/fluxer-static/embeds COPY --chown=65532:65532 fluxer_static/emoji /srv/fluxer-static/emoji -COPY --chown=65532:65532 fluxer_static/libs /srv/fluxer-static/libs COPY --chown=65532:65532 fluxer_static/web /srv/fluxer-static/web RUN setcap -r /usr/bin/caddy \ diff --git a/fluxer_static/THIRD_PARTY_LICENSES.md b/fluxer_static/THIRD_PARTY_LICENSES.md index 6c508247f..ce0c05764 100644 --- a/fluxer_static/THIRD_PARTY_LICENSES.md +++ b/fluxer_static/THIRD_PARTY_LICENSES.md @@ -9,7 +9,6 @@ licenses and attribution requirements. | `desktop/spellcheck/dictionaries/` | Hunspell dictionaries packaged as exact `dictionary-*` npm package versions | Varies by language; each dictionary directory includes its own `LICENSE`, and the package summary is in `desktop/spellcheck/dictionaries/NOTICE.md`. | | `emoji/` | Twemoji graphics from `jdecked/twemoji` | CC-BY-4.0; see `emoji/LICENSE` and `emoji/NOTICE.md`. | | `marketing/flags/` | Twemoji flag graphics from `jdecked/twemoji` | CC-BY-4.0; see `marketing/flags/LICENSE` and `marketing/flags/NOTICE.md`. | -| `libs/deepfilternet3/` | DeepFilterNet3 WASM/model assets | MIT or Apache-2.0; see the license files and `libs/deepfilternet3/NOTICE.md`. | | `embeds/icons/hn.webp` | Hacker News brand icon | Third-party brand asset; see `embeds/icons/NOTICE.md`. | Noise suppression WebAssembly binaries and AudioWorklet processors are bundled diff --git a/fluxer_static/libs/NOTICE.md b/fluxer_static/libs/NOTICE.md deleted file mode 100644 index 2e4cb98df..000000000 --- a/fluxer_static/libs/NOTICE.md +++ /dev/null @@ -1,4 +0,0 @@ -# Library asset notices - -The assets in this directory are third-party library runtime assets and models. -See each library subdirectory for its copied license text and notice file. diff --git a/fluxer_static/libs/deepfilternet3/NOTICE.md b/fluxer_static/libs/deepfilternet3/NOTICE.md deleted file mode 100644 index 8cc07d7fa..000000000 --- a/fluxer_static/libs/deepfilternet3/NOTICE.md +++ /dev/null @@ -1,7 +0,0 @@ -# DeepFilterNet3 licenses - -The assets in this directory are third-party DeepFilterNet3 WASM/model assets, -including derived Mezon noise suppression distribution artifacts. - -They are distributed under MIT or Apache-2.0 terms. The copied license texts are -available in `LICENSE-MIT` and `LICENSE-APACHE`. diff --git a/fluxer_static/libs/deepfilternet3/v2/pkg/df_bg.wasm b/fluxer_static/libs/deepfilternet3/v2/pkg/df_bg.wasm deleted file mode 100644 index fac0f9e70..000000000 Binary files a/fluxer_static/libs/deepfilternet3/v2/pkg/df_bg.wasm and /dev/null differ diff --git a/fluxer_static/libs/deepfilternet3/v3/models/DeepFilterNet3_onnx.tar.gz b/fluxer_static/libs/deepfilternet3/v3/models/DeepFilterNet3_onnx.tar.gz deleted file mode 100644 index 1c4f4ffe1..000000000 Binary files a/fluxer_static/libs/deepfilternet3/v3/models/DeepFilterNet3_onnx.tar.gz and /dev/null differ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 79d0365b8..63a03bb8e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -210,9 +210,6 @@ catalogs: combokeys: specifier: 3.0.1 version: 3.0.1 - deepfilternet3-noise-filter: - specifier: 1.3.0 - version: 1.3.0 emoji-regex: specifier: 11.0.0 version: 11.0.0 @@ -1465,9 +1462,6 @@ importers: combokeys: specifier: 'catalog:' version: 3.0.1 - deepfilternet3-noise-filter: - specifier: 'catalog:' - version: 1.3.0(livekit-client@fluxer_app+pkgs+livekit-client) eventemitter3: specifier: 'catalog:' version: 5.0.4 @@ -7554,12 +7548,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepfilternet3-noise-filter@1.3.0: - resolution: {integrity: sha512-yYFUlPuvPguqcd/R6/OSsr0noGqlqOE50JkCWYHogk+PjLj9qrNgwTt5zKraVkKnw0l4+eXJagkz2SUWtUl4sQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - livekit-client: ^2.0.0 - deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -16518,10 +16506,6 @@ snapshots: deep-is@0.1.4: {} - deepfilternet3-noise-filter@1.3.0(livekit-client@fluxer_app+pkgs+livekit-client): - dependencies: - livekit-client: link:fluxer_app/pkgs/livekit-client - deepmerge@4.3.1: {} defu@6.1.7: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d9246b0c1..6ce4ede3d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -105,7 +105,6 @@ catalog: clsx: 2.1.1 colorjs.io: 0.7.1 combokeys: 3.0.1 - deepfilternet3-noise-filter: 1.3.0 emoji-regex: 11.0.0 esbuild: 0.28.2 eslint: 10.10.0