Compare commits

..

21 Commits

Author SHA1 Message Date
titus.moldovan
63754f01a5 chore(deps) updates react-native-webrtc 2021-10-15 12:58:12 +03:00
Zoltán Ulrich
dcf677bdf0 fix(ios) Fixes RCTBridge not being released when JitsiMeet is trying to destroy its bridge on some OS versions 2021-10-14 13:05:37 +02:00
titus.moldovan
eaea2cdef0 chore(versions) bump iOS SDK version 2021-10-08 12:29:41 +03:00
Saúl Ibarra Corretgé
bcad87e894 chore(versions) bump iOS app version 2021-10-07 11:47:22 +02:00
Saúl Ibarra Corretgé
d500493649 chore(deps) update lib-jitsi-meet to fix iOS 15 issue
Not unmuting when "everyone starts muted".
2021-10-07 11:45:53 +02:00
tmoldovan8x8
8ad3ef0022 chore(versions) bump Android SDK version 2021-10-05 09:24:39 +03:00
Saúl Ibarra Corretgé
d0664d9ea0 chore(versions) bump iOS SDK version 2021-10-01 15:49:11 +02:00
Saúl Ibarra Corretgé
45c40d7afc chore(versions) bump iOS app version 2021-10-01 15:48:09 +02:00
Saúl Ibarra Corretgé
e33edfd2a5 fix(rn,conference) fix unmute when "everyone starts muted" is set
Since iOS 15 we really need the audio stream to exist, so make sure we don't
destroy it even when "everyone starts muted" is set, we'll just mute it.

Fixes: https://github.com/jitsi/jitsi-meet/issues/10053
2021-10-01 15:47:22 +02:00
Saúl Ibarra Corretgé
96b2a07172 chore(versions) bump iOS app version 2021-09-30 15:18:26 +02:00
Saúl Ibarra Corretgé
0e8c01af75 fix(ios) fix crash on WebSocket errors
Bacckport
748aa13747

Fixes:

~~~
Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x129708 __exceptionPreprocess
1  libobjc.A.dylib                0x287a8 objc_exception_throw
2  CoreFoundation                 0x19b9c8 -[__NSCFString characterAtIndex:].cold.1
3  CoreFoundation                 0x1a7a20 -[__NSPlaceholderDictionary initWithCapacity:].cold.1
4  CoreFoundation                 0x164c0 -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]
5  CoreFoundation                 0x8de0 +[NSDictionary dictionaryWithObjects:forKeys:count:]
6  JitsiMeetSDK                   0x5704b4 -[RCTWebSocketModule webSocket:didFailWithError:] + 168 (RCTWebSocketModule.m:168)
7  JitsiMeetSDK                   0x54a5ec __33-[RCTSRWebSocket _failWithError:]_block_invoke_2 + 622 (RCTSRWebSocket.m:622)
8  libdispatch.dylib              0x2a84 _dispatch_call_block_and_release
9  libdispatch.dylib              0x481c _dispatch_client_callout
10 libdispatch.dylib              0xc004 _dispatch_lane_serial_drain
11 libdispatch.dylib              0xcc00 _dispatch_lane_invoke
12 libdispatch.dylib              0x174bc _dispatch_workloop_worker_thread
13 libsystem_pthread.dylib        0x37a4 _pthread_wqthread
14 libsystem_pthread.dylib        0xa74c start_wqthread
~~~
2021-09-30 15:12:46 +02:00
tmoldovan8x8
3049ad6dbf feat(android) target sdk 31 2021-09-30 14:06:37 +02:00
Saúl Ibarra Corretgé
9a30ad87a7 chore(versions) bump Android sdk version 2021-09-29 14:49:03 +02:00
Saúl Ibarra Corretgé
11c05560c4 chore(versions) bump Android app version 2021-09-29 14:15:43 +02:00
titus.moldovan
d92fa59c74 fix(android) disables uncompressed native libs usage 2021-09-29 14:15:11 +02:00
Saúl Ibarra Corretgé
4eb1d16faa chore(deps): update react-native-webrtc@1.92.2
Fixes a crash on Android
2021-09-29 14:13:47 +02:00
Saúl Ibarra Corretgé
91adc70724 chore(rn,versions) bump sdk version 2021-09-24 11:09:25 +02:00
Saúl Ibarra Corretgé
15b083c182 fix(ios) create audio track early
In iOS 15 we observe that not creating the audio track early may result in not
getting audio after unmuting for the first time.

Creating the audio track early means the first unmute doesn't need to add the
track to the conference, resulting in a much faster operation.

Note that creating the track early doesn't mean we will start unmuted, the track
will be muted.
2021-09-24 11:01:33 +02:00
titus.moldovan
26fdaf7b8d fix(rn) add default value when retrieving e2ee redux state 2021-09-24 10:11:52 +02:00
Saúl Ibarra Corretgé
64a9874d63 chore(rn,versions) bump sdk version 2021-09-23 14:13:51 +02:00
Saúl Ibarra Corretgé
753cffc458 fix(ios) fix black screen when using Bluetooth in iOS 15
Fixes: https://github.com/jitsi/jitsi-meet/issues/9996

On iOS 15 Bluetooth devices are reported twice for some reason, one with the
normal type "Bluetooth" but another type without a know (to me) type, and the
uid ends in "-reference".

While we send those unkwno devices to JS, we were not filtering them properly.
This patch skips them altogether.
2021-09-23 14:11:49 +02:00
841 changed files with 18976 additions and 44799 deletions

View File

@@ -8,12 +8,8 @@ libs/*
resources/*
react/features/stream-effects/virtual-background/vendor/*
load-test/*
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
# remaining JavaScript source code.
!.eslintrc.js
# Not worth it.
actionTypes.js

View File

@@ -1,5 +1,5 @@
module.exports = {
'extends': [
'@jitsi/eslint-config'
'eslint-config-jitsi'
]
};

View File

@@ -10,12 +10,8 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: '16.x'
node-version: '12.x'
- run: npm install
- name: Check git status
run: git status
- 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 )
- run: npm run lint

2
.npmrc
View File

@@ -1,3 +1 @@
package-lock=true
; FIXME Set legacy-peer-deps=false when we upgrade RN.
legacy-peer-deps=true

1
.nvmrc
View File

@@ -1 +0,0 @@
16

View File

@@ -7,7 +7,6 @@ OLM_DIR = node_modules/@matrix-org/olm
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/
FACIAL_MODELS_DIR = react/features/facial-recognition/resources
NODE_SASS = ./node_modules/.bin/sass
NPM = npm
OUTPUT_DIR = .
@@ -15,12 +14,12 @@ STYLES_BUNDLE = css/all.bundle.css
STYLES_DESTINATION = css/all.css
STYLES_MAIN = css/main.scss
WEBPACK = ./node_modules/.bin/webpack
WEBPACK_DEV_SERVER = ./node_modules/.bin/webpack serve --mode development
WEBPACK_DEV_SERVER = ./node_modules/.bin/webpack-dev-server
all: compile deploy clean
compile: compile-load-test
$(WEBPACK)
$(WEBPACK) -p
compile-load-test:
${NPM} install --prefix resources/load-test && ${NPM} run build --prefix resources/load-test
@@ -29,7 +28,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-css deploy-local deploy-facial-expressions
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm deploy-css deploy-local
deploy-init:
rm -fr $(DEPLOY_DIR)
@@ -38,27 +37,23 @@ deploy-init:
deploy-appbundle:
cp \
$(BUILD_DIR)/app.bundle.min.js \
$(BUILD_DIR)/app.bundle.min.js.map \
$(BUILD_DIR)/app.bundle.min.map \
$(BUILD_DIR)/do_external_connect.min.js \
$(BUILD_DIR)/do_external_connect.min.js.map \
$(BUILD_DIR)/do_external_connect.min.map \
$(BUILD_DIR)/external_api.min.js \
$(BUILD_DIR)/external_api.min.js.map \
$(BUILD_DIR)/external_api.min.map \
$(BUILD_DIR)/flacEncodeWorker.min.js \
$(BUILD_DIR)/flacEncodeWorker.min.js.map \
$(BUILD_DIR)/flacEncodeWorker.min.map \
$(BUILD_DIR)/dial_in_info_bundle.min.js \
$(BUILD_DIR)/dial_in_info_bundle.min.js.map \
$(BUILD_DIR)/dial_in_info_bundle.min.map \
$(BUILD_DIR)/alwaysontop.min.js \
$(BUILD_DIR)/alwaysontop.min.js.map \
$(BUILD_DIR)/alwaysontop.min.map \
$(OUTPUT_DIR)/analytics-ga.js \
$(BUILD_DIR)/analytics-ga.min.js \
$(BUILD_DIR)/analytics-ga.min.js.map \
$(BUILD_DIR)/facial-expressions-worker.min.js \
$(BUILD_DIR)/facial-expressions-worker.min.js.map \
$(DEPLOY_DIR)
cp \
$(BUILD_DIR)/analytics-ga.min.map \
$(BUILD_DIR)/close3.min.js \
$(BUILD_DIR)/close3.min.js.map \
$(DEPLOY_DIR) || true
$(BUILD_DIR)/close3.min.map \
$(DEPLOY_DIR)
deploy-lib-jitsi-meet:
cp \
@@ -88,17 +83,12 @@ deploy-rnnoise-binary:
deploy-tflite:
cp \
$(TFLITE_WASM)/*.wasm \
$(DEPLOY_DIR)
$(DEPLOY_DIR)
deploy-meet-models:
cp \
$(MEET_MODELS_DIR)/*.tflite \
$(DEPLOY_DIR)
deploy-facial-expressions:
cp \
$(FACIAL_MODELS_DIR)/* \
$(DEPLOY_DIR)
$(DEPLOY_DIR)
deploy-css:
$(NODE_SASS) $(STYLES_MAIN) $(STYLES_BUNDLE) && \
@@ -109,8 +99,8 @@ 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-facial-expressions
$(WEBPACK_DEV_SERVER)
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm
$(WEBPACK_DEV_SERVER) --detect-circular-deps
source-package:
mkdir -p source_package/jitsi-meet/css && \

View File

@@ -50,7 +50,7 @@ If you'd like to run your own Jitsi Meet installation head over to the [handbook
We provide Debian packages and a comprehensive Docker setup to make deployments as simple as possible.
Advanced users also have the possibility of building all the components from source.
You can check the latest releases [here](https://jitsi.github.io/handbook/docs/releases).
You can check the latest releases [[here](https://jitsi.github.io/handbook/docs/releases).
## Jitsi as a Service

View File

@@ -82,7 +82,7 @@ public class MainActivity extends JitsiMeetActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
JitsiMeet.showSplashScreen(this);
super.onCreate(null);
super.onCreate(savedInstanceState);
}
@Override
@@ -150,8 +150,8 @@ public class MainActivity extends JitsiMeetActivity {
// Set default options
JitsiMeetConferenceOptions defaultOptions
= new JitsiMeetConferenceOptions.Builder()
.setWelcomePageEnabled(true)
.setServerURL(buildURL(defaultURL))
.setFeatureFlag("welcomepage.enabled", true)
.setFeatureFlag("call-integration.enabled", false)
.setFeatureFlag("resolution", 360)
.setFeatureFlag("server-url-change.enabled", !configurationByRestrictions)

View File

@@ -110,7 +110,7 @@ allprojects {
project.version = "${json.version}-jitsi-${versionQualifierNumber}"
task jitsiAndroidSourcesJar(type: Jar) {
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.source
}
@@ -124,7 +124,7 @@ allprojects {
artifact("${project.buildDir}/outputs/aar/${project.name}-release.aar") {
extension "aar"
}
artifact(jitsiAndroidSourcesJar)
artifact(androidSourcesJar)
pom.withXml {
def pomXml = asNode()
pomXml.appendNode('name', project.name)

View File

@@ -26,5 +26,5 @@ android.useAndroidX=true
android.enableJetifier=true
android.bundle.enableUncompressedNativeLibs=false
appVersion=21.5.0
sdkVersion=4.0.0
appVersion=21.4.1
sdkVersion=3.10.2

View File

@@ -48,7 +48,6 @@ dependencies {
implementation 'com.jakewharton.timber:timber:4.7.1'
implementation 'com.squareup.duktape:duktape-android:1.3.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation "androidx.startup:startup-runtime:1.1.0"
if (rootProject.ext.libreBuild) {
implementation(project(':react-native-device-info')) {
@@ -70,15 +69,9 @@ dependencies {
implementation project(':react-native-calendar-events')
implementation project(':react-native-community_netinfo')
implementation project(':react-native-default-preference')
implementation project(':react-native-gesture-handler')
implementation project(':react-native-get-random-values')
implementation project(':react-native-immersive')
implementation project(':react-native-keep-awake')
implementation project(':react-native-masked-view_masked-view')
implementation project(':react-native-performance')
implementation project(':react-native-reanimated')
implementation project(':react-native-safe-area-context')
implementation project(':react-native-screens')
implementation project(':react-native-slider')
implementation project(':react-native-sound')
implementation project(':react-native-splash-screen')

View File

@@ -57,14 +57,6 @@
android:enabled="false"
tools:replace="android:authorities">
</provider>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false">
<meta-data android:name="org.jitsi.meet.sdk.JitsiInitializer"
android:value="androidx.startup" />
</provider>
</application>
</manifest>

View File

@@ -1,42 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* 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.
*/
package org.jitsi.meet.sdk;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.startup.Initializer;
import com.facebook.soloader.SoLoader;
import java.util.ArrayList;
import java.util.List;
public class JitsiInitializer implements Initializer<Boolean> {
@NonNull
@Override
public Boolean create(@NonNull Context context) {
SoLoader.init(context, /* native exopackage */ false);
return true;
}
@NonNull
@Override
public List<Class<? extends Initializer<?>>> dependencies() {
return new ArrayList<>();
}
}

View File

@@ -24,7 +24,7 @@ import android.net.Uri;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import com.facebook.react.modules.core.PermissionListener;
@@ -38,7 +38,7 @@ import android.app.Activity;
* 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
public class JitsiMeetActivity extends FragmentActivity
implements JitsiMeetActivityInterface {
protected static final String TAG = JitsiMeetActivity.class.getSimpleName();

View File

@@ -45,6 +45,11 @@ public class JitsiMeetConferenceOptions implements Parcelable {
*/
private String token;
/**
* Color scheme override, see: https://github.com/jitsi/jitsi-meet/blob/dbedee5e22e5dcf9c92db96ef5bb3c9982fc526d/react/features/base/color-scheme/defaultScheme.js
*/
private Bundle colorScheme;
/**
* Config. See: https://github.com/jitsi/jitsi-meet/blob/master/config.js
*/
@@ -72,6 +77,10 @@ public class JitsiMeetConferenceOptions implements Parcelable {
return token;
}
public Bundle getColorScheme() {
return colorScheme;
}
public Bundle getFeatureFlags() {
return featureFlags;
}
@@ -88,6 +97,7 @@ public class JitsiMeetConferenceOptions implements Parcelable {
private String room;
private String token;
private Bundle colorScheme;
private Bundle config;
private Bundle featureFlags;
@@ -142,6 +152,19 @@ public class JitsiMeetConferenceOptions implements Parcelable {
return this;
}
/**
* Sets the color scheme override so the app is themed. See:
* https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/color-scheme/defaultScheme.js
* for the structure.
* @param colorScheme - A color scheme to be applied to the app.
* @return - The {@link Builder} object itself so the method calls can be chained.
*/
public Builder setColorScheme(Bundle colorScheme) {
this.colorScheme = colorScheme;
return this;
}
/**
* Indicates the conference will be joined with the microphone muted.
* @param audioMuted - Muted indication.
@@ -175,6 +198,19 @@ public class JitsiMeetConferenceOptions implements Parcelable {
return this;
}
/**
* Sets the welcome page enabled / disabled. The welcome page lists recent meetings and
* calendar appointments and it's meant to be used by standalone applications. Defaults to
* false.
* @param enabled - Whether the welcome page should be enabled or not.
* @return - The {@link Builder} object itself so the method calls can be chained.
*/
public Builder setWelcomePageEnabled(boolean enabled) {
this.featureFlags.putBoolean("welcomepage.enabled", enabled);
return this;
}
public Builder setFeatureFlag(String flag, boolean value) {
this.featureFlags.putBoolean(flag, value);
@@ -240,6 +276,7 @@ public class JitsiMeetConferenceOptions implements Parcelable {
options.serverURL = this.serverURL;
options.room = this.room;
options.token = this.token;
options.colorScheme = this.colorScheme;
options.config = this.config;
options.featureFlags = this.featureFlags;
options.userInfo = this.userInfo;
@@ -255,9 +292,11 @@ public class JitsiMeetConferenceOptions implements Parcelable {
serverURL = (URL) in.readSerializable();
room = in.readString();
token = in.readString();
colorScheme = in.readBundle();
config = in.readBundle();
featureFlags = in.readBundle();
userInfo = new JitsiMeetUserInfo(in.readBundle());
byte tmpAudioMuted = in.readByte();
}
Bundle asProps() {
@@ -270,6 +309,10 @@ public class JitsiMeetConferenceOptions implements Parcelable {
props.putBundle("flags", featureFlags);
if (colorScheme != null) {
props.putBundle("colorScheme", colorScheme);
}
Bundle urlProps = new Bundle();
// The room is fully qualified
@@ -318,6 +361,7 @@ public class JitsiMeetConferenceOptions implements Parcelable {
dest.writeSerializable(serverURL);
dest.writeString(room);
dest.writeString(token);
dest.writeBundle(colorScheme);
dest.writeBundle(config);
dest.writeBundle(featureFlags);
dest.writeBundle(userInfo != null ? userInfo.asBundle() : new Bundle());

View File

@@ -5,6 +5,7 @@ import java.util.List;
public class NotificationChannels {
static final String ONGOING_CONFERENCE_CHANNEL_ID = "JitsiOngoingConferenceChannel";
static final String ONGOING_CONFERNCE_CHANNEL_NAME = "Ongoing Conference Notifications";
public static List<String> allIds = new ArrayList<String>() {{ add(ONGOING_CONFERENCE_CHANNEL_ID); }};
}

View File

@@ -17,6 +17,7 @@
package org.jitsi.meet.sdk;
import static org.jitsi.meet.sdk.NotificationChannels.ONGOING_CONFERENCE_CHANNEL_ID;
import static org.jitsi.meet.sdk.NotificationChannels.ONGOING_CONFERNCE_CHANNEL_NAME;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -65,7 +66,7 @@ class OngoingNotification {
return;
}
channel = new NotificationChannel(ONGOING_CONFERENCE_CHANNEL_ID, context.getString(R.string.ongoing_notification_action_unmute), NotificationManager.IMPORTANCE_DEFAULT);
channel = new NotificationChannel(ONGOING_CONFERENCE_CHANNEL_ID, ONGOING_CONFERNCE_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
channel.enableLights(false);
channel.enableVibration(false);
channel.setShowBadge(false);

View File

@@ -30,6 +30,7 @@ import com.facebook.react.devsupport.DevInternalSettings;
import com.facebook.react.jscexecutor.JSCExecutorFactory;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.uimanager.ViewManager;
import com.facebook.soloader.SoLoader;
import com.oney.WebRTCModule.RTCVideoViewManager;
import com.oney.WebRTCModule.WebRTCModule;
@@ -173,29 +174,25 @@ class ReactInstanceManagerHolder {
return;
}
SoLoader.init(activity.getApplication(), /* native exopackage */ false);
List<ReactPackage> packages
= new ArrayList<>(Arrays.asList(
new com.reactnativecommunity.asyncstorage.AsyncStoragePackage(),
new com.ocetnik.timer.BackgroundTimerPackage(),
new com.calendarevents.CalendarEventsPackage(),
new com.corbt.keepawake.KCKeepAwakePackage(),
new com.facebook.react.shell.MainReactPackage(),
new com.reactnativecommunity.netinfo.NetInfoPackage(),
new com.oblador.performance.PerformancePackage(),
new com.reactnativecommunity.slider.ReactSliderPackage(),
new com.brentvatne.react.ReactVideoPackage(),
new com.swmansion.reanimated.ReanimatedPackage(),
new org.reactnative.maskedview.RNCMaskedViewPackage(),
new com.reactnativecommunity.webview.RNCWebViewPackage(),
new com.horcrux.svg.SvgPackage(),
new com.kevinresol.react_native_default_preference.RNDefaultPreferencePackage(),
new com.learnium.RNDeviceInfo.RNDeviceInfo(),
new com.swmansion.gesturehandler.react.RNGestureHandlerPackage(),
new org.linusu.RNGetRandomValuesPackage(),
new com.oblador.performance.PerformancePackage(),
new com.ocetnik.timer.BackgroundTimerPackage(),
new com.reactnativecommunity.asyncstorage.AsyncStoragePackage(),
new com.reactnativecommunity.netinfo.NetInfoPackage(),
new com.reactnativecommunity.slider.ReactSliderPackage(),
new com.reactnativecommunity.webview.RNCWebViewPackage(),
new com.rnimmersive.RNImmersivePackage(),
new com.swmansion.rnscreens.RNScreensPackage(),
new com.zmxv.RNSound.RNSoundPackage(),
new com.th3rdwave.safeareacontext.SafeAreaContextPackage(),
new com.horcrux.svg.SvgPackage(),
new com.brentvatne.react.ReactVideoPackage(),
new ReactPackageAdapter() {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {

View File

@@ -6,5 +6,4 @@
<string name="ongoing_notification_action_hang_up">Hang up</string>
<string name="ongoing_notification_action_mute">Mute</string>
<string name="ongoing_notification_action_unmute">Unmute</string>
<string name="ongoing_notification_channel_name">Ongoing Conference Notifications</string>
</resources>

View File

@@ -15,26 +15,14 @@ include ':react-native-default-preference'
project(':react-native-default-preference').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-default-preference/android')
include ':react-native-device-info'
project(':react-native-device-info').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-device-info/android')
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-google-signin'
project(':react-native-google-signin').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/google-signin/android')
include ':react-native-immersive'
project(':react-native-immersive').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-immersive/android')
include ':react-native-keep-awake'
project(':react-native-keep-awake').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-keep-awake/android')
include ':react-native-masked-view_masked-view'
project(':react-native-masked-view_masked-view').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-masked-view/masked-view/android')
include ':react-native-performance'
project(':react-native-performance').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-performance/android')
include ':react-native-reanimated'
project(':react-native-reanimated').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-reanimated/android')
include ':react-native-safe-area-context'
project(':react-native-safe-area-context').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-safe-area-context/android')
include ':react-native-screens'
project(':react-native-screens').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-screens/android')
include ':react-native-slider'
project(':react-native-slider').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/slider/android')
include ':react-native-sound'

View File

@@ -1,8 +1,8 @@
/* global APP, JitsiMeetJS, config, interfaceConfig */
import { jitsiLocalStorage } from '@jitsi/js-utils';
import Logger from '@jitsi/logger';
import EventEmitter from 'events';
import Logger from 'jitsi-meet-logger';
import { openConnection } from './connection';
import { ENDPOINT_TEXT_MESSAGE_NAME } from './modules/API/constants';
@@ -29,7 +29,6 @@ import { shouldShowModeratedNotification } from './react/features/av-moderation/
import {
AVATAR_URL_COMMAND,
EMAIL_COMMAND,
_conferenceWillJoin,
authStatusChanged,
commonUserJoinedHandling,
commonUserLeftHandling,
@@ -48,7 +47,7 @@ import {
onStartMutedPolicyChanged,
p2pStatusChanged,
sendLocalParticipant,
nonParticipantMessageReceived
_conferenceWillJoin
} from './react/features/base/conference';
import { getReplaceParticipant } from './react/features/base/config/functions';
import {
@@ -60,6 +59,7 @@ import {
setAudioOutputDeviceId,
updateDeviceList
} from './react/features/base/devices';
import { isIosMobileBrowser } from './react/features/base/environment/utils';
import {
browser,
isFatalJitsiConnectionError,
@@ -108,7 +108,6 @@ import {
getLocalJitsiAudioTrack,
getLocalJitsiVideoTrack,
getLocalTracks,
getLocalVideoTrack,
isLocalCameraTrackMuted,
isLocalTrackMuted,
isUserInteractionRequiredForUnmute,
@@ -130,13 +129,11 @@ import {
initPrejoin,
isPrejoinPageEnabled,
isPrejoinPageVisible,
makePrecallTest,
setJoiningInProgress,
setPrejoinPageVisibility
makePrecallTest
} from './react/features/prejoin';
import { disableReceiver, stopReceiver } from './react/features/remote-control';
import { setScreenAudioShareState, isScreenAudioShared } from './react/features/screen-share/';
import { toggleScreenshotCaptureSummary } from './react/features/screenshot-capture';
import { toggleScreenshotCaptureEffect } from './react/features/screenshot-capture';
import { AudioMixerEffect } from './react/features/stream-effects/audio-mixer/AudioMixerEffect';
import { createPresenterEffect } from './react/features/stream-effects/presenter';
import { createRnnoiseProcessor } from './react/features/stream-effects/rnnoise';
@@ -159,15 +156,6 @@ let connection;
*/
let _connectionPromise;
/**
* We are storing the resolve function of a Promise that waits for the _connectionPromise to be created. This is needed
* when the prejoin button was pressed before the conference object was initialized and the _connectionPromise has not
* been initialized when we tried to execute prejoinStart. In this case in prejoinStart we create a new Promise, assign
* the resolve function to this variable and wait for the promise to resolve before we continue. The
* _onConnectionPromiseCreated will be called once the _connectionPromise is created.
*/
let _onConnectionPromiseCreated;
/**
* This promise is used for chaining mutePresenterVideo calls in order to avoid calling GUM multiple times if it takes
* a while to finish.
@@ -761,7 +749,7 @@ export default {
// XXX The API will take care of disconnecting from the XMPP
// server (and, thus, leaving the room) on unload.
return new Promise((resolve, reject) => {
new ConferenceConnector(resolve, reject).connect();
(new ConferenceConnector(resolve, reject)).connect();
});
},
@@ -806,10 +794,6 @@ export default {
return c;
});
if (_onConnectionPromiseCreated) {
_onConnectionPromiseCreated();
}
APP.store.dispatch(makePrecallTest(this._getConferenceOptions()));
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks(initialOptions);
@@ -837,9 +821,9 @@ export default {
this._initDeviceList(true);
if (initialOptions.startWithAudioMuted) {
// Always add the track on Safari because of a known issue where audio playout doesn't happen
// if the user joins audio and video muted, i.e., if there is no local media capture.
if (browser.isWebKitBased()) {
// Always add the audio track to the peer connection and then mute the track on mobile Safari
// because of a known issue where audio playout doesn't happen if the user joins audio and video muted.
if (isIosMobileBrowser()) {
this.muteAudio(true, true);
} else {
localTracks = localTracks.filter(track => track.getType() !== MEDIA_TYPE.AUDIO);
@@ -853,26 +837,12 @@ export default {
* Joins conference after the tracks have been configured in the prejoin screen.
*
* @param {Object[]} tracks - An array with the configured tracks
* @returns {void}
* @returns {Promise}
*/
async prejoinStart(tracks) {
if (!_connectionPromise) {
// The conference object isn't initialized yet. Wait for the promise to initialise.
await new Promise(resolve => {
_onConnectionPromiseCreated = resolve;
});
_onConnectionPromiseCreated = undefined;
}
const con = await _connectionPromise;
let con;
try {
con = await _connectionPromise;
this.startConference(con, tracks);
} catch (error) {
logger.error(`An error occurred while trying to join a meeting from the prejoin screen: ${error}`);
APP.store.dispatch(setJoiningInProgress(false));
}
return this.startConference(con, tracks);
},
/**
@@ -1016,14 +986,6 @@ export default {
* dialogs in case of media permissions error.
*/
muteVideo(mute, showUI = true) {
if (this.videoSwitchInProgress) {
// Turning the camera on while the screen sharing mode is being turned off is causing issues around
// the presenter mode handling. It should be okay for the user to click the button again once that's done.
console.warn('muteVideo - unable to perform operations while video switch is in progress');
return;
}
if (!mute
&& isUserInteractionRequiredForUnmute(APP.store.getState())) {
logger.error('Unmuting video requires user interaction');
@@ -1361,52 +1323,14 @@ export default {
}
},
/**
* Used by the Breakout Rooms feature to join a breakout room or go back to the main room.
*/
async joinRoom(roomName, isBreakoutRoom = false) {
this.roomName = roomName;
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks();
const localTracks = await tryCreateLocalTracks;
this._displayErrorsForCreateInitialLocalTracks(errors);
localTracks.forEach(track => {
if ((track.isAudioTrack() && this.isLocalAudioMuted())
|| (track.isVideoTrack() && this.isLocalVideoMuted())) {
track.mute();
}
});
this._createRoom(localTracks, isBreakoutRoom);
return new Promise((resolve, reject) => {
new ConferenceConnector(resolve, reject).connect();
});
},
_createRoom(localTracks, isBreakoutRoom = false) {
const extraOptions = {};
if (isBreakoutRoom) {
// We must be in a room already.
if (!room?.xmpp?.breakoutRoomsComponentAddress) {
throw new Error('Breakout Rooms not enabled');
}
// TODO: re-evaluate this. -saghul
extraOptions.customDomain = room.xmpp.breakoutRoomsComponentAddress;
}
_createRoom(localTracks) {
room
= connection.initJitsiConference(
APP.conference.roomName,
{
...this._getConferenceOptions(),
...extraOptions
});
this._getConferenceOptions());
// Filter out the tracks that are muted (except on Safari).
const tracks = browser.isWebKitBased() ? localTracks : localTracks.filter(track => !track.isMuted());
// Filter out the tracks that are muted (except on mobile Safari).
const tracks = isIosMobileBrowser() ? localTracks : localTracks.filter(track => !track.isMuted());
this._setLocalAudioVideoStreams(tracks);
this._room = room; // FIXME do not use this
@@ -1579,26 +1503,23 @@ export default {
*
* @param {boolean} didHaveVideo indicates if there was a camera video being
* used, before switching to screen sharing.
* @param {boolean} ignoreDidHaveVideo indicates if the camera video should be
* ignored when switching screen sharing off.
* @param {boolean} wasVideoMuted indicates if the video was muted, before
* switching to screen sharing.
* @return {Promise} resolved after the screen sharing is turned off, or
* rejected with some error (no idea what kind of error, possible GUM error)
* in case it fails.
* @private
*/
async _turnScreenSharingOff(didHaveVideo, ignoreDidHaveVideo) {
async _turnScreenSharingOff(didHaveVideo) {
this._untoggleScreenSharing = null;
this.videoSwitchInProgress = true;
APP.store.dispatch(stopReceiver());
this._stopProxyConnection();
if (config.enableScreenshotCapture) {
APP.store.dispatch(toggleScreenshotCaptureSummary(false));
APP.store.dispatch(toggleScreenshotCaptureEffect(false));
}
const tracks = APP.store.getState()['features/base/tracks'];
const duration = getLocalVideoTrack(tracks)?.jitsiTrack.getDuration() ?? 0;
// It can happen that presenter GUM is in progress while screensharing is being turned off. Here it needs to
// wait for that GUM to be resolved in order to prevent leaking the presenter track(this.localPresenterVideo
@@ -1633,7 +1554,7 @@ export default {
APP.store.dispatch(setScreenAudioShareState(false));
if (didHaveVideo && !ignoreDidHaveVideo) {
if (didHaveVideo) {
promise = promise.then(() => createLocalTracksF({ devices: [ 'video' ] }))
.then(([ stream ]) => {
logger.debug(`_turnScreenSharingOff using ${stream} for useVideoStream`);
@@ -1660,8 +1581,7 @@ export default {
return promise.then(
() => {
this.videoSwitchInProgress = false;
sendAnalytics(createScreenSharingEvent('stopped',
duration === 0 ? null : duration));
sendAnalytics(createScreenSharingEvent('stopped'));
logger.info('Screen sharing stopped.');
},
error => {
@@ -1685,13 +1605,12 @@ export default {
* @param {Array<string>} [options.desktopSharingSources] - Array with the
* sources that have to be displayed in the desktop picker window ('screen',
* 'window', etc.).
* @param {boolean} ignoreDidHaveVideo - if true ignore if video was on when sharing started.
* @return {Promise.<T>}
*/
async toggleScreenSharing(toggle = !this._untoggleScreenSharing, options = {}, ignoreDidHaveVideo) {
async toggleScreenSharing(toggle = !this._untoggleScreenSharing, options = {}) {
logger.debug(`toggleScreenSharing: ${toggle}`);
if (this.videoSwitchInProgress) {
return Promise.reject(`toggleScreenSharing: ${toggle} aborted - video switch in progress.`);
return Promise.reject('Switch in progress.');
}
if (!JitsiMeetJS.isDesktopSharingEnabled()) {
return Promise.reject('Cannot toggle screen sharing: not supported.');
@@ -1714,7 +1633,7 @@ export default {
}
return this._untoggleScreenSharing
? this._untoggleScreenSharing(ignoreDidHaveVideo)
? this._untoggleScreenSharing()
: Promise.resolve();
},
@@ -1976,7 +1895,7 @@ export default {
.then(() => {
this.videoSwitchInProgress = false;
if (config.enableScreenshotCapture) {
APP.store.dispatch(toggleScreenshotCaptureSummary(true));
APP.store.dispatch(toggleScreenshotCaptureEffect(true));
}
sendAnalytics(createScreenSharingEvent('started'));
logger.log('Screen sharing started');
@@ -2057,9 +1976,6 @@ export default {
room.on(JitsiConferenceEvents.CONFERENCE_JOINED, () => {
this._onConferenceJoined();
});
room.on(JitsiConferenceEvents.CONFERENCE_JOIN_IN_PROGRESS, () => {
APP.store.dispatch(setPrejoinPageVisibility(false));
});
room.on(
JitsiConferenceEvents.CONFERENCE_LEFT,
@@ -2261,10 +2177,6 @@ export default {
}
});
room.on(
JitsiConferenceEvents.NON_PARTICIPANT_MESSAGE_RECEIVED,
(...args) => APP.store.dispatch(nonParticipantMessageReceived(...args)));
room.on(
JitsiConferenceEvents.LOCK_STATE_CHANGED,
(...args) => APP.store.dispatch(lockStateChanged(room, ...args)));
@@ -2353,9 +2265,9 @@ export default {
// Remove the tracks from the peerconnection.
for (const track of localTracks) {
// Always add the track on Safari because of a known issue where audio playout doesn't happen
// if the user joins audio and video muted, i.e., if there is no local media capture.
if (audioMuted && track.jitsiTrack?.getType() === MEDIA_TYPE.AUDIO && !browser.isWebKitBased()) {
// Always add the track on mobile Safari because of a known issue where audio playout doesn't happen
// if the user joins audio and video muted.
if (audioMuted && track.jitsiTrack?.getType() === MEDIA_TYPE.AUDIO && !isIosMobileBrowser()) {
promises.push(this.useAudioStream(null));
}
if (videoMuted && track.jitsiTrack?.getType() === MEDIA_TYPE.VIDEO) {
@@ -2564,8 +2476,8 @@ export default {
});
APP.UI.addListener(
UIEvents.TOGGLE_SCREENSHARING, ({ enabled, audioOnly, ignoreDidHaveVideo }) => {
this.toggleScreenSharing(enabled, { audioOnly }, ignoreDidHaveVideo);
UIEvents.TOGGLE_SCREENSHARING, ({ enabled, audioOnly }) => {
this.toggleScreenSharing(enabled, { audioOnly });
}
);
},
@@ -2693,17 +2605,12 @@ export default {
APP.store.dispatch(updateDeviceList(devices));
// Firefox users can choose their preferred device in the gUM prompt. In that case
// we should respect that and not attempt to switch to the preferred device from
// our settings.
const newLabelsOnly = mediaDeviceHelper.newDeviceListAddedLabelsOnly(oldDevices, devices);
const newDevices
= mediaDeviceHelper.getNewMediaDevicesAfterDeviceListChanged(
devices,
this.isSharingScreen,
localVideo,
localAudio,
newLabelsOnly);
localAudio);
const promises = [];
const audioWasMuted = this.isLocalAudioMuted();
const videoWasMuted = this.isLocalVideoMuted();
@@ -2947,17 +2854,6 @@ export default {
});
},
/**
* Leaves the room.
*
* @returns {Promise}
*/
leaveRoom() {
if (room && room.isJoined()) {
return room.leave();
}
},
/**
* Leaves the room and calls JitsiConnection.disconnect.
*
@@ -3052,15 +2948,6 @@ 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

109
config.js
View File

@@ -279,7 +279,6 @@ var config = {
// autoHide: true,
// autoHideTimeout: 5000,
// disabled: false,
// disableDetails: false,
// inactiveDisabled: false
// },
@@ -430,12 +429,6 @@ var config = {
// Hides lobby button
// hideLobbyButton: false,
// If Lobby is enabled starts knocking automatically.
// autoKnockLobby: false,
// Hides add breakout room button
// hideAddRoomButton: false,
// Require users to always specify a display name.
// requireDisplayName: true,
@@ -483,10 +476,6 @@ var config = {
// When 'true', it shows an intermediate page before joining, where the user can configure their devices.
// prejoinPageEnabled: false,
// When 'true', the user cannot edit the display name.
// (Mainly useful when used in conjuction with the JWT so the JWT name becomes read only.)
// readOnlyName: false,
// If etherpad integration is enabled, setting this to true will
// automatically open the etherpad when a participant joins. This
// does not affect the mobile app since opening an etherpad
@@ -556,19 +545,6 @@ var config = {
// '__end'
// ],
// Holds values related to toolbar visibility control.
// toolbarConfig: {
// // Moved from interfaceConfig.INITIAL_TOOLBAR_TIMEOUT
// // The initial numer of miliseconds for the toolbar buttons to be visible on screen.
// initialTimeout: 20000,
// // Moved from interfaceConfig.TOOLBAR_TIMEOUT
// // Number of miliseconds for the toolbar buttons to be visible on screen.
// timeout: 4000,
// // Moved from interfaceConfig.TOOLBAR_ALWAYS_VISIBLE
// // Whether toolbar should be always visible or should hide after x miliseconds.
// alwaysVisible: false
// },
// Toolbar buttons which have their click event exposed through the API on
// `toolbarButtonClicked` event instead of executing the normal click routine.
// buttonsWithNotifyClick: [
@@ -655,9 +631,6 @@ var config = {
// Enables sending participants' emails (if available) to callstats and other analytics
// enableEmailInStats: false,
// Enables detecting faces of participants and get their expression and send it to other participants
// enableFacialRecognition: true,
// Controls the percentage of automatic feedback shown to participants when callstats is enabled.
// The default value is 100%. If set to 0, no automatic feedback will be requested
// feedbackPercentage: 100,
@@ -786,7 +759,6 @@ var config = {
// - 'PARTICIPANT_JOINED_SOUND'
// - 'PARTICIPANT_LEFT_SOUND'
// - 'RAISE_HAND_SOUND'
// - 'REACTION_SOUND'
// - 'RECORDING_OFF_SOUND'
// - 'RECORDING_ON_SOUND'
// - 'TALK_WHILE_MUTED_SOUND'
@@ -835,10 +807,6 @@ var config = {
// format: 'flac'
//
// },
// e2ee: {
// labels,
// externallyManagedKey: false
// },
// Options related to end-to-end (participant to participant) ping.
@@ -909,65 +877,25 @@ var config = {
If there is no url set or there are missing fields, the defaults are applied.
The config file should be in JSON.
None of the fields are mandatory and the response must have the shape:
{
// The domain url to apply (will replace the domain in the sharing conference link/embed section)
inviteDomain: 'example-company.org,
// The hex value for the colour used as background
backgroundColor: '#fff',
// The url for the image used as background
backgroundImageUrl: 'https://example.com/background-img.png',
// The anchor url used when clicking the logo image
logoClickUrl: 'https://example-company.org',
// The url used for the image used as logo
logoImageUrl: 'https://example.com/logo-img.png',
// Overwrite for pool of background images for avatars
avatarBackgrounds: ['url(https://example.com/avatar-background-1.png)', '#FFF'],
// The lobby/prejoin screen background
premeetingBackground: 'url(https://example.com/premeeting-background.png)',
// A list of images that can be used as video backgrounds.
// When this field is present, the default images will be replaced with those provided.
virtualBackgrounds: ['https://example.com/img.jpg'],
// Object containing a theme's properties. It also supports partial overwrites of the main theme.
// For a list of all possible theme tokens and their current defaults, please check:
// https://github.com/jitsi/jitsi-meet/tree/master/resources/custom-theme/custom-theme.json
// For a short explanations on each of the tokens, please check:
// https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/ui/Tokens.js
// IMPORTANT!: This is work in progress so many of the various tokens are not yet applied in code
// or they are partially applied.
customTheme: {
palette: {
ui01: "orange !important",
ui02: "maroon",
surface02: 'darkgreen',
ui03: "violet",
ui04: "magenta",
ui05: "blueviolet",
field02Hover: 'red',
action01: 'green',
action01Hover: 'lightgreen',
action02Disabled: 'beige',
success02: 'cadetblue',
action02Hover: 'aliceblue'
},
typography: {
labelRegular: {
fontSize: 25,
lineHeight: 30,
fontWeight: 500
}
}
}
}
{
// The domain url to apply (will replace the domain in the sharing conference link/embed section)
inviteDomain: 'example-company.org,
// The hex value for the colour used as background
backgroundColor: '#fff',
// The url for the image used as background
backgroundImageUrl: 'https://example.com/background-img.png',
// The anchor url used when clicking the logo image
logoClickUrl: 'https://example-company.org',
// The url used for the image used as logo
logoImageUrl: 'https://example.com/logo-img.png',
// Overwrite for pool of background images for avatars
avatarBackgrounds: ['url(https://example.com/avatar-background-1.png)', '#FFF'],
// The lobby/prejoin screen background
premeetingBackground: 'url(https://example.com/premeeting-background.png)'
}
*/
// dynamicBrandingUrl: '',
// When true the user cannot add more images to be used as virtual background.
// Only the default ones from will be available.
// disableAddingBackgroundImages: false,
// Disables using screensharing as virtual background.
// disableScreensharingVirtualBackground: false,
// Sets the background transparency level. '0' is fully transparent, '1' is opaque.
// backgroundAlpha: 1,
@@ -1023,6 +951,11 @@ var config = {
// will open an etherpad document.
// etherpad_base: 'https://your-etherpad-installati.on/p/',
// If etherpad_base is set, and useRoomAsSharedDocumentName is set to true,
// open a pad with the name of the room (lowercased) instead of a pad with a
// random UUID.
// useRoomAsSharedDocumentName: true,
// List of undocumented settings used in jitsi-meet
/**
_immediateReloadThreshold

View File

@@ -1,7 +1,7 @@
/* global APP, JitsiMeetJS, config */
import { jitsiLocalStorage } from '@jitsi/js-utils';
import Logger from '@jitsi/logger';
import Logger from 'jitsi-meet-logger';
import { redirectToTokenAuthService } from './modules/UI/authentication/AuthHandler';
import { LoginDialog } from './react/features/authentication/components';

View File

@@ -24,6 +24,61 @@
bottom: calc(#{$newToolbarSizeWithPadding}) !important;
}
.modal-dialog-form {
/**
* Override @atlaskit/dropdown-menu styling when in a modal because the
* dropdown backgrounds clash with the modal backgrounds.
*/
.dropdown-menu div[style*="transform"] {
outline: 1px solid #455166;
}
.dropdown-menu button:not(:active):not(:hover) > span {
color: #B8C7E0;
}
/**
* Override @atlaskit/tab styling when in a modal because the
* tab text color clash with the modal backgrounds.
*/
div[role="tablist"] > div:not([data-selected]):not(:hover),
label > div > span {
color: #B8C7E0 !important;
}
}
/**
* Override @atlaskit/modal-dialog header styling
*/
.atlaskit-portal [role="dialog"] header {
box-shadow: none;
.jitsi-icon {
cursor: pointer;
}
.jitsi-icon svg {
fill: #B8C7E0;
}
}
/**
* Override @atlaskit/modal-dialog footer styling.
*/
.atlaskit-portal [role="dialog"] footer {
box-shadow: none;
}
/**
* Make header close button more easily tappable on mobile.
*/
.mobile-browser .atlaskit-portal [role="dialog"] header .jitsi-icon {
display: grid;
place-items: center;
height: 48px;
width: 48px;
background: #2a3a4b;
border-radius: 3px;
}
/**
* Override @atlaskit/theme styling for the top toolbar so it displays over
* the video thumbnail while obscuring as little as possible.
@@ -103,20 +158,3 @@ div.Tooltip {
line-height: 14px;
padding: 8px;
}
// make modal full screen on landscape orientation
@media (max-height: 420px) {
.atlaskit-portal {
.css-1oc7v0j {
height: 100%;
padding: 0;
max-width: 100%;
top: 0;
width: 100%;
&> div {
height: 100%;
}
}
}
}

View File

@@ -2,39 +2,34 @@
background-color: $chatBackgroundColor;
box-sizing: border-box;
color: #FFF;
display: flex;
flex-direction: column;
height: 100%;
left: -$sidebarWidth;
overflow: hidden;
position: absolute;
top: 0;
width: $sidebarWidth;
z-index: $sideToolbarContainerZ;
@media (max-width: 580px) {
width: 100%;
/**
* The sidebar (chat) is off-screen when hidden. Move it flush to the left
* side of the window when it should be visible.
*/
&.slideInExt {
left: 0;
}
}
.chat-panel {
display: flex;
flex-direction: column;
// extract header + tabs height
height: calc(100% - 102px);
}
.chat-panel-no-tabs {
// extract header height
height: calc(100% - 70px);
}
#chatconversation {
box-sizing: border-box;
flex: 1;
font-size: 10pt;
// extract message input height
height: calc(100% - 68px);
line-height: 20px;
overflow: auto;
padding: 16px;
text-align: left;
width: $sidebarWidth;
word-wrap: break-word;
display: flex;
@@ -63,6 +58,28 @@
a:active {
color: black;
}
&::-webkit-scrollbar {
background: #06a5df;
width: 7px;
}
&::-webkit-scrollbar-button {
display: none;
}
&::-webkit-scrollbar-track {
background: black;
}
&::-webkit-scrollbar-track-piece {
background: black;
}
&::-webkit-scrollbar-thumb {
background: #06a5df;
border-radius: 4px;
}
}
#chat-recipient {
@@ -196,7 +213,6 @@
}
#usermsg {
-ms-overflow-style: none;
border: 0px none;
border-radius:0;
box-shadow: none;
@@ -205,13 +221,8 @@
padding: 10px;
overflow-y: auto;
resize: none;
scrollbar-width: none;
width: 100%;
word-break: break-word;
&::-webkit-scrollbar {
display: none;
}
}
#usermsg:hover {
@@ -302,6 +313,10 @@
text-overflow: ellipsis;
overflow: hidden;
}
@media (max-width: 580px) {
display: none !important;
}
}
.sr-only {
@@ -542,6 +557,11 @@
}
}
.touchmove-hack {
display: flex;
flex: 1;
overflow: auto;
}
/**
* Make header close button more easily tappable on mobile.

View File

@@ -11,6 +11,12 @@
{
@extend %connection-info;
/**
* Apply negative margin to reduce the appearance of padding in AtlasKit
* InlineDialog.
*/
margin: -15px;
> table {
white-space: nowrap;
@extend %connection-info;

View File

@@ -5,10 +5,6 @@
bottom: 0;
z-index: $drawerZ;
border-radius: 16px 16px 0 0;
&.notification-portal {
z-index: $dropdownZ;
}
}
.drawer-portal::after {

37
css/_labels.scss Normal file
View File

@@ -0,0 +1,37 @@
.label {
align-items: center;
background: #36383C;
border-radius: 3px;
color: #fff;
display: flex;
font-size: 12px;
font-weight: 600;
height: 28px;
margin: 0 0 4px 4px;
padding: 0 8px;
&--green {
background: #31B76A;
}
&--red {
background: #E34F56
}
&--white {
background: #fff;
color: #5e6d7a;
svg {
fill: #5e6d7a;
}
}
}
.label-text-with-icon {
margin-left: 8px;
}
.participants-count {
cursor: pointer;
}

View File

@@ -1,23 +0,0 @@
.notification-appear, .notification-enter {
opacity: 0;
position: relative;
left: -200px;
transition: all .2s !important; // !important needed to overwrite atlaskit default style
&-active {
opacity: 1;
left: 0;
}
}
.notification-exit {
opacity: 1;
position: relative;
left: 0;
transition: all .2s !important; // !important needed to overwrite atlaskit default style
&-active {
opacity: 0;
left: -200px;
}
}

View File

@@ -56,9 +56,3 @@
border-radius: 3px;
}
}
.mobile-browser.shift-right {
.participants_pane {
z-index: -1;
}
}

View File

@@ -1,7 +1,5 @@
.poll-dialog {
font-size: 14px;
font-weight: 400;
line-height: 20px;
font-size: 1rem;
h1, span, li, strong {
color: #bce;
@@ -18,50 +16,20 @@
}
.poll-header {
margin-bottom: 8px;
padding: 8px 16px;
}
.poll-creator {
color: #C2C2C2;
font-weight: 600;
margin: 4px 0 16px 0;
}
.poll-answer-container {
.poll-answer-container{
padding: 8px;
background: #3D3D3D;
border-radius: 3px;
margin-bottom: 8px;
@media (max-width: 580px) {
&> span {
padding: 8px 0;
}
svg {
margin-top: 6px;
}
}
}
.poll-answer-option {
font-weight: 400;
display: block;
margin: 4px;
@media (max-width: 580px) {
font-size: 16px;
margin: 11px 8px
}
}
.poll-answer-field-list, .poll-answer-list, .poll-result-list {
list-style-type: none;
padding: 0;
margin: 0;
}
.poll-answer-field-list {
padding: 0 16px;
margin: 0;
}
ol.poll-result-list {
@@ -69,7 +37,7 @@ ol.poll-result-list {
}
.poll-result-list > li {
margin-bottom: 16px;
margin-bottom: 8px;
}
.poll-answer-field {
@@ -92,7 +60,7 @@ ol.poll-result-list {
.poll-create-container .jsYMHu {
background: #292929;
border-color: #808090;
color: #fff // #808090
color: white // #808090
}
.poll-add-button {
@@ -104,7 +72,7 @@ ol.poll-result-list {
.poll-remove-option-button {
background: 0 0;
border: none;
color: #E04757;
color: #8B8B8B;
padding-left: 0;
}
@@ -117,7 +85,7 @@ ol.poll-result-list {
.poll-icon-button, .poll-drag-handle {
.jitsi-icon svg {
fill: #929292;
fill: #bce;
}
}
@@ -126,7 +94,6 @@ ol.poll-result-list {
border: none;
cursor: grab;
padding-left: 8;
padding-top: 8px;
display: flex;
}
@@ -138,12 +105,13 @@ ol.poll-result-list {
}
.poll-question {
font-size: 16px;
font-size: 1.2em;
font-weight: 600;
line-height: 26px;
margin-bottom: 0.5em;
}
.poll-answer-voters {
font-size: 1em;
font-weight: lighter;
list-style-type: none;
border: #616161 solid 1px;
@@ -223,36 +191,29 @@ ol.poll-result-list {
display: flex;
flex-direction: row;
justify-content: space-between;
a.poll-detail-link, a.poll-change-vote-link {
color: #669AEC;
cursor: pointer;
font-weight: 600;
text-decoration: none;
&:hover {
color: #669AEC;
}
&:visited {
color: #669AEC;
}
}
}
a.poll-detail-link, a.poll-change-vote-link {
color: #246FE5;
cursor: pointer;
text-decoration: none;
}
.polls-pane-content {
height: 100%;
position: relative;
display: flex;
flex-direction: column;
font-weight: 600;
height: 85%;
align-items: stretch;
}
.pane-content{
display: flex;
flex-direction: column;
height: 100%;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
}
.empty-pane-icon {
@@ -267,41 +228,36 @@ ol.poll-result-list {
}
.empty-pane-message {
color: #fff;
padding: 0 16px;
text-align: center;
}
.poll-results, .poll-answer {
background: #292929;
border-radius: 8px;
border: 1px solid #666666;
margin: 16px;
padding: 16px;
word-break: break-word;
}
.poll-results {
color: #fff;
color: white;
}
.poll-answer {
h1, strong ,span {
color: #fff;
color: white;
}
}
.poll-results, .poll-answer {
margin-bottom: 16px;
background: #292929;
border-radius: 8px;
padding: 12px 8px;
border-width: thin;
border-style: solid;
border-color: #616161;
}
.poll-create-label {
color: #C2C2C2;
display: flex;
font-weight: 400;
color: white;
margin-bottom: 4;
display: flex;
}
.expandable-input{
line-height: 18px;
resize: none;
width: 100%;
height: 40px;
@@ -314,31 +270,24 @@ ol.poll-result-list {
padding: 10px 16px;
}
#polls-panel {
height: calc(100% - 102px);
}
.poll-container {
font-size: 14px;
font-weight: 600;
height: calc(100% - 88px);
line-height: 20px;
box-sizing: border-box;
flex: 1;
overflow-y: auto;
position: relative;
padding: 16px;
& > * + *:not(.ignore-child) {
margin-top: 16px;
}
@media (max-width: 580px) {
height: calc(100% - 102px);
&::-webkit-scrollbar {
display: none;
}
}
.poll-create-header {
color: #fff;
font-size: 20px;
line-height: 28px;
margin: 20px 16px;
font-weight: 600;
}
@@ -347,45 +296,28 @@ ol.poll-result-list {
padding: 8px 0;
}
.poll-create-footer {
background-color: #141414;
bottom: 0;
position: absolute;
width: calc(100% - 32px);
}
.poll-footer {
display: flex;
justify-content: space-between;
padding: 0 16px 16px 16px;
display: flex;
justify-content: flex-end;
padding: 8px 16px;
height: 40px;
align-items: stretch;
& > *:not(:last-child) {
margin-right: 16px;
}
}
.poll-answer-footer {
padding: 8px 0 0 0;
}
.poll-button {
align-items: center;
border: 0;
border-radius: 6px;
font-size: 14px;
font-weight: 600;
display: flex;
justify-content: center;
min-height: 40px;
width: 100%;
&:disabled {
cursor: initial;
}
@media (max-width: 580px) {
min-height: 48px;
}
}
.poll-button-primary {
.poll-primary-button {
align-items: center;
background-color: #0056E0;
border: 0;
border-radius: 6px;
display: flex;
font-weight: unset;
justify-content: center;
font-size: 15px;
flex: 1;
&:hover {
background-color: #246FE5;
@@ -404,10 +336,23 @@ ol.poll-result-list {
background-color: #00225A;
color: #858585;
}
& > *:not(:last-child) {
margin-right: 8px;
}
}
.poll-button-secondary {
.poll-secondary-button {
align-items: center;
background-color: #3D3D3D;
border: 0;
border-radius: 6px;
display: flex;
font-weight: unset;
justify-content: center;
font-size: 15px;
height: 40px;
width: 100%;
&:hover {
background-color: #525252;
@@ -426,19 +371,78 @@ ol.poll-result-list {
background-color: #141414;
color: #858585;
}
& > *:not(:last-child) {
margin-right: 8px;
}
}
.poll-button-short {
max-width: 132px;
.poll-small-primary-button {
align-items: center;
background-color: #0056E0;
border: 0;
border-radius: 6px;
display: flex;
font-weight: unset;
justify-content: center;
font-size: 15px;
height: 40px;
width: 50%;
&:hover {
background-color: #246FE5;
}
&:active {
background-color: #0045B3;
}
&:focus {
background-color: #0045B3;
border: 3px solid #99BBF3;
}
&:disabled {
background-color: #00225A;
color: #858585;
}
& > *:not(:last-child) {
margin-right: 8px;
}
}
.poll-button-shortest {
max-width: 117px;
}
.poll-small-secondary-button {
align-items: center;
background-color: #3D3D3D;
border: 0;
border-radius: 6px;
display: flex;
font-weight: unset;
justify-content: center;
font-size: 15px;
height: 40px;
width: 50%;
.poll-button-short,
.poll-button-shortest {
@media (max-width: 580px) {
min-width: 49%;
}
&:hover {
background-color: #525252;
}
&:active {
background-color: #292929;
}
&:focus {
background-color: #292929;
border: 3px solid #858585;
}
&:disabled {
background-color: #141414;
color: #858585;
}
& > *:not(:last-child) {
margin-right: 8px;
}
}

View File

@@ -3,50 +3,49 @@
* to allow mouse movement from the popover trigger to the popover itself
* without triggering a mouseleave event.
*/
.popover-mousemove-padding-bottom {
bottom: -15px;
height: 20px;
position: absolute;
right: 0;
width: 100%;
}
%vertical-popover-padding {
height: 100%;
position: absolute;
top: 0;
width: 20px;
padding: 20px 0;
top: -20px;
}
%horizontal-popover-padding {
height: 25px;
position: absolute;
right: 0;
width: 100%;
padding: 0 35px;
left: -35px;
width: 40px;
}
.popover-mousemove-padding-left {
@extend %vertical-popover-padding;
left: -35px;
left: -20px;
}
.popover-mousemove-padding-right {
@extend %vertical-popover-padding;
right: -35px;
right: -20px;
}
.popover-mousemove-padding-bottom {
@extend %horizontal-popover-padding;
bottom: -40px;
}
.popover-mousemove-padding-top {
@extend %horizontal-popover-padding;
top: -40px;
/**
* An invisible element is added to the top of the popover to ensure the mouse
* stays over the popover when the popover's height is shrunk, which would then
* normally leave the mouse outside of the popover itself and cause a mouseleave
* event.
*/
.popover-mouse-padding-top {
height: 30px;
position: absolute;
right: 0;
top: -25px;
width: 100%;
}
.popover {
background-color: $popoverBg;
border-radius: 3px;
margin: -16px -24px;
padding: 16px 24px;
z-index: $popoverZ;
}
.padded-content {
padding: 4px 8px;
}

View File

@@ -5,7 +5,6 @@
.popupmenu {
background-color: $menuBG;
border-radius: 3px;
list-style-type: none;
min-width: 150px;
text-align: left;
padding: 0px;
@@ -39,11 +38,6 @@
}
}
&__list {
margin: 0;
padding: 0;
}
&__text {
display: inline-block;
margin-left: 8px;

View File

@@ -75,7 +75,3 @@
top: 0;
height: 48px;
}
.shift-right .details-container {
margin-left: calc(#{$sidebarWidth} / 2);
}

View File

@@ -29,7 +29,6 @@
right: 0;
transition: bottom .3s ease-in;
width: 100%;
pointer-events: none;
&.visible {
@@ -77,6 +76,14 @@
}
}
.toolbox-button {
color: $toolbarButtonColor;
cursor: pointer;
display: inline-block;
line-height: $newToolbarSize;
text-align: center;
}
.toolbar-button-with-badge {
display: inline-block;
position: relative;
@@ -107,6 +114,86 @@
padding-bottom: env(safe-area-inset-bottom, 0);
}
.toolbox-content-items {
background: $newToolbarBackgroundColor;
border-radius: 6px;
margin: 0 auto;
padding: 6px;
text-align: center;
pointer-events: all;
box-shadow: 0px 2px 8px 4px rgba(0, 0, 0, 0.25), 0px 0px 0px 1px rgba(0, 0, 0, 0.15);
>div {
margin-left: 8px;
&:first-child {
margin-left: 0;
}
}
}
.overflow-menu {
font-size: 14px;
list-style-type: none;
padding: 8px 0;
background-color: $menuBG;
.profile-text {
max-width: 150px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
}
.overflow-menu-item {
align-items: center;
color: $overflowMenuItemColor;
cursor: pointer;
display: flex;
font-size: 14px;
font-weight: 400;
height: 40px;
line-height: 24px;
padding: 8px 16px;
box-sizing: border-box;
@media (hover: hover) and (pointer: fine) {
&:hover {
background: $overflowMenuItemBackground;
}
}
div {
display: flex;
flex-direction: row;
align-items: center;
}
&.unclickable {
cursor: default;
}
&.disabled {
cursor: initial;
color: #929292;
&:hover {
background: none;
}
svg {
fill: #929292;
}
}
@media (hover: hover) and (pointer: fine) {
&.unclickable:hover {
background: inherit;
}
}
}
.beta-tag {
background: #36383C;
border-radius: 3px;
@@ -117,12 +204,73 @@
text-transform: uppercase;
}
.overflow-menu-item-icon {
margin-right: 16px;
i {
display: inline;
font-size: 24px;
}
@media (hover: hover) and (pointer: fine) {
i:hover {
background-color: initial;
}
}
img {
max-width: 24px;
max-height: 24px;
}
svg {
fill: #fff;
height: 20px;
width: 20px;
}
}
.overflow-menu-hr {
border-top: 1px solid #4C4D50;
border-bottom: 0;
margin: 8px 0;
}
.toolbox-icon {
display: flex;
border-radius: 3px;
flex-direction: column;
font-size: 24px;
height: $newToolbarSize;
justify-content: center;
width: $newToolbarSize;
@media (hover: hover) and (pointer: fine) {
&:hover {
background: $newToolbarButtonHoverColor;
}
}
@media (max-width: 320px) {
height: 36px;
width: 36px;
}
&.toggled {
background: $newToolbarButtonToggleColor;
}
&.disabled {
cursor: initial !important;
background-color: #36383c !important;
svg {
fill: #929292 !important;
}
}
}
.hangup-button {
background-color: $hangupColor;

View File

@@ -61,7 +61,7 @@ $videoThumbnailSelected: #165ECC;
$participantNameColor: #fff;
$thumbnailPictogramColor: #fff;
$dominantSpeakerBg: #165ecc;
$raiseHandBg: #F8AE1A;
$raiseHandBg: #D6D61E;
$audioLevelBg: #44A5FF;
$connectionIndicatorBg: #165ecc;
$audioLevelShadow: rgba(9, 36, 77, 0.9);
@@ -122,7 +122,7 @@ $zindex10: 10;
$reloadZ: 20;
$poweredByZ: 100;
$ringingZ: 300;
$sideToolbarContainerZ: 300;
$sideToolbarContainerZ: 200;
$toolbarZ: 250;
$drawerZ: 351;
$tooltipsZ: 401;
@@ -269,4 +269,4 @@ $verySmallScreen: 500px;
* Prejoin / premeeting screen
*/
$prejoinDefaultContentWidth: 336px;
$prejoinDefaultContentWidth: 336px;

View File

@@ -87,6 +87,7 @@
&__toolbar {
bottom: 0;
height: $thumbnailToolbarHeight;
padding: 0 5px 0 5px;
}
@@ -189,20 +190,6 @@
z-index: $zindex2;
}
&__participant-name {
color: #fff;
background-color: rgba(0,0,0,.4);
padding: 3px 7px;
border-radius: 3px;
max-width: calc(100% - 32px);
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
height: 16px;
display: inline-block;
text-align: right;
}
@media (min-width: 581px) {
&.shift-right {
&#largeVideoContainer {
@@ -294,8 +281,21 @@
#alwaysOnTop .displayname,
.videocontainer .displayname,
.videocontainer .editdisplayname {
font-weight: 100;
display: inline-block;
position: absolute;
left: 10%;
width: 80%;
top: 50%;
@include transform(translateY(-40%));
color: $participantNameColor;
text-align: center;
text-overflow: ellipsis;
font-size: 12px;
font-weight: 100;
overflow: hidden;
white-space: nowrap;
line-height: $thumbnailToolbarHeight;
z-index: $zindex2;
}
#alwaysOnTop .displayname {
@@ -390,7 +390,7 @@
}
.raisehandindicator {
background: $raiseHandBg !important;
background: $raiseHandBg;
}
.connection-indicator {
@@ -415,11 +415,6 @@
&.status-other {
background: $connectionIndicatorBg;
}
&.status-disabled {
background: transparent;
border: none
}
}
.local-video-menu-trigger,

38
css/buttons/copy.scss Normal file
View File

@@ -0,0 +1,38 @@
.copy-button {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 8px 8px 16px;
margin-top: 5px;
width: calc(100% - 24px);
height: 24px;
background: #0376DA;
border-radius: 4px;
cursor: pointer;
&:hover {
background: #278ADF;
font-weight: 600;
}
&-content {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 292px;
margin-right: 16px;
&.selected {
font-weight: 600;
}
}
&.clicked {
background: #31B76A;
}
& > div > svg > path {
fill: #fff;
}
}

View File

@@ -63,8 +63,6 @@
}
.remote-videos {
overscroll-behavior: contain;
& > div {
transition: opacity 1s;
position: absolute;

View File

@@ -15,7 +15,6 @@
box-sizing: border-box;
display: flex;
flex-direction: column;
overscroll-behavior: contain;
}
.filmstrip__videos .videocontainer {

View File

@@ -114,7 +114,6 @@
.remote-videos {
display: flex;
transition: height .3s ease-in;
overscroll-behavior: contain;
& > div {
position: absolute;

View File

@@ -33,6 +33,7 @@ $flagsImagePath: "../images/";
@import 'inlay';
@import 'reload_overlay/reload_overlay';
@import 'mini_toolbox';
@import 'buttons/copy.scss';
@import 'modals/desktop-picker/desktop-picker';
@import 'modals/device-selection/device-selection';
@import 'modals/dialog';
@@ -43,6 +44,7 @@ $flagsImagePath: "../images/";
@import 'modals/screen-share/share-audio';
@import 'modals/screen-share/share-screen-warning';
@import 'modals/speaker_stats/speaker_stats';
@import 'modals/video-quality/video-quality';
@import 'modals/virtual-background/virtual-background';
@import 'modals/local-recording/local-recording';
@import 'videolayout_default';
@@ -76,6 +78,7 @@ $flagsImagePath: "../images/";
@import 'filmstrip/tile_view_overrides';
@import 'filmstrip/vertical_filmstrip';
@import 'filmstrip/vertical_filmstrip_overrides';
@import 'labels';
@import 'unsupported-browser/main';
@import 'modals/invite/add-people';
@import 'deep-linking/main';
@@ -103,6 +106,5 @@ $flagsImagePath: "../images/";
@import 'reactions-menu';
@import 'plan-limit';
@import 'polls';
@import 'notifications';
/* Modules END */

View File

@@ -122,6 +122,9 @@
margin-bottom: 8px;
}
}
.modal-dialog-footer {
font-size: $modalButtonFontSize;
}
/**
* Styling inline dialog errors.

View File

@@ -27,10 +27,7 @@
.speaker-stats-item__status,
.speaker-stats-item__name,
.speaker-stats-item__time,
.speaker-stats-item__name_expressions_on,
.speaker-stats-item__time_expressions_on,
.speaker-stats-item__expression {
.speaker-stats-item__time {
display: inline-block;
margin: 5px 0;
vertical-align: middle;
@@ -44,35 +41,9 @@
.speaker-stats-item__time {
width: 55%;
}
.speaker-stats-item__name_expressions_on {
width: 20%;
}
.speaker-stats-item__time_expressions_on {
width: 25%;
}
.speaker-stats-item__expression {
width: 7%;
text-align: center;
}
@media(max-width: 750px) {
.speaker-stats-item__name_expressions_on {
width: 25%;
}
.speaker-stats-item__time_expressions_on {
width: 30%;
}
.speaker-stats-item__expression {
width: 10%;
}
}
.speaker-stats-item__name,
.speaker-stats-item__time,
.speaker-stats-item__name_expressions_on,
.speaker-stats-item__time_expressions_on,
.speaker-stats-item__expression {
.speaker-stats-item__time {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;

View File

@@ -0,0 +1,114 @@
.video-quality-dialog {
.video-quality-dialog-title {
margin-bottom: 10px;
}
.video-quality-dialog-contents {
align-items: center;
display: flex;
flex-direction: column;
padding: 10px;
min-width: 250px;
.video-quality-dialog-slider-container {
width: 100%;
text-align: center;
}
.video-quality-dialog-slider {
width: calc(100% - 5px);
@mixin sliderTrackStyles() {
height: 15px;
border-radius: 10px;
background: rgb(14, 22, 36);
}
&::-ms-track {
@include sliderTrackStyles();
}
&::-moz-range-track {
@include sliderTrackStyles();
}
&::-webkit-slider-runnable-track {
@include sliderTrackStyles();
}
@mixin sliderThumbStyles() {
top: 50%;
border: none;
position: relative;
opacity: 0;
}
&::-ms-thumb {
@include sliderThumbStyles();
}
&::-moz-range-thumb {
@include sliderThumbStyles();
}
&::-webkit-slider-thumb {
@include sliderThumbStyles();
}
}
.video-quality-dialog-labels {
box-sizing: border-box;
display: flex;
margin-top: 5px;
position: relative;
width: 90%;
}
.video-quality-dialog-label-container {
position: absolute;
text-align: center;
transform: translate(-50%, 0%);
&::before {
content: '';
border-radius: 50%;
left: 0;
height: 6px;
margin: 0 auto;
pointer-events: none;
position: absolute;
right: 0;
top: -16px;
width: 6px;
}
}
.video-quality-dialog-label-container.active {
color: $videoQualityActive;
font-weight: bold;
&::before {
background: $videoQualityActive;
height: 12px;
top: -19px;
width: 12px;
}
}
.video-quality-dialog-label-container:first-child {
position: relative;
}
.video-quality-dialog-label {
display: table-caption;
word-spacing: unset;
}
}
}
.modal-dialog-form {
.video-quality-dialog-title {
display: none;
}
}

View File

@@ -21,6 +21,7 @@
.prejoin-preview {
&-dropdown-btns {
padding: 8px 0;
width: calc(100% - 48px);
}
&-dropdown-btn {
@@ -58,6 +59,8 @@
background: #fff;
padding: 0;
position: absolute !important;
top: 48px !important;
transform: none !important;
width: 100%;
}
}

View File

@@ -138,6 +138,7 @@
.toolbox-content-items {
background: transparent;
border-radius: 0;
box-shadow: none;
display: flex;
justify-content: space-evenly;
@@ -170,19 +171,6 @@
}
}
// mobile phone landscape
@media (max-height: 420px) {
flex-direction: row;
div.content {
padding: 16px 16px 0 16px;
}
.con-status {
display: none;
}
}
@media (max-width: 400px) {
.content {
padding: 16px;
@@ -238,6 +226,8 @@
.avatar {
text {
fill: white;
font-size: 26px;
font-weight: 400;
}
}

View File

@@ -130,8 +130,6 @@ case "$1" in
echo -e " storage = \"memory\"" >> $PROSODY_HOST_CONFIG
echo -e " modules_enabled = { \"ping\"; }" >> $PROSODY_HOST_CONFIG
echo -e " admins = { \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\", \"jvb@$JICOFO_AUTH_DOMAIN\" }" >> $PROSODY_HOST_CONFIG
echo -e " muc_room_locking = false" >> $PROSODY_HOST_CONFIG
echo -e " muc_room_default_public_jids = true" >> $PROSODY_HOST_CONFIG
fi
# Convert the old focus component config to the new one.

View File

@@ -61,7 +61,7 @@ case "$1" in
sed -i '/^\s*--\s*"token_verification"/ s/--\s*//' $PROSODY_HOST_CONFIG
# Install luajwt
if ! luarocks install luajwtjitsi 2.0-0; then
if ! luarocks install luajwtjitsi; then
echo "Failed to install luajwtjitsi - try installing it manually"
fi

View File

@@ -52,12 +52,10 @@ VirtualHost "jitmeet.example.com"
"external_services";
"conference_duration";
"muc_lobby_rooms";
"muc_breakout_rooms";
"av_moderation";
}
c2s_require_encryption = false
lobby_muc = "lobby.jitmeet.example.com"
breakout_rooms_muc = "breakout.jitmeet.example.com"
main_muc = "conference.jitmeet.example.com"
-- muc_lobby_whitelist = { "recorder.jitmeet.example.com" } -- Here we can whitelist jibri to enter lobby enabled rooms
@@ -69,19 +67,6 @@ Component "conference.jitmeet.example.com" "muc"
"muc_domain_mapper";
"polls";
--"token_verification";
"muc_rate_limit";
}
admins = { "focusUser@auth.jitmeet.example.com" }
muc_room_locking = false
muc_room_default_public_jids = true
Component "breakout.jitmeet.example.com" "muc"
restrict_room_creation = true
storage = "memory"
modules_enabled = {
"muc_meeting_id";
"muc_domain_mapper";
--"token_verification";
}
admins = { "focusUser@auth.jitmeet.example.com" }
muc_room_locking = false

View File

@@ -0,0 +1,8 @@
var config = {
hosts: {
domain: 'jitsi.example.com',
muc: 'conference.jitsi.example.com', // FIXME: use XEP-0030
bridge: 'jitsi-videobridge.jitsi.example.com' // FIXME: use XEP-0030
},
bosh: '//jitsi.example.com/http-bind' // FIXME: use xep-0156 for that
};

View File

@@ -0,0 +1,39 @@
server {
listen 80;
server_name jitsi.example.com;
# set the root
root /srv/jitsi.example.com;
index index.html;
location ~ ^/([a-zA-Z0-9=\?]+)$ {
rewrite ^/(.*)$ / break;
}
location / {
ssi on;
}
gzip on;
gzip_types text/plain text/css application/javascript application/json image/x-icon application/octet-stream application/wasm;
gzip_vary on;
gzip_proxied no-cache no-store private expired auth;
gzip_min_length 512;
# BOSH
location /http-bind {
proxy_pass http://localhost:5280/http-bind;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
}
# xmpp websockets
location /xmpp-websocket {
proxy_pass http://localhost:5280/xmpp-websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
tcp_nodelay on;
}
}

View File

@@ -0,0 +1,14 @@
var subdomain = "<!--# echo var="subdomain" default="" -->";
if (subdomain) {
subdomain = subdomain.substr(0,subdomain.length-1).split('.').join('_').toLowerCase() + '.';
}
var config = {
hosts: {
domain: 'jitsi.example.com',
muc: 'conference.'+subdomain+'jitsi.example.com', // FIXME: use XEP-0030
focus: 'focus.jitsi.example.com',
},
bosh: '//jitsi.example.com/http-bind', // FIXME: use xep-0156 for that
websocket: 'wss://jitsi.example.com/xmpp-websocket'
};

View File

@@ -0,0 +1,76 @@
server {
listen 80;
server_name jitsi.example.com;
# set the root
root /srv/jitsi.example.com;
# ssi on with javascript for multidomain variables in config.js
ssi on;
ssi_types application/x-javascript application/javascript;
index index.html;
set $prefix "";
# BOSH
location /http-bind {
proxy_pass http://localhost:5280/http-bind;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
}
# xmpp websockets
location /xmpp-websocket {
proxy_pass http://localhost:5280/xmpp-websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
tcp_nodelay on;
}
gzip on;
gzip_types text/plain text/css application/javascript application/json image/x-icon application/octet-stream application/wasm;
gzip_vary on;
gzip_proxied no-cache no-store private expired auth;
gzip_min_length 512;
location ~ ^/([^/?&:'"]+)$ {
try_files $uri @root_path;
}
location @root_path {
rewrite ^/(.*)$ / break;
}
location ~ ^/([^/?&:'"]+)/config.js$
{
set $subdomain "$1.";
set $subdir "$1/";
alias /etc/jitsi/meet/{{jitsi_meet_domain_name}}-config.js;
}
# Anything that didn't match above, and isn't a real file, assume it's a room name and redirect to /
location ~ ^/([^/?&:'"]+)/(.*)$ {
set $subdomain "$1.";
set $subdir "$1/";
rewrite ^/([^/?&:'"]+)/(.*)$ /$2;
}
# BOSH for subdomains
location ~ ^/([^/?&:'"]+)/http-bind {
set $subdomain "$1.";
set $subdir "$1/";
set $prefix "$1";
rewrite ^/(.*)$ /http-bind;
}
# websockets for subdomains
location ~ ^/([^/?&:'"]+)/xmpp-websocket {
set $subdomain "$1.";
set $subdir "$1/";
set $prefix "$1";
rewrite ^/(.*)$ /xmpp-websocket;
}
}

View File

@@ -0,0 +1,218 @@
-- Prosody XMPP Server Configuration
--
-- Information on configuring Prosody can be found on our
-- website at http://prosody.im/doc/configure
--
-- Tip: You can check that the syntax of this file is correct
-- when you have finished by running: prosodyctl check config
-- If there are any errors, it will let you know what and where
-- they are, otherwise it will keep quiet.
--
-- Good luck, and happy Jabbering!
---------- Server-wide settings ----------
-- Settings in this section apply to the whole server and are the default settings
-- for any virtual hosts
-- This is a (by default, empty) list of accounts that are admins
-- for the server. Note that you must create the accounts separately
-- (see http://prosody.im/doc/creating_accounts for info)
-- Example: admins = { "user1@example.com", "user2@example.net" }
admins = { }
daemonize = true
cross_domain_bosh = true;
component_ports = { 5347 }
--component_interface = "192.168.0.10"
-- Enable use of libevent for better performance under high load
-- For more information see: http://prosody.im/doc/libevent
--use_libevent = true
-- This is the list of modules Prosody will load on startup.
-- It looks for mod_modulename.lua in the plugins folder, so make sure that exists too.
-- Documentation on modules can be found at: http://prosody.im/doc/modules
modules_enabled = {
-- Generally required
"roster"; -- Allow users to have a roster. Recommended ;)
"saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
"tls"; -- Add support for secure TLS on c2s/s2s connections
"dialback"; -- s2s dialback support
"disco"; -- Service discovery
"posix"; -- POSIX functionality, sends server to background, enables syslog, etc.
-- Not essential, but recommended
"private"; -- Private XML storage (for room bookmarks, etc.)
"vcard"; -- Allow users to set vCards
-- These are commented by default as they have a performance impact
--"privacy"; -- Support privacy lists
"compression"; -- Stream compression (requires the lua-zlib package installed)
-- Nice to have
"version"; -- Replies to server version requests
"uptime"; -- Report how long server has been running
"time"; -- Let others know the time here on this server
"ping"; -- Replies to XMPP pings with pongs
"pep"; -- Enables users to publish their mood, activity, playing music and more
"register"; -- Allow users to register on this server using a client and change passwords
-- Admin interfaces
"admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
--"admin_telnet"; -- Opens telnet console interface on localhost port 5582
-- HTTP modules
"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
--"http_files"; -- Serve static files from a directory over HTTP
-- Other specific functionality
--"groups"; -- Shared roster support
--"announce"; -- Send announcement to all online users
--"welcome"; -- Welcome users who register accounts
--"watchregistrations"; -- Alert admins of registrations
--"motd"; -- Send a message to users when they log in
--"legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
-- jitsi
"smacks";
"carbons";
"mam";
"lastactivity";
"offline";
"pubsub";
"adhoc";
"websocket";
"http_altconnect";
}
-- domain mapper options, must at least have domain base set to use the mapper
muc_mapper_domain_base = "jitsi.example.com";
-- These modules are auto-loaded, but should you want
-- to disable them then uncomment them here:
modules_disabled = {
--"offline"; -- Store offline messages
--"c2s"; -- Handle client connections
--"s2s"; -- Handle server-to-server connections
}
-- Disable account creation by default, for security
-- For more information see http://prosody.im/doc/creating_accounts
allow_registration = false
-- These are the SSL/TLS-related settings. If you don't want
-- to use SSL/TLS, you may comment or remove this
ssl = {
key = "/etc/prosody/certs/localhost.key";
certificate = "/etc/prosody/certs/localhost.crt";
}
-- Force clients to use encrypted connections? This option will
-- prevent clients from authenticating unless they are using encryption.
--c2s_require_encryption = true
-- Force certificate authentication for server-to-server connections?
-- This provides ideal security, but requires servers you communicate
-- with to support encryption AND present valid, trusted certificates.
-- NOTE: Your version of LuaSec must support certificate verification!
-- For more information see http://prosody.im/doc/s2s#security
--s2s_secure_auth = false
-- Many servers don't support encryption or have invalid or self-signed
-- certificates. You can list domains here that will not be required to
-- authenticate using certificates. They will be authenticated using DNS.
--s2s_insecure_domains = { "gmail.com" }
-- Even if you leave s2s_secure_auth disabled, you can still require valid
-- certificates for some domains by specifying a list here.
--s2s_secure_domains = { "jabber.org" }
-- Required for init scripts and prosodyctl
pidfile = "/var/run/prosody/prosody.pid"
-- Select the authentication backend to use. The 'internal' providers
-- use Prosody's configured data storage to store the authentication data.
-- To allow Prosody to offer secure authentication mechanisms to clients, the
-- default provider stores passwords in plaintext. If you do not trust your
-- server please see http://prosody.im/doc/modules/mod_auth_internal_hashed
-- for information about using the hashed backend.
authentication = "internal_hashed"
-- Select the storage backend to use. By default Prosody uses flat files
-- in its configured data directory, but it also supports more backends
-- through modules. An "sql" backend is included by default, but requires
-- additional dependencies. See http://prosody.im/doc/storage for more info.
--storage = "sql" -- Default is "internal"
-- For the "sql" backend, you can uncomment *one* of the below to configure:
--sql = { driver = "SQLite3", database = "prosody.sqlite" } -- Default. 'database' is the filename.
--sql = { driver = "MySQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" }
--sql = { driver = "PostgreSQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" }
-- Logging configuration
-- For advanced logging see http://prosody.im/doc/logging
log = {
info = "/var/log/prosody/prosody.log"; -- Change 'info' to 'debug' for verbose logging
error = "/var/log/prosody/prosody.err";
"*syslog";
}
----------- Virtual hosts -----------
-- You need to add a VirtualHost entry for each domain you wish Prosody to serve.
-- Settings under each VirtualHost entry apply *only* to that host.
--VirtualHost "localhost"
VirtualHost "jitsi.example.com"
-- enabled = false -- Remove this line to enable this host
authentication = "anonymous"
-- Assign this host a certificate for TLS, otherwise it would use the one
-- set in the global section (if any).
-- Note that old-style SSL on port 5223 only supports one certificate, and will always
-- use the global one.
ssl = {
key = "/var/lib/prosody/jitsi.example.com.key";
certificate = "/var/lib/prosody/jitsi.example.com.crt";
}
c2s_require_encryption = false
VirtualHost "auth.jitsi.example.com"
ssl = {
key = "/var/lib/prosody/auth.jitsi.example.com.key";
certificate = "/var/lib/prosody/auth.jitsi.example.com.crt";
}
authentication = "internal_hashed"
------ Components ------
-- You can specify components to add hosts that provide special services,
-- like multi-user conferences, and transports.
-- For more information on components, see http://prosody.im/doc/components
---Set up a MUC (multi-user chat) room server on conference.example.com:
--Component "conference.example.com" "muc"
-- Set up a SOCKS5 bytestream proxy for server-proxied file transfers:
--Component "proxy.example.com" "proxy65"
---Set up an external component (default component port is 5347)
--
-- External components allow adding various services, such as gateways/
-- transports to other networks like ICQ, MSN and Yahoo. For more info
-- see: http://prosody.im/doc/components#adding_an_external_component
--
--Component "gateway.example.com"
-- component_secret = "password"
Component "conference.jitsi.example.com" "muc"
modules_enabled = { "muc_domain_mapper" }
Component "jitsi-videobridge.jitsi.example.com"
component_secret = "IfGaish6"

View File

@@ -0,0 +1,54 @@
user www-data;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
# multi_accept on;
}
http {
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
tcp_nopush on;
types_hash_max_size 2048;
server_names_hash_bucket_size 64;
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
# mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/NginxImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
# }

View File

@@ -0,0 +1,214 @@
-- Prosody XMPP Server Configuration
--
-- Information on configuring Prosody can be found on our
-- website at http://prosody.im/doc/configure
--
-- Tip: You can check that the syntax of this file is correct
-- when you have finished by running: prosodyctl check config
-- If there are any errors, it will let you know what and where
-- they are, otherwise it will keep quiet.
--
-- Good luck, and happy Jabbering!
---------- Server-wide settings ----------
-- Settings in this section apply to the whole server and are the default settings
-- for any virtual hosts
-- This is a (by default, empty) list of accounts that are admins
-- for the server. Note that you must create the accounts separately
-- (see http://prosody.im/doc/creating_accounts for info)
-- Example: admins = { "user1@example.com", "user2@example.net" }
admins = { }
daemonize = true
cross_domain_bosh = true;
component_ports = { 5347 }
--component_interface = "192.168.0.10"
-- Enable use of libevent for better performance under high load
-- For more information see: http://prosody.im/doc/libevent
--use_libevent = true
-- This is the list of modules Prosody will load on startup.
-- It looks for mod_modulename.lua in the plugins folder, so make sure that exists too.
-- Documentation on modules can be found at: http://prosody.im/doc/modules
modules_enabled = {
-- Generally required
"roster"; -- Allow users to have a roster. Recommended ;)
"saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
"tls"; -- Add support for secure TLS on c2s/s2s connections
"dialback"; -- s2s dialback support
"disco"; -- Service discovery
"posix"; -- POSIX functionality, sends server to background, enables syslog, etc.
-- Not essential, but recommended
"private"; -- Private XML storage (for room bookmarks, etc.)
"vcard"; -- Allow users to set vCards
-- These are commented by default as they have a performance impact
--"privacy"; -- Support privacy lists
"compression"; -- Stream compression (requires the lua-zlib package installed)
-- Nice to have
"version"; -- Replies to server version requests
"uptime"; -- Report how long server has been running
"time"; -- Let others know the time here on this server
"ping"; -- Replies to XMPP pings with pongs
"pep"; -- Enables users to publish their mood, activity, playing music and more
"register"; -- Allow users to register on this server using a client and change passwords
-- Admin interfaces
"admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
--"admin_telnet"; -- Opens telnet console interface on localhost port 5582
-- HTTP modules
"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
--"http_files"; -- Serve static files from a directory over HTTP
-- Other specific functionality
--"groups"; -- Shared roster support
--"announce"; -- Send announcement to all online users
--"welcome"; -- Welcome users who register accounts
--"watchregistrations"; -- Alert admins of registrations
--"motd"; -- Send a message to users when they log in
--"legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
-- jitsi
"smacks";
"carbons";
"mam";
"lastactivity";
"offline";
"pubsub";
"adhoc";
"websocket";
"http_altconnect";
}
-- These modules are auto-loaded, but should you want
-- to disable them then uncomment them here:
modules_disabled = {
--"offline"; -- Store offline messages
--"c2s"; -- Handle client connections
--"s2s"; -- Handle server-to-server connections
}
-- Disable account creation by default, for security
-- For more information see http://prosody.im/doc/creating_accounts
allow_registration = false
-- These are the SSL/TLS-related settings. If you don't want
-- to use SSL/TLS, you may comment or remove this
ssl = {
key = "/etc/prosody/certs/localhost.key";
certificate = "/etc/prosody/certs/localhost.crt";
}
-- Force clients to use encrypted connections? This option will
-- prevent clients from authenticating unless they are using encryption.
--c2s_require_encryption = true
-- Force certificate authentication for server-to-server connections?
-- This provides ideal security, but requires servers you communicate
-- with to support encryption AND present valid, trusted certificates.
-- NOTE: Your version of LuaSec must support certificate verification!
-- For more information see http://prosody.im/doc/s2s#security
--s2s_secure_auth = false
-- Many servers don't support encryption or have invalid or self-signed
-- certificates. You can list domains here that will not be required to
-- authenticate using certificates. They will be authenticated using DNS.
--s2s_insecure_domains = { "gmail.com" }
-- Even if you leave s2s_secure_auth disabled, you can still require valid
-- certificates for some domains by specifying a list here.
--s2s_secure_domains = { "jabber.org" }
-- Required for init scripts and prosodyctl
pidfile = "/var/run/prosody/prosody.pid"
-- Select the authentication backend to use. The 'internal' providers
-- use Prosody's configured data storage to store the authentication data.
-- To allow Prosody to offer secure authentication mechanisms to clients, the
-- default provider stores passwords in plaintext. If you do not trust your
-- server please see http://prosody.im/doc/modules/mod_auth_internal_hashed
-- for information about using the hashed backend.
authentication = "internal_hashed"
-- Select the storage backend to use. By default Prosody uses flat files
-- in its configured data directory, but it also supports more backends
-- through modules. An "sql" backend is included by default, but requires
-- additional dependencies. See http://prosody.im/doc/storage for more info.
--storage = "sql" -- Default is "internal"
-- For the "sql" backend, you can uncomment *one* of the below to configure:
--sql = { driver = "SQLite3", database = "prosody.sqlite" } -- Default. 'database' is the filename.
--sql = { driver = "MySQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" }
--sql = { driver = "PostgreSQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" }
-- Logging configuration
-- For advanced logging see http://prosody.im/doc/logging
log = {
info = "/var/log/prosody/prosody.log"; -- Change 'info' to 'debug' for verbose logging
error = "/var/log/prosody/prosody.err";
"*syslog";
}
----------- Virtual hosts -----------
-- You need to add a VirtualHost entry for each domain you wish Prosody to serve.
-- Settings under each VirtualHost entry apply *only* to that host.
--VirtualHost "localhost"
VirtualHost "jitsi.example.com"
-- enabled = false -- Remove this line to enable this host
authentication = "anonymous"
-- Assign this host a certificate for TLS, otherwise it would use the one
-- set in the global section (if any).
-- Note that old-style SSL on port 5223 only supports one certificate, and will always
-- use the global one.
ssl = {
key = "/var/lib/prosody/jitsi.example.com.key";
certificate = "/var/lib/prosody/jitsi.example.com.crt";
}
c2s_require_encryption = false
VirtualHost "auth.jitsi.example.com"
ssl = {
key = "/var/lib/prosody/auth.jitsi.example.com.key";
certificate = "/var/lib/prosody/auth.jitsi.example.com.crt";
}
authentication = "internal_hashed"
------ Components ------
-- You can specify components to add hosts that provide special services,
-- like multi-user conferences, and transports.
-- For more information on components, see http://prosody.im/doc/components
---Set up a MUC (multi-user chat) room server on conference.example.com:
--Component "conference.example.com" "muc"
-- Set up a SOCKS5 bytestream proxy for server-proxied file transfers:
--Component "proxy.example.com" "proxy65"
---Set up an external component (default component port is 5347)
--
-- External components allow adding various services, such as gateways/
-- transports to other networks like ICQ, MSN and Yahoo. For more info
-- see: http://prosody.im/doc/components#adding_an_external_component
--
--Component "gateway.example.com"
-- component_secret = "password"
Component "conference.jitsi.example.com" "muc"
Component "jitsi-videobridge.jitsi.example.com"
component_secret = "IfGaish6"

View File

@@ -0,0 +1,32 @@
# Jitsi Conference Focus settings
# sets the host name of the XMPP server
JICOFO_HOST=localhost
# sets the XMPP domain (default: none)
JICOFO_HOSTNAME=meet.example.com
# sets the secret used to authenticate as an XMPP component
JICOFO_SECRET=$JICOFO_SECRET
# sets the port to use for the XMPP component connection
JICOFO_PORT=5347
# sets the XMPP domain name to use for XMPP user logins
JICOFO_AUTH_DOMAIN=auth.meet.example.com
# sets the username to use for XMPP user logins
JICOFO_AUTH_USER=focus
# sets the password to use for XMPP user logins
JICOFO_AUTH_PASSWORD=$JICOFO_PASSWORD
# extra options to pass to the jicofo daemon
JICOFO_OPTS=""
# adds java system props that are passed to jicofo (default are for home and logging config file)
JAVA_SYS_PROPS=" \
-Dnet.java.sip.communicator.SC_HOME_DIR_LOCATION=/etc/jitsi \
-Dnet.java.sip.communicator.SC_HOME_DIR_NAME=jicofo \
-Dnet.java.sip.communicator.SC_LOG_DIR_LOCATION=/var/log/jitsi \
-Djava.util.logging.config.file=/etc/jitsi/jicofo/logging.properties \
"

View File

@@ -0,0 +1,6 @@
org.jitsi.jicofo.BRIDGE_MUC=JvbBrewery@internal.auth.meet.example.com
org.jitsi.jicofo.ALWAYS_TRUST_MODE_ENABLED=true
org.jitsi.jicofo.jibri.BREWERY=JibriBrewery@internal.auth.meet.example.com
org.jitsi.jicofo.jibri.PENDING_TIMEOUT=90

View File

@@ -0,0 +1,87 @@
plugin_paths = { "/usr/share/jitsi-meet/prosody-plugins/" }
-- domain mapper options, must at least have domain base set to use the mapper
muc_mapper_domain_base = "meet.example.com";
turncredentials_secret = "turncredentials_secret_test";
turncredentials = {
{ type = "stun", host = "meet.example.com", port = "443" },
{ type = "turn", host = "meet.example.com", port = "443", transport = "udp" },
{ type = "turns", host = "meet.example.com", port = "443", transport = "tcp" }
};
cross_domain_bosh = false;
consider_bosh_secure = true;
VirtualHost "meet.example.com"
-- enabled = false -- Remove this line to enable this host
authentication = "anonymous"
-- Properties below are modified by jitsi-meet-tokens package config
-- and authentication above is switched to "token"
--app_id="example_app_id"
--app_secret="example_app_secret"
-- Assign this host a certificate for TLS, otherwise it would use the one
-- set in the global section (if any).
-- Note that old-style SSL on port 5223 only supports one certificate, and will always
-- use the global one.
ssl = {
key = "/etc/prosody/certs/meet.example.com.key";
certificate = "/etc/prosody/certs/meet.example.com.crt";
}
speakerstats_component = "speakerstats.meet.example.com"
conference_duration_component = "conferenceduration.meet.example.com"
-- we need bosh
modules_enabled = {
"bosh";
"pubsub";
"ping"; -- Enable mod_ping
"speakerstats";
"turncredentials";
"conference_duration";
}
c2s_require_encryption = false
Component "conference.meet.example.com" "muc"
storage = "memory"
modules_enabled = {
"muc_meeting_id";
"muc_domain_mapper";
--"token_verification";
}
admins = { "focus@auth.meet.example.com" }
muc_room_locking = false
muc_room_default_public_jids = true
-- internal muc component
-- Note: This is also used from jibris
Component "internal.auth.meet.example.com" "muc"
storage = "memory"
modules_enabled = {
"ping";
}
admins = { "focus@auth.meet.example.com", "jvb@auth.meet.example.com" }
VirtualHost "auth.meet.example.com"
ssl = {
key = "/etc/prosody/certs/auth.meet.example.com.key";
certificate = "/etc/prosody/certs/auth.meet.example.com.crt";
}
authentication = "internal_hashed"
Component "focus.meet.example.com"
component_secret = "jicofo_secret_test"
Component "speakerstats.meet.example.com" "speakerstats_component"
muc_component = "conference.meet.example.com"
Component "conferenceduration.meet.example.com" "conference_duration_component"
muc_component = "conference.meet.example.com"
-- for Jibri
VirtualHost "recorder.meet.example.com"
modules_enabled = {
"ping";
}
authentication = "internal_hashed"
c2s_require_encryption = false

View File

@@ -0,0 +1,112 @@
-- Prosody XMPP Server Configuration
---------- Server-wide settings ----------
-- Settings in this section apply to the whole server and are the default settings
-- for any virtual hosts
admins = { }
network_backend = "epoll"
-- This is the list of modules Prosody will load on startup.
-- It looks for mod_modulename.lua in the plugins folder, so make sure that exists too.
-- Documentation for bundled modules can be found at: https://prosody.im/doc/modules
modules_enabled = {
-- Generally required
"roster"; -- Allow users to have a roster. Recommended ;)
"saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
"tls"; -- Add support for secure TLS on c2s/s2s connections
"dialback"; -- s2s dialback support
"disco"; -- Service discovery
-- Not essential, but recommended
"carbons"; -- Keep multiple clients in sync
"pep"; -- Enables users to publish their avatar, mood, activity, playing music and more
"private"; -- Private XML storage (for room bookmarks, etc.)
"blocklist"; -- Allow users to block communications with other users
"vcard4"; -- User profiles (stored in PEP)
"vcard_legacy"; -- Conversion between legacy vCard and PEP Avatar, vcard
-- Nice to have
"version"; -- Replies to server version requests
"uptime"; -- Report how long server has been running
"time"; -- Let others know the time here on this server
"ping"; -- Replies to XMPP pings with pongs
"register"; -- Allow users to register on this server using a client and change passwords
--"mam"; -- Store messages in an archive and allow users to access it
--"csi_simple"; -- Simple Mobile optimizations
-- Admin interfaces
"admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
--"admin_telnet"; -- Opens telnet console interface on localhost port 5582
-- HTTP modules
--"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
--"websocket"; -- XMPP over WebSockets
--"http_files"; -- Serve static files from a directory over HTTP
-- Other specific functionality
--"limits"; -- Enable bandwidth limiting for XMPP connections
--"groups"; -- Shared roster support
--"server_contact_info"; -- Publish contact information for this service
--"announce"; -- Send announcement to all online users
--"welcome"; -- Welcome users who register accounts
--"watchregistrations"; -- Alert admins of registrations
--"motd"; -- Send a message to users when they log in
--"legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
--"proxy65"; -- Enables a file transfer proxy service which clients behind NAT can use
}
-- These modules are auto-loaded, but should you want
-- to disable them then uncomment them here:
modules_disabled = {
--"offline"; -- Store offline messages
--"c2s"; -- Handle client connections
--"s2s"; -- Handle server-to-server connections
--"posix"; -- POSIX functionality, sends server to background, enables syslog, etc.
}
-- Disable account creation by default, for security
-- For more information see https://prosody.im/doc/creating_accounts
allow_registration = false
-- Force clients to use encrypted connections? This option will
-- prevent clients from authenticating unless they are using encryption.
c2s_require_encryption = true
-- Force servers to use encrypted connections? This option will
-- prevent servers from authenticating unless they are using encryption.
s2s_require_encryption = true
-- Force certificate authentication for server-to-server connections?
s2s_secure_auth = false
-- Required for init scripts and prosodyctl
pidfile = "/var/run/prosody/prosody.pid"
-- Select the authentication backend to use. The 'internal' providers
-- use Prosody's configured data storage to store the authentication data.
authentication = "internal_hashed"
archive_expires_after = "1w" -- Remove archived messages after 1 week
-- Logging configuration
-- For advanced logging see https://prosody.im/doc/logging
log = {
info = "/var/log/prosody/prosody.log"; -- Change 'info' to 'debug' for verbose logging
error = "/var/log/prosody/prosody.err";
--"*syslog"; -- Uncomment this for logging to syslog
--"*console"; -- Log to the console, useful for debugging with daemonize=false
}
-- Location of directory to find certificates in (relative to main config file):
certificates = "certs"
VirtualHost "localhost"
Include "conf.d/*.cfg.lua"

View File

@@ -0,0 +1,24 @@
# Jitsi Videobridge settings
# sets the XMPP domain (default: none)
JVB_HOSTNAME=meet.example.com
# sets the hostname of the XMPP server (default: domain if set, localhost otherwise)
JVB_HOST=
# sets the port of the XMPP server (default: 5275)
JVB_PORT=5347
# sets the shared secret used to authenticate to the XMPP server
JVB_SECRET=$VP_SECRET
# extra options to pass to the JVB daemon
JVB_OPTS="--apis=rest,"
# adds java system props that are passed to jvb (default are for home and logging config file)
JAVA_SYS_PROPS=" \
-Dnet.java.sip.communicator.SC_HOME_DIR_LOCATION=/etc/jitsi \
-Dnet.java.sip.communicator.SC_HOME_DIR_NAME=videobridge \
-Dnet.java.sip.communicator.SC_LOG_DIR_LOCATION=/var/log/jitsi \
-Djava.util.logging.config.file=/etc/jitsi/videobridge/logging.properties \
"

View File

@@ -0,0 +1,19 @@
org.ice4j.ice.harvest.DISABLE_AWS_HARVESTER=true
org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES=meet-jit-si-turnrelay.jitsi.net:443
org.jitsi.jicofo.ALWAYS_TRUST_MODE_ENABLED=true
org.jitsi.videobridge.ENABLE_REST_SHUTDOWN=true
# Enable broadcasting stats/presence in a MUC
org.jitsi.videobridge.ENABLE_STATISTICS=true
org.jitsi.videobridge.STATISTICS_TRANSPORT=muc,colibri,rest
org.jitsi.videobridge.STATISTICS_INTERVAL=5000
org.jitsi.videobridge.xmpp.user.shard-1.HOSTNAME=meet.example.com
org.jitsi.videobridge.xmpp.user.shard-1.DOMAIN=auth.meet.example.com
org.jitsi.videobridge.xmpp.user.shard-1.USERNAME=jvb
org.jitsi.videobridge.xmpp.user.shard-1.PASSWORD=$VB_PASSWORD
org.jitsi.videobridge.xmpp.user.shard-1.MUC_JIDS=JvbBrewery@internal.auth.meet.example.com
org.jitsi.videobridge.xmpp.user.shard-1.MUC_NICKNAME=$NICKNAME_OF_VB
org.jitsi.videobridge.xmpp.user.shard-1.DISABLE_CERTIFICATE_VERIFICATION=true

102
flow-typed/npm/uuid_v3.x.x.js vendored Normal file
View File

@@ -0,0 +1,102 @@
// flow-typed signature: 609c1622fc97de96d59519934aa5ce87
// flow-typed version: c6154227d1/uuid_v3.x.x/flow_>=v0.32.x <=v0.103.x
declare module "uuid" {
declare class uuid {
static (
options?: {|
random?: number[],
rng?: () => number[] | Buffer
|},
buffer?: number[] | Buffer,
offset?: number
): string,
static v1(
options?: {|
node?: number[],
clockseq?: number,
msecs?: number | Date,
nsecs?: number
|},
buffer?: number[] | Buffer,
offset?: number
): string,
static v4(
options?: {|
random?: number[],
rng?: () => number[] | Buffer
|},
buffer?: number[] | Buffer,
offset?: number
): string
}
declare module.exports: Class<uuid>;
}
declare module "uuid/v1" {
declare class v1 {
static (
options?: {|
node?: number[],
clockseq?: number,
msecs?: number | Date,
nsecs?: number
|},
buffer?: number[] | Buffer,
offset?: number
): string
}
declare module.exports: Class<v1>;
}
declare module "uuid/v3" {
declare class v3 {
static (
name?: string | number[],
namespace?: string | number[],
buffer?: number[] | Buffer,
offset?: number
): string,
static name: string,
static DNS: string,
static URL: string
}
declare module.exports: Class<v3>;
}
declare module "uuid/v4" {
declare class v4 {
static (
options?: {|
random?: number[],
rng?: () => number[] | Buffer
|},
buffer?: number[] | Buffer,
offset?: number
): string
}
declare module.exports: Class<v4>;
}
declare module "uuid/v5" {
declare class v5 {
static (
name?: string | number[],
namespace?: string | number[],
buffer?: number[] | Buffer,
offset?: number
): string,
static name: string,
static DNS: string,
static URL: string
}
declare module.exports: Class<v5>;
}

View File

@@ -1,71 +0,0 @@
declare module 'uuid' {
// v1 (Timestamp)
declare type V1Options = {|
node?: $ReadOnlyArray<number>,
clockseq?: number,
msecs?: number,
nsecs?: number,
random?: $ReadOnlyArray<number>,
rng?: () => $ReadOnlyArray<number>,
|};
declare export function v1(options?: V1Options): string;
declare export function v1(
options: V1Options | null,
buffer: Array<number>,
offset?: number
): Array<number>;
// v3 (Namespace)
declare function v3Impl(
name: string | $ReadOnlyArray<number>,
namespace: string | $ReadOnlyArray<number>
): string;
declare function v3Impl(
name: string | $ReadOnlyArray<number>,
namespace: string | $ReadOnlyArray<number>,
buffer: Array<number>,
offset?: number
): Array<number>;
declare export var v3: {|
[[call]]: typeof v3Impl,
DNS: string,
URL: string,
|};
// v4 (Random)
declare type V4Options = {|
random?: $ReadOnlyArray<number>,
rng?: () => $ReadOnlyArray<number>,
|};
declare export function v4(options?: V4Options): string;
declare export function v4(
options: V4Options | null,
buffer: Array<number>,
offset?: number
): Array<number>;
// v5 (Namespace)
declare function v5Impl(
name: string | $ReadOnlyArray<number>,
namespace: string | $ReadOnlyArray<number>
): string;
declare function v5Impl(
name: string | $ReadOnlyArray<number>,
namespace: string | $ReadOnlyArray<number>,
buffer: Array<number>,
offset?: number
): Array<number>;
declare export var v5: {|
[[call]]: typeof v5Impl,
DNS: string,
URL: string,
|};
}

View File

@@ -26,6 +26,11 @@ var interfaceConfig = {
CLOSE_PAGE_GUEST_HINT: false, // A html text to be shown to guests on the close page, false disables it
// Connection indicators (
// CONNECTION_INDICATOR_AUTO_HIDE_ENABLED,
// CONNECTION_INDICATOR_AUTO_HIDE_TIMEOUT,
// CONNECTION_INDICATOR_DISABLED) got moved to config.js.
DEFAULT_BACKGROUND: '#474747',
DEFAULT_LOCAL_DISPLAY_NAME: 'me',
DEFAULT_LOGO_URL: 'images/watermark.svg',
@@ -34,6 +39,9 @@ var interfaceConfig = {
DISABLE_DOMINANT_SPEAKER_INDICATOR: false,
// Deprecated. Please use disableModeratorIndicator from config.js
// DISABLE_FOCUS_INDICATOR: false,
/**
* If true, notifications regarding joining/leaving are no longer displayed.
*/
@@ -89,6 +97,7 @@ var interfaceConfig = {
*/
HIDE_INVITE_MORE_HEADER: false,
INITIAL_TOOLBAR_TIMEOUT: 20000,
JITSI_WATERMARK_LINK: 'https://jitsi.org',
LANG_DETECTION: true, // Allow i18n to detect the system language
@@ -174,6 +183,16 @@ var interfaceConfig = {
*/
SUPPORT_URL: 'https://community.jitsi.org/',
TOOLBAR_ALWAYS_VISIBLE: false,
/**
* DEPRECATED!
* This config was moved to config.js as `toolbarButtons`.
*/
// TOOLBAR_BUTTONS: [],
TOOLBAR_TIMEOUT: 4000,
// Browsers, in addition to those which do not fully support WebRTC, that
// are not supported and should show the unsupported browser page.
UNSUPPORTED_BROWSERS: [],
@@ -238,28 +257,6 @@ var interfaceConfig = {
PHONE_NUMBER_REGEX
*/
// -----------------DEPRECATED CONFIGS BELOW THIS LINE-----------------------------
// Connection indicators (
// CONNECTION_INDICATOR_AUTO_HIDE_ENABLED,
// CONNECTION_INDICATOR_AUTO_HIDE_TIMEOUT,
// CONNECTION_INDICATOR_DISABLED) got moved to config.js.
// Please use disableModeratorIndicator from config.js
// DISABLE_FOCUS_INDICATOR: false,
// Moved to config.js as `toolbarConfig.initialTimeout`.
// INITIAL_TOOLBAR_TIMEOUT: 20000,
// Moved to config.js as `toolbarConfig.alwaysVisible`.
// TOOLBAR_ALWAYS_VISIBLE: false,
// This config was moved to config.js as `toolbarButtons`.
// TOOLBAR_BUTTONS: [],
// Moved to config.js as `toolbarConfig.timeout`.
// TOOLBAR_TIMEOUT: 4000,
// Allow all above example options to include a trailing comma and
// prevent fear when commenting out the last value.
// eslint-disable-next-line sort-keys

View File

@@ -1,4 +1,4 @@
platform :ios, '12.0'
platform :ios, '11.0'
workspace 'jitsi-meet'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
install! 'cocoapods', :deterministic_uuids => false
@@ -57,7 +57,6 @@ target 'JitsiMeetSDK' do
pod 'amplitude-react-native', :path => '../node_modules/@amplitude/react-native'
pod 'react-native-background-timer', :path => '../node_modules/react-native-background-timer'
pod 'react-native-calendar-events', :path => '../node_modules/react-native-calendar-events'
pod 'react-native-get-random-values', :path => '../node_modules/react-native-get-random-values'
pod 'react-native-keep-awake', :path => '../node_modules/react-native-keep-awake'
pod 'react-native-netinfo', :path => '../node_modules/@react-native-community/netinfo'
pod 'react-native-performance', :path => '../node_modules/react-native-performance/ios'
@@ -73,11 +72,6 @@ target 'JitsiMeetSDK' do
pod 'RNSVG', :path => '../node_modules/react-native-svg'
pod 'RNWatch', :path => '../node_modules/react-native-watch-connectivity'
pod 'RNDefaultPreference', :path => '../node_modules/react-native-default-preference'
pod 'RNGestureHandler', :path => '../node_modules/react-native-gesture-handler'
pod 'RNReanimated', :path => '../node_modules/react-native-reanimated'
pod 'RNScreens', :path => '../node_modules/react-native-screens'
pod 'react-native-safe-area-context', :path => '../node_modules/react-native-safe-area-context'
pod 'RNCMaskedView', :path => '../node_modules/@react-native-masked-view/masked-view'
# Native pod dependencies
#
@@ -93,7 +87,7 @@ post_install do |installer|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'YES'
config.build_settings['SUPPORTS_MACCATALYST'] = 'NO'
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
end
end
end

View File

@@ -109,7 +109,7 @@ PODS:
- GTMAppAuth (1.2.2):
- AppAuth/Core (~> 1.4)
- GTMSessionFetcher/Core (~> 1.5)
- GTMSessionFetcher/Core (1.7.0)
- GTMSessionFetcher/Core (1.6.1)
- nanopb (1.30906.0):
- nanopb/decode (= 1.30906.0)
- nanopb/encode (= 1.30906.0)
@@ -284,16 +284,12 @@ PODS:
- React
- react-native-calendar-events (2.0.0):
- React
- react-native-get-random-values (1.7.0):
- React-Core
- react-native-keep-awake (4.0.0):
- React
- react-native-netinfo (4.1.5):
- React
- react-native-performance (2.0.0):
- React-Core
- react-native-safe-area-context (3.3.2):
- React-Core
- react-native-slider (3.0.3):
- React
- react-native-splash-screen (3.2.0):
@@ -363,21 +359,13 @@ PODS:
- ReactCommon/turbomodule/core (= 0.61.5-jitsi.2)
- RNCAsyncStorage (1.15.5):
- React-Core
- RNCMaskedView (0.2.6):
- React-Core
- RNDefaultPreference (1.4.2):
- React
- RNDeviceInfo (8.0.0):
- React-Core
- RNGestureHandler (1.10.3):
- React-Core
- RNGoogleSignin (3.0.1):
- GoogleSignIn (~> 5.0.0)
- React
- RNReanimated (1.13.3):
- React-Core
- RNScreens (2.18.1):
- React-Core
- RNSound (0.11.0):
- React
- RNSound/Core (= 0.11.0)
@@ -414,11 +402,9 @@ DEPENDENCIES:
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
- react-native-background-timer (from `../node_modules/react-native-background-timer`)
- react-native-calendar-events (from `../node_modules/react-native-calendar-events`)
- react-native-get-random-values (from `../node_modules/react-native-get-random-values`)
- react-native-keep-awake (from `../node_modules/react-native-keep-awake`)
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
- react-native-performance (from `../node_modules/react-native-performance/ios`)
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
- "react-native-slider (from `../node_modules/@react-native-community/slider`)"
- react-native-splash-screen (from `../node_modules/react-native-splash-screen`)
- react-native-video (from `../node_modules/react-native-video/react-native-video.podspec`)
@@ -435,13 +421,9 @@ DEPENDENCIES:
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
- ReactCommon/turbomodule (from `../node_modules/react-native/ReactCommon`)
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
- "RNCMaskedView (from `../node_modules/@react-native-masked-view/masked-view`)"
- RNDefaultPreference (from `../node_modules/react-native-default-preference`)
- RNDeviceInfo (from `../node_modules/react-native-device-info`)
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
- "RNGoogleSignin (from `../node_modules/@react-native-community/google-signin`)"
- RNReanimated (from `../node_modules/react-native-reanimated`)
- RNScreens (from `../node_modules/react-native-screens`)
- RNSound (from `../node_modules/react-native-sound`)
- RNSVG (from `../node_modules/react-native-svg`)
- RNWatch (from `../node_modules/react-native-watch-connectivity`)
@@ -505,16 +487,12 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-background-timer"
react-native-calendar-events:
:path: "../node_modules/react-native-calendar-events"
react-native-get-random-values:
:path: "../node_modules/react-native-get-random-values"
react-native-keep-awake:
:path: "../node_modules/react-native-keep-awake"
react-native-netinfo:
:path: "../node_modules/@react-native-community/netinfo"
react-native-performance:
:path: "../node_modules/react-native-performance/ios"
react-native-safe-area-context:
:path: "../node_modules/react-native-safe-area-context"
react-native-slider:
:path: "../node_modules/@react-native-community/slider"
react-native-splash-screen:
@@ -547,20 +525,12 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon"
RNCAsyncStorage:
:path: "../node_modules/@react-native-async-storage/async-storage"
RNCMaskedView:
:path: "../node_modules/@react-native-masked-view/masked-view"
RNDefaultPreference:
:path: "../node_modules/react-native-default-preference"
RNDeviceInfo:
:path: "../node_modules/react-native-device-info"
RNGestureHandler:
:path: "../node_modules/react-native-gesture-handler"
RNGoogleSignin:
:path: "../node_modules/@react-native-community/google-signin"
RNReanimated:
:path: "../node_modules/react-native-reanimated"
RNScreens:
:path: "../node_modules/react-native-screens"
RNSound:
:path: "../node_modules/react-native-sound"
RNSVG:
@@ -572,7 +542,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
Amplitude: 263118b9e691e73a1c864b05bb08a3aff3636d16
amplitude-react-native: 9369759dc6d01590aeb6261f714d53beaebc7e6f
amplitude-react-native: 833a4bd7f656f826bda1de01a7b8593b58842209
AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
CocoaLumberjack: 2f44e60eb91c176d471fdba43b9e3eae6a721947
@@ -593,7 +563,7 @@ SPEC CHECKSUMS:
GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213
GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3
GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89
GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91
GTMSessionFetcher: 36689134877faeb055b27dfa4ccc9ceaa42e029e
nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc
ObjectiveDropboxOfficial: b4765572e334d6fc6214b43a7595510324bbbbaa
PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
@@ -606,18 +576,16 @@ SPEC CHECKSUMS:
React-jsi: ddb471a56185e4007835a1bba0882ecb5ce3dc0e
React-jsiexecutor: 67106691c60030ec888d7cbbc4f48a3168e27a02
React-jsinspector: 92ceee6c66dc19886289b52436ade7e020b89602
react-native-background-timer: 029c606b3fd6dd476b153e177c518b6ade4c169f
react-native-calendar-events: 82dc6c915653a1a8a266e43fdbbfdb3b1022ca99
react-native-get-random-values: 237bffb1c7e05fb142092681531810a29ba53015
react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774
react-native-netinfo: 0e563248a4b9a99c33ec29bd03c2d50767db22a6
react-native-performance: 6bd6cfac80594775fb782405fceaaf206becf53b
react-native-safe-area-context: 584dc04881deb49474363f3be89e4ca0e854c057
react-native-slider: e99fc201cefe81270fc9d81714a7a0f5e566b168
react-native-background-timer: e0384ea2fa5a98f67f84f9c4dc274260ddd674ed
react-native-calendar-events: 1442fad71a00388f933cfa25512588fec300fcf8
react-native-keep-awake: eba3137546b10003361b37c761f6c429b59814ae
react-native-netinfo: 8d8db463bcc5db66a8ac5c48a7d86beb3b92f61a
react-native-performance: 8edfa2bbc9a2af4a02f01d342118e413a95145e0
react-native-slider: b733e17fdd31186707146debf1f04b5d94aa1a93
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
react-native-video: 0bb76b6d6b77da3009611586c7dbf817b947f30e
react-native-video: 1574074179ecaf6a9dd067116c8f31bf9fec15c8
react-native-webrtc: 41526e4060dac373c18676f866962d4180ee47b9
react-native-webview: dfd7202ff115c44d3ea401c2f36122fb3ac79f07
react-native-webview: b2542d6fd424bcc3e3b2ec5f854f0abb4ec86c87
React-RCTActionSheet: bcbc311dc3b47bc8efb2737ff0940239a45789a9
React-RCTAnimation: 65f61080ce632f6dea23d52e354ffac9948396c6
React-RCTBlob: 70d88f7b68b5c44953cdb286ac2e36a7a509a97e
@@ -628,19 +596,15 @@ SPEC CHECKSUMS:
React-RCTText: 4f1b99f228278d2a5e9008eced8dc9c974c4a270
React-RCTVibration: c1041024893fdfdb8371e7c720c437751b711676
ReactCommon: 18014e1d98dbeb9141e935cfe35fc93bd511ffb6
RNCAsyncStorage: 56a3355a10b5d660c48c6e37325ac85ebfd09885
RNCMaskedView: c298b644a10c0c142055b3ae24d83879ecb13ccd
RNDefaultPreference: 1f8133ec0bc0f9453cdada578564ba1ef551fb44
RNDeviceInfo: 87d2d175c760f6bcf58acd036f887e8b2392802c
RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211
RNCAsyncStorage: 8324611026e8dc3706f829953aa6e3899f581589
RNDefaultPreference: 56a405ce61033ac77b95004dccd7ac54c2eb50d1
RNDeviceInfo: 72ded653ce636b3f03571e90bed99309a714944e
RNGoogleSignin: 39336070b35fc4cea6a98cf111e00480317be0ae
RNReanimated: 514a11da3a2bcc6c3dfd9de32b38e2b9bf101926
RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d
RNSound: da030221e6ac7e8290c6b43f2b5f2133a8e225b0
RNSound: c980916b596cc15c8dcd2f6ecd3b13c4881dbe20
RNSVG: ce9d996113475209013317e48b05c21ee988d42e
RNWatch: a5320c959c75e72845c07985f3e935e58998f1d3
Yoga: 96b469c5e81ff51b917b92e8c3390642d4ded30c
PODFILE CHECKSUM: 836d4804218c0608e1326471ec83fe31cfa9c86d
PODFILE CHECKSUM: e830b1b5a46d340e22689b146b55dcf24664c6f1
COCOAPODS: 1.11.2
COCOAPODS: 1.10.1

View File

@@ -996,7 +996,7 @@
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
);
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -1049,7 +1049,7 @@
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
);
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;

View File

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

View File

@@ -34,10 +34,10 @@
jitsiMeet.universalLinkDomains = @[@"meet.jit.si", @"alpha.jitsi.net", @"beta.meet.jit.si"];
jitsiMeet.defaultConferenceOptions = [JitsiMeetConferenceOptions fromBuilder:^(JitsiMeetConferenceOptionsBuilder *builder) {
[builder setFeatureFlag:@"welcomepage.enabled" withBoolean:YES];
[builder setFeatureFlag:@"resolution" withValue:@(360)];
[builder setFeatureFlag:@"ios.screensharing.enabled" withBoolean:YES];
builder.serverURL = [NSURL URLWithString:@"https://meet.jit.si"];
builder.welcomePageEnabled = YES;
// Apple rejected our app because they claim requiring a
// Dropbox account for recording is not acceptable.

View File

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

View File

@@ -1,5 +1,6 @@
/*
* Copyright @ 2017-present 8x8, Inc.
* Copyright @ 2018-present 8x8, Inc.
* Copyright @ 2017-2018 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,6 +15,8 @@
* limitations under the License.
*/
#import <Availability.h>
@import CoreSpotlight;
@import MobileCoreServices;
@import Intents; // Needed for NSUserActivity suggestedInvocationPhrase
@@ -55,29 +58,34 @@
[self _onJitsiMeetViewDelegateEvent:@"CONFERENCE_JOINED" withData:data];
// Register a NSUserActivity for this conference so it can be invoked as a
// Siri shortcut.
NSUserActivity *userActivity
= [[NSUserActivity alloc] initWithActivityType:JitsiMeetConferenceActivityType];
// Siri shortcut. This is only supported in iOS >= 12.
#ifdef __IPHONE_12_0
if (@available(iOS 12.0, *)) {
NSUserActivity *userActivity
= [[NSUserActivity alloc] initWithActivityType:JitsiMeetConferenceActivityType];
NSString *urlStr = data[@"url"];
NSURL *url = [NSURL URLWithString:urlStr];
NSString *conference = [url.pathComponents lastObject];
NSString *urlStr = data[@"url"];
NSURL *url = [NSURL URLWithString:urlStr];
NSString *conference = [url.pathComponents lastObject];
userActivity.title = [NSString stringWithFormat:@"Join %@", conference];
userActivity.suggestedInvocationPhrase = @"Join my Jitsi meeting";
userActivity.userInfo = @{@"url": urlStr};
[userActivity setEligibleForSearch:YES];
[userActivity setEligibleForPrediction:YES];
[userActivity setPersistentIdentifier:urlStr];
userActivity.title = [NSString stringWithFormat:@"Join %@", conference];
userActivity.suggestedInvocationPhrase = @"Join my Jitsi meeting";
userActivity.userInfo = @{@"url": urlStr};
[userActivity setEligibleForSearch:YES];
[userActivity setEligibleForPrediction:YES];
[userActivity setPersistentIdentifier:urlStr];
// Subtitle
CSSearchableItemAttributeSet *attributes
= [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeItem];
attributes.contentDescription = urlStr;
userActivity.contentAttributeSet = attributes;
// Subtitle
CSSearchableItemAttributeSet *attributes
= [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeItem];
attributes.contentDescription = urlStr;
userActivity.contentAttributeSet = attributes;
self.userActivity = userActivity;
[userActivity becomeCurrent];
}
#endif
self.userActivity = userActivity;
[userActivity becomeCurrent];
}
- (void)conferenceTerminated:(NSDictionary *)data {

View File

@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>21.5.0</string>
<string>21.4.3</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>21.5.0</string>
<string>21.4.3</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CLKComplicationPrincipalClass</key>

View File

@@ -24,8 +24,6 @@
0BD906EA1EC0C00300C8C18E /* JitsiMeet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BD906E81EC0C00300C8C18E /* JitsiMeet.h */; settings = {ATTRIBUTES = (Public, ); }; };
4E51B76425E5345E0038575A /* ScheenshareEventEmiter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E51B76225E5345E0038575A /* ScheenshareEventEmiter.h */; };
4E51B76525E5345E0038575A /* ScheenshareEventEmiter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */; };
4ED4FFF32721B9B90074E620 /* JitsiAudioSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ED4FFF12721B9B90074E620 /* JitsiAudioSession.h */; settings = {ATTRIBUTES = (Public, ); }; };
4ED4FFF42721B9B90074E620 /* JitsiAudioSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ED4FFF22721B9B90074E620 /* JitsiAudioSession.m */; };
6F08DF7D4458EE3CF3F36F6D /* libPods-JitsiMeetSDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4376CA6886DE68FD7A4294B /* libPods-JitsiMeetSDK.a */; };
A4A934E9212F3ADB001E9388 /* Dropbox.m in Sources */ = {isa = PBXBuildFile; fileRef = A4A934E8212F3ADB001E9388 /* Dropbox.m */; };
C6245F5D2053091D0040BE68 /* image-resize@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6245F5B2053091D0040BE68 /* image-resize@2x.png */; };
@@ -79,9 +77,6 @@
0BD906E91EC0C00300C8C18E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4E51B76225E5345E0038575A /* ScheenshareEventEmiter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ScheenshareEventEmiter.h; sourceTree = "<group>"; };
4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScheenshareEventEmiter.m; sourceTree = "<group>"; };
4ED4FFF12721B9B90074E620 /* JitsiAudioSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiAudioSession.h; sourceTree = "<group>"; };
4ED4FFF22721B9B90074E620 /* JitsiAudioSession.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JitsiAudioSession.m; sourceTree = "<group>"; };
4ED4FFF52721BAE10074E620 /* JitsiAudioSession+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JitsiAudioSession+Private.h"; sourceTree = "<group>"; };
891FE43DAD30BC8976683100 /* Pods-JitsiMeetSDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeetSDK.release.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeetSDK/Pods-JitsiMeetSDK.release.xcconfig"; sourceTree = "<group>"; };
98E09B5C73D9036B4ED252FC /* Pods-JitsiMeet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeet/Pods-JitsiMeet.debug.xcconfig"; sourceTree = "<group>"; };
9C77CA3CC919B081F1A52982 /* Pods-JitsiMeet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet.release.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeet/Pods-JitsiMeet.release.xcconfig"; sourceTree = "<group>"; };
@@ -179,9 +174,6 @@
DEFE535821FB311F00011A3A /* JitsiMeet+Private.h */,
DEA9F283258A5D9900D4CD74 /* JitsiMeetSDK.h */,
DEFE535321FB1BF800011A3A /* JitsiMeet.m */,
4ED4FFF12721B9B90074E620 /* JitsiAudioSession.h */,
4ED4FFF52721BAE10074E620 /* JitsiAudioSession+Private.h */,
4ED4FFF22721B9B90074E620 /* JitsiAudioSession.m */,
DEAD3224220C497000E93636 /* JitsiMeetConferenceOptions.h */,
DEAD3228220C734300E93636 /* JitsiMeetConferenceOptions+Private.h */,
DEAD3225220C497000E93636 /* JitsiMeetConferenceOptions.m */,
@@ -285,7 +277,6 @@
4E51B76425E5345E0038575A /* ScheenshareEventEmiter.h in Headers */,
DE65AACC2318028300290BEC /* JitsiMeetBaseLogHandler+Private.h in Headers */,
0B412F221EDEF6EA00B1A0A6 /* JitsiMeetViewDelegate.h in Headers */,
4ED4FFF32721B9B90074E620 /* JitsiAudioSession.h in Headers */,
0BD906EA1EC0C00300C8C18E /* JitsiMeet.h in Headers */,
DE81A2D42316AC4D00AE1940 /* JitsiMeetLogger.h in Headers */,
DE65AACA2317FFCD00290BEC /* LogUtils.h in Headers */,
@@ -447,7 +438,6 @@
files = (
0BB9AD7B1F5EC8F4001C08DB /* CallKit.m in Sources */,
DE81A2DF2317ED5400AE1940 /* JitsiMeetBaseLogHandler.m in Sources */,
4ED4FFF42721B9B90074E620 /* JitsiAudioSession.m in Sources */,
0BB9AD7D1F60356D001C08DB /* AppInfo.m in Sources */,
DE81A2D92316AC7600AE1940 /* LogBridge.m in Sources */,
DEAFA779229EAD520033A7FA /* RNRootView.m in Sources */,
@@ -530,7 +520,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -586,7 +576,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;

View File

@@ -20,7 +20,6 @@
#import <React/RCTLog.h>
#import <WebRTC/WebRTC.h>
#import "JitsiAudioSession+Private.h"
#import "LogUtils.h"
@@ -114,7 +113,7 @@ RCT_EXPORT_MODULE();
isSpeakerOn = NO;
isEarpieceOn = NO;
RTCAudioSession *session = JitsiAudioSession.rtcAudioSession;
RTCAudioSession *session = [RTCAudioSession sharedInstance];
[session addDelegate:self];
}
@@ -128,7 +127,7 @@ RCT_EXPORT_MODULE();
- (BOOL)setConfigWithoutLock:(RTCAudioSessionConfiguration *)config
error:(NSError * _Nullable *)outError {
RTCAudioSession *session = JitsiAudioSession.rtcAudioSession;
RTCAudioSession *session = [RTCAudioSession sharedInstance];
return [session setConfiguration:config error:outError];
}
@@ -136,7 +135,7 @@ RCT_EXPORT_MODULE();
- (BOOL)setConfig:(RTCAudioSessionConfiguration *)config
error:(NSError * _Nullable *)outError {
RTCAudioSession *session = JitsiAudioSession.rtcAudioSession;
RTCAudioSession *session = [RTCAudioSession sharedInstance];
[session lockForConfiguration];
BOOL success = [self setConfigWithoutLock:config error:outError];
[session unlockForConfiguration];
@@ -179,7 +178,7 @@ RCT_EXPORT_METHOD(setAudioDevice:(NSString *)device
reject:(RCTPromiseRejectBlock)reject) {
DDLogInfo(@"[AudioMode] Selected device: %@", device);
RTCAudioSession *session = JitsiAudioSession.rtcAudioSession;
RTCAudioSession *session = [RTCAudioSession sharedInstance];
[session lockForConfiguration];
BOOL success;
NSError *error = nil;
@@ -274,7 +273,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;
RTCAudioSession *session = [RTCAudioSession sharedInstance];
[session lockForConfiguration];
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
[session unlockForConfiguration];

View File

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

View File

@@ -1,24 +0,0 @@
/*
* Copyright @ 2017-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* 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.
*/
#import "JitsiAudioSession.h"
#import <WebRTC/WebRTC.h>
@interface JitsiAudioSession (Private)
+ (RTCAudioSession *)rtcAudioSession;
@end

View File

@@ -1,26 +0,0 @@
/*
* Copyright @ 2017-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* 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.
*/
#import <Foundation/Foundation.h>
@class AVAudioSession;
@interface JitsiAudioSession : NSObject
+ (void)activateWithAudioSession:(AVAudioSession *)session;
+ (void)deactivateWithAudioSession:(AVAudioSession *)session;
@end

View File

@@ -1,34 +0,0 @@
/*
* Copyright @ 2017-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* 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.
*/
#import "JitsiAudioSession.h"
#import "JitsiAudioSession+Private.h"
@implementation JitsiAudioSession
+ (RTCAudioSession *)rtcAudioSession {
return [RTCAudioSession sharedInstance];
}
+ (void)activateWithAudioSession:(AVAudioSession *)session {
[self.rtcAudioSession audioSessionDidActivate:session];
}
+ (void)deactivateWithAudioSession:(AVAudioSession *)session {
[self.rtcAudioSession audioSessionDidDeactivate:session];
}
@end

View File

@@ -34,6 +34,12 @@
*/
@property (nonatomic, copy, nullable) NSString *token;
/**
* Color scheme override, see:
* https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/color-scheme/defaultScheme.js
*/
@property (nonatomic, copy, nullable) NSDictionary *colorScheme;
/**
* Feature flags. See: https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/flags/constants.js
*/
@@ -41,6 +47,12 @@
@property (nonatomic, readonly, nonnull) NSDictionary *config;
/**
* Set to YES to enable the welcome page. Typically SDK users won't need this enabled
* since the host application decides which meeting to join.
*/
@property (nonatomic) BOOL welcomePageEnabled;
/**
* Information about the local user. It will be used in absence of a token.
*/
@@ -70,8 +82,11 @@
@property (nonatomic, copy, nullable, readonly) NSString *room;
@property (nonatomic, copy, nullable, readonly) NSString *token;
@property (nonatomic, copy, nullable) NSDictionary *colorScheme;
@property (nonatomic, readonly, nonnull) NSDictionary *featureFlags;
@property (nonatomic, readonly) BOOL welcomePageEnabled;
@property (nonatomic, nullable) JitsiMeetUserInfo *userInfo;
+ (instancetype _Nonnull)fromBuilder:(void (^_Nonnull)(JitsiMeetConferenceOptionsBuilder *_Nonnull))initBlock;

View File

@@ -19,17 +19,26 @@
#import "JitsiMeetConferenceOptions+Private.h"
#import "JitsiMeetUserInfo+Private.h"
/**
* Backwards compatibility: turn the boolean property into a feature flag.
*/
static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
@implementation JitsiMeetConferenceOptionsBuilder {
NSMutableDictionary *_featureFlags;
NSMutableDictionary *_config;
}
@dynamic welcomePageEnabled;
- (instancetype)init {
if (self = [super init]) {
_serverURL = nil;
_room = nil;
_token = nil;
_colorScheme = nil;
_config = [[NSMutableDictionary alloc] init];
_featureFlags = [[NSMutableDictionary alloc] init];
@@ -87,6 +96,19 @@
_config[config] = value;
}
#pragma mark - Dynamic properties
- (void)setWelcomePageEnabled:(BOOL)welcomePageEnabled {
[self setFeatureFlag:WelcomePageEnabledFeatureFlag
withBoolean:welcomePageEnabled];
}
- (BOOL)welcomePageEnabled {
NSNumber *n = _featureFlags[WelcomePageEnabledFeatureFlag];
return n != nil ? [n boolValue] : NO;
}
@end
@implementation JitsiMeetConferenceOptions {
@@ -94,6 +116,16 @@
NSDictionary *_config;
}
@dynamic welcomePageEnabled;
#pragma mark - Dynamic properties
- (BOOL)welcomePageEnabled {
NSNumber *n = _featureFlags[WelcomePageEnabledFeatureFlag];
return n != nil ? [n boolValue] : NO;
}
#pragma mark - Internal initializer
- (instancetype)initWithBuilder:(JitsiMeetConferenceOptionsBuilder *)builder {
@@ -102,6 +134,8 @@
_room = builder.room;
_token = builder.token;
_colorScheme = builder.colorScheme;
_config = builder.config;
_featureFlags = [NSDictionary dictionaryWithDictionary:builder.featureFlags];
@@ -127,6 +161,10 @@
props[@"flags"] = [NSMutableDictionary dictionaryWithDictionary:_featureFlags];
if (_colorScheme != nil) {
props[@"colorScheme"] = self.colorScheme;
}
NSMutableDictionary *urlProps = [[NSMutableDictionary alloc] init];
// The room is fully qualified.

View File

@@ -20,5 +20,4 @@
#import <JitsiMeetSDK/JitsiMeetConferenceOptions.h>
#import <JitsiMeetSDK/JitsiMeetLogger.h>
#import <JitsiMeetSDK/JitsiMeetBaseLogHandler.h>
#import <JitsiMeetSDK/JitsiAudioSession.h>
#import <JitsiMeetSDK/InfoPlistUtil.h>

View File

@@ -23,7 +23,7 @@
*/
@property (nonatomic, copy, nullable) NSString *displayName;
/**
* User email.
* User e-mail.
*/
@property (nonatomic, copy, nullable) NSString *email;
/**

View File

@@ -31,7 +31,6 @@
#import <JitsiMeetSDK/JitsiMeetSDK-Swift.h>
#import "../LogUtils.h"
#import "JitsiAudioSession.h"
// The events emitted/supported by RNCallKit:
@@ -320,13 +319,13 @@ RCT_EXPORT_METHOD(updateCall:(NSString *)callUUID
- (void) providerDidActivateAudioSessionWithSession:(AVAudioSession *)session {
DDLogInfo(@"[RNCallKit][CXProviderDelegate][provider:didActivateAudioSession:]");
[JitsiAudioSession activateWithAudioSession:session];
[[RTCAudioSession sharedInstance] audioSessionDidActivate:session];
}
- (void) providerDidDeactivateAudioSessionWithSession:(AVAudioSession *)session {
DDLogInfo(@"[RNCallKit][CXProviderDelegate][provider:didDeactivateAudioSession:]");
[JitsiAudioSession deactivateWithAudioSession:session];
[[RTCAudioSession sharedInstance] audioSessionDidDeactivate:session];
}
- (void) providerTimedOutPerformingActionWithAction:(CXAction *)action {

View File

@@ -44,14 +44,5 @@
"esUS": "Taspanit (Temrikt Talatinit)",
"enGB": "Tagnizit (Tagldit i ddukklen)",
"da": "Tadanit",
"ca": "Takaṭalant",
"mr": "Tamratit",
"ml": "Tamalayalamt",
"lv": "Talatviant",
"fa": "Tafarisit",
"pt": "Taportugit",
"sr": "Taserbit",
"sq": "Talbanit",
"hi": "Tahindit",
"te": "Tatelugut"
"ca": "Takaṭalant"
}

View File

@@ -5,7 +5,6 @@
"copyInvite": "انسخ دعوةً للاجتماع",
"copyLink": "انسخ رابط الاجتماع",
"copyStream": "انسخ رابط البث المباشر",
"contacts": "contacts",
"countryNotSupported": "لا ندعم هذه الوجهة حاليًا.",
"countryReminder": "أتريد الاتصال بمن هو خارج الولايات المتحدة؟ تأكد من الابتداء برمز الدولة أولًا!",
"defaultEmail": "بريدك الافتراضي",
@@ -17,14 +16,18 @@
"inviteMoreMailSubject": "ضم {{appName}} للاجتماع",
"inviteMorePrompt": "ادعُ أشخاصًا آخرين",
"linkCopied": "نُسِخ الرابط",
"loading": "البحث عن أشخاص وأرقام هواتف",
"loadingNumber": "التحقق من رقم الهاتف",
"loadingPeople": "البحث عن أشخاص لإضافتهم",
"noResults": "لم يُعثَر على أي نتيجة بحث متطابقة",
"noValidNumbers": "ادخل رقم هاتف، رجاءً",
"outlookEmail": "بريد مايكروسوفت",
"phoneNumbers": "أضف ارقام هواتف",
"searching": "يبحث",
"searchNumbers": "أضف ارقام هواتف",
"searchPeople": "ابحث عن أشخاص",
"searchPeopleAndNumbers": "ابحث عن أشخاص أو أضف أرقام هواتفهم",
"shareInvite": "شارك دعوةً للاجتماع",
"shareLink": "شارك رابط الاجتماع لدعوة الأخرين",
"shareStream": "شارك رابط البث المباشر للاجتماع",
"sipAddresses": "sip عنوان",
"telephone": "رقم الهاتف: {{number}}",
"title": "ادعُ أحدًا لهذا الاجتماع",
"yahooEmail": "بريد ياهوو"
@@ -39,20 +42,6 @@
"audioOnly": {
"audioOnly": "معدل تبادل البيانات منخفض"
},
"breakoutRooms": {
"defaultName": "غرفة الاجتماعات الفرعية رقم {{index}}",
"mainRoom": "الغرفة الرئيسية",
"actions": {
"add": "أضف غرفة جانبية",
"autoAssign": "التخصيص التلقائي للغرف الجانبية",
"close": "أغلق",
"join": "انضم",
"leaveBreakoutRoom": "اترك الغرفة الجانبية",
"more": "أكثر",
"remove": "إزالة",
"sendToBreakoutRoom": "أرسل المشارك إلى:"
}
},
"calendarSync": {
"addMeetingURL": "أضف رابطًا لاجتماع",
"confirmAddLink": "هل تريد إضافة رابط جيستسي لهذا الحدث؟",
@@ -72,7 +61,6 @@
"today": "اليوم"
},
"chat": {
"enter": "أدخل الغرفة",
"error": "خطأ: لم تُرسَل رسالتك. السبب: {{error}}",
"fieldPlaceHolder": "اكتب رسالتك هنا",
"messagebox": "اكتب رسالة",
@@ -84,14 +72,6 @@
"titleWithPolls": "اكتب لقبًا لاعتماده في المحادثة"
},
"privateNotice": "أرسل رسالة خاصة إلى {{recipient}}",
"message": "رسالة",
"messageAccessibleTitle": "{{user}} مقولة:",
"messageAccessibleTitleMe": "أنا أقول:",
"smileysPanel": "واجهة الإيموجي",
"tabs": {
"chat": "دردشة",
"polls": "تصويت"
},
"title": "محادثة",
"titleWithPolls": "محادثة",
"you": "أنت"
@@ -99,8 +79,7 @@
"chromeExtensionBanner": {
"installExtensionText": "نزِّل الإضافة للدمج مع رزنامة غوغل ورزنامة أوفيس 365",
"buttonText": "نزِّل إضافة متصفح كروم",
"dontShowAgain": "لا ترني هذه مرة أخرى",
"close": "إغلق"
"dontShowAgain": "لا ترني هذه مرة أخرى"
},
"connectingOverlay": {
"joiningRoom": "قيد وصلك بالإجتماع..."
@@ -122,7 +101,6 @@
},
"connectionindicator": {
"address": "العنوان:",
"audio_ssrc": "مصدر الصوت:",
"bandwidth": "مُعدَّل البيانات المتبادلة:",
"bitrate": "مُعدَّل البث:",
"bridgeCount": "عدد المخدِّمات: ",
@@ -150,12 +128,9 @@
"remoteport": "المنفذ البعيد:",
"remoteport_plural": "المنافذ البعيدة:",
"resolution": "الدقة:",
"savelogs": "خزن الوقوعات",
"participant_id": "معرّف المشترك:",
"status": "الاتصال:",
"transport": "النقل:",
"transport_plural": "النواقل:",
"video_ssrc": "مصدر الصورة:"
"transport_plural": "النواقل:"
},
"dateUtils": {
"earlier": "سابقًا",
@@ -197,14 +172,12 @@
"alreadySharedVideoMsg": "يشارك أحد الحضور الفيديو حاليًا، ولا يسمح هذا الإجتماع سوى بمشاركة فيديو واحد في آن واحد",
"alreadySharedVideoTitle": "لا يُسمَح سوى بفيديو مشارك واحد على الأكثر في آن واحد.",
"applicationWindow": "نافذة التطبيق",
"authenticationRequired": "يستلزم التوثيق",
"Back": "عد للخلف",
"cameraConstraintFailedError": "لا تتوافق كاميرتك مع بعض الشروط المطلوبة.",
"cameraNotFoundError": "لم يُعثَر على اي كاميرا",
"cameraNotSendingData": "لا نتمكن من الوصول إلى كاميرتك. تحقَّق رجاءً إن كان أي تطبيق آخر يستعملها، أو اختر جهازًا آخر من القائمة أو جرب تحميل التطبيق مجدَّدًا.",
"cameraNotSendingDataTitle": "يصعب الوصول الوصول إلى كاميرتك",
"cameraPermissionDeniedError": "لم تُمنَح إذن استعمال الكاميرا. لا يزال بإمكانك حضور المؤتمر ولكن لن يراك الآخرون. استعمال زر الكاميرا في شريط العنوان لمحاول إصلاح المشكلة.",
"cameraTimeoutError": "تعذر بدء مصدر الفيديو. انتهت المهلة!",
"cameraUnknownError": "يصعب استعمال الكاميرا لأسباب مجهولة.",
"cameraUnsupportedResolutionError": "لا تدعم كاميرتك دقة الفيديو المطلوبة.",
"Cancel": "ِألغ",
@@ -223,20 +196,16 @@
"copied": "نُسِخ!",
"copy": "انسخ",
"dismiss": "تجاهل",
"displayNameRequired": "السلام عليكم! ما اسمك؟",
"displayNameRequired": "السلام عليك! ما اسمك؟",
"done": "اُنجِز",
"e2eeDescription": "<p>عملية التعمية من طرف لطرف <strong>قيد التجريب</strong> حاليًا. زر رجاءً <a href='https://jitsi.org/blog/e2ee/' target='_blank'>هذا المنشور</a> لمزيد من التفاصيل.</p><br/><p>ضع في ذهنك أن تشغيل عملية التعمية من طرف لطرف ستعطل عمل بعض الخدمات التي يقدمها المُخدِّم مثل: التسجيل، والبث الحي، الاشتراك عبر الهاتف. أضف إلى ذلك أن الاجتماع سيعمل مع الأشخاص المنضمين من المتصفح التي تدعم قابلية الدخول إلى البث.</p>",
"e2eeLabel": "المفتاح",
"e2eeDisabledDueToMaxModeDescription": "لا يمكن تمكين التشفير من طرف إلى طرف بسبب العدد الكبير من المشاركين في المؤتمر.",
"e2eeWarning": "تحذير: لا يبدو أن جميع المشاركين في هذا الاجتماع لديهم دعم للتشفير من طرف إلى طرف. إذا قمت بتمكينه فلن يتمكنوا من رؤيتك أو سماعك.",
"e2eeWillDisableDueToMaxModeDescription": "تحذير: سيتم تعطيل التشفير من طرف إلى طرف تلقائيًا إذا انضم المزيد من المشاركين إلى المؤتمر.",
"e2eeWarning": "<br /><p><strong>تحذير:</strong>لا يبدو أن جميع الحاضرين في هذا الاجتماع يدعمون عملية التعمية طرف لطرف. إن فعَّلت العملية، فلن يتمكنوا من رؤيتك ولا سماعك.</p>",
"enterDisplayName": "أدخل اسمك هنا، رجاءً",
"embedMeeting": "تضمين الاجتماع",
"error": "خطأ",
"gracefulShutdown": "خدمتنا متوقفة حاليًا لعمليات الصيانة. جرب مرة أخرى في وقت لاحق.",
"grantModeratorDialog": "أما زلت راغب بجعل هذا المشارك رئيس الجلسة؟",
"grantModeratorTitle": "اجعله رئيس الجلسة",
"hideShareAudioHelper": "لا تظهر هذا الحوار مرة أخرى",
"IamHost": "أنا المضيف",
"incorrectRoomLockPassword": "كلمة مرور خطأ",
"incorrectPassword": "اسم المستخدم أو كلمة المرور خطأ",
@@ -246,15 +215,15 @@
"kickParticipantButton": "اطرد",
"kickParticipantDialog": "أمتأكد من طرد هذا المشارك؟",
"kickParticipantTitle": "أتريد طرد هذا المشارك؟",
"kickTitle": "عذرًا! تم طردك {{participantDisplayName}} من الاجتماع",
"kickTitle": "عذرًا! طردك {{participantDisplayName}} من الاجتماع",
"liveStreaming": "البث المباشر الحي",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "غير ممكن أثناء التسجيل",
"liveStreamingDisabledForGuestTooltip": "لا يمكن للضيوف بدء بث حي مباشر.",
"liveStreamingDisabledTooltip": "بدء بثٍ حيٍّ مُعطَّل",
"lockMessage": "فشل جعل المؤتمر مغلقًا.",
"lockRoom": "أضف الاجتماع $t(lockRoomPasswordUppercase)",
"lockTitle": "فشلت عملية القفل والإغلاق",
"logoutQuestion": "أمتأكد من رغبتك في الخروج وإيقاف المؤتمر؟",
"login": "تسجيل الدخول",
"logoutTitle": "الخروج",
"maxUsersLimitReached": "وصل عدد المشاركين إلى الحد الأقصى. المؤتمر مكتمل الحضور. اتصل رجاءً براعي المؤتمر أو جرب مرة أخرى لاحقًا.",
"maxUsersLimitReachedTitle": "وصل عدد المشاركين إلى الحد الأقصى",
@@ -263,46 +232,28 @@
"micNotSendingData": "اذهب إلى إعدادات حاسوبك لإلغاء كتم المجهار (المايكروفون) وضبط مستواه",
"micNotSendingDataTitle": "كتم ضبط الإعدادات لديك المجهار (المايكروفون)",
"micPermissionDeniedError": "لم تعط إذن استعمال المجهار (المايكروفون) الخاص بك. ما يزال بإمكانك الإنضمام إلى المؤتمر ولكن دون أن يسمعك الآخرون. جرب استعمال زر الكاميرا في شريط العنوان لإصلاح هذه المشكلة.",
"micTimeoutError": "تعذر بدء مصدر الصوت. انقضت المهلة!",
"micUnknownError": "لا يمكن استخدام الميكروفون لسبب غير معروف.",
"moderationAudioLabel": "السماح للحاضرين بإعادة الصوت بأنفسهم",
"moderationVideoLabel": "السماح للحاضرين ببدء الفيديو الخاص بهم",
"micUnknownError": "يصعب استعمال المجهار (المايكروفون) الخاص بك لأسباب مجهولة.",
"muteEveryoneElseDialog": "بمجرد أن تكتمهم، لن تتمكن نم إلغاء الكتم هذا، ولكن يمكنهم إلغاء كتم أنفسهم في أي وقت.",
"muteEveryoneElseTitle": "أتريد كتم الجميع باستثناء {{whom}}?",
"muteEveryoneDialog": "أمتأكد من رغبتك بكتم الجميع؟ لن تتمكن من إلغاء الكتم ولكن يمكنهم إلغاء كتم أنفسهم في أي وقت.",
"muteEveryoneDialogModerationOn": "يمكن للمشاركين إرسال طلب للتحدث في أي وقت.",
"muteEveryoneTitle": "أتريد كتم الجميع؟",
"muteEveryoneElsesVideoDialog": "بمجرد تعطيل الكاميرا ، لن تتمكن من إعادة تشغيلها ، ولكن يمكنهم إعادة تشغيلها في أي وقت.",
"muteEveryoneElsesVideoTitle": "وقف فيديو الجميع باستثناء {{whom}}?",
"muteEveryonesVideoDialog": "يمكن للمشاركين تشغيل الفيديو الخاص بهم في أي وقت.",
"muteEveryonesVideoDialogModerationOn": "يمكن للمشاركين إرسال طلب لتشغيل الفيديو الخاص بهم في أي وقت.",
"muteEveryonesVideoDialogOk": "إبطال",
"muteEveryonesVideoTitle": "وقف فيديو الجميع؟",
"muteEveryoneSelf": "اكتم نفسك أيضًا",
"muteEveryoneStartMuted": "البدء مع كتم الجميع من الآن فصاعدًا",
"muteParticipantBody": "لن تتكمن من إلغاء كتمهم، ولكن يمكنهم إلغاء كتم أنفسهم في أي وقت.",
"muteParticipantButton": "كتم",
"muteParticipantsVideoDialog": "هل أنت متأكد أنك تريد إيقاف تشغيل كاميرا هذا المشارك؟ لن تتمكن من إعادة تشغيل الكاميرا ، ولكن يمكنهم إعادة تشغيلها في أي وقت.",
"muteParticipantsVideoDialogModerationOn": "هل أنت متأكد أنك تريد إيقاف تشغيل كاميرا هذا المشارك؟ لن تكون قادرًا على إعادة تشغيل الكاميرا ولن يفعلوا ذلك أيضًا.",
"muteParticipantsVideoButton": "وقف الكاميرا",
"muteParticipantsVideoTitle": "تعطيل الكاميرا لهذا المشارك؟",
"muteParticipantsVideoBody": "لن تتمكن من إعادة تشغيل الكاميرا ، ولكن يمكنهم إعادة تشغيلها في أي وقت.",
"muteParticipantsVideoBodyModerationOn": "لن تكون قادرًا على إعادة تشغيل الكاميرا ولن يفعلوا ذلك أيضًا.",
"noDropboxToken": "لا يوجد رمز مميز صالح لـ Dropbox",
"muteParticipantDialog": "أمتأكد من رغبتك لهذا المشارك؟ لن تتمكن من إلغاء الكتم ولكن يمكنه إلغاء كتم أنفسهم في أي وقت.",
"muteParticipantTitle": "أتريد كتم هذا المشارك؟",
"Ok": "تمام",
"password": "كلمه السر",
"passwordLabel": "جعل عضو ما هذا الاجتماع مغلقًا. أدخل رجاءً $t(lockRoomPassword) للإنضمام.",
"passwordNotSupported": "ضبط اجتماع $t(lockRoomPassword) غير مدعوم.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) غير مدعوم",
"passwordRequired": "يُطلَب $t(lockRoomPasswordUppercase)",
"permissionErrorTitle": "الإذن مطلوب",
"permissionCameraRequiredError": "مطلوب إذن الكاميرا للمشاركة في المؤتمرات بالفيديو. يرجى منحه في الإعدادات",
"permissionMicRequiredError": "مطلوب إذن الميكروفون للمشاركة في المؤتمرات مع الصوت. يرجى منحه في الإعدادات",
"popupError": "يمنع متصفحك النوافذ المنبثقة من هذا الموقع. فعِّل رجاءً النوافذ المنبثقة في المتصفح من إعدادات الحماية وحاول مرة أخرى.",
"popupErrorTitle": "النوافذ المنبثقة محجوبة.",
"readMore": "أكثر",
"readMore": "more",
"recording": "قيد التسجيل",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "ليس بالإمكان ما دمت قيد البث المباشر",
"recordingDisabledForGuestTooltip": "لا يمكن للضيوف بدء عملية التسجيل.",
"recordingDisabledTooltip": "عملية التسجيل معطلة.",
"rejoinNow": "انضم مجدَّدًا الآن",
"remoteControlAllowedMessage": "قبل {{user}} طلب إمكانية التحكم البعيد!",
@@ -329,27 +280,15 @@
"sendPrivateMessageTitle": "أترسل ردًا خاصًا؟",
"serviceUnavailable": "الخدمة غير متاحة",
"sessTerminated": "أُنهيَت المكالمة",
"sessionRestarted": "إعادة الاتصال من الجسر",
"Share": "شارك",
"shareAudio": "استمر",
"shareAudioTitle": "كيفية مشاركة الصوت",
"shareAudioWarningTitle": "تحتاج إلى إيقاف مشاركة الشاشة قبل مشاركة الصوت",
"shareAudioWarningH1": "إذا كنت تريد مشاركة الصوت فقط:",
"shareAudioWarningD1": "تحتاج إلى إيقاف مشاركة الشاشة قبل مشاركة الصوت الخاص بك.",
"shareAudioWarningD2": "تحتاج إلى إعادة تشغيل مشاركة الشاشة والتحقق من خيار مشاركة الصوت .",
"shareMediaWarningGenericH2": "إذا كنت ترغب في مشاركة شاشتك والصوت",
"shareVideoLinkError": "زودنا برابط يوتيوب صحيح",
"shareVideoTitle": "شارك فيديو",
"shareYourScreen": "شارك شاشتك",
"shareYourScreenDisabled": "مشاركة الشاشة مُعطَّلة",
"shareYourScreenDisabledForGuest": "لا يمكن للضيوف مشاركة شاشتهم",
"startLiveStreaming": "ابدأ بثًا حيًا",
"startRecording": "ابدأ التسجيل",
"startRemoteControlErrorMessage": "حصل خطأٌ أثناء محاولة بدء جلسة تحكم بعيد!",
"shareScreenWarningTitle": "تحتاج إلى إيقاف مشاركة الصوت قبل مشاركة شاشتك",
"shareScreenWarningH1": "إذا كنت تريد مشاركة شاشتك فقط:",
"shareScreenWarningD1": "تحتاج إلى إيقاف مشاركة الصوت قبل مشاركة شاشتك.",
"shareScreenWarningD2": "تحتاج إلى إيقاف مشاركة الصوت وبدء مشاركة الشاشة وتحديد خيار مشاركة الصوت .",
"sharedVideoLinkPlaceholder": "رابط اليوتيوب او رابط الفيديو المباشر",
"stopLiveStreaming": "أوقف البث الحي",
"stopRecording": "أوقف التسجيل",
"stopRecordingWarning": "أمتأكد من رغبتك بإيقاف التسجيل؟",
@@ -362,20 +301,12 @@
"tokenAuthFailedTitle": "فشلت عملية الاستيثاق",
"transcribing": "يذاع",
"unlockRoom": "إزل الاجتماع $t(lockRoomPassword)",
"user": "مستخدم",
"userIdentifier": "معرف المستخدم",
"userPassword": "كلمة مرور المستخدم",
"videoLink": "رابط الفيديو",
"viewUpgradeOptions": "عرض خيارات الترقية",
"viewUpgradeOptionsContent": "للحصول على وصول غير محدود إلى الميزات المتميزة مثل التسجيل والنسخ وتدفق RTMP والمزيد ، ستحتاج إلى ترقية خطتك.",
"viewUpgradeOptionsTitle": "لقد اكتشفت ميزة مميزة!",
"WaitForHostMsg": "لم يبدأ المؤتمر <b>{{room}}</b> بعد. إن كنت المضيف والراعي، فنرجو تأكيد ذلك عبر الاستيثاق أو انتظر وصول المضيف رجاءً. ",
"WaitForHostMsgWOk": "لم يبدأ المؤتمر <b>{{room}}</b> بعد. إن كنت المضيف والراعي، فاضغط على «تمام» للاستيثاق أو انتظر وصول المضيف رجاءً.",
"WaitingForHostTitle": "في انتظار المضيف ...",
"WaitingForHost": "ننتظر وصول المضيف ...",
"Yes": "نعم",
"yourEntireScreen": "شاشتك كاملةً",
"remoteUserControls": "ضوابط المستخدم عن بعد لـ {{username}}",
"localUserControls": "ضوابط المستخدم المحلي"
"yourEntireScreen": "شاشتك كاملةً"
},
"dialOut": {
"statusMessage": "{{status}} الآن"
@@ -389,29 +320,6 @@
"embedMeeting": {
"title": "ضمِّن هذا الاجتماع"
},
"virtualBackground": {
"apply": "تطبيق",
"title": "خلفيات افتراضية",
"blur": "ضبابية",
"slightBlur": "طمس طفيف",
"removeBackground": "إزالة خلفية",
"addBackground": "أضف خلفية",
"pleaseWait": "يرجى الانتظار...",
"none": "بدون",
"uploadedImage": "تحميل الصورة {{index}}",
"deleteImage": "حذف صورة",
"image1": "شاطئ",
"image2": "جدار أبيض محايد",
"image3": "غرفة بيضاء فارغة",
"image4": "مصباح أرضي أسود",
"image5": "جبل",
"image6": "غابة",
"image7": "شروق الشمس",
"desktopShareError": "تعذر إنشاء مشاركة سطح المكتب",
"desktopShare": "مشاركة سطح المكتب",
"webAssemblyWarning": "WebAssembly غير مدعوم",
"backgroundEffectError": "فشل تطبيق تأثير الخلفية."
},
"feedback": {
"average": "المتوسط",
"bad": "سيئة",
@@ -419,8 +327,7 @@
"good": "جيدة",
"rateExperience": "قيِّم تجربتك مع هذا الإجتماع",
"veryBad": "سيئة للغاية",
"veryGood": "ممتازة",
"star": "نجمة"
"veryGood": "ممتازة"
},
"incomingCall": {
"answer": "أجب",
@@ -437,7 +344,6 @@
"country": "البلد",
"dialANumber": "إن أردت الإنضمام إلى الإجتماع، اتصل بأحد الأرقام التالية ثم أدخل رمز المرور",
"dialInConferenceID": "رمز المرور (PIN):",
"copyNumber": "إنسخ الرقم",
"dialInNotSupported": "عذرًا، الاتصال غير مدعوم حاليًا.",
"dialInNumber": "اتصل:",
"dialInSummaryError": "خطأ في تحصيل معلومات الاتصال. جرب مرة أخرى لاحقًا.",
@@ -446,11 +352,6 @@
"inviteLiveStream": "لمشاهدة البث الحي لهذا الإجتماع، اضط على هذا الرابط: {{url}}",
"invitePhone": "للإنضمام من الهاتف، استعمل: {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "أتبحث عن رقم اتصال مختلف؟\nأنظر أرقام الوصول إلى هذا الإجتماع: {{url}}\n\n\nإن كنت أيضًا تتصل عبر غرفة اتصال (room phone)، انضم دون الاتصال بالصوت: {{silentUrl}}",
"inviteSipEndpoint": "للانضمام باستخدام عنوان SIP ، أدخل هذا: {{sipUri}}",
"inviteTextiOSPersonal": "{{name}} يدعوك إلى اجتماع.",
"inviteTextiOSJoinSilent": "إذا كنت تقوم بالاتصال من خلال هاتف الغرفة ، فاستخدم هذا الارتباط للانضمام دون الاتصال بالصوت: {{silentUrl}}.",
"inviteTextiOSInviteUrl": "انقر فوق الرابط التالي للانضمام: {{inviteUrl}}.",
"inviteTextiOSPhone": "للانضمام عبر الهاتف ، استخدم هذا الرقم: {{number}},,{{conferenceID}}#. إذا كنت تبحث عن رقم مختلف ، فهذه هي القائمة الكاملة: {{didUrl}}.",
"inviteURLFirstPartGeneral": "دُعيِت للإنضمام إلى اجتماع",
"inviteURLFirstPartPersonal": "دعاك {{name}} لاجتماع.\n",
"inviteURLSecondPart": "\nانضم للاجتماع:\n{{url}}\n",
@@ -461,7 +362,6 @@
"noRoom": "لم تُخصَّص غرفة للاتصال إليها",
"numbers": "أرقام الاتصال",
"password": "$t(lockRoomPasswordUppercase):",
"sip": "SIP عنوان",
"title": "شارك",
"tooltip": "شارك رابط وتفاصيل الاتصال لهذا الاجتماع",
"label": "تفاصيل الاجتماع"
@@ -480,7 +380,6 @@
"support": "الدعم",
"supportMsg": "إن تكرَّر حصول هذا، تواصل مع"
},
"jitsiHome": "{{logo}} الشعار ، رابط إلى الصفحة الرئيسية",
"keyboardShortcuts": {
"focusLocal": "ركز على الفيديو الخاص بك",
"focusRemote": "ركز على فيديو مشارك آخر",
@@ -493,10 +392,10 @@
"showSpeakerStats": "اظهر حالة مكبر الصوت",
"toggleChat": "افتح/أغلق المحادثة",
"toggleFilmstrip": "أظهِر/اخفِ إطار الفيديو المُصغَّر",
"toggleParticipantsPane": "إظهار أو إخفاء قائمة المشاركين",
"toggleScreensharing": "بدِّل بين الكاميرا ومشاركة الشاشة",
"toggleShortcuts": "أظهِر/اخفِ اختصارات لوحة المفاتيح",
"videoMute": "ابدأ/أوقف كاميرتك"
"videoMute": "ابدأ/أوقف كاميرتك",
"videoQuality": "اضبط جودة المكالمة"
},
"liveStreaming": {
"limitNotificationDescriptionWeb": "نظرًا للضغط الكبير، سيقيَّد البث إلى {{limit}} د، ولكن إن أردت إجراء عملية بث غير محدودة، جرِّب <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
@@ -515,7 +414,6 @@
"expandedPending": "تبدأ عملية البث الحي...",
"failedToStart": "فشلت عملية بدء البث الحي",
"getStreamKeyManually": "لم نتمكن من الوصول إلى أي بث حي. جرب جلب مفتاح بث حي خاص بك من يوتيوب.",
"inProgress": "البث المباشر غير ممكّن على {{email}}. يرجى تمكين البث المباشر أو تسجيل الدخول إلى حساب مع تمكين البث المباشر.",
"invalidStreamKey": "يحتمل كون مفتاح البث الحي غير صحيح.",
"off": "أُوقِف البث الحي",
"offBy": "أوقف {{name}} البث الحي",
@@ -523,7 +421,6 @@
"onBy": "بدأ {{name}} بثًّا حيًّا",
"pending": "بدء بثٍّ حيٍّ",
"serviceName": "خدمة البث الحي",
"sessionAlreadyActive": "هذه الجلسة قيد التسجيل أو البث المباشر.",
"signedInAs": "أنت مسجل حاليًا بصفة:",
"signIn": "سجل الدخول عبر حساب غوغل",
"signInCTA": "سجل الدخول أو أدخل مفتاح البث الحي الخاص بك من يوتيوب",
@@ -567,15 +464,13 @@
"lockRoomPasswordUppercase": "كلمة المرور",
"me": "أنا",
"notify": {
"allowAction": "يسمح",
"allowedUnmute": "يمكنك إعادة صوت الميكروفون و بدء تشغيل الكاميرا أو مشاركة شاشتك.",
"connectedOneMember": "انضم {{name}} للاجتماع",
"connectedThreePlusMembers": "انضم {{name}} وعدد {{count}} غيره إلى الاجتماع",
"connectedTwoMembers": "انضم {{first}} و {{second}} إلى الاجتماع",
"disconnected": "انقطع الاتصال",
"focus": "التركيز على المؤتمر",
"focusFail": "إنَّ {{component}} غير متاح. ستعاد المحاولة مرة أخرى خلال {{ms}} ثانية.",
"hostAskedUnmute": "The moderator would like you to speak",
"grantedTo": "مُنِحت صلاحية رئيس الجلسة إلى {{to}}!",
"invitedOneMember": "دُعِي {{name}}",
"invitedThreePlusMembers": "دُعِي {{name}} وعدد {{count}} آخرين",
"invitedTwoMembers": "دُعِي {{first}} و {{second}}",
@@ -586,13 +481,9 @@
"mutedTitle": "مكتوم!",
"mutedRemotelyTitle": "كتم {{participantDisplayName}} الصوت لديك!",
"mutedRemotelyDescription": "يمكنك إلغاء الكتم متى كنت جاهزًا للتحدث. اكتم الصوت بعد الانتهاء من التحدث لخفض الضجيج أثناء الاجتماع",
"videoMutedRemotelyTitle": "Your video has been turned off by {{participantDisplayName}}",
"videoMutedRemotelyDescription": "You can always turn it on again.",
"passwordRemovedRemotely": "أزال أحد المشاركين {{participantDisplayName}}",
"passwordSetRemotely": "ضبط أحد المشاركين $t(lockRoomPasswordUppercase)",
"raisedHand": "يريد {{name}} التحدث",
"screenShareNoAudio": "لم يتم تحديد مربع مشاركة الصوت في شاشة تحديد النافذة.",
"screenShareNoAudioTitle": "تعذرت مشاركة صوت النظام!",
"somebody": "شخص ما",
"startSilentTitle": "انضممت دون مخرج للصوت!",
"startSilentDescription": "أنضم مجدَّدًا للاجتماع لتفعيل الصوت",
@@ -605,80 +496,10 @@
"OldElectronAPPTitle": "ثغرة أمنية!",
"oldElectronClientDescription1": "يبدو أنَّك تستعمل إصدارًا قديمًا من جيتسي يحوي ثغرة أمنية. تأكد رجاءً من أنَّك حدَّثته إلى ",
"oldElectronClientDescription2": "أحدث إصدار",
"oldElectronClientDescription3": " الآن!",
"moderationInEffectDescription": "من فضلك ارفع يدك إذا كنت تريد التحدث.",
"moderationInEffectCSDescription": "يرجى رفع اليد إذا كنت تريد مشاركة شاشتك.",
"moderationInEffectVideoDescription": "يرجى رفع يدك إذا كنت تريد بدء تشغيل الكاميرا.",
"moderationInEffectTitle": "تم كتم صوت الميكروفون الخاص بك بواسطة المشرف",
"moderationInEffectCSTitle": "تم حظر مشاركة الشاشة من قبل المشرف",
"moderationInEffectVideoTitle": "تم حظر الكاميرا الخاصة بك من قبل المشرف",
"moderationRequestFromModerator": "المضيف يريد منك إلغاء كتم الصوت",
"moderationRequestFromParticipant": "يريد التحدث",
"moderationStartedTitle": "بدأ الاشراف",
"moderationStoppedTitle": "توقف الاشراف",
"moderationToggleDescription": "من {{participantDisplayName}}",
"raiseHandAction": "رفع اليد",
"reactionSounds": "تعطيل الأصوات",
"groupTitle": "إشعارات"
},
"participantsPane": {
"close": "غلق",
"header": "مشاركون",
"headings": {
"lobby": "الردهة ({{count}})",
"participantsList": "المشاركون في الاجتماع({{count}})",
"waitingLobby": "منتظرون في الردهة ({{count}})"
},
"actions": {
"allow": "السماح للحاضرين بـ:",
"allowVideo": "السماح بالفيديو",
"audioModeration": "إعادة صوت أنفسهم",
"blockEveryoneMicCamera": "حظر ميكروفون وكاميرا الجميع",
"invite": "قم بدعوة شخص ما",
"askUnmute": "اطلب إعادة الصوت",
"moreModerationActions": "المزيد من خيارات الاشراف",
"moreParticipantOptions": "المزيد من خيارات المشاركين",
"mute": "كتم الصوت",
"muteAll": "كتم الكل",
"muteEveryoneElse": "كتم صوت الآخرين",
"stopEveryonesVideo": "أوقف فيديو الجميع",
"stopVideo": "أوقف الفيديو",
"unblockEveryoneMicCamera": "قم بإلغاء حظر ميكروفون وكاميرا الجميع",
"videoModeration": "ابدأ الفيديو الخاص بهم"
},
"search": "بحث"
"oldElectronClientDescription3": " الآن!"
},
"passwordSetRemotely": "ضبطها مشارك آخر",
"passwordDigitsOnly": "حتى {{number}} عدد",
"polls": {
"by": "من",
"create": {
"addOption": "إضافة خيار",
"answerPlaceholder": "خيار {{index}}",
"create": "إنشاء استطلاع",
"cancel": "إلغاء",
"pollOption": "خيار الاستطلاع {{index}}",
"pollQuestion": "سؤال الاستطلاع",
"questionPlaceholder": "طرح سؤال",
"removeOption": "إزالة خيار",
"send": "أرسل"
},
"answer": {
"skip": "تخطى",
"submit": "يقدم"
},
"results": {
"vote": "تصويت",
"changeVote": "تغيير التصويت",
"empty": "لا توجد استطلاعات للرأي في الاجتماع حتى الآن. ابدأ الاستطلاع هنا!",
"hideDetailedResults": "أخفِ التفاصيل",
"showDetailedResults": "اظهر التفاصيل"
},
"notification": {
"title": "تمت إضافة اقتراع جديد إلى هذا الاجتماع",
"description": "افتح علامة تبويب الاقتراع للتصويت"
}
},
"poweredby": "مُشغَّل بوساطة",
"prejoin": {
"audioAndVideoError": "خطأ في الصوت أو الفيديو:",
@@ -719,7 +540,6 @@
"errorDialOutFailed": "فشلت عملية الاتصال، للأسف.",
"errorDialOutStatus": "خطأ في معرفة حالة الاتصال",
"errorMissingName": "أدخل اسمك للدخول للاجتماع",
"errorNoPermissions": "تحتاج إلى تمكين الوصول إلى الميكروفون والكاميرا",
"errorStatusCode": "فشل الاتصال برمز خطأ: {{status}}",
"errorValidation": "فشل التحقق من الرقم",
"iWantToDialIn": "أريد الاتصال",
@@ -732,7 +552,6 @@
"or": "أو",
"premeeting": "ما قبل الاجتماع",
"showScreen": "تفعيل واجهة ما قبل الاجتماع",
"keyboardShortcuts": "تفعيل اختصارات لوحة المفاتيح",
"startWithPhone": "البدء مع جهاز الصوت من الجوال",
"screenSharingError": "خطأ في مشاركة الشاشة:",
"videoOnlyError": "خطأ في الفيديو:",
@@ -754,7 +573,6 @@
"ringing": "يرن..."
},
"profile": {
"avatar": "avatar",
"setDisplayNameLabel": "حدد اسمك المراد عرضه",
"setEmailInput": "أدخل بريدك الإلكتروني",
"setEmailLabel": "حدد الصورة الرمزية (gravatar) لبريدك الإلكتروني",
@@ -769,16 +587,12 @@
"beta": "تجريبي",
"busy": "نعمل على تحرير موارد التسجيل. حاول مرة أخرى بعد بضعة دقائق.",
"busyTitle": "جميع المسجلين مشغولون حاليًا",
"copyLink": "Copy Link",
"error": "فشل التسجيل. حاول مرة أخرى.",
"errorFetchingLink": "خطأ في جلب رابط التسجيل.",
"expandedOff": "أوقٍف التسجيل",
"expandedOn": "يُسجَّل الاجتماع الآن",
"expandedPending": "بدء التسجيل...",
"failedToStart": "فشل بدء التسجيل",
"fileSharingdescription": "شارك التسجيل مع المشاركين للاجتماع",
"inProgress": "التسجيل أو البث المباشر قيد التقدم",
"linkGenerated": "لقد أنشأنا رابطًا لتسجيلك.",
"live": "مباشر",
"loggedIn": "مُسجَّل باسم {{userName}}",
"off": "أوقِف التسجيل",
@@ -788,14 +602,11 @@
"pending": "التحضير لتسجيل الاجتماع...",
"rec": "تسجيل",
"serviceDescription": "ستحفظ خدمة التسجيل الفيديو المستجل",
"serviceDescriptionCloud": "تسجيل سحابي",
"serviceName": "خدمة التسجيل",
"sessionAlreadyActive": "هذه الجلسة قيد التسجيل أو البث المباشر.",
"signIn": "دخول",
"signOut": "خروج",
"unavailable": "عجبًا! {{serviceName}} غير متاحة حاليًا. نعمل على حل المشكلة. حاول مرة أخرى لاحقًا.",
"unavailableTitle": "التسجيل غير متاح",
"uploadToCloud": "تحميل إلى السحابة"
"unavailableTitle": "التسجيل غير متاح"
},
"sectionList": {
"pullToRefresh": "اسحب للتحديث"
@@ -814,13 +625,8 @@
"signedIn": "يجري الوصول إلى أحداث الرزنامة حاليًا التي تخص {{email}}. اضغط على زر قطع الاتصال بالأسفل لإيقاف الوصول إلى أحداث المسجلة في الرزنامة.",
"title": "الرزنامة"
},
"desktopShareFramerate": "معدل إطارات مشاركة سطح المكتب",
"desktopShareWarning": "تحتاج إلى إعادة تشغيل مشاركة الشاشة حتى تدخل الإعدادات الجديدة حيز التنفيذ. تحتاج إلى إعادة تشغيل مشاركة الشاشة حتى يتم تفعيل الإعدادات الجديدة.",
"desktopShareHighFpsWarning": "قد يؤثر معدل الإطارات الأعلى لمشاركة سطح المكتب على النطاق الترددي الخاص بك. تحتاج إلى إعادة تشغيل مشاركة الشاشة حتى تدخل الإعدادات الجديدة حيز التنفيذ.",
"devices": "الأجهزة",
"followMe": "كل من يتابعني",
"framesPerSecond": "إطار في الثانية",
"incomingMessage": "رسالة واردة",
"language": "اللغة",
"loggedIn": "الدخول باسم {{name}}",
"microphones": "المجهار (المايكروفون)",
@@ -828,19 +634,12 @@
"more": "المزيد",
"name": "الاسم",
"noDevice": "لا يوجد",
"participantJoined": "انضم مشارك",
"participantLeft": "غادر المشارك",
"playSounds": "تشغيل الصوت عند:",
"reactions": "ردود فعل الاجتماع",
"sameAsSystem": "مثل النظام ({{label}})",
"selectAudioOutput": "خرج الصوت",
"selectCamera": "الكاميرا",
"selectMic": "المجهار (المايكروفون)",
"sounds": "اصوات",
"speakers": "المذياع (مكبر الصوت)",
"startAudioMuted": "بدء الجميع مكتومي الصوت",
"startVideoMuted": "بدء الجميع دون فيديو",
"talkWhileMuted": "تحدث أثناء كتم الصوت",
"title": "الإعدادات"
},
"settingsView": {
@@ -871,24 +670,15 @@
},
"speaker": "المتحدث",
"speakerStats": {
"search": "بحث",
"hours": "{{count}}س",
"minutes": "{{count}}د",
"name": "الاسم",
"seconds": "{{count}}ثا",
"speakerStats": "حالة المتحدث",
"speakerTime": "وقت المتحدث",
"happy": "سعيد",
"neutral": "حيادي",
"sad": "حزين",
"surprised": "مندهش",
"angry": "غاضب",
"fearful": "خائف",
"disgusted": "مشمئز"
"speakerTime": "وقت المتحدث"
},
"startupoverlay": {
"policyText": " ",
"genericTitle": "يحتاج الاجتماع إلى استخدام الميكروفون والكاميرا.",
"title": "يريد {{app}} استعمال المجهار والكاميرا خاصَّتك."
},
"suspendedoverlay": {
@@ -900,12 +690,9 @@
"accessibilityLabel": {
"audioOnly": "بدل الصوت فقط",
"audioRoute": "اختر جهاز الصوت",
"boo": "Boo",
"breakoutRoom": "الانضمام / مغادرة غرفة فرعية",
"callQuality": "اضبط دقة الفيديو",
"cc": "اظهِر/اخفِ الترجمة",
"chat": "اظهِر/اخفِ نافذة الدردشة",
"clap": "تصفيق",
"document": "اظهِر/اخفِ الملف المشارك",
"download": "نزِّل التطبيق",
"embedMeeting": "ضمِّن الاجتماع",
@@ -916,8 +703,6 @@
"help": "مساعدة",
"invite": "ادعُ آخرين",
"kick": "اطرد مشاركًا",
"laugh": "يضحك",
"like": "رفع الإبهام متمنيا النجاح",
"lobbyButton": "فعِّل/عطِّل وضع غرفة الانتظار",
"localRecording": "اظهِر/اخفِ التحكم بالتسجيل المحلي",
"lockRoom": "اظهِر/اخفِ كلمة مرور الاجتماع",
@@ -926,52 +711,34 @@
"moreOptions": "اظهر المزيد من الخيارت",
"mute": "اظهِر/اخفِ كتم الصوت",
"muteEveryone": "كتم الجميع",
"muteEveryoneElse": "كتم صوت الآخرين",
"muteEveryonesVideo": "تعطيل كاميرا الجميع",
"muteEveryoneElsesVideo": "تعطيل كاميرا الآخرين",
"participants": "مشاركون",
"pip": "استعمل/اخرج من وضع صورة-في-صورة",
"privateMessage": "أرسل رسالة خاصة",
"profile": "عدِّل ملفك الشخصي",
"raiseHand": "اظهِر/اخفِ رفع اليد",
"reactionsMenu": "فتح / إغلاق قائمة التفاعلات",
"recording": "اظهِر/اخفِ التسجيل",
"remoteMute": "اكتم مشاركًا",
"remoteVideoMute": "تعطيل كاميرا المشارك",
"security": "خيارات الحماية",
"Settings": "اظهِر/اخفِ الإعدادات",
"shareaudio": "مشاركة الصوت",
"sharedvideo": "اظهِر/اخفِ مشاركة فيديو يوتيوب",
"shareRoom": "ادعُ أحدًا",
"shareYourScreen": "بدِّل وضع مشاركة الشاشة",
"shortcuts": "اظهِر/اخفِ الاختصارات",
"show": "اظهر على المنصة",
"silence": "Silence",
"speakerStats": "اظهِر/اخفِ حالة المتحدث",
"surprised": "مندهش",
"tileView": "اظهِر/اخفِ عرض العنوان",
"toggleCamera": "بدِّل الكاميرا",
"toggleFilmstrip": "بدِّل وضع الشريط السينمائي (filmstrip)",
"videomute": "بدِّل وضع اخفاء الفيديو",
"videoblur": "استعمل/اخرج من وضع تغبيش خلفية الفيديو",
"selectBackground": "اختر الخلفية",
"expand": "وسّع",
"collapse": "قلّص"
"videoblur": "استعمل/اخرج من وضع تغبيش خلفية الفيديو"
},
"addPeople": "اضف أحدًا إلى المكالمة",
"audioSettings": "إعدادات الصوت",
"videoSettings": "اعدادات الفيديو",
"audioOnlyOff": "عطِّل وضع معدَّل نقل البيانات المنخفص",
"audioOnlyOn": "فعِّل وضع نقل البيانات المنخفض",
"audioRoute": "اختر جهاز الصوت",
"authenticate": "اَجرِ عملية الاستيثاق",
"boo": "Boo",
"callQuality": "اضبط دقة الفيديو",
"chat": "افتح / أغلق الشاشة",
"clap": "تصفيق",
"closeChat": "أغلق الدردشة",
"closeReactionsMenu": "إغلاق قائمة ردود الفعل",
"disableReactionSounds": "يمكنك تعطيل أصوات ردود الفعل لهذا الاجتماع",
"documentClose": "أغلق الملف المشارك",
"documentOpen": "افتح الملف المشارك",
"download": "نزِّل التطبيق",
@@ -985,10 +752,6 @@
"hangup": "غادر",
"help": "مساعدة",
"invite": "ادعُ أحدًا",
"joinBreakoutRoom": "انضم إلى غرفة الجانبية",
"laugh": "يضحك",
"leaveBreakoutRoom": "اترك إلى غرفة الجانبية",
"like": "رفع الإبهام متمنيا النجاح",
"lobbyButtonDisable": "عطِّل وضع غرفة الانتظار",
"lobbyButtonEnable": "فعِّل وضع غرفة الانتظار",
"login": "ادخل",
@@ -998,7 +761,6 @@
"moreOptions": "المزيد من الخيارات",
"mute": "اكتم / ألغ الكتم",
"muteEveryone": "اكتم الجميع",
"muteEveryonesVideo": "تعطيل كاميرا الجميع",
"noAudioSignalTitle": "لا يصلنا شيئًا من المجهار (المايكروفون) الخاص بك",
"noAudioSignalDesc": "إن لم تكتمه عمدًا من إعدادات النظام لديك أو من الجهاز نفسه، بدِّله إلى جهاز آخر.",
"noAudioSignalDescSuggestion": "إن لم تكتمه عمدًا من إعدادات النظام لديك أو من الجهاز نفسه، بدِّله إلى الجهاز الموصى به.",
@@ -1007,39 +769,28 @@
"noisyAudioInputTitle": "يبدو أنَّ المجهار (المايكروفون) لديك يصدر الكثير من الضجة!",
"noisyAudioInputDesc": "يبدو أنَّ المجهار (المايكروفون) لديك يصدر الكثير من الضجة، اكتمه رجاءً أو استعمل مجهارًا آخر.",
"openChat": "فتح الدرشة",
"openReactionsMenu": "افتح قائمة التفاعلات",
"participants": "مشاركون",
"pip": "استعمل وضع صورة-في-صورة",
"privateMessage": "أرسل رسالة خاصة",
"profile": "عدِّل ملفك الشخصي",
"raiseHand": "ارفع / اخفض يدك",
"raiseYourHand": "ارفع يدك",
"reactionBoo": "أرسل رد فعل بوو",
"reactionClap": "أرسل رد فعل التصفيق",
"reactionLaugh": "أرسل رد فعل يضحك",
"reactionLike": "إرسال رد فعل ممتاز",
"reactionSilence": "أرسل رد فعل الصمت",
"reactionSurprised": "أرسل رد فعل متفاجئًا",
"security": "خيارات الحماية",
"Settings": "الإعدادات",
"shareaudio": "مشاركة الصوت",
"sharedvideo": "شارك فيديو يوتيوب",
"shareRoom": "ادعُ أحدًا",
"shortcuts": "اعرض الاختصارات",
"silence": "سكوت",
"speakerStats": "حالة المتحدث",
"startScreenSharing": "ابدأ بمشاركة الشاشة",
"startSubtitles": "أظهر الترجمة",
"stopAudioSharing": "وقف مشاركة الصوت",
"stopScreenSharing": "أوقف مشاركة الشاشة",
"stopSubtitles": "أخفِ الترجمة",
"stopSharedVideo": "أوقف فيديو يوتيوب المشارك",
"surprised": "مندهش",
"talkWhileMutedPopup": "أتحاول التحدث؟ المجهار مكتوم لديك.",
"tileViewToggle": "بدِّل عنوان العرض",
"toggleCamera": "بدِّل الكاميرا",
"videomute": "استعمل / أوقف الكاميرا",
"selectBackground": "اختر الخلفية"
"startvideoblur": "غبِّش الخلفية",
"stopvideoblur": "توقف عن تغبيش الخلفية"
},
"transcribing": {
"ccButtonTooltip": "أظهر / أخف الترجمة",
@@ -1065,7 +816,6 @@
"react-nativeGrantPermissions": "اختر <b><i>السماح</i></b> عندما يطلب المتصفح الأذونات.",
"safariGrantPermissions": "اختر <b><i>تمام</i></b> عندما يطلب المتصفح الأذونات."
},
"volumeSlider": "مستوى الصوت",
"videoSIPGW": {
"busy": "نعمل على تحرير الموارد. حاول مرة أخرى لاحقًا بعد بضعة دقائق.",
"busyTitle": "خدمة الغرفة مشغولة حاليًا",
@@ -1077,10 +827,7 @@
"pending": "دعي {{displayName}} مسبقًا"
},
"videoStatus": {
"adjustFor": "ضبط ل:",
"audioOnly": "صوت",
"bestPerformance": "أفضل أداء",
"highestQuality": "اعلى جودة",
"audioOnlyExpanded": "أنت في وضع معدَّل البيانات المتبادلة المنخفض. الصوت ومشاركة الشاشة هو المتاح فقط في هذا الوضع.",
"callQuality": "جودة الفيديو",
"hd": "دقة عالية",
@@ -1091,30 +838,26 @@
"ld": "دقة منخفضة",
"ldTooltip": "عرض فيديو بدقة منخفضة",
"lowDefinition": "دقة منخفضة",
"performanceSettings": "إعدادات الأداء",
"onlyAudioAvailable": "الصوت متاح فقط",
"onlyAudioSupported": "الصوت مدعوم فقط في هذا المتصفح",
"sd": "دقة قياسية",
"sdTooltip": "عرض فيديو بدقة قياسية",
"standardDefinition": "دقة قياسية"
},
"videothumbnail": {
"connectionInfo": "معلومات الاتصال",
"domute": "كتم",
"domuteVideo": "تعطيل الكاميرا",
"domuteOthers": "كتم الجميع",
"domuteVideoOfOthers": "تعطيل الكاميرا للآخرين",
"flip": "قلب",
"grantModerator": "امنح صلاحيات رئيس الجلسة",
"kick": "طرد خارجًا",
"moderator": "رئيس الجلسة",
"mute": "المشارك مكتوم الصوت",
"muted": "مكتوم",
"videoMuted": "الكاميرا معطلة",
"remoteControl": "بدء / إيقاف التحكم البعيد",
"show": "أظهر على المنصة",
"videomute": "أوقف المشارك الكاميرا"
},
"welcomepage": {
"addMeetingName": "أضف اسم الاجتماع",
"accessibilityLabel": {
"join": "انقر للمشاركة",
"roomname": "أدخل اسم الغرفة"
@@ -1131,14 +874,8 @@
"getHelp": "أريد مساعدة",
"go": "ابدأ",
"goSmall": "ابدأ",
"headerTitle": "حِـــوار جيتسي",
"headerSubtitle": "آمــن وبنـوعيـة فـائقـة الجـودة",
"info": "معلومات",
"join": "أنشئ / انضم",
"jitsiOnMobile": "جيتسي على الهاتف المحمول - حمّل تطبيقاتنا وابدأ اجتماعًا من أي مكان",
"mobileDownLoadLinkIos": "قم بتنزيل تطبيق الهاتف لنظام iOS",
"mobileDownLoadLinkAndroid": "قم بتنزيل تطبيق الهاتف لنظام أندرويد",
"mobileDownLoadLinkFDroid": "قم بتنزيل تطبيق الجوال لـ F-Droid",
"moderatedMessage": "أو a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">احجز رابط لاجتماع</a> إن كنت رئيس الجلسة الوحيد فقط.",
"privacy": "الخصوصية",
"recentList": "الجديد",
@@ -1149,34 +886,17 @@
"roomname": "أدخل اسم الغرفة",
"roomnameHint": "أدخل اسم أو رابط الغرفة التي تريد الانضمام إليها. يمكنك إنشاء اسم جديد لترسله إلى من تريد أن تجتمع معهم.",
"sendFeedback": "أبدِ رأيك",
"startMeeting": "إبدأ الحـِوار",
"terms": "الشروط",
"title": "منصة عقد مؤتمرات واجتماعات آمنة وكاملة المزايا ومجانية بالمطلق",
"logo": {
"calendar": "شعار التقويم",
"microsoftLogo": "شعار مايكروسوفت",
"logoDeepLinking": "شعار jitsi",
"desktopPreviewThumbnail": "صورة مصغرة لمعاينة سطح المكتب",
"googleLogo": "شعار كوكل",
"policyLogo": "شعار السياسة"
}
"title": "منصة عقد مؤتمرات واجتماعات آمنة وكاملة المزايا ومجانية بالمطلق"
},
"lonelyMeetingExperience": {
"button": "ادعُ آخرين",
"youAreAlone": "أنت بمفردك في الاجتماع"
},
"termsView": {
"header": "مصطلحات"
},
"privacyView": {
"header": "خصوصية"
},
"helpView": {
"header": "مركز المساعدة"
},
"lobby": {
"admit": "سمح بالدخول",
"admitAll": "سمح للجميع بالدخول",
"knockingParticipantList": "تنبيه قائمة المشاركين",
"allow": "اسمح",
"backToKnockModeButton": "لا يوجد كلمة مرور، اطلب الإذن بالدخول بدلًا من ذلك.",
@@ -1189,7 +909,6 @@
"enableDialogText": "يحمي وضع الانتظار غرفة الاجتماع عبر منح رئيس الجلسة إمكانية الموافقة على انضمام المشاركين.",
"enterPasswordButton": "أدخل كلمة المرور لهذا الاجتماع",
"enterPasswordTitle": "أدخل كلمة المرور للدخول للاجتماع",
"errorMissingPassword": "الرجاء إدخال كلمة مرور الاجتماع",
"invalidPassword": "كلمة مرور غير صحيحة",
"joiningMessage": "ستتمكن من الانضمام للاجتماع بعد الموافقة على طلبك",
"joinWithPasswordMessage": "الرجاء الانتظار أثناء محاولة الدخول دون كلمة مرور...",
@@ -1208,7 +927,6 @@
"passwordField": "أدخل كلمة الدخول إلى الاجتماع",
"passwordJoinButton": "انضم",
"reject": "رفض",
"rejectAll": "رفض الكل",
"toggleLabel": "فعِّل غرفة الانتظار"
}
}

View File

@@ -488,8 +488,8 @@
},
"profile": {
"setDisplayNameLabel": "Якое адлюстроўваецца імя",
"setEmailInput": "Калі ласка, увядзіце email",
"setEmailLabel": "Email для Gravatar",
"setEmailInput": "Калі ласка, увядзіце e-mail",
"setEmailLabel": "E-mail для Gravatar",
"title": "Профіль"
},
"raisedHand": "Хоча гаварыць",
@@ -558,7 +558,7 @@
"disableCallIntegration": "Адключыць убудаваную інтэграцыю выклікаў",
"disableP2P": "Адключыць рэжым Peer-To-Peer",
"displayName": "Якое адлюстроўваецца імя",
"email": "Email",
"email": "E-mail",
"header": "Налады",
"profileSection": "Профіль",
"serverURL": "Адрас сервера",

View File

@@ -236,7 +236,7 @@
"remoteControlDeniedMessage": "{{user}} ha rebutjat la petició de control remot!",
"remoteControlErrorMessage": "S'ha produït un error en intentar sol·licitar a {{user}} permisos de control remot!",
"remoteControlRequestMessage": "Voleu permetre a {{user}} de controlar remotament el vostre escriptori?",
"remoteControlShareScreenWarning": "Tingueu present que si pitgeu \"Permet\"compartireu la vostra pantalla!",
"remoteControlShareScreenWarning": "Tingueu present que si pitgeu \"Permet\" compartireu la vostra pantalla!",
"remoteControlStopMessage": "La sessió de control remot ha finalitzat!",
"remoteControlTitle": "Control d'escriptori remot",
"Remove": "Suprimeix",
@@ -577,7 +577,7 @@
},
"startupoverlay": {
"title": "{{app}} requereix usar el micròfon i la càmera.",
"policyText": ""
"policyText": " "
},
"suspendedoverlay": {
"rejoinKeyTitle": "Torna a entrar",
@@ -782,42 +782,5 @@
},
"helpView": {
"header": "Centre d'ajuda"
},
"lobby": {
"admit": "Acceptar",
"admitAll": "Acceptar Tots",
"knockingParticipantList": "Participants en espera",
"allow": "Permetre",
"backToKnockModeButton": "Sol·licitar entrada",
"dialogTitle": "Sala despera",
"disableDialogContent": "La sala despera està habilitada actualment. Aquesta funció garanteix que els participants no desitjats no puguin unir-se a la seva reunió. Vols deshabilitar-ho?",
"disableDialogSubmit": "Deshabilitat",
"emailField": "Introdueix el teu email",
"enableDialogPasswordField": "Estableix la contrasenya (opcional)",
"enableDialogSubmit": "Habilitat",
"enableDialogText": "La sala despera li permet protegir la seva reunió en permetre que les persones només entrin després duna aprovació formal per part dun moderador.",
"enterPasswordButton": "Introduir la contrasenya de la reunió",
"enterPasswordTitle": "Introdueixi la contrasenya per a unir-se a la reunió",
"errorMissingPassword": "Si us plau, Introdueixi la contrasenya de la reunió",
"invalidPassword": "Contrasenya errònia",
"joiningMessage": "Tuniràs a la reunió tan aviat com algú accepti la teva sol·licitud",
"joinWithPasswordMessage": "Intentant unir-se amb contrasenya, esperi ...",
"joinRejectedMessage": "Un moderador va rebutjar la seva sol·licitud per a unir-se.",
"joinTitle": "Unir-se a la reunió",
"joiningTitle": "Sol·licitar unir-se a la reunió...",
"joiningWithPasswordTitle": "Connectant-se a la reunió amb contrasenya...",
"knockButton": "Sol·licitar entrada a la reunió",
"knockTitle": "Algú vol unir-se a la reunió",
"nameField": "Introdueix el teu nom",
"notificationLobbyAccessDenied": "{{originParticipantName}} ha rebutjat lentrada a la reunió de {{targetParticipantName}}",
"notificationLobbyAccessGranted": "{{originParticipantName}} ha acceptat lentrada a la reunió de {{targetParticipantName}}",
"notificationLobbyDisabled": "La sala despera ha estat deshabilitada per {{originParticipantName}}",
"notificationLobbyEnabled": "La sala despera ha estat habilitada per {{originParticipantName}}",
"notificationTitle": "Sala despera",
"passwordField": "Introduir la contrasenya de la reunió",
"passwordJoinButton": "Unir-se",
"reject": "Rebutjar",
"rejectAll": "Rebutjar Tots",
"toggleLabel": "Habilitar sala despera"
}
}

View File

@@ -7,11 +7,11 @@
"copyStream": "Zkopírovat odkaz na živý přenos",
"countryNotSupported": "Toto místo zatím nepodporujeme.",
"countryReminder": "Voláte mimo USA? Nezapomeňte začít kódem své země!",
"defaultEmail": "Vás výchozí email",
"defaultEmail": "Vás výchozí e-mail",
"disabled": "Nemůžete pozvat lidi.",
"failedToAdd": "Nepodařilo se přidat účastníky",
"footerText": "Vytáčení je zakázáno.",
"googleEmail": "Email Google",
"googleEmail": "E-mail Google",
"inviteMoreHeader": "Jste v setkání sám/sama",
"inviteMoreMailSubject": "Přidejte se k setkání {{appName}}",
"inviteMorePrompt": "Pozvat další lidi",
@@ -21,7 +21,7 @@
"loadingPeople": "Hledání lidí pro pozvání",
"noResults": "Žádné odpovídající výsledky vyhledávání",
"noValidNumbers": "Zadejte telefonní číslo",
"outlookEmail": "Email Outlook",
"outlookEmail": "E-mail Outlook",
"searchNumbers": "Přidat telefonní čísla",
"searchPeople": "Hledat lidi",
"searchPeopleAndNumbers": "Hledat lidi nebo přidat jejich telefonní čísla",
@@ -30,7 +30,7 @@
"shareStream": "Sdílet odkaz na živý přenos",
"telephone": "Telefonní číslo: {{number}}",
"title": "Pozvěte lidi na toto setkání",
"yahooEmail": "Email Yahoo"
"yahooEmail": "E-mail Yahoo"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -462,7 +462,7 @@
"dialogTitle": "Mód předsálí",
"disableDialogContent": "Je zapnutý mód předsálí. Zajišťuje, aby do setkání nemohli vstoupit nežádoucí účastníci. Chcete jej vypnout?",
"disableDialogSubmit": "Vypnout",
"emailField": "Zadejte svoje emailovou adresu",
"emailField": "Zadejte svoje e-mailovou adresu",
"enableDialogPasswordField": "Nastavte heslo (volitelně)",
"enableDialogSubmit": "Zapnout",
"enableDialogText": "Mód předsálí vám umožňuje zabezpečit setkání tím, že se lidé mohou připojit až po formálním schválení moderátorem.",
@@ -637,8 +637,8 @@
},
"profile": {
"setDisplayNameLabel": "Nastavte si jméno",
"setEmailInput": "Zadejte email",
"setEmailLabel": "Nastavte si email vašeho Gravataru",
"setEmailInput": "Zadejte e-mail",
"setEmailLabel": "Nastavte si e-mail vašeho Gravataru",
"title": "Profil"
},
"raisedHand": "Chtěl(a) bych mluvit",
@@ -718,7 +718,7 @@
"disableCrashReportingWarning": "Určitě chcete vypnout hlášení o pádu? Nastavení se uplatní, až restartujete aplikaci.",
"disableP2P": "Vypnout mód Peer-To-Peer",
"displayName": "Zobrazované jméno",
"email": "Email",
"email": "E-mail",
"header": "Nastavení",
"profileSection": "Profil",
"serverURL": "URL serveru",

View File

@@ -39,20 +39,6 @@
"audioOnly": {
"audioOnly": "Geringe Bandbreite"
},
"breakoutRooms": {
"defaultName": "Breakout-Raum #{{index}}",
"mainRoom": "Hauptraum",
"actions": {
"add": "Breakout-Raum hinzufügen",
"autoAssign": "Automatisch auf Breakout-Räume verteilen",
"close": "Schließen",
"join": "Teilnehmen",
"leaveBreakoutRoom": "Breakout-Raum verlassen",
"more": "Mehr",
"remove": "Entfernen",
"sendToBreakoutRoom": "Anwesende in Breakout-Raum verschieben:"
}
},
"calendarSync": {
"addMeetingURL": "Konferenzlink hinzufügen",
"confirmAddLink": "Möchten Sie einen Jitsi-Link zu diesem Termin hinzufügen?",
@@ -227,9 +213,7 @@
"done": "Fertig",
"e2eeDescription": "Ende-zu-Ende-Verschlüsselung ist derzeit noch EXPERIMENTELL. Bitte beachten Sie, dass das Aktivieren der Ende-zu-Ende-Verschlüsselung diverse serverseitige Funktionen deaktiviert: Aufnahmen, Livestreaming und Telefoneinwahl. Bitte beachten Sie außerdem, dass der Konferenz dann nur noch mit Browsern beigetreten werden kann, die Insertable Streams unterstützen.",
"e2eeLabel": "Ende-zu-Ende-Verschlüsselung aktivieren",
"e2eeDisabledDueToMaxModeDescription": "Ende-zu-Ende-Verschlüsselung kann aufgrund der großen Zahl an Anwesenden nicht aktiviert werden.",
"e2eeWarning": "WARNUNG: Nicht alle Personen dieser Konferenz scheinen Ende-zu-Ende-Verschlüsselung zu unterstützen. Wenn Sie diese aktivieren, können die entsprechenden Personen nichts mehr sehen oder hören.",
"e2eeWillDisableDueToMaxModeDescription": "WARNUNG: Ende-zu-Ende-Verschlüsselung wird automatisch deaktiviert, wenn weitere Anwesende an der Konferenz teilnehmen.",
"enterDisplayName": "Bitte geben Sie hier Ihren Namen ein",
"embedMeeting": "Besprechung einbetten",
"error": "Fehler",
@@ -349,7 +333,6 @@
"shareScreenWarningH1": "Wenn Sie Ihren Bildschirm freigeben wollen:",
"shareScreenWarningD1": "müssen Sie Ihre Audiofreigabe stoppen, bevor Sie ihren Bildschirm freigeben.",
"shareScreenWarningD2": "müssen Sie Ihre Audiofreigabe stoppen und dann die Bildschirmfreigabe mit der Option \"Audio freigeben\" starten.",
"sharedVideoLinkPlaceholder": "YouTube-URL oder direkte Video-URL",
"stopLiveStreaming": "Livestream stoppen",
"stopRecording": "Aufnahme stoppen",
"stopRecordingWarning": "Sind Sie sicher, dass Sie die Aufnahme stoppen möchten?",
@@ -515,7 +498,6 @@
"expandedPending": "Livestream wird gestartet …",
"failedToStart": "Livestream konnte nicht gestartet werden",
"getStreamKeyManually": "Wir waren nicht in der Lage, Livestreams abzurufen. Versuchen Sie, Ihren Livestream-Schlüssel von YouTube zu erhalten.",
"inProgress": "Livestreaming gestartet",
"invalidStreamKey": "Der Livestream-Schlüssel ist u. U. falsch.",
"off": "Livestream gestoppt",
"offBy": "{{name}} stoppte den Livestream",
@@ -523,7 +505,6 @@
"onBy": "{{name}} startete den Livestream",
"pending": "Livestream wird gestartet …",
"serviceName": "Livestreaming-Dienst",
"sessionAlreadyActive": "Diese Konferenz wird bereits als Livestream übertragen.",
"signedInAs": "Sie sind derzeit angemeldet als:",
"signIn": "Mit Google anmelden",
"signInCTA": "Anmelden oder den Streamschlüssel des YouTube-Livestreams eingeben.",
@@ -567,14 +548,13 @@
"lockRoomPasswordUppercase": "Passwort",
"me": "ich",
"notify": {
"allowAction": "Erlauben",
"allowedUnmute": "Sie können die Stummschaltung aufheben, Ihre Kamera einschalten oder Ihren Bildschirm teilen.",
"connectedOneMember": "{{name}} nimmt am Meeting teil",
"connectedThreePlusMembers": "{{name}} und {{count}} andere Personen nehmen am Meeting teil",
"connectedTwoMembers": "{{first}} und {{second}} nehmen am Meeting teil",
"disconnected": "getrennt",
"focus": "Konferenzleitung",
"focusFail": "{{component}} ist im Moment nicht verfügbar wiederholen in {{ms}} Sekunden",
"grantedTo": "Moderationsrechte an {{to}} vergeben!",
"hostAskedUnmute": "Die Moderation bittet Sie, das Mikrofon zu aktivieren",
"invitedOneMember": "{{name}} wurde eingeladen",
"invitedThreePlusMembers": "{{name}} und {{count}} andere wurden eingeladen",
@@ -618,6 +598,7 @@
"moderationStoppedTitle": "Moderation gestoppt",
"moderationToggleDescription": "von {{participantDisplayName}}",
"raiseHandAction": "Melden",
"groupTitle": "Benachrichtigungen",
"reactionSounds": "Interaktionstöne deaktivieren",
"groupTitle": "Benachrichtigungen"
},
@@ -631,13 +612,10 @@
},
"actions": {
"allow": "Anwesenden erlauben:",
"allowVideo": "Kamera einschalten",
"audioModeration": "Für sich selbst die Stummschaltung aufzuheben",
"blockEveryoneMicCamera": "Kamera und Mikrofon von allen sperren",
"invite": "Person einladen",
"askUnmute": "Anfragen, Stummschaltung aufzuheben",
"moreModerationActions": "Weitere Moderationsoptionen",
"moreParticipantOptions": "Mehr Optionen für Anwesende",
"mute": "Stummschalten",
"muteAll": "Alle stummschalten",
"muteEveryoneElse": "Alle anderen stummschalten",
@@ -645,13 +623,11 @@
"stopVideo": "Kamera ausschalten",
"unblockEveryoneMicCamera": "Kamera und Mikrofon von allen entsperren",
"videoModeration": "Kamera einschalten"
},
"search": "Suche Anwesende"
}
},
"passwordSetRemotely": "von einer anderen Person gesetzt",
"passwordDigitsOnly": "Bis zu {{number}} Ziffern",
"polls": {
"by": "Von {{ name }}",
"create": {
"addOption": "Antwort hinzufügen",
"answerPlaceholder": "Antwort {{index}}",
@@ -719,7 +695,6 @@
"errorDialOutFailed": "Anruf fehlgeschlagen. Anruf fehlgeschlagen",
"errorDialOutStatus": "Fehler beim Abrufen des Anrufstatus",
"errorMissingName": "Bitte geben Sie Ihren Namen ein, um der Konferenz beizutreten.",
"errorNoPermissions": "Sie müssen den Zugriff auf Mikrofon und Kamera erlauben",
"errorStatusCode": "Anruf fehlgeschlagen. Statuscode: {{status}}",
"errorValidation": "Nummerverifikation fehlgeschlagen",
"iWantToDialIn": "Ich möchte mich einwählen",
@@ -777,7 +752,6 @@
"expandedPending": "Aufzeichnung wird gestartet…",
"failedToStart": "Die Aufnahme konnte nicht gestartet werden",
"fileSharingdescription": "Aufzeichnung mit den Personen der Konferenz teilen",
"inProgress": "Aufzeichnung gestartet",
"linkGenerated": "Link zur Aufzeichnung wurde generiert.",
"live": "LIVE",
"loggedIn": "Als {{userName}} angemeldet",
@@ -790,7 +764,6 @@
"serviceDescription": "Ihre Aufzeichnung wird vom Aufzeichnungsdienst gespeichert",
"serviceDescriptionCloud": "Cloud-Aufzeichnung",
"serviceName": "Aufnahmedienst",
"sessionAlreadyActive": "Diese Konferenz wird bereits aufgezeichnet.",
"signIn": "Anmelden",
"signOut": "Abmelden",
"unavailable": "Oh! Der {{serviceName}} ist aktuell nicht verfügbar. Wir arbeiten an der Behebung des Problems. Bitte versuchen Sie es später noch einmal.",
@@ -877,14 +850,7 @@
"name": "Name",
"seconds": "{{count}} Sek.",
"speakerStats": "Sprechstatistik",
"speakerTime": "Sprechzeit",
"happy": "Fröhlich",
"neutral": "Neutral",
"sad": "Traurig",
"surprised": "Überrascht",
"angry": "Sauer",
"fearful": "Ängstlich",
"disgusted": "Angeekelt"
"speakerTime": "Sprechzeit"
},
"startupoverlay": {
"policyText": " ",
@@ -901,7 +867,6 @@
"audioOnly": "„Nur Audio“ ein-/ausschalten",
"audioRoute": "Audiogerät auswählen",
"boo": "Buhen",
"breakoutRoom": "Breakout-Räume betreten/verlassen",
"callQuality": "Qualitätseinstellungen",
"cc": "Untertitel ein-/ausschalten",
"chat": "Chatfenster öffnen / schließen",
@@ -933,7 +898,7 @@
"pip": "Bild-in-Bild-Modus ein-/ausschalten",
"privateMessage": "Private Nachricht senden",
"profile": "Profil bearbeiten",
"raiseHand": "Hand heben",
"raiseHand": "Hand erheben / senken",
"reactionsMenu": "Interaktionsmenü öffnen / schließen",
"recording": "Aufzeichnung ein-/ausschalten",
"remoteMute": "Personen stummschalten",
@@ -970,7 +935,7 @@
"chat": "Chat öffnen / schließen",
"clap": "Klatschen",
"closeChat": "Chat schließen",
"closeReactionsMenu": "Interaktionsmenü schließen",
"closeReactionsMenu": "Interationsmenü schließen",
"disableReactionSounds": "Sie können die Interaktionstöne für diese Konferenz deaktivieren",
"documentClose": "Geteiltes Dokument schließen",
"documentOpen": "Geteiltes Dokument öffnen",
@@ -985,9 +950,7 @@
"hangup": "Konferenz verlassen",
"help": "Hilfe",
"invite": "Personen einladen",
"joinBreakoutRoom": "In Breakout-Raum wechseln",
"laugh": "Lachen",
"leaveBreakoutRoom": "Breakout-Raum verlassen",
"like": "Daumen hoch",
"lobbyButtonDisable": "Lobbymodus deaktivieren",
"lobbyButtonEnable": "Lobbymodus aktivieren",
@@ -1007,12 +970,12 @@
"noisyAudioInputTitle": "Ihr Mikrofon scheint lärmintensiv zu sein!",
"noisyAudioInputDesc": "Es klingt, als ob Ihr Mikrofon Störgeräusche verursacht. Bitte überlegen Sie, ob Sie das Gerät stummschalten oder austauschen wollen.",
"openChat": "Chat öffnen",
"openReactionsMenu": "Interaktionsmenü öffnen",
"openReactionsMenu": "Interationsmenü öffnen",
"participants": "Anwesende",
"pip": "Bild-in-Bild-Modus einschalten",
"privateMessage": "Private Nachricht senden",
"profile": "Profil bearbeiten",
"raiseHand": "Hand heben",
"raiseHand": "Hand erheben / senken",
"raiseYourHand": "Melden",
"reactionBoo": "Buhen senden",
"reactionClap": "Klatschen senden",
@@ -1077,10 +1040,7 @@
"pending": "{{displayName}} wurde eingeladen"
},
"videoStatus": {
"adjustFor": "Einstellen für:",
"audioOnly": "AUD",
"bestPerformance": "Beste Leistung",
"highestQuality": "Höchste Qualität",
"audioOnlyExpanded": "Sie befinden sich im Modus „Nur Audio“. Dieser Modus benötigt weniger Bandbreite, Sie sehen jedoch nicht die Videos der anderen.",
"callQuality": "Videoqualität",
"hd": "HD",
@@ -1091,7 +1051,6 @@
"ld": "LD",
"ldTooltip": "Video wird in niedriger Auflösung angezeigt",
"lowDefinition": "Niedrige Auflösung",
"performanceSettings": "Qualitätseinstellungen",
"sd": "SD",
"sdTooltip": "Video wird in Standardauflösung angezeigt",
"standardDefinition": "Standardauflösung"
@@ -1165,12 +1124,6 @@
"button": "Andere einladen",
"youAreAlone": "Nur Sie sind in dieser Konferenz"
},
"termsView": {
"header": "Nutzungsbedingungen"
},
"privacyView": {
"header": "Datenschutz"
},
"helpView": {
"header": "Hilfecenter"
},

View File

@@ -544,7 +544,7 @@
},
"profile": {
"setDisplayNameLabel": "Ρυθμίστε το όνομα εμφάνισής σας",
"setEmailInput": "Εισάγετε το email",
"setEmailInput": "Εισάγετε το e-mail",
"setEmailLabel": "Ρυθμίστε το gravatar email",
"title": "Προφίλ"
},
@@ -621,7 +621,7 @@
"disableCallIntegration": "Απενεργοποίηση ολοκλήρωσης εγγενούς κλήσης",
"disableP2P": "Απενεργοποίηση λειτουργίας Peer-to-Peer",
"displayName": "Εμφανιζόμενο όνομα",
"email": "Email",
"email": "E-mail",
"header": "Ρυθμίσεις",
"profileSection": "Προφίλ",
"serverURL": "Διεύθυνση URL του διακομιστή",

View File

@@ -480,8 +480,8 @@
},
"profile": {
"setDisplayNameLabel": "Set your display name",
"setEmailInput": "Enter email",
"setEmailLabel": "Set your Gravatar email",
"setEmailInput": "Enter e-mail",
"setEmailLabel": "Set your Gravatar e-mail",
"title": "Profile"
},
"recording": {

View File

@@ -5,7 +5,6 @@
"copyInvite": "Copiar la invitación a la reunión",
"copyLink": "Copiar el link de la reunión",
"copyStream": "Copiar el link de la transmisión en vivo",
"contacts": "contactos",
"countryNotSupported": "Aún no contamos con soporte a este destino.",
"countryReminder": "¿Llamando fuera de los Estados Unidos? ¡Por favor, asegúrese de empezar con el código de país!",
"defaultEmail": "Dirección de correo por defecto",
@@ -17,14 +16,18 @@
"inviteMoreMailSubject": "Unirse a la reunión {{appName}}",
"inviteMorePrompt": "Invitar a más personas",
"linkCopied": "Link copiado al portapapeles",
"loading": "Buscando por contacto y número telefónico",
"loadingNumber": "Validando el número telefónico",
"loadingPeople": "Buscando contactos a invitar",
"noResults": "No se encontraron coincidencias",
"noValidNumbers": "Por favor ingrese un número de teléfono",
"outlookEmail": "Correo de Outlook",
"phoneNumbers": "números de teléfono",
"searching": "Búscando...",
"searchNumbers": "Agregar números telefónicos",
"searchPeople": "Buscar personas",
"searchPeopleAndNumbers": "Buscar personas o añadir sus números de teléfono",
"shareInvite": "Compartir la invitación a la reunión",
"shareLink": "Compartir el link de la reunion",
"shareStream": "Compartir el link de la transmición en vivo",
"sipAddresses": "direcciones sip",
"telephone": "Teléfono: {{number}}",
"title": "Invitar a otras personas a esta reunión",
"yahooEmail": "Correo de Yahoo"
@@ -58,7 +61,6 @@
"today": "Hoy"
},
"chat": {
"enter": "Entrar en la sala",
"error": "Error: su mensaje no se envío. Motivo: {{error}}",
"fieldPlaceHolder": "Escriba su mensaje aquí",
"messagebox": "Escriba un mensaje",
@@ -70,26 +72,17 @@
"titleWithPolls": "Introduce un apodo para usar el chat"
},
"privateNotice": "Mensaje privado para {{recipient}}",
"message": "Mensaje",
"messageAccessibleTitle": "{{user}} dice:",
"messageAccessibleTitleMe": "yo digo:",
"smileysPanel": "Panel de Emojis",
"tabs": {
"chat": "Chat",
"polls": "Encuestas"
},
"title": "Chat",
"titleWithPolls": "Chat",
"you": ""
"you": "usted"
},
"chromeExtensionBanner": {
"installExtensionText": "Instalar la extensión para Google Calendar y la integración con Office 365",
"buttonText": "Instalar extensión de Chrome",
"dontShowAgain": "No mostrar nuevamente",
"close": "Cerrar"
"dontShowAgain": "No mostrar nuevamente"
},
"connectingOverlay": {
"joiningRoom": "Conectándose a la reunión…"
"joiningRoom": "Conectándose a su reunión…"
},
"connection": {
"ATTACHED": "Adjunto",
@@ -101,6 +94,7 @@
"DISCONNECTED": "Desconectado",
"DISCONNECTING": "Desconectando",
"ERROR": "Error",
"RECONNECTING": "Ocurrió un problema en la red. Reconectando...",
"FETCH_SESSION_ID": "Obteniendo session-ID…",
"GET_SESSION_ID_ERROR": "Obtener session-id error: {{code}}",
"GOT_SESSION_ID": "Obteniendo session-ID… Listo",
@@ -124,6 +118,7 @@
"maxEnabledResolution": "enviar max",
"more": "Mostrar más",
"packetloss": "Pérdida de paquetes:",
"participant_id": "ID participante:",
"quality": {
"good": "Buena",
"inactive": "Inactivo",
@@ -135,9 +130,8 @@
"remoteaddress_plural": "Direcciones remotas:",
"remoteport": "Puerto remoto:",
"remoteport_plural": "Puertos remotos:",
"resolution": "Resolución:",
"savelogs": "Guardar logs",
"participant_id": "ID participante:",
"resolution": "Resolución:",
"status": "Calidad:",
"transport": "Transporte:",
"transport_plural": "Transportes:",
@@ -153,10 +147,11 @@
"description": "¿No pasó nada? Hemos intentado iniciar la reunión en la aplicación de escritorio {{app}}. Intenta de nuevo o inicia en la aplicación web {{app}}.",
"descriptionWithoutWeb": "¿No pasó nada? Intentamos iniciar su reunión en la aplicación de escritorio {{app}}.",
"downloadApp": "Descargar la app",
"launchWebButton": "Iniciar en el navegador",
"ifDoNotHaveApp": "Si aún no tienes la app:",
"ifHaveApp": "Si ya tienes la app:",
"joinInApp": "Unirse a la reunion usando la app",
"launchWebButton": "Iniciar en el navegador",
"openApp": "Continuar a la aplicación",
"title": "Iniciando la reunión en {{app}}…",
"tryAgainButton": "Intentar de nuevo en el escritorio"
},
@@ -183,14 +178,12 @@
"alreadySharedVideoMsg": "Otro participante ya está compartiendo un vídeo. Esta conferencia sólo permite compartir un vídeo a la vez.",
"alreadySharedVideoTitle": "Solo se permite un vídeo compartido a la vez",
"applicationWindow": "Ventana de aplicación",
"authenticationRequired": "Se requiere autenticación",
"Back": "Anterior",
"cameraConstraintFailedError": "Su cámara no satisface algunos de los requerimientos.",
"cameraNotFoundError": "No se encontró la cámara.",
"cameraNotSendingData": "No podemos acceder a la cámara. Asegúrate que no haya otra aplicación usándola, selecciona otro dispositivo del menú de configuración o intenta volver a cargar la aplicación.",
"cameraNotSendingDataTitle": "No es posible acceder a la cámara",
"cameraPermissionDeniedError": "No has otorgado permiso para usar la cámara. Puedes unirte a la conferencia de todos modos, pero los demás asistentes no te podrán ver. Usa el botón de la cámara en la barra de direcciones para solucionar esto.",
"cameraTimeoutError": "No se ha podido iniciar la fuente de vídeo. Se ha agotado el tiempo de espera.",
"cameraUnknownError": "No se puede usar la cámara por un motivo desconocido.",
"cameraUnsupportedResolutionError": "La cámara no admite la resolución de vídeo requerida.",
"Cancel": "Cancelar",
@@ -205,27 +198,29 @@
"connectError": "¡Oops! Algo salió mal y no fue posible conectarnos a la conferencia.",
"connectErrorWithMsg": "¡Oops! Algo salió mal y no fue posible conectarnos a la conferencia: {{msg}}",
"connecting": "Conectando",
"contactSupport": "Contacta al soporte técnico",
"copied": "Copiado",
"contactSupport": "Contacta al soporte técnico",
"copy": "Copiar",
"dismiss": "Descartar",
"displayNameRequired": "¡Hola! ¿Cuál es tu nombre?",
"done": "Listo",
"e2eeDescription": "El cifrado de extremo a extremo es actualmente EXPERIMENTAL. Tenga en cuenta que activarlo puede deshabilitar servicios como: grabación, transmisión en vivo y participación telefónica. Además, esta reunión solo funcionará con personas que se unan con un navegador.",
"e2eeLabel": "Habilitar cifrado Extremo-a-Extremo",
"e2eeDisabledDueToMaxModeDescription": "No se puede activar el cifrado de extremo a extremo debido al gran número de participantes en la conferencia.",
"e2eeDescription": "El cifrado de extremo a extremo es actualmente EXPERIMENTAL. Tenga en cuenta que activarlo puede deshabilitar servicios como: grabación, transmisión en vivo y participación telefónica. Además, esta reunión solo funcionará con personas que se unan con un navegador.",
"e2eeWarning": "ADVERTENCIA: No todos los participantes de esta reunión soportan el cifrado de extremo a extremo. Si usted habilita esta opción, ellos no podrán verlo ni oírlo.",
"e2eeWillDisableDueToMaxModeDescription": "ADVERTENCIA: El cifrado de extremo a extremo se desactivará automáticamente si se unen más participantes a la conferencia.",
"enterDisplayName": "Por favor ingresa tu nombre aquí",
"embedMeeting": "Incrustar reunión",
"enterDisplayNameToJoin": "Por favor ingresa tu nombre para unirte",
"error": "Error",
"externalInstallationMsg": "Necesita instalar nuestra extensión para compartir pantalla.",
"externalInstallationTitle": "Extensión requerida",
"goToStore": "Ir a la tienda web",
"gracefulShutdown": "Nuestro servicio se encuentra en mantenimiento. Por favor, intente más tarde.",
"grantModeratorDialog": "¿Estas seguro de que quieres convertir a este participante en moderator?",
"grantModeratorTitle": "Convertir en moderador",
"hideShareAudioHelper": "No volver a mostrar este diálogo",
"IamHost": "Soy el anfitrión",
"incorrectRoomLockPassword": "Contraseña incorrecta",
"incorrectPassword": "Nombre de usuario o contraseña incorrecta",
"inlineInstallationMsg": "Necesita instalar nuestra extensión para compartir escritorio.",
"inlineInstallExtension": "Instalar ahora",
"internalError": "¡Oops! Algo salió mal. El siguiente error ocurrió: {{error}}",
"internalErrorTitle": "Error interno",
"kickMessage": "Puede ponerse en contacto con {{participantDisplayName}} para obtener más detalles.",
@@ -233,14 +228,14 @@
"kickParticipantDialog": "¿Seguro que quiere expulsar a este participante?",
"kickParticipantTitle": "¿Expulsar a este participante?",
"kickTitle": "¡Ay! {{participantDisplayName}} te expulsó de la reunión",
"liveStreaming": "Transmisión en vivo",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "No es posible mientras la grabación este activa",
"liveStreaming": "Transmisión en vivo",
"liveStreamingDisabledForGuestTooltip": "Los invitados no pueden iniciar la transmisión en vivo.",
"liveStreamingDisabledTooltip": "Las trasmisiones están deshabilitadas.",
"lockMessage": "No se pudo bloquear la conferencia.",
"lockRoom": "Agregar $t(lockRoomPasswordUppercase) a la reunión",
"lockTitle": "El bloqueo falló",
"logoutQuestion": "¿Está seguro que desea salir y detener la conferencia?",
"login": "Iniciar sesión",
"logoutTitle": "Cerrar sesión",
"maxUsersLimitReached": "El límite máximo de participantes ha sido alcanzado. Por favor contacta al organizador o intenta más tarde.",
"maxUsersLimitReachedTitle": "La reunión está llena.",
@@ -249,34 +244,18 @@
"micNotSendingData": "Vaya a la configuración de su computadora para activar el micrófono y ajustar su nivel",
"micNotSendingDataTitle": "Su micrófono está silenciado en la configuración de su sistema",
"micPermissionDeniedError": "No ha otorgado permisos para usar su micrófono. Puede unirse a la conferencia, pero no lo podrán escuchar. Utilice el botón en la barra de dirección para solucionar esto.",
"micTimeoutError": "No se ha podido iniciar la fuente de audio. Se ha agotado el tiempo de espera.",
"micUnknownError": "No se puede usar el micrófono por motivos desconocidos.",
"moderationAudioLabel": "Permitir a los asistentes activar su audio.",
"moderationVideoLabel": "Permitir a los asistentes activar su video.",
"muteEveryoneElseDialog": "Una vez silenciados, no podrás quitarles el modo silencio, pero ellos podrán hacerlo en cualquier momento.",
"muteEveryoneElseTitle": "¿Silenciar a todos excepto a {{whom}}?",
"muteEveryoneDialog": "¿Estás seguro que quieres silenciar a todos? No podrás quitarles el silencio, pero ellos pueden quitárselo en cualquier momento.",
"muteEveryoneDialogModerationOn": "Los participantes pueden enviar una solicitud de intervención en cualquier momento.",
"muteEveryoneTitle": "¿Silenciar a todos?",
"muteEveryoneElsesVideoDialog": "Una vez desactivada la cámara, no podrás volver a activarla, pero pueden volver a activarla en cualquier momento.",
"muteEveryoneElsesVideoTitle": "¿Detener el vídeo de todos, excepto el de {{whom}}?",
"muteEveryonesVideoDialog": "Los participantes pueden encender su vídeo en cualquier momento.",
"muteEveryonesVideoDialogModerationOn": "Los participantes pueden enviar una solicitud para encender su vídeo en cualquier momento.",
"muteEveryonesVideoDialogOk": "Desactivar",
"muteEveryonesVideoTitle": "¿Detener el vídeo de todos?",
"muteEveryoneSelf": "ti mismo",
"muteEveryoneStartMuted": "Todos inician silenciados desde ahora",
"muteParticipantBody": "No podrás quitarles el modo en silencio, pero ellos pueden quitárselo en cualquier momento.",
"muteParticipantButton": "Silenciar",
"muteParticipantDialog": "¿Seguro que quieres silenciar a este participante? No podrás revertir esta acción, pero el participante podrá hacerlo en cualquier momento",
"muteParticipantsVideoDialog": "¿Estás seguro de que quieres apagar la cámara de este participante? No podrás volver a encender la cámara, pero ellos pueden volver a encenderla en cualquier momento.",
"muteParticipantTitle": "¿Silenciar a este participante?",
"muteParticipantsVideoButton": "Detener video",
"muteParticipantsVideoTitle": "¿Desactivar la cámara de este participante?",
"muteParticipantsVideoBody": "No podrás volver a encender la cámara, pero ellos pueden volver a encenderla en cualquier momento.",
"noDropboxToken": "No hay un token válido de Dropbox",
"Ok": "Aceptar",
"password": "Contraseña",
"passwordLabel": "$t(lockRoomPasswordUppercase)",
"passwordNotSupported": "No se soporta $t(lockRoomPassword) en la reunión",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) no es compatible",
@@ -289,6 +268,7 @@
"readMore": "mas",
"recording": "Grabando",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "No es posible mientras la transmisión en vivo este activa",
"recordingDisabledForGuestTooltip": "Los invitados no pueden iniciar grabaciones.",
"recordingDisabledTooltip": "Inicio de grabación desactivado.",
"rejoinNow": "Reunirse ahora",
"remoteControlAllowedMessage": "¡{{user}} ha aceptado tu solicitud de control remoto!",
@@ -308,6 +288,10 @@
"screenSharingAudio": "Compartir audio",
"screenSharingFailed": "¡Oops! ¡Algo salio mal, no se pudo iniciar la compartición de su pantalla!",
"screenSharingFailedTitle": "¡Fallo al compartir su pantalla!",
"screenSharingFailedToInstall": "¡Uy! La extensión de uso compartido de pantalla no se pudo instalar.",
"screenSharingFailedToInstallTitle": "La extensión de uso compartido de pantalla no se pudo instalar",
"screenSharingFirefoxPermissionDeniedError": "Algo salió mal al compartir pantalla. Asegúrate de habernos dado permiso para hacerlo.",
"screenSharingFirefoxPermissionDeniedTitle": "¡Uy! No pudimos iniciar el uso compartido de la pantalla.",
"screenSharingPermissionDeniedError": "¡Uy! Algo salió mal con tus permisos de extensión para compartir pantalla. Vuelve a cargar la página e intenta de nuevo.",
"sendPrivateMessage": "Acabas de recibir un mensaje privado. ¿Deseas responder en privado o a todos?",
"sendPrivateMessageCancel": "Enviar al grupo",
@@ -315,27 +299,15 @@
"sendPrivateMessageTitle": "¿Enviar en privado?",
"serviceUnavailable": "Servicio no disponible",
"sessTerminated": "Llamada terminada",
"sessionRestarted": "Llamada reiniciada por un problema de conexión.",
"Share": "Compartir",
"shareAudio": "Continuar",
"shareAudioTitle": "Cómo compartir el audio",
"shareAudioWarningTitle": "Hay que dejar de compartir la pantalla antes de compartir el audio",
"shareAudioWarningH1": "Si quieres compartir sólo el audio:",
"shareAudioWarningD1": "debes dejar de compartir la pantalla antes de compartir el audio.",
"shareAudioWarningD2": "Tienes que reiniciar tu pantalla compartida y marcar la opción \"compartir audio\".",
"shareMediaWarningGenericH2": "Si quieres compartir tu pantalla y audio",
"shareVideoLinkError": "Proporciona un enlace de YouTube correcto.",
"shareVideoTitle": "Compartir un vídeo",
"shareYourScreen": "Compartir pantalla",
"shareYourScreenDisabled": "Se desactivó la opción para compartir pantalla.",
"shareYourScreenDisabledForGuest": "Los invitados no pueden compartir la pantalla.",
"startLiveStreaming": "Iniciar transmisión en vivo",
"startRecording": "Iniciar grabación",
"startRemoteControlErrorMessage": "Se produjo un error al intentar iniciar la sesión de control remoto.",
"shareScreenWarningTitle": "Tienes que dejar de compartir el audio antes de compartir la pantalla",
"shareScreenWarningH1": "Si quieres compartir sólo tu pantalla:",
"shareScreenWarningD1": "debes dejar de compartir el audio antes de compartir la pantalla.",
"shareScreenWarningD2": "tienes que dejar de compartir el audio, empezar a compartir la pantalla y marcar la opción \"compartir el audio\".",
"sharedVideoLinkPlaceholder": "Enlace de YouTube o enlace de vídeo directo",
"stopLiveStreaming": "Detener transmisión en vivo",
"stopRecording": "Detener grabación",
"stopRecordingWarning": "¿Estás seguro de que deseas detener la grabación?",
@@ -348,20 +320,12 @@
"tokenAuthFailedTitle": "Error de autenticación",
"transcribing": "Transcribiendo",
"unlockRoom": "Quitar la $t(lockRoomPassword) de reunión",
"user": "Usuario",
"userIdentifier": "Identificador de usuario",
"userPassword": "contraseña del usuario",
"videoLink": "Enlace de vídeo",
"viewUpgradeOptions": "Ver opciones de mejora",
"viewUpgradeOptionsContent": "Para obtener acceso ilimitado a las funciones premium, como la grabación, las transcripciones, el streaming RTMP y otras, tendrás que actualizar tu plan.",
"viewUpgradeOptionsTitle": "¡Has descubierto una característica premium!",
"WaitForHostMsg": "La conferencia <b>{{room}}</b> aún no ha comenzado. Si eres el anfitrión, inicia sesión. De lo contrario, espera a que llegue el anfitrión.",
"WaitForHostMsgWOk": "La conferencia <b>{{room}}</b> aún no ha comenzado. Si eres el anfitrión, presiona Aceptar para autenticar. De lo contrario, espera a que llegue el anfitrión.",
"WaitingForHostTitle": "Esperando al anfitrión...",
"WaitingForHost": "Esperando al anfitrión",
"Yes": "Sí",
"yourEntireScreen": "Toda la pantalla",
"remoteUserControls": "El control remoto de {{username}}",
"localUserControls": "Controles de usuario locales"
"yourEntireScreen": "Toda la pantalla"
},
"dialOut": {
"statusMessage": "está {{status}}"
@@ -373,30 +337,10 @@
"labelToolTip": "La comunicación de audio y vídeo en esta reunión está cifrada de extremo a extremo"
},
"embedMeeting": {
"title": "Insertar esta reunión"
"title": "Insertar reunión en sitio web"
},
"virtualBackground": {
"apply": "Aplicar",
"title": "Fondos virtuales",
"blur": "Desenfoque",
"slightBlur": "Desenfoque Ligero",
"removeBackground": "Eliminar el fondo",
"addBackground": "Añadir fondo",
"pleaseWait": "Por favor, espera...",
"none": "Ninguno",
"uploadedImage": "Imagen subida {{index}}",
"deleteImage": "Borrar imagen",
"image1": "Playa",
"image2": "Pared neutra blanca",
"image3": "Habitación blanca y vacía",
"image4": "Lámpara de pie negra",
"image5": "Montaña",
"image6": "Bosque",
"image7": "Amanecer",
"desktopShareError": "No se ha podido crear el escritorio compartido",
"desktopShare": "Compartir el escritorio",
"webAssemblyWarning": "No se admite WebAssembly",
"backgroundEffectError": "No se ha podido aplicar el efecto de fondo."
"embedMeeting": {
"title": "Insertar esta reunión"
},
"feedback": {
"average": "Promedio",
@@ -405,8 +349,7 @@
"good": "Buena",
"rateExperience": "¿Cómo estuvo tu experiencia en la reunión?",
"veryBad": "Muy mala",
"veryGood": "Muy buena",
"star": "Estrella"
"veryGood": "Muy buena"
},
"incomingCall": {
"answer": "Contestar",
@@ -423,7 +366,6 @@
"country": "País",
"dialANumber": "Para unirte a la reunión, marca uno de estos números y, luego introduce el PIN.",
"dialInConferenceID": "PIN:",
"copyNumber": "Copiar número",
"dialInNotSupported": "Lo sentimos, actualmente no se admite el marcado telefónico a la reunión.",
"dialInNumber": "Marcar:",
"dialInSummaryError": "Se ha producido un error al capturar la información de marcación. Vuelva a intentarlo más tarde",
@@ -432,11 +374,6 @@
"inviteLiveStream": "Para ver la transmisión en vivo de esta reunión, haz clic en este enlace: {{url}}",
"invitePhone": "También puedes entrar por llamada telefónica: Marca al número {{number}}, y al escuchar la contestadora introduce {{conferenceID}}#\n",
"invitePhoneAlternatives": "Si necesitas un número telefónico de otro país, revisa los números disponibles en {{url}}\n\n\nSi además de entrar vía llamada vas a usar otro dispositivo, puedes usar este link para entrar sin audio: {{silentUrl}}",
"inviteSipEndpoint": "Para unirse utilizando la dirección SIP, introduzca esto: {{sipUri}}",
"inviteTextiOSPersonal": "{{name}} te invita a una reunión.",
"inviteTextiOSJoinSilent": "Si marca a través de un teléfono de sala, utilice este enlace para unirse sin conectarse al audio: {{silentUrl}}.",
"inviteTextiOSInviteUrl": "Haz clic en el siguiente enlace para unirte: {{inviteUrl}}.",
"inviteTextiOSPhone": "Para participar por teléfono, utiliza este número: {{number}},,{{conferenceID}}. Si buscas otro número, ésta es la lista completa: {{didUrl}}.",
"inviteURLFirstPartGeneral": "Estás invitado a unirte a una reunión.",
"inviteURLFirstPartPersonal": "{{name}} te esta invitando a una reunión.\n",
"inviteURLSecondPart": "\nLink para unirse a la reunión:\n{{url}}\n",
@@ -447,7 +384,6 @@
"noRoom": "No se especificó la sala a marcar.",
"numbers": "Números para entrar por llamada telefónica:",
"password": "$t(lockRoomPasswordUppercase):",
"sip": "Dirección SIP",
"title": "Compartir",
"tooltip": "Compartir el enlace y acceso telefónico para esta reunión",
"label": "Información de la reunión"
@@ -466,7 +402,6 @@
"support": "Soporte",
"supportMsg": "Si esto sigue ocurriendo, contacta a"
},
"jitsiHome": "{{logo}} Logotipo, enlaces a la página web",
"keyboardShortcuts": {
"focusLocal": "Ver tu cámara",
"focusRemote": "Ver la cámara de otras personas",
@@ -479,14 +414,12 @@
"showSpeakerStats": "Mostrar estadísticas de los hablantes",
"toggleChat": "Abrir o cerrar el chat",
"toggleFilmstrip": "Mostrar u ocultar miniaturas de vídeo",
"toggleParticipantsPane": "Mostrar u ocultar el panel de participantes",
"toggleScreensharing": "Cambiar entre cámara y pantalla compartida",
"toggleShortcuts": "Mostrar u ocultar atajos del teclado",
"videoMute": "Prender o apagar la cámara"
"videoMute": "Prender o apagar la cámara",
"videoQuality": "Ajustar la calidad de la llamada"
},
"liveStreaming": {
"limitNotificationDescriptionWeb": "Debido a la alta demanda su transmisión estará limitada a {{limit}} minutos. Puede obtener transmisiones ilimitadas en <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Su transmisión estará limitada a {{limit}} minutos. Puede obtener transmisiones ilimitadas en {{app}}.",
"busy": "Nuestros servidores andan un poco ocupados. Vuelve a intentarlo en unos minutos.",
"busyTitle": "Todos los transmisores están ocupados",
"changeSignIn": "Cambiar de cuenta.",
@@ -498,6 +431,9 @@
"errorLiveStreamNotEnabled": "La transmisión en vivo no está activada en {{email}}. Por favor, activa la transmisión en vivo o inicia sesión en una cuenta con la transmisión en vivo activada.",
"expandedOff": "La transmisión en vivo se ha detenido",
"expandedOn": "La reunión se está transmitiendo a YouTube.",
"googlePrivacyPolicy": "Política de Privacidad de Google",
"limitNotificationDescriptionWeb": "Debido a la alta demanda su transmisión estará limitada a {{limit}} minutos. Puede obtener transmisiones ilimitadas en <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Su transmisión estará limitada a {{limit}} minutos. Puede obtener transmisiones ilimitadas en {{app}}.",
"expandedPending": "La transmisión en vivo se está iniciando…",
"failedToStart": "La transmisión en vivo no se pudo iniciar",
"getStreamKeyManually": "No pudimos encontrar tu clave de transmisión. Por favor, obtenla de la página de YouTube y pégala.",
@@ -515,8 +451,7 @@
"start": "Iniciar una transmisión en vivo",
"streamIdHelp": "¿Qué es esto?",
"unavailableTitle": "Transmisión en vivo no disponible",
"youtubeTerms": "Términos de servicios de YouTube",
"googlePrivacyPolicy": "Política de Privacidad de Google"
"youtubeTerms": "Términos de servicios de YouTube"
},
"localRecording": {
"clientState": {
@@ -551,15 +486,13 @@
"lockRoomPasswordUppercase": "Contraseña",
"me": "yo",
"notify": {
"allowAction": "Permitir",
"allowedUnmute": "Puedes anular el silencio del micrófono, iniciar la cámara o compartir la pantalla.",
"connectedOneMember": "{{name}} se unió a la reunión",
"connectedThreePlusMembers": "{{name}} y {{count}} más se unieron a la reunión",
"connectedTwoMembers": "{{first}} y {{second}} se unieron a la reunión",
"disconnected": "desconectado",
"focus": "Enfocar conferencia",
"focusFail": "{{component}} no disponible. Vuelve a intentar en {{ms}} segundos",
"hostAskedUnmute": "El moderador quiere que hables",
"grantedTo": "Se otorgaron derechos de moderador a {{to}}.",
"invitedOneMember": "{{name}} ha sido invitado",
"invitedThreePlusMembers": "{{name}} y {{count}} más han sido invitados",
"invitedTwoMembers": "{{first}} y {{second}} han sido invitados",
@@ -570,13 +503,9 @@
"mutedTitle": "¡Estás silenciado!",
"mutedRemotelyTitle": "¡{{Nombre del participante}} te ha silenciado!",
"mutedRemotelyDescription": "Siempre puedes reactivar tu micrófono cuando estés listo para hablar. Vuélvelo a apagar cuando termines de hablar para no hacer ruido.",
"videoMutedRemotelyTitle": "Su vídeo ha sido desactivado por {{moderator}}",
"videoMutedRemotelyDescription": "Siempre puedes volver a encenderlo.",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) eliminada por otro participante",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) agregada por otro participante",
"raisedHand": "{{name}} quisiera hablar.",
"screenShareNoAudio": "La casilla Compartir audio no estaba marcada en la pantalla de selección de ventanas.",
"screenShareNoAudioTitle": "No se pudo compartir el audio del sistema.",
"somebody": "Alguien",
"startSilentTitle": "¡Te uniste sin audio!",
"startSilentDescription": "Vuelve a ingresar para activar el audio",
@@ -589,87 +518,13 @@
"OldElectronAPPTitle": "¡Aplicación obsoleta e insegura!",
"oldElectronClientDescription1": "Estás usando una versión vieja de la aplicación de Jitsi Meet que tiene problemas de seguridad. ¡Por favor, actualiza a la ",
"oldElectronClientDescription2": "versión más reciente",
"oldElectronClientDescription3": " YA!",
"moderationInEffectDescription": "Por favor, levanten la mano si quieren hablar.",
"moderationInEffectCSDescription": "Por favor, levante la mano si quiere compartir su pantalla.",
"moderationInEffectVideoDescription": "Por favor, levanten la mano si quieren encender su cámara.",
"moderationInEffectTitle": "Su micrófono está silenciado por el moderador",
"moderationInEffectCSTitle": "La pantalla compartida está bloqueada por el moderador",
"moderationInEffectVideoTitle": "Su cámara está bloqueada por el moderador",
"moderationRequestFromModerator": "El anfitrión desea que se desactive el silencio",
"moderationRequestFromParticipant": "Quiere hablar",
"moderationStartedTitle": "Comienzo de la moderación",
"moderationStoppedTitle": "La moderación se detuvo",
"moderationToggleDescription": "por {{participantDisplayName}}",
"raiseHandAction": "Levantar la mano",
"reactionSounds": "Desactivar sonidos",
"groupTitle": "Notificaciones"
"oldElectronClientDescription3": " YA!"
},
"participantsPane": {
"close": "Cerrar",
"header": "Participantes",
"headings": {
"lobby": "Vestíbulo ({{count}})",
"participantsList": "Participantes en la reunión ({{count}})",
"waitingLobby": "Esperando en el vestíbulo ({{count}})"
},
"actions": {
"allow": "Permitir a los asistentes:",
"allowVideo": "Permitir vídeo",
"audioModeration": "Desmutearse a sí mismos",
"blockEveryoneMicCamera": "Bloquear el micrófono y la cámara de todos.",
"invite": "Invitar a alguien",
"askUnmute": "Pida que le quiten el silencio",
"mute": "Silenciar",
"muteAll": "Silenciar a todos los demás",
"muteEveryoneElse": "Silenciar al resto",
"stopEveryonesVideo": "Detener el vídeo de todos",
"stopVideo": "Detener el vídeo",
"unblockEveryoneMicCamera": "Desbloquear el micrófono y la cámara de todos",
"videoModeration": "Iniciar su vídeo"
}
},
"passwordSetRemotely": "Definida por otro participante",
"passwordSetRemotely": "definida por otro participante",
"passwordDigitsOnly": "Hasta {{number]] cifras",
"polls": {
"create": {
"addOption": "Añadir opción",
"answerPlaceholder": "Opción {{index}}",
"create": "Crear una encuesta",
"cancel": "Cancelar",
"pollOption": "Opción de encuesta {{index}}",
"pollQuestion": "Pregunta de la encuesta",
"questionPlaceholder": "Haz una pregunta",
"removeOption": "Eliminar la opción",
"send": "Enviar"
},
"answer": {
"skip": "Saltar",
"submit": "Enviar"
},
"results": {
"vote": "Vota",
"changeVote": "Cambiar el voto",
"empty": "Todavía no hay encuestas en la reunión. ¡Inicie una encuesta aquí!",
"hideDetailedResults": "Ocultar detalles",
"showDetailedResults": "Mostrar detalles"
},
"notification": {
"title": "Se ha añadido una nueva encuesta a esta reunión",
"description": "Abre la pestaña de encuestas para votar"
}
},
"poweredby": "con tecnología de",
"prejoin": {
"audioAndVideoError": "Error en audio y vídeo:",
"audioDeviceProblem": "Hay un problema con su dispositivo de audio",
"audioOnlyError": "Error en audio:",
"audioTrackError": "No se pudo crear la pista de audio.",
"calling": "Llamando",
"callMe": "Llámame",
"callMeAtNumber": "Llamame a este número:",
"configuringDevices": "Configurando dispositivos...",
"connectedWithAudioQ": "¿Estás está conectado con audio?",
"connection": {
"good": "¡Su conexión a internet es buena!",
"nonOptimal": "Su conexión a internet no es óptima",
@@ -689,6 +544,16 @@
"videoLowQuality": "Prevemos que su video tendrá baja calidad en términos de velocidad de fotogramas y resolución.",
"videoTearing": "Prevemos que su video se pixelará o tendrá artefactos visuales."
},
"errorMissingName": "Ingrese su nombre para unirse a la reunión",
"premeeting": "Pre-reunión",
"showScreen": "Habilitar pantalla pre-reunión",
"audioAndVideoError": "Error en audio y vídeo:",
"audioOnlyError": "Error en audio:",
"audioTrackError": "No se pudo crear la pista de audio.",
"callMe": "Llámame",
"callMeAtNumber": "Llamame a este número:",
"configuringDevices": "Configurando dispositivos...",
"connectedWithAudioQ": "¿Estás está conectado con audio?",
"copyAndShare": "Copia y comparte el link de la reuinión",
"dialInMeeting": "Entrar con llamada telefónica",
"dialInPin": "Marca a la reunión e ingresa el código:",
@@ -698,8 +563,6 @@
"errorDialOutDisconnected": "No se pudo marcar. Desconectado.",
"errorDialOutFailed": "No se pudo marcar. La llamada falló.",
"errorDialOutStatus": "Hubo algún error, y no se pudo determinar cuál",
"errorMissingName": "Ingrese su nombre para unirse a la reunión",
"errorNoPermissions": "Tienes que habilitar el acceso al micrófono y a la cámara",
"errorStatusCode": "Error al marcar, código de error {{status}}",
"errorValidation": "No se pudo validar el número",
"iWantToDialIn": "Quiero entrar por teléfono",
@@ -710,9 +573,7 @@
"linkCopied": "Se copió el link",
"lookGood": "Tu micrófono funciona bien.",
"or": "o",
"premeeting": "Pre-reunión",
"showScreen": "Habilitar pantalla pre-reunión",
"keyboardShortcuts": "Activar los atajos de teclado",
"calling": "Llamando",
"startWithPhone": "Iniciar con audio de llamada telefónica",
"screenSharingError": "Error al compartir pantalla:",
"videoOnlyError": "Error con el vídeo:",
@@ -734,7 +595,6 @@
"ringing": "Timbrando…"
},
"profile": {
"avatar": "avatar",
"setDisplayNameLabel": "Configura tu nombre para mostrar",
"setEmailInput": "Introducir correo electrónico",
"setEmailLabel": "Configurar tu correo electrónico de Gravatar",
@@ -742,22 +602,19 @@
},
"raisedHand": "Desea hablar",
"recording": {
"limitNotificationDescriptionWeb": "Debido a la alta demanda su grabación estará limitada a {{limit}} minutos. Puede obtener grabaciones ilimitadas en <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Su grabación estará limitada a {{limit}} minutos. Puede obtener grabaciones ilimitadas en <3>{{app}}</3>.",
"authDropboxText": "Subir a Dropbox",
"availableSpace": "Espacio disponible: {{spaceLeft}} MB (aproximadamente {{duration}} minutos de grabación)",
"beta": "BETA",
"busy": "Estamos trabajando para liberar recursos de grabación. Vuelve a intentarlo en unos minutos.",
"busyTitle": "Todas las grabadoras están actualmente ocupadas",
"copyLink": "Copiar enlace",
"error": "Error de grabación. Vuelve a intentarlo.",
"errorFetchingLink": "Error en la obtención del enlace de grabación.",
"expandedOff": "Grabación detenida",
"expandedOn": "La reunión está siendo grabada.",
"expandedPending": "La grabación se está iniciando…",
"failedToStart": "No se pudo iniciar la grabación",
"fileSharingdescription": "Compartir la grabación con los participantes de la reunión",
"linkGenerated": "Hemos generado un enlace a su grabación.",
"limitNotificationDescriptionWeb": "Debido a la alta demanda su grabación estará limitada a {{limit}} minutos. Puede obtener grabaciones ilimitadas en <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Su grabación estará limitada a {{limit}} minutos. Puede obtener grabaciones ilimitadas en <3>{{app}}</3>.",
"live": "EN VIVO",
"loggedIn": "Sesión iniciada como {{userName}}",
"off": "Grabación detenida",
@@ -767,20 +624,18 @@
"pending": "Preparando para grabar la reunión…",
"rec": "GRA",
"serviceDescription": "El servicio de grabación guardará la grabación",
"serviceDescriptionCloud": "Grabación en la nube",
"serviceName": "Servicio de grabación",
"signIn": "Iniciar sesión",
"signOut": "Cerrar sesión",
"unavailable": "¡Uy! {{serviceName}} actualmente no está disponible. Estamos trabajando para resolver el problema. Vuelve a intentarlo más tarde.",
"unavailableTitle": "Grabación no disponible",
"uploadToCloud": "Subir a la nube"
"unavailableTitle": "Grabación no disponible"
},
"sectionList": {
"pullToRefresh": "Mueve el dedo para abajo para actualizar."
},
"security": {
"about": "Puedes agregar una contraseña a la reunión. Los participantes necesitarán la contraseña para unirse a la reunión.",
"aboutReadOnly": "Los participantes moderadores pueden agregar una $t(lockRoomPassword) a la reunión. Los participantes deberán proporcionar la $t(lockRoomPassword) antes de que se les permita unirse a la reunión.",
"about": "Puedes agregar una contraseña a la reunión. Los participantes necesitarán la contraseña para unirse a la reunión.",
"insecureRoomNameWarning": "El nombre de la sala es inseguro. Participantes no deseados pueden llegar a unirse a la reunión.",
"securityOptions": "Opciones de seguridad"
},
@@ -792,13 +647,8 @@
"signedIn": "Actualmente se accede a eventos del calendario para {{email}}. Haz clic en el botón Desconectar más abajo para detener el acceso a eventos del calendario.",
"title": "Calendario"
},
"desktopShareFramerate": "Velocidad de fotogramas para compartir el escritorio",
"desktopShareWarning": "Es necesario reiniciar la pantalla compartida para que los nuevos ajustes surtan efecto.",
"desktopShareHighFpsWarning": "Una mayor velocidad de fotogramas para el uso compartido de la pantalla podría afectar a su ancho de banda. Es necesario reiniciar la pantalla compartida para que la nueva configuración surta efecto.",
"devices": "Dispositivos",
"followMe": "Todos me siguen",
"framesPerSecond": "fotogramas-por-segundo",
"incomingMessage": "Mensaje entrante",
"language": "Idioma",
"loggedIn": "Sesión iniciada como {{name}}",
"microphones": "Micrófono",
@@ -806,19 +656,13 @@
"more": "Más",
"name": "Nombre",
"noDevice": "Ninguno",
"participantJoined": "Un articipante incorporado",
"participantLeft": "Un participante se ha ido",
"playSounds": "Reproducir sonido",
"reactions": "Reacciones de la reunión",
"sameAsSystem": "Igual que el sistema ({{label}})",
"selectAudioOutput": "Salida de audio",
"selectCamera": "Cámara",
"selectMic": "Micrófono",
"sounds": "Sonidos",
"speakers": "Parlantes",
"speakers": "Altavoces",
"startAudioMuted": "Todos inician silenciados",
"startVideoMuted": "Todos inician con cámara desactivada",
"talkWhileMuted": "Hablar en silencio",
"speakers": "Parlantes",
"title": "Ajustes"
},
"settingsView": {
@@ -831,9 +675,9 @@
"conferenceSection": "Conferencia",
"disableCallIntegration": "Desactivar la integración nativa de llamadas",
"disableP2P": "Desactivar la comunicación directa (\"Peer-To-Peer\")",
"displayName": "Nombre a mostrar",
"disableCrashReporting": "Desactivar el reporte de crasheos",
"disableCrashReportingWarning": "¿Estás seguro que no deseas reportarnos los crasheos? La opción se activará al reiniciar la app.",
"displayName": "Nombre a mostrar",
"email": "Correo electrónico",
"header": "Configuración",
"profileSection": "Perfil",
@@ -849,7 +693,6 @@
},
"speaker": "Participante",
"speakerStats": {
"search": "Buscar",
"hours": "{{count}} h",
"minutes": "{{count}} min",
"name": "Nombre",
@@ -859,7 +702,6 @@
},
"startupoverlay": {
"policyText": " ",
"genericTitle": "La reunión debe utilizar su micrófono y su cámara.",
"title": "{{app}} necesita usar el micrófono y la cámara."
},
"suspendedoverlay": {
@@ -871,23 +713,22 @@
"accessibilityLabel": {
"audioOnly": "Alternar cámaras de los demás",
"audioRoute": "Seleccionar el dispositivo de sonido",
"boo": "Boo",
"callQuality": "Administrar la calidad de vídeo",
"cc": "Alternar subtítulos",
"chat": "Alternar ventana de chat",
"clap": "Aplauso",
"document": "Alternar documento compartido",
"download": "Descargar nuestras aplicaciones",
"embedMeeting": "Insertar reunión",
"grantModerator": "Convertir en moderador",
"download": "Descargar nuestras aplicaciones",
"e2ee": "Cifrado de extremo a extremo",
"feedback": "Dejar comentarios",
"fullScreen": "Alternar pantalla completa",
"grantModerator": "Convertir en moderador",
"hangup": "Colgar",
"help": "Ayuda",
"invite": "Invitar personas",
"lobbyButtonDisable": "Desactivar sala de espera",
"lobbyButtonEnable": "Activar sala de espera",
"kick": "Expulsar participante",
"laugh": "Ríete",
"like": "Pulgares arriba",
"lobbyButton": "Activar / desactivar el modo lobby",
"localRecording": "Alternar controles de grabación local",
"lockRoom": "Alternar contraseña de la reunión",
@@ -896,57 +737,39 @@
"moreOptions": "Mostrar más opciones",
"mute": "Silenciar micrófono",
"muteEveryone": "Silenciar a todos",
"muteEveryoneElse": "Silenciar a todos los demás",
"muteEveryonesVideo": "Desactivar el vídeo de todos",
"muteEveryoneElsesVideo": "Desactivar el vídeo de los demás",
"participants": "Participantes",
"pip": "Alternar modo ventana en miniatura",
"privateMessage": "Enviar mensaje privado",
"profile": "Editar perfil",
"raiseHand": "Levantar o bajar la mano",
"reactionsMenu": "Abrir / Cerrar el menú de reacciones",
"recording": "Alternar grabación",
"remoteMute": "Silenciar participante",
"remoteVideoMute": "Desactivar la cámara del participante",
"security": "Opciones de seguridad",
"Settings": "Alternar configuración",
"shareaudio": "Compartir audio",
"sharedvideo": "Alternar vídeo compartido de YouTube",
"shareRoom": "Invitar a alguien",
"shareYourScreen": "Alternar pantalla compartida",
"shortcuts": "Alternar accesos directos",
"show": "Mostrar en primer",
"silence": "Silencio",
"speakerStats": "Alternar estadísticas del orador",
"surprised": "Sorprendido",
"tileView": "Alternar vista de mosaico",
"toggleCamera": "Alternar cámara",
"toggleFilmstrip": "Alternar mosaicos",
"videomute": "Alternar vídeo",
"videoblur": "Alternar desenfoque de vídeo",
"selectBackground": "Seleccione el fondo",
"expand": "Ampliar",
"collapse": "Colapsar"
"videoblur": "Alternar desenfoque de vídeo"
},
"addPeople": "Agregar personas a la llamada",
"audioSettings": "Ajustes de audio",
"videoSettings": "Ajustes de vídeo",
"audioOnlyOff": "Mostrar cámaras de los demás",
"audioOnlyOn": "Ocultar cámaras de los demás (para ahorrar datos)",
"audioRoute": "Selecciona el dispositivo de sonido",
"authenticate": "Autenticar",
"boo": "Boo",
"callQuality": "Ajustar la calidad de vídeo",
"chat": "Abrir o cerrar chat",
"clap": "Aplauso",
"closeChat": "Cerrar chat",
"closeReactionsMenu": "Cerrar el menú de reacciones",
"disableReactionSounds": "Puede desactivar los sonidos de reacción para esta reunión",
"documentClose": "Cerrar documento compartido",
"documentOpen": "Abrir documento compartido",
"download": "Descarga nuestras aplicaciones",
"e2ee": "Cifrado de extremo a extremo",
"embedMeeting": "Insertar reunión",
"e2ee": "Cifrado de extremo a extremo",
"enterFullScreen": "Pantalla completa",
"enterTileView": "Ver en cuadrícula",
"exitFullScreen": "Salir de pantalla completa",
@@ -955,8 +778,6 @@
"hangup": "Colgar",
"help": "Ayuda",
"invite": "Invitar personas",
"laugh": "Ríete",
"like": "Pulgares arriba",
"lobbyButtonDisable": "Desactivar el modo lobby",
"lobbyButtonEnable": "Activar el modo lobby",
"login": "Inicio de sesión",
@@ -966,7 +787,6 @@
"moreOptions": "Más opciones",
"mute": "Activar o silenciar el micrófono",
"muteEveryone": "Silenciar a todos",
"muteEveryonesVideo": "Desactivar la cámara de todos",
"noAudioSignalTitle": "¡No se registra audio de tu micrófono!",
"noAudioSignalDesc": "Checa si no está silenciado en tu configuración del sistema o dispositivo, o cambia de micrófono.",
"noAudioSignalDescSuggestion": "Si no lo silenciaste a propósito desde la configuración del sistema o el dispositivo, intenta usar este otro micrófono:",
@@ -975,39 +795,28 @@
"noisyAudioInputTitle": "Tu micrófono parece estar ruidoso",
"noisyAudioInputDesc": "Tu micrófono está haciendo ruido, siléncialo, ajusta su volumen en configuración del sistema, o cambia de micrófono.",
"openChat": "Abrir chat",
"openReactionsMenu": "Abrir el menú de reacciones",
"participants": "Participantes",
"pip": "Mostrar en ventana pequeña",
"privateMessage": "Enviar mensaje privado",
"profile": "Editar perfil",
"raiseHand": "Levantar o bajar la mano",
"raiseYourHand": "Levantar la mano",
"reactionBoo": "Enviar la reacción de Boo",
"reactionClap": "Enviar reacción de aplauso",
"reactionLaugh": "Enviar reacción de risa",
"reactionLike": "Enviar la reacción de los pulgares hacia arriba",
"reactionSilence": "Enviar reacción de silencio",
"reactionSurprised": "Enviar reacción de sorpresa",
"security": "Opciones de seguridad",
"Settings": "Configuración",
"shareaudio": "Compartir audio",
"sharedvideo": "Compartir un vídeo de YouTube",
"shareRoom": "Invitar a alguien",
"shortcuts": "Ver atajos del teclado",
"silence": "Silencio",
"speakerStats": "Estadísticas de los hablantes",
"startScreenSharing": "Comenzar a compartir pantalla",
"startSubtitles": "Iniciar subtítulos",
"stopAudioSharing": "Dejar de compartir el audio",
"stopScreenSharing": "Dejar de compartir pantalla",
"stopSubtitles": "Detener subtítulos",
"stopSharedVideo": "Detener vídeo de YouTube",
"surprised": "Compartir audio",
"talkWhileMutedPopup": "¿Intentas hablar? Estás silenciado.",
"tileViewToggle": "Activar o desactivar vista en cuadrícula",
"toggleCamera": "Activar o desactivar cámara",
"videomute": "Iniciar o detener cámara",
"selectBackground": "Seleccionar fondo"
"startvideoblur": "Desenfocar mi fondo",
"stopvideoblur": "Desactivar desenfoque del fondo"
},
"transcribing": {
"ccButtonTooltip": "Iniciar o detener subtítulos",
@@ -1033,7 +842,6 @@
"react-nativeGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
"safariGrantPermissions": "Selecciona <b><i>Aceptar</i></b> cuando el navegador solicite permisos."
},
"volumeSlider": "Deslizador de volumen",
"videoSIPGW": {
"busy": "Estamos trabajando para liberar recursos. Vuelve a intentarlo en unos minutos.",
"busyTitle": "El servicio de salas está actualmente ocupado",
@@ -1056,29 +864,26 @@
"ld": "LD",
"ldTooltip": "Viendo vídeo en baja definición",
"lowDefinition": "Baja definición",
"onlyAudioAvailable": "Solo hay audio disponible",
"onlyAudioSupported": "Solo admitimos audio en este navegador.",
"sd": "SD",
"sdTooltip": "Viendo vídeo en definición estándar",
"standardDefinition": "Definición estándar"
},
"videothumbnail": {
"connectionInfo": "Información de conexión",
"domute": "Silenciar",
"domuteVideo": "Desactivar la cámara",
"domuteOthers": "Silenciar a todos",
"domuteVideoOfOthers": "Desactivar la cámara de todos los demás",
"flip": "Voltear",
"grantModerator": "Convertir en moderador",
"kick": "Expulsar",
"moderator": "Moderador",
"mute": "Se silenció el participante",
"muted": "Silenciado",
"videoMuted": "Cámara desactivada",
"remoteControl": "Control remoto",
"show": "Mostrar en primer plano",
"videomute": "El participante paró su cámara"
},
"welcomepage": {
"addMeetingName": "Añadir el nombre de la reunión",
"accessibilityLabel": {
"join": "Toca para unirte",
"roomname": "Introduce el nombre de la sala"
@@ -1093,37 +898,22 @@
"connectCalendarText": "Conecta tu calendario para ver todas tus reuniones de {{app}}. Además, agrega reuniones a tu calendario e inícialas con un solo clic.",
"enterRoomTitle": "Comenzar una reunión",
"getHelp": "Obtener ayuda",
"roomNameAllowedChars": "El nombre de la reunión no debe contener ninguno de estos caracteres: ?, &, :, ', \", %, #.",
"go": "IR",
"goSmall": "IR",
"headerTitle": "Jitsi Meet",
"headerSubtitle": "Reuniones seguras y de alta calidad",
"info": "Información",
"join": "CREAR / UNIRSE",
"jitsiOnMobile": "Jitsi en el móvil: descarga nuestras aplicaciones y comienza una reunión desde cualquier lugar",
"mobileDownLoadLinkIos": "Descargar la aplicación móvil para iOS",
"mobileDownLoadLinkAndroid": "Descargar la aplicación móvil para Android",
"mobileDownLoadLinkFDroid": "Descargar la aplicación móvil para F-Droid",
"info": "Información",
"moderatedMessage": "O <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">reserve con antelación una URL de reunión</a> en la que usted sea el único moderador.",
"privacy": "Privacidad",
"recentList": "Reciente",
"recentListDelete": "Eliminar",
"recentListEmpty": "Tu historial de reuniones está vacío. Reúnete y aparecerán aquí.",
"reducedUIText": "¡Bienvenid@ a {{app}}!",
"roomNameAllowedChars": "El nombre de la reunión no debe contener ninguno de estos caracteres: ?, &, :, ', \", %, #.",
"roomname": "Introduce el nombre de la sala",
"roomnameHint": "Introduce el nombre o URL de la sala a la que deseas unirte. Puedes inventar un nombre, simplemente infórmaselo a las personas con las que te reunirás para que introduzcan el mismo nombre.",
"sendFeedback": "Enviar sugerencias",
"startMeeting": "Iniciar la reunión",
"terms": "Términos",
"title": "Videoconferencias seguras, con gran variedad de funcionalidades y completamente gratuitas",
"logo": {
"calendar": "Logotipo del calendario",
"microsoftLogo": "Logotipo de Microsoft",
"logoDeepLinking": "Logotipo de la reunión de Jitsi",
"desktopPreviewThumbnail": "Vista previa del escritorio en miniatura",
"googleLogo": "Logotipo de Google",
"policyLogo": "Logotipo de la política"
}
"title": "Videoconferencias seguras, con gran variedad de funcionalidades y completamente gratuitas"
},
"lonelyMeetingExperience": {
"button": "Invita a otros",
@@ -1133,8 +923,6 @@
"header": "Centro de ayuda"
},
"lobby": {
"admit": "Admitir",
"admitAll": "Admitir todo",
"knockingParticipantList": "Participantes que quieren entrar",
"allow": "permitir",
"backToKnockModeButton": "No hay contraseña, pide permiso para entrar.",
@@ -1147,7 +935,6 @@
"enableDialogText": "La sala de espera te deja proteger tu reunión, de modo que todas los que entren enviarán una solicitud que deberá ser aprobada por un moderador.",
"enterPasswordButton": "Introduce la contraseña de la reunión",
"enterPasswordTitle": "Introduce la contraseña para poder entrar",
"errorMissingPassword": "Por favor, introduzca la contraseña de la reunión",
"invalidPassword": "Contraseña inválida",
"joiningMessage": "Podrás entrar tan pronto te acepten tu solicitud.",
"joinWithPasswordMessage": "Tratando de entrar con contraseña, por favor espera...",
@@ -1166,7 +953,6 @@
"passwordField": "Introduce la contraseña de la reunión",
"passwordJoinButton": "Entrar",
"reject": "Rechazar",
"rejectAll": "Rechazar todo",
"toggleLabel": "Activar sala de espera"
}
}
}

View File

@@ -373,11 +373,11 @@
"busyTitle": "Kõik ülekandjad on hetkel hõivatud",
"changeSignIn": "Vaheta kontot.",
"choose": "Vali otseülekanne",
"chooseCTA": "Vali ülekande viis. Oled sisse logitud emailiga {{email}}.",
"chooseCTA": "Vali ülekande viis. Oled sisse logitud e-mailiga {{email}}.",
"enterStreamKey": "Sisesta siia oma YouTubei ülekande võti.",
"error": "Otseülekanne ebaõnnestus. Proovi uuesti.",
"errorAPI": "YouTubei kanaliga ühendumisel tekkis viga. Palun logi uuesti sisse.",
"errorLiveStreamNotEnabled": "Otseülekanne ei ole emailiga {{email}} sisse lülitatud. Luba kasutajaga otseülekanded või vaheta kontot.",
"errorLiveStreamNotEnabled": "Otseülekanne ei ole e-mailiga {{email}} sisse lülitatud. Luba kasutajaga otseülekanded või vaheta kontot.",
"expandedOff": "Otseülekanne on peatatud",
"expandedOn": "Kõnest tehakse otseülekanne YouTubei.",
"expandedPending": "Otseülekanne algab…",
@@ -480,7 +480,7 @@
},
"profile": {
"setDisplayNameLabel": "Sisesta nimi",
"setEmailInput": "Sisesta email",
"setEmailInput": "Sisesta e-mail",
"setEmailLabel": "Sisesta Gravatar e-kirja aadress",
"title": "Profiil"
},
@@ -548,7 +548,7 @@
"disableCallIntegration": "Lülita kohaliku kõne integratsioon välja",
"disableP2P": "Lülita otseühendus välja",
"displayName": "Kasutatav nimi",
"email": "Email",
"email": "E-mail",
"header": "Seaded",
"profileSection": "Profiil",
"serverURL": "Serveri link",

View File

@@ -39,20 +39,6 @@
"audioOnly": {
"audioOnly": "Bande passante faible"
},
"breakoutRooms": {
"defaultName": "Salle annexe #{{index}}",
"mainRoom": "Salle principale",
"actions": {
"add": "Ajouter salle annexe",
"autoAssign": "Assigner automatqieuement aux salles annexes",
"close": "Fermer",
"join": "Rejoindre",
"leaveBreakoutRoom": "Quitter la salle annexe",
"more": "Plus",
"remove": "Supprimer",
"sendToBreakoutRoom": "Envoyer le participant dans:"
}
},
"calendarSync": {
"addMeetingURL": "Ajouter un lien de conférence",
"confirmAddLink": "Voulez-vous ajouter un lien Jitsi à cet événement ?",
@@ -201,7 +187,7 @@
"Back": "Retour",
"cameraConstraintFailedError": "Votre caméra ne satisfait pas certaines des contraintes nécessaires.",
"cameraNotFoundError": "La caméra n'a pas été trouvée.",
"cameraNotSendingData": "Impossible d'accéder à votre caméra. Veuillez sélectionner un autre périphérique dans les paramètres ou rafraîchir la page.",
"cameraNotSendingData": "Nous sommes incapables d'accéder à votre caméra. Veuillez sélectionner un autre périphérique dans les paramètres ou rafraîchir la page.",
"cameraNotSendingDataTitle": "Impossible d'accéder à votre caméra",
"cameraPermissionDeniedError": "Vous n'avez pas autorisé l'utilisation de votre caméra. Vous pouvez toujours participer à la conférence, mais les autres ne pourront pas vous voir. Utilisez le bouton de la caméra dans la barre d'adresse pour résoudre ce problème.",
"cameraTimeoutError": "Impossible de démarrer la source vidéo. Délai dépassé!",
@@ -225,11 +211,9 @@
"dismiss": "Rejeter",
"displayNameRequired": "Bonjour ! Quel est votre nom ?",
"done": "Terminé",
"e2eeDescription": "Le chiffrement de Bout-en-Bout est actuellement EXPERIMENTAL. Veuillez garder à l'esprit que l'activation du chiffrement de Bout-en-Bout désactivera les services fournis côté serveur tels que : l'enregistrement, la diffusion en direct et la participation par téléphone. Gardez également à l'esprit que la réunion ne fonctionnera que pour les personnes qui se connectent à partir de navigateurs prenant en charge les flux insérables.",
"e2eeDescription": "Le chiffrement de Bout-en-Bout est actuellement EXPERIMENTAL. Veuillez garder à l'esprit que l'activation du chiffrement de Bout-en-Bout désactivera les services fournis côté serveur tels que : l'enregistrement, la diffusion en direct et la participation par téléphone. Gardez également à l'esprit que la réunion ne fonctionnera que pour les personnes qui se joignent à partir de navigateurs prenant en charge les flux insérables.",
"e2eeLabel": "Activer le chiffrement de Bout-en-Bout",
"e2eeDisabledDueToMaxModeDescription": "Impossible d'activer le chiffrement de bout en bout en raison du trop grand nombre de participants à la conférence.",
"e2eeWarning": "ATTENTION : Tous les participants de cette réunion ne semblent pas prendre en charge le chiffrement de Bout-en-Bout. Si vous activez le chiffrement, ils ne pourront ni vous voir, ni vous entendre.",
"e2eeWillDisableDueToMaxModeDescription": "ATTENTION: le chiffrement de bout en bout sera automatiquement arrêté si plus de participants joignent la conférence.",
"enterDisplayName": "Merci de saisir votre nom ici",
"embedMeeting": "Intégrer la réunion",
"error": "Erreur",
@@ -237,7 +221,6 @@
"grantModeratorDialog": "Êtes-vous sûr de vouloir rendre ce participant modérateur ?",
"grantModeratorTitle": "Nommer modérateur",
"IamHost": "Je suis l'hôte",
"hideShareAudioHelper": "Ne pas montrer ce dialogue à nouveau",
"incorrectRoomLockPassword": "Mot de passe incorrect",
"incorrectPassword": "Nom d'utilisateur ou mot de passe incorrect",
"internalError": "Oups ! Quelque chose s'est mal passée. L'erreur suivante s'est produite : {{error}}",
@@ -249,14 +232,14 @@
"kickTitle": "Oups ! vous avez été expulsé(e) par {{participantDisplayName}}",
"liveStreaming": "Direct",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Impossible durant l'enregistrement",
"liveStreamingDisabledTooltip": "La diffusion en direct est désactivée",
"liveStreamingDisabledTooltip": "La diffusion en direct est désactivé",
"lockMessage": "Impossible de verrouiller la conférence.",
"lockRoom": "Ajouter un $t(lockRoomPassword) à la réunion ",
"lockTitle": "Échec du verrouillage",
"login": "Connexion",
"logoutQuestion": "Voulez-vous vraiment vous déconnecter et arrêter la conférence ?",
"logoutTitle": "Déconnexion",
"maxUsersLimitReached": "Le nombre maximal de participants est atteint. Le conférence est complète. Merci de contacter l'organisateur de la réunion ou réessayer plus tard !",
"maxUsersLimitReached": "Le nombre maximal de participant est atteint. Le conférence est complète. Merci de contacter l'organisateur de la réunion ou réessayer plus tard !",
"maxUsersLimitReachedTitle": "Le nombre maximal de participants est atteint",
"micConstraintFailedError": "Votre microphone ne satisfait pas certaines des contraintes nécessaires.",
"micNotFoundError": "Le microphone n'a pas été détecté.",
@@ -265,39 +248,30 @@
"micPermissionDeniedError": "Vous n'avez pas autorisé l'utilisation de votre microphone. Vous pouvez toujours participer à la conférence, mais les autres ne vont pas vous entendre. Utilisez le bouton du microphone dans la barre d'adresse pour résoudre ce problème.",
"micTimeoutError": "Impossible de démarrer la source audio. Délai dépassé!",
"micUnknownError": "Vous ne pouvez pas utiliser le microphone pour une raison inconnue.",
"moderationAudioLabel": "Autoriser les participants à réactiver leur micro",
"moderationVideoLabel": "Autoriser les participants à démarrer leur vidéo",
"muteEveryoneElseDialog": "Une fois leur micro coupé, vous ne pourrez plus le réactiver, mais ils pourront l'activer par eux-mêmes à tout moment.",
"muteEveryoneElseTitle": "Couper le micro de tout le monde sauf de {{whom}} ?",
"muteEveryoneDialog": "Êtes-vous sûr de vouloir couper les micros de tout le monde ? Vous ne pourrez plus réactiver leur micro, mais ils pourront l'activer par eux-mêmes à tout moment.",
"muteEveryoneDialogModerationOn": "Les participants peuvent demander à parler n'importe quand",
"muteEveryoneTitle": "Couper le micro de tout le monde ?",
"muteEveryoneElsesVideoDialog": "Une fois la caméra coupée, vous ne pourrez plus la rallumer, mais ils peuvent la rallumer à tout moment.",
"muteEveryoneElsesVideoTitle": "Couper la vidéo de tout le monde sauf {{whom}}?",
"muteEveryonesVideoDialog": "Êtes-vous sûr de vouloir couper la caméra de tout le monde? Vous ne pourrez pas la réactiver, mais ils peuvent la remettre à tout moment.",
"muteEveryonesVideoDialogModerationOn": "Les participants peuvent demander à activer leur caméra n'importe quand.",
"muteEveryonesVideoDialogOk": "Désactiver",
"muteEveryonesVideoTitle": "Couper la caméra de tout le monde?",
"muteEveryoneSelf": "vous",
"muteEveryoneStartMuted": "Tout le monde démarre avec le micro coupé",
"muteParticipantBody": "Vous ne pourrez plus réactiver son micro, mais il pourra l'activer par lui-même à tout moment.",
"muteParticipantButton": "Couper le micro",
"muteParticipantsVideoDialog": "Êtes-vous sûr(e) de vouloir couper la caméra de ce participant ? Seul le participant pourra ensuite réactiver son micro à tout moment.",
"muteParticipantsVideoDialogModerationOn": "Êtes-vous sûr(e) de vouloir couper la caméra de ce participant ? Ni vous ni le participant ne pourront la réactiver ensuite ?",
"muteParticipantDialog": "Êtes-vous sûr(e) de vouloir couper le micro de ce participant ? Seul le participant pourra ensuite réactiver son micro à tout moment.",
"muteParticipantTitle": "Couper le micro de ce participant ?",
"muteParticipantsVideoButton": "Couper la caméra",
"muteParticipantsVideoTitle": "Couper la caméra de ce participant?",
"muteParticipantsVideoBody": "Vous ne pourrez pas rallumer la caméra, mais ils peuvent la rallumer à tout moment.",
"muteParticipantsVideoBodyModerationOn": "Ni vous ni le participant ne pourront rallumer la caméra.",
"noDropboxToken": "Pas de jeton Dropbox valide",
"Ok": "Ok",
"password": "Mot de passe",
"passwordLabel": "La réunion a été verrouillée par un(e) participant(e). Veuillez entrer le $t(lockRoomPassword) pour la rejoindre.",
"passwordNotSupported": "La définition d'un $t(lockRoomPassword) de réunion n'est pas prise en charge.",
"passwordNotSupportedTitle": "L'ajout d'un $t(lockRoomPassword) n'est pas supporté",
"passwordRequired": "$t(lockRoomPasswordUppercase) requis",
"permissionErrorTitle": "Permission nécessaire",
"permissionCameraRequiredError": "L'autorisation caméra est nécessaire pour participer aux réunions avec vidéo. Merci de l'accorder dans les paramètres",
"permissionMicRequiredError": "L'autorisation microphone est nécessaire pour participer aux réunions avec son. Merci de l'accorder dans les paramètres",
"popupError": "Votre navigateur bloque les fenêtres pop-up. Veuillez autoriser les fenêtres pop-up dans les paramètres de votre navigateur.",
"popupErrorTitle": "Pop-up bloquée",
"readMore": "plus",
@@ -320,24 +294,18 @@
"reservationErrorMsg": "Code d'erreur: {{code}}, message: {{msg}}",
"retry": "Réessayer",
"screenSharingAudio": "Partager l'audio",
"screenSharingFailed": "Houla ! Quelque chose s'est mal passé, nous n'avons pas pu démarrer le partage d'écran !",
"screenSharingFailed": "Oops ! Quelque chose s'est mal passée, nous n'avons pas pu démarrer le partage d'écran !",
"screenSharingFailedTitle": "Echec du partage d'écran !",
"screenSharingPermissionDeniedError": "Houla ! Un problème est survenu avec vos autorisations de partage d'écran. Veuillez réessayer.",
"screenSharingPermissionDeniedError": "Oops ! Un problème est survenu avec vos autorisations de partage d'écran. Veuillez réessayer.",
"screenSharingPermissionDeniedError": "Oups ! Une erreur s'est produite avec vos autorisations d'extension de partage d'écran. Veuillez rafraîchir et réessayer.",
"sendPrivateMessage": "Vous avez récemment reçu un message privé. Aviez-vous l'intention d'y répondre en privé, ou vouliez-vous envoyer votre message au groupe ?",
"sendPrivateMessageCancel": "Envoyer au groupe",
"sendPrivateMessageOk": "Envoyer en privé",
"sendPrivateMessageTitle": "Envoyer en privé ?",
"serviceUnavailable": "Service indisponible",
"sessTerminated": "Appel terminé",
"sessionRestarted": "L'appel est relancé par la passerelle",
"sessionRestarted": "L'appel est relancé par le pont",
"Share": "Partager",
"shareAudio": "Continuer",
"shareAudioTitle" : "Comment partager le son",
"shareAudioWarningTitle": "Vous devez cesser de partager l'écran avant de partager l'audio",
"shareAudioWarningH1": "Si vous voulez partager uniquement de l'audio:",
"shareAudioWarningD1": "vous devez cesser le partage d'écran avant de partager votre son.",
"shareAudioWarningD2": "viys devez partager votre écran à nouveau et cocher l'ootion \"Partager l'audio\".",
"shareMediaWarningGenericH2": "Si vous voulez partager votre écran et l'audio",
"shareVideoLinkError": "Veuillez renseigner un lien Youtube fonctionnel.",
"shareVideoTitle": "Partager une vidéo",
"shareYourScreen": "Partager votre écran",
@@ -345,11 +313,6 @@
"startLiveStreaming": "Démarrer la diffusion en direct",
"startRecording": "Commencer l'enregistrement",
"startRemoteControlErrorMessage": "Une erreur est survenue lors de la tentative de démarrage de la session de contrôle à distance !",
"shareScreenWarningTitle": "Vous devez cesser de partager votre audio avant de partager votre écran",
"shareScreenWarningH1": "Si vous voulez partager uniquement votre écran:",
"shareScreenWarningD1": "vous devez arrêter le partage d'audio avant de partager votre écran.",
"shareScreenWarningD2": "vous devez arrêter le partage d'audio, démarrer le partage d'écran et cocher l'option \"Partager l'audio\".",
"sharedVideoLinkPlaceholder": "lien YouTube ou lien vidéo direct",
"stopLiveStreaming": "Arrêter la diffusion en direct",
"stopRecording": "Arrêter l'enregistrement",
"stopRecordingWarning": "Désirez-vous vraiment arrêter l'enregistrement ?",
@@ -366,12 +329,9 @@
"userIdentifier": "Identifiant utilisateur",
"userPassword": "mot de passe utilisateur",
"videoLink": "Lien de la vidéo",
"viewUpgradeOptions": "Voir les options de mise à jour",
"viewUpgradeOptionsContent": "Pour obtenir un accès illimité à des capacités premium comme l'enregistrement, les transcriptions, diffusion RTMP et plus, vous devez mettre à jour votre plan.",
"viewUpgradeOptionsTitle": "Vous avez découvert une capacité premium !",
"WaitForHostMsg": "La conférence <b>{{room}}</b> n'a pas encore commencé. Si vous en êtes l'hôte, veuillez vous authentifier. Sinon, veuillez attendre son arrivée.",
"WaitForHostMsgWOk": "La conférence <b>{{room}}</b> n'a pas encore commencé. Si vous en êtes l'hôte, veuillez appuyer sur Ok pour vous authentifier. Sinon, veuillez attendre son arrivée.",
"WaitingForHostTitle": "En attente de l'hôte ...",
"WaitingForHostTitle": "En attente du hôte ...",
"Yes": "Oui",
"yourEntireScreen": "Votre écran entier",
"remoteUserControls": "Contrôles de l'utilisateur distant {{username}}",
@@ -384,7 +344,7 @@
"title": "Document partagé"
},
"e2ee": {
"labelToolTip": "Le son et la vidéo de cette conférence sont chiffrés de Bout-en-Bout"
"labelToolTip": "L'audio et la vidéo de cette conférence sont chiffrés de Bout-en-Bout"
},
"embedMeeting": {
"title": "Intégrer cette réunion"
@@ -406,11 +366,9 @@
"image4" : "Lampadaire noir",
"image5" : "Montagne",
"image6" : "Forêt ",
"image7" : "Lever de soleil",
"image7" : "Lever du soleil",
"desktopShareError": "Impossible de créer le partage de bureau",
"desktopShare":"Partage de bureau",
"webAssemblyWarning": "WebAssembly non supporté",
"backgroundEffectError": "Erreur dans l'application de l'effet d'arrière-plan."
"desktopShare":"Partage de bureau"
},
"feedback": {
"average": "Moyen",
@@ -445,12 +403,8 @@
"genericError": "Oups, quelque chose a mal tourné.",
"inviteLiveStream": "Pour voir la diffusion en direct de cette réunion, cliquez sur ce lien : {{url}}",
"invitePhone": "Pour rejoindre depuis un téléphone, saisissez : {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "Vous cherchez un numéro d'appel différent ?\nAfficher les numéros d'appel de la réunion: {{url}}\n\n\nSi vous appelez également via un téléphone de réunion, vous pouvez vous connecter sans audio: {{silentUrl}}",
"invitePhoneAlternatives": "Vous cherchez un numéro d'appel différent ?\nAfficher les numéros d'appel de la réunion: {{url}}\n\n\nSi vous appelez également via un téléphone de salle, vous pouvez vous connecter sans audio: {{silentUrl}}",
"inviteSipEndpoint": "Pour rejoindre en utilisant l'adresse SIP, entrez ceci : {{sipUri}}",
"inviteTextiOSPersonal": "{{name}} vous invite à une réunion.",
"inviteTextiOSJoinSilent": "Si vous téléphonez avec un téléphone de réunion, utilisez ce lien pour rejoindre sans vous connecter en audio: {{silentUrl}}.",
"inviteTextiOSInviteUrl": "Clickez le lien suivant pour rejoindre: {{inviteUrl}}.",
"inviteTextiOSPhone": "Pour rejoindre par téléphone, utilisez ce numéro: {{number}},,{{conferenceID}}#. Si vous voulez utiliser un autre numéro, voici la liste complête: {{didUrl}}.",
"inviteURLFirstPartGeneral": "Vous êtes invité(e) à participer à une réunion.",
"inviteURLFirstPartPersonal": "{{name}} vous invite à une réunion.\n",
"inviteURLSecondPart": "\nRejoindre la réunion :\n{{url}}\n",
@@ -461,7 +415,6 @@
"noRoom": "Aucune réunion n'a été spécifiée pour l'appel entrant.",
"numbers": "Numéros d'appel",
"password": "$t(lockRoomPasswordUppercase) :",
"sip": "adresse SIP",
"title": "Partager",
"tooltip": "Partager le lien et les informations de connexion pour cette conférence",
"label": "Information de la réunion"
@@ -475,7 +428,7 @@
"send": "Envoyer"
},
"inlineDialogFailure": {
"msg": "Il y a eu un petit problème.",
"msg": "Nous avons trébuché un peu.",
"retry": "Réessayer",
"support": "Support",
"supportMsg": "Si ceci persiste, contactez"
@@ -499,8 +452,6 @@
"videoMute": "Démarrer / Arrêter votre caméra"
},
"liveStreaming": {
"limitNotificationDescriptionWeb": "En raison d'une forte demande, votre diffusion sera limitée à {{limit}} min. Pour une diffusion illimitée, essayez <a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>.",
"limitNotificationDescriptionNative": "Votre diffusion sera limitée à {{limit}} min. Pour une diffusion illimitée, essayez {{app}}.",
"busy": "Nous tentons de libérer des ressources de diffusion. Veuillez réessayez dans quelques minutes.",
"busyTitle": "Tous les flux sont actuellement occupés",
"changeSignIn": "Changer de compte.",
@@ -508,6 +459,8 @@
"chooseCTA": "Choisissez une option de diffusion. Vous êtes actuellement connecté comme {{email}}.",
"enterStreamKey": "Entrez votre clé de diffusion Youtube ici",
"error": "La diffusion a échouée. Veuillez réessayer ultérieurement.",
"enterStreamKey": "Entrez votre clé de flux direct YouTube ici.",
"error": "Le Streaming a échoué. Veuillez réessayer.",
"errorAPI": "Une erreur s'est produite lors de l'accès à vos diffusions YouTube. Veuillez réessayer de vous connecter.",
"errorLiveStreamNotEnabled": "La diffusion en direct n'est pas activée pour {{email}}. Merci de l'activer ou de vous connecter avec un compte où elle est déjà activée.",
"expandedOff": "La diffusion en direct a été arrêtée",
@@ -515,15 +468,15 @@
"expandedPending": "La diffusion en direct a commencé ...",
"failedToStart": "La diffusion n'a pas réussi à démarrer",
"getStreamKeyManually": "Nous n'avons pas réussi à récupérer un flux de direct. Essayez d'obtenir votre clé de diffusion en direct sur YouTube.",
"inProgress": "Enregisrtement ou diffusion en cours",
"invalidStreamKey": "La clé de diffusion en direct n'est peut-être pas correcte.",
"limitNotificationDescriptionWeb": "En raison d'une forte demande, votre diffusion sera limitée à {{limit}} min. Pour un streaming illimité, essayez <a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>.",
"limitNotificationDescriptionNative": "Votre diffusion sera limitée à {{limit}} min. Pour un streaming illimité, essayez {{app}}.",
"off": "La diffusion en direct (streaming) a été arrêté",
"offBy": "{{name}} a arrêté la diffusion en direct",
"on": "En direct",
"onBy": "{{name}} a démarré la diffusion en direct",
"pending": "Lancement du direct ...",
"serviceName": "Service de diffusion en direct",
"sessionAlreadyActive": "Cette session est déjà en cours d'enregistrement ou de diffusion.",
"signedInAs": "Vous êtes connecté en tant que :",
"signIn": "Se connecter avec Google",
"signInCTA": "Connectez vous ou saisissez votre clé de diffusion Youtube.",
@@ -554,7 +507,7 @@
"finishedModerator": "L'enregistrement de la session {{token}} s'est terminé. L'enregistrement a bien été sauvegardée. Merci de demander aux autres participants de soumettre leurs enregistrements.",
"notModerator": "Vous n'êtes pas le modérateur. Vous ne pouvez pas démarrer ou arrêter un enregistrement local."
},
"moderator": "Droits de modérateur accordés",
"moderator": "Modérateur ",
"no": "Non",
"participant": "Participant(e)",
"participantStats": "Statistiques du participant",
@@ -567,15 +520,13 @@
"lockRoomPasswordUppercase": "Mot de passe",
"me": "moi",
"notify": {
"allowAction": "Permettre",
"allowedUnmute": "Vous pouvez réactiver votre écran, votre caméra ou partager votre écran.",
"connectedOneMember": "{{name}} a rejoint la réunion",
"connectedThreePlusMembers": "{{name}} et {{count}} autres personnes ont rejoint la réunion",
"connectedTwoMembers": "{{first}} et {{second}} ont rejoint la réunion",
"disconnected": "déconnecté",
"focus": "Focus de conférence",
"focusFail": "{{component}} n'est pas disponible - réessayez dans {{ms}} sec",
"hostAskedUnmute": "Le modérateur souhaite vous donner la parole",
"grantedTo": "Droits modérateur accordés à {{to}} !",
"invitedOneMember": "{{name}} a été invité(e)",
"invitedThreePlusMembers": "{{name}} et {{count}} autres ont été invités",
"invitedTwoMembers": "{{first}} et {{second}} ont été invités",
@@ -596,62 +547,33 @@
"somebody": "Quelqu'un",
"startSilentTitle": "Vous avez rejoint sans sortie audio !",
"startSilentDescription": "Rejoignez la réunion de nouveau pour activer l'audio",
"suboptimalBrowserWarning": "Nous craignons que votre expérience de réunion en ligne ne soit pas idéale ici. Nous cherchons des moyens d'améliorer cela, mais d'ici-là, essayez d'utiliser l'un des <a href='{{recommendedBrowserPageLink}}' target='_blank'>navigateurs supportés</a>.",
"suboptimalBrowserWarning": "Nous craignons que votre expérience de réunion en ligne ne soit bonne ici. Nous cherchons des moyens d'améliorer cela, mais d'ici-là, essayez d'utiliser l'un des <a href='{{recommendedBrowserPageLink}}' target='_blank'>navigateurs supportés</a>.",
"suboptimalExperienceTitle": "Avertissement du navigateur",
"unmute": "Rétablir le son",
"newDeviceCameraTitle": "Nouvelle caméra détectée",
"newDeviceAudioTitle": "Nouveau périphérique audio détecté",
"newDeviceAction": "Utiliser",
"OldElectronAPPTitle": "Faille de sécurité !",
"oldElectronClientDescription1": "Vous semblez utiliser une ancienne version du client Jitsi Meet qui présente des failles de sécurité connues. Veuillez vous assurer de mettre à jour vers notre ",
"OldElectronAPPTitle": "Vulnérabilité de sécurité !",
"oldElectronClientDescription1": "Vous semblez utiliser une ancienne version du client Jitsi Meet qui présente des vulnérabilités de sécurité connues. Veuillez vous assurer de mettre à jour vers notre ",
"oldElectronClientDescription2": "dernière build",
"oldElectronClientDescription3": " rapidement !",
"moderationInEffectDescription": "Merci de levez la main pour demander la parole.",
"moderationInEffectCSDescription": "Merci de lever la main si vous voulez partager votre écran.",
"moderationInEffectVideoDescription": "Merci de lever la main si vous souhaitez démarrer votre caméra.",
"moderationInEffectTitle": "Votre micro est coupé par le modérateur",
"moderationInEffectCSTitle": "Le partage d'écran est interdit par le modérateur",
"moderationInEffectVideoTitle": "Votre caméra est coupée par le modérateur",
"moderationRequestFromModerator": "Le modérateur souhaite que vous activiez votre micro",
"moderationRequestFromParticipant": "Souhaite parler",
"moderationStartedTitle": "Modération démarrée",
"moderationStoppedTitle": "Modération arrêtée",
"moderationToggleDescription": "par {{participantDisplayName}}",
"raiseHandAction": "Lever la main",
"reactionSounds": "Bloquer les réactions sonores",
"groupTitle": "Notifications"
},
"participantsPane": {
"close": "Fermer",
"header": "Participants",
"headings": {
"lobby": "Salle d'attente ({{count}})",
"participantsList": "Participants de la réunion ({{count}})",
"waitingLobby": "Dans la salle d'attente ({{count}})"
"participantsList": "Participants de la réunion ({{count}})"
},
"actions": {
"allow": "Autoriser les participants à:",
"allowVideo": "permettre la vidéo",
"audioModeration": "réouvrir leur micro",
"blockEveryoneMicCamera": "Bloquer tous les micros et caméras",
"invite": "Inviter quelqu'un",
"askUnmute": "Demander de réactiver le micro",
"moreModerationActions": "Options de modération supplémentaires",
"moreParticipantOptions": "Options supplémentaires pour les participants",
"mute": "Couper le micro",
"muteAll": "Couper le micro de tout le monde",
"muteEveryoneElse": "Couper le micro de tous les autres",
"stopEveryonesVideo": "Couper toutes les caméras",
"stopVideo": "Couper la vidéo",
"unblockEveryoneMicCamera": "Débloquer tous les micros et caméras",
"videoModeration": "Démarrer leur vidéo"
},
"search": "Rechercher des participants"
"muteAll": "couper le micro de tout le monde",
"stopVideo": "couper la vidéo"
}
},
"passwordSetRemotely": "défini par un autre participant",
"passwordDigitsOnly": "Jusqu'à {{number}} chiffres",
"polls": {
"by": "Par {{ name }}",
"create": {
"addOption": "Ajouter une option",
"answerPlaceholder": "Option {{index}}",
@@ -676,7 +598,7 @@
},
"notification": {
"title": "Un nouveau sondage a été ajouté à la réunion",
"description": "Ouvrez l'onglet des sondages pour voter"
"description": "Ouvrez l'onget des sondages pour voter"
}
},
"poweredby": "produit par",
@@ -696,8 +618,8 @@
"poor": "Vous avez une mauvaise connexion"
},
"connectionDetails": {
"audioClipping": "Attendez vous à ce que votre son soit coupé.",
"audioHighQuality": "Votre son sera de bonne qualité.",
"audioClipping": "Attendez vous à ce que votre audio soit coupé.",
"audioHighQuality": "Votre audio sera de bonne qualité.",
"audioLowNoVideo": "Attendez vous à une faible qualité audio et aucune vidéo",
"goodQuality": "Impressionnant ! La qualité de vos médias sera excellente",
"noMediaConnectivity": "Nous n'avons pas pu trouver un moyen d'établir une connectivité multimédia pour ce test. Cela est généralement causé par un pare-feu ou un NAT.",
@@ -719,7 +641,6 @@
"errorDialOutFailed": "Impossible de composer le numéro. L'appel a échoué",
"errorDialOutStatus": "Erreur lors de l'obtention de l'état d'appel sortant",
"errorMissingName": "Veuillez entrer votre nom pour entrer en conférence",
"errorNoPermissions": "Vous devez permettre l'accès microphone et caméra",
"errorStatusCode": "Erreur de numérotation, code d'état: {{status}}",
"errorValidation": "La validation du numéro a échoué",
"iWantToDialIn": "Je veux me connecter",
@@ -730,6 +651,7 @@
"linkCopied": "Lien copié dans le presse-papiers",
"lookGood": "Il semble que votre microphone fonctionne correctement",
"or": "ou",
"calling": "Appel",
"premeeting": "Pré-séance",
"showScreen": "Activer l'écran de pré-séance",
"startWithPhone": "Commencez avec l'audio du téléphone",
@@ -756,29 +678,25 @@
"profile": {
"avatar": "avatar",
"setDisplayNameLabel": "Choisissez un pseudo",
"setEmailInput": "Entrez une adresse email",
"setEmailInput": "Entrez une adresse e-mail",
"setEmailLabel": "Définir votre courriel Gravatar",
"title": "Profil"
},
"raisedHand": "Aimerait prendre la parole",
"recording": {
"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>.",
"limitNotificationDescriptionNative": "En raison d'une forte demande, votre enregistrement sera limité à {{limit}} min. Pour des enregistrements illimités, essayez <3> {{app}} </3>.",
"authDropboxText": "Téléchargement vers Dropbox",
"availableSpace": "Espace disponible : {{spaceLeft}} Mo (approximativement {{duration}} minutes d'enregistrement)",
"beta": "BETA",
"busy": "Nous sommes en train de libérer les ressources d'enregistrement. Réessayez dans quelques minutes.",
"busyTitle": "Tous les enregistreurs sont actuellement occupés",
"copyLink": "Copier lien",
"error": "Échec de l'enregistrement. Veuillez réessayer.",
"errorFetchingLink": "Erreur de récupération du lien d'enregistrement.",
"expandedOff": "L'enregistrement a été arrêté",
"expandedOn": "Cette conférence est actuellement en cours d'enregistrement.",
"expandedPending": "Démarrage de l'enregistrement ...",
"failedToStart": "L'enregistrement n'a pas réussi à démarrer",
"fileSharingdescription": "Partager l'enregistrement avec les participants de la réunion",
"inProgress": "Enregistrement ou diffusion en cours",
"linkGenerated": "Nous avons généré un lien à votre enregistrement.",
"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>.",
"limitNotificationDescriptionNative": "En raison d'une forte demande, votre enregistrement sera limité à {{limit}} min. Pour des enregistrements illimités, essayez <3> {{app}} </3>.",
"live": "DIRECT",
"loggedIn": "Connecté en tant que {{userName}}",
"off": "Enregistrement arrêté",
@@ -790,37 +708,30 @@
"serviceDescription": "Votre enregistrement sera enregistré par le service dédié",
"serviceDescriptionCloud": "Enregistrement Cloud",
"serviceName": "Service d'enregistrement",
"sessionAlreadyActive": "Cette session est déjà en cours d'enregistrement ou de diffusion.",
"signIn": "Se connecter",
"signOut": "Se déconnecter",
"unavailable": "Oups ! Le {{serviceName}} est actuellement indisponible. Nous tentons de résoudre le problème. Veuillez réessayer plus tard.",
"unavailableTitle": "Enregistrement indisponible",
"uploadToCloud": "Envoyer vers le cloud"
"unavailableTitle": "Enregistrement indisponible"
},
"sectionList": {
"pullToRefresh": "Tirer pour recharger"
},
"security": {
"about": "Vous pouvez ajouter un mot de passe à votre réunion. Les participants devront fournir le mot de passe avant de pouvoir rejoindre la réunion.",
"aboutReadOnly": "Les modérateurs peuvent ajouter un mot de passe à la réunion. Les participants devront fournir le mot de passe avant de pouvoir rejoindre la réunion.",
"about": "Vous pouvez ajouter un mot de passe à votre réunion. Les participants devront fournir le mot de passe avant qu'ils soient autorisés à rejoindre la réunion.",
"aboutReadOnly": "Les modérateurs peuvent ajouter un mot de passe à la réunion. Les participants devront fournir le mot de passe avant qu'ils soient autorisés à rejoindre la réunion.",
"insecureRoomNameWarning": "Le nom de la salle est peu sûr. Des participants non désirés peuvent rejoindre votre réunion. Pensez à sécuriser votre réunion en cliquant sur le bouton de sécurité.",
"securityOptions": "Options de sécurité"
},
"settings": {
"calendar": {
"about": "L'intégration de {{appName}} avec votre calendrier permet d'accéder de manière sécurisée aux événements à venir.",
"about": "L'intégration de {{appName}} avec votre calendrier permet d'accéder de manière sécurisée aux événement à venir.",
"disconnect": "Se déconnecter",
"microsoftSignIn": "Se connecter avec Microsoft",
"signedIn": "Accès aux événements du calendrier {{email}}. Cliquez sur le bouton se déconnecter ci-dessous pour arrêter l'accès aux événements du calendrier.",
"title": "Calendrier"
},
"desktopShareFramerate": "Images par seconde pour le Partage d'écran",
"desktopShareWarning": "Vous devez repartager l'écran pour que ces paramètres soient utilisés.",
"desktopShareHighFpsWarning": "Augmenter le nombre d'images par seconde pour le partage d'écran peut impacter votre bande passante. Vous devez repartager l'écran pour que ces paramètres soient utilisés.",
"devices": "Périphériques",
"followMe": "Tout le monde me suit",
"framesPerSecond": "images par seconde",
"incomingMessage": "un message arrive",
"language": "Langue",
"loggedIn": "Connecté en tant que {{name}}",
"microphones": "Microphones",
@@ -828,19 +739,13 @@
"more": "Plus",
"name": "Nom",
"noDevice": "Aucun",
"participantJoined": "un participant arrive",
"participantLeft": "un participant quitte",
"playSounds": "Jouer un son quand",
"reactions": "il y a une réaction à la réunion",
"sameAsSystem": "Identique au système ({{label}})",
"selectAudioOutput": "Sortie audio",
"selectCamera": "Caméra",
"selectMic": "Microphone",
"sounds": "Sons",
"speakers": "Haut-parleurs",
"speakers": "Intervenants",
"startAudioMuted": "Tout le monde commence en muet",
"startVideoMuted": "Tout le monde commence sans vidéo",
"talkWhileMuted": "vous parlez en étant muet",
"title": "Paramètres"
},
"settingsView": {
@@ -871,20 +776,12 @@
},
"speaker": "Haut-parleur",
"speakerStats": {
"search": "Recherche",
"hours": "{{count}}h",
"minutes": "{{count}}m",
"name": "Nom",
"seconds": "{{count}}s",
"speakerStats": "Statistiques de l'interlocuteur",
"speakerTime": "Temps de l'interlocuteur",
"happy": "Content",
"neutral": "Indifférent",
"sad": "Triste",
"surprised": "Surpris",
"angry": "En colère",
"fearful": "Effrayé",
"disgusted": "Dégoûté"
"speakerTime": "Temps de l'interlocuteur"
},
"startupoverlay": {
"policyText": " ",
@@ -900,24 +797,19 @@
"accessibilityLabel": {
"audioOnly": "Activer / Désactiver le mode voix uniquement",
"audioRoute": "Sélectionner la source audio",
"boo": "Hou",
"breakoutRoom": "Rejoindre/quitter une salle annexe",
"callQuality": "Ajuster la qualité vidéo",
"cc": "Activer / Désactiver les sous-titres",
"chat": "Afficher / Masquer la discussion instantanée",
"clap": "Applaudir",
"document": "Activer / Désactiver le document partagé",
"download": "Télécharger nos applications",
"embedMeeting": "Intégrer la réunion",
"feedback": "Laisser des commentaires",
"fullScreen": "Activer / Désactiver le plein écran",
"grantModerator": "donner des droits de modérateur",
"grantModerator": "Nommer modérateur",
"hangup": "Quitter la conversation",
"help": "Aide",
"invite": "Inviter des participants",
"kick": "Expulser le participant",
"laugh": "Rire",
"like": "Approuver",
"lobbyButton": "Activer / Désactiver le mode salle d'attente",
"localRecording": "Activer / Désactiver les contrôles d'enregistrement local",
"lockRoom": "Activer / Désactiver le mot de passe de la réunion",
@@ -934,7 +826,6 @@
"privateMessage": "Envoyer un message privé",
"profile": "Éditer votre profil",
"raiseHand": "Lever la main",
"reactionsMenu": "Ouvrir / fermer le menu réactions",
"recording": "Activer / Désactiver l'enregistrement",
"remoteMute": "Couper le micro du participant",
"remoteVideoMute": "Couper la caméra du participant",
@@ -946,9 +837,7 @@
"shareYourScreen": "Activer / Désactiver le partage d'écran",
"shortcuts": "Afficher / Masquer les raccourcis",
"show": "Afficher en premier plan",
"silence": "Silence",
"speakerStats": "Afficher / Cacher les statistiques de parole",
"surprised": "Surpris",
"tileView": "Activer / Désactiver la vue mosaïque",
"toggleCamera": "Changer de caméra",
"toggleFilmstrip": "Basculer de pellicule",
@@ -960,18 +849,13 @@
},
"addPeople": "Ajouter des personnes à votre appel",
"audioSettings": "Paramètres audio",
"videoSettings": "Paramètres vidéo",
"audioOnlyOff": "Désactiver le mode bande passante réduite",
"audioOnlyOn": "Activer le mode bande passante réduite",
"audioRoute": "Sélectionner la source audio",
"authenticate": "Authentifiez-vous",
"boo": "Huer",
"callQuality": "Ajuster la qualité vidéo",
"chat": "Ouvrir / Fermer le chat",
"clap": "Applaudir",
"closeChat": "Fermer le chat",
"closeReactionsMenu": "Fermer le menu réactions",
"disableReactionSounds": "Vous pouvez interdire les réactions sonores à cette réunion",
"documentClose": "Fermer le document partagé",
"documentOpen": "Ouvrir le document partagé",
"download": "Télécharger nos applications",
@@ -985,10 +869,6 @@
"hangup": "Quitter",
"help": "Aide",
"invite": "Inviter des participants",
"joinBreakoutRoom": "Rejoindre salle annexe",
"laugh": "Rire",
"leaveBreakoutRoom": "Quitter salle annexe",
"like": "Approuver",
"lobbyButtonDisable": "Désactiver le mode salle d'attente / contrôle des participant(e)s",
"lobbyButtonEnable": "Activer le mode salle d'attente / contrôle des participant(e)s",
"login": "Connexion",
@@ -1005,40 +885,31 @@
"noAudioSignalDialInDesc": "Vous pouvez également appeler en utilisant :",
"noAudioSignalDialInLinkDesc": "Numéros d'appel",
"noisyAudioInputTitle": "Votre microphone semble être bruyant !",
"noisyAudioInputDesc": "Il semble que votre microphone soit bruyant, veuillez le couper ou changer de périphérique.",
"noisyAudioInputDesc": "Il semble que votre microphone fasse du bruit, veuillez le couper ou changer de périphérique.",
"openChat": "Ouvrir le chat",
"openReactionsMenu": "Ouvrir le menu Réactions",
"participants": "Participants",
"pip": "Entrer en mode Picture-in-Picture",
"privateMessage": "Envoyer un message privé",
"profile": "Éditer votre profil",
"raiseHand": "Lever / Baisser la main",
"raiseYourHand": "Lever la main",
"reactionBoo": "Envoyer réaction huer",
"reactionClap": "Envoyer réaction applaudir",
"reactionLaugh": "Envoyer réaction rire",
"reactionLike": "Envoyer réaction approuver",
"reactionSilence": "Envoyer réaction silence",
"reactionSurprised": "Envoyer réaction surprise",
"security": "Options de sécurité",
"Settings": "Paramètres",
"shareaudio": "Partager l'audio",
"sharedvideo": "Partager une vidéo YouTube",
"shareRoom": "Inviter quelqu'un",
"shortcuts": "Afficher les raccourcis",
"silence": "Silence",
"speakerStats": "Statistiques de l'interlocuteur",
"startScreenSharing": "Démarrer le partage d'écran",
"startSubtitles": "Activer les sous-titres",
"stopAudioSharing": "Arrêter le partage son",
"stopScreenSharing": "Arrêter le partage d'écran",
"stopSubtitles": "Désactiver les sous-titres",
"stopSharedVideo": "Arrêter la vidéo YouTube",
"surprised": "Surpris",
"talkWhileMutedPopup": "Vous voulez parler ? Votre micro est coupé.",
"tileViewToggle": "Activer / Désactiver la vue mosaïque",
"toggleCamera": "Changer de caméra",
"videomute": "Démarrer / Arrêter la caméra",
"videoSettings": "Paramètres vidéo",
"selectBackground": "Sélectionner un arrière-plan"
},
"transcribing": {
@@ -1077,10 +948,7 @@
"pending": "{{displayName}} a été invité(e)"
},
"videoStatus": {
"adjustFor": "Ajuster pour:",
"audioOnly": "VOIX",
"bestPerformance": "la meilleure performance",
"highestQuality": "la meilleure qualité",
"audioOnlyExpanded": "Vous êtes en mode bande passante réduite. Dans ce mode, vous ne recevrez que le partage audio et le partage d'écran.",
"callQuality": "Qualité vidéo",
"hd": "HD",
@@ -1091,7 +959,6 @@
"ld": "BD",
"ldTooltip": "Regardez la vidéo en basse définition",
"lowDefinition": "Basse définition",
"performanceSettings": "Paramètres de performance",
"sd": "MD",
"sdTooltip": "Regardez la vidéo en définition standard",
"standardDefinition": "Moyenne Définition"
@@ -1103,7 +970,7 @@
"domuteOthers": "Couper le micro de tous les autres",
"domuteVideoOfOthers": "Couper la caméra des autres",
"flip": "Balancer",
"grantModerator": "Donner des droits de modérateur",
"grantModerator": "Nommer modérateur",
"kick": "Exclure",
"moderator": "Modérateur",
"mute": "Un participant a coupé son micro",
@@ -1165,12 +1032,6 @@
"button": "Inviter d'autres personnes",
"youAreAlone": "Vous êtes le seul participant de la réunion"
},
"termsView": {
"header": "Conditions d'utilisation"
},
"privacyView": {
"header": "Confidentialité"
},
"helpView": {
"header": "Centre d'aide"
},
@@ -1189,7 +1050,6 @@
"enableDialogText": "Le mode salle d'attente vous permet de protéger votre réunion en autorisant les personnes à entrer qu'après l'approbation formelle d'un modérateur.",
"enterPasswordButton": "Saisissez un mot de passe de réunion",
"enterPasswordTitle": "Saisissez le mot de passe pour rejoindre la réunion",
"errorMissingPassword": "Veuillez saisir le mot de passe de la réunion",
"invalidPassword": "Mot de passe invalide",
"joiningMessage": "Vous allez rejoindre une réunion dès que quelqu'un aura accepté votre demande",
"joinWithPasswordMessage": "Tentative de rejoindre avec mot de passe, patientez s'il vous plait ...",
@@ -1208,7 +1068,6 @@
"passwordField": "Veuillez saisir le mot de passe de la réunion",
"passwordJoinButton": "Rejoindre",
"reject": "Refuser",
"rejectAll": "Refuser tout",
"toggleLabel": "Activer la salle d'attente"
}
}

View File

@@ -296,7 +296,7 @@
"sendPrivateMessageTitle": "निजी तौर पर भेजें?",
"serviceUnavailable": "सेवा अनुपलब्ध",
"sessTerminated": "कॉल समाप्त",
"sessionRestarted": "Call restarted because of a connection issue",
"sessionRestarted": "Call restarted by the bridge",
"Share": "Share",
"shareVideoLinkError": "कृपया एक सही यूट्यूब लिंक प्रदान करें।.",
"shareVideoTitle": "एक वीडियो साझा करें",

View File

@@ -479,8 +479,8 @@
},
"profile": {
"setDisplayNameLabel": "Állítsa be a megjelenő nevet",
"setEmailInput": "Adjon meg egy email címet",
"setEmailLabel": "Adja meg a gravatar email címet",
"setEmailInput": "Adjon meg egy e-mail címet",
"setEmailLabel": "Adja meg a gravatar e-mail címet",
"title": "Profil"
},
"raisedHand": "Beszélni szeretnék",
@@ -549,7 +549,7 @@
"disableCallIntegration": "A natív hívások integrációjának letiltása",
"disableP2P": "Kapcsolja ki a peer-to-peer módot",
"displayName": "Megjelenő név",
"email": "Email",
"email": "E-mail",
"header": "Beállítások",
"profileSection": "Profil",
"serverURL": "Kiszolgáló URL",

View File

@@ -487,7 +487,7 @@
},
"profile": {
"setDisplayNameLabel": "Set your display name",
"setEmailInput": "Enter email",
"setEmailInput": "Enter e-mail",
"setEmailLabel": "Set your gravatar email",
"title": "Profile"
},

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