Compare commits

..

24 Commits

Author SHA1 Message Date
Horatiu Muresan
9be0ee3bda fix(hangup-button) Add to notify toolbar button clicked 2022-04-20 13:24:08 -05:00
Hristo Terezov
e367621e91 fix(prejoin):Disable device selection on iosSafari
It seems that showing the device selection dialog on ios Safari will
leads to not working audio. This is temporary fix until we find out
better solution.
2022-04-19 16:30:24 -05:00
Saúl Ibarra Corretgé
ea57ab1c2a chore(deps) update lib-jitsi-meet 2022-04-05 16:38:34 +02:00
Calin Chitu
a274e3a3de feat(polls/web) fixed issue with duplicating value to next input on keypress 2022-04-05 11:54:16 +02:00
Mihaela Dumitru
41e790771f fix(salesforce) use salesforce only in the main room (#11245) (#11316) 2022-04-05 10:47:34 +03:00
Saúl Ibarra Corretgé
331bd2014b Revert "fix(salesforce) use salesforce only in the main room (#11286)"
This reverts commit bd994f2103.
2022-04-05 08:52:13 +02:00
Horatiu Muresan
a27948b3af fix(background-alpha) Fix setting background opacity 2022-04-04 17:18:37 +03:00
Avram Tudor
43beb627a2 fix(highlights) allow highlighting moments if recording is running (#11301) 2022-04-04 12:08:47 +03:00
Mihaela Dumitru
bd994f2103 fix(salesforce) use salesforce only in the main room (#11286)
* fix(salesforce) use salesforce only in the main room (#11245)

* chore(deps) lib-jitsi-meet@latest (#11284)

https://github.com/jitsi/lib-jitsi-meet/compare/v1408.0.0+7e997fb7...v1409.0.0+88378583

Co-authored-by: Saúl Ibarra Corretgé <saghul@jitsi.org>
2022-04-04 08:24:41 +03:00
Robert Pintilii
6a3755f5d6 fix(thumbnails) Fix recalculate tile dimensions on client resize (#11267)
Recalculate after new dimensions are in the store
Fixes issue where on participant pane toggle the tiles would not recalculate correctly
# Conflicts:
#	react/features/filmstrip/middleware.web.js
2022-03-31 12:16:22 +03:00
Avram Tudor
97f355ec22 fix(highlight) set highlight button visibility based on record button… (#11215)
* fix(highlight) set highlight button visibility based on record button props

* code review

* code review

* code review

* code review
2022-03-31 10:32:18 +03:00
Avram Tudor
79fe929eb7 fix(highlight) implement custom notification for highlight start recording (#11217) 2022-03-31 10:32:07 +03:00
Avram Tudor
ef2a490961 fix(face-centering) fix face centering on browsers with no offscreencanvas support (#11234) 2022-03-31 10:31:19 +03:00
Robert Pintilii
3bbba6f305 fix(context-menu) Don't overwrite hidden prop (#11265)
Fixes issue where the menu would disappear on dominant speaker change
2022-03-31 10:26:29 +03:00
Robert Pintilii
7a573fd580 feat(external-api) Add grantModerator command (#11199) 2022-03-31 10:25:11 +03:00
Jaya Allamsetty
1484e0fd0b Revert "fix(screenshare) Add and then mute the camera track after SS stops instead of not adding the track."
This workaround is not needed anymore since P2P is disabled between plan-b and unified-plan clients.
Fixes https://github.com/jitsi/jitsi-meet/issues/11131

This reverts commit c30038236a.
2022-03-29 11:14:19 -04:00
Saúl Ibarra Corretgé
2909176a73 fix(overlay) fix not showing the correct gUM helper text 2022-03-24 15:13:43 +01:00
Avram Tudor
64d3faa52a fix(highlight) fix notifications not disappearing (#11183) 2022-03-23 16:35:21 +02:00
Avram Tudor
842755674a fix(highlight) display option to start recording (#11146)
Fix incorrect handling of error case when highlighting moments
Allow users to start recording when trying to highlight while recording not started
2022-03-23 16:35:13 +02:00
Robert Pintilii
c007a6194e fix(chat) Fix iOS web chat (#11193)
Fixes: on iOS web the chat input would move from the bottom when the keyboard was open
2022-03-22 11:08:16 -05:00
Robert Pintilii
71a8d7937c fix(settings-dialog) Fix crash (#11191)
Fixes crash when the participant becomes moderator while the dialog is open
2022-03-22 11:08:16 -05:00
Hristo Terezov
10785cb1c7 fix(shared-video): Can't click controls issue
The Dominant speaker name badge was overlaping the shared video
controls  (audio level, play/pause, etc).
2022-03-21 17:23:01 -05:00
Avram Tudor
5cdee7d989 fix(recording) fix incorrect condition for recording notification message (#11167) 2022-03-21 14:04:33 -05:00
Robert Pintilii
b2d8a6115a fix(video-constraints) Fix calculations (#11161)
Only calculate for Large Video on the web (otherwise native breaks)
Take preferred max into calculations
2022-03-21 14:04:02 -05:00
430 changed files with 5544 additions and 9663 deletions

View File

@@ -8,7 +8,7 @@ libs/*
resources/*
react/features/stream-effects/virtual-background/vendor/*
load-test/*
react/features/face-landmarks/resources/*
react/features/facial-recognition/resources/*
# ESLint will by default ignore its own configuration file. However, there does
# not seem to be a reason why we will want to risk being inconsistent with our
@@ -16,4 +16,4 @@ react/features/face-landmarks/resources/*
!.eslintrc.js
# Not worth it.
actionTypes.ts
actionTypes.js

View File

@@ -16,8 +16,10 @@ jobs:
run: git status
- name: Normalize lang files to ensure sorted
run: npm run lang-sort
- name: Check git diff
run: git diff
- name: Check if the git repository is clean
run: $(exit $(git status --porcelain --untracked-files=no | head -255 | wc -l)) || (echo "Dirty git tree"; git diff; exit 1)
run: exit $( git status --porcelain --untracked-files=no | head -255 | wc -l )
- run: npm run lint
- run: for file in lang/*.json; do npx --yes jsonlint -q $file || exit 1; done
- run: make

View File

@@ -3,8 +3,8 @@ We would love to have your help. Before you start working however, please read
and follow this short guide.
# Reporting Issues
Provide as much information as possible. Mention the version of Jitsi Meet,
Jicofo and JVB you are using, and explain (as detailed as you can) how the
Provide as much information as possible. Mention the version of Jitsi Meet,
Jicofo and JVB you are using, and explain (as detailed as you can) how the
problem can be reproduced.
# Code contributions
@@ -130,7 +130,7 @@ When adding a new feature, this would be the usual layout.
```
react/features/sample/
├── actionTypes.ts
├── actionTypes.js
├── actions.js
├── components
│   ├── AnotherComponent.js

View File

@@ -8,7 +8,7 @@ TF_WASM_DIR = node_modules/@tensorflow/tfjs-backend-wasm/dist/
RNNOISE_WASM_DIR = node_modules/rnnoise-wasm/dist
TFLITE_WASM = react/features/stream-effects/virtual-background/vendor/tflite
MEET_MODELS_DIR = react/features/stream-effects/virtual-background/vendor/models
FACE_MODELS_DIR = node_modules/@vladmandic/face-api/model
FACIAL_MODELS_DIR = react/features/facial-recognition/resources
NODE_SASS = ./node_modules/.bin/sass
NPM = npm
OUTPUT_DIR = .
@@ -30,7 +30,7 @@ clean:
rm -fr $(BUILD_DIR)
.NOTPARALLEL:
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm deploy-tf-wasm deploy-css deploy-local deploy-face-landmarks
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm deploy-tf-wasm deploy-css deploy-local deploy-facial-expressions
deploy-init:
rm -fr $(DEPLOY_DIR)
@@ -53,8 +53,10 @@ deploy-appbundle:
$(OUTPUT_DIR)/analytics-ga.js \
$(BUILD_DIR)/analytics-ga.min.js \
$(BUILD_DIR)/analytics-ga.min.js.map \
$(BUILD_DIR)/face-landmarks-worker.min.js \
$(BUILD_DIR)/face-landmarks-worker.min.js.map \
$(BUILD_DIR)/face-centering-worker.min.js \
$(BUILD_DIR)/face-centering-worker.min.js.map \
$(BUILD_DIR)/facial-expressions-worker.min.js \
$(BUILD_DIR)/facial-expressions-worker.min.js.map \
$(DEPLOY_DIR)
cp \
$(BUILD_DIR)/close3.min.js \
@@ -101,12 +103,9 @@ deploy-meet-models:
$(MEET_MODELS_DIR)/*.tflite \
$(DEPLOY_DIR)
deploy-face-landmarks:
deploy-facial-expressions:
cp \
$(FACE_MODELS_DIR)/tiny_face_detector_model-weights_manifest.json \
$(FACE_MODELS_DIR)/tiny_face_detector_model.bin \
$(FACE_MODELS_DIR)/face_expression_model-weights_manifest.json \
$(FACE_MODELS_DIR)/face_expression_model.bin \
$(FACIAL_MODELS_DIR)/* \
$(DEPLOY_DIR)
deploy-css:
@@ -118,7 +117,7 @@ deploy-local:
([ ! -x deploy-local.sh ] || ./deploy-local.sh)
.NOTPARALLEL:
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm deploy-tf-wasm deploy-face-landmarks
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm deploy-tf-wasm deploy-facial-expressions
$(WEBPACK_DEV_SERVER)
source-package:

View File

@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
android:insetTop="@dimen/abc_edit_text_inset_top_material"
android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">
<selector>
<!--
This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I).
The item below with state_pressed="false" and state_focused="false" causes a NullPointerException.
NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)'
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
For more info, see https://bit.ly/3CdLStv (react-native/pull/29452) and https://bit.ly/3nxOMoR.
-->
<item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
<item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
</selector>
</inset>

View File

@@ -2,7 +2,6 @@
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
<item name="android:navigationBarColor">@color/colorPrimaryDark</item>
<item name="android:windowDisablePreview">true</item>
</style>

View File

@@ -9,7 +9,7 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx1024m -XX:MaxPermSize=256m
# Default value: -Xmx10248m -XX:MaxPermSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
@@ -26,5 +26,5 @@ android.useAndroidX=true
android.enableJetifier=true
android.bundle.enableUncompressedNativeLibs=false
appVersion=22.2.0
sdkVersion=5.1.0
appVersion=22.1.0
sdkVersion=5.0.0

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -50,8 +50,7 @@ dependencies {
api 'com.facebook.react:react-native:+'
//noinspection GradleDynamicVersion
implementation 'org.webkit:android-jsc:+'
implementation 'com.facebook.fresco:animated-gif:2.5.0'
implementation 'com.dropbox.core:dropbox-core-sdk:4.0.1'
implementation 'com.jakewharton.timber:timber:4.7.1'
implementation 'com.squareup.duktape:duktape-android:1.3.0'
@@ -81,7 +80,6 @@ dependencies {
implementation project(':react-native-default-preference')
implementation project(':react-native-gesture-handler')
implementation project(':react-native-get-random-values')
implementation project(':react-native-giphy')
implementation project(':react-native-immersive')
implementation project(':react-native-keep-awake')
implementation project(':react-native-masked-view_masked-view')

View File

@@ -20,7 +20,6 @@ package org.jitsi.meet.sdk;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -94,7 +93,7 @@ public abstract class BaseReactView<ListenerT>
* inspired by postis which we use on Web for the similar purposes of the
* iframe-based external API.
*/
protected String externalAPIScope;
protected final String externalAPIScope;
/**
* The listener (e.g. {@link JitsiMeetViewListener}) instance for reporting
@@ -110,17 +109,16 @@ public abstract class BaseReactView<ListenerT>
public BaseReactView(@NonNull Context context) {
super(context);
initialize((Activity)context);
}
public BaseReactView(Context context, AttributeSet attrs) {
super(context, attrs);
initialize((Activity)context);
}
setBackgroundColor(BACKGROUND_COLOR);
public BaseReactView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initialize((Activity)context);
ReactInstanceManagerHolder.initReactInstanceManager((Activity)context);
// Hook this BaseReactView into ExternalAPI.
externalAPIScope = UUID.randomUUID().toString();
synchronized (views) {
views.add(this);
}
}
/**
@@ -225,16 +223,4 @@ public abstract class BaseReactView<ListenerT>
public void setListener(ListenerT listener) {
this.listener = listener;
}
private void initialize(Activity activity) {
setBackgroundColor(BACKGROUND_COLOR);
ReactInstanceManagerHolder.initReactInstanceManager(activity);
// Hook this BaseReactView into ExternalAPI.
externalAPIScope = UUID.randomUUID().toString();
synchronized (views) {
views.add(this);
}
}
}

View File

@@ -16,7 +16,6 @@
package org.jitsi.meet.sdk;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -33,16 +32,11 @@ import com.facebook.react.modules.core.PermissionListener;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.util.HashMap;
import android.app.Activity;
/**
* A base activity for SDK users to embed. It contains all the required wiring
* between the {@code JitsiMeetView} and the Activity lifecycle methods.
*
* In this activity we use a single {@code JitsiMeetView} instance. This
* instance gives us access to a view which displays the welcome page and the
* conference itself. All lifecycle methods associated with this Activity are
* hooked to the React Native subsystem via proxy calls through the
* {@code JitsiMeetActivityDelegate} static methods.
* A base activity for SDK users to embed. It uses {@link JitsiMeetFragment} to do the heavy
* lifting and wires the remaining Activity lifecycle methods so it works out of the box.
*/
public class JitsiMeetActivity extends AppCompatActivity
implements JitsiMeetActivityInterface {
@@ -58,12 +52,6 @@ public class JitsiMeetActivity extends AppCompatActivity
onBroadcastReceived(intent);
}
};
/**
* Instance of the {@link JitsiMeetView} which this activity will display.
*/
private JitsiMeetView jitsiView;
// Helpers for starting the activity
//
@@ -91,7 +79,6 @@ public class JitsiMeetActivity extends AppCompatActivity
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jitsi_meet);
this.jitsiView = findViewById(R.id.jitsiView);
registerForBroadcastMessages();
@@ -100,18 +87,6 @@ public class JitsiMeetActivity extends AppCompatActivity
}
}
@Override
public void onResume() {
super.onResume();
JitsiMeetActivityDelegate.onHostResume(this);
}
@Override
public void onStop() {
JitsiMeetActivityDelegate.onHostPause(this);
super.onStop();
}
@Override
public void onDestroy() {
// Here we are trying to handle the following corner case: an application using the SDK
@@ -122,9 +97,6 @@ public class JitsiMeetActivity extends AppCompatActivity
// be operational so the external API won't be able to notify the native side that the
// conference terminated. Thus, try our best to clean up.
leave();
this.jitsiView = null;
if (AudioModeModule.useConnectionService()) {
ConnectionService.abortConnections();
}
@@ -132,8 +104,6 @@ public class JitsiMeetActivity extends AppCompatActivity
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);
JitsiMeetActivityDelegate.onHostDestroy(this);
super.onDestroy();
}
@@ -148,7 +118,9 @@ public class JitsiMeetActivity extends AppCompatActivity
//
protected JitsiMeetView getJitsiView() {
return jitsiView;
JitsiMeetFragment fragment
= (JitsiMeetFragment) getSupportFragmentManager().findFragmentById(R.id.jitsiFragment);
return fragment != null ? fragment.getJitsiView() : null;
}
public void join(@Nullable String url) {
@@ -160,16 +132,20 @@ public class JitsiMeetActivity extends AppCompatActivity
}
public void join(JitsiMeetConferenceOptions options) {
if (this.jitsiView != null) {
this.jitsiView .join(options);
JitsiMeetView view = getJitsiView();
if (view != null) {
view.join(options);
} else {
JitsiMeetLogger.w("Cannot join, view is null");
}
}
public void leave() {
if (this.jitsiView != null) {
this.jitsiView .leave();
JitsiMeetView view = getJitsiView();
if (view != null) {
view.leave();
} else {
JitsiMeetLogger.w("Cannot leave, view is null");
}
@@ -276,8 +252,10 @@ public class JitsiMeetActivity extends AppCompatActivity
@Override
protected void onUserLeaveHint() {
if (this.jitsiView != null) {
this.jitsiView .enterPictureInPicture();
JitsiMeetView view = getJitsiView();
if (view != null) {
view.enterPictureInPicture();
}
}

View File

@@ -17,6 +17,7 @@
package org.jitsi.meet.sdk;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -36,10 +37,7 @@ import android.view.ViewGroup;
* conference itself. All lifecycle methods associated with this Fragment are
* hooked to the React Native subsystem via proxy calls through the
* {@code JitsiMeetActivityDelegate} static methods.
*
* @deprecated use {@link JitsiMeetActivity} or directly {@link JitsiMeetView}
*/
@Deprecated
public class JitsiMeetFragment extends Fragment {
/**

View File

@@ -51,20 +51,11 @@ public class JitsiMeetOngoingConferenceService extends Service
intent.setAction(Action.START.getName());
ComponentName componentName;
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
componentName = context.startForegroundService(intent);
} else {
componentName = context.startService(intent);
}
} catch (RuntimeException e) {
// Avoid crashing due to ForegroundServiceStartNotAllowedException (API level 31).
// See: https://developer.android.com/guide/components/foreground-services#background-start-restrictions
JitsiMeetLogger.w(TAG + " Ongoing conference service not started", e);
return;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
componentName = context.startForegroundService(intent);
} else {
componentName = context.startService(intent);
}
if (componentName == null) {
JitsiMeetLogger.w(TAG + " Ongoing conference service not started");
}

View File

@@ -18,8 +18,6 @@ package org.jitsi.meet.sdk;
import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -30,6 +28,7 @@ import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.lang.reflect.Method;
import java.util.Map;
public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
implements OngoingConferenceTracker.OngoingConferenceListener {
@@ -96,17 +95,14 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
public JitsiMeetView(@NonNull Context context) {
super(context);
initialize(context);
}
public JitsiMeetView(Context context, AttributeSet attrs) {
super(context, attrs);
initialize(context);
}
// Check if the parent Activity implements JitsiMeetActivityInterface,
// otherwise things may go wrong.
if (!(context instanceof JitsiMeetActivityInterface)) {
throw new RuntimeException("Enclosing Activity must implement JitsiMeetActivityInterface");
}
public JitsiMeetView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initialize(context);
OngoingConferenceTracker.getInstance().addListener(this);
}
@Override
@@ -211,14 +207,4 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
dispose();
super.onDetachedFromWindow();
}
private void initialize(@NonNull Context context) {
// Check if the parent Activity implements JitsiMeetActivityInterface,
// otherwise things may go wrong.
if (!(context instanceof JitsiMeetActivityInterface)) {
throw new RuntimeException("Enclosing Activity must implement JitsiMeetActivityInterface");
}
OngoingConferenceTracker.getInstance().addListener(this);
}
}

View File

@@ -110,7 +110,6 @@ class ReactInstanceManagerHolder {
new com.corbt.keepawake.KCKeepAwakePackage(),
new com.facebook.react.shell.MainReactPackage(),
new com.reactnativecommunity.clipboard.ClipboardPackage(),
new com.giphyreactnativesdk.GiphyReactNativeSdkPackage(),
new com.reactnativecommunity.netinfo.NetInfoPackage(),
new com.reactnativepagerview.PagerViewPackage(),
new com.oblador.performance.PerformancePackage(),

View File

@@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/jitsi_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".JitsiMeetActivity">
<org.jitsi.meet.sdk.JitsiMeetView
android:id="@+id/jitsiView"
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"
android:name="org.jitsi.meet.sdk.JitsiMeetFragment"
android:id="@+id/jitsiFragment"/>
</FrameLayout>

View File

@@ -21,8 +21,6 @@ include ':react-native-gesture-handler'
project(':react-native-gesture-handler').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-gesture-handler/android')
include ':react-native-get-random-values'
project(':react-native-get-random-values').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-get-random-values/android')
include ':react-native-giphy'
project(':react-native-giphy').projectDir = new File(rootProject.projectDir, '../node_modules/@giphy/react-native-sdk/android')
include ':react-native-google-signin'
project(':react-native-google-signin').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-google-signin/google-signin/android')
include ':react-native-immersive'

View File

@@ -37,7 +37,6 @@ import {
commonUserLeftHandling,
conferenceFailed,
conferenceJoined,
conferenceJoinInProgress,
conferenceLeft,
conferenceSubjectChanged,
conferenceTimestampChanged,
@@ -45,7 +44,6 @@ import {
conferenceWillJoin,
conferenceWillLeave,
dataChannelOpened,
e2eRttChanged,
getConferenceOptions,
kickedOut,
lockStateChanged,
@@ -54,11 +52,7 @@ import {
sendLocalParticipant,
nonParticipantMessageReceived
} from './react/features/base/conference';
import {
getReplaceParticipant,
getMultipleVideoSupportFeatureFlag,
getSourceNameSignalingFeatureFlag
} from './react/features/base/config/functions';
import { getReplaceParticipant, getMultipleVideoSupportFeatureFlag } from './react/features/base/config/functions';
import {
checkAndNotifyForNewDevice,
getAvailableDevices,
@@ -70,17 +64,16 @@ import {
} from './react/features/base/devices';
import {
browser,
isFatalJitsiConnectionError,
JitsiConferenceErrors,
JitsiConferenceEvents,
JitsiConnectionErrors,
JitsiConnectionEvents,
JitsiE2ePingEvents,
JitsiMediaDevicesEvents,
JitsiParticipantConnectionStatus,
JitsiTrackErrors,
JitsiTrackEvents
} from './react/features/base/lib-jitsi-meet';
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
import {
getStartWithAudioMuted,
getStartWithVideoMuted,
@@ -97,7 +90,6 @@ import {
dominantSpeakerChanged,
getLocalParticipant,
getNormalizedDisplayName,
getScreenshareParticipantByOwnerId,
localParticipantAudioLevelChanged,
localParticipantConnectionStatusChanged,
localParticipantRoleChanged,
@@ -107,7 +99,6 @@ import {
participantPresenceChanged,
participantRoleChanged,
participantUpdated,
screenshareParticipantDisplayNameChanged,
updateRemoteParticipantFeatures
} from './react/features/base/participants';
import {
@@ -149,7 +140,8 @@ import {
initPrejoin,
isPrejoinPageVisible,
makePrecallTest,
setJoiningInProgress
setJoiningInProgress,
setPrejoinPageVisibility
} from './react/features/prejoin';
import { disableReceiver, stopReceiver } from './react/features/remote-control';
import { setScreenAudioShareState, isScreenAudioShared } from './react/features/screen-share/';
@@ -1639,8 +1631,7 @@ export default {
// In case there was no local audio when screen sharing was started the fact that we set the audio stream to
// null will take care of the desktop audio stream cleanup.
} else if (this._desktopAudioStream) {
await room.replaceTrack(this._desktopAudioStream, null);
this._desktopAudioStream.dispose();
await this.useAudioStream(null);
this._desktopAudioStream = undefined;
}
@@ -1983,9 +1974,9 @@ export default {
} else {
// If no local stream is present ( i.e. no input audio devices) we use the screen share audio
// stream as we would use a regular stream.
logger.debug(`_switchToScreenSharing is using ${this._desktopAudioStream} for replacing it as`
+ ' the only audio track on the conference');
await room.replaceTrack(null, this._desktopAudioStream);
logger.debug(`_switchToScreenSharing is using ${this._desktopAudioStream} for useAudioStream`);
await this.useAudioStream(this._desktopAudioStream);
}
APP.store.dispatch(setScreenAudioShareState(true));
}
@@ -2074,9 +2065,9 @@ export default {
room.on(JitsiConferenceEvents.CONFERENCE_JOINED, () => {
this._onConferenceJoined();
});
room.on(
JitsiConferenceEvents.CONFERENCE_JOIN_IN_PROGRESS,
() => APP.store.dispatch(conferenceJoinInProgress(room)));
room.on(JitsiConferenceEvents.CONFERENCE_JOIN_IN_PROGRESS, () => {
APP.store.dispatch(setPrejoinPageVisibility(false));
});
room.on(
JitsiConferenceEvents.CONFERENCE_LEFT,
@@ -2264,17 +2255,6 @@ export default {
id,
name: formattedDisplayName
}));
if (getSourceNameSignalingFeatureFlag(state)) {
const screenshareParticipantId = getScreenshareParticipantByOwnerId(state, id)?.id;
if (screenshareParticipantId) {
APP.store.dispatch(
screenshareParticipantDisplayNameChanged(screenshareParticipantId, formattedDisplayName)
);
}
}
APP.API.notifyDisplayNameChanged(id, {
displayName: formattedDisplayName,
formattedDisplayName:
@@ -2363,10 +2343,6 @@ export default {
APP.store.dispatch(setVideoUnmutePermissions(disableVideoMuteChange));
});
room.on(
JitsiE2ePingEvents.E2E_RTT_CHANGED,
(...args) => APP.store.dispatch(e2eRttChanged(...args)));
APP.UI.addListener(UIEvents.AUDIO_MUTED, muted => {
this.muteAudio(muted);
});
@@ -3133,6 +3109,15 @@ export default {
room.sendEndpointMessage(to, payload);
},
/**
* Sends a facial expression as a string and its duration as a number
* @param {object} payload - Object containing the {string} facialExpression
* and {number} duration
*/
sendFacialExpression(payload) {
room.sendFacialExpression(payload);
},
/**
* Adds new listener.
* @param {String} eventName the name of the event

View File

@@ -1,11 +1,6 @@
/* eslint-disable no-unused-vars, no-var */
/*
* NOTE: If you add a new option please remember to document it here:
* https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-configuration
*/
var config = {
// Connection
//
@@ -74,11 +69,6 @@ var config = {
// or disabled for the screenshare.
// capScreenshareBitrate: 1 // 0 to disable - deprecated.
// Whether to use fake constraints (height: 99999, width: 99999) when calling getDisplayMedia on
// Chromium based browsers. This is intended as a workaround for
// https://bugs.chromium.org/p/chromium/issues/detail?id=1056311
// setScreenSharingResolutionConstraints: true
// Enable callstats only for a percentage of users.
// This takes a value between 0 and 100 which determines the probability for
// the callstats to be enabled.
@@ -89,10 +79,6 @@ var config = {
flags: {
// Enables source names in the signaling.
// sourceNameSignaling: false,
// Enables sending multiple video streams, i.e., camera and desktop tracks can be shared in the conference
// separately as two different streams instead of one composite stream.
// sendMultipleVideoStreams: false
},
// Disables moderator indicators.
@@ -619,7 +605,6 @@ var config = {
// 'help',
// 'highlight',
// 'invite',
// 'linktosalesforce',
// 'livestreaming',
// 'microphone',
// 'mute-everyone',
@@ -762,18 +747,18 @@ var config = {
// Enables sending participants' emails (if available) to callstats and other analytics
// enableEmailInStats: false,
// faceLandmarks: {
// Enables detecting faces of participants and get their expression and send it to other participants
// enableFacialRecognition: true,
// Enables displaying facial expressions in speaker stats
// enableDisplayFacialExpressions: true,
// faceCoordinatesSharing: {
// // Enables sharing your face cordinates. Used for centering faces within a video.
// enableFaceCentering: false,
// enabled: false,
// // Enables detecting face expressions and sharing data with other participants
// enableFaceExpressionsDetection: false,
// // Enables displaying face expressions in speaker stats
// enableDisplayFaceExpressions: false,
// // Minimum required face movement percentage threshold for sending new face centering coordinates data.
// faceCenteringThreshold: 10,
// // Minimum required face movement percentage threshold for sending new face coordinates data.
// threshold: 10,
// // Miliseconds for processing a new image capture in order to detect face coordinates if they exist.
// captureInterval: 100
@@ -964,18 +949,14 @@ var config = {
// Options related to end-to-end (participant to participant) ping.
// e2eping: {
// // Whether ene-to-end pings should be enabled.
// enabled: false,
// // The interval in milliseconds at which pings will be sent.
// // Defaults to 10000, set to <= 0 to disable.
// pingInterval: 10000,
//
// // The number of responses to wait for.
// numRequests: 5,
//
// // The max conference size in which e2e pings will be sent.
// maxConferenceSize: 200,
//
// // The maximum number of e2e ping messages per second for the whole conference to aim for.
// // This is used to contol the pacing of messages in order to reduce the load on the backend.
// maxMessagesPerSecond: 250
// // The interval in milliseconds at which analytics events
// // with the measured RTT will be sent. Defaults to 60000, set
// // to <= 0 to disable.
// analyticsInterval: 60000,
// },
// If set, will attempt to use the provided video input device label when
@@ -1322,10 +1303,6 @@ var config = {
// // Disables user resizable filmstrip. Also, allows configuration of the filmstrip
// // (width, tiles aspect ratios) through the interfaceConfig options.
// disableResizable: false,
// // Disables the stage filmstrip
// // (displaying multiple participants on stage besides the vertical filmstrip)
// disableStageFilmstrip: false
// },
// Tile view related config options.
@@ -1335,6 +1312,7 @@ var config = {
// numberOfVisibleTiles: 25
// },
// Specifies whether the chat emoticons are disabled or not
// disableChatSmileys: false,

View File

@@ -13,10 +13,10 @@ import {
import { openDialog } from './react/features/base/dialog/actions';
import { setJWT } from './react/features/base/jwt';
import {
isFatalJitsiConnectionError,
JitsiConnectionErrors,
JitsiConnectionEvents
} from './react/features/base/lib-jitsi-meet';
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
import { getCustomerDetails } from './react/features/jaas/actions.any';
import { isVpaasMeeting, getJaasJWT } from './react/features/jaas/functions';
import { setPrejoinDisplayNameRequired } from './react/features/prejoin/actions';

View File

@@ -4,12 +4,11 @@
text-align: center;
h2 {
font-size: 48px;
color : #f2f2f2;
font-size: 36px;
}
&__message {
font-size: 24px;
margin-top: 20px;
}
}
}

View File

@@ -28,7 +28,7 @@
/**
* Keep overflow menu within screen vertical bounds and make it scrollable.
*/
.toolbox-button-wth-dialog > div:nth-child(2) {
.toolbox-button-wth-dialog > div:nth-child(2) {
background: $menuBG;
max-height: calc(100vh - #{$newToolbarSizeWithPadding} - 46px);
margin-bottom: 4px;
@@ -36,22 +36,19 @@
overflow-y: auto;
}
/**
* Remove background color and box-shadow for the context menu container.
*/
.toolbox-button-wth-dialog.context-menu > div:nth-child(2) {
background: transparent;
box-shadow: none;
overflow-y: initial;
}
.audio-preview > div:nth-child(2),
.video-preview > div:nth-child(2) {
.video-preview > div:nth-child(2),
.reactions-menu-popup > div:nth-child(2) {
margin-bottom: 4px;
outline: none;
padding: 0;
}
.reactions-menu-popup > div:nth-child(2) {
margin-bottom: 6px;
box-shadow: none;
}
/**
* The following selectors keep the chat modal full-size anywhere between 100px
* and 580px for desktop or 680px for mobile.

View File

@@ -43,6 +43,18 @@ body {
outline: none;
}
/**
* AtlasKit sets a default margin on the rendered modals, so
* when the shift-right class is set when the chat opens, we
* pad the modal container in order for the modals to be centered
* while also taking the chat size into consideration.
*/
@media (min-width: 581px) {
.shift-right .atlaskit-portal > div:not(.Tooltip) {
padding-left: $sidebarWidth;
}
}
.jitsi-icon {
&-default svg {
fill: white;
@@ -152,6 +164,16 @@ form {
font-size: 12px;
}
/**
* Dialogs fade
*/
.aui-blanket {
background: #000;
transition: opacity 0.2s, visibility 0.2s;
transition-delay: 0.1s;
visibility: visible;
}
#inviteLinkRef {
-webkit-user-select: text;
user-select: text;

View File

@@ -1,20 +1,15 @@
#sideToolbarContainer {
background-color: $chatBackgroundColor;
flex-shrink: 0;
overflow: hidden;
position: relative;
transition: width .16s ease-in-out;
box-sizing: border-box;
color: #FFF;
height: 100%;
position: absolute;
top: 0;
width: $sidebarWidth;
z-index: $sideToolbarContainerZ;
@media (max-width: 580px) {
height: 100vh;
height: -webkit-fill-available;
left: 0;
position: fixed;
right: 0;
top: 0;
width: auto;
width: 100%;
}
}

50
css/_connection-info.scss Normal file
View File

@@ -0,0 +1,50 @@
%connection-info {
font-size: 12px;
font-weight: 400;
td {
padding: 2px 0;
}
}
.connection-info
{
@extend %connection-info;
> table {
white-space: nowrap;
@extend %connection-info;
}
td:nth-child(n-1) {
padding-left: 5px;
}
&__icon {
margin-right: 2px;
}
&__download
{
@extend .connection-info__icon;
}
&__status
{
font-weight: bold;
}
&__upload
{
@extend .connection-info__icon;
}
&__mobile {
margin: 15px;
}
.connection-actions {
margin: 10px auto;
text-align: center;
}
}

View File

@@ -193,17 +193,3 @@
@mixin transparentBg($color, $alpha) {
background-color: rgba(red($color), green($color), blue($color), $alpha);
}
/**
* Change the direction of the current element to LTR, but do not change the direction
* of its children; Keep them RTL.
*/
@mixin ltr {
body[dir=rtl] & {
direction: ltr;
& > * {
direction: rtl;
}
}
}

View File

@@ -6,6 +6,10 @@
transition: width .16s ease-in-out;
width: 315px;
z-index: $zindex0;
&--closed {
width: 0;
}
}
.participants_pane-content {
@@ -30,6 +34,11 @@
right: 0;
top: 0;
width: auto;
&--closed {
display: none;
width: auto;
}
}
.participants_pane-content {

View File

@@ -104,10 +104,6 @@
}
}
.reactions-menu-container {
padding-bottom: 6px;
}
.reactions-animations-container {
position: absolute;
width: 20%;
@@ -116,7 +112,8 @@
height: 0;
}
.reactions-menu-popup-container {
.reactions-menu-popup-container,
.reactions-menu-popup {
display: inline-block;
position: relative;
}

View File

@@ -60,15 +60,3 @@
}
}
}
.settings-button-small-icon-container {
position: absolute;
right: -4px;
top: -3px;
& .settings-button-small-icon {
position: relative;
top: 0;
right: 0;
}
}

View File

@@ -88,6 +88,10 @@
max-width: calc(100% - 24px);
}
.shift-right .details-container {
margin-left: calc(#{$sidebarWidth} / 2);
}
@keyframes hideSubject {
0% {
max-width: 100%;

View File

@@ -39,6 +39,13 @@
&.no-buttons {
display: none;
}
@media (min-width: 581px) {
&.shift-right {
margin-left: $sidebarWidth;
width: calc(100% - #{$sidebarWidth});
}
}
}
.toolbox-content {
@@ -92,10 +99,6 @@
max-width: 100%;
pointer-events: all;
border-radius: 6px;
.toolbox-content-items {
@include ltr;
}
}
.toolbox-content-wrapper::after {
@@ -180,7 +183,6 @@
}
.toolbox-content-items {
@include ltr;
border-radius: 0;
display: flex;
justify-content: space-evenly;

View File

@@ -6,7 +6,6 @@
}
#layout_wrapper {
@include ltr;
display: flex;
height: 100%;
}
@@ -45,6 +44,15 @@
position: relative;
text-align: center;
overflow: 'hidden';
@media (min-width: 581px) {
&.shift-right {
&#largeVideoContainer {
margin-left: $sidebarWidth;
width: calc(100% - #{$sidebarWidth});
}
}
}
}
#localVideoWrapper {

View File

@@ -0,0 +1,68 @@
.select2-container.aui-select2-container {
background-color: transparent !important;
margin-top: 2px;
a.select2-choice {
height: 28px !important;
line-height: 18px !important;
width: 100% !important;
background-color: $selectBg !important;
border-color: $selectBg !important;
color: $selectFontColor !important;
text-shadow: none !important;
font-size: 12px !important;
margin: 0 auto !important;
&:after {
border-top-color: $selectFontColor;
}
}
&.select2-dropdown-open{
a.select2-choice {
background-color: $selectActiveBg !important;
border-color: $selectActiveBg !important;
}
}
}
.select2-drop.aui-select2-drop.aui-style-default {
z-index: $dropdownZ;
background-color: $selectActiveBg;
border-color: $selectActiveBg;
.select2-results{
background-color: $selectActiveBg;
border-color: $selectActiveBg;
&::-webkit-scrollbar {
background-color: transparent;
}
&::-webkit-scrollbar-track {
background-color: transparent;
}
&::-webkit-scrollbar-track-piece {
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
background-color: $selectActiveItemBg;
}
.select2-result{
&.select2-highlighted{
background-color: $selectActiveItemBg;
}
.select2-result-label{
font-size: 12px;
color: $selectFontColor !important;
line-height: 20px;
}
}
}
}
.select2-drop-mask {
z-index: $dropdownMaskZ;
}

View File

@@ -48,8 +48,7 @@
/**
* The local video identifier.
*/
&#filmstripLocalVideo,
&#filmstripLocalScreenShare {
&#filmstripLocalVideo {
align-self: flex-end;
display: block;
margin-bottom: 8px;

View File

@@ -41,6 +41,17 @@
top: 0;
width: 100%;
@media (min-width: 581px) {
&.shift-right {
margin-left: $sidebarWidth;
width: calc(100% - #{$sidebarWidth});
.remote-videos {
width: calc(100vw - #{$sidebarWidth});
}
}
}
&.collapse {
#remoteVideos {
height: calc(100% - #{$newToolbarSizeMobile}) !important;

View File

@@ -2,8 +2,7 @@
* Various overrides outside of the filmstrip to style the app to support a
* tiled thumbnail experience.
*/
.tile-view,
.stage-filmstrip {
.tile-view {
/**
* Let the avatar grow with the tile.
*/
@@ -16,9 +15,9 @@
* Hide various features that should not be displayed while in tile view.
*/
#dominantSpeaker,
#filmstripLocalVideoThumbnail,
#largeVideoElementsContainer,
#sharedVideo,
.stage-participant-label {
#sharedVideo {
display: none;
}

View File

@@ -1,177 +1,156 @@
.vertical-filmstrip, .stage-filmstrip {
span:not(.tile-view) .filmstrip {
&.hide-videos {
.remote-videos {
& > div {
opacity: 0;
pointer-events: none;
}
}
}
/*
* Firefox sets flex items to min-height: auto and min-width: auto,
* preventing flex children from shrinking like they do on other browsers.
* Setting min-height and min-width 0 is a workaround for the issue so
* Firefox behaves like other browsers.
* https://bugzilla.mozilla.org/show_bug.cgi?id=1043520
*/
@mixin minHWAutoFix() {
min-height: 0;
min-width: 0;
}
@extend %align-right;
align-items: flex-end;
bottom: 0;
box-sizing: border-box;
display: flex;
flex-direction: column-reverse;
height: 100%;
width: 100%;
padding: 0;
/**
* fixed positioning is necessary for remote menus and tooltips to pop
* out of the scrolling filmstrip. AtlasKit dialogs and tooltips use
* a library called popper which will position its elements fixed if
* any parent is also fixed.
*/
position: fixed;
top: 0;
right: 0;
z-index: $filmstripVideosZ;
&.no-vertical-padding {
padding: 0;
}
/**
* Hide videos by making them slight to the right.
*/
.filmstrip__videos {
@extend %align-right;
bottom: 0;
padding: 0;
position:relative;
right: 0;
width: auto;
/**
* An id selector is used to match id specificity with existing
* filmstrip styles.
*/
&#remoteVideos {
border: $thumbnailsBorder solid transparent;
padding-left: 0;
border-left: 0;
width: 100%;
height: 100%;
justify-content: center;
}
}
/**
* Re-styles the local Video to better fit vertical filmstrip layout.
*/
#filmstripLocalVideo {
align-self: initial;
margin-bottom: 5px;
display: flex;
flex-direction: column-reverse;
height: auto;
justify-content: flex-start;
width: 100%;
#filmstripLocalVideoThumbnail {
width: calc(100% - 15px);
.videocontainer {
height: 0px;
width: 100%;
}
}
}
#filmstripLocalScreenShare {
align-self: initial;
margin-bottom: 5px;
display: flex;
flex-direction: column-reverse;
height: auto;
justify-content: flex-start;
width: 100%;
#filmstripLocalScreenShareThumbnail {
width: calc(100% - 15px);
.videocontainer {
height: 0px;
width: 100%;
}
}
}
/**
* Remove unnecssary padding that is normally used to prevent horizontal
* filmstrip from overlapping the left edge of the screen.
*/
#filmstripLocalVideo,
#filmstripLocalScreenShare,
.vertical-filmstrip .filmstrip {
&.hide-videos {
.remote-videos {
padding: 0;
}
#remoteVideos {
@include minHWAutoFix();
flex-direction: column;
flex-grow: 1;
}
.resizable-filmstrip #remoteVideos .videocontainer {
border-left: 0;
margin: 0;
}
&.reduce-height {
height: calc(100% - calc(#{$newToolbarSizeWithPadding} + #{$scrollHeight}));
}
.filmstrip__videos.vertical-view-grid#remoteVideos {
align-items: 'center';
border: 0px;
padding-right: 7px;
&.has-scroll {
padding-right: 0px;
}
.remote-videos > div {
left: 0px; // fixes an issue on FF - the div is aligned to the right by default for some reason
}
.videocontainer {
border: 0px;
margin: 2px;
}
}
.remote-videos {
display: flex;
overscroll-behavior: contain;
&.height-transition {
transition: height .3s ease-in;
}
& > div {
position: absolute;
transition: opacity 1s;
}
&.is-not-overflowing > div {
bottom: 0px;
opacity: 0;
pointer-events: none;
}
}
}
/*
* Firefox sets flex items to min-height: auto and min-width: auto,
* preventing flex children from shrinking like they do on other browsers.
* Setting min-height and min-width 0 is a workaround for the issue so
* Firefox behaves like other browsers.
* https://bugzilla.mozilla.org/show_bug.cgi?id=1043520
*/
@mixin minHWAutoFix() {
min-height: 0;
min-width: 0;
}
@extend %align-right;
align-items: flex-end;
bottom: 0;
box-sizing: border-box;
display: flex;
flex-direction: column-reverse;
height: 100%;
width: 100%;
padding: 0;
/**
* fixed positioning is necessary for remote menus and tooltips to pop
* out of the scrolling filmstrip. AtlasKit dialogs and tooltips use
* a library called popper which will position its elements fixed if
* any parent is also fixed.
*/
position: fixed;
top: 0;
right: 0;
z-index: $filmstripVideosZ;
&.no-vertical-padding {
padding: 0;
}
/**
* Hide videos by making them slight to the right.
*/
.filmstrip__videos {
@extend %align-right;
bottom: 0;
padding: 0;
position:relative;
right: 0;
width: auto;
/**
* An id selector is used to match id specificity with existing
* filmstrip styles.
*/
&#remoteVideos {
border: $thumbnailsBorder solid transparent;
padding-left: 0;
border-left: 0;
width: 100%;
height: 100%;
justify-content: center;
}
}
/**
* Re-styles the local Video to better fit vertical filmstrip layout.
*/
#filmstripLocalVideo {
align-self: initial;
margin-bottom: 5px;
display: flex;
flex-direction: column-reverse;
height: auto;
justify-content: flex-start;
width: 100%;
#filmstripLocalVideoThumbnail {
width: calc(100% - 15px);
.videocontainer {
height: 0px;
width: 100%;
}
}
}
/**
* Remove unnecssary padding that is normally used to prevent horizontal
* filmstrip from overlapping the left edge of the screen.
*/
#filmstripLocalVideo,
.remote-videos {
padding: 0;
}
#remoteVideos {
@include minHWAutoFix();
flex-direction: column;
flex-grow: 1;
}
.resizable-filmstrip #remoteVideos .videocontainer {
border-left: 0;
margin: 0;
}
&.reduce-height {
height: calc(100% - calc(#{$newToolbarSizeWithPadding} + #{$scrollHeight}));
}
.filmstrip__videos.vertical-view-grid#remoteVideos {
align-items: 'center';
border: 0px;
padding-right: 7px;
&.has-scroll {
padding-right: 0px;
}
.remote-videos > div {
left: 0px; // fixes an issue on FF - the div is aligned to the right by default for some reason
}
.videocontainer {
border: 0px;
margin: 2px;
}
}
.remote-videos {
display: flex;
overscroll-behavior: contain;
&.height-transition {
transition: height .3s ease-in;
}
& > div {
position: absolute;
transition: opacity 1s;
}
&.is-not-overflowing > div {
bottom: 0px;
}
}
}

View File

@@ -3,17 +3,14 @@
* clashing with the filmstrip.
*/
.vertical-filmstrip #etherpad,
.stage-filmstrip #etherpad,
.vertical-filmstrip #sharedvideo,
.stage-filmstrip #sharedvideo {
.vertical-filmstrip #sharedvideo {
text-align: left;
}
/**
* Overrides for small videos in vertical filmstrip mode.
*/
.vertical-filmstrip .filmstrip__videos .videocontainer,
.stage-filmstrip .filmstrip__videos .videocontainer {
.vertical-filmstrip .filmstrip__videos .videocontainer {
.self-view-mobile-portrait video {
object-fit: contain;
}
@@ -30,8 +27,7 @@
* The class opening is for when the filmstrip is transitioning from hidden
* to visible.
*/
.vertical-filmstrip .large-video-labels,
.stage-filmstrip .large-video-labels {
.vertical-filmstrip .large-video-labels {
&.with-filmstrip {
right: 150px;
}
@@ -51,7 +47,6 @@
* Overrides for self view when in portrait mode on mobile.
* This is done in order to keep the aspect ratio.
*/
.vertical-filmstrip .self-view-mobile-portrait #localVideo_container,
.stage-filmstrip .self-view-mobile-portrait #localVideo_container {
.vertical-filmstrip .self-view-mobile-portrait #localVideo_container {
object-fit: contain;
}

View File

@@ -24,7 +24,8 @@ $flagsImagePath: "../images/";
/* Flags END */
/* Modules BEGIN */
@import 'reset';
@import 'aui_reset';
@import 'atlaskit_overrides';
@import 'base';
@import 'utils';
@@ -38,8 +39,10 @@ $flagsImagePath: "../images/";
@import 'modals/embed-meeting/embed-meeting';
@import 'modals/feedback/feedback';
@import 'modals/invite/info';
@import 'modals/settings/settings';
@import 'modals/screen-share/share-audio';
@import 'modals/screen-share/share-screen-warning';
@import 'modals/virtual-background/virtual-background';
@import 'modals/local-recording/local-recording';
@import 'videolayout_default';
@import 'notice';
@@ -59,6 +62,8 @@ $flagsImagePath: "../images/";
@import 'components/button-control';
@import 'components/input-control';
@import 'components/input-slider';
@import "connection-info";
@import 'aui-components/dropdown';
@import '404';
@import 'policy';
@import 'popover';
@@ -86,6 +91,7 @@ $flagsImagePath: "../images/";
@import 'country-picker';
@import 'modals/invite/invite_more';
@import 'modals/security/security';
@import 'modals/mute/mute-dialog';
@import 'e2ee';
@import 'responsive';
@import 'drawer';

View File

@@ -1,3 +1,114 @@
.dialog {
box-sizing: border-box;
height: auto;
min-height: 131px;
overflow: visible;
visibility: visible;
width: 400px;
h1, h2, h3, h4, h5, h6 {
color: $auiDialogColor;
}
.aui {
&-dialog2 {
&-header, &-footer {
background-color: $auiDialogBg;
border: none;
}
&-header {
border-bottom: 1px solid $auiBorderColor;
border-radius: 5px 5px 0 0;
box-sizing: border-box;
color: #333;
display: table;
font-weight: normal;
height: em(58, 12);
margin-top: -69px;
padding: 0 20px;
width: 100%;
h2 {
font-size: em(20, 12);
font-weight: $dialogTitleFontWeight;
color: $auiDialogColor;
}
&-main {
display: table-cell;
padding-right: 0;
max-width: 400px;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: middle;
white-space: nowrap;
}
}
&-footer {
border-top: 1px solid $auiBorderColor;
border-radius: 0 0 5px 5px;
box-sizing: border-box;
height: 51px;
overflow: hidden;
padding: 10px 20px;
width: 100%;
&:empty {
height: 5px;
padding: 0;
}
}
&-content {
background-color: $auiDialogBg;
box-sizing: border-box;
color: $auiDialogColor;
font-size: em(14, 12);
overflow: auto;
max-height: 100%;
padding: 20px;
p,span, h3 {
font-weight: $labelFontWeight;
}
&:last-child {
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;
}
&:first-child {
border-top-right-radius: 5px;
border-top-left-radius: 5px;
}
}
}
&-hide {
display: none;
}
}
.input-control {
background-color: $auiDialogContentBg;
color: $auiDialogColor;
}
.form-control:not(:last-child) {
border-bottom: 1px solid $auiBorderColor;
}
}
@media all and (max-width: 420px) {
.aui-dialog2-small .aui-dialog2-content {
height: 100%;
}
}
.modal-dialog-form {
margin-top: 5px !important;

View File

@@ -0,0 +1,19 @@
.mute-dialog {
.separator-line {
margin: 24px 0 24px -20px;
padding: 0 20px;
width: 100%;
height: 1px;
background: #5E6D7A;
}
.control-row {
display: flex;
justify-content: space-between;
margin-top: 15px;
label {
font-size: 14px;
}
}
}

View File

@@ -0,0 +1,102 @@
.settings-pane {
display: flex;
width: 100%;
&.profile-pane {
flex-direction: column;
}
.auth-name {
margin-bottom: 4px;
}
.calendar-tab,
.device-selection {
margin-top: 20px;
}
.mock-atlaskit-label {
color: #b8c7e0;
font-size: 12px;
font-weight: 600;
line-height: 1.33;
padding: 20px 0px 4px 0px;
}
input[type="checkbox"]:checked + svg {
--checkbox-background-color: #6492e7;
--checkbox-border-color: #6492e7;
}
input[type="checkbox"] + svg + span {
color: #b8c7e0;
}
input[type="checkbox"] + svg + span {
color: #9FB0CC;
}
.calendar-tab,
.more-tab,
.box {
display: flex;
justify-content: space-between;
width: 100%;
}
.profile-edit {
display: flex;
width: 100%;
}
.profile-edit-field {
flex: .5;
}
.settings-sub-pane {
flex: 1;
}
.settings-sub-pane .right {
flex: 1;
}
.settings-sub-pane .left {
flex: 1;
}
.settings-sub-pane-element {
text-align: left;
flex: 1;
}
.moderator-settings-wrapper {
padding-top: 20px;
}
.profile-edit-field {
margin-right: 20px;
}
.calendar-tab {
align-items: center;
flex-direction: column;
font-size: 14px;
min-height: 100px;
text-align: center;
}
.calendar-tab-sign-in {
margin-top: 20px;
}
.sign-out-cta {
margin-bottom: 20px;
}
@media only screen and (max-width: $smallScreen) {
.device-selection {
display: flex;
flex-direction: column;
}
.more-tab {
flex-direction: column;
}
}
}

View File

@@ -0,0 +1,207 @@
.virtual-background-dialog {
margin-left: -10px;
position: relative;
max-height: 300px;
color: white;
display: inline-grid;
grid-template-columns: auto auto auto auto auto;
column-gap: 9px;
cursor: pointer;
.desktop-share:hover,
.thumbnail:hover,
.blur:hover,
.slight-blur:hover,
.virtual-background-none:hover {
opacity: 0.5;
border: 2px solid #99bbf3;
@media (max-width: 632px) {
height: 60px;
width: 60px;
}
}
.background-option {
margin-top: 8px;
border-radius: 6px;
height: 60px;
width: 107px;
text-align: center;
justify-content: center;
font-weight: bold;
box-sizing: border-box;
display: flex;
align-items: center;
}
.thumbnail {
object-fit: cover;
}
.thumbnail:hover ~ .delete-image-icon {
display: block;
}
.thumbnail-selected {
object-fit: cover;
border: 2px solid #246fe5;
}
.blur {
box-shadow: inset 0 0 12px #000000;
background: #7e8287;
padding: 0 10px;
}
.blur-selected {
box-shadow: inset 0 0 12px #000000;
background: #7e8287;
border: 2px solid #246fe5;
padding: 0 10px;
}
.slight-blur {
box-shadow: inset 0 0 12px #000000;
background: #a4a4a4;
padding: 0 10px;
}
.slight-blur-selected {
box-shadow: inset 0 0 12px #000000;
background: #a4a4a4;
border: 2px solid #246fe5;
padding: 0 10px;
}
.virtual-background-none {
background: #525252;
padding: 0 10px;
}
.none-selected {
background: #525252;
border: 2px solid #246fe5;
padding: 0 10px;
}
.desktop-share {
background: #525252;
}
.desktop-share-selected {
background: #525252;
border: 2px solid #246fe5;
padding: 0 10px;
}
@media (max-width: 632px) {
font-size: 1.5vw;
.desktop-share,
.virtual-background-none,
.thumbnail,
.blur,
.slight-blur {
height: 60px;
width: 60px;
}
.desktop-share-selected,
.thumbnail-selected,
.none-selected,
.blur-selected,
.slight-blur-selected {
height: 60px;
width: 60px;
}
}
@media (max-width: 360px) {
grid-template-columns: auto auto auto;
}
}
.modal-dialog-form .virtual-background-loading {
overflow: hidden;
position: fixed;
left: 50%;
margin-top: 10px;
transform: translateX(-50%);
}
.modal-dialog-form .video-preview {
height: 250px;
}
.file-upload-btn {
display: none;
}
.file-upload-label {
font-size: 14px;
font-weight: 600;
line-height: 20px;
margin-left: -10px;
margin-top: 16px;
margin-bottom: 8px;
color: #669aec;
display: inline-flex;
cursor: pointer;
}
.delete-image-icon {
background: #3d3d3d;
position: absolute;
display: none;
left: 96;
bottom: 51;
@media (max-width: 632px) {
left: 51px;
}
}
.delete-image-icon:hover {
display: block;
}
.thumbnail-container {
position: relative;
&:focus-within {
.thumbnail ~ .delete-image-icon {
display: block;
}
}
}
.add-background {
margin-right: 8px;
}
.apply-background-btn {
margin-top: 16px;
float: right;
}
.video-background-preview-entry {
margin-left: -10px;
height: 250px;
width: 570px;
margin-bottom: 8px;
z-index: 2;
@media (max-width: 632px) {
max-width: 336;
}
}
.virtual-background-preview-video {
margin-left: -10;
border-radius: 6px;
height: 100%;
object-fit: cover;
width: 100%;
}
.video-preview-loader {
border-radius: 6px;
background-color: transparent;
height: 250px;
margin-bottom: 8px;
width: 572px;
position: fixed;
z-index: 2;
@media (min-width: 432px) and (max-width: 632px) {
width: 340px;
}
}
.video-preview-loader svg {
position: absolute;
top: 40%;
left: 45%;
}
.dialog-margin-top{
margin-top: 44px;
}

View File

@@ -23,6 +23,30 @@
padding: 8px 0;
}
&-dropdown-btn {
align-items: center;
color: #1C2025;
cursor: pointer;
display: flex;
height: 40px;
font-size: 15px;
line-height: 24px;
padding: 0 16px;
&:hover {
background-color: #DAEBFA;
}
}
&-dropdown-icon {
display: inline-block;
margin-right: 16px;
& > svg {
fill: #1C2025;
}
}
&-dropdown-container {
position: relative;
width: 100%;

View File

@@ -137,7 +137,6 @@
}
.toolbox-content-items {
@include ltr;
background: transparent;
box-shadow: none;
display: flex;

View File

@@ -46,6 +46,11 @@ $reloadProgressBarBg: #0074E0;
/**
* Dialog colors
**/
$auiDialogColor: #eceef1;
$auiDialogBg: #253858;
$auiDialogContentBg: #344563;
$auiBorderColor: #253858;
$dialogTitleFontWeight: 400;
$dialogErrorText: #344563;
/**

6
debian/control vendored
View File

@@ -33,7 +33,7 @@ Description: Configuration for web serving of Jitsi Meet
Package: jitsi-meet-prosody
Architecture: all
Depends: openssl, prosody (>= 0.11.0) | prosody-trunk | prosody-0.12 | prosody-0.11, lua-sec
Depends: openssl, prosody (>= 0.11.0) | prosody-trunk | prosody-0.11, lua-sec
Replaces: jitsi-meet-tokens
Description: Prosody configuration for Jitsi Meet
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
@@ -47,12 +47,12 @@ Description: Prosody configuration for Jitsi Meet
Package: jitsi-meet-tokens
Architecture: all
Depends: ${misc:Depends}, prosody-trunk | prosody-0.11 | prosody-0.12 | prosody (>= 0.11.2), libssl-dev, luarocks, jitsi-meet-prosody, git, lua-basexx
Depends: ${misc:Depends}, prosody-trunk (>= 1nightly747) | prosody-0.11 | prosody (>= 0.11.2), libssl1.0-dev | libssl-dev, luarocks, jitsi-meet-prosody, git
Description: Prosody token authentication plugin for Jitsi Meet
Package: jitsi-meet-turnserver
Architecture: all
Breaks: apache2
Pre-Depends: jitsi-meet-web-config
Depends: ${misc:Depends}, jitsi-meet-prosody, coturn, dnsutils
Depends: ${misc:Depends}, nginx (>= 1.13.10) | nginx-full (>= 1.13.10) | nginx-extras (>= 1.13.10), jitsi-meet-prosody, coturn, dnsutils
Description: Configures coturn to be used with Jitsi Meet

View File

@@ -48,11 +48,6 @@ case "$1" in
db_stop
if [ -f "$PROSODY_HOST_CONFIG" ] ; then
# Install luajwt (also on update, to make sure we get the latest version).
if ! luarocks install luajwtjitsi 3.0-0; then
echo "Failed to install luajwtjitsi - try installing it manually"
fi
# search for the token auth, if this is not enabled this is the
# first time we install tokens package and needs a config change
if ! egrep -q '^\s*authentication\s*=\s*"token"' "$PROSODY_HOST_CONFIG"; then
@@ -65,6 +60,16 @@ case "$1" in
sed -i 's/ --modules_enabled = { "token_verification" }/ modules_enabled = { "token_verification" }/g' $PROSODY_HOST_CONFIG
sed -i '/^\s*--\s*"token_verification"/ s/--\s*//' $PROSODY_HOST_CONFIG
# Install luajwt
if ! luarocks install luajwtjitsi 2.0-0; then
echo "Failed to install luajwtjitsi - try installing it manually"
fi
# Install basexx
if ! luarocks install basexx; then
echo "Failed to install basexx - try installing it manually"
fi
PR10_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-0.10' 2>/dev/null | awk '{print $3}' || true)"
PRTRUNK_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-trunk' 2>/dev/null | awk '{print $3}' || true)"
PR_VER_INSTALLED=$(dpkg-query -f='${Version}\n' --show prosody 2>/dev/null || true)

View File

@@ -33,6 +33,7 @@ case "$1" in
JVB_HOSTNAME=$(echo "$RET" | xargs echo -n)
TURN_CONFIG="/etc/turnserver.conf"
NGINX_CONFIG="/etc/nginx/sites-available/$JVB_HOSTNAME.conf"
JITSI_MEET_CONFIG="/etc/jitsi/meet/$JVB_HOSTNAME-config.js"
# if there was a turn config backup it so we can configure
@@ -50,6 +51,19 @@ case "$1" in
fi
fi
# this detect only old installations with no nginx
db_get jitsi-meet/jvb-serve || true
if [ ! -f $NGINX_CONFIG -o "$RET" = "true" ] ; then
# nothing to do
echo "------------------------------------------------"
echo ""
echo "turnserver not configured"
echo ""
echo "------------------------------------------------"
db_stop
exit 0
fi
if [[ -f $TURN_CONFIG ]] ; then
echo "------------------------------------------------"
echo ""
@@ -103,7 +117,7 @@ denied-peer-ip=240.0.0.0-255.255.255.255" >> $TURN_CONFIG
sed -i "s/jitsi-meet.example.com/$JVB_HOSTNAME/g" $TURN_CONFIG
sed -i "s/__turnSecret__/$TURN_SECRET/g" $TURN_CONFIG
# SSL settings
# SSL for nginx
db_get jitsi-meet/cert-choice
CERT_CHOICE="$RET"

View File

@@ -23,12 +23,26 @@ set -e
case "$1" in
remove)
if [ -x "/etc/init.d/nginx" ]; then
invoke-rc.d nginx reload || true
fi
if [ -x "/etc/init.d/apache2" ]; then
invoke-rc.d apache2 reload || true
fi
;;
purge)
rm -rf /etc/turnserver.conf
if [ -x "/etc/init.d/nginx" ]; then
invoke-rc.d nginx reload || true
fi
if [ -x "/etc/init.d/apache2" ]; then
invoke-rc.d apache2 reload || true
fi
# Clear the debconf variable
db_purge
;;
remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
;;
*)

View File

@@ -14,16 +14,6 @@ cross_domain_bosh = false;
consider_bosh_secure = true;
-- https_ports = { }; -- Remove this line to prevent listening on port 5284
-- by default prosody 0.12 sends cors headers, if you want to disable it uncomment the following (the config is available on 0.12.1)
--http_cors_override = {
-- bosh = {
-- enabled = false;
-- };
-- websocket = {
-- enabled = false;
-- };
--}
-- https://ssl-config.mozilla.org/#server=haproxy&version=2.1&config=intermediate&openssl=1.1.0g&guideline=5.4
ssl = {
protocol = "tlsv1_2+";

View File

@@ -4,16 +4,6 @@ types {
# nginx's default mime.types doesn't include a mapping for wasm
application/wasm wasm;
}
upstream prosody {
zone upstreams 64K;
server 127.0.0.1:5280;
keepalive 2;
}
upstream jvb1 {
zone upstreams 64K;
server 127.0.0.1:9090;
keepalive 2;
}
server {
listen 80;
listen [::]:80;
@@ -87,16 +77,14 @@ server {
# BOSH
location = /http-bind {
proxy_pass http://prosody/http-bind?prefix=$prefix&$args;
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:5280/http-bind?prefix=$prefix&$args;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header Connection "";
}
# xmpp websockets
location = /xmpp-websocket {
proxy_pass http://prosody/xmpp-websocket?prefix=$prefix&$args;
proxy_pass http://127.0.0.1:5280/xmpp-websocket?prefix=$prefix&$args;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
@@ -106,7 +94,7 @@ server {
# colibri (JVB) websockets for jvb1
location ~ ^/colibri-ws/default-id/(.*) {
proxy_pass http://jvb1/colibri-ws/default-id/$1$is_args$args;
proxy_pass http://127.0.0.1:9090/colibri-ws/default-id/$1$is_args$args;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

View File

@@ -35,7 +35,6 @@ end
post_install do |installer|
react_native_post_install(installer)
__apply_Xcode_12_5_M1_post_install_workaround(installer)
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'YES'
@@ -43,4 +42,7 @@ post_install do |installer|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
end
end
# https://github.com/facebook/react-native/blob/d7f748a944a9a9324e485ccbe214098e6c8645fc/scripts/react_native_pods.rb#L630
time_header = "#{Pod::Config.instance.installation_root.to_s}/Pods/RCT-Folly/folly/portability/Time.h"
`sed -i -e $'s/ && (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0)//' #{time_header}`
end

View File

@@ -13,14 +13,14 @@ PODS:
- CocoaLumberjack/Core (= 3.7.2)
- CocoaLumberjack/Core (3.7.2)
- DoubleConversion (1.1.6)
- FBLazyVector (0.67.4)
- FBReactNativeSpec (0.67.4):
- FBLazyVector (0.66.4)
- FBReactNativeSpec (0.66.4):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.67.4)
- RCTTypeSafety (= 0.67.4)
- React-Core (= 0.67.4)
- React-jsi (= 0.67.4)
- ReactCommon/turbomodule/core (= 0.67.4)
- RCTRequired (= 0.66.4)
- RCTTypeSafety (= 0.66.4)
- React-Core (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- Firebase/Analytics (6.33.0):
- Firebase/Core
- Firebase/Core (6.33.0):
@@ -66,11 +66,6 @@ PODS:
- GoogleUtilities/UserDefaults (~> 6.7)
- PromisesObjC (~> 1.2)
- fmt (6.2.1)
- Giphy (2.1.20):
- libwebp
- giphy-react-native-sdk (1.7.0):
- Giphy (= 2.1.20)
- React-Core
- glog (0.3.5)
- GoogleAppMeasurement (6.8.3):
- GoogleUtilities/AppDelegateSwizzler (~> 6.7)
@@ -107,15 +102,6 @@ PODS:
- AppAuth/Core (~> 1.4)
- GTMSessionFetcher/Core (~> 1.5)
- GTMSessionFetcher/Core (1.7.0)
- libwebp (1.2.1):
- libwebp/demux (= 1.2.1)
- libwebp/mux (= 1.2.1)
- libwebp/webp (= 1.2.1)
- libwebp/demux (1.2.1):
- libwebp/webp
- libwebp/mux (1.2.1):
- libwebp/demux
- libwebp/webp (1.2.1)
- nanopb (1.30906.0):
- nanopb/decode (= 1.30906.0)
- nanopb/encode (= 1.30906.0)
@@ -134,192 +120,192 @@ PODS:
- DoubleConversion
- fmt (~> 6.2.1)
- glog
- RCTRequired (0.67.4)
- RCTTypeSafety (0.67.4):
- FBLazyVector (= 0.67.4)
- RCTRequired (0.66.4)
- RCTTypeSafety (0.66.4):
- FBLazyVector (= 0.66.4)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.67.4)
- React-Core (= 0.67.4)
- React (0.67.4):
- React-Core (= 0.67.4)
- React-Core/DevSupport (= 0.67.4)
- React-Core/RCTWebSocket (= 0.67.4)
- React-RCTActionSheet (= 0.67.4)
- React-RCTAnimation (= 0.67.4)
- React-RCTBlob (= 0.67.4)
- React-RCTImage (= 0.67.4)
- React-RCTLinking (= 0.67.4)
- React-RCTNetwork (= 0.67.4)
- React-RCTSettings (= 0.67.4)
- React-RCTText (= 0.67.4)
- React-RCTVibration (= 0.67.4)
- React-callinvoker (0.67.4)
- React-Core (0.67.4):
- RCTRequired (= 0.66.4)
- React-Core (= 0.66.4)
- React (0.66.4):
- React-Core (= 0.66.4)
- React-Core/DevSupport (= 0.66.4)
- React-Core/RCTWebSocket (= 0.66.4)
- React-RCTActionSheet (= 0.66.4)
- React-RCTAnimation (= 0.66.4)
- React-RCTBlob (= 0.66.4)
- React-RCTImage (= 0.66.4)
- React-RCTLinking (= 0.66.4)
- React-RCTNetwork (= 0.66.4)
- React-RCTSettings (= 0.66.4)
- React-RCTText (= 0.66.4)
- React-RCTVibration (= 0.66.4)
- React-callinvoker (0.66.4)
- React-Core (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.67.4)
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-Core/Default (= 0.66.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/CoreModulesHeaders (0.67.4):
- React-Core/CoreModulesHeaders (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/Default (0.67.4):
- React-Core/Default (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/DevSupport (0.67.4):
- React-Core/DevSupport (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.67.4)
- React-Core/RCTWebSocket (= 0.67.4)
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-jsinspector (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-Core/Default (= 0.66.4)
- React-Core/RCTWebSocket (= 0.66.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-jsinspector (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/RCTActionSheetHeaders (0.67.4):
- React-Core/RCTActionSheetHeaders (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/RCTAnimationHeaders (0.67.4):
- React-Core/RCTAnimationHeaders (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/RCTBlobHeaders (0.67.4):
- React-Core/RCTBlobHeaders (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/RCTImageHeaders (0.67.4):
- React-Core/RCTImageHeaders (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/RCTLinkingHeaders (0.67.4):
- React-Core/RCTLinkingHeaders (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/RCTNetworkHeaders (0.67.4):
- React-Core/RCTNetworkHeaders (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/RCTSettingsHeaders (0.67.4):
- React-Core/RCTSettingsHeaders (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/RCTTextHeaders (0.67.4):
- React-Core/RCTTextHeaders (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/RCTVibrationHeaders (0.67.4):
- React-Core/RCTVibrationHeaders (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-Core/RCTWebSocket (0.67.4):
- React-Core/RCTWebSocket (0.66.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.67.4)
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsiexecutor (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-Core/Default (= 0.66.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- Yoga
- React-CoreModules (0.67.4):
- FBReactNativeSpec (= 0.67.4)
- React-CoreModules (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.67.4)
- React-Core/CoreModulesHeaders (= 0.67.4)
- React-jsi (= 0.67.4)
- React-RCTImage (= 0.67.4)
- ReactCommon/turbomodule/core (= 0.67.4)
- React-cxxreact (0.67.4):
- RCTTypeSafety (= 0.66.4)
- React-Core/CoreModulesHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- React-RCTImage (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-cxxreact (0.66.4):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.67.4)
- React-jsi (= 0.67.4)
- React-jsinspector (= 0.67.4)
- React-logger (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-runtimeexecutor (= 0.67.4)
- React-jsi (0.67.4):
- React-callinvoker (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsinspector (= 0.66.4)
- React-logger (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-runtimeexecutor (= 0.66.4)
- React-jsi (0.66.4):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsi/Default (= 0.67.4)
- React-jsi/Default (0.67.4):
- React-jsi/Default (= 0.66.4)
- React-jsi/Default (0.66.4):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsiexecutor (0.67.4):
- React-jsiexecutor (0.66.4):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-jsinspector (0.67.4)
- React-logger (0.67.4):
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-jsinspector (0.66.4)
- React-logger (0.66.4):
- glog
- react-native-background-timer (2.4.1):
- React-Core
@@ -344,75 +330,75 @@ PODS:
- react-native-video/Video (= 5.2.0)
- react-native-video/Video (5.2.0):
- React-Core
- react-native-webrtc (1.100.0):
- react-native-webrtc (1.94.2):
- React-Core
- react-native-webview (11.15.1):
- React-Core
- React-perflogger (0.67.4)
- React-RCTActionSheet (0.67.4):
- React-Core/RCTActionSheetHeaders (= 0.67.4)
- React-RCTAnimation (0.67.4):
- FBReactNativeSpec (= 0.67.4)
- React-perflogger (0.66.4)
- React-RCTActionSheet (0.66.4):
- React-Core/RCTActionSheetHeaders (= 0.66.4)
- React-RCTAnimation (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.67.4)
- React-Core/RCTAnimationHeaders (= 0.67.4)
- React-jsi (= 0.67.4)
- ReactCommon/turbomodule/core (= 0.67.4)
- React-RCTBlob (0.67.4):
- FBReactNativeSpec (= 0.67.4)
- RCTTypeSafety (= 0.66.4)
- React-Core/RCTAnimationHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTBlob (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/RCTBlobHeaders (= 0.67.4)
- React-Core/RCTWebSocket (= 0.67.4)
- React-jsi (= 0.67.4)
- React-RCTNetwork (= 0.67.4)
- ReactCommon/turbomodule/core (= 0.67.4)
- React-RCTImage (0.67.4):
- FBReactNativeSpec (= 0.67.4)
- React-Core/RCTBlobHeaders (= 0.66.4)
- React-Core/RCTWebSocket (= 0.66.4)
- React-jsi (= 0.66.4)
- React-RCTNetwork (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTImage (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.67.4)
- React-Core/RCTImageHeaders (= 0.67.4)
- React-jsi (= 0.67.4)
- React-RCTNetwork (= 0.67.4)
- ReactCommon/turbomodule/core (= 0.67.4)
- React-RCTLinking (0.67.4):
- FBReactNativeSpec (= 0.67.4)
- React-Core/RCTLinkingHeaders (= 0.67.4)
- React-jsi (= 0.67.4)
- ReactCommon/turbomodule/core (= 0.67.4)
- React-RCTNetwork (0.67.4):
- FBReactNativeSpec (= 0.67.4)
- RCTTypeSafety (= 0.66.4)
- React-Core/RCTImageHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- React-RCTNetwork (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTLinking (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- React-Core/RCTLinkingHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTNetwork (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.67.4)
- React-Core/RCTNetworkHeaders (= 0.67.4)
- React-jsi (= 0.67.4)
- ReactCommon/turbomodule/core (= 0.67.4)
- React-RCTSettings (0.67.4):
- FBReactNativeSpec (= 0.67.4)
- RCTTypeSafety (= 0.66.4)
- React-Core/RCTNetworkHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTSettings (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.67.4)
- React-Core/RCTSettingsHeaders (= 0.67.4)
- React-jsi (= 0.67.4)
- ReactCommon/turbomodule/core (= 0.67.4)
- React-RCTText (0.67.4):
- React-Core/RCTTextHeaders (= 0.67.4)
- React-RCTVibration (0.67.4):
- FBReactNativeSpec (= 0.67.4)
- RCTTypeSafety (= 0.66.4)
- React-Core/RCTSettingsHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTText (0.66.4):
- React-Core/RCTTextHeaders (= 0.66.4)
- React-RCTVibration (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/RCTVibrationHeaders (= 0.67.4)
- React-jsi (= 0.67.4)
- ReactCommon/turbomodule/core (= 0.67.4)
- React-runtimeexecutor (0.67.4):
- React-jsi (= 0.67.4)
- ReactCommon/turbomodule/core (0.67.4):
- React-Core/RCTVibrationHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-runtimeexecutor (0.66.4):
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (0.66.4):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.67.4)
- React-Core (= 0.67.4)
- React-cxxreact (= 0.67.4)
- React-jsi (= 0.67.4)
- React-logger (= 0.67.4)
- React-perflogger (= 0.67.4)
- React-callinvoker (= 0.66.4)
- React-Core (= 0.66.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-logger (= 0.66.4)
- React-perflogger (= 0.66.4)
- RNCalendarEvents (2.2.0):
- React
- RNCAsyncStorage (1.15.14):
@@ -421,7 +407,7 @@ PODS:
- React-Core
- RNCMaskedView (0.2.6):
- React-Core
- RNDefaultPreference (1.4.4):
- RNDefaultPreference (1.4.3):
- React-Core
- RNDeviceInfo (8.4.8):
- React-Core
@@ -430,7 +416,7 @@ PODS:
- RNGoogleSignin (7.0.4):
- GoogleSignIn (~> 6.0.0)
- React-Core
- RNReanimated (1.13.4):
- RNReanimated (1.13.3):
- React-Core
- RNScreens (3.10.1):
- React-Core
@@ -456,7 +442,6 @@ DEPENDENCIES:
- Firebase/Analytics (~> 6.33.0)
- Firebase/Crashlytics (~> 6.33.0)
- Firebase/DynamicLinks (~> 6.33.0)
- "giphy-react-native-sdk (from `../node_modules/@giphy/react-native-sdk`)"
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
- ObjectiveDropboxOfficial (= 6.2.3)
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
@@ -525,14 +510,12 @@ SPEC REPOS:
- FirebaseDynamicLinks
- FirebaseInstallations
- fmt
- Giphy
- GoogleAppMeasurement
- GoogleDataTransport
- GoogleSignIn
- GoogleUtilities
- GTMAppAuth
- GTMSessionFetcher
- libwebp
- nanopb
- ObjectiveDropboxOfficial
- PromisesObjC
@@ -548,8 +531,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/Libraries/FBLazyVector"
FBReactNativeSpec:
:path: "../node_modules/react-native/React/FBReactNativeSpec"
giphy-react-native-sdk:
:path: "../node_modules/@giphy/react-native-sdk"
glog:
:podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
RCT-Folly:
@@ -660,8 +641,8 @@ SPEC CHECKSUMS:
boost: a7c83b31436843459a1961bfd74b96033dc77234
CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
FBLazyVector: f7b0632c6437e312acf6349288d9aa4cb6d59030
FBReactNativeSpec: 0f4e1f4cfeace095694436e7c7fcc5bf4b03a0ff
FBLazyVector: e5569e42a1c79ca00521846c223173a57aca1fe1
FBReactNativeSpec: fe08c1cd7e2e205718d77ad14b34957cce949b58
Firebase: 8db6f2d1b2c5e2984efba4949a145875a8f65fe5
FirebaseAnalytics: 5dd088bd2e67bb9d13dbf792d1164ceaf3052193
FirebaseCore: d889d9e12535b7f36ac8bfbf1713a0836a3012cd
@@ -670,31 +651,28 @@ SPEC CHECKSUMS:
FirebaseDynamicLinks: 6eac37d86910382eafb6315d952cc44c9e176094
FirebaseInstallations: 466c7b4d1f58fe16707693091da253726a731ed2
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
Giphy: b6d5087521d251bb8c99cdc0eb07bbdf86d142d5
giphy-react-native-sdk: 7abccf2b52123a0f30ce99da895ab6288023680c
glog: 85ecdd10ee8d8ec362ef519a6a45ff9aa27b2e85
glog: 5337263514dd6f09803962437687240c5dc39aa4
GoogleAppMeasurement: 966e88df9d19c15715137bb2ddaf52373f111436
GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833
GoogleSignIn: fd381840dbe7c1137aa6dc30849a5c3e070c034a
GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3
GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89
GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc
ObjectiveDropboxOfficial: fe206ce8c0bc49976c249d472db7fdbc53ebbd53
PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
RCT-Folly: 803a9cfd78114b2ec0f140cfa6fa2a6bafb2d685
RCTRequired: 0aa6c1c27e1d65920df35ceea5341a5fe76bdb79
RCTTypeSafety: d76a59d00632891e11ed7522dba3fd1a995e573a
React: ab8c09da2e7704f4b3ebad4baa6cfdfcc852dcb5
React-callinvoker: 216fb96b482da516b8aba4142b145938f6ea92f0
React-Core: af99b93aff83599485e0e0879879aafa35ceae32
React-CoreModules: 137a054ce8c547e81dc3502933b1bc0fd08df05d
React-cxxreact: ec5ee6b08664f5b8ac71d8ad912f54d540c4f817
React-jsi: 3e084c80fd364cee64668d5df46d40c39f7973e1
React-jsiexecutor: cbdf37cebdc4f5d8b3d0bf5ccaa6147fd9de9f3d
React-jsinspector: f4775ea9118cbe1f72b834f0f842baa7a99508d8
React-logger: a1f028f6d8639a3f364ef80419e5e862e1115250
RCT-Folly: a21c126816d8025b547704b777a2ba552f3d9fa9
RCTRequired: 4bf86c70714490bca4bf2696148638284622644b
RCTTypeSafety: c475a7059eb77935fa53d2c17db299893f057d5d
React: f64af14e3f2c50f6f2c91a5fd250e4ff1b3c3459
React-callinvoker: b74e4ae80287780dcdf0cab262bcb581eeef56e7
React-Core: 3eb7432bad96ff1d25aebc1defbae013fee2fd0e
React-CoreModules: ad9e1fd5650e16666c57a08328df86fd7e480cb9
React-cxxreact: 02633ff398cf7e91a2c1e12590d323c4a4b8668a
React-jsi: 805c41a927d6499fb811772acb971467d9204633
React-jsiexecutor: 94ce921e1d8ce7023366873ec371f3441383b396
React-jsinspector: d0374f7509d407d2264168b6d0fad0b54e300b85
React-logger: 933f80c97c633ee8965d609876848148e3fef438
react-native-background-timer: 17ea5e06803401a379ebf1f20505b793ac44d0fe
react-native-get-random-values: 30b3f74ca34e30e2e480de48e4add2706a40ac8f
react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774
@@ -705,35 +683,35 @@ SPEC CHECKSUMS:
react-native-slider: 6e9b86e76cce4b9e35b3403193a6432ed07e0c81
react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
react-native-video: a4c2635d0802f983594b7057e1bce8f442f0ad28
react-native-webrtc: b8f2769386d51a6a8c89778478618fe311226bc3
react-native-webrtc: 1856ac061df94b1bd6037f1f3b56d1b8bc2b50e7
react-native-webview: ea4899a1056c782afa96dd082179a66cbebf5504
React-perflogger: 0afaf2f01a47fd0fc368a93bfbb5bd3b26db6e7f
React-RCTActionSheet: 59f35c4029e0b532fc42114241a06e170b7431a2
React-RCTAnimation: aae4f4bed122e78bdab72f7118d291d70a932ce2
React-RCTBlob: f6fb23394b4f28cd86fa7e9f5f6ae45c23669fda
React-RCTImage: 638815cf96124386dd296067246d91441932ae3f
React-RCTLinking: 254dd06283dd6fdb784285f95e7cec8053c3270f
React-RCTNetwork: 8a4c2d4f357268e520b060572d02bc69a9b991fb
React-RCTSettings: 35d44cbb9972ab933bd0a59ea3e6646dcb030ba3
React-RCTText: cc5315df8458cfa7b537e621271ef43273955a97
React-RCTVibration: 3b52a7dced19cdb025b4f88ab26ceb2d85f30ba2
React-runtimeexecutor: a9d3c82ddf7ffdad9fbe6a81c6d6f8c06385464d
ReactCommon: 07d0c460b9ba9af3eaf1b8f5abe7daaad28c9c4e
React-perflogger: 93075d8931c32cd1fce8a98c15d2d5ccc4d891bd
React-RCTActionSheet: 7d3041e6761b4f3044a37079ddcb156575fb6d89
React-RCTAnimation: 743e88b55ac62511ae5c2e22803d4f503f2a3a13
React-RCTBlob: bee3a2f98fa7fc25c957c8643494244f74bea0a0
React-RCTImage: 19fc9e29b06cc38611c553494f8d3040bf78c24e
React-RCTLinking: dc799503979c8c711126d66328e7ce8f25c2848f
React-RCTNetwork: 417e4e34cf3c19eaa5fd4e9eb20180d662a799ce
React-RCTSettings: 4df89417265af26501a7e0e9192a34d3d9848dff
React-RCTText: f8a21c3499ab322326290fa9b701ae29aa093aa5
React-RCTVibration: e3ffca672dd3772536cb844274094b0e2c31b187
React-runtimeexecutor: dec32ee6f2e2a26e13e58152271535fadff5455a
ReactCommon: 57b69f6383eafcbd7da625bfa6003810332313c4
RNCalendarEvents: 7e65eb4a94f53c1744d1e275f7fafcfaa619f7a3
RNCAsyncStorage: ea6b5c280997b2b32a587793163b1f10e580c4f7
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
RNCMaskedView: c298b644a10c0c142055b3ae24d83879ecb13ccd
RNDefaultPreference: 08bdb06cfa9188d5da97d4642dac745218d7fb31
RNDefaultPreference: 326860d42a681bfd7338c8f6d061cf58745bd860
RNDeviceInfo: 0400a6d0c94186d1120c3cbd97b23abc022187a9
RNGestureHandler: e5c7cab5f214503dcefd6b2b0cefb050e1f51c4a
RNGoogleSignin: c4381751eefd73c552b923ba347a9bfc6f18771c
RNReanimated: c1b56d030d1616239861534d9adb531f8cffab68
RNReanimated: 514a11da3a2bcc6c3dfd9de32b38e2b9bf101926
RNScreens: 522705f2e5c9d27efb17f24aceb2bf8335bc7b8e
RNSound: 27e8268bdb0a1f191f219a33267f7e0445e8d62f
RNSVG: ce9d996113475209013317e48b05c21ee988d42e
RNWatch: 99637948ec9b5c9ec5a41920642594ad5ba07e80
Yoga: d6b6a80659aa3e91aaba01d0012e7edcbedcbecd
Yoga: e7dc4e71caba6472ff48ad7d234389b91dadc280
PODFILE CHECKSUM: 2167362b8c8cacb433b763a9ae6c3f4b590190c7
PODFILE CHECKSUM: 7fafb3480e45473da539aa09d06374868b021f90
COCOAPODS: 1.11.2

View File

@@ -38,8 +38,6 @@
DEA9F28A258A6EA800D4CD74 /* JitsiMeetSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DEA9F288258A6EA800D4CD74 /* JitsiMeetSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
E588011722789D43008B0561 /* JitsiMeetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = E58801132278944E008B0561 /* JitsiMeetContext.swift */; };
E5C97B63227A1EB400199214 /* JitsiMeetCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5C97B62227A1EB400199214 /* JitsiMeetCommands.swift */; };
FD572B9827EDF32300A800FB /* GiphyUISDK.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */; };
FD572B9927EDF32300A800FB /* GiphyUISDK.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -74,7 +72,6 @@
dstSubfolderSpec = 10;
files = (
DEA9F28A258A6EA800D4CD74 /* JitsiMeetSDK.framework in Embed Frameworks */,
FD572B9927EDF32300A800FB /* GiphyUISDK.xcframework in Embed Frameworks */,
DE05038A256E904600DEE3A5 /* WebRTC.xcframework in Embed Frameworks */,
);
name = "Embed Frameworks";
@@ -161,7 +158,6 @@
DEFDBBDB25656E3B00344B23 /* WebRTC.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WebRTC.xcframework; path = "../../node_modules/react-native-webrtc/ios/WebRTC.xcframework"; sourceTree = "<group>"; };
E58801132278944E008B0561 /* JitsiMeetContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JitsiMeetContext.swift; sourceTree = "<group>"; };
E5C97B62227A1EB400199214 /* JitsiMeetCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JitsiMeetCommands.swift; sourceTree = "<group>"; };
FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = GiphyUISDK.xcframework; path = ../Pods/Giphy/GiphySDK/GiphyUISDK.xcframework; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -178,7 +174,6 @@
files = (
DE050389256E904600DEE3A5 /* WebRTC.xcframework in Frameworks */,
DEA9F289258A6EA800D4CD74 /* JitsiMeetSDK.framework in Frameworks */,
FD572B9827EDF32300A800FB /* GiphyUISDK.xcframework in Frameworks */,
2681BB562C7A0B42CFBA6719 /* libPods-JitsiMeet.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -204,7 +199,6 @@
0B26BE711EC5BC4D00EEFB41 /* Frameworks */ = {
isa = PBXGroup;
children = (
FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */,
DEA9F288258A6EA800D4CD74 /* JitsiMeetSDK.framework */,
DE050388256E904600DEE3A5 /* WebRTC.xcframework */,
0B26BE6D1EC5BC3C00EEFB41 /* JitsiMeet.framework */,

View File

@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>22.2.0</string>
<string>22.1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>

View File

@@ -15,6 +15,7 @@
*/
import ReplayKit
import JitsiMeetSDK
private enum Constants {
// the App Group ID value that the app and the broadcast extension targets are setup with. It differs for each app.

View File

@@ -37,8 +37,13 @@
[builder setFeatureFlag:@"welcomepage.enabled" withBoolean:YES];
[builder setFeatureFlag:@"resolution" withValue:@(360)];
[builder setFeatureFlag:@"ios.screensharing.enabled" withBoolean:YES];
[builder setFeatureFlag:@"ios.recording.enabled" withBoolean:YES];
builder.serverURL = [NSURL URLWithString:@"https://meet.jit.si"];
// Apple rejected our app because they claim requiring a
// Dropbox account for recording is not acceptable.
#if DEBUG
[builder setFeatureFlag:@"ios.recording.enabled" withBoolean:YES];
#endif
}];
[jitsiMeet application:application didFinishLaunchingWithOptions:launchOptions];

View File

@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>22.2.0</string>
<string>22.1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>

View File

@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>22.2.0</string>
<string>22.1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>UISupportedInterfaceOrientations</key>

View File

@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>22.2.0</string>
<string>22.1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CLKComplicationPrincipalClass</key>

View File

@@ -71,7 +71,7 @@ platform :ios do
# Inrement the build number by 1
increment_build_number(
build_number: Time.now.to_i,
build_number: latest_testflight_build_number + 1,
xcodeproj: "app/app.xcodeproj"
)

View File

@@ -303,9 +303,9 @@
buildConfigurationList = 0BD906ED1EC0C00300C8C18E /* Build configuration list for PBXNativeTarget "JitsiMeetSDK" */;
buildPhases = (
26796D8589142D80C8AFDA51 /* [CP] Check Pods Manifest.lock */,
0BD906E21EC0C00300C8C18E /* Headers */,
0BD906E01EC0C00300C8C18E /* Sources */,
0BD906E11EC0C00300C8C18E /* Frameworks */,
0BD906E21EC0C00300C8C18E /* Headers */,
0BD906E31EC0C00300C8C18E /* Resources */,
DE17D0D426E0B86300F77E2E /* Copy sounds */,
0BCA49651EC4B77500B793EE /* Package React bundle */,

View File

@@ -35,10 +35,9 @@ typedef enum {
static NSString * const kDevicesChanged = @"org.jitsi.meet:features/audio-mode#devices-update";
// Device types (must match JS and Java)
static NSString * const kDeviceTypeBluetooth = @"BLUETOOTH";
static NSString * const kDeviceTypeCar = @"CAR";
static NSString * const kDeviceTypeEarpiece = @"EARPIECE";
static NSString * const kDeviceTypeHeadphones = @"HEADPHONES";
static NSString * const kDeviceTypeBluetooth = @"BLUETOOTH";
static NSString * const kDeviceTypeEarpiece = @"EARPIECE";
static NSString * const kDeviceTypeSpeaker = @"SPEAKER";
static NSString * const kDeviceTypeUnknown = @"UNKNOWN";
@@ -191,7 +190,7 @@ RCT_EXPORT_METHOD(setAudioDevice:(NSString *)device
// The speaker is special, so test for it first.
if ([device isEqualToString:kDeviceTypeSpeaker]) {
forceSpeaker = YES;
forceSpeaker = NO;
success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
} else {
// Here we use AVAudioSession because RTCAudioSession doesn't expose availableInputs.
@@ -259,16 +258,10 @@ RCT_EXPORT_METHOD(updateDeviceList) {
self->forceSpeaker = NO;
self->forceEarpiece = NO;
break;
case AVAudioSessionRouteChangeReasonCategoryChange: {
case AVAudioSessionRouteChangeReasonCategoryChange:
// The category has changed. Check if it's the one we want and adjust as
// needed.
RTCAudioSessionConfiguration *currentConfig = [self configForMode:self->activeMode];
if ([session.category isEqualToString:currentConfig.category]) {
// We are in the desired category, nothing to do here.
return;
}
break;
}
default:
return;
}
@@ -281,6 +274,7 @@ RCT_EXPORT_METHOD(updateDeviceList) {
RTCAudioSessionConfiguration *config = [self configForMode:self->activeMode];
[self setConfig:config error:nil];
if (self->forceSpeaker && !self->isSpeakerOn) {
RTCAudioSession *session = JitsiAudioSession.rtcAudioSession;
[session lockForConfiguration];
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
[session unlockForConfiguration];
@@ -326,8 +320,6 @@ RCT_EXPORT_METHOD(updateDeviceList) {
|| [portType isEqualToString:AVAudioSessionPortBluetoothLE]
|| [portType isEqualToString:AVAudioSessionPortBluetoothA2DP]) {
return kDeviceTypeBluetooth;
} else if ([portType isEqualToString:AVAudioSessionPortCarAudio]) {
return kDeviceTypeCar;
} else {
return kDeviceTypeUnknown;
}
@@ -363,7 +355,7 @@ RCT_EXPORT_METHOD(updateDeviceList) {
break;
}
}
for (AVAudioSessionPortDescription *portDesc in session.availableInputs) {
// Skip "Phone" if headphones are present.
if (headphonesAvailable && [portDesc.portType isEqualToString:AVAudioSessionPortBuiltInMic]) {

View File

@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>5.1.0</string>
<string>5.0.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>

View File

@@ -31,7 +31,6 @@
},
"audioDevices": {
"bluetooth": "بلوتوث",
"car": "مسجل السيارة",
"headphones": "سماعات رأس",
"none": "لا يوجد أي أجهزة صوت",
"phone": "هاتف",
@@ -40,6 +39,9 @@
"audioOnly": {
"audioOnly": "معدل تبادل البيانات منخفض"
},
"blankPage": {
"meetingEnded": "انتهى المُلتقى."
},
"breakoutRooms": {
"actions": {
"add": "أضف غرفة جانبية",
@@ -557,7 +559,6 @@
"errorMissingPassword": "الرجاء إدخال كلمة مرور المُلتقى",
"invalidPassword": "كلمة مرور غير صحيحة",
"joinRejectedMessage": "رفض رئيس الجلسة منحك الإذن بالدخول إلى المُلتقى",
"joinRejectedTitle": "تم رفض طلب الانضمام.",
"joinTitle": "انضم للمُلتقى",
"joinWithPasswordMessage": "الرجاء الانتظار أثناء محاولة الدخول دون كلمة مرور...",
"joiningMessage": "ستتمكن من الانضمام للمُلتقى بعد الموافقة على طلبك",
@@ -630,7 +631,6 @@
"displayNotifications": "عرض الإخطارات لـ",
"focus": "التركيز على المؤتمر",
"focusFail": "إنَّ {{component}} غير متاح. ستعاد المحاولة مرة أخرى خلال {{ms}} ثانية.",
"gifsMenu": "GIPHY",
"groupTitle": "إشعارات",
"hostAskedUnmute": "The moderator would like you to speak",
"invitedOneMember": "دُعِي {{name}}",
@@ -724,7 +724,6 @@
},
"passwordDigitsOnly": "حتى {{number}} عدد",
"passwordSetRemotely": "ضبطها مشارك آخر",
"pinnedParticipant": "تم تثبيت المشارك",
"polls": {
"answer": {
"skip": "تخطى",
@@ -866,7 +865,6 @@
"expandedPending": "بدء التسجيل...",
"failedToStart": "فشل بدء التسجيل",
"fileSharingdescription": "شارك التسجيل مع المشاركين للمُلتقى",
"highlight": "تسليط الضوء",
"highlightMoment": "لحظة تسليط الضوء",
"highlightMomentDisabled": "يمكنك تمييز اللحظات التي يبدأ فيها التسجيل",
"highlightMomentSuccess": "تم تمييز اللحظة",
@@ -920,7 +918,6 @@
"incomingMessage": "رسالة واردة",
"language": "اللغة",
"loggedIn": "الدخول باسم {{name}}",
"maxStageParticipants": "الحد الأقصى لعدد المشاركين الذين يمكن تثبيتهم في المرحلة الرئيسية",
"microphones": "المجهار (المايكروفون)",
"moderator": "رئيس الجلسة",
"more": "المزيد",
@@ -1217,12 +1214,10 @@
"moderator": "رئيس الجلسة",
"mute": "المشارك مكتوم الصوت",
"muted": "مكتوم",
"pinToStage": "تثبيت في المرحلة",
"remoteControl": "بدء / إيقاف التحكم البعيد",
"screenSharing": "المشارك يشارك شاشته",
"show": "أظهر على المنصة",
"showSelfView": "إظهار الواجهة الذاتية",
"unpinFromStage": "فك",
"videoMuted": "الكاميرا معطلة",
"videomute": "أوقف المشارك الكاميرا"
},

View File

@@ -31,7 +31,6 @@
},
"audioDevices": {
"bluetooth": "Bluetooth",
"car": "Auto",
"headphones": "Kopfhörer",
"none": "Keine Audiogeräte verfügbar",
"phone": "Hörer",
@@ -217,8 +216,6 @@
"liveStreaming": "Livestream"
},
"add": "Hinzufügen",
"addMeetingNote": "Notiz zu dieser Konferenz hinzufügen",
"addOptionalNote": "Notiz hinzufügen (optional):",
"allow": "Erlauben",
"alreadySharedVideoMsg": "Eine andere Person gibt bereits ein Video weiter. Bei dieser Konferenz ist jeweils nur ein geteiltes Video möglich.",
"alreadySharedVideoTitle": "Nur ein geteiltes Video gleichzeitig",
@@ -270,8 +267,6 @@
"kickParticipantDialog": "Wollen Sie diese Person wirklich entfernen?",
"kickParticipantTitle": "Person entfernen?",
"kickTitle": "Autsch! {{participantDisplayName}} hat Sie aus dem Meeting geworfen",
"linkMeeting": "Konferenz verlinken",
"linkMeetingTitle": "Konferenz mit Salesforce verlinken",
"liveStreaming": "Livestreaming",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Während einer Aufnahme nicht möglich",
"liveStreamingDisabledTooltip": "Starten des Livestreams deaktiviert.",
@@ -308,11 +303,11 @@
"muteEveryonesVideoTitle": "Die Kamera von allen anderen ausschalten?",
"muteParticipantBody": "Sie können die Stummschaltung anderer Personen nicht aufheben, aber eine Person kann ihre eigene Stummschaltung jederzeit beenden.",
"muteParticipantButton": "Stummschalten",
"muteParticipantDialog": "Wollen Sie diese Person wirklich stummschalten? Sie können die Stummschaltung nicht wieder aufheben, die Person kann dies aber jederzeit selbst tun.",
"muteParticipantTitle": "Person stummschalten?",
"muteParticipantsVideoBody": "Sie können die Kamera nicht wieder aktivieren, die Teilnehmer können dies aber jederzeit wieder ändern.",
"muteParticipantsVideoBodyModerationOn": "Sie können die Kamera nicht wieder aktivieren und die Person selbst auch nicht.",
"muteParticipantsVideoButton": "Kamera ausschalten",
"muteParticipantsVideoDialog": "Wollen Sie die Kamera dieser Person wirklich deaktivieren? Sie können die Kamera nicht wieder aktivieren, die Person kann dies aber jederzeit selbst tun.",
"muteParticipantsVideoDialogModerationOn": "Wollen Sie die Kamera dieser Person wirklich deaktivieren? Sie können die Kamea nicht wieder aktivieren und die Person selbst auch nicht.",
"muteParticipantsVideoTitle": "Die Kamera von dieser Person ausschalten?",
"noDropboxToken": "Kein gültiges Dropbox-Token",
"password": "Passwort",
@@ -326,7 +321,6 @@
"popupError": "Ihr Browser blockiert Pop-ups von dieser Website. Bitte aktivieren Sie Pop-ups in den Sicherheitseinstellungen des Browsers und versuchen Sie es erneut.",
"popupErrorTitle": "Pop-up blockiert",
"readMore": "mehr",
"recentlyUsedObjects": "Ihre zuletzt verwendeten Objekte",
"recording": "Aufnahme",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Während eines Livestreams nicht möglich",
"recordingDisabledTooltip": "Start der Aufzeichnung deaktiviert.",
@@ -349,12 +343,6 @@
"screenSharingFailed": "Ups! Beim Teilen des Bildschirms ist etwas schiefgegangen!",
"screenSharingFailedTitle": "Bildschirmfreigabe fehlgeschlagen!",
"screenSharingPermissionDeniedError": "Ups! Etwas stimmt nicht mit Ihren Berechtigungen zur Bildschirmfreigabe. Bitte neu laden und erneut versuchen.",
"searchInSalesforce": "In Salesforce suchen",
"searchResults": "Suchergebnisse({{count}})",
"searchResultsDetailsError": "Beim Abrufen der Daten des Besitzers ist ein Fehler aufgetreten.",
"searchResultsError": "Beim Abrufen der Daten ist ein Fehler aufgetreten.",
"searchResultsNotFound": "Keine Suchergebnisse.",
"searchResultsTryAgain": "Versuchen Sie es mit anderen Stichwörtern.",
"sendPrivateMessage": "Sie haben kürzlich eine private Nachricht erhalten. Hatten Sie die Absicht, darauf privat zu antworten, oder wollen Sie Ihre Nachricht an die Gruppe senden?",
"sendPrivateMessageCancel": "An die Gruppe senden",
"sendPrivateMessageOk": "Privat antworten",
@@ -422,10 +410,6 @@
"veryBad": "Sehr schlecht",
"veryGood": "Sehr gut"
},
"giphy": {
"noResults": "Keine Ergebnisse :(",
"search": "GIPHY durchsuchen"
},
"helpView": {
"header": "Hilfecenter"
},
@@ -492,7 +476,6 @@
"focusLocal": "Lokales Video fokussieren",
"focusRemote": "Auf das Video einer anderen Person fokussieren",
"fullScreen": "Vollbildmodus aktivieren oder deaktivieren",
"giphyMenu": "GIPHY ein- oder ausblenden",
"keyboardShortcuts": "Tastenkürzel",
"localRecording": "Lokale Aufzeichnungssteuerelemente ein- oder ausblenden",
"mute": "Stummschaltung aktivieren oder deaktivieren",
@@ -560,7 +543,6 @@
"errorMissingPassword": "Bitte das Konferenzpasswort eingeben",
"invalidPassword": "Ungültiges Passwort",
"joinRejectedMessage": "Ihre Beitrittsanfrage wurde von der Moderation abgelehnt.",
"joinRejectedTitle": "Beitrittsanfrage abgelehnt.",
"joinTitle": "Konferenz beitreten",
"joinWithPasswordMessage": "Beitrittsversuch mit Passwort, bitte warten …",
"joiningMessage": "Sie treten der Konferenz bei, sobald jemand Ihre Anfrage annimmt.",
@@ -633,7 +615,6 @@
"displayNotifications": "Benachrichtigungen anzeigen für",
"focus": "Konferenzleitung",
"focusFail": "{{component}} ist im Moment nicht verfügbar wiederholen in {{ms}} Sekunden",
"gifsMenu": "GIPHY",
"groupTitle": "Benachrichtigungen",
"hostAskedUnmute": "Die Moderation bittet Sie, das Mikrofon zu aktivieren",
"invitedOneMember": "{{name}} wurde eingeladen",
@@ -643,12 +624,6 @@
"leftOneMember": "{{name}} hat die Konferenz verlassen",
"leftThreePlusMembers": "{{name}} und Weitere haben die Konferenz verlassen",
"leftTwoMembers": "{{first}} und {{second}} haben die Konferenz verlassen",
"linkToSalesforce": "Mit Salesforce verlinken",
"linkToSalesforceDescription": "Sie können die Zusammenfassung der Konferenz mit einem Objekt bei Salesforce verlinken.",
"linkToSalesforceError": "Konferenz konnte nicht mit Salesforce verlinkt werden",
"linkToSalesforceKey": "Konferenz verlinken",
"linkToSalesforceProgress": "Konferenz wird mit Salesforce verlinkt...",
"linkToSalesforceSuccess": "Die Konferenz wurde mit Salesforce verlinkt",
"me": "Ich",
"moderationInEffectCSDescription": "Bitte melden um ein Video zu teilen",
"moderationInEffectCSTitle": "Die Videofreigabe ist von der Moderation gesperrt",
@@ -727,7 +702,6 @@
},
"passwordDigitsOnly": "Bis zu {{number}} Ziffern",
"passwordSetRemotely": "von einer anderen Person gesetzt",
"pinnedParticipant": "Die Person ist angeheftet",
"polls": {
"answer": {
"skip": "Überspringen",
@@ -843,18 +817,6 @@
},
"raisedHand": "Ich möchte sprechen",
"raisedHandsLabel": "Anzahl gehobener Hände",
"record": {
"already": {
"linked": "Diese Konferenz ist bereits mit einem Objekt bei Salesforce verlinkt."
},
"type": {
"account": "Account",
"contact": "Contact",
"lead": "Lead",
"opportunity": "Opportunity",
"owner": "Owner"
}
},
"recording": {
"authDropboxText": "In Dropbox hochladen",
"availableSpace": "Verfügbarer Speicherplatz: {{spaceLeft}} MB (ca. {{duration}} Minuten Aufzeichnung)",
@@ -869,11 +831,6 @@
"expandedPending": "Aufzeichnung wird gestartet…",
"failedToStart": "Die Aufnahme konnte nicht gestartet werden",
"fileSharingdescription": "Aufzeichnung mit den Personen der Konferenz teilen",
"highlight": "Highlight",
"highlightMoment": "Moment als Highlight festhalten",
"highlightMomentDisabled": "Sie können Momente als Highlights festhalten, sobald die Aufnahme startet",
"highlightMomentSuccess": "Highlight festgehalten",
"highlightMomentSucessDescription": "Ihr festgehaltener Moment wird zur Zusammenfassung des Meeting hinzugefügt.",
"inProgress": "Aufzeichnung gestartet",
"limitNotificationDescriptionNative": "Wegen hoher Nachfrage ist Ihre Aufnahme auf {{limit}} Min. begrenzt. Für unlimitierte Aufnahmen nutzen Sie bitte <3>{{app}}</3>.",
"limitNotificationDescriptionWeb": "Wegen hoher Nachfrage ist Ihre Aufnahme auf {{limit}} Min. begrenzt. Für unlimitierte Aufnahmen nutzen Sie bitte <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
@@ -888,7 +845,6 @@
"rec": "AUFZ",
"serviceDescription": "Ihre Aufzeichnung wird vom Aufzeichnungsdienst gespeichert",
"serviceDescriptionCloud": "Cloud-Aufzeichnung",
"serviceDescriptionCloudInfo": "Aufzeichnungen werden 24 Stunden nach Aufzeichnungsende automatisch gelöscht.",
"serviceName": "Aufnahmedienst",
"sessionAlreadyActive": "Diese Konferenz wird bereits aufgezeichnet.",
"signIn": "Anmelden",
@@ -923,7 +879,6 @@
"incomingMessage": "Eingehende Nachricht",
"language": "Sprache",
"loggedIn": "Als {{name}} angemeldet",
"maxStageParticipants": "Maximale Anzahl an Personen, die zur Hauptansicht angeheftet werden können",
"microphones": "Mikrofon",
"moderator": "Moderation",
"more": "Mehr",
@@ -1022,7 +977,6 @@
"expand": "Ausklappen",
"feedback": "Feedback hinterlassen",
"fullScreen": "Vollbildmodus ein-/ausschalten",
"giphy": "GIPHY ein-/ausschalten",
"grantModerator": "Moderationsrechte vergeben",
"hangup": "Konferenz verlassen",
"help": "Hilfe",
@@ -1030,7 +984,6 @@
"kick": "Person entfernen",
"laugh": "Lachen",
"like": "Daumen nach oben",
"linkToSalesforce": "Mit Salesforce verlinken",
"lobbyButton": "Lobbymodus ein-/ausschalten",
"localRecording": "Lokale Aufzeichnungssteuerelemente ein-/ausschalten",
"lockRoom": "Konferenzpasswort ein-/ausschalten",
@@ -1040,8 +993,8 @@
"mute": "Mikrofon aktivieren / deaktivieren",
"muteEveryone": "Alle stummschalten",
"muteEveryoneElse": "Alle anderen stummschalten",
"muteEveryoneElsesVideoStream": "Alle anderen Kameras ausschalten",
"muteEveryonesVideoStream": "Alle Kameras ausschalten",
"muteEveryoneElsesVideo": "Alle anderen Kameras ausschalten",
"muteEveryonesVideo": "Alle Kameras ausschalten",
"participants": "Anwesende",
"pip": "Bild-in-Bild-Modus ein-/ausschalten",
"privateMessage": "Private Nachricht senden",
@@ -1092,7 +1045,6 @@
"exitFullScreen": "Vollbildmodus verlassen",
"exitTileView": "Kachelansicht ausschalten",
"feedback": "Feedback hinterlassen",
"giphy": "GIPHY ein-/ausschalten",
"hangup": "Konferenz verlassen",
"help": "Hilfe",
"invite": "Personen einladen",
@@ -1100,7 +1052,6 @@
"laugh": "Lachen",
"leaveBreakoutRoom": "Breakout-Raum verlassen",
"like": "Daumen hoch",
"linkToSalesforce": "Mit Salesforce verknüpfen",
"lobbyButtonDisable": "Lobbymodus deaktivieren",
"lobbyButtonEnable": "Lobbymodus aktivieren",
"login": "Anmelden",
@@ -1220,12 +1171,10 @@
"moderator": "Moderation",
"mute": "Person ist stumm geschaltet",
"muted": "Stummgeschaltet",
"pinToStage": "Anheften",
"remoteControl": "Fernsteuerung",
"screenSharing": "Person teilt den Bildschirm",
"show": "Im Vordergrund anzeigen",
"showSelfView": "Eigene Ansicht anzeigen",
"unpinFromStage": "Lösen",
"videoMuted": "Kamera ausgeschaltet",
"videomute": "Person hat die Kamera angehalten"
},

View File

@@ -39,6 +39,9 @@
"audioOnly": {
"audioOnly": "پهنای باند پایین"
},
"blankPage": {
"meetingEnded": "جلسه تمام شد"
},
"breakoutRooms": {
"actions": {
"add": "یک گروه کوچک اضافه کنید",
@@ -80,7 +83,6 @@
"enter": "وارد اتاق شوید",
"error": "پیام شما ارسال نشد: {{error}}",
"fieldPlaceHolder": "پیام خود را بنویسید",
"lobbyChatMessageTo": "پیام چت لابی به {{recipient}}",
"message": "پیام",
"messageAccessibleTitle": "{{user}} می‌گوید:",
"messageAccessibleTitleMe": "من میگویم:",
@@ -213,8 +215,6 @@
"liveStreaming": "پخش زنده"
},
"add": "افزودن",
"addMeetingNote": "یک یادداشت برای این جلسه وارد کنید",
"addOptionalNote": "افزودن یادداشت (اختیاری):",
"allow": "اجازه دادن",
"alreadySharedVideoMsg": "یکی دیگر از شرکت‌کنندگان ویدیویی را به اشتراک گذاشته است؛ در این کنفرانس فقط یک ویدیو را می‌توان به صورت همزمان به اشتراک گذاشت",
"alreadySharedVideoTitle": "فقط یک ویدیو را می‌توان به صورت همزمان به اشتراک گذاشت",
@@ -266,8 +266,6 @@
"kickParticipantDialog": "آیا می‌خواهید این شرکت کننده را بیرون کنید؟",
"kickParticipantTitle": "این شرکت کننده را بیرون می‌کنید؟",
"kickTitle": "{{participantDisplayName}} شما را از جلسه بیرون کرد",
"linkMeeting": "لینک جلسه",
"linkMeetingTitle": "لینک جلسه به نیروی فروش",
"liveStreaming": "پخش زنده",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "هنگامی که ضبط جلسه فعال است، نمی‌توان پخش زنده انجام داد",
"liveStreamingDisabledTooltip": "پخش زنده غیرفعال شده است",
@@ -322,7 +320,6 @@
"popupError": "مرورگر شما پنجره‌های بازشونده را در این سایت مسدود کرده است؛ در تنظیمات امنیتی مرورگر خود، پنجره‌های بازشونده را برای این سایت فعال کرده و دوباره امتحان کنید",
"popupErrorTitle": "پنجره‌های بازشونده مسدود شده است",
"readMore": "بیشتر",
"recentlyUsedObjects": "اشیایی که اخیراً استفاده کرده اید",
"recording": "در حال ضبط",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "هنگامی که پخش زنده در جریان است نمی‌توان جلسه را ضبط کرد",
"recordingDisabledTooltip": "ضبط جلسه غیر فعال شده است",
@@ -345,12 +342,6 @@
"screenSharingFailed": "متاسفانه مشکلی پیش آمده است و امکان به اشتراک گذاری صفحه نمایش وجود ندارد",
"screenSharingFailedTitle": "به اشتراک گذاری صفحه نمایش با خطا مواجه شد",
"screenSharingPermissionDeniedError": "در دسترسی به مجوز به اشتراک گذاری صفحه نمایش مشکلی پیش آمده است، لطفا صفحه را مجددا بارگیری نمایید",
"searchInSalesforce": "جستجو در salesforce",
"searchResults": "نتایج جستجو({{count}})",
"searchResultsDetailsError": "هنگام بازیابی اطلاعات مالک مشکلی پیش آمد.",
"searchResultsError": "هنگام بازیابی داده ها مشکلی پیش آمد.",
"searchResultsNotFound": "هیچ نتیجه ای برای این جستجو یافت نشد.",
"searchResultsTryAgain": "سعی کنید از کلمات کلیدی جایگزین استفاده کنید.",
"sendPrivateMessage": "شما یک پیام خصوصی دریافت کرده‌اید، می‌خواهید پاسخ آن را به صورت خصوصی برای فرستنده ارسال کنید یا در گروه به أن پاسخ دهید؟",
"sendPrivateMessageCancel": "ارسال به گروه",
"sendPrivateMessageOk": "ارسال به صورت خصوصی",
@@ -373,9 +364,7 @@
"shareVideoTitle": "به اشتراک گذاری ویدیو",
"shareYourScreen": "به اشتراک گذاری صفحه",
"shareYourScreenDisabled": "به اشتراک گذاری صفحه غیرفعال شده است",
"sharedVideoDialogError": "خطا: لینک نا معتبر است",
"sharedVideoLinkPlaceholder": "لینک یوتیوب یا لینک مستقیم ویدیو",
"start": "شروع ",
"startLiveStreaming": "پخش زنده",
"startRecording": "ضبط جلسه",
"startRemoteControlErrorMessage": "در کنترل از راه دور خطایی روی داده است!",
@@ -418,10 +407,6 @@
"veryBad": "خیلی بد",
"veryGood": "خیلی خوب"
},
"giphy": {
"noResults": "نتیجه ای یافت نشد :(",
"search": "جستجو GIPHY"
},
"helpView": {
"header": "مرکز راهنما"
},
@@ -488,7 +473,6 @@
"focusLocal": "تمرکز روی ویدیوی شما",
"focusRemote": "انتخاب تصویر مخاطب",
"fullScreen": "شروع یا پایان نمای تمام صفحه",
"giphyMenu": "منوی GIPHY را تغییر دهید",
"keyboardShortcuts": "کلیدهای میانبر",
"localRecording": "نمایش یا مخفی کردن کنترل ضبط شخصی‌",
"mute": "قطع و وصل میکروفن",
@@ -542,8 +526,7 @@
"admit": "پذیرفتن",
"admitAll": "پذیرفتن همه",
"allow": "اجازه دادن",
"backToKnockModeButton": رای پیوستن بدون رمز عبور درخواست دهید",
"chat": "چت",
"backToKnockModeButton": "بدون رمز عبور، برای پیوستن درخواست دهید",
"dialogTitle": "حالت لابی",
"disableDialogContent": "حالت لابی فعال شد، با این قابلیت مطمعن خواهید بود که افراد ناشناس به جلسه‌ی شما وارد نخواهند شد؛ آیا می‌خواهید این حالت را غیرفعال کنید؟",
"disableDialogSubmit": "غیرفعال کردن",
@@ -564,8 +547,6 @@
"knockButton": "درخواست پیوستن",
"knockTitle": "یک نفر می‌خواهد به جلسه بپیوندد",
"knockingParticipantList": "Knocking لیست شرکت‌کنندگان",
"lobbyChatStartedNotification": "{{moderator}} شروع به یک چت لابی با {{attendee}} .کرد",
"lobbyChatStartedTitle": "{{moderator}} شروع به یک چت لابی با شما کرد.",
"nameField": "نام خود را وارد کنید",
"notificationLobbyAccessDenied": "درخواست پیوستن {{targetParticipantName}} توسط {{originParticipantName}} رد شد",
"notificationLobbyAccessGranted": "درخواست پیوستن {{targetParticipantName}} توسط {{originParticipantName}} تایید شد",
@@ -637,12 +618,6 @@
"leftOneMember": "{{name}} از جلسه خارج شد",
"leftThreePlusMembers": "{{name}} و بسیاری دیگر جلسه را خارج شدند",
"leftTwoMembers": "{{first}} و {{second}} جلسه را خارج شدند",
"linkToSalesforce": "لینک به salesforce",
"linkToSalesforceDescription": "شما میتوانید خلاصه جلسه را به یک Salesforce لینک کنید.",
"linkToSalesforceError": "خطا در لینک کردن جلسه به Salesforce",
"linkToSalesforceKey": "این جلسه را لینک کن",
"linkToSalesforceProgress": "در حال لینک کردن جلسه به Salesforce...",
"linkToSalesforceSuccess": "جلسه به Salesforce لینک شد.",
"me": "من",
"moderationInEffectCSDescription": "لطفاً اگر می خواهید صفحه خود را به اشتراک بگذارید، دست را بالا ببرید.",
"moderationInEffectCSTitle": "اشتراک‌گذاری صفحه توسط مدیر مسدود شده است ",
@@ -666,8 +641,6 @@
"oldElectronClientDescription1": "به نظر می‌رسد شما از نسخه قدیمی استفاده می‌کنید که برخی آسیب‌پذیری امنیتی روی آن وجود دارد؛ لطفا از آخرین نسخه‌ی برنامه استفاده کنید",
"oldElectronClientDescription2": "آخرین نسخه",
"oldElectronClientDescription3": " الان!",
"participantWantsToJoin": "می خواهد به جلسه بپیوندد",
"participantsWantToJoin": "می خواهید به جلسه بپیوندید",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) توسط شرکت‌کننده‌ی دیگری حذف شد",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) توسط شرکت‌کننده دیگری تنظیم شد",
"raiseHandAction": "دست را بلند کن",
@@ -687,9 +660,7 @@
"videoMutedRemotelyDescription": "همیشه می توانید دوباره آن را روشن کنید.",
"videoMutedRemotelyTitle": "ویدیوی شما توسط {{participantDisplayName}} غیرفعال شده است",
"videoUnmuteBlockedDescription": "به دلیل محدودیت های سیستم، روشن کردن روشن کردن دوربین و اشتراک‌گذاری دسکتاپ به طور موقت مسدود شده است.",
"videoUnmuteBlockedTitle": "روشن کردن دوربین و اشتراک‌گذاری دسکتاپ مسدود شده است!",
"viewLobby": "مشاهده لابی",
"waitingParticipants": "{{waitingParticipants}} نفر"
"videoUnmuteBlockedTitle": "روشن کردن دوربین و اشتراک‌گذاری دسکتاپ مسدود شده است!"
},
"participantsPane": {
"actions": {
@@ -713,9 +684,9 @@
"close": "بستن",
"header": "شركت كنندگان",
"headings": {
"lobby": "لابی",
"lobby": "سالن انتظار",
"participantsList": "شرکت کنندگان در جلسه ({{count}})",
"waitingLobby": "در لابی ({{count}})"
"waitingLobby": "در سالن انتظار ({{count}})"
},
"search": "جستجوی شرکت کنندگان"
},
@@ -836,18 +807,6 @@
},
"raisedHand": "می‌خواهم صحبت کنم",
"raisedHandsLabel": "تعداد دست های بلند شده",
"record": {
"already": {
"linked": "رکورد قبلاً به این جلسه لینک شده است."
},
"type": {
"account": "اکانت",
"contact": "مخاطب",
"lead": "رهبر",
"opportunity": "فرصت",
"owner": "مالک"
}
},
"recording": {
"authDropboxText": "آپلود کردن در دراپ‌باکس",
"availableSpace": "فضای خالی: {{spaceLeft}} مگابایت (مناسب برای تقریبا {{duration}} دقیقه ضبط جلسه)",
@@ -862,11 +821,6 @@
"expandedPending": "ضبط آغاز شد...",
"failedToStart": "ضبط جلسه با خطا مواجه شد",
"fileSharingdescription": "به اشتراک گذاری ضبط جلسه با شرکت‌کنندگان",
"highlight": "هایلایت",
"highlightMoment": "هایلایت لحظه",
"highlightMomentDisabled": "شما میتوانید لحظه را هایلایت کنید وقتی ضبط کردن شروع شود.",
"highlightMomentSuccess": "لحظه هایلایت شد",
"highlightMomentSucessDescription": "لحظه های هایلایت شده شما به خلاصه جلسه اضافه میشود.",
"inProgress": "ضبط در یا پخش زنده حال انجام است",
"limitNotificationDescriptionNative": "با توجه به تعداد درخواست‌های بالا، ضبط جلسه به {{limit}} دقیقه محدود شده است؛ برای ضبط نامحدود <3>{{app}}</3> را ببینید",
"limitNotificationDescriptionWeb": "با توجه به تعداد درخواست‌های بالا، ضبط جلسه به {{limit}} دقیقه محدود شده است؛ برای ضبط نامحدود <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a> را ببینید",
@@ -881,7 +835,6 @@
"rec": "ضبط",
"serviceDescription": "ضبط جلسه توسط سرویس ضبط ذخیره خواهد شد",
"serviceDescriptionCloud": "ضبط ابری",
"serviceDescriptionCloudInfo": "جلسات ضبط شده بصورت اتوماتیک بعد از ۲۴ ساعت حذف خواهند شد.",
"serviceName": "سرویس ضبط",
"sessionAlreadyActive": "این جلسه قبلاً در حال ضبط یا پخش زنده است.",
"signIn": "ورود",
@@ -968,7 +921,6 @@
"speakerStats": {
"angry": "عصبانی",
"disgusted": "منزجر کرده ",
"displayEmotions": "نمایش احساسات",
"fearful": "ترسناک",
"happy": "خوشحال",
"hours": "{{count}} ساعت",
@@ -1014,7 +966,6 @@
"expand": "باز کردن",
"feedback": "ثبت بازخورد",
"fullScreen": "تغییر نمای تمام صفحه",
"giphy": "تغییر منوی GIPHY",
"grantModerator": "اعطای دسترسی مدیر",
"hangup": "قطع کردن تماس",
"help": "راهنما",
@@ -1022,7 +973,6 @@
"kick": "بیرون کردن",
"laugh": "خنده",
"like": "دوست داشتن ",
"linkToSalesforce": "لینک به Salesforce",
"lobbyButton": "فعال/غیرفعال کردن حالت لابی",
"localRecording": "تغییر تنظیمات کنترل ضبط",
"lockRoom": "تعویض رمز عبور جلسه",
@@ -1045,7 +995,6 @@
"remoteVideoMute": "دوربینی شرکت کننده را غیرفعال کردن",
"security": "گزینه‌های امنیتی",
"selectBackground": "انتخاب پس زمینه",
"selfView": "تغییر مشاهده خود",
"shareRoom": "دعوت دیگران",
"shareYourScreen": "تغییر اشتراک گذاری صفحه",
"shareaudio": "صدا را به اشتراک بگذارید",
@@ -1084,7 +1033,6 @@
"exitFullScreen": "اتمام نمای تمام صفحه",
"exitTileView": "خروج از نمای کاشی",
"feedback": "ثبت بازخورد",
"giphy": "تغییر منوی GIPHY",
"hangup": "ترک کردن جلسه",
"help": "راهنما",
"invite": "دعوت کردن",
@@ -1092,7 +1040,6 @@
"laugh": "خنده",
"leaveBreakoutRoom": "گروهی کوچک ترک کنید",
"like": "دوست داشتن ",
"linkToSalesforce": "لینک به Salesforce",
"lobbyButtonDisable": "غیرفعال کردن حالت لابی",
"lobbyButtonEnable": "فعال کردن حالت لابی",
"login": "ورود",
@@ -1213,9 +1160,7 @@
"mute": "شرکت کننده بیصدا است",
"muted": "بیصدا",
"remoteControl": "شروع/توقف کنترل از دور",
"screenSharing": "شرکت کننده صفحه خود را به اشتراک می گذارد",
"show": "نمایش روی صحنه",
"showSelfView": "نمایش خود",
"videoMuted": "دوربین غیرفعال است",
"videomute": "شرکت کننده دوربین را متوقف کرده است"
},

View File

@@ -39,6 +39,9 @@
"audioOnly": {
"audioOnly": "Bande passante faible"
},
"blankPage": {
"meetingEnded": "Réunion terminée."
},
"breakoutRooms": {
"actions": {
"add": "Ajouter salle annexe",
@@ -556,7 +559,6 @@
"errorMissingPassword": "Veuillez saisir le mot de passe de la réunion",
"invalidPassword": "Mot de passe invalide",
"joinRejectedMessage": "Votre requête pour rejoindre une réunion a été refusée par un modérateur.",
"joinRejectedTitle": "Demande d'accès rejetée.",
"joinTitle": "Rejoindre une réunion",
"joinWithPasswordMessage": "Tentative de rejoindre avec mot de passe, patientez s'il vous plait ...",
"joiningMessage": "Vous allez rejoindre une réunion dès que quelqu'un aura accepté votre demande",
@@ -629,7 +631,6 @@
"displayNotifications": "Afficher les notifications pour",
"focus": "Focus de conférence",
"focusFail": "{{component}} n'est pas disponible - réessayez dans {{ms}} sec",
"gifsMenu": "GIPHY",
"groupTitle": "Notifications",
"hostAskedUnmute": "Le modérateur souhaite vous donner la parole",
"invitedOneMember": "{{name}} a été invité(e)",
@@ -723,7 +724,6 @@
},
"passwordDigitsOnly": "Jusqu'à {{number}} chiffres",
"passwordSetRemotely": "défini par un autre participant",
"pinnedParticipant": "Participant toujours affiché",
"polls": {
"answer": {
"skip": "Passer",
@@ -865,11 +865,6 @@
"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",
"highlight": "Souligner",
"highlightMoment": "Souligner un moment",
"highlightMomentDisabled": "Vous ne pouvez souligner des moments que pendant une réunion",
"highlightMomentSuccess": "Moment souligné",
"highlightMomentSucessDescription": "Votre moment souligné sera ajouté au résumé de la réunion.",
"inProgress": "Enregistrement ou diffusion en cours",
"limitNotificationDescriptionNative": "En raison d'une forte demande, votre enregistrement sera limité à {{limit}} min. Pour des enregistrements illimités, essayez <3> {{app}} </3>.",
"limitNotificationDescriptionWeb": "En raison d'une forte demande, votre enregistrement sera limité à {{limit}} min. Pour des enregistrements illimités, essayez <a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>.",
@@ -1213,14 +1208,12 @@
"hideSelfView": "Cacher l'affichage de votre propre vidéo",
"kick": "Exclure",
"moderator": "Modérateur",
"mute": "Le participant a coupé son micro",
"mute": "Un participant a coupé son micro",
"muted": "Muet",
"pinToStage": "Garder affiché",
"remoteControl": "Démarrer / Arrêter le contrôle à distance",
"screenSharing": "Cette personne partage son écran",
"show": "Afficher en premier plan",
"showSelfView": "Montrer votre propre vidéo",
"unpinFromStage": "Ne plus garder affiché",
"videoMuted": "Caméra coupée",
"videomute": "Le participant a arrêté la caméra"
},

View File

@@ -31,7 +31,6 @@
},
"audioDevices": {
"bluetooth": "Bluetooth",
"car": "Vivavoce Auto",
"headphones": "Cuffie",
"none": "Nessun dispositivo audio esistente",
"phone": "Telefono",
@@ -40,25 +39,6 @@
"audioOnly": {
"audioOnly": "Utilizzo di minore banda"
},
"breakoutRooms": {
"actions": {
"add": "Crea sottogruppo",
"autoAssign": "Assegna automaticamente a sottogruppi",
"close": "Chiudi",
"join": "Entra",
"leaveBreakoutRoom": "Esci",
"more": "Mostra di più",
"remove": "Elimina",
"sendToBreakoutRoom": "Invia partecipante a:"
},
"defaultName": "Sottogruppo {{index}}",
"mainRoom": "Riunione principale",
"notifications": {
"joined": "Entrato nel sottogruppo \"{{name}}\"",
"joinedMainRoom": "Entrato nella riunione principale",
"joinedTitle": "Sottogruppo"
}
},
"calendarSync": {
"addMeetingURL": "Aggiungi un collegamento alla riunione",
"confirmAddLink": "Vuoi aggiungere un collegamento Jitsi a questo evento?",
@@ -81,11 +61,10 @@
"enter": "Entra nella conversazione",
"error": "Errore: il tuo messaggio non è stato inviato. Motivo: {{error}}",
"fieldPlaceHolder": "Scrivi qui il tuo messaggio",
"lobbyChatMessageTo": "Messaggio a {{recipient}} in sala d'attesa",
"message": "Messaggio",
"messageAccessibleTitle": "{{user}} dice:",
"messageAccessibleTitleMe": "io dico:",
"messageTo": "Messaggio privato a {{recipient}}",
"messageTo": "Messaggio privato per {{recipient}}",
"messagebox": "Digitare un messaggio",
"nickname": {
"popover": "Scegli un nickname",
@@ -93,10 +72,10 @@
"titleWithPolls": "Inserire un nickname per utilizzare la conversazione"
},
"noMessagesMessage": "Non ci sono ancora messaggi nella riunione. Comincia una conversazione, qui!",
"privateNotice": "Messaggio privato a {{recipient}}",
"privateNotice": "Messaggio privato per {{recipient}}",
"smileysPanel": "Pannello emoji",
"tabs": {
"chat": "Conversazione",
"chat": "Chat",
"polls": "Sondaggi"
},
"title": "Conversazione",
@@ -179,8 +158,7 @@
"joinInApp": "Entra in riunione usando l'app",
"launchWebButton": "Avvia sul web",
"title": "Sto avviando la riunione su {{app}}...",
"tryAgainButton": "Prova di nuovo sul desktop",
"unsupportedBrowser": "Sembra tu stia usando un browser che non supportiamo."
"tryAgainButton": "Prova di nuovo sul desktop"
},
"defaultLink": "es. {{url}}",
"defaultNickname": "es. Anna Rossi",
@@ -208,14 +186,12 @@
"Share": "Condividi",
"Submit": "Invia",
"WaitForHostMsg": "La riunione non è ancora cominciata. Se sei l'organizzatore, per favore autenticati. Altrimenti, aspetta l'arrivo dell'organizzatore.",
"WaitingForHostTitle": "In attesa dell'organizzatore...",
"WaitingForHost": "In attesa dell'organizzatore...",
"Yes": "Sì",
"accessibilityLabel": {
"liveStreaming": "Diretta streaming"
},
"add": "Aggiungi",
"addMeetingNote": "Aggiungi una a questa riunione",
"addOptionalNote": "Aggiungi una nota (facoltativo):",
"allow": "Consenti",
"alreadySharedVideoMsg": "Un altro utente sta condividendo un video. Questa riunione permette di condividere un solo video alla volta.",
"alreadySharedVideoTitle": "È permesso un solo video alla volta",
@@ -267,8 +243,6 @@
"kickParticipantDialog": "Sei sicuro di voler escludere questo partecipante?",
"kickParticipantTitle": "Escludi questo partecipante?",
"kickTitle": "Escluso dalla riunione",
"linkMeeting": "Link meeting",
"linkMeetingTitle": "Link meeting to Salesforce",
"liveStreaming": "Diretta",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Impossibile durante la registrazione.",
"liveStreamingDisabledTooltip": "Trasmissioni in diretta disabilitate.",
@@ -288,9 +262,9 @@
"micPermissionDeniedError": "Non hai concesso il permesso di usare il microfono. Puoi comunque partecipare alla riunione ma gli altri non potranno sentirti. Usa il bottone a forma di telecamera nella barra degli indirizzi per cambiare impostazioni.",
"micTimeoutError": "Impossibile avviare la fonte audio. Tempo di attesa scaduto.",
"micUnknownError": "Impossibile usare il microfono per un motivo sconosciuto.",
"moderationAudioLabel": "Permetti ai partecipenti di riaccendere il microfono",
"moderationVideoLabel": "Permetti ai partecipanti di riattivare la videocamera",
"muteEveryoneDialog": "I partecipanti possono riaccenderli in quasiasi momento.",
"moderationAudioLabel": "Permetti ai partecipenti di accendere il microfono",
"moderationVideoLabel": "Permetti ai partecipanti di arrivare la videocamera",
"muteEveryoneDialog": "Sei sicuro di voler spegnere il microfono a tutti? Non potrai riattivarli, ma loro potranno farlo in qualsiasi momento.",
"muteEveryoneDialogModerationOn": "I partecipanti possono fare richiesta di parlare in ogni momento.",
"muteEveryoneElseDialog": "Una volta spenti i microfoni non potrai riattivarli, ma loro potranno farlo in qualsiasi momento.",
"muteEveryoneElseTitle": "Spengo il microfono a tutti, eccetto a {{whom}}?",
@@ -305,11 +279,11 @@
"muteEveryonesVideoTitle": "Vuoi spegnere le videocamere di tutti?",
"muteParticipantBody": "Non sarai in grado di riattivare il loro microfono, ma loro potranno riattivarlo in qualsiasi momento.",
"muteParticipantButton": "Spegni microfono",
"muteParticipantDialog": "Sei sicuro di voler spegnere il microfono di questo partecipante? Lui potrà riattivarlo in ogni momento.",
"muteParticipantTitle": "Spengo il microfono a questo partecipante?",
"muteParticipantsVideoBody": "Una volta spenta la videocamera non potrai riaccenderla, ma lui potrà riattivarla in qualsiasi momento.",
"muteParticipantsVideoBodyModerationOn": "Non potrai riaccendere le videocamere, né potranno loro.",
"muteParticipantsVideoButton": "Spegni videocamera",
"muteParticipantsVideoDialog": "Sei sicuro di voler spegnere la videocamera di questo partecipante? Lui potrà riattivarla in ogni momento.",
"muteParticipantsVideoDialogModerationOn": "Are you sure you want to turn off this participant's camera? You won't be able to turn the camera back on and neither will they.",
"muteParticipantsVideoTitle": "Vuoi spegnere la videocamera di questo partecipante?",
"noDropboxToken": "Token Dropbox non valido",
"password": "Password",
@@ -323,7 +297,6 @@
"popupError": "Il tuo browser sta bloccando i pop-up da questo sito. Per favore abilita i pop-up dalle impostazioni di sicurezza del browser e riprova.",
"popupErrorTitle": "Pop-up bloccato",
"readMore": "continua",
"recentlyUsedObjects": "Gli oggetti che hai usato di recente",
"recording": "Registrazione",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Impossibile durante una diretta.",
"recordingDisabledTooltip": "Registrazione disabilitata.",
@@ -346,12 +319,6 @@
"screenSharingFailed": "Ops! Non è stato possibile avviare la condivisione dello schermo!",
"screenSharingFailedTitle": "Condivisione dello schermo fallita!",
"screenSharingPermissionDeniedError": "Qualcosa non funziona nei permessi di condivisione dello schermo. Ricarica e riprova.",
"searchInSalesforce": "Cerca in Salesforce",
"searchResults": "Risultati ricerca({{count}})",
"searchResultsDetailsError": "Qualcosa non ha funzionato nella ricezione dei dati del proprietario.",
"searchResultsError": "Qualcosa non ha funzionato nella ricezione dei dati.",
"searchResultsNotFound": "Nessun risultato.",
"searchResultsTryAgain": "Prova altre parole di ricerca.",
"sendPrivateMessage": "Hai ricevuto un messaggio privato poco fa. Vorresti rispondergli privatamente o vuoi mandare la risposta al gruppo?",
"sendPrivateMessageCancel": "Invia al gruppo",
"sendPrivateMessageOk": "Invia privatamente",
@@ -374,10 +341,8 @@
"shareVideoTitle": "Condividi un video",
"shareYourScreen": "Condividi schermo",
"shareYourScreenDisabled": "Condivisione schermo disabilitata.",
"sharedVideoDialogError": "Errore: URL non valido",
"sharedVideoLinkPlaceholder": "Link YouTube o link video diretto",
"start": "Avvia ",
"startLiveStreaming": "Avvia diretta",
"startLiveStreaming": "Inizia una diretta",
"startRecording": "Inizia a registrare",
"startRemoteControlErrorMessage": "Si è verificato un errore nel tentativo di avviare la sessione di controllo remoto!",
"stopLiveStreaming": "Ferma la diretta streaming",
@@ -419,10 +384,6 @@
"veryBad": "Pessima",
"veryGood": "Ottima"
},
"giphy": {
"noResults": "Trovato niente :(",
"search": "Cerca in GIPHY"
},
"helpView": {
"header": "Aiuto"
},
@@ -489,7 +450,6 @@
"focusLocal": "Sposta il focus sul tuo video",
"focusRemote": "Sposta il focus sul video di un altro partecipante",
"fullScreen": "Attiva o disattiva schermo intero",
"giphyMenu": "Mostra menù GIPHY",
"keyboardShortcuts": "Scorciatoie da tastiera",
"localRecording": "Mostra o nascondi i controlli per la registrazione",
"mute": "Attiva o disattiva il microfono",
@@ -519,7 +479,6 @@
"failedToStart": "Avvio trasmissione in diretta fallito",
"getStreamKeyManually": "Non siamo stati in grado di trovare nessuna trasmissione dal vivo. Prova ad ottenere una chiave stream da Youtube",
"googlePrivacyPolicy": "Norme sulla riservatezza di Google",
"inProgress": "Diretta o registrazione in corso",
"invalidStreamKey": "La chiave per le dirette potrebbe non essere corretta.",
"limitNotificationDescriptionNative": "La tua diretta sarà limitata a {{limit}} minuti. Per dirette illimitate, prova {{app}}.",
"limitNotificationDescriptionWeb": "Data l'alta domanda la tua diretta sarà limitata a {{limit}} minuti. Per dirette illimitate, prova <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
@@ -529,7 +488,6 @@
"onBy": "{{name}} ha iniziato la diretta",
"pending": "Avvio diretta...",
"serviceName": "Servizio dirette",
"sessionAlreadyActive": "Questa sessione è in già in fase di registrazione o trasmessione in diretta.",
"signIn": "Collegati con Google",
"signInCTA": "Collegati o inserisci la tua chiave YouTube per la trasmissione in diretta.",
"signOut": "Scollegati",
@@ -544,7 +502,6 @@
"admitAll": "Ammetti tutti",
"allow": "Autorizza",
"backToKnockModeButton": "Nessuna password, richiedi l'accesso",
"chat": "Conversazione",
"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",
@@ -557,7 +514,6 @@
"errorMissingPassword": "Per favore, mettere la password della riunione",
"invalidPassword": "Password errata",
"joinRejectedMessage": "La tua richiesta d'accesso è stata respinta da un moderatore.",
"joinRejectedTitle": "Richiesta d'ingresso respinta.",
"joinTitle": "Entra nella riunione",
"joinWithPasswordMessage": "Ho inviato la password per entrare, attendi...",
"joiningMessage": "Entrerai nella riunione non appena qualcuno approva la tua richiesta",
@@ -566,8 +522,6 @@
"knockButton": "Chiedi d'entrare",
"knockTitle": "Qualcuno vuole entrare nella riunione",
"knockingParticipantList": "Lista dei partecipanti in attesa",
"lobbyChatStartedNotification": "{{moderator}} sta parlando con {{attendee}} in sala d'attesa",
"lobbyChatStartedTitle": "{{moderator}} sta parlando con te in sala d'attesa.",
"nameField": "Scrivi il tuo nome",
"notificationLobbyAccessDenied": "{{targetParticipantName}} è stato respinto da {{originParticipantName}}",
"notificationLobbyAccessGranted": "{{targetParticipantName}} è stato autorizzato ad entrare da {{originParticipantName}}",
@@ -620,32 +574,18 @@
"OldElectronAPPTitle": "Falla di sicurezza!",
"allowAction": "Permetti",
"allowedUnmute": "Puoi accendere il microfono, avviare la videocamera, o condividere il tuo schermo.",
"audioUnmuteBlockedDescription": "Lo sblocco dei microfoni è stato temporaneament bloccato per limiti del sistema.",
"audioUnmuteBlockedTitle": "Riattivazione dei microfoni bloccata!",
"chatMessages": "Messaggi delle conversazioni",
"connectedOneMember": "{{name}} si è connesso",
"connectedThreePlusMembers": "{{name}} e altri {{count}} si sono connessi",
"connectedTwoMembers": "{{first}} e {{second}} si sono connessi",
"disconnected": "disconnesso",
"displayNotifications": "Mostra le notifiche per",
"focus": "Focus su riunione",
"focusFail": "{{component}} non disponibile - riprova in {{ms}} sec",
"gifsMenu": "GIPHY",
"grantedTo": "Permessi di moderatore accordati a {{to}}!",
"groupTitle": "Notifiche",
"hostAskedUnmute": "Il moderatore vorrebbe che tu parlassi",
"invitedOneMember": "{{displayName}} è stato invitato",
"invitedThreePlusMembers": "Hai invitato {{name}} e altri {{count}}",
"invitedTwoMembers": "Hai invitato {{first}} e {{second}}",
"kickParticipant": "{{kicked}} è stato espulso da {{kicker}}",
"leftOneMember": "{{name}} ha lasciato la riunione",
"leftThreePlusMembers": "{{name}} e molti altri hanno lasciato la riunione",
"leftTwoMembers": "{{first}} e {{second}} hanno lasciato la riunione",
"linkToSalesforce": "Collega a Salesforce",
"linkToSalesforceDescription": "Puoi collegare il sommario della riunione ad un oggetto Salesforce.",
"linkToSalesforceError": "Failed to link meeting to Salesforce",
"linkToSalesforceKey": "Link this meeting",
"linkToSalesforceProgress": "Linking meeting to Salesforce...",
"linkToSalesforceSuccess": "The meeting was linked to Salesforce",
"me": "Io",
"moderationInEffectCSDescription": "Alza la mano, se vuoi condividere lo schermo, per favore.",
"moderationInEffectCSTitle": "La condivisione schermo è stata bloccata dal moderatore",
@@ -669,18 +609,13 @@
"oldElectronClientDescription1": "Sembri stare usando una versione obsoleta del client Jitsi Meet che ha dei problemi di sicurezza noti. Assicurati di aggiornarla presso il nostro ",
"oldElectronClientDescription2": "ultima build",
"oldElectronClientDescription3": " ora!",
"participantWantsToJoin": "Vuole unirsi alla riunione",
"participantsWantToJoin": "Vogliono unirsi alla riunione",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) è stata tolta da un altro partecipante",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) è stata messa da un altro partecipante",
"raiseHandAction": "Alza la mano",
"raisedHand": "Vorrebbe intervenire.",
"raisedHands": "{{participantName}} e {{raisedHands}} altre persone",
"raisedHand": "{{name}} vorrebbe intervenire.",
"reactionSounds": "Disattiva suoni",
"reactionSoundsForAll": "Disattiva suoni a tutti",
"screenShareNoAudio": "L'opzione di condivisione audio non era selezionata nella schermata di selezione della finestra da condividere.",
"screenShareNoAudio": " L'opzione di condivisione audio non era selezionata nella schermata di selezione della finestra da condividere.",
"screenShareNoAudioTitle": "Condividi audio non è stato selezionato",
"selfViewTitle": "Puoi sempre ripristinare la tua immagine nelle impostazioni",
"somebody": "Qualcuno",
"startSilentDescription": "Entra di nuovo nella riunione, per attivare l'audio",
"startSilentTitle": "Sei entrato nella riunione senza aver scelto un dispositivo audio per sentire!",
@@ -688,30 +623,23 @@
"suboptimalExperienceTitle": "Avviso sul browser",
"unmute": "Accendi microfono",
"videoMutedRemotelyDescription": "Puoi riaccenderla in qualsiasi momento.",
"videoMutedRemotelyTitle": "La videocamera ti è stata spenta da {{participantDisplayName}}!",
"videoUnmuteBlockedDescription": "Riattivazione video e condivisione schermo sono state momentaneamente bloccate per limiti di sistema.",
"videoUnmuteBlockedTitle": "Riattivazione video e condivisione schermo bloccate!",
"viewLobby": "Vedi sala d'attesa",
"waitingParticipants": "{{waitingParticipants}} persone"
"videoMutedRemotelyTitle": "La videocamera ti è stata spenta da {{participantDisplayName}}!"
},
"participantsPane": {
"actions": {
"allow": "Permetti ai partecipanti di:",
"allowVideo": "Autorizza video",
"askUnmute": "Chiedi di riattivare audio",
"audioModeration": "Riattivare audio",
"askUnmute": "Chiedi di attivare audio",
"audioModeration": "Possono attivare audio",
"blockEveryoneMicCamera": "Blocca audio e video a tutti",
"invite": "Invita persone",
"moreModerationActions": "Altre opzioni di moderazione",
"moreModerationControls": "Altri controlli di moderazione",
"moreParticipantOptions": "Altre opzioni partecipanti",
"mute": "Silenzia",
"muteAll": "Silenzia tutti",
"muteEveryoneElse": "Silenzia tutti gli altri",
"stopEveryonesVideo": "Ferma il video di tutti",
"stopVideo": "Ferma il video",
"unblockEveryoneMicCamera": "Sblocca audio e video a tutti",
"videoModeration": "Riavviare videocamera"
"videoModeration": "Avvia il loro video"
},
"close": "Chiudi",
"header": "Partecipanti",
@@ -719,18 +647,15 @@
"lobby": "Sala d'attesa ({{count}})",
"participantsList": "Partecipanti alla riunione ({{count}})",
"waitingLobby": "In attesa ({{count}})"
},
"search": "Cerca partecipanti"
}
},
"passwordDigitsOnly": "Fino a {{number}} cifre",
"passwordSetRemotely": "definita da altro utente",
"pinnedParticipant": "Il partecipante è in evidenza",
"polls": {
"answer": {
"skip": "Salta",
"submit": "Invia"
},
"by": "Da {{ name }}",
"create": {
"addOption": "Aggiungi risposta",
"answerPlaceholder": "Risposta {{index}}",
@@ -806,9 +731,9 @@
"linkCopied": "Collegamento copiato negli appunti",
"lookGood": "Sembra che il tuo microfono funzioni correttamente",
"or": "o",
"premeeting": "Pre-riunione",
"premeeting": "Attesa riunione",
"screenSharingError": "Errore di condivisione dello schermo:",
"showScreen": "Attiva schermata pre-riunione",
"showScreen": "Avvia la schermata d'attesa della riunione",
"startWithPhone": "Avvia usando il telefono, per parlare",
"videoOnlyError": "Errore video:",
"videoTrackError": "Impossibile creare la traccia video.",
@@ -828,9 +753,6 @@
"rejected": "Rifiutato",
"ringing": "Sta suonando..."
},
"privacyView": {
"header": "Privacy"
},
"profile": {
"avatar": "avatar",
"setDisplayNameLabel": "Imposta il nome da visualizzare",
@@ -839,19 +761,6 @@
"title": "Profilo"
},
"raisedHand": "Vorrebbe parlare",
"raisedHandsLabel": "Numero di mani alzate",
"record": {
"already": {
"linked": "La riunione è già collegata a questo oggetto Salesforce."
},
"type": {
"account": "Account",
"contact": "Contact",
"lead": "Lead",
"opportunity": "Opportunity",
"owner": "Owner"
}
},
"recording": {
"authDropboxText": "Carica su Dropbox",
"availableSpace": "Spazio disponibile: {{spaceLeft}} MB (rimangono approssimativamente {{duration}} minuti di registrazione)",
@@ -866,12 +775,6 @@
"expandedPending": "La registrazione è in fase di avvio...",
"failedToStart": "Non è stato possibile avviare la registrazione",
"fileSharingdescription": "Condividi la registrazione con i partecipanti alla riunione",
"highlight": "Evidenzia",
"highlightMoment": "Evidenzia momento",
"highlightMomentDisabled": "Puoi evidenziare dei momenti quando parte la registrazione",
"highlightMomentSuccess": "Momento evidenziato",
"highlightMomentSucessDescription": "Il tuo momento evidenziato sarà aggiunto al riepilogo della riunione.",
"inProgress": "Registrazione o diretta in corso",
"limitNotificationDescriptionNative": "La tua registrazione sarà limitata a {{limit}} minuti. Per registrazioni illimitate, prova <3>{{app}}</3>.",
"limitNotificationDescriptionWeb": "Data l'alta domanda la tua registrazione sarà limitata a {{limit}} minuti. Per registrazioni illimitate, prova <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"linkGenerated": "Abbiamo generato un collegamento alla tua registrazione.",
@@ -885,9 +788,7 @@
"rec": "REC",
"serviceDescription": "La tua registrazione verrà salvata dal servizio di registrazione che hai scelto",
"serviceDescriptionCloud": "Registrazione in rete",
"serviceDescriptionCloudInfo": "Le riunioni registrate vengono automaticamente cancellate 24 ore dopo la registrazione.",
"serviceName": "Servizio di registrazione",
"sessionAlreadyActive": "Questa sessione è già in corso di registrazione o trasmissione in diretta.",
"signIn": "Entra",
"signOut": "Esci",
"unavailable": "Ops! Il {{serviceName}} non è al momento disponibile. Stiamo lavorando per risolvere il problema. Riprova più tardi.",
@@ -905,7 +806,7 @@
},
"settings": {
"calendar": {
"about": "Lintegrazione del calendario con {{appName}} è usata per accedere in sicurezza al proprio calendario e poter leggere i prossimi appuntamenti ",
"about": "Lintegrazione del calendario con {{appName}} è usata per accedere in sicurezza al proprio calendario per poter leggere i prossimi appuntamenti ",
"disconnect": "Disconnetti",
"microsoftSignIn": "Connettiti con un account Microsoft",
"signedIn": "Sto accedendo agli eventi del calendario per {{email}}. Fai click su «Disconnetti» per interrompere laccesso agli eventi del calendario.",
@@ -920,10 +821,9 @@
"incomingMessage": "Messaggio in arrivo",
"language": "Lingua",
"loggedIn": "Connesso come {{name}}",
"maxStageParticipants": "Numero massimo di partecipanti che possono essere aggiunti come oratori",
"microphones": "Microfoni",
"moderator": "Moderatore",
"more": "Mostra di più",
"more": "Altro",
"name": "Nome",
"noDevice": "Nessuno",
"participantJoined": "Partecipante Entrato",
@@ -934,12 +834,10 @@
"selectAudioOutput": "Uscita audio",
"selectCamera": "Videocamera",
"selectMic": "Microfono",
"selfView": "Tua immagine",
"sounds": "Suoni",
"speakers": "Altoparlanti",
"startAudioMuted": "Tutti cominciano a microfono spento",
"startReactionsMuted": "Spegni i suoni delle reazioni a tutti",
"startVideoMuted": "Tutti cominciano a videocamera disattivata",
"startVideoMuted": "Tutti cominciano a video disattivato",
"talkWhileMuted": "Parla senza microfono",
"title": "Impostazioni"
},
@@ -971,21 +869,13 @@
},
"speaker": "Relatore",
"speakerStats": {
"angry": "Arrabbiato",
"disgusted": "Disgustato",
"displayEmotions": "Mostra Emozioni",
"fearful": "Spaventato",
"happy": "Contento",
"hours": "{{count}}h",
"minutes": "{{count}}m",
"name": "Nome",
"neutral": "Neutro",
"sad": "Triste",
"search": "Cerca",
"seconds": "{{count}}s",
"speakerStats": "Statistiche",
"speakerTime": "Tempo",
"surprised": "Sorpreso"
"speakerTime": "Tempo"
},
"startupoverlay": {
"genericTitle": "Per la riunione devono essere usati il tuo microfono e la tua videocamera.",
@@ -997,9 +887,6 @@
"text": "Premi il pulsante <i>Ricollegati</i> per ricollegarti.",
"title": "La video chiamata si è interrotta perché il computer è stato sospeso."
},
"termsView": {
"header": "Termini"
},
"toolbar": {
"Settings": "Impostazioni",
"accessibilityLabel": {
@@ -1007,7 +894,6 @@
"audioOnly": "Spegni/Accendi audio",
"audioRoute": "Scegli l'uscita audio",
"boo": "Boo",
"breakoutRoom": "Entra/Lascia sottogruppo",
"callQuality": "Imposta qualità della chiamata",
"cc": "Avvia/Ferma sottotitoli",
"chat": "Entra/Esci da conversazione",
@@ -1019,7 +905,6 @@
"expand": "Espandi",
"feedback": "Lascia un feedback",
"fullScreen": "Apri/Chiudi schermo intero",
"giphy": "Menù GIPHY",
"grantModerator": "Autorizza moderatore",
"hangup": "Lascia la riunione",
"help": "Aiuto",
@@ -1027,7 +912,6 @@
"kick": "Espelli partecipante",
"laugh": "Ridi",
"like": "Mi piace",
"linkToSalesforce": "Collega a Salesforce",
"lobbyButton": "Attiva/disattiva sala d'attesa",
"localRecording": "Abilita/disattiva controlli di registrazione locale",
"lockRoom": "Attiva o disattiva password",
@@ -1050,7 +934,6 @@
"remoteVideoMute": "Spegni videocamera del partecipante",
"security": "Impostazioni di sicurezza",
"selectBackground": "Scegli sfondo",
"selfView": "Mostra tua immagine",
"shareRoom": "Invita qualcuno",
"shareYourScreen": "Attiva/disattiva condivisione schermo",
"shareaudio": "Condividi audio",
@@ -1084,20 +967,16 @@
"download": "Scarica le nostre app",
"e2ee": "Crittografia punto-punto",
"embedMeeting": "Incorpora riunione altrove",
"enterFullScreen": "Schermo intero",
"enterFullScreen": "Visualizza a schermo intero",
"enterTileView": "Vedi tutti i partecipanti",
"exitFullScreen": "Esci da schermo intero",
"exitTileView": "Vedi una persona sola",
"feedback": "Lascia un feedback",
"giphy": "Menù GIPHY",
"hangup": "Butta giù",
"help": "Aiuto",
"invite": "Invita persone",
"joinBreakoutRoom": "Entra in sottogruppo",
"laugh": "Ridi",
"leaveBreakoutRoom": "Lascia breakout room",
"like": "Mi piace",
"linkToSalesforce": "Collega a Salesforce",
"lobbyButtonDisable": "Disabilita sala d'attesa",
"lobbyButtonEnable": "Abilita sala d'attesa",
"login": "Accedi",
@@ -1139,7 +1018,6 @@
"speakerStats": "Statistiche",
"startScreenSharing": "Inizia la condivisione dello schermo",
"startSubtitles": "Avvia sottotitoli",
"stopAudioSharing": "Ferma condivisione audio",
"stopScreenSharing": "Ferma la condivisione dello schermo",
"stopSharedVideo": "Ferma video",
"stopSubtitles": "Ferma sottotitoli",
@@ -1185,21 +1063,17 @@
"pending": "{{displayName}} è stato invitato"
},
"videoStatus": {
"adjustFor": "Adjust for:",
"audioOnly": "AUD",
"audioOnlyExpanded": "Hai attivato la modalità per banda limitata. Questa modalità permette di risparmiare banda, ma non vedrai gli altri partecipanti.",
"bestPerformance": "Massime prestazioni",
"audioOnlyExpanded": "Hai attivato la modalità con banda limitata. Questa modalità permette di risparmiare banda, ma non vedrai gli altri partecipanti.",
"callQuality": "Qualità video",
"hd": "HD",
"hdTooltip": "Stai vedendo in alta definizione",
"highDefinition": "Alta definizione",
"highestQuality": "Massima definizione",
"labelTooiltipNoVideo": "Nessun video",
"labelTooltipAudioOnly": "Hai attivato la modalità per banda limitata",
"labelTooltipAudioOnly": "Hai attivato la modalità con banda limitata",
"ld": "LD",
"ldTooltip": "Stai vedendo a bassa definizione",
"lowDefinition": "Bassa definizione",
"performanceSettings": "Impostazione prestazioni",
"sd": "SD",
"sdTooltip": "Stai vedendo a definizione standard",
"standardDefinition": "Definizione standard"
@@ -1212,17 +1086,12 @@
"domuteVideoOfOthers": "Disattiva video di tutti gli altri",
"flip": "Rifletti",
"grantModerator": "Autorizza moderatore",
"hideSelfView": "Nascondi tua immagine",
"kick": "Espelli",
"moderator": "Moderatore",
"mute": "Il partecipante ha il microfono spento",
"muted": "Audio disattivato",
"pinToStage": "Aggiungi agli oratori",
"remoteControl": "Avvia/ferma il controllo remoto",
"screenSharing": "Il partecipante sta condividendo lo schermo",
"show": "Mostra tra gli oratori",
"showSelfView": "Mostra tua immagine",
"unpinFromStage": "Togli",
"show": "Mostra in primo piano",
"videoMuted": "Video disattivato",
"videomute": "Il partecipante ha la videocamera spenta"
},
@@ -1247,8 +1116,7 @@
"slightBlur": "Sfuoca leggermente",
"title": "Sfondi",
"uploadedImage": "Carica immagine {{index}}",
"webAssemblyWarning": "Il WebAssembly non è supportato",
"webAssemblyWarningDescription": "Il WebAssembly è disabilitato o non è supportat da questo browser"
"webAssemblyWarning": "Il WebAssembly not è supportato"
},
"volumeSlider": "Sbarra volume",
"welcomepage": {

View File

@@ -497,7 +497,6 @@
"errorMissingPassword": "Voer alstublieft het wachtwoord van de vergadering in",
"invalidPassword": "Ongeldig wachtwoord",
"joinRejectedMessage": "Uw verzoek tot deelname is afgewezen door een moderator.",
"joinRejectedTitle": "Verzoek tot deelname afgewezen",
"joinTitle": "Deelnemen aan vergadering",
"joinWithPasswordMessage": "Poging tot deelname met wachtwoord, even geduld a.u.b...",
"joiningMessage": "U neemt deel aan de vergadering zodra iemand uw verzoek accepteert",
@@ -890,7 +889,6 @@
"mute": "Audio dempen in- of uitschakelen",
"muteEveryone": "Iedereen dempen",
"muteEveryoneElse": "Alle anderen dempen",
"participants": "Deelnemers",
"pip": "Picture-in-Picture-modus in- of uitschakelen",
"privateMessage": "Verstuur privébericht",
"profile": "Uw profiel bewerken",
@@ -956,8 +954,6 @@
"noisyAudioInputDesc": "Het klinkt alsof uw microfoon ruis veroorzaakt. Overweeg te dempen of van apparaat te wisselen.",
"noisyAudioInputTitle": "Uw microfoon lijkt ruis te veroorzaken!",
"openChat": "Chat openen",
"openReactionsMenu": "Reactiemenu openen",
"participants": "Deelnemers",
"pip": "Picture-in-Picture-modus activeren",
"privateMessage": "Verstuur privébericht",
"profile": "Uw profiel bewerken",
@@ -1055,7 +1051,6 @@
},
"virtualBackground": {
"addBackground": "Achtergrond toevoegen",
"apply": "Toepassen",
"blur": "Vervagen",
"none": "Geen",
"pleaseWait": "Even geduld a.u.b...",

View File

@@ -39,6 +39,9 @@
"audioOnly": {
"audioOnly": "Largura de banda baixa"
},
"blankPage": {
"meetingEnded": "A reunião terminou."
},
"breakoutRooms": {
"actions": {
"add": "Adicionar salas simultâneas",
@@ -420,7 +423,7 @@
},
"giphy": {
"noResults": "Não foram encontrados resultados :(",
"search": "Procurar no GIPHY"
"search": "Procurar GIPHY"
},
"helpView": {
"header": "Centro de ajuda"
@@ -488,7 +491,7 @@
"focusLocal": "Focar no seu vídeo",
"focusRemote": "Focar no vídeo de outro participante",
"fullScreen": "Entrar ou sair do ecrã completo",
"giphyMenu": "Ativar/Desativar o menu GIPHY",
"giphyMenu": "Alternar o menu GIPHY",
"keyboardShortcuts": "Atalhos de teclado",
"localRecording": "Mostrar ou ocultar controlos de gravação local",
"mute": "Ligar ou desligar o seu microfone",
@@ -556,7 +559,6 @@
"errorMissingPassword": "Por favor introduza a senha da reunião",
"invalidPassword": "Senha inválida",
"joinRejectedMessage": "O seu pedido de adesão foi rejeitado por um moderador.",
"joinRejectedTitle": "Pedido de adesão rejeitado.",
"joinTitle": "Junte-se à reunião",
"joinWithPasswordMessage": "Tentando aderir com senha, por favor aguarde...",
"joiningMessage": "Participará na reunião assim que alguém aceitar o seu pedido",
@@ -629,7 +631,6 @@
"displayNotifications": "Mostrar notificações para",
"focus": "Foco da conferência",
"focusFail": "{{component}} não disponĩvel - tente em {{ms}} seg.",
"gifsMenu": "GIPHY",
"groupTitle": "Notificações",
"hostAskedUnmute": "O moderador gostaria que você falasse",
"invitedOneMember": "{{displayName}} foi convidado",
@@ -723,7 +724,6 @@
},
"passwordDigitsOnly": "Até {{number}} dígitos",
"passwordSetRemotely": "Definido por outro participante",
"pinnedParticipant": "O participante está fixado",
"polls": {
"answer": {
"skip": "Ignorar",
@@ -841,7 +841,7 @@
"raisedHandsLabel": "Número de mãos levantadas",
"record": {
"already": {
"linked": "A reunião já está ligada a este objecto da Força de vendas."
"linked": "O registo já está ligado a esta sessão."
},
"type": {
"account": "Conta",
@@ -865,11 +865,6 @@
"expandedPending": "Iniciando gravação...",
"failedToStart": "Falha ao iniciar a gravação",
"fileSharingdescription": "Partilhar o link da gravação com os participantes da reunião",
"highlight": "Destaque",
"highlightMoment": "Momento de destaque",
"highlightMomentDisabled": "É possível destacar momentos quando a gravação começa",
"highlightMomentSuccess": "Momento destacado",
"highlightMomentSucessDescription": "O seu momento destacado será acrescentado ao resumo da reunião.",
"inProgress": "Gravação ou transmissão em direto em curso",
"limitNotificationDescriptionNative": "Due to high demand your recording will be limited to {{limit}} min. Para gravações ilimitadas tente <3>{{app}}</3>.",
"limitNotificationDescriptionWeb": "Devido à grande procura, a sua gravação será limitada a {{limit}} min. For unlimited recordings try <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
@@ -1017,7 +1012,7 @@
"expand": "Expandir",
"feedback": "Deixar comentários",
"fullScreen": "Mudar para ecrã completo",
"giphy": "Ativar/Desativar o menu GIPHY",
"giphy": "Alternar o menu GIPHY",
"grantModerator": "Conceder direitos de moderador",
"hangup": "Sair da reunião",
"help": "Ajuda",
@@ -1087,7 +1082,7 @@
"exitFullScreen": "Sair de ecrã completo",
"exitTileView": "Sair de quadrícula",
"feedback": "Deixar comentários",
"giphy": "Ativar/Desativar o menu GIPHY",
"giphy": "Alternar o menu GIPHY",
"hangup": "Sair da reunião",
"help": "Ajuda",
"invite": "Convidar pessoas",
@@ -1215,12 +1210,10 @@
"moderator": "Moderador",
"mute": "Participante está sem som",
"muted": "Sem som",
"pinToStage": "Fixar no ecrã",
"remoteControl": "Iniciar / Parar controlo remoto",
"screenSharing": "Participante está a partilhar o seu ecrã",
"show": "Mostrar no palco",
"showSelfView": "Mostrar autovisualização",
"unpinFromStage": "Soltar",
"videoMuted": "Câmara desativada",
"videomute": "Participante parou a câmara"
},

View File

@@ -2,7 +2,6 @@
"addPeople": {
"add": "Пригласить",
"addContacts": "Пригласите других людей",
"contacts": "контакты",
"copyInvite": "Скопировать приглашение на встречу",
"copyLink": "Скопировать ссылку на встречу",
"copyStream": "Скопировать ссылку на прямую трансляцию",
@@ -17,14 +16,18 @@
"inviteMoreMailSubject": "Присоединиться к встрече {{appName}} ",
"inviteMorePrompt": "Пригласить других людей",
"linkCopied": "Ссылка скопирована в буфер обмена",
"loading": "Поиск людей и номеров телефонов",
"loadingNumber": "Проверка номера телефона",
"loadingPeople": "Поиск людей для приглашения",
"noResults": "Поиск не дал результата",
"noValidNumbers": "Пожалуйста, введите номер телефона",
"outlookEmail": "Электронная почта Outlook",
"phoneNumbers": "телефонные номера",
"searching": "Поиск...",
"searchNumbers": "Добавить номера телефонов",
"searchPeople": "Поиск людей",
"searchPeopleAndNumbers": "Поиск людей или добавление их телефонов",
"shareInvite": "Поделиться приглашением на встречу",
"shareLink": "Поделиться ссылкой на встречу чтобы пригласить других",
"shareStream": "Поделиться ссылкой на прямую трансляцию",
"sipAddresses": "sip-адреса",
"telephone": "Номер: {{number}}",
"title": "Пригласить людей на эту встречу",
"yahooEmail": "Электронная почта Yahoo"
@@ -39,28 +42,9 @@
"audioOnly": {
"audioOnly": "Только звук"
},
"breakoutRooms": {
"actions": {
"add": "Добавить комнату отдыха",
"autoAssign": "Auto assign to breakout roomsAuto assign to breakout rooms",
"close": "Закрыть",
"join": "Присоединиться",
"leaveBreakoutRoom": "Покинуть комнату отдыха",
"more": "Больше",
"remove": "Удалить",
"sendToBreakoutRoom": "Отправить участника к:"
},
"defaultName": "Комната отдыха #{{index}}",
"mainRoom": "Главная комната",
"notifications": {
"joined": "Подключение к \"{{name}}\" комнате отдыха",
"joinedMainRoom": "Соединение с главной комнатой",
"joinedTitle": "Комнаты отдыха"
}
},
"calendarSync": {
"addMeetingURL": "Добавить ссылку конференции",
"confirmAddLink": "Вы хотите добавить ссылку {{app}} к этому календарному событию?",
"confirmAddLink": "Вы хотите добавить ссылку Jitsi к этому календарному событию?",
"error": {
"appConfiguration": "Неправильно настроена интеграция календаря.",
"generic": "Произошла ошибка. Проверьте настройки календаря или попробуйте обновить его.",
@@ -77,13 +61,8 @@
"today": "Сегодня"
},
"chat": {
"enter": "Войди в комнату",
"error": "Ошибка: Ваше сообщение не было отправлено. Причина: {{error}}",
"fieldPlaceHolder": "Введите здесь ваше сообщение",
"lobbyChatMessageTo": "Сообщение пользователю {{recipient}}",
"message": "Сообщение",
"messageAccessibleTitle": "{{user}} говорит:",
"messageAccessibleTitleMe": "я говорю:",
"messageTo": "Личное сообщение пользователю {{recipient}}",
"messagebox": "Введите сообщение",
"nickname": {
@@ -93,18 +72,12 @@
},
"noMessagesMessage": "В конференции пока нет никаких сообщений. Начните разговор!",
"privateNotice": "Личное сообщение пользователю {{recipient}}",
"smileysPanel": "Emoji панель",
"tabs": {
"chat": "Чат",
"polls": "Опросы"
},
"title": "Чат",
"titleWithPolls": "Чат",
"you": "вы"
},
"chromeExtensionBanner": {
"buttonText": "Установить расширение Chrome",
"close": "Закрыть",
"dontShowAgain": "Не показывай мне это снова",
"installExtensionText": "Установите расширение для интеграции с Google Календарь и Office 365"
},
@@ -124,7 +97,8 @@
"FETCH_SESSION_ID": "Получение идентификатора сеанса…",
"GET_SESSION_ID_ERROR": "Ошибка получения идентификатора сеанса: {{code}}",
"GOT_SESSION_ID": "Получение идентификатора сеанса… Готово",
"LOW_BANDWIDTH": "Видео для {{displayName}} приостановлено из-за низкой пропускной способности"
"LOW_BANDWIDTH": "Видео для {{displayName}} приостановлено из-за низкой пропускной способности",
"RECONNECTING": "Проблема с сетью. Переподключение..."
},
"connectionindicator": {
"address": "Адрес:",
@@ -137,10 +111,12 @@
"e2e_rtt": "E2E RTT:",
"framerate": "Частота кадров:",
"less": "Краткая информация",
"localaddress": "Локальный адрес:",
"localaddress_plural": "Локальные адреса:",
"localport": "Локальный порт:",
"localport_plural": "Локальные порты:",
"localaddress_0": "Локальный адрес:",
"localaddress_1": "Локальных адреса:",
"localaddress_2": "Локальных адресов:",
"localport_0": "Локальный порт:",
"localport_1": "Локальных порта:",
"localport_2": "Локальных портов:",
"maxEnabledResolution": "Максимальное разрешение",
"more": "Подробная информация",
"packetloss": "Потери пакетов:",
@@ -152,15 +128,18 @@
"nonoptimal": "не оптимально",
"poor": "плохо"
},
"remoteaddress": "Удаленный адрес:",
"remoteaddress_plural": "Удаленные адреса:",
"remoteport": "Удаленный порт:",
"remoteport_plural": "Удаленные порты:",
"remoteaddress_0": "Удаленный адрес:",
"remoteaddress_1": "Удаленных адреса:",
"remoteaddress_2": "Удаленных адресов:",
"remoteport_0": "Удаленный порт:",
"remoteport_1": "Удаленных порта:",
"remoteport_2": "Удаленных портов:",
"resolution": "Разрешение:",
"savelogs": "Сохранить логи",
"status": "Связь:",
"transport": "Транспорт:",
"transport_plural": "Транспорты:",
"transport_0": "Метод отправки:",
"transport_1": "Метода отправки:",
"transport_2": "Методов отправки:",
"video_ssrc": "Видео SSRC:"
},
"dateUtils": {
@@ -177,9 +156,9 @@
"ifHaveApp": "Если у Вас уже есть приложение:",
"joinInApp": "Присоединиться к этой встрече с помощью приложения",
"launchWebButton": "Запустить в браузере",
"openApp": "Перейти к приложению",
"title": "Запуск вашей встречи в {{app}}...",
"tryAgainButton": "Повторите в настольном приложении",
"unsupportedBrowser": "Вы используете браузер, который мы не поддерживаем."
"tryAgainButton": "Повторите в настольном приложении"
},
"defaultLink": "напр. {{url}}",
"defaultNickname": "напр. Яна Цветкова",
@@ -207,25 +186,21 @@
"Share": "Поделиться",
"Submit": "ОК",
"WaitForHostMsg": "Конференция еще не началась. Если вы организатор, пожалуйста, авторизируйтесь. В противном случае дождитесь организатора.",
"WaitingForHostTitle": "Ждем организатора...",
"WaitingForHost": "Ждем организатора...",
"Yes": "Да",
"accessibilityLabel": {
"liveStreaming": "Трансляция"
},
"add": "Добавить",
"addMeetingNote": "Добавить записку об этом митиге",
"addOptionalNote": "Добавить записку (необязательно):",
"allow": "Разрешить",
"alreadySharedVideoMsg": "Другой участник уже поделился ссылкой на видео. Данная конференция позволяет одновременно делиться только одним видео.",
"alreadySharedVideoTitle": "Допускается показ только одного видео",
"applicationWindow": "Окно приложения",
"authenticationRequired": "Требуется авторизация",
"cameraConstraintFailedError": "Камера не отвечает определенным требованиям.",
"cameraNotFoundError": "Камера не обнаружена.",
"cameraNotSendingData": "Ошибка доступа к камере. Пожалуйста, проверьте, не использует ли камеру какая-нибудь другая программа. Вы можете также выбрать другое устройство из меню настроек или попробовать перезапустить приложение.",
"cameraNotSendingDataTitle": "Нет доступа к камере",
"cameraPermissionDeniedError": "Нет доступа к камере. Вы можете участвовать во встрече, но другие не будут вас видеть. Используйте значок камеры в адресной строке браузера, чтобы устранить проблему.",
"cameraTimeoutError": "Не удалось запустить источник видео. Произошел тайм-аут!Не удалось запустить источник видео. Произошел тайм-аут!",
"cameraUnknownError": "Неизвестная ошибка использования камеры.",
"cameraUnsupportedResolutionError": "Ваша камера не поддерживает необходимое разрешение видео.",
"close": "Закрыть",
@@ -246,19 +221,23 @@
"displayNameRequired": "Привет! Как тебя зовут?",
"done": "Готово",
"e2eeDescription": "Сквозное шифрование в настоящее время является ЭКСПЕРИМЕНТАЛЬНЫМ. Имейте в виду, что включение сквозного шифрования эффективно отключит сервисы, предоставляемые на стороне сервера, такие как: запись, потоковое вещание и участие по телефону. Также имейте в виду, что собрание будет работать только для людей, присоединяющихся из браузеров с поддержкой вставляемых потоков.",
"e2eeDisabledDueToMaxModeDescription": "Невозможно включить сквозное шифрование из-за большого количества участников конференции.",
"e2eeLabel": "E2EE ключ",
"e2eeNoKey": "Отсутствует",
"e2eeSet": "Установить",
"e2eeToggleSet": "Установить ключ",
"e2eeWarning": "ПРЕДУПРЕЖДЕНИЕ. Похоже, что не все участники этой встречи поддерживают сквозное шифрование. Если вы включите его, они не смогут вас ни видеть, ни слышать.",
"e2eeWillDisableDueToMaxModeDescription": "ВНИМАНИЕ: Сквозное шифрование будет автоматически отключено, если к конференции присоединится больше участников.",
"embedMeeting": "Встроить встречу",
"enterDisplayName": "Пожалуйста, введите свое имя",
"error": "Ошибка",
"externalInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.",
"externalInstallationTitle": "Требуется расширение",
"goToStore": "Перейти к интернет-магазину",
"gracefulShutdown": "Технические работы. Пожалуйста, попробуйте позже.",
"grantModeratorDialog": "Вы уверены, что хотите сделать этого участника модератором?",
"grantModeratorTitle": "Сделать модератором",
"hideShareAudioHelper": "Больше не показывать это диалоговое окно",
"incorrectPassword": "Ошибка имени пользователя или пароля",
"incorrectRoomLockPassword": "Неверный пароль",
"inlineInstallExtension": "Установить",
"inlineInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.",
"internalError": "Что-то пошло не так. Ошибка: {{error}}",
"internalErrorTitle": "Внутренняя ошибка",
"kickMessage": "Вы можете связаться с {{participantDisplayName}} для получения более подробной информации.",
@@ -266,16 +245,13 @@
"kickParticipantDialog": "Вы уверены, что хотите отключить этого участника?",
"kickParticipantTitle": "Отключить этого участника?",
"kickTitle": "{{participantDisplayName}} отключил вас от конференции.",
"linkMeeting": "Связать встречу",
"linkMeetingTitle": "Связать встречу с Salesforce",
"liveStreaming": "Трансляция",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Невозможно пока активна запись",
"liveStreamingDisabledForGuestTooltip": "Гости не могут начать трансляцию",
"liveStreamingDisabledTooltip": "Возможность трансляции отключена",
"localUserControls": "Локальные пользовательские элементы управления",
"lockMessage": "Не удалось запереть конференцию",
"lockRoom": "Добавить конференцию $t(lockRoomPasswordUppercase)",
"lockTitle": "Блокировка не удалась",
"login": "Войти",
"logoutQuestion": "Уверены, что хотите выйти и остановить встречу?",
"logoutTitle": "Завершить сеанс",
"maxUsersLimitReached": "Достигнут лимит на максимальное количество участников. Конференция переполнена. Пожалуйста, свяжитесь с организатором конференции или повторите попытку позже!",
@@ -285,46 +261,27 @@
"micNotSendingData": "Перейдите в настройки компьютера, чтобы включить микрофон и настроить уровень чувствительности.",
"micNotSendingDataTitle": "Ваш микрофон отключен системными настройками",
"micPermissionDeniedError": "Нет доступа к микрофону. Вы можете участвовать во встрече, но другие не будут вас слышать. Используйте значок камеры в адресной строке браузера, чтобы устранить проблему.",
"micTimeoutError": "Не удалось запустить источник звука. Произошел тайм-аут!",
"micUnknownError": "Неизвестная ошибка использования микрофона.",
"moderationAudioLabel": "Разрешить участникам самостоятельно включать звук",
"moderationVideoLabel": "Разрешить участникам запускать свое видео",
"muteEveryoneDialog": "Вы уверены, что хотите отключить микрофоны у всех? Вы не сможете включить их, но они могут включить себя в любой момент.",
"muteEveryoneDialogModerationOn": "Участники могут отправить запрос на выступление в любое время.",
"muteEveryoneElseDialog": "После отключения микрофонов у участников вы не сможете включить их, но они могут включить себя в любой момент.",
"muteEveryoneElseTitle": "Заглушить всех, за исключением {{whom}}?",
"muteEveryoneElsesVideoDialog": "Как только камера будет отключена, вы не сможете снова включить ее, но они могут включить ее снова в любое время.",
"muteEveryoneElsesVideoTitle": "Остановить видео для всех, кроме {{кого}}?",
"muteEveryoneSelf": "себя",
"muteEveryoneStartMuted": "Теперь у всех микрофоны выключены",
"muteEveryoneTitle": "Заглушить всех?",
"muteEveryonesVideoDialog": "Участники могут включить свое видео в любое время.",
"muteEveryonesVideoDialogModerationOn": "Участники могут отправить запрос на включение своего видео в любое время.",
"muteEveryonesVideoDialogOk": "Отключить",
"muteEveryonesVideoTitle": "Остановить всеобщее видео?",
"muteParticipantBody": "Вы не можете включить им микрофон, но они могут сделать это сами в любое время.",
"muteParticipantButton": "Заглушить",
"muteParticipantsVideoBody": "Вы не сможете снова включить камеру, но они могут включить ее снова в любое время.",
"muteParticipantsVideoBodyModerationOn": "Вы не сможете снова включить камеру, и они тоже.",
"muteParticipantsVideoButton": "Остановить видео",
"muteParticipantsVideoDialog": "Вы уверены, что хотите выключить камеру этого участника? Вы не сможете снова включить камеру, но они могут включить ее снова в любое время.",
"muteParticipantsVideoDialogModerationOn": "Вы уверены, что хотите выключить камеру этого участника? Вы не сможете снова включить камеру, и они тоже.",
"muteParticipantsVideoTitle": "Отключить камеру этого участника?",
"noDropboxToken": "Нет действительного токена Dropbox",
"password": "Пароль",
"muteParticipantDialog": "Вы уверены, что хотите отключить микрофон у данного пользователя? Вы не сможете отменить это действие, однако он сможет сам снова включить микрофон в любое время.",
"muteParticipantTitle": "Заглушить этого участника?",
"passwordLabel": "Встреча была защищена участником. Пожалуйста, введите $t(lockRoomPasswordUppercase) чтобы присоединиться.",
"passwordNotSupported": "Установка $t(lockRoomPassword) для конференции не поддерживается.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) не поддерживается",
"passwordRequired": "Требуется $t(lockRoomPasswordUppercase)",
"permissionCameraRequiredError": "Для участия в конференциях с видео требуется разрешение камеры. Пожалуйста, предоставьте его в настройках",
"permissionErrorTitle": "Требуется разрешение",
"permissionMicRequiredError": "Для участия в конференциях со звуком требуется разрешение на использование микрофона. Пожалуйста, предоставьте его в настройках",
"popupError": "Ваш браузер блокирует всплывающие окна этого сайта. Пожалуйста, разрешите всплывающие окна в настройках безопасности браузера и попробуйте снова.",
"popupErrorTitle": "Заблокировано всплывающее окно",
"readMore": "больше",
"recentlyUsedObjects": "Ваши недавно использованные объекты",
"recording": "Запись",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Невозможно пока активно потоковое вещание",
"recordingDisabledForGuestTooltip": "Гости не могут записывать",
"recordingDisabledTooltip": "Невозможно начать запись",
"rejoinNow": "Подключиться снова",
"remoteControlAllowedMessage": "{{user}} принял ваш запрос на удаленное управление!",
@@ -334,7 +291,6 @@
"remoteControlShareScreenWarning": "Если нажмете \"Разрешить\", то поделитесь своим экраном!",
"remoteControlStopMessage": "Сессия удаленного управления завершена!",
"remoteControlTitle": "Удаленное управление рабочим столом",
"remoteUserControls": "Удаленное управление пользователями {{username}}",
"removePassword": "Убрать $t(lockRoomPassword)",
"removeSharedVideoMsg": "Уверены, что хотите убрать видео, которым поделились?",
"removeSharedVideoTitle": "Убрать видео",
@@ -344,38 +300,22 @@
"screenSharingAudio": "Поделиться аудио",
"screenSharingFailed": "Ой! Кажется что-то пошло не так, мы не можем начать показ экрана!",
"screenSharingFailedTitle": "Сбой показа экрана!",
"screenSharingFailedToInstall": "Ошибка установки расширения для показа экрана.",
"screenSharingFailedToInstallTitle": "Расширение для показа экрана не установлено",
"screenSharingFirefoxPermissionDeniedError": "Что-то пошло не так, когда мы пытались поделиться вашим экраном. Пожалуйста, убедитесь, что вы дали нам разрешение на это. ",
"screenSharingFirefoxPermissionDeniedTitle": "Ошибка показа экрана!",
"screenSharingPermissionDeniedError": "Ошибка доступа к вашему расширению для показа экрана. Пожалуйста, перезапустите браузер и попробуйте снова.",
"searchInSalesforce": "Искать в Salesforce",
"searchResults": "Результаты поиска({{count}})",
"searchResultsDetailsError": "Что-то пошло не так при получении данных владельца.",
"searchResultsError": "Что-то пошло не так при получении данных.",
"searchResultsNotFound": "Ничего не найдено.",
"searchResultsTryAgain": "Попробуйте использовать другие ключевые слова.",
"sendPrivateMessage": "Вы недавно получили личное сообщение. Вы хотели ответить на него, или отправить свое сообщение группе?",
"sendPrivateMessageCancel": "Отправить в общий чат",
"sendPrivateMessageOk": "Отправить приватное сообщение",
"sendPrivateMessageTitle": "Отправить личное сообщение?",
"serviceUnavailable": "Служба недоступна",
"sessTerminated": "Связь прервана",
"sessionRestarted": "Вызов перезапущен из-за проблемы с подключением.",
"shareAudio": "Продолжить",
"shareAudioTitle": "Как поделиться аудио",
"shareAudioWarningD1": "вам нужно остановить совместное использование экрана, прежде чем делиться своим аудио.",
"shareAudioWarningD2": "вам нужно перезапустить совместное использование экрана и установить флажок «поделиться аудио».",
"shareAudioWarningH1": "Если вы хотите поделиться только аудио:",
"shareAudioWarningTitle": "Вам нужно остановить совместное использование экрана, прежде чем делиться звуком",
"shareMediaWarningGenericH2": "Если вы хотите поделиться своим экраном и звуком",
"shareScreenWarningD1": "вам нужно остановить совместное использование звука, прежде чем делиться своим экраном.",
"shareScreenWarningD2": "вам нужно остановить совместное использование аудио, начать совместное использование экрана и установить флажок «поделиться аудио».",
"shareScreenWarningH1": "Если вы хотите поделиться только своим экраном:",
"shareScreenWarningTitle": "Вам нужно остановить совместное использование звука, прежде чем делиться своим экраном.",
"shareVideoLinkError": "Пожалуйста, укажите корректную ссылку.",
"shareVideoTitle": "Поделиться видео",
"shareYourScreen": "Показать экран",
"shareYourScreenDisabled": "Демонстрация экрана отключена",
"sharedVideoDialogError": "Ошибка: Невалидный URL",
"sharedVideoLinkPlaceholder": "Ссылка на YouTube или прямая ссылка на видео",
"start": "Начать",
"shareYourScreenDisabledForGuest": "Гости не могут демонстрировать экран",
"startLiveStreaming": "Начать трансляцию",
"startRecording": "Начать запись",
"startRemoteControlErrorMessage": "Ошибка начала сессии удаленного управления!",
@@ -390,13 +330,7 @@
"tokenAuthFailedTitle": "Ошибка аутентификации",
"transcribing": "Расшифровка",
"unlockRoom": "Убрать $t(lockRoomPassword)",
"user": "Пользователь",
"userIdentifier": "Идентификатор пользователя",
"userPassword": "пароль пользователя",
"videoLink": "Ссылка на видео",
"viewUpgradeOptions": "Посмотреть варианты обновления",
"viewUpgradeOptionsContent": "Чтобы получить неограниченный доступ к премиум-функциям, таким как запись, транскрипция, RTMP Streaming и т. д., вам необходимо обновить свой план.",
"viewUpgradeOptionsTitle": "Вы обнаружили премиальную функцию!",
"yourEntireScreen": "Весь экран"
},
"documentSharing": {
@@ -414,14 +348,9 @@
"detailsLabel": "Расскажите подробнее.",
"good": "Хорошо",
"rateExperience": "Оценка качества связи",
"star": "Звезда",
"veryBad": "Очень плохо",
"veryGood": "Очень хорошо"
},
"giphy": {
"noResults": "Результатов поиска не найдено :(",
"search": "Поиск GIPHY"
},
"helpView": {
"header": "Справка"
},
@@ -429,7 +358,7 @@
"answer": "Ответ",
"audioCallTitle": "Входящий звонок",
"decline": "Отклонить",
"productLabel": "из {{app}}",
"productLabel": "из Jitsi Meet",
"videoCallTitle": "Входящий видеозвонок"
},
"info": {
@@ -437,7 +366,6 @@
"addPassword": "Установить $t(lockRoomPassword)",
"cancelPassword": "Отменить $t(lockRoomPassword)",
"conferenceURL": "Ссылка:",
"copyNumber": "Копировать номер",
"country": "Страна",
"dialANumber": "Чтобы присоединиться к конференции, наберите один из этих номеров и введите пин-код",
"dialInConferenceID": "ПИН:",
@@ -449,11 +377,6 @@
"inviteLiveStream": "Трансляция этой встречи: {{url}}",
"invitePhone": "Для того, чтобы присоединиться по телефону, нажмите {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "Ищите другой номер для набора?\nПосмотреть номера для набора для конференции: {{url}}\n\n\nЕсли также выполняется набор номера через телефон в комнате, подключитесь в режиме слушателя: {{silentUrl}}",
"inviteSipEndpoint": "Чтобы присоединиться с помощью SIP-адреса, введите следующее: {{sipUri}}",
"inviteTextiOSInviteUrl": "Нажмите на следующую ссылку, чтобы присоединиться: {{inviteUrl}}.",
"inviteTextiOSJoinSilent": "Если вы звоните через телефон в комнате, используйте эту ссылку, чтобы присоединиться без подключения к аудио: {{silentUrl}}.",
"inviteTextiOSPersonal": "{{name}} приглашает вас на встречу.",
"inviteTextiOSPhone": "Чтобы присоединиться по телефону, используйте этот номер: {{number}},,{{conferenceID}}#. Если вы ищете другой номер, это полный список: {{didUrl}}.",
"inviteURLFirstPartGeneral": "Вас приглашают присоединиться к конференции.",
"inviteURLFirstPartPersonal": "{{name}} приглашает Вас присоединиться к конференции. \n",
"inviteURLSecondPart": "\nПрисоединиться к конференции:\n{{url}}\n",
@@ -465,7 +388,6 @@
"noRoom": "Для набора номера не было указано ни одной комнаты.",
"numbers": "Номера для набора",
"password": "$t(lockRoomPasswordUppercase):",
"sip": "SIP адрес",
"title": "Поделиться",
"tooltip": "Поделитесь ссылкой и номером для подключения к этой конференции"
},
@@ -483,12 +405,10 @@
"searchPlaceholder": "Участник или номер телефона",
"send": "Отправить"
},
"jitsiHome": "{{logo}} Логотип, ссылки на главную страницу",
"keyboardShortcuts": {
"focusLocal": "Фокус на ваше видео",
"focusRemote": "Фокус на видео другого участника",
"fullScreen": "Вкл/выкл полноэкранный режим",
"giphyMenu": "Показать GIPHY меню",
"keyboardShortcuts": "Комбинации клавиш",
"localRecording": "Отобразить или скрыть элементы управления локальной записи",
"mute": "Микрофон (вкл./выкл.)",
@@ -497,10 +417,10 @@
"showSpeakerStats": "Показать статистику выступающего",
"toggleChat": "Чат (открыть/закрыть)",
"toggleFilmstrip": "Показать/Скрыть краткое описание",
"toggleParticipantsPane": "Показать или скрыть панель участников",
"toggleScreensharing": "Переключиться между камерой и показом экрана",
"toggleShortcuts": "Скрыть/Показать клавиша быстрого доступа",
"videoMute": "Камера (вкл./выкл.)"
"videoMute": "Камера (вкл./выкл.)",
"videoQuality": "Качество связи"
},
"liveStreaming": {
"busy": "Освобождаем новые ресурсы для трансляции. Пожалуйста, попробуйте снова через несколько минут.",
@@ -518,7 +438,6 @@
"failedToStart": "Ошибка трансляции видео",
"getStreamKeyManually": "Прямые трансляций не найдены. Попробуйте получить ключ прямой трансляции от YouTube.",
"googlePrivacyPolicy": "Политика конфиденциальности Google",
"inProgress": "Идет запись или прямая трансляция",
"invalidStreamKey": "Похоже ключ прямой трансляции неверен.",
"limitNotificationDescriptionNative": "Ваша трансляция будет ограничена {{limit}} мин. Для неограниченного просмотра попробуйте {{app}}.",
"limitNotificationDescriptionWeb": "Из-за высокой нагрузки ваша потоковая передача будет ограничена {{limit}} мин. Для неограниченной потоковой передачи попробуйте <a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>.",
@@ -528,7 +447,6 @@
"onBy": "{{name}} начал прямую трансляцию",
"pending": "Начинаем трансляцию...",
"serviceName": "Служба трансляции",
"sessionAlreadyActive": "Этот сеанс уже записывается или транслируется в прямом эфире.",
"signIn": "Войти через Google",
"signInCTA": "Войдите или введите свой ключ трансляции YouTube.",
"signOut": "Выход",
@@ -539,12 +457,7 @@
"youtubeTerms": "Условия использования YouTube"
},
"lobby": {
"admit": "Признать",
"admitAll": "Признать все",
"allow": "Разрешить",
"backToKnockModeButton": "Попросить присоединиться",
"chat": "Чат",
"dialogTitle": "Режим лобби",
"disableDialogContent": "В настоящее время включен режим лобби. Эта функция гарантирует, что нежелательные участники не смогут присоединиться к вашей встрече. Вы хотите его отключить?",
"disableDialogSubmit": "Отключить",
"emailField": "Введите ваш адрес электронной почты",
@@ -553,10 +466,8 @@
"enableDialogText": "Режим лобби позволяет защитить вашу встречу, позволяя людям входить только после официального одобрения модератором.",
"enterPasswordButton": "Введите пароль встречи",
"enterPasswordTitle": "Введите пароль чтобы присоединиться к встрече",
"errorMissingPassword": "Пожалуйста, введите пароль встречи",
"invalidPassword": "Неверный пароль",
"joinRejectedMessage": "Ваш запрос на присоединение был отклонен модератором.",
"joinRejectedTitle": "Заявка на присоедиение отклонена.",
"joinTitle": "Присоединиться к встрече",
"joinWithPasswordMessage": "Пытаюсь присоединиться с паролем, подождите...",
"joiningMessage": "Вы присоединитесь к встрече, как только кто-то примет ваш запрос",
@@ -565,8 +476,6 @@
"knockButton": "Попросить присоединиться",
"knockTitle": "Кто-то хочет присоединиться к встрече",
"knockingParticipantList": "Список ожидающих участников",
"lobbyChatStartedNotification": "{{moderator}} начал лобби чат с {{attendee}}",
"lobbyChatStartedTitle": "{{moderator}} начал лобби чат с вами.",
"nameField": "Введите ваше имя",
"notificationLobbyAccessDenied": "{{originParticipantName}} запретил присоединиться {{targetParticipantName}}",
"notificationLobbyAccessGranted": "{{originParticipantName}} разрешил присоединиться {{targetParticipantName}} ",
@@ -612,51 +521,26 @@
"lockRoomPasswordUppercase": "Пароль",
"lonelyMeetingExperience": {
"button": "Пригласить",
"getHelp": "Получить помощь",
"title": "Защищенная, полнофункциональная и совершенно бесплатная система видеоконференций",
"youAreAlone": "Вы один в видеоконференции"
},
"me": "я",
"notify": {
"OldElectronAPPTitle": "Уязвимость в системе безопасности!",
"allowAction": "Разрешить",
"allowedUnmute": "Вы можете включить микрофон, включить камеру или поделиться своим экраном.",
"audioUnmuteBlockedDescription": "Операция включения микрофона была временно заблокирована из-за системных ограничений.",
"audioUnmuteBlockedTitle": "Включение микрофона заблокировано!",
"chatMessages": "Сообщения чата",
"connectedOneMember": "{{name}} присоединился к конференции",
"connectedThreePlusMembers": "{{name}} и {{count}} других пользователей присоединились к конференции",
"connectedTwoMembers": "{{first}} и {{second}} присоединились к конференции",
"disconnected": "соединение разорвано",
"displayNotifications": "Отображение уведомлений для",
"focus": "Фокус встречи",
"focusFail": "{{component}} недоступен, повторите через {{ms}} с",
"gifsMenu": "GIPHY",
"groupTitle": "Уведомления",
"hostAskedUnmute": "Модератор хочет, чтобы вы высказалисьМодератор хочет, чтобы вы высказались",
"grantedTo": "{{to}} получил права модератора!",
"invitedOneMember": "{{name}} был приглашен",
"invitedThreePlusMembers": "Приглашены {{name}} и {{count}} других пользователей(ля)",
"invitedTwoMembers": "{{first}} и {{second}} присоединились к конференции",
"kickParticipant": "{{kicker}} отключил {{kicked}}",
"leftOneMember": "{{name}} покинул собрание",
"leftThreePlusMembers": "{{name}} и многие другие покинули встречу",
"leftTwoMembers": "{{first}} и {{second}} покинули встречу",
"linkToSalesforce": "Ссылка на Salesforce",
"linkToSalesforceDescription": "Вы можете отправить ссылку на сводку митинга Salesforce объекту.",
"linkToSalesforceError": "Ошибка отправки ссылки на митинг для Salesforce",
"linkToSalesforceKey": "Отправить сслку а эот митинг",
"linkToSalesforceProgress": "Отправка ссылки на митинг для Salesforce...",
"linkToSalesforceSuccess": "Ссылка на этот митинг была отправлена Salesforce",
"me": "Я",
"moderationInEffectCSDescription": "Пожалуйста, поднимите руку, если вы хотите поделиться своим экраном.",
"moderationInEffectCSTitle": "Демонстрация экрана заблокирована модератором",
"moderationInEffectDescription": "Пожалуйста, поднимите руку, если хотите высказаться.",
"moderationInEffectTitle": "Ваш микрофон отключен модератором",
"moderationInEffectVideoDescription": "Пожалуйста, поднимите руку, если хотите включить камеру.",
"moderationInEffectVideoTitle": "Ваша камера заблокирована модератором",
"moderationRequestFromModerator": "Хозяин хочет, чтобы вы включили звук",
"moderationRequestFromParticipant": "Хочет говорить",
"moderationStartedTitle": "Началась модерация",
"moderationStoppedTitle": "Модерация остановлена",
"moderationToggleDescription": "от {{participantDisplayName}}",
"moderator": "Получены права модератора!",
"muted": "Вы начали разговор без звука.",
"mutedRemotelyDescription": "Вы всегда можете включить микрофон, когда будете готовы говорить. Отключите его, когда закончите, чтобы не транслировать шумы в конференцию.",
@@ -665,33 +549,18 @@
"newDeviceAction": "Использовать",
"newDeviceAudioTitle": "Обнаружено новое аудиоустройство",
"newDeviceCameraTitle": "Обнаружена новая камера",
"oldElectronClientDescription1": "Похоже, вы используете старую версию клиента {{app}}, которая имеет известные уязвимости в системе безопасности. Убедитесь, что вы обновили до нашей ",
"oldElectronClientDescription1": "Похоже, вы используете старую версию клиента Jitsi Meet, которая имеет известные уязвимости в системе безопасности. Убедитесь, что вы обновили до нашей ",
"oldElectronClientDescription2": "последней версии",
"oldElectronClientDescription3": " сейчас!",
"participantWantsToJoin": "Хочет присоединиться к митингу",
"participantsWantToJoin": "Хотят присоединиться к митингу",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) удален другим участником.",
"passwordSetRemotely": "Другой участник установил $t(lockRoomPasswordUppercase)",
"raiseHandAction": "Поднять руку",
"raisedHand": "{{name}} хотел бы выступить.",
"raisedHands": "{{Имя участника}} и еще {{подняли руки}} человек",
"reactionSounds": "Отключить звуки",
"reactionSoundsForAll": "Отключить звуки для всех",
"screenShareNoAudio": "Флажок «Поделиться аудио» не был отмечен на экране выбора окна.",
"screenShareNoAudioTitle": "Не удалось поделиться системным звуком!",
"selfViewTitle": "Вы всегда можете скрыть собственное изображение в настройках.",
"somebody": "Кто-то",
"startSilentDescription": "Перезайдите в конференцию, чтобы включить звук",
"startSilentTitle": "У вас отсутствует звук!",
"suboptimalBrowserWarning": "К сожалению, ваш браузер не полностью поддерживает данную систему вэбконференций. Мы работаем над проблемой, однако, пока рекомендуем вам воспользоваться <a href='{{recommendedBrowserPageLink}}' target='_blank'> следующими браузерами</a>.",
"suboptimalExperienceTitle": "Предупреждение браузера",
"unmute": "Включить микрофон",
"videoMutedRemotelyDescription": "Вы всегда можете включить его снова.",
"videoMutedRemotelyTitle": "Ваше видео было отключено {{participantDisplayName}}",
"videoUnmuteBlockedDescription": "Включение звука камеры и совместное использование рабочего стола временно заблокированы из-за системных ограничений.",
"videoUnmuteBlockedTitle": "Включение камеры и общий доступ к рабочему столу заблокированы!",
"viewLobby": "Смотреть лобби",
"waitingParticipants": "{{waitingParticipants}} люди"
"unmute": "Включить микрофон"
},
"participantsPane": {
"actions": {
@@ -701,9 +570,6 @@
"audioModeration": "Разрешить выключить микрофон",
"blockEveryoneMicCamera": "Заблокировать у всех микрофон и камеру",
"invite": "Пригласить",
"moreModerationActions": "Дополнительные параметры модерации",
"moreModerationControls": "Дополнительные элементы управления модерацией",
"moreParticipantOptions": "Дополнительные параметры участников",
"mute": "Выключить звук",
"muteAll": "Выключить звук у всех",
"muteEveryoneElse": "Выключить микрофон у остальных",
@@ -718,45 +584,13 @@
"lobby": "Лобби ({{count}})",
"participantsList": "Список участников ({{count}})",
"waitingLobby": "Ожидают в лобби ({{count}})"
},
"search": "Поиск участников"
}
},
"passwordDigitsOnly": "До {{number}} цифр",
"passwordSetRemotely": "установлен другим участником",
"pinnedParticipant": "Участник запинен",
"polls": {
"answer": {
"skip": "Пропустить",
"submit": "Подтвердить"
},
"by": "По {{ name }}",
"create": {
"addOption": "Добавить вариант",
"answerPlaceholder": "Вариант {{index}}",
"cancel": "Отмена",
"create": "Создать опрос",
"pollOption": "Вариант опроса {{index}}",
"pollQuestion": "Вопрос опроса",
"questionPlaceholder": "Задайте вопрос",
"removeOption": "Удалить вариант",
"send": "Отправлять"
},
"notification": {
"description": "Откройте вкладку опросов, чтобы проголосовать",
"title": "К этой встрече добавлен новый опрос"
},
"results": {
"changeVote": "Изменить голос",
"empty": "На собрании еще нет опросов. Начать опрос здесь!",
"hideDetailedResults": "Скрыть детали",
"showDetailedResults": "Показать детали",
"vote": "Голосование"
}
},
"poweredby": "работает на",
"prejoin": {
"audioAndVideoError": "Ошибка звука и видео:",
"audioDeviceProblem": "Проблема с вашим аудиоустройством",
"audioOnlyError": "Ошибка звука:",
"audioTrackError": "Не удалось создать аудио дорожку.",
"callMe": "Позвоните мне",
@@ -764,25 +598,6 @@
"calling": "Вызываем",
"configuringDevices": "Настраиваются устройства...",
"connectedWithAudioQ": "Вы подключили звук?",
"connection": {
"good": "Ваше интернет-соединение выглядит хорошо!",
"nonOptimal": "Ваше интернет-соединение не оптимально",
"poor": "У вас плохое интернет-соединение"
},
"connectionDetails": {
"audioClipping": "Мы ожидаем, что ваш звук будет обрезан.",
"audioHighQuality": "Мы ожидаем, что ваш звук будет отличного качества.",
"audioLowNoVideo": "Мы ожидаем, что у вас будет низкое качество звука и отсутствие видео.",
"goodQuality": "Потрясающий! Качество вашего мультимедиа будет отличным.",
"noMediaConnectivity": "Мы не смогли найти способ установить медиа-соединение для этого теста. Обычно это вызвано брандмауэром или NAT.",
"noVideo": "Мы ожидаем, что ваше видео будет ужасным.",
"undetectable": "Если вы все еще не можете совершать звонки в браузере, мы рекомендуем вам убедиться, что ваши динамики, микрофон и камера правильно настроены, что вы предоставили своему браузеру права на использование микрофона и камеры и что версия вашего браузера является актуальной. Если у вас все еще возникают проблемы с вызовом, вам следует обратиться к разработчику веб-приложения.",
"veryPoorConnection": "Мы ожидаем, что качество вашего звонка будет действительно ужасным.",
"videoFreezing": "Мы ожидаем, что ваше видео зависнет, станет черным и пиксельным.",
"videoHighQuality": "Мы ожидаем, что ваше видео будет хорошего качества.",
"videoLowQuality": "Мы ожидаем, что ваше видео будет иметь низкое качество с точки зрения частоты кадров и разрешения.",
"videoTearing": "Мы ожидаем, что ваше видео будет пиксельным или содержать визуальные артефакты."
},
"copyAndShare": "Скопировать и поделиться ссылкой на встречу",
"dialInMeeting": "Дозвониться до встречи",
"dialInPin": "Дозвониться до встречи и ввести ПИН код:",
@@ -792,8 +607,6 @@
"errorDialOutDisconnected": "Не удалось дозвониться. Отключено",
"errorDialOutFailed": "Не удалось дозвониться. Сбой вызова",
"errorDialOutStatus": "Ошибка получения статуса вызова",
"errorMissingName": "Пожалуйста, введите свое имя, чтобы присоединиться к встрече",
"errorNoPermissions": "Вам необходимо включить доступ к микрофону и камере",
"errorStatusCode": "Ошибка вызова, код статуса: {{status}}",
"errorValidation": "Проверка номера не удалась",
"iWantToDialIn": "Я хочу дозвониться",
@@ -801,7 +614,6 @@
"joinAudioByPhone": "Подключиться с телефонной связью",
"joinMeeting": "Присоединиться ко встрече",
"joinWithoutAudio": "Присоединиться без звука",
"keyboardShortcuts": "Включить сочетания клавиш",
"linkCopied": "Ссылка скопирована в буфер обмена",
"lookGood": "Кажется ваш микрофон работает правильно",
"or": "или",
@@ -827,53 +639,27 @@
"rejected": "Отклонен",
"ringing": "Звоню. . ."
},
"privacyView": {
"header": "Конфиденциальность"
},
"profile": {
"avatar": "аватар",
"setDisplayNameLabel": "Отображаемое имя",
"setEmailInput": "Введите email",
"setEmailLabel": "Email для Gravatar",
"title": "Профиль"
},
"raisedHand": "Хочет говорить",
"raisedHandsLabel": "Количество поднятых рук",
"record": {
"already": {
"linked": "Ссылка на митинг уже оправлена Salesforce объекту."
},
"type": {
"account": "Аккаунт",
"contact": "Сонтакт",
"lead": "Вести",
"opportunity": "Возможность",
"owner": "Владелец"
}
},
"recording": {
"authDropboxText": "Загрузить в Dropbox",
"availableSpace": "Доступно места: {{spaceLeft}} MB (примерно {{duration}} минут записи)",
"beta": "БЕТА",
"busy": "Мы стараемся обеспечить больше ресурсов для записи. Пожалуйста, попробуйте через несколько минут.",
"busyTitle": "Все записывающие устройства заняты",
"copyLink": "Копировать ссылку",
"error": "Ошибка записи. Пожалуйста, попробуйте позже.",
"errorFetchingLink": "Ошибка получения ссылки на запись.",
"expandedOff": "Запись остановлена",
"expandedOn": "Данная конференция записывается.",
"expandedPending": "Начинаем запись конференции...",
"failedToStart": "Ошибка начала записи",
"fileSharingdescription": "Поделиться записью с участниками конференции",
"highlight": "Основное",
"highlightMoment": "Основной момент",
"highlightMomentDisabled": "Вы можее обозначить важные моменты когда начнётся запись",
"highlightMomentSuccess": "Моменты выделены",
"highlightMomentSucessDescription": "Ваши выделенные моменты будут добавлены в итоги митинга.",
"inProgress": "Идет запись или прямая трансляция",
"limitNotificationDescriptionNative": "Из-за высокой нагрузки ваша запись будет ограничена {{limit}} мин. Для неограниченного количества записей попробуйте <3> {{app}} </3>.",
"limitNotificationDescriptionWeb": "Из-за высокой нагрузки ваша запись будет ограничена {{limit}} мин. Для неограниченного количества записей попробуйте <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"linkGenerated": "Мы создали ссылку на вашу запись.",
"live": "В ЭФИРЕ",
"loggedIn": "Вошел как {{userName}}",
"off": "Запись остановлена",
@@ -883,15 +669,11 @@
"pending": "Подготовка записи конференции. . .",
"rec": "ИДЕТ ЗАПИСЬ",
"serviceDescription": "Ваша запись будет сохранена соответствующей службой",
"serviceDescriptionCloud": "Облачная запись",
"serviceDescriptionCloudInfo": "Сохранённые записи автоматически удаляются спуся 24 часа со старта.",
"serviceName": "Служба записи",
"sessionAlreadyActive": "Этот сеанс уже записывается или транслируется в прямом эфире.",
"signIn": "Вход",
"signOut": "Выход",
"unavailable": "Служба {{serviceName}} сейчас недоступна. Мы работаем над исправлением этой ошибки. Пожалуйста, попробуйте позже.",
"unavailableTitle": "Запись невозможна",
"uploadToCloud": "Загрузить в облако"
"unavailableTitle": "Запись невозможна"
},
"sectionList": {
"pullToRefresh": "Потяните для обновления"
@@ -899,8 +681,8 @@
"security": {
"about": "Вы можете добавить к собранию $t(lockRoomPassword). Участникам необходимо будет предоставить $t(lockRoomPassword), прежде чем им будет разрешено присоединиться к собранию.",
"aboutReadOnly": "Участники-модераторы могут добавить к собранию $t(lockRoomPassword). Участникам необходимо будет предоставить $t(lockRoomPassword), прежде чем им будет разрешено присоединиться к собранию.",
"header": "",
"insecureRoomNameWarning": "Имя комнаты небезопасно. Нежелательные участники могут присоединиться к вашей конференции. Подумайте о том, чтобы защитить вашу встречу используя настройки безопасности."
"insecureRoomNameWarning": "Имя комнаты небезопасно. Нежелательные участники могут присоединиться к вашей конференции. Подумайте о том, чтобы защитить вашу встречу используя настройки безопасности.",
"securityOptions": "Настройки безопасности"
},
"settings": {
"calendar": {
@@ -910,13 +692,8 @@
"signedIn": "Доступ к событиям календаря включен для email - адреса {{email}}. Нажмите кнопку Отключить для отключения доступа к событиям календаря.",
"title": "Календарь"
},
"desktopShareFramerate": "Частота кадров при совместном использовании рабочего стола",
"desktopShareHighFpsWarning": "Более высокая частота кадров для общего доступа к рабочему столу может повлиять на пропускную способность. Вам необходимо перезапустить демонстрацию экрана, чтобы новые настройки вступили в силу.",
"desktopShareWarning": "Вам необходимо перезапустить демонстрацию экрана, чтобы новые настройки вступили в силу.",
"devices": "Устройства",
"followMe": "Все следуют за мной",
"framesPerSecond": "кадров в секунду",
"incomingMessage": "Входящее сообщение",
"language": "Язык",
"loggedIn": "Вошел как {{name}}",
"microphones": "Микрофоны",
@@ -924,26 +701,16 @@
"more": "Больше опций",
"name": "Имя",
"noDevice": "нет",
"participantJoined": "Участник присоединился",
"participantLeft": "Участник вышел",
"playSounds": "Включить звук",
"reactions": "Реакции на встречи",
"sameAsSystem": "То же, что и система ({{label}})",
"selectAudioOutput": "Звуковой выход",
"selectCamera": "Камера",
"selectMic": "Микрофон",
"selfView": "Самостоятельный просмотр",
"sounds": "Звуки",
"speakers": "Динамики",
"startAudioMuted": "Все начинают с выключенным звуком",
"startReactionsMuted": "Отключение звука реакции для всех",
"startVideoMuted": "Все начинают в скрытом режиме",
"talkWhileMuted": "Говорите без звука",
"title": "Настройки"
},
"settingsView": {
"advanced": "Дополнительные",
"alertCancel": "Отмена",
"alertOk": "OK",
"alertTitle": "Внимание",
"alertURLText": "Ошибка адреса сервера",
@@ -969,24 +736,14 @@
},
"speaker": "Спикер",
"speakerStats": {
"angry": "Злой",
"disgusted": "Отвращение",
"displayEmotions": "Показать эмоции",
"fearful": "Страшный",
"happy": "Счастье",
"hours": "{{count}}ч",
"minutes": "{{count}}м",
"name": "Имя",
"neutral": "Нейтральный",
"sad": "Грусный",
"search": "Поиск",
"seconds": "{{count}}с",
"speakerStats": "Статистика выступлений",
"speakerTime": "Время выступлений",
"surprised": "Удивлен"
"speakerTime": "Время выступлений"
},
"startupoverlay": {
"genericTitle": "На совещании необходимо использовать микрофон и камеру.",
"policyText": " ",
"title": "{{app}} требуется доступ к микрофону и камере."
},
@@ -995,37 +752,26 @@
"text": "Для восстановления связи нажмите кнопку <i>Подключиться снова</i>.",
"title": "Видеосвязь прервана. Причина: этот компьютер перешел в режим сна."
},
"termsView": {
"header": "Условия"
},
"toolbar": {
"Settings": "Настройки",
"accessibilityLabel": {
"Settings": "Вкл/Выкл меню настроек",
"audioOnly": "Вкл/Выкл только звук",
"audioRoute": "Выбрать аудиоустройство",
"boo": "Бу",
"breakoutRoom": "Присоединиться/выйти из комнаты обсуждения",
"callQuality": "Качество связи",
"cc": "Вкл/Выкл субтитры",
"chat": "Показать/скрыть окно чата",
"clap": "Хлопок",
"collapse": "Крах",
"document": "Закрыть общий документ",
"download": "Скачать приложение",
"e2ee": "Сквозное шифрование",
"embedMeeting": "Встроить встречу",
"expand": "Расширять",
"feedback": "Оставить отзыв",
"fullScreen": "Полноэкранный/оконный режим",
"giphy": "Показать GIPHY меню",
"grantModerator": "Сделать модератором",
"hangup": "Завершить звонок",
"help": "Справка",
"invite": "Пригласить",
"kick": "Отключить участника",
"laugh": "Смех",
"like": "Пальцы вверх",
"linkToSalesforce": "Ссылка на Salesforce",
"lobbyButton": "Вкл/Выкл режим лобби",
"localRecording": "Вкл/Выкл кнопки записи",
"lockRoom": "Установить пароль",
@@ -1034,30 +780,20 @@
"moreOptions": "Меню доп. настроек",
"mute": "Вкл/Выкл звук",
"muteEveryone": "Выкл. микрофон у всех",
"muteEveryoneElse": "Заглушить всех остальных",
"muteEveryoneElsesVideoStream": "Остановить чужое видео",
"muteEveryonesVideoStream": "Остановить видео для всех",
"participants": "Участники",
"pip": "Вкл/Выкл режим Картинка-в-картинке",
"privateMessage": "Отправить личное сообщение",
"profile": "Редактировать профиль",
"raiseHand": "Поднять руку",
"reactionsMenu": "Открыть/закрыть меню реакций",
"recording": "Вкл/Выкл запись",
"remoteMute": "Отключить участнику микрофон",
"remoteVideoMute": "Отключить камеру участника",
"security": "Настройки безопасности",
"selectBackground": "Выберите фон",
"selfView": "Самостоятельный просмотр",
"shareRoom": "Отправить приглашение",
"shareYourScreen": "Вкл/Выкл демонстрацию экрана",
"shareaudio": "Поделиться аудио",
"sharedvideo": "Вкл/Выкл Youtube - трансляцию",
"shortcuts": "Вкл/Выкл значки",
"show": "Показать крупным планом",
"silence": "Тишина",
"speakerStats": "Вкл/Выкл статистику",
"surprised": "Удивлен",
"tileView": "Вкл/Выкл плитку",
"toggleCamera": "Переключить камеру",
"toggleFilmstrip": "Включить диафильм",
@@ -1076,7 +812,6 @@
"clap": "Аплодисменты",
"closeChat": "Закрыть чат",
"closeReactionsMenu": "Закрыть меню реакций",
"disableReactionSounds": "",
"documentClose": "Закрыть общий документ",
"documentOpen": "Открыть общий документ",
"download": "Скачать приложение",
@@ -1087,15 +822,11 @@
"exitFullScreen": "Полный экран",
"exitTileView": "Крупный план",
"feedback": "Оставить отзыв",
"giphy": "Показать GIPHY меню",
"hangup": "Выход",
"help": "Справка",
"invite": "Пригласить",
"joinBreakoutRoom": "Присоединяйтесь к комнате обсуждения",
"laugh": "Смеяться",
"leaveBreakoutRoom": "Выйти из комнаты отдыха",
"like": "Мне нравится",
"linkToSalesforce": "Ссылка на Salesforce",
"lobbyButtonDisable": "Отключить режим лобби",
"lobbyButtonEnable": "Включить режим лобби",
"login": "Войти",
@@ -1121,12 +852,6 @@
"profile": "Редактировать профиль",
"raiseHand": "Хочу говорить",
"raiseYourHand": "Поднять руку",
"reactionBoo": "Отправить бу реакцию",
"reactionClap": "Отправить реакцию аплодисментов",
"reactionLaugh": "Отправить реакцию смеха",
"reactionLike": "Отправить реакцию \"палец вверх\"",
"reactionSilence": "Отправить реакцию тишины",
"reactionSurprised": "Отправить удивленную реакцию",
"security": "Настройки безопасности",
"selectBackground": "Выбрать фоновое изображение",
"shareRoom": "Отправить приглашение",
@@ -1137,10 +862,11 @@
"speakerStats": "Статистика",
"startScreenSharing": "Начать трансляцию с экрана",
"startSubtitles": "Включить субтитры",
"stopAudioSharing": "Остановить обмен аудио",
"startvideoblur": "Размыть фон на видео",
"stopScreenSharing": "Остановить трансляцию с экрана",
"stopSharedVideo": "Остановить видео на YouTube",
"stopSubtitles": "Отключить субтитры",
"stopvideoblur": "Отключить размытие фона",
"surprised": "Удивиться",
"talkWhileMutedPopup": "Пытаетесь говорить? У вас отключен звук.",
"tileViewToggle": "Вкл/выкл плитку",
@@ -1157,8 +883,7 @@
"off": "Расшифровка остановлена",
"pending": "Подготовка расшифровки конференции...",
"start": "Вкл/Выкл показ субтитров",
"stop": "Вкл/Выкл показ субтитров",
"tr": "TR"
"stop": "Вкл/Выкл показ субтитров"
},
"userMedia": {
"androidGrantPermissions": "Выберите <b><i>Разрешить</i></b>, когда браузер спросит о разрешениях.",
@@ -1183,21 +908,19 @@
"pending": "{{displayName}} был приглашен"
},
"videoStatus": {
"adjustFor": "Отрегулируйте для:",
"audioOnly": "Только звук",
"audioOnlyExpanded": "Активен режим экономии пропускной способности. В этом режиме доступны только звук и трансляция с экрана",
"bestPerformance": "Лучшее представление",
"callQuality": "Качество видео",
"hd": "HD",
"hdTooltip": "Видео высокого качества",
"highDefinition": "Высокое качество",
"highestQuality": "Высшее качество",
"labelTooiltipNoVideo": "Нет видео",
"labelTooltipAudioOnly": "Включен режим экономии пропускной способности",
"ld": "LD",
"ldTooltip": "Видео низкого качества",
"lowDefinition": "Низкое качество",
"performanceSettings": "Параметры производительности",
"onlyAudioAvailable": "Только звук",
"onlyAudioSupported": "В этом браузере разрешен только звук.",
"sd": "SD",
"sdTooltip": "Видео стандартного качества",
"standardDefinition": "Стандартное качество (SD)"
@@ -1210,51 +933,20 @@
"domuteVideoOfOthers": "Выключить видео остальным",
"flip": "Отразить",
"grantModerator": "Сделать модератором",
"hideSelfView": "Скрыть собственное представление",
"kick": "Отключить",
"moderator": "Модератор",
"mute": "Без звука",
"muted": "Звук выключен",
"pinToStage": "Прикрепить к сцене",
"remoteControl": "Начать / Остановить дистанционный контроль",
"screenSharing": "Участник показывает свой экран",
"show": "Показать крупным планом",
"showSelfView": "Показать своё представление",
"unpinFromStage": "Отпинить",
"videoMuted": "Камера выключена",
"videomute": "Участник выключил камеру"
},
"virtualBackground": {
"addBackground": "Добавить фон",
"apply": "Применять",
"backgroundEffectError": "Не удалось применить фоновый эффект.",
"blur": "Размытие",
"deleteImage": "Удалить изображение",
"desktopShare": "Общий доступ к рабочему столу",
"desktopShareError": "Не удалось создать общий доступ к рабочему столу",
"image1": "пляж",
"image2": "Белая нейтральная стена",
"image3": "Белая пустая комната",
"image4": "Черный торшер",
"image5": "Гора",
"image6": "Лес",
"image7": "Восход",
"none": "Нет",
"pleaseWait": "Пожалуйста подождите...",
"removeBackground": "Убрать фон",
"slightBlur": "Легкое размытие",
"title": "Виртуальные фоны",
"uploadedImage": "Загруженное изображение {{index}}",
"webAssemblyWarning": "WebAssembly не поддерживается",
"webAssemblyWarningDescription": "WebAssembly отключен или не поддерживается этим браузером"
},
"volumeSlider": "Ползунок громкости",
"welcomepage": {
"accessibilityLabel": {
"join": "Нажмите чтобы присоединиться",
"roomname": "Укажите название комнаты"
},
"addMeetingName": "Добавить название встречи",
"appDescription": "Попробуйте видеочат со всей командой. Приглашайте знакомых! {{app}} — полностью зашифрованное решение для видеоконференций с открытым исходным кодом. Пользуйтесь каждый день, бесплатно и без регистрации.",
"audioVideoSwitch": {
"audio": "Звук",
@@ -1268,21 +960,9 @@
"go": "ОК",
"goSmall": "ОК",
"headerSubtitle": "Защищенная высококачественная видеосвязь",
"headerTitle": "Сервер видеоконференцсвязи {{app}}",
"headerTitle": "Сервер видеоконференцсвязи Jitsi Meet",
"info": "Инфо",
"jitsiOnMobile": "{{app}} для мобильных устройств — загрузите наши приложения и начните встречу из любого места",
"join": "СОЗДАТЬ / ПРИСОЕДИНИТЬСЯ",
"logo": {
"calendar": "Calendar логотип",
"desktopPreviewThumbnail": "Миниатюра предварительного просмотра на рабочем столе",
"googleLogo": "Google логотип",
"logoDeepLinking": "Логотип Navek",
"microsoftLogo": "Логотип Майкрософт",
"policyLogo": "Логотип политики"
},
"mobileDownLoadLinkAndroid": "Скачать мобильное приложение для Android",
"mobileDownLoadLinkFDroid": "Скачать мобильное приложение для F-Droid",
"mobileDownLoadLinkIos": "Скачать мобильное приложение для iOS",
"moderatedMessage": "Или заранее <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">зарезервируйте URL-адрес встречи</a>, где вы будете единственным модератором.",
"privacy": "Приватность",
"recentList": "Недавние",

View File

@@ -602,12 +602,10 @@
"OldElectronAPPTitle": "Güvenlik açığı!",
"allowAction": "İzin ver",
"allowedUnmute": "Mikrofonunuzu sessizden çıkarabilir, kameranızı başlatabilir veya ekranınızı paylaşabilirsiniz.",
"chatMessages": "Sohbet mesajları",
"connectedOneMember": "{{name}} toplantıya katıldı",
"connectedThreePlusMembers": "{{name}} ve {{count}} kişi daha toplantıya katıldı",
"connectedTwoMembers": "{{first}} ve {{second}} toplantıya katıldı",
"disconnected": "bağlantı kesildi",
"displayNotifications": "Bildirimleri görüntüle",
"focus": "Toplantı odağı",
"focusFail": "{{component}} uygun değil - {{ms}} saniye içinde tekrar deneyin",
"grantedTo": "{{to}} kişisine yönetici hakları verildi!",
@@ -664,9 +662,6 @@
"audioModeration": "Seslerini aç",
"blockEveryoneMicCamera": "Herkesin mikrofonunu ve kamerasını blokla",
"invite": "Birini davet et",
"moreModerationActions": "Daha fazla denetleme seçeneği",
"moreModerationControls": "Daha fazla denetleme kontrolü",
"moreParticipantOptions": "Daha fazla katılımcı seçeneği",
"mute": "Sustur",
"muteAll": "Herkesi sustur",
"muteEveryoneElse": "Diğer herkesi sessize al",
@@ -681,8 +676,7 @@
"lobby": "Lobi ({{count}})",
"participantsList": "Toplantı Katılımcıları ({{count}})",
"waitingLobby": "Lobide bekleyen ({{count}})"
},
"search": "Katılımcıları ara"
}
},
"passwordDigitsOnly": "{{number}} rakama kadar",
"passwordSetRemotely": "başka katılımcı tarafından ayarlandı",
@@ -856,7 +850,6 @@
"incomingMessage": "Gelen mesaj",
"language": "Dil",
"loggedIn": "{{name}} olarak giriş yapıldı",
"maxStageParticipants": "Ana ekrana sabitlenecek maksimum katılımcı sayısı",
"microphones": "Mikrofonlar",
"moderator": "Yönetici",
"more": "Daha fazla",
@@ -1116,7 +1109,6 @@
"lowDefinition": "Düşük çözünürlük",
"onlyAudioAvailable": "Yalnızca ses kullanılabilir",
"onlyAudioSupported": "Bu tarayıcıda yalnızca sesi destekliyoruz.",
"performanceSettings": "Performans ayarları",
"sd": "SD",
"sdTooltip": "Standart çözünürlüklü video görüntüleme",
"standardDefinition": "Standart çözünürlük"

View File

@@ -31,7 +31,6 @@
},
"audioDevices": {
"bluetooth": "藍牙",
"car": "汽車音響",
"headphones": "耳機",
"none": "沒有可用的音效裝置",
"phone": "電話",
@@ -40,6 +39,9 @@
"audioOnly": {
"audioOnly": "低頻寬"
},
"blankPage": {
"meetingEnded": "會議已結束。"
},
"breakoutRooms": {
"actions": {
"add": "新增討論室",
@@ -81,7 +83,6 @@
"enter": "加入聊天室",
"error": "錯誤:您的訊息未被傳送。原因:{{error}}",
"fieldPlaceHolder": "在此輸入您的訊息",
"lobbyChatMessageTo": "Lobby chat message to {{recipient}}",
"message": "訊息",
"messageAccessibleTitle": "{{user}} 說:",
"messageAccessibleTitleMe": "您說:",
@@ -129,11 +130,11 @@
},
"connectionindicator": {
"address": "位址:",
"audio_ssrc": "音訊 SSRC",
"audio_ssrc": "Audio SSRC",
"bandwidth": "估計頻寬:",
"bitrate": "位元率:",
"bridgeCount": "伺服器數量:",
"codecs": "編碼 (A/V)",
"codecs": "Codecs (A/V)",
"connectedTo": "已連接至:",
"e2e_rtt": "E2E RTT",
"framerate": "影格率:",
@@ -162,7 +163,7 @@
"status": "連接:",
"transport": "傳輸:",
"transport_plural": "傳輸:",
"video_ssrc": "視訊 SSRC"
"video_ssrc": "Video SSRC"
},
"dateUtils": {
"earlier": "稍早",
@@ -179,8 +180,7 @@
"joinInApp": "使用 App 加入會議",
"launchWebButton": "在瀏覽器開啟",
"title": "正在 {{app}} 發起您的會議...",
"tryAgainButton": "在桌面上再試一次",
"unsupportedBrowser": "您似乎正在使用我們不支援的瀏覽器。"
"tryAgainButton": "在桌面上再試一次"
},
"defaultLink": "例如 {{url}}",
"defaultNickname": "例如 春嬌 志明",
@@ -207,17 +207,15 @@
"Remove": "移除",
"Share": "分享",
"Submit": "提交",
"WaitForHostMsg": "此會議尚未開始。如果您是主人,請進行認證;否則,請等待主人到達。",
"WaitForHostMsg": "此會議 尚未啟動。如果您是會議主人,請進行認證;否則,請等待會議主人到達。",
"WaitingForHost": "等侯主辦人...",
"Yes": "是的",
"accessibilityLabel": {
"liveStreaming": "直播串流"
},
"add": "新增",
"addMeetingNote": "新增此會議的備註",
"addOptionalNote": "新增備註 (選填)",
"allow": "允許",
"alreadySharedVideoMsg": "另一位參與者已經正在分享影像了。此會議同時僅允許一人分享影像畫面。",
"alreadySharedVideoMsg": "另一位參與者已經進行分享影像了。此會議同個時間只能允許一人分享影像畫面。",
"alreadySharedVideoTitle": "一次只允許一位影像分享",
"applicationWindow": "應用程式視窗",
"authenticationRequired": "需要驗證",
@@ -267,13 +265,11 @@
"kickParticipantDialog": "您確定要將這位參與者踢出會議嗎?",
"kickParticipantTitle": "踢出這位參與者?",
"kickTitle": "噢!{{participantDisplayName}} 已將您踢出會議",
"linkMeeting": "連結會議",
"linkMeetingTitle": "將會議連結至 Salesforce",
"liveStreaming": "直播串流中",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "正在錄影,無法使用",
"liveStreamingDisabledTooltip": "啟動直播串流已停用。",
"localUserControls": "本機使用者控制",
"lockMessage": "無法鎖定會議。",
"lockMessage": "鎖定會議失敗。",
"lockRoom": "增加會議 $t(lockRoomPasswordUppercase)",
"lockTitle": "鎖定失敗",
"login": "登入",
@@ -323,7 +319,6 @@
"popupError": "您的瀏覽器在此網站上阻擋彈出視窗。請在瀏覽器的安全設定中啟用並再試一次。",
"popupErrorTitle": "彈出視窗遭到阻擋",
"readMore": "更多",
"recentlyUsedObjects": "您近期使用過的物件",
"recording": "錄影中",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "正在直播時無法使用",
"recordingDisabledTooltip": "啟動錄影已停用。",
@@ -340,25 +335,19 @@
"removeSharedVideoMsg": "您確定要移除自己分享的影像嗎?",
"removeSharedVideoTitle": "移除分享的影像",
"reservationError": "預約系統錯誤",
"reservationErrorMsg": "錯誤碼:{{code}} 訊息:{{msg}}",
"reservationErrorMsg": "錯誤碼: {{code}} 訊息: {{msg}}",
"retry": "重試",
"screenSharingAudio": "分享音訊",
"screenSharingFailed": "噢喔!發生錯誤,我們無法啟動螢幕分享!",
"screenSharingFailedTitle": "螢幕分享失敗!",
"screenSharingPermissionDeniedError": "噢喔!您的影像分享權限發生問題。請重新載入,再試一次。",
"searchInSalesforce": "在 Salesforce 中搜尋",
"searchResults": "搜尋結果 ({{count}})",
"searchResultsDetailsError": "取得擁有者資料時發生錯誤。",
"searchResultsError": "取得資料時發生錯誤。",
"searchResultsNotFound": "找不到任何結果。",
"searchResultsTryAgain": "請嘗試使用其他關鍵字。",
"sendPrivateMessage": "您最近有收到私人訊息。您要進行私人回覆,還是要將自己的訊息發佈至群組?",
"sendPrivateMessage": "您最近有收到私人訊息。您要進行私人回覆,或是要將自己的訊息發佈至群組?",
"sendPrivateMessageCancel": "發佈至群組",
"sendPrivateMessageOk": "私人回覆",
"sendPrivateMessageTitle": "私人回覆",
"sendPrivateMessageTitle": "私人傳訊",
"serviceUnavailable": "服務無法使用",
"sessTerminated": "通話已經終止",
"sessionRestarted": "通話因連線問題重新啟動",
"sessionRestarted": "通話被橋接器重新啟動",
"shareAudio": "繼續",
"shareAudioTitle": "如何分享音訊",
"shareAudioWarningD1": "您必須先停止分享畫面才能分享音訊。",
@@ -370,13 +359,11 @@
"shareScreenWarningD2": "您必須先停止分享音訊,啟動畫面分享,然後勾選 \"分享音訊\" 選項。",
"shareScreenWarningH1": "如果您只要分享畫面:",
"shareScreenWarningTitle": "您必須先停止分享音訊才能分享畫面",
"shareVideoLinkError": "請提供正確的影片網址。",
"shareVideoLinkError": "請提供正確的 YouTube 連結。",
"shareVideoTitle": "分享影像",
"shareYourScreen": "分享自己的螢幕",
"shareYourScreenDisabled": "螢幕分享已停用。",
"sharedVideoDialogError": "錯誤:網址無效",
"sharedVideoLinkPlaceholder": "YouTube 或影片網址",
"start": "開始 ",
"sharedVideoLinkPlaceholder": "YouTube 或影片連結",
"startLiveStreaming": "啟動直播串流",
"startRecording": "啟動錄影作業",
"startRemoteControlErrorMessage": "嘗試啟動遠端控制階段時發生錯誤!",
@@ -401,7 +388,7 @@
"yourEntireScreen": "您的畫面"
},
"documentSharing": {
"title": "分享的檔案"
"title": "分享的文件"
},
"e2ee": {
"labelToolTip": "此通話的音訊及視訊皆已使用端對端加密"
@@ -419,10 +406,6 @@
"veryBad": "極差",
"veryGood": "極好"
},
"giphy": {
"noResults": "找不到任何結果 :(",
"search": "搜尋 GIPHY"
},
"helpView": {
"header": "說明中心"
},
@@ -440,8 +423,8 @@
"conferenceURL": "連結:",
"copyNumber": "複製號碼",
"country": "國家",
"dialANumber": "要參加您的會議,撥打以下其中一支號碼,然後輸入 PIN 碼。",
"dialInConferenceID": "PIN 碼:",
"dialANumber": "要參加您的會議,撥打以下其中一支號碼,然後輸入 PIN 碼。",
"dialInConferenceID": "PIN 碼:",
"dialInNotSupported": "抱歉,目前不支援電話撥入。",
"dialInNumber": "撥入:",
"dialInSummaryError": "目前解析撥入資訊錯誤。請稍後再試一次。",
@@ -489,7 +472,6 @@
"focusLocal": "聚焦於自己的影像",
"focusRemote": "聚焦於另一人的影像",
"fullScreen": "觀看或離開全螢幕",
"giphyMenu": "切換 GIPHY 選單",
"keyboardShortcuts": "快捷鍵",
"localRecording": "顯示或隱藏本機端錄影操控",
"mute": "靜音或解除靜音",
@@ -543,8 +525,7 @@
"admit": "准許",
"admitAll": "准許所有人",
"allow": "允許",
"backToKnockModeButton": "求加入",
"chat": "聊天",
"backToKnockModeButton": "沒有密碼,請要求加入",
"dialogTitle": "大廳模式",
"disableDialogContent": "已開啟大廳模式。此功能能夠確保閒雜人等無法加入您的會議。您確定要停用嗎?",
"disableDialogSubmit": "停用",
@@ -557,7 +538,6 @@
"errorMissingPassword": "請輸入會議密碼",
"invalidPassword": "密碼錯誤",
"joinRejectedMessage": "您的加入請求遭到管理員拒絕。",
"joinRejectedTitle": "加入請求遭拒。",
"joinTitle": "加入會議",
"joinWithPasswordMessage": "正在嘗試透過密碼加入,請稍候...",
"joiningMessage": "一旦他人接受您的請求,即可加入會議",
@@ -566,8 +546,6 @@
"knockButton": "請求加入",
"knockTitle": "有人想要加入會議",
"knockingParticipantList": "要求加入的參與者名單",
"lobbyChatStartedNotification": "{{moderator}} 與 {{attendee}} 開始了大廳聊天",
"lobbyChatStartedTitle": "{{moderator}} 與您開始了大廳聊天。",
"nameField": "輸入您的名字",
"notificationLobbyAccessDenied": "{{originParticipantName}} 拒絕了 {{targetParticipantName}} 的加入請求",
"notificationLobbyAccessGranted": "{{originParticipantName}} 同意了 {{targetParticipantName}} 的加入請求",
@@ -622,15 +600,13 @@
"allowedUnmute": "您可以將麥克風解除靜音、開啟視訊,或是分享您的畫面。",
"audioUnmuteBlockedDescription": "麥克風解除靜音操作由於系統限制而被暫時封鎖。",
"audioUnmuteBlockedTitle": "麥克風解除靜音遭封鎖!",
"chatMessages": "聊天訊息",
"connectedOneMember": "{{name}} 加入了會議",
"connectedThreePlusMembers": "{{name}} 及 {{count}} 位人員加入了會議",
"connectedTwoMembers": "{{first}} 及 {{second}} 加入了會議",
"disconnected": "已經中斷連接",
"displayNotifications": "顯示通知",
"focus": "會議焦點",
"focusFail": "{{component}} 無法使用 - 請在 {{ms}} 秒後重試",
"gifsMenu": "GIPHY",
"grantedTo": "主持人權限已授予 {{to}}",
"groupTitle": "通知",
"hostAskedUnmute": "主持人希望您能解除靜音",
"invitedOneMember": "{{name}} 已受邀請",
@@ -640,12 +616,6 @@
"leftOneMember": "{{name}} 已離開會議",
"leftThreePlusMembers": "{{name}} 和其他人已離開會議",
"leftTwoMembers": "{{first}} 和 {{second}} 已離開會議",
"linkToSalesforce": "連結至 Salesforce",
"linkToSalesforceDescription": "您可以將會議摘要連結至 Salesforce 物件。",
"linkToSalesforceError": "無法將會議連結至 Salesforce",
"linkToSalesforceKey": "連結此會議",
"linkToSalesforceProgress": "正在將會議連結至 Salesforce...",
"linkToSalesforceSuccess": "會議已連結至 Salesforce",
"me": "自己",
"moderationInEffectCSDescription": "若要分享視訊,請舉手",
"moderationInEffectCSTitle": "內容分享已被管理員停用",
@@ -669,18 +639,14 @@
"oldElectronClientDescription1": "您似乎正在使用 Jitsi Meet 客戶端的舊版本,其有已知的安全漏洞。請更新到",
"oldElectronClientDescription2": "最新版本",
"oldElectronClientDescription3": "",
"participantWantsToJoin": "想要加入會議",
"participantsWantToJoin": "想要加入會議",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) 已被其他參與者移除",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) 已被其他參與者設定",
"raiseHandAction": "舉手",
"raisedHand": "{{name}} 想要發言。",
"raisedHands": "{{participantName}} 和其他 {{raisedHands}} 人",
"reactionSounds": "停用音效",
"reactionSoundsForAll": "為所有人停用音效",
"screenShareNoAudio": "您未在選擇視窗時勾選分享音訊",
"screenShareNoAudioTitle": "未勾選分享音訊",
"selfViewTitle": "您隨時可以在設定中取消隱藏自己的畫面",
"somebody": "某人",
"startSilentDescription": "重新加入會議以啟用語音",
"startSilentTitle": "您加入了會議而無聲音輸出!",
@@ -690,9 +656,7 @@
"videoMutedRemotelyDescription": "您隨時可以再次啟用。",
"videoMutedRemotelyTitle": "您的攝影機已被 {{participantDisplayName}} 停用!",
"videoUnmuteBlockedDescription": "視訊鏡頭解除靜音操作由於系統限制而被暫時封鎖。",
"videoUnmuteBlockedTitle": "視訊鏡頭解除靜音遭封鎖!",
"viewLobby": "檢視大廳",
"waitingParticipants": "{{waitingParticipants}} 人"
"videoUnmuteBlockedTitle": "視訊鏡頭解除靜音遭封鎖!"
},
"participantsPane": {
"actions": {
@@ -724,7 +688,6 @@
},
"passwordDigitsOnly": "上限為 {{number}} 位數",
"passwordSetRemotely": "由其他參與者設定",
"pinnedParticipant": "參與者被釘選",
"polls": {
"answer": {
"skip": "跳過",
@@ -838,20 +801,7 @@
"setEmailLabel": "設定您的 Gravatar 電子信箱",
"title": "簡介"
},
"raisedHand": "想要發言",
"raisedHandsLabel": "舉手人數",
"record": {
"already": {
"linked": "會議已連結至此 Salesforce 物件。"
},
"type": {
"account": "帳號",
"contact": "聯絡",
"lead": "淺在客戶",
"opportunity": "機會",
"owner": "擁有者"
}
},
"raisedHand": "請求發言",
"recording": {
"authDropboxText": "上傳至 Dropbox",
"availableSpace": "可用空間:{{spaceLeft}} MB (錄影時間大約 {{duration}} 分鐘)",
@@ -866,11 +816,6 @@
"expandedPending": "錄影正在啟動...",
"failedToStart": "錄影啟動失敗",
"fileSharingdescription": "分享錄影給會議參與者",
"highlight": "精選",
"highlightMoment": "精選時刻",
"highlightMomentDisabled": "您可以在錄製開始後精選時刻",
"highlightMomentSuccess": "已精選的時刻",
"highlightMomentSucessDescription": "您的精選時刻將新增至會議摘要。",
"inProgress": "正在錄製或直播",
"limitNotificationDescriptionNative": "由於目前流量過大,您的錄影時間被限制在 {{limit}} 分鐘。若要無限制的錄影,請試試 <3>{{app}}</3>。",
"limitNotificationDescriptionWeb": "由於目前流量過大,您的錄影時間被限制在 {{limit}} 分鐘。若要無限制的錄影,請試試 <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>。",
@@ -885,7 +830,6 @@
"rec": "錄影",
"serviceDescription": "您的錄影會由錄影服務儲存",
"serviceDescriptionCloud": "雲端錄製",
"serviceDescriptionCloudInfo": "已錄製的會議將在 24 小時後自動清除。",
"serviceName": "錄影服務",
"sessionAlreadyActive": "已在錄製或直播此工作階段。",
"signIn": "登入",
@@ -894,9 +838,8 @@
"unavailableTitle": "錄影無法使用",
"uploadToCloud": "上傳至雲端"
},
"screenshareDisplayName": "{{name}} 的畫面",
"sectionList": {
"pullToRefresh": "拉以重新整理"
"pullToRefresh": "拉以重新整理"
},
"security": {
"about": "您可以新增 $t(lockRoomPassword) 至您的會議。參與者在加入會議前必須先輸入 $t(lockRoomPassword)。",
@@ -921,7 +864,6 @@
"incomingMessage": "新訊息",
"language": "語言",
"loggedIn": "以 {{name}} 登入",
"maxStageParticipants": "能夠被釘選至主舞台的參與者最大人數",
"microphones": "麥克風",
"moderator": "主持人",
"more": "更多",
@@ -935,7 +877,6 @@
"selectAudioOutput": "音訊輸出",
"selectCamera": "攝影裝置",
"selectMic": "麥克風",
"selfView": "自我檢視",
"sounds": "音效",
"speakers": "喇叭",
"startAudioMuted": "全部人啟動時處於靜音",
@@ -974,7 +915,6 @@
"speakerStats": {
"angry": "憤怒",
"disgusted": "作嘔",
"displayEmotions": "顯示表情",
"fearful": "害怕",
"happy": "開心",
"hours": "{{count}}時",
@@ -1008,7 +948,6 @@
"audioOnly": "切換僅聲音",
"audioRoute": "選擇音訊裝置",
"boo": "喝倒彩",
"breakoutRoom": "加入/離開分組討論室",
"callQuality": "管理影像品質",
"cc": "切換字幕",
"chat": "切換聊天視窗",
@@ -1026,9 +965,7 @@
"invite": "邀請人員",
"joy": "笑到流淚",
"kick": "踢出參與者",
"laugh": "大笑",
"like": "比讚",
"linkToSalesforce": "連結至 Salesforce",
"lobbyButton": "啟用/停用大廳模式",
"localRecording": "切換本地端錄影控制",
"lockRoom": "切換會議密碼",
@@ -1090,7 +1027,6 @@
"exitFullScreen": "離開全螢幕",
"exitTileView": "跳出格狀檢視",
"feedback": "回饋",
"giphy": "切換 GIPHY 選單",
"hangup": "離開",
"help": "說明",
"invite": "邀請人員",
@@ -1098,7 +1034,6 @@
"laugh": "大笑",
"leaveBreakoutRoom": "離開分組討論室",
"like": "比讚",
"linkToSalesforce": "連結至 Salesforce",
"lobbyButtonDisable": "停用大廳模式",
"lobbyButtonEnable": "啟用大廳模式",
"login": "登入",
@@ -1213,18 +1148,13 @@
"domuteVideoOfOthers": "停用其他人的攝影機",
"flip": "翻轉",
"grantModerator": "授予管理員",
"hideSelfView": "隱藏自我檢視",
"kick": "踢出",
"moderator": "主持人",
"mute": "參與者處於靜音",
"muted": "處於靜音",
"pinToStage": "釘選至舞台",
"remoteControl": "開始/停止遠端控制",
"screenSharing": "參與者正在分享他們的畫面",
"show": "顯示在台上",
"showSelfView": "顯示自我檢視",
"unpinFromStage": "取消釘選",
"videoMuted": "已停用攝影裝置",
"videoMuted": "已停用攝影機",
"videomute": "參與者已經停止攝影裝置"
},
"virtualBackground": {
@@ -1248,8 +1178,7 @@
"slightBlur": "稍微模糊",
"title": "虛擬背景",
"uploadedImage": "上傳圖片 {{index}}",
"webAssemblyWarning": "不支援 WebAssembly",
"webAssemblyWarningDescription": "WebAssembly 遭停用或不被此連覽器支援"
"webAssemblyWarning": "不支援 WebAssembly"
},
"volumeSlider": "音量滑條",
"welcomepage": {

View File

@@ -31,7 +31,6 @@
},
"audioDevices": {
"bluetooth": "Bluetooth",
"car": "Car Audio",
"headphones": "Headphones",
"none": "No audio devices available",
"phone": "Phone",
@@ -40,6 +39,9 @@
"audioOnly": {
"audioOnly": "Low bandwidth"
},
"blankPage": {
"meetingEnded": "Meeting ended."
},
"breakoutRooms": {
"actions": {
"add": "Add breakout room",
@@ -557,7 +559,6 @@
"errorMissingPassword": "Please enter the meeting password",
"invalidPassword": "Invalid password",
"joinRejectedMessage": "Your join request was rejected by a moderator.",
"joinRejectedTitle": "Join request rejected.",
"joinTitle": "Join Meeting",
"joinWithPasswordMessage": "Trying to join with password, please wait...",
"joiningMessage": "You'll join the meeting as soon as someone accepts your request",
@@ -630,7 +631,6 @@
"displayNotifications": "Display notifications for",
"focus": "Conference focus",
"focusFail": "{{component}} not available - retry in {{ms}} sec",
"gifsMenu": "GIPHY",
"groupTitle": "Notifications",
"hostAskedUnmute": "The moderator would like you to speak",
"invitedOneMember": "{{name}} has been invited",
@@ -724,7 +724,6 @@
},
"passwordDigitsOnly": "Up to {{number}} digits",
"passwordSetRemotely": "Set by another participant",
"pinnedParticipant": "The participant is pinned",
"polls": {
"answer": {
"skip": "Skip",
@@ -866,7 +865,6 @@
"expandedPending": "Recording is being started...",
"failedToStart": "Recording failed to start",
"fileSharingdescription": "Share the recording link with the meeting participants",
"highlight": "Highlight",
"highlightMoment": "Highlight moment",
"highlightMomentDisabled": "You can highlight moments when the recording starts",
"highlightMomentSuccess": "Moment highlighted",
@@ -894,7 +892,6 @@
"unavailableTitle": "Recording unavailable",
"uploadToCloud": "Upload to the cloud"
},
"screenshareDisplayName": "{{name}}'s screen",
"sectionList": {
"pullToRefresh": "Pull to refresh"
},
@@ -921,7 +918,6 @@
"incomingMessage": "Incoming message",
"language": "Language",
"loggedIn": "Logged in as {{name}}",
"maxStageParticipants": "Maximum number of participants who can be pinned to the main stage",
"microphones": "Microphones",
"moderator": "Moderator",
"more": "More",
@@ -1218,12 +1214,10 @@
"moderator": "Moderator",
"mute": "Participant is muted",
"muted": "Muted",
"pinToStage": "Pin to stage",
"remoteControl": "Start / Stop remote control",
"screenSharing": "Participant is sharing their screen",
"show": "Show on stage",
"showSelfView": "Show self view",
"unpinFromStage": "Unpin",
"videoMuted": "Camera disabled",
"videomute": "Participant has stopped the camera"
},

View File

@@ -87,8 +87,6 @@ import { toggleScreenshotCaptureSummary } from '../../react/features/screenshot-
import { isScreenshotCaptureEnabled } from '../../react/features/screenshot-capture/functions';
import { playSharedVideo, stopSharedVideo } from '../../react/features/shared-video/actions.any';
import { extractYoutubeIdOrURL } from '../../react/features/shared-video/functions';
import { toggleRequestingSubtitles, setRequestingSubtitles } from '../../react/features/subtitles/actions';
import { isAudioMuteButtonDisabled } from '../../react/features/toolbox/functions';
import { toggleTileView, setTileView } from '../../react/features/video-layout';
import { muteAllParticipants } from '../../react/features/video-menu/actions';
import { setVideoQuality } from '../../react/features/video-quality';
@@ -373,12 +371,6 @@ function initCommands() {
sendAnalytics(createApiEvent('screen.sharing.toggled'));
toggleScreenSharing(options.enable);
},
'toggle-subtitles': () => {
APP.store.dispatch(toggleRequestingSubtitles());
},
'set-subtitles': enabled => {
APP.store.dispatch(setRequestingSubtitles(enabled));
},
'toggle-tile-view': () => {
sendAnalytics(createApiEvent('tile-view.toggled'));
@@ -701,9 +693,6 @@ function initCommands() {
case 'is-audio-muted':
callback(APP.conference.isLocalAudioMuted());
break;
case 'is-audio-disabled':
callback(isAudioMuteButtonDisabled(APP.store.getState()));
break;
case 'is-moderation-on': {
const { mediaType } = request;
const type = mediaType || MEDIA_TYPE.AUDIO;
@@ -736,9 +725,6 @@ function initCommands() {
case 'is-sharing-screen':
callback(Boolean(APP.conference.isSharingScreen));
break;
case 'is-start-silent':
callback(Boolean(APP.store.getState()['features/base/config'].startSilent));
break;
case 'get-content-sharing-participants': {
const tracks = getState()['features/base/tracks'];
const sharingParticipantIds = tracks.filter(tr => tr.videoType === 'desktop').map(t => t.participantId);
@@ -1155,21 +1141,6 @@ class API {
});
}
/**
* Notify external application (if API is enabled) that some face landmark data is available.
*
* @param {Object | undefined} faceBox - Detected face(s) bounding box (left, right, width).
* @param {string} faceExpression - Detected face expression.
* @returns {void}
*/
notifyFaceLandmarkDetected(faceBox: Object, faceExpression: string) {
this._sendEvent({
name: 'face-landmark-detected',
faceBox,
faceExpression
});
}
/**
* Notify external application (if API is enabled) that the list of sharing participants changed.
*

View File

@@ -59,7 +59,6 @@ const commands = {
setLargeVideoParticipant: 'set-large-video-participant',
setMediaEncryptionKey: 'set-media-encryption-key',
setParticipantVolume: 'set-participant-volume',
setSubtitles: 'set-subtitles',
setTileView: 'set-tile-view',
setVideoQuality: 'set-video-quality',
startRecording: 'start-recording',
@@ -80,7 +79,6 @@ const commands = {
toggleRaiseHand: 'toggle-raise-hand',
toggleShareAudio: 'toggle-share-audio',
toggleShareScreen: 'toggle-share-screen',
toggleSubtitles: 'toggle-subtitles',
toggleTileView: 'toggle-tile-view',
toggleVirtualBackgroundDialog: 'toggle-virtual-background',
toggleVideo: 'toggle-video'
@@ -104,7 +102,6 @@ const events = {
'email-change': 'emailChange',
'error-occurred': 'errorOccurred',
'endpoint-text-message-received': 'endpointTextMessageReceived',
'face-landmark-detected': 'faceLandmarkDetected',
'feedback-submitted': 'feedbackSubmitted',
'feedback-prompt-displayed': 'feedbackPromptDisplayed',
'filmstrip-display-changed': 'filmstripDisplayChanged',
@@ -927,18 +924,6 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
});
}
/**
* Returns the audio disabled status.
*
* @returns {Promise} - Resolves with the audio disabled status and rejects on
* failure.
*/
isAudioDisabled() {
return this._transport.sendRequest({
name: 'is-audio-disabled'
});
}
/**
* Returns the moderation on status on the given mediaType.
*
@@ -992,17 +977,6 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
});
}
/**
* Returns wether meeting is started silent.
*
* @returns {Promise} - Resolves with start silent status.
*/
isStartSilent() {
return this._transport.sendRequest({
name: 'is-start-silent'
});
}
/**
* Returns the avatar URL of a participant.
*

View File

@@ -6,10 +6,7 @@ import { openConnection } from '../../../connection';
import {
openAuthDialog,
openLoginDialog } from '../../../react/features/authentication/actions.web';
import {
LoginDialog,
WaitForOwnerDialog
} from '../../../react/features/authentication/components';
import { WaitForOwnerDialog } from '../../../react/features/authentication/components';
import {
isTokenAuthEnabled,
getTokenAuthUrl
@@ -19,7 +16,7 @@ import { isDialogOpen } from '../../../react/features/base/dialog';
import { setJWT } from '../../../react/features/base/jwt';
import UIUtil from '../util/UIUtil';
import ExternalLoginDialog from './LoginDialog';
import LoginDialog from './LoginDialog';
let externalAuthWindow;
@@ -54,7 +51,7 @@ function doExternalAuth(room, lockPassword) {
getUrl = room.getExternalAuthUrl(true);
}
getUrl.then(url => {
externalAuthWindow = ExternalLoginDialog.showExternalAuthDialog(
externalAuthWindow = LoginDialog.showExternalAuthDialog(
url,
() => {
externalAuthWindow = null;
@@ -190,7 +187,7 @@ function authenticate(room: Object, lockPassword: string) {
* @param {string} [lockPassword] password to use if the conference is locked
*/
function requireAuth(room: Object, lockPassword: string) {
if (isDialogOpen(APP.store, WaitForOwnerDialog) || isDialogOpen(APP.store, LoginDialog)) {
if (!isDialogOpen(APP.store, WaitForOwnerDialog)) {
return;
}

View File

@@ -11,16 +11,12 @@ import { Avatar } from '../../../react/features/base/avatar';
import theme from '../../../react/features/base/components/themes/participantsPaneTheme.json';
import { getSourceNameSignalingFeatureFlag } from '../../../react/features/base/config';
import { i18next } from '../../../react/features/base/i18n';
import { JitsiTrackEvents } from '../../../react/features/base/lib-jitsi-meet';
import { VIDEO_TYPE } from '../../../react/features/base/media';
import { MEDIA_TYPE, VIDEO_TYPE } from '../../../react/features/base/media';
import {
getParticipantById,
getParticipantDisplayName
} from '../../../react/features/base/participants';
import {
getVideoTrackByParticipant,
trackStreamingStatusChanged
} from '../../../react/features/base/tracks';
import { getTrackByMediaTypeAndParticipant } from '../../../react/features/base/tracks';
import { CHAT_SIZE } from '../../../react/features/chat';
import {
isParticipantConnectionStatusActive,
@@ -118,14 +114,6 @@ export default class LargeVideoManager {
*/
this._videoAspectRatio = 0;
/**
* The video track in effect.
* This is used to add and remove listeners on track streaming status change.
*
* @type {Object}
*/
this.videoTrack = undefined;
this.$container = $('#largeVideoContainer');
this.$container.css({
@@ -249,34 +237,11 @@ export default class LargeVideoManager {
let isVideoRenderable;
if (getSourceNameSignalingFeatureFlag(state)) {
const tracks = state['features/base/tracks'];
const videoTrack = getVideoTrackByParticipant(tracks, participant);
const videoTrack = getTrackByMediaTypeAndParticipant(
state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
// Remove track streaming status listener from the old track and add it to the new track,
// in order to stop updating track streaming status for the old track and start it for the new track.
// TODO: when this class is converted to a function react component,
// use a custom hook to update a local track streaming status.
if (this.videoTrack?.jitsiTrack?.getSourceName() !== videoTrack?.jitsiTrack?.getSourceName()) {
if (this.videoTrack) {
this.videoTrack.jitsiTrack.off(JitsiTrackEvents.TRACK_STREAMING_STATUS_CHANGED,
this.handleTrackStreamingStatusChanged);
APP.store.dispatch(trackStreamingStatusChanged(this.videoTrack.jitsiTrack,
this.videoTrack.jitsiTrack.getTrackStreamingStatus()));
}
if (videoTrack && !videoTrack.local) {
this.videoTrack = videoTrack;
this.videoTrack.jitsiTrack.on(JitsiTrackEvents.TRACK_STREAMING_STATUS_CHANGED,
this.handleTrackStreamingStatusChanged);
APP.store.dispatch(trackStreamingStatusChanged(this.videoTrack.jitsiTrack,
this.videoTrack.jitsiTrack.getTrackStreamingStatus()));
}
}
isVideoRenderable = !isVideoMuted && (
APP.conference.isLocalId(id)
|| participant?.isLocalScreenShare
|| isTrackStreamingStatusActive(videoTrack)
);
isVideoRenderable = !isVideoMuted
&& (APP.conference.isLocalId(id) || isTrackStreamingStatusActive(videoTrack));
} else {
isVideoRenderable = !isVideoMuted
&& (APP.conference.isLocalId(id) || isParticipantConnectionStatusActive(participant));
@@ -303,10 +268,8 @@ export default class LargeVideoManager {
&& participant && !participant.local && !participant.isFakeParticipant) {
// remote participant only
const tracks = state['features/base/tracks'];
const track = getVideoTrackByParticipant(tracks, participant);
const track = getTrackByMediaTypeAndParticipant(
state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
const isScreenSharing = track?.videoType === 'desktop';
if (isScreenSharing) {
@@ -337,8 +300,8 @@ export default class LargeVideoManager {
let messageKey;
if (getSourceNameSignalingFeatureFlag(state)) {
const tracks = state['features/base/tracks'];
const videoTrack = getVideoTrackByParticipant(tracks, participant);
const videoTrack = getTrackByMediaTypeAndParticipant(
state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
messageKey = isTrackStreamingStatusInactive(videoTrack) ? 'connection.LOW_BANDWIDTH' : null;
} else {
@@ -370,19 +333,6 @@ export default class LargeVideoManager {
});
}
/**
* Handle track streaming status change event by
* by dispatching an action to update track streaming status for the given track in app state.
*
* @param {JitsiTrack} jitsiTrack the track with streaming status updated
* @param {JitsiTrackStreamingStatus} streamingStatus the updated track streaming status
*
* @private
*/
handleTrackStreamingStatusChanged(jitsiTrack, streamingStatus) {
APP.store.dispatch(trackStreamingStatusChanged(jitsiTrack, streamingStatus));
}
/**
* Shows/hides notification about participant's connectivity issues to be
* shown on the large video area.
@@ -591,8 +541,8 @@ export default class LargeVideoManager {
const state = APP.store.getState();
if (getSourceNameSignalingFeatureFlag(state)) {
const tracks = state['features/base/tracks'];
const videoTrack = getVideoTrackByParticipant(tracks, participant);
const videoTrack = getTrackByMediaTypeAndParticipant(
state['features/base/tracks'], MEDIA_TYPE.VIDEO, this.id);
// eslint-disable-next-line no-param-reassign
show = !APP.conference.isLocalId(this.id)

View File

@@ -414,7 +414,7 @@ export class VideoContainer extends LargeContainer {
const verticalFilmstripWidth = state['features/filmstrip'].width?.current;
if (currentLayout === LAYOUTS.TILE_VIEW || currentLayout === LAYOUTS.STAGE_FILMSTRIP_VIEW) {
if (currentLayout === LAYOUTS.TILE_VIEW) {
// We don't need to resize the large video since it won't be displayed and we'll resize when returning back
// to stage view.
return;

View File

@@ -2,16 +2,12 @@
import Logger from '@jitsi/logger';
import { getSourceNameSignalingFeatureFlag } from '../../../react/features/base/config';
import { MEDIA_TYPE, VIDEO_TYPE } from '../../../react/features/base/media';
import {
getPinnedParticipant,
getParticipantById
} from '../../../react/features/base/participants';
import {
getTrackByMediaTypeAndParticipant,
getFakeScreenshareParticipantTrack
} from '../../../react/features/base/tracks';
import { getTrackByMediaTypeAndParticipant } from '../../../react/features/base/tracks';
import LargeVideoManager from './LargeVideoManager';
import { VIDEO_CONTAINER_TYPE } from './VideoContainer';
@@ -95,10 +91,6 @@ const VideoLayout = {
return VIDEO_TYPE.CAMERA;
}
if (getSourceNameSignalingFeatureFlag(state) && participant?.isFakeScreenShareParticipant) {
return VIDEO_TYPE.DESKTOP;
}
const videoTrack = getTrackByMediaTypeAndParticipant(state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
return videoTrack?.videoType;
@@ -185,17 +177,7 @@ const VideoLayout = {
const currentContainerType = largeVideo.getCurrentContainerType();
const isOnLarge = this.isCurrentlyOnLarge(id);
const state = APP.store.getState();
const participant = getParticipantById(state, id);
const tracks = state['features/base/tracks'];
let videoTrack;
if (getSourceNameSignalingFeatureFlag(state) && participant?.isFakeScreenShareParticipant) {
videoTrack = getFakeScreenshareParticipantTrack(tracks, id);
} else {
videoTrack = getTrackByMediaTypeAndParticipant(tracks, MEDIA_TYPE.VIDEO, id);
}
const videoTrack = getTrackByMediaTypeAndParticipant(state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
const videoStream = videoTrack?.jitsiTrack;
if (isOnLarge && !forceUpdate

537
package-lock.json generated
View File

@@ -30,7 +30,6 @@
"@atlaskit/tooltip": "17.1.2",
"@giphy/js-fetch-api": "4.1.2",
"@giphy/react-components": "5.6.0",
"@giphy/react-native-sdk": "1.7.0",
"@hapi/bourne": "2.0.0",
"@jitsi/js-utils": "2.0.0",
"@jitsi/logger": "2.0.0",
@@ -51,7 +50,9 @@
"@react-navigation/native": "6.0.6",
"@react-navigation/stack": "6.0.11",
"@svgr/webpack": "4.3.2",
"@tensorflow-models/blazeface": "0.0.7",
"@tensorflow/tfjs-backend-wasm": "3.13.0",
"@tensorflow/tfjs-converter": "3.13.0",
"@tensorflow/tfjs-core": "3.13.0",
"@vladmandic/face-api": "1.6.4",
"@xmldom/xmldom": "0.7.5",
@@ -72,10 +73,10 @@
"jquery-i18next": "1.2.1",
"js-md5": "0.6.1",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1425.0.0+6b629a19/lib-jitsi-meet.tgz",
"lib-jitsi-meet": "https://git@github.com/jitsi/lib-jitsi-meet#c286b17f732d350b945553e973753b6701e42127",
"libflacjs": "https://git@github.com/mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
"lodash": "4.17.21",
"moment": "2.29.2",
"moment": "2.29.1",
"moment-duration-format": "2.2.2",
"optional-require": "1.0.3",
"promise.allsettled": "1.0.4",
@@ -86,12 +87,12 @@
"react-focus-lock": "2.5.1",
"react-i18next": "10.11.4",
"react-linkify": "1.0.0-alpha",
"react-native": "0.67.4",
"react-native": "0.66.4",
"react-native-background-timer": "2.4.1",
"react-native-calendar-events": "2.2.0",
"react-native-callstats": "3.73.7",
"react-native-collapsible": "1.6.0",
"react-native-default-preference": "1.4.4",
"react-native-default-preference": "https://git@github.com/kevinresol/react-native-default-preference#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c",
"react-native-device-info": "8.4.8",
"react-native-dialog": "9.2.1",
"react-native-gesture-handler": "2.1.0",
@@ -101,7 +102,7 @@
"react-native-pager-view": "5.4.9",
"react-native-paper": "4.11.1",
"react-native-performance": "2.1.0",
"react-native-reanimated": "1.13.4",
"react-native-reanimated": "1.13.3",
"react-native-safe-area-context": "3.3.2",
"react-native-screens": "3.10.1",
"react-native-sound": "0.11.1",
@@ -112,7 +113,7 @@
"react-native-url-polyfill": "1.3.0",
"react-native-video": "https://git@github.com/jitsi/react-native-video#4f6dad990d17ce42894df993780b5386a9c11b85",
"react-native-watch-connectivity": "1.0.4",
"react-native-webrtc": "1.100.0",
"react-native-webrtc": "1.94.2",
"react-native-webview": "11.15.1",
"react-native-youtube-iframe": "2.2.1",
"react-redux": "7.1.0",
@@ -161,7 +162,6 @@
"string-replace-loader": "3.0.3",
"style-loader": "0.19.0",
"traverse": "0.6.6",
"ts-loader": "9.2.6",
"typescript": "4.3.5",
"unorm": "1.6.0",
"webpack": "5.57.1",
@@ -3378,30 +3378,6 @@
"react": ">=16.3.0"
}
},
"node_modules/@giphy/react-native-sdk": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/@giphy/react-native-sdk/-/react-native-sdk-1.7.0.tgz",
"integrity": "sha512-mCIqtPkDAstL+BDTbC1EQ4SiRkND3zd9uLKUeR4RkK2AhjRTUIheGzfxOZrdR014LVwcwKw5s9qpogoXr66mgw==",
"dependencies": {
"@giphy/js-types": "^4.0.3",
"type-fest": "^2.10.0"
},
"peerDependencies": {
"react": "*",
"react-native": "*"
}
},
"node_modules/@giphy/react-native-sdk/node_modules/type-fest": {
"version": "2.12.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.1.tgz",
"integrity": "sha512-AiknQSEqKVGDDjtZqeKrUoTlcj7FKhupmnVUgz6KoOKtvMwRGE6hUNJ/nVear+h7fnUPO1q/htSkYKb1pyntkQ==",
"engines": {
"node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@hapi/bourne": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz",
@@ -3595,8 +3571,8 @@
},
"node_modules/@jitsi/sdp-interop": {
"version": "1.0.5",
"resolved": "git+https://git@github.com/jitsi/sdp-interop.git#3d49eb4aa26863a3f8d32d7581cdb4321244266b",
"integrity": "sha512-80u69QNTBArnCd1CGbTTrl/8AsZOOMF82dQhrgXBQAnrimdpomX1fMZ82ZkxyWyYvRMPG167u43Tp8y1g2DLNA==",
"resolved": "git+https://git@github.com/jitsi/sdp-interop.git#3707993863eb6c5b6d66c4a025e9dba193775bfb",
"integrity": "sha512-gqp3Pne45vlrLUyBgfTCw58zMflNripWb2Eaj0mF++U5uk2oRoo1/GBZu2C6Z42ExHfHfhFUFR3N8/Ss2LwnVw==",
"license": "Apache-2.0",
"dependencies": {
"lodash.clonedeep": "4.5.0",
@@ -4448,9 +4424,9 @@
}
},
"node_modules/@react-native-community/cli/node_modules/ansi-regex": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"engines": {
"node": ">=6"
}
@@ -4657,9 +4633,9 @@
"integrity": "sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ=="
},
"node_modules/@react-native/normalize-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.0.0.tgz",
"integrity": "sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw=="
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-1.0.0.tgz",
"integrity": "sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg=="
},
"node_modules/@react-native/polyfills": {
"version": "2.0.0",
@@ -4958,6 +4934,15 @@
"node": ">=8"
}
},
"node_modules/@tensorflow-models/blazeface": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/@tensorflow-models/blazeface/-/blazeface-0.0.7.tgz",
"integrity": "sha512-+hInPkvHJoubfiXlmNuF3SCucZvU6W1PMC25IV99NSAftJUpKvLokfF93iX8UkOFQCXkPFbnLKacGfGlbjgvMw==",
"peerDependencies": {
"@tensorflow/tfjs-converter": "^3.1.0",
"@tensorflow/tfjs-core": "^3.1.0"
}
},
"node_modules/@tensorflow/tfjs-backend-cpu": {
"version": "3.13.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-3.13.0.tgz",
@@ -4985,6 +4970,14 @@
"@tensorflow/tfjs-core": "3.13.0"
}
},
"node_modules/@tensorflow/tfjs-converter": {
"version": "3.13.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-3.13.0.tgz",
"integrity": "sha512-H2VpDTv9Ve0HBt7ttzz46DmnsPaiT0B+yJjVH3NebGZbgY9C8boBgJIsdyqfiqEWBS3WxF8h4rh58Hv5XXMgaQ==",
"peerDependencies": {
"@tensorflow/tfjs-core": "3.13.0"
}
},
"node_modules/@tensorflow/tfjs-core": {
"version": "3.13.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-3.13.0.tgz",
@@ -5745,9 +5738,9 @@
}
},
"node_modules/ansi-fragments/node_modules/ansi-regex": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"engines": {
"node": ">=6"
}
@@ -6017,9 +6010,9 @@
}
},
"node_modules/async": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz",
"integrity": "sha1-rDYTsdqb7RtHUQu0ZRuJMeRxRsc="
},
"node_modules/async-limiter": {
"version": "1.0.1",
@@ -6440,9 +6433,9 @@
}
},
"node_modules/bplist-parser": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz",
"integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==",
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.0.tgz",
"integrity": "sha512-zgmaRvT6AN1JpPPV+S0a1/FAtoxSreYDccZGIqEMSvZl9DMe70mJ7MFzpxa1X+gHVdkToE2haRUHHMiW1OdejA==",
"dependencies": {
"big-integer": "1.6.x"
},
@@ -11796,15 +11789,15 @@
},
"node_modules/lib-jitsi-meet": {
"version": "0.0.0",
"resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1425.0.0+6b629a19/lib-jitsi-meet.tgz",
"integrity": "sha512-oqWGJv62jBTtGsAA1ZkBrkuzLYxAOpA/ppZ5kisy54boWbCh8/GVOfmf/OwkDrUj7iBkjlh/qRU3DUlz9l0pMw==",
"resolved": "git+https://git@github.com/jitsi/lib-jitsi-meet.git#c286b17f732d350b945553e973753b6701e42127",
"integrity": "sha512-hj81bry+CtmoJAtSZKubKcGsA7SLqZCRSJskICd/fsvGnutbJrkBfJ6s6SPG1lFmHUkwccWyOwqfu9pK0Qp7WQ==",
"license": "Apache-2.0",
"dependencies": {
"@jitsi/js-utils": "2.0.0",
"@jitsi/logger": "2.0.0",
"@jitsi/sdp-interop": "https://git@github.com/jitsi/sdp-interop#3d49eb4aa26863a3f8d32d7581cdb4321244266b",
"@jitsi/sdp-interop": "https://git@github.com/jitsi/sdp-interop#3707993863eb6c5b6d66c4a025e9dba193775bfb",
"@jitsi/sdp-simulcast": "0.4.0",
"async": "3.2.3",
"async": "0.9.0",
"base64-js": "1.3.1",
"current-executing-script": "0.1.3",
"lodash.clonedeep": "4.5.0",
@@ -12503,9 +12496,9 @@
}
},
"node_modules/metro/node_modules/async": {
"version": "2.6.4",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
"integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
"dependencies": {
"lodash": "^4.17.14"
}
@@ -12699,9 +12692,9 @@
}
},
"node_modules/minimist": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"node_modules/minipass": {
"version": "3.1.6",
@@ -12781,9 +12774,9 @@
}
},
"node_modules/moment": {
"version": "2.29.2",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
"integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==",
"version": "2.29.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
"engines": {
"node": "*"
}
@@ -12959,9 +12952,9 @@
}
},
"node_modules/node-forge": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz",
"integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz",
"integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==",
"dev": true,
"engines": {
"node": ">= 6.13.0"
@@ -13422,9 +13415,9 @@
}
},
"node_modules/ora/node_modules/ansi-regex": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"engines": {
"node": ">=6"
}
@@ -13834,9 +13827,9 @@
}
},
"node_modules/plist": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz",
"integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==",
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz",
"integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==",
"dependencies": {
"base64-js": "^1.5.1",
"xmlbuilder": "^9.0.7"
@@ -13889,9 +13882,9 @@
}
},
"node_modules/portfinder/node_modules/async": {
"version": "2.6.4",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
"integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
"dev": true,
"dependencies": {
"lodash": "^4.17.14"
@@ -14857,9 +14850,9 @@
}
},
"node_modules/react-devtools-core": {
"version": "4.19.1",
"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.19.1.tgz",
"integrity": "sha512-2wJiGffPWK0KggBjVwnTaAk+Z3MSxKInHmdzPTrBh1mAarexsa93Kw+WMX88+XjN+TtYgAiLe9xeTqcO5FfJTw==",
"version": "4.23.0",
"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.23.0.tgz",
"integrity": "sha512-KkzneT1LczFtebbTJlvRphIRvzuHLhI9ghfrseVv9ktBs+l2cXy8Svw5U16lzQnwU9okVEcURmGPgH79WWrlaw==",
"dependencies": {
"shell-quote": "^1.6.1",
"ws": "^7"
@@ -14979,16 +14972,16 @@
}
},
"node_modules/react-native": {
"version": "0.67.4",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.67.4.tgz",
"integrity": "sha512-NA9d9lNJu9TViEJu2uZxWXUP+QNUilGGA5tdMbVFedNroOH1lnQ3n/FAVoGK1gqGarCgNTtheBxUpEa979Cu8w==",
"version": "0.66.4",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.66.4.tgz",
"integrity": "sha512-9vx5dlSfQlKbbDtr8+xMon6qsmSu7jvjdXWZpEKh3XVKpUidbbODv7048gwVKX8YAel1egeR7hN8vzSeI6ssTw==",
"dependencies": {
"@jest/create-cache-key-function": "^27.0.1",
"@react-native-community/cli": "^6.0.0",
"@react-native-community/cli-platform-android": "^6.0.0",
"@react-native-community/cli-platform-ios": "^6.0.0",
"@react-native/assets": "1.0.0",
"@react-native/normalize-color": "2.0.0",
"@react-native/normalize-color": "1.0.0",
"@react-native/polyfills": "2.0.0",
"abort-controller": "^3.0.0",
"anser": "^1.4.9",
@@ -14997,6 +14990,7 @@
"hermes-engine": "~0.9.0",
"invariant": "^2.2.4",
"jsc-android": "^250230.2.1",
"metro-babel-register": "0.66.2",
"metro-react-native-babel-transformer": "0.66.2",
"metro-runtime": "0.66.2",
"metro-source-map": "0.66.2",
@@ -15004,8 +14998,8 @@
"pretty-format": "^26.5.2",
"promise": "^8.0.3",
"prop-types": "^15.7.2",
"react-devtools-core": "4.19.1",
"react-native-codegen": "^0.0.8",
"react-devtools-core": "^4.13.0",
"react-native-codegen": "^0.0.7",
"react-refresh": "^0.4.0",
"regenerator-runtime": "^0.13.2",
"scheduler": "^0.20.2",
@@ -15050,9 +15044,9 @@
}
},
"node_modules/react-native-codegen": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.8.tgz",
"integrity": "sha512-k/944+0XD+8l7zDaiKfYabyEKmAmyZgS1mj+4LcSRPyHnrjgCHKrh/Y6jM6kucQ6xU1+1uyMmF/dSkikxK8i+Q==",
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.7.tgz",
"integrity": "sha512-dwNgR8zJ3ALr480QnAmpTiqvFo+rDtq6V5oCggKhYFlRjzOmVSFn3YD41u8ltvKS5G2nQ8gCs2vReFFnRGLYng==",
"dependencies": {
"flow-parser": "^0.121.0",
"jscodeshift": "^0.11.0",
@@ -15069,9 +15063,10 @@
}
},
"node_modules/react-native-default-preference": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/react-native-default-preference/-/react-native-default-preference-1.4.4.tgz",
"integrity": "sha512-h0vtgiSKws3UmMRJykXAVM4ne1SgfoocUcoBD19ewRpQd6wqurE0HJRQGrSxcHK5LdKE7QPSIB1VX3YGIVS8Jg==",
"version": "1.4.3",
"resolved": "git+https://git@github.com/kevinresol/react-native-default-preference.git#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c",
"integrity": "sha512-vmUyt63mLc+xebOOWrZxTF7o7AdWQqzy6lUn7pgjnyUd93//AOpQ6iXGijL9KpNiOv8mDKWAPZKhLY1XVuzZwA==",
"license": "MIT",
"peerDependencies": {
"react-native": ">=0.47.0"
}
@@ -15169,9 +15164,9 @@
}
},
"node_modules/react-native-reanimated": {
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.13.4.tgz",
"integrity": "sha512-sFbZFh0WanKTa0Fz7GXCZUjWpk/u04ytprcIs4Kb+ijfQHChXva3m3yQZfvbrhRbABJNHrdeuyDgJxDM2mcBgw==",
"version": "1.13.3",
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.13.3.tgz",
"integrity": "sha512-i714H24dv6ncpFO7/SZ0PfAMbvjgVbF8Ow2NPtowoZAz8osS54DmTMrkgJ9Za+uEku/s0AEaxqiXG2Xgntvv2g==",
"dependencies": {
"fbjs": "^1.0.0"
},
@@ -15701,9 +15696,9 @@
}
},
"node_modules/react-native-webrtc": {
"version": "1.100.0",
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.100.0.tgz",
"integrity": "sha512-sBLl8Ihj3xfYn0NZJdDxelB/dZ422FWg/kcLdSw6Wk4eM3MeNW3iFwVsqg2dLzeDnuoQ06i7hOdtP7pGAiKsug==",
"version": "1.94.2",
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.94.2.tgz",
"integrity": "sha512-8wf7CDLYmrxxvta3XxZbmtNrxUblE70fDpoxjYKWfEa48Y4FnFw7MF61g8qYo+V0adoOUNc3j4fIgVnAMghJ9Q==",
"hasInstallScript": true,
"dependencies": {
"base64-js": "1.5.1",
@@ -16999,13 +16994,13 @@
}
},
"node_modules/simple-plist": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz",
"integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==",
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.0.tgz",
"integrity": "sha512-uYWpeGFtZtVt2NhG4AHgpwx323zxD85x42heMJBan1qAiqqozIlaGrwrEt6kRjXWRWIXsuV1VLCvVmZan2B5dg==",
"dependencies": {
"bplist-creator": "0.1.0",
"bplist-parser": "0.3.1",
"plist": "^3.0.5"
"bplist-parser": "0.3.0",
"plist": "^3.0.4"
}
},
"node_modules/simple-swizzle": {
@@ -18332,110 +18327,6 @@
"resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
"integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
},
"node_modules/ts-loader": {
"version": "9.2.6",
"resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz",
"integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==",
"dev": true,
"dependencies": {
"chalk": "^4.1.0",
"enhanced-resolve": "^5.0.0",
"micromatch": "^4.0.0",
"semver": "^7.3.4"
},
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"typescript": "*",
"webpack": "^5.0.0"
}
},
"node_modules/ts-loader/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/ts-loader/node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/ts-loader/node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/ts-loader/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"node_modules/ts-loader/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/ts-loader/node_modules/semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/ts-loader/node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/tsconfig-paths": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz",
@@ -22355,22 +22246,6 @@
}
}
},
"@giphy/react-native-sdk": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/@giphy/react-native-sdk/-/react-native-sdk-1.7.0.tgz",
"integrity": "sha512-mCIqtPkDAstL+BDTbC1EQ4SiRkND3zd9uLKUeR4RkK2AhjRTUIheGzfxOZrdR014LVwcwKw5s9qpogoXr66mgw==",
"requires": {
"@giphy/js-types": "^4.0.3",
"type-fest": "^2.10.0"
},
"dependencies": {
"type-fest": {
"version": "2.12.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.1.tgz",
"integrity": "sha512-AiknQSEqKVGDDjtZqeKrUoTlcj7FKhupmnVUgz6KoOKtvMwRGE6hUNJ/nVear+h7fnUPO1q/htSkYKb1pyntkQ=="
}
}
},
"@hapi/bourne": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz",
@@ -22531,9 +22406,9 @@
}
},
"@jitsi/sdp-interop": {
"version": "git+https://git@github.com/jitsi/sdp-interop.git#3d49eb4aa26863a3f8d32d7581cdb4321244266b",
"integrity": "sha512-80u69QNTBArnCd1CGbTTrl/8AsZOOMF82dQhrgXBQAnrimdpomX1fMZ82ZkxyWyYvRMPG167u43Tp8y1g2DLNA==",
"from": "@jitsi/sdp-interop@https://git@github.com/jitsi/sdp-interop#3d49eb4aa26863a3f8d32d7581cdb4321244266b",
"version": "git+https://git@github.com/jitsi/sdp-interop.git#3707993863eb6c5b6d66c4a025e9dba193775bfb",
"integrity": "sha512-gqp3Pne45vlrLUyBgfTCw58zMflNripWb2Eaj0mF++U5uk2oRoo1/GBZu2C6Z42ExHfHfhFUFR3N8/Ss2LwnVw==",
"from": "@jitsi/sdp-interop@https://git@github.com/jitsi/sdp-interop#3707993863eb6c5b6d66c4a025e9dba193775bfb",
"requires": {
"lodash.clonedeep": "4.5.0",
"sdp-transform": "2.14.1"
@@ -22788,9 +22663,9 @@
},
"dependencies": {
"ansi-regex": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"ansi-styles": {
"version": "4.3.0",
@@ -23301,9 +23176,9 @@
"integrity": "sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ=="
},
"@react-native/normalize-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.0.0.tgz",
"integrity": "sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw=="
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-1.0.0.tgz",
"integrity": "sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg=="
},
"@react-native/polyfills": {
"version": "2.0.0",
@@ -23518,6 +23393,11 @@
"loader-utils": "^1.2.3"
}
},
"@tensorflow-models/blazeface": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/@tensorflow-models/blazeface/-/blazeface-0.0.7.tgz",
"integrity": "sha512-+hInPkvHJoubfiXlmNuF3SCucZvU6W1PMC25IV99NSAftJUpKvLokfF93iX8UkOFQCXkPFbnLKacGfGlbjgvMw=="
},
"@tensorflow/tfjs-backend-cpu": {
"version": "3.13.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-3.13.0.tgz",
@@ -23536,6 +23416,11 @@
"@types/emscripten": "~0.0.34"
}
},
"@tensorflow/tfjs-converter": {
"version": "3.13.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-3.13.0.tgz",
"integrity": "sha512-H2VpDTv9Ve0HBt7ttzz46DmnsPaiT0B+yJjVH3NebGZbgY9C8boBgJIsdyqfiqEWBS3WxF8h4rh58Hv5XXMgaQ=="
},
"@tensorflow/tfjs-core": {
"version": "3.13.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-3.13.0.tgz",
@@ -24217,9 +24102,9 @@
},
"dependencies": {
"ansi-regex": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"strip-ansi": {
"version": "5.2.0",
@@ -24419,9 +24304,9 @@
"integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
},
"async": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz",
"integrity": "sha1-rDYTsdqb7RtHUQu0ZRuJMeRxRsc="
},
"async-limiter": {
"version": "1.0.1",
@@ -24776,9 +24661,9 @@
}
},
"bplist-parser": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz",
"integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==",
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.0.tgz",
"integrity": "sha512-zgmaRvT6AN1JpPPV+S0a1/FAtoxSreYDccZGIqEMSvZl9DMe70mJ7MFzpxa1X+gHVdkToE2haRUHHMiW1OdejA==",
"requires": {
"big-integer": "1.6.x"
}
@@ -28899,14 +28784,15 @@
}
},
"lib-jitsi-meet": {
"version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1425.0.0+6b629a19/lib-jitsi-meet.tgz",
"integrity": "sha512-oqWGJv62jBTtGsAA1ZkBrkuzLYxAOpA/ppZ5kisy54boWbCh8/GVOfmf/OwkDrUj7iBkjlh/qRU3DUlz9l0pMw==",
"version": "git+https://git@github.com/jitsi/lib-jitsi-meet.git#c286b17f732d350b945553e973753b6701e42127",
"integrity": "sha512-hj81bry+CtmoJAtSZKubKcGsA7SLqZCRSJskICd/fsvGnutbJrkBfJ6s6SPG1lFmHUkwccWyOwqfu9pK0Qp7WQ==",
"from": "lib-jitsi-meet@https://git@github.com/jitsi/lib-jitsi-meet#c286b17f732d350b945553e973753b6701e42127",
"requires": {
"@jitsi/js-utils": "2.0.0",
"@jitsi/logger": "2.0.0",
"@jitsi/sdp-interop": "https://git@github.com/jitsi/sdp-interop#3d49eb4aa26863a3f8d32d7581cdb4321244266b",
"@jitsi/sdp-interop": "https://git@github.com/jitsi/sdp-interop#3707993863eb6c5b6d66c4a025e9dba193775bfb",
"@jitsi/sdp-simulcast": "0.4.0",
"async": "3.2.3",
"async": "0.9.0",
"base64-js": "1.3.1",
"current-executing-script": "0.1.3",
"lodash.clonedeep": "4.5.0",
@@ -29247,9 +29133,9 @@
}
},
"async": {
"version": "2.6.4",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
"integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
"requires": {
"lodash": "^4.17.14"
}
@@ -29662,9 +29548,9 @@
}
},
"minimist": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"minipass": {
"version": "3.1.6",
@@ -29727,9 +29613,9 @@
}
},
"moment": {
"version": "2.29.2",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
"integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg=="
"version": "2.29.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
},
"moment-duration-format": {
"version": "2.2.2",
@@ -29864,9 +29750,9 @@
}
},
"node-forge": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz",
"integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz",
"integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==",
"dev": true
},
"node-int64": {
@@ -30203,9 +30089,9 @@
},
"dependencies": {
"ansi-regex": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"strip-ansi": {
"version": "5.2.0",
@@ -30503,9 +30389,9 @@
}
},
"plist": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz",
"integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==",
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz",
"integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==",
"requires": {
"base64-js": "^1.5.1",
"xmlbuilder": "^9.0.7"
@@ -30535,9 +30421,9 @@
},
"dependencies": {
"async": {
"version": "2.6.4",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
"integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
"dev": true,
"requires": {
"lodash": "^4.17.14"
@@ -31344,9 +31230,9 @@
}
},
"react-devtools-core": {
"version": "4.19.1",
"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.19.1.tgz",
"integrity": "sha512-2wJiGffPWK0KggBjVwnTaAk+Z3MSxKInHmdzPTrBh1mAarexsa93Kw+WMX88+XjN+TtYgAiLe9xeTqcO5FfJTw==",
"version": "4.23.0",
"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.23.0.tgz",
"integrity": "sha512-KkzneT1LczFtebbTJlvRphIRvzuHLhI9ghfrseVv9ktBs+l2cXy8Svw5U16lzQnwU9okVEcURmGPgH79WWrlaw==",
"requires": {
"shell-quote": "^1.6.1",
"ws": "^7"
@@ -31433,16 +31319,16 @@
}
},
"react-native": {
"version": "0.67.4",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.67.4.tgz",
"integrity": "sha512-NA9d9lNJu9TViEJu2uZxWXUP+QNUilGGA5tdMbVFedNroOH1lnQ3n/FAVoGK1gqGarCgNTtheBxUpEa979Cu8w==",
"version": "0.66.4",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.66.4.tgz",
"integrity": "sha512-9vx5dlSfQlKbbDtr8+xMon6qsmSu7jvjdXWZpEKh3XVKpUidbbODv7048gwVKX8YAel1egeR7hN8vzSeI6ssTw==",
"requires": {
"@jest/create-cache-key-function": "^27.0.1",
"@react-native-community/cli": "^6.0.0",
"@react-native-community/cli-platform-android": "^6.0.0",
"@react-native-community/cli-platform-ios": "^6.0.0",
"@react-native/assets": "1.0.0",
"@react-native/normalize-color": "2.0.0",
"@react-native/normalize-color": "1.0.0",
"@react-native/polyfills": "2.0.0",
"abort-controller": "^3.0.0",
"anser": "^1.4.9",
@@ -31451,6 +31337,7 @@
"hermes-engine": "~0.9.0",
"invariant": "^2.2.4",
"jsc-android": "^250230.2.1",
"metro-babel-register": "0.66.2",
"metro-react-native-babel-transformer": "0.66.2",
"metro-runtime": "0.66.2",
"metro-source-map": "0.66.2",
@@ -31458,8 +31345,8 @@
"pretty-format": "^26.5.2",
"promise": "^8.0.3",
"prop-types": "^15.7.2",
"react-devtools-core": "4.19.1",
"react-native-codegen": "^0.0.8",
"react-devtools-core": "^4.13.0",
"react-native-codegen": "^0.0.7",
"react-refresh": "^0.4.0",
"regenerator-runtime": "^0.13.2",
"scheduler": "^0.20.2",
@@ -31489,9 +31376,9 @@
}
},
"react-native-codegen": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.8.tgz",
"integrity": "sha512-k/944+0XD+8l7zDaiKfYabyEKmAmyZgS1mj+4LcSRPyHnrjgCHKrh/Y6jM6kucQ6xU1+1uyMmF/dSkikxK8i+Q==",
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.7.tgz",
"integrity": "sha512-dwNgR8zJ3ALr480QnAmpTiqvFo+rDtq6V5oCggKhYFlRjzOmVSFn3YD41u8ltvKS5G2nQ8gCs2vReFFnRGLYng==",
"requires": {
"flow-parser": "^0.121.0",
"jscodeshift": "^0.11.0",
@@ -31504,9 +31391,9 @@
"integrity": "sha512-beZjdgbT9Y/Pg591Xy5XkKG20HffJiVad4n9bfcUF/f783A+tvOVXnqvbS58Lkaym93mi4jcDPMuW9Vc1t6rqg=="
},
"react-native-default-preference": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/react-native-default-preference/-/react-native-default-preference-1.4.4.tgz",
"integrity": "sha512-h0vtgiSKws3UmMRJykXAVM4ne1SgfoocUcoBD19ewRpQd6wqurE0HJRQGrSxcHK5LdKE7QPSIB1VX3YGIVS8Jg=="
"version": "git+https://git@github.com/kevinresol/react-native-default-preference.git#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c",
"integrity": "sha512-vmUyt63mLc+xebOOWrZxTF7o7AdWQqzy6lUn7pgjnyUd93//AOpQ6iXGijL9KpNiOv8mDKWAPZKhLY1XVuzZwA==",
"from": "react-native-default-preference@https://git@github.com/kevinresol/react-native-default-preference#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c"
},
"react-native-device-info": {
"version": "8.4.8",
@@ -31574,9 +31461,9 @@
"integrity": "sha512-Q3dFPN7whBCY7X8nvQe7TBw4F5g1PyB78KwyKDXpJENcDrBodlFtj9/c5T2ZkRwAPb+bxr39b+lq9FyT6WQWtg=="
},
"react-native-reanimated": {
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.13.4.tgz",
"integrity": "sha512-sFbZFh0WanKTa0Fz7GXCZUjWpk/u04ytprcIs4Kb+ijfQHChXva3m3yQZfvbrhRbABJNHrdeuyDgJxDM2mcBgw==",
"version": "1.13.3",
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.13.3.tgz",
"integrity": "sha512-i714H24dv6ncpFO7/SZ0PfAMbvjgVbF8Ow2NPtowoZAz8osS54DmTMrkgJ9Za+uEku/s0AEaxqiXG2Xgntvv2g==",
"requires": {
"fbjs": "^1.0.0"
}
@@ -31881,9 +31768,9 @@
}
},
"react-native-webrtc": {
"version": "1.100.0",
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.100.0.tgz",
"integrity": "sha512-sBLl8Ihj3xfYn0NZJdDxelB/dZ422FWg/kcLdSw6Wk4eM3MeNW3iFwVsqg2dLzeDnuoQ06i7hOdtP7pGAiKsug==",
"version": "1.94.2",
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.94.2.tgz",
"integrity": "sha512-8wf7CDLYmrxxvta3XxZbmtNrxUblE70fDpoxjYKWfEa48Y4FnFw7MF61g8qYo+V0adoOUNc3j4fIgVnAMghJ9Q==",
"requires": {
"base64-js": "1.5.1",
"event-target-shim": "6.0.2",
@@ -32875,13 +32762,13 @@
}
},
"simple-plist": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz",
"integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==",
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.0.tgz",
"integrity": "sha512-uYWpeGFtZtVt2NhG4AHgpwx323zxD85x42heMJBan1qAiqqozIlaGrwrEt6kRjXWRWIXsuV1VLCvVmZan2B5dg==",
"requires": {
"bplist-creator": "0.1.0",
"bplist-parser": "0.3.1",
"plist": "^3.0.5"
"bplist-parser": "0.3.0",
"plist": "^3.0.4"
}
},
"simple-swizzle": {
@@ -33944,78 +33831,6 @@
"resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
"integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
},
"ts-loader": {
"version": "9.2.6",
"resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz",
"integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==",
"dev": true,
"requires": {
"chalk": "^4.1.0",
"enhanced-resolve": "^5.0.0",
"micromatch": "^4.0.0",
"semver": "^7.3.4"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"tsconfig-paths": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz",

View File

@@ -35,7 +35,6 @@
"@atlaskit/tooltip": "17.1.2",
"@giphy/js-fetch-api": "4.1.2",
"@giphy/react-components": "5.6.0",
"@giphy/react-native-sdk": "1.7.0",
"@hapi/bourne": "2.0.0",
"@jitsi/js-utils": "2.0.0",
"@jitsi/logger": "2.0.0",
@@ -56,7 +55,9 @@
"@react-navigation/native": "6.0.6",
"@react-navigation/stack": "6.0.11",
"@svgr/webpack": "4.3.2",
"@tensorflow-models/blazeface": "0.0.7",
"@tensorflow/tfjs-backend-wasm": "3.13.0",
"@tensorflow/tfjs-converter": "3.13.0",
"@tensorflow/tfjs-core": "3.13.0",
"@vladmandic/face-api": "1.6.4",
"@xmldom/xmldom": "0.7.5",
@@ -77,10 +78,10 @@
"jquery-i18next": "1.2.1",
"js-md5": "0.6.1",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1425.0.0+6b629a19/lib-jitsi-meet.tgz",
"lib-jitsi-meet": "https://git@github.com/jitsi/lib-jitsi-meet#c286b17f732d350b945553e973753b6701e42127",
"libflacjs": "https://git@github.com/mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
"lodash": "4.17.21",
"moment": "2.29.2",
"moment": "2.29.1",
"moment-duration-format": "2.2.2",
"optional-require": "1.0.3",
"promise.allsettled": "1.0.4",
@@ -91,12 +92,12 @@
"react-focus-lock": "2.5.1",
"react-i18next": "10.11.4",
"react-linkify": "1.0.0-alpha",
"react-native": "0.67.4",
"react-native": "0.66.4",
"react-native-background-timer": "2.4.1",
"react-native-calendar-events": "2.2.0",
"react-native-callstats": "3.73.7",
"react-native-collapsible": "1.6.0",
"react-native-default-preference": "1.4.4",
"react-native-default-preference": "https://git@github.com/kevinresol/react-native-default-preference#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c",
"react-native-device-info": "8.4.8",
"react-native-dialog": "9.2.1",
"react-native-gesture-handler": "2.1.0",
@@ -106,7 +107,7 @@
"react-native-pager-view": "5.4.9",
"react-native-paper": "4.11.1",
"react-native-performance": "2.1.0",
"react-native-reanimated": "1.13.4",
"react-native-reanimated": "1.13.3",
"react-native-safe-area-context": "3.3.2",
"react-native-screens": "3.10.1",
"react-native-sound": "0.11.1",
@@ -117,7 +118,7 @@
"react-native-url-polyfill": "1.3.0",
"react-native-video": "https://git@github.com/jitsi/react-native-video#4f6dad990d17ce42894df993780b5386a9c11b85",
"react-native-watch-connectivity": "1.0.4",
"react-native-webrtc": "1.100.0",
"react-native-webrtc": "1.94.2",
"react-native-webview": "11.15.1",
"react-native-youtube-iframe": "2.2.1",
"react-redux": "7.1.0",
@@ -166,7 +167,6 @@
"string-replace-loader": "3.0.3",
"style-loader": "0.19.0",
"traverse": "0.6.6",
"ts-loader": "9.2.6",
"typescript": "4.3.5",
"unorm": "1.6.0",
"webpack": "5.57.1",

View File

@@ -0,0 +1,141 @@
diff --git a/node_modules/react-native/React/CoreModules/RCTTiming.mm b/node_modules/react-native/React/CoreModules/RCTTiming.mm
index 70f0543..d43a4be 100644
--- a/node_modules/react-native/React/CoreModules/RCTTiming.mm
+++ b/node_modules/react-native/React/CoreModules/RCTTiming.mm
@@ -146,6 +146,11 @@ - (void)setup
name:name
object:nil];
}
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(proximityChanged)
+ name:UIDeviceProximityStateDidChangeNotification
+ object:nil];
}
- (void)dealloc
@@ -182,6 +187,16 @@ - (void)appDidMoveToForeground
[self startTimers];
}
+- (void)proximityChanged
+{
+ BOOL isClose = [UIDevice currentDevice].proximityState;
+ if (isClose) {
+ [self appDidMoveToBackground];
+ } else {
+ [self appDidMoveToForeground];
+ }
+}
+
- (void)stopTimers
{
if (_inBackground) {
diff --git a/node_modules/react-native/scripts/react_native_pods.rb b/node_modules/react-native/scripts/react_native_pods.rb
index df31139..061ded9 100644
--- a/node_modules/react-native/scripts/react_native_pods.rb
+++ b/node_modules/react-native/scripts/react_native_pods.rb
@@ -125,20 +125,49 @@ def exclude_architectures(installer)
.uniq{ |p| p.path }
.push(installer.pods_project)
- arm_value = `/usr/sbin/sysctl -n hw.optional.arm64 2>&1`.to_i
-
# Hermes does not support `i386` architecture
excluded_archs_default = has_pod(installer, 'hermes-engine') ? "i386" : ""
projects.each do |project|
project.build_configurations.each do |config|
- if arm_value == 1 then
- config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = excluded_archs_default
- else
- config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64 " + excluded_archs_default
+ config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = excluded_archs_default
+ end
+
+ project.save()
+ end
+end
+
+def fix_library_search_paths(installer)
+ def fix_config(config)
+ lib_search_paths = config.build_settings["LIBRARY_SEARCH_PATHS"]
+ if lib_search_paths
+ if lib_search_paths.include?("$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)") || lib_search_paths.include?("\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"")
+ # $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) causes problem with Xcode 12.5 + arm64 (Apple M1)
+ # since the libraries there are only built for x86_64 and i386.
+ lib_search_paths.delete("$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)")
+ lib_search_paths.delete("\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"")
+ if !(lib_search_paths.include?("$(SDKROOT)/usr/lib/swift") || lib_search_paths.include?("\"$(SDKROOT)/usr/lib/swift\""))
+ # however, $(SDKROOT)/usr/lib/swift is required, at least if user is not running CocoaPods 1.11
+ lib_search_paths.insert(0, "$(SDKROOT)/usr/lib/swift")
+ end
end
end
+ end
+
+ projects = installer.aggregate_targets
+ .map{ |t| t.user_project }
+ .uniq{ |p| p.path }
+ .push(installer.pods_project)
+ projects.each do |project|
+ project.build_configurations.each do |config|
+ fix_config(config)
+ end
+ project.native_targets.each do |target|
+ target.build_configurations.each do |config|
+ fix_config(config)
+ end
+ end
project.save()
end
end
@@ -149,6 +178,7 @@ def react_native_post_install(installer)
end
exclude_architectures(installer)
+ fix_library_search_paths(installer)
end
def use_react_native_codegen!(spec, options={})
@@ -218,36 +248,8 @@ end
# See https://github.com/facebook/react-native/issues/31480#issuecomment-902912841 for more context.
# Actual fix was authored by https://github.com/mikehardy.
# New app template will call this for now until the underlying issue is resolved.
+#
+# It's not needed anymore and will be removed later
def __apply_Xcode_12_5_M1_post_install_workaround(installer)
- # Apple Silicon builds require a library path tweak for Swift library discovery to resolve Swift-related "symbol not found".
- # Note: this was fixed via https://github.com/facebook/react-native/commit/eb938863063f5535735af2be4e706f70647e5b90
- # Keeping this logic here but commented out for future reference.
- #
- # installer.aggregate_targets.each do |aggregate_target|
- # aggregate_target.user_project.native_targets.each do |target|
- # target.build_configurations.each do |config|
- # config.build_settings['LIBRARY_SEARCH_PATHS'] = ['$(SDKROOT)/usr/lib/swift', '$(inherited)']
- # end
- # end
- # aggregate_target.user_project.save
- # end
-
- # Flipper podspecs are still targeting an older iOS deployment target, and may cause an error like:
- # "error: thread-local storage is not supported for the current target"
- # The most reliable known workaround is to bump iOS deployment target to match react-native (iOS 11 now).
- installer.pods_project.targets.each do |target|
- target.build_configurations.each do |config|
- # ensure IPHONEOS_DEPLOYMENT_TARGET is at least 11.0
- should_upgrade = config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].split('.')[0].to_i < 11
- if should_upgrade
- config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
- end
- end
- end
-
- # But... doing so caused another issue in Flipper:
- # "Time.h:52:17: error: typedef redefinition with different types"
- # We need to make a patch to RCT-Folly - remove the `__IPHONE_OS_VERSION_MIN_REQUIRED` check.
- # See https://github.com/facebook/flipper/issues/834 for more details.
- `sed -i -e $'s/ && (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0)//' Pods/RCT-Folly/folly/portability/Time.h`
+ puts "__apply_Xcode_12_5_M1_post_install_workaround() is not needed anymore"
end

View File

@@ -1,50 +0,0 @@
diff --git a/node_modules/react-native/React/CoreModules/RCTTiming.mm b/node_modules/react-native/React/CoreModules/RCTTiming.mm
index 70f0543..d003662 100644
--- a/node_modules/react-native/React/CoreModules/RCTTiming.mm
+++ b/node_modules/react-native/React/CoreModules/RCTTiming.mm
@@ -127,7 +127,15 @@ - (void)setup
{
_paused = YES;
_timers = [NSMutableDictionary new];
- _inBackground = NO;
+
+ __block BOOL initialInBackground;
+ dispatch_sync(dispatch_get_main_queue(), ^{
+ initialInBackground
+ = [UIApplication sharedApplication].applicationState == UIApplicationStateBackground
+ || [UIDevice currentDevice].proximityState;
+ });
+
+ _inBackground = initialInBackground;
for (NSString *name in @[
UIApplicationWillResignActiveNotification,
@@ -146,6 +154,11 @@ - (void)setup
name:name
object:nil];
}
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(proximityChanged)
+ name:UIDeviceProximityStateDidChangeNotification
+ object:nil];
}
- (void)dealloc
@@ -182,6 +195,16 @@ - (void)appDidMoveToForeground
[self startTimers];
}
+- (void)proximityChanged
+{
+ BOOL isClose = [UIDevice currentDevice].proximityState;
+ if (isClose) {
+ [self appDidMoveToBackground];
+ } else {
+ [self appDidMoveToForeground];
+ }
+}
+
- (void)stopTimers
{
if (_inBackground) {

View File

@@ -1,40 +1,5 @@
diff --git a/node_modules/react-native-dialog/lib/Button.js b/node_modules/react-native-dialog/lib/Button.js
index 19eeb22..b8a66f4 100644
--- a/node_modules/react-native-dialog/lib/Button.js
+++ b/node_modules/react-native-dialog/lib/Button.js
@@ -50,7 +50,7 @@ const buildStyles = (isDark) => StyleSheet.create({
backgroundColor: "transparent",
},
android: {
- color: PlatformColor(`@android:color/${isDark ? "link_text_dark" : "link_text_dark_light"}`),
+ color: isDark ? '#BFC7C7C7' : '#BF727272',
textAlign: "center",
backgroundColor: "transparent",
padding: 8,
diff --git a/node_modules/react-native-dialog/lib/CodeInput.js b/node_modules/react-native-dialog/lib/CodeInput.js
index eceae56..cc4339d 100644
--- a/node_modules/react-native-dialog/lib/CodeInput.js
+++ b/node_modules/react-native-dialog/lib/CodeInput.js
@@ -97,7 +97,7 @@ const buildStyles = (isDark) => StyleSheet.create({
color: PlatformColor("label"),
},
android: {
- color: PlatformColor(`@android:color/${isDark ? "primary_text_dark" : "primary_text_light"}`),
+ color: isDark ? '#FAFAFA' : '#212121',
fontSize: 20,
},
default: {},
@@ -107,7 +107,7 @@ const buildStyles = (isDark) => StyleSheet.create({
color: PlatformColor("label"),
},
android: {
- color: PlatformColor(`@android:color/${isDark ? "primary_text_dark" : "primary_text_light"}`),
+ color: isDark ? '#FAFAFA' : '#212121',
fontSize: 14,
},
default: {},
diff --git a/node_modules/react-native-dialog/lib/Container.js b/node_modules/react-native-dialog/lib/Container.js
index 69e3764..d7569fb 100644
index 69e3764..109126f 100644
--- a/node_modules/react-native-dialog/lib/Container.js
+++ b/node_modules/react-native-dialog/lib/Container.js
@@ -82,7 +82,7 @@ DialogContainer.propTypes = {
@@ -51,68 +16,7 @@ index 69e3764..d7569fb 100644
},
android: {
- backgroundColor: PlatformColor("?attr/colorBackgroundFloating"),
+ backgroundColor: isDark ? '#212121' : '#FFFFFF',
+ backgroundColor: PlatformColor(`@android:color/${isDark ? "background_dark" : "background_light"}`),
flexDirection: "column",
borderRadius: 3,
padding: 16,
diff --git a/node_modules/react-native-dialog/lib/Description.js b/node_modules/react-native-dialog/lib/Description.js
index 2da9ed3..248ac2f 100644
--- a/node_modules/react-native-dialog/lib/Description.js
+++ b/node_modules/react-native-dialog/lib/Description.js
@@ -28,7 +28,7 @@ const buildStyles = (isDark) => StyleSheet.create({
marginTop: 4,
},
android: {
- color: PlatformColor(`@android:color/${isDark ? "secondary_text_dark" : "secondary_text_light"}`),
+ color: isDark ? '#C7C7C7' : '#727272',
fontSize: 16,
marginTop: 10,
},
diff --git a/node_modules/react-native-dialog/lib/Input.js b/node_modules/react-native-dialog/lib/Input.js
index b33a1a0..063d7f8 100644
--- a/node_modules/react-native-dialog/lib/Input.js
+++ b/node_modules/react-native-dialog/lib/Input.js
@@ -48,7 +48,7 @@ const buildStyles = (isDark) => StyleSheet.create({
color: PlatformColor("label"),
},
android: {
- color: PlatformColor(`@android:color/${isDark ? "primary_text_dark" : "primary_text_light"}`),
+ color: isDark ? '#FAFAFA' : '#212121',
fontSize: 14,
},
default: {},
@@ -58,7 +58,7 @@ const buildStyles = (isDark) => StyleSheet.create({
color: PlatformColor("label"),
},
android: {
- color: PlatformColor(`@android:color/${isDark ? "primary_text_dark" : "primary_text_light"}`),
+ color: isDark ? '#FAFAFA' : '#212121',
marginLeft: -4,
paddingLeft: 4,
},
diff --git a/node_modules/react-native-dialog/lib/Switch.js b/node_modules/react-native-dialog/lib/Switch.js
index 26a05ca..05114fa 100644
--- a/node_modules/react-native-dialog/lib/Switch.js
+++ b/node_modules/react-native-dialog/lib/Switch.js
@@ -52,7 +52,7 @@ const buildStyles = (isDark) => StyleSheet.create({
flex: 1,
paddingRight: 8,
fontSize: 16,
- color: PlatformColor(`@android:color/${isDark ? "primary_text_dark" : "primary_text_light"}`),
+ color: isDark ? '#FAFAFA' : '#212121',
},
default: {},
}),
diff --git a/node_modules/react-native-dialog/lib/Title.js b/node_modules/react-native-dialog/lib/Title.js
index 1c6fd87..b5511cc 100644
--- a/node_modules/react-native-dialog/lib/Title.js
+++ b/node_modules/react-native-dialog/lib/Title.js
@@ -28,7 +28,7 @@ const buildStyles = (isDark) => StyleSheet.create({
fontWeight: "600",
},
android: {
- color: PlatformColor(`@android:color/${isDark ? "primary_text_dark" : "primary_text_light"}`),
+ color: isDark ? '#FAFAFA' : '#212121',
fontWeight: "500",
fontSize: 18,
},

View File

@@ -1,14 +1,10 @@
// @flow
import React, { Component } from 'react';
// We need to reference these files directly to avoid loading things that are not available
// in this environment (e.g. JitsiMeetJS or interfaceConfig)
import { IconMicrophoneEmpty, IconMicrophoneEmptySlash } from '../base/icons';
import AbstractAudioMuteButton from '../base/toolbox/components/AbstractAudioMuteButton';
import type { Props } from '../base/toolbox/components/AbstractButton';
import ToolbarButton from './ToolbarButton';
const { api } = window.alwaysOnTop;
/**
@@ -30,9 +26,9 @@ type State = {
/**
* Stateless "mute/unmute audio" button for the Always-on-Top windows.
*/
export default class AudioMuteButton extends Component<Props, State> {
icon = IconMicrophoneEmpty;
toggledIcon = IconMicrophoneEmptySlash;
export default class AudioMuteButton
extends AbstractAudioMuteButton<Props, State> {
accessibilityLabel = 'Audio mute';
/**
@@ -53,7 +49,6 @@ export default class AudioMuteButton extends Component<Props, State> {
this._audioAvailabilityListener
= this._audioAvailabilityListener.bind(this);
this._audioMutedListener = this._audioMutedListener.bind(this);
this._onClick = this._onClick.bind(this);
}
/**
@@ -68,12 +63,11 @@ export default class AudioMuteButton extends Component<Props, State> {
Promise.all([
api.isAudioAvailable(),
api.isAudioMuted(),
api.isAudioDisabled?.() || Promise.resolve(false)
api.isAudioMuted()
])
.then(([ audioAvailable, audioMuted, audioDisabled ]) =>
.then(([ audioAvailable, audioMuted ]) =>
this.setState({
audioAvailable: audioAvailable && !audioDisabled,
audioAvailable,
audioMuted
}))
.catch(console.error);
@@ -151,33 +145,4 @@ export default class AudioMuteButton extends Component<Props, State> {
_setAudioMuted(audioMuted: boolean) { // eslint-disable-line no-unused-vars
this.state.audioAvailable && api.executeCommand('toggleAudio');
}
_onClick: () => {};
/**
* Handles clicking / pressing the button, and toggles the audio mute state
* accordingly.
*
* @returns {void}
*/
_onClick() {
this._setAudioMuted(!this._isAudioMuted());
}
/**
* Implements React's {@link Component#render()}.
*
* @inheritdoc
* @returns {ReactElement}
*/
render() {
const toggled = this._isAudioMuted();
return (<ToolbarButton
accessibilityLabel = { this.accessibilityLabel }
disabled = { this._isDisabled() }
icon = { toggled ? this.toggledIcon : this.icon }
onClick = { this._onClick }
toggled = { toggled } />);
}
}

View File

@@ -1,59 +1,27 @@
// @flow
import React, { Component } from 'react';
// We need to reference these files directly to avoid loading things that are not available
// in this environment (e.g. JitsiMeetJS or interfaceConfig)
import { IconHangup } from '../base/icons';
import type { Props } from '../base/toolbox/components/AbstractButton';
import ToolbarButton from './ToolbarButton';
import AbstractHangupButton from '../base/toolbox/components/AbstractHangupButton';
const { api } = window.alwaysOnTop;
/**
* Stateless hangup button for the Always-on-Top windows.
*/
export default class HangupButton extends Component<Props, *> {
export default class HangupButton extends AbstractHangupButton<Props, *> {
accessibilityLabel = 'Hangup';
icon = IconHangup;
/**
* Initializes a new {@code HangupButton} instance.
*
* @param {Props} props - The React {@code Component} props to initialize
* the new {@code HangupButton} instance with.
*/
constructor(props: Props) {
super(props);
// Bind event handlers so they are only bound once per instance.
this._onClick = this._onClick.bind(this);
}
_onClick: () => {};
/**
* Handles clicking / pressing the button, and disconnects the conference.
* Helper function to perform the actual hangup action.
*
* @override
* @protected
* @returns {void}
*/
_onClick() {
_doHangup() {
api.executeCommand('hangup');
}
/**
* Implements React's {@link Component#render()}.
*
* @inheritdoc
* @returns {ReactElement}
*/
render() {
return (<ToolbarButton
accessibilityLabel = { this.accessibilityLabel }
customClass = 'hangup-button'
icon = { this.icon }
onClick = { this._onClick } />);
}
}

View File

@@ -1,69 +0,0 @@
import React, { useCallback } from 'react';
import { Icon } from '../base/icons';
type Props = {
/**
* Accessibility label for button.
*/
accessibilityLabel: string,
/**
* An extra class name to be added at the end of the element's class name
* in order to enable custom styling.
*/
customClass?: string,
/**
* Whether or not the button is disabled.
*/
disabled?: boolean,
/**
* Click handler.
*/
onClick: Function,
/**
* Button icon.
*/
icon: Object,
/**
* Whether or not the button is toggled.
*/
toggled?: boolean
}
const ToolbarButton = ({
accessibilityLabel,
customClass,
disabled = false,
onClick,
icon,
toggled = false
}: Props) => {
const onKeyPress = useCallback(event => {
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
onClick();
}
}, [ onClick ]);
return (<div
aria-disabled = { disabled }
aria-label = { accessibilityLabel }
aria-pressed = { toggled }
className = { `toolbox-button ${disabled ? ' disabled' : ''}` }
onClick = { disabled ? undefined : onClick }
onKeyPress = { disabled ? undefined : onKeyPress }
role = 'button'
tabIndex = { 0 }>
<div className = { `toolbox-icon ${disabled ? 'disabled' : ''} ${customClass ?? ''}` }>
<Icon src = { icon } />
</div>
</div>);
};
export default ToolbarButton;

View File

@@ -1,12 +1,9 @@
// @flow
import React, { Component } from 'react';
// We need to reference these files directly to avoid loading things that are not available
// in this environment (e.g. JitsiMeetJS or interfaceConfig)
import { IconCameraEmpty, IconCameraEmptyDisabled } from '../base/icons';
import type { Props } from '../base/toolbox/components/AbstractButton';
import ToolbarButton from './ToolbarButton';
import AbstractVideoMuteButton from '../base/toolbox/components/AbstractVideoMuteButton';
const { api } = window.alwaysOnTop;
@@ -29,10 +26,9 @@ type State = {
/**
* Stateless "mute/unmute video" button for the Always-on-Top windows.
*/
export default class VideoMuteButton extends Component<Props, State> {
export default class VideoMuteButton
extends AbstractVideoMuteButton<Props, State> {
icon = IconCameraEmpty;
toggledIcon = IconCameraEmptyDisabled;
accessibilityLabel = 'Video mute';
/**
@@ -53,7 +49,6 @@ export default class VideoMuteButton extends Component<Props, State> {
this._videoAvailabilityListener
= this._videoAvailabilityListener.bind(this);
this._videoMutedListener = this._videoMutedListener.bind(this);
this._onClick = this._onClick.bind(this);
}
/**
@@ -150,34 +145,4 @@ export default class VideoMuteButton extends Component<Props, State> {
_videoMutedListener({ muted }) {
this.setState({ videoMuted: muted });
}
_onClick: () => {};
/**
* Handles clicking / pressing the button, and toggles the video mute state
* accordingly.
*
* @protected
* @returns {void}
*/
_onClick() {
this._setVideoMuted(!this._isVideoMuted());
}
/**
* Implements React's {@link Component#render()}.
*
* @inheritdoc
* @returns {ReactElement}
*/
render() {
const toggled = this._isVideoMuted();
return (<ToolbarButton
accessibilityLabel = { this.accessibilityLabel }
disabled = { this._isDisabled() }
icon = { toggled ? this.toggledIcon : this.icon }
onClick = { this._onClick }
toggled = { toggled } />);
}
}

View File

@@ -8,9 +8,9 @@ import {
} from '../base/environment/utils';
import JitsiMeetJS, {
analytics,
browser
browser,
isAnalyticsEnabled
} from '../base/lib-jitsi-meet';
import { isAnalyticsEnabled } from '../base/lib-jitsi-meet/functions';
import { getJitsiMeetGlobalNS, loadScript, parseURIString } from '../base/util';
import { AmplitudeHandler, MatomoHandler } from './handlers';

View File

@@ -1,88 +0,0 @@
// @flow
import type { Dispatch } from 'redux';
import { getLocationContextRoot } from '../base/util';
import { addTrackStateToURL } from './functions.any';
/**
* Redirects to another page generated by replacing the path in the original URL
* with the given path.
*
* @param {(string)} pathname - The path to navigate to.
* @returns {Function}
*/
export function redirectWithStoredParams(pathname: string) {
return (dispatch: Dispatch<any>, getState: Function) => {
const { locationURL } = getState()['features/base/connection'];
const newLocationURL = new URL(locationURL.href);
newLocationURL.pathname = pathname;
window.location.assign(newLocationURL.toString());
};
}
/**
* Assigns a specific pathname to window.location.pathname taking into account
* the context root of the Web app.
*
* @param {string} pathname - The pathname to assign to
* window.location.pathname. If the specified pathname is relative, the context
* root of the Web app will be prepended to the specified pathname before
* assigning it to window.location.pathname.
* @param {string} hashParam - Optional hash param to assign to
* window.location.hash.
* @returns {Function}
*/
export function redirectToStaticPage(pathname: string, hashParam: ?string) {
return () => {
const windowLocation = window.location;
let newPathname = pathname;
if (!newPathname.startsWith('/')) {
// A pathname equal to ./ specifies the current directory. It will be
// fine but pointless to include it because contextRoot is the current
// directory.
newPathname.startsWith('./')
&& (newPathname = newPathname.substring(2));
newPathname = getLocationContextRoot(windowLocation) + newPathname;
}
if (hashParam) {
windowLocation.hash = hashParam;
}
windowLocation.pathname = newPathname;
};
}
/**
* Reloads the page by restoring the original URL.
*
* @returns {Function}
*/
export function reloadWithStoredParams() {
return (dispatch: Dispatch<any>, getState: Function) => {
const state = getState();
const { locationURL } = state['features/base/connection'];
// Preserve the local tracks muted states.
const newURL = addTrackStateToURL(locationURL, state);
const windowLocation = window.location;
const oldSearchString = windowLocation.search;
windowLocation.replace(newURL.toString());
if (newURL.search === oldSearchString) {
// NOTE: Assuming that only the hash or search part of the URL will
// be changed!
// location.replace will not trigger redirect/reload when
// only the hash params are changed. That's why we need to call
// reload in addition to replace.
windowLocation.reload();
}
};
}

View File

@@ -2,7 +2,7 @@
import type { Dispatch } from 'redux';
import { API_ID } from '../../../modules/API';
import { API_ID } from '../../../modules/API/constants';
import { setRoom } from '../base/conference';
import {
configWillLoad,
@@ -12,33 +12,30 @@ import {
setConfig,
storeConfig
} from '../base/config';
import { setLocationURL } from '../base/connection';
import { loadConfig } from '../base/lib-jitsi-meet/functions.web';
import { connect, disconnect, setLocationURL } from '../base/connection';
import { loadConfig } from '../base/lib-jitsi-meet';
import { MEDIA_TYPE } from '../base/media';
import { toState } from '../base/redux';
import { createDesiredLocalTracks, isLocalCameraTrackMuted, isLocalTrackMuted } from '../base/tracks';
import {
addHashParamsToURL,
getBackendSafeRoomName,
parseURIString
getLocationContextRoot,
parseURIString,
toURLString
} from '../base/util';
import { isVpaasMeeting } from '../jaas/functions';
import {
clearNotifications,
NOTIFICATION_TIMEOUT_TYPE,
showNotification
} from '../notifications';
import { NOTIFICATION_TIMEOUT_TYPE, clearNotifications, showNotification } from '../notifications';
import { setFatalError } from '../overlay';
import {
redirectToStaticPage,
redirectWithStoredParams,
reloadWithStoredParams
} from './actions.any';
import { getDefaultURL, getName } from './functions';
getDefaultURL,
getName
} from './functions';
import logger from './logger';
declare var interfaceConfig: Object;
export * from './actions.any';
/**
* Triggers an in-app navigation to a specific route. Allows navigation to be
@@ -77,6 +74,12 @@ export function appNavigate(uri: ?string) {
const { contextRoot, host, room } = location;
const locationURL = new URL(location.toString());
// Disconnect from any current conference.
// FIXME: unify with web.
if (navigator.product === 'ReactNative') {
dispatch(disconnect());
}
// There are notifications now that gets displayed after we technically left
// the conference, but we're still on the conference screen.
dispatch(clearNotifications());
@@ -132,6 +135,137 @@ export function appNavigate(uri: ?string) {
dispatch(setLocationURL(locationURL));
dispatch(setConfig(config));
dispatch(setRoom(room));
// FIXME: unify with web, currently the connection and track creation happens in conference.js.
if (room && navigator.product === 'ReactNative') {
dispatch(createDesiredLocalTracks());
dispatch(connect());
}
};
}
/**
* Redirects to another page generated by replacing the path in the original URL
* with the given path.
*
* @param {(string)} pathname - The path to navigate to.
* @returns {Function}
*/
export function redirectWithStoredParams(pathname: string) {
return (dispatch: Dispatch<any>, getState: Function) => {
const { locationURL } = getState()['features/base/connection'];
const newLocationURL = new URL(locationURL.href);
newLocationURL.pathname = pathname;
window.location.assign(newLocationURL.toString());
};
}
/**
* Assigns a specific pathname to window.location.pathname taking into account
* the context root of the Web app.
*
* @param {string} pathname - The pathname to assign to
* window.location.pathname. If the specified pathname is relative, the context
* root of the Web app will be prepended to the specified pathname before
* assigning it to window.location.pathname.
* @param {string} hashParam - Optional hash param to assign to
* window.location.hash.
* @returns {Function}
*/
export function redirectToStaticPage(pathname: string, hashParam: ?string) {
return () => {
const windowLocation = window.location;
let newPathname = pathname;
if (!newPathname.startsWith('/')) {
// A pathname equal to ./ specifies the current directory. It will be
// fine but pointless to include it because contextRoot is the current
// directory.
newPathname.startsWith('./')
&& (newPathname = newPathname.substring(2));
newPathname = getLocationContextRoot(windowLocation) + newPathname;
}
if (hashParam) {
windowLocation.hash = hashParam;
}
windowLocation.pathname = newPathname;
};
}
/**
* Reloads the page.
*
* @protected
* @returns {Function}
*/
export function reloadNow() {
return (dispatch: Dispatch<Function>, getState: Function) => {
dispatch(setFatalError(undefined));
const state = getState();
const { locationURL } = state['features/base/connection'];
// Preserve the local tracks muted state after the reload.
const newURL = addTrackStateToURL(locationURL, state);
logger.info(`Reloading the conference using URL: ${locationURL}`);
if (navigator.product === 'ReactNative') {
dispatch(appNavigate(toURLString(newURL)));
} else {
dispatch(reloadWithStoredParams());
}
};
}
/**
* Adds the current track state to the passed URL.
*
* @param {URL} url - The URL that will be modified.
* @param {Function|Object} stateful - The redux store or {@code getState} function.
* @returns {URL} - Returns the modified URL.
*/
function addTrackStateToURL(url, stateful) {
const state = toState(stateful);
const tracks = state['features/base/tracks'];
const isVideoMuted = isLocalCameraTrackMuted(tracks);
const isAudioMuted = isLocalTrackMuted(tracks, MEDIA_TYPE.AUDIO);
return addHashParamsToURL(new URL(url), { // use new URL object in order to not pollute the passed parameter.
'config.startWithAudioMuted': isAudioMuted,
'config.startWithVideoMuted': isVideoMuted
});
}
/**
* Reloads the page by restoring the original URL.
*
* @returns {Function}
*/
export function reloadWithStoredParams() {
return (dispatch: Dispatch<any>, getState: Function) => {
const state = getState();
const { locationURL } = state['features/base/connection'];
// Preserve the local tracks muted states.
const newURL = addTrackStateToURL(locationURL, state);
const windowLocation = window.location;
const oldSearchString = windowLocation.search;
windowLocation.replace(newURL.toString());
if (newURL.search === oldSearchString) {
// NOTE: Assuming that only the hash or search part of the URL will
// be changed!
// location.replace will not trigger redirect/reload when
// only the hash params are changed. That's why we need to call
// reload in addition to replace.
windowLocation.reload();
}
};
}
@@ -207,22 +341,3 @@ export function maybeRedirectToWelcomePage(options: Object = {}) {
}
};
}
/**
* Reloads the page.
*
* @protected
* @returns {Function}
*/
export function reloadNow() {
return (dispatch: Dispatch<Function>, getState: Function) => {
dispatch(setFatalError(undefined));
const state = getState();
const { locationURL } = state['features/base/connection'];
logger.info(`Reloading the conference using URL: ${locationURL}`);
dispatch(reloadWithStoredParams());
};
}

View File

@@ -1,156 +0,0 @@
// @flow
import type { Dispatch } from 'redux';
import { setRoom } from '../base/conference';
import {
configWillLoad,
createFakeConfig,
loadConfigError,
restoreConfig,
setConfig,
storeConfig
} from '../base/config';
import { connect, disconnect, setLocationURL } from '../base/connection';
import { loadConfig } from '../base/lib-jitsi-meet/functions.native';
import { createDesiredLocalTracks } from '../base/tracks';
import {
getBackendSafeRoomName,
parseURIString,
toURLString
} from '../base/util';
import { navigateRoot } from '../mobile/navigation/rootNavigationContainerRef';
import { screen } from '../mobile/navigation/routes';
import { setFatalError } from '../overlay';
import { getDefaultURL } from './functions';
import { addTrackStateToURL } from './functions.native';
import logger from './logger';
export * from './actions.any';
/**
* Triggers an in-app navigation to a specific route. Allows navigation to be
* abstracted between the mobile/React Native and Web/React applications.
*
* @param {string|undefined} uri - The URI to which to navigate. It may be a
* full URL with an HTTP(S) scheme, a full or partial URI with the app-specific
* scheme, or a mere room name.
* @returns {Function}
*/
export function appNavigate(uri: ?string) {
logger.info(`appNavigate to ${uri}`);
return async (dispatch: Dispatch<any>, getState: Function) => {
let location = parseURIString(uri);
// If the specified location (URI) does not identify a host, use the app's
// default.
if (!location || !location.host) {
const defaultLocation = parseURIString(getDefaultURL(getState));
if (location) {
location.host = defaultLocation.host;
// FIXME Turn location's host, hostname, and port properties into
// setters in order to reduce the risks of inconsistent state.
location.hostname = defaultLocation.hostname;
location.pathname
= defaultLocation.pathname + location.pathname.substr(1);
location.port = defaultLocation.port;
location.protocol = defaultLocation.protocol;
} else {
location = defaultLocation;
}
}
location.protocol || (location.protocol = 'https:');
const { contextRoot, host, room } = location;
const locationURL = new URL(location.toString());
if (room) {
navigateRoot(screen.connecting);
}
dispatch(disconnect());
dispatch(configWillLoad(locationURL, room));
let protocol = location.protocol.toLowerCase();
// The React Native app supports an app-specific scheme which is sure to not
// be supported by fetch.
protocol !== 'http:' && protocol !== 'https:' && (protocol = 'https:');
const baseURL = `${protocol}//${host}${contextRoot || '/'}`;
let url = `${baseURL}config.js`;
// XXX In order to support multiple shards, tell the room to the deployment.
room && (url += `?room=${getBackendSafeRoomName(room)}`);
let config;
// Avoid (re)loading the config when there is no room.
if (!room) {
config = restoreConfig(baseURL);
}
if (!config) {
try {
config = await loadConfig(url);
dispatch(storeConfig(baseURL, config));
} catch (error) {
config = restoreConfig(baseURL);
if (!config) {
if (room) {
dispatch(loadConfigError(error, locationURL));
return;
}
// If there is no room (we are on the welcome page), don't fail, just create a fake one.
logger.warn('Failed to load config but there is no room, applying a fake one');
config = createFakeConfig(baseURL);
}
}
}
if (getState()['features/base/config'].locationURL !== locationURL) {
dispatch(loadConfigError(new Error('Config no longer needed!'), locationURL));
return;
}
dispatch(setLocationURL(locationURL));
dispatch(setConfig(config));
dispatch(setRoom(room));
if (room) {
dispatch(createDesiredLocalTracks());
dispatch(connect());
}
};
}
/**
* Reloads the page.
*
* @protected
* @returns {Function}
*/
export function reloadNow() {
return (dispatch: Dispatch<Function>, getState: Function) => {
dispatch(setFatalError(undefined));
const state = getState();
const { locationURL } = state['features/base/connection'];
// Preserve the local tracks muted state after the reload.
const newURL = addTrackStateToURL(locationURL, state);
logger.info(`Reloading the conference using URL: ${locationURL}`);
dispatch(appNavigate(toURLString(newURL)));
};
}

View File

@@ -1,24 +0,0 @@
import { MEDIA_TYPE } from '../base/media';
import { toState } from '../base/redux';
import { isLocalCameraTrackMuted, isLocalTrackMuted } from '../base/tracks';
import { addHashParamsToURL } from '../base/util';
/**
* Adds the current track state to the passed URL.
*
* @param {URL} url - The URL that will be modified.
* @param {Function|Object} stateful - The redux store or {@code getState} function.
* @returns {URL} - Returns the modified URL.
*/
export function addTrackStateToURL(url, stateful) {
const state = toState(stateful);
const tracks = state['features/base/tracks'];
const isVideoMuted = isLocalCameraTrackMuted(tracks);
const isAudioMuted = isLocalTrackMuted(tracks, MEDIA_TYPE.AUDIO);
return addHashParamsToURL(new URL(url), { // use new URL object in order to not pollute the passed parameter.
'config.startWithAudioMuted': isAudioMuted,
'config.startWithVideoMuted': isVideoMuted
});
}

View File

@@ -5,8 +5,6 @@ import { NativeModules } from 'react-native';
import { toState } from '../base/redux';
import { getServerURL } from '../base/settings';
export * from './functions.any';
/**
* Retrieves the default URL for the app. This can either come from a prop to
* the root App component or be configured in the settings.

View File

@@ -3,8 +3,6 @@
import { toState } from '../base/redux';
import { getServerURL } from '../base/settings';
export * from './functions.any';
declare var interfaceConfig: Object;
/**

Some files were not shown because too many files have changed in this diff Show More