diff --git a/fluxer_app/pkgs/livekit-client/VENDORING.md b/fluxer_app/pkgs/livekit-client/VENDORING.md index b9ec4fab6..40193749e 100644 --- a/fluxer_app/pkgs/livekit-client/VENDORING.md +++ b/fluxer_app/pkgs/livekit-client/VENDORING.md @@ -44,9 +44,14 @@ source edits in this package. OpenH264 software profile. 8. **Media publishing defaults** (`src/room/defaults.ts`, `src/room/utils.ts`, `src/room/track/options.ts`) - Prefers AV1, then HEVC/H.265, H.264, VP9, and VP8 according to actual - sender capabilities; pairs advanced codecs with H.264 backup simulcast; and + Falls back to H.264, then VP9, VP8, AV1, and HEVC/H.265 according to actual + sender capabilities, pairs advanced codecs with H.264 backup simulcast, and uses maintain-resolution screen-share defaults with a 4K60-ready bitrate cap. + The order puts AV1 and HEVC last because both are opt-in in Fluxer, so a + fallback inside `publishTrack` must not land on a codec the user did not + enable. Fluxer picks the codec itself before publishing, so this list only + applies when the client overrides the request, such as the reconnect + republish that runs outside Fluxer's own flows. 9. **High-fidelity Opus SDP munging** (`src/room/PCTransport.ts`) Forces Opus RED/FEC, stereo signaling, 10 ms packet time, no DTX, and a diff --git a/fluxer_app/pkgs/livekit-client/src/room/defaults.test.ts b/fluxer_app/pkgs/livekit-client/src/room/defaults.test.ts index b62154eff..385389026 100644 --- a/fluxer_app/pkgs/livekit-client/src/room/defaults.test.ts +++ b/fluxer_app/pkgs/livekit-client/src/room/defaults.test.ts @@ -4,12 +4,13 @@ import {describe, expect, it} from 'vitest'; import {defaultVideoCodec, publishDefaults, roomOptionDefaults} from './defaults.ts'; import {BackupCodecPolicy} from './track/options.ts'; +import {selectPreferredVideoCodec} from './utils.ts'; describe('Fluxer media publish defaults', () => { - it('defaults new video publishes to the advanced codec path with H.264 backup', () => { - expect(defaultVideoCodec).toBe('av1'); + it('defaults new video publishes to an opt-in-safe codec with H.264 backup', () => { + expect(defaultVideoCodec).toBe('h264'); expect(publishDefaults).toMatchObject({ - videoCodec: 'av1', + videoCodec: 'h264', backupCodec: {codec: 'h264'}, backupCodecPolicy: BackupCodecPolicy.SIMULCAST, degradationPreference: 'maintain-resolution', @@ -18,6 +19,12 @@ describe('Fluxer media publish defaults', () => { }); }); + it('falls back away from the opt-in codecs before reaching them', () => { + expect(selectPreferredVideoCodec()).toBe('h264'); + expect(selectPreferredVideoCodec()).not.toBe('av1'); + expect(selectPreferredVideoCodec()).not.toBe('h265'); + }); + it('keeps original screen-share publishing at a 4K60-ready transport ceiling', () => { expect(publishDefaults.screenShareEncoding).toMatchObject({ maxBitrate: 20_000_000, diff --git a/fluxer_app/pkgs/livekit-client/src/room/defaults.ts b/fluxer_app/pkgs/livekit-client/src/room/defaults.ts index 697b0f8e5..03455777c 100644 --- a/fluxer_app/pkgs/livekit-client/src/room/defaults.ts +++ b/fluxer_app/pkgs/livekit-client/src/room/defaults.ts @@ -6,7 +6,7 @@ import DefaultReconnectPolicy from './DefaultReconnectPolicy.ts'; import type {AudioCaptureOptions, TrackPublishDefaults, VideoCaptureOptions} from './track/options.ts'; import {AudioPresets, BackupCodecPolicy, ScreenSharePresets, VideoPresets} from './track/options.ts'; -export const defaultVideoCodec = 'av1'; +export const defaultVideoCodec = 'h264'; export const publishDefaults: TrackPublishDefaults = { audioPreset: AudioPresets.music, diff --git a/fluxer_app/pkgs/livekit-client/src/room/utils.test.ts b/fluxer_app/pkgs/livekit-client/src/room/utils.test.ts index add41233e..7ba7fbe6d 100644 --- a/fluxer_app/pkgs/livekit-client/src/room/utils.test.ts +++ b/fluxer_app/pkgs/livekit-client/src/room/utils.test.ts @@ -45,12 +45,19 @@ describe('video codec capability helpers', () => { }); }); - it('uses the advanced publish ladder from real sender capabilities', () => { + it('keeps the opt-in codecs last even when sender capabilities offer them', () => { setSenderCapabilities(['video/VP8', 'video/H264', 'video/VP9', 'video/H265', 'video/AV1']); expect(supportsAV1()).toBe(true); expect(supportsH265()).toBe(true); expect(supportsVP9()).toBe(true); - expect(selectPreferredVideoCodec()).toBe('av1'); + expect(selectPreferredVideoCodec()).toBe('h264'); + }); + + it('falls back to VP9 then VP8 before any opt-in codec', () => { + setSenderCapabilities(['video/VP8', 'video/VP9', 'video/H265', 'video/AV1']); + expect(selectPreferredVideoCodec()).toBe('vp9'); + setSenderCapabilities(['video/VP8', 'video/H265', 'video/AV1']); + expect(selectPreferredVideoCodec()).toBe('vp8'); }); it('treats legacy AV1X as AV1 and falls through to HEVC when AV1 is absent', () => { diff --git a/fluxer_app/pkgs/livekit-client/src/room/utils.ts b/fluxer_app/pkgs/livekit-client/src/room/utils.ts index b6faa0c4a..8c6e8b187 100644 --- a/fluxer_app/pkgs/livekit-client/src/room/utils.ts +++ b/fluxer_app/pkgs/livekit-client/src/room/utils.ts @@ -32,7 +32,7 @@ import type {ChatMessage, LiveKitReactNativeInfo, TranscriptionSegment} from './ const separator = '|'; export const ddExtensionURI = 'https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension'; -const preferredPublishVideoCodecs: ReadonlyArray = ['av1', 'h265', 'h264', 'vp9', 'vp8']; +const preferredPublishVideoCodecs: ReadonlyArray = ['h264', 'vp9', 'vp8', 'av1', 'h265']; export function unpackStreamId(packed: string): Array { const parts = packed.split(separator); diff --git a/fluxer_app/src/features/i18n/locales/ar/messages.po b/fluxer_app/src/features/i18n/locales/ar/messages.po index 1415f33ef..5028a622b 100644 --- a/fluxer_app/src/features/i18n/locales/ar/messages.po +++ b/fluxer_app/src/features/i18n/locales/ar/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {توسيع (# سطر)} other {توسيع (# أسط msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {توسيع (# صف)} other {توسيع (# صفوف)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {توسيع جهاز آخر} other {توسيع # أجهزة أخرى}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {في مكالمة} other {# في مكالمة}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {الانضمام لمكالمة الفيديو (# مشارك)} other {الانضمام لمكالمة الفيديو (# مشاركين)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {متابعة مشاهدة بث واحد وإضافة هذا البث} other {متابعة مشاهدة # بثوث وإضافة هذا البث}}" @@ -7466,7 +7466,7 @@ msgstr "طي موضوع القناة" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "طي الأجهزة" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "عناصر تحكم مشفر مشاركة الشاشة" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "انتهت مشاركة الشاشة" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "يجب أن يستخدم redirect_uri المقدم بروتوكول HTTP أو HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "توقفت عملية مشاركة الشاشة عن إرسال الفيديو، لذلك تم إيقاف مشاركة شاشتك." @@ -33868,7 +33868,7 @@ msgstr "مستخدم غير معروف" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "مستخدم غير معروف" @@ -38243,6 +38243,12 @@ msgstr "منطقتك" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "يتطلب تسجيلك فحصًا إضافيًا لمكافحة الرسائل المزعجة قبل أن تتمكن من المتابعة." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "تعذر نشر مشاركة شاشتك باستخدام برنامج ترميز فيديو متوافق، لذا تم إيقافها. حاول المشاركة مرة أخرى." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "تم تعيين عنوان URL المخصص الخاص بك إلى {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." 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 21d2f33ce..f1145c8b6 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 @@ -2040,6 +2040,10 @@ { "msgid": "{remaining, plural, one {+# more} other {+# more}}" }, + { + "msgctxt": "screen-share", + "msgid": "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." + }, { "msgctxt": "screen-share", "msgid": "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." diff --git a/fluxer_app/src/features/i18n/locales/bg/messages.po b/fluxer_app/src/features/i18n/locales/bg/messages.po index 460639339..a64984cc6 100644 --- a/fluxer_app/src/features/i18n/locales/bg/messages.po +++ b/fluxer_app/src/features/i18n/locales/bg/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Разгъване (1 ред)} other {Разгъв msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Разгънете (# ред)} other {Разгънете (# реда)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Разгъване на # друго устройство} other {Разгъване на # други устройства}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {В разговор} other {# в разговор}} msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Присъединяване към видео разговор (# участник)} other {Присъединяване към видео разговор (# участници)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Продължи да гледаш # поток и добави този} other {Продължи да гледаш # потока и добави този}}" @@ -7466,7 +7466,7 @@ msgstr "Скрий темата на канала" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Свиване на устройствата" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Контроли за кодиране на споделяне на екрана" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Споделянето на екрана приключи" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Предоставеният redirect_uri трябва да използва HTTP или HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Източникът на споделяне на екрана спря да изпраща видео, поради което споделянето на екрана беше прекратено." @@ -33868,7 +33868,7 @@ msgstr "неизвестен потребител" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Неизвестен потребител" @@ -38243,6 +38243,12 @@ msgstr "вашият регион" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Регистрацията ви изисква допълнителна проверка срещу спам, преди да продължите." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Екранът ви не може да бъде споделен с видео кодек, който да се поддържа, затова споделянето беше спряно. Опитайте да споделите отново." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Вашият персонализиран URL адрес е зададен на {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Вашият видео енкодер спря да кодира кадри, затова споделянето на екрана беше прекратено. Опитайте отново да споделите." diff --git a/fluxer_app/src/features/i18n/locales/cs/messages.po b/fluxer_app/src/features/i18n/locales/cs/messages.po index b17201602..0a223c6d0 100644 --- a/fluxer_app/src/features/i18n/locales/cs/messages.po +++ b/fluxer_app/src/features/i18n/locales/cs/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Rozbalit (1 řádek)} few {Rozbalit (# řádky)} ma msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Rozbalit (# řádek)} other {Rozbalit (# řádky)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Rozbalit # další zařízení} other {Rozbalit # dalších zařízení}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {V hovoru} other {# v hovoru}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Připojit se k videohovoru (1 účastník)} few {Připojit se k videohovoru (# účastníci)} many {Připojit se k videohovoru (# účastníků)} other {Připojit se k videohovoru (# účastníků)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Sledovat # stream a přidat tento} other {Sledovat # streamy a přidat tento}}" @@ -7466,7 +7466,7 @@ msgstr "Sbalit téma kanálu" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Sbalit zařízení" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Ovládací prvky kodeku pro sdílení obrazovky" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Sdílení obrazovky ukončeno" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Zadané redirect_uri musí používat HTTP nebo HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Zdroj sdílení obrazovky přestal odesílat video, takže bylo ukončeno sdílení obrazovky." @@ -33868,7 +33868,7 @@ msgstr "neznámý uživatel" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Neznámý uživatel" @@ -38243,6 +38243,12 @@ msgstr "váš region" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Než budete moct pokračovat, je potřeba provést dodatečnou kontrolu proti spamu." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Sdílení obrazovky se nepodařilo publikovat s kompatibilním video kodekem, proto bylo zastaveno. Zkuste sdílet znovu." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Vaše vlastní adresa URL byla nastavena na {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Váš video kodér přestal kódovat snímky, takže sdílení obrazovky bylo ukončeno. Zkuste sdílet znovu." diff --git a/fluxer_app/src/features/i18n/locales/da/messages.po b/fluxer_app/src/features/i18n/locales/da/messages.po index 55d55539f..b43bacdfd 100644 --- a/fluxer_app/src/features/i18n/locales/da/messages.po +++ b/fluxer_app/src/features/i18n/locales/da/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Vis (# linje)} other {Vis (# linjer)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Vis (# række)} other {Vis (# rækker)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Udvid # anden enhed} other {Udvid # andre enheder}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {I opkald} other {# i opkald}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Deltag i videoopkald (# deltager)} other {Deltag i videoopkald (# deltagere)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "Fortsæt med at se # {count, plural, one {stream og tilføj denne} other {streams og tilføj denne}}" @@ -7466,7 +7466,7 @@ msgstr "Skjul kanalemne" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Skjul enheder" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Skærmdelingsindstillinger" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Skærmdeling afsluttet" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Den angivne redirect_uri skal bruge HTTP eller HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Skærmdelingskilden er stoppet med at sende video, så din skærmdeling blev stoppet." @@ -33868,7 +33868,7 @@ msgstr "Ukendt bruger" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Ukendt bruger" @@ -38243,6 +38243,12 @@ msgstr "din region" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Din registrering kræver et ekstra anti-spam-tjek, før du kan fortsætte." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Din skærmdeling kunne ikke publiceres med en kompatibel video-codec, så den blev stoppet. Prøv at dele igen." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Din tilpassede URL er nu indstillet til {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Din video-encoder stoppede med at kode billeder, så din skærmdeling blev stoppet. Prøv at dele igen." diff --git a/fluxer_app/src/features/i18n/locales/de/messages.po b/fluxer_app/src/features/i18n/locales/de/messages.po index 3bdd0b461..597513748 100644 --- a/fluxer_app/src/features/i18n/locales/de/messages.po +++ b/fluxer_app/src/features/i18n/locales/de/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Erweitern (# Zeile)} other {Erweitern (# Zeilen)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Erweitern (# Zeile)} other {Erweitern (# Zeilen)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Einen weiteren Teilnehmer einblenden} other {# weitere Teilnehmer einblenden}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {Im Anruf} other {# im Anruf}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Videoanruf beitreten (# Teilnehmer)} other {Videoanruf beitreten (# Teilnehmer)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Behalte # Stream im Auge und füge diesen hinzu} other {Behalte # Streams im Auge und füge diesen hinzu}}" @@ -7466,7 +7466,7 @@ msgstr "Kanalthema einklappen" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Geräte einklappen" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Bildschirmfreigabe-Encoder-Einstellungen" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Bildschirmfreigabe beendet" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Die angegebene redirect_uri muss HTTP oder HTTPS verwenden." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Die Bildschirmfreigabe hat das Senden von Video gestoppt, daher wurde Ihre Bildschirmfreigabe beendet." @@ -33868,7 +33868,7 @@ msgstr "Unbekannter Nutzer" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Unbekannter Nutzer" @@ -38243,6 +38243,12 @@ msgstr "deine Region" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Deine Registrierung erfordert eine zusätzliche Anti-Spam-Prüfung, bevor du fortfahren kannst." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Dein Bildschirmfreigabe konnte nicht mit einem kompatiblen Video-Codec veröffentlicht werden und wurde daher beendet. Versuche es erneut." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Deine Vanity-URL wurde auf {inviteEndpoint}/{vanitySlug} festgelegt" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Dein Video-Encoder hat aufgehört, Frames zu kodieren, daher wurde deine Bildschirmfreigabe beendet. Versuche es erneut." diff --git a/fluxer_app/src/features/i18n/locales/el/messages.po b/fluxer_app/src/features/i18n/locales/el/messages.po index 81e91f5c6..22687be42 100644 --- a/fluxer_app/src/features/i18n/locales/el/messages.po +++ b/fluxer_app/src/features/i18n/locales/el/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Ανάπτυξη (# γραμμή)} other {Ανάπ msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Εμφάνιση (# γραμμής)} other {Εμφάνιση (# γραμμών)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Ανάπτυξη # άλλης συσκευής} other {Ανάπτυξη # άλλων συσκευών}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {Σε κλήση} other {# σε κλήση}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Συμμετοχή σε βιντεοκλήση (# συμμετέχων)} other {Συμμετοχή σε βιντεοκλήση (# συμμετέχοντες)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Συνέχισε να παρακολουθείς # ροή και πρόσθεσε αυτήν} other {Συνέχισε να παρακολουθείς # ροές και πρόσθεσε αυτήν}}" @@ -7466,7 +7466,7 @@ msgstr "Σύμπτυξη θέματος καναλιού" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Σύμπτυξη συσκευών" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Έλεγχος κωδικοποιητή κοινής χρήσης οθόνης" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Η κοινή χρήση οθόνης έληξε" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Το redirect_uri που δόθηκε πρέπει να χρησιμοποιεί HTTP ή HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Η πηγή κοινής χρήσης οθόνης σταμάτησε να στέλνει βίντεο, επομένως η κοινή χρήση της οθόνης σας διακόπηκε." @@ -33868,7 +33868,7 @@ msgstr "άγνωστος χρήστης" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Άγνωστος χρήστης" @@ -38243,6 +38243,12 @@ msgstr "η περιοχή σας" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Η εγγραφή σου χρειάζεται έναν επιπλέον έλεγχο anti-spam πριν μπορέσεις να συνεχίσεις." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Η κοινή χρήση οθόνης σας δεν μπόρεσε να δημοσιευτεί με συμβατό κωδικοποιητή βίντεο, επομένως διακόπηκε. Δοκιμάστε να μοιραστείτε ξανά." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Η προσαρμοσμένη διεύθυνση URL έχει οριστεί σε {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Ο κωδικοποιητής βίντεο σταμάτησε να κωδικοποιεί καρέ, οπότε η κοινή χρήση οθόνης διακόπηκε. Δοκιμάστε να την μοιραστείτε ξανά." 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 a3372f714..f5497a385 100644 --- a/fluxer_app/src/features/i18n/locales/en-GB/messages.po +++ b/fluxer_app/src/features/i18n/locales/en-GB/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Expand (# line)} other {Expand (# lines)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Expand # other device} other {Expand # other devices}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {In call} other {# in call}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" @@ -7466,7 +7466,7 @@ msgstr "Collapse channel topic" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Collapse devices" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Screen share encoder controls" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Screen share ended" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "The redirect_uri provided must use HTTP or HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "The screen share source stopped sending video, so your screen share was stopped." @@ -33868,7 +33868,7 @@ msgstr "Unknown user" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Unknown user" @@ -38243,6 +38243,13 @@ msgstr "Your region" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Your registration needs an extra anti-spam check before you can continue." +# auto-i18n: reviewed unchanged +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38329,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." 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 5aba4b3e2..9be03d602 100644 --- a/fluxer_app/src/features/i18n/locales/en-US/messages.po +++ b/fluxer_app/src/features/i18n/locales/en-US/messages.po @@ -451,7 +451,7 @@ msgstr "{count, plural, one {Expand (# line)} other {Expand (# lines)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Expand # other device} other {Expand # other devices}}" @@ -472,7 +472,7 @@ msgstr "{count, plural, one {In call} other {# in call}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" @@ -7467,7 +7467,7 @@ msgstr "Collapse channel topic" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Collapse devices" @@ -26997,7 +26997,7 @@ msgid "Screen share encoder controls" msgstr "Screen share encoder controls" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Screen share ended" @@ -31586,7 +31586,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "The provided redirect_uri must use HTTP or HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "The screen share source stopped sending video, so your screen share was stopped." @@ -33869,7 +33869,7 @@ msgstr "unknown user" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Unknown user" @@ -38244,6 +38244,12 @@ msgstr "your region" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Your registration needs an extra anti-spam check before you can continue." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38323,7 +38329,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." 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 3d174a57b..5868be498 100644 --- a/fluxer_app/src/features/i18n/locales/es-419/messages.po +++ b/fluxer_app/src/features/i18n/locales/es-419/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Expandir (# línea)} other {Expandir (# líneas)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Mostrar (# fila)} other {Mostrar (# filas)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Expandir # otro dispositivo} other {Expandir # otros dispositivos}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {En llamada} other {# en llamada}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Unirse a videollamada (# participante)} other {Unirse a videollamada (# participantes)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {seguir viendo # transmisión y agregar esta} other {seguir viendo # transmisiones y agregar esta}}" @@ -7466,7 +7466,7 @@ msgstr "Contraer tema del canal" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Contraer dispositivos" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Controles del codificador para compartir pantalla" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Se detuvo el uso compartido de pantalla" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "La redirect_uri proporcionada debe usar HTTP o HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "La fuente de uso compartido de pantalla dejó de enviar video, por lo que se detuvo el uso compartido de pantalla." @@ -33868,7 +33868,7 @@ msgstr "usuario desconocido" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Usuario desconocido" @@ -38243,6 +38243,12 @@ msgstr "tu región" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Tu registro necesita una verificación antispam adicional antes de que puedas continuar." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "No se pudo publicar tu pantalla compartida con un códec de video compatible, por lo que se detuvo. Intenta compartir de nuevo." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Tu URL personalizada se estableció en {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Tu codificador de video dejó de procesar fotogramas, por lo que se detuvo tu uso compartido de pantalla. Intenta compartir de nuevo." 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 acdb9b41a..48257cf13 100644 --- a/fluxer_app/src/features/i18n/locales/es-ES/messages.po +++ b/fluxer_app/src/features/i18n/locales/es-ES/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Expandir (# línea)} other {Expandir (# líneas)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Mostrar (# fila)} other {Mostrar (# filas)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Expandir # otro dispositivo} other {Expandir # otros dispositivos}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {En llamada} other {# en llamada}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Unirse a la videollamada (# participante)} other {Unirse a la videollamada (# participantes)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Seguir viendo # retransmisión y añadir esta} other {Seguir viendo # retransmisiones y añadir esta}}" @@ -7466,7 +7466,7 @@ msgstr "Contraer tema del canal" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Contraer dispositivos" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Controles del codificador para compartir pantalla" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Finalizó el uso compartido de pantalla" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "La redirect_uri proporcionada debe usar HTTP o HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "La fuente de uso compartido de pantalla dejó de enviar vídeo, por lo que se detuvo el uso compartido de pantalla." @@ -33868,7 +33868,7 @@ msgstr "usuario desconocido" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Usuario desconocido" @@ -38243,6 +38243,12 @@ msgstr "tu región" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Tu registro necesita una comprobación antispam adicional antes de que puedas continuar." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "No se ha podido publicar tu pantalla compartida con un códec de vídeo compatible, por lo que se ha detenido. Intenta compartir de nuevo." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Tu URL personalizada se ha establecido en {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "El codificador de vídeo dejó de codificar fotogramas, por lo que se detuvo el uso compartido de pantalla. Intenta compartir de nuevo." diff --git a/fluxer_app/src/features/i18n/locales/fi/messages.po b/fluxer_app/src/features/i18n/locales/fi/messages.po index 55863cbf4..a63e75a6e 100644 --- a/fluxer_app/src/features/i18n/locales/fi/messages.po +++ b/fluxer_app/src/features/i18n/locales/fi/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Laajenna (1 rivi)} other {Laajenna (# riviä)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Näytä lisää (# rivi)} other {Näytä lisää (# riviä)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Laajenna # muu laite} other {Laajenna # muuta laitetta}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {Puhelussa} other {# puhelussa}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Liity videopuheluun (1 osallistuja)} other {Liity videopuheluun (# osallistujaa)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "Jatka # {count, plural, one {striimin} other {striimien}} katsomista ja lisää tämä" @@ -7466,7 +7466,7 @@ msgstr "Tiivistä kanavan aihe" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Tiivistä laitteet" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Näytönjakamisen kooderin asetukset" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Näytönjako päättyi" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "redirect_uri-osoitteen on käytettävä HTTP- tai HTTPS-protokollaa." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Näytönjakolähde lopetti videon lähettämisen, joten näytönjako on lopetettu." @@ -33868,7 +33868,7 @@ msgstr "tuntematon käyttäjä" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Tuntematon käyttäjä" @@ -38243,6 +38243,12 @@ msgstr "alueesi" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Rekisteröitymisesi vaatii ylimääräisen roskapostitarkistuksen ennen kuin voit jatkaa." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Näyttösi jakamista ei voitu julkaista yhteensopivalla videokoodekilla, joten se pysäytettiin. Yritä jakaa uudelleen." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Osoitteeksi on asetettu {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Videokooderisi lopetti kuvien koodaamisen, joten näytön jakaminen pysäytettiin. Yritä jakaa uudelleen." diff --git a/fluxer_app/src/features/i18n/locales/fr/messages.po b/fluxer_app/src/features/i18n/locales/fr/messages.po index a99def3fb..98276a6ea 100644 --- a/fluxer_app/src/features/i18n/locales/fr/messages.po +++ b/fluxer_app/src/features/i18n/locales/fr/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Développer (# ligne)} other {Développer (# lignes msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Afficher (# ligne)} other {Afficher (# lignes)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Afficher # autre appareil} other {Afficher # autres appareils}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {En appel} other {# en appel}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Rejoindre l'appel vidéo (1 participant)} other {Rejoindre l'appel vidéo (# participants)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Continuer à regarder # stream et ajouter celui-ci} other {Continuer à regarder # streams et ajouter celui-ci}}" @@ -7466,7 +7466,7 @@ msgstr "Réduire le sujet du salon" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Réduire les appareils" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Commandes de l’encodeur de partage d’écran" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Partage d’écran terminé" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "L'URI de redirection fournie doit utiliser HTTP ou HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "La source de partage d’écran a cessé d’envoyer des vidéos, votre partage d’écran a donc été arrêté." @@ -33868,7 +33868,7 @@ msgstr "utilisateur inconnu" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Utilisateur inconnu" @@ -38243,6 +38243,12 @@ msgstr "votre région" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Votre inscription nécessite une vérification anti-spam supplémentaire avant de pouvoir continuer." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Votre partage d'écran n'a pas pu être publié avec un codec vidéo compatible, il a donc été arrêté. Essayez de partager à nouveau." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Votre URL personnalisée a été définie sur {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Votre encodeur vidéo a cessé d'encoder des images, votre partage d'écran a donc été arrêté. Essayez de partager à nouveau." diff --git a/fluxer_app/src/features/i18n/locales/he/messages.po b/fluxer_app/src/features/i18n/locales/he/messages.po index 875cad77b..fa29004d5 100644 --- a/fluxer_app/src/features/i18n/locales/he/messages.po +++ b/fluxer_app/src/features/i18n/locales/he/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {הרחב (שורה אחת)} other {הרחב (# שו msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {הצג (# שורה)} other {הצג (# שורות)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {הרחב מכשיר אחד נוסף} other {הרחב # מכשירים נוספים}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {בשיחה} other {# בשיחה}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {הצטרף לשיחת וידאו (משתתף אחד)} other {הצטרף לשיחת וידאו (# משתתפים)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {המשך/המשיכי לצפות בסטרים # והוסף/הוסיפי את זה} other {המשך/המשיכי לצפות בסטרימים # והוסף/הוסיפי את זה}}" @@ -7466,7 +7466,7 @@ msgstr "כיווץ נושא הערוץ" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "כיווץ מכשירים" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "בקרות מקודד שיתוף מסך" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "שיתוף מסך הסתיים" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "ה-redirect_uri שסופק חייב להשתמש ב-HTTP או ב-HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "מקור שיתוף המסך הפסיק לשלוח וידאו, ולכן שיתוף המסך שלך הופסק." @@ -33868,7 +33868,7 @@ msgstr "משתמש לא ידוע" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "משתמש לא ידוע" @@ -38243,6 +38243,12 @@ msgstr "האזור שלך" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "ההרשמה שלך דורשת בדיקה נוספת למניעת ספאם לפני שתוכל להמשיך." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "לא ניתן היה לפרסם את שיתוף המסך שלך עם קודק וידאו תואם, ולכן הוא הופסק. נסה לשתף שוב." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "כתובת ה-URL המותאמת אישית שלך הוגדרה ל-‎{inviteEndpoint}/{vanitySlug}‎" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "מקודד הווידאו שלך הפסיק לקודד פריימים, ולכן שיתוף המסך שלך הופסק. נסה לשתף שוב." diff --git a/fluxer_app/src/features/i18n/locales/hi/messages.po b/fluxer_app/src/features/i18n/locales/hi/messages.po index 79312e6e4..6549c341e 100644 --- a/fluxer_app/src/features/i18n/locales/hi/messages.po +++ b/fluxer_app/src/features/i18n/locales/hi/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {विस्तार करें (# लाइन) msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {# पंक्तियाँ खोलें} other {# पंक्तियों को खोलें}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {अन्य # डिवाइस को बड़ा करें} other {अन्य # डिवाइस को बड़ा करें}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {कॉल पर} other {# लोग कॉल प msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {वीडियो कॉल में शामिल हों (# प्रतिभागी)} other {वीडियो कॉल में शामिल हों (# प्रतिभागी)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {# स्ट्रीम देखना जारी रखें और इसे जोड़ें} other {# स्ट्रीम देखना जारी रखें और इसे जोड़ें}}" @@ -7466,7 +7466,7 @@ msgstr "चैनल विषय छोटा करें" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "डिवाइसों को छोटा करें" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "स्क्रीन शेयर एनकोडर नियंत्रण" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "स्क्रीन शेयर समाप्त हो गया" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "दिया गया redirect_uri HTTP या HTTPS का उपयोग करना चाहिए।" #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "स्क्रीन शेयर स्रोत ने वीडियो भेजना बंद कर दिया है, इसलिए आपका स्क्रीन शेयर रोक दिया गया।" @@ -33868,7 +33868,7 @@ msgstr "अज्ञात यूज़र" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "अज्ञात यूज़र" @@ -38243,6 +38243,12 @@ msgstr "आपका क्षेत्र" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "जारी रखने से पहले आपके रजिस्ट्रेशन के लिए एक अतिरिक्त एंटी-स्पैम जाँच की ज़रूरत है।" +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "आपका स्क्रीन शेयर एक संगत वीडियो कोडेक के साथ प्रकाशित नहीं हो सका, इसलिए इसे रोक दिया गया। फिर से शेयर करने का प्रयास करें।" + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "आपकी वैनिटी URL को {inviteEndpoint}/{vanitySlug} पर सेट कर दिया गया है" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "आपका वीडियो एन्कोडर फ़्रेम एन्कोड करना बंद कर दिया, इसलिए आपकी स्क्रीन शेयरिंग रोक दी गई। दोबारा शेयर करने का प्रयास करें।" diff --git a/fluxer_app/src/features/i18n/locales/hr/messages.po b/fluxer_app/src/features/i18n/locales/hr/messages.po index efc3314d5..7af0df786 100644 --- a/fluxer_app/src/features/i18n/locales/hr/messages.po +++ b/fluxer_app/src/features/i18n/locales/hr/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Proširi (# redak)} other {Proširi (# redaka)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Prikaži (# red)} other {Prikaži (# redova)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Proširi # drugi uređaj} other {Proširi # druga uređaja}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {U pozivu} other {# u pozivu}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Pridruži se videopozivu (# sudionik)} other {Pridruži se videopozivu (# sudionika)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Nastavi gledati # stream i dodaj ovaj} other {Nastavi gledati # streama i dodaj ovaj}}" @@ -7466,7 +7466,7 @@ msgstr "Sažmi temu kanala" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Sažmi uređaje" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Kontrole za enkoder dijeljenja zaslona" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Dijeljenje zaslona završeno" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Navedeni redirect_uri mora koristiti HTTP ili HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Izvor dijeljenja zaslona prestao je slati video, pa je dijeljenje zaslona zaustavljeno." @@ -33868,7 +33868,7 @@ msgstr "nepoznat korisnik" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Nepoznat korisnik" @@ -38243,6 +38243,12 @@ msgstr "vaša regija" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Vaša registracija zahtijeva dodatnu provjeru protiv spama prije nego što možete nastaviti." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Vaš zaslonski udio nije se mogao objaviti s kompatibilnim video kodekom, pa je zaustavljen. Pokušajte ponovno dijeliti." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Vaš prilagođeni URL postavljen je na {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Vaš video enkoder prestao je kodirati slike, stoga je dijeljenje zaslona zaustavljeno. Pokušajte ponovno dijeliti." diff --git a/fluxer_app/src/features/i18n/locales/hu/messages.po b/fluxer_app/src/features/i18n/locales/hu/messages.po index 01caf77f1..715f667fc 100644 --- a/fluxer_app/src/features/i18n/locales/hu/messages.po +++ b/fluxer_app/src/features/i18n/locales/hu/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Kibontás (# sor)} other {Kibontás (# sor)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Bontsd ki (# sor)} other {Bontsd ki (# sorok)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Kibontás: # további eszköz} other {Kibontás: # további eszköz}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {Hívásban} other {#-en hívásban}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Csatlakozás videóhíváshoz (1 résztvevő)} other {Csatlakozás videóhíváshoz (# résztvevő)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Folytasd a(z) # stream nézését, és add hozzá ezt} other {Folytasd a(z) # stream nézését, és add hozzá ezt}}" @@ -7466,7 +7466,7 @@ msgstr "Csatornatéma összecsukása" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Eszközök összecsukása" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Képernyőmegosztás-kódoló beállításai" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "A képernyőmegosztás befejeződött" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "A megadott redirect_uri-nak HTTP vagy HTTPS protokollt kell használnia." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "A képernyőmegosztás forrása leállította a videó küldését, ezért a képernyőmegosztása is befejeződött." @@ -33868,7 +33868,7 @@ msgstr "ismeretlen felhasználó" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Ismeretlen felhasználó" @@ -38243,6 +38243,12 @@ msgstr "régiód" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "A folytatáshoz a regisztrációdhoz egy további spamellenőrzésre van szükség." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "A képernyőmegosztásod nem volt közzétehető kompatibilis videokodekkel, ezért leállt. Próbáld meg újra megosztani." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Az egyéni meghívó URL-je beállítva: {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "A videokódoló nem kódolt képkockákat, ezért a képernyőmegosztás leállt. Próbáld meg újra megosztani." diff --git a/fluxer_app/src/features/i18n/locales/id/messages.po b/fluxer_app/src/features/i18n/locales/id/messages.po index 48ae85df4..898b4fe61 100644 --- a/fluxer_app/src/features/i18n/locales/id/messages.po +++ b/fluxer_app/src/features/i18n/locales/id/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Perluas (# baris)} other {Perluas (# baris)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Tampilkan (# baris)} other {Tampilkan (# baris)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Perluas # perangkat lain} other {Perluas # perangkat lain}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {Dalam panggilan} other {# dalam panggilan}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Gabung panggilan video (# peserta)} other {Gabung panggilan video (# peserta)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Tetap tonton # stream dan tambahkan yang ini} other {Tetap tonton # stream dan tambahkan yang ini}}" @@ -7466,7 +7466,7 @@ msgstr "Ciutkan topik saluran" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Ciutkan perangkat" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Kontrol pengode video layar" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Berbagi layar berakhir" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "redirect_uri yang diberikan harus menggunakan HTTP atau HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Sumber berbagi layar berhenti mengirim video, sehingga berbagi layar Anda dihentikan." @@ -33868,7 +33868,7 @@ msgstr "pengguna tidak dikenal" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Pengguna tidak dikenal" @@ -38243,6 +38243,12 @@ msgstr "wilayah Anda" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Pendaftaran Anda memerlukan pemeriksaan anti-spam tambahan sebelum dapat dilanjutkan." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Berbagi layar Anda tidak dapat dipublikasikan dengan codec video yang kompatibel, jadi dibatalkan. Coba bagikan lagi." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "URL kustom Anda telah diatur ke {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Encoder video Anda berhenti mengenkode frame, jadi berbagi layar Anda dihentikan. Coba bagikan lagi." diff --git a/fluxer_app/src/features/i18n/locales/it/messages.po b/fluxer_app/src/features/i18n/locales/it/messages.po index bbd1ce0f0..e2bf2cf72 100644 --- a/fluxer_app/src/features/i18n/locales/it/messages.po +++ b/fluxer_app/src/features/i18n/locales/it/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Espandi (# riga)} other {Espandi (# righe)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Espandi (# riga)} other {Espandi (# righe)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Espandi # altro dispositivo} other {Espandi # altri dispositivi}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {In chiamata} other {# in chiamata}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Partecipa alla videochiamata (# partecipante)} other {Partecipa alla videochiamata (# partecipanti)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Continua a guardare # stream e aggiungi questo} other {Continua a guardare # stream e aggiungi questo}}" @@ -7466,7 +7466,7 @@ msgstr "Comprimi l'argomento del canale" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Comprimi dispositivi" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Controlli dell'encoder per la condivisione dello schermo" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Screen share terminato" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "L'URI di reindirizzamento fornito deve usare HTTP o HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "La sorgente della condivisione dello schermo ha smesso di inviare video, quindi la condivisione dello schermo è stata interrotta." @@ -33868,7 +33868,7 @@ msgstr "utente sconosciuto" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Utente sconosciuto" @@ -38243,6 +38243,12 @@ msgstr "la tua regione" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "La tua registrazione richiede un controllo anti-spam aggiuntivo prima di poter continuare." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "La condivisione dello schermo non è stata pubblicata con un codec video compatibile, quindi è stata interrotta. Riprova a condividere." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "L'URL personalizzato è stato impostato su {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Il tuo codificatore video ha smesso di codificare i frame, quindi la condivisione dello schermo è stata interrotta. Riprova a condividere." diff --git a/fluxer_app/src/features/i18n/locales/ja/messages.po b/fluxer_app/src/features/i18n/locales/ja/messages.po index 4ac86eee2..89a97cfe6 100644 --- a/fluxer_app/src/features/i18n/locales/ja/messages.po +++ b/fluxer_app/src/features/i18n/locales/ja/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {展開(#行)} other {展開(#行)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {#行を展開} other {#行を展開}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {#件の他のデバイスを展開} other {#件の他のデバイスを展開}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {通話中} other {#人が通話中}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {ビデオ通話に参加(#人)} other {ビデオ通話に参加(#人)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {#件のストリームを視聴し続け、これを追加} other {#件のストリームを視聴し続け、これを追加}}" @@ -7466,7 +7466,7 @@ msgstr "チャンネルのトピックを折りたたむ" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "デバイスを折りたたむ" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "画面共有エンコーダー設定" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "画面共有が終了しました" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "指定されたredirect_uriはHTTPまたはHTTPSを使用する必要があります。" #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "画面共有のソースがビデオの送信を停止したため、画面共有は停止されました。" @@ -33868,7 +33868,7 @@ msgstr "不明なユーザー" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "不明なユーザー" @@ -38243,6 +38243,12 @@ msgstr "地域" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "引き続きご利用いただくには、追加のスパム対策認証が必要です。" +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "互換性のあるビデオコーデックで画面共有を公開できなかったため、停止しました。もう一度共有してみてください。" + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "バニティURLを {inviteEndpoint}/{vanitySlug} に設定しました" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "動画エンコーダーがフレームのエンコードを停止したため、画面共有が停止しました。もう一度共有してみてください。" diff --git a/fluxer_app/src/features/i18n/locales/ko/messages.po b/fluxer_app/src/features/i18n/locales/ko/messages.po index c132b8ad3..76a7e4aad 100644 --- a/fluxer_app/src/features/i18n/locales/ko/messages.po +++ b/fluxer_app/src/features/i18n/locales/ko/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {펼치기 (#줄)} other {펼치기 (#줄)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {# 행 확장} other {# 행 확장}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {#개의 다른 기기 확장} other {#개의 다른 기기 확장}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {통화 중} other {#명 통화 중}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {영상 통화 참여 (참여자 #명)} other {영상 통화 참여 (참여자 #명)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {#개의 스트림을 계속 시청하고 이 스트림을 추가합니다} other {#개의 스트림을 계속 시청하고 이 스트림을 추가합니다}}" @@ -7466,7 +7466,7 @@ msgstr "채널 주제 접기" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "기기 접기" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "화면 공유 인코더 컨트롤" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "화면 공유가 종료되었습니다" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "제공된 redirect_uri는 HTTP 또는 HTTPS를 사용해야 합니다." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "화면 공유 소스가 더 이상 비디오를 보내지 않아 화면 공유가 중단되었습니다." @@ -33868,7 +33868,7 @@ msgstr "알 수 없는 사용자" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "알 수 없는 사용자" @@ -38243,6 +38243,12 @@ msgstr "회원님의 지역" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "계속하려면 추가 스팸 방지 확인이 필요합니다." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "호환되는 비디오 코덱으로 화면 공유를 게시할 수 없어 중지되었습니다. 다시 공유해 보세요." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "맞춤 URL이 {inviteEndpoint}/{vanitySlug}(으)로 설정되었습니다" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "동영상 인코더에서 프레임을 더 이상 인코딩하지 않아 화면 공유가 중지되었습니다. 다시 공유해 보세요." diff --git a/fluxer_app/src/features/i18n/locales/lt/messages.po b/fluxer_app/src/features/i18n/locales/lt/messages.po index 7db501e1d..462a7dbf8 100644 --- a/fluxer_app/src/features/i18n/locales/lt/messages.po +++ b/fluxer_app/src/features/i18n/locales/lt/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Išskleisti (# eilutę)} other {Išskleisti (# eilu msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Rodyti (# eilutę)} other {Rodyti (# eilutes)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Išskleisti # kitą įrenginį} other {Išskleisti # kitus įrenginius}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {skambina} other {# skambina}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Prisijungti prie vaizdo skambučio (# dalyvis)} other {Prisijungti prie vaizdo skambučio (# dalyviai)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Toliau žiūrėti # srautą ir pridėti šį} other {Toliau žiūrėti # srautus ir pridėti šį}}" @@ -7466,7 +7466,7 @@ msgstr "Sutraukti kanalo temą" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Sutraukti įrenginius" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Ekrano dalijimosi įrašymo nustatymų valdikliai" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Ekrano dalijimasis baigėsi" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Pateiktas \"redirect_uri\" turi naudoti HTTP arba HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Šaltinio, kuriuo dalijamasi ekranu, vaizdo perdavimas buvo sustabdytas, todėl ekrano dalijimasis buvo nutrauktas." @@ -33868,7 +33868,7 @@ msgstr "nežinomas naudotojas" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Nežinomas naudotojas" @@ -38243,6 +38243,12 @@ msgstr "jūsų regionas" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Prieš tęsiant, jūsų registracijai reikalingas papildomas apsaugos nuo brukalų patikrinimas." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Jūsų ekrano bendrinimas negalėjo būti paskelbtas naudojant suderinamą vaizdo kodeką, todėl jis buvo sustabdytas. Pabandykite bendrinti dar kartą." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Jūsų pasirinktinis URL nustatytas į {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Jūsų vaizdo įrašų kodavimo įrenginys nustojo koduoti kadrus, todėl jūsų ekrano bendrinimas buvo sustabdytas. Pabandykite bendrinti dar kartą." diff --git a/fluxer_app/src/features/i18n/locales/nl/messages.po b/fluxer_app/src/features/i18n/locales/nl/messages.po index 1108b37d3..60449391d 100644 --- a/fluxer_app/src/features/i18n/locales/nl/messages.po +++ b/fluxer_app/src/features/i18n/locales/nl/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Uitvouwen (# regel)} other {Uitvouwen (# regels)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Toon (# rij)} other {Toon (# rijen)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Vouw # ander apparaat uit} other {Vouw # andere apparaten uit}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {In gesprek} other {# in gesprek}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Deelnemen aan videogesprek (# deelnemer)} other {Deelnemen aan videogesprek (# deelnemers)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Blijf # stream bekijken en voeg deze toe} other {Blijf # streams bekijken en voeg deze toe}}" @@ -7466,7 +7466,7 @@ msgstr "Kanaalonderwerp inklappen" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Apparaten samenvouwen" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Instellingen voor schermdeling" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Schermdeling beëindigd" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "De opgegeven redirect_uri moet HTTP of HTTPS gebruiken." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "De bron van het scherm delen stuurt geen video meer, dus uw schermdeling is gestopt." @@ -33868,7 +33868,7 @@ msgstr "onbekende gebruiker" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Onbekende gebruiker" @@ -38243,6 +38243,12 @@ msgstr "je regio" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Je registratie heeft een extra antispamcontrole nodig voordat je verder kunt gaan." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Je scherm delen kon niet worden gepubliceerd met een compatibele videocodec, dus het is gestopt. Probeer het opnieuw." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Je aangepaste URL is ingesteld op {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Je videocodeur is gestopt met het coderen van frames, dus je scherm delen is gestopt. Probeer het opnieuw." diff --git a/fluxer_app/src/features/i18n/locales/no/messages.po b/fluxer_app/src/features/i18n/locales/no/messages.po index a13907533..e6637cc96 100644 --- a/fluxer_app/src/features/i18n/locales/no/messages.po +++ b/fluxer_app/src/features/i18n/locales/no/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Vis (# linje)} other {Vis (# linjer)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Vis flere (# rad)} other {Vis flere (# rader)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Vis # annen enhet} other {Vis # andre enheter}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {I samtale} other {# i samtale}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Bli med i videosamtale (# deltaker)} other {Bli med i videosamtale (# deltakere)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Fortsett å se # strøm og legg til denne} other {Fortsett å se # strømmer og legg til denne}}" @@ -7466,7 +7466,7 @@ msgstr "Skjul kanalemne" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Skjul enheter" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Kontroller for skjermdelingsenkoder" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Skjermdelingen ble avsluttet" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Den oppgitte redirect_uri må bruke HTTP eller HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Kilden for skjermdelingen sluttet å sende video, så skjermdelingen ble stoppet." @@ -33868,7 +33868,7 @@ msgstr "ukjent bruker" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Ukjent bruker" @@ -38243,6 +38243,12 @@ msgstr "din region" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Registreringen din krever en ekstra antispam-sjekk før du kan fortsette." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Selve skjermdelingen din kunne ikke publiseres med en kompatibel videokodek, så den ble stoppet. Prøv å dele igjen." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Din tilpassede URL er nå satt til {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Videokoderen din sluttet å kode bilder, så skjermdelingen ble stoppet. Prøv å dele igjen." diff --git a/fluxer_app/src/features/i18n/locales/pl/messages.po b/fluxer_app/src/features/i18n/locales/pl/messages.po index af5576fd9..5decb3de7 100644 --- a/fluxer_app/src/features/i18n/locales/pl/messages.po +++ b/fluxer_app/src/features/i18n/locales/pl/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Rozwiń (1 wiersz)} few {Rozwiń (# wiersze)} many msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Rozwiń (# wiersz)} other {Rozwiń (# wiersze)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Rozwiń # inne urządzenie} other {Rozwiń # inne urządzenia}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {W rozmowie} few {# w rozmowie} many {# w rozmowie} msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Dołącz do rozmowy wideo (# uczestnik)} few {Dołącz do rozmowy wideo (# uczestników)} many {Dołącz do rozmowy wideo (# uczestników)} other {Dołącz do rozmowy wideo (# uczestników)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "Kontynuuj oglądanie {count, plural, one {# transmisji} few {# transmisji} many {# transmisji} other {# transmisji}} i dodaj tę" @@ -7466,7 +7466,7 @@ msgstr "Zwiń temat kanału" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Zwiń urządzenia" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Sterowanie ustawieniami kodowania udostępniania ekranu" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Udostępnianie ekranu zakończone" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Podany adres redirect_uri musi używać protokołu HTTP lub HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Źródło udostępniania ekranu przestało wysyłać wideo, więc udostępnianie ekranu zostało zatrzymane." @@ -33868,7 +33868,7 @@ msgstr "nieznany użytkownik" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Nieznany użytkownik" @@ -38243,6 +38243,12 @@ msgstr "Twój region" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Zanim przejdziesz dalej, musimy przeprowadzić dodatkową weryfikację anty-spamową Twojej rejestracji." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Nie udało się opublikować udostępniania ekranu za pomocą zgodnego kodeka wideo, dlatego zostało ono zatrzymane. Spróbuj udostępnić ponownie." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Twój niestandardowy adres URL został ustawiony na {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Twój koder wideo przestał kodować klatki, więc udostępnianie ekranu zostało zatrzymane. Spróbuj udostępnić ponownie." 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 03fce338c..9acd69f2d 100644 --- a/fluxer_app/src/features/i18n/locales/pt-BR/messages.po +++ b/fluxer_app/src/features/i18n/locales/pt-BR/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Expandir (# linha)} other {Expandir (# linhas)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Expandir (# linha)} other {Expandir (# linhas)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Expandir mais # dispositivo} other {Expandir mais # dispositivos}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {Em chamada} other {# em chamada}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Entrar na chamada de vídeo (# participante)} other {Entrar na chamada de vídeo (# participantes)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Continuar assistindo a # transmissão e adicionar esta} other {Continuar assistindo a # transmissões e adicionar esta}}" @@ -7466,7 +7466,7 @@ msgstr "Recolher tópico do canal" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Recolher dispositivos" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Controles do codificador de compartilhamento de tela" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Compartilhamento de tela encerrado" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "O redirect_uri fornecido precisa usar HTTP ou HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "A fonte de compartilhamento de tela parou de enviar vídeo, então o seu compartilhamento de tela foi interrompido." @@ -33868,7 +33868,7 @@ msgstr "usuário desconhecido" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Usuário desconhecido" @@ -38243,6 +38243,12 @@ msgstr "sua região" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Seu cadastro precisa de uma verificação antispam extra antes de você continuar." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Seu compartilhamento de tela não pôde ser publicado com um codec de vídeo compatível, por isso foi interrompido. Tente compartilhar novamente." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Seu URL personalizado foi definido como {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Seu codificador de vídeo parou de codificar quadros, então o compartilhamento de tela foi interrompido. Tente compartilhar novamente." diff --git a/fluxer_app/src/features/i18n/locales/ro/messages.po b/fluxer_app/src/features/i18n/locales/ro/messages.po index 6be609916..52fec6bce 100644 --- a/fluxer_app/src/features/i18n/locales/ro/messages.po +++ b/fluxer_app/src/features/i18n/locales/ro/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Extinde (o linie)} other {Extinde (# linii)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Extindeți (# rândul)} other {Extindeți (# rânduri)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Extinde încă un dispozitiv} other {Extinde încă # dispozitive}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {În apel} other {# în apel}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Alăturați-vă apelului video (un participant)} other {Alăturați-vă apelului video (# participanți)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Continuă să urmărești # stream și adaugă-l pe acesta} other {Continuă să urmărești # streamuri și adaugă-l pe acesta}}" @@ -7466,7 +7466,7 @@ msgstr "Restrânge subiectul canalului" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Restrânge dispozitivele" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Controalele codificatorului pentru partajarea ecranului" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Partajarea ecranului s-a încheiat" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "redirect_uri furnizat trebuie să utilizeze HTTP sau HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Sursa partajării ecranului a încetat să trimită video, astfel încât partajarea ecranului s-a oprit." @@ -33868,7 +33868,7 @@ msgstr "utilizator necunoscut" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Utilizator necunoscut" @@ -38243,6 +38243,12 @@ msgstr "regiunea ta" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Înregistrarea ta necesită o verificare anti-spam suplimentară înainte de a putea continua." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Partajarea ecranului dvs. nu a putut fi publicată cu un codec video compatibil, așa că a fost oprită. Încercați să partajați din nou." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Adresa URL personalizată a fost setată la {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Encoderul tău video a încetat să mai encodeze cadre, așa că partajarea ecranului a fost oprită. Încearcă să partajezi din nou." diff --git a/fluxer_app/src/features/i18n/locales/ru/messages.po b/fluxer_app/src/features/i18n/locales/ru/messages.po index 8fda5d98e..fb50e1f77 100644 --- a/fluxer_app/src/features/i18n/locales/ru/messages.po +++ b/fluxer_app/src/features/i18n/locales/ru/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Развернуть (# строка)} few {Раз msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Развернуть (# строку)} other {Развернуть (# строки)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Развернуть ещё # устройство} other {Развернуть ещё # устройства}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {В звонке} few {# в звонке} many {# в msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Присоединиться к видеозвонку (1 участник)} few {Присоединиться к видеозвонку ({count} участника)} many {Присоединиться к видеозвонку ({count} участников)} other {Присоединиться к видеозвонку ({count} участников)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Продолжить смотреть # трансляцию и добавить эту} few {Продолжить смотреть # трансляции и добавить эту} many {Продолжить смотреть # трансляций и добавить эту} other {Продолжить смотреть # трансляций и добавить эту}}" @@ -7466,7 +7466,7 @@ msgstr "Свернуть тему канала" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Свернуть устройства" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Настройки кодека для демонстрации экрана" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Общий доступ к экрану завершен" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Указанный redirect_uri должен использовать HTTP или HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Источник трансляции экрана прекратил передачу видео, поэтому трансляция экрана была остановлена." @@ -33868,7 +33868,7 @@ msgstr "неизвестный пользователь" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Неизвестный пользователь" @@ -38243,6 +38243,12 @@ msgstr "ваш регион" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Чтобы продолжить, нужно пройти дополнительную антиспам-проверку." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Не удалось опубликовать демонстрацию экрана с использованием совместимого видеокодека, поэтому она была остановлена. Попробуйте поделиться снова." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Ваш персонализированный URL-адрес установлен на {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." 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 812d9c7c1..8225c8ad4 100644 --- a/fluxer_app/src/features/i18n/locales/sv-SE/messages.po +++ b/fluxer_app/src/features/i18n/locales/sv-SE/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Visa fler (# rad)} other {Visa fler (# rader)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Visa (# rad)} other {Visa (# rader)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Visa # annan enhet} other {Visa # andra enheter}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {I samtal} other {# i samtal}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Gå med i videosamtal (# deltagare)} other {Gå med i videosamtal (# deltagare)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "Fortsätt titta på {count, plural, one {# stream} other {# streams}} och lägg till den här" @@ -7466,7 +7466,7 @@ msgstr "Fäll ihop kanalämne" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Fäll ihop enheter" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Inställningar för skärmdelningskodare" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Skärmdelningen avslutades" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Den angivna redirect_uri måste använda HTTP eller HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Skärmdelningskällan slutade skicka video, så din skärmdelning har stoppats." @@ -33868,7 +33868,7 @@ msgstr "okänd användare" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Okänd användare" @@ -38243,6 +38243,12 @@ msgstr "din region" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Din registrering behöver en extra antispamkontroll innan du kan fortsätta." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Din skärmdelning kunde inte publiceras med en kompatibel videokodare, så den stoppades. Försök dela igen." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Din anpassade URL har ställts in till {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Din videokodare slutade koda bildrutor, så din skärmdelning stoppades. Försök dela igen." diff --git a/fluxer_app/src/features/i18n/locales/th/messages.po b/fluxer_app/src/features/i18n/locales/th/messages.po index 87a0240ec..5fdfdc9c6 100644 --- a/fluxer_app/src/features/i18n/locales/th/messages.po +++ b/fluxer_app/src/features/i18n/locales/th/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {ขยาย (# บรรทัด)} other {ขย msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {ขยาย (# แถว)} other {ขยาย (# แถว)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {ขยายอุปกรณ์อื่น # เครื่อง} other {ขยายอุปกรณ์อื่น # เครื่อง}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {กำลังคุยสาย} other {# คน msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {เข้าร่วมวิดีโอคอล (# ผู้เข้าร่วม)} other {เข้าร่วมวิดีโอคอล (# ผู้เข้าร่วม)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "ดูสตรีม # {count, plural, one {} other {อื่นๆ }}ต่อไปและเพิ่มสตรีมนี้" @@ -7466,7 +7466,7 @@ msgstr "ยุบหัวข้อช่อง" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "ยุบอุปกรณ์" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "การควบคุมตัวเข้ารหัสสำหรับการแชร์หน้าจอ" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "การแชร์หน้าจอสิ้นสุดลง" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "redirect_uri ที่ระบุต้องใช้ HTTP หรือ HTTPS" #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "แหล่งที่มาของการแชร์หน้าจอหยุดส่งวิดีโอ ดังนั้นการแชร์หน้าจอก็จะหยุดลง" @@ -33868,7 +33868,7 @@ msgstr "ผู้ใช้ไม่ทราบชื่อ" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "ผู้ใช้ไม่รู้จัก" @@ -38243,6 +38243,12 @@ msgstr "ภูมิภาคของคุณ" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "การลงทะเบียนของคุณต้องผ่านการตรวจสอบสแปมเพิ่มเติมก่อนดำเนินการต่อ" +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "การแชร์หน้าจอของคุณไม่สามารถเผยแพร่ด้วยตัวแปลงสัญญาณวิดีโอที่เข้ากันได้ จึงถูกหยุดลง ลองแชร์อีกครั้ง" + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "URL ที่กำหนดเองของคุณถูกตั้งค่าเป็น {inviteEndpoint}/{vanitySlug} แล้ว" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "ตัวเข้ารหัสวิดีโอของคุณหยุดการเข้ารหัสเฟรม จึงหยุดการแชร์หน้าจอของคุณแล้ว ลองแชร์อีกครั้ง" diff --git a/fluxer_app/src/features/i18n/locales/tr/messages.po b/fluxer_app/src/features/i18n/locales/tr/messages.po index 955f54d06..c74482540 100644 --- a/fluxer_app/src/features/i18n/locales/tr/messages.po +++ b/fluxer_app/src/features/i18n/locales/tr/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Genişlet (# satır)} other {Genişlet (# satır)}} msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {(# satırı göster)} other {(# satırları göster)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Diğer cihazı genişlet} other {Diğer {count} cihazı genişlet}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {Aramada} other {# aramada}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Görüntülü aramaya katıl (1 katılımcı)} other {Görüntülü aramaya katıl (# katılımcı)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {# akışı izlemeye devam et ve bunu ekle} other {# akışı izlemeye devam et ve bunu ekle}}" @@ -7466,7 +7466,7 @@ msgstr "Kanal konusunu daralt" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Cihazları daralt" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Ekran paylaşımı kodlayıcı ayarları" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Ekran paylaşımı sona erdi" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Sağlanan redirect_uri HTTP veya HTTPS kullanmalıdır." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Ekran paylaşımı kaynağı video göndermeyi durdurdu, bu nedenle ekran paylaşımınız durduruldu." @@ -33868,7 +33868,7 @@ msgstr "Bilinmeyen kullanıcı" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Bilinmeyen kullanıcı" @@ -38243,6 +38243,12 @@ msgstr "Bölgeniz" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Devam etmeden önce kaydınızın ek bir anti-spam kontrolünden geçmesi gerekiyor." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Ekran paylaşımınız uyumlu bir video kodeğiyle yayınlanamadı, bu nedenle durduruldu. Tekrar paylaşmayı deneyin." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Özel URL'niz {inviteEndpoint}/{vanitySlug} olarak ayarlandı" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Video kodlayıcınız kare kodlamayı durdurduğu için ekran paylaşımınız durduruldu. Lütfen tekrar paylaşmayı deneyin." diff --git a/fluxer_app/src/features/i18n/locales/uk/messages.po b/fluxer_app/src/features/i18n/locales/uk/messages.po index 3dc4f5265..d21574d55 100644 --- a/fluxer_app/src/features/i18n/locales/uk/messages.po +++ b/fluxer_app/src/features/i18n/locales/uk/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Розгорнути (# рядок)} few {Розг msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Розгорнути (# рядок)} other {Розгорнути (# рядки)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Розгорнути ще # пристрій} few {Розгорнути ще # пристрої} many {Розгорнути ще # пристроїв} other {Розгорнути ще # пристроїв}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {У дзвінку} other {# у дзвінку}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Приєднатися до відеодзвінка (# учасник)} few {Приєднатися до відеодзвінка (# учасники)} many {Приєднатися до відеодзвінка (# учасників)} other {Приєднатися до відеодзвінка (# учасників)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Продовжуйте дивитися # трансляцію та додайте цю} other {Продовжуйте дивитися # трансляції та додайте цю}}" @@ -7466,7 +7466,7 @@ msgstr "Згорнути тему каналу" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Згорнути пристрої" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Керування налаштуваннями кодека для демонстрації екрана" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Трансляцію екрана завершено" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "Наданий redirect_uri має використовувати HTTP або HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Джерело спільного доступу до екрана припинило надсилання відео, тому спільний доступ до вашого екрана було зупинено." @@ -33868,7 +33868,7 @@ msgstr "невідомий користувач" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Невідомий користувач" @@ -38243,6 +38243,12 @@ msgstr "ваш регіон" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Щоб продовжити, потрібно пройти додаткову перевірку на спам." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Не вдалося опублікувати трансляцію екрана з сумісним відеокодеком, тому її було зупинено. Спробуйте поділитися знову." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "Вашу спеціальну URL-адресу встановлено на {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Ваш відеокодер перестав кодувати кадри, тому спільний доступ до екрана було зупинено. Спробуйте поділитися знову." diff --git a/fluxer_app/src/features/i18n/locales/vi/messages.po b/fluxer_app/src/features/i18n/locales/vi/messages.po index 238860f7e..6f983defc 100644 --- a/fluxer_app/src/features/i18n/locales/vi/messages.po +++ b/fluxer_app/src/features/i18n/locales/vi/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {Mở rộng (# dòng)} other {Mở rộng (# dòng) msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {Mở rộng (# hàng)} other {Mở rộng (# hàng)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {Mở rộng # thiết bị khác} other {Mở rộng # thiết bị khác}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {Đang gọi} other {# người đang gọi}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {Tham gia cuộc gọi video (# người tham gia)} other {Tham gia cuộc gọi video (# người tham gia)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {Tiếp tục xem # luồng và thêm luồng này} other {Tiếp tục xem # luồng và thêm luồng này}}" @@ -7466,7 +7466,7 @@ msgstr "Thu gọn chủ đề kênh" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "Thu gọn thiết bị" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "Điều khiển bộ mã hóa chia sẻ màn hình" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "Chia sẻ màn hình đã kết thúc" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "redirect_uri được cung cấp phải dùng HTTP hoặc HTTPS." #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "Nguồn chia sẻ màn hình đã ngừng gửi video, vì vậy quá trình chia sẻ màn hình của bạn đã dừng." @@ -33868,7 +33868,7 @@ msgstr "người dùng không xác định" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "Người dùng không xác định" @@ -38243,6 +38243,12 @@ msgstr "khu vực của bạn" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "Đăng ký của bạn cần một bước kiểm tra chống spam bổ sung trước khi tiếp tục." +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "Không thể xuất sẻ màn hình của bạn với codec video tương thích, vì vậy chúng tôi đã dừng sẻ màn hình. Hãy thử sẻ lại." + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "URL tùy chỉnh của bạn đã được đặt thành {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "Bộ mã hóa video của bạn đã ngừng mã hóa khung hình, vì vậy lượt chia sẻ màn hình của bạn đã bị dừng. Hãy thử chia sẻ lại." 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 4b235185b..4d24c669b 100644 --- a/fluxer_app/src/features/i18n/locales/zh-CN/messages.po +++ b/fluxer_app/src/features/i18n/locales/zh-CN/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {展开(# 行)} other {展开(# 行)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {展开(# 行)} other {展开(# 行)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {展开其他设备} other {展开其他设备}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {通话中} other {# 人正在通话}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {加入视频通话(#位参与者)} other {加入视频通话(#位参与者)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {继续观看 # 个直播并添加此直播} other {继续观看 # 个直播并添加此直播}}" @@ -7466,7 +7466,7 @@ msgstr "收起频道话题" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "收起设备" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "屏幕共享编码器设置" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "屏幕共享已结束" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "提供的 redirect_uri 必须使用 HTTP 或 HTTPS。" #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "屏幕共享源已停止发送视频,因此您的屏幕共享已停止。" @@ -33868,7 +33868,7 @@ msgstr "未知用户" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "未知用户" @@ -38243,6 +38243,12 @@ msgstr "你的地区" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "为防止垃圾信息,你需要先完成一项额外的安全验证,然后才能继续。" +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "由于无法使用兼容的视频编解码器发布您的屏幕共享,因此已停止共享。请重试。" + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "你的专属网址已设置为 {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." 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 34a7e8951..155f289d6 100644 --- a/fluxer_app/src/features/i18n/locales/zh-TW/messages.po +++ b/fluxer_app/src/features/i18n/locales/zh-TW/messages.po @@ -450,7 +450,7 @@ msgstr "{count, plural, one {展開(# 行)} other {展開(# 行)}}" msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}" msgstr "{count, plural, one {展開 (# 列)} other {展開 (# 列)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:310 +#: src/features/voice/components/VoiceParticipantTile.tsx:311 msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}" msgstr "{count, plural, one {展開其他 {count} 個裝置} other {展開其他 {count} 個裝置}}" @@ -471,7 +471,7 @@ msgstr "{count, plural, one {通話中} other {# 人通話中}}" msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}" msgstr "{count, plural, one {加入視訊通話(#位參與者)} other {加入視訊通話(#位參與者)}}" -#: src/features/voice/components/VoiceParticipantTile.tsx:630 +#: src/features/voice/components/VoiceParticipantTile.tsx:637 msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}" msgstr "{count, plural, one {繼續觀看 # 個直播並新增這個} other {繼續觀看 # 個直播並新增這個}}" @@ -7466,7 +7466,7 @@ msgstr "收合頻道主題" #. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user. #. Voice menu action that collapses expanded device tiles back into a single tile. #: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122 -#: src/features/voice/components/VoiceParticipantTile.tsx:172 +#: src/features/voice/components/VoiceParticipantTile.tsx:173 msgid "Collapse devices" msgstr "收合裝置" @@ -26996,7 +26996,7 @@ msgid "Screen share encoder controls" msgstr "螢幕分享編碼器控制項" #. Title of a modal shown when an active screen share stops unexpectedly. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:99 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:100 msgctxt "screen-share" msgid "Screen share ended" msgstr "螢幕分享已結束" @@ -31585,7 +31585,7 @@ msgid "The provided redirect_uri must use HTTP or HTTPS." msgstr "提供的 redirect_uri 必須使用 HTTP 或 HTTPS。" #. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:104 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:105 msgctxt "screen-share" msgid "The screen share source stopped sending video, so your screen share was stopped." msgstr "螢幕分享來源已停止傳送視訊,因此您的螢幕分享已停止。" @@ -33868,7 +33868,7 @@ msgstr "不明使用者" #: src/features/devtools/utils/CommandUtils.ts:27 #: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114 #: src/features/voice/components/VoiceParticipantAvatarList.tsx:44 -#: src/features/voice/components/VoiceParticipantTile.tsx:168 +#: src/features/voice/components/VoiceParticipantTile.tsx:169 #: src/features/webhook/components/WebhookListItem.tsx:30 msgid "Unknown user" msgstr "不明使用者" @@ -38243,6 +38243,12 @@ msgstr "你的地區" msgid "Your registration needs an extra anti-spam check before you can continue." msgstr "您的註冊需要額外的防垃圾訊息驗證,才能繼續。" +#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop. +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:111 +msgctxt "screen-share" +msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again." +msgstr "由於無法使用相容的視訊轉碼器發布您的螢幕畫面,因此已停止分享。請再試一次。" + #. Subtitle under the preview-paused overlay reassuring the user that the screen share is still live for others. #: src/features/voice/components/voice_participant_tile/shared.ts:66 msgid "Your stream is still live" @@ -38322,7 +38328,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}" msgstr "您的自訂網址已設為 {inviteEndpoint}/{vanitySlug}" #. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop. -#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:110 +#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:118 msgctxt "screen-share" msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again." msgstr "您的視訊編碼器停止編碼影格,因此您的螢幕分享已停止。請再試一次分享。" diff --git a/fluxer_app/src/features/voice/engine/ScreenShareCodecNegotiation.ts b/fluxer_app/src/features/voice/engine/ScreenShareCodecNegotiation.ts index d672f9740..463cdebb6 100644 --- a/fluxer_app/src/features/voice/engine/ScreenShareCodecNegotiation.ts +++ b/fluxer_app/src/features/voice/engine/ScreenShareCodecNegotiation.ts @@ -7,6 +7,7 @@ import { type CodecPreference, type CodecSupportInfo, getCodecCapabilityReport, + isVideoCodecAllowedForPublish, resolveEffectiveScreenShareEncoderMode, type ScreenShareEncoderMode, selectNativeScreenCaptureScreenShareCodec, @@ -184,12 +185,7 @@ export function getScreenShareCodecPreferenceOrder( encoderMode === 'software' ? SOFTWARE_CODEC_PREFERENCE : getHardwareFirstScreenShareCodecPreferenceOrder(); const order = preference !== 'auto' ? [preference, ...automaticOrder.filter((codec) => codec !== preference)] : automaticOrder; - const filtered = order.filter( - (codec) => - (codec !== 'av1' || VoiceSettings.getScreenShareAv1OptIn()) && - (codec !== 'h265' || VoiceSettings.getScreenShareHevcOptIn()), - ); - return filtered; + return order.filter((codec) => isVideoCodecAllowedForPublish(codec)); } function getHardwareFirstScreenShareCodecPreferenceOrder(): ReadonlyArray { @@ -209,14 +205,15 @@ function getLocalEncodeCapabilities(): Record { (codec) => report[codec].supported && report[codec].hardwareAccelerated === 'hardware', ); const advertise = (codec: VideoCodec): boolean => - (pinned === codec && report[codec].supported) || - shouldAdvertiseVideoEncode(codec, report[codec], encoderMode, hardwareEncodeAvailable, report); + isVideoCodecAllowedForPublish(codec) && + ((pinned === codec && report[codec].supported) || + shouldAdvertiseVideoEncode(codec, report[codec], encoderMode, hardwareEncodeAvailable, report)); return { av1: advertise('av1'), h265: advertise('h265'), h264: advertise('h264'), vp9: advertise('vp9'), - vp8: report.vp8.supported, + vp8: report.vp8.supported && isVideoCodecAllowedForPublish('vp8'), }; } diff --git a/fluxer_app/src/features/voice/engine/VoiceScreenShareStateMachine.test.ts b/fluxer_app/src/features/voice/engine/VoiceScreenShareStateMachine.test.ts index 93ba0c93a..f85f0b5c2 100644 --- a/fluxer_app/src/features/voice/engine/VoiceScreenShareStateMachine.test.ts +++ b/fluxer_app/src/features/voice/engine/VoiceScreenShareStateMachine.test.ts @@ -124,6 +124,23 @@ describe('VoiceScreenShareStateMachine', () => { expect(snapshot.context.publicationReplaceInFlight).toBe(false); }); + it('lets a pending start or restore raise and drop the replace lock around a codec correction', () => { + let snapshot = createVoiceScreenShareSnapshot(); + snapshot = transitionVoiceScreenShareSnapshot(snapshot, {type: 'share.publicationReplace.set', inFlight: true}); + expect(snapshot.context.publicationReplaceInFlight).toBe(false); + snapshot = transitionVoiceScreenShareSnapshot(snapshot, {type: 'share.start', sourceType: 'display'}); + snapshot = transitionVoiceScreenShareSnapshot(snapshot, {type: 'share.publicationReplace.set', inFlight: true}); + expect(getVoiceScreenShareStateValue(snapshot)).toBe('pending'); + expect(snapshot.context.pendingOperation).toBe('starting'); + expect(snapshot.context.publicationReplaceInFlight).toBe(true); + snapshot = transitionVoiceScreenShareSnapshot(snapshot, {type: 'share.publicationReplace.set', inFlight: false}); + expect(snapshot.context.publicationReplaceInFlight).toBe(false); + snapshot = transitionVoiceScreenShareSnapshot(snapshot, {type: 'share.publicationReplace.set', inFlight: true}); + snapshot = resolveActive(snapshot); + expect(getVoiceScreenShareStateValue(snapshot)).toBe('active'); + expect(snapshot.context.publicationReplaceInFlight).toBe(false); + }); + it('tracks codec readiness through the xstate context while starting', () => { let snapshot = createVoiceScreenShareSnapshot(); expect(snapshot.context.codecReadiness).toBe('idle'); diff --git a/fluxer_app/src/features/voice/engine/VoiceScreenShareStateMachine.ts b/fluxer_app/src/features/voice/engine/VoiceScreenShareStateMachine.ts index 3de3f48e9..ecb78add7 100644 --- a/fluxer_app/src/features/voice/engine/VoiceScreenShareStateMachine.ts +++ b/fluxer_app/src/features/voice/engine/VoiceScreenShareStateMachine.ts @@ -59,6 +59,7 @@ export type VoiceScreenShareEvent = | {type: 'share.codecReadiness.timeout'} | {type: 'share.codecReadiness.reset'} | {type: 'share.streamingPriority.set'; active: boolean} + | {type: 'share.publicationReplace.set'; inFlight: boolean} | {type: 'share.queuedStop.clear'} | { type: 'share.localWatcher.sync'; @@ -261,6 +262,11 @@ export const voiceScreenShareStateMachine = setup({ setStreamingPriority: assign(({context, event}) => event.type === 'share.streamingPriority.set' ? {...context, streamingPriorityHeld: event.active} : context, ), + setPublicationReplaceInFlight: assign(({context, event}) => + event.type === 'share.publicationReplace.set' && context.pendingOperation + ? {...context, publicationReplaceInFlight: event.inFlight} + : context, + ), clearQueuedStop: assign(({context}) => context.queuedStopRequest ? {...context, queuedStopRequest: null} : context, ), @@ -306,6 +312,7 @@ export const voiceScreenShareStateMachine = setup({ 'share.encoderVerification.scheduled': {target: 'routing', actions: 'scheduleEncoderVerification'}, 'share.encoderVerification.cleared': {target: 'routing', actions: 'clearEncoderVerification'}, 'share.streamingPriority.set': {target: 'routing', actions: 'setStreamingPriority'}, + 'share.publicationReplace.set': {target: 'routing', actions: 'setPublicationReplaceInFlight'}, 'share.queuedStop.clear': {target: 'routing', actions: 'clearQueuedStop'}, 'share.localWatcher.sync': {target: 'routing', actions: 'syncLocalWatcher'}, 'share.clearWatchCommands': {actions: 'clearWatchCommands'}, @@ -326,6 +333,7 @@ export const voiceScreenShareStateMachine = setup({ 'share.encoderVerification.scheduled': {target: 'routing', actions: 'scheduleEncoderVerification'}, 'share.encoderVerification.cleared': {target: 'routing', actions: 'clearEncoderVerification'}, 'share.streamingPriority.set': {target: 'routing', actions: 'setStreamingPriority'}, + 'share.publicationReplace.set': {target: 'routing', actions: 'setPublicationReplaceInFlight'}, 'share.queuedStop.clear': {target: 'routing', actions: 'clearQueuedStop'}, 'share.localWatcher.sync': {target: 'routing', actions: 'syncLocalWatcher'}, 'share.clearWatchCommands': {actions: 'clearWatchCommands'}, @@ -346,6 +354,7 @@ export const voiceScreenShareStateMachine = setup({ 'share.encoderVerification.scheduled': {actions: 'scheduleEncoderVerification'}, 'share.encoderVerification.cleared': {actions: 'clearEncoderVerification'}, 'share.streamingPriority.set': {actions: 'setStreamingPriority'}, + 'share.publicationReplace.set': {actions: 'setPublicationReplaceInFlight'}, 'share.queuedStop.clear': {actions: 'clearQueuedStop'}, 'share.localWatcher.sync': {actions: 'syncLocalWatcher'}, 'share.clearWatchCommands': {actions: 'clearWatchCommands'}, diff --git a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppConnectionHostAdapter.ts b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppConnectionHostAdapter.ts index c0347e51b..d9e9b455a 100644 --- a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppConnectionHostAdapter.ts +++ b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppConnectionHostAdapter.ts @@ -38,6 +38,10 @@ import { } from '@app/features/voice/engine/v2/VoiceEngineV2AppAdapterAssertions'; import {VoiceEngineV2AppReconnectPolicy} from '@app/features/voice/engine/v2/VoiceEngineV2AppReconnectPolicy'; import VoiceRegionTeleport from '@app/features/voice/state/VoiceRegionTeleport'; +import { + findVideoPublishCodecPolicyViolation, + getRoomVideoPublishDefaults, +} from '@app/features/voice/utils/CodecCapabilityDetector'; import {SCREEN_SHARE_MAX_VIDEO_BITRATE_BPS} from '@app/features/voice/utils/ScreenShareOptions'; import { getVideoDecoderExclusionsSync, @@ -140,9 +144,12 @@ function createWebAudioMixOption(): RoomOptions['webAudioMix'] { return true; } -const ROOM_PUBLISH_DEFAULTS: RoomOptions['publishDefaults'] = { - screenShareEncoding: {maxBitrate: SCREEN_SHARE_MAX_VIDEO_BITRATE_BPS, maxFramerate: 30, priority: 'high'}, -}; +function createRoomPublishDefaults(): RoomOptions['publishDefaults'] { + return { + screenShareEncoding: {maxBitrate: SCREEN_SHARE_MAX_VIDEO_BITRATE_BPS, maxFramerate: 30, priority: 'high'}, + ...getRoomVideoPublishDefaults(), + }; +} function createRoomOptions( e2eeKey: string | null, @@ -156,7 +163,7 @@ function createRoomOptions( adaptiveStream: false, dynacast: true, webAudioMix: createWebAudioMixOption(), - publishDefaults: ROOM_PUBLISH_DEFAULTS, + publishDefaults: createRoomPublishDefaults(), subscriberVideoCodecExclusions, }; let e2eeKeyProvider: ExternalE2EEKeyProvider | null = null; @@ -681,7 +688,7 @@ export class VoiceEngineV2AppConnectionHostAdapter extends Store { adaptiveStream: false, dynacast: true, webAudioMix: createWebAudioMixOption(), - publishDefaults: ROOM_PUBLISH_DEFAULTS, + publishDefaults: createRoomPublishDefaults(), subscriberVideoCodecExclusions: cachedExclusions && cachedExclusions.length > 0 ? cachedExclusions : undefined, }; if (!this.isLatestConnectionAttempt(attemptId) || this.connectionState.room !== existingRoom) { @@ -804,6 +811,7 @@ export class VoiceEngineV2AppConnectionHostAdapter extends Store { Array.from(oldParticipant.trackPublications.values()), ); const errors: Array<{source: string; error: unknown}> = []; + let codecPolicyFailure: Error | null = null; for (const publication of publications) { const track = publication.track as LocalTrack | undefined; if (!isReadyToRepublishTrack(track)) { @@ -823,7 +831,16 @@ export class VoiceEngineV2AppConnectionHostAdapter extends Store { source: publication.source, name: publication.trackName, }; - await newParticipant.publishTrack(track.mediaStreamTrack, publishOptions); + const republished = await newParticipant.publishTrack(track.mediaStreamTrack, publishOptions); + const violation = publishOptions.videoCodec + ? findVideoPublishCodecPolicyViolation(publishOptions.videoCodec, republished.options?.videoCodec) + : null; + if (violation) { + codecPolicyFailure = new Error( + `Region hot-swap: ${publication.source} negotiated ${violation.negotiated} after requesting ${violation.requested}`, + ); + break; + } } catch (error) { errors.push({source: publication.source ?? 'unknown', error}); logger.warn('Region hot-swap: failed to republish track', { @@ -832,6 +849,7 @@ export class VoiceEngineV2AppConnectionHostAdapter extends Store { }); } } + if (codecPolicyFailure) throw codecPolicyFailure; const screenShareFailure = errors.find( (error) => error.source === Track.Source.ScreenShare || error.source === Track.Source.ScreenShareAudio, ); diff --git a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMediaExecutionAdapter.tsx b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMediaExecutionAdapter.tsx index 2b807a642..0be392a3e 100644 --- a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMediaExecutionAdapter.tsx +++ b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppMediaExecutionAdapter.tsx @@ -98,6 +98,10 @@ import LocalVoiceState from '@app/features/voice/state/LocalVoiceState'; import ParticipantVolume from '@app/features/voice/state/ParticipantVolume'; import VoiceSettings from '@app/features/voice/state/VoiceSettings'; import {buildMicrophonePublishOptions} from '@app/features/voice/utils/AudioPublishOptions'; +import { + buildCameraPublishOptions, + findVideoPublishCodecPolicyViolation, +} from '@app/features/voice/utils/CodecCapabilityDetector'; import {applyBackgroundProcessor, clearCameraVideoProcessor} from '@app/features/voice/utils/VideoBackgroundProcessor'; import { removeVoiceInputProcessor, @@ -126,11 +130,13 @@ import type { LocalVideoTrack, Room, TrackPublishOptions, + VideoCaptureOptions, } from 'livekit-client'; import {Track} 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; @@ -1141,8 +1147,17 @@ export class VoiceEngineV2AppMediaExecutionAdapter extends Store { await clearCameraVideoProcessor(cameraTrack); } } - const captureDimensions = getCameraCaptureDimensions(VoiceSettings.getCameraResolution()); - await participant.setCameraEnabled(enabled, {resolution: captureDimensions, ...restOptions}); + const captureOptions: VideoCaptureOptions = { + resolution: getCameraCaptureDimensions(VoiceSettings.getCameraResolution()), + ...restOptions, + }; + if (enabled) { + const publishOptions = buildCameraPublishOptions(); + await participant.setCameraEnabled(true, captureOptions, publishOptions); + await this.enforceCameraPublishCodecPolicy(participant, publishOptions); + } else { + await participant.setCameraEnabled(false, captureOptions); + } await this.enforceCameraPublicationCap(participant, enabled ? 'after camera enable' : 'after camera disable'); if (enabled) { await this.applyBackgroundToCamera(participant); @@ -1156,6 +1171,31 @@ export class VoiceEngineV2AppMediaExecutionAdapter extends Store { } } + private async enforceCameraPublishCodecPolicy( + participant: Room['localParticipant'], + initialPublishOptions: TrackPublishOptions, + ): Promise { + let publishOptions = initialPublishOptions; + for (let corrections = 0; ; corrections++) { + const publication = getLocalCameraPublications(participant)[0]; + const track = publication?.videoTrack as LocalVideoTrack | undefined; + const requested = publishOptions.videoCodec; + if (!publication || !track || !requested) return; + const violation = findVideoPublishCodecPolicyViolation(requested, publication.options?.videoCodec ?? track.codec); + if (!violation) return; + logger.warn('Camera published a codec outside the publish policy', {...violation, corrections}); + if (corrections >= CAMERA_PUBLISH_CODEC_CORRECTION_MAX || !violation.alternative) { + await participant.setCameraEnabled(false); + throw new Error( + `camera negotiated ${violation.negotiated} after requesting ${violation.requested}; no allowed codec could be published`, + ); + } + await participant.unpublishTrack(track, false); + publishOptions = buildCameraPublishOptions(violation.alternative); + await participant.publishTrack(track, {...publishOptions, source: Track.Source.Camera}); + } + } + private async enforceCameraPublicationCap(participant: Room['localParticipant'], reason: string): Promise { const result = await enforceLocalMediaPublicationCap(participant, 'camera'); for (const failure of result.failedPublications) { diff --git a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx index 3ac83dbe2..4efba2c53 100644 --- a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx +++ b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx @@ -65,8 +65,9 @@ import { SCREEN_SHARE_AUDIO_PUBLISH_OPTIONS, } from '@app/features/voice/utils/AudioPublishOptions'; import { - markScreenShareCodecEncodeRuntimeFailure, + resolveScreenShareEncoderVerificationAction, type ScreenShareContentSource, + type ScreenShareEncoderVerificationAction, } from '@app/features/voice/utils/CodecCapabilityDetector'; import {disarmVirtmic} from '@app/features/voice/utils/LinuxScreenShareAudio'; import { @@ -107,6 +108,13 @@ const SCREEN_SHARE_SOURCE_STOPPED_DESCRIPTOR = msg({ 'Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.', context: 'screen-share', }); +const SCREEN_SHARE_CODEC_POLICY_FAILED_DESCRIPTOR = msg({ + message: + 'Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again.', + comment: + 'Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.', + context: 'screen-share', +}); const SCREEN_SHARE_ENCODER_FAILED_DESCRIPTOR = msg({ message: 'Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again.', comment: @@ -127,6 +135,7 @@ export interface ScreenShareReconnectSnapshot { } const selectScreenShareSetEnabledOptions = selectVoiceEngineV2AppScreenShareSetEnabledOptions; +const SCREEN_SHARE_VERIFIED_CODEC_CORRECTION_MAX = 1; class VoiceEngineV2AppScreenShareExecutionAdapter extends Store { private readonly lifecycle: VoiceScreenShareLifecycleStore; @@ -134,6 +143,7 @@ class VoiceEngineV2AppScreenShareExecutionAdapter extends Store { private activeScreenShareEndListener: (() => void) | null = null; private endedScreenShareStopInFlight: Promise | null = null; encoderVerificationTimer: NodeJS.Timeout | null = null; + private readonly verifiedCodecCorrectionsByTrack = new WeakMap(); sourceLifecycleBridge: VoiceEngineV2AppSourceLifecycleBridge | null = null; readonly liveKitFlows: VoiceEngineV2AppScreenShareLiveKitFlows; @@ -420,7 +430,24 @@ class VoiceEngineV2AppScreenShareExecutionAdapter extends Store { const recovered = await this.liveKitFlows.republishActiveShareWithCodec(room, track, codec); if (recovered) return; } - this.stopScreenShareAfterEncoderFailure(room, participant, track, failedCodec); + this.stopScreenShareAfterEncoderFailure(room, participant, track, failedCodec, 'stalled'); + } + + private async correctVerifiedScreenShareCodec( + room: Room | null, + participant: LocalParticipant, + track: LocalVideoTrack, + action: Extract, + ): Promise { + if (!this.isScreenShareTrackPublishedInternal(participant, track)) return; + const mediaStreamTrack = track.mediaStreamTrack; + const corrections = this.verifiedCodecCorrectionsByTrack.get(mediaStreamTrack) ?? 0; + if (corrections < SCREEN_SHARE_VERIFIED_CODEC_CORRECTION_MAX && action.alternative) { + this.verifiedCodecCorrectionsByTrack.set(mediaStreamTrack, corrections + 1); + const recovered = await this.liveKitFlows.republishActiveShareWithCodec(room, track, action.alternative); + if (recovered) return; + } + this.stopScreenShareAfterEncoderFailure(room, participant, track, action.requested, 'codec-policy'); } private stopScreenShareAfterEncoderFailure( @@ -428,11 +455,22 @@ class VoiceEngineV2AppScreenShareExecutionAdapter extends Store { participant: LocalParticipant, track: LocalVideoTrack, codec: VideoCodec, + cause: 'stalled' | 'codec-policy', ): void { - logger.error('Screen share encoder produced no frames and no other codec took over; disabling screen share', { - codec, - }); - this.showScreenShareEndedModalInternal(i18n._(SCREEN_SHARE_ENCODER_FAILED_DESCRIPTOR)); + if (cause === 'stalled') { + logger.error('Screen share encoder produced no frames and no other codec took over; disabling screen share', { + codec, + }); + } else { + logger.error('Screen share kept publishing a codec outside the publish policy; disabling screen share', { + codec, + }); + } + this.showScreenShareEndedModalInternal( + i18n._( + cause === 'stalled' ? SCREEN_SHARE_ENCODER_FAILED_DESCRIPTOR : SCREEN_SHARE_CODEC_POLICY_FAILED_DESCRIPTOR, + ), + ); if (this.endedScreenShareStopInFlight) return; if (!this.isScreenShareTrackPublishedInternal(participant, track)) return; this.transitionScreenShareLifecycleInternal({type: 'share.endedStop.start'}); @@ -468,19 +506,44 @@ class VoiceEngineV2AppScreenShareExecutionAdapter extends Store { () => sender.getStats(), codec, (failure) => { - const failureReason = - failure.reason === 'codec-mismatch' ? 'screen-share-codec-mismatch' : 'screen-share-encode-stalled'; - markScreenShareCodecEncodeRuntimeFailure(failure.codec, failureReason); - logger.warn('Screen share encoder verification failed', {codec: failure.codec, failureReason}); - if (failure.reason !== 'stalled') return; - void this.recoverActiveScreenShareAfterEncoderFailure(room, participant, track, failure.codec).catch( - (error) => { - logger.warn('Failed to recover screen share after encoder verification failure', { - error, - codec: failure.codec, + const action = resolveScreenShareEncoderVerificationAction(failure); + switch (action.kind) { + case 'ignore-repeated-stall': + return; + case 'recover-stalled': + logger.warn('Screen share encoder verification failed', { + codec: action.codec, + failureReason: 'screen-share-encode-stalled', }); - }, - ); + void this.recoverActiveScreenShareAfterEncoderFailure(room, participant, track, action.codec).catch( + (error) => { + logger.warn('Failed to recover screen share after encoder verification failure', { + error, + codec: action.codec, + }); + }, + ); + return; + case 'accept-negotiated': + logger.info('Screen share publisher negotiated a different codec inside the publish policy', { + requested: action.requested, + negotiated: action.negotiated, + }); + return; + case 'correct-negotiated': + logger.warn('Screen share is sending a codec outside the publish policy', { + requested: action.requested, + negotiated: action.negotiated, + alternative: action.alternative, + }); + void this.correctVerifiedScreenShareCodec(room, participant, track, action).catch((error) => { + logger.warn('Failed to correct screen share codec after encoder verification', { + error, + requested: action.requested, + }); + }); + return; + } }, ); this.trackPlumbing.bindKeyFrameRequests(room, participant, track); diff --git a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppScreenShareLiveKitFlows.ts b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppScreenShareLiveKitFlows.ts index 4ed92dcb9..826b467d6 100644 --- a/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppScreenShareLiveKitFlows.ts +++ b/fluxer_app/src/features/voice/engine/v2/VoiceEngineV2AppScreenShareLiveKitFlows.ts @@ -53,7 +53,11 @@ import { prepareHighFidelityScreenShareAudioTrack, SCREEN_SHARE_AUDIO_PUBLISH_OPTIONS, } from '@app/features/voice/utils/AudioPublishOptions'; -import type {ScreenShareContentSource} from '@app/features/voice/utils/CodecCapabilityDetector'; +import { + findVideoPublishCodecPolicyViolation, + type ScreenShareContentSource, + type VideoPublishCodecPolicyViolation, +} from '@app/features/voice/utils/CodecCapabilityDetector'; import {commitNativeAudioBridgeReplacement} from '@app/features/voice/utils/NativeAudioCaptureBridge'; import {ScreenShareAudioCaptureError} from '@app/features/voice/utils/ScreenShareAudioCaptureError'; import {ScreenShareRollbackIncompleteError} from '@app/features/voice/utils/ScreenShareRollbackIncompleteError'; @@ -88,6 +92,24 @@ function isUserCancelledOrPermissionDeniedError(error: unknown): boolean { } const COMMITTED_PUBLICATION_INVARIANT_ATTEMPTS = 2; +const SCREEN_SHARE_PUBLISH_CODEC_CORRECTION_MAX = 1; + +export class ScreenSharePublishCodecPolicyError extends Error { + readonly violation: VideoPublishCodecPolicyViolation; + + constructor(violation: VideoPublishCodecPolicyViolation) { + super( + `screen share negotiated ${violation.negotiated} after requesting ${violation.requested}; no allowed codec could be published`, + ); + this.name = 'ScreenSharePublishCodecPolicyError'; + this.violation = violation; + } +} + +interface EnforcedScreenSharePublish { + effectivePublishOptions: TrackPublishOptions | undefined; + track: LocalVideoTrack | undefined; +} interface ScreenShareReplacementSnapshot { videoTrack: MediaStreamTrack; @@ -332,8 +354,11 @@ export class VoiceEngineV2AppScreenShareLiveKitFlows { ); if (enabled) this.adapter.setStreamingPriorityInternal(true); try { - const effectivePublishOptions = await this.adapter.getEffectivePublishOptionsInternal(enabled, publishOptions); - await participant.setScreenShareEnabled(enabled, restOptions, effectivePublishOptions); + const requestedPublishOptions = await this.adapter.getEffectivePublishOptionsInternal(enabled, publishOptions); + await participant.setScreenShareEnabled(enabled, restOptions, requestedPublishOptions); + const effectivePublishOptions = enabled + ? (await this.enforcePublishCodecPolicy(participant, requestedPublishOptions)).effectivePublishOptions + : requestedPublishOptions; await this.finalizeSetEnabledSuccess( room, participant, @@ -386,23 +411,73 @@ export class VoiceEngineV2AppScreenShareLiveKitFlows { participant: LocalParticipant, videoTrack: LocalVideoTrack, audioTrack: LocalAudioTrack | undefined, - effectivePublishOptions: TrackPublishOptions | undefined, + requestedPublishOptions: TrackPublishOptions | undefined, publishedTracks: Array, - ): Promise { + ): Promise { assert.ok(participant); assert.ok(videoTrack); await participant.publishTrack(videoTrack, { - ...effectivePublishOptions, + ...requestedPublishOptions, source: Track.Source.ScreenShare, stream: VoiceTrackSource.ScreenShare, }); publishedTracks.push(videoTrack); + const enforced = await this.enforcePublishCodecPolicy(participant, requestedPublishOptions); + if (enforced.track && enforced.track !== videoTrack) { + publishedTracks.splice(publishedTracks.indexOf(videoTrack), 1, enforced.track); + } if (audioTrack) { prepareHighFidelityScreenShareAudioTrack(audioTrack.mediaStreamTrack); await participant.publishTrack(audioTrack, SCREEN_SHARE_AUDIO_PUBLISH_OPTIONS); publishedTracks.push(audioTrack); } await enforceLocalMediaPublicationCap(participant, VoiceTrackSource.ScreenShare); + return enforced.effectivePublishOptions; + } + + private async enforcePublishCodecPolicy( + participant: LocalParticipant, + requestedPublishOptions: TrackPublishOptions | undefined, + ): Promise { + let effectivePublishOptions = requestedPublishOptions; + for (let corrections = 0; ; corrections++) { + const publication = getLocalScreenShareVideoPublications(participant)[0]; + const track = (publication?.videoTrack ?? publication?.track) as LocalVideoTrack | undefined; + const requested = effectivePublishOptions?.videoCodec; + if (!publication || !track || !requested) return {effectivePublishOptions, track}; + const violation = findVideoPublishCodecPolicyViolation(requested, publication.options?.videoCodec ?? track.codec); + if (!violation) return {effectivePublishOptions, track}; + logger.warn('Screen share published a codec outside the publish policy', {...violation, corrections}); + const mediaStreamTrack = track.mediaStreamTrack; + const replaceAlreadyInFlight = this.adapter.isScreenSharePublicationReplaceInFlight(); + this.adapter.transitionScreenShareLifecycleInternal({type: 'share.publicationReplace.set', inFlight: true}); + const alternative = corrections < SCREEN_SHARE_PUBLISH_CODEC_CORRECTION_MAX ? violation.alternative : null; + try { + await participant.unpublishTrack(track, alternative === null); + if (alternative === null) { + throw new ScreenSharePublishCodecPolicyError(violation); + } + const nextPublishOptions: TrackPublishOptions = {...effectivePublishOptions, videoCodec: alternative}; + delete nextPublishOptions.backupCodec; + delete nextPublishOptions.backupCodecPolicy; + delete nextPublishOptions.scalabilityMode; + delete nextPublishOptions.simulcast; + effectivePublishOptions = await this.adapter.getEffectivePublishOptionsInternal(true, nextPublishOptions); + await participant.publishTrack(mediaStreamTrack, { + ...effectivePublishOptions, + source: Track.Source.ScreenShare, + stream: VoiceTrackSource.ScreenShare, + ...(publication.trackName ? {name: publication.trackName} : {}), + }); + } finally { + if (!replaceAlreadyInFlight) { + this.adapter.transitionScreenShareLifecycleInternal({ + type: 'share.publicationReplace.set', + inFlight: false, + }); + } + } + } } private async finalizeDeviceShareSuccess( @@ -519,9 +594,15 @@ export class VoiceEngineV2AppScreenShareLiveKitFlows { const createdTracks: Array = []; const publishedTracks: Array = []; try { - const effectivePublishOptions = await this.adapter.getEffectivePublishOptionsInternal(true, publishOptions); + const requestedPublishOptions = await this.adapter.getEffectivePublishOptionsInternal(true, publishOptions); const {videoTrack, audioTrack} = await this.createDeviceTracksForShare(options, createdTracks); - await this.publishDeviceTracks(participant, videoTrack, audioTrack, effectivePublishOptions, publishedTracks); + const effectivePublishOptions = await this.publishDeviceTracks( + participant, + videoTrack, + audioTrack, + requestedPublishOptions, + publishedTracks, + ); await this.finalizeDeviceShareSuccess( room, participant, @@ -735,14 +816,15 @@ export class VoiceEngineV2AppScreenShareLiveKitFlows { let videoPublished = false; try { await participant.unpublishTrack(screenShareTrack, false); - const effectivePublishOptions = await this.adapter.getEffectivePublishOptionsInternal(true, nextPublishOptions); + const requestedPublishOptions = await this.adapter.getEffectivePublishOptionsInternal(true, nextPublishOptions); await participant.publishTrack(mediaStreamTrack, { - ...effectivePublishOptions, + ...requestedPublishOptions, source: Track.Source.ScreenShare, stream: VoiceTrackSource.ScreenShare, ...(publication.trackName ? {name: publication.trackName} : {}), }); videoPublished = true; + const {effectivePublishOptions} = await this.enforcePublishCodecPolicy(participant, requestedPublishOptions); await runScreenShareActivationRitual({ adapter: this.adapter, room, @@ -1603,13 +1685,14 @@ export class VoiceEngineV2AppScreenShareLiveKitFlows { if (getLocalScreenSharePublications(participant).length > 0) { await this.adapter.cleanupLingeringScreenShareTracks(participant); } - const effectivePublishOptions = await this.adapter.getEffectivePublishOptionsInternal(true, publishOptions); + const requestedPublishOptions = await this.adapter.getEffectivePublishOptionsInternal(true, publishOptions); await participant.publishTrack(snapshot.videoTrack, { - ...effectivePublishOptions, + ...requestedPublishOptions, source: Track.Source.ScreenShare, stream: VoiceTrackSource.ScreenShare, }); videoPublished = true; + const {effectivePublishOptions} = await this.enforcePublishCodecPolicy(participant, requestedPublishOptions); const audioPublished = await this.restoreReconnectAudio(participant, snapshot); await this.finalizeRestoreReconnectSuccess(room, participant, snapshot, effectivePublishOptions, audioPublished); return true; diff --git a/fluxer_app/src/features/voice/engine/voice_screen_share_manager/shared.ts b/fluxer_app/src/features/voice/engine/voice_screen_share_manager/shared.ts index bd2b30715..be791405f 100644 --- a/fluxer_app/src/features/voice/engine/voice_screen_share_manager/shared.ts +++ b/fluxer_app/src/features/voice/engine/voice_screen_share_manager/shared.ts @@ -9,6 +9,8 @@ import VoiceSettings from '@app/features/voice/state/VoiceSettings'; import { adjustScreenShareEncodingForCodec, getCodecCapabilityReport, + resolveVideoPublishCodecPolicy, + type VideoPublishCodecPolicy, } from '@app/features/voice/utils/CodecCapabilityDetector'; import {getGpuEncoderReportSync, loadGpuEncoderReport} from '@app/features/voice/utils/GpuEncoderCapabilities'; import {loadNativeHardwareEncoderCapabilities} from '@app/features/voice/utils/NativeHardwareEncoderCapabilities'; @@ -244,6 +246,15 @@ function getConfiguredBackupCodecForPrimary(primaryCodec: VideoCodec): return {codec: 'h264'}; } +function resolveBackupCodecWithinPolicy( + configured: TrackPublishOptions['backupCodec'] | undefined, + policy: VideoPublishCodecPolicy, +): TrackPublishOptions['backupCodec'] { + if (configured === undefined || configured === true) return policy.backupCodec; + if (configured === false) return false; + return configured.codec !== policy.primary && policy.allowed.includes(configured.codec) ? configured : false; +} + function getEffectiveScreenShareScalabilityMode( codec: VideoCodec, publishOptions?: TrackPublishOptions, @@ -292,8 +303,12 @@ export async function getEffectivePublishOptions( return publishOptions; } await waitForGpuEncoderReportForPublish(options); - const preferredVideoCodec = publishOptions?.videoCodec ?? getPreferredScreenShareCodec(); - const backupCodec = publishOptions?.backupCodec ?? getConfiguredBackupCodecForPrimary(preferredVideoCodec); + const policy = resolveVideoPublishCodecPolicy(publishOptions?.videoCodec ?? getPreferredScreenShareCodec()); + const preferredVideoCodec = policy.primary; + const backupCodec = resolveBackupCodecWithinPolicy( + publishOptions?.backupCodec ?? getConfiguredBackupCodecForPrimary(preferredVideoCodec), + policy, + ); const backupCodecPolicy = publishOptions?.backupCodecPolicy ?? (backupCodec ? BackupCodecPolicy.SIMULCAST : undefined); const scalabilityMode = getEffectiveScreenShareScalabilityMode(preferredVideoCodec, publishOptions, { @@ -306,7 +321,7 @@ export async function getEffectivePublishOptions( degradationPreference: SCREEN_SHARE_DEGRADATION_PREFERENCE, simulcast: isSvcScreenShareCodec(preferredVideoCodec) ? false : (publishOptions?.simulcast ?? false), scalabilityMode, - ...(backupCodec !== undefined ? {backupCodec} : {}), + backupCodec, ...(backupCodecPolicy !== undefined ? {backupCodecPolicy} : {}), }; } diff --git a/fluxer_app/src/features/voice/utils/CodecCapabilityDetector.test.ts b/fluxer_app/src/features/voice/utils/CodecCapabilityDetector.test.ts index 24f98ffff..acb9aeee5 100644 --- a/fluxer_app/src/features/voice/utils/CodecCapabilityDetector.test.ts +++ b/fluxer_app/src/features/voice/utils/CodecCapabilityDetector.test.ts @@ -8,12 +8,15 @@ let av1OptIn = false; let hevcOptIn = false; let desktop = true; let gpuReport: HardwareEncodeReport | null = null; +let cameraPreference = 'auto'; +let openH264Status: {enabled: boolean; downloaded: boolean} | null = null; let codecCapabilityInfo: MockInstance<(...args: Array) => void>; vi.mock('@app/features/voice/state/VoiceSettings', () => ({ default: { getScreenShareAv1OptIn: () => av1OptIn, getScreenShareHevcOptIn: () => hevcOptIn, + getPreferredVideoCodec: () => cameraPreference, }, })); @@ -39,29 +42,34 @@ vi.mock('@app/features/voice/utils/NativeHardwareEncoderCapabilities', () => ({ })); vi.mock('@app/features/voice/utils/OpenH264Status', () => ({ - getOpenH264StatusSync: () => null, + getOpenH264StatusSync: () => openH264Status, resetOpenH264Status: () => undefined, })); +const ALL_SENDER_CODECS = ['video/VP8', 'video/VP9', 'video/H264', 'video/H265', 'video/AV1']; +let senderCodecs = ALL_SENDER_CODECS; + Object.defineProperty(globalThis, 'RTCRtpSender', { configurable: true, writable: true, value: { - getCapabilities: () => ({ - codecs: [ - {mimeType: 'video/VP8'}, - {mimeType: 'video/VP9'}, - {mimeType: 'video/H264'}, - {mimeType: 'video/H265'}, - {mimeType: 'video/AV1'}, - ], - }), + getCapabilities: () => ({codecs: senderCodecs.map((mimeType) => ({mimeType}))}), }, }); -const {getCodecCapabilityReport, resetCachedCodecCapabilities, selectAutomaticScreenShareCodec} = await import( - './CodecCapabilityDetector' -); +const { + buildCameraPublishOptions, + findVideoPublishCodecPolicyViolation, + getAllowedVideoPublishCodecs, + getCodecCapabilityReport, + getRoomVideoPublishDefaults, + isVideoCodecAllowedForPublish, + markScreenShareCodecEncodeRuntimeFailure, + resetCachedCodecCapabilities, + resolveScreenShareEncoderVerificationAction, + resolveVideoPublishCodecPolicy, + selectAutomaticScreenShareCodec, +} = await import('./CodecCapabilityDetector'); const ALL_SOFTWARE: HardwareEncodeReport = { av1: 'software', @@ -158,3 +166,125 @@ describe('screen-share AV1/HEVC opt-in gate', () => { expect(getCodecCapabilityReport().h265.supported).toBe(true); }); }); + +describe('video publish codec policy', () => { + beforeEach(() => { + av1OptIn = false; + hevcOptIn = false; + desktop = true; + gpuReport = null; + cameraPreference = 'auto'; + openH264Status = null; + senderCodecs = ALL_SENDER_CODECS; + resetCachedCodecCapabilities(); + }); + + it('keeps AV1 and HEVC out of the allowed set while the opt-ins are off', () => { + expect(getAllowedVideoPublishCodecs()).toEqual(['vp8', 'h264', 'vp9']); + expect(isVideoCodecAllowedForPublish('av1')).toBe(false); + expect(isVideoCodecAllowedForPublish('h265')).toBe(false); + }); + + it('admits AV1 and HEVC only once their opt-ins are on', () => { + av1OptIn = true; + expect(getAllowedVideoPublishCodecs()).toEqual(['vp8', 'h264', 'vp9', 'av1']); + hevcOptIn = true; + expect(getAllowedVideoPublishCodecs()).toEqual(['vp8', 'h264', 'vp9', 'av1', 'h265']); + expect(resolveVideoPublishCodecPolicy('av1').primary).toBe('av1'); + expect(resolveVideoPublishCodecPolicy('h265').primary).toBe('h265'); + }); + + it('substitutes an opted-out request with the first compatible codec and never AV1 or HEVC', () => { + expect(resolveVideoPublishCodecPolicy('av1')).toMatchObject({primary: 'h264', backupCodec: false}); + expect(resolveVideoPublishCodecPolicy('h265')).toMatchObject({primary: 'h264', backupCodec: false}); + expect(resolveVideoPublishCodecPolicy('vp9')).toMatchObject({primary: 'vp9', backupCodec: {codec: 'h264'}}); + expect(resolveVideoPublishCodecPolicy('h264')).toMatchObject({primary: 'h264', backupCodec: false}); + }); + + it('drops H.264 from the allowed set when the sender cannot encode it even though OpenH264 claims it is ready', () => { + senderCodecs = ALL_SENDER_CODECS.filter((mimeType) => mimeType !== 'video/H264'); + openH264Status = {enabled: true, downloaded: true}; + expect(getCodecCapabilityReport().h264.supported).toBe(true); + expect(isVideoCodecAllowedForPublish('h264')).toBe(false); + expect(resolveVideoPublishCodecPolicy('h264')).toMatchObject({primary: 'vp9', backupCodec: false}); + expect(getRoomVideoPublishDefaults()).toEqual({videoCodec: 'vp9', backupCodec: false}); + }); + + it('drops a codec from the allowed set once it failed to encode at runtime', () => { + expect(markScreenShareCodecEncodeRuntimeFailure('vp9', 'test')).toBe(true); + expect(getAllowedVideoPublishCodecs()).toEqual(['vp8', 'h264']); + expect(resolveVideoPublishCodecPolicy('vp9').primary).toBe('h264'); + }); + + it('hands the camera an explicit allowed codec for every preference while the opt-ins are off', () => { + expect(buildCameraPublishOptions()).toEqual({ + videoCodec: 'vp9', + backupCodec: {codec: 'h264'}, + backupCodecPolicy: 1, + }); + for (const preference of ['auto', 'vp8', 'vp9', 'h264', 'av1', 'h265']) { + cameraPreference = preference; + const options = buildCameraPublishOptions(); + expect(options.videoCodec).toBeDefined(); + expect(getAllowedVideoPublishCodecs()).toContain(options.videoCodec); + expect(options.videoCodec).not.toBe('av1'); + expect(options.videoCodec).not.toBe('h265'); + } + cameraPreference = 'av1'; + expect(buildCameraPublishOptions().videoCodec).toBe('h264'); + av1OptIn = true; + expect(buildCameraPublishOptions().videoCodec).toBe('av1'); + }); + + it('derives the room publish defaults from the same policy', () => { + expect(getRoomVideoPublishDefaults()).toEqual({videoCodec: 'vp9', backupCodec: {codec: 'h264'}}); + cameraPreference = 'av1'; + expect(getRoomVideoPublishDefaults().videoCodec).toBe('h264'); + }); + + it('flags a negotiated codec outside the policy with a bounded alternative', () => { + expect(findVideoPublishCodecPolicyViolation('h264', 'av1')).toEqual({ + requested: 'h264', + negotiated: 'av1', + alternative: 'vp9', + }); + expect(findVideoPublishCodecPolicyViolation('h264', 'h264')).toBeNull(); + expect(findVideoPublishCodecPolicyViolation('h264', 'vp9')).toBeNull(); + expect(findVideoPublishCodecPolicyViolation('h264', undefined)).toBeNull(); + }); + + it('no longer blacklists the requested codec when the publisher negotiated a different one', () => { + expect( + resolveScreenShareEncoderVerificationAction({reason: 'codec-mismatch', codec: 'h264', activeCodecs: ['av1']}), + ).toEqual({kind: 'correct-negotiated', requested: 'h264', negotiated: ['av1'], alternative: 'vp9'}); + expect(isVideoCodecAllowedForPublish('h264')).toBe(true); + expect(getCodecCapabilityReport().h264.supported).toBe(true); + expect( + resolveScreenShareEncoderVerificationAction({reason: 'codec-mismatch', codec: 'h264', activeCodecs: ['vp9']}), + ).toEqual({kind: 'accept-negotiated', requested: 'h264', negotiated: ['vp9']}); + expect(isVideoCodecAllowedForPublish('h264')).toBe(true); + }); + + it('still blacklists a codec whose encoder stalled, and only warns about it once', () => { + expect(resolveScreenShareEncoderVerificationAction({reason: 'stalled', codec: 'h264'})).toEqual({ + kind: 'recover-stalled', + codec: 'h264', + }); + expect(isVideoCodecAllowedForPublish('h264')).toBe(false); + expect(getCodecCapabilityReport().h264).toMatchObject({supported: false, reason: 'runtime-failed'}); + expect(resolveScreenShareEncoderVerificationAction({reason: 'stalled', codec: 'h264'})).toEqual({ + kind: 'ignore-repeated-stall', + codec: 'h264', + }); + }); + + it('keeps recovering from a vp8 stall because vp8 is never blacklisted', () => { + for (let attempt = 0; attempt < 2; attempt++) { + expect(resolveScreenShareEncoderVerificationAction({reason: 'stalled', codec: 'vp8'})).toEqual({ + kind: 'recover-stalled', + codec: 'vp8', + }); + expect(isVideoCodecAllowedForPublish('vp8')).toBe(true); + } + }); +}); diff --git a/fluxer_app/src/features/voice/utils/CodecCapabilityDetector.ts b/fluxer_app/src/features/voice/utils/CodecCapabilityDetector.ts index 364b1cf12..245416f14 100644 --- a/fluxer_app/src/features/voice/utils/CodecCapabilityDetector.ts +++ b/fluxer_app/src/features/voice/utils/CodecCapabilityDetector.ts @@ -17,10 +17,13 @@ import { resetNativeHardwareEncoderCapabilities, } from '@app/features/voice/utils/NativeHardwareEncoderCapabilities'; import {getOpenH264StatusSync, resetOpenH264Status} from '@app/features/voice/utils/OpenH264Status'; -import type {VideoCodec, VideoEncoding} from 'livekit-client'; +import type {TrackPublishDefaults, TrackPublishOptions} from 'livekit-client'; +import {BackupCodecPolicy, supportsVideoCodec, type VideoCodec, type VideoEncoding} from 'livekit-client'; const logger = new Logger('CodecCapabilityDetector'); export const LIVEKIT_SUPPORTED_CODECS: ReadonlyArray = ['vp8', 'h264', 'vp9', 'av1', 'h265']; +const PUBLISH_CODEC_FALLBACK_ORDER: ReadonlyArray = ['h264', 'vp9', 'vp8', 'av1', 'h265']; +const LAST_RESORT_PUBLISH_CODEC: VideoCodec = 'vp8'; export interface CodecCapabilities { vp8: boolean; @@ -478,6 +481,122 @@ export function markScreenShareCodecEncodeRuntimeFailure(codec: VideoCodec, reas return true; } +export type VideoPublishCodecDenial = 'sender-cannot-encode' | 'policy' | 'runtime-failed'; + +export interface VideoPublishCodecPolicy { + allowed: ReadonlyArray; + requested: VideoCodec; + primary: VideoCodec; + backupCodec: false | {codec: 'h264'}; +} + +export interface VideoPublishCodecPolicyViolation { + requested: VideoCodec; + negotiated: VideoCodec; + alternative: VideoCodec | null; +} + +export type ScreenShareEncoderVerificationAction = + | {kind: 'recover-stalled'; codec: VideoCodec} + | {kind: 'ignore-repeated-stall'; codec: VideoCodec} + | {kind: 'accept-negotiated'; requested: VideoCodec; negotiated: ReadonlyArray} + | { + kind: 'correct-negotiated'; + requested: VideoCodec; + negotiated: ReadonlyArray; + alternative: VideoCodec | null; + }; + +export function getVideoPublishCodecDenial(codec: VideoCodec): VideoPublishCodecDenial | null { + if (!supportsVideoCodec(codec)) return 'sender-cannot-encode'; + if (getScreenShareCodecPolicyUnsupported(codec, buildScreenShareCodecPolicyContext())) return 'policy'; + if (runtimeEncodeFailureCodecs.has(codec)) return 'runtime-failed'; + return null; +} + +export function isVideoCodecAllowedForPublish(codec: VideoCodec): boolean { + return getVideoPublishCodecDenial(codec) === null; +} + +export function getAllowedVideoPublishCodecs(): ReadonlyArray { + return LIVEKIT_SUPPORTED_CODECS.filter(isVideoCodecAllowedForPublish); +} + +export function selectVideoPublishCodecAlternative(requested: VideoCodec): VideoCodec | null { + return ( + PUBLISH_CODEC_FALLBACK_ORDER.find((codec) => codec !== requested && isVideoCodecAllowedForPublish(codec)) ?? null + ); +} + +export function resolveVideoPublishCodecPolicy(requested: VideoCodec): VideoPublishCodecPolicy { + const allowed = getAllowedVideoPublishCodecs(); + const primary = allowed.includes(requested) + ? requested + : (PUBLISH_CODEC_FALLBACK_ORDER.find((codec) => allowed.includes(codec)) ?? LAST_RESORT_PUBLISH_CODEC); + if (primary !== requested) { + logger.warn('Requested publish codec is outside the publish policy; substituting', { + requested, + primary, + denial: getVideoPublishCodecDenial(requested), + allowed, + }); + } + const backupCodec = + primary !== 'h264' && primary !== 'vp8' && allowed.includes('h264') ? {codec: 'h264' as const} : false; + return {allowed, requested, primary, backupCodec}; +} + +export function getCameraPublishCodecPolicy(): VideoPublishCodecPolicy { + return resolveVideoPublishCodecPolicy(selectOptimalCameraCodec(VoiceSettings.getPreferredVideoCodec())); +} + +export function buildCameraPublishOptions(codec?: VideoCodec): TrackPublishOptions { + const policy = codec ? resolveVideoPublishCodecPolicy(codec) : getCameraPublishCodecPolicy(); + return { + videoCodec: policy.primary, + backupCodec: policy.backupCodec, + ...(policy.backupCodec ? {backupCodecPolicy: BackupCodecPolicy.SIMULCAST} : {}), + }; +} + +export function getRoomVideoPublishDefaults(): Pick { + const policy = getCameraPublishCodecPolicy(); + return { + videoCodec: policy.primary, + backupCodec: policy.allowed.includes('h264') ? {codec: 'h264'} : false, + }; +} + +export function findVideoPublishCodecPolicyViolation( + requested: VideoCodec, + negotiated: VideoCodec | undefined, +): VideoPublishCodecPolicyViolation | null { + if (!negotiated || isVideoCodecAllowedForPublish(negotiated)) return null; + return {requested, negotiated, alternative: selectVideoPublishCodecAlternative(requested)}; +} + +export function resolveScreenShareEncoderVerificationAction( + failure: + | {reason: 'stalled'; codec: VideoCodec} + | {reason: 'codec-mismatch'; codec: VideoCodec; activeCodecs: ReadonlyArray}, +): ScreenShareEncoderVerificationAction { + if (failure.reason === 'stalled') { + if (runtimeEncodeFailureCodecs.has(failure.codec)) return {kind: 'ignore-repeated-stall', codec: failure.codec}; + markScreenShareCodecEncodeRuntimeFailure(failure.codec, 'screen-share-encode-stalled'); + return {kind: 'recover-stalled', codec: failure.codec}; + } + const disallowed = failure.activeCodecs.filter((codec) => !isVideoCodecAllowedForPublish(codec)); + if (disallowed.length === 0) { + return {kind: 'accept-negotiated', requested: failure.codec, negotiated: failure.activeCodecs}; + } + return { + kind: 'correct-negotiated', + requested: failure.codec, + negotiated: disallowed, + alternative: selectVideoPublishCodecAlternative(failure.codec), + }; +} + export function selectNativeScreenCaptureScreenShareCodec(preference: CodecPreference = 'auto'): VideoCodec { return selectOptimalScreenShareCodec(preference); } diff --git a/fluxer_app/src/features/voice/utils/StatsForNerdsCopy.ts b/fluxer_app/src/features/voice/utils/StatsForNerdsCopy.ts index aac51e002..58347fdba 100644 --- a/fluxer_app/src/features/voice/utils/StatsForNerdsCopy.ts +++ b/fluxer_app/src/features/voice/utils/StatsForNerdsCopy.ts @@ -21,9 +21,9 @@ import {getPublishedScreenShareMaxBitrateBps} from '@app/features/voice/engine/v import VoiceSettings from '@app/features/voice/state/VoiceSettings'; import { type CodecCapabilityReport, + getCameraPublishCodecPolicy, getCodecCapabilityReport, getLiveKitSupportedCodecs, - selectOptimalCameraCodec, selectOptimalScreenShareCodec, } from '@app/features/voice/utils/CodecCapabilityDetector'; import {loadGpuEncoderReport} from '@app/features/voice/utils/GpuEncoderCapabilities'; @@ -225,7 +225,7 @@ async function collectCodecMetadata(): Promise> { report = null; } try { - resolvedCameraCodec = selectOptimalCameraCodec(cameraPreference); + resolvedCameraCodec = getCameraPublishCodecPolicy().primary; } catch { resolvedCameraCodec = null; }