mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2026-04-05 02:10:20 +00:00
Compare commits
138 Commits
saghul-pat
...
android-sd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ef9913c1c7 | ||
|
|
ce195d82d6 | ||
|
|
229e65133c | ||
|
|
11eb6689dc | ||
|
|
bf3cc65f4c | ||
|
|
75e6dd389f | ||
|
|
076113940b | ||
|
|
e6accd40e1 | ||
|
|
7f0cfed981 | ||
|
|
9279586e8c | ||
|
|
f8908c143e | ||
|
|
c705dbaa2f | ||
|
|
1fa43ca4e7 | ||
|
|
9528cbad0e | ||
|
|
a23d57b5ff | ||
|
|
ae5c364333 | ||
|
|
700c7c523d | ||
|
|
5dbf4845fb | ||
|
|
661a3d34be | ||
|
|
0e9b40c410 | ||
|
|
51b827ebb0 | ||
|
|
16a2c729e0 | ||
|
|
ed5bb871f4 | ||
|
|
d96ecc5b65 | ||
|
|
41f11e5adb | ||
|
|
c48aa44af3 | ||
|
|
085b07efcd | ||
|
|
60dcac96a6 | ||
|
|
2e22eb5169 | ||
|
|
e2beb2f3b1 | ||
|
|
664f23a395 | ||
|
|
dc20b2fafe | ||
|
|
00ae2dc6a9 | ||
|
|
a182f53cdc | ||
|
|
9b3f254c6b | ||
|
|
0188086dde | ||
|
|
340698a546 | ||
|
|
0920bda7b8 | ||
|
|
10e5b2f572 | ||
|
|
81e9d01921 | ||
|
|
0d5beb0c4e | ||
|
|
b890f34a53 | ||
|
|
b19e4d76b5 | ||
|
|
65589937ea | ||
|
|
a6bc51cff1 | ||
|
|
ae3fb20d65 | ||
|
|
bfc0567e32 | ||
|
|
0fb29a0c7a | ||
|
|
822850d888 | ||
|
|
64e6c5f461 | ||
|
|
a077043f1b | ||
|
|
646fdef6bb | ||
|
|
da0cb2b837 | ||
|
|
4401ea8818 | ||
|
|
449e226e23 | ||
|
|
ed6f6cf766 | ||
|
|
79b0360d2e | ||
|
|
322ec107cd | ||
|
|
3cbddb9d6a | ||
|
|
76667066e2 | ||
|
|
c172a27f24 | ||
|
|
40a76940ac | ||
|
|
be53c4c522 | ||
|
|
8ef48a8a1d | ||
|
|
827e8201d4 | ||
|
|
591eab7c97 | ||
|
|
d9f71ee238 | ||
|
|
054564ab0a | ||
|
|
3548485e84 | ||
|
|
8393118330 | ||
|
|
991a0e22a8 | ||
|
|
7a479b967c | ||
|
|
0be0d6a76e | ||
|
|
60b551a339 | ||
|
|
208586cead | ||
|
|
c7765cc1b7 | ||
|
|
d8487c25b2 | ||
|
|
2adb5dc7d6 | ||
|
|
cc931986f6 | ||
|
|
ce35a88299 | ||
|
|
58ef2974c9 | ||
|
|
43647f1302 | ||
|
|
599ed10325 | ||
|
|
fb9d28a667 | ||
|
|
b2d6054e1c | ||
|
|
2097d77666 | ||
|
|
4ed7211286 | ||
|
|
5c67e8b4ce | ||
|
|
00a74ca47a | ||
|
|
4a88ad098a | ||
|
|
dd20e8626e | ||
|
|
0fc381fc6f | ||
|
|
73fb586d59 | ||
|
|
6cd6c0a043 | ||
|
|
896e752113 | ||
|
|
c5920bb8a5 | ||
|
|
1623dc4989 | ||
|
|
41db8711f0 | ||
|
|
a0edf329ae | ||
|
|
c2ab8935c1 | ||
|
|
70b8ccc097 | ||
|
|
cc63ff1c3c | ||
|
|
4a5982da1f | ||
|
|
fc16bfa6cb | ||
|
|
9a2aa3848c | ||
|
|
0a65ec1dfa | ||
|
|
7bbc3bcf9e | ||
|
|
48b12b4e00 | ||
|
|
91413fbd96 | ||
|
|
03848fb3f8 | ||
|
|
e8cf932abb | ||
|
|
1a93da8c35 | ||
|
|
73e8f5703c | ||
|
|
a203a92060 | ||
|
|
ef93584c2b | ||
|
|
a618697e34 | ||
|
|
64e504f349 | ||
|
|
994f6307b9 | ||
|
|
d7b581e338 | ||
|
|
763d975445 | ||
|
|
42e62e013d | ||
|
|
04b085e062 | ||
|
|
83e22524bc | ||
|
|
909173cdb5 | ||
|
|
5d1bf9e649 | ||
|
|
14a422ba83 | ||
|
|
0106e68728 | ||
|
|
c843744df1 | ||
|
|
f6f7406d24 | ||
|
|
76a976b5d1 | ||
|
|
2e7c06d045 | ||
|
|
9fbbcbbd31 | ||
|
|
6101cd2c1a | ||
|
|
41d654b2dc | ||
|
|
c381a3eed4 | ||
|
|
f42fe0ce17 | ||
|
|
b277812e8e | ||
|
|
fad5ac9048 |
7
android/app/proguard-rules.pro
vendored
7
android/app/proguard-rules.pro
vendored
@@ -85,4 +85,9 @@
|
||||
# ^^^ We added the above when we switched minifyEnabled on.
|
||||
|
||||
# Rule to avoid build errors related to SVGs.
|
||||
-keep public class com.horcrux.svg.** {*;}
|
||||
-keep public class com.horcrux.svg.** {*;}
|
||||
|
||||
# https://github.com/facebook/fresco/issues/2638
|
||||
-keep public class com.facebook.imageutils.** {
|
||||
public *;
|
||||
}
|
||||
|
||||
@@ -150,8 +150,8 @@ public class MainActivity extends JitsiMeetActivity {
|
||||
// Set default options
|
||||
JitsiMeetConferenceOptions defaultOptions
|
||||
= new JitsiMeetConferenceOptions.Builder()
|
||||
.setWelcomePageEnabled(true)
|
||||
.setServerURL(buildURL(defaultURL))
|
||||
.setFeatureFlag("welcomepage.enabled", true)
|
||||
.setFeatureFlag("call-integration.enabled", false)
|
||||
.setFeatureFlag("resolution", 360)
|
||||
.setFeatureFlag("server-url-change.enabled", !configurationByRestrictions)
|
||||
@@ -182,11 +182,6 @@ public class MainActivity extends JitsiMeetActivity {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onConferenceTerminated(HashMap<String, Object> extraData) {
|
||||
Log.d(TAG, "Conference terminated: " + extraData);
|
||||
}
|
||||
|
||||
// Activity lifecycle method overrides
|
||||
//
|
||||
|
||||
|
||||
@@ -26,5 +26,5 @@ android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
android.bundle.enableUncompressedNativeLibs=false
|
||||
|
||||
appVersion=21.5.0
|
||||
sdkVersion=4.0.0
|
||||
appVersion=21.6.0
|
||||
sdkVersion=4.1.0
|
||||
|
||||
@@ -68,6 +68,7 @@ dependencies {
|
||||
implementation project(':react-native-async-storage')
|
||||
implementation project(':react-native-background-timer')
|
||||
implementation project(':react-native-calendar-events')
|
||||
implementation project(':react-native-community_clipboard')
|
||||
implementation project(':react-native-community_netinfo')
|
||||
implementation project(':react-native-default-preference')
|
||||
implementation project(':react-native-gesture-handler')
|
||||
@@ -217,7 +218,7 @@ publishing {
|
||||
def groupId = it.moduleGroup
|
||||
def artifactId = it.moduleName
|
||||
|
||||
if (artifactId.startsWith('react-native-') && groupId.equals('jitsi-meet')) {
|
||||
if (artifactId.startsWith('react-native-')) {
|
||||
groupId = rootProject.ext.moduleGroupId
|
||||
}
|
||||
|
||||
|
||||
@@ -86,8 +86,8 @@ public class BroadcastEvent {
|
||||
PARTICIPANTS_INFO_RETRIEVED("org.jitsi.meet.PARTICIPANTS_INFO_RETRIEVED"),
|
||||
CHAT_MESSAGE_RECEIVED("org.jitsi.meet.CHAT_MESSAGE_RECEIVED"),
|
||||
CHAT_TOGGLED("org.jitsi.meet.CHAT_TOGGLED"),
|
||||
VIDEO_MUTED_CHANGED("org.jitsi.meet.VIDEO_MUTED_CHANGED");
|
||||
|
||||
VIDEO_MUTED_CHANGED("org.jitsi.meet.VIDEO_MUTED_CHANGED"),
|
||||
READY_TO_CLOSE("org.jitsi.meet.READY_TO_CLOSE");
|
||||
|
||||
private static final String CONFERENCE_WILL_JOIN_NAME = "CONFERENCE_WILL_JOIN";
|
||||
private static final String CONFERENCE_JOINED_NAME = "CONFERENCE_JOINED";
|
||||
@@ -101,6 +101,7 @@ public class BroadcastEvent {
|
||||
private static final String CHAT_MESSAGE_RECEIVED_NAME = "CHAT_MESSAGE_RECEIVED";
|
||||
private static final String CHAT_TOGGLED_NAME = "CHAT_TOGGLED";
|
||||
private static final String VIDEO_MUTED_CHANGED_NAME = "VIDEO_MUTED_CHANGED";
|
||||
private static final String READY_TO_CLOSE_NAME = "READY_TO_CLOSE";
|
||||
|
||||
private final String action;
|
||||
|
||||
@@ -147,6 +148,8 @@ public class BroadcastEvent {
|
||||
return CHAT_TOGGLED;
|
||||
case VIDEO_MUTED_CHANGED_NAME:
|
||||
return VIDEO_MUTED_CHANGED;
|
||||
case READY_TO_CLOSE_NAME:
|
||||
return READY_TO_CLOSE;
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
@@ -194,7 +194,6 @@ public class JitsiMeetActivity extends AppCompatActivity
|
||||
|
||||
protected void onConferenceTerminated(HashMap<String, Object> extraData) {
|
||||
JitsiMeetLogger.i("Conference terminated: " + extraData);
|
||||
finish();
|
||||
}
|
||||
|
||||
protected void onConferenceWillJoin(HashMap<String, Object> extraData) {
|
||||
@@ -217,6 +216,11 @@ public class JitsiMeetActivity extends AppCompatActivity
|
||||
}
|
||||
}
|
||||
|
||||
protected void onReadyToClose() {
|
||||
JitsiMeetLogger.i("SDK is ready to close");
|
||||
finish();
|
||||
}
|
||||
|
||||
// Activity lifecycle methods
|
||||
//
|
||||
|
||||
@@ -298,6 +302,9 @@ public class JitsiMeetActivity extends AppCompatActivity
|
||||
case PARTICIPANT_LEFT:
|
||||
onParticipantLeft(event.getData());
|
||||
break;
|
||||
case READY_TO_CLOSE:
|
||||
onReadyToClose();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,11 +45,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
|
||||
*/
|
||||
private String token;
|
||||
|
||||
/**
|
||||
* Color scheme override, see: https://github.com/jitsi/jitsi-meet/blob/dbedee5e22e5dcf9c92db96ef5bb3c9982fc526d/react/features/base/color-scheme/defaultScheme.js
|
||||
*/
|
||||
private Bundle colorScheme;
|
||||
|
||||
/**
|
||||
* Config. See: https://github.com/jitsi/jitsi-meet/blob/master/config.js
|
||||
*/
|
||||
@@ -77,10 +72,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
|
||||
return token;
|
||||
}
|
||||
|
||||
public Bundle getColorScheme() {
|
||||
return colorScheme;
|
||||
}
|
||||
|
||||
public Bundle getFeatureFlags() {
|
||||
return featureFlags;
|
||||
}
|
||||
@@ -97,7 +88,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
|
||||
private String room;
|
||||
private String token;
|
||||
|
||||
private Bundle colorScheme;
|
||||
private Bundle config;
|
||||
private Bundle featureFlags;
|
||||
|
||||
@@ -152,19 +142,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the color scheme override so the app is themed. See:
|
||||
* https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/color-scheme/defaultScheme.js
|
||||
* for the structure.
|
||||
* @param colorScheme - A color scheme to be applied to the app.
|
||||
* @return - The {@link Builder} object itself so the method calls can be chained.
|
||||
*/
|
||||
public Builder setColorScheme(Bundle colorScheme) {
|
||||
this.colorScheme = colorScheme;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates the conference will be joined with the microphone muted.
|
||||
* @param audioMuted - Muted indication.
|
||||
@@ -198,19 +175,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the welcome page enabled / disabled. The welcome page lists recent meetings and
|
||||
* calendar appointments and it's meant to be used by standalone applications. Defaults to
|
||||
* false.
|
||||
* @param enabled - Whether the welcome page should be enabled or not.
|
||||
* @return - The {@link Builder} object itself so the method calls can be chained.
|
||||
*/
|
||||
public Builder setWelcomePageEnabled(boolean enabled) {
|
||||
this.featureFlags.putBoolean("welcomepage.enabled", enabled);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setFeatureFlag(String flag, boolean value) {
|
||||
this.featureFlags.putBoolean(flag, value);
|
||||
|
||||
@@ -276,7 +240,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
|
||||
options.serverURL = this.serverURL;
|
||||
options.room = this.room;
|
||||
options.token = this.token;
|
||||
options.colorScheme = this.colorScheme;
|
||||
options.config = this.config;
|
||||
options.featureFlags = this.featureFlags;
|
||||
options.userInfo = this.userInfo;
|
||||
@@ -292,7 +255,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
|
||||
serverURL = (URL) in.readSerializable();
|
||||
room = in.readString();
|
||||
token = in.readString();
|
||||
colorScheme = in.readBundle();
|
||||
config = in.readBundle();
|
||||
featureFlags = in.readBundle();
|
||||
userInfo = new JitsiMeetUserInfo(in.readBundle());
|
||||
@@ -308,10 +270,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
|
||||
|
||||
props.putBundle("flags", featureFlags);
|
||||
|
||||
if (colorScheme != null) {
|
||||
props.putBundle("colorScheme", colorScheme);
|
||||
}
|
||||
|
||||
Bundle urlProps = new Bundle();
|
||||
|
||||
// The room is fully qualified
|
||||
@@ -360,7 +318,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
|
||||
dest.writeSerializable(serverURL);
|
||||
dest.writeString(room);
|
||||
dest.writeString(token);
|
||||
dest.writeBundle(colorScheme);
|
||||
dest.writeBundle(config);
|
||||
dest.writeBundle(featureFlags);
|
||||
dest.writeBundle(userInfo != null ? userInfo.asBundle() : new Bundle());
|
||||
|
||||
@@ -180,6 +180,7 @@ class ReactInstanceManagerHolder {
|
||||
new com.calendarevents.CalendarEventsPackage(),
|
||||
new com.corbt.keepawake.KCKeepAwakePackage(),
|
||||
new com.facebook.react.shell.MainReactPackage(),
|
||||
new com.reactnativecommunity.clipboard.ClipboardPackage(),
|
||||
new com.reactnativecommunity.netinfo.NetInfoPackage(),
|
||||
new com.oblador.performance.PerformancePackage(),
|
||||
new com.reactnativecommunity.slider.ReactSliderPackage(),
|
||||
|
||||
@@ -9,6 +9,8 @@ include ':react-native-background-timer'
|
||||
project(':react-native-background-timer').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-background-timer/android')
|
||||
include ':react-native-calendar-events'
|
||||
project(':react-native-calendar-events').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-calendar-events/android')
|
||||
include ':react-native-community_clipboard'
|
||||
project(':react-native-community_clipboard').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/clipboard/android')
|
||||
include ':react-native-community_netinfo'
|
||||
project(':react-native-community_netinfo').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/netinfo/android')
|
||||
include ':react-native-default-preference'
|
||||
|
||||
164
conference.js
164
conference.js
@@ -9,6 +9,7 @@ import { ENDPOINT_TEXT_MESSAGE_NAME } from './modules/API/constants';
|
||||
import { AUDIO_ONLY_SCREEN_SHARE_NO_TRACK } from './modules/UI/UIErrors';
|
||||
import AuthHandler from './modules/UI/authentication/AuthHandler';
|
||||
import UIUtil from './modules/UI/util/UIUtil';
|
||||
import VideoLayout from './modules/UI/videolayout/VideoLayout';
|
||||
import mediaDeviceHelper from './modules/devices/mediaDeviceHelper';
|
||||
import Recorder from './modules/recorder/Recorder';
|
||||
import { createTaskQueue } from './modules/util/helpers';
|
||||
@@ -70,7 +71,8 @@ import {
|
||||
JitsiMediaDevicesEvents,
|
||||
JitsiParticipantConnectionStatus,
|
||||
JitsiTrackErrors,
|
||||
JitsiTrackEvents
|
||||
JitsiTrackEvents,
|
||||
JitsiRecordingConstants
|
||||
} from './react/features/base/lib-jitsi-meet';
|
||||
import {
|
||||
getStartWithAudioMuted,
|
||||
@@ -79,14 +81,15 @@ import {
|
||||
MEDIA_TYPE,
|
||||
setAudioAvailable,
|
||||
setAudioMuted,
|
||||
setAudioUnmutePermissions,
|
||||
setVideoAvailable,
|
||||
setVideoMuted
|
||||
setVideoMuted,
|
||||
setVideoUnmutePermissions
|
||||
} from './react/features/base/media';
|
||||
import {
|
||||
dominantSpeakerChanged,
|
||||
getLocalParticipant,
|
||||
getNormalizedDisplayName,
|
||||
getParticipantById,
|
||||
localParticipantConnectionStatusChanged,
|
||||
localParticipantRoleChanged,
|
||||
participantConnectionStatusChanged,
|
||||
@@ -123,7 +126,11 @@ import {
|
||||
maybeOpenFeedbackDialog,
|
||||
submitFeedback
|
||||
} from './react/features/feedback';
|
||||
import { isModerationNotificationDisplayed, showNotification } from './react/features/notifications';
|
||||
import {
|
||||
isModerationNotificationDisplayed,
|
||||
showNotification,
|
||||
NOTIFICATION_TIMEOUT_TYPE
|
||||
} from './react/features/notifications';
|
||||
import { mediaPermissionPromptVisibilityChanged, toggleSlowGUMOverlay } from './react/features/overlay';
|
||||
import { suspendDetected } from './react/features/power-monitor';
|
||||
import {
|
||||
@@ -134,6 +141,7 @@ import {
|
||||
setJoiningInProgress,
|
||||
setPrejoinPageVisibility
|
||||
} from './react/features/prejoin';
|
||||
import { getActiveSession } from './react/features/recording/functions';
|
||||
import { disableReceiver, stopReceiver } from './react/features/remote-control';
|
||||
import { setScreenAudioShareState, isScreenAudioShared } from './react/features/screen-share/';
|
||||
import { toggleScreenshotCaptureSummary } from './react/features/screenshot-capture';
|
||||
@@ -231,17 +239,6 @@ function sendData(command, value) {
|
||||
room.sendCommand(command, { value });
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user nickname by user id.
|
||||
* @param {string} id user id
|
||||
* @returns {string?} user nickname or undefined if user is unknown.
|
||||
*/
|
||||
function getDisplayName(id) {
|
||||
const participant = getParticipantById(APP.store.getState(), id);
|
||||
|
||||
return participant && participant.name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mute or unmute local audio stream if it exists.
|
||||
* @param {boolean} muted - if audio stream should be muted or unmuted.
|
||||
@@ -357,7 +354,10 @@ class ConferenceConnector {
|
||||
case JitsiConferenceErrors.FOCUS_DISCONNECTED: {
|
||||
const [ focus, retrySec ] = params;
|
||||
|
||||
APP.UI.notifyFocusDisconnected(focus, retrySec);
|
||||
APP.store.dispatch(showNotification({
|
||||
descriptionKey: focus,
|
||||
titleKey: retrySec
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.SHORT));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -755,7 +755,7 @@ export default {
|
||||
APP.store.dispatch(showNotification({
|
||||
descriptionKey: 'notify.startSilentDescription',
|
||||
titleKey: 'notify.startSilentTitle'
|
||||
}));
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.LONG));
|
||||
}
|
||||
|
||||
// XXX The API will take care of disconnecting from the XMPP
|
||||
@@ -1211,14 +1211,6 @@ export default {
|
||||
return room.isConnectionInterrupted();
|
||||
},
|
||||
|
||||
/**
|
||||
* Obtains the local display name.
|
||||
* @returns {string|undefined}
|
||||
*/
|
||||
getLocalDisplayName() {
|
||||
return getDisplayName(this.getMyUserId());
|
||||
},
|
||||
|
||||
/**
|
||||
* Finds JitsiParticipant for given id.
|
||||
*
|
||||
@@ -1231,29 +1223,6 @@ export default {
|
||||
return room ? room.getParticipantById(id) : null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the display name foe the <tt>JitsiParticipant</tt> identified by
|
||||
* the given <tt>id</tt>.
|
||||
*
|
||||
* @param id {string} the participant's id(MUC nickname/JVB endpoint id)
|
||||
*
|
||||
* @return {string} the participant's display name or the default string if
|
||||
* absent.
|
||||
*/
|
||||
getParticipantDisplayName(id) {
|
||||
const displayName = getDisplayName(id);
|
||||
|
||||
if (displayName) {
|
||||
return displayName;
|
||||
}
|
||||
if (APP.conference.isLocalId(id)) {
|
||||
return APP.translation.generateTranslationHTML(
|
||||
interfaceConfig.DEFAULT_LOCAL_DISPLAY_NAME);
|
||||
}
|
||||
|
||||
return interfaceConfig.DEFAULT_REMOTE_DISPLAY_NAME;
|
||||
},
|
||||
|
||||
getMyUserId() {
|
||||
return room && room.myUserId();
|
||||
},
|
||||
@@ -1364,10 +1333,19 @@ export default {
|
||||
/**
|
||||
* Used by the Breakout Rooms feature to join a breakout room or go back to the main room.
|
||||
*/
|
||||
async joinRoom(roomName, isBreakoutRoom = false) {
|
||||
async joinRoom(roomName, options) {
|
||||
// Reset VideoLayout. It's destroyed in features/video-layout/middleware.web.js so re-initialize it.
|
||||
VideoLayout.initLargeVideo();
|
||||
VideoLayout.resizeVideoArea();
|
||||
|
||||
// Restore initial state.
|
||||
this._localTracksInitialized = false;
|
||||
this.isSharingScreen = false;
|
||||
this.localPresenterVideo = null;
|
||||
|
||||
this.roomName = roomName;
|
||||
|
||||
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks();
|
||||
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks(options);
|
||||
const localTracks = await tryCreateLocalTracks;
|
||||
|
||||
this._displayErrorsForCreateInitialLocalTracks(errors);
|
||||
@@ -1377,33 +1355,15 @@ export default {
|
||||
track.mute();
|
||||
}
|
||||
});
|
||||
this._createRoom(localTracks, isBreakoutRoom);
|
||||
this._createRoom(localTracks);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
new ConferenceConnector(resolve, reject).connect();
|
||||
});
|
||||
},
|
||||
|
||||
_createRoom(localTracks, isBreakoutRoom = false) {
|
||||
const extraOptions = {};
|
||||
|
||||
if (isBreakoutRoom) {
|
||||
// We must be in a room already.
|
||||
if (!room?.xmpp?.breakoutRoomsComponentAddress) {
|
||||
throw new Error('Breakout Rooms not enabled');
|
||||
}
|
||||
|
||||
// TODO: re-evaluate this. -saghul
|
||||
extraOptions.customDomain = room.xmpp.breakoutRoomsComponentAddress;
|
||||
}
|
||||
|
||||
room
|
||||
= connection.initJitsiConference(
|
||||
APP.conference.roomName,
|
||||
{
|
||||
...this._getConferenceOptions(),
|
||||
...extraOptions
|
||||
});
|
||||
_createRoom(localTracks) {
|
||||
room = connection.initJitsiConference(APP.conference.roomName, this._getConferenceOptions());
|
||||
|
||||
// Filter out the tracks that are muted (except on Safari).
|
||||
const tracks = browser.isWebKitBased() ? localTracks : localTracks.filter(track => !track.isMuted());
|
||||
@@ -1751,10 +1711,10 @@ export default {
|
||||
= this._turnScreenSharingOff.bind(this, didHaveVideo);
|
||||
|
||||
const desktopVideoStream = desktopStreams.find(stream => stream.getType() === MEDIA_TYPE.VIDEO);
|
||||
const dekstopAudioStream = desktopStreams.find(stream => stream.getType() === MEDIA_TYPE.AUDIO);
|
||||
const desktopAudioStream = desktopStreams.find(stream => stream.getType() === MEDIA_TYPE.AUDIO);
|
||||
|
||||
if (dekstopAudioStream) {
|
||||
dekstopAudioStream.on(
|
||||
if (desktopAudioStream) {
|
||||
desktopAudioStream.on(
|
||||
JitsiTrackEvents.LOCAL_TRACK_STOPPED,
|
||||
() => {
|
||||
logger.debug(`Local screensharing audio track stopped. ${this.isSharingScreen}`);
|
||||
@@ -1976,7 +1936,9 @@ export default {
|
||||
.then(() => {
|
||||
this.videoSwitchInProgress = false;
|
||||
if (config.enableScreenshotCapture) {
|
||||
APP.store.dispatch(toggleScreenshotCaptureSummary(true));
|
||||
if (getActiveSession(APP.store.getState(), JitsiRecordingConstants.mode.FILE)) {
|
||||
APP.store.dispatch(toggleScreenshotCaptureSummary(true));
|
||||
}
|
||||
}
|
||||
sendAnalytics(createScreenSharingEvent('started'));
|
||||
logger.log('Screen sharing started');
|
||||
@@ -2174,6 +2136,8 @@ export default {
|
||||
}
|
||||
});
|
||||
|
||||
room.on(JitsiConferenceEvents.TRACK_UNMUTE_REJECTED, track => APP.store.dispatch(destroyLocalTracks(track)));
|
||||
|
||||
room.on(JitsiConferenceEvents.SUBJECT_CHANGED,
|
||||
subject => APP.store.dispatch(conferenceSubjectChanged(subject)));
|
||||
|
||||
@@ -2215,6 +2179,10 @@ export default {
|
||||
(id, displayName) => {
|
||||
const formattedDisplayName
|
||||
= getNormalizedDisplayName(displayName);
|
||||
const state = APP.store.getState();
|
||||
const {
|
||||
defaultRemoteDisplayName
|
||||
} = state['features/base/config'];
|
||||
|
||||
APP.store.dispatch(participantUpdated({
|
||||
conference: room,
|
||||
@@ -2226,7 +2194,7 @@ export default {
|
||||
formattedDisplayName:
|
||||
appendSuffix(
|
||||
formattedDisplayName
|
||||
|| interfaceConfig.DEFAULT_REMOTE_DISPLAY_NAME)
|
||||
|| defaultRemoteDisplayName)
|
||||
});
|
||||
}
|
||||
);
|
||||
@@ -2298,6 +2266,17 @@ export default {
|
||||
APP.store.dispatch(suspendDetected());
|
||||
});
|
||||
|
||||
room.on(
|
||||
JitsiConferenceEvents.AUDIO_UNMUTE_PERMISSIONS_CHANGED,
|
||||
disableAudioMuteChange => {
|
||||
APP.store.dispatch(setAudioUnmutePermissions(disableAudioMuteChange));
|
||||
});
|
||||
room.on(
|
||||
JitsiConferenceEvents.VIDEO_UNMUTE_PERMISSIONS_CHANGED,
|
||||
disableVideoMuteChange => {
|
||||
APP.store.dispatch(setVideoUnmutePermissions(disableVideoMuteChange));
|
||||
});
|
||||
|
||||
APP.UI.addListener(UIEvents.AUDIO_MUTED, muted => {
|
||||
this.muteAudio(muted);
|
||||
});
|
||||
@@ -2364,7 +2343,12 @@ export default {
|
||||
}
|
||||
|
||||
Promise.allSettled(promises)
|
||||
.then(() => APP.UI.notifyInitiallyMuted());
|
||||
.then(() => {
|
||||
APP.store.dispatch(showNotification({
|
||||
titleKey: 'notify.mutedTitle',
|
||||
descriptionKey: 'notify.muted'
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.SHORT));
|
||||
});
|
||||
});
|
||||
|
||||
room.on(
|
||||
@@ -2929,7 +2913,7 @@ export default {
|
||||
|
||||
Promise.all([
|
||||
requestFeedbackPromise,
|
||||
this.leaveRoomAndDisconnect()
|
||||
this.leaveRoom()
|
||||
])
|
||||
.then(values => {
|
||||
this._room = undefined;
|
||||
@@ -2950,27 +2934,23 @@ export default {
|
||||
/**
|
||||
* Leaves the room.
|
||||
*
|
||||
* @param {boolean} doDisconnect - Wether leaving the room should also terminate the connection.
|
||||
* @returns {Promise}
|
||||
*/
|
||||
leaveRoom() {
|
||||
if (room && room.isJoined()) {
|
||||
return room.leave();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Leaves the room and calls JitsiConnection.disconnect.
|
||||
*
|
||||
* @returns {Promise}
|
||||
*/
|
||||
leaveRoomAndDisconnect() {
|
||||
async leaveRoom(doDisconnect = true) {
|
||||
APP.store.dispatch(conferenceWillLeave(room));
|
||||
|
||||
if (room && room.isJoined()) {
|
||||
return room.leave().then(disconnect, disconnect);
|
||||
return room.leave().finally(() => {
|
||||
if (doDisconnect) {
|
||||
return disconnect();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return disconnect();
|
||||
if (doDisconnect) {
|
||||
return disconnect();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
34
config.js
34
config.js
@@ -83,6 +83,9 @@ var config = {
|
||||
// Disables polls feature.
|
||||
// disablePolls: false,
|
||||
|
||||
// Disables self-view tile. (hides it from tile view and from filmstrip)
|
||||
// disableSelfView: false,
|
||||
|
||||
// Disables ICE/UDP by filtering out local and remote UDP candidates in
|
||||
// signalling.
|
||||
// webrtcIceUdpDisable: false,
|
||||
@@ -375,6 +378,13 @@ var config = {
|
||||
// resizeDesktopForPresenter: false
|
||||
// },
|
||||
|
||||
// Notification timeouts
|
||||
// notificationTimeouts: {
|
||||
// short: 2500,
|
||||
// medium: 5000,
|
||||
// long: 10000
|
||||
// },
|
||||
|
||||
// // Options for the recording limit notification.
|
||||
// recordingLimit: {
|
||||
//
|
||||
@@ -393,6 +403,9 @@ var config = {
|
||||
// Disables or enables RTX (RFC 4588) (defaults to false).
|
||||
// disableRtx: false,
|
||||
|
||||
// Moves all Jitsi Meet 'beforeunload' logic (cleanup, leaving, disconnecting, etc) to the 'unload' event.
|
||||
// disableBeforeUnloadHandlers: true,
|
||||
|
||||
// Disables or enables TCC support in this client (default: enabled).
|
||||
// enableTcc: true,
|
||||
|
||||
@@ -459,6 +472,12 @@ var config = {
|
||||
// when the toolbar is shown on mouse movements
|
||||
// disable1On1Mode: null | false | true,
|
||||
|
||||
// Default local name to be displayed
|
||||
// defaultLocalDisplayName: 'me',
|
||||
|
||||
// Default remote name to be displayed
|
||||
// defaultRemoteDisplayName: 'Fellow Jitster',
|
||||
|
||||
// Default language for the user interface.
|
||||
// defaultLanguage: 'en',
|
||||
|
||||
@@ -480,8 +499,14 @@ var config = {
|
||||
// and microsoftApiApplicationClientID
|
||||
// enableCalendarIntegration: false,
|
||||
|
||||
// When 'true', it shows an intermediate page before joining, where the user can configure their devices.
|
||||
// prejoinPageEnabled: false,
|
||||
// Configs for prejoin page.
|
||||
// prejoinConfig: {
|
||||
// // When 'true', it shows an intermediate page before joining, where the user can configure their devices.
|
||||
// // This replaces `prejoinPageEnabled`.
|
||||
// enabled: true,
|
||||
// // List of buttons to hide from the extra join options dropdown.
|
||||
// hideExtraJoinButtons: ['no-audio', 'by-phone']
|
||||
// },
|
||||
|
||||
// When 'true', the user cannot edit the display name.
|
||||
// (Mainly useful when used in conjuction with the JWT so the JWT name becomes read only.)
|
||||
@@ -740,7 +765,7 @@ var config = {
|
||||
// module connects to the provided rtcstatsEndpoint and sends statistics regarding
|
||||
// PeerConnection states along with getStats metrics polled at the specified
|
||||
// interval.
|
||||
// rtcstatsEnabled: true,
|
||||
// rtcstatsEnabled: false,
|
||||
|
||||
// In order to enable rtcstats one needs to provide a endpoint url.
|
||||
// rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/,
|
||||
@@ -979,6 +1004,9 @@ var config = {
|
||||
// If true, tile view will not be enabled automatically when the participants count threshold is reached.
|
||||
// disableTileView: true,
|
||||
|
||||
// If true, the tiles will be displayed contained within the available space rather than enlarged to cover it.
|
||||
// disableTileEnlargement: true,
|
||||
|
||||
// Controls the visibility and behavior of the top header conference info labels.
|
||||
// If a label's id is not in any of the 2 arrays, it will not be visible at all on the header.
|
||||
// conferenceInfo: {
|
||||
|
||||
@@ -65,6 +65,11 @@
|
||||
text-align: left;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.moderator-settings-wrapper {
|
||||
padding-top: 20px;
|
||||
}
|
||||
|
||||
.profile-edit-field {
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
@@ -82,6 +82,7 @@ Component "breakout.jitmeet.example.com" "muc"
|
||||
"muc_meeting_id";
|
||||
"muc_domain_mapper";
|
||||
--"token_verification";
|
||||
"muc_rate_limit";
|
||||
}
|
||||
admins = { "focusUser@auth.jitmeet.example.com" }
|
||||
muc_room_locking = false
|
||||
@@ -121,3 +122,6 @@ Component "lobby.jitmeet.example.com" "muc"
|
||||
restrict_room_creation = true
|
||||
muc_room_locking = false
|
||||
muc_room_default_public_jids = true
|
||||
modules_enabled = {
|
||||
"muc_rate_limit";
|
||||
}
|
||||
|
||||
0
fonts.html
Normal file
0
fonts.html
Normal file
@@ -9,6 +9,7 @@
|
||||
|
||||
<link rel="apple-touch-icon" href="images/apple-touch-icon.png">
|
||||
<link rel="stylesheet" href="css/all.css">
|
||||
<!--#include virtual="fonts.html"-->
|
||||
<link rel="manifest" id="manifest-placeholder">
|
||||
|
||||
<script>
|
||||
|
||||
@@ -27,9 +27,7 @@ var interfaceConfig = {
|
||||
CLOSE_PAGE_GUEST_HINT: false, // A html text to be shown to guests on the close page, false disables it
|
||||
|
||||
DEFAULT_BACKGROUND: '#474747',
|
||||
DEFAULT_LOCAL_DISPLAY_NAME: 'me',
|
||||
DEFAULT_LOGO_URL: 'images/watermark.svg',
|
||||
DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Jitster',
|
||||
DEFAULT_WELCOME_PAGE_LOGO_URL: 'images/watermark.svg',
|
||||
|
||||
DISABLE_DOMINANT_SPEAKER_INDICATOR: false,
|
||||
@@ -225,13 +223,6 @@ var interfaceConfig = {
|
||||
*/
|
||||
// ANDROID_APP_PACKAGE: 'org.jitsi.meet',
|
||||
|
||||
/**
|
||||
* Override the behavior of some notifications to remain displayed until
|
||||
* explicitly dismissed through a user action. The value is how long, in
|
||||
* milliseconds, those notifications should remain displayed.
|
||||
*/
|
||||
// ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT: 15000,
|
||||
|
||||
// List of undocumented settings
|
||||
/**
|
||||
INDICATOR_FONT_SIZES
|
||||
@@ -248,6 +239,12 @@ var interfaceConfig = {
|
||||
// Please use disableModeratorIndicator from config.js
|
||||
// DISABLE_FOCUS_INDICATOR: false,
|
||||
|
||||
// Please use defaultLocalDisplayName from config.js
|
||||
// DEFAULT_LOCAL_DISPLAY_NAME: 'me',
|
||||
|
||||
// Please use defaultRemoteDisplayName from config.js
|
||||
// DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Jitster',
|
||||
|
||||
// Moved to config.js as `toolbarConfig.initialTimeout`.
|
||||
// INITIAL_TOOLBAR_TIMEOUT: 20000,
|
||||
|
||||
|
||||
13
ios/Podfile
13
ios/Podfile
@@ -61,23 +61,24 @@ target 'JitsiMeetSDK' do
|
||||
pod 'react-native-keep-awake', :path => '../node_modules/react-native-keep-awake'
|
||||
pod 'react-native-netinfo', :path => '../node_modules/@react-native-community/netinfo'
|
||||
pod 'react-native-performance', :path => '../node_modules/react-native-performance/ios'
|
||||
pod 'react-native-safe-area-context', :path => '../node_modules/react-native-safe-area-context'
|
||||
pod 'react-native-slider', :path => '../node_modules/@react-native-community/slider'
|
||||
pod 'react-native-splash-screen', :path => '../node_modules/react-native-splash-screen'
|
||||
pod 'react-native-video', :path => '../node_modules/react-native-video/react-native-video.podspec'
|
||||
pod 'react-native-webview', :path => '../node_modules/react-native-webview'
|
||||
pod 'react-native-webrtc', :path => '../node_modules/react-native-webrtc'
|
||||
pod 'RNCAsyncStorage', :path => '../node_modules/@react-native-async-storage/async-storage'
|
||||
pod 'RNCClipboard', :path => '../node_modules/@react-native-community/clipboard'
|
||||
pod 'RNCMaskedView', :path => '../node_modules/@react-native-masked-view/masked-view'
|
||||
pod 'RNDefaultPreference', :path => '../node_modules/react-native-default-preference'
|
||||
pod 'RNDeviceInfo', :path => '../node_modules/react-native-device-info'
|
||||
pod 'RNGestureHandler', :path => '../node_modules/react-native-gesture-handler'
|
||||
pod 'RNGoogleSignin', :path => '../node_modules/@react-native-community/google-signin'
|
||||
pod 'RNReanimated', :path => '../node_modules/react-native-reanimated'
|
||||
pod 'RNScreens', :path => '../node_modules/react-native-screens'
|
||||
pod 'RNSound', :path => '../node_modules/react-native-sound'
|
||||
pod 'RNSVG', :path => '../node_modules/react-native-svg'
|
||||
pod 'RNWatch', :path => '../node_modules/react-native-watch-connectivity'
|
||||
pod 'RNDefaultPreference', :path => '../node_modules/react-native-default-preference'
|
||||
pod 'RNGestureHandler', :path => '../node_modules/react-native-gesture-handler'
|
||||
pod 'RNReanimated', :path => '../node_modules/react-native-reanimated'
|
||||
pod 'RNScreens', :path => '../node_modules/react-native-screens'
|
||||
pod 'react-native-safe-area-context', :path => '../node_modules/react-native-safe-area-context'
|
||||
pod 'RNCMaskedView', :path => '../node_modules/@react-native-masked-view/masked-view'
|
||||
|
||||
# Native pod dependencies
|
||||
#
|
||||
|
||||
@@ -303,7 +303,7 @@ PODS:
|
||||
- react-native-video/Video (= 5.1.1)
|
||||
- react-native-video/Video (5.1.1):
|
||||
- React-Core
|
||||
- react-native-webrtc (1.92.2):
|
||||
- react-native-webrtc (1.94.1):
|
||||
- React-Core
|
||||
- react-native-webview (11.0.2):
|
||||
- React-Core
|
||||
@@ -363,6 +363,8 @@ PODS:
|
||||
- ReactCommon/turbomodule/core (= 0.61.5-jitsi.2)
|
||||
- RNCAsyncStorage (1.15.5):
|
||||
- React-Core
|
||||
- RNCClipboard (1.5.1):
|
||||
- React-Core
|
||||
- RNCMaskedView (0.2.6):
|
||||
- React-Core
|
||||
- RNDefaultPreference (1.4.2):
|
||||
@@ -435,6 +437,7 @@ DEPENDENCIES:
|
||||
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
|
||||
- ReactCommon/turbomodule (from `../node_modules/react-native/ReactCommon`)
|
||||
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
|
||||
- "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)"
|
||||
- "RNCMaskedView (from `../node_modules/@react-native-masked-view/masked-view`)"
|
||||
- RNDefaultPreference (from `../node_modules/react-native-default-preference`)
|
||||
- RNDeviceInfo (from `../node_modules/react-native-device-info`)
|
||||
@@ -547,6 +550,8 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/react-native/ReactCommon"
|
||||
RNCAsyncStorage:
|
||||
:path: "../node_modules/@react-native-async-storage/async-storage"
|
||||
RNCClipboard:
|
||||
:path: "../node_modules/@react-native-community/clipboard"
|
||||
RNCMaskedView:
|
||||
:path: "../node_modules/@react-native-masked-view/masked-view"
|
||||
RNDefaultPreference:
|
||||
@@ -616,7 +621,7 @@ SPEC CHECKSUMS:
|
||||
react-native-slider: e99fc201cefe81270fc9d81714a7a0f5e566b168
|
||||
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
|
||||
react-native-video: 0bb76b6d6b77da3009611586c7dbf817b947f30e
|
||||
react-native-webrtc: 41526e4060dac373c18676f866962d4180ee47b9
|
||||
react-native-webrtc: 2f20515f3ebb9dbf1f2aad638cc7573396cf948f
|
||||
react-native-webview: dfd7202ff115c44d3ea401c2f36122fb3ac79f07
|
||||
React-RCTActionSheet: bcbc311dc3b47bc8efb2737ff0940239a45789a9
|
||||
React-RCTAnimation: 65f61080ce632f6dea23d52e354ffac9948396c6
|
||||
@@ -629,6 +634,7 @@ SPEC CHECKSUMS:
|
||||
React-RCTVibration: c1041024893fdfdb8371e7c720c437751b711676
|
||||
ReactCommon: 18014e1d98dbeb9141e935cfe35fc93bd511ffb6
|
||||
RNCAsyncStorage: 56a3355a10b5d660c48c6e37325ac85ebfd09885
|
||||
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
|
||||
RNCMaskedView: c298b644a10c0c142055b3ae24d83879ecb13ccd
|
||||
RNDefaultPreference: 1f8133ec0bc0f9453cdada578564ba1ef551fb44
|
||||
RNDeviceInfo: 87d2d175c760f6bcf58acd036f887e8b2392802c
|
||||
@@ -641,6 +647,6 @@ SPEC CHECKSUMS:
|
||||
RNWatch: a5320c959c75e72845c07985f3e935e58998f1d3
|
||||
Yoga: 96b469c5e81ff51b917b92e8c3390642d4ded30c
|
||||
|
||||
PODFILE CHECKSUM: 836d4804218c0608e1326471ec83fe31cfa9c86d
|
||||
PODFILE CHECKSUM: 0cfc1f35e2872ceb0a86252e14e226bd489a2602
|
||||
|
||||
COCOAPODS: 1.11.2
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>21.5.0</string>
|
||||
<string>21.6.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>NSExtension</key>
|
||||
|
||||
@@ -34,10 +34,10 @@
|
||||
jitsiMeet.universalLinkDomains = @[@"meet.jit.si", @"alpha.jitsi.net", @"beta.meet.jit.si"];
|
||||
|
||||
jitsiMeet.defaultConferenceOptions = [JitsiMeetConferenceOptions fromBuilder:^(JitsiMeetConferenceOptionsBuilder *builder) {
|
||||
[builder setFeatureFlag:@"welcomepage.enabled" withBoolean:YES];
|
||||
[builder setFeatureFlag:@"resolution" withValue:@(360)];
|
||||
[builder setFeatureFlag:@"ios.screensharing.enabled" withBoolean:YES];
|
||||
builder.serverURL = [NSURL URLWithString:@"https://meet.jit.si"];
|
||||
builder.welcomePageEnabled = YES;
|
||||
|
||||
// Apple rejected our app because they claim requiring a
|
||||
// Dropbox account for recording is not acceptable.
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>21.5.0</string>
|
||||
<string>21.6.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
|
||||
@@ -91,10 +91,13 @@
|
||||
#if 0
|
||||
- (void)enterPictureInPicture:(NSDictionary *)data {
|
||||
[self _onJitsiMeetViewDelegateEvent:@"ENTER_PICTURE_IN_PICTURE" withData:data];
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
- (void)readyToClose:(NSDictionary *)data {
|
||||
[self _onJitsiMeetViewDelegateEvent:@"READY_TO_CLOSE" withData:data];
|
||||
}
|
||||
|
||||
- (void)participantJoined:(NSDictionary *)data {
|
||||
NSLog(@"%@%@", @"Participant joined: ", data[@"participantId"]);
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>21.5.0</string>
|
||||
<string>21.6.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>XPC!</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>21.5.0</string>
|
||||
<string>21.6.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>CLKComplicationPrincipalClass</key>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>4.0.0</string>
|
||||
<string>4.1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
|
||||
@@ -34,12 +34,6 @@
|
||||
*/
|
||||
@property (nonatomic, copy, nullable) NSString *token;
|
||||
|
||||
/**
|
||||
* Color scheme override, see:
|
||||
* https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/color-scheme/defaultScheme.js
|
||||
*/
|
||||
@property (nonatomic, copy, nullable) NSDictionary *colorScheme;
|
||||
|
||||
/**
|
||||
* Feature flags. See: https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/flags/constants.js
|
||||
*/
|
||||
@@ -47,12 +41,6 @@
|
||||
|
||||
@property (nonatomic, readonly, nonnull) NSDictionary *config;
|
||||
|
||||
/**
|
||||
* Set to YES to enable the welcome page. Typically SDK users won't need this enabled
|
||||
* since the host application decides which meeting to join.
|
||||
*/
|
||||
@property (nonatomic) BOOL welcomePageEnabled;
|
||||
|
||||
/**
|
||||
* Information about the local user. It will be used in absence of a token.
|
||||
*/
|
||||
@@ -82,11 +70,8 @@
|
||||
@property (nonatomic, copy, nullable, readonly) NSString *room;
|
||||
@property (nonatomic, copy, nullable, readonly) NSString *token;
|
||||
|
||||
@property (nonatomic, copy, nullable) NSDictionary *colorScheme;
|
||||
@property (nonatomic, readonly, nonnull) NSDictionary *featureFlags;
|
||||
|
||||
@property (nonatomic, readonly) BOOL welcomePageEnabled;
|
||||
|
||||
@property (nonatomic, nullable) JitsiMeetUserInfo *userInfo;
|
||||
|
||||
+ (instancetype _Nonnull)fromBuilder:(void (^_Nonnull)(JitsiMeetConferenceOptionsBuilder *_Nonnull))initBlock;
|
||||
|
||||
@@ -19,26 +19,17 @@
|
||||
#import "JitsiMeetConferenceOptions+Private.h"
|
||||
#import "JitsiMeetUserInfo+Private.h"
|
||||
|
||||
/**
|
||||
* Backwards compatibility: turn the boolean property into a feature flag.
|
||||
*/
|
||||
static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
|
||||
|
||||
|
||||
@implementation JitsiMeetConferenceOptionsBuilder {
|
||||
NSMutableDictionary *_featureFlags;
|
||||
NSMutableDictionary *_config;
|
||||
}
|
||||
|
||||
@dynamic welcomePageEnabled;
|
||||
|
||||
- (instancetype)init {
|
||||
if (self = [super init]) {
|
||||
_serverURL = nil;
|
||||
_room = nil;
|
||||
_token = nil;
|
||||
|
||||
_colorScheme = nil;
|
||||
_config = [[NSMutableDictionary alloc] init];
|
||||
_featureFlags = [[NSMutableDictionary alloc] init];
|
||||
|
||||
@@ -96,19 +87,6 @@ static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
|
||||
_config[config] = value;
|
||||
}
|
||||
|
||||
#pragma mark - Dynamic properties
|
||||
|
||||
- (void)setWelcomePageEnabled:(BOOL)welcomePageEnabled {
|
||||
[self setFeatureFlag:WelcomePageEnabledFeatureFlag
|
||||
withBoolean:welcomePageEnabled];
|
||||
}
|
||||
|
||||
- (BOOL)welcomePageEnabled {
|
||||
NSNumber *n = _featureFlags[WelcomePageEnabledFeatureFlag];
|
||||
|
||||
return n != nil ? [n boolValue] : NO;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation JitsiMeetConferenceOptions {
|
||||
@@ -116,16 +94,6 @@ static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
|
||||
NSDictionary *_config;
|
||||
}
|
||||
|
||||
@dynamic welcomePageEnabled;
|
||||
|
||||
#pragma mark - Dynamic properties
|
||||
|
||||
- (BOOL)welcomePageEnabled {
|
||||
NSNumber *n = _featureFlags[WelcomePageEnabledFeatureFlag];
|
||||
|
||||
return n != nil ? [n boolValue] : NO;
|
||||
}
|
||||
|
||||
#pragma mark - Internal initializer
|
||||
|
||||
- (instancetype)initWithBuilder:(JitsiMeetConferenceOptionsBuilder *)builder {
|
||||
@@ -134,8 +102,6 @@ static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
|
||||
_room = builder.room;
|
||||
_token = builder.token;
|
||||
|
||||
_colorScheme = builder.colorScheme;
|
||||
|
||||
_config = builder.config;
|
||||
|
||||
_featureFlags = [NSDictionary dictionaryWithDictionary:builder.featureFlags];
|
||||
@@ -161,10 +127,6 @@ static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
|
||||
|
||||
props[@"flags"] = [NSMutableDictionary dictionaryWithDictionary:_featureFlags];
|
||||
|
||||
if (_colorScheme != nil) {
|
||||
props[@"colorScheme"] = self.colorScheme;
|
||||
}
|
||||
|
||||
NSMutableDictionary *urlProps = [[NSMutableDictionary alloc] init];
|
||||
|
||||
// The room is fully qualified.
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
@property (nonatomic, copy, nullable) NSString *displayName;
|
||||
/**
|
||||
* User e-mail.
|
||||
* User email.
|
||||
*/
|
||||
@property (nonatomic, copy, nullable) NSString *email;
|
||||
/**
|
||||
|
||||
@@ -111,4 +111,9 @@
|
||||
*/
|
||||
- (void)videoMutedChanged:(NSDictionary *)data;
|
||||
|
||||
/**
|
||||
* Called when the SDK is ready to be closed. No meeting is happening at this point.
|
||||
*/
|
||||
- (void)readyToClose:(NSDictionary *)data;
|
||||
|
||||
@end
|
||||
|
||||
@@ -114,6 +114,7 @@ RCT_EXPORT_METHOD(setProviderConfiguration:(NSDictionary *)dictionary) {
|
||||
DDLogInfo(@"[RNCallKit][setProviderConfiguration:] dictionary = %@", dictionary);
|
||||
|
||||
if (![JMCallKitProxy isProviderConfigured]) {
|
||||
JMCallKitProxy.enabled = true;
|
||||
[self configureProviderFromDictionary:dictionary];
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright @ 2019-present 8x8, Inc.
|
||||
* Copyright @ 2018-2019 Atlassian Pty Ltd
|
||||
* Copyright @ 2018-present 8x8, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -18,7 +17,7 @@
|
||||
import CallKit
|
||||
import Foundation
|
||||
|
||||
public protocol CXProviderProtocol: class {
|
||||
public protocol CXProviderProtocol: AnyObject {
|
||||
var configuration: CXProviderConfiguration { get set }
|
||||
func setDelegate(_ delegate: CXProviderDelegate?, queue: DispatchQueue?)
|
||||
func reportNewIncomingCall(with UUID: UUID, update: CXCallUpdate, completion: @escaping (Error?) -> Void)
|
||||
@@ -29,7 +28,7 @@ public protocol CXProviderProtocol: class {
|
||||
func invalidate()
|
||||
}
|
||||
|
||||
public protocol CXCallControllerProtocol: class {
|
||||
public protocol CXCallControllerProtocol: AnyObject {
|
||||
var calls: [CXCall] { get }
|
||||
func request(_ transaction: CXTransaction, completion: @escaping (Error?) -> Swift.Void)
|
||||
}
|
||||
@@ -53,7 +52,9 @@ extension CXCallController: CXCallControllerProtocol {
|
||||
public static var callKitProvider: CXProviderProtocol?
|
||||
public static var callKitCallController: CXCallControllerProtocol?
|
||||
|
||||
private static var provider: CXProviderProtocol {
|
||||
private static var defaultProvider: CXProvider?
|
||||
|
||||
private static var provider: CXProviderProtocol? {
|
||||
callKitProvider ?? defaultProvider
|
||||
}
|
||||
|
||||
@@ -64,8 +65,8 @@ extension CXCallController: CXCallControllerProtocol {
|
||||
private static var providerConfiguration: CXProviderConfiguration? {
|
||||
didSet {
|
||||
guard let configuration = providerConfiguration else { return }
|
||||
provider.configuration = configuration
|
||||
provider.setDelegate(emitter, queue: nil)
|
||||
provider?.configuration = configuration
|
||||
provider?.setDelegate(emitter, queue: nil)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,32 +74,27 @@ extension CXCallController: CXCallControllerProtocol {
|
||||
return CXCallController()
|
||||
}()
|
||||
|
||||
private static var defaultProvider: CXProvider = {
|
||||
let configuration = CXProviderConfiguration(localizedName: "")
|
||||
return CXProvider(configuration: configuration)
|
||||
}()
|
||||
|
||||
private static let emitter: JMCallKitEmitter = {
|
||||
return JMCallKitEmitter()
|
||||
}()
|
||||
|
||||
/// Enables the proxy in between CallKit and the consumers of the SDK.
|
||||
/// Defaults to enabled, set to false when you don't want to use CallKit.
|
||||
@objc public static var enabled: Bool = true {
|
||||
/// Defaults to disabled. Set to true when you want to use CallKit.
|
||||
@objc public static var enabled: Bool = false {
|
||||
didSet {
|
||||
if callKitProvider == nil {
|
||||
provider.invalidate()
|
||||
provider?.invalidate()
|
||||
}
|
||||
|
||||
if enabled {
|
||||
guard isProviderConfigured() else { return }
|
||||
let configuration = providerConfiguration ?? CXProviderConfiguration(localizedName: "")
|
||||
if callKitProvider == nil {
|
||||
defaultProvider = CXProvider(configuration: providerConfiguration!)
|
||||
defaultProvider = CXProvider(configuration: configuration)
|
||||
}
|
||||
|
||||
provider.setDelegate(emitter, queue: nil)
|
||||
provider?.setDelegate(emitter, queue: nil)
|
||||
} else {
|
||||
provider.setDelegate(nil, queue: nil)
|
||||
provider?.setDelegate(nil, queue: nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -149,9 +145,9 @@ extension CXCallController: CXCallControllerProtocol {
|
||||
let callUpdate = makeCXUpdate(handle: handle,
|
||||
displayName: displayName,
|
||||
hasVideo: hasVideo)
|
||||
provider.reportNewIncomingCall(with: UUID,
|
||||
update: callUpdate,
|
||||
completion: completion)
|
||||
provider?.reportNewIncomingCall(with: UUID,
|
||||
update: callUpdate,
|
||||
completion: completion)
|
||||
}
|
||||
|
||||
@objc public static func reportCallUpdate(with UUID: UUID,
|
||||
@@ -163,7 +159,7 @@ extension CXCallController: CXCallControllerProtocol {
|
||||
let callUpdate = makeCXUpdate(handle: handle,
|
||||
displayName: displayName,
|
||||
hasVideo: hasVideo)
|
||||
provider.reportCall(with: UUID, updated: callUpdate)
|
||||
provider?.reportCall(with: UUID, updated: callUpdate)
|
||||
}
|
||||
|
||||
@objc public static func reportCall(
|
||||
@@ -171,17 +167,17 @@ extension CXCallController: CXCallControllerProtocol {
|
||||
endedAt dateEnded: Date?,
|
||||
reason endedReason: CXCallEndedReason) {
|
||||
guard enabled else { return }
|
||||
provider.reportCall(with: UUID,
|
||||
endedAt: dateEnded,
|
||||
reason: endedReason)
|
||||
provider?.reportCall(with: UUID,
|
||||
endedAt: dateEnded,
|
||||
reason: endedReason)
|
||||
}
|
||||
|
||||
@objc public static func reportOutgoingCall(
|
||||
with UUID: UUID,
|
||||
startedConnectingAt dateStartedConnecting: Date?) {
|
||||
guard enabled else { return }
|
||||
provider.reportOutgoingCall(with: UUID,
|
||||
startedConnectingAt: dateStartedConnecting)
|
||||
provider?.reportOutgoingCall(with: UUID,
|
||||
startedConnectingAt: dateStartedConnecting)
|
||||
}
|
||||
|
||||
@objc public static func reportOutgoingCall(
|
||||
@@ -189,7 +185,7 @@ extension CXCallController: CXCallControllerProtocol {
|
||||
connectedAt dateConnected: Date?) {
|
||||
guard enabled else { return }
|
||||
|
||||
provider.reportOutgoingCall(with: UUID, connectedAt: dateConnected)
|
||||
provider?.reportOutgoingCall(with: UUID, connectedAt: dateConnected)
|
||||
}
|
||||
|
||||
@objc public static func request(
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
"noResults": "لم يُعثَر على أي نتيجة بحث متطابقة",
|
||||
"outlookEmail": "بريد مايكروسوفت",
|
||||
"phoneNumbers": "أضف ارقام هواتف",
|
||||
"search": "ابحث عن أشخاص",
|
||||
"searching": "يبحث",
|
||||
"shareInvite": "شارك دعوةً للاجتماع",
|
||||
"shareLink": "شارك رابط الاجتماع لدعوة الأخرين",
|
||||
"shareStream": "شارك رابط البث المباشر للاجتماع",
|
||||
@@ -39,6 +39,28 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "معدل تبادل البيانات منخفض"
|
||||
},
|
||||
"blankPage": {
|
||||
"meetingEnded": "انتهى الاجتماع."
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"defaultName": "غرفة الاجتماعات الفرعية رقم {{index}}",
|
||||
"mainRoom": "الغرفة الرئيسية",
|
||||
"actions": {
|
||||
"add": "أضف غرفة جانبية",
|
||||
"autoAssign": "التخصيص التلقائي للغرف الجانبية",
|
||||
"close": "أغلق",
|
||||
"join": "انضم",
|
||||
"leaveBreakoutRoom": "اترك الغرفة الجانبية",
|
||||
"more": "أكثر",
|
||||
"remove": "إزالة",
|
||||
"sendToBreakoutRoom": "أرسل المشارك إلى:"
|
||||
},
|
||||
"notifications": {
|
||||
"joinedTitle": "غرف جانبية",
|
||||
"joined": " الغرفة الجانبيةالانضمام إلى\"{{name}}\"",
|
||||
"joinedMainRoom": "الانضمام للغرفة الرئيسية"
|
||||
}
|
||||
},
|
||||
"calendarSync": {
|
||||
"addMeetingURL": "أضف رابطًا لاجتماع",
|
||||
"confirmAddLink": "هل تريد إضافة رابط جيستسي لهذا الحدث؟",
|
||||
@@ -161,7 +183,7 @@
|
||||
"tryAgainButton": "جرب مرة أخرى في تطبيق الحاسوب"
|
||||
},
|
||||
"defaultLink": "{{url}} مثلًا",
|
||||
"defaultNickname": "محمد عمر مثلًا",
|
||||
"defaultNickname": "محمد علي مثلًا",
|
||||
"deviceError": {
|
||||
"cameraError": "فشل الوصول إلى كاميرتك",
|
||||
"cameraPermission": "خطأ في تحصيل إذن استخدام كاميرتك",
|
||||
@@ -190,8 +212,8 @@
|
||||
"cameraNotSendingData": "لا نتمكن من الوصول إلى كاميرتك. تحقَّق رجاءً إن كان أي تطبيق آخر يستعملها، أو اختر جهازًا آخر من القائمة أو جرب تحميل التطبيق مجدَّدًا.",
|
||||
"cameraNotSendingDataTitle": "يصعب الوصول الوصول إلى كاميرتك",
|
||||
"cameraPermissionDeniedError": "لم تُمنَح إذن استعمال الكاميرا. لا يزال بإمكانك حضور المؤتمر ولكن لن يراك الآخرون. استعمال زر الكاميرا في شريط العنوان لمحاول إصلاح المشكلة.",
|
||||
"cameraUnknownError": "يصعب استعمال الكاميرا لأسباب مجهولة.",
|
||||
"cameraTimeoutError": "تعذر بدء مصدر الفيديو. انتهت المهلة!",
|
||||
"cameraUnknownError": "يصعب استعمال الكاميرا لأسباب مجهولة.",
|
||||
"cameraUnsupportedResolutionError": "لا تدعم كاميرتك دقة الفيديو المطلوبة.",
|
||||
"Cancel": "ِألغ",
|
||||
"close": "أغلق",
|
||||
@@ -249,34 +271,34 @@
|
||||
"micNotSendingData": "اذهب إلى إعدادات حاسوبك لإلغاء كتم المجهار (المايكروفون) وضبط مستواه",
|
||||
"micNotSendingDataTitle": "كتم ضبط الإعدادات لديك المجهار (المايكروفون)",
|
||||
"micPermissionDeniedError": "لم تعط إذن استعمال المجهار (المايكروفون) الخاص بك. ما يزال بإمكانك الإنضمام إلى المؤتمر ولكن دون أن يسمعك الآخرون. جرب استعمال زر الكاميرا في شريط العنوان لإصلاح هذه المشكلة.",
|
||||
"micTimeoutError": "Could not start audio source. Timeout occured!",
|
||||
"micUnknownError": "Cannot use microphone for an unknown reason.",
|
||||
"moderationAudioLabel": "Allow attendees to unmute themselves",
|
||||
"moderationVideoLabel": "Allow attendees to start their video",
|
||||
"micTimeoutError": "تعذر بدء مصدر الصوت. انقضت المهلة!",
|
||||
"micUnknownError": "لا يمكن استخدام الميكروفون لسبب غير معروف.",
|
||||
"moderationAudioLabel": "السماح للحاضرين بإعادة الصوت بأنفسهم",
|
||||
"moderationVideoLabel": "السماح للحاضرين ببدء الفيديو الخاص بهم",
|
||||
"muteEveryoneElseDialog": "بمجرد أن تكتمهم، لن تتمكن نم إلغاء الكتم هذا، ولكن يمكنهم إلغاء كتم أنفسهم في أي وقت.",
|
||||
"muteEveryoneElseTitle": "أتريد كتم الجميع باستثناء {{whom}}?",
|
||||
"muteEveryoneDialog": "أمتأكد من رغبتك بكتم الجميع؟ لن تتمكن من إلغاء الكتم ولكن يمكنهم إلغاء كتم أنفسهم في أي وقت.",
|
||||
"muteEveryoneDialogModerationOn": "The participants can send a request to speak at any time.",
|
||||
"muteEveryoneDialogModerationOn": "يمكن للمشاركين إرسال طلب للتحدث في أي وقت.",
|
||||
"muteEveryoneTitle": "أتريد كتم الجميع؟",
|
||||
"muteEveryoneElsesVideoDialog": "Once the camera is disabled, you won't be able to turn it back on, but they can turn it back on at any time.",
|
||||
"muteEveryoneElsesVideoTitle": "Stop everyone's video except {{whom}}?",
|
||||
"muteEveryonesVideoDialog": "The participants can turn on their video at any time.",
|
||||
"muteEveryonesVideoDialogModerationOn": "The participants can send a request to turn on their video at any time.",
|
||||
"muteEveryonesVideoDialogOk": "Disable",
|
||||
"muteEveryonesVideoTitle": "Stop everyone's video?",
|
||||
"muteEveryoneElsesVideoDialog": "بمجرد تعطيل الكاميرا ، لن تتمكن من إعادة تشغيلها ، ولكن يمكنهم إعادة تشغيلها في أي وقت.",
|
||||
"muteEveryoneElsesVideoTitle": "وقف فيديو الجميع باستثناء {{whom}}?",
|
||||
"muteEveryonesVideoDialog": "يمكن للمشاركين تشغيل الفيديو الخاص بهم في أي وقت.",
|
||||
"muteEveryonesVideoDialogModerationOn": "يمكن للمشاركين إرسال طلب لتشغيل الفيديو الخاص بهم في أي وقت.",
|
||||
"muteEveryonesVideoDialogOk": "إبطال",
|
||||
"muteEveryonesVideoTitle": "وقف فيديو الجميع؟",
|
||||
"muteEveryoneSelf": "اكتم نفسك أيضًا",
|
||||
"muteEveryoneStartMuted": "البدء مع كتم الجميع من الآن فصاعدًا",
|
||||
"muteParticipantBody": "لن تتكمن من إلغاء كتمهم، ولكن يمكنهم إلغاء كتم أنفسهم في أي وقت.",
|
||||
"muteParticipantButton": "كتم",
|
||||
"muteParticipantDialog": "أمتأكد من رغبتك لهذا المشارك؟ لن تتمكن من إلغاء الكتم ولكن يمكنه إلغاء كتم أنفسهم في أي وقت.",
|
||||
"muteParticipantsVideoDialog": "هل أنت متأكد أنك تريد إيقاف تشغيل كاميرا هذا المشارك؟ لن تتمكن من إعادة تشغيل الكاميرا ، ولكن يمكنهم إعادة تشغيلها في أي وقت.",
|
||||
"muteParticipantTitle": "أتريد كتم هذا المشارك؟",
|
||||
"muteParticipantsVideoDialogModerationOn": "هل أنت متأكد أنك تريد إيقاف تشغيل كاميرا هذا المشارك؟ لن تكون قادرًا على إعادة تشغيل الكاميرا ولن يفعلوا ذلك أيضًا.",
|
||||
"muteParticipantsVideoButton": "وقف الكاميرا",
|
||||
"muteParticipantsVideoTitle": "تعطيل الكاميرا لهذا المشارك؟",
|
||||
"muteParticipantsVideoBody": "لن تتمكن من إعادة تشغيل الكاميرا ، ولكن يمكنهم إعادة تشغيلها في أي وقت.",
|
||||
"muteParticipantsVideoBodyModerationOn": "لن تكون قادرًا على إعادة تشغيل الكاميرا ولن يفعلوا ذلك أيضًا.",
|
||||
"noDropboxToken": "لا يوجد رمز مميز صالح لـ Dropbox",
|
||||
"Ok": "تمام",
|
||||
"password": "Password",
|
||||
"password": "كلمه السر",
|
||||
"passwordLabel": "جعل عضو ما هذا الاجتماع مغلقًا. أدخل رجاءً $t(lockRoomPassword) للإنضمام.",
|
||||
"passwordNotSupported": "ضبط اجتماع $t(lockRoomPassword) غير مدعوم.",
|
||||
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) غير مدعوم",
|
||||
@@ -318,12 +340,12 @@
|
||||
"sessionRestarted": "إعادة الاتصال من الجسر",
|
||||
"Share": "شارك",
|
||||
"shareAudio": "استمر",
|
||||
"shareAudioTitle" : "How to share audio",
|
||||
"shareAudioWarningTitle": "You need to stop screen sharing before sharing audio",
|
||||
"shareAudioWarningH1": "If you want to share just audio:",
|
||||
"shareAudioWarningD1": "you need to stop screen sharing before sharing your audio.",
|
||||
"shareAudioWarningD2": "you need to restart your screen sharing and check the \"share audio\" option.",
|
||||
"shareMediaWarningGenericH2": "If you want to share your screen and audio",
|
||||
"shareAudioTitle": "كيفية مشاركة الصوت",
|
||||
"shareAudioWarningTitle": "تحتاج إلى إيقاف مشاركة الشاشة قبل مشاركة الصوت",
|
||||
"shareAudioWarningH1": "إذا كنت تريد مشاركة الصوت فقط:",
|
||||
"shareAudioWarningD1": "تحتاج إلى إيقاف مشاركة الشاشة قبل مشاركة الصوت الخاص بك.",
|
||||
"shareAudioWarningD2": "تحتاج إلى إعادة تشغيل مشاركة الشاشة والتحقق من خيار مشاركة الصوت .",
|
||||
"shareMediaWarningGenericH2": "إذا كنت ترغب في مشاركة شاشتك والصوت",
|
||||
"shareVideoLinkError": "زودنا برابط يوتيوب صحيح",
|
||||
"shareVideoTitle": "شارك فيديو",
|
||||
"shareYourScreen": "شارك شاشتك",
|
||||
@@ -334,7 +356,7 @@
|
||||
"shareScreenWarningTitle": "تحتاج إلى إيقاف مشاركة الصوت قبل مشاركة شاشتك",
|
||||
"shareScreenWarningH1": "إذا كنت تريد مشاركة شاشتك فقط:",
|
||||
"shareScreenWarningD1": "تحتاج إلى إيقاف مشاركة الصوت قبل مشاركة شاشتك.",
|
||||
"shareScreenWarningD2": "you need to stop audio sharing, start screen sharing and check the \"share audio\" option.",
|
||||
"shareScreenWarningD2": "تحتاج إلى إيقاف مشاركة الصوت وبدء مشاركة الشاشة وتحديد خيار مشاركة الصوت .",
|
||||
"sharedVideoLinkPlaceholder": "رابط اليوتيوب او رابط الفيديو المباشر",
|
||||
"stopLiveStreaming": "أوقف البث الحي",
|
||||
"stopRecording": "أوقف التسجيل",
|
||||
@@ -357,7 +379,7 @@
|
||||
"viewUpgradeOptionsTitle": "لقد اكتشفت ميزة مميزة!",
|
||||
"WaitForHostMsg": "لم يبدأ المؤتمر <b>{{room}}</b> بعد. إن كنت المضيف والراعي، فنرجو تأكيد ذلك عبر الاستيثاق أو انتظر وصول المضيف رجاءً. ",
|
||||
"WaitForHostMsgWOk": "لم يبدأ المؤتمر <b>{{room}}</b> بعد. إن كنت المضيف والراعي، فاضغط على «تمام» للاستيثاق أو انتظر وصول المضيف رجاءً.",
|
||||
"WaitingForHost": "ننتظر وصول المضيف ...",
|
||||
"WaitingForHostTitle": "في انتظار المضيف ...",
|
||||
"Yes": "نعم",
|
||||
"yourEntireScreen": "شاشتك كاملةً",
|
||||
"remoteUserControls": "ضوابط المستخدم عن بعد لـ {{username}}",
|
||||
@@ -386,15 +408,15 @@
|
||||
"none": "بدون",
|
||||
"uploadedImage": "تحميل الصورة {{index}}",
|
||||
"deleteImage": "حذف صورة",
|
||||
"image1" : "Beach",
|
||||
"image2" : "جدار أبيض محايد",
|
||||
"image3" : "غرفة بيضاء فارغة",
|
||||
"image4" : "مصباح أرضي أسود",
|
||||
"image5" : "جبل",
|
||||
"image6" : "غابة",
|
||||
"image7" : "شروق الشمس",
|
||||
"image1": "شاطئ",
|
||||
"image2": "جدار أبيض محايد",
|
||||
"image3": "غرفة بيضاء فارغة",
|
||||
"image4": "مصباح أرضي أسود",
|
||||
"image5": "جبل",
|
||||
"image6": "غابة",
|
||||
"image7": "شروق الشمس",
|
||||
"desktopShareError": "تعذر إنشاء مشاركة سطح المكتب",
|
||||
"desktopShare":"مشاركة سطح المكتب",
|
||||
"desktopShare": "مشاركة سطح المكتب",
|
||||
"webAssemblyWarning": "WebAssembly غير مدعوم",
|
||||
"backgroundEffectError": "فشل تطبيق تأثير الخلفية."
|
||||
},
|
||||
@@ -423,7 +445,7 @@
|
||||
"country": "البلد",
|
||||
"dialANumber": "إن أردت الإنضمام إلى الإجتماع، اتصل بأحد الأرقام التالية ثم أدخل رمز المرور",
|
||||
"dialInConferenceID": "رمز المرور (PIN):",
|
||||
"copyNumber":"إنسخ الرقم",
|
||||
"copyNumber": "إنسخ الرقم",
|
||||
"dialInNotSupported": "عذرًا، الاتصال غير مدعوم حاليًا.",
|
||||
"dialInNumber": "اتصل:",
|
||||
"dialInSummaryError": "خطأ في تحصيل معلومات الاتصال. جرب مرة أخرى لاحقًا.",
|
||||
@@ -432,11 +454,11 @@
|
||||
"inviteLiveStream": "لمشاهدة البث الحي لهذا الإجتماع، اضط على هذا الرابط: {{url}}",
|
||||
"invitePhone": "للإنضمام من الهاتف، استعمل: {{number}},,{{conferenceID}}#\n",
|
||||
"invitePhoneAlternatives": "أتبحث عن رقم اتصال مختلف؟\nأنظر أرقام الوصول إلى هذا الإجتماع: {{url}}\n\n\nإن كنت أيضًا تتصل عبر غرفة اتصال (room phone)، انضم دون الاتصال بالصوت: {{silentUrl}}",
|
||||
"inviteSipEndpoint": "To join using the SIP address, enter this: {{sipUri}}",
|
||||
"inviteTextiOSPersonal": "{{name}} is inviting you to a meeting.",
|
||||
"inviteTextiOSJoinSilent": "If you are dialing-in through a room phone, use this link to join without connecting to audio: {{silentUrl}}.",
|
||||
"inviteTextiOSInviteUrl": "Click the following link to join: {{inviteUrl}}.",
|
||||
"inviteTextiOSPhone": "To join via phone, use this number: {{number}},,{{conferenceID}}#. If you are looking for a different number, this is the full list: {{didUrl}}.",
|
||||
"inviteSipEndpoint": "للانضمام باستخدام عنوان SIP ، أدخل هذا: {{sipUri}}",
|
||||
"inviteTextiOSPersonal": "{{name}} يدعوك إلى اجتماع.",
|
||||
"inviteTextiOSJoinSilent": "إذا كنت تقوم بالاتصال من خلال هاتف الغرفة ، فاستخدم هذا الارتباط للانضمام دون الاتصال بالصوت: {{silentUrl}}.",
|
||||
"inviteTextiOSInviteUrl": "انقر فوق الرابط التالي للانضمام: {{inviteUrl}}.",
|
||||
"inviteTextiOSPhone": "للانضمام عبر الهاتف ، استخدم هذا الرقم: {{number}},,{{conferenceID}}#. إذا كنت تبحث عن رقم مختلف ، فهذه هي القائمة الكاملة: {{didUrl}}.",
|
||||
"inviteURLFirstPartGeneral": "دُعيِت للإنضمام إلى اجتماع",
|
||||
"inviteURLFirstPartPersonal": "دعاك {{name}} لاجتماع.\n",
|
||||
"inviteURLSecondPart": "\nانضم للاجتماع:\n{{url}}\n",
|
||||
@@ -466,7 +488,7 @@
|
||||
"support": "الدعم",
|
||||
"supportMsg": "إن تكرَّر حصول هذا، تواصل مع"
|
||||
},
|
||||
"jitsiHome": "{{logo}} Logo, links to Homepage",
|
||||
"jitsiHome": "{{logo}} الشعار ، رابط إلى الصفحة الرئيسية",
|
||||
"keyboardShortcuts": {
|
||||
"focusLocal": "ركز على الفيديو الخاص بك",
|
||||
"focusRemote": "ركز على فيديو مشارك آخر",
|
||||
@@ -501,6 +523,7 @@
|
||||
"expandedPending": "تبدأ عملية البث الحي...",
|
||||
"failedToStart": "فشلت عملية بدء البث الحي",
|
||||
"getStreamKeyManually": "لم نتمكن من الوصول إلى أي بث حي. جرب جلب مفتاح بث حي خاص بك من يوتيوب.",
|
||||
"inProgress": "البث المباشر غير ممكّن على {{email}}. يرجى تمكين البث المباشر أو تسجيل الدخول إلى حساب مع تمكين البث المباشر.",
|
||||
"invalidStreamKey": "يحتمل كون مفتاح البث الحي غير صحيح.",
|
||||
"off": "أُوقِف البث الحي",
|
||||
"offBy": "أوقف {{name}} البث الحي",
|
||||
@@ -508,6 +531,7 @@
|
||||
"onBy": "بدأ {{name}} بثًّا حيًّا",
|
||||
"pending": "بدء بثٍّ حيٍّ",
|
||||
"serviceName": "خدمة البث الحي",
|
||||
"sessionAlreadyActive": "هذه الجلسة قيد التسجيل أو البث المباشر.",
|
||||
"signedInAs": "أنت مسجل حاليًا بصفة:",
|
||||
"signIn": "سجل الدخول عبر حساب غوغل",
|
||||
"signInCTA": "سجل الدخول أو أدخل مفتاح البث الحي الخاص بك من يوتيوب",
|
||||
@@ -551,8 +575,10 @@
|
||||
"lockRoomPasswordUppercase": "كلمة المرور",
|
||||
"me": "أنا",
|
||||
"notify": {
|
||||
"allowAction": "Allow",
|
||||
"allowedUnmute": "You can unmute your microphone, start your camera or share your screen.",
|
||||
"allowAction": "يسمح",
|
||||
"allowedUnmute": "يمكنك إعادة صوت الميكروفون و بدء تشغيل الكاميرا أو مشاركة شاشتك.",
|
||||
"audioUnmuteBlockedTitle": "تم حظر إعادة صوت الميكروفون!",
|
||||
"audioUnmuteBlockedDescription": "تم حظر عملية إلغاء كتم صوت الميكروفون مؤقتًا بسبب قيود النظام.",
|
||||
"connectedOneMember": "انضم {{name}} للاجتماع",
|
||||
"connectedThreePlusMembers": "انضم {{name}} وعدد {{count}} غيره إلى الاجتماع",
|
||||
"connectedTwoMembers": "انضم {{first}} و {{second}} إلى الاجتماع",
|
||||
@@ -564,19 +590,23 @@
|
||||
"invitedThreePlusMembers": "دُعِي {{name}} وعدد {{count}} آخرين",
|
||||
"invitedTwoMembers": "دُعِي {{first}} و {{second}}",
|
||||
"kickParticipant": "طرد {{kicked}} المشارك {{kicker}}",
|
||||
"leftOneMember": "{{name}} غادر الاجتماع",
|
||||
"leftThreePlusMembers": "غادر {{name}} والعديد من الأشخاص الآخرين الاجتماع",
|
||||
"leftTwoMembers": "غادر {{first}} و {{second}} الاجتماع",
|
||||
"me": "أنا",
|
||||
"moderator": "مُنحَت صلاحية رئيس الجلسة!",
|
||||
"muted": "بدأ المحادثة مكتوب الصوت.",
|
||||
"mutedTitle": "مكتوم!",
|
||||
"mutedRemotelyTitle": "كتم {{participantDisplayName}} الصوت لديك!",
|
||||
"mutedRemotelyDescription": "يمكنك إلغاء الكتم متى كنت جاهزًا للتحدث. اكتم الصوت بعد الانتهاء من التحدث لخفض الضجيج أثناء الاجتماع",
|
||||
"videoMutedRemotelyTitle": "Your video has been turned off by {{participantDisplayName}}",
|
||||
"videoMutedRemotelyDescription": "You can always turn it on again.",
|
||||
"passwordRemovedRemotely": "أزال أحد المشاركين {{participantDisplayName}}",
|
||||
"passwordSetRemotely": "ضبط أحد المشاركين $t(lockRoomPasswordUppercase)",
|
||||
"raisedHand": "يريد {{name}} التحدث",
|
||||
"screenShareNoAudio": " Share audio box was not checked in the window selection screen.",
|
||||
"screenShareNoAudioTitle": "Couldn't share system audio!",
|
||||
"screenShareNoAudio": " Share audio box was not checked in the window selection screen.",
|
||||
"screenShareNoAudioTitle": "Couldn't share system audio!",
|
||||
"raisedHands": "{{participantName}} و {{raisedHands}}المزيد من الناس",
|
||||
"screenShareNoAudio": "لم يتم تحديد مربع مشاركة الصوت في شاشة تحديد النافذة.",
|
||||
"screenShareNoAudioTitle": "تعذرت مشاركة صوت النظام!",
|
||||
"somebody": "شخص ما",
|
||||
"startSilentTitle": "انضممت دون مخرج للصوت!",
|
||||
"startSilentDescription": "أنضم مجدَّدًا للاجتماع لتفعيل الصوت",
|
||||
@@ -590,28 +620,31 @@
|
||||
"oldElectronClientDescription1": "يبدو أنَّك تستعمل إصدارًا قديمًا من جيتسي يحوي ثغرة أمنية. تأكد رجاءً من أنَّك حدَّثته إلى ",
|
||||
"oldElectronClientDescription2": "أحدث إصدار",
|
||||
"oldElectronClientDescription3": " الآن!",
|
||||
"moderationInEffectDescription": "Please raise hand if you want to speak.",
|
||||
"moderationInEffectCSDescription": "Please raise hand if you want to share your screen.",
|
||||
"moderationInEffectVideoDescription": "Please raise your hand if you want to start your camera.",
|
||||
"moderationInEffectTitle": "Your microphone is muted by the moderator",
|
||||
"moderationInEffectCSTitle": "Screen sharing is blocked by the moderator",
|
||||
"moderationInEffectVideoTitle": "Your camera is blocked by the moderator",
|
||||
"moderationRequestFromModerator": "The host would like you to unmute",
|
||||
"moderationRequestFromParticipant": "Wants to speak",
|
||||
"moderationStartedTitle": "Moderation started",
|
||||
"moderationStoppedTitle": "Moderation stopped",
|
||||
"moderationToggleDescription": "by {{participantDisplayName}}",
|
||||
"raiseHandAction": "Raise hand",
|
||||
"reactionSounds": "Disable sounds",
|
||||
"groupTitle": "Notifications"
|
||||
"moderationInEffectDescription": "من فضلك ارفع يدك إذا كنت تريد التحدث.",
|
||||
"moderationInEffectCSDescription": "يرجى رفع اليد إذا كنت تريد مشاركة شاشتك.",
|
||||
"moderationInEffectVideoDescription": "يرجى رفع يدك إذا كنت تريد بدء تشغيل الكاميرا.",
|
||||
"moderationInEffectTitle": "تم كتم صوت الميكروفون الخاص بك بواسطة المشرف",
|
||||
"moderationInEffectCSTitle": "تم حظر مشاركة الشاشة من قبل المشرف",
|
||||
"moderationInEffectVideoTitle": "تم حظر الكاميرا الخاصة بك من قبل المشرف",
|
||||
"moderationRequestFromModerator": "المضيف يريد منك إلغاء كتم الصوت",
|
||||
"moderationRequestFromParticipant": "يريد التحدث",
|
||||
"moderationStartedTitle": "بدأ الاشراف",
|
||||
"moderationStoppedTitle": "توقف الاشراف",
|
||||
"moderationToggleDescription": "من {{participantDisplayName}}",
|
||||
"raiseHandAction": "رفع اليد",
|
||||
"reactionSounds": "تعطيل الأصوات",
|
||||
"reactionSoundsForAll": "تعطيل الأصوات للجميع",
|
||||
"groupTitle": "إشعارات",
|
||||
"videoUnmuteBlockedTitle": "تم حظر إعادة الكاميرا!",
|
||||
"videoUnmuteBlockedDescription": "تم حظر عملية إلغاء كتم الكاميرا مؤقتًا بسبب قيود النظام."
|
||||
},
|
||||
"participantsPane": {
|
||||
"close": "Close",
|
||||
"header": "Participants",
|
||||
"close": "غلق",
|
||||
"header": "مشاركون",
|
||||
"headings": {
|
||||
"lobby": "Lobby ({{count}})",
|
||||
"lobby": "الردهة ({{count}})",
|
||||
"participantsList": "المشاركون في الاجتماع({{count}})",
|
||||
"waitingLobby": "Waiting in lobby ({{count}})"
|
||||
"waitingLobby": "منتظرون في الردهة ({{count}})"
|
||||
},
|
||||
"actions": {
|
||||
"allow": "السماح للحاضرين بـ:",
|
||||
@@ -620,43 +653,48 @@
|
||||
"blockEveryoneMicCamera": "حظر ميكروفون وكاميرا الجميع",
|
||||
"invite": "قم بدعوة شخص ما",
|
||||
"askUnmute": "اطلب إعادة الصوت",
|
||||
"moreModerationActions": "المزيد من خيارات الاشراف",
|
||||
"moreParticipantOptions": "المزيد من خيارات المشاركين",
|
||||
"mute": "كتم الصوت",
|
||||
"muteAll": "كتم الكل",
|
||||
"muteEveryoneElse": "كتم صوت الآخرين",
|
||||
"stopEveryonesVideo": "أوقف فيديو الجميع",
|
||||
"stopVideo": "أوقف الفيديو",
|
||||
"unblockEveryoneMicCamera": "قم بإلغاء حظر ميكروفون وكاميرا الجميع",
|
||||
"videoModeration": "ابدأ الفيديو الخاص بهم"
|
||||
}
|
||||
"videoModeration": "ابدأ الفيديو الخاص بهم",
|
||||
"moreModerationControls": "المزيد من ضوابط الاشراف"
|
||||
},
|
||||
"search": "بحث"
|
||||
},
|
||||
"passwordSetRemotely": "ضبطها مشارك آخر",
|
||||
"passwordDigitsOnly": "حتى {{number}} عدد",
|
||||
"polls": {
|
||||
"by": "من",
|
||||
"create": {
|
||||
"addOption": "Add option",
|
||||
"answerPlaceholder": "Option {{index}}",
|
||||
"create": "Create a poll",
|
||||
"cancel": "Cancel",
|
||||
"pollOption" : "Poll option {{index}}",
|
||||
"pollQuestion" : "Poll Question",
|
||||
"questionPlaceholder": "Ask a question",
|
||||
"removeOption": "Remove option",
|
||||
"send": "Send"
|
||||
"addOption": "إضافة خيار",
|
||||
"answerPlaceholder": "خيار {{index}}",
|
||||
"create": "إنشاء استطلاع",
|
||||
"cancel": "إلغاء",
|
||||
"pollOption": "خيار الاستطلاع {{index}}",
|
||||
"pollQuestion": "سؤال الاستطلاع",
|
||||
"questionPlaceholder": "طرح سؤال",
|
||||
"removeOption": "إزالة خيار",
|
||||
"send": "أرسل"
|
||||
},
|
||||
"answer": {
|
||||
"skip": "Skip",
|
||||
"submit": "Submit"
|
||||
"skip": "تخطى",
|
||||
"submit": "يقدم"
|
||||
},
|
||||
"results": {
|
||||
"vote": "Vote",
|
||||
"changeVote": "Change vote",
|
||||
"empty": "There are no polls in the meeting yet. Start a poll here!",
|
||||
"hideDetailedResults": "Hide details",
|
||||
"showDetailedResults": "Show details"
|
||||
"vote": "تصويت",
|
||||
"changeVote": "تغيير التصويت",
|
||||
"empty": "لا توجد استطلاعات للرأي في الاجتماع حتى الآن. ابدأ الاستطلاع هنا!",
|
||||
"hideDetailedResults": "أخفِ التفاصيل",
|
||||
"showDetailedResults": "اظهر التفاصيل"
|
||||
},
|
||||
"notification": {
|
||||
"title": "A new poll was added to this meeting",
|
||||
"description": "Open polls tab to vote"
|
||||
"title": "تمت إضافة اقتراع جديد إلى هذا الاجتماع",
|
||||
"description": "افتح علامة تبويب الاقتراع للتصويت"
|
||||
}
|
||||
},
|
||||
"poweredby": "مُشغَّل بوساطة",
|
||||
@@ -699,7 +737,7 @@
|
||||
"errorDialOutFailed": "فشلت عملية الاتصال، للأسف.",
|
||||
"errorDialOutStatus": "خطأ في معرفة حالة الاتصال",
|
||||
"errorMissingName": "أدخل اسمك للدخول للاجتماع",
|
||||
"errorNoPermissions": "You need to enable microphone and camera access",
|
||||
"errorNoPermissions": "تحتاج إلى تمكين الوصول إلى الميكروفون والكاميرا",
|
||||
"errorStatusCode": "فشل الاتصال برمز خطأ: {{status}}",
|
||||
"errorValidation": "فشل التحقق من الرقم",
|
||||
"iWantToDialIn": "أريد الاتصال",
|
||||
@@ -712,8 +750,8 @@
|
||||
"or": "أو",
|
||||
"premeeting": "ما قبل الاجتماع",
|
||||
"showScreen": "تفعيل واجهة ما قبل الاجتماع",
|
||||
"keyboardShortcuts": "تفعيل اختصارات لوحة المفاتيح",
|
||||
"startWithPhone": "البدء مع جهاز الصوت من الجوال",
|
||||
"keyboardShortcuts" : "تفعيل اختصارات لوحة المفاتيح",
|
||||
"screenSharingError": "خطأ في مشاركة الشاشة:",
|
||||
"videoOnlyError": "خطأ في الفيديو:",
|
||||
"videoTrackError": "لم نتمكن من إنشاء ملف الفيديو",
|
||||
@@ -751,13 +789,14 @@
|
||||
"busyTitle": "جميع المسجلين مشغولون حاليًا",
|
||||
"copyLink": "Copy Link",
|
||||
"error": "فشل التسجيل. حاول مرة أخرى.",
|
||||
"errorFetchingLink": "Error fetching recording link.",
|
||||
"errorFetchingLink": "خطأ في جلب رابط التسجيل.",
|
||||
"expandedOff": "أوقٍف التسجيل",
|
||||
"expandedOn": "يُسجَّل الاجتماع الآن",
|
||||
"expandedPending": "بدء التسجيل...",
|
||||
"failedToStart": "فشل بدء التسجيل",
|
||||
"fileSharingdescription": "شارك التسجيل مع المشاركين للاجتماع",
|
||||
"linkGenerated": "We have generated a link to your recording.",
|
||||
"inProgress": "التسجيل أو البث المباشر قيد التقدم",
|
||||
"linkGenerated": "لقد أنشأنا رابطًا لتسجيلك.",
|
||||
"live": "مباشر",
|
||||
"loggedIn": "مُسجَّل باسم {{userName}}",
|
||||
"off": "أوقِف التسجيل",
|
||||
@@ -767,13 +806,14 @@
|
||||
"pending": "التحضير لتسجيل الاجتماع...",
|
||||
"rec": "تسجيل",
|
||||
"serviceDescription": "ستحفظ خدمة التسجيل الفيديو المستجل",
|
||||
"serviceDescriptionCloud": "Cloud recording",
|
||||
"serviceDescriptionCloud": "تسجيل سحابي",
|
||||
"serviceName": "خدمة التسجيل",
|
||||
"sessionAlreadyActive": "هذه الجلسة قيد التسجيل أو البث المباشر.",
|
||||
"signIn": "دخول",
|
||||
"signOut": "خروج",
|
||||
"unavailable": "عجبًا! {{serviceName}} غير متاحة حاليًا. نعمل على حل المشكلة. حاول مرة أخرى لاحقًا.",
|
||||
"unavailableTitle": "التسجيل غير متاح",
|
||||
"uploadToCloud": "Upload to the cloud"
|
||||
"uploadToCloud": "تحميل إلى السحابة"
|
||||
},
|
||||
"sectionList": {
|
||||
"pullToRefresh": "اسحب للتحديث"
|
||||
@@ -817,6 +857,7 @@
|
||||
"sounds": "اصوات",
|
||||
"speakers": "المذياع (مكبر الصوت)",
|
||||
"startAudioMuted": "بدء الجميع مكتومي الصوت",
|
||||
"startReactionsMuted": "كتم رد فعل الصوت للجميع",
|
||||
"startVideoMuted": "بدء الجميع دون فيديو",
|
||||
"talkWhileMuted": "تحدث أثناء كتم الصوت",
|
||||
"title": "الإعدادات"
|
||||
@@ -849,17 +890,24 @@
|
||||
},
|
||||
"speaker": "المتحدث",
|
||||
"speakerStats": {
|
||||
"search": "Search",
|
||||
"search": "بحث",
|
||||
"hours": "{{count}}س",
|
||||
"minutes": "{{count}}د",
|
||||
"name": "الاسم",
|
||||
"seconds": "{{count}}ثا",
|
||||
"speakerStats": "حالة المتحدث",
|
||||
"speakerTime": "وقت المتحدث"
|
||||
"speakerTime": "وقت المتحدث",
|
||||
"happy": "سعيد",
|
||||
"neutral": "حيادي",
|
||||
"sad": "حزين",
|
||||
"surprised": "مندهش",
|
||||
"angry": "غاضب",
|
||||
"fearful": "خائف",
|
||||
"disgusted": "مشمئز"
|
||||
},
|
||||
"startupoverlay": {
|
||||
"policyText": " ",
|
||||
"genericTitle": "The meeting needs to use your microphone and camera.",
|
||||
"genericTitle": "يحتاج الاجتماع إلى استخدام الميكروفون والكاميرا.",
|
||||
"title": "يريد {{app}} استعمال المجهار والكاميرا خاصَّتك."
|
||||
},
|
||||
"suspendedoverlay": {
|
||||
@@ -872,10 +920,11 @@
|
||||
"audioOnly": "بدل الصوت فقط",
|
||||
"audioRoute": "اختر جهاز الصوت",
|
||||
"boo": "Boo",
|
||||
"breakoutRoom": "الانضمام / مغادرة غرفة فرعية",
|
||||
"callQuality": "اضبط دقة الفيديو",
|
||||
"cc": "اظهِر/اخفِ الترجمة",
|
||||
"chat": "اظهِر/اخفِ نافذة الدردشة",
|
||||
"clap": "Clap",
|
||||
"clap": "تصفيق",
|
||||
"document": "اظهِر/اخفِ الملف المشارك",
|
||||
"download": "نزِّل التطبيق",
|
||||
"embedMeeting": "ضمِّن الاجتماع",
|
||||
@@ -886,8 +935,8 @@
|
||||
"help": "مساعدة",
|
||||
"invite": "ادعُ آخرين",
|
||||
"kick": "اطرد مشاركًا",
|
||||
"laugh": "Laugh",
|
||||
"like": "Thumbs Up",
|
||||
"laugh": "يضحك",
|
||||
"like": "رفع الإبهام متمنيا النجاح",
|
||||
"lobbyButton": "فعِّل/عطِّل وضع غرفة الانتظار",
|
||||
"localRecording": "اظهِر/اخفِ التحكم بالتسجيل المحلي",
|
||||
"lockRoom": "اظهِر/اخفِ كلمة مرور الاجتماع",
|
||||
@@ -918,7 +967,7 @@
|
||||
"show": "اظهر على المنصة",
|
||||
"silence": "Silence",
|
||||
"speakerStats": "اظهِر/اخفِ حالة المتحدث",
|
||||
"surprised": "Surprised",
|
||||
"surprised": "مندهش",
|
||||
"tileView": "اظهِر/اخفِ عرض العنوان",
|
||||
"toggleCamera": "بدِّل الكاميرا",
|
||||
"toggleFilmstrip": "بدِّل وضع الشريط السينمائي (filmstrip)",
|
||||
@@ -938,7 +987,7 @@
|
||||
"boo": "Boo",
|
||||
"callQuality": "اضبط دقة الفيديو",
|
||||
"chat": "افتح / أغلق الشاشة",
|
||||
"clap": "Clap",
|
||||
"clap": "تصفيق",
|
||||
"closeChat": "أغلق الدردشة",
|
||||
"closeReactionsMenu": "إغلاق قائمة ردود الفعل",
|
||||
"disableReactionSounds": "يمكنك تعطيل أصوات ردود الفعل لهذا الاجتماع",
|
||||
@@ -955,8 +1004,10 @@
|
||||
"hangup": "غادر",
|
||||
"help": "مساعدة",
|
||||
"invite": "ادعُ أحدًا",
|
||||
"laugh": "Laugh",
|
||||
"like": "Thumbs Up",
|
||||
"joinBreakoutRoom": "انضم إلى غرفة الجانبية",
|
||||
"laugh": "يضحك",
|
||||
"leaveBreakoutRoom": "اترك إلى غرفة الجانبية",
|
||||
"like": "رفع الإبهام متمنيا النجاح",
|
||||
"lobbyButtonDisable": "عطِّل وضع غرفة الانتظار",
|
||||
"lobbyButtonEnable": "فعِّل وضع غرفة الانتظار",
|
||||
"login": "ادخل",
|
||||
@@ -982,19 +1033,19 @@
|
||||
"profile": "عدِّل ملفك الشخصي",
|
||||
"raiseHand": "ارفع / اخفض يدك",
|
||||
"raiseYourHand": "ارفع يدك",
|
||||
"reactionBoo": "Send boo reaction",
|
||||
"reactionClap": "Send clap reaction",
|
||||
"reactionLaugh": "Send laugh reaction",
|
||||
"reactionLike": "Send thumbs up reaction",
|
||||
"reactionSilence": "Send silence reaction",
|
||||
"reactionSurprised": "Send surprised reaction",
|
||||
"reactionBoo": "أرسل رد فعل بوو",
|
||||
"reactionClap": "أرسل رد فعل التصفيق",
|
||||
"reactionLaugh": "أرسل رد فعل يضحك",
|
||||
"reactionLike": "إرسال رد فعل ممتاز",
|
||||
"reactionSilence": "أرسل رد فعل الصمت",
|
||||
"reactionSurprised": "أرسل رد فعل متفاجئًا",
|
||||
"security": "خيارات الحماية",
|
||||
"Settings": "الإعدادات",
|
||||
"shareaudio": "مشاركة الصوت",
|
||||
"sharedvideo": "شارك فيديو يوتيوب",
|
||||
"shareRoom": "ادعُ أحدًا",
|
||||
"shortcuts": "اعرض الاختصارات",
|
||||
"silence": "Silence",
|
||||
"silence": "سكوت",
|
||||
"speakerStats": "حالة المتحدث",
|
||||
"startScreenSharing": "ابدأ بمشاركة الشاشة",
|
||||
"startSubtitles": "أظهر الترجمة",
|
||||
@@ -1002,7 +1053,7 @@
|
||||
"stopScreenSharing": "أوقف مشاركة الشاشة",
|
||||
"stopSubtitles": "أخفِ الترجمة",
|
||||
"stopSharedVideo": "أوقف فيديو يوتيوب المشارك",
|
||||
"surprised": "Surprised",
|
||||
"surprised": "مندهش",
|
||||
"talkWhileMutedPopup": "أتحاول التحدث؟ المجهار مكتوم لديك.",
|
||||
"tileViewToggle": "بدِّل عنوان العرض",
|
||||
"toggleCamera": "بدِّل الكاميرا",
|
||||
@@ -1033,7 +1084,7 @@
|
||||
"react-nativeGrantPermissions": "اختر <b><i>السماح</i></b> عندما يطلب المتصفح الأذونات.",
|
||||
"safariGrantPermissions": "اختر <b><i>تمام</i></b> عندما يطلب المتصفح الأذونات."
|
||||
},
|
||||
"volumeSlider": "Volume slider",
|
||||
"volumeSlider": "مستوى الصوت",
|
||||
"videoSIPGW": {
|
||||
"busy": "نعمل على تحرير الموارد. حاول مرة أخرى لاحقًا بعد بضعة دقائق.",
|
||||
"busyTitle": "خدمة الغرفة مشغولة حاليًا",
|
||||
@@ -1045,7 +1096,10 @@
|
||||
"pending": "دعي {{displayName}} مسبقًا"
|
||||
},
|
||||
"videoStatus": {
|
||||
"adjustFor": "ضبط ل:",
|
||||
"audioOnly": "صوت",
|
||||
"bestPerformance": "أفضل أداء",
|
||||
"highestQuality": "اعلى جودة",
|
||||
"audioOnlyExpanded": "أنت في وضع معدَّل البيانات المتبادلة المنخفض. الصوت ومشاركة الشاشة هو المتاح فقط في هذا الوضع.",
|
||||
"callQuality": "جودة الفيديو",
|
||||
"hd": "دقة عالية",
|
||||
@@ -1056,6 +1110,7 @@
|
||||
"ld": "دقة منخفضة",
|
||||
"ldTooltip": "عرض فيديو بدقة منخفضة",
|
||||
"lowDefinition": "دقة منخفضة",
|
||||
"performanceSettings": "إعدادات الأداء",
|
||||
"sd": "دقة قياسية",
|
||||
"sdTooltip": "عرض فيديو بدقة قياسية",
|
||||
"standardDefinition": "دقة قياسية"
|
||||
@@ -1078,7 +1133,7 @@
|
||||
"videomute": "أوقف المشارك الكاميرا"
|
||||
},
|
||||
"welcomepage": {
|
||||
"addMeetingName": "Add Meeting name",
|
||||
"addMeetingName": "أضف اسم الاجتماع",
|
||||
"accessibilityLabel": {
|
||||
"join": "انقر للمشاركة",
|
||||
"roomname": "أدخل اسم الغرفة"
|
||||
@@ -1095,14 +1150,14 @@
|
||||
"getHelp": "أريد مساعدة",
|
||||
"go": "ابدأ",
|
||||
"goSmall": "ابدأ",
|
||||
"headerTitle": "Jitsi Meet",
|
||||
"headerSubtitle": "Secure and high quality meetings",
|
||||
"headerTitle": "حِـــوار جيتسي",
|
||||
"headerSubtitle": "آمــن وبنـوعيـة فـائقـة الجـودة",
|
||||
"info": "معلومات",
|
||||
"join": "أنشئ / انضم",
|
||||
"jitsiOnMobile": "Jitsi on mobile – download our apps and start a meeting from anywhere",
|
||||
"mobileDownLoadLinkIos": "Download mobile app for iOS",
|
||||
"mobileDownLoadLinkAndroid": "Download mobile app for Android",
|
||||
"mobileDownLoadLinkFDroid": "Download mobile app for F-Droid",
|
||||
"jitsiOnMobile": "جيتسي على الهاتف المحمول - حمّل تطبيقاتنا وابدأ اجتماعًا من أي مكان",
|
||||
"mobileDownLoadLinkIos": "قم بتنزيل تطبيق الهاتف لنظام iOS",
|
||||
"mobileDownLoadLinkAndroid": "قم بتنزيل تطبيق الهاتف لنظام أندرويد",
|
||||
"mobileDownLoadLinkFDroid": "قم بتنزيل تطبيق الجوال لـ F-Droid",
|
||||
"moderatedMessage": "أو a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">احجز رابط لاجتماع</a> إن كنت رئيس الجلسة الوحيد فقط.",
|
||||
"privacy": "الخصوصية",
|
||||
"recentList": "الجديد",
|
||||
@@ -1113,28 +1168,34 @@
|
||||
"roomname": "أدخل اسم الغرفة",
|
||||
"roomnameHint": "أدخل اسم أو رابط الغرفة التي تريد الانضمام إليها. يمكنك إنشاء اسم جديد لترسله إلى من تريد أن تجتمع معهم.",
|
||||
"sendFeedback": "أبدِ رأيك",
|
||||
"startMeeting": "Start meeting",
|
||||
"startMeeting": "إبدأ الحـِوار",
|
||||
"terms": "الشروط",
|
||||
"title": "منصة عقد مؤتمرات واجتماعات آمنة وكاملة المزايا ومجانية بالمطلق",
|
||||
"logo":{
|
||||
"calendar":"Calendar logo",
|
||||
"microsoftLogo":"Microsoft logo",
|
||||
"logoDeepLinking":"Jitsi meet logo",
|
||||
"desktopPreviewThumbnail":"Desktop preview thumbnail",
|
||||
"googleLogo":"Google Logo",
|
||||
"policyLogo":"Policy logo"
|
||||
"logo": {
|
||||
"calendar": "شعار التقويم",
|
||||
"microsoftLogo": "شعار مايكروسوفت",
|
||||
"logoDeepLinking": "شعار جيتسي",
|
||||
"desktopPreviewThumbnail": "صورة مصغرة لمعاينة سطح المكتب",
|
||||
"googleLogo": "شعار كوكل",
|
||||
"policyLogo": "شعار السياسة"
|
||||
}
|
||||
},
|
||||
"lonelyMeetingExperience": {
|
||||
"button": "ادعُ آخرين",
|
||||
"youAreAlone": "أنت بمفردك في الاجتماع"
|
||||
},
|
||||
"termsView": {
|
||||
"header": "مصطلحات"
|
||||
},
|
||||
"privacyView": {
|
||||
"header": "خصوصية"
|
||||
},
|
||||
"helpView": {
|
||||
"header": "مركز المساعدة"
|
||||
},
|
||||
"lobby": {
|
||||
"admit": "Admit",
|
||||
"admitAll": "Admit all",
|
||||
"admit": "سمح بالدخول",
|
||||
"admitAll": "سمح للجميع بالدخول",
|
||||
"knockingParticipantList": "تنبيه قائمة المشاركين",
|
||||
"allow": "اسمح",
|
||||
"backToKnockModeButton": "لا يوجد كلمة مرور، اطلب الإذن بالدخول بدلًا من ذلك.",
|
||||
@@ -1147,7 +1208,7 @@
|
||||
"enableDialogText": "يحمي وضع الانتظار غرفة الاجتماع عبر منح رئيس الجلسة إمكانية الموافقة على انضمام المشاركين.",
|
||||
"enterPasswordButton": "أدخل كلمة المرور لهذا الاجتماع",
|
||||
"enterPasswordTitle": "أدخل كلمة المرور للدخول للاجتماع",
|
||||
"errorMissingPassword": "Please enter the meeting password",
|
||||
"errorMissingPassword": "الرجاء إدخال كلمة مرور الاجتماع",
|
||||
"invalidPassword": "كلمة مرور غير صحيحة",
|
||||
"joiningMessage": "ستتمكن من الانضمام للاجتماع بعد الموافقة على طلبك",
|
||||
"joinWithPasswordMessage": "الرجاء الانتظار أثناء محاولة الدخول دون كلمة مرور...",
|
||||
@@ -1166,7 +1227,7 @@
|
||||
"passwordField": "أدخل كلمة الدخول إلى الاجتماع",
|
||||
"passwordJoinButton": "انضم",
|
||||
"reject": "رفض",
|
||||
"rejectAll": "Reject all",
|
||||
"rejectAll": "رفض الكل",
|
||||
"toggleLabel": "فعِّل غرفة الانتظار"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -488,8 +488,8 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Якое адлюстроўваецца імя",
|
||||
"setEmailInput": "Калі ласка, увядзіце e-mail",
|
||||
"setEmailLabel": "E-mail для Gravatar",
|
||||
"setEmailInput": "Калі ласка, увядзіце email",
|
||||
"setEmailLabel": "Email для Gravatar",
|
||||
"title": "Профіль"
|
||||
},
|
||||
"raisedHand": "Хоча гаварыць",
|
||||
@@ -558,7 +558,7 @@
|
||||
"disableCallIntegration": "Адключыць убудаваную інтэграцыю выклікаў",
|
||||
"disableP2P": "Адключыць рэжым Peer-To-Peer",
|
||||
"displayName": "Якое адлюстроўваецца імя",
|
||||
"email": "E-mail",
|
||||
"email": "Email",
|
||||
"header": "Налады",
|
||||
"profileSection": "Профіль",
|
||||
"serverURL": "Адрас сервера",
|
||||
|
||||
@@ -292,6 +292,29 @@
|
||||
"documentSharing": {
|
||||
"title": "Document compartit"
|
||||
},
|
||||
"virtualBackground": {
|
||||
"apply": "Aplicar",
|
||||
"title": "Fons Virtuals",
|
||||
"blur": "Difuminos",
|
||||
"slightBlur": "Lleu Difuminos",
|
||||
"removeBackground": "Elimina el Fons",
|
||||
"addBackground": "Afegeix fons",
|
||||
"pleaseWait": "Si us plau, espereu...",
|
||||
"none": "Cap",
|
||||
"uploadedImage": "Imatge carregada {{index}}",
|
||||
"deleteImage": "Esborra la imatge",
|
||||
"image1" : "Platja",
|
||||
"image2" : "Paret blanca neutra",
|
||||
"image3" : "Habitació blanca buida",
|
||||
"image4" : "Llum de peu negre",
|
||||
"image5" : "Muntanya",
|
||||
"image6" : "Bosc ",
|
||||
"image7" : "Sortida del sol",
|
||||
"desktopShareError": "No s'ha pogut crear l'escriptori compartit",
|
||||
"desktopShare":"Compartir escriptori",
|
||||
"webAssemblyWarning": "no compatible",
|
||||
"backgroundEffectError": "No s'ha pogut aplicar l'efecte de fons."
|
||||
},
|
||||
"feedback": {
|
||||
"average": "Mitjana",
|
||||
"bad": "Dolenta",
|
||||
@@ -464,6 +487,32 @@
|
||||
"newDeviceAudioTitle": "S'ha detectat un aparell d'àudio nou",
|
||||
"newDeviceAction": "Usa"
|
||||
},
|
||||
"participantsPane": {
|
||||
"close": "Tanca",
|
||||
"header": "Participants",
|
||||
"headings": {
|
||||
"lobby": "Sala d'espera ({{count}})",
|
||||
"participantsList": "Participants de la reunió ({{count}})",
|
||||
"waitingLobby": "Esperant al vestíbul ({{count}})"
|
||||
},
|
||||
"actions": {
|
||||
"allow": "Permetre als assistents:",
|
||||
"allowVideo": "Permet el vídeo",
|
||||
"audioModeration": "Deixeu de silenciar ells mateixos",
|
||||
"blockEveryoneMicCamera": "Bloqueja el micròfon i la càmera de tothom",
|
||||
"invite": "Convida algú",
|
||||
"askUnmute": "Demana que es deixi de silenciare",
|
||||
"moreModerationActions": "Més opcions de moderació",
|
||||
"mute": "Silenciar",
|
||||
"muteAll": "Silencia tot",
|
||||
"muteEveryoneElse": "Silencia a tots els altres",
|
||||
"stopEveryonesVideo": "Atura el vídeo de tothom",
|
||||
"stopVideo": "Atura el vídeo",
|
||||
"unblockEveryoneMicCamera": "Desbloqueja el micròfon i la càmera de tothom",
|
||||
"videoModeration": "Comença el seu vídeo"
|
||||
},
|
||||
"search": "Cerca participants"
|
||||
},
|
||||
"passwordSetRemotely": "establerta per una altre participant",
|
||||
"passwordDigitsOnly": "Fins a {{number}} dígits",
|
||||
"poweredby": "funciona amb",
|
||||
@@ -606,12 +655,17 @@
|
||||
"moreOptions": "Mostra més opcions",
|
||||
"mute": "Activa o desactiva el silenci de l'àudio",
|
||||
"muteEveryone": "Silencia tothom",
|
||||
"muteEveryoneElse": "Silencia a tots els altres participants",
|
||||
"muteEveryonesVideo": "Desactiva el vídeo de tothom",
|
||||
"muteEveryoneElsesVideo": "Desactiva el vídeo a tots els altres participants",
|
||||
"participants": "Participants",
|
||||
"pip": "Activa o desactiva el mode imatge en imatge",
|
||||
"privateMessage": "Envia un missatge privat",
|
||||
"profile": "Edita el perfil",
|
||||
"raiseHand": "Aixeca o abaixa la mà",
|
||||
"recording": "Activa o desactiva l'enregistrament",
|
||||
"remoteMute": "Silencia el participant",
|
||||
"remoteVideoMute": "Desactiva la càmera del participant",
|
||||
"Settings": "Activa o desactiva la configuració",
|
||||
"sharedvideo": "Activa o desactiva la compartició de vídeo",
|
||||
"shareRoom": "Convida-hi algú",
|
||||
@@ -623,9 +677,14 @@
|
||||
"toggleCamera": "Activa o desactiva la càmera",
|
||||
"videomute": "Activa o desactiva el vídeo",
|
||||
"videoblur": "Activa o desactiva el difuminat",
|
||||
"selectBackground": "Seleccioneu Fons",
|
||||
"expand": "Ampliar",
|
||||
"collapse": "Col·lapse",
|
||||
"toggleFilmstrip": "Activa o desactiva la tira"
|
||||
},
|
||||
"addPeople": "Afegeix persones a la trucada",
|
||||
"audioSettings": "Configuració d'àudio",
|
||||
"videoSettings": "Configuració de vídeo",
|
||||
"audioOnlyOff": "Desactiva el mode de poc ample de banda",
|
||||
"audioOnlyOn": "Activa el mode de poc ample de banda",
|
||||
"audioRoute": "Seleccioneu l'aparell de so",
|
||||
@@ -734,13 +793,18 @@
|
||||
"standardDefinition": "Definició estàndard"
|
||||
},
|
||||
"videothumbnail": {
|
||||
"connectionInfo": "Informació de connexió",
|
||||
"domute": "Silencia",
|
||||
"domuteVideo": "Desactiva la càmera",
|
||||
"domuteOthers": "Silencia a tots els altres participants",
|
||||
"domuteVideoOfOthers": "Desactiva la càmera de tots els altres",
|
||||
"flip": "Capgira",
|
||||
"grantModerator": "Concedir drets de moderador",
|
||||
"kick": "Expulsa",
|
||||
"moderator": "Moderador",
|
||||
"mute": "El participant és silenciat",
|
||||
"muted": "Silenciat",
|
||||
"videoMuted": "Càmera desactivada",
|
||||
"remoteControl": "Inicia o atura el control remot",
|
||||
"show": "Mostra-ho en l'escena",
|
||||
"videomute": "El participant ha aturat la càmera"
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
"copyStream": "Zkopírovat odkaz na živý přenos",
|
||||
"countryNotSupported": "Toto místo zatím nepodporujeme.",
|
||||
"countryReminder": "Voláte mimo USA? Nezapomeňte začít kódem své země!",
|
||||
"defaultEmail": "Vás výchozí e-mail",
|
||||
"defaultEmail": "Vás výchozí email",
|
||||
"disabled": "Nemůžete pozvat lidi.",
|
||||
"failedToAdd": "Nepodařilo se přidat účastníky",
|
||||
"footerText": "Vytáčení je zakázáno.",
|
||||
"googleEmail": "E-mail Google",
|
||||
"googleEmail": "Email Google",
|
||||
"inviteMoreHeader": "Jste v setkání sám/sama",
|
||||
"inviteMoreMailSubject": "Přidejte se k setkání {{appName}}",
|
||||
"inviteMorePrompt": "Pozvat další lidi",
|
||||
@@ -21,7 +21,7 @@
|
||||
"loadingPeople": "Hledání lidí pro pozvání",
|
||||
"noResults": "Žádné odpovídající výsledky vyhledávání",
|
||||
"noValidNumbers": "Zadejte telefonní číslo",
|
||||
"outlookEmail": "E-mail Outlook",
|
||||
"outlookEmail": "Email Outlook",
|
||||
"searchNumbers": "Přidat telefonní čísla",
|
||||
"searchPeople": "Hledat lidi",
|
||||
"searchPeopleAndNumbers": "Hledat lidi nebo přidat jejich telefonní čísla",
|
||||
@@ -30,7 +30,7 @@
|
||||
"shareStream": "Sdílet odkaz na živý přenos",
|
||||
"telephone": "Telefonní číslo: {{number}}",
|
||||
"title": "Pozvěte lidi na toto setkání",
|
||||
"yahooEmail": "E-mail Yahoo"
|
||||
"yahooEmail": "Email Yahoo"
|
||||
},
|
||||
"audioDevices": {
|
||||
"bluetooth": "Bluetooth",
|
||||
@@ -462,7 +462,7 @@
|
||||
"dialogTitle": "Mód předsálí",
|
||||
"disableDialogContent": "Je zapnutý mód předsálí. Zajišťuje, aby do setkání nemohli vstoupit nežádoucí účastníci. Chcete jej vypnout?",
|
||||
"disableDialogSubmit": "Vypnout",
|
||||
"emailField": "Zadejte svoje e-mailovou adresu",
|
||||
"emailField": "Zadejte svoje emailovou adresu",
|
||||
"enableDialogPasswordField": "Nastavte heslo (volitelně)",
|
||||
"enableDialogSubmit": "Zapnout",
|
||||
"enableDialogText": "Mód předsálí vám umožňuje zabezpečit setkání tím, že se lidé mohou připojit až po formálním schválení moderátorem.",
|
||||
@@ -637,8 +637,8 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Nastavte si jméno",
|
||||
"setEmailInput": "Zadejte e-mail",
|
||||
"setEmailLabel": "Nastavte si e-mail vašeho Gravataru",
|
||||
"setEmailInput": "Zadejte email",
|
||||
"setEmailLabel": "Nastavte si email vašeho Gravataru",
|
||||
"title": "Profil"
|
||||
},
|
||||
"raisedHand": "Chtěl(a) bych mluvit",
|
||||
@@ -718,7 +718,7 @@
|
||||
"disableCrashReportingWarning": "Určitě chcete vypnout hlášení o pádu? Nastavení se uplatní, až restartujete aplikaci.",
|
||||
"disableP2P": "Vypnout mód Peer-To-Peer",
|
||||
"displayName": "Zobrazované jméno",
|
||||
"email": "E-mail",
|
||||
"email": "Email",
|
||||
"header": "Nastavení",
|
||||
"profileSection": "Profil",
|
||||
"serverURL": "URL serveru",
|
||||
|
||||
@@ -39,6 +39,28 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "Geringe Bandbreite"
|
||||
},
|
||||
"blankPage": {
|
||||
"meetingEnded": "Konferenz beendet."
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"defaultName": "Breakout-Raum #{{index}}",
|
||||
"mainRoom": "Hauptraum",
|
||||
"actions": {
|
||||
"add": "Breakout-Raum hinzufügen",
|
||||
"autoAssign": "Automatisch auf Breakout-Räume verteilen",
|
||||
"close": "Schließen",
|
||||
"join": "Teilnehmen",
|
||||
"leaveBreakoutRoom": "Breakout-Raum verlassen",
|
||||
"more": "Mehr",
|
||||
"remove": "Entfernen",
|
||||
"sendToBreakoutRoom": "Anwesende in Breakout-Raum verschieben:"
|
||||
},
|
||||
"notifications": {
|
||||
"joinedTitle": "Breakout-Räume",
|
||||
"joined": "Breakout-Raum \"{{name}}\" betreten",
|
||||
"joinedMainRoom": "Hauptraum betreten"
|
||||
}
|
||||
},
|
||||
"calendarSync": {
|
||||
"addMeetingURL": "Konferenzlink hinzufügen",
|
||||
"confirmAddLink": "Möchten Sie einen Jitsi-Link zu diesem Termin hinzufügen?",
|
||||
@@ -555,6 +577,8 @@
|
||||
"notify": {
|
||||
"allowAction": "Erlauben",
|
||||
"allowedUnmute": "Sie können die Stummschaltung aufheben, Ihre Kamera einschalten oder Ihren Bildschirm teilen.",
|
||||
"audioUnmuteBlockedTitle": "Stummschaltung kann nicht aufgehoben werden!",
|
||||
"audioUnmuteBlockedDescription": "Díe Stummschaltung kann aus Überlastungsschutzgründen temporär nicht aufgehoben werden.",
|
||||
"connectedOneMember": "{{name}} nimmt am Meeting teil",
|
||||
"connectedThreePlusMembers": "{{name}} und {{count}} andere Personen nehmen am Meeting teil",
|
||||
"connectedTwoMembers": "{{first}} und {{second}} nehmen am Meeting teil",
|
||||
@@ -566,6 +590,9 @@
|
||||
"invitedThreePlusMembers": "{{name}} und {{count}} andere wurden eingeladen",
|
||||
"invitedTwoMembers": "{{first}} und {{second}} wurden eingeladen",
|
||||
"kickParticipant": "{{kicked}} wurde von {{kicker}} ausgewiesen",
|
||||
"leftOneMember": "{{name}} hat die Konferenz verlassen",
|
||||
"leftThreePlusMembers": "{{name}} und Weitere haben die Konferenz verlassen",
|
||||
"leftTwoMembers": "{{first}} und {{second}} haben die Konferenz verlassen",
|
||||
"me": "Ich",
|
||||
"moderator": "Moderationsrechte vergeben!",
|
||||
"muted": "Der Konferenz wurde stumm beigetreten.",
|
||||
@@ -577,6 +604,7 @@
|
||||
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) von einer anderen Person entfernt",
|
||||
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) von einer anderen Person gesetzt",
|
||||
"raisedHand": "{{name}} möchte sprechen.",
|
||||
"raisedHands": "{{participantName}} und {{raisedHands}} weitere möchten sprechen",
|
||||
"screenShareNoAudio": "Die Option \"Audio freigeben\" wurde bei der Auswahl des Fensters nicht ausgewählt.",
|
||||
"screenShareNoAudioTitle": "Share audio was not checked",
|
||||
"somebody": "Jemand",
|
||||
@@ -605,7 +633,10 @@
|
||||
"moderationToggleDescription": "von {{participantDisplayName}}",
|
||||
"raiseHandAction": "Melden",
|
||||
"reactionSounds": "Interaktionstöne deaktivieren",
|
||||
"groupTitle": "Benachrichtigungen"
|
||||
"reactionSoundsForAll": "Interaktionstöne für alle deaktivieren",
|
||||
"groupTitle": "Benachrichtigungen",
|
||||
"videoUnmuteBlockedTitle": "Kamera kann nicht aktiviert werden!",
|
||||
"videoUnmuteBlockedDescription": "Die Kamera kann aus Überlastungsschutzgründen temporär nicht eingeschaltet werden."
|
||||
},
|
||||
"participantsPane": {
|
||||
"close": "Schließen",
|
||||
@@ -623,6 +654,7 @@
|
||||
"invite": "Person einladen",
|
||||
"askUnmute": "Anfragen, Stummschaltung aufzuheben",
|
||||
"moreModerationActions": "Weitere Moderationsoptionen",
|
||||
"moreParticipantOptions": "Mehr Optionen für Anwesende",
|
||||
"mute": "Stummschalten",
|
||||
"muteAll": "Alle stummschalten",
|
||||
"muteEveryoneElse": "Alle anderen stummschalten",
|
||||
@@ -824,6 +856,7 @@
|
||||
"sounds": "Hinweistöne",
|
||||
"speakers": "Lautsprecher",
|
||||
"startAudioMuted": "Alle Personen treten stummgeschaltet bei",
|
||||
"startReactionsMuted": "Interaktionstöne für alle deaktivieren",
|
||||
"startVideoMuted": "Alle Personen treten ohne Video bei",
|
||||
"talkWhileMuted": "Wenn bei Stummschaltung gesprochen wird",
|
||||
"title": "Einstellungen"
|
||||
@@ -886,6 +919,7 @@
|
||||
"audioOnly": "„Nur Audio“ ein-/ausschalten",
|
||||
"audioRoute": "Audiogerät auswählen",
|
||||
"boo": "Buhen",
|
||||
"breakoutRoom": "Breakout-Räume betreten/verlassen",
|
||||
"callQuality": "Qualitätseinstellungen",
|
||||
"cc": "Untertitel ein-/ausschalten",
|
||||
"chat": "Chatfenster öffnen / schließen",
|
||||
@@ -969,7 +1003,9 @@
|
||||
"hangup": "Konferenz verlassen",
|
||||
"help": "Hilfe",
|
||||
"invite": "Personen einladen",
|
||||
"joinBreakoutRoom": "In Breakout-Raum wechseln",
|
||||
"laugh": "Lachen",
|
||||
"leaveBreakoutRoom": "Breakout-Raum verlassen",
|
||||
"like": "Daumen hoch",
|
||||
"lobbyButtonDisable": "Lobbymodus deaktivieren",
|
||||
"lobbyButtonEnable": "Lobbymodus aktivieren",
|
||||
|
||||
@@ -544,7 +544,7 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Ρυθμίστε το όνομα εμφάνισής σας",
|
||||
"setEmailInput": "Εισάγετε το e-mail",
|
||||
"setEmailInput": "Εισάγετε το email",
|
||||
"setEmailLabel": "Ρυθμίστε το gravatar email",
|
||||
"title": "Προφίλ"
|
||||
},
|
||||
@@ -621,7 +621,7 @@
|
||||
"disableCallIntegration": "Απενεργοποίηση ολοκλήρωσης εγγενούς κλήσης",
|
||||
"disableP2P": "Απενεργοποίηση λειτουργίας Peer-to-Peer",
|
||||
"displayName": "Εμφανιζόμενο όνομα",
|
||||
"email": "E-mail",
|
||||
"email": "Email",
|
||||
"header": "Ρυθμίσεις",
|
||||
"profileSection": "Προφίλ",
|
||||
"serverURL": "Διεύθυνση URL του διακομιστή",
|
||||
|
||||
@@ -480,8 +480,8 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Set your display name",
|
||||
"setEmailInput": "Enter e-mail",
|
||||
"setEmailLabel": "Set your Gravatar e-mail",
|
||||
"setEmailInput": "Enter email",
|
||||
"setEmailLabel": "Set your Gravatar email",
|
||||
"title": "Profile"
|
||||
},
|
||||
"recording": {
|
||||
|
||||
@@ -373,11 +373,11 @@
|
||||
"busyTitle": "Kõik ülekandjad on hetkel hõivatud",
|
||||
"changeSignIn": "Vaheta kontot.",
|
||||
"choose": "Vali otseülekanne",
|
||||
"chooseCTA": "Vali ülekande viis. Oled sisse logitud e-mailiga {{email}}.",
|
||||
"chooseCTA": "Vali ülekande viis. Oled sisse logitud emailiga {{email}}.",
|
||||
"enterStreamKey": "Sisesta siia oma YouTube’i ülekande võti.",
|
||||
"error": "Otseülekanne ebaõnnestus. Proovi uuesti.",
|
||||
"errorAPI": "YouTube’i kanaliga ühendumisel tekkis viga. Palun logi uuesti sisse.",
|
||||
"errorLiveStreamNotEnabled": "Otseülekanne ei ole e-mailiga {{email}} sisse lülitatud. Luba kasutajaga otseülekanded või vaheta kontot.",
|
||||
"errorLiveStreamNotEnabled": "Otseülekanne ei ole emailiga {{email}} sisse lülitatud. Luba kasutajaga otseülekanded või vaheta kontot.",
|
||||
"expandedOff": "Otseülekanne on peatatud",
|
||||
"expandedOn": "Kõnest tehakse otseülekanne YouTube’i.",
|
||||
"expandedPending": "Otseülekanne algab…",
|
||||
@@ -480,7 +480,7 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Sisesta nimi",
|
||||
"setEmailInput": "Sisesta e-mail",
|
||||
"setEmailInput": "Sisesta email",
|
||||
"setEmailLabel": "Sisesta Gravatar e-kirja aadress",
|
||||
"title": "Profiil"
|
||||
},
|
||||
@@ -548,7 +548,7 @@
|
||||
"disableCallIntegration": "Lülita kohaliku kõne integratsioon välja",
|
||||
"disableP2P": "Lülita otseühendus välja",
|
||||
"displayName": "Kasutatav nimi",
|
||||
"email": "E-mail",
|
||||
"email": "Email",
|
||||
"header": "Seaded",
|
||||
"profileSection": "Profiil",
|
||||
"serverURL": "Serveri link",
|
||||
|
||||
@@ -39,6 +39,28 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "Bande passante faible"
|
||||
},
|
||||
"blankPage": {
|
||||
"meetingEnded": "Réunion terminée."
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"defaultName": "Salle annexe #{{index}}",
|
||||
"mainRoom": "Salle principale",
|
||||
"actions": {
|
||||
"add": "Ajouter salle annexe",
|
||||
"autoAssign": "Assigner automatiquement aux salles annexes",
|
||||
"close": "Fermer",
|
||||
"join": "Rejoindre",
|
||||
"leaveBreakoutRoom": "Quitter la salle annexe",
|
||||
"more": "Plus",
|
||||
"remove": "Supprimer",
|
||||
"sendToBreakoutRoom": "Envoyer le participant dans:"
|
||||
},
|
||||
"notifications": {
|
||||
"joinedTitle": "Salles annexes",
|
||||
"joined": "Entrée en salle annexe \"{{name}}\"",
|
||||
"joinedMainRoom": "Retour à la salle principalem"
|
||||
}
|
||||
},
|
||||
"calendarSync": {
|
||||
"addMeetingURL": "Ajouter un lien de conférence",
|
||||
"confirmAddLink": "Voulez-vous ajouter un lien Jitsi à cet événement ?",
|
||||
@@ -268,12 +290,12 @@
|
||||
"muteEveryoneStartMuted": "Tout le monde démarre avec le micro coupé",
|
||||
"muteParticipantBody": "Vous ne pourrez plus réactiver son micro, mais il pourra l'activer par lui-même à tout moment.",
|
||||
"muteParticipantButton": "Couper le micro",
|
||||
"muteParticipantDialog": "Êtes-vous sûr(e) de vouloir couper le micro de ce participant ? Seul le participant pourra ensuite réactiver son micro à tout moment.",
|
||||
"muteParticipantsVideoDialog": "Êtes-vous sûr(e) de vouloir couper la caméra de ce participant ? Seul le participant pourra ensuite réactiver sa caméra à tout moment.",
|
||||
"muteParticipantTitle": "Couper le micro de ce participant ?",
|
||||
"muteParticipantsVideoDialog": "Êtes-vous sûr(e) de vouloir couper la caméra de ce participant ? Seul le participant pourra ensuite réactiver son micro à tout moment.",
|
||||
"muteParticipantsVideoDialogModerationOn": "Êtes-vous sûr(e) de vouloir couper la caméra de ce participant ? Ni vous ni le participant ne pourront la réactiver ensuite ?",
|
||||
"muteParticipantsVideoButton": "Couper la caméra",
|
||||
"muteParticipantsVideoTitle": "Couper la caméra de ce participant?",
|
||||
"muteParticipantsVideoBody": "Vous ne pourrez pas rallumer la caméra, mais ils peuvent la rallumer à tout moment.",
|
||||
"muteParticipantsVideoBodyModerationOn": "Ni vous ni le participant ne pourront rallumer la caméra.",
|
||||
"noDropboxToken": "Pas de jeton Dropbox valide",
|
||||
"Ok": "Ok",
|
||||
"password": "Mot de passe",
|
||||
@@ -501,6 +523,7 @@
|
||||
"expandedPending": "La diffusion en direct a commencé ...",
|
||||
"failedToStart": "La diffusion n'a pas réussi à démarrer",
|
||||
"getStreamKeyManually": "Nous n'avons pas réussi à récupérer un flux de direct. Essayez d'obtenir votre clé de diffusion en direct sur YouTube.",
|
||||
"inProgress": "Enregisrtement ou diffusion en cours",
|
||||
"invalidStreamKey": "La clé de diffusion en direct n'est peut-être pas correcte.",
|
||||
"off": "La diffusion en direct (streaming) a été arrêté",
|
||||
"offBy": "{{name}} a arrêté la diffusion en direct",
|
||||
@@ -508,6 +531,7 @@
|
||||
"onBy": "{{name}} a démarré la diffusion en direct",
|
||||
"pending": "Lancement du direct ...",
|
||||
"serviceName": "Service de diffusion en direct",
|
||||
"sessionAlreadyActive": "Cette session est déjà en cours d'enregistrement ou de diffusion.",
|
||||
"signedInAs": "Vous êtes connecté en tant que :",
|
||||
"signIn": "Se connecter avec Google",
|
||||
"signInCTA": "Connectez vous ou saisissez votre clé de diffusion Youtube.",
|
||||
@@ -553,6 +577,8 @@
|
||||
"notify": {
|
||||
"allowAction": "Permettre",
|
||||
"allowedUnmute": "Vous pouvez réactiver votre écran, votre caméra ou partager votre écran.",
|
||||
"audioUnmuteBlockedTitle": "Rétablissement du son bloqué !",
|
||||
"audioUnmuteBlockedDescription": "Le rétablissement du son a été bloqué temporairement en raison de limites système.",
|
||||
"connectedOneMember": "{{name}} a rejoint la réunion",
|
||||
"connectedThreePlusMembers": "{{name}} et {{count}} autres personnes ont rejoint la réunion",
|
||||
"connectedTwoMembers": "{{first}} et {{second}} ont rejoint la réunion",
|
||||
@@ -564,6 +590,9 @@
|
||||
"invitedThreePlusMembers": "{{name}} et {{count}} autres ont été invités",
|
||||
"invitedTwoMembers": "{{first}} et {{second}} ont été invités",
|
||||
"kickParticipant": "{{kicked}} a été expulsé par {{kicker}}",
|
||||
"leftOneMember": "{{name}} a quitté la réunion",
|
||||
"leftThreePlusMembers": "{{name}} et beaucoup d'autres ont quitté la réunion",
|
||||
"leftTwoMembers": "{{first}} et {{second}} ont quitté la réunion",
|
||||
"me": "Moi",
|
||||
"moderator": "Droits modérateur accordés !",
|
||||
"muted": "Vous avez commencé la conversation en muet.",
|
||||
@@ -575,6 +604,7 @@
|
||||
"passwordRemovedRemotely": "Le $t(lockRoomPassword) a été supprimé par un autre participant",
|
||||
"passwordSetRemotely": "Un $t(lockRoomPassword) a été défini par un autre participant",
|
||||
"raisedHand": "{{name}} aimerait prendre la parole.",
|
||||
"raisedHands": "{{participantName}} et {{raisedHands}} autres personnes",
|
||||
"screenShareNoAudio": " La case Partager l'audio n'a pas été cochée dans l'écran de sélection de la fenêtre.",
|
||||
"screenShareNoAudioTitle": "La case Partager l'audio n'a pas été cochée",
|
||||
"somebody": "Quelqu'un",
|
||||
@@ -603,7 +633,10 @@
|
||||
"moderationToggleDescription": "par {{participantDisplayName}}",
|
||||
"raiseHandAction": "Lever la main",
|
||||
"reactionSounds": "Bloquer les réactions sonores",
|
||||
"groupTitle": "Notifications"
|
||||
"reactionSoundsForAll": "Bloquer les réactions sonores pour tous",
|
||||
"groupTitle": "Notifications",
|
||||
"videoUnmuteBlockedTitle": "Rétablissement de la caméra bloqué !",
|
||||
"videoUnmuteBlockedDescription": "Le rétablissement de la vidéo a été bloqué temporairement en raison de limites système."
|
||||
},
|
||||
"participantsPane": {
|
||||
"close": "Fermer",
|
||||
@@ -620,13 +653,16 @@
|
||||
"blockEveryoneMicCamera": "Bloquer tous les micros et caméras",
|
||||
"invite": "Inviter quelqu'un",
|
||||
"askUnmute": "Demander de réactiver le micro",
|
||||
"moreModerationActions": "Options de modération supplémentaires",
|
||||
"moreParticipantOptions": "Options supplémentaires pour les participants",
|
||||
"mute": "Couper le micro",
|
||||
"muteAll": "Couper le micro de tout le monde",
|
||||
"muteEveryoneElse": "Couper le micro de tous les autres",
|
||||
"stopEveryonesVideo": "Couper toutes les caméras",
|
||||
"stopVideo": "Couper la vidéo",
|
||||
"unblockEveryoneMicCamera": "Débloquer tous les micros et caméras",
|
||||
"videoModeration": "Démarrer leur vidéo"
|
||||
"videoModeration": "Démarrer leur vidéo",
|
||||
"moreModerationControls": "Options de modération supplémentaires"
|
||||
},
|
||||
"search": "Rechercher des participants"
|
||||
},
|
||||
@@ -738,7 +774,7 @@
|
||||
"profile": {
|
||||
"avatar": "avatar",
|
||||
"setDisplayNameLabel": "Choisissez un pseudo",
|
||||
"setEmailInput": "Entrez une adresse e-mail",
|
||||
"setEmailInput": "Entrez une adresse email",
|
||||
"setEmailLabel": "Définir votre courriel Gravatar",
|
||||
"title": "Profil"
|
||||
},
|
||||
@@ -759,6 +795,7 @@
|
||||
"expandedPending": "Démarrage de l'enregistrement ...",
|
||||
"failedToStart": "L'enregistrement n'a pas réussi à démarrer",
|
||||
"fileSharingdescription": "Partager l'enregistrement avec les participants de la réunion",
|
||||
"inProgress": "Enregistrement ou diffusion en cours",
|
||||
"linkGenerated": "Nous avons généré un lien à votre enregistrement.",
|
||||
"live": "DIRECT",
|
||||
"loggedIn": "Connecté en tant que {{userName}}",
|
||||
@@ -771,6 +808,7 @@
|
||||
"serviceDescription": "Votre enregistrement sera enregistré par le service dédié",
|
||||
"serviceDescriptionCloud": "Enregistrement Cloud",
|
||||
"serviceName": "Service d'enregistrement",
|
||||
"sessionAlreadyActive": "Cette session est déjà en cours d'enregistrement ou de diffusion.",
|
||||
"signIn": "Se connecter",
|
||||
"signOut": "Se déconnecter",
|
||||
"unavailable": "Oups ! Le {{serviceName}} est actuellement indisponible. Nous tentons de résoudre le problème. Veuillez réessayer plus tard.",
|
||||
@@ -819,6 +857,7 @@
|
||||
"sounds": "Sons",
|
||||
"speakers": "Haut-parleurs",
|
||||
"startAudioMuted": "Tout le monde commence en muet",
|
||||
"startReactionsMuted": "Tout le monde commence avec les réactions sonores bloquées",
|
||||
"startVideoMuted": "Tout le monde commence sans vidéo",
|
||||
"talkWhileMuted": "vous parlez en étant muet",
|
||||
"title": "Paramètres"
|
||||
@@ -857,7 +896,14 @@
|
||||
"name": "Nom",
|
||||
"seconds": "{{count}}s",
|
||||
"speakerStats": "Statistiques de l'interlocuteur",
|
||||
"speakerTime": "Temps de l'interlocuteur"
|
||||
"speakerTime": "Temps de l'interlocuteur",
|
||||
"happy": "Content",
|
||||
"neutral": "Indifférent",
|
||||
"sad": "Triste",
|
||||
"surprised": "Surpris",
|
||||
"angry": "En colère",
|
||||
"fearful": "Effrayé",
|
||||
"disgusted": "Dégoûté"
|
||||
},
|
||||
"startupoverlay": {
|
||||
"policyText": " ",
|
||||
@@ -874,6 +920,7 @@
|
||||
"audioOnly": "Activer / Désactiver le mode voix uniquement",
|
||||
"audioRoute": "Sélectionner la source audio",
|
||||
"boo": "Hou",
|
||||
"breakoutRoom": "Rejoindre/quitter une salle annexe",
|
||||
"callQuality": "Ajuster la qualité vidéo",
|
||||
"cc": "Activer / Désactiver les sous-titres",
|
||||
"chat": "Afficher / Masquer la discussion instantanée",
|
||||
@@ -923,7 +970,7 @@
|
||||
"surprised": "Surpris",
|
||||
"tileView": "Activer / Désactiver la vue mosaïque",
|
||||
"toggleCamera": "Changer de caméra",
|
||||
"toggleFilmstrip": "Basculer de pellicule",
|
||||
"toggleFilmstrip": "Afficher ou masquer les vignettes vidéo",
|
||||
"videomute": "Activer / Couper la vidéo",
|
||||
"videoblur": "Activer / désactiver le floutage",
|
||||
"selectBackground": "Selectionner un arrière-plan",
|
||||
@@ -957,7 +1004,9 @@
|
||||
"hangup": "Quitter",
|
||||
"help": "Aide",
|
||||
"invite": "Inviter des participants",
|
||||
"joinBreakoutRoom": "Rejoindre salle annexe",
|
||||
"laugh": "Rire",
|
||||
"leaveBreakoutRoom": "Quitter salle annexe",
|
||||
"like": "Approuver",
|
||||
"lobbyButtonDisable": "Désactiver le mode salle d'attente / contrôle des participant(e)s",
|
||||
"lobbyButtonEnable": "Activer le mode salle d'attente / contrôle des participant(e)s",
|
||||
@@ -1135,6 +1184,12 @@
|
||||
"button": "Inviter d'autres personnes",
|
||||
"youAreAlone": "Vous êtes le seul participant de la réunion"
|
||||
},
|
||||
"termsView": {
|
||||
"header": "Conditions d'utilisation"
|
||||
},
|
||||
"privacyView": {
|
||||
"header": "Confidentialité"
|
||||
},
|
||||
"helpView": {
|
||||
"header": "Centre d'aide"
|
||||
},
|
||||
|
||||
@@ -479,8 +479,8 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Állítsa be a megjelenő nevet",
|
||||
"setEmailInput": "Adjon meg egy e-mail címet",
|
||||
"setEmailLabel": "Adja meg a gravatar e-mail címet",
|
||||
"setEmailInput": "Adjon meg egy email címet",
|
||||
"setEmailLabel": "Adja meg a gravatar email címet",
|
||||
"title": "Profil"
|
||||
},
|
||||
"raisedHand": "Beszélni szeretnék",
|
||||
@@ -549,7 +549,7 @@
|
||||
"disableCallIntegration": "A natív hívások integrációjának letiltása",
|
||||
"disableP2P": "Kapcsolja ki a peer-to-peer módot",
|
||||
"displayName": "Megjelenő név",
|
||||
"email": "E-mail",
|
||||
"email": "Email",
|
||||
"header": "Beállítások",
|
||||
"profileSection": "Profil",
|
||||
"serverURL": "Kiszolgáló URL",
|
||||
|
||||
@@ -487,7 +487,7 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Set your display name",
|
||||
"setEmailInput": "Enter e-mail",
|
||||
"setEmailInput": "Enter email",
|
||||
"setEmailLabel": "Set your gravatar email",
|
||||
"title": "Profile"
|
||||
},
|
||||
|
||||
@@ -8,17 +8,17 @@
|
||||
"contacts": "contatti",
|
||||
"countryNotSupported": "Non supportiamo ancora questa destinazione.",
|
||||
"countryReminder": "Stai chiamando fuori dagli Stati Uniti? Assicurati d'inserire il prefisso internazionale!",
|
||||
"defaultEmail": "Tua e-mail di default",
|
||||
"defaultEmail": "Tua email di default",
|
||||
"disabled": "Non puoi invitare persone.",
|
||||
"failedToAdd": "L'aggiunta di nuove persone è fallita",
|
||||
"footerText": "La chiamata all'esterno è disabilitata.",
|
||||
"googleEmail": "E-mail Google",
|
||||
"googleEmail": "Email Google",
|
||||
"inviteMoreHeader": "Sei l'unico presente nella riunione",
|
||||
"inviteMoreMailSubject": "Unisciti alla riunione {{appName}}",
|
||||
"inviteMorePrompt": "Invita altre persone",
|
||||
"linkCopied": "Collegamento copiato negli appunti",
|
||||
"noResults": "Nessun risultato corrispondente",
|
||||
"outlookEmail": "E-mail Outlook",
|
||||
"outlookEmail": "Email Outlook",
|
||||
"phoneNumbers": "numeri di telefono",
|
||||
"searching": "Sto cercando...",
|
||||
"shareInvite": "Condividi invito alla riunione",
|
||||
@@ -27,7 +27,7 @@
|
||||
"sipAddresses": "indirizzi SIP",
|
||||
"telephone": "Telefono: {{number}}",
|
||||
"title": "Invita persone a questa riunione",
|
||||
"yahooEmail": "E-mail Yahoo"
|
||||
"yahooEmail": "Email Yahoo"
|
||||
},
|
||||
"audioDevices": {
|
||||
"bluetooth": "Bluetooth",
|
||||
@@ -736,8 +736,8 @@
|
||||
"profile": {
|
||||
"avatar": "avatar",
|
||||
"setDisplayNameLabel": "Imposta il nome da visualizzare",
|
||||
"setEmailInput": "Inserisci e-mail",
|
||||
"setEmailLabel": "Imposta l'e-mail gravatar",
|
||||
"setEmailInput": "Inserisci email",
|
||||
"setEmailLabel": "Imposta l'email gravatar",
|
||||
"title": "Profilo"
|
||||
},
|
||||
"raisedHand": "Vorrebbe parlare",
|
||||
@@ -834,7 +834,7 @@
|
||||
"disableCrashReporting": "Disattiva la diagnostica dei crash",
|
||||
"disableCrashReportingWarning": "Sei sicuro di voler disattivare la diagnostica dei crash? Quest'impostazione verrà eseguita al prossimo avvio dell'app.",
|
||||
"displayName": "Nome visualizzato",
|
||||
"email": "e-mail",
|
||||
"email": "email",
|
||||
"header": "Impostazioni",
|
||||
"profileSection": "Profilo",
|
||||
"serverURL": "URL del server",
|
||||
@@ -1141,7 +1141,7 @@
|
||||
"dialogTitle": "Sala d'attesa",
|
||||
"disableDialogContent": "Sala d'attesa attiva. Questa funzione ti permette di non dare accesso alla riunione a partecipanti indesiderati. Vuoi disattivarla?",
|
||||
"disableDialogSubmit": "Disattiva",
|
||||
"emailField": "Inserisci il tuo indirizzo e-mail",
|
||||
"emailField": "Inserisci il tuo indirizzo email",
|
||||
"enableDialogPasswordField": "Imposta password (opzionale)",
|
||||
"enableDialogSubmit": "Attiva",
|
||||
"enableDialogText": "La sala d'attesa ti permette di proteggere la riunione concedendo l'ingresso solo alle persone autorizzate da un moderatore.",
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
"copyStream": "Link naar livestream kopiëren",
|
||||
"countryNotSupported": "Deze bestemming wordt nog niet ondersteund.",
|
||||
"countryReminder": "Belt u buiten de Verenigde Staten? Vergeet dan niet met de landcode te beginnen.",
|
||||
"defaultEmail": "Uw Standaard E-mail",
|
||||
"defaultEmail": "Uw Standaard Email",
|
||||
"disabled": "U kunt geen personen uitnodigen.",
|
||||
"failedToAdd": "Het toevoegen van deelnemers is mislukt",
|
||||
"footerText": "Uitgaande oproepen zijn uitgeschakeld.",
|
||||
"googleEmail": "Google E-mail",
|
||||
"googleEmail": "Google Email",
|
||||
"inviteMoreHeader": "U bent de enige in de vergadering",
|
||||
"inviteMoreMailSubject": "Deelnemen aan {{appName}}-vergadering",
|
||||
"inviteMorePrompt": "Nodig meer personen uit",
|
||||
@@ -21,7 +21,7 @@
|
||||
"loadingPeople": "Personen om uit te nodigen aan het zoeken",
|
||||
"noResults": "Geen resultaten die overeenkomen met de zoekopdracht",
|
||||
"noValidNumbers": "Voer een telefoonnummer in",
|
||||
"outlookEmail": "Outlook E-mail",
|
||||
"outlookEmail": "Outlook Email",
|
||||
"searchNumbers": "Telefoonnummers toevoegen",
|
||||
"searchPeople": "Personen zoeken",
|
||||
"searchPeopleAndNumbers": "Personen zoeken of hun telefoonnummers toevoegen",
|
||||
@@ -30,7 +30,7 @@
|
||||
"shareStream": "Deel de link naar de livestream",
|
||||
"telephone": "Telefoon: {{number}}",
|
||||
"title": "Personen uitnodigen voor deze vergadering",
|
||||
"yahooEmail": "Yahoo E-mail"
|
||||
"yahooEmail": "Yahoo Email"
|
||||
},
|
||||
"audioDevices": {
|
||||
"bluetooth": "Bluetooth",
|
||||
@@ -586,8 +586,8 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Uw weergavenaam instellen",
|
||||
"setEmailInput": "Voer e-mailadres in",
|
||||
"setEmailLabel": "Uw Gravatar e-mail instellen",
|
||||
"setEmailInput": "Voer emailadres in",
|
||||
"setEmailLabel": "Uw Gravatar email instellen",
|
||||
"title": "Profiel"
|
||||
},
|
||||
"raisedHand": "Zou graag willen spreken",
|
||||
@@ -931,7 +931,7 @@
|
||||
"dialogTitle": "Lobby-modus",
|
||||
"disableDialogContent": "Lobby-modus is momenteel ingeschakeld. Deze functie zorgt ervoor dat ongewenste deelnemers niet aan uw vergadering kunnen deelnemen. Wilt u het uitschakelen?",
|
||||
"disableDialogSubmit": "Uitschakelen",
|
||||
"emailField": "Voer uw e-mailadres in",
|
||||
"emailField": "Voer uw emailadres in",
|
||||
"enableDialogPasswordField": "Stel wachtwoord in (optioneel)",
|
||||
"enableDialogSubmit": "Inschakelen",
|
||||
"enableDialogText": "Met de lobby-modus kunt u uw vergadering beveiligen, door deelnemers alleen toe te laten na een formele goedkeuring van een moderator.",
|
||||
|
||||
@@ -251,8 +251,6 @@
|
||||
"muteEveryoneTitle": "Rendre mut tot lo monde ?",
|
||||
"muteParticipantBody": "Poiretz pas lo tornar activar lo microfòn, mai eles pòdon o far quand vòlon.",
|
||||
"muteParticipantButton": "Copar lo son",
|
||||
"muteParticipantDialog": "Volètz vertadièrament copar lo son a aqueste participant ? Poiretz pas lo tornar la votz, mas eles pòdon restablir la comunicacion quand vòlgan.",
|
||||
"muteParticipantTitle": "Copar lo micro als participants ?",
|
||||
"Ok": "D'acòrdi",
|
||||
"passwordLabel": "Aquesta conferéncia es estada barrada per un participant. Mercés de dintrar lo $t(lockRoomPassword) per la rejónher.",
|
||||
"passwordNotSupported": "Ajustar un $t(lockRoomPassword) a una conferéncia es pas suportat.",
|
||||
@@ -331,7 +329,7 @@
|
||||
"muteParticipantsVideoTitle": "Desactivar la camèra d’aqueste participant ?",
|
||||
"noDropboxToken": "Cap de geton Dropbox pas valid",
|
||||
"password": "Senhal",
|
||||
"sessionRestarted": "Sonada reaviada a causa d’un problèma de connexion",
|
||||
"sessionRestarted": "Sonada reaviada a causa d’un problèma de connexion.",
|
||||
"shareAudio": "Contunhar",
|
||||
"shareAudioTitle": "Cossí partejar l’àudio",
|
||||
"shareAudioWarningTitle": "Devètz arrestar lo partiment d’ecran abans lo partiment d’àudio",
|
||||
@@ -361,7 +359,9 @@
|
||||
"muteParticipantsVideoBody": "Poiretz pas lor activar la camèra de nòu, mas poirián se la restablir quand vòlga.",
|
||||
"shareAudioWarningD2": "devètz reaviar lo partiment d’ecran e clicar l’opcion « partejar l’àudio ».",
|
||||
"shareScreenWarningD2": "devètz arrestar lo partiment àudio, aviar lo partiment d’ecran e clicar l’opcion « partejar l’àudio ».",
|
||||
"localUserControls": "Contraròtles de l’utilizaire local"
|
||||
"localUserControls": "Contraròtles de l’utilizaire local",
|
||||
"muteParticipantsVideoBodyModerationOn": "Poiretz pas li activar de nòu e el tanpauc.",
|
||||
"muteParticipantsVideoDialogModerationOn": "Volètz vertadièrament copar la camèra d’aqueste participant ? Poiretz pas li activar de nòu e el tanpauc."
|
||||
},
|
||||
"dialOut": {
|
||||
"statusMessage": "ara es {{status}}"
|
||||
@@ -495,7 +495,9 @@
|
||||
"start": "Aviar una difusion en dirècte",
|
||||
"streamIdHelp": "Qu’es aquò ?",
|
||||
"unavailableTitle": "Difusion en dirècte indisponibla",
|
||||
"youtubeTerms": "Condicions d’utilizacion de YouTube"
|
||||
"youtubeTerms": "Condicions d’utilizacion de YouTube",
|
||||
"sessionAlreadyActive": "Aquesta session es ja en cors d’enregistrament o en difusion en dirèct.",
|
||||
"inProgress": "Enregistrament o difusion en dirècte en cors"
|
||||
},
|
||||
"lobby": {
|
||||
"allow": "Autorizar",
|
||||
@@ -604,7 +606,7 @@
|
||||
"suboptimalExperienceTitle": "Avertiment del navigador",
|
||||
"unmute": "Restablir lo son",
|
||||
"allowAction": "Autorizar",
|
||||
"videoMutedRemotelyTitle": "{{moderator}} a copat vòstra camèra",
|
||||
"videoMutedRemotelyTitle": "{{participantDisplayName}} a copat vòstra vidèo",
|
||||
"moderationInEffectTitle": "Lo moderator a amudit vòstre microfòn",
|
||||
"moderationInEffectVideoTitle": "Lo moderator a blocat vòstra camèra",
|
||||
"videoMutedRemotelyDescription": "La podètz totjorn tornar activar.",
|
||||
@@ -623,7 +625,11 @@
|
||||
"allowedUnmute": "Vos podètz restablir lo son del microfòn, aviar la camèra e partejar l’ecran.",
|
||||
"screenShareNoAudio": " La casa Partejar l’àudio es pas estada marcada a l’ecran de seleccion de la fenèstra.",
|
||||
"moderationInEffectCSDescription": "Volgatz levar la man se volètz partejar vòstre ecran.",
|
||||
"moderationInEffectVideoDescription": "Volgatz levar la man se volètz aviar vòstra camèra."
|
||||
"moderationInEffectVideoDescription": "Volgatz levar la man se volètz aviar vòstra camèra.",
|
||||
"audioUnmuteBlockedTitle": "Restabliment del son del microfòn blocat !",
|
||||
"videoUnmuteBlockedTitle": "Restabliment de la camèra blocat !",
|
||||
"audioUnmuteBlockedDescription": "Las operacion de restabliment del son microfòn son estadas blocadas pel moment a causa de limitas sistèma.",
|
||||
"videoUnmuteBlockedDescription": "Las operacion de restabliment de la camèra son estadas blocadas pel moment a causa de limitas sistèma."
|
||||
},
|
||||
"passwordDigitsOnly": "Fins a {{number}} chifras",
|
||||
"passwordSetRemotely": "causit per qualqu'un mai",
|
||||
@@ -741,7 +747,9 @@
|
||||
"uploadToCloud": "Enviar al cloud",
|
||||
"limitNotificationDescriptionWeb": "A causa d’una demanda fòrta vòstre enregistrament serà limitat a {{limit}} min. Per d’enregistraments sens limit ensajatz <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
|
||||
"limitNotificationDescriptionNative": "A causa d’una demanda fòrta vòstre enregistrament serà limitat a {{limit}} min. Per d’enregistraments sens limit ensajatz <3>{{app}}</3>.",
|
||||
"errorFetchingLink": "Error en recuperant lo ligam de l’enregistrament."
|
||||
"errorFetchingLink": "Error en recuperant lo ligam de l’enregistrament.",
|
||||
"inProgress": "Enregistrament o difusion en dirècte en cors",
|
||||
"sessionAlreadyActive": "Aquesta session es ja en cors d’enregistrament o en difusion en dirèct."
|
||||
},
|
||||
"sectionList": {
|
||||
"pullToRefresh": "Tirar per actualizar"
|
||||
@@ -823,7 +831,14 @@
|
||||
"seconds": "{{count}} segondas",
|
||||
"speakerStats": "Estatisticas orator",
|
||||
"speakerTime": "Temps de paraula",
|
||||
"search": "Recercar"
|
||||
"search": "Recercar",
|
||||
"neutral": "Neutre",
|
||||
"sad": "Trist",
|
||||
"surprised": "Surprés",
|
||||
"angry": "Encolerat",
|
||||
"fearful": "Pauruc",
|
||||
"disgusted": "Desgostat",
|
||||
"happy": "Content"
|
||||
},
|
||||
"startupoverlay": {
|
||||
"genericTitle": "Aquesta reünion requerís l'utilizacion del microfòn e de la camèra.",
|
||||
@@ -894,7 +909,8 @@
|
||||
"expand": "Espandir",
|
||||
"collapse": "Plegar",
|
||||
"muteEveryoneElse": "Copar lo microfòn dels autres",
|
||||
"reactionsMenu": "Dobrir / Tampar lo menú de reaccions"
|
||||
"reactionsMenu": "Dobrir / Tampar lo menú de reaccions",
|
||||
"breakoutRoom": "Rejónher/quitar la sala de reünion"
|
||||
},
|
||||
"addPeople": "Ajustar de monde a vòstra sonada",
|
||||
"audioOnlyOff": "Desactivar lo mòde connexion febla",
|
||||
@@ -975,7 +991,9 @@
|
||||
"reactionLike": "Enviar una reaccion d’aprobacion",
|
||||
"reactionSilence": "Enviar una reaccion de silenci",
|
||||
"reactionSurprised": "Enviar una reaccion de suspresa",
|
||||
"reactionClap": "Enviar una reaccion d’aplaudiment"
|
||||
"reactionClap": "Enviar una reaccion d’aplaudiment",
|
||||
"leaveBreakoutRoom": "Quitar la sala de reünion",
|
||||
"joinBreakoutRoom": "Rejónher la sala de reünion"
|
||||
},
|
||||
"transcribing": {
|
||||
"ccButtonTooltip": "Aviar / Arrestat los sostítols",
|
||||
@@ -1140,7 +1158,9 @@
|
||||
"stopVideo": "Arrestar la vidèo",
|
||||
"unblockEveryoneMicCamera": "Desblocar lo microfòn e la camèra de tot lo monde",
|
||||
"videoModeration": "Aviar lor vidèo",
|
||||
"allowVideo": "Autorizar la vidèo"
|
||||
"allowVideo": "Autorizar la vidèo",
|
||||
"moreModerationActions": "Mai d’opcions de moderacion",
|
||||
"moreParticipantOptions": "Mai d’opcions de participant"
|
||||
},
|
||||
"search": "Cercar participants"
|
||||
},
|
||||
@@ -1171,7 +1191,31 @@
|
||||
"notification": {
|
||||
"title": "Un sondatge novèl es estat apondut a la conferéncia",
|
||||
"description": "Dobrissètz l’onglet dels sondatge per votar"
|
||||
}
|
||||
},
|
||||
"by": "Per {{ name }}"
|
||||
},
|
||||
"volumeSlider": "Nivèl de volum"
|
||||
"volumeSlider": "Nivèl de volum",
|
||||
"breakoutRooms": {
|
||||
"actions": {
|
||||
"add": "Apondre una sala de reünion",
|
||||
"close": "Tampar",
|
||||
"join": "Rejónher",
|
||||
"leaveBreakoutRoom": "Quitar la sala de reünion",
|
||||
"more": "Mai",
|
||||
"remove": "Levar",
|
||||
"sendToBreakoutRoom": "Enviar lo participant a :",
|
||||
"autoAssign": "Atribucion auto a las salas de reünion"
|
||||
},
|
||||
"defaultName": "Sala de reünion #{{index}}",
|
||||
"mainRoom": "Sala principala"
|
||||
},
|
||||
"privacyView": {
|
||||
"header": "Confidencialitat"
|
||||
},
|
||||
"termsView": {
|
||||
"header": "Acòrds"
|
||||
},
|
||||
"blankPage": {
|
||||
"meetingEnded": "Conferéncia acabada."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
"dismiss": "Odrzuć",
|
||||
"displayNameRequired": "Cześć! Jak się nazywasz?",
|
||||
"done": "Zrobione",
|
||||
"e2eeDescription": "Szyfrowanie End-to-End jest aktualnie w fazie EKSPERYMENTALNEJ. Proszę mieć na uwadze fakt, że szyfrowanie end-to-end wyłączy oferowane przez serwer usługi takie jak: nagrywanie, streaming na żywo i dołączanie uczestników przez telefon. Proszę mieć również na uwadze fakt, że takie spotkanie zadziałą tylko dla uczestników korzystających z przeglądarek wspierających wstawiane strumienie.",
|
||||
"e2eeDescription": "Szyfrowanie End-to-End jest aktualnie w fazie EKSPERYMENTALNEJ. Proszę mieć na uwadze fakt, że szyfrowanie end-to-end wyłączy oferowane przez serwer usługi takie jak: nagrywanie, streaming na żywo i dołączanie uczestników przez telefon. Proszę mieć również na uwadze fakt, że takie spotkanie będą działać tylko dla uczestników korzystających z przeglądarek wspierających wstawiane strumienie.",
|
||||
"e2eeLabel": "Klucz E2EE",
|
||||
"e2eeWarning": "UWAGA: Niektórzy uczestnicy tego spotkania nie mają włączonej obsługi szyfrowania E2EE. Jeśli włączysz tą funkcję ci uczestnicy nie będą mieli z tobą kontaktu.",
|
||||
"enterDisplayName": "Wpisz tutaj swoje imię",
|
||||
@@ -724,7 +724,7 @@
|
||||
"profile": {
|
||||
"avatar": "awatar",
|
||||
"setDisplayNameLabel": "Podaj swoją wyświetlaną nazwę",
|
||||
"setEmailInput": "Wprowadź adres e-mail",
|
||||
"setEmailInput": "Wprowadź adres email",
|
||||
"setEmailLabel": "Ustaw adres poczty elektronicznej swojego Gravatara",
|
||||
"title": "Profil"
|
||||
},
|
||||
@@ -767,7 +767,7 @@
|
||||
"pullToRefresh": "Przeciągnij, aby odświeżyć"
|
||||
},
|
||||
"security": {
|
||||
"about": "Możesz dodać a $t(lockRoomPassword) do spotkania. Uczestnicy będą musieli wprowadzić $t(lockRoomPassword) zanim zostaną dołączeni do spotkania.",
|
||||
"about": "Możesz dodać $t(lockRoomPassword) do spotkania. Uczestnicy będą musieli wprowadzić $t(lockRoomPassword) przed dołączeniem do spotkania.",
|
||||
"aboutReadOnly": "Uczestnicy posiadający uprawnienia do moderacji mogą ustawić $t(lockRoomPassword) do spotkania. Uczestnicy będą musieli wprowadzić $t(lockRoomPassword) zanim zostaną dołączeni do spotkania.",
|
||||
"insecureRoomNameWarning": "Nazwa pokoju nie jest bezpieczna. Niepowołaniu uczestnicy mogą dołączyć do spotkania. Proszę rozważyć ustawienie hasła spotkania używając przycisku Opcje zabezpieczeń.",
|
||||
"securityOptions": "Opcje zabezpieczeń"
|
||||
@@ -822,7 +822,7 @@
|
||||
"disableCrashReporting": "Wyłącz raportowanie błędów",
|
||||
"disableCrashReportingWarning": "Czy na pewno chcesz wyłączyć raportowanie błędów? Ustawienie zacznie funkcjonować po restarcie aplikacji.",
|
||||
"displayName": "Wyświetlana nazwa",
|
||||
"email": "E-mail",
|
||||
"email": "Email",
|
||||
"header": "Ustawienia",
|
||||
"profileSection": "Profil",
|
||||
"serverURL": "Adres URL serwera",
|
||||
@@ -901,7 +901,7 @@
|
||||
"shareaudio": "Udostępnij audio",
|
||||
"sharedvideo": "Przełącz udostępnianie obrazu na YouTube",
|
||||
"shareRoom": "Zaproś kogoś",
|
||||
"shareYourScreen": "Przełączanie podziału ekranu",
|
||||
"shareYourScreen": "Przełączanie udostępniania ekranu",
|
||||
"shortcuts": "Przełączanie skrótów klawiszowych",
|
||||
"show": "Pokaż na scenie",
|
||||
"silence": "Cisza",
|
||||
|
||||
@@ -8,17 +8,17 @@
|
||||
"contacts": "contactos",
|
||||
"countryNotSupported": "Ainda não temos suporte para este destino.",
|
||||
"countryReminder": "Está a telefonar para fora dos EUA? Por favor, certifique-se de que começa com o código do país!",
|
||||
"defaultEmail": "O seu e-mail predefinido",
|
||||
"defaultEmail": "O seu email predefinido",
|
||||
"disabled": "Não pode convidar outras pessoas.",
|
||||
"failedToAdd": "Falha ao adicionar participantes",
|
||||
"footerText": "A marcação está desactivada.",
|
||||
"googleEmail": "E-mail do Google",
|
||||
"googleEmail": "Email do Google",
|
||||
"inviteMoreHeader": "Você é o único na reunião",
|
||||
"inviteMoreMailSubject": "Participar na reunião {{appName}}",
|
||||
"inviteMorePrompt": "Convidar mais pessoas",
|
||||
"linkCopied": "Link copiado para a área de transferência",
|
||||
"noResults": "Sem resultados de pesquisa correspondentes",
|
||||
"outlookEmail": "E-mail do Outlook",
|
||||
"outlookEmail": "Email do Outlook",
|
||||
"phoneNumbers": "números de telefone",
|
||||
"searching": "A pesquisar...",
|
||||
"shareInvite": "Partilhar convite de reunião",
|
||||
@@ -27,7 +27,7 @@
|
||||
"sipAddresses": "endereços SIP",
|
||||
"telephone": "Telefone: {{number}}",
|
||||
"title": "Convidar pessoas para esta reunião",
|
||||
"yahooEmail": "E-mail do Yahoo"
|
||||
"yahooEmail": "Email do Yahoo"
|
||||
},
|
||||
"audioDevices": {
|
||||
"bluetooth": "Bluetooth",
|
||||
@@ -39,6 +39,28 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "Largura de banda baixa"
|
||||
},
|
||||
"blankPage": {
|
||||
"meetingEnded": "A reunião terminou."
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"defaultName": "Salas simultâneas #{{index}}",
|
||||
"mainRoom": "Sala principal",
|
||||
"actions": {
|
||||
"add": "Adicionar salas simultâneas",
|
||||
"autoAssign": "Atribuição automática de salas simultâneas",
|
||||
"close": "Fechar",
|
||||
"join": "Entrar na sala",
|
||||
"leaveBreakoutRoom": "Sair da sala",
|
||||
"more": "Mais",
|
||||
"remove": "Eliminar sala",
|
||||
"sendToBreakoutRoom": "Enviar participante para:"
|
||||
},
|
||||
"notifications": {
|
||||
"joinedTitle": "Salas simultâneas",
|
||||
"joined": "Entrada do \"{{name}}\" na sala",
|
||||
"joinedMainRoom": "Entrada na sala principal"
|
||||
}
|
||||
},
|
||||
"calendarSync": {
|
||||
"addMeetingURL": "Adicionar um link da reunião",
|
||||
"confirmAddLink": "Gostaria de adicionar um link do Jitsi a esse evento?",
|
||||
@@ -501,6 +523,7 @@
|
||||
"expandedPending": "Iniciando a transmissão em direto...",
|
||||
"failedToStart": "Falha ao iniciar a transmissão em direto",
|
||||
"getStreamKeyManually": "Não conseguimos buscar nenhuma transmissão em direto. Tente obter sua chave de transmissão em direto no YouTube.",
|
||||
"inProgress": "Gravação ou transmissão em direto em curso",
|
||||
"invalidStreamKey": "A senha para transmissão em direto pode estar incorreta.",
|
||||
"off": "Transmissão em direto encerrada",
|
||||
"offBy": "{{name}} parou a transmissão em direto",
|
||||
@@ -508,6 +531,7 @@
|
||||
"onBy": "{{name}} iniciou a transmissão em direto",
|
||||
"pending": "Iniciando Transmissão em Direto...",
|
||||
"serviceName": "Serviço de Transmissão em Direto",
|
||||
"sessionAlreadyActive": "Esta sessão já está a ser gravada ou transmitida em direto.",
|
||||
"signedInAs": "Você está conectado como:",
|
||||
"signIn": "Faça login no Google",
|
||||
"signInCTA": "Faça login ou insira sua chave de transmissão em Direto do YouTube.",
|
||||
@@ -553,6 +577,8 @@
|
||||
"notify": {
|
||||
"allowAction": "Permitir",
|
||||
"allowedUnmute": "Pode ligar o seu microfone, ligar a sua câmara ou partilhar o seu ecrã.",
|
||||
"audioUnmuteBlockedTitle": "Ligar microfone bloqueado!",
|
||||
"audioUnmuteBlockedDescription": "A operação de ligar o microfone foi temporariamente bloqueada devido aos limites do sistema.",
|
||||
"connectedOneMember": "{{name}} entrou na reunião",
|
||||
"connectedThreePlusMembers": "{{name}} e muitos outros entraram na reunião",
|
||||
"connectedTwoMembers": "{{first}} e {{second}} entraram na reunião",
|
||||
@@ -564,6 +590,9 @@
|
||||
"invitedThreePlusMembers": "{{name}} e {{count}} outros foram convidados",
|
||||
"invitedTwoMembers": "{{first}} e {{second}} foram convidados",
|
||||
"kickParticipant": "{{kicked}} foi expulso por {{kicker}}",
|
||||
"leftOneMember": "{{name}} deixou a reunião",
|
||||
"leftThreePlusMembers": "{{name}} e muitos outros deixaram a reunião",
|
||||
"leftTwoMembers": "{{first}} e {{second}} deixaram a reunião",
|
||||
"me": "Eu",
|
||||
"moderator": "É agora um moderador",
|
||||
"muted": "Você iniciou uma conversa com o microfone desativado.",
|
||||
@@ -575,6 +604,7 @@
|
||||
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) removido por outro participante",
|
||||
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) definido por outro participante",
|
||||
"raisedHand": "Gostaria de falar.",
|
||||
"raisedHands": "{{participantName}} e mais {{raisedHands}} pessoas",
|
||||
"screenShareNoAudio": " A caixa de compartilhar áudio não foi marcada no ecrã de seleção da janela.",
|
||||
"screenShareNoAudioTitle": "Não foi possível partilhar o áudio do sistema!",
|
||||
"somebody": "Alguém",
|
||||
@@ -603,7 +633,10 @@
|
||||
"moderationToggleDescription": "pelo {{participantDisplayName}}",
|
||||
"raiseHandAction": "Levantar a mão",
|
||||
"reactionSounds": "Desactivar sons",
|
||||
"groupTitle": "Notificações"
|
||||
"reactionSoundsForAll": "Desativar sons para todos",
|
||||
"groupTitle": "Notificações",
|
||||
"videoUnmuteBlockedTitle": "Ligar câmara bloqueada!",
|
||||
"videoUnmuteBlockedDescription": "A operação de ligar a câmara foi temporariamente bloqueada devido aos limites do sistema."
|
||||
},
|
||||
"participantsPane": {
|
||||
"close": "Fechar",
|
||||
@@ -621,13 +654,15 @@
|
||||
"invite": "Convidar alguém",
|
||||
"askUnmute": "Pedir para ligar o microfone",
|
||||
"moreModerationActions": "Mais opções de moderação",
|
||||
"moreParticipantOptions": "Mais opções de participantes",
|
||||
"mute": "Silenciar",
|
||||
"muteAll": "Silenciar todos",
|
||||
"muteEveryoneElse": "Silenciar todos os outros",
|
||||
"stopEveryonesVideo": "Desligar a câmara de todos",
|
||||
"stopVideo": "Desligar a câmara",
|
||||
"unblockEveryoneMicCamera": "Desbloquear o microfone e a câmara de todos",
|
||||
"videoModeration": "Ligarem a câmara deles"
|
||||
"videoModeration": "Ligarem a câmara deles",
|
||||
"moreModerationControls": "Mais controlos de moderação"
|
||||
},
|
||||
"search": "Pesquisar participantes"
|
||||
},
|
||||
@@ -739,7 +774,7 @@
|
||||
"profile": {
|
||||
"avatar": "avatar",
|
||||
"setDisplayNameLabel": "Definir seu nome de exibição",
|
||||
"setEmailInput": "Digite e-mail",
|
||||
"setEmailInput": "Digite email",
|
||||
"setEmailLabel": "Definir seu email de gravatar",
|
||||
"title": "Perfil"
|
||||
},
|
||||
@@ -760,6 +795,7 @@
|
||||
"expandedPending": "Iniciando gravação...",
|
||||
"failedToStart": "Falha ao iniciar a gravação",
|
||||
"fileSharingdescription": "Compartilhar gravação com participantes da reunião",
|
||||
"inProgress": "Gravação ou transmissão em direto em curso",
|
||||
"linkGenerated": "Gerámos um link para a sua gravação.",
|
||||
"live": "DIRETO",
|
||||
"loggedIn": "Conectado como {{userName}}",
|
||||
@@ -772,6 +808,7 @@
|
||||
"serviceDescription": "Sua gravação será salva pelo serviço de gravação",
|
||||
"serviceDescriptionCloud": "Gravação na nuvem",
|
||||
"serviceName": "Serviço de gravação",
|
||||
"sessionAlreadyActive": "Esta sessão já está a ser gravada ou transmitida em direto.",
|
||||
"signIn": "Entrar",
|
||||
"signOut": "Sair",
|
||||
"unavailable": "Oops! O {{serviceName}} está indisponível. Estamos trabalhando para resolver o problema. Por favor, tente mais tarde.",
|
||||
@@ -820,6 +857,7 @@
|
||||
"sounds": "Sons",
|
||||
"speakers": "Participantes",
|
||||
"startAudioMuted": "Todos começam com microfone desligado",
|
||||
"startReactionsMuted": "Sons de reação silenciados para todos",
|
||||
"startVideoMuted": "Todos começam com câmara desligada",
|
||||
"talkWhileMuted": "Se fala e está com microfone desligado",
|
||||
"title": "Definições"
|
||||
@@ -837,7 +875,7 @@
|
||||
"disableCrashReporting": "Desativar relatório de falhas",
|
||||
"disableCrashReportingWarning": "Tem a certeza de que quer desativar o relatório de falhas? A configuração será aplicada depois de reiniciar a aplicação.",
|
||||
"displayName": "Nome de exibição",
|
||||
"email": "E-mail",
|
||||
"email": "Email",
|
||||
"header": "Configurações",
|
||||
"profileSection": "Perfil",
|
||||
"serverURL": "URL do servidor",
|
||||
@@ -858,7 +896,14 @@
|
||||
"name": "Nome",
|
||||
"seconds": "{{count}}s",
|
||||
"speakerStats": "Estatísticas dos Participantes",
|
||||
"speakerTime": "Tempo do Participante"
|
||||
"speakerTime": "Tempo do Participante",
|
||||
"happy": "Feliz",
|
||||
"neutral": "Neutro",
|
||||
"sad": "Triste",
|
||||
"surprised": "Surpreendido",
|
||||
"angry": "Zangado",
|
||||
"fearful": "Temeroso",
|
||||
"disgusted": "Desgostoso"
|
||||
},
|
||||
"startupoverlay": {
|
||||
"policyText": " ",
|
||||
@@ -875,6 +920,7 @@
|
||||
"audioOnly": "Mudar para apenas áudio",
|
||||
"audioRoute": "Selecionar o dispositivo de som",
|
||||
"boo": "Vaia",
|
||||
"breakoutRoom": "Entrar/Sair salas instantâneas",
|
||||
"callQuality": "Gerir a qualidade do vídeo",
|
||||
"cc": "Mudar legendas",
|
||||
"chat": "Abrir / Fechar chat",
|
||||
@@ -958,7 +1004,9 @@
|
||||
"hangup": "Sair da reunião",
|
||||
"help": "Ajuda",
|
||||
"invite": "Convidar pessoas",
|
||||
"joinBreakoutRoom": "Entrar na sala",
|
||||
"laugh": "Risos",
|
||||
"leaveBreakoutRoom": "Sair da sala",
|
||||
"like": "Aprovado",
|
||||
"lobbyButtonDisable": "Desativar sala de espera",
|
||||
"lobbyButtonEnable": "Ativar sala de espera",
|
||||
@@ -1136,6 +1184,12 @@
|
||||
"button": "Convidar outros",
|
||||
"youAreAlone": "É o único na reunião"
|
||||
},
|
||||
"termsView": {
|
||||
"header": "Termos"
|
||||
},
|
||||
"privacyView": {
|
||||
"header": "Privacidade"
|
||||
},
|
||||
"helpView": {
|
||||
"header": "Centro de ajuda"
|
||||
},
|
||||
@@ -1148,7 +1202,7 @@
|
||||
"dialogTitle": "Modo sala de espera",
|
||||
"disableDialogContent": "O modo sala de espera está actualmente activada. Esta característica assegura que os participantes indesejados não possam juntar-se à sua reunião. Quer desativá-la?",
|
||||
"disableDialogSubmit": "Desativar",
|
||||
"emailField": "Introduza o seu endereço de e-mail",
|
||||
"emailField": "Introduza o seu endereço de email",
|
||||
"enableDialogPasswordField": "Definir senha (opcional)",
|
||||
"enableDialogSubmit": "Habilitar",
|
||||
"enableDialogText": "O modo sala de espera permite-lhe proteger a sua reunião apenas permitindo a entrada de pessoas após uma aprovação formal por um moderador.",
|
||||
|
||||
@@ -12,13 +12,13 @@
|
||||
"disabled": "Você não pode convidar pessoas.",
|
||||
"failedToAdd": "Falha em adicionar participantes",
|
||||
"footerText": "Discagem está desativada.",
|
||||
"googleEmail": "E-mail Google",
|
||||
"googleEmail": "Email Google",
|
||||
"inviteMoreHeader": "Você é o único na reunião",
|
||||
"inviteMoreMailSubject": "Entre na reunião {{appName}}",
|
||||
"inviteMorePrompt": "Convide mais pessoas",
|
||||
"linkCopied": "Link copiado para a área de transferência",
|
||||
"noResults": "Nenhum resultado de busca correspondente",
|
||||
"outlookEmail": "E-mail Outlook ",
|
||||
"outlookEmail": "Email Outlook ",
|
||||
"phoneNumbers": "números de telefone",
|
||||
"searching": "Procurando...",
|
||||
"shareInvite": "Compartilhar convite da reunião",
|
||||
@@ -27,7 +27,7 @@
|
||||
"sipAddresses": "endereços SIP",
|
||||
"telephone": "Telefone: {{number}}",
|
||||
"title": "Convide pessoas para sua reunião",
|
||||
"yahooEmail": "E-mail Yahoo"
|
||||
"yahooEmail": "Email Yahoo"
|
||||
},
|
||||
"audioDevices": {
|
||||
"bluetooth": "Bluetooth",
|
||||
@@ -757,8 +757,8 @@
|
||||
"profile": {
|
||||
"avatar": "avatar",
|
||||
"setDisplayNameLabel": "Definir seu nome de exibição",
|
||||
"setEmailInput": "Digite e-mail",
|
||||
"setEmailLabel": "Definir seu e-mail de Gravatar",
|
||||
"setEmailInput": "Digite email",
|
||||
"setEmailLabel": "Definir seu email de Gravatar",
|
||||
"title": "Perfil"
|
||||
},
|
||||
"raisedHand": "Gostaria de falar",
|
||||
@@ -855,7 +855,7 @@
|
||||
"disableCrashReportingWarning": "Tem certeza eue quer desabilitar o aviso de falha? A opção será habilitada após reiniciar o app.",
|
||||
"disableP2P": "Desativar modo ponto a ponto",
|
||||
"displayName": "Nome de exibição",
|
||||
"email": "E-mail",
|
||||
"email": "Email",
|
||||
"header": "Configurações",
|
||||
"profileSection": "Perfil",
|
||||
"serverURL": "URL do servidor",
|
||||
|
||||
@@ -479,8 +479,8 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Introduceți numele care va fi afișat",
|
||||
"setEmailInput": "Introduceți adresa de e-mail",
|
||||
"setEmailLabel": "Setați adresa de e-mail gravatar",
|
||||
"setEmailInput": "Introduceți adresa de email",
|
||||
"setEmailLabel": "Setați adresa de email gravatar",
|
||||
"title": "Profil"
|
||||
},
|
||||
"recording": {
|
||||
|
||||
@@ -373,7 +373,7 @@
|
||||
"genericError": "Что-то пошло не так.",
|
||||
"inviteLiveStream": "Трансляция этой встречи: {{url}}",
|
||||
"invitePhone": "Для того, чтобы присоединиться по телефону, нажмите {{number}},,{{conferenceID}}#\n",
|
||||
"invitePhoneAlternatives": "Ищите дпугой номер для набора?\nПосмотреть номера для набора для конференции: {{url}}\n\n\nЕсли также выполняется набор номера через телефон в комнате, подключитесь в режиме слушателя: {{silentUrl}}",
|
||||
"invitePhoneAlternatives": "Ищите другой номер для набора?\nПосмотреть номера для набора для конференции: {{url}}\n\n\nЕсли также выполняется набор номера через телефон в комнате, подключитесь в режиме слушателя: {{silentUrl}}",
|
||||
"inviteURLFirstPartGeneral": "Вас приглашают присоединиться к конференции.",
|
||||
"inviteURLFirstPartPersonal": "{{name}} приглашает Вас присоединиться к конференции. \n",
|
||||
"inviteURLSecondPart": "\nПрисоединиться к конференции:\n{{url}}\n",
|
||||
@@ -614,8 +614,8 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Отображаемое имя",
|
||||
"setEmailInput": "Введите e-mail",
|
||||
"setEmailLabel": "E-mail для Gravatar",
|
||||
"setEmailInput": "Введите email",
|
||||
"setEmailLabel": "Email для Gravatar",
|
||||
"title": "Профиль"
|
||||
},
|
||||
"raisedHand": "Хочет говорить",
|
||||
@@ -774,7 +774,7 @@
|
||||
"videomute": "Вкл/Выкл видео"
|
||||
},
|
||||
"addPeople": "Добавить людей к вашему сеансу связи",
|
||||
"audioOnlyOff": "Отключить режим экономии пропуской способности",
|
||||
"audioOnlyOff": "Отключить режим экономии пропускной способности",
|
||||
"audioOnlyOn": "Включить режим экономии пропускной способности",
|
||||
"audioRoute": "Выбрать аудиоустройство",
|
||||
"authenticate": "Аутентифицировать",
|
||||
|
||||
@@ -553,7 +553,7 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Nastavte si meno",
|
||||
"setEmailInput": "Zadajte e-mail",
|
||||
"setEmailInput": "Zadajte email",
|
||||
"setEmailLabel": "Nastavte si email vašeho gravataru",
|
||||
"title": "Profil"
|
||||
},
|
||||
@@ -634,7 +634,7 @@
|
||||
"disableCrashReporting": "Vypnúť oznamovanie pádov",
|
||||
"disableCrashReportingWarning": "Naozak chcete vypnúť oznamovanie pádov? Nastavenie bude aktívne po reštartovaní aplikácie.",
|
||||
"displayName": "Ukázať",
|
||||
"email": "E-mail",
|
||||
"email": "Email",
|
||||
"header": "Nastavenia",
|
||||
"profileSection": "Profil",
|
||||
"serverURL": "Adresa URL servera",
|
||||
@@ -884,7 +884,7 @@
|
||||
"dialogTitle": "Čakáreň",
|
||||
"disableDialogContent": "Čakáreň je zapnutá. Táto funkcia zabezpečuje, že do konferencie nemôžu vstúpiť neželaní účastníci. Chcete ju vypnúť?",
|
||||
"disableDialogSubmit": "Vypnúť",
|
||||
"emailField": "Zadajte vašu e-mailovú adresu",
|
||||
"emailField": "Zadajte vašu emailovú adresu",
|
||||
"enableDialogPasswordField": "Nastaviť heslo (voliteľné)",
|
||||
"enableDialogSubmit": "Zapnúť",
|
||||
"enableDialogText": "Čakáreň umožňuje zabezpečiť konferenciu tým, že účastníci môžu do konferencie vstúpiť len po schválení moderátorom.",
|
||||
|
||||
@@ -23,19 +23,19 @@
|
||||
"copyStream": "Kopiera livestreamlänk",
|
||||
"contacts": "Kontakter",
|
||||
"defaultEmail": "Din mailadress",
|
||||
"googleEmail": "Google e-mail",
|
||||
"googleEmail": "Google email",
|
||||
"inviteMoreHeader": "Du är enda deltagaren i mötet",
|
||||
"inviteMoreMailSubject": "Anslut till {{appName}} möte",
|
||||
"inviteMorePrompt": "Bjud in fler personer",
|
||||
"linkCopied": "Länk kopierad till utklipp",
|
||||
"outlookEmail": "Outlook e-mail",
|
||||
"outlookEmail": "Outlook email",
|
||||
"phoneNumbers": "telefonnummer",
|
||||
"searching": "Söker....",
|
||||
"shareInvite": "Dela mötes inbjudan",
|
||||
"shareLink": "Dela mötes inbjudan för att bjuda in fler",
|
||||
"shareStream": "Dela livestreamlänken",
|
||||
"sipAddresses": "sip-adress",
|
||||
"yahooEmail": "Yahoo e-mail"
|
||||
"yahooEmail": "Yahoo email"
|
||||
},
|
||||
"audioDevices": {
|
||||
"bluetooth": "Bluetooth",
|
||||
@@ -1079,7 +1079,7 @@
|
||||
"title": "Delade dokument"
|
||||
},
|
||||
"e2ee": {
|
||||
"labelToolTip": "jud- och videokommunikation för detta samtal är krypterad från dator till dator"
|
||||
"labelToolTip": "Ljud- och videokommunikation för detta samtal är krypterad från dator till dator"
|
||||
},
|
||||
"embedMeeting": {
|
||||
"title": "Bädda in möte"
|
||||
@@ -1165,8 +1165,8 @@
|
||||
"send": "Skicka"
|
||||
},
|
||||
"answer": {
|
||||
"skip": "Skicka",
|
||||
"submit": "Skippa"
|
||||
"skip": "Skippa",
|
||||
"submit": "Skicka"
|
||||
},
|
||||
"results": {
|
||||
"vote": "Rösta",
|
||||
|
||||
@@ -598,8 +598,8 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Ім'я на екрані",
|
||||
"setEmailInput": "Зазначте e-mail",
|
||||
"setEmailLabel": "E-mail для Gravatar",
|
||||
"setEmailInput": "Зазначте email",
|
||||
"setEmailLabel": "Email для Gravatar",
|
||||
"title": "Профіль"
|
||||
},
|
||||
"raisedHand": "Бажає говорити",
|
||||
|
||||
@@ -514,7 +514,7 @@
|
||||
},
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Nhập tên hiển thị của bạn",
|
||||
"setEmailInput": "Nhập địa chỉ e-mail",
|
||||
"setEmailInput": "Nhập địa chỉ email",
|
||||
"setEmailLabel": "Nhập địa chỉ Gravatar thư điện tử của bạn",
|
||||
"title": "Hồ sơ"
|
||||
},
|
||||
|
||||
@@ -39,6 +39,28 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "低頻寬"
|
||||
},
|
||||
"blankPage": {
|
||||
"meetingEnded": "會議已結束。"
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"defaultName": "分組討論室 #{{index}}",
|
||||
"mainRoom": "主會議室",
|
||||
"actions": {
|
||||
"add": "新增討論室",
|
||||
"autoAssign": "自動分配至討論室",
|
||||
"close": "關閉",
|
||||
"join": "加入",
|
||||
"leaveBreakoutRoom": "離開討論室",
|
||||
"more": "更多",
|
||||
"remove": "移除",
|
||||
"sendToBreakoutRoom": "將參與者移至:"
|
||||
},
|
||||
"notifications": {
|
||||
"joinedTitle": "分組討論室",
|
||||
"joined": "正在加入 \"{{name}}\" 分組討論室",
|
||||
"joinedMainRoom": "正在加入主會議室"
|
||||
}
|
||||
},
|
||||
"calendarSync": {
|
||||
"addMeetingURL": "增加會議連結",
|
||||
"confirmAddLink": "您要為此活動加入 Jitsi 連結嗎?",
|
||||
@@ -70,13 +92,17 @@
|
||||
"titleWithPolls": "輸入名稱來使用交談"
|
||||
},
|
||||
"privateNotice": "私人訊息傳送至 {{recipient}}",
|
||||
"title": "對話",
|
||||
"titleWithPolls": "對話",
|
||||
"you": "您",
|
||||
"message": "訊息",
|
||||
"messageAccessibleTitle": "{{user}} 說:",
|
||||
"messageAccessibleTitleMe": "您說:",
|
||||
"smileysPanel": "表情符號面板"
|
||||
"smileysPanel": "表情符號面板",
|
||||
"tabs": {
|
||||
"chat": "聊天",
|
||||
"polls": "投票"
|
||||
},
|
||||
"title": "對話",
|
||||
"titleWithPolls": "對話",
|
||||
"you": "您"
|
||||
},
|
||||
"chromeExtensionBanner": {
|
||||
"installExtensionText": "安裝適用於 Google 行事曆及 Office 365 整合的擴充功能",
|
||||
@@ -209,7 +235,9 @@
|
||||
"done": "完成",
|
||||
"e2eeDescription": "端對端加密目前是實驗性功能。請注意:啟用端對端加密將停用伺服器端提供的服務,例如:錄影、直播、及電話參與。且會議將只適用於支援 Insertable Streams 的瀏覽器。",
|
||||
"e2eeLabel": "啟用端對端加密",
|
||||
"e2eeDisabledDueToMaxModeDescription": "由於會議中的人數過多,故無法啟用端對端加密。",
|
||||
"e2eeWarning": "警告:看來不是每位此會議的參與者都有啟用端對端加密,如果您啟用了,他們可能無法看/聽到您。",
|
||||
"e2eeWillDisableDueToMaxModeDescription": "警告:如果有更多參與者加入會議,端對端加密將被自動停用。",
|
||||
"enterDisplayName": "請在此輸入您自己的名字",
|
||||
"embedMeeting": "嵌入會議",
|
||||
"error": "錯誤",
|
||||
@@ -245,24 +273,30 @@
|
||||
"micPermissionDeniedError": "您未取得權限使用麥克風。您仍然可參加會議,但是其他人無法聽到您。可以利用位址欄中的攝影裝置按鈕來修正。",
|
||||
"micTimeoutError": "無法啟動音訊裝置。連線逾時!",
|
||||
"micUnknownError": "不明原因造成麥克風無法使用。",
|
||||
"moderationAudioLabel": "允許參與者自我解除靜音",
|
||||
"moderationVideoLabel": "允許參與者開啟視訊",
|
||||
"muteEveryoneElseDialog": "靜音後,你就不能再解除對方的靜音,但對方可以隨時解除自己的靜音狀態。",
|
||||
"muteEveryoneElseTitle": "是否要讓除了 {{whom}} 以外的人靜音?",
|
||||
"muteEveryoneDialog": "是否要靜音所有人?靜音後,你就不能再解除對方的靜音,但對方可以隨時解除自己的靜音狀態。",
|
||||
"muteEveryoneDialogModerationOn": "參與者可以隨時傳送說話請求。",
|
||||
"muteEveryoneTitle": "靜音所有人?",
|
||||
"muteEveryoneElsesVideoDialog": "一旦停用,您就不能再重新開啟對方的攝影機,但對方隨時能重新開啟自己的攝影機。",
|
||||
"muteEveryoneElsesVideoTitle": "是否要關閉除了 {{whom}} 以外的人的攝影機?",
|
||||
"muteEveryonesVideoDialog": "您確定要停用所有人的攝影機嗎?停用後,您就無法再重新開啟,只有對方能自己重新開啟。",
|
||||
"muteEveryonesVideoDialogModerationOn": "參與者可以隨時傳送開啟視訊請求。",
|
||||
"muteEveryonesVideoDialogOk": "停用",
|
||||
"muteEveryonesVideoTitle": "關閉所有人的攝影機?",
|
||||
"muteEveryoneSelf": "您自己",
|
||||
"muteEveryoneStartMuted": "現在所有人皆已靜音",
|
||||
"muteParticipantBody": "您無法對他們解除靜音,但是他們自己隨時可以解除靜音。",
|
||||
"muteParticipantButton": "靜音",
|
||||
"muteParticipantDialog": "確定要將這位參與者設為靜音?您無法為他們解除,但他們可以隨時自行解除靜音。",
|
||||
"muteParticipantTitle": "將這位參與者設為靜音?",
|
||||
"muteParticipantsVideoDialog": "確定要將這位參與者設為靜音?您無法為他們解除,但他們可以隨時自行解除靜音。",
|
||||
"muteParticipantsVideoDialogModerationOn": "您確定要關閉此參與者的視訊鏡頭嗎?您和他都無法再將視訊重新開啟。",
|
||||
"muteParticipantsVideoButton": "停用攝影機",
|
||||
"muteParticipantsVideoTitle": "停用此參與者的攝影機?",
|
||||
"muteParticipantsVideoBody": "您無法重新開啟,只有對方能自己重新開啟。",
|
||||
"muteParticipantsVideoBodyModerationOn": "您和他都無法再將視訊重新開啟。",
|
||||
"noDropboxToken": "沒有有效的 Dropbox 權杖",
|
||||
"Ok": "確定",
|
||||
"password": "密碼",
|
||||
"passwordLabel": "會議已被參與者鎖定。請輸入 $t(lockRoomPassword) 以加入。",
|
||||
@@ -323,6 +357,7 @@
|
||||
"shareScreenWarningH1": "如果您只要分享畫面:",
|
||||
"shareScreenWarningD1": "您必須先停止分享音訊才能分享畫面。",
|
||||
"shareScreenWarningD2": "您必須先停止分享音訊,啟動畫面分享,然後勾選 \"分享音訊\" 選項。",
|
||||
"sharedVideoLinkPlaceholder": "YouTube 或影片連結",
|
||||
"stopLiveStreaming": "停止直播串流",
|
||||
"stopRecording": "停止錄影",
|
||||
"stopRecordingWarning": "確定要停止錄影嗎?",
|
||||
@@ -382,7 +417,8 @@
|
||||
"image7" : "日出",
|
||||
"desktopShareError": "無法建立桌面分享",
|
||||
"desktopShare":"桌面分享",
|
||||
"webAssemblyWarning": "不支援 WebAssembly"
|
||||
"webAssemblyWarning": "不支援 WebAssembly",
|
||||
"backgroundEffectError": "無法套用背景效果。"
|
||||
},
|
||||
"feedback": {
|
||||
"average": "普通",
|
||||
@@ -419,6 +455,10 @@
|
||||
"invitePhone": "要用電話參加會議,請使用:{{number}},,{{conferenceID}}#\n",
|
||||
"invitePhoneAlternatives": "要找另一組撥入號碼?\n請見會議撥入號碼:{{url}}\n\n\n如果也要用室內電話撥打,不用連接語音進行加入:{{silentUrl}}",
|
||||
"inviteSipEndpoint": "如果要透過 SIP 地址加入,請輸入:{{sipUri}}",
|
||||
"inviteTextiOSPersonal": "{{name}} 邀請您加入會議。",
|
||||
"inviteTextiOSJoinSilent": "如果您使用了市內電話撥入,請使用此連結來停用音訊:{{silentUrl}}。",
|
||||
"inviteTextiOSInviteUrl": "點擊此連結以加入:{{inviteUrl}}。",
|
||||
"inviteTextiOSPhone": "若要透過電話加入,請使用此號碼:{{number}},,{{conferenceID}}#。如果您需要其他號碼,點擊此連結以檢視完整列表:{{didUrl}}。",
|
||||
"inviteURLFirstPartGeneral": "您受邀參加會議。",
|
||||
"inviteURLFirstPartPersonal": "{{name}} 正在邀請您加入會議。\n",
|
||||
"inviteURLSecondPart": "\n加入會議:\n{{url}}\n",
|
||||
@@ -483,6 +523,7 @@
|
||||
"expandedPending": "直播串流正被啟動...",
|
||||
"failedToStart": "直播串流啟動失敗",
|
||||
"getStreamKeyManually": "我們無法解析任何直播串流,請從 YouTube 取得您的直播串流金鑰。",
|
||||
"inProgress": "正在錄製或直播",
|
||||
"invalidStreamKey": "直播串流金鑰可能不正確。",
|
||||
"off": "直播串流已經停止",
|
||||
"offBy": "{{name}} 停止了直播串流",
|
||||
@@ -490,6 +531,7 @@
|
||||
"onBy": "{{name}} 啟動了直播串流",
|
||||
"pending": "啟動直播串流...",
|
||||
"serviceName": "直播串流服務",
|
||||
"sessionAlreadyActive": "已在錄製或直播此工作階段。",
|
||||
"signedInAs": "您目前登入名稱為:",
|
||||
"signIn": "使用 Google 帳戶登入",
|
||||
"signInCTA": "輸入 YouTube 直播串流密鑰,或登入 YouTube 帳號。",
|
||||
@@ -533,6 +575,10 @@
|
||||
"lockRoomPasswordUppercase": "密碼",
|
||||
"me": "我",
|
||||
"notify": {
|
||||
"allowAction": "允許",
|
||||
"allowedUnmute": "您可以將麥克風解除靜音、開啟視訊,或是分享您的畫面。",
|
||||
"audioUnmuteBlockedTitle": "麥克風解除靜音遭封鎖!",
|
||||
"audioUnmuteBlockedDescription": "麥克風解除靜音操作由於系統限制而被暫時封鎖。",
|
||||
"connectedOneMember": "{{name}} 加入了會議",
|
||||
"connectedThreePlusMembers": "{{name}} 及 {{count}} 位人員加入了會議",
|
||||
"connectedTwoMembers": "{{first}} 及 {{second}} 加入了會議",
|
||||
@@ -545,6 +591,9 @@
|
||||
"invitedThreePlusMembers": "{{name}} 及 {{count}} 位人員已受邀請",
|
||||
"invitedTwoMembers": "{{first}} 及 {{second}} 已受邀請",
|
||||
"kickParticipant": "{{kicked}} 已被 {{kicker}} 踢出會議",
|
||||
"leftOneMember": "{{name}} 已離開會議",
|
||||
"leftThreePlusMembers": "{{name}} 和其他人已離開會議",
|
||||
"leftTwoMembers": "{{first}} 和 {{second}} 已離開會議",
|
||||
"me": "自己",
|
||||
"moderator": "主持人權限已經取得!",
|
||||
"muted": "您已經啟動通話,處於靜音。",
|
||||
@@ -583,26 +632,71 @@
|
||||
"moderationStoppedTitle": "停止管理",
|
||||
"moderationToggleDescription": "由 {{participantDisplayName}}",
|
||||
"raiseHandAction": "舉手",
|
||||
"groupTitle": "通知"
|
||||
"reactionSounds": "停用音效",
|
||||
"reactionSoundsForAll": "為所有人停用音效",
|
||||
"groupTitle": "通知",
|
||||
"videoUnmuteBlockedTitle": "視訊鏡頭解除靜音遭封鎖!",
|
||||
"videoUnmuteBlockedDescription": "視訊鏡頭解除靜音操作由於系統限制而被暫時封鎖。"
|
||||
},
|
||||
"participantsPane": {
|
||||
"close": "關閉",
|
||||
"header": "參與者",
|
||||
"headings": {
|
||||
"lobby": "大廳 ({{count}})",
|
||||
"participantsList": "會議參與者 ({{count}})"
|
||||
"participantsList": "會議參與者 ({{count}})",
|
||||
"waitingLobby": "於大廳等待 ({{count}})"
|
||||
},
|
||||
"actions": {
|
||||
"allow": "允許參與者能夠:",
|
||||
"allowVideo": "允許視訊",
|
||||
"audioModeration": "自我解除靜音",
|
||||
"blockEveryoneMicCamera": "封鎖所有人的麥克風和視訊鏡頭",
|
||||
"invite": "邀請他人",
|
||||
"askUnmute": "要求解除靜音",
|
||||
"moreModerationActions": "更多管理選項",
|
||||
"moreParticipantOptions": "更多參與者選項",
|
||||
"mute": "靜音",
|
||||
"muteAll": "靜音所有人",
|
||||
"startModeration": "將他們解除靜音或開始視訊",
|
||||
"muteEveryoneElse": "靜音其他人",
|
||||
"stopEveryonesVideo": "停止所有人的視訊",
|
||||
"stopVideo": "停止影片"
|
||||
}
|
||||
"stopVideo": "停止影片",
|
||||
"unblockEveryoneMicCamera": "解除封鎖所有人的麥克風及視訊鏡頭",
|
||||
"videoModeration": "開啟視訊",
|
||||
"moreModerationControls": "更多管理控制項"
|
||||
},
|
||||
"search": "搜尋參與者"
|
||||
},
|
||||
"passwordSetRemotely": "由其他參與者設定",
|
||||
"passwordDigitsOnly": "上限為 {{number}} 位數",
|
||||
"polls": {
|
||||
"by": "由 {{ name }}",
|
||||
"create": {
|
||||
"addOption": "新增選項",
|
||||
"answerPlaceholder": "選項 {{index}}",
|
||||
"create": "建立投票",
|
||||
"cancel": "取消",
|
||||
"pollOption" : "投票選項 {{index}}",
|
||||
"pollQuestion" : "投票問題",
|
||||
"questionPlaceholder": "詢問問題",
|
||||
"removeOption": "移除選項",
|
||||
"send": "傳送"
|
||||
},
|
||||
"answer": {
|
||||
"skip": "跳過",
|
||||
"submit": "提交"
|
||||
},
|
||||
"results": {
|
||||
"vote": "投票",
|
||||
"changeVote": "修改投票",
|
||||
"empty": "目前會議中沒有任何投票。在這裡建立您的投票吧!",
|
||||
"hideDetailedResults": "隱藏詳細資訊",
|
||||
"showDetailedResults": "顯示詳細資訊"
|
||||
},
|
||||
"notification": {
|
||||
"title": "此會議有一項新投票",
|
||||
"description": "開啟投票分頁以參與投票"
|
||||
}
|
||||
},
|
||||
"poweredby": "技術支援",
|
||||
"prejoin": {
|
||||
"audioAndVideoError": "音訊及視訊錯誤:",
|
||||
@@ -643,6 +737,7 @@
|
||||
"errorDialOutFailed": "因通話失敗而無法撥出。",
|
||||
"errorDialOutStatus": "取得撥出狀態時發生錯誤",
|
||||
"errorMissingName": "請輸入您的名字以加入會議",
|
||||
"errorNoPermissions": "您必須啟用麥克風及視訊鏡頭存取權限",
|
||||
"errorStatusCode": "撥出失敗,狀態代碼:{{status}}",
|
||||
"errorValidation": "號碼驗證失敗",
|
||||
"iWantToDialIn": "我想要撥入",
|
||||
@@ -700,6 +795,7 @@
|
||||
"expandedPending": "錄影正在啟動...",
|
||||
"failedToStart": "錄影啟動失敗",
|
||||
"fileSharingdescription": "分享錄影給會議參與者",
|
||||
"inProgress": "正在錄製或直播",
|
||||
"linkGenerated": "我們建立了您的錄影檔的連結。",
|
||||
"live": "直播",
|
||||
"loggedIn": "以 {{userName}} 登入",
|
||||
@@ -712,6 +808,7 @@
|
||||
"serviceDescription": "您的錄影會由錄影服務儲存",
|
||||
"serviceDescriptionCloud": "雲端錄製",
|
||||
"serviceName": "錄影服務",
|
||||
"sessionAlreadyActive": "已在錄製或直播此工作階段。",
|
||||
"signIn": "登入",
|
||||
"signOut": "登出",
|
||||
"unavailable": "喔哦!{{serviceName}} 目前無法使用。我們正在解決此問題,請稍後再試。",
|
||||
@@ -741,6 +838,7 @@
|
||||
"devices": "裝置",
|
||||
"followMe": "全部人跟隨我",
|
||||
"framesPerSecond": "幀數",
|
||||
"incomingMessage": "新訊息",
|
||||
"language": "語言",
|
||||
"loggedIn": "以 {{name}} 登入",
|
||||
"microphones": "麥克風",
|
||||
@@ -748,13 +846,20 @@
|
||||
"more": "更多",
|
||||
"name": "名稱",
|
||||
"noDevice": "無",
|
||||
"participantJoined": "參與者已加入",
|
||||
"participantLeft": "參與者已離開",
|
||||
"playSounds": "播放音效",
|
||||
"reactions": "會議反應",
|
||||
"sameAsSystem": "系統預設 ({{label}})",
|
||||
"selectAudioOutput": "音訊輸出",
|
||||
"selectCamera": "攝影裝置",
|
||||
"selectMic": "麥克風",
|
||||
"sounds": "音效",
|
||||
"speakers": "喇叭",
|
||||
"startAudioMuted": "全部人啟動時處於靜音",
|
||||
"startReactionsMuted": "為所有人關閉反應音效",
|
||||
"startVideoMuted": "全部人啟動時處於隱藏",
|
||||
"talkWhileMuted": "靜音時說話",
|
||||
"title": "設定"
|
||||
},
|
||||
"settingsView": {
|
||||
@@ -785,12 +890,20 @@
|
||||
},
|
||||
"speaker": "喇叭",
|
||||
"speakerStats": {
|
||||
"search": "搜尋",
|
||||
"hours": "{{count}}時",
|
||||
"minutes": "{{count}}分",
|
||||
"name": "名稱",
|
||||
"seconds": "{{count}}秒",
|
||||
"speakerStats": "聲音輸出數據",
|
||||
"speakerTime": "聲音輸出時間"
|
||||
"speakerTime": "聲音輸出時間",
|
||||
"happy": "開心",
|
||||
"neutral": "中立",
|
||||
"sad": "悲傷",
|
||||
"surprised": "驚訝",
|
||||
"angry": "憤怒",
|
||||
"fearful": "害怕",
|
||||
"disgusted": "作嘔"
|
||||
},
|
||||
"startupoverlay": {
|
||||
"policyText": " ",
|
||||
@@ -806,6 +919,7 @@
|
||||
"accessibilityLabel": {
|
||||
"audioOnly": "切換僅聲音",
|
||||
"audioRoute": "選擇音訊裝置",
|
||||
"boo": "喝倒彩",
|
||||
"callQuality": "管理影像品質",
|
||||
"cc": "切換字幕",
|
||||
"chat": "切換聊天視窗",
|
||||
@@ -870,11 +984,13 @@
|
||||
"audioOnlyOn": "啟用低頻寬模式",
|
||||
"audioRoute": "選擇音訊裝置",
|
||||
"authenticate": "認證",
|
||||
"boo": "喝倒彩",
|
||||
"callQuality": "管理影像品質",
|
||||
"chat": "開啟/關閉聊天欄",
|
||||
"clap": "鼓掌",
|
||||
"closeChat": "關閉聊天欄",
|
||||
"closeReactionsMenu": "關閉反應選單",
|
||||
"disableReactionSounds": "您可以停用此會議的反應音效",
|
||||
"documentClose": "關閉分享檔案欄",
|
||||
"documentOpen": "開啟分享檔案欄",
|
||||
"download": "下載我們的應用程式",
|
||||
@@ -888,7 +1004,9 @@
|
||||
"hangup": "離開",
|
||||
"help": "說明",
|
||||
"invite": "邀請人員",
|
||||
"joy": "高興",
|
||||
"joinBreakoutRoom": "加入分組討論室",
|
||||
"laugh": "大笑",
|
||||
"leaveBreakoutRoom": "離開分組討論室",
|
||||
"like": "比讚",
|
||||
"lobbyButtonDisable": "停用大廳模式",
|
||||
"lobbyButtonEnable": "啟用大廳模式",
|
||||
@@ -910,17 +1028,16 @@
|
||||
"openChat": "開啟聊天欄",
|
||||
"openReactionsMenu": "開啟反應選單",
|
||||
"participants": "參與者",
|
||||
"party": "慶祝",
|
||||
"pip": "進入子母畫面模式",
|
||||
"privateMessage": "發送私人訊息",
|
||||
"privateMessage": "傳送私人訊息",
|
||||
"profile": "編輯您的簡介",
|
||||
"raiseHand": "舉手/取消請求發言",
|
||||
"raiseYourHand": "舉手發言",
|
||||
"raiseHand": "舉手/放下",
|
||||
"raiseYourHand": "舉手",
|
||||
"reactionBoo": "傳送喝倒彩反應",
|
||||
"reactionClap": "傳送鼓掌反應",
|
||||
"reactionJoy": "傳送高興反應",
|
||||
"reactionLaugh": "傳送大笑反應",
|
||||
"reactionLike": "傳送比讚反應",
|
||||
"reactionParty": "傳送拉炮反應",
|
||||
"reactionSmile": "傳送微笑反應",
|
||||
"reactionSilence": "傳送靜默反應",
|
||||
"reactionSurprised": "傳送驚訝反應",
|
||||
"security": "安全性選項",
|
||||
"Settings": "設定",
|
||||
@@ -979,7 +1096,10 @@
|
||||
"pending": "已向 {{displayName}} 發送邀請"
|
||||
},
|
||||
"videoStatus": {
|
||||
"adjustFor": "調整:",
|
||||
"audioOnly": "僅聲音",
|
||||
"bestPerformance": "最佳效能",
|
||||
"highestQuality": "最佳品質",
|
||||
"audioOnlyExpanded": "您目前處於低頻寬模式。在此模式下您僅會收到語音及螢幕分享。",
|
||||
"callQuality": "影像品質",
|
||||
"hd": "HD",
|
||||
@@ -990,6 +1110,7 @@
|
||||
"ld": "LD",
|
||||
"ldTooltip": "觀看低解析度影像",
|
||||
"lowDefinition": "低解析度",
|
||||
"performanceSettings": "效能設定",
|
||||
"sd": "SD",
|
||||
"sdTooltip": "觀看標準解析度影像",
|
||||
"standardDefinition": "標準解析度"
|
||||
@@ -1063,6 +1184,12 @@
|
||||
"button": "邀請其他人",
|
||||
"youAreAlone": "您是會議中的唯一一個人"
|
||||
},
|
||||
"termsView": {
|
||||
"header": "條款"
|
||||
},
|
||||
"privacyView": {
|
||||
"header": "隱私權"
|
||||
},
|
||||
"helpView": {
|
||||
"header": "說明中心"
|
||||
},
|
||||
@@ -1081,6 +1208,7 @@
|
||||
"enableDialogText": "大廳模式能夠保護您的會議,只有被管理員認可後才能加入會議。",
|
||||
"enterPasswordButton": "輸入會議密碼",
|
||||
"enterPasswordTitle": "輸入密碼以加入會議",
|
||||
"errorMissingPassword": "請輸入會議密碼",
|
||||
"invalidPassword": "密碼錯誤",
|
||||
"joiningMessage": "一旦他人接受您的請求,即可加入會議",
|
||||
"joinWithPasswordMessage": "正在嘗試透過密碼加入,請稍候...",
|
||||
@@ -1099,6 +1227,7 @@
|
||||
"passwordField": "輸入會議密碼",
|
||||
"passwordJoinButton": "加入",
|
||||
"reject": "拒絕",
|
||||
"rejectAll": "拒絕所有人",
|
||||
"toggleLabel": "啟用大廳"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "Low bandwidth"
|
||||
},
|
||||
"blankPage": {
|
||||
"meetingEnded": "Meeting ended."
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"defaultName": "Breakout room #{{index}}",
|
||||
"mainRoom": "Main room",
|
||||
@@ -51,6 +54,11 @@
|
||||
"more": "More",
|
||||
"remove": "Remove",
|
||||
"sendToBreakoutRoom": "Send participant to:"
|
||||
},
|
||||
"notifications": {
|
||||
"joinedTitle": "Breakout Rooms",
|
||||
"joined": "Joining the \"{{name}}\" breakout room",
|
||||
"joinedMainRoom": "Joining the main room"
|
||||
}
|
||||
},
|
||||
"calendarSync": {
|
||||
@@ -172,7 +180,8 @@
|
||||
"joinInApp": "Join this meeting using the app",
|
||||
"launchWebButton": "Launch in web",
|
||||
"title": "Launching your meeting in {{app}}...",
|
||||
"tryAgainButton": "Try again in desktop"
|
||||
"tryAgainButton": "Try again in desktop",
|
||||
"unsupportedBrowser": "It looks like you're using a browser we don't support."
|
||||
},
|
||||
"defaultLink": "e.g. {{url}}",
|
||||
"defaultNickname": "ex. Jane Pink",
|
||||
@@ -410,6 +419,7 @@
|
||||
"desktopShareError": "Could not create desktop share",
|
||||
"desktopShare":"Desktop share",
|
||||
"webAssemblyWarning": "WebAssembly not supported",
|
||||
"webAssemblyWarningDescription": "WebAssembly disabled or not supported by this browser",
|
||||
"backgroundEffectError": "Failed to apply background effect."
|
||||
},
|
||||
"feedback": {
|
||||
@@ -460,7 +470,7 @@
|
||||
"noPassword": "None",
|
||||
"noRoom": "No room was specified to dial-in into.",
|
||||
"numbers": "Dial-in Numbers",
|
||||
"password": "$t(lockRoomPasswordUppercase):",
|
||||
"password": "$t(lockRoomPasswordUppercase): ",
|
||||
"sip": "SIP address",
|
||||
"title": "Share",
|
||||
"tooltip": "Share link and dial-in info for this meeting",
|
||||
@@ -569,6 +579,8 @@
|
||||
"notify": {
|
||||
"allowAction": "Allow",
|
||||
"allowedUnmute": "You can unmute your microphone, start your camera or share your screen.",
|
||||
"audioUnmuteBlockedTitle": "Mic unmute blocked!",
|
||||
"audioUnmuteBlockedDescription": "Mic unmute operation has been temporarily blocked because of system limits.",
|
||||
"connectedOneMember": "{{name}} joined the meeting",
|
||||
"connectedThreePlusMembers": "{{name}} and many others joined the meeting",
|
||||
"connectedTwoMembers": "{{first}} and {{second}} joined the meeting",
|
||||
@@ -580,6 +592,9 @@
|
||||
"invitedThreePlusMembers": "{{name}} and {{count}} others have been invited",
|
||||
"invitedTwoMembers": "{{first}} and {{second}} have been invited",
|
||||
"kickParticipant": "{{kicked}} was kicked by {{kicker}}",
|
||||
"leftOneMember": "{{name}} left the meeting",
|
||||
"leftThreePlusMembers": "{{name}} and many others left the meeting",
|
||||
"leftTwoMembers": "{{first}} and {{second}} left the meeting",
|
||||
"me": "Me",
|
||||
"moderator": "You're now a moderator",
|
||||
"muted": "You have started the conversation muted.",
|
||||
@@ -591,8 +606,10 @@
|
||||
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) removed by another participant",
|
||||
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) set by another participant",
|
||||
"raisedHand": "Would like to speak.",
|
||||
"raisedHands": "{{participantName}} and {{raisedHands}} more people",
|
||||
"screenShareNoAudio": " Share audio box was not checked in the window selection screen.",
|
||||
"screenShareNoAudioTitle": "Couldn't share system audio!",
|
||||
"selfViewTitle": "You can always un-hide the self-view from settings",
|
||||
"somebody": "Somebody",
|
||||
"startSilentTitle": "You joined with no audio output!",
|
||||
"startSilentDescription": "Rejoin the meeting to enable audio",
|
||||
@@ -619,7 +636,10 @@
|
||||
"moderationToggleDescription": "by {{participantDisplayName}}",
|
||||
"raiseHandAction": "Raise hand",
|
||||
"reactionSounds": "Disable sounds",
|
||||
"groupTitle": "Notifications"
|
||||
"reactionSoundsForAll": "Disable sounds for all",
|
||||
"groupTitle": "Notifications",
|
||||
"videoUnmuteBlockedTitle": "Camera unmute and desktop sharing blocked!",
|
||||
"videoUnmuteBlockedDescription": "Camera unmute and desktop sharing operation have been temporarily blocked because of system limits."
|
||||
},
|
||||
"participantsPane": {
|
||||
"close": "Close",
|
||||
@@ -644,7 +664,8 @@
|
||||
"stopEveryonesVideo": "Stop everyone's video",
|
||||
"stopVideo": "Stop video",
|
||||
"unblockEveryoneMicCamera": "Unblock everyone's mic and camera",
|
||||
"videoModeration": "Start their video"
|
||||
"videoModeration": "Start their video",
|
||||
"moreModerationControls": "More moderation controls"
|
||||
},
|
||||
"search": "Search participants"
|
||||
},
|
||||
@@ -756,7 +777,7 @@
|
||||
"profile": {
|
||||
"avatar": "avatar",
|
||||
"setDisplayNameLabel": "Set your display name",
|
||||
"setEmailInput": "Enter e-mail",
|
||||
"setEmailInput": "Enter email",
|
||||
"setEmailLabel": "Set your gravatar email",
|
||||
"title": "Profile"
|
||||
},
|
||||
@@ -803,8 +824,8 @@
|
||||
"security": {
|
||||
"about": "You can add a $t(lockRoomPassword) to your meeting. Participants will need to provide the $t(lockRoomPassword) before they are allowed to join the meeting.",
|
||||
"aboutReadOnly": "Moderator participants can add a $t(lockRoomPassword) to the meeting. Participants will need to provide the $t(lockRoomPassword) before they are allowed to join the meeting.",
|
||||
"insecureRoomNameWarning": "The room name is unsafe. Unwanted participants may join your conference. Consider securing your meeting using the security button.",
|
||||
"securityOptions": "Security options"
|
||||
"header": "Security Options",
|
||||
"insecureRoomNameWarning": "The room name is unsafe. Unwanted participants may join your conference. Consider securing your meeting using the security button."
|
||||
},
|
||||
"settings": {
|
||||
"calendar": {
|
||||
@@ -839,6 +860,7 @@
|
||||
"sounds": "Sounds",
|
||||
"speakers": "Speakers",
|
||||
"startAudioMuted": "Everyone starts muted",
|
||||
"startReactionsMuted": "Mute reaction sounds for everyone",
|
||||
"startVideoMuted": "Everyone starts hidden",
|
||||
"talkWhileMuted": "Talk while muted",
|
||||
"title": "Settings"
|
||||
@@ -871,20 +893,20 @@
|
||||
},
|
||||
"speaker": "Speaker",
|
||||
"speakerStats": {
|
||||
"search": "Search",
|
||||
"angry": "Angry",
|
||||
"disgusted": "Disgusted",
|
||||
"fearful": "Fearful",
|
||||
"happy": "Happy",
|
||||
"hours": "{{count}}h",
|
||||
"minutes": "{{count}}m",
|
||||
"name": "Name",
|
||||
"seconds": "{{count}}s",
|
||||
"speakerStats": "Speaker Stats",
|
||||
"speakerTime": "Speaker Time",
|
||||
"happy": "Happy",
|
||||
"neutral": "Neutral",
|
||||
"sad": "Sad",
|
||||
"surprised": "Surprised",
|
||||
"angry": "Angry",
|
||||
"fearful": "Fearful",
|
||||
"disgusted": "Disgusted"
|
||||
"search": "Search",
|
||||
"seconds": "{{count}}s",
|
||||
"speakerTime": "Speaker Time",
|
||||
"speakerStats": "Speaker Stats",
|
||||
"surprised": "Surprised"
|
||||
},
|
||||
"startupoverlay": {
|
||||
"policyText": " ",
|
||||
@@ -1104,6 +1126,7 @@
|
||||
"domuteVideoOfOthers": "Disable camera of everyone else",
|
||||
"flip": "Flip",
|
||||
"grantModerator": "Grant Moderator Rights",
|
||||
"hideSelfView": "Hide self view",
|
||||
"kick": "Kick out",
|
||||
"moderator": "Moderator",
|
||||
"mute": "Participant is muted",
|
||||
|
||||
@@ -66,8 +66,9 @@ import { toggleLobbyMode, setKnockingParticipantApproval } from '../../react/fea
|
||||
import { isForceMuted } from '../../react/features/participants-pane/functions';
|
||||
import { RECORDING_TYPES } from '../../react/features/recording/constants';
|
||||
import { getActiveSession } from '../../react/features/recording/functions';
|
||||
import { isScreenAudioSupported } from '../../react/features/screen-share';
|
||||
import { isScreenAudioSupported, isScreenVideoShared } from '../../react/features/screen-share';
|
||||
import { startScreenShareFlow, startAudioScreenShareFlow } from '../../react/features/screen-share/actions';
|
||||
import { toggleScreenshotCaptureSummary } from '../../react/features/screenshot-capture';
|
||||
import { playSharedVideo, stopSharedVideo } from '../../react/features/shared-video/actions.any';
|
||||
import { toggleTileView, setTileView } from '../../react/features/video-layout';
|
||||
import { muteAllParticipants } from '../../react/features/video-menu/actions';
|
||||
@@ -470,6 +471,9 @@ function initCommands() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isScreenVideoShared(APP.store.getState())) {
|
||||
APP.store.dispatch(toggleScreenshotCaptureSummary(true));
|
||||
}
|
||||
conference.startRecording(recordingConfig);
|
||||
},
|
||||
|
||||
@@ -498,6 +502,7 @@ function initCommands() {
|
||||
const activeSession = getActiveSession(state, mode);
|
||||
|
||||
if (activeSession && activeSession.id) {
|
||||
APP.store.dispatch(toggleScreenshotCaptureSummary(false));
|
||||
conference.stopRecording(activeSession.id);
|
||||
} else {
|
||||
logger.error('No recording or streaming session found');
|
||||
@@ -1470,12 +1475,14 @@ class API {
|
||||
* available.
|
||||
*
|
||||
* @param {string} link - The recording download link.
|
||||
* @param {number} ttl - The recording download link time to live.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyRecordingLinkAvailable(link: string) {
|
||||
notifyRecordingLinkAvailable(link: string, ttl: number) {
|
||||
this._sendEvent({
|
||||
name: 'recording-link-available',
|
||||
link
|
||||
link,
|
||||
ttl
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,12 @@ import { isMobileBrowser } from '../../react/features/base/environment/utils';
|
||||
import { setColorAlpha } from '../../react/features/base/util';
|
||||
import { setDocumentUrl } from '../../react/features/etherpad';
|
||||
import { setFilmstripVisible } from '../../react/features/filmstrip';
|
||||
import { joinLeaveNotificationsDisabled, setNotificationsEnabled } from '../../react/features/notifications';
|
||||
import {
|
||||
joinLeaveNotificationsDisabled,
|
||||
setNotificationsEnabled,
|
||||
showNotification,
|
||||
NOTIFICATION_TIMEOUT_TYPE
|
||||
} from '../../react/features/notifications';
|
||||
import {
|
||||
dockToolbox,
|
||||
setToolboxEnabled,
|
||||
@@ -215,12 +220,10 @@ UI.updateUserStatus = (user, status) => {
|
||||
|
||||
const displayName = user.getDisplayName();
|
||||
|
||||
messageHandler.participantNotification(
|
||||
displayName,
|
||||
'',
|
||||
'connected',
|
||||
'dialOut.statusMessage',
|
||||
{ status: UIUtil.escapeHtml(status) });
|
||||
APP.store.dispatch(showNotification({
|
||||
titleKey: `${displayName} connected`,
|
||||
descriptionKey: 'dialOut.statusMessage'
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.SHORT));
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -333,18 +336,6 @@ UI.notifyMaxUsersLimitReached = function() {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Notify user that he was automatically muted when joned the conference.
|
||||
*/
|
||||
UI.notifyInitiallyMuted = function() {
|
||||
messageHandler.participantNotification(
|
||||
null,
|
||||
'notify.mutedTitle',
|
||||
'connected',
|
||||
'notify.muted',
|
||||
null);
|
||||
};
|
||||
|
||||
UI.handleLastNEndpoints = function(leavingIds, enteringIds) {
|
||||
VideoLayout.onLastNEndpointsChanged(leavingIds, enteringIds);
|
||||
};
|
||||
@@ -363,15 +354,6 @@ UI.notifyTokenAuthFailed = function() {
|
||||
});
|
||||
};
|
||||
|
||||
UI.notifyFocusDisconnected = function(focus, retrySec) {
|
||||
messageHandler.participantNotification(
|
||||
null, 'notify.focus',
|
||||
'disconnected', 'notify.focusFail',
|
||||
{ component: focus,
|
||||
ms: retrySec }
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* Update list of available physical devices.
|
||||
*/
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
/* global APP */
|
||||
|
||||
import {
|
||||
NOTIFICATION_TIMEOUT,
|
||||
NOTIFICATION_TIMEOUT_TYPE,
|
||||
showErrorNotification,
|
||||
showNotification,
|
||||
showWarningNotification
|
||||
} from '../../../react/features/notifications';
|
||||
|
||||
@@ -48,7 +47,7 @@ const messageHandler = {
|
||||
* showErrorNotification action.
|
||||
*/
|
||||
showError(props) {
|
||||
APP.store.dispatch(showErrorNotification(props));
|
||||
APP.store.dispatch(showErrorNotification(props, NOTIFICATION_TIMEOUT_TYPE.LONG));
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -58,35 +57,7 @@ const messageHandler = {
|
||||
* showWarningNotification action.
|
||||
*/
|
||||
showWarning(props) {
|
||||
APP.store.dispatch(showWarningNotification(props));
|
||||
},
|
||||
|
||||
/**
|
||||
* Displays a notification about participant action.
|
||||
* @param displayName the display name of the participant that is
|
||||
* associated with the notification.
|
||||
* @param displayNameKey the key from the language file for the display
|
||||
* name. Only used if displayName is not provided.
|
||||
* @param cls css class for the notification
|
||||
* @param messageKey the key from the language file for the text of the
|
||||
* message.
|
||||
* @param messageArguments object with the arguments for the message.
|
||||
* @param optional configurations for the notification (e.g. timeout)
|
||||
*/
|
||||
participantNotification( // eslint-disable-line max-params
|
||||
displayName,
|
||||
displayNameKey,
|
||||
cls,
|
||||
messageKey,
|
||||
messageArguments,
|
||||
timeout = NOTIFICATION_TIMEOUT) {
|
||||
APP.store.dispatch(showNotification({
|
||||
descriptionArguments: messageArguments,
|
||||
descriptionKey: messageKey,
|
||||
titleKey: displayNameKey,
|
||||
title: displayName
|
||||
},
|
||||
timeout));
|
||||
APP.store.dispatch(showWarningNotification(props, NOTIFICATION_TIMEOUT_TYPE.LONG));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -14,7 +14,10 @@ import {
|
||||
JitsiParticipantConnectionStatus
|
||||
} from '../../../react/features/base/lib-jitsi-meet';
|
||||
import { MEDIA_TYPE, VIDEO_TYPE } from '../../../react/features/base/media';
|
||||
import { getParticipantById } from '../../../react/features/base/participants';
|
||||
import {
|
||||
getParticipantById,
|
||||
getParticipantDisplayName
|
||||
} from '../../../react/features/base/participants';
|
||||
import { getTrackByMediaTypeAndParticipant } from '../../../react/features/base/tracks';
|
||||
import { CHAT_SIZE } from '../../../react/features/chat';
|
||||
import {
|
||||
@@ -314,10 +317,12 @@ export default class LargeVideoManager {
|
||||
* @private
|
||||
*/
|
||||
updateParticipantConnStatusIndication(id, messageKey) {
|
||||
const state = APP.store.getState();
|
||||
|
||||
if (messageKey) {
|
||||
// Get user's display name
|
||||
const displayName
|
||||
= APP.conference.getParticipantDisplayName(id);
|
||||
= getParticipantDisplayName(state, id);
|
||||
|
||||
this._setRemoteConnectionMessage(
|
||||
messageKey,
|
||||
|
||||
407
package-lock.json
generated
407
package-lock.json
generated
@@ -36,6 +36,7 @@
|
||||
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz",
|
||||
"@microsoft/microsoft-graph-client": "1.1.0",
|
||||
"@react-native-async-storage/async-storage": "1.15.5",
|
||||
"@react-native-community/clipboard": "1.5.1",
|
||||
"@react-native-community/google-signin": "3.0.1",
|
||||
"@react-native-community/netinfo": "4.1.5",
|
||||
"@react-native-community/slider": "3.0.3",
|
||||
@@ -55,6 +56,7 @@
|
||||
"dropbox": "10.7.0",
|
||||
"face-api.js": "0.22.2",
|
||||
"focus-visible": "5.1.0",
|
||||
"grapheme-splitter": "1.0.4",
|
||||
"i18n-iso-countries": "6.8.0",
|
||||
"i18next": "17.0.6",
|
||||
"i18next-browser-languagedetector": "3.0.1",
|
||||
@@ -64,7 +66,7 @@
|
||||
"jquery-i18next": "1.2.1",
|
||||
"js-md5": "0.6.1",
|
||||
"jwt-decode": "2.2.0",
|
||||
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#bdfbb82087ce2a9336157da35e739fb4b250ed66",
|
||||
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#d630bc32a1262afd0432d8b8d8d0025dd5afd1e5",
|
||||
"libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
|
||||
"lodash": "4.17.21",
|
||||
"moment": "2.29.1",
|
||||
@@ -102,7 +104,7 @@
|
||||
"react-native-url-polyfill": "1.2.0",
|
||||
"react-native-video": "5.1.1",
|
||||
"react-native-watch-connectivity": "0.4.3",
|
||||
"react-native-webrtc": "1.92.2",
|
||||
"react-native-webrtc": "1.94.1",
|
||||
"react-native-webview": "11.0.2",
|
||||
"react-native-youtube-iframe": "2.1.1",
|
||||
"react-redux": "7.1.0",
|
||||
@@ -3454,27 +3456,6 @@
|
||||
"node-pre-gyp": "bin/node-pre-gyp"
|
||||
}
|
||||
},
|
||||
"node_modules/@mapbox/node-pre-gyp/node_modules/chownr": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
|
||||
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@mapbox/node-pre-gyp/node_modules/fs-minipass": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
|
||||
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"minipass": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 8"
|
||||
}
|
||||
},
|
||||
"node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||
@@ -3487,43 +3468,6 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@mapbox/node-pre-gyp/node_modules/minipass": {
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
|
||||
"integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/@mapbox/node-pre-gyp/node_modules/minizlib": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
|
||||
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"minipass": "^3.0.0",
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 8"
|
||||
}
|
||||
},
|
||||
"node_modules/@mapbox/node-pre-gyp/node_modules/mkdirp": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
|
||||
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
|
||||
"optional": true,
|
||||
"bin": {
|
||||
"mkdirp": "bin/cmd.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": {
|
||||
"version": "2.6.5",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz",
|
||||
@@ -3566,23 +3510,6 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@mapbox/node-pre-gyp/node_modules/tar": {
|
||||
"version": "6.1.11",
|
||||
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
|
||||
"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"chownr": "^2.0.0",
|
||||
"fs-minipass": "^2.0.0",
|
||||
"minipass": "^3.0.0",
|
||||
"minizlib": "^2.1.1",
|
||||
"mkdirp": "^1.0.3",
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/@mapbox/node-pre-gyp/node_modules/yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
@@ -4171,6 +4098,15 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/@react-native-community/clipboard": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@react-native-community/clipboard/-/clipboard-1.5.1.tgz",
|
||||
"integrity": "sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA==",
|
||||
"peerDependencies": {
|
||||
"react": ">=16.0",
|
||||
"react-native": ">=0.57.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@react-native-community/google-signin": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@react-native-community/google-signin/-/google-signin-3.0.1.tgz",
|
||||
@@ -6415,6 +6351,14 @@
|
||||
"node": ">=8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/chownr": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
|
||||
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/chrome-trace-event": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
|
||||
@@ -6987,14 +6931,6 @@
|
||||
"node": "4.x || >=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/cross-os": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/cross-os/-/cross-os-1.4.0.tgz",
|
||||
"integrity": "sha512-nuARAXqbsizhsqo3qo1bpYW2S6ohxJICjo/5Q/mq5xQ9dn1uWoRQ855DZrBAWgVfg7liPLdatnY2KMZwZYuxsQ==",
|
||||
"bin": {
|
||||
"cross-os": "source/index.js"
|
||||
}
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
|
||||
@@ -8967,9 +8903,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/event-target-shim": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-1.1.1.tgz",
|
||||
"integrity": "sha1-qG5e5r2qFgVEddp5fM3fDFVphJE="
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz",
|
||||
"integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==",
|
||||
"engines": {
|
||||
"node": ">=10.13.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/mysticatea"
|
||||
}
|
||||
},
|
||||
"node_modules/eventemitter3": {
|
||||
"version": "3.1.2",
|
||||
@@ -10011,6 +9953,17 @@
|
||||
"node": ">=6 <7 || >=8"
|
||||
}
|
||||
},
|
||||
"node_modules/fs-minipass": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
|
||||
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
|
||||
"dependencies": {
|
||||
"minipass": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 8"
|
||||
}
|
||||
},
|
||||
"node_modules/fs-monkey": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
|
||||
@@ -10820,6 +10773,11 @@
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/grapheme-splitter": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
|
||||
"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
|
||||
},
|
||||
"node_modules/growly": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
|
||||
@@ -12561,8 +12519,8 @@
|
||||
},
|
||||
"node_modules/lib-jitsi-meet": {
|
||||
"version": "0.0.0",
|
||||
"resolved": "git+ssh://git@github.com/jitsi/lib-jitsi-meet.git#bdfbb82087ce2a9336157da35e739fb4b250ed66",
|
||||
"integrity": "sha512-DqdQ/b/l7gzVplV2UkdwUDwFzST6yEj0oB+MFEIQAobhj/bIm/QjLjhPnu8EBKXFtUegma/WsX4jSBK+6U3RzQ==",
|
||||
"resolved": "git+ssh://git@github.com/jitsi/lib-jitsi-meet.git#d630bc32a1262afd0432d8b8d8d0025dd5afd1e5",
|
||||
"integrity": "sha512-LvIU+CghVMyI0nc+pjWH2EXgo5i7z2wgzjXhpTan0SB58nGQSa4SzWCgCRSOfeT20BwHNlejPOvNrtXe2pu98A==",
|
||||
"hasInstallScript": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
@@ -13666,6 +13624,39 @@
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
||||
},
|
||||
"node_modules/minipass": {
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
|
||||
"integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
|
||||
"dependencies": {
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/minipass/node_modules/yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||
},
|
||||
"node_modules/minizlib": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
|
||||
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
|
||||
"dependencies": {
|
||||
"minipass": "^3.0.0",
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 8"
|
||||
}
|
||||
},
|
||||
"node_modules/minizlib/node_modules/yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||
},
|
||||
"node_modules/mixin-deep": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
|
||||
@@ -16145,21 +16136,39 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-native-webrtc": {
|
||||
"version": "1.92.2",
|
||||
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.92.2.tgz",
|
||||
"integrity": "sha512-eq8otVRvLBD/kSM53SPymyrI7sq06/qejwhiLQKVlUsxaXTKPf3C5lktXsnw5OGZUmVk7y5rH+8ZJ3k+422t6g==",
|
||||
"version": "1.94.1",
|
||||
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.94.1.tgz",
|
||||
"integrity": "sha512-S+qU2i0PY2QfWzh8choBlVzUF6I6DVKhrUFbGrriuffieMu+/sR40pPTNCCFEXo4USNZAAM8osBgn6E/aZsJbg==",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"base64-js": "^1.1.2",
|
||||
"cross-os": "^1.3.0",
|
||||
"event-target-shim": "^1.0.5",
|
||||
"prop-types": "^15.5.10",
|
||||
"uuid": "^3.3.2"
|
||||
"base64-js": "1.5.1",
|
||||
"event-target-shim": "6.0.2",
|
||||
"tar": "6.1.11",
|
||||
"uuid": "3.4.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react-native": ">=0.60.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-native-webrtc/node_modules/base64-js": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
|
||||
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/react-native-webrtc/node_modules/uuid": {
|
||||
"version": "3.4.0",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
|
||||
@@ -18084,6 +18093,38 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/tar": {
|
||||
"version": "6.1.11",
|
||||
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
|
||||
"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
|
||||
"dependencies": {
|
||||
"chownr": "^2.0.0",
|
||||
"fs-minipass": "^2.0.0",
|
||||
"minipass": "^3.0.0",
|
||||
"minizlib": "^2.1.1",
|
||||
"mkdirp": "^1.0.3",
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/tar/node_modules/mkdirp": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
|
||||
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
|
||||
"bin": {
|
||||
"mkdirp": "bin/cmd.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/tar/node_modules/yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||
},
|
||||
"node_modules/temp": {
|
||||
"version": "0.8.3",
|
||||
"resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
|
||||
@@ -22879,21 +22920,6 @@
|
||||
"tar": "^6.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"chownr": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
|
||||
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
|
||||
"optional": true
|
||||
},
|
||||
"fs-minipass": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
|
||||
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minipass": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"lru-cache": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||
@@ -22903,31 +22929,6 @@
|
||||
"yallist": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"minipass": {
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
|
||||
"integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"yallist": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"minizlib": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
|
||||
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minipass": "^3.0.0",
|
||||
"yallist": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
|
||||
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
|
||||
"optional": true
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "2.6.5",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz",
|
||||
@@ -22955,20 +22956,6 @@
|
||||
"lru-cache": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"tar": {
|
||||
"version": "6.1.11",
|
||||
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
|
||||
"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"chownr": "^2.0.0",
|
||||
"fs-minipass": "^2.0.0",
|
||||
"minipass": "^3.0.0",
|
||||
"minizlib": "^2.1.1",
|
||||
"mkdirp": "^1.0.3",
|
||||
"yallist": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
@@ -23411,6 +23398,11 @@
|
||||
"resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-3.0.0.tgz",
|
||||
"integrity": "sha512-ng6Tm537E/M42GjE4TRUxQyL8sRfClcL7bQWblOCoxPZzJ2J3bdALsjeG3vDnVCIfI/R0AeFalN9KjMt0+Z/Zg=="
|
||||
},
|
||||
"@react-native-community/clipboard": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@react-native-community/clipboard/-/clipboard-1.5.1.tgz",
|
||||
"integrity": "sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA=="
|
||||
},
|
||||
"@react-native-community/google-signin": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@react-native-community/google-signin/-/google-signin-3.0.1.tgz",
|
||||
@@ -25204,6 +25196,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"chownr": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
|
||||
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
|
||||
},
|
||||
"chrome-trace-event": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
|
||||
@@ -25659,11 +25656,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"cross-os": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/cross-os/-/cross-os-1.4.0.tgz",
|
||||
"integrity": "sha512-nuARAXqbsizhsqo3qo1bpYW2S6ohxJICjo/5Q/mq5xQ9dn1uWoRQ855DZrBAWgVfg7liPLdatnY2KMZwZYuxsQ=="
|
||||
},
|
||||
"cross-spawn": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
|
||||
@@ -27198,9 +27190,9 @@
|
||||
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
|
||||
},
|
||||
"event-target-shim": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-1.1.1.tgz",
|
||||
"integrity": "sha1-qG5e5r2qFgVEddp5fM3fDFVphJE="
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz",
|
||||
"integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA=="
|
||||
},
|
||||
"eventemitter3": {
|
||||
"version": "3.1.2",
|
||||
@@ -28021,6 +28013,14 @@
|
||||
"universalify": "^0.1.0"
|
||||
}
|
||||
},
|
||||
"fs-minipass": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
|
||||
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
|
||||
"requires": {
|
||||
"minipass": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"fs-monkey": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
|
||||
@@ -28639,6 +28639,11 @@
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
|
||||
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
|
||||
},
|
||||
"grapheme-splitter": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
|
||||
"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
|
||||
},
|
||||
"growly": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
|
||||
@@ -29988,9 +29993,9 @@
|
||||
}
|
||||
},
|
||||
"lib-jitsi-meet": {
|
||||
"version": "git+ssh://git@github.com/jitsi/lib-jitsi-meet.git#bdfbb82087ce2a9336157da35e739fb4b250ed66",
|
||||
"integrity": "sha512-DqdQ/b/l7gzVplV2UkdwUDwFzST6yEj0oB+MFEIQAobhj/bIm/QjLjhPnu8EBKXFtUegma/WsX4jSBK+6U3RzQ==",
|
||||
"from": "lib-jitsi-meet@github:jitsi/lib-jitsi-meet#bdfbb82087ce2a9336157da35e739fb4b250ed66",
|
||||
"version": "git+ssh://git@github.com/jitsi/lib-jitsi-meet.git#d630bc32a1262afd0432d8b8d8d0025dd5afd1e5",
|
||||
"integrity": "sha512-LvIU+CghVMyI0nc+pjWH2EXgo5i7z2wgzjXhpTan0SB58nGQSa4SzWCgCRSOfeT20BwHNlejPOvNrtXe2pu98A==",
|
||||
"from": "lib-jitsi-meet@github:jitsi/lib-jitsi-meet#d630bc32a1262afd0432d8b8d8d0025dd5afd1e5",
|
||||
"requires": {
|
||||
"@jitsi/js-utils": "2.0.0",
|
||||
"@jitsi/logger": "2.0.0",
|
||||
@@ -30928,6 +30933,37 @@
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
||||
},
|
||||
"minipass": {
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
|
||||
"integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
|
||||
"requires": {
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"minizlib": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
|
||||
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
|
||||
"requires": {
|
||||
"minipass": "^3.0.0",
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"mixin-deep": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
|
||||
@@ -32872,17 +32908,21 @@
|
||||
"integrity": "sha512-iqdJ1KpZbR4XGahgVmaeibB7kDhyMT7wrylINgJaYBY38IAiI0LF32VX1umO4pko6n21YF5I/kSeNQ+OXGqqow=="
|
||||
},
|
||||
"react-native-webrtc": {
|
||||
"version": "1.92.2",
|
||||
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.92.2.tgz",
|
||||
"integrity": "sha512-eq8otVRvLBD/kSM53SPymyrI7sq06/qejwhiLQKVlUsxaXTKPf3C5lktXsnw5OGZUmVk7y5rH+8ZJ3k+422t6g==",
|
||||
"version": "1.94.1",
|
||||
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.94.1.tgz",
|
||||
"integrity": "sha512-S+qU2i0PY2QfWzh8choBlVzUF6I6DVKhrUFbGrriuffieMu+/sR40pPTNCCFEXo4USNZAAM8osBgn6E/aZsJbg==",
|
||||
"requires": {
|
||||
"base64-js": "^1.1.2",
|
||||
"cross-os": "^1.3.0",
|
||||
"event-target-shim": "^1.0.5",
|
||||
"prop-types": "^15.5.10",
|
||||
"uuid": "^3.3.2"
|
||||
"base64-js": "1.5.1",
|
||||
"event-target-shim": "6.0.2",
|
||||
"tar": "6.1.11",
|
||||
"uuid": "3.4.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"base64-js": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
|
||||
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
|
||||
},
|
||||
"uuid": {
|
||||
"version": "3.4.0",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
|
||||
@@ -34375,6 +34415,31 @@
|
||||
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
|
||||
"dev": true
|
||||
},
|
||||
"tar": {
|
||||
"version": "6.1.11",
|
||||
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
|
||||
"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
|
||||
"requires": {
|
||||
"chownr": "^2.0.0",
|
||||
"fs-minipass": "^2.0.0",
|
||||
"minipass": "^3.0.0",
|
||||
"minizlib": "^2.1.1",
|
||||
"mkdirp": "^1.0.3",
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"mkdirp": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
|
||||
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
|
||||
},
|
||||
"yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"temp": {
|
||||
"version": "0.8.3",
|
||||
"resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
|
||||
|
||||
10
package.json
10
package.json
@@ -41,6 +41,7 @@
|
||||
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz",
|
||||
"@microsoft/microsoft-graph-client": "1.1.0",
|
||||
"@react-native-async-storage/async-storage": "1.15.5",
|
||||
"@react-native-community/clipboard": "1.5.1",
|
||||
"@react-native-community/google-signin": "3.0.1",
|
||||
"@react-native-community/netinfo": "4.1.5",
|
||||
"@react-native-community/slider": "3.0.3",
|
||||
@@ -60,6 +61,7 @@
|
||||
"dropbox": "10.7.0",
|
||||
"face-api.js": "0.22.2",
|
||||
"focus-visible": "5.1.0",
|
||||
"grapheme-splitter": "1.0.4",
|
||||
"i18n-iso-countries": "6.8.0",
|
||||
"i18next": "17.0.6",
|
||||
"i18next-browser-languagedetector": "3.0.1",
|
||||
@@ -69,7 +71,7 @@
|
||||
"jquery-i18next": "1.2.1",
|
||||
"js-md5": "0.6.1",
|
||||
"jwt-decode": "2.2.0",
|
||||
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#bdfbb82087ce2a9336157da35e739fb4b250ed66",
|
||||
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#d630bc32a1262afd0432d8b8d8d0025dd5afd1e5",
|
||||
"libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
|
||||
"lodash": "4.17.21",
|
||||
"moment": "2.29.1",
|
||||
@@ -107,7 +109,7 @@
|
||||
"react-native-url-polyfill": "1.2.0",
|
||||
"react-native-video": "5.1.1",
|
||||
"react-native-watch-connectivity": "0.4.3",
|
||||
"react-native-webrtc": "1.92.2",
|
||||
"react-native-webrtc": "1.94.1",
|
||||
"react-native-webview": "11.0.2",
|
||||
"react-native-youtube-iframe": "2.1.1",
|
||||
"react-redux": "7.1.0",
|
||||
@@ -169,8 +171,8 @@
|
||||
},
|
||||
"license": "Apache-2.0",
|
||||
"scripts": {
|
||||
"lint": "eslint . && flow",
|
||||
"lint-fix": "eslint --fix .",
|
||||
"lint": "eslint --max-warnings 0 . && flow",
|
||||
"lint-fix": "eslint --max-warnings 0 --fix .",
|
||||
"postinstall": "patch-package && jetify",
|
||||
"validate": "npm ls",
|
||||
"start": "make dev",
|
||||
|
||||
@@ -884,3 +884,18 @@ export function createScreensharingCaptureTakenEvent() {
|
||||
action: 'screen.sharing.capture.taken'
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an event for an action on breakout rooms.
|
||||
*
|
||||
* @param {string} actionSubject - The subject that was acted upon.
|
||||
* @returns {Object} The event in a format suitable for sending via
|
||||
* sendAnalytics.
|
||||
*/
|
||||
export function createBreakoutRoomsEvent(actionSubject) {
|
||||
return {
|
||||
action: 'clicked',
|
||||
actionSubject: `${actionSubject}.button`,
|
||||
source: 'breakout.rooms'
|
||||
};
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ import {
|
||||
toURLString
|
||||
} from '../base/util';
|
||||
import { isVpaasMeeting } from '../jaas/functions';
|
||||
import { clearNotifications, showNotification } from '../notifications';
|
||||
import { NOTIFICATION_TIMEOUT_TYPE, clearNotifications, showNotification } from '../notifications';
|
||||
import { setFatalError } from '../overlay';
|
||||
|
||||
import {
|
||||
@@ -328,7 +328,7 @@ export function maybeRedirectToWelcomePage(options: Object = {}) {
|
||||
dispatch(showNotification({
|
||||
titleArguments: { appName: getName() },
|
||||
titleKey: 'dialog.thankYou'
|
||||
}));
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.STICKY));
|
||||
}
|
||||
|
||||
// if Welcome page is enabled redirect to welcome page after 3 sec, if
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
import React from 'react';
|
||||
import SplashScreen from 'react-native-splash-screen';
|
||||
|
||||
import { setColorScheme } from '../../base/color-scheme';
|
||||
import { DialogContainer } from '../../base/dialog';
|
||||
import { updateFlags } from '../../base/flags/actions';
|
||||
import { CALL_INTEGRATION_ENABLED, SERVER_URL_CHANGE_ENABLED } from '../../base/flags/constants';
|
||||
@@ -91,7 +90,6 @@ export class App extends AbstractApp {
|
||||
const { dispatch, getState } = this.state.store;
|
||||
|
||||
// We set these early enough so then we avoid any unnecessary re-renders.
|
||||
dispatch(setColorScheme(this.props.colorScheme));
|
||||
dispatch(updateFlags(this.props.flags));
|
||||
|
||||
// Check if serverURL is configured externally and not allowed to change.
|
||||
|
||||
@@ -8,6 +8,7 @@ import '../external-api/middleware';
|
||||
import '../keyboard-shortcuts/middleware';
|
||||
import '../local-recording/middleware';
|
||||
import '../no-audio-signal/middleware';
|
||||
import '../notifications/middleware';
|
||||
import '../noise-detection/middleware';
|
||||
import '../old-client-notification/middleware';
|
||||
import '../power-monitor/middleware';
|
||||
|
||||
@@ -5,7 +5,6 @@ import '../authentication/reducer';
|
||||
import '../av-moderation/reducer';
|
||||
import '../base/app/reducer';
|
||||
import '../base/audio-only/reducer';
|
||||
import '../base/color-scheme/reducer';
|
||||
import '../base/conference/reducer';
|
||||
import '../base/config/reducer';
|
||||
import '../base/connection/reducer';
|
||||
@@ -17,7 +16,6 @@ import '../base/lastn/reducer';
|
||||
import '../base/lib-jitsi-meet/reducer';
|
||||
import '../base/logging/reducer';
|
||||
import '../base/media/reducer';
|
||||
import '../base/modal/reducer';
|
||||
import '../base/net-info/reducer';
|
||||
import '../base/participants/reducer';
|
||||
import '../base/responsive-ui/reducer';
|
||||
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
import { MiddlewareRegistry, StateListenerRegistry } from '../base/redux';
|
||||
import { playSound, registerSound, unregisterSound } from '../base/sounds';
|
||||
import {
|
||||
NOTIFICATION_TIMEOUT_TYPE,
|
||||
hideNotification,
|
||||
showNotification
|
||||
} from '../notifications';
|
||||
@@ -97,16 +98,16 @@ MiddlewareRegistry.register(({ dispatch, getState }) => next => action => {
|
||||
}
|
||||
|
||||
dispatch(showNotification({
|
||||
customActionNameKey: 'notify.raiseHandAction',
|
||||
customActionHandler: () => batch(() => {
|
||||
customActionNameKey: [ 'notify.raiseHandAction' ],
|
||||
customActionHandler: [ () => batch(() => {
|
||||
dispatch(raiseHand(true));
|
||||
dispatch(hideNotification(uid));
|
||||
}),
|
||||
}) ],
|
||||
descriptionKey,
|
||||
sticky: true,
|
||||
titleKey,
|
||||
uid
|
||||
}));
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.STICKY));
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -220,9 +221,9 @@ StateListenerRegistry.register(
|
||||
dispatch(showNotification({
|
||||
titleKey: 'notify.hostAskedUnmute',
|
||||
sticky: true,
|
||||
customActionNameKey: 'notify.unmute',
|
||||
customActionHandler: () => dispatch(muteLocal(false, MEDIA_TYPE.AUDIO))
|
||||
}));
|
||||
customActionNameKey: [ 'notify.unmute' ],
|
||||
customActionHandler: [ () => dispatch(muteLocal(false, MEDIA_TYPE.AUDIO)) ]
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.STICKY));
|
||||
dispatch(playSound(ASKED_TO_UNMUTE_SOUND_ID));
|
||||
}
|
||||
});
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
import React from 'react';
|
||||
|
||||
import { Icon } from '../../../icons';
|
||||
import { isGravatarURL } from '../../functions';
|
||||
import AbstractStatelessAvatar, { type Props as AbstractProps } from '../AbstractStatelessAvatar';
|
||||
|
||||
type Props = AbstractProps & {
|
||||
@@ -66,6 +67,7 @@ export default class StatelessAvatar extends AbstractStatelessAvatar<Props> {
|
||||
<img
|
||||
alt = 'avatar'
|
||||
className = { this._getAvatarClassName() }
|
||||
crossOrigin = { isGravatarURL(url) ? '' : undefined }
|
||||
data-testid = { this.props.testId }
|
||||
id = { this.props.id }
|
||||
onError = { this.props.onAvatarLoadError }
|
||||
|
||||
6
react/features/base/avatar/constants.js
Normal file
6
react/features/base/avatar/constants.js
Normal file
@@ -0,0 +1,6 @@
|
||||
// @flow
|
||||
|
||||
/**
|
||||
* The base URL for gravatar images.
|
||||
*/
|
||||
export const GRAVATAR_BASE_URL = 'https://www.gravatar.com/avatar/';
|
||||
@@ -1,7 +1,10 @@
|
||||
// @flow
|
||||
|
||||
import GraphemeSplitter from 'grapheme-splitter';
|
||||
import _ from 'lodash';
|
||||
|
||||
import { GRAVATAR_BASE_URL } from './constants';
|
||||
|
||||
const AVATAR_COLORS = [
|
||||
'#6A50D3',
|
||||
'#FF9B42',
|
||||
@@ -13,6 +16,8 @@ const AVATAR_COLORS = [
|
||||
'#2AA076',
|
||||
'#00A8B3'
|
||||
];
|
||||
const wordSplitRegex = (/\s+|\.+|_+|;+|-+|,+|\|+|\/+|\\+/);
|
||||
const splitter = new GraphemeSplitter();
|
||||
|
||||
/**
|
||||
* Generates the background color of an initials based avatar.
|
||||
@@ -40,6 +45,20 @@ export function getAvatarColor(initials: ?string, customAvatarBackgrounds: Array
|
||||
return colorsBase[colorIndex];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first grapheme from a word, uppercased.
|
||||
*
|
||||
* @param {string} word - The string to get grapheme from.
|
||||
* @returns {string}
|
||||
*/
|
||||
function getFirstGraphemeUpper(word) {
|
||||
if (!word?.length) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return splitter.splitGraphemes(word)[0].toUpperCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates initials for a simple string.
|
||||
*
|
||||
@@ -49,12 +68,17 @@ export function getAvatarColor(initials: ?string, customAvatarBackgrounds: Array
|
||||
export function getInitials(s: ?string) {
|
||||
// We don't want to use the domain part of an email address, if it is one
|
||||
const initialsBasis = _.split(s, '@')[0];
|
||||
const words = _.words(initialsBasis);
|
||||
let initials = '';
|
||||
const [ firstWord, secondWord ] = initialsBasis.split(wordSplitRegex);
|
||||
|
||||
for (const w of words) {
|
||||
(initials.length < 2) && (initials += String.fromCodePoint(w.codePointAt(0)).toUpperCase());
|
||||
}
|
||||
|
||||
return initials;
|
||||
return getFirstGraphemeUpper(firstWord) + getFirstGraphemeUpper(secondWord);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the passed URL is pointing to the gravatar service.
|
||||
*
|
||||
* @param {string} url - The URL.
|
||||
* @returns {void}
|
||||
*/
|
||||
export function isGravatarURL(url: string = '') {
|
||||
return url.startsWith(GRAVATAR_BASE_URL);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// @flow
|
||||
|
||||
export * from './components';
|
||||
export * from './constants';
|
||||
export * from './functions';
|
||||
|
||||
@@ -23,8 +23,7 @@ class ColorSchemeRegistry {
|
||||
_styleTemplates = new Map();
|
||||
|
||||
/**
|
||||
* Clears the already scheme-ified style definitions. This is useful when
|
||||
* the {@code SET_COLOR_SCHEME} action is dispatched (again).
|
||||
* Clears the already scheme-ified style definitions.
|
||||
*
|
||||
* @returns {void}
|
||||
*/
|
||||
@@ -150,7 +149,7 @@ class ColorSchemeRegistry {
|
||||
stateful: Object | Function,
|
||||
componentName: string,
|
||||
colorDefinition: string): string {
|
||||
const colorScheme = toState(stateful)['features/base/color-scheme'];
|
||||
const colorScheme = toState(stateful)['features/base/color-scheme'] || {};
|
||||
|
||||
return {
|
||||
...defaultScheme._defaultTheme,
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
// @flow
|
||||
|
||||
/**
|
||||
* Redux action to signal a color scheme change in the app/sdk.
|
||||
*
|
||||
* {
|
||||
* type: SET_COLOR_SCHEME
|
||||
* colorScheme: Object
|
||||
* }
|
||||
*/
|
||||
export const SET_COLOR_SCHEME = 'SET_COLOR_SCHEME';
|
||||
@@ -1,19 +0,0 @@
|
||||
// @flow
|
||||
|
||||
import { SET_COLOR_SCHEME } from './actionTypes';
|
||||
|
||||
/**
|
||||
* Dispatches a Redux action to set the color scheme of the app/sdk.
|
||||
*
|
||||
* @param {Object} colorScheme - The color scheme to set.
|
||||
* @returns {{
|
||||
* type: SET_COLOR_SCHEME,
|
||||
* colorScheme: Object
|
||||
* }}
|
||||
*/
|
||||
export function setColorScheme(colorScheme: Object): Object {
|
||||
return {
|
||||
type: SET_COLOR_SCHEME,
|
||||
colorScheme
|
||||
};
|
||||
}
|
||||
@@ -43,9 +43,6 @@ export default {
|
||||
'LargeVideo': {
|
||||
background: '#040404'
|
||||
},
|
||||
'LoadConfigOverlay': {
|
||||
background: 'rgb(249, 249, 249)'
|
||||
},
|
||||
'Thumbnail': {
|
||||
activeParticipantHighlight: 'rgb(81, 214, 170)',
|
||||
activeParticipantTint: 'rgba(49, 183, 106, 0.3)',
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
// @flow
|
||||
|
||||
export * from './actions';
|
||||
export * from './actionTypes';
|
||||
export * from './functions';
|
||||
export { default as ColorSchemeRegistry } from './ColorSchemeRegistry';
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
// @flow
|
||||
|
||||
import { MiddlewareRegistry } from '../redux';
|
||||
|
||||
import ColorSchemeRegistry from './ColorSchemeRegistry';
|
||||
import { SET_COLOR_SCHEME } from './actionTypes';
|
||||
|
||||
/**
|
||||
* The middleware of the feature {@code base/color-scheme}.
|
||||
*
|
||||
* @returns {Function}
|
||||
*/
|
||||
MiddlewareRegistry.register((/* store */) => next => action => {
|
||||
switch (action.type) {
|
||||
case SET_COLOR_SCHEME:
|
||||
return ColorSchemeRegistry.clear();
|
||||
}
|
||||
|
||||
return next(action);
|
||||
});
|
||||
@@ -1,21 +0,0 @@
|
||||
// @flow
|
||||
|
||||
import _ from 'lodash';
|
||||
|
||||
import { ReducerRegistry } from '../redux';
|
||||
|
||||
import { SET_COLOR_SCHEME } from './actionTypes';
|
||||
|
||||
/**
|
||||
* The reducer of the feature {@code base/color-scheme}.
|
||||
*
|
||||
* @returns {Function}
|
||||
*/
|
||||
ReducerRegistry.register('features/base/color-scheme', (state = {}, action) => {
|
||||
switch (action.type) {
|
||||
case SET_COLOR_SCHEME:
|
||||
return _.cloneDeep(action.colorScheme) || state;
|
||||
}
|
||||
|
||||
return state;
|
||||
});
|
||||
@@ -172,6 +172,17 @@ export const SEND_TONES = 'SEND_TONES';
|
||||
*/
|
||||
export const SET_FOLLOW_ME = 'SET_FOLLOW_ME';
|
||||
|
||||
/**
|
||||
* The type of (redux) action which updates the current known status of the
|
||||
* Mute Reactions Sound feature.
|
||||
*
|
||||
* {
|
||||
* type: SET_START_REACTIONS_MUTED,
|
||||
* enabled: boolean
|
||||
* }
|
||||
*/
|
||||
export const SET_START_REACTIONS_MUTED = 'SET_START_REACTIONS_MUTED';
|
||||
|
||||
/**
|
||||
* The type of (redux) action which sets the password to join or lock a specific
|
||||
* {@code JitsiConference}.
|
||||
|
||||
@@ -10,7 +10,13 @@ import { endpointMessageReceived } from '../../subtitles';
|
||||
import { getReplaceParticipant } from '../config/functions';
|
||||
import { JITSI_CONNECTION_CONFERENCE_KEY } from '../connection';
|
||||
import { JitsiConferenceEvents } from '../lib-jitsi-meet';
|
||||
import { MEDIA_TYPE, setAudioMuted, setVideoMuted } from '../media';
|
||||
import {
|
||||
MEDIA_TYPE,
|
||||
setAudioMuted,
|
||||
setAudioUnmutePermissions,
|
||||
setVideoMuted,
|
||||
setVideoUnmutePermissions
|
||||
} from '../media';
|
||||
import {
|
||||
dominantSpeakerChanged,
|
||||
getNormalizedDisplayName,
|
||||
@@ -21,7 +27,13 @@ import {
|
||||
participantRoleChanged,
|
||||
participantUpdated
|
||||
} from '../participants';
|
||||
import { getLocalTracks, replaceLocalTrack, trackAdded, trackRemoved } from '../tracks';
|
||||
import {
|
||||
destroyLocalTracks,
|
||||
getLocalTracks,
|
||||
replaceLocalTrack,
|
||||
trackAdded,
|
||||
trackRemoved
|
||||
} from '../tracks';
|
||||
import { getBackendSafeRoomName } from '../util';
|
||||
|
||||
import {
|
||||
@@ -45,7 +57,8 @@ import {
|
||||
SET_PASSWORD_FAILED,
|
||||
SET_ROOM,
|
||||
SET_PENDING_SUBJECT_CHANGE,
|
||||
SET_START_MUTED_POLICY
|
||||
SET_START_MUTED_POLICY,
|
||||
SET_START_REACTIONS_MUTED
|
||||
} from './actionTypes';
|
||||
import {
|
||||
AVATAR_URL_COMMAND,
|
||||
@@ -146,6 +159,17 @@ function _addConferenceListeners(conference, dispatch, state) {
|
||||
}
|
||||
});
|
||||
|
||||
conference.on(
|
||||
JitsiConferenceEvents.AUDIO_UNMUTE_PERMISSIONS_CHANGED,
|
||||
disableAudioMuteChange => {
|
||||
dispatch(setAudioUnmutePermissions(disableAudioMuteChange));
|
||||
});
|
||||
conference.on(
|
||||
JitsiConferenceEvents.VIDEO_UNMUTE_PERMISSIONS_CHANGED,
|
||||
disableVideoMuteChange => {
|
||||
dispatch(setVideoUnmutePermissions(disableVideoMuteChange));
|
||||
});
|
||||
|
||||
// Dispatches into features/base/tracks follow:
|
||||
|
||||
conference.on(
|
||||
@@ -163,6 +187,8 @@ function _addConferenceListeners(conference, dispatch, state) {
|
||||
}
|
||||
});
|
||||
|
||||
conference.on(JitsiConferenceEvents.TRACK_UNMUTE_REJECTED, track => dispatch(destroyLocalTracks(track)));
|
||||
|
||||
// Dispatches into features/base/participants follow:
|
||||
conference.on(
|
||||
JitsiConferenceEvents.DISPLAY_NAME_CHANGED,
|
||||
@@ -483,7 +509,7 @@ export function checkIfCanJoin() {
|
||||
const { authRequired, password }
|
||||
= getState()['features/base/conference'];
|
||||
|
||||
const replaceParticipant = getReplaceParticipant(APP.store.getState());
|
||||
const replaceParticipant = getReplaceParticipant(getState());
|
||||
|
||||
authRequired && dispatch(_conferenceWillJoin(authRequired));
|
||||
authRequired && authRequired.join(password, replaceParticipant);
|
||||
@@ -640,6 +666,22 @@ export function setFollowMe(enabled: boolean) {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables or disables the Mute reaction sounds feature.
|
||||
*
|
||||
* @param {boolean} muted - Whether or not reaction sounds should be muted for all participants.
|
||||
* @returns {{
|
||||
* type: SET_START_REACTIONS_MUTED,
|
||||
* muted: boolean
|
||||
* }}
|
||||
*/
|
||||
export function setStartReactionsMuted(muted: boolean) {
|
||||
return {
|
||||
type: SET_START_REACTIONS_MUTED,
|
||||
muted
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the password to join or lock a specific JitsiConference.
|
||||
*
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
export const AVATAR_URL_COMMAND = 'avatar-url';
|
||||
|
||||
/**
|
||||
* The command type for updating a participant's e-mail address.
|
||||
* The command type for updating a participant's email address.
|
||||
*
|
||||
* @type {string}
|
||||
*/
|
||||
@@ -27,3 +27,7 @@ export const EMAIL_COMMAND = 'email';
|
||||
* from the outside is not cool but it should suffice for now.
|
||||
*/
|
||||
export const JITSI_CONFERENCE_URL_KEY = Symbol('url');
|
||||
|
||||
export const TRIGGER_READY_TO_CLOSE_REASONS = [
|
||||
'The meeting has been terminated'
|
||||
];
|
||||
|
||||
@@ -386,7 +386,7 @@ function _reportError(msg, err) {
|
||||
|
||||
/**
|
||||
* Sends a representation of the local participant such as her avatar (URL),
|
||||
* e-mail address, and display name to (the remote participants of) a specific
|
||||
* email address, and display name to (the remote participants of) a specific
|
||||
* conference.
|
||||
*
|
||||
* @param {Function|Object} stateful - The redux store, state, or
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// @flow
|
||||
|
||||
import { readyToClose } from '../../../features/mobile/external-api/actions';
|
||||
import {
|
||||
ACTION_PINNED,
|
||||
ACTION_UNPINNED,
|
||||
@@ -9,7 +10,7 @@ import {
|
||||
} from '../../analytics';
|
||||
import { reloadNow } from '../../app/actions';
|
||||
import { openDisplayNamePrompt } from '../../display-name';
|
||||
import { showErrorNotification } from '../../notifications';
|
||||
import { NOTIFICATION_TIMEOUT_TYPE, showErrorNotification } from '../../notifications';
|
||||
import { CONNECTION_ESTABLISHED, CONNECTION_FAILED, connectionDisconnected } from '../connection';
|
||||
import { validateJwt } from '../jwt';
|
||||
import { JitsiConferenceErrors } from '../lib-jitsi-meet';
|
||||
@@ -40,6 +41,7 @@ import {
|
||||
createConference,
|
||||
setSubject
|
||||
} from './actions';
|
||||
import { TRIGGER_READY_TO_CLOSE_REASONS } from './constants';
|
||||
import {
|
||||
_addLocalTracksToConference,
|
||||
_removeLocalTracksFromConference,
|
||||
@@ -79,7 +81,7 @@ MiddlewareRegistry.register(store => next => action => {
|
||||
return _conferenceSubjectChanged(store, next, action);
|
||||
|
||||
case CONFERENCE_WILL_LEAVE:
|
||||
_conferenceWillLeave();
|
||||
_conferenceWillLeave(store);
|
||||
break;
|
||||
|
||||
case PARTICIPANT_UPDATED:
|
||||
@@ -102,7 +104,6 @@ MiddlewareRegistry.register(store => next => action => {
|
||||
return next(action);
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* Makes sure to leave a failed conference in order to release any allocated
|
||||
* resources like peer connections, emit participant left events, etc.
|
||||
@@ -129,7 +130,15 @@ function _conferenceFailed({ dispatch, getState }, next, action) {
|
||||
dispatch(showErrorNotification({
|
||||
description: reason,
|
||||
titleKey: 'dialog.sessTerminated'
|
||||
}));
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.LONG));
|
||||
|
||||
if (TRIGGER_READY_TO_CLOSE_REASONS.includes(reason)) {
|
||||
if (typeof APP === undefined) {
|
||||
dispatch(readyToClose());
|
||||
} else {
|
||||
APP.API.notifyReadyToClose();
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -138,7 +147,7 @@ function _conferenceFailed({ dispatch, getState }, next, action) {
|
||||
dispatch(showErrorNotification({
|
||||
description: 'Restart initiated because of a bridge failure',
|
||||
titleKey: 'dialog.sessionRestarted'
|
||||
}));
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.LONG));
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -151,7 +160,7 @@ function _conferenceFailed({ dispatch, getState }, next, action) {
|
||||
descriptionArguments: { msg },
|
||||
descriptionKey: msg ? 'dialog.connectErrorWithMsg' : 'dialog.connectError',
|
||||
titleKey: 'connection.CONNFAIL'
|
||||
}));
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.LONG));
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -168,12 +177,11 @@ function _conferenceFailed({ dispatch, getState }, next, action) {
|
||||
// good to know that it happen, so log it (on the info level).
|
||||
logger.info('JitsiConference.leave() rejected with:', reason);
|
||||
});
|
||||
} else if (typeof beforeUnloadHandler !== 'undefined') {
|
||||
} else {
|
||||
// FIXME: Workaround for the web version. Currently, the creation of the
|
||||
// conference is handled by /conference.js and appropriate failure handlers
|
||||
// are set there.
|
||||
window.removeEventListener('beforeunload', beforeUnloadHandler);
|
||||
beforeUnloadHandler = undefined;
|
||||
_removeUnloadHandler(getState);
|
||||
}
|
||||
|
||||
if (enableForcedReload && error?.name === JitsiConferenceErrors.CONFERENCE_RESTARTED) {
|
||||
@@ -201,7 +209,7 @@ function _conferenceJoined({ dispatch, getState }, next, action) {
|
||||
const result = next(action);
|
||||
const { conference } = action;
|
||||
const { pendingSubjectChange } = getState()['features/base/conference'];
|
||||
const { requireDisplayName } = getState()['features/base/config'];
|
||||
const { requireDisplayName, disableBeforeUnloadHandlers = false } = getState()['features/base/config'];
|
||||
|
||||
pendingSubjectChange && dispatch(setSubject(pendingSubjectChange));
|
||||
|
||||
@@ -213,7 +221,7 @@ function _conferenceJoined({ dispatch, getState }, next, action) {
|
||||
beforeUnloadHandler = () => {
|
||||
dispatch(conferenceWillLeave(conference));
|
||||
};
|
||||
window.addEventListener('beforeunload', beforeUnloadHandler);
|
||||
window.addEventListener(disableBeforeUnloadHandlers ? 'unload' : 'beforeunload', beforeUnloadHandler);
|
||||
|
||||
if (requireDisplayName
|
||||
&& !getLocalParticipant(getState)?.name
|
||||
@@ -287,10 +295,7 @@ function _connectionFailed({ dispatch, getState }, next, action) {
|
||||
|
||||
const result = next(action);
|
||||
|
||||
if (typeof beforeUnloadHandler !== 'undefined') {
|
||||
window.removeEventListener('beforeunload', beforeUnloadHandler);
|
||||
beforeUnloadHandler = undefined;
|
||||
}
|
||||
_removeUnloadHandler(getState);
|
||||
|
||||
// FIXME: Workaround for the web version. Currently, the creation of the
|
||||
// conference is handled by /conference.js and appropriate failure handlers
|
||||
@@ -367,13 +372,11 @@ function _conferenceSubjectChanged({ dispatch, getState }, next, action) {
|
||||
* store.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} store - The redux store.
|
||||
* @returns {void}
|
||||
*/
|
||||
function _conferenceWillLeave() {
|
||||
if (typeof beforeUnloadHandler !== 'undefined') {
|
||||
window.removeEventListener('beforeunload', beforeUnloadHandler);
|
||||
beforeUnloadHandler = undefined;
|
||||
}
|
||||
function _conferenceWillLeave({ getState }: { getState: Function }) {
|
||||
_removeUnloadHandler(getState);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -425,6 +428,21 @@ function _pinParticipant({ getState }, next, action) {
|
||||
return next(action);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the unload handler.
|
||||
*
|
||||
* @param {Function} getState - The redux getState function.
|
||||
* @returns {void}
|
||||
*/
|
||||
function _removeUnloadHandler(getState) {
|
||||
if (typeof beforeUnloadHandler !== 'undefined') {
|
||||
const { disableBeforeUnloadHandlers = false } = getState()['features/base/config'];
|
||||
|
||||
window.removeEventListener(disableBeforeUnloadHandlers ? 'unload' : 'beforeunload', beforeUnloadHandler);
|
||||
beforeUnloadHandler = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Requests the specified tones to be played.
|
||||
*
|
||||
|
||||
@@ -41,6 +41,7 @@ function _toggleScreenSharing(enabled, store) {
|
||||
}
|
||||
} else {
|
||||
dispatch(destroyLocalDesktopTrackIfExists());
|
||||
setPictureInPictureDisabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,8 @@ import {
|
||||
SET_PASSWORD,
|
||||
SET_PENDING_SUBJECT_CHANGE,
|
||||
SET_ROOM,
|
||||
SET_START_MUTED_POLICY
|
||||
SET_START_MUTED_POLICY,
|
||||
SET_START_REACTIONS_MUTED
|
||||
} from './actionTypes';
|
||||
import { isRoomValid } from './functions';
|
||||
|
||||
@@ -77,6 +78,9 @@ ReducerRegistry.register(
|
||||
case SET_FOLLOW_ME:
|
||||
return set(state, 'followMeEnabled', action.enabled);
|
||||
|
||||
case SET_START_REACTIONS_MUTED:
|
||||
return set(state, 'startReactionsMuted', action.muted);
|
||||
|
||||
case SET_LOCATION_URL:
|
||||
return set(state, 'room', undefined);
|
||||
|
||||
|
||||
@@ -81,6 +81,8 @@ export default [
|
||||
'debug',
|
||||
'debugAudioLevels',
|
||||
'defaultLanguage',
|
||||
'defaultLocalDisplayName',
|
||||
'defaultRemoteDisplayName',
|
||||
'desktopSharingFrameRate',
|
||||
'desktopSharingSources',
|
||||
'disable1On1Mode',
|
||||
@@ -89,6 +91,7 @@ export default [
|
||||
'disableAP',
|
||||
'disableAddingBackgroundImages',
|
||||
'disableAudioLevels',
|
||||
'disableBeforeUnloadHandlers',
|
||||
'disableChatSmileys',
|
||||
'disableDeepLinking',
|
||||
'disabledSounds',
|
||||
@@ -110,6 +113,7 @@ export default [
|
||||
'disableRemoteMute',
|
||||
'disableResponsiveTiles',
|
||||
'disableRtx',
|
||||
'disableSelfView',
|
||||
'disableScreensharingVirtualBackground',
|
||||
'disableShortcuts',
|
||||
'disableShowMoreStats',
|
||||
@@ -119,6 +123,7 @@ export default [
|
||||
'disableSimulcast',
|
||||
'disableThirdPartyRequests',
|
||||
'disableTileView',
|
||||
'disableTileEnlargement',
|
||||
'displayJids',
|
||||
'doNotStoreRoom',
|
||||
'doNotFlipLocalVideo',
|
||||
@@ -172,12 +177,14 @@ export default [
|
||||
'maxFullResolutionParticipants',
|
||||
'mouseMoveCallbackInterval',
|
||||
'notifications',
|
||||
'notificationTimeouts',
|
||||
'openSharedDocumentOnJoin',
|
||||
'opusMaxAverageBitrate',
|
||||
'p2p',
|
||||
'pcStatsInterval',
|
||||
'preferH264',
|
||||
'preferredCodec',
|
||||
'prejoinConfig',
|
||||
'prejoinPageEnabled',
|
||||
'requireDisplayName',
|
||||
'remoteVideoMenu',
|
||||
@@ -198,6 +205,7 @@ export default [
|
||||
'testing',
|
||||
'toolbarButtons',
|
||||
'toolbarConfig',
|
||||
'transcribingEnabled',
|
||||
'useHostPageLocalStorage',
|
||||
'useTurnUdp',
|
||||
'videoQuality',
|
||||
|
||||
@@ -26,7 +26,6 @@ export default [
|
||||
'DISPLAY_WELCOME_PAGE_CONTENT',
|
||||
'ENABLE_DIAL_OUT',
|
||||
'ENABLE_FEEDBACK_ANIMATION',
|
||||
'ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT',
|
||||
'FILM_STRIP_MAX_HEIGHT',
|
||||
'GENERATE_ROOMNAMES_ON_WELCOME_PAGE',
|
||||
'HIDE_INVITE_MORE_HEADER',
|
||||
|
||||
@@ -125,6 +125,12 @@ function _setConfig({ dispatch, getState }, next, action) {
|
||||
}));
|
||||
}
|
||||
|
||||
if (action.config.disableSelfView) {
|
||||
dispatch(updateSettings({
|
||||
disableSelfView: true
|
||||
}));
|
||||
}
|
||||
|
||||
dispatch(updateConfig(config));
|
||||
|
||||
// FIXME On Web we rely on the global 'config' variable which gets altered
|
||||
|
||||
@@ -282,6 +282,13 @@ function _translateLegacyConfig(oldValue: Object) {
|
||||
};
|
||||
}
|
||||
|
||||
newValue.prejoinConfig = oldValue.prejoinConfig || {};
|
||||
if (oldValue.hasOwnProperty('prejoinPageEnabled')
|
||||
&& !newValue.prejoinConfig.hasOwnProperty('enabled')
|
||||
) {
|
||||
newValue.prejoinConfig.enabled = oldValue.prejoinPageEnabled;
|
||||
}
|
||||
|
||||
newValue.disabledSounds = newValue.disabledSounds || [];
|
||||
|
||||
if (oldValue.disableJoinLeaveSounds) {
|
||||
@@ -320,6 +327,24 @@ function _translateLegacyConfig(oldValue: Object) {
|
||||
newValue.e2ee.e2eeLabels = oldValue.e2eeLabels;
|
||||
}
|
||||
|
||||
if (oldValue.defaultLocalDisplayName === undefined
|
||||
&& typeof interfaceConfig === 'object'
|
||||
&& interfaceConfig.hasOwnProperty('DEFAULT_LOCAL_DISPLAY_NAME')) {
|
||||
newValue.defaultLocalDisplayName = interfaceConfig.DEFAULT_LOCAL_DISPLAY_NAME;
|
||||
}
|
||||
|
||||
newValue.defaultLocalDisplayName
|
||||
= newValue.defaultLocalDisplayName || 'me';
|
||||
|
||||
if (oldValue.defaultRemoteDisplayName === undefined
|
||||
&& typeof interfaceConfig === 'object'
|
||||
&& interfaceConfig.hasOwnProperty('DEFAULT_REMOTE_DISPLAY_NAME')) {
|
||||
newValue.defaultRemoteDisplayName = interfaceConfig.DEFAULT_REMOTE_DISPLAY_NAME;
|
||||
}
|
||||
|
||||
newValue.defaultRemoteDisplayName
|
||||
= newValue.defaultRemoteDisplayName || 'Fellow Jitster';
|
||||
|
||||
return newValue;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
|
||||
import UIEvents from '../../../../service/UI/UIEvents';
|
||||
import { processExternalDeviceRequest } from '../../device-selection';
|
||||
import { showNotification, showWarningNotification } from '../../notifications';
|
||||
import {
|
||||
NOTIFICATION_TIMEOUT_TYPE,
|
||||
showNotification,
|
||||
showWarningNotification
|
||||
} from '../../notifications';
|
||||
import { replaceAudioTrackById, replaceVideoTrackById, setDeviceStatusWarning } from '../../prejoin/actions';
|
||||
import { isPrejoinPageVisible } from '../../prejoin/functions';
|
||||
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../app';
|
||||
@@ -50,8 +54,6 @@ const JITSI_TRACK_ERROR_TO_MESSAGE_KEY_MAP = {
|
||||
}
|
||||
};
|
||||
|
||||
const WARNING_DISPLAY_TIMER = 4000;
|
||||
|
||||
/**
|
||||
* A listener for device permissions changed reported from lib-jitsi-meet.
|
||||
*/
|
||||
@@ -134,7 +136,7 @@ MiddlewareRegistry.register(store => next => action => {
|
||||
description: additionalCameraErrorMsg,
|
||||
descriptionKey: cameraErrorMsg,
|
||||
titleKey
|
||||
}, WARNING_DISPLAY_TIMER));
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));
|
||||
|
||||
if (isPrejoinPageVisible(store.getState())) {
|
||||
store.dispatch(setDeviceStatusWarning(titleKey));
|
||||
@@ -163,7 +165,7 @@ MiddlewareRegistry.register(store => next => action => {
|
||||
description: additionalMicErrorMsg,
|
||||
descriptionKey: micErrorMsg,
|
||||
titleKey
|
||||
}, WARNING_DISPLAY_TIMER));
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));
|
||||
|
||||
if (isPrejoinPageVisible(store.getState())) {
|
||||
store.dispatch(setDeviceStatusWarning(titleKey));
|
||||
@@ -296,9 +298,9 @@ function _checkAndNotifyForNewDevice(store, newDevices, oldDevices) {
|
||||
dispatch(showNotification({
|
||||
description,
|
||||
titleKey,
|
||||
customActionNameKey: 'notify.newDeviceAction',
|
||||
customActionHandler: _useDevice.bind(undefined, store, devicesArray)
|
||||
}));
|
||||
customActionNameKey: [ 'notify.newDeviceAction' ],
|
||||
customActionHandler: [ _useDevice.bind(undefined, store, devicesArray) ]
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -94,11 +94,7 @@ export function isSupportedBrowser() {
|
||||
return false;
|
||||
}
|
||||
|
||||
// We are intentionally allow mobile browsers because:
|
||||
// - the WelcomePage is mobile ready;
|
||||
// - if the URL points to a conference then deep-linking will take
|
||||
// care of it.
|
||||
return isMobileBrowser() || JitsiMeetJS.isWebRtcSupported();
|
||||
return isMobileBrowser() ? isSupportedMobileBrowser() : JitsiMeetJS.isWebRtcSupported();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -108,9 +104,8 @@ export function isSupportedBrowser() {
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isSupportedMobileBrowser() {
|
||||
return (Platform.OS === 'android' && browser.isChromiumBased())
|
||||
|| (Platform.OS === 'android' && browser.isFirefox())
|
||||
|| (Platform.OS === 'ios' && browser.isWebKitBased());
|
||||
return (Platform.OS === 'android' && browser.isSupportedAndroidBrowser())
|
||||
|| (Platform.OS === 'ios' && browser.isSupportedIOSBrowser());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -98,6 +98,12 @@ export const IOS_SCREENSHARING_ENABLED = 'ios.screensharing.enabled';
|
||||
*/
|
||||
export const ANDROID_SCREENSHARING_ENABLED = 'android.screensharing.enabled';
|
||||
|
||||
/**
|
||||
* Flag indicating if speaker statistics should be enabled.
|
||||
* Default: enabled (true).
|
||||
*/
|
||||
export const SPEAKERSTATS_ENABLED = 'speakerstats.enabled';
|
||||
|
||||
/**
|
||||
* Flag indicating if kickout is enabled.
|
||||
* Default: enabled (true).
|
||||
|
||||
@@ -1,3 +1,14 @@
|
||||
|
||||
/**
|
||||
* The type of (redux) action to adjust the availability of the local audio.
|
||||
*
|
||||
* {
|
||||
* type: SET_AUDIO_AVAILABLE,
|
||||
* muted: boolean
|
||||
* }
|
||||
*/
|
||||
export const SET_AUDIO_AVAILABLE = 'SET_AUDIO_AVAILABLE';
|
||||
|
||||
/**
|
||||
* The type of (redux) action to set the muted state of the local audio.
|
||||
*
|
||||
@@ -9,14 +20,14 @@
|
||||
export const SET_AUDIO_MUTED = 'SET_AUDIO_MUTED';
|
||||
|
||||
/**
|
||||
* The type of (redux) action to adjust the availability of the local audio.
|
||||
* The type of (redux) action to enable/disable the audio mute icon.
|
||||
*
|
||||
* {
|
||||
* type: SET_AUDIO_AVAILABLE,
|
||||
* muted: boolean
|
||||
* type: SET_AUDIO_UNMUTE_PERMISSIONS,
|
||||
* blocked: boolean
|
||||
* }
|
||||
*/
|
||||
export const SET_AUDIO_AVAILABLE = 'SET_AUDIO_AVAILABLE';
|
||||
export const SET_AUDIO_UNMUTE_PERMISSIONS = 'SET_AUDIO_UNMUTE_PERMISSIONS';
|
||||
|
||||
/**
|
||||
* The type of (redux) action to set the facing mode of the local video camera
|
||||
@@ -61,6 +72,16 @@ export const SET_VIDEO_MUTED = 'SET_VIDEO_MUTED';
|
||||
*/
|
||||
export const STORE_VIDEO_TRANSFORM = 'STORE_VIDEO_TRANSFORM';
|
||||
|
||||
/**
|
||||
* The type of (redux) action to enable/disable the video mute icon.
|
||||
*
|
||||
* {
|
||||
* type: SET_VIDEO_UNMUTE_PERMISSIONS,
|
||||
* blocked: boolean
|
||||
* }
|
||||
*/
|
||||
export const SET_VIDEO_UNMUTE_PERMISSIONS = 'SET_VIDEO_UNMUTE_PERMISSIONS';
|
||||
|
||||
/**
|
||||
* The type of (redux) action to toggle the local video camera facing mode. In
|
||||
* contrast to SET_CAMERA_FACING_MODE, allows the toggling to be optimally
|
||||
|
||||
@@ -9,9 +9,11 @@ import { isModerationNotificationDisplayed } from '../../notifications';
|
||||
import {
|
||||
SET_AUDIO_MUTED,
|
||||
SET_AUDIO_AVAILABLE,
|
||||
SET_AUDIO_UNMUTE_PERMISSIONS,
|
||||
SET_CAMERA_FACING_MODE,
|
||||
SET_VIDEO_AVAILABLE,
|
||||
SET_VIDEO_MUTED,
|
||||
SET_VIDEO_UNMUTE_PERMISSIONS,
|
||||
STORE_VIDEO_TRANSFORM,
|
||||
TOGGLE_CAMERA_FACING_MODE
|
||||
} from './actionTypes';
|
||||
@@ -59,6 +61,19 @@ export function setAudioMuted(muted: boolean, ensureTrack: boolean = false) {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Action to disable/enable the audio mute icon.
|
||||
*
|
||||
* @param {boolean} blocked - True if the audio mute icon needs to be disabled.
|
||||
* @returns {Function}
|
||||
*/
|
||||
export function setAudioUnmutePermissions(blocked: boolean) {
|
||||
return {
|
||||
type: SET_AUDIO_UNMUTE_PERMISSIONS,
|
||||
blocked
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Action to set the facing mode of the local camera.
|
||||
*
|
||||
@@ -136,6 +151,19 @@ export function setVideoMuted(
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Action to disable/enable the video mute icon.
|
||||
*
|
||||
* @param {boolean} blocked - True if the video mute icon needs to be disabled.
|
||||
* @returns {Function}
|
||||
*/
|
||||
export function setVideoUnmutePermissions(blocked: boolean) {
|
||||
return {
|
||||
type: SET_VIDEO_UNMUTE_PERMISSIONS,
|
||||
blocked
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an action to store the last video {@link Transform} applied to a
|
||||
* stream.
|
||||
|
||||
@@ -88,6 +88,16 @@ export function getStartWithVideoMuted(stateful: Object | Function) {
|
||||
return Boolean(getPropertyValue(stateful, 'startWithVideoMuted', START_WITH_AUDIO_VIDEO_MUTED_SOURCES));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether video is currently muted.
|
||||
*
|
||||
* @param {Function|Object} stateful - The redux store, state, or {@code getState} function.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isVideoMuted(stateful: Function | Object) {
|
||||
return Boolean(toState(stateful)['features/base/media'].video.muted);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether video is currently muted by the user authority.
|
||||
*
|
||||
|
||||
@@ -8,15 +8,31 @@ import {
|
||||
sendAnalytics
|
||||
} from '../../analytics';
|
||||
import { APP_STATE_CHANGED } from '../../mobile/background';
|
||||
import {
|
||||
NOTIFICATION_TIMEOUT_TYPE,
|
||||
showWarningNotification
|
||||
} from '../../notifications';
|
||||
import { isForceMuted } from '../../participants-pane/functions';
|
||||
import { isScreenMediaShared } from '../../screen-share/functions';
|
||||
import { SET_AUDIO_ONLY, setAudioOnly } from '../audio-only';
|
||||
import { isRoomValid, SET_ROOM } from '../conference';
|
||||
import { getLocalParticipant } from '../participants';
|
||||
import { MiddlewareRegistry } from '../redux';
|
||||
import { getPropertyValue } from '../settings';
|
||||
import { isLocalVideoTrackDesktop, setTrackMuted, TRACK_ADDED } from '../tracks';
|
||||
import {
|
||||
destroyLocalTracks,
|
||||
isLocalTrackMuted,
|
||||
isLocalVideoTrackDesktop,
|
||||
setTrackMuted,
|
||||
TRACK_ADDED
|
||||
} from '../tracks';
|
||||
|
||||
import { SET_AUDIO_MUTED, SET_VIDEO_MUTED } from './actionTypes';
|
||||
import {
|
||||
SET_AUDIO_MUTED,
|
||||
SET_AUDIO_UNMUTE_PERMISSIONS,
|
||||
SET_VIDEO_MUTED,
|
||||
SET_VIDEO_UNMUTE_PERMISSIONS
|
||||
} from './actionTypes';
|
||||
import { setAudioMuted, setCameraFacingMode, setVideoMuted } from './actions';
|
||||
import {
|
||||
CAMERA_FACING_MODE,
|
||||
@@ -69,6 +85,21 @@ MiddlewareRegistry.register(store => next => action => {
|
||||
break;
|
||||
}
|
||||
|
||||
case SET_AUDIO_UNMUTE_PERMISSIONS: {
|
||||
const { blocked } = action;
|
||||
const state = store.getState();
|
||||
const tracks = state['features/base/tracks'];
|
||||
const isAudioMuted = isLocalTrackMuted(tracks, MEDIA_TYPE.AUDIO);
|
||||
|
||||
if (blocked && isAudioMuted) {
|
||||
store.dispatch(showWarningNotification({
|
||||
descriptionKey: 'notify.audioUnmuteBlockedDescription',
|
||||
titleKey: 'notify.audioUnmuteBlockedTitle'
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case SET_VIDEO_MUTED: {
|
||||
const state = store.getState();
|
||||
const participant = getLocalParticipant(state);
|
||||
@@ -78,6 +109,22 @@ MiddlewareRegistry.register(store => next => action => {
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case SET_VIDEO_UNMUTE_PERMISSIONS: {
|
||||
const { blocked } = action;
|
||||
const state = store.getState();
|
||||
const tracks = state['features/base/tracks'];
|
||||
const isVideoMuted = isLocalTrackMuted(tracks, MEDIA_TYPE.VIDEO);
|
||||
const isMediaShared = isScreenMediaShared(state);
|
||||
|
||||
if (blocked && isVideoMuted && !isMediaShared) {
|
||||
store.dispatch(showWarningNotification({
|
||||
descriptionKey: 'notify.videoUnmuteBlockedDescription',
|
||||
titleKey: 'notify.videoUnmuteBlockedTitle'
|
||||
}, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return next(action);
|
||||
@@ -217,6 +264,10 @@ function _setRoom({ dispatch, getState }, next, action) {
|
||||
|
||||
dispatch(setAudioOnly(audioOnly, false));
|
||||
|
||||
if (!roomIsValid) {
|
||||
dispatch(destroyLocalTracks());
|
||||
}
|
||||
|
||||
return next(action);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,9 +7,11 @@ import { TRACK_REMOVED } from '../tracks/actionTypes';
|
||||
import {
|
||||
SET_AUDIO_AVAILABLE,
|
||||
SET_AUDIO_MUTED,
|
||||
SET_AUDIO_UNMUTE_PERMISSIONS,
|
||||
SET_CAMERA_FACING_MODE,
|
||||
SET_VIDEO_AVAILABLE,
|
||||
SET_VIDEO_MUTED,
|
||||
SET_VIDEO_UNMUTE_PERMISSIONS,
|
||||
STORE_VIDEO_TRANSFORM,
|
||||
TOGGLE_CAMERA_FACING_MODE
|
||||
} from './actionTypes';
|
||||
@@ -33,6 +35,7 @@ import { CAMERA_FACING_MODE } from './constants';
|
||||
*/
|
||||
export const _AUDIO_INITIAL_MEDIA_STATE = {
|
||||
available: true,
|
||||
unmuteBlocked: false,
|
||||
muted: false
|
||||
};
|
||||
|
||||
@@ -59,6 +62,12 @@ function _audio(state = _AUDIO_INITIAL_MEDIA_STATE, action) {
|
||||
muted: action.muted
|
||||
};
|
||||
|
||||
case SET_AUDIO_UNMUTE_PERMISSIONS:
|
||||
return {
|
||||
...state,
|
||||
unmuteBlocked: action.blocked
|
||||
};
|
||||
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
@@ -83,6 +92,7 @@ function _audio(state = _AUDIO_INITIAL_MEDIA_STATE, action) {
|
||||
*/
|
||||
export const _VIDEO_INITIAL_MEDIA_STATE = {
|
||||
available: true,
|
||||
unmuteBlocked: false,
|
||||
facingMode: CAMERA_FACING_MODE.USER,
|
||||
muted: 0,
|
||||
|
||||
@@ -126,6 +136,12 @@ function _video(state = _VIDEO_INITIAL_MEDIA_STATE, action) {
|
||||
muted: action.muted
|
||||
};
|
||||
|
||||
case SET_VIDEO_UNMUTE_PERMISSIONS:
|
||||
return {
|
||||
...state,
|
||||
unmuteBlocked: action.blocked
|
||||
};
|
||||
|
||||
case STORE_VIDEO_TRANSFORM:
|
||||
return _storeVideoTransform(state, action);
|
||||
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
// @flow
|
||||
|
||||
/**
|
||||
* Action type to set the ID of the active modal (or undefined if needs to be hidden).
|
||||
*/
|
||||
export const SET_ACTIVE_MODAL_ID = 'SET_ACTIVE_MODAL_ID';
|
||||
@@ -1,21 +0,0 @@
|
||||
// @flow
|
||||
|
||||
import { SET_ACTIVE_MODAL_ID } from './actionTypes';
|
||||
|
||||
/**
|
||||
* Action to set the ID of the active modal (or undefined if needs to be hidden).
|
||||
*
|
||||
* @param {string} activeModalId - The new modal ID or undefined.
|
||||
* @param {Object} modalProps - The props to pass to the modal.
|
||||
* @returns {{
|
||||
* activeModalId: string,
|
||||
* type: SET_ACTIVE_MODAL_ID
|
||||
* }}
|
||||
*/
|
||||
export function setActiveModalId(activeModalId: ?string, modalProps: Object = {}) {
|
||||
return {
|
||||
activeModalId,
|
||||
modalProps,
|
||||
type: SET_ACTIVE_MODAL_ID
|
||||
};
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user