diff --git a/change-beta/@azure-communication-react-95db09fa-bca5-48f4-b7be-bf7cd4a97ed2.json b/change-beta/@azure-communication-react-95db09fa-bca5-48f4-b7be-bf7cd4a97ed2.json new file mode 100644 index 00000000000..37e04a5ebad --- /dev/null +++ b/change-beta/@azure-communication-react-95db09fa-bca5-48f4-b7be-bf7cd4a97ed2.json @@ -0,0 +1,9 @@ +{ + "type": "prerelease", + "area": "feature", + "workstream": "DNS", + "comment": "We are excited to announce that the Azure Communication Services Web UI Library now supports Deep Noise Suppression. This feature enables noise suppression algorithms to filter out background noise, ensuring that only the speaker's voice is heard clearly. Developers can use this functionality today through our composites (e.g CallComposite, CallWithChatComposite). ", + "packageName": "@azure/communication-react", + "email": "dmceachern@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/common/config/babel/features.js b/common/config/babel/features.js index 32ee7f04380..2a4ed5fcfb3 100644 --- a/common/config/babel/features.js +++ b/common/config/babel/features.js @@ -23,8 +23,6 @@ module.exports = { "remote-ufd", // Feature for showing dtmp dialer by default "dtmf-dialer-on-by-default", - // Deep Noise Suppression feature - "DNS", // Feature for together mode "together-mode" ], @@ -94,6 +92,8 @@ module.exports = { "notifications", // Feature for tracking beta start call identifier 'start-call-beta', + // Deep Noise Suppression feature + "DNS", // Soft Mute feature for ACS calls and Interop calls "soft-mute" ] diff --git a/packages/calling-component-bindings/src/handlers/createCommonHandlers.ts b/packages/calling-component-bindings/src/handlers/createCommonHandlers.ts index d4f21e82ad8..02427e7ec25 100644 --- a/packages/calling-component-bindings/src/handlers/createCommonHandlers.ts +++ b/packages/calling-component-bindings/src/handlers/createCommonHandlers.ts @@ -138,7 +138,7 @@ export type VideoBackgroundEffectsDependency = { /** * Dependency type to be injected for deep noise suppression * - * @beta + * @public */ export type DeepNoiseSuppressionEffectDependency = { deepNoiseSuppressionEffect: AudioEffectsStartConfig; diff --git a/packages/communication-react/review/beta/communication-react.api.md b/packages/communication-react/review/beta/communication-react.api.md index 6215014dad8..c32ab12760d 100644 --- a/packages/communication-react/review/beta/communication-react.api.md +++ b/packages/communication-react/review/beta/communication-react.api.md @@ -464,7 +464,6 @@ export interface CallAdapterCallOperations { setSpokenLanguage(language: string): Promise; startCamera(options?: VideoStreamOptions): Promise; startCaptions(options?: StartCaptionsAdapterOptions): Promise; - // @beta startNoiseSuppressionEffect(): Promise; startScreenShare(): Promise; startSpotlight(userIds?: string[]): Promise; @@ -472,7 +471,6 @@ export interface CallAdapterCallOperations { stopAllSpotlight(): Promise; stopCamera(): Promise; stopCaptions(options?: StopCaptionsAdapterOptions): Promise; - // @beta stopNoiseSuppressionEffect(): Promise; stopScreenShare(): Promise; stopSpotlight(userIds?: string[]): Promise; @@ -1230,7 +1228,6 @@ export interface CallWithChatAdapterManagement { startCall(participants: (MicrosoftTeamsAppIdentifier | PhoneNumberIdentifier | CommunicationUserIdentifier | MicrosoftTeamsUserIdentifier | UnknownIdentifier)[], options?: StartCallOptions): Call | undefined; startCamera(options?: VideoStreamOptions): Promise; startCaptions(options?: StartCaptionsAdapterOptions): Promise; - // @beta startNoiseSuppressionEffect(): Promise; startScreenShare(): Promise; startSpotlight(userIds?: string[]): Promise; @@ -1238,7 +1235,6 @@ export interface CallWithChatAdapterManagement { stopAllSpotlight(): Promise; stopCamera(): Promise; stopCaptions(options?: StopCaptionsAdapterOptions): Promise; - // @beta stopNoiseSuppressionEffect(): Promise; stopScreenShare(): Promise; stopSpotlight(userIds?: string[]): Promise; @@ -1381,20 +1377,17 @@ export interface CallWithChatClientState { alternateCallerId?: string; call?: CallState; chat?: ChatThreadClientState; - // @beta deepNoiseSuppressionOnByDefault?: boolean; devices: DeviceManagerState; displayName: string | undefined; environmentInfo?: EnvironmentInfo; hideAttendeeNames?: boolean; - // @beta hideDeepNoiseSuppressionButton?: boolean; isTeamsCall: boolean; isTeamsMeeting: boolean; latestCallErrors: AdapterErrors; latestCallNotifications: AdapterNotifications; latestChatErrors: AdapterErrors; - // @beta onResolveDeepNoiseSuppressionDependency?: () => Promise; onResolveVideoEffectDependency?: () => Promise; reactions?: ReactionResources; @@ -2649,7 +2642,7 @@ export type DeclarativeCallAgent = CallAgent & IncomingCallManagement; // @public export type DeclarativeTeamsCallAgent = TeamsCallAgent & TeamsIncomingCallManagement; -// @beta +// @public export type DeepNoiseSuppressionEffectDependency = { deepNoiseSuppressionEffect: AudioEffectsStartConfig; }; @@ -3752,17 +3745,14 @@ export interface MicrophoneButtonContextualMenuStyles extends IContextualMenuSty // @public export interface MicrophoneButtonProps extends ControlBarButtonProps { enableDeviceSelectionMenu?: boolean; - // @beta isDeepNoiseSuppressionOn?: boolean; microphones?: OptionsDevice[]; - // @beta onClickNoiseSuppression?: () => void; onSelectMicrophone?: (device: OptionsDevice) => Promise; onSelectSpeaker?: (device: OptionsDevice) => Promise; onToggleMicrophone?: () => Promise; selectedMicrophone?: OptionsDevice; selectedSpeaker?: OptionsDevice; - // @beta showNoiseSuppressionButton?: boolean; speakers?: OptionsDevice[]; strings?: Partial; @@ -3781,11 +3771,8 @@ export type MicrophoneButtonSelector = (state: CallClientState, props: CallingBa // @public export interface MicrophoneButtonStrings { - // @beta deepNoiseSuppressionOffAnnouncement?: string; - // @beta deepNoiseSuppressionOnAnnouncement?: string; - // @beta deepNoiseSuppressionTitle?: string; microphoneActionTurnedOffAnnouncement?: string; microphoneActionTurnedOnAnnouncement?: string; @@ -3939,10 +3926,10 @@ export type OnRenderAvatarCallback = ( userId?: string, options?: CustomAvatarOptions, defaultOnRender?: (props: CustomAvatarOptions) => JSX.Element) => JSX.Element | undefined; -// @beta +// @public export const onResolveDeepNoiseSuppressionDependency: () => Promise; -// @beta +// @public export const onResolveDeepNoiseSuppressionDependencyLazy: () => Promise; // @public diff --git a/packages/communication-react/review/stable/communication-react.api.md b/packages/communication-react/review/stable/communication-react.api.md index aa29d026d69..e7f07709593 100644 --- a/packages/communication-react/review/stable/communication-react.api.md +++ b/packages/communication-react/review/stable/communication-react.api.md @@ -8,6 +8,7 @@ import { AddPhoneNumberOptions } from '@azure/communication-calling'; import { AudioDeviceInfo } from '@azure/communication-calling'; +import { AudioEffectsStartConfig } from '@azure/communication-calling'; import { BackgroundBlurConfig } from '@azure/communication-calling'; import { BackgroundBlurEffect } from '@azure/communication-calling'; import { BackgroundReplacementConfig } from '@azure/communication-calling'; @@ -291,12 +292,14 @@ export interface CallAdapterCallOperations { setSpokenLanguage(language: string): Promise; startCamera(options?: VideoStreamOptions): Promise; startCaptions(options?: StartCaptionsAdapterOptions): Promise; + startNoiseSuppressionEffect(): Promise; startScreenShare(): Promise; startSpotlight(userIds?: string[]): Promise; startVideoBackgroundEffect(videoBackgroundEffect: VideoBackgroundEffect): Promise; stopAllSpotlight(): Promise; stopCamera(): Promise; stopCaptions(options?: StopCaptionsAdapterOptions): Promise; + stopNoiseSuppressionEffect(): Promise; stopScreenShare(): Promise; stopSpotlight(userIds?: string[]): Promise; stopVideoBackgroundEffects(): Promise; @@ -322,6 +325,9 @@ export type CallAdapterClientState = { cameraStatus?: 'On' | 'Off'; videoBackgroundImages?: VideoBackgroundImage[]; onResolveVideoEffectDependency?: () => Promise; + onResolveDeepNoiseSuppressionDependency?: () => Promise; + deepNoiseSuppressionOnByDefault?: boolean; + hideDeepNoiseSuppressionButton?: boolean; selectedVideoBackgroundEffect?: VideoBackgroundEffect; acceptedTransferCallState?: CallState; hideAttendeeNames?: boolean; @@ -853,6 +859,7 @@ export interface CallingHandlers extends CommonCallingHandlers { // @public export type CallingHandlersOptions = { onResolveVideoBackgroundEffectsDependency?: () => Promise; + onResolveDeepNoiseSuppressionDependency?: () => Promise; }; // @public @@ -1001,12 +1008,14 @@ export interface CallWithChatAdapterManagement { startCall(participants: (MicrosoftTeamsAppIdentifier | PhoneNumberIdentifier | CommunicationUserIdentifier | MicrosoftTeamsUserIdentifier | UnknownIdentifier)[], options?: StartCallOptions): Call | undefined; startCamera(options?: VideoStreamOptions): Promise; startCaptions(options?: StartCaptionsAdapterOptions): Promise; + startNoiseSuppressionEffect(): Promise; startScreenShare(): Promise; startSpotlight(userIds?: string[]): Promise; startVideoBackgroundEffect(videoBackgroundEffect: VideoBackgroundEffect): Promise; stopAllSpotlight(): Promise; stopCamera(): Promise; stopCaptions(options?: StopCaptionsAdapterOptions): Promise; + stopNoiseSuppressionEffect(): Promise; stopScreenShare(): Promise; stopSpotlight(userIds?: string[]): Promise; stopVideoBackgroundEffects(): Promise; @@ -1140,13 +1149,16 @@ export interface CallWithChatClientState { alternateCallerId?: string; call?: CallState; chat?: ChatThreadClientState; + deepNoiseSuppressionOnByDefault?: boolean; devices: DeviceManagerState; displayName: string | undefined; hideAttendeeNames?: boolean; + hideDeepNoiseSuppressionButton?: boolean; isTeamsCall: boolean; isTeamsMeeting: boolean; latestCallErrors: AdapterErrors; latestChatErrors: AdapterErrors; + onResolveDeepNoiseSuppressionDependency?: () => Promise; onResolveVideoEffectDependency?: () => Promise; reactions?: ReactionResources; selectedVideoBackgroundEffect?: VideoBackgroundEffect; @@ -1772,6 +1784,11 @@ export type CommonCallAdapterOptions = { videoBackgroundImages?: VideoBackgroundImage[]; onResolveDependency?: () => Promise; }; + deepNoiseSuppressionOptions?: { + onResolveDependency?: () => Promise; + deepNoiseSuppressionOnByDefault?: boolean; + hideDeepNoiseSuppressionButton?: boolean; + }; onFetchProfile?: OnFetchProfileCallback; callingSounds?: CallingSounds; reactionResources?: ReactionResources; @@ -1888,6 +1905,8 @@ export interface CommonCallingHandlers { // (undocumented) onStartLocalVideo: () => Promise; // (undocumented) + onStartNoiseSuppressionEffect: () => Promise; + // (undocumented) onStartScreenShare: () => Promise; // (undocumented) onStartSpotlight: (userIds?: string[]) => Promise; @@ -1896,6 +1915,8 @@ export interface CommonCallingHandlers { // (undocumented) onStopCaptions: () => Promise; // (undocumented) + onStopNoiseSuppressionEffect: () => Promise; + // (undocumented) onStopScreenShare: () => Promise; // (undocumented) onStopSpotlight: (userIds?: string[]) => Promise; @@ -2212,6 +2233,7 @@ export const createDefaultChatHandlers: (chatClient: StatefulChatClient, chatThr // @public export const createDefaultTeamsCallingHandlers: (callClient: StatefulCallClient, callAgent?: TeamsCallAgent, deviceManager?: StatefulDeviceManager, call?: TeamsCall, options?: { onResolveVideoBackgroundEffectsDependency?: () => Promise; + onResolveDeepNoiseSuppressionDependency?: () => Promise; }) => TeamsCallingHandlers; // @public @@ -2300,6 +2322,11 @@ export type DeclarativeCallAgent = CallAgent & IncomingCallManagement; // @public export type DeclarativeTeamsCallAgent = TeamsCallAgent & TeamsIncomingCallManagement; +// @public +export type DeepNoiseSuppressionEffectDependency = { + deepNoiseSuppressionEffect: AudioEffectsStartConfig; +}; + // @public export const DEFAULT_COMPONENT_ICONS: { ChatMessageOptions: React_2.JSX.Element; @@ -3265,12 +3292,15 @@ export interface MicrophoneButtonContextualMenuStyles extends IContextualMenuSty // @public export interface MicrophoneButtonProps extends ControlBarButtonProps { enableDeviceSelectionMenu?: boolean; + isDeepNoiseSuppressionOn?: boolean; microphones?: OptionsDevice[]; + onClickNoiseSuppression?: () => void; onSelectMicrophone?: (device: OptionsDevice) => Promise; onSelectSpeaker?: (device: OptionsDevice) => Promise; onToggleMicrophone?: () => Promise; selectedMicrophone?: OptionsDevice; selectedSpeaker?: OptionsDevice; + showNoiseSuppressionButton?: boolean; speakers?: OptionsDevice[]; strings?: Partial; styles?: Partial; @@ -3288,6 +3318,9 @@ export type MicrophoneButtonSelector = (state: CallClientState, props: CallingBa // @public export interface MicrophoneButtonStrings { + deepNoiseSuppressionOffAnnouncement?: string; + deepNoiseSuppressionOnAnnouncement?: string; + deepNoiseSuppressionTitle?: string; microphoneActionTurnedOffAnnouncement?: string; microphoneActionTurnedOnAnnouncement?: string; microphoneAriaDescription?: string; @@ -3420,6 +3453,12 @@ export type OnRenderAvatarCallback = ( userId?: string, options?: CustomAvatarOptions, defaultOnRender?: (props: CustomAvatarOptions) => JSX.Element) => JSX.Element | undefined; +// @public +export const onResolveDeepNoiseSuppressionDependency: () => Promise; + +// @public +export const onResolveDeepNoiseSuppressionDependencyLazy: () => Promise; + // @public export const onResolveVideoEffectDependency: () => Promise; diff --git a/packages/react-components/src/components/MicrophoneButton.tsx b/packages/react-components/src/components/MicrophoneButton.tsx index eb791b7cef7..ff51ba16668 100644 --- a/packages/react-components/src/components/MicrophoneButton.tsx +++ b/packages/react-components/src/components/MicrophoneButton.tsx @@ -89,19 +89,16 @@ export interface MicrophoneButtonStrings { /* @conditional-compile-remove(DNS) */ /** * Title for deep noise suppression button - * @beta */ deepNoiseSuppressionTitle?: string; /* @conditional-compile-remove(DNS) */ /** * Noise Suppression turned on string for announcer - * @beta */ deepNoiseSuppressionOnAnnouncement?: string; /* @conditional-compile-remove(DNS) */ /** * Noise Suppression turned off string for announcer - * @beta */ deepNoiseSuppressionOffAnnouncement?: string; } @@ -182,22 +179,16 @@ export interface MicrophoneButtonProps extends ControlBarButtonProps { /* @conditional-compile-remove(DNS) */ /** * Whether the deep noise suppression is on or off - * - * @beta */ isDeepNoiseSuppressionOn?: boolean; /* @conditional-compile-remove(DNS) */ /** * Callback when noise suppression is clicked - * - * @beta */ onClickNoiseSuppression?: () => void; /* @conditional-compile-remove(DNS) */ /** * Show/Hide the deep noise suppression button - * - * @beta */ showNoiseSuppressionButton?: boolean; } diff --git a/packages/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.ts b/packages/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.ts index 721408b483c..c2c55bfe7e6 100644 --- a/packages/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.ts +++ b/packages/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.ts @@ -1573,7 +1573,6 @@ export type CommonCallAdapterOptions = { /* @conditional-compile-remove(DNS) */ /** * `DeepNoiseSuppressionEffect` options to be used for noise suppression. - * @beta */ deepNoiseSuppressionOptions?: { onResolveDependency?: () => Promise; diff --git a/packages/react-composites/src/composites/CallComposite/adapter/CallAdapter.ts b/packages/react-composites/src/composites/CallComposite/adapter/CallAdapter.ts index 2481511df97..a4e57b73ff1 100644 --- a/packages/react-composites/src/composites/CallComposite/adapter/CallAdapter.ts +++ b/packages/react-composites/src/composites/CallComposite/adapter/CallAdapter.ts @@ -170,20 +170,17 @@ export type CallAdapterClientState = { /* @conditional-compile-remove(DNS) */ /** * Dependency to be injected for deep noise suppression effect. - * @beta */ onResolveDeepNoiseSuppressionDependency?: () => Promise; /* @conditional-compile-remove(DNS) */ /** * State to track whether the noise suppression should be on by default. - * @beta * @default true */ deepNoiseSuppressionOnByDefault?: boolean; /* @conditional-compile-remove(DNS) */ /** * State to track whether to hide the noise suppression button. - * @beta * @default false */ hideDeepNoiseSuppressionButton?: boolean; @@ -741,14 +738,12 @@ export interface CallAdapterCallOperations { /** * Start the noise suppression effect. * - * @beta */ startNoiseSuppressionEffect(): Promise; /* @conditional-compile-remove(DNS) */ /** * Stop the noise suppression effect. * - * @beta */ stopNoiseSuppressionEffect(): Promise; /** diff --git a/packages/react-composites/src/composites/CallComposite/components/CallControls.tsx b/packages/react-composites/src/composites/CallComposite/components/CallControls.tsx index 6dd1d397658..8b99cb079e1 100644 --- a/packages/react-composites/src/composites/CallComposite/components/CallControls.tsx +++ b/packages/react-composites/src/composites/CallComposite/components/CallControls.tsx @@ -123,7 +123,9 @@ export const CallControls = (props: CallControlsProps & ContainerRectProps): JSX }, [deepNoiseSuppresionEffectsDependency, deepNoiseSuppressionOnByDefault, startDeepNoiseSuppression]); /* @conditional-compile-remove(DNS) */ - const environmentInfo = useSelector(getEnvironmentInfo); + let environmentInfo = undefined; + /* @conditional-compile-remove(unsupported-browser) */ + environmentInfo = useSelector(getEnvironmentInfo); /* @conditional-compile-remove(DNS) */ const isSafari = _isSafari(environmentInfo); diff --git a/packages/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.ts b/packages/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.ts index 81ce18a6bcc..aef2f15d376 100644 --- a/packages/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.ts +++ b/packages/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.ts @@ -476,15 +476,11 @@ export interface CallWithChatAdapterManagement { /* @conditional-compile-remove(DNS) */ /** * Start the noise suppression effect. - * - * @beta */ startNoiseSuppressionEffect(): Promise; /* @conditional-compile-remove(DNS) */ /** * Start the noise suppression effect. - * - * @beta */ stopNoiseSuppressionEffect(): Promise; /** diff --git a/packages/react-composites/src/composites/CallWithChatComposite/state/CallWithChatAdapterState.ts b/packages/react-composites/src/composites/CallWithChatComposite/state/CallWithChatAdapterState.ts index 66a4f47faa5..8ba719a7b04 100644 --- a/packages/react-composites/src/composites/CallWithChatComposite/state/CallWithChatAdapterState.ts +++ b/packages/react-composites/src/composites/CallWithChatComposite/state/CallWithChatAdapterState.ts @@ -90,17 +90,14 @@ export interface CallWithChatClientState { /* @conditional-compile-remove(DNS) */ /** * Dependency to be injected for deep noise suppression effect. - * @beta */ onResolveDeepNoiseSuppressionDependency?: () => Promise; /* @conditional-compile-remove(DNS) */ /** State to track whether the noise suppression should be on by default. - * @beta */ deepNoiseSuppressionOnByDefault?: boolean; /* @conditional-compile-remove(DNS) */ /** State to track whether to hide the noise suppression button. - * @beta */ hideDeepNoiseSuppressionButton?: boolean; diff --git a/packages/react-composites/src/composites/common/ControlBar/CommonCallControlBar.tsx b/packages/react-composites/src/composites/common/ControlBar/CommonCallControlBar.tsx index 5b9276e5ee6..27b8af871dc 100644 --- a/packages/react-composites/src/composites/common/ControlBar/CommonCallControlBar.tsx +++ b/packages/react-composites/src/composites/common/ControlBar/CommonCallControlBar.tsx @@ -224,7 +224,9 @@ export const CommonCallControlBar = (props: CommonCallControlBarProps & Containe }, [props.callAdapter]); /* @conditional-compile-remove(DNS) */ - const environmentInfo = props.callAdapter.getState().environmentInfo; + let environmentInfo = undefined; + /* @conditional-compile-remove(unsupported-browser) */ + environmentInfo = props.callAdapter.getState().environmentInfo; /* @conditional-compile-remove(DNS) */ const isSafari = _isSafari(environmentInfo); diff --git a/packages/react-composites/src/composites/common/resolveDeepNoiseSuppressionDependency.ts b/packages/react-composites/src/composites/common/resolveDeepNoiseSuppressionDependency.ts index 49bb951da05..11a8dee1b85 100644 --- a/packages/react-composites/src/composites/common/resolveDeepNoiseSuppressionDependency.ts +++ b/packages/react-composites/src/composites/common/resolveDeepNoiseSuppressionDependency.ts @@ -12,7 +12,7 @@ import { DeepNoiseSuppressionEffect } from '@azure/communication-calling-effects /** * * Dependency resolution for video background effects using lazy loading. - * @beta + * @public */ export const onResolveDeepNoiseSuppressionDependency = async (): Promise => { const audioEffect: AudioEffectsStartConfig = { diff --git a/packages/react-composites/src/composites/common/resolveDeepNoiseSuppressionDependencyLazy.ts b/packages/react-composites/src/composites/common/resolveDeepNoiseSuppressionDependencyLazy.ts index f4a4cb93e5e..867d3ad0813 100644 --- a/packages/react-composites/src/composites/common/resolveDeepNoiseSuppressionDependencyLazy.ts +++ b/packages/react-composites/src/composites/common/resolveDeepNoiseSuppressionDependencyLazy.ts @@ -10,7 +10,7 @@ import { DeepNoiseSuppressionEffectDependency } from '@internal/calling-componen /** * * Dependency resolution for video background effects using lazy loading. - * @beta + * @public */ export const onResolveDeepNoiseSuppressionDependencyLazy = async (): Promise => { const module = await import('@azure/communication-calling-effects'); diff --git a/packages/react-composites/src/composites/localization/locales/de-DE/strings.json b/packages/react-composites/src/composites/localization/locales/de-DE/strings.json index 504daac445b..b936ecf1ff3 100644 --- a/packages/react-composites/src/composites/localization/locales/de-DE/strings.json +++ b/packages/react-composites/src/composites/localization/locales/de-DE/strings.json @@ -408,4 +408,4 @@ "breakoutRoomChatPaneTitle": "Chat im Gruppenraum", "chatContentSpinnerLabel": "Wird geladen..." } -} \ No newline at end of file +} diff --git a/packages/react-composites/src/composites/localization/locales/it-IT/strings.json b/packages/react-composites/src/composites/localization/locales/it-IT/strings.json index 427c198cb25..2ce85a76b50 100644 --- a/packages/react-composites/src/composites/localization/locales/it-IT/strings.json +++ b/packages/react-composites/src/composites/localization/locales/it-IT/strings.json @@ -408,4 +408,4 @@ "breakoutRoomChatPaneTitle": "Chat della stanza di lavoro", "chatContentSpinnerLabel": "Caricamento in corso..." } -} \ No newline at end of file +} diff --git a/packages/react-composites/src/composites/localization/locales/nl-NL/strings.json b/packages/react-composites/src/composites/localization/locales/nl-NL/strings.json index 53afb489c42..af81c792383 100644 --- a/packages/react-composites/src/composites/localization/locales/nl-NL/strings.json +++ b/packages/react-composites/src/composites/localization/locales/nl-NL/strings.json @@ -408,4 +408,4 @@ "breakoutRoomChatPaneTitle": "Aparte vergaderruimte chat", "chatContentSpinnerLabel": "Laden..." } -} \ No newline at end of file +} diff --git a/packages/react-composites/src/composites/localization/locales/sv-SE/strings.json b/packages/react-composites/src/composites/localization/locales/sv-SE/strings.json index ed5a43b1e03..efd7a44233c 100644 --- a/packages/react-composites/src/composites/localization/locales/sv-SE/strings.json +++ b/packages/react-composites/src/composites/localization/locales/sv-SE/strings.json @@ -408,4 +408,4 @@ "breakoutRoomChatPaneTitle": "Grupprumschatt", "chatContentSpinnerLabel": "Läser in ..." } -} \ No newline at end of file +} diff --git a/packages/react-composites/src/composites/localization/locales/tr-TR/strings.json b/packages/react-composites/src/composites/localization/locales/tr-TR/strings.json index 360a823265a..c74e6f30de4 100644 --- a/packages/react-composites/src/composites/localization/locales/tr-TR/strings.json +++ b/packages/react-composites/src/composites/localization/locales/tr-TR/strings.json @@ -408,4 +408,4 @@ "breakoutRoomChatPaneTitle": "Tartışma Odası Sohbeti", "chatContentSpinnerLabel": "Yükleniyor..." } -} \ No newline at end of file +}