Merge branch 'master' into aaronkvanmeerten/jibri-queue-component-modules

This commit is contained in:
Aaron van Meerten 2020-08-14 14:21:13 -05:00 committed by GitHub
commit 0c48e205d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
299 changed files with 13802 additions and 3496 deletions

View File

@ -74,7 +74,7 @@ deploy-rnnoise-binary:
deploy-css: deploy-css:
$(NODE_SASS) $(STYLES_MAIN) $(STYLES_BUNDLE) && \ $(NODE_SASS) $(STYLES_MAIN) $(STYLES_BUNDLE) && \
$(CLEANCSS) $(STYLES_BUNDLE) > $(STYLES_DESTINATION) ; \ $(CLEANCSS) --skip-rebase $(STYLES_BUNDLE) > $(STYLES_DESTINATION) ; \
rm $(STYLES_BUNDLE) rm $(STYLES_BUNDLE)
deploy-local: deploy-local:

View File

@ -1,9 +1,9 @@
# Security # Security
## Reporting security issuess ## Reporting security issues
We take security very seriously and develop all Jitsi projects to be secure and safe. We take security very seriously and develop all Jitsi projects to be secure and safe.
If you find (or simply suspect) a security issue in any of the Jitsi projects, please send us an email to security@jitsi.org. If you find (or simply suspect) a security issue in any of the Jitsi projects, please report it to us via [HackerOne](https://hackerone.com/8x8) or send us an email to security@jitsi.org.
**We encourage responsible disclosure for the sake of our users, so please reach out before posting in a public space.** **We encourage responsible disclosure for the sake of our users, so please reach out before posting in a public space.**

View File

@ -1,6 +1,7 @@
<manifest <manifest
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
package="org.jitsi.meet"> package="org.jitsi.meet"
android:installLocation="auto">
<application <application
android:allowBackup="true" android:allowBackup="true"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"

View File

@ -23,7 +23,6 @@ import android.content.IntentFilter;
import android.content.RestrictionEntry; import android.content.RestrictionEntry;
import android.content.RestrictionsManager; import android.content.RestrictionsManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.util.Log; import android.util.Log;
@ -96,7 +95,7 @@ public class MainActivity extends JitsiMeetActivity {
// In Debug builds React needs permission to write over other apps in // In Debug builds React needs permission to write over other apps in
// order to display the warning and error overlays. // order to display the warning and error overlays.
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
if (canRequestOverlayPermission() && !Settings.canDrawOverlays(this)) { if (!Settings.canDrawOverlays(this)) {
Intent intent Intent intent
= new Intent( = new Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
@ -147,6 +146,7 @@ public class MainActivity extends JitsiMeetActivity {
.setWelcomePageEnabled(true) .setWelcomePageEnabled(true)
.setServerURL(buildURL(defaultURL)) .setServerURL(buildURL(defaultURL))
.setFeatureFlag("call-integration.enabled", false) .setFeatureFlag("call-integration.enabled", false)
.setFeatureFlag("resolution", 360)
.setFeatureFlag("server-url-change.enabled", !configurationByRestrictions) .setFeatureFlag("server-url-change.enabled", !configurationByRestrictions)
.build(); .build();
JitsiMeet.setDefaultConferenceOptions(defaultOptions); JitsiMeet.setDefaultConferenceOptions(defaultOptions);
@ -185,8 +185,7 @@ public class MainActivity extends JitsiMeetActivity {
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == OVERLAY_PERMISSION_REQUEST_CODE if (requestCode == OVERLAY_PERMISSION_REQUEST_CODE) {
&& canRequestOverlayPermission()) {
if (Settings.canDrawOverlays(this)) { if (Settings.canDrawOverlays(this)) {
initialize(); initialize();
return; return;
@ -209,6 +208,18 @@ public class MainActivity extends JitsiMeetActivity {
return super.onKeyUp(keyCode, event); return super.onKeyUp(keyCode, event);
} }
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode);
Log.d(TAG, "Is in picture-in-picture mode: " + isInPictureInPictureMode);
if (!isInPictureInPictureMode) {
this.startActivity(new Intent(this, getClass())
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
}
}
// Helper methods // Helper methods
// //
@ -219,10 +230,4 @@ public class MainActivity extends JitsiMeetActivity {
return null; return null;
} }
} }
private boolean canRequestOverlayPermission() {
return
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M;
}
} }

View File

@ -1,4 +1,10 @@
<network-security-config> <network-security-config>
<base-config>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
<domain-config cleartextTrafficPermitted="true"> <domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="false">localhost</domain> <domain includeSubdomains="false">localhost</domain>
<domain includeSubdomains="false">10.0.2.2</domain> <domain includeSubdomains="false">10.0.2.2</domain>

View File

@ -142,10 +142,10 @@ allprojects {
} }
ext { ext {
buildToolsVersion = "28.0.3" buildToolsVersion = "29.0.3"
compileSdkVersion = 28 compileSdkVersion = 29
minSdkVersion = 21 minSdkVersion = 23
targetSdkVersion = 28 targetSdkVersion = 29
supportLibVersion = "28.0.0" supportLibVersion = "28.0.0"
// The Maven artifact groupdId of the third-party react-native modules which // The Maven artifact groupdId of the third-party react-native modules which

View File

@ -20,5 +20,5 @@
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
appVersion=20.3.0 appVersion=20.4.0
sdkVersion=2.9.0 sdkVersion=2.10.0

View File

@ -0,0 +1,5 @@
#!/bin/bash
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
exec ${THIS_DIR}/../../node_modules/react-native/scripts/launchPackager.command --reset-cache

View File

@ -8,7 +8,7 @@ THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOUR
export RCT_METRO_PORT="${RCT_METRO_PORT:=8081}" export RCT_METRO_PORT="${RCT_METRO_PORT:=8081}"
echo "export RCT_METRO_PORT=${RCT_METRO_PORT}" > "${THIS_DIR}/../../node_modules/react-native/scripts/.packager.env" echo "export RCT_METRO_PORT=${RCT_METRO_PORT}" > "${THIS_DIR}/../../node_modules/react-native/scripts/.packager.env"
adb reverse tcp:8081 tcp:8081 adb reverse tcp:$RCT_METRO_PORT tcp:$RCT_METRO_PORT
if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then
if ! curl -s "http://localhost:${RCT_METRO_PORT}/status" | grep -q "packager-status:running" ; then if ! curl -s "http://localhost:${RCT_METRO_PORT}/status" | grep -q "packager-status:running" ; then
@ -16,11 +16,10 @@ if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then
exit 2 exit 2
fi fi
else else
CMD="${THIS_DIR}/../../node_modules/react-native/scripts/launchPackager.command" CMD="$THIS_DIR/run-packager-helper.command"
if [[ `uname` == "Darwin" ]]; then if [[ `uname` == "Darwin" ]]; then
open -g "${CMD}" || echo "Can't start packager automatically" open -g "${CMD}" || echo "Can't start packager automatically"
else else
xdg-open "${CMD}" || echo "Can't start packager automatically" xdg-open "${CMD}" || echo "Can't start packager automatically"
fi fi
fi fi

View File

@ -16,11 +16,8 @@
package org.jitsi.meet.sdk; package org.jitsi.meet.sdk;
import android.content.Context;
import android.media.AudioDeviceInfo; import android.media.AudioDeviceInfo;
import android.media.AudioManager; import android.media.AudioManager;
import android.os.Build;
import androidx.annotation.RequiresApi;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@ -34,7 +31,6 @@ import org.jitsi.meet.sdk.log.JitsiMeetLogger;
* default it's only used on versions < O, since versions >= O use ConnectionService, but it * default it's only used on versions < O, since versions >= O use ConnectionService, but it
* can be disabled. * can be disabled.
*/ */
@RequiresApi(Build.VERSION_CODES.M)
class AudioDeviceHandlerGeneric implements class AudioDeviceHandlerGeneric implements
AudioModeModule.AudioDeviceHandlerInterface, AudioModeModule.AudioDeviceHandlerInterface,
AudioManager.OnAudioFocusChangeListener { AudioManager.OnAudioFocusChangeListener {

View File

@ -1,230 +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.
*/
package org.jitsi.meet.sdk;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
/**
* {@link AudioModeModule.AudioDeviceHandlerInterface} module implementing device handling for
* legacy (pre-M) Android versions.
*/
class AudioDeviceHandlerLegacy implements
AudioModeModule.AudioDeviceHandlerInterface,
AudioManager.OnAudioFocusChangeListener,
BluetoothHeadsetMonitor.Listener {
private final static String TAG = AudioDeviceHandlerLegacy.class.getSimpleName();
/**
* Reference to the main {@code AudioModeModule}.
*/
private AudioModeModule module;
/**
* Indicator that we have lost audio focus.
*/
private boolean audioFocusLost = false;
/**
* {@link AudioManager} instance used to interact with the Android audio
* subsystem.
*/
private AudioManager audioManager;
/**
* {@link BluetoothHeadsetMonitor} for detecting Bluetooth device changes in
* old (< M) Android versions.
*/
private BluetoothHeadsetMonitor bluetoothHeadsetMonitor;
public AudioDeviceHandlerLegacy(AudioManager audioManager) {
this.audioManager = audioManager;
}
/**
* Helper method to trigger an audio route update when Bluetooth devices are
* connected / disconnected.
*/
@Override
public void onBluetoothDeviceChange(final boolean deviceAvailable) {
module.runInAudioThread(new Runnable() {
@Override
public void run() {
if (deviceAvailable) {
module.addDevice(AudioModeModule.DEVICE_BLUETOOTH);
} else {
module.removeDevice(AudioModeModule.DEVICE_BLUETOOTH);
}
module.updateAudioRoute();
}
});
}
/**
* Helper method to trigger an audio route update when a headset is plugged
* or unplugged.
*/
private void onHeadsetDeviceChange() {
module.runInAudioThread(new Runnable() {
@Override
public void run() {
// XXX: isWiredHeadsetOn is not deprecated when used just for
// knowing if there is a wired headset connected, regardless of
// audio being routed to it.
//noinspection deprecation
if (audioManager.isWiredHeadsetOn()) {
module.addDevice(AudioModeModule.DEVICE_HEADPHONES);
} else {
module.removeDevice(AudioModeModule.DEVICE_HEADPHONES);
}
module.updateAudioRoute();
}
});
}
/**
* {@link AudioManager.OnAudioFocusChangeListener} interface method. Called
* when the audio focus of the system is updated.
*
* @param focusChange - The type of focus change.
*/
@Override
public void onAudioFocusChange(final int focusChange) {
module.runInAudioThread(new Runnable() {
@Override
public void run() {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN: {
JitsiMeetLogger.d(TAG + " Audio focus gained");
// Some other application potentially stole our audio focus
// temporarily. Restore our mode.
if (audioFocusLost) {
module.updateAudioRoute();
}
audioFocusLost = false;
break;
}
case AudioManager.AUDIOFOCUS_LOSS:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: {
JitsiMeetLogger.d(TAG + " Audio focus lost");
audioFocusLost = true;
break;
}
}
}
});
}
/**
* Helper method to set the output route to a Bluetooth device.
*
* @param enabled true if Bluetooth should use used, false otherwise.
*/
private void setBluetoothAudioRoute(boolean enabled) {
if (enabled) {
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
} else {
audioManager.setBluetoothScoOn(false);
audioManager.stopBluetoothSco();
}
}
@Override
public void start(AudioModeModule audioModeModule) {
JitsiMeetLogger.i("Using " + TAG + " as the audio device handler");
module = audioModeModule;
Context context = module.getContext();
// Setup runtime device change detection.
//
// Detect changes in wired headset connections.
IntentFilter wiredHeadSetFilter = new IntentFilter(AudioManager.ACTION_HEADSET_PLUG);
BroadcastReceiver wiredHeadsetReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
JitsiMeetLogger.d(TAG + " Wired headset added / removed");
onHeadsetDeviceChange();
}
};
context.registerReceiver(wiredHeadsetReceiver, wiredHeadSetFilter);
// Detect Bluetooth device changes.
bluetoothHeadsetMonitor = new BluetoothHeadsetMonitor(context, this);
// On Android < M, detect if we have an earpiece.
PackageManager pm = context.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
module.addDevice(AudioModeModule.DEVICE_EARPIECE);
}
// Always assume there is a speaker.
module.addDevice(AudioModeModule.DEVICE_SPEAKER);
}
@Override
public void stop() {
bluetoothHeadsetMonitor.stop();
bluetoothHeadsetMonitor = null;
}
@Override
public void setAudioRoute(String device) {
// Turn speaker on / off
audioManager.setSpeakerphoneOn(device.equals(AudioModeModule.DEVICE_SPEAKER));
// Turn bluetooth on / off
setBluetoothAudioRoute(device.equals(AudioModeModule.DEVICE_BLUETOOTH));
}
@Override
public boolean setMode(int mode) {
if (mode == AudioModeModule.DEFAULT) {
audioFocusLost = false;
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.abandonAudioFocus(this);
audioManager.setSpeakerphoneOn(false);
setBluetoothAudioRoute(false);
return true;
}
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setMicrophoneMute(false);
if (audioManager.requestAudioFocus(this, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN)
== AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
JitsiMeetLogger.w(TAG + " Audio focus request failed");
return false;
}
return true;
}
}

View File

@ -222,10 +222,8 @@ class AudioModeModule extends ReactContextBaseJavaModule {
if (useConnectionService()) { if (useConnectionService()) {
audioDeviceHandler = new AudioDeviceHandlerConnectionService(audioManager); audioDeviceHandler = new AudioDeviceHandlerConnectionService(audioManager);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
audioDeviceHandler = new AudioDeviceHandlerGeneric(audioManager);
} else { } else {
audioDeviceHandler = new AudioDeviceHandlerLegacy(audioManager); audioDeviceHandler = new AudioDeviceHandlerGeneric(audioManager);
} }
audioDeviceHandler.start(this); audioDeviceHandler.start(this);
@ -427,15 +425,6 @@ class AudioModeModule extends ReactContextBaseJavaModule {
} }
} }
/**
* Needed on the legacy handler...
*
* @return Context for the application.
*/
Context getContext() {
return getReactApplicationContext();
}
/** /**
* Interface for the modules implementing the actual audio device management. * Interface for the modules implementing the actual audio device management.
*/ */

View File

@ -1,191 +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.
*/
package org.jitsi.meet.sdk;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
/**
* Helper class to detect and handle Bluetooth device changes. It monitors
* Bluetooth headsets being connected / disconnected and notifies the module
* about device changes when this occurs.
*/
class BluetoothHeadsetMonitor {
private final static String TAG = BluetoothHeadsetMonitor.class.getSimpleName();
/**
* The {@link Context} in which this module executes.
*/
private final Context context;
/**
* Reference to the {@link BluetoothAdapter} object, used to access Bluetooth functionality.
*/
private BluetoothAdapter adapter;
/**
* Reference to a proxy object which allows us to query connected devices.
*/
private BluetoothHeadset headset;
/**
* receiver registered for receiving Bluetooth connection state changes.
*/
private BroadcastReceiver receiver;
/**
* Listener for receiving Bluetooth device change events.
*/
private Listener listener;
public BluetoothHeadsetMonitor(Context context, Listener listener) {
this.context = context;
this.listener = listener;
}
private boolean getBluetoothHeadsetProfileProxy() {
adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter == null) {
JitsiMeetLogger.w(TAG + " Device doesn't support Bluetooth");
return false;
}
// XXX: The profile listener listens for system services of the given
// type being available to the application. That is, if our Bluetooth
// adapter has the "headset" profile.
BluetoothProfile.ServiceListener listener
= new BluetoothProfile.ServiceListener() {
@Override
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEADSET) {
headset = (BluetoothHeadset) proxy;
updateDevices();
}
}
@Override
public void onServiceDisconnected(int profile) {
// The logic is the same as the logic of onServiceConnected.
onServiceConnected(profile, /* proxy */ null);
}
};
return adapter.getProfileProxy(context, listener, BluetoothProfile.HEADSET);
}
private void onBluetoothReceiverReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
// XXX: This action will be fired when a Bluetooth headset is
// connected or disconnected to the system. This is not related to
// audio routing.
int state = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, -99);
switch (state) {
case BluetoothHeadset.STATE_CONNECTED:
case BluetoothHeadset.STATE_DISCONNECTED:
JitsiMeetLogger.d(TAG + " BT headset connection state changed: " + state);
updateDevices();
break;
}
} else if (action.equals(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)) {
// XXX: This action will be fired when the connection established
// with a Bluetooth headset (called a SCO connection) changes state.
// When the SCO connection is active we route audio to it.
int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -99);
switch (state) {
case AudioManager.SCO_AUDIO_STATE_CONNECTED:
case AudioManager.SCO_AUDIO_STATE_DISCONNECTED:
JitsiMeetLogger.d(TAG + " BT SCO connection state changed: " + state);
updateDevices();
break;
}
}
}
private void registerBluetoothReceiver() {
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
onBluetoothReceiverReceive(context, intent);
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
filter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
context.registerReceiver(receiver, filter);
}
/**
* Detects if there are new devices connected / disconnected and fires the
* {@link Listener} registered event.
*/
private void updateDevices() {
boolean headsetAvailable = (headset != null) && !headset.getConnectedDevices().isEmpty();
listener.onBluetoothDeviceChange(headsetAvailable);
}
public void start() {
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (!audioManager.isBluetoothScoAvailableOffCall()) {
JitsiMeetLogger.w(TAG + " Bluetooth SCO is not available");
return;
}
if (!getBluetoothHeadsetProfileProxy()) {
JitsiMeetLogger.w(TAG + " Couldn't get BT profile proxy");
return;
}
registerBluetoothReceiver();
// Initial detection.
updateDevices();
}
public void stop() {
if (receiver != null) {
context.unregisterReceiver(receiver);
}
if (adapter != null && headset != null) {
adapter.closeProfileProxy(BluetoothProfile.HEADSET, headset);
}
receiver = null;
headset = null;
adapter = null;
}
interface Listener {
void onBluetoothDeviceChange(boolean deviceAvailable);
}
}

View File

@ -1,6 +1,5 @@
/* /*
* Copyright @ 2019-present 8x8, Inc. * Copyright @ 2018-present 8x8, Inc.
* Copyright @ 2018 Atlassian Pty Ltd
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -17,10 +16,8 @@
package org.jitsi.meet.sdk; package org.jitsi.meet.sdk;
import android.annotation.TargetApi;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.Callback;
@ -178,7 +175,6 @@ public class JitsiMeetActivityDelegate {
}; };
} }
@TargetApi(Build.VERSION_CODES.M)
public static void requestPermissions(Activity activity, String[] permissions, int requestCode, PermissionListener listener) { public static void requestPermissions(Activity activity, String[] permissions, int requestCode, PermissionListener listener) {
permissionListener = listener; permissionListener = listener;
activity.requestPermissions(permissions, requestCode); activity.requestPermissions(permissions, requestCode);

View File

@ -1,6 +1,5 @@
/* /*
* Copyright @ 2018-present 8x8, Inc. * Copyright @ 2017-present 8x8, Inc.
* Copyright @ 2017-2018 Atlassian Pty Ltd
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -126,7 +125,7 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
= ReactInstanceManagerHolder.getNativeModule( = ReactInstanceManagerHolder.getNativeModule(
PictureInPictureModule.class); PictureInPictureModule.class);
if (pipModule != null if (pipModule != null
&& PictureInPictureModule.isPictureInPictureSupported() && pipModule.isPictureInPictureSupported()
&& !JitsiMeetActivityDelegate.arePermissionsBeingRequested() && !JitsiMeetActivityDelegate.arePermissionsBeingRequested()
&& this.url != null) { && this.url != null) {
try { try {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright @ 2017-present Atlassian Pty Ltd * Copyright @ 2017-present 8x8, Inc.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -18,6 +18,7 @@ package org.jitsi.meet.sdk;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.Activity; import android.app.Activity;
import android.app.ActivityManager;
import android.app.PictureInPictureParams; import android.app.PictureInPictureParams;
import android.os.Build; import android.os.Build;
import android.util.Rational; import android.util.Rational;
@ -30,20 +31,41 @@ import com.facebook.react.module.annotations.ReactModule;
import org.jitsi.meet.sdk.log.JitsiMeetLogger; import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.util.HashMap;
import java.util.Map;
import static android.content.Context.ACTIVITY_SERVICE;
@ReactModule(name = PictureInPictureModule.NAME) @ReactModule(name = PictureInPictureModule.NAME)
class PictureInPictureModule class PictureInPictureModule extends ReactContextBaseJavaModule {
extends ReactContextBaseJavaModule {
public static final String NAME = "PictureInPicture"; public static final String NAME = "PictureInPicture";
private static final String TAG = NAME; private static final String TAG = NAME;
static boolean isPictureInPictureSupported() { private static boolean isSupported;
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
}
public PictureInPictureModule(ReactApplicationContext reactContext) { public PictureInPictureModule(ReactApplicationContext reactContext) {
super(reactContext); super(reactContext);
ActivityManager am = (ActivityManager) reactContext.getSystemService(ACTIVITY_SERVICE);
// Android Go devices don't support PiP. There doesn't seem to be a better way to detect it than
// to use ActivityManager.isLowRamDevice().
// https://stackoverflow.com/questions/58340558/how-to-detect-android-go
isSupported = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !am.isLowRamDevice();
}
/**
* Gets a {@code Map} of constants this module exports to JS. Supports JSON
* types.
*
* @return a {@link Map} of constants this module exports to JS
*/
@Override
public Map<String, Object> getConstants() {
Map<String, Object> constants = new HashMap<>();
constants.put("SUPPORTED", isSupported);
return constants;
} }
/** /**
@ -61,7 +83,7 @@ class PictureInPictureModule
*/ */
@TargetApi(Build.VERSION_CODES.O) @TargetApi(Build.VERSION_CODES.O)
public void enterPictureInPicture() { public void enterPictureInPicture() {
if (!isPictureInPictureSupported()) { if (!isSupported) {
throw new IllegalStateException("Picture-in-Picture not supported"); throw new IllegalStateException("Picture-in-Picture not supported");
} }
@ -104,6 +126,10 @@ class PictureInPictureModule
} }
} }
public boolean isPictureInPictureSupported() {
return isSupported;
}
@Override @Override
public String getName() { public String getName() {
return NAME; return NAME;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright @ 2017-present Atlassian Pty Ltd * Copyright @ 2017-present 8x8, Inc.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -33,21 +33,10 @@ import com.facebook.react.module.annotations.ReactModule;
* is used with the conference audio-only mode. * is used with the conference audio-only mode.
*/ */
@ReactModule(name = ProximityModule.NAME) @ReactModule(name = ProximityModule.NAME)
class ProximityModule class ProximityModule extends ReactContextBaseJavaModule {
extends ReactContextBaseJavaModule {
public static final String NAME = "Proximity"; public static final String NAME = "Proximity";
/**
* This type of wake lock (the one activated by the proximity sensor) has
* been available for a while, but the constant was only exported in API
* level 21 (Android Marshmallow) so make no assumptions and use its value
* directly.
*
* TODO: Remove when we bump the API level to 21.
*/
private static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = 32;
/** /**
* {@link WakeLock} instance. * {@link WakeLock} instance.
*/ */
@ -71,7 +60,7 @@ class ProximityModule
try { try {
wakeLock wakeLock
= powerManager.newWakeLock( = powerManager.newWakeLock(
PROXIMITY_SCREEN_OFF_WAKE_LOCK, PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK,
"jitsi:"+NAME); "jitsi:"+NAME);
} catch (Throwable ignored) { } catch (Throwable ignored) {
wakeLock = null; wakeLock = null;

View File

@ -411,6 +411,10 @@ function disconnect() {
return Promise.resolve(); return Promise.resolve();
}; };
if (!connection) {
return onDisconnected();
}
return connection.disconnect().then(onDisconnected, onDisconnected); return connection.disconnect().then(onDisconnected, onDisconnected);
} }
@ -755,7 +759,13 @@ export default {
} }
if (isPrejoinPageEnabled(APP.store.getState())) { if (isPrejoinPageEnabled(APP.store.getState())) {
_connectionPromise = connect(roomName); _connectionPromise = connect(roomName).then(c => {
// we want to initialize it early, in case of errors to be able
// to gather logs
APP.connection = c;
return c;
});
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks(initialOptions); const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks(initialOptions);
const tracks = await tryCreateLocalTracks; const tracks = await tryCreateLocalTracks;
@ -1202,10 +1212,6 @@ export default {
// end used by torture // end used by torture
getLogs() {
return room.getLogs();
},
/** /**
* Download logs, a function that can be called from console while * Download logs, a function that can be called from console while
* debugging. * debugging.
@ -1214,7 +1220,7 @@ export default {
saveLogs(filename = 'meetlog.json') { saveLogs(filename = 'meetlog.json') {
// this can be called from console and will not have reference to this // this can be called from console and will not have reference to this
// that's why we reference the global var // that's why we reference the global var
const logs = APP.conference.getLogs(); const logs = APP.connection.getLogs();
const data = encodeURIComponent(JSON.stringify(logs, null, ' ')); const data = encodeURIComponent(JSON.stringify(logs, null, ' '));
const elem = document.createElement('a'); const elem = document.createElement('a');
@ -1584,10 +1590,6 @@ export default {
if (didHaveVideo) { if (didHaveVideo) {
promise = promise.then(() => createLocalTracksF({ devices: [ 'video' ] })) promise = promise.then(() => createLocalTracksF({ devices: [ 'video' ] }))
.then(([ stream ]) => this.useVideoStream(stream)) .then(([ stream ]) => this.useVideoStream(stream))
.then(() => {
sendAnalytics(createScreenSharingEvent('stopped'));
logger.log('Screen sharing stopped.');
})
.catch(error => { .catch(error => {
logger.error('failed to switch back to local video', error); logger.error('failed to switch back to local video', error);
@ -1604,6 +1606,8 @@ export default {
return promise.then( return promise.then(
() => { () => {
this.videoSwitchInProgress = false; this.videoSwitchInProgress = false;
sendAnalytics(createScreenSharingEvent('stopped'));
logger.info('Screen sharing stopped.');
}, },
error => { error => {
this.videoSwitchInProgress = false; this.videoSwitchInProgress = false;

View File

@ -37,6 +37,8 @@ var config = {
clientNode: 'http://jitsi.org/jitsimeet', clientNode: 'http://jitsi.org/jitsimeet',
// The real JID of focus participant - can be overridden here // The real JID of focus participant - can be overridden here
// Do not change username - FIXME: Make focus username configurable
// https://github.com/jitsi/jitsi-meet/issues/7376
// focusUserJid: 'focus@auth.jitsi-meet.example.com', // focusUserJid: 'focus@auth.jitsi-meet.example.com',
@ -44,6 +46,10 @@ var config = {
// //
testing: { testing: {
// Disables the End to End Encryption feature. Useful for debugging
// issues related to insertable streams.
// disableE2EE: false,
// P2P test mode disables automatic switching to P2P when there are 2 // P2P test mode disables automatic switching to P2P when there are 2
// participants in the conference. // participants in the conference.
p2pTestMode: false p2pTestMode: false
@ -107,11 +113,20 @@ var config = {
// participants and to enable it back a reload is needed. // participants and to enable it back a reload is needed.
// startSilent: false // startSilent: false
// Sets the preferred target bitrate for the Opus audio codec by setting its
// 'maxaveragebitrate' parameter. Currently not available in p2p mode.
// Valid values are in the range 6000 to 510000
// opusMaxAverageBitrate: 20000,
// Video // Video
// Sets the preferred resolution (height) for local video. Defaults to 720. // Sets the preferred resolution (height) for local video. Defaults to 720.
// resolution: 720, // resolution: 720,
// How many participants while in the tile view mode, before the receiving video quality is reduced from HD to SD.
// Use -1 to disable.
// maxFullResolutionParticipants: 2
// w3c spec-compliant video constraints to use for video capture. Currently // w3c spec-compliant video constraints to use for video capture. Currently
// used by browsers that return true from lib-jitsi-meet's // used by browsers that return true from lib-jitsi-meet's
// util#browser#usesNewGumFlow. The constraints are independent from // util#browser#usesNewGumFlow. The constraints are independent from
@ -201,6 +216,37 @@ var config = {
// Default value for the channel "last N" attribute. -1 for unlimited. // Default value for the channel "last N" attribute. -1 for unlimited.
channelLastN: -1, channelLastN: -1,
// Provides a way to use different "last N" values based on the number of participants in the conference.
// The keys in an Object represent number of participants and the values are "last N" to be used when number of
// participants gets to or above the number.
//
// For the given example mapping, "last N" will be set to 20 as long as there are at least 5, but less than
// 29 participants in the call and it will be lowered to 15 when the 30th participant joins. The 'channelLastN'
// will be used as default until the first threshold is reached.
//
// lastNLimits: {
// 5: 20,
// 30: 15,
// 50: 10,
// 70: 5,
// 90: 2
// },
// Specify the settings for video quality optimizations on the client.
// videoQuality: {
//
// // Provides a way to configure the maximum bitrates that will be enforced on the simulcast streams for
// // video tracks. The keys in the object represent the type of the stream (LD, SD or HD) and the values
// // are the max.bitrates to be set on that particular type of stream. The actual send may vary based on
// // the available bandwidth calculated by the browser, but it will be capped by the values specified here.
// // This is currently not implemented on app based clients on mobile.
// maxBitratesVideo: {
// low: 200000,
// standard: 500000,
// high: 1500000
// }
// },
// // Options for the recording limit notification. // // Options for the recording limit notification.
// recordingLimit: { // recordingLimit: {
// //
@ -303,10 +349,10 @@ var config = {
// and microsoftApiApplicationClientID // and microsoftApiApplicationClientID
// enableCalendarIntegration: false, // enableCalendarIntegration: false,
// When 'true', it shows an intermediate page before joining, where the user can configure its devices. // When 'true', it shows an intermediate page before joining, where the user can configure their devices.
// prejoinPageEnabled: false, // prejoinPageEnabled: false,
// If true, shows the unsafe roon name warning label when a room name is // If true, shows the unsafe room name warning label when a room name is
// deemed unsafe (due to the simplicity in the name) and a password is not // deemed unsafe (due to the simplicity in the name) and a password is not
// set or the lobby is not enabled. // set or the lobby is not enabled.
// enableInsecureRoomNameWarning: false, // enableInsecureRoomNameWarning: false,
@ -328,10 +374,10 @@ var config = {
// callStatsID: '', // callStatsID: '',
// callStatsSecret: '', // callStatsSecret: '',
// enables sending participants display name to callstats // Enables sending participants' display names to callstats
// enableDisplayNameInStats: false, // enableDisplayNameInStats: false,
// enables sending participants email if available to callstats and other analytics // Enables sending participants' emails (if available) to callstats and other analytics
// enableEmailInStats: false, // enableEmailInStats: false,
// Privacy // Privacy
@ -361,7 +407,7 @@ var config = {
// The STUN servers that will be used in the peer to peer connections // The STUN servers that will be used in the peer to peer connections
stunServers: [ stunServers: [
// { urls: 'stun:jitsi-meet.example.com:4446' }, // { urls: 'stun:jitsi-meet.example.com:3478' },
{ urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' } { urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' }
] ]
@ -397,6 +443,15 @@ var config = {
// The Amplitude APP Key: // The Amplitude APP Key:
// amplitudeAPPKey: '<APP_KEY>' // amplitudeAPPKey: '<APP_KEY>'
// Configuration for the rtcstats server:
// In order to enable rtcstats one needs to provide a endpoint url.
// rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/,
// The interval at which rtcstats will poll getStats, defaults to 1000ms.
// If the value is set to 0 getStats won't be polled and the rtcstats client
// will only send data related to RTCPeerConnection events.
// rtcstatsPolIInterval: 1000
// Array of script URLs to load as lib-jitsi-meet "analytics handlers". // Array of script URLs to load as lib-jitsi-meet "analytics handlers".
// scriptURLs: [ // scriptURLs: [
// "libs/analytics-ga.min.js", // google-analytics // "libs/analytics-ga.min.js", // google-analytics
@ -504,7 +559,7 @@ var config = {
/** /**
External API url used to receive branding specific information. External API url used to receive branding specific information.
If there is no url set or there are missing fields, the defaults are applied. If there is no url set or there are missing fields, the defaults are applied.
None of the fieds are mandatory and the response must have the shape: None of the fields are mandatory and the response must have the shape:
{ {
// The hex value for the colour used as background // The hex value for the colour used as background
backgroundColor: '#fff', backgroundColor: '#fff',
@ -518,6 +573,11 @@ var config = {
*/ */
// brandingDataUrl: '', // brandingDataUrl: '',
// The URL of the moderated rooms microservice, if available. If it
// is present, a link to the service will be rendered on the welcome page,
// otherwise the app doesn't render it.
// moderatedRoomServiceUrl: 'https://moderated.jitsi-meet.example.com',
// List of undocumented settings used in jitsi-meet // List of undocumented settings used in jitsi-meet
/** /**
_immediateReloadThreshold _immediateReloadThreshold

View File

@ -1,7 +1,7 @@
/* global APP, JitsiMeetJS, config */ /* global APP, JitsiMeetJS, config */
import { jitsiLocalStorage } from '@jitsi/js-utils';
import Logger from 'jitsi-meet-logger'; import Logger from 'jitsi-meet-logger';
import { jitsiLocalStorage } from 'js-utils';
import AuthHandler from './modules/UI/authentication/AuthHandler'; import AuthHandler from './modules/UI/authentication/AuthHandler';
import { import {
@ -13,6 +13,7 @@ import {
JitsiConnectionErrors, JitsiConnectionErrors,
JitsiConnectionEvents JitsiConnectionEvents
} from './react/features/base/lib-jitsi-meet'; } from './react/features/base/lib-jitsi-meet';
import { setPrejoinDisplayNameRequired } from './react/features/prejoin/actions';
const logger = Logger.getLogger(__filename); const logger = Logger.getLogger(__filename);
@ -81,7 +82,7 @@ function checkForAttachParametersAndConnect(id, password, connection) {
*/ */
function connect(id, password, roomName) { function connect(id, password, roomName) {
const connectionConfig = Object.assign({}, config); const connectionConfig = Object.assign({}, config);
const { issuer, jwt } = APP.store.getState()['features/base/jwt']; const { jwt } = APP.store.getState()['features/base/jwt'];
// Use Websocket URL for the web app if configured. Note that there is no 'isWeb' check, because there's assumption // Use Websocket URL for the web app if configured. Note that there is no 'isWeb' check, because there's assumption
// that this code executes only on web browsers/electron. This needs to be changed when mobile and web are unified. // that this code executes only on web browsers/electron. This needs to be changed when mobile and web are unified.
@ -93,11 +94,7 @@ function connect(id, password, roomName) {
// in future). It's included for the time being for Jitsi Meet and lib-jitsi-meet versions interoperability. // in future). It's included for the time being for Jitsi Meet and lib-jitsi-meet versions interoperability.
connectionConfig.serviceUrl = connectionConfig.bosh = serviceUrl; connectionConfig.serviceUrl = connectionConfig.bosh = serviceUrl;
const connection const connection = new JitsiMeetJS.JitsiConnection(null, jwt, connectionConfig);
= new JitsiMeetJS.JitsiConnection(
null,
jwt && issuer && issuer !== 'anonymous' ? jwt : undefined,
connectionConfig);
if (config.iAmRecorder) { if (config.iAmRecorder) {
connection.addFeature(DISCO_JIBRI_FEATURE); connection.addFeature(DISCO_JIBRI_FEATURE);
@ -113,6 +110,10 @@ function connect(id, password, roomName) {
connection.addEventListener( connection.addEventListener(
JitsiConnectionEvents.CONNECTION_FAILED, JitsiConnectionEvents.CONNECTION_FAILED,
connectionFailedHandler); connectionFailedHandler);
connection.addEventListener(
JitsiConnectionEvents.DISPLAY_NAME_REQUIRED,
displayNameRequiredHandler
);
/* eslint-disable max-params */ /* eslint-disable max-params */
/** /**
@ -166,6 +167,14 @@ function connect(id, password, roomName) {
reject(err); reject(err);
} }
/**
* Marks the display name for the prejoin screen as required.
* This can happen if a user tries to join a room with lobby enabled.
*/
function displayNameRequiredHandler() {
APP.store.dispatch(setPrejoinDisplayNameRequired());
}
checkForAttachParametersAndConnect(id, password, connection); checkForAttachParametersAndConnect(id, password, connection);
}); });
} }
@ -198,10 +207,9 @@ export function openConnection({ id, password, retry, roomName }) {
return connect(id, password, roomName).catch(err => { return connect(id, password, roomName).catch(err => {
if (retry) { if (retry) {
const { issuer, jwt } = APP.store.getState()['features/base/jwt']; const { jwt } = APP.store.getState()['features/base/jwt'];
if (err === JitsiConnectionErrors.PASSWORD_REQUIRED if (err === JitsiConnectionErrors.PASSWORD_REQUIRED && !jwt) {
&& (!jwt || issuer === 'anonymous')) {
return AuthHandler.requestAuth(roomName, connect); return AuthHandler.requestAuth(roomName, connect);
} }
} }

View File

@ -2,7 +2,7 @@
* Move the @atlaskit/flag container up a little bit so it does not cover the * Move the @atlaskit/flag container up a little bit so it does not cover the
* toolbar with the first notification. * toolbar with the first notification.
*/ */
.cjMOOK{ .jIMojv{
bottom: calc(#{$newToolbarSizeWithPadding}) !important; bottom: calc(#{$newToolbarSizeWithPadding}) !important;
} }

View File

@ -33,6 +33,26 @@ body {
} }
} }
/**
* AtlasKit sets a default margin on the rendered modals, so
* when the shift-right class is set when the chat opens, we
* pad the modal container in order for the modals to be centered
* while also taking the chat size into consideration.
*/
@media (min-width: 480px + $sidebarWidth) {
.shift-right [class^="Modal__FillScreen"] {
padding-left: $sidebarWidth;
}
}
/**
* Similarly, we offset the notifications when the chat is open by
* padding the container.
*/
.shift-right [class^="styledFlagGroup-"] {
padding-left: $sidebarWidth;
}
.jitsi-icon svg { .jitsi-icon svg {
fill: white; fill: white;
} }

View File

@ -4,16 +4,11 @@
color: #FFF; color: #FFF;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
/** height: 100%;
* Make the sidebar flush with the top of the toolbar. Take the size of
* the toolbar and subtract from 100%.
*/
height: calc(100% - #{$newToolbarSizeWithPadding});
left: -$sidebarWidth; left: -$sidebarWidth;
overflow: hidden; overflow: hidden;
position: absolute; position: absolute;
top: 0; top: 0;
transition: left 0.5s;
width: $sidebarWidth; width: $sidebarWidth;
z-index: $sideToolbarContainerZ; z-index: $sideToolbarContainerZ;

View File

@ -96,6 +96,11 @@
padding: 0 8px; padding: 0 8px;
} }
} }
.prejoin-dialog-btn.primary,
.action-btn.prejoin-dialog-btn.text {
width: 310px;
}
} }
.prejoin-dialog-callout { .prejoin-dialog-callout {

View File

@ -36,13 +36,7 @@
} }
&-checkbox-container { &-checkbox-container {
align-items: center; margin-bottom: 14px;
color: #fff;
display: none;
font-size: 13px;
justify-content: center;
line-height: 20px;
margin-top: 16px;
width: 100%; width: 100%;
} }
} }

View File

@ -1,22 +1,90 @@
/** /**
* Shared style for full screen local track based dialogs/modals. * Shared style for full screen local track based dialogs/modals.
*/ */
.premeeting-screen,
.preview-overlay {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
.premeeting-screen { .premeeting-screen {
align-items: stretch; align-items: stretch;
background: #1C2025; background: radial-gradient(50% 50% at 50% 50%, #5D95C7 0%, #376288 100%), #FFFFFF;
bottom: 0;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
font-size: 1.3em; font-size: 1.3em;
left: 0; z-index: $toolbarZ + 1;
.action-btn {
border-radius: 3px;
color: #fff;
cursor: pointer;
display: inline-block;
font-size: 15px;
line-height: 24px;
margin-top: 16px;
padding: 7px 16px;
position: relative;
text-align: center;
width: 286px;
&.primary {
background: #0376DA;
border: 1px solid #0376DA;
}
&.secondary {
background: transparent;
border: 1px solid #5E6D7A;
}
&.text {
width: auto;
font-size: 13px;
margin: 0;
padding: 0;
}
&.disabled {
background: #5E6D7A;
border: 1px solid #5E6D7A;
color: #AFB6BC;
cursor: initial;
.icon {
& > svg {
fill: #AFB6BC;
}
}
.options {
border-left: 1px solid #AFB6BC;
}
}
.options {
align-items: center;
border-left: 1px solid #fff;
display: flex;
height: 100%;
justify-content: center;
position: absolute; position: absolute;
right: 0; right: 0;
top: 0; top: 0;
width: 40px;
}
}
.preview-overlay {
background-image: linear-gradient(transparent, black);
z-index: $toolbarZ + 1; z-index: $toolbarZ + 1;
}
.content { .content {
align-items: center; align-items: center;
background-image: linear-gradient(transparent, black);
display: flex; display: flex;
flex: 1; flex: 1;
flex-direction: column; flex-direction: column;
@ -97,66 +165,6 @@
color: $defaultWarningColor; color: $defaultWarningColor;
} }
} }
.action-btn {
border-radius: 3px;
color: #fff;
cursor: pointer;
display: inline-block;
font-size: 15px;
line-height: 24px;
margin-top: 16px;
padding: 7px 16px;
position: relative;
text-align: center;
width: 286px;
&.primary {
background: #0376DA;
border: 1px solid #0376DA;
}
&.secondary {
background: transparent;
border: 1px solid #5E6D7A;
}
&.text {
width: auto;
font-size: 13px;
margin: 0;
padding: 0;
}
&.disabled {
background: #5E6D7A;
border: 1px solid #5E6D7A;
color: #AFB6BC;
cursor: initial;
.icon {
& > svg {
fill: #AFB6BC;
}
}
.options {
border-left: 1px solid #AFB6BC;
}
}
.options {
align-items: center;
border-left: 1px solid #fff;
display: flex;
height: 100%;
justify-content: center;
position: absolute;
right: 0;
top: 0;
width: 40px;
}
}
} }
.media-btn-container { .media-btn-container {
@ -189,9 +197,16 @@
text-align: center; text-align: center;
} }
.preview-avatar-container {
width: 100%;
height: 80%;
display: flex;
align-items: center;
justify-content: center;
}
.avatar { .avatar {
background: #A4B8D1; background: #A4B8D1;
margin: 200px auto 0 auto;
} }
video { video {
@ -201,3 +216,66 @@
width: 100%; width: 100%;
} }
} }
@mixin flex-centered() {
align-items: center;
display: flex;
justify-content: center;
}
@mixin icon-container($bg, $fill) {
.toggle-button-icon-container {
background: $bg;
svg {
fill: $fill
}
}
}
.toggle-button {
border-radius: 3px;
cursor: pointer;
color: #fff;
font-size: 13px;
height: 40px;
margin: 0 auto;
width: 320px;
@include flex-centered();
svg {
fill: transparent;
}
&:hover {
background: #1C2025;
@include icon-container(#A4B8D1, #1C2025);
}
&-container {
position: relative;
@include flex-centered();
}
&-icon-container {
border-radius: 50%;
left: -22px;
padding: 2px;
position: absolute;
}
&--toggled {
background: #75757A;
&:hover {
background: #75757A;
@include icon-container(#A4B8D1, #75757A);
}
@include icon-container(#A4B8D1, #75757A);
}
}

70
css/_responsive.scss Normal file
View File

@ -0,0 +1,70 @@
@media only screen and (max-width: $smallScreen) {
.watermark {
width: 20%;
height: 20%;
}
.new-toolbox {
.toolbox-content {
.button-group-center, .button-group-left, .button-group-right {
.toolbox-button {
.toolbox-icon {
width: 28px;
height: 28px;
svg {
width: 18px;
height: 18px;
}
}
&:nth-child(2) {
.toolbox-icon {
width: 30px;
height: 30px;
}
}
}
}
}
}
}
@media only screen and (max-width: $verySmallScreen) {
#videoResolutionLabel {
display: none;
}
.desktop-browser {
.vertical-filmstrip .filmstrip {
display: none;
}
}
.new-toolbox {
.toolbox-content {
.button-group-center, .button-group-left, .button-group-right {
.settings-button-small-icon {
display: none;
}
.toolbox-button {
.toolbox-icon {
width: 18px;
height: 18px;
svg {
width: 12px;
height: 12px;
}
}
&:nth-child(2) {
.toolbox-icon {
width: 20px;
height: 20px;
}
}
}
}
}
}
.chrome-extension-banner {
display: none;
}
}

View File

@ -42,6 +42,11 @@
display: none; display: none;
} }
&.shift-right {
margin-left: $sidebarWidth;
width: calc(100% - #{$sidebarWidth});
}
.toolbox-background { .toolbox-background {
background-image: linear-gradient(to top, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0)); background-image: linear-gradient(to top, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
transition: bottom .3s ease-in; transition: bottom .3s ease-in;

View File

@ -164,6 +164,9 @@ $unsupportedDesktopBrowserTextFontSize: 21px;
$watermarkWidth: 186px; $watermarkWidth: 186px;
$watermarkHeight: 74px; $watermarkHeight: 74px;
$welcomePageWatermarkWidth: 186px;
$welcomePageWatermarkHeight: 74px;
/** /**
* Welcome page variables. * Welcome page variables.
*/ */
@ -178,9 +181,12 @@ $welcomePageHeaderBackgroundPosition: none;
$welcomePageHeaderBackgroundRepeat: none; $welcomePageHeaderBackgroundRepeat: none;
$welcomePageHeaderBackgroundSize: none; $welcomePageHeaderBackgroundSize: none;
$welcomePageHeaderPaddingBottom: 0px; $welcomePageHeaderPaddingBottom: 0px;
$welcomePageHeaderMinHeight: fit-content;
$welcomePageHeaderTextMarginTop: 35px; $welcomePageHeaderTextMarginTop: 35px;
$welcomePageHeaderTextMarginBottom: 35px; $welcomePageHeaderTextMarginBottom: 35px;
$welcomePageHeaderTextDisplay: flex;
$welcomePageHeaderTextWidth: 650px;
$welcomePageHeaderTextTitleMarginBottom: 16px; $welcomePageHeaderTextTitleMarginBottom: 16px;
$welcomePageHeaderTextTitleFontSize: 2.5rem; $welcomePageHeaderTextTitleFontSize: 2.5rem;
@ -195,6 +201,7 @@ $welcomePageHeaderTextDescriptionLineHeight: 24px;
$welcomePageHeaderTextDescriptionMarginBottom: 20px; $welcomePageHeaderTextDescriptionMarginBottom: 20px;
$welcomePageHeaderTextDescriptionAlignSelf: inherit; $welcomePageHeaderTextDescriptionAlignSelf: inherit;
$welcomePageEnterRoomDisplay: flex;
$welcomePageEnterRoomWidth: 680px; $welcomePageEnterRoomWidth: 680px;
$welcomePageEnterRoomPadding: 25px 30px; $welcomePageEnterRoomPadding: 25px 30px;
$welcomePageEnterRoomBorderRadius: 0px; $welcomePageEnterRoomBorderRadius: 0px;
@ -269,3 +276,9 @@ $chromeExtensionBannerTop: 80px;
$chromeExtensionBannerRight: 16px; $chromeExtensionBannerRight: 16px;
$chromeExtensionBannerTopInMeeting: 10px; $chromeExtensionBannerTopInMeeting: 10px;
$chromeExtensionBannerRightInMeeeting: 10px; $chromeExtensionBannerRightInMeeeting: 10px;
/**
* media type thresholds
*/
$smallScreen: 700px;
$verySmallScreen: 500px;

View File

@ -181,6 +181,13 @@
visibility: hidden; visibility: hidden;
z-index: $zindex2; z-index: $zindex2;
} }
&.shift-right {
&#largeVideoContainer {
margin-left: $sidebarWidth;
width: calc(100% - #{$sidebarWidth});
}
}
} }
#localVideoWrapper { #localVideoWrapper {

View File

@ -21,18 +21,18 @@ body.welcome-page {
align-items: center; align-items: center;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
min-height: fit-content; min-height: $welcomePageHeaderMinHeight;
overflow: hidden; overflow: hidden;
position: relative; position: relative;
text-align: center; text-align: center;
.header-text { .header-text {
display: flex; display: $welcomePageHeaderTextDisplay;
flex-direction: column; flex-direction: column;
margin-top: $watermarkHeight + $welcomePageHeaderTextMarginTop; margin-top: $watermarkHeight + $welcomePageHeaderTextMarginTop;
margin-bottom: $welcomePageHeaderTextMarginBottom; margin-bottom: $welcomePageHeaderTextMarginBottom;
max-width: calc(100% - 40px); max-width: calc(100% - 40px);
width: 650px; width: $welcomePageHeaderTextWidth;
z-index: $zindex2; z-index: $zindex2;
} }
@ -56,7 +56,7 @@ body.welcome-page {
} }
#enter_room { #enter_room {
display: flex; display: $welcomePageEnterRoomDisplay;
align-items: center; align-items: center;
max-width: calc(100% - 40px); max-width: calc(100% - 40px);
width: $welcomePageEnterRoomWidth; width: $welcomePageEnterRoomWidth;
@ -111,6 +111,22 @@ body.welcome-page {
} }
#moderated-meetings {
max-width: calc(100% - 40px);
padding: 16px 0 39px 0;
width: $welcomePageEnterRoomWidth;
p {
color: $welcomePageDescriptionColor;
text-align: left;
a {
color: inherit;
font-weight: 600;
}
}
}
.tab-container { .tab-container {
font-size: 16px; font-size: 16px;
position: relative; position: relative;
@ -195,5 +211,10 @@ body.welcome-page {
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 100%; height: 100%;
.watermark.leftwatermark {
width: $welcomePageWatermarkWidth;
height: $welcomePageWatermarkHeight;
}
} }
} }

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: 8px;
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

@ -46,7 +46,16 @@
position: fixed; position: fixed;
top: 0; top: 0;
width: 100%; width: 100%;
z-index: $filmstripVideosZ z-index: $filmstripVideosZ;
&.shift-right {
margin-left: $sidebarWidth;
width: calc(100% - #{$sidebarWidth});
#filmstripRemoteVideos {
width: calc(100vw - #{$sidebarWidth});
}
}
} }
/** /**

View File

@ -33,9 +33,11 @@ $flagsImagePath: "../images/";
@import 'inlay'; @import 'inlay';
@import 'reload_overlay/reload_overlay'; @import 'reload_overlay/reload_overlay';
@import 'mini_toolbox'; @import 'mini_toolbox';
@import 'buttons/copy.scss';
@import 'modals/desktop-picker/desktop-picker'; @import 'modals/desktop-picker/desktop-picker';
@import 'modals/device-selection/device-selection'; @import 'modals/device-selection/device-selection';
@import 'modals/dialog'; @import 'modals/dialog';
@import 'modals/embed-meeting/embed-meeting';
@import 'modals/feedback/feedback'; @import 'modals/feedback/feedback';
@import 'modals/invite/info'; @import 'modals/invite/info';
@import 'modals/settings/settings'; @import 'modals/settings/settings';
@ -99,5 +101,6 @@ $flagsImagePath: "../images/";
@import 'modals/security/security'; @import 'modals/security/security';
@import 'premeeting-screens'; @import 'premeeting-screens';
@import 'e2ee'; @import 'e2ee';
@import 'responsive';
/* Modules END */ /* Modules END */

View File

@ -0,0 +1,59 @@
.embed-meeting {
&-dialog {
display: flex;
flex-direction: column;
&-header {
display: flex;
justify-content: space-between;
margin: 16px 16px 24px;
width: calc(100% - 32px);
color: #fff;
font-weight: 600;
font-size: 24px;
line-height: 32px;
& > div > svg {
cursor: pointer;
fill: #A4B8D1;
}
}
}
&-copy {
color: white;
font-size: 15px;
margin-left: auto;
margin-top: 16px;
width: auto;
}
&-code {
background: transparent;
border: 1px solid #A4B8D1;
color: white;
font-size: 15px;
height: 165px;
line-height: 24px;
padding: 8px;
width: 100%;
resize: vertical;
}
&-trigger {
display: flex;
align-items: center;
padding: 8px 8px 8px 16px;
margin-top: 24px;
width: calc(100% - 24px);
height: 24px;
background: #2A3A4B;
border: 1px solid #5E6D7A;
border-radius: 4px;
cursor: pointer;
.jitsi-icon {
margin-right: 20px;
}
}
}

View File

@ -47,10 +47,6 @@
font-size: 15px; font-size: 15px;
line-height: 24px; line-height: 24px;
& > span {
font-weight: 600;
}
&.header { &.header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@ -67,44 +63,6 @@
} }
} }
&.copy-link {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 8px 8px 16px;
margin-top: 8px;
width: calc(100% - 24px);
height: 24px;
background: #0376DA;
border-radius: 4px;
cursor: pointer;
&:hover {
background: #278ADF;
font-weight: 600;
}
&-text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 292px;
&.selected {
font-weight: 600;
}
}
&.clicked {
background: #31B76A;
}
& > div > svg > path {
fill: #fff;
}
}
&.separator { &.separator {
margin: 24px 0 24px -20px; margin: 24px 0 24px -20px;
padding: 0 20px; padding: 0 20px;

View File

@ -25,6 +25,10 @@
font-size: 14px; font-size: 14px;
color: #6FB1EA; color: #6FB1EA;
} }
& > :first-child:not(:last-child) {
margin-right: 24px;
}
} }
} }
} }

View File

@ -30,10 +30,12 @@
width: 100%; width: 100%;
} }
.profile-edit-field, .profile-edit-field {
.settings-sub-pane {
flex: 1; flex: 1;
} }
.settings-sub-pane {
flex-grow: 1;
}
.profile-edit-field { .profile-edit-field {
margin-right: 20px; margin-right: 20px;

View File

@ -49,7 +49,7 @@ case "$1" in
# nothing to do # nothing to do
echo "------------------------------------------------" echo "------------------------------------------------"
echo "" echo ""
echo "turnserver is listening on tcp 4445 as other nginx sites use port 443" echo "turnserver is listening on tcp 5349 as other nginx sites use port 443"
echo "" echo ""
echo "------------------------------------------------" echo "------------------------------------------------"
NGINX_MULTIPLEXING="false" NGINX_MULTIPLEXING="false"
@ -87,9 +87,36 @@ case "$1" in
if [[ -f $TURN_CONFIG ]] ; then if [[ -f $TURN_CONFIG ]] ; then
echo "------------------------------------------------" echo "------------------------------------------------"
echo "" echo ""
echo "turnserver is already configured on this machine, skipping." echo "turnserver is already configured on this machine."
echo "" echo ""
echo "------------------------------------------------" echo "------------------------------------------------"
if grep -q "jitsi-meet coturn config" "$TURN_CONFIG" && ! grep -q "jitsi-meet coturn relay disable config" "$TURN_CONFIG" ; then
echo "Updating coturn config"
echo "# jitsi-meet coturn relay disable config. Do not modify this line
no-multicast-peers
no-cli
no-loopback-peers
no-tcp-relay
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255" >> $TURN_CONFIG
invoke-rc.d coturn restart || true
fi
db_stop db_stop
exit 0 exit 0
fi fi
@ -152,7 +179,7 @@ case "$1" in
PROSODY_HOST_CONFIG="/etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua" PROSODY_HOST_CONFIG="/etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua"
if [ -f $PROSODY_HOST_CONFIG ] ; then if [ -f $PROSODY_HOST_CONFIG ] ; then
# If we are not multiplexing we need to change the port in prosody config # If we are not multiplexing we need to change the port in prosody config
sed -i 's/"443"/"4445"/g' $PROSODY_HOST_CONFIG sed -i 's/"443"/"5349"/g' $PROSODY_HOST_CONFIG
invoke-rc.d prosody restart || true invoke-rc.d prosody restart || true
fi fi
fi fi

View File

@ -98,7 +98,7 @@ case "$1" in
-reqexts SAN \ -reqexts SAN \
-extensions SAN \ -extensions SAN \
-config <(cat /etc/ssl/openssl.cnf \ -config <(cat /etc/ssl/openssl.cnf \
<(printf '[SAN]\nsubjectAltName=DNS:localhost,DNS:$JVB_HOSTNAME,IP:$JVB_HOSTNAME')) <(printf "[SAN]\nsubjectAltName=DNS:localhost,DNS:$JVB_HOSTNAME"))
fi fi
fi fi

View File

@ -6,8 +6,8 @@ muc_mapper_domain_base = "jitmeet.example.com";
turncredentials_secret = "__turnSecret__"; turncredentials_secret = "__turnSecret__";
turncredentials = { turncredentials = {
{ type = "stun", host = "jitmeet.example.com", port = "4446" }, { type = "stun", host = "jitmeet.example.com", port = "3478" },
{ type = "turn", host = "jitmeet.example.com", port = "4446", transport = "udp" }, { type = "turn", host = "jitmeet.example.com", port = "3478", transport = "udp" },
{ type = "turns", host = "jitmeet.example.com", port = "443", transport = "tcp" } { type = "turns", host = "jitmeet.example.com", port = "443", transport = "tcp" }
}; };

View File

@ -5,14 +5,32 @@ static-auth-secret=__turnSecret__
realm=jitsi-meet.example.com realm=jitsi-meet.example.com
cert=/etc/jitsi/meet/jitsi-meet.example.com.crt cert=/etc/jitsi/meet/jitsi-meet.example.com.crt
pkey=/etc/jitsi/meet/jitsi-meet.example.com.key pkey=/etc/jitsi/meet/jitsi-meet.example.com.key
no-multicast-peers
no-cli
no-loopback-peers
no-tcp-relay
no-tcp no-tcp
listening-port=4446 listening-port=3478
tls-listening-port=4445 tls-listening-port=5349
external-ip=__external_ip_address__ external-ip=__external_ip_address__
no-tlsv1 no-tlsv1
no-tlsv1_1 no-tlsv1_1
# https://ssl-config.mozilla.org/#server=haproxy&version=2.1&config=intermediate&openssl=1.1.0g&guideline=5.4 # https://ssl-config.mozilla.org/#server=haproxy&version=2.1&config=intermediate&openssl=1.1.0g&guideline=5.4
cipher-list=ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 cipher-list=ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
# jitsi-meet coturn relay disable config. Do not modify this line
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255
syslog syslog

View File

@ -7,7 +7,7 @@ stream {
server 127.0.0.1:4444; server 127.0.0.1:4444;
} }
upstream turn { upstream turn {
server 127.0.0.1:4445; server 127.0.0.1:5349;
} }
# since 1.13.10 # since 1.13.10
map $ssl_preread_alpn_protocols $upstream { map $ssl_preread_alpn_protocols $upstream {

View File

@ -45,8 +45,10 @@ server {
error_page 404 /static/404.html; error_page 404 /static/404.html;
gzip on; gzip on;
gzip_types text/plain text/css application/javascript application/json; gzip_types text/plain text/css application/javascript application/json image/x-icon application/octet-stream application/wasm;
gzip_vary on; gzip_vary on;
gzip_proxied no-cache no-store private expired auth;
gzip_min_length 512;
location = /config.js { location = /config.js {
alias /etc/jitsi/meet/jitsi-meet.example.com-config.js; alias /etc/jitsi/meet/jitsi-meet.example.com-config.js;
@ -61,6 +63,11 @@ server {
{ {
add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Origin' '*';
alias /usr/share/jitsi-meet/$1/$2; alias /usr/share/jitsi-meet/$1/$2;
# cache all versioned files
if ($arg_v) {
expires 1y;
}
} }
# BOSH # BOSH

View File

@ -14,6 +14,12 @@ server {
ssi on; 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 # BOSH
location /http-bind { location /http-bind {
proxy_pass http://localhost:5280/http-bind; proxy_pass http://localhost:5280/http-bind;

View File

@ -28,6 +28,12 @@ server {
tcp_nodelay on; 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 ~ ^/([^/?&:'"]+)$ { location ~ ^/([^/?&:'"]+)$ {
try_files $uri @root_path; try_files $uri @root_path;
} }

View File

@ -8,7 +8,17 @@
<link rel="apple-touch-icon" href="images/apple-touch-icon.png"> <link rel="apple-touch-icon" href="images/apple-touch-icon.png">
<link rel="stylesheet" href="css/all.css"> <link rel="stylesheet" href="css/all.css">
<script>
document.addEventListener('DOMContentLoaded', () => {
if (!JitsiMeetJS.app) {
return;
}
JitsiMeetJS.app.renderEntryPoint({
Component: JitsiMeetJS.app.entryPoints.APP
})
})
</script>
<script> <script>
// IE11 and earlier can be identified via their user agent and be // IE11 and earlier can be identified via their user agent and be
// redirected to a page that is known to have no newer js syntax. // redirected to a page that is known to have no newer js syntax.

View File

@ -48,6 +48,7 @@ var interfaceConfig = {
DEFAULT_LOCAL_DISPLAY_NAME: 'me', DEFAULT_LOCAL_DISPLAY_NAME: 'me',
DEFAULT_LOGO_URL: 'images/watermark.png', DEFAULT_LOGO_URL: 'images/watermark.png',
DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Jitster', DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Jitster',
DEFAULT_WELCOME_PAGE_LOGO_URL: 'images/watermark.png',
DISABLE_DOMINANT_SPEAKER_INDICATOR: false, DISABLE_DOMINANT_SPEAKER_INDICATOR: false,
@ -101,6 +102,11 @@ var interfaceConfig = {
GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true, GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true,
/**
* Hide the logo on the deep linking pages.
*/
HIDE_DEEP_LINKING_LOGO: false,
/** /**
* Hide the invite prompt in the header when alone in the meeting. * Hide the invite prompt in the header when alone in the meeting.
*/ */
@ -114,7 +120,7 @@ var interfaceConfig = {
LOCAL_THUMBNAIL_RATIO: 16 / 9, // 16:9 LOCAL_THUMBNAIL_RATIO: 16 / 9, // 16:9
/** /**
* Maximum coeficient of the ratio of the large video to the visible area * Maximum coefficient of the ratio of the large video to the visible area
* after the large video is scaled to fit the window. * after the large video is scaled to fit the window.
* *
* @type {number} * @type {number}
@ -174,14 +180,18 @@ var interfaceConfig = {
TOOLBAR_ALWAYS_VISIBLE: false, TOOLBAR_ALWAYS_VISIBLE: false,
/** /**
* The name of the toolbar buttons to display in the toolbar. If present, * The name of the toolbar buttons to display in the toolbar, including the
* the button will display. Exceptions are "livestreaming" and "recording" * "More actions" menu. If present, the button will display. Exceptions are
* which also require being a moderator and some values in config.js to be * "livestreaming" and "recording" which also require being a moderator and
* enabled. Also, the "profile" button will not display for users with a * some values in config.js to be enabled. Also, the "profile" button will
* jwt. * not display for users with a JWT.
* Notes:
* - it's impossible to choose which buttons go in the "More actions" menu
* - it's impossible to control the placement of buttons
* - 'desktop' controls the "Share your screen" button
*/ */
TOOLBAR_BUTTONS: [ TOOLBAR_BUTTONS: [
'microphone', 'camera', 'closedcaptions', 'desktop', 'fullscreen', 'microphone', 'camera', 'closedcaptions', 'desktop', 'embedmeeting', 'fullscreen',
'fodeviceselection', 'hangup', 'profile', 'chat', 'recording', 'fodeviceselection', 'hangup', 'profile', 'chat', 'recording',
'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand', 'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand',
'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts', 'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts',

View File

@ -293,7 +293,7 @@ PODS:
- React - React
- react-native-netinfo (4.1.5): - react-native-netinfo (4.1.5):
- React - React
- react-native-webrtc (1.75.3): - react-native-webrtc (1.84.0):
- React - React
- react-native-webview (7.4.1): - react-native-webview (7.4.1):
- React - React
@ -569,7 +569,7 @@ SPEC CHECKSUMS:
react-native-calendar-events: 1442fad71a00388f933cfa25512588fec300fcf8 react-native-calendar-events: 1442fad71a00388f933cfa25512588fec300fcf8
react-native-keep-awake: eba3137546b10003361b37c761f6c429b59814ae react-native-keep-awake: eba3137546b10003361b37c761f6c429b59814ae
react-native-netinfo: 8d8db463bcc5db66a8ac5c48a7d86beb3b92f61a react-native-netinfo: 8d8db463bcc5db66a8ac5c48a7d86beb3b92f61a
react-native-webrtc: 86d841823e66d68cc1f86712db1c2956056bf0c2 react-native-webrtc: 9268ae9a2bc9730796b0968d012327e92c392adf
react-native-webview: 4dbc1d2a4a6b9c5e9e723c62651917aa2b5e579e react-native-webview: 4dbc1d2a4a6b9c5e9e723c62651917aa2b5e579e
React-RCTActionSheet: b72ddbfbe15b44ce691d128e4b582f4bb9abb540 React-RCTActionSheet: b72ddbfbe15b44ce691d128e4b582f4bb9abb540
React-RCTAnimation: cfaefba5024499d336b76ab850e6bd33b232b5e3 React-RCTAnimation: cfaefba5024499d336b76ab850e6bd33b232b5e3

View File

@ -291,9 +291,9 @@
13B07F8E1A680F5B00A75B9A /* Resources */, 13B07F8E1A680F5B00A75B9A /* Resources */,
0B26BE701EC5BC3C00EEFB41 /* Embed Frameworks */, 0B26BE701EC5BC3C00EEFB41 /* Embed Frameworks */,
B35383AD1DDA0083008F406A /* Adjust embedded framework architectures */, B35383AD1DDA0083008F406A /* Adjust embedded framework architectures */,
DE3A859324C701EA009B7D76 /* Copy WebRTC dSYM */,
0BB7DA181EC9E695007AAE98 /* Adjust ATS */, 0BB7DA181EC9E695007AAE98 /* Adjust ATS */,
DEF4813D224925A2002AD03A /* Copy Google Plist file */, DEF4813D224925A2002AD03A /* Copy Google Plist file */,
DEC2069321CBBD6900072F03 /* Setup Crashlytics */,
DE11877A21EE09640078D059 /* Setup Google reverse URL handler */, DE11877A21EE09640078D059 /* Setup Google reverse URL handler */,
DE4F6D6E22005C0400DE699E /* Setup Dropbox */, DE4F6D6E22005C0400DE699E /* Setup Dropbox */,
0BEA5C491F7B8F73000D0AB4 /* Embed Watch Content */, 0BEA5C491F7B8F73000D0AB4 /* Embed Watch Content */,
@ -474,6 +474,24 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "INFO_PLIST=\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"\nGOOGLE_PLIST=\"$PROJECT_DIR/GoogleService-Info.plist\"\n\nif [[ -f $GOOGLE_PLIST ]]; then\n REVERSED_CLIENT_ID=$(/usr/libexec/PlistBuddy -c \"Print :REVERSED_CLIENT_ID:\" $GOOGLE_PLIST)\n /usr/libexec/PlistBuddy -c \"Set :CFBundleURLTypes:1:CFBundleURLSchemes:0 $REVERSED_CLIENT_ID\" $INFO_PLIST\nfi\n"; shellScript = "INFO_PLIST=\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"\nGOOGLE_PLIST=\"$PROJECT_DIR/GoogleService-Info.plist\"\n\nif [[ -f $GOOGLE_PLIST ]]; then\n REVERSED_CLIENT_ID=$(/usr/libexec/PlistBuddy -c \"Print :REVERSED_CLIENT_ID:\" $GOOGLE_PLIST)\n /usr/libexec/PlistBuddy -c \"Set :CFBundleURLTypes:1:CFBundleURLSchemes:0 $REVERSED_CLIENT_ID\" $INFO_PLIST\nfi\n";
}; };
DE3A859324C701EA009B7D76 /* Copy WebRTC dSYM */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Copy WebRTC dSYM";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "set -x\n\nif [[ \"${CONFIGURATION}\" != \"Debug\" ]]; then\n cp -r ../../node_modules/react-native-webrtc/ios/WebRTC.dSYM ${DWARF_DSYM_FOLDER_PATH}/\nfi\n";
};
DE4F6D6E22005C0400DE699E /* Setup Dropbox */ = { DE4F6D6E22005C0400DE699E /* Setup Dropbox */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@ -492,24 +510,6 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "INFO_PLIST=\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"\nDROPBOX_KEY_FILE=\"$PROJECT_DIR/dropbox.key\"\n\nif [[ -f $DROPBOX_KEY_FILE ]]; then\n /usr/libexec/PlistBuddy -c \"Delete :LSApplicationQueriesSchemes\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes array\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes:0 string 'dbapi-2'\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes:1 string 'dbapi-8-emm'\" $INFO_PLIST\n\n DROPBOX_KEY=$(head -n 1 $DROPBOX_KEY_FILE)\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLName string dropbox\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLSchemes array\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLSchemes:0 string $DROPBOX_KEY\" $INFO_PLIST\nfi\n"; shellScript = "INFO_PLIST=\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"\nDROPBOX_KEY_FILE=\"$PROJECT_DIR/dropbox.key\"\n\nif [[ -f $DROPBOX_KEY_FILE ]]; then\n /usr/libexec/PlistBuddy -c \"Delete :LSApplicationQueriesSchemes\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes array\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes:0 string 'dbapi-2'\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes:1 string 'dbapi-8-emm'\" $INFO_PLIST\n\n DROPBOX_KEY=$(head -n 1 $DROPBOX_KEY_FILE)\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLName string dropbox\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLSchemes array\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLSchemes:0 string $DROPBOX_KEY\" $INFO_PLIST\nfi\n";
}; };
DEC2069321CBBD6900072F03 /* Setup Crashlytics */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Setup Crashlytics";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "GOOGLE_PLIST=\"$PROJECT_DIR/GoogleService-Info.plist\"\n\nif [[ -f $GOOGLE_PLIST ]]; then\n if [ \"${CONFIGURATION}\" != \"Debug\" ]; then\n find \"${DWARF_DSYM_FOLDER_PATH}\" -name \"*.dSYM\" | xargs -I \\{\\} ${PODS_ROOT}/Fabric/upload-symbols -gsp $GOOGLE_PLIST -p ios \\{\\}\n fi\nfi\n";
};
DEF4813D224925A2002AD03A /* Copy Google Plist file */ = { DEF4813D224925A2002AD03A /* Copy Google Plist file */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;

View File

@ -36,6 +36,7 @@
jitsiMeet.universalLinkDomains = @[@"meet.jit.si", @"alpha.jitsi.net", @"beta.meet.jit.si"]; jitsiMeet.universalLinkDomains = @[@"meet.jit.si", @"alpha.jitsi.net", @"beta.meet.jit.si"];
jitsiMeet.defaultConferenceOptions = [JitsiMeetConferenceOptions fromBuilder:^(JitsiMeetConferenceOptionsBuilder *builder) { jitsiMeet.defaultConferenceOptions = [JitsiMeetConferenceOptions fromBuilder:^(JitsiMeetConferenceOptionsBuilder *builder) {
[builder setFeatureFlag:@"resolution" withValue:@(360)];
builder.serverURL = [NSURL URLWithString:@"https://meet.jit.si"]; builder.serverURL = [NSURL URLWithString:@"https://meet.jit.si"];
builder.welcomePageEnabled = YES; builder.welcomePageEnabled = YES;

View File

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

View File

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

View File

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

View File

@ -80,6 +80,10 @@ platform :ios do
uses_non_exempt_encryption: false uses_non_exempt_encryption: false
) )
# Upload dSYMs to Crashlytics
download_dsyms
upload_symbols_to_crashlytics
# Cleanup # Cleanup
clean_build_artifacts clean_build_artifacts
reset_git_repo(skip_clean: true) reset_git_repo(skip_clean: true)

View File

@ -0,0 +1,5 @@
#!/bin/bash
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
exec ${THIS_DIR}/../../node_modules/react-native/scripts/launchPackager.command --reset-cache

View File

@ -3,6 +3,8 @@
# This script is executed from Xcode to start the React packager for Debug # This script is executed from Xcode to start the React packager for Debug
# targets. # targets.
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
export RCT_METRO_PORT="${RCT_METRO_PORT:=8081}" export RCT_METRO_PORT="${RCT_METRO_PORT:=8081}"
echo "export RCT_METRO_PORT=${RCT_METRO_PORT}" > "${SRCROOT}/../../node_modules/react-native/scripts/.packager.env" echo "export RCT_METRO_PORT=${RCT_METRO_PORT}" > "${SRCROOT}/../../node_modules/react-native/scripts/.packager.env"
@ -13,7 +15,6 @@ if [[ "$CONFIGURATION" = "Debug" ]]; then
exit 2 exit 2
fi fi
else else
open -g "$SRCROOT/../../node_modules/react-native/scripts/launchPackager.command" || echo "Can't start packager automatically" open -g "$THIS_DIR/run-packager-helper.command" || echo "Can't start packager automatically"
fi fi
fi fi

View File

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

9
jest.config.js Normal file
View File

@ -0,0 +1,9 @@
module.exports = {
moduleFileExtensions: [
'js'
],
testMatch: [
'<rootDir>/react/**/?(*.)+(test)?(.web).js?(x)'
],
verbose: true
};

View File

@ -38,5 +38,11 @@
"lt": "Lituanian", "lt": "Lituanian",
"id": "Indonesian", "id": "Indonesian",
"he": "Ebrèu", "he": "Ebrèu",
"eu": "Basc" "eu": "Basc",
"mr": "Marathi",
"sl": "Eslovèn",
"ro": "Romanian",
"ar": "Arabi"
} }

View File

@ -25,6 +25,7 @@
"id": "Indonesian", "id": "Indonesian",
"it": "Italian", "it": "Italian",
"ja": "Japanese", "ja": "Japanese",
"kab": "Kabyle",
"ko": "Korean", "ko": "Korean",
"lt": "Lithuanian", "lt": "Lithuanian",
"nl": "Dutch", "nl": "Dutch",

View File

@ -534,7 +534,7 @@
"selectCamera": "Kamera", "selectCamera": "Kamera",
"selectMic": "Mikrofon", "selectMic": "Mikrofon",
"startAudioMuted": "Při připojení všem zlumit zvuk", "startAudioMuted": "Při připojení všem zlumit zvuk",
"startVideoMuted": "Všechny připojovat jako skrýté", "startVideoMuted": "Všechny připojovat jako skryté",
"title": "Nastavení", "title": "Nastavení",
"speakers": "Reproduktory", "speakers": "Reproduktory",
"microphones": "Mikrofony" "microphones": "Mikrofony"
@ -567,7 +567,7 @@
"name": "Řečník", "name": "Řečník",
"seconds": "", "seconds": "",
"speakerStats": "Statistika řečníků", "speakerStats": "Statistika řečníků",
"speakerTime": "Mluvil již" "speakerTime": "Mluvil(a) již"
}, },
"startupoverlay": { "startupoverlay": {
"policyText": " ", "policyText": " ",
@ -638,7 +638,7 @@
"openChat": "", "openChat": "",
"pip": "", "pip": "",
"profile": "Upravit váš profil", "profile": "Upravit váš profil",
"raiseHand": "Příhlásit / Odhlásit se o slovo", "raiseHand": "Přihlásit / Odhlásit se o slovo",
"raiseYourHand": "", "raiseYourHand": "",
"Settings": "Nastavení", "Settings": "Nastavení",
"sharedvideo": "Sdílet obraz YouTube videa", "sharedvideo": "Sdílet obraz YouTube videa",

View File

@ -3,14 +3,15 @@
"add": "Einladen", "add": "Einladen",
"addContacts": "Laden Sie Ihre Kontakte ein", "addContacts": "Laden Sie Ihre Kontakte ein",
"copyInvite": "Sitzungseinladung kopieren", "copyInvite": "Sitzungseinladung kopieren",
"copyLink": "Meeting-Link kopieren", "copyLink": "Konferenzlink kopieren",
"copyStream": "Live-Streaming-Link kopieren", "copyStream": "Livestreaminglink kopieren",
"countryNotSupported": "Wir unterstützen dieses Land noch nicht.", "countryNotSupported": "Wir unterstützen dieses Land noch nicht.",
"countryReminder": "Telefonnummer nicht in den USA? Bitte sicherstellen, dass die Telefonnummer mit dem Ländercode beginnt.", "countryReminder": "Telefonnummer nicht in den USA? Bitte sicherstellen, dass die Telefonnummer mit dem Ländercode beginnt.",
"defaultEmail": "Ihre Standard-E-Mail", "defaultEmail": "Ihre Standard-E-Mail",
"disabled": "Sie können keine Teilnehmer einladen.", "disabled": "Sie können keine Teilnehmer einladen.",
"failedToAdd": "Fehler beim Hinzufügen von Teilnehmern", "failedToAdd": "Fehler beim Hinzufügen von Teilnehmern",
"footerText": "Abgehender Ruf ist deaktiviert.", "footerText": "Abgehender Ruf ist deaktiviert.",
"googleEmail": "Google-E-Mail",
"inviteMoreHeader": "Sie sind alleine in der Sitzung", "inviteMoreHeader": "Sie sind alleine in der Sitzung",
"inviteMoreMailSubject": "An {{appName}} Meeting teilnehmen", "inviteMoreMailSubject": "An {{appName}} Meeting teilnehmen",
"inviteMorePrompt": "Mehr Leute einladen", "inviteMorePrompt": "Mehr Leute einladen",
@ -20,14 +21,16 @@
"loadingPeople": "Suche nach einzuladenden Teilnehmern", "loadingPeople": "Suche nach einzuladenden Teilnehmern",
"noResults": "Keine passenden Ergebnisse", "noResults": "Keine passenden Ergebnisse",
"noValidNumbers": "Telefonnummer eingeben", "noValidNumbers": "Telefonnummer eingeben",
"outlookEmail": "Outlook-E-Mail",
"searchNumbers": "Telefonnummern hinzufügen", "searchNumbers": "Telefonnummern hinzufügen",
"searchPeople": "Nach Teilnehmern suchen", "searchPeople": "Nach Teilnehmern suchen",
"searchPeopleAndNumbers": "Nach Teilnehmen suchen oder deren Telefonnummern hinzufügen", "searchPeopleAndNumbers": "Nach Teilnehmen suchen oder deren Telefonnummern hinzufügen",
"shareInvite": "Einladung zur Versammlung teilen", "shareInvite": "Einladung zur Versammlung teilen",
"shareLink": "Teilen Sie den Meeting-Link, um andere einzuladen", "shareLink": "Teilen Sie den Konferenzlink, um andere einzuladen",
"shareStream": "Den Live-Streaming-Link freigeben", "shareStream": "Den Livestreaminglink freigeben",
"telephone": "Telefon: {{number}}", "telephone": "Telefon: {{number}}",
"title": "Teilnehmer zu dieser Konferenz einladen" "title": "Teilnehmer zu dieser Konferenz einladen",
"yahooEmail": "Yahoo-E-Mail"
}, },
"audioDevices": { "audioDevices": {
"bluetooth": "Bluetooth", "bluetooth": "Bluetooth",
@ -40,7 +43,7 @@
"audioOnly": "Geringe Bandbreite" "audioOnly": "Geringe Bandbreite"
}, },
"calendarSync": { "calendarSync": {
"addMeetingURL": "Meeting-Link hinzufügen", "addMeetingURL": "Konferenzlink hinzufügen",
"confirmAddLink": "Möchten Sie einen Jitsi-Link zu diesem Termin hinzufügen?", "confirmAddLink": "Möchten Sie einen Jitsi-Link zu diesem Termin hinzufügen?",
"error": { "error": {
"appConfiguration": "Kalenderintegration ist nicht richtig konfiguriert.", "appConfiguration": "Kalenderintegration ist nicht richtig konfiguriert.",
@ -89,9 +92,9 @@
"DISCONNECTED": "Getrennt", "DISCONNECTED": "Getrennt",
"DISCONNECTING": "Verbindung wird getrennt", "DISCONNECTING": "Verbindung wird getrennt",
"ERROR": "Fehler", "ERROR": "Fehler",
"FETCH_SESSION_ID": "Sitzungs-ID erhalten...", "FETCH_SESSION_ID": "Sitzungs-ID abrufen ",
"GET_SESSION_ID_ERROR": "Sitzungs-ID-Fehler erhalten: {{code}}", "GET_SESSION_ID_ERROR": "Sitzungs-ID-Fehler erhalten: {{code}}",
"GOT_SESSION_ID": "Sitzungs-ID erhalten... Beendet", "GOT_SESSION_ID": "Sitzungs-ID abrufen … beendet",
"LOW_BANDWIDTH": "Video für {{displayName}} wurde ausgeschaltet, um Bandbreite einzusparen" "LOW_BANDWIDTH": "Video für {{displayName}} wurde ausgeschaltet, um Bandbreite einzusparen"
}, },
"connectionindicator": { "connectionindicator": {
@ -107,6 +110,7 @@
"localaddress_plural": "Lokale Adressen:", "localaddress_plural": "Lokale Adressen:",
"localport": "Lokaler Port:", "localport": "Lokaler Port:",
"localport_plural": "Lokale Ports:", "localport_plural": "Lokale Ports:",
"maxEnabledResolution": "max. senden",
"more": "Mehr anzeigen", "more": "Mehr anzeigen",
"packetloss": "Paketverlust:", "packetloss": "Paketverlust:",
"quality": { "quality": {
@ -139,7 +143,7 @@
"ifHaveApp": "Wenn Sie die App bereits haben:", "ifHaveApp": "Wenn Sie die App bereits haben:",
"joinInApp": "An dem Meeting teilnehmen mit der App", "joinInApp": "An dem Meeting teilnehmen mit der App",
"launchWebButton": "Im Web öffnen", "launchWebButton": "Im Web öffnen",
"title": "Die Konferenz wird in {{app}} geöffnet...", "title": "Die Konferenz wird in {{app}} geöffnet …",
"tryAgainButton": "Erneut mit der nativen Applikation versuchen" "tryAgainButton": "Erneut mit der nativen Applikation versuchen"
}, },
"defaultLink": "Bsp.: {{url}}", "defaultLink": "Bsp.: {{url}}",
@ -160,6 +164,7 @@
"accessibilityLabel": { "accessibilityLabel": {
"liveStreaming": "Livestream" "liveStreaming": "Livestream"
}, },
"add": "Hinzufügen",
"allow": "Erlauben", "allow": "Erlauben",
"alreadySharedVideoMsg": "Ein anderer Teilnehmer gibt bereits ein Video weiter. Bei dieser Konferenz ist jeweils nur ein geteiltes Video möglich.", "alreadySharedVideoMsg": "Ein anderer Teilnehmer gibt bereits ein Video weiter. Bei dieser Konferenz ist jeweils nur ein geteiltes Video möglich.",
"alreadySharedVideoTitle": "Nur ein geteiltes Video gleichzeitig", "alreadySharedVideoTitle": "Nur ein geteiltes Video gleichzeitig",
@ -174,9 +179,9 @@
"cameraUnsupportedResolutionError": "Die Kamera unterstützt die erforderliche Auflösung nicht.", "cameraUnsupportedResolutionError": "Die Kamera unterstützt die erforderliche Auflösung nicht.",
"Cancel": "Abbrechen", "Cancel": "Abbrechen",
"close": "Schließen", "close": "Schließen",
"conferenceDisconnectMsg": "Prüfen Sie allenfalls Ihre Netzwerkverbindung. Verbinde in {{seconds}} Sekunden...", "conferenceDisconnectMsg": "Prüfen Sie allenfalls Ihre Netzwerkverbindung. Verbinde in {{seconds}} Sekunden …",
"conferenceDisconnectTitle": "Ihre Verbindung ist getrennt worden.", "conferenceDisconnectTitle": "Ihre Verbindung ist getrennt worden.",
"conferenceReloadMsg": "Wir versuchen das zu beheben. Verbinde in {{seconds}} Sekunden...", "conferenceReloadMsg": "Wir versuchen das zu beheben. Verbinde in {{seconds}} Sekunden …",
"conferenceReloadTitle": "Leider ist etwas schiefgegangen.", "conferenceReloadTitle": "Leider ist etwas schiefgegangen.",
"confirm": "Bestätigen", "confirm": "Bestätigen",
"confirmNo": "Nein", "confirmNo": "Nein",
@ -185,21 +190,25 @@
"connectErrorWithMsg": "Oh! Es hat etwas nicht geklappt und der Konferenz konnte nicht beigetreten werden: {{msg}}", "connectErrorWithMsg": "Oh! Es hat etwas nicht geklappt und der Konferenz konnte nicht beigetreten werden: {{msg}}",
"connecting": "Verbindung wird hergestellt", "connecting": "Verbindung wird hergestellt",
"contactSupport": "Support kontaktieren", "contactSupport": "Support kontaktieren",
"copied": "Kopiert",
"copy": "Kopieren", "copy": "Kopieren",
"dismiss": "OK", "dismiss": "OK",
"displayNameRequired": "Hallo! Wie ist Ihr Name?", "displayNameRequired": "Hallo! Wie ist Ihr Name?",
"done": "Fertig", "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": "E2EE-Schlüssel",
"e2eeNoKey": "Keiner",
"e2eeToggleSet": "Schlüssel festlegen",
"e2eeSet": "Setzen",
"e2eeWarning": "WARNUNG: Nicht alle Teilnehmer dieser Konferenz scheinen Ende-zu-Ende-Verschlüsselung zu unterstützen. Wenn Sie diese aktivieren, können die entsprechenden Teilnehmer nichts mehr sehen oder hören.",
"enterDisplayName": "Bitte geben Sie hier Ihren Namen ein", "enterDisplayName": "Bitte geben Sie hier Ihren Namen ein",
"error": "Fehler", "error": "Fehler",
"externalInstallationMsg": "Die Bildschirmfreigabe-Erweiterung muss installiert werden.",
"externalInstallationTitle": "Erweiterung erforderlich",
"goToStore": "Zum Store",
"gracefulShutdown": "Der Dienst steht momentan wegen Wartungsarbeiten nicht zur Verfügung. Bitte versuchen Sie es später noch einmal.", "gracefulShutdown": "Der Dienst steht momentan wegen Wartungsarbeiten nicht zur Verfügung. Bitte versuchen Sie es später noch einmal.",
"grantModeratorDialog": "Möchten Sie diesen Teilnehmer wirklich zum Moderator machen?",
"grantModeratorTitle": "Zum Moderator machen",
"IamHost": "Ich bin der Organisator", "IamHost": "Ich bin der Organisator",
"incorrectRoomLockPassword": "Falsches Passwort", "incorrectRoomLockPassword": "Falsches Passwort",
"incorrectPassword": "Benutzername oder Passwort ungültig", "incorrectPassword": "Benutzername oder Passwort ungültig",
"inlineInstallationMsg": "Die Bildschirmfreigabe-Erweiterung muss installiert werden.",
"inlineInstallExtension": "Jetzt installieren",
"internalError": "Oh! Es hat etwas nicht funktioniert. Der folgende Fehler ist aufgetreten: {{error}}", "internalError": "Oh! Es hat etwas nicht funktioniert. Der folgende Fehler ist aufgetreten: {{error}}",
"internalErrorTitle": "Interner Fehler", "internalErrorTitle": "Interner Fehler",
"kickMessage": "Sie können sich für mehr Details an {{participantDisplayName}} wenden.", "kickMessage": "Sie können sich für mehr Details an {{participantDisplayName}} wenden.",
@ -208,10 +217,11 @@
"kickParticipantTitle": "Teilnehmer entfernen?", "kickParticipantTitle": "Teilnehmer entfernen?",
"kickTitle": "Autsch! {{participantDisplayName}} hat Sie aus dem Meeting geworfen", "kickTitle": "Autsch! {{participantDisplayName}} hat Sie aus dem Meeting geworfen",
"liveStreaming": "Livestreaming", "liveStreaming": "Livestreaming",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Während einer Aufnahme nicht möglich",
"liveStreamingDisabledForGuestTooltip": "Gäste können kein Livestreaming starten.", "liveStreamingDisabledForGuestTooltip": "Gäste können kein Livestreaming starten.",
"liveStreamingDisabledTooltip": "Starten des Livestreams deaktiviert.", "liveStreamingDisabledTooltip": "Starten des Livestreams deaktiviert.",
"lockMessage": "Die Konferenz konnte nicht gesperrt werden.", "lockMessage": "Die Konferenz konnte nicht gesperrt werden.",
"lockRoom": "Meeting-$t(lockRoomPasswordUppercase) hinzufügen", "lockRoom": "Konferenz$t(lockRoomPassword) hinzufügen",
"lockTitle": "Sperren fehlgeschlagen", "lockTitle": "Sperren fehlgeschlagen",
"logoutQuestion": "Sind Sie sicher, dass Sie sich abmelden und die Konferenz verlassen möchten?", "logoutQuestion": "Sind Sie sicher, dass Sie sich abmelden und die Konferenz verlassen möchten?",
"logoutTitle": "Abmelden", "logoutTitle": "Abmelden",
@ -234,13 +244,15 @@
"muteParticipantDialog": "Wollen Sie diesen Teilnehmer wirklich stummschalten? Sie können die Stummschaltung nicht wieder aufheben, der Teilnehmer kann dies aber jederzeit selbst tun.", "muteParticipantDialog": "Wollen Sie diesen Teilnehmer wirklich stummschalten? Sie können die Stummschaltung nicht wieder aufheben, der Teilnehmer kann dies aber jederzeit selbst tun.",
"muteParticipantTitle": "Teilnehmer stummschalten?", "muteParticipantTitle": "Teilnehmer stummschalten?",
"Ok": "OK", "Ok": "OK",
"passwordLabel": "Dieses Meeting wurde von einem Teilnehmer gesichert. Bitte geben Sie das $t(lockRoomPassword) ein, um dem Meeting beizutreten.", "passwordLabel": "Dieses Meeting wurde von einem Teilnehmer gesichert. Bitte geben Sie das $t(lockRoomPasswordUppercase) ein, um dem Meeting beizutreten.",
"passwordNotSupported": "Das Festlegen von einem $t(lockRoomPassword) für das Meeting wird nicht unterstützt.", "passwordNotSupported": "Das Festlegen eines Konferenzpassworts wird nicht unterstützt.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) nicht unterstützt", "passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) nicht unterstützt",
"passwordRequired": "$t(lockRoomPasswordUppercase) erforderlich", "passwordRequired": "$t(lockRoomPasswordUppercase) erforderlich",
"popupError": "Ihr Browser blockiert Pop-ups von dieser Website. Bitte aktivieren Sie Pop-ups in den Sicherheitseinstellungen des Browsers und versuchen Sie es erneut.", "popupError": "Ihr Browser blockiert Pop-ups von dieser Website. Bitte aktivieren Sie Pop-ups in den Sicherheitseinstellungen des Browsers und versuchen Sie es erneut.",
"popupErrorTitle": "Pop-up blockiert", "popupErrorTitle": "Pop-up blockiert",
"readMore": "mehr",
"recording": "Aufnahme", "recording": "Aufnahme",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Während eines Livestreams nicht möglich",
"recordingDisabledForGuestTooltip": "Gäste können keine Aufzeichnungen starten.", "recordingDisabledForGuestTooltip": "Gäste können keine Aufzeichnungen starten.",
"recordingDisabledTooltip": "Start der Aufzeichnung deaktiviert.", "recordingDisabledTooltip": "Start der Aufzeichnung deaktiviert.",
"rejoinNow": "Jetzt erneut beitreten", "rejoinNow": "Jetzt erneut beitreten",
@ -252,17 +264,16 @@
"remoteControlStopMessage": "Die Fernsteuerung wurde beendet!", "remoteControlStopMessage": "Die Fernsteuerung wurde beendet!",
"remoteControlTitle": "Fernsteuerung", "remoteControlTitle": "Fernsteuerung",
"Remove": "Entfernen", "Remove": "Entfernen",
"removePassword": "$t(lockRoomPassword) entfernen", "removePassword": "$t(lockRoomPasswordUppercase) entfernen",
"removeSharedVideoMsg": "Sind Sie sicher, dass Sie das geteilte Video entfernen möchten?", "removeSharedVideoMsg": "Sind Sie sicher, dass Sie das geteilte Video entfernen möchten?",
"removeSharedVideoTitle": "Freigegebenes Video entfernen", "removeSharedVideoTitle": "Freigegebenes Video entfernen",
"reservationError": "Fehler im Reservierungssystem", "reservationError": "Fehler im Reservierungssystem",
"reservationErrorMsg": "Fehler, Nummer: {{code}}, Nachricht: {{msg}}", "reservationErrorMsg": "Fehler, Nummer: {{code}}, Nachricht: {{msg}}",
"retry": "Wiederholen", "retry": "Wiederholen",
"screenSharingFailedToInstall": "Oh! Die Erweiterung für die Bildschirmfreigabe konnte nicht installiert werden.", "screenSharingAudio": "Audio teilen",
"screenSharingFailedToInstallTitle": "Bildschirmfreigabe-Erweiterung konnte nicht installiert werden", "screenSharingFailed": "Ups! Beim Teilen des Bildschirms ist etwas schiefgegangen!",
"screenSharingFirefoxPermissionDeniedError": "Die Bildschirmfreigabe ist leider fehlgeschlagen. Bitte stellen Sie sicher, dass die Berechtigung für die Bildschirmfreigabe im Browser erteilt wurde. ", "screenSharingFailedTitle": "Bildschirmfreigabe fehlgeschlagen!",
"screenSharingFirefoxPermissionDeniedTitle": "Die Bildschirmfreigabe konnte nicht gestartet werden!", "screenSharingPermissionDeniedError": "Ups! Etwas stimmt nicht mit Ihren Berechtigungen zur Bildschirmfreigabe. Bitte neu laden und erneut versuchen.",
"screenSharingPermissionDeniedError": "Oh! Beim Anfordern der Bildschirmfreigabe-Berechtigungen hat etwas nicht funktioniert. Bitte aktualisieren und erneut versuchen.",
"sendPrivateMessage": "Sie haben kürzlich eine private Nachricht erhalten. Hatten Sie die Absicht, darauf privat zu antworten, oder wollen Sie Ihre Nachricht an die Gruppe senden?", "sendPrivateMessage": "Sie haben kürzlich eine private Nachricht erhalten. Hatten Sie die Absicht, darauf privat zu antworten, oder wollen Sie Ihre Nachricht an die Gruppe senden?",
"sendPrivateMessageCancel": "An die Gruppe senden", "sendPrivateMessageCancel": "An die Gruppe senden",
"sendPrivateMessageOk": "Privat antworten", "sendPrivateMessageOk": "Privat antworten",
@ -275,13 +286,13 @@
"shareYourScreen": "Bildschirm freigeben", "shareYourScreen": "Bildschirm freigeben",
"shareYourScreenDisabled": "Bildschirmfreigabe deaktiviert.", "shareYourScreenDisabled": "Bildschirmfreigabe deaktiviert.",
"shareYourScreenDisabledForGuest": "Gäste können den Bildschirm nicht freigeben.", "shareYourScreenDisabledForGuest": "Gäste können den Bildschirm nicht freigeben.",
"startLiveStreaming": "Einen Livestream starten", "startLiveStreaming": "Livestream starten",
"startRecording": "Aufnahme starten", "startRecording": "Aufnahme starten",
"startRemoteControlErrorMessage": "Beim Versuch, die Fernsteuerung zu starten, ist ein Fehler aufgetreten!", "startRemoteControlErrorMessage": "Beim Versuch, die Fernsteuerung zu starten, ist ein Fehler aufgetreten!",
"stopLiveStreaming": "Livestreaming stoppen", "stopLiveStreaming": "Livestream stoppen",
"stopRecording": "Aufnahme stoppen", "stopRecording": "Aufnahme stoppen",
"stopRecordingWarning": "Sind Sie sicher, dass Sie die Aufnahme stoppen möchten?", "stopRecordingWarning": "Sind Sie sicher, dass Sie die Aufnahme stoppen möchten?",
"stopStreamingWarning": "Sind Sie sicher, dass Sie das Livestreaming stoppen möchten?", "stopStreamingWarning": "Sind Sie sicher, dass Sie den Livestream stoppen möchten?",
"streamKey": "Streamschlüssel", "streamKey": "Streamschlüssel",
"Submit": "OK", "Submit": "OK",
"thankYou": "Danke für die Verwendung von {{appName}}!", "thankYou": "Danke für die Verwendung von {{appName}}!",
@ -289,14 +300,13 @@
"tokenAuthFailed": "Sie sind nicht berechtigt, dieser Konferenz beizutreten.", "tokenAuthFailed": "Sie sind nicht berechtigt, dieser Konferenz beizutreten.",
"tokenAuthFailedTitle": "Authentifizierung fehlgeschlagen", "tokenAuthFailedTitle": "Authentifizierung fehlgeschlagen",
"transcribing": "Wird transkribiert", "transcribing": "Wird transkribiert",
"unlockRoom": "Meeting-$t(lockRoomPassword) entfernen", "unlockRoom": "Konferenz$t(lockRoomPassword) entfernen",
"userPassword": "Benutzerpasswort", "userPassword": "Benutzerpasswort",
"WaitForHostMsg": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Wenn Sie der Organisator sind, authentifizieren Sie sich. Warten Sie andernfalls, bis der Organisator erscheint.", "WaitForHostMsg": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Wenn Sie der Organisator sind, authentifizieren Sie sich. Warten Sie andernfalls, bis der Organisator erscheint.",
"WaitForHostMsgWOk": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Wenn Sie der Organisator sind, drücken Sie zum Authentifizieren auf OK. Warten Sie andernfalls, bis der Organisator erscheint.", "WaitForHostMsgWOk": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Wenn Sie der Organisator sind, drücken Sie zum Authentifizieren auf OK. Warten Sie andernfalls, bis der Organisator erscheint.",
"WaitingForHost": "Warten auf den Organisator...", "WaitingForHost": "Warten auf den Organisator …",
"Yes": "Ja", "Yes": "Ja",
"yourEntireScreen": "Ganzer Bildschirm", "yourEntireScreen": "Ganzer Bildschirm"
"screenSharingAudio": "Audio austauschen"
}, },
"dialOut": { "dialOut": {
"statusMessage": "ist jetzt {{status}}" "statusMessage": "ist jetzt {{status}}"
@ -304,6 +314,12 @@
"documentSharing": { "documentSharing": {
"title": "Freigegebenes Dokument" "title": "Freigegebenes Dokument"
}, },
"e2ee": {
"labelToolTip": "Audio- und Videodaten dieser Unterhaltung sind jetzt zwischen den Teilnehmern verschlüsselt"
},
"embedMeeting": {
"title": "Diese Konferenz einbetten"
},
"feedback": { "feedback": {
"average": "Durchschnittlich", "average": "Durchschnittlich",
"bad": "Schlecht", "bad": "Schlecht",
@ -322,8 +338,8 @@
}, },
"info": { "info": {
"accessibilityLabel": "Informationen anzeigen", "accessibilityLabel": "Informationen anzeigen",
"addPassword": "$t(lockRoomPassword) hinzufügen", "addPassword": "$t(lockRoomPasswordUppercase) hinzufügen",
"cancelPassword": "$t(lockRoomPassword) löschen", "cancelPassword": "$t(lockRoomPasswordUppercase) löschen",
"conferenceURL": "Link:", "conferenceURL": "Link:",
"country": "Land", "country": "Land",
"dialANumber": "Um am Meeting teilzunehmen, müssen Sie eine dieser Nummern wählen und dann die PIN eingeben.", "dialANumber": "Um am Meeting teilzunehmen, müssen Sie eine dieser Nummern wählen und dann die PIN eingeben.",
@ -335,7 +351,7 @@
"genericError": "Es ist leider etwas schiefgegangen.", "genericError": "Es ist leider etwas schiefgegangen.",
"inviteLiveStream": "Klicken Sie auf {{url}}, um den Livestream dieser Konferenz zu öffnen", "inviteLiveStream": "Klicken Sie auf {{url}}, um den Livestream dieser Konferenz zu öffnen",
"invitePhone": "Wenn Sie stattdessen per Telefon beitreten möchten, wählen sie: {{number}},,{{conferenceID}}#\n", "invitePhone": "Wenn Sie stattdessen per Telefon beitreten möchten, wählen sie: {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "Suchen Sie nach einer anderen Einwahlnummer ?\nMeeting-Einwahlnummern anzeigen: {{url}}\n\n\nWenn Sie sich auch über ein Raumtelefon einwählen, nehmen Sie teil, ohne sich mit dem Ton zu verbinden: {{silentUrl}}", "invitePhoneAlternatives": "Suchen Sie nach einer anderen Einwahlnummer ?\nEinwahlnummern der Konferenz anzeigen: {{url}}\n\n\nWenn Sie sich auch über ein Raumtelefon einwählen, nehmen Sie teil, ohne sich mit dem Ton zu verbinden: {{silentUrl}}",
"inviteURLFirstPartGeneral": "Sie wurden zur Teilnahme an einem Meeting eingeladen.", "inviteURLFirstPartGeneral": "Sie wurden zur Teilnahme an einem Meeting eingeladen.",
"inviteURLFirstPartPersonal": "{{name}} lädt Sie zu einem Meeting ein.\n", "inviteURLFirstPartPersonal": "{{name}} lädt Sie zu einem Meeting ein.\n",
"inviteURLSecondPart": "\nAm Meeting teilnehmen:\n{{url}}\n", "inviteURLSecondPart": "\nAm Meeting teilnehmen:\n{{url}}\n",
@ -348,7 +364,7 @@
"password": "$t(lockRoomPasswordUppercase):", "password": "$t(lockRoomPasswordUppercase):",
"title": "Teilen", "title": "Teilen",
"tooltip": "Freigabe-Link und Einwahlinformationen für dieses Meeting", "tooltip": "Freigabe-Link und Einwahlinformationen für dieses Meeting",
"label": "Meeting-Informationen" "label": "Konferenzinformationen"
}, },
"inviteDialog": { "inviteDialog": {
"alertText": "Die Einladung einiger Teilnehmer ist fehlgeschlagen.", "alertText": "Die Einladung einiger Teilnehmer ist fehlgeschlagen.",
@ -382,6 +398,8 @@
"videoQuality": "Anrufqualität verwalten" "videoQuality": "Anrufqualität verwalten"
}, },
"liveStreaming": { "liveStreaming": {
"limitNotificationDescriptionWeb": "Wegen hoher Nachfrage ist Ihr Stream auf {{limit}} min. begrenzt. Für unlimitiertes Streaming nutzen Sie bitte <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Ihr Stream ist begrenzt auf {{limit}} min. Für unlimitiertes Streaming, nutzen Sie bitte {{app}}.",
"busy": "Es werden Ressourcen zum Streamen bereitgestellt. Bitte in ein paar Minuten erneut versuchen.", "busy": "Es werden Ressourcen zum Streamen bereitgestellt. Bitte in ein paar Minuten erneut versuchen.",
"busyTitle": "Alle Streaming-Instanzen sind in Gebrauch", "busyTitle": "Alle Streaming-Instanzen sind in Gebrauch",
"changeSignIn": "Konten wechseln.", "changeSignIn": "Konten wechseln.",
@ -391,17 +409,17 @@
"error": "Das Livestreaming ist fehlgeschlagen. Bitte versuchen Sie es erneut.", "error": "Das Livestreaming ist fehlgeschlagen. Bitte versuchen Sie es erneut.",
"errorAPI": "Beim Abrufen der YouTube-Livestreams ist ein Fehler aufgetreten. Bitte versuchen Sie, sich erneut anzumelden.", "errorAPI": "Beim Abrufen der YouTube-Livestreams ist ein Fehler aufgetreten. Bitte versuchen Sie, sich erneut anzumelden.",
"errorLiveStreamNotEnabled": "Livestreaming ist für {{email}} nicht aktiviert. Aktivieren Sie das Livestreaming oder melden Sie sich bei einem Konto mit aktiviertem Livestreaming an.", "errorLiveStreamNotEnabled": "Livestreaming ist für {{email}} nicht aktiviert. Aktivieren Sie das Livestreaming oder melden Sie sich bei einem Konto mit aktiviertem Livestreaming an.",
"expandedOff": "Livestreaming wurde angehalten", "expandedOff": "Livestream wurde angehalten",
"expandedOn": "Das Meeting wird momentan an YouTube gestreamt.", "expandedOn": "Das Meeting wird momentan an YouTube gestreamt.",
"expandedPending": "Livestreaming wird gestartet...", "expandedPending": "Livestream wird gestartet ",
"failedToStart": "Livestreaming konnte nicht gestartet werden", "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.", "getStreamKeyManually": "Wir waren nicht in der Lage, Livestreams abzurufen. Versuchen Sie, Ihren Livestream-Schlüssel von YouTube zu erhalten.",
"invalidStreamKey": "Der Livestream-Schlüssel ist u. U. falsch.", "invalidStreamKey": "Der Livestream-Schlüssel ist u. U. falsch.",
"off": "Livestreaming gestoppt", "off": "Livestream gestoppt",
"offBy": "{{name}} stoppte das Livestreaming", "offBy": "{{name}} stoppte den Livestream",
"on": "Livestreaming", "on": "Livestream",
"onBy": "{{name}} startete das Livestreaming", "onBy": "{{name}} startete den Livestream",
"pending": "Livestream wird gestartet...", "pending": "Livestream wird gestartet …",
"serviceName": "Livestreaming-Dienst", "serviceName": "Livestreaming-Dienst",
"signedInAs": "Sie sind derzeit angemeldet als:", "signedInAs": "Sie sind derzeit angemeldet als:",
"signIn": "Mit Google anmelden", "signIn": "Mit Google anmelden",
@ -442,7 +460,7 @@
"stop": "Aufnahme stoppen", "stop": "Aufnahme stoppen",
"yes": "Ja" "yes": "Ja"
}, },
"lockRoomPassword": "Passwort", "lockRoomPassword": "passwort",
"lockRoomPasswordUppercase": "Passwort", "lockRoomPasswordUppercase": "Passwort",
"me": "ich", "me": "ich",
"notify": { "notify": {
@ -474,11 +492,51 @@
"unmute": "Stummschaltung aufheben", "unmute": "Stummschaltung aufheben",
"newDeviceCameraTitle": "Neue Kamera erkannt", "newDeviceCameraTitle": "Neue Kamera erkannt",
"newDeviceAudioTitle": "Neues Audiogerät erkannt", "newDeviceAudioTitle": "Neues Audiogerät erkannt",
"newDeviceAction": "Verwenden" "newDeviceAction": "Verwenden",
"OldElectronAPPTitle": "Sicherheitslücke!",
"oldElectronClientDescription1": "Sie scheinen eine alte Version des Jitsi-Meet-Clients zu nutzen. Diese hat bekannte Schwachstellen. Bitte aktualisieren Sie auf unsere ",
"oldElectronClientDescription2": "aktuelle Version",
"oldElectronClientDescription3": "!"
}, },
"passwordSetRemotely": "von einem anderen Teilnehmer gesetzt", "passwordSetRemotely": "von einem anderen Teilnehmer gesetzt",
"passwordDigitsOnly": "Bis zu {{number}} Ziffern", "passwordDigitsOnly": "Bis zu {{number}} Ziffern",
"poweredby": "Betrieben von", "poweredby": "Betrieben von",
"prejoin": {
"audioAndVideoError": "Audio- und Videofehler:",
"audioOnlyError": "Audiofehler:",
"audioTrackError": "Audiotrack konnte nicht erstellt werden.",
"calling": "Rufaufbau",
"callMe": "Mich anrufen",
"callMeAtNumber": "Mich unter dieser Nummer anrufen:",
"configuringDevices": "Geräte werden eingerichtet …",
"connectedWithAudioQ": "Sie sind mit Audio verbunden?",
"copyAndShare": "Konferenzlink kopieren & teilen",
"dialInMeeting": "Telefoneinwahl",
"dialInPin": "In die Konferenz einwählen und PIN eingeben:",
"dialing": "Wählen",
"doNotShow": "Nicht mehr anzeigen",
"errorDialOut": "Anruf fehlgeschlagen",
"errorDialOutDisconnected": "Anruf fehlgeschlagen. Verbindungsabbruch",
"errorDialOutFailed": "Anruf fehlgeschlagen. Anruf fehlgeschlagen",
"errorDialOutStatus": "Fehler beim Abrufen des Anrufstatus",
"errorStatusCode": "Anruf fehlgeschlagen. Statuscode: {{status}}",
"errorValidation": "Nummerverifikation fehlgeschlagen",
"iWantToDialIn": "Ich möchte mich einwählen",
"joinAudioByPhone": "Per Telefon teilnehmen",
"joinMeeting": "Konferenz beitreten",
"joinWithoutAudio": "Ohne Ton beitreten",
"initiated": "Anruf gestartet",
"linkCopied": "Link in die Zwischenablage kopiert",
"lookGood": "Ihr Mikrofon scheint zu funktionieren.",
"or": "oder",
"premeeting": "Vorraum",
"showScreen": "Konferenzvorraum aktivieren",
"startWithPhone": "Mit Telefonaudio starten",
"screenSharingError": "Fehler bei Bildschirmfreigabe:",
"videoOnlyError": "Videofehler:",
"videoTrackError": "Videotrack konnte nicht erstellt werden.",
"viewAllNumbers": "alle Nummern anzeigen"
},
"presenceStatus": { "presenceStatus": {
"busy": "Beschäftigt", "busy": "Beschäftigt",
"calling": "Wird angerufen …", "calling": "Wird angerufen …",
@ -501,6 +559,8 @@
}, },
"raisedHand": "Ich möchte sprechen", "raisedHand": "Ich möchte sprechen",
"recording": { "recording": {
"limitNotificationDescriptionWeb": "Wegen hoher Nachfrage ist Ihre Aufnahme auf {{limit}} min. begrenzt. Für unlimitierte Aufnahmen nutzen Sie bitte <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Wegen hoher Nachfrage ist Ihre Aufnahme auf {{limit}} min begrenzt. Für unlimitierte Aufnahmen nutzen Sie bitte <3>{{app}}</3>.",
"authDropboxText": "In Dropbox hochladen", "authDropboxText": "In Dropbox hochladen",
"availableSpace": "Verfügbarer Speicherplatz: {{spaceLeft}} MB (ca. {{duration}} Minuten Aufzeichnung)", "availableSpace": "Verfügbarer Speicherplatz: {{spaceLeft}} MB (ca. {{duration}} Minuten Aufzeichnung)",
"beta": "BETA", "beta": "BETA",
@ -511,7 +571,7 @@
"expandedOn": "Das Meeting wird momentan aufgezeichnet.", "expandedOn": "Das Meeting wird momentan aufgezeichnet.",
"expandedPending": "Aufzeichnung wird gestartet…", "expandedPending": "Aufzeichnung wird gestartet…",
"failedToStart": "Die Aufnahme konnte nicht gestartet werden", "failedToStart": "Die Aufnahme konnte nicht gestartet werden",
"fileSharingdescription": "Aufzeichnung mit Meeting-Teilnehmer teilen", "fileSharingdescription": "Aufzeichnung mit Konferenzteilnehmer teilen",
"live": "LIVE", "live": "LIVE",
"loggedIn": "Als {{userName}} angemeldet", "loggedIn": "Als {{userName}} angemeldet",
"off": "Aufnahme gestoppt", "off": "Aufnahme gestoppt",
@ -531,7 +591,8 @@
"pullToRefresh": "Ziehen, um zu aktualisieren" "pullToRefresh": "Ziehen, um zu aktualisieren"
}, },
"security": { "security": {
"about": "Sie können einen Passwort zu Ihrer Sitzung hinzufügen. Die Teilnehmer müssen dieses ebenfalls eingeben, bevor sie an der Sitzung teilnehmen dürfen", "about": "Sie können Ihre Konferenz mit einem Passwort sichern. Teilnehmer müssen dieses eingeben, bevor sie an der Sitzung teilnehmen dürfen.",
"aboutReadOnly": "Moderatoren können die Konferenz mit einem Passwort sichern. Teilnehmer müssen dieses eingeben, bevor sie an der Sitzung teilnehmen dürfen.",
"insecureRoomNameWarning": "Der Raumname ist unsicher. Unerwünschte Teilnehmer könnten Ihrer Konferenz beitreten", "insecureRoomNameWarning": "Der Raumname ist unsicher. Unerwünschte Teilnehmer könnten Ihrer Konferenz beitreten",
"securityOptions": "Sicherheitsoptionen" "securityOptions": "Sicherheitsoptionen"
}, },
@ -563,12 +624,15 @@
"settingsView": { "settingsView": {
"advanced": "Erweitert", "advanced": "Erweitert",
"alertOk": "OK", "alertOk": "OK",
"alertCancel": "Abbrechen",
"alertTitle": "Warnung", "alertTitle": "Warnung",
"alertURLText": "Die angegebene Server-URL ist ungültig", "alertURLText": "Die angegebene Server-URL ist ungültig",
"buildInfoSection": "Build-Informationen", "buildInfoSection": "Build-Informationen",
"conferenceSection": "Konferenz", "conferenceSection": "Konferenz",
"disableCallIntegration": "Native Anrufintegration deaktivieren", "disableCallIntegration": "Native Anrufintegration deaktivieren",
"disableP2P": "Ende-zu-Ende-Modus deaktivieren", "disableP2P": "Ende-zu-Ende-Modus deaktivieren",
"disableCrashReporting": "Absturzberichte deaktivieren",
"disableCrashReportingWarning": "Möchten Sie die Absturzberichte wirklich deaktivieren? Diese Einstellung wird nach einem Neustart der App wirksam.",
"displayName": "Anzeigename", "displayName": "Anzeigename",
"email": "E-Mail", "email": "E-Mail",
"header": "Einstellungen", "header": "Einstellungen",
@ -610,14 +674,18 @@
"chat": "Chatfenster ein-/ausblenden", "chat": "Chatfenster ein-/ausblenden",
"document": "Geteiltes Dokument schließen", "document": "Geteiltes Dokument schließen",
"download": "Unsere Apps herunterladen", "download": "Unsere Apps herunterladen",
"embedMeeting": "Konferenz einbetten",
"e2ee": "Ende-zu-Ende-Verschlüsselung",
"feedback": "Feedback hinterlassen", "feedback": "Feedback hinterlassen",
"fullScreen": "Vollbildmodus aktivieren/deaktivieren", "fullScreen": "Vollbildmodus ein-/ausschalten",
"grantModerator": "Zum Moderator machen",
"hangup": "Anruf beenden", "hangup": "Anruf beenden",
"help": "Hilfe", "help": "Hilfe",
"invite": "Teilnehmer einladen", "invite": "Teilnehmer einladen",
"kick": "Teilnehmer entfernen", "kick": "Teilnehmer entfernen",
"lobbyButton": "Lobbymodus ein-/ausschalten",
"localRecording": "Lokale Aufzeichnungssteuerelemente ein-/ausschalten", "localRecording": "Lokale Aufzeichnungssteuerelemente ein-/ausschalten",
"lockRoom": "Meeting-Passwort ein-/auschalten", "lockRoom": "Konferenzpasswort ein-/auschalten",
"moreActions": "Menü „Weitere Aktionen“ ein-/ausschalten", "moreActions": "Menü „Weitere Aktionen“ ein-/ausschalten",
"moreActionsMenu": "Menü „Weitere Aktionen“", "moreActionsMenu": "Menü „Weitere Aktionen“",
"moreOptions": "Menü „Weitere Optionen“", "moreOptions": "Menü „Weitere Optionen“",
@ -639,6 +707,7 @@
"speakerStats": "Sprecherstatistik ein-/ausblenden", "speakerStats": "Sprecherstatistik ein-/ausblenden",
"tileView": "Kachelansicht ein-/ausschalten", "tileView": "Kachelansicht ein-/ausschalten",
"toggleCamera": "Kamera wechseln", "toggleCamera": "Kamera wechseln",
"toggleFilmstrip": "Miniaturansichten ein-/ausschalten",
"videomute": "„Video stummschalten“ ein-/ausschalten", "videomute": "„Video stummschalten“ ein-/ausschalten",
"videoblur": "Video-Unschärfe ein-/ausschalten" "videoblur": "Video-Unschärfe ein-/ausschalten"
}, },
@ -653,6 +722,8 @@
"documentClose": "Geteiltes Dokument schließen", "documentClose": "Geteiltes Dokument schließen",
"documentOpen": "Geteiltes Dokument öffnen", "documentOpen": "Geteiltes Dokument öffnen",
"download": "Unsere Apps herunterladen", "download": "Unsere Apps herunterladen",
"e2ee": "Ende-zu-Ende-Verschlüsselung",
"embedMeeting": "Konferenz einbetten",
"enterFullScreen": "Vollbildmodus", "enterFullScreen": "Vollbildmodus",
"enterTileView": "Kachelansicht einschalten", "enterTileView": "Kachelansicht einschalten",
"exitFullScreen": "Vollbildmodus verlassen", "exitFullScreen": "Vollbildmodus verlassen",
@ -661,6 +732,8 @@
"hangup": "Verlassen", "hangup": "Verlassen",
"help": "Hilfe", "help": "Hilfe",
"invite": "Teilnehmer einladen", "invite": "Teilnehmer einladen",
"lobbyButtonDisable": "Lobbymodus deaktivieren",
"lobbyButtonEnable": "Lobbymodus aktivieren",
"login": "Anmelden", "login": "Anmelden",
"logout": "Abmelden", "logout": "Abmelden",
"lowerYourHand": "Hand senken", "lowerYourHand": "Hand senken",
@ -755,6 +828,7 @@
"domute": "Stummschalten", "domute": "Stummschalten",
"domuteOthers": "Alle anderen stummschalten", "domuteOthers": "Alle anderen stummschalten",
"flip": "Spiegeln", "flip": "Spiegeln",
"grantModerator": "Zum Moderator machen",
"kick": "Hinauswerfen", "kick": "Hinauswerfen",
"moderator": "Moderator", "moderator": "Moderator",
"mute": "Teilnehmer ist stumm geschaltet", "mute": "Teilnehmer ist stumm geschaltet",
@ -768,7 +842,7 @@
"join": "Zum Teilnehmen tippen", "join": "Zum Teilnehmen tippen",
"roomname": "Konferenzname eingeben" "roomname": "Konferenzname eingeben"
}, },
"appDescription": "Auf geht's! Starten Sie eine Videokonferenz mit dem ganzen Team. Oder besser noch: Laden Sie alle ein, die Sie kennen. {{app}} ist eine vollständig verschlüsselte, aus 100 % Open-Source-Software bestehende Videokonferenzlösung, die Sie den ganzen Tag kostenlos verwenden können — ohne Registrierung.", "appDescription": "Auf geht's! Starten Sie eine Videokonferenz mit ihrem Team oder besser noch: Laden Sie alle ein, die Sie kennen. {{app}} ist eine vollständig verschlüsselte und 100 % quelloffene Videokonferenzlösung, die Sie immer und überall kostenlos verwenden können ohne Registrierung.",
"audioVideoSwitch": { "audioVideoSwitch": {
"audio": "Audio", "audio": "Audio",
"video": "Video" "video": "Video"
@ -777,24 +851,62 @@
"connectCalendarButton": "Kalender verbinden", "connectCalendarButton": "Kalender verbinden",
"connectCalendarText": "Verbinden Sie Ihren Kalender, um all Ihre Meetings in {{app}} anzuzeigen. Fügen Sie zudem {{provider}}-Meetings in Ihren Kalender ein und starten Sie sie mit nur einem Klick.", "connectCalendarText": "Verbinden Sie Ihren Kalender, um all Ihre Meetings in {{app}} anzuzeigen. Fügen Sie zudem {{provider}}-Meetings in Ihren Kalender ein und starten Sie sie mit nur einem Klick.",
"enterRoomTitle": "Neues Meeting starten", "enterRoomTitle": "Neues Meeting starten",
"roomNameAllowedChars": "Der Meeting-Name sollte keines der folgenden Zeichen enthalten: ?, &, :, ', \", %, #.", "getHelp": "Hilfe",
"go": "Los", "go": "Los",
"goSmall": "Los", "goSmall": "Los",
"join": "Beitreten",
"info": "Informationen", "info": "Informationen",
"join": "ERSTELLEN / BEITRETEN",
"moderatedMessage": "Oder <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">reservieren Sie sich eine Konferenz-URL</a>, unter der Sie der einzige Moderator sind.",
"privacy": "Datenschutz", "privacy": "Datenschutz",
"recentList": "Letzte", "recentList": "Verlauf",
"recentListDelete": "Löschen", "recentListDelete": "Löschen",
"recentListEmpty": "Die Liste „Letzte“ ist momentan leer. Chatten Sie mit Ihrem Team. Sie finden all Ihre letzten Meetings hier.", "recentListEmpty": "Ihr Konferenzverlauf ist derzeit leer. Reden Sie mit Ihrem Team und Ihre vergangenen Konferenzen landen hier.",
"reducedUIText": "Willkommen bei {{app}}!", "reducedUIText": "Willkommen bei {{app}}!",
"roomNameAllowedChars": "Der Konferenzname sollte keines der folgenden Zeichen enthalten: ?, &, :, ', \", %, #.",
"roomname": "Konferenzname eingeben", "roomname": "Konferenzname eingeben",
"roomnameHint": "Name oder URL der Konferenz, der Sie beitreten möchten. Sie können einen Namen erfinden, er muss nur den anderen Teilnehmern übermittelt werden, damit diese der gleichen Konferenz beitreten.", "roomnameHint": "Name oder URL der Konferenz, der Sie beitreten möchten. Sie können einen Namen erfinden, er muss nur den anderen Teilnehmern übermittelt werden, damit diese der gleichen Konferenz beitreten.",
"sendFeedback": "Feedback senden", "sendFeedback": "Feedback senden",
"terms": "AGB", "terms": "AGB",
"title": "Sichere, mit umfassenden Funktionen ausgestattete und vollkommen kostenlose Videokonferenzen" "title": "Sichere, voll funktionale und komplett kostenlose Videokonferenzen"
}, },
"lonelyMeetingExperience": { "lonelyMeetingExperience": {
"button": "Andere einladen", "button": "Andere einladen",
"youAreAlone": "Nur Sie sind in diesem Meeting" "youAreAlone": "Sie sind alleine in dieser Konferenz"
},
"helpView": {
"header": "Hilfecenter"
},
"lobby": {
"knockingParticipantList": "Liste anklopfender Teilnehmer",
"allow": "Annehmen",
"backToKnockModeButton": "Kein Passwort, stattdessen Beitritt anfragen",
"dialogTitle": "Lobbymodus",
"disableDialogContent": "Lobbymodus derzeit deaktiviert. Diese Funktion stellt sicher, dass unerwünschte Personen Ihrer Konferenz nicht beitreten können. Funktion aktivieren?",
"disableDialogSubmit": "Deaktivieren",
"emailField": "E-Mail-Adresse eingeben",
"enableDialogPasswordField": "Passwort setzen (optional)",
"enableDialogSubmit": "Aktivieren",
"enableDialogText": "Mit dem Lobbymodus schützen Sie Ihre Konferenz, da nur von einem Moderator angenommene Teilnehmer beitreten können.",
"enterPasswordButton": "Konferenzpasswort eingeben",
"enterPasswordTitle": "Passwort zum Beitreten benutzen",
"invalidPassword": "Ungültiges Passwort",
"joiningMessage": "Sie treten der Konferenz bei, sobald jemand Ihre Anfrage annimmt.",
"joinWithPasswordMessage": "Beitrittsversuch mit Passwort, bitte warten …",
"joinRejectedMessage": "Ihr Beitrittsanfrage wurde von einem Moderator abgelehnt.",
"joinTitle": "Konferenz beitreten",
"joiningTitle": "Beitritt anfragen …",
"joiningWithPasswordTitle": "Mit Passwort beitreten …",
"knockButton": "Beitritt anfragen",
"knockTitle": "Jemand möchte der Konferenz beitreten",
"nameField": "Geben Sie Ihren Namen ein",
"notificationLobbyAccessDenied": "{{targetParticipantName}} wurde von {{originParticipantName}} der Zutritt verwehrt",
"notificationLobbyAccessGranted": "{{targetParticipantName}} wurde von {{originParticipantName}} der Zutritt gestattet",
"notificationLobbyDisabled": "{{originParticipantName}} hat die Lobby deaktiviert",
"notificationLobbyEnabled": "{{originParticipantName}} hat die Lobby aktiviert",
"notificationTitle": "Lobby",
"passwordField": "Konferenzpasswort eingeben",
"passwordJoinButton": "Beitreten",
"reject": "Ablehnen",
"toggleLabel": "Lobby aktivieren"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -580,7 +580,7 @@
}, },
"security": { "security": {
"about": "Usted puede agregar una contraseña a la reunión. Los participantes necesitaran la contraseña para unirse a la reunión.", "about": "Usted puede agregar una contraseña a la reunión. Los participantes necesitaran la contraseña para unirse a la reunión.",
"insecureRoomNameWarning": "El nombre de la sala es inseguro. Participantes no desseados pueden llegar a 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" "securityOptions": "Opciones de seguridad"
}, },
"settings": { "settings": {

View File

@ -578,7 +578,7 @@
}, },
"security": { "security": {
"about": "Usted puede agregar una contraseña a la reunión. Los participantes necesitaran la contraseña para unirse a la reunión.", "about": "Usted puede agregar una contraseña a la reunión. Los participantes necesitaran la contraseña para unirse a la reunión.",
"insecureRoomNameWarning": "El nombre de la sala es inseguro. Participantes no desseados pueden llegar a 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" "securityOptions": "Opciones de seguridad"
}, },
"settings": { "settings": {

View File

@ -1,21 +1,36 @@
{ {
"addPeople": { "addPeople": {
"add": "Inviter", "add": "Inviter",
"addContacts": "Inviter vos contacts",
"copyInvite": "Copier l'invitation à la réunion",
"copyLink": "Copier le lien de la réunion",
"copyStream": "Copier le lien de diffision en direct",
"countryNotSupported": "Cette destination n'est pas actuellement supportée.", "countryNotSupported": "Cette destination n'est pas actuellement supportée.",
"countryReminder": "Appel hors des États-Unis ? Veuillez débuter par le code du pays !", "countryReminder": "Appel hors des États-Unis ? Veuillez débuter par le code du pays !",
"defaultEmail": "Votre email par défaut",
"disabled": "Vous ne pouvez pas inviter quelqu'un.", "disabled": "Vous ne pouvez pas inviter quelqu'un.",
"failedToAdd": "Erreur lors de l'ajout des participants", "failedToAdd": "Erreur lors de l'ajout des participants",
"footerText": "Appels sortants désactivés.", "footerText": "Appels sortants désactivés.",
"googleEmail": "Gmail",
"inviteMoreHeader": "Vous êtes seul(e) dans la réunion",
"inviteMoreMailSubject": "Rejoindre une réunion {{appName}}",
"inviteMorePrompt": "Inviter d'autres personnes",
"linkCopied": "Lien copié dans le presse-papiers",
"loading": "Rechercher des personnes et des numéros de téléphone", "loading": "Rechercher des personnes et des numéros de téléphone",
"loadingNumber": "Validation du numéro de téléphone", "loadingNumber": "Validation du numéro de téléphone",
"loadingPeople": "Recherche de personnes à inviter", "loadingPeople": "Recherche de personnes à inviter",
"noResults": "Aucun résultat de recherche correspondant", "noResults": "Aucun résultat de recherche correspondant",
"noValidNumbers": "Veuillez entrer un numéro de téléphone", "noValidNumbers": "Veuillez entrer un numéro de téléphone",
"outlookEmail": "Outlook",
"searchNumbers": "Ajouter des numéros de téléphone", "searchNumbers": "Ajouter des numéros de téléphone",
"searchPeople": "Rechercher une personne", "searchPeople": "Rechercher une personne",
"searchPeopleAndNumbers": "Rechercher des personnes ou ajouter leurs numéros de téléphone", "searchPeopleAndNumbers": "Rechercher des personnes ou ajouter leurs numéros de téléphone",
"shareInvite": "Partager l'invitation à la réunion",
"shareLink": "Partager le lien de la réunion pour inviter d'autres personnes",
"shareStream": "Partager le lien de diffusion en direct",
"telephone": "Téléphone : {{number}}", "telephone": "Téléphone : {{number}}",
"title": "Inviter une personne à cette réunion" "title": "Inviter une personne à cette réunion",
"yahooEmail": "Yahoo"
}, },
"audioDevices": { "audioDevices": {
"bluetooth": "Bluetooth", "bluetooth": "Bluetooth",
@ -147,6 +162,7 @@
"accessibilityLabel": { "accessibilityLabel": {
"liveStreaming": "Diffusion en direct" "liveStreaming": "Diffusion en direct"
}, },
"add": "Ajouter",
"allow": "Autoriser", "allow": "Autoriser",
"alreadySharedVideoMsg": "Un autre participant est en train de partager sa vidéo. Cette conférence ne permet de partager qu'une seule vidéo à la fois.", "alreadySharedVideoMsg": "Un autre participant est en train de partager sa vidéo. Cette conférence ne permet de partager qu'une seule vidéo à la fois.",
"alreadySharedVideoTitle": "Une seule vidéo partagée est autorisée à la fois", "alreadySharedVideoTitle": "Une seule vidéo partagée est autorisée à la fois",
@ -178,6 +194,8 @@
"done": "Terminé", "done": "Terminé",
"enterDisplayName": "Merci de saisir votre nom ici", "enterDisplayName": "Merci de saisir votre nom ici",
"error": "Erreur", "error": "Erreur",
"grantModeratorDialog": "Êtes vous sûr de vouloir rendre ce participant modérateur?",
"grantModeratorTitle": "Nommer modérateur",
"externalInstallationMsg": "Vous devez installer notre extension de partage de bureau.", "externalInstallationMsg": "Vous devez installer notre extension de partage de bureau.",
"externalInstallationTitle": "Extension requise", "externalInstallationTitle": "Extension requise",
"goToStore": "Aller sur le webstore", "goToStore": "Aller sur le webstore",
@ -468,6 +486,40 @@
"passwordSetRemotely": "défini par un autre participant", "passwordSetRemotely": "défini par un autre participant",
"passwordDigitsOnly": "Jusqu'à {{number}} chiffres", "passwordDigitsOnly": "Jusqu'à {{number}} chiffres",
"poweredby": "produit par", "poweredby": "produit par",
"prejoin": {
"audioAndVideoError": "Erreur audio et video:",
"audioOnlyError": "Erreur audio:",
"audioTrackError": "N'a pas pu créer la piste audio.",
"callMe": "Appelez-moi",
"callMeAtNumber": "Appelez-moi à ce numéro:",
"configuringDevices": "Configuration des appareils...",
"connectedWithAudioQ": "Êtes-vous connecté avec le microphone?",
"copyAndShare": "Copier & partager le lien",
"dialInMeeting": "Participez à la réunion",
"dialInPin": "Participez à la réunion et saisir le code PIN:",
"dialing": "Numérotation",
"doNotShow": "Ne plus afficher ceci",
"errorDialOut": "Impossible de composer le numéro",
"errorDialOutDisconnected": "Impossible de composer le numéro. Déconnecté",
"errorDialOutFailed": "Impossible de composer le numéro. L'appel a échoué",
"errorDialOutStatus": "Erreur lors de l'obtention de l'état d'appel sortant",
"errorStatusCode": "Erreur de numérotation, code d'état: {{status}}",
"errorValidation": "La validation du numéro a échoué",
"iWantToDialIn": "Je veux me connecter",
"joinAudioByPhone": "Rejoindre avec l'audio du téléphone",
"joinMeeting": "Rejoindre la réunion",
"joinWithoutAudio": "Rejoignez sans microphone",
"initiated": "Appel lancé",
"linkCopied": "Lien copié dans le presse-papiers",
"lookGood": "Il semble que votre microphone fonctionne correctement",
"or": "ou",
"calling": "Appel",
"startWithPhone": "Commencez avec l'audio du téléphone",
"screenSharingError": "Erreur de partage d'écran:",
"videoOnlyError": "Erreur vidéo:",
"videoTrackError": "Impossible de créer une piste vidéo.",
"viewAllNumbers": "voir tous les numéros"
},
"presenceStatus": { "presenceStatus": {
"busy": "Occupé", "busy": "Occupé",
"calling": "Appel...", "calling": "Appel...",
@ -738,6 +790,7 @@
"domute": "Couper le micro", "domute": "Couper le micro",
"domuteOthers": "Couper le micro de tous les autres", "domuteOthers": "Couper le micro de tous les autres",
"flip": "Balancer", "flip": "Balancer",
"grantModerator": "Nommer modérateur",
"kick": "Exclure", "kick": "Exclure",
"moderator": "Modérateur", "moderator": "Modérateur",
"mute": "Un participant a coupé son micro", "mute": "Un participant a coupé son micro",
@ -783,5 +836,39 @@
}, },
"helpView": { "helpView": {
"header": "Centre d'aide" "header": "Centre d'aide"
},
"lobby": {
"knockingParticipantList" : "Liste des participants en attente",
"allow": "Autoriser",
"backToKnockModeButton": "Aucun mot de passe, demander à rejoindre plutôt",
"dialogTitle": "Mode lobby",
"disableDialogContent": "Le mode lobby est actuellement activé. Cette fonctionnalité garantit que les participants indésirables ne peuvent pas rejoindre votre réunion. Souhaitez-vous la désactiver?",
"disableDialogSubmit": "Désactiver",
"emailField": "Saisissez votre adresse email",
"enableDialogPasswordField": "Définir le mot de passe (optionel)",
"enableDialogSubmit": "Activer",
"enableDialogText": "Le mode lobby 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",
"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...",
"joinRejectedMessage": "Votre requête pour rejoindre une réunion a été refusée par un modérateur.",
"joinTitle": "Rejoindre une réunion",
"joiningTitle": "Demander à rejoindre une réunion...",
"joiningWithPasswordTitle": "Rejoindre avec mot de passe...",
"knockButton": "Demander à rejoindre",
"knockTitle": "Quelqu'un souhaite rejoindre la réunion",
"nameField": "Saisissez votre nom",
"passwordField": "Saisissez le mot de passe de la réunion",
"passwordJoinButton": "Rejoindre",
"reject": "Refuser",
"toggleLabel": "Activer le lobby"
},
"security": {
"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é"
} }
} }

View File

@ -290,9 +290,9 @@
"inviteLiveStream": "この会議のライブストリームを表示するには、このリンクをクリックしてください:{{url}}", "inviteLiveStream": "この会議のライブストリームを表示するには、このリンクをクリックしてください:{{url}}",
"invitePhone": "", "invitePhone": "",
"invitePhoneAlternatives": "", "invitePhoneAlternatives": "",
"inviteURLFirstPartGeneral": "", "inviteURLFirstPartGeneral": "あなたはミーティングに招待されました。",
"inviteURLFirstPartPersonal": "", "inviteURLFirstPartPersonal": "{{name}} があなたをミーティングに招待しました。\n",
"inviteURLSecondPart": "", "inviteURLSecondPart": "\nミーティングにご参加ください:\n{{url}}\n",
"liveStreamURL": "ライブストリーム:", "liveStreamURL": "ライブストリーム:",
"moreNumbers": "その他の番号", "moreNumbers": "その他の番号",
"noNumbers": "ダイヤルイン番号はありません。", "noNumbers": "ダイヤルイン番号はありません。",
@ -325,7 +325,7 @@
"keyboardShortcuts": "キーボードショートカット", "keyboardShortcuts": "キーボードショートカット",
"localRecording": "ローカル録画コントロールの表示/非表示", "localRecording": "ローカル録画コントロールの表示/非表示",
"mute": "マイクの消音 ( ミュート )", "mute": "マイクの消音 ( ミュート )",
"pushToTalk": "話すために押す", "pushToTalk": "プッシュ・トゥ・トーク",
"raiseHand": "手を上げる/下げる", "raiseHand": "手を上げる/下げる",
"showSpeakerStats": "演説者のデータを表示", "showSpeakerStats": "演説者のデータを表示",
"toggleChat": "チャットを表示/非表示", "toggleChat": "チャットを表示/非表示",
@ -566,7 +566,7 @@
"shortcuts": "ショートカットに切り替える", "shortcuts": "ショートカットに切り替える",
"show": "", "show": "",
"speakerStats": "スピーカー統計に切り替える", "speakerStats": "スピーカー統計に切り替える",
"tileView": "", "tileView": "タイルビュー",
"toggleCamera": "カメラを切り替える", "toggleCamera": "カメラを切り替える",
"videomute": "ミュートビデオに切り替える", "videomute": "ミュートビデオに切り替える",
"videoblur": "" "videoblur": ""
@ -582,9 +582,9 @@
"documentClose": "共有ドキュメントを閉じる", "documentClose": "共有ドキュメントを閉じる",
"documentOpen": "共有ドキュメントを開く", "documentOpen": "共有ドキュメントを開く",
"enterFullScreen": "フルスクリーン表示", "enterFullScreen": "フルスクリーン表示",
"enterTileView": "タイルビューを開始", "enterTileView": "タイルビューを開始",
"exitFullScreen": "フルスクリーンを終了", "exitFullScreen": "フルスクリーンを終了",
"exitTileView": "タイルビューを終了", "exitTileView": "タイルビューを終了",
"feedback": "フィードバックを残す", "feedback": "フィードバックを残す",
"hangup": "退出", "hangup": "退出",
"invite": "メンバーを招待する", "invite": "メンバーを招待する",
@ -609,7 +609,7 @@
"stopSubtitles": "字幕停止", "stopSubtitles": "字幕停止",
"stopSharedVideo": "YouTube動画を停止する", "stopSharedVideo": "YouTube動画を停止する",
"talkWhileMutedPopup": "話そうとしていますか? あなたはミュートされています。", "talkWhileMutedPopup": "話そうとしていますか? あなたはミュートされています。",
"tileViewToggle": "", "tileViewToggle": "タイルビューを切り替え",
"toggleCamera": "カメラを切り替える", "toggleCamera": "カメラを切り替える",
"videomute": "カメラの開始 / 停止", "videomute": "カメラの開始 / 停止",
"startvideoblur": "", "startvideoblur": "",

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,22 @@
"searchPeople": "Cercar de monde", "searchPeople": "Cercar de monde",
"searchPeopleAndNumbers": "Cercar de monde o apondre lor numèros de telefòn", "searchPeopleAndNumbers": "Cercar de monde o apondre lor numèros de telefòn",
"telephone": "Telefòn: {{number}}", "telephone": "Telefòn: {{number}}",
"title": "Convidatz de monde a vòstra conferéncia" "title": "Convidatz de monde a vòstra conferéncia",
"shareStream": "Partejar la ligam de la difusion en dirècte",
"copyStream": "Copiar lo ligam de la difusion en dirècte",
"yahooEmail": "Yahoo Email",
"outlookEmail": "Outlook Email",
"shareLink": "Partejar lo ligam de la conferéncia per convidar de monde",
"shareInvite": "Partejar invitacion conferéncia",
"linkCopied": "Ligam copiat al quichapapièrs",
"inviteMorePrompt": "Convidar mai de monde",
"inviteMoreMailSubject": "Rejónher la conferéncia {{appName}}",
"inviteMoreHeader": "Sètz lunica persona de la conferéncia",
"googleEmail": "Google Email",
"defaultEmail": "Vòstre email per defaut",
"copyLink": "Copiar lo ligam de la conferéncia",
"copyInvite": "Copiar linvitacion a la conferéncia",
"addContacts": "Convidatz vòstres contactes"
}, },
"audioDevices": { "audioDevices": {
"bluetooth": "Bluetooth", "bluetooth": "Bluetooth",
@ -122,7 +137,10 @@
"launchWebButton": "Lançar del navigador", "launchWebButton": "Lançar del navigador",
"openApp": "Telecargar laplicacion", "openApp": "Telecargar laplicacion",
"title": "Aviada de vòstra conferéncia dins {{app}}…", "title": "Aviada de vòstra conferéncia dins {{app}}…",
"tryAgainButton": "Tornar ensajar del burèu" "tryAgainButton": "Tornar ensajar del burèu",
"joinInApp": "Rejónher la conferéncia en utilizant laplicacion",
"ifHaveApp": "Savètz ja laplicacion:",
"ifDoNotHaveApp": "Savètz pas encara laplicacion:"
}, },
"defaultLink": "ex. {{url}}", "defaultLink": "ex. {{url}}",
"defaultNickname": "ex. Joan Delpuèch", "defaultNickname": "ex. Joan Delpuèch",
@ -238,7 +256,7 @@
"screenSharingFailedToInstallTitle": "Fracàs de l'installacion de partatge d'ecran", "screenSharingFailedToInstallTitle": "Fracàs de l'installacion de partatge d'ecran",
"screenSharingFirefoxPermissionDeniedError": "Quicòm a fach mèuca quand èrem a ensajar de partejar vòstre ecran. Mercés de verificar quavètz donat lautorizacion de lo partejar.", "screenSharingFirefoxPermissionDeniedError": "Quicòm a fach mèuca quand èrem a ensajar de partejar vòstre ecran. Mercés de verificar quavètz donat lautorizacion de lo partejar.",
"screenSharingFirefoxPermissionDeniedTitle": "Ops! Avèm pas pogut aviar lo partatge decran.", "screenSharingFirefoxPermissionDeniedTitle": "Ops! Avèm pas pogut aviar lo partatge decran.",
"screenSharingPermissionDeniedError": ups ! Quicòm s'es pas ben passat amb l'autorizacion de vòstra extension de partatge d'ecran. Mercés de recargar e tornar ensajar.", "screenSharingPermissionDeniedError": ps ! Quicòm s'es pas ben passat amb l'autorizacion de vòstra autorizacion de partatge d'ecran. Mercés de recargar e tornar ensajar.",
"sendPrivateMessage": "Avètz recentament recebut un messatge privat. Avètz ensajat di respondre en privat, o volètz enviar lo messatge al grop ?", "sendPrivateMessage": "Avètz recentament recebut un messatge privat. Avètz ensajat di respondre en privat, o volètz enviar lo messatge al grop ?",
"sendPrivateMessageCancel": "Enviar al grop", "sendPrivateMessageCancel": "Enviar al grop",
"sendPrivateMessageOk": "Enviar en privat", "sendPrivateMessageOk": "Enviar en privat",
@ -257,7 +275,7 @@
"stopLiveStreaming": "Arrestar lo dirècte", "stopLiveStreaming": "Arrestar lo dirècte",
"stopRecording": "Arrestar l'enregistrament", "stopRecording": "Arrestar l'enregistrament",
"stopRecordingWarning": "Sètz segur que volètz arrestar l'enregistrament?", "stopRecordingWarning": "Sètz segur que volètz arrestar l'enregistrament?",
"stopStreamingWarning": "Sètz segur que volètz arrestar lo dirècte?", "stopStreamingWarning": "Volètz vertadièrament arrestar lo dirècte?",
"streamKey": "Clau del dirècte", "streamKey": "Clau del dirècte",
"Submit": "Validar", "Submit": "Validar",
"thankYou": "Mercé d'aver utilizat {{appName}} !", "thankYou": "Mercé d'aver utilizat {{appName}} !",
@ -273,12 +291,11 @@
"Yes": "Òc", "Yes": "Òc",
"yourEntireScreen": "Vòstre ecran complet", "yourEntireScreen": "Vòstre ecran complet",
"screenSharingAudio": "Partejar làudio", "screenSharingAudio": "Partejar làudio",
"muteEveryoneStartMuted": "", "muteEveryoneStartMuted": "D'ara enlà tot lo monde comença mut",
"muteEveryoneSelf": "", "muteEveryoneSelf": "vos",
"muteEveryoneTitle": "", "muteEveryoneTitle": "Rendre mut tot lo monde?",
"muteEveryoneDialog": "", "muteEveryoneDialog": "Volètz vertadièrament copar lo son a tot lo monde? Poiretz pas lo restablir, mas eles poiràn o far quora que vòlgan.",
"muteEveryoneElseTitle": "Copar lo son a totes levat {{whom}}?", "muteEveryoneElseTitle": "Copar lo son a totes levat {{whom}}?"
"muteEveryoneElseDialog": ""
}, },
"dialOut": { "dialOut": {
"statusMessage": "ara es {{status}}" "statusMessage": "ara es {{status}}"
@ -381,7 +398,7 @@
"invalidStreamKey": "La clau de difusion en dirècte es benlèu pas corrècta.", "invalidStreamKey": "La clau de difusion en dirècte es benlèu pas corrècta.",
"off": "La difusion en dirècte es estada arrestada", "off": "La difusion en dirècte es estada arrestada",
"offBy": "{{name}} a arrestat la difusion en dirècte", "offBy": "{{name}} a arrestat la difusion en dirècte",
"on": "La difusion en dirècte es estada arrestada", "on": "Difusion en dirècte",
"onBy": "{{name}} a començat la difusion en dirècte", "onBy": "{{name}} a començat la difusion en dirècte",
"pending": "Començar lo dirècte…", "pending": "Començar lo dirècte…",
"serviceName": "Servici de difusion en dirècte", "serviceName": "Servici de difusion en dirècte",
@ -458,7 +475,9 @@
"newDeviceAudioTitle": "Nòu periferic àudio detectat", "newDeviceAudioTitle": "Nòu periferic àudio detectat",
"newDeviceAction": "Utilizar", "newDeviceAction": "Utilizar",
"oldElectronClientDescription3": " ara!", "oldElectronClientDescription3": " ara!",
"oldElectronClientDescription2": "darrièra compilacion" "oldElectronClientDescription2": "darrièra compilacion",
"oldElectronClientDescription1": "Sembla quutilizatz una version anciana del client Jitsi Meet ques conegut per conténer de problèmas de seguretat. Mercés de vos assegurar de metre a jorn ",
"OldElectronAPPTitle": "Problèma de seguretat!"
}, },
"passwordSetRemotely": "causit per qualqu'un mai", "passwordSetRemotely": "causit per qualqu'un mai",
"passwordDigitsOnly": "Fins a {{number}} chifras", "passwordDigitsOnly": "Fins a {{number}} chifras",
@ -557,7 +576,9 @@
"startWithAudioMuted": "Començar sens son", "startWithAudioMuted": "Començar sens son",
"startWithVideoMuted": "Començar sens vièdo", "startWithVideoMuted": "Començar sens vièdo",
"version": "Version", "version": "Version",
"alertCancel": "Anullar" "alertCancel": "Anullar",
"disableCrashReportingWarning": "Volètz vertadièrament desactivar lo rapòrt de plantatge? Lo paramètre serà aplicat aprèp la reaviada de laplicacion.",
"disableCrashReporting": "Desactivar lo rapòrt de plantatge"
}, },
"share": { "share": {
"dialInfoText": "\n\n=====\n\nVolètz sonar de vòstre telefòn estant ?\n\n{{defaultDialInNumber}}Clicatz lo ligam per veire los numèros de telefòn daquesta conferéncia\n{{dialInfoPageUrl}}", "dialInfoText": "\n\n=====\n\nVolètz sonar de vòstre telefòn estant ?\n\n{{defaultDialInNumber}}Clicatz lo ligam per veire los numèros de telefòn daquesta conferéncia\n{{dialInfoPageUrl}}",
@ -618,9 +639,10 @@
"toggleCamera": "Passar a la camèra", "toggleCamera": "Passar a la camèra",
"videomute": "Silenciar la vidèo", "videomute": "Silenciar la vidèo",
"videoblur": "Enfoscar o non la vidèo", "videoblur": "Enfoscar o non la vidèo",
"muteEveryone": "", "muteEveryone": "Rendre mut tot lo monde",
"moreOptions": "Mostrar mai dopcions", "moreOptions": "Mostrar mai dopcions",
"e2ee": "Chiframent del cap a la fin" "e2ee": "Chiframent del cap a la fin",
"security": "Opcions de seguretat"
}, },
"addPeople": "Ajustar de monde a vòstra sonada", "addPeople": "Ajustar de monde a vòstra sonada",
"audioOnlyOff": "Desactivar lo mòde connexion febla", "audioOnlyOff": "Desactivar lo mòde connexion febla",
@ -672,12 +694,13 @@
"startvideoblur": "Trebolar mon rèire-plan", "startvideoblur": "Trebolar mon rèire-plan",
"stopvideoblur": "Desactivar lo borrolatge del rèire-plan", "stopvideoblur": "Desactivar lo borrolatge del rèire-plan",
"noisyAudioInputDesc": "", "noisyAudioInputDesc": "",
"noisyAudioInputTitle": "", "noisyAudioInputTitle": "Vòstre microfòn sembla brusent !",
"noAudioSignalDialInLinkDesc": "", "noAudioSignalDialInLinkDesc": "",
"noAudioSignalDialInDesc": "", "noAudioSignalDialInDesc": "",
"muteEveryone": "", "muteEveryone": "Rendre mut tot lo monde",
"moreOptions": "Autras opcions", "moreOptions": "Autras opcions",
"e2ee": "Chiframent del cap a la fin" "e2ee": "Chiframent del cap a la fin",
"security": "Opcions de seguretat"
}, },
"transcribing": { "transcribing": {
"ccButtonTooltip": "Aviar / Arrestat los sostítols", "ccButtonTooltip": "Aviar / Arrestat los sostítols",
@ -741,7 +764,7 @@
"remoteControl": "Contraròtle alonhat", "remoteControl": "Contraròtle alonhat",
"show": "Mostrar davant", "show": "Mostrar davant",
"videomute": "Lo participant a arrestat la camèra", "videomute": "Lo participant a arrestat la camèra",
"domuteOthers": "" "domuteOthers": "Rendre mut totes los autres"
}, },
"welcomepage": { "welcomepage": {
"accessibilityLabel": { "accessibilityLabel": {
@ -778,8 +801,8 @@
"header": "Centre dajuda" "header": "Centre dajuda"
}, },
"lonelyMeetingExperience": { "lonelyMeetingExperience": {
"youAreAlone": "", "youAreAlone": "Sètz lunica persona de la conferéncia",
"button": "" "button": "Convidar dautres"
}, },
"chromeExtensionBanner": { "chromeExtensionBanner": {
"dontShowAgain": "Me mostrar pas mai aquò", "dontShowAgain": "Me mostrar pas mai aquò",
@ -796,6 +819,53 @@
"callMe": "Sona-me", "callMe": "Sona-me",
"audioTrackError": "Creacion impossibla de la pista àudio.", "audioTrackError": "Creacion impossibla de la pista àudio.",
"audioOnlyError": "Error àudio:", "audioOnlyError": "Error àudio:",
"audioAndVideoError": "Error àudio e vidèo:" "audioAndVideoError": "Error àudio e vidèo:",
"dialing": "A sonar",
"viewAllNumbers": "veire totes los numèros",
"videoTrackError": "Creacion duna pista àudio impossibla.",
"videoOnlyError": "Error vidèo:",
"screenSharingError": "Error de partatge decran:",
"startWithPhone": "Començar amb làudio del telefòn",
"calling": "A sonar",
"lookGood": "Sembla que lo microfòn fonciona pas coma cal",
"linkCopied": "Ligam copiat al quichapapièrs",
"initiated": "Sonada aviada",
"joinWithoutAudio": "Rejónher sens àudio",
"joinMeeting": "Rejónher la conferéncia",
"joinAudioByPhone": "Rejónher amb làudio del telefòn"
},
"lobby": {
"reject": "Regetar",
"passwordJoinButton": "Rejónher",
"passwordField": "Picatz lo senhal de la conferéncia",
"nameField": "Escrivètz vòstre nom",
"knockTitle": "Qualquun vòl rejónher la conferéncia",
"knockButton": "Demandar a rejónher",
"joiningWithPasswordTitle": "A rejónher amb senhal...",
"joiningTitle": "Demanda a rejónher la conferéncia...",
"joinTitle": "Rejónher la conferéncia",
"joinRejectedMessage": "Un moderator a regetat vòstra demanda de participacion.",
"joinWithPasswordMessage": "Ensag de participacion amb senhal, volgatz esperar...",
"joiningMessage": "Dintraretz dins la conferéncia tre que qualquun aurà acceptat vòstra demanda",
"invalidPassword": "Senhal invalid",
"enterPasswordTitle": "Dintratz lo senhal per rejónher la conferéncia",
"enterPasswordButton": "Dintratz lo senhal de la conferéncia",
"enableDialogSubmit": "Activar",
"enableDialogPasswordField": "Definir un senhal (opcional)",
"emailField": "Picata vòstra adreça electronica",
"disableDialogSubmit": "Desactivar",
"backToKnockModeButton": "Cap de senhal, demandar a participar a la plaça",
"allow": "Autorizar"
},
"security": {
"securityOptions": "Opcions de seguretat",
"insecureRoomNameWarning": "Lo nom de la sala es pas segur. De monde indesirables poirián rejónher vòstra conferéncia.",
"aboutReadOnly": "Los participants que son moderators pòdon ajustar un $t(lockRoomPassword) a la conferéncia. Los participants deuràn fornir lo $t(lockRoomPassword) abans daver lautorizacion de rejónher la conferéncia.",
"about": "Podètz ajustar un $t(lockRoomPassword) per rejónher una conferéncia. Los participants deuràn fornir lo $t(lockRoomPassword) abans dobténer lautorizacion de dintrar dins la conferéncia."
},
"e2ee": {
"labelToolTip": "La comunicacion àudio e vidèo daquesta sonada es chifrada del cap a la fin"
} }
} }

View File

@ -1,21 +1,36 @@
{ {
"addPeople": { "addPeople": {
"add": "Zaproś", "add": "Zaproś",
"addContacts": "Zaproś kontakty",
"copyInvite": "Kopiuj zaproszenie na spotkanie",
"copyLink": "Kopiuj link spotkania",
"copyStream": "Kopiuj link transmisji na żywo",
"countryNotSupported": "Nie obsługujemy jeszcze tej lokalizacji.", "countryNotSupported": "Nie obsługujemy jeszcze tej lokalizacji.",
"countryReminder": "Dzwonisz spoza USA? Upewnij się, że zaczynasz od kodu kraju!", "countryReminder": "Dzwonisz spoza USA? Upewnij się, że zaczynasz od kodu kraju!",
"defaultEmail": "Domyślna poczta",
"disabled": "Nie możesz zapraszać ludzi.", "disabled": "Nie możesz zapraszać ludzi.",
"failedToAdd": "Błąd dodawania uczestników", "failedToAdd": "Błąd dodawania uczestników",
"footerText": "Wybieranie numeru jest wyłączone.", "footerText": "Wybieranie numeru jest wyłączone.",
"googleEmail": "Poczta Google",
"inviteMoreHeader": "Jesteś jedynym uczestnikiem tego spotkania",
"inviteMoreMailSubject": "Dołącz do spotkania {{appName}}",
"inviteMorePrompt": "Zaproś innych uczestników",
"linkCopied": "Link skopiowany do schowka",
"loading": "Szukaj ludzi i numerów telefonów", "loading": "Szukaj ludzi i numerów telefonów",
"loadingNumber": "Weryfikacja numeru telefonu", "loadingNumber": "Weryfikacja numeru telefonu",
"loadingPeople": "Wyszukiwanie osób do zaproszenia", "loadingPeople": "Wyszukiwanie osób do zaproszenia",
"noResults": "Brak pasujących wyników wyszukiwania", "noResults": "Brak pasujących wyników wyszukiwania",
"noValidNumbers": "Proszę wpisać numer telefonu", "noValidNumbers": "Proszę wpisać numer telefonu",
"outlookEmail": "Poczta Outlook",
"searchNumbers": "Dodaj numery telefonów", "searchNumbers": "Dodaj numery telefonów",
"searchPeople": "Szukaj ludzi", "searchPeople": "Szukaj ludzi",
"searchPeopleAndNumbers": "Wyszukaj osoby i dodaj ich numery telefonu", "searchPeopleAndNumbers": "Wyszukaj osoby i dodaj ich numery telefonu",
"shareInvite": "Udostępnij zaproszenie na spotkanie",
"shareLink": "Udostępnij link do spotkania, aby zaprosić innych uczestników",
"shareStream": "Udostępnij link transmisji na żywo",
"telephone": "Telefon: {{number}}", "telephone": "Telefon: {{number}}",
"title": "Zaproś ludzi na to spotkanie" "title": "Zaproś uczestników na to spotkanie",
"yahooEmail": "Poczta Yahoo"
}, },
"audioDevices": { "audioDevices": {
"bluetooth": "Bluetooth", "bluetooth": "Bluetooth",
@ -47,10 +62,10 @@
}, },
"chat": { "chat": {
"error": "Błąd: Twoja wiadomość nie została wysłana. Powód: {{error}}", "error": "Błąd: Twoja wiadomość nie została wysłana. Powód: {{error}}",
"fieldPlaceHolder": "", "fieldPlaceHolder": "Wpisz wiadomość tutaj",
"messagebox": "Wpisz wiadomość", "messagebox": "Wpisz wiadomość",
"messageTo": "Prywatna wiadomość do {{recipient}}", "messageTo": "Prywatna wiadomość do {{recipient}}",
"noMessagesMessage": "", "noMessagesMessage": "Aktualnie brak wiadomości w tym spotkaniu. Rozpocznij konwersację!",
"nickname": { "nickname": {
"popover": "Wybierz swój nick", "popover": "Wybierz swój nick",
"title": "Wpisz swoją nazwę, aby użyć rozmowy" "title": "Wpisz swoją nazwę, aby użyć rozmowy"
@ -58,9 +73,14 @@
"privateNotice": "Prywatna wiadomość do {{recipient}}", "privateNotice": "Prywatna wiadomość do {{recipient}}",
"title": "Rozmowa", "title": "Rozmowa",
"you": "Ty" "you": "Ty"
},
"chromeExtensionBanner": {
"installExtensionText": "Zainstaluj rozszerzenie integrujące Kalendarz Google i Office 365",
"buttonText": "Zainstaluj rozszerzenie Chrome",
"dontShowAgain": "Nie pokazuj ponownie"
}, },
"connectingOverlay": { "connectingOverlay": {
"joiningRoom": "Łączenie z Twoim spotkaniem…" "joiningRoom": "Łączenie ze spotkaniem…"
}, },
"connection": { "connection": {
"ATTACHED": "Załącznik", "ATTACHED": "Załącznik",
@ -72,7 +92,10 @@
"DISCONNECTED": "Rozłączony", "DISCONNECTED": "Rozłączony",
"DISCONNECTING": "Rozłączanie", "DISCONNECTING": "Rozłączanie",
"ERROR": "Błąd", "ERROR": "Błąd",
"RECONNECTING": "Wystąpił problem w sieci. Ponowienie połączenia..." "FETCH_SESSION_ID": "Uzyskiwanie id sesji...",
"GET_SESSION_ID_ERROR": "Nie można uzyskać id sesji. Błąd: {{code}}",
"GOT_SESSION_ID": "Uzyskiwanie id sesji... Gotowe",
"LOW_BANDWIDTH": "Wideo {{displayName}} zostało wyłączone w celu oszczędności zasobów"
}, },
"connectionindicator": { "connectionindicator": {
"address": "Adres:", "address": "Adres:",
@ -80,14 +103,14 @@
"bitrate": "Szybkość transmisji:", "bitrate": "Szybkość transmisji:",
"bridgeCount": "Liczba serwerów: ", "bridgeCount": "Liczba serwerów: ",
"connectedTo": "Podłączone do:", "connectedTo": "Podłączone do:",
"e2e_rtt": "E2E RTT:",
"framerate": "Klatek na sekundę:", "framerate": "Klatek na sekundę:",
"less": "Pokaż mniej", "less": "Pokaż mniej",
"localaddress_0": "Adres lokalny:", "localaddress": "Adres lokalny:",
"localaddress_1": "Adresy lokalne:", "localaddress_plural": "Adresy lokalne:",
"localaddress_2": "Adresy lokalne:", "localport": "Port lokalny:",
"localport_0": "Port lokalny:", "localport_plural": "Porty lokalne:",
"localport_1": "Porty lokalne:", "maxEnabledResolution": "send max",
"localport_2": "Porty lokalne:",
"more": "Pokaż więcej", "more": "Pokaż więcej",
"packetloss": "Utrata pakietów:", "packetloss": "Utrata pakietów:",
"quality": { "quality": {
@ -97,17 +120,14 @@
"nonoptimal": "Nieoptymalne", "nonoptimal": "Nieoptymalne",
"poor": "Słabe" "poor": "Słabe"
}, },
"remoteaddress_0": "Adres zdalny:", "remoteaddress": "Adres zdalny:",
"remoteaddress_1": "Adresy zdalne:", "remoteaddress_plural": "Adresy zdalne:",
"remoteaddress_2": "Adresy zdalne:", "remoteport": "Port zdalny:",
"remoteport_0": "Port zdalny:", "remoteport_plural": "Porty zdalne:",
"remoteport_1": "Porty zdalne:",
"remoteport_2": "Porty zdalne:",
"resolution": "Rozdzielczość:", "resolution": "Rozdzielczość:",
"status": "Połączenie:", "status": "Połączenie:",
"transport_0": "Transport:", "transport": "Transport:",
"transport_1": "Transporty:", "transport_plural": "Transporty:"
"transport_2": "Transporty:"
}, },
"dateUtils": { "dateUtils": {
"earlier": "Wcześniej", "earlier": "Wcześniej",
@ -119,13 +139,15 @@
"description": "Nic się nie wydarzyło? Spróbowaliśmy uruchomić Twoje spotkanie w aplikacji stacjonarnej {{app}}. Spróbuj ponownie lub uruchom spotkanie w aplikacji webowej {{app}}.", "description": "Nic się nie wydarzyło? Spróbowaliśmy uruchomić Twoje spotkanie w aplikacji stacjonarnej {{app}}. Spróbuj ponownie lub uruchom spotkanie w aplikacji webowej {{app}}.",
"descriptionWithoutWeb": "Nic się nie wydarzyło? Spróbowaliśmy uruchomić Twoje spotkanie w aplikacji stacjonarnej {{app}}.", "descriptionWithoutWeb": "Nic się nie wydarzyło? Spróbowaliśmy uruchomić Twoje spotkanie w aplikacji stacjonarnej {{app}}.",
"downloadApp": "Pobierz aplikację", "downloadApp": "Pobierz aplikację",
"ifDoNotHaveApp": "Jeśli nie masz jeszcze aplikacji:",
"ifHaveApp": "Jeśli już masz aplikację:",
"joinInApp": "Dołącz do spotkania używając aplikacji",
"launchWebButton": "Uruchom przez przeglądarkę", "launchWebButton": "Uruchom przez przeglądarkę",
"openApp": "Kontynuuj w aplikacji",
"title": "Trwa uruchamianie Twojego spotkania w {{app}}…", "title": "Trwa uruchamianie Twojego spotkania w {{app}}…",
"tryAgainButton": "Spróbuj ponownie w aplikacji stacjonarnej" "tryAgainButton": "Spróbuj ponownie w aplikacji stacjonarnej"
}, },
"defaultLink": "np. {{url}}", "defaultLink": "np. {{url}}",
"defaultNickname": "np. Ziutek Kowalski", "defaultNickname": "np. Jan Kowalski",
"deviceError": { "deviceError": {
"cameraError": "Błąd dostępu do Twojej kamery", "cameraError": "Błąd dostępu do Twojej kamery",
"cameraPermission": "Błąd podczas otrzymywania uprawnień do kamery", "cameraPermission": "Błąd podczas otrzymywania uprawnień do kamery",
@ -142,6 +164,7 @@
"accessibilityLabel": { "accessibilityLabel": {
"liveStreaming": "Transmisja na żywo" "liveStreaming": "Transmisja na żywo"
}, },
"add": "Dodaj",
"allow": "Pozwól", "allow": "Pozwól",
"alreadySharedVideoMsg": "Inny użytkownik już prezentuje wideo. Ta konferencja pozwala tylko na prezentację jednego wideo w tym samym czasie.", "alreadySharedVideoMsg": "Inny użytkownik już prezentuje wideo. Ta konferencja pozwala tylko na prezentację jednego wideo w tym samym czasie.",
"alreadySharedVideoTitle": "Tylko jedna prezentacja wideo jest dozwolona w tym samym czasie", "alreadySharedVideoTitle": "Tylko jedna prezentacja wideo jest dozwolona w tym samym czasie",
@ -168,20 +191,24 @@
"connecting": "Nawiązywanie połączenia", "connecting": "Nawiązywanie połączenia",
"contactSupport": "Skontaktuj się ze wsparciem", "contactSupport": "Skontaktuj się ze wsparciem",
"copy": "Kopiuj", "copy": "Kopiuj",
"copied": "Skopiowano",
"dismiss": "Odrzuć", "dismiss": "Odrzuć",
"displayNameRequired": "Cześć! Jak się nazywasz?", "displayNameRequired": "Cześć! Jak się nazywasz?",
"done": "Zrobione", "done": "Zrobione",
"e2eeDescription": "Szyfrowanie End-to-End jest aktualnie w fazie EKSPERYMENTALNEJ. Proszę mieć na uwadze fakt, że szyfrowanie end-to-end wyłączy oferowane przez serwer usługi takie jak: nagrywanie, streaming na żywo i dołączanie uczestników przez telefon. Proszę mieć również na uwadze fakt, że takie spotkanie zadziałą tylko dla uczestników korzystających z przeglądarek wspierających wstawiane strumienie.",
"e2eeLabel": "Klucz E2EE",
"e2eeNoKey": "brak",
"e2eeToggleSet": "Ustaw klucz",
"e2eeSet": "Ustaw",
"e2eeWarning": "UWAGA: Niektórzy uczestnicy tego spotkania nie mają włączonej obsługi szyfrowania E2EE. Jeśli włączysz tą funkcję ci uczestnicy nie będą mieli z tobą kontaktu.",
"enterDisplayName": "Wpisz tutaj swoje imię", "enterDisplayName": "Wpisz tutaj swoje imię",
"error": "Błąd", "error": "Błąd",
"externalInstallationMsg": "Zainstaluj rozszerzenie naszego współdzielenia ekranu.", "gracefulShutdown": "Usługa aktualnie jest niedostępna. Prosze spróbować później.",
"externalInstallationTitle": "Wymagane rozszerzenie", "grantModeratorDialog": "Czy na pewno chcesz przyznać temu uczestnikowi prawa moderatora?",
"goToStore": "Idź do sklepu", "grantModeratorTitle": "Przyznaj prawa moderatora",
"gracefulShutdown": "Aktualnie serwis jest konserwowany. Prosze spróbować później.",
"IamHost": "Jestem gospodarzem", "IamHost": "Jestem gospodarzem",
"incorrectRoomLockPassword": "Hasło nieprawidłowe", "incorrectRoomLockPassword": "Hasło nieprawidłowe",
"incorrectPassword": "Niepoprawna nazwa użytkownika lub hasło", "incorrectPassword": "Niepoprawna nazwa użytkownika lub hasło",
"inlineInstallationMsg": "Zainstaluj rozszerzenie naszego współdzielenia ekranu.",
"inlineInstallExtension": "Zainstaluj teraz",
"internalError": "Ups! Coś poszło nie tak. Wystąpił następujący błąd: {{error}}", "internalError": "Ups! Coś poszło nie tak. Wystąpił następujący błąd: {{error}}",
"internalErrorTitle": "Błąd wewnętrzny", "internalErrorTitle": "Błąd wewnętrzny",
"kickMessage": "Możesz skontaktować się z {{participantDisplayName}}, aby uzyskać więcej szczegółów.", "kickMessage": "Możesz skontaktować się z {{participantDisplayName}}, aby uzyskać więcej szczegółów.",
@ -189,7 +216,8 @@
"kickParticipantDialog": "Czy na pewno chcesz usunąć tego uczestnika?", "kickParticipantDialog": "Czy na pewno chcesz usunąć tego uczestnika?",
"kickParticipantTitle": "Usunąć tego uczestnika?", "kickParticipantTitle": "Usunąć tego uczestnika?",
"kickTitle": "Ups! {{participantDisplayName}} usunął Cię z tego spotkania", "kickTitle": "Ups! {{participantDisplayName}} usunął Cię z tego spotkania",
"liveStreaming": "Strumień live", "liveStreaming": "Strumień na żywo",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Nie możliwe podczas aktywnego nagrywania",
"liveStreamingDisabledForGuestTooltip": "Goście nie mogą używać transmisji na żywo.", "liveStreamingDisabledForGuestTooltip": "Goście nie mogą używać transmisji na żywo.",
"liveStreamingDisabledTooltip": "Rozpoczęcie transmisji na żywo jest wyłączone.", "liveStreamingDisabledTooltip": "Rozpoczęcie transmisji na żywo jest wyłączone.",
"lockMessage": "Zabezpieczenie konferencji nie powiodło się.", "lockMessage": "Zabezpieczenie konferencji nie powiodło się.",
@ -205,6 +233,12 @@
"micNotSendingDataTitle": "Twój mikrofon jest wyciszony przez ustawienia systemowe", "micNotSendingDataTitle": "Twój mikrofon jest wyciszony przez ustawienia systemowe",
"micPermissionDeniedError": "Nie udzieliłeś pozwolenia na użycie twojego mikrofonu. Nadal możesz uczestniczyc w konferencji ale inni nie będą cię słyszeli. Użyj przycisku kamera aby to naprawić.", "micPermissionDeniedError": "Nie udzieliłeś pozwolenia na użycie twojego mikrofonu. Nadal możesz uczestniczyc w konferencji ale inni nie będą cię słyszeli. Użyj przycisku kamera aby to naprawić.",
"micUnknownError": "Z nieznanej przyczyny nie można użyć mikrofonu.", "micUnknownError": "Z nieznanej przyczyny nie można użyć mikrofonu.",
"muteEveryoneElseDialog": "Gdy wyciszysz wszystkich nie będziesz miał możliwości wyłączyć ich wyciszenia, ale oni będą mogli samodzielnie wyłączyć wyciszenie w dowolnym momencie.",
"muteEveryoneElseTitle": "Wyciszyć wszystkich za wyjątkiem {{whom}}?",
"muteEveryoneDialog": "Czy na pewno wyciszyć wszystkich? Nie będziesz miał możliwości wyłączyć ich wyciszenia, ale oni będą mogli samodzielnie wyłączyć wyciszenie w dowolnym momencie.",
"muteEveryoneTitle": "Wyciszyć wszystkich?",
"muteEveryoneSelf": "siebie",
"muteEveryoneStartMuted": "Od tego momentu wszyscy są wyciszeni",
"muteParticipantBody": "Nie możesz wyłączyć ich wyciszenia, ale oni mogą samodzielnie wyłączyć wyciszenie w dowolnym momencie.", "muteParticipantBody": "Nie możesz wyłączyć ich wyciszenia, ale oni mogą samodzielnie wyłączyć wyciszenie w dowolnym momencie.",
"muteParticipantButton": "Wyciszenie", "muteParticipantButton": "Wyciszenie",
"muteParticipantDialog": "Czy na pewno wyciszyć tego uczestnika? Nie będziesz mógł wyłączyć wyciszenia uczestników, ale oni mogą samodzielnie wyłączyć wyciszenie w dowolnym momencie.", "muteParticipantDialog": "Czy na pewno wyciszyć tego uczestnika? Nie będziesz mógł wyłączyć wyciszenia uczestników, ale oni mogą samodzielnie wyłączyć wyciszenie w dowolnym momencie.",
@ -216,9 +250,11 @@
"passwordRequired": "$t(lockRoomPasswordUppercase) jest wymagane", "passwordRequired": "$t(lockRoomPasswordUppercase) jest wymagane",
"popupError": "Twoja przeglądarka blokuje wyskakujące okienka pochodzące z tej witryny. Włącz wyświetlanie wyskakujących okienek w ustawieniach bezpieczeństwa Twojej przeglądarki i spróbuj ponownie.", "popupError": "Twoja przeglądarka blokuje wyskakujące okienka pochodzące z tej witryny. Włącz wyświetlanie wyskakujących okienek w ustawieniach bezpieczeństwa Twojej przeglądarki i spróbuj ponownie.",
"popupErrorTitle": "Wyskakujące okienko zostało zablokowane", "popupErrorTitle": "Wyskakujące okienko zostało zablokowane",
"readMore": "więcej",
"recording": "Nagrywanie", "recording": "Nagrywanie",
"recordingDisabledForGuestTooltip": "Goście nie mogą rozpocząć nagrywania.", "recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Nie możliwe podczas aktywnej transmisji na żywo",
"recordingDisabledTooltip": "Rozpoczęcie nagrywania wyłączone.", "recordingDisabledForGuestTooltip": "Goście nie mogą uruchamiać nagrywania.",
"recordingDisabledTooltip": "Start recording disabled.",
"rejoinNow": "Połącz ponownie teraz", "rejoinNow": "Połącz ponownie teraz",
"remoteControlAllowedMessage": "{{user}} zaakceptował Twoją prośbę o kontrolę zdalną!", "remoteControlAllowedMessage": "{{user}} zaakceptował Twoją prośbę o kontrolę zdalną!",
"remoteControlDeniedMessage": "{{user}} odrzucił Twoją prośbę o kontrolę zdalną!", "remoteControlDeniedMessage": "{{user}} odrzucił Twoją prośbę o kontrolę zdalną!",
@ -229,27 +265,26 @@
"remoteControlTitle": "Zdalna kontrola komputera", "remoteControlTitle": "Zdalna kontrola komputera",
"Remove": "Usuń", "Remove": "Usuń",
"removePassword": "Usuń $t(lockRoomPassword)", "removePassword": "Usuń $t(lockRoomPassword)",
"removeSharedVideoMsg": "Na pewno chcesz usunąć współdzielone wideo?", "removeSharedVideoMsg": "Na pewno chcesz usunąć udostępnione wideo?",
"removeSharedVideoTitle": "Usuń wideo współdzielone", "removeSharedVideoTitle": "Usuń wideo udostępnione",
"reservationError": "Błąd systemu rezerwacji", "reservationError": "Błąd systemu rezerwacji",
"reservationErrorMsg": "Kod błędu: {{code}}, treść: {{msg}}", "reservationErrorMsg": "Kod błędu: {{code}}, treść: {{msg}}",
"retry": "Ponów", "retry": "Ponów",
"screenSharingFailedToInstall": "Ups! Nie udało się zainstalować wtyczki do współdzielenia ekranu.", "screenSharingAudio": "Udostępnianie audio",
"screenSharingFailedToInstallTitle": "Nie udało się zainstalować wtyczki do współdzielenia ekranu", "screenSharingFailed": "Oops! Coś poszło nie tak. Nie można uruchomić udostępniania ekranu!",
"screenSharingFirefoxPermissionDeniedError": "Coś poszło nie tak podczas próby współdzielenia Twojego ekranu. Upewnij się, że udzieliłeś zgody na tą próbę. ", "screenSharingFailedTitle": "Niepowodzenie udostępniania ekranu!",
"screenSharingFirefoxPermissionDeniedTitle": "Ups! Nie byliśmy w stanie rozpocząć współdzielenia ekranu!", "screenSharingPermissionDeniedError": "Oops! Coś poszło nie tak z uprawnieniami udostępniania ekranu. Odśwież stronę i spróbuj ponownie.",
"screenSharingPermissionDeniedError": "Ups! Coś poszło nie tak z prawami dostępu do wtyczki współdzielenia ekranu. Wczytaj ponownie i spróbuj jeszcze raz.",
"sendPrivateMessage": "Niedawno otrzymałeś prywatną wiadomość. Czy zamierzałeś odpowiedzieć na nią prywatnie, czy chcesz wysłać wiadomość do grupy?", "sendPrivateMessage": "Niedawno otrzymałeś prywatną wiadomość. Czy zamierzałeś odpowiedzieć na nią prywatnie, czy chcesz wysłać wiadomość do grupy?",
"sendPrivateMessageCancel": "Wyślij do grupy", "sendPrivateMessageCancel": "Wyślij do grupy",
"sendPrivateMessageOk": "Wyślij prywatnie", "sendPrivateMessageOk": "Wyślij prywatnie",
"sendPrivateMessageTitle": "Wysłać prywatnie?", "sendPrivateMessageTitle": "Wysłać prywatnie?",
"serviceUnavailable": "Usługa jest niedostępna", "serviceUnavailable": "Usługa jest niedostępna",
"sessTerminated": "Połączenie przerwane", "sessTerminated": "Połączenie przerwane",
"Share": "Współdziel", "Share": "Udostępnij",
"shareVideoLinkError": "Podaj proszę prawidłowy link youtube.", "shareVideoLinkError": "Podaj proszę prawidłowy link youtube.",
"shareVideoTitle": "Współdziel wideo", "shareVideoTitle": "Udostępnij wideo",
"shareYourScreen": "Włącz współdzielenie ekranu", "shareYourScreen": "Włącz udostępnianie ekranu",
"shareYourScreenDisabled": "Współdzielenie ekranu wyłączone.", "shareYourScreenDisabled": "Udostępnianie ekranu wyłączone.",
"shareYourScreenDisabledForGuest": "Goście nie mogą współdzielić ekranu.", "shareYourScreenDisabledForGuest": "Goście nie mogą współdzielić ekranu.",
"startLiveStreaming": "Rozpocznij transmisję na żywo", "startLiveStreaming": "Rozpocznij transmisję na żywo",
"startRecording": "Rozpocznij nagrywanie", "startRecording": "Rozpocznij nagrywanie",
@ -267,8 +302,8 @@
"transcribing": "Transkrypcja", "transcribing": "Transkrypcja",
"unlockRoom": "Usuń spotkanie $t(lockRoomPassword)", "unlockRoom": "Usuń spotkanie $t(lockRoomPassword)",
"userPassword": "hasło użytkownika", "userPassword": "hasło użytkownika",
"WaitForHostMsg": "Konferencja <b>{{room}}</b> jeszcze się nie rozpoczęła. Jeśli jesteś gospodarzem, prosimy o uwierzytelnienie. Jeśli nie, prosimy czekać na przybycie gospodarza.", "WaitForHostMsg": "Spotkanie <b>{{room}}</b> jeszcze się nie rozpoczęło. Jeśli jesteś gospodarzem, prosimy o uwierzytelnienie. Jeśli nie, prosimy czekać na przybycie gospodarza.",
"WaitForHostMsgWOk": "Konferencja <b>{{room}}</b> jeszcze się nie zaczęła. Jeśli jesteś jej gospodarzem, wybierz Ok, aby się uwierzytelnić. Jeśli nie, prosimy czekać na przybycie gospodarza.", "WaitForHostMsgWOk": "Spotkanie <b>{{room}}</b> jeszcze się nie rozoczęło. Jeśli jesteś jej gospodarzem, wybierz Ok, aby się uwierzytelnić. Jeśli nie, prosimy czekać na przybycie gospodarza.",
"WaitingForHost": "Oczekiwanie na gospodarza…", "WaitingForHost": "Oczekiwanie na gospodarza…",
"Yes": "Tak", "Yes": "Tak",
"yourEntireScreen": "Cały Twój ekran" "yourEntireScreen": "Cały Twój ekran"
@ -277,7 +312,13 @@
"statusMessage": "jest teraz {{status}}" "statusMessage": "jest teraz {{status}}"
}, },
"documentSharing": { "documentSharing": {
"title": "Współdzielony dokument" "title": "Udostępniony dokument"
},
"e2ee": {
"labelToolTip": "To połączenie audio i wideo jest szyfrowane"
},
"embedMeeting": {
"title": "Osadź to spotkanie"
}, },
"feedback": { "feedback": {
"average": "Średnio", "average": "Średnio",
@ -321,7 +362,7 @@
"noRoom": "Nie podano pokoju do wdzwonienia.", "noRoom": "Nie podano pokoju do wdzwonienia.",
"numbers": "Numery do wdzwonienia", "numbers": "Numery do wdzwonienia",
"password": "$t(lockRoomPasswordUppercase):", "password": "$t(lockRoomPasswordUppercase):",
"title": "Współdziel", "title": "Udostępnij",
"tooltip": "Udostępnij odnośnik i informacje do wdzwonienia się na to spotkanie", "tooltip": "Udostępnij odnośnik i informacje do wdzwonienia się na to spotkanie",
"label": "Poinformuj o spotkaniu" "label": "Poinformuj o spotkaniu"
}, },
@ -349,7 +390,7 @@
"pushToTalk": "Naciśnij, aby mówić", "pushToTalk": "Naciśnij, aby mówić",
"raiseHand": "Podnieś lub opuść rękę", "raiseHand": "Podnieś lub opuść rękę",
"showSpeakerStats": "Pokaż statystyki mówcy", "showSpeakerStats": "Pokaż statystyki mówcy",
"toggleChat": "Otwórz lub zamknij rozmowę", "toggleChat": "Otwórz lub zamknij czat",
"toggleFilmstrip": "Wyświetl lub ukryj miniaturki video", "toggleFilmstrip": "Wyświetl lub ukryj miniaturki video",
"toggleScreensharing": "Przełącz pomiędzy kamerą i wspóldzieleniem ekranu", "toggleScreensharing": "Przełącz pomiędzy kamerą i wspóldzieleniem ekranu",
"toggleShortcuts": "Wyświetl lub ukryj skróty klawiaturowe", "toggleShortcuts": "Wyświetl lub ukryj skróty klawiaturowe",
@ -357,6 +398,8 @@
"videoQuality": "Zarządzanie jakością połączeń" "videoQuality": "Zarządzanie jakością połączeń"
}, },
"liveStreaming": { "liveStreaming": {
"limitNotificationDescriptionWeb": "Ze względu na duże zapotrzebowanie twoje strumieniowanie będzie ograniczone do {{limit}} minut. Aby strumieniować bez ograniczeń wybróbuj <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Twoje strumieniowanie będzie ograniczone do {{limit}} minut. Aby strumieniować bez ograniczeń wybróbuj {{app}}.",
"busy": "Pracujemy nad zwolnieniem zasobów transmisyjnych. Spróbuj ponownie za kilka minut.", "busy": "Pracujemy nad zwolnieniem zasobów transmisyjnych. Spróbuj ponownie za kilka minut.",
"busyTitle": "Wszyscy transmitujący są aktualnie zajęci", "busyTitle": "Wszyscy transmitujący są aktualnie zajęci",
"changeSignIn": "Przełącz konta.", "changeSignIn": "Przełącz konta.",
@ -365,7 +408,7 @@
"enterStreamKey": "Wpisz tutaj swój klucz transmisji na żywo YouTube.", "enterStreamKey": "Wpisz tutaj swój klucz transmisji na żywo YouTube.",
"error": "Transmitowanie na żywo nie powiodło się. Spróbuj ponownie.", "error": "Transmitowanie na żywo nie powiodło się. Spróbuj ponownie.",
"errorAPI": "Wystąpił błąd podczas uzyskiwania dostępu do transmisji w YouTube. Proszę spróbować zalogować się ponownie.", "errorAPI": "Wystąpił błąd podczas uzyskiwania dostępu do transmisji w YouTube. Proszę spróbować zalogować się ponownie.",
"errorLiveStreamNotEnabled": "", "errorLiveStreamNotEnabled": "Strumieniowanie na żywo nie jest włączone dla {{email}}. Proszę włączyć strumieniowanie na żywo lub zalogować się na konto z włączoną funkcją strumieniowania.",
"expandedOff": "Transmisja na żywo została zatrzymana", "expandedOff": "Transmisja na żywo została zatrzymana",
"expandedOn": "Spotkanie jest obecnie transmitowane na YouTube.", "expandedOn": "Spotkanie jest obecnie transmitowane na YouTube.",
"expandedPending": "Transmisja na żywo rozpoczyna się…", "expandedPending": "Transmisja na żywo rozpoczyna się…",
@ -384,7 +427,9 @@
"signOut": "Wyloguj się", "signOut": "Wyloguj się",
"start": "Rozpocznij transmisję na żywo", "start": "Rozpocznij transmisję na żywo",
"streamIdHelp": "Co to jest?", "streamIdHelp": "Co to jest?",
"unavailableTitle": "Transmisja na żywo jest niedostępna" "unavailableTitle": "Transmisja na żywo jest niedostępna",
"youtubeTerms": "Warunki użytkowania YouTube",
"googlePrivacyPolicy": "Polityka prywatności Google"
}, },
"localRecording": { "localRecording": {
"clientState": { "clientState": {
@ -396,17 +441,17 @@
"duration": "Długość", "duration": "Długość",
"durationNA": "N/D", "durationNA": "N/D",
"encoding": "Kodowanie", "encoding": "Kodowanie",
"label": "", "label": "LOR",
"labelToolTip": "Nagrywanie lokalne jest włączone", "labelToolTip": "Nagrywanie lokalne jest włączone",
"localRecording": "Nagrywanie lokalne", "localRecording": "Nagrywanie lokalne",
"me": "To ja", "me": "To ja",
"messages": { "messages": {
"engaged": "Włączono nagrywanie lokalne.", "engaged": "Włączono nagrywanie lokalne.",
"finished": "", "finished": "Sesja nagrywania {{token}} została zakończona. Proszę przesłać nagrane pliki do moderatora.",
"finishedModerator": "", "finishedModerator": "Sesja nagrywania {{token}} została zakończona. Nagranie lokalnej ścieżki zostało zapisane. Poproś pozostałych uczestników, aby przesłali swoje nagrania.",
"notModerator": "Nie jesteś moderatorem. Nie możesz rozpoczynać i zatrzymywać lokalnego nagrywania." "notModerator": "Nie jesteś moderatorem. Nie możesz rozpoczynać i zatrzymywać lokalnego nagrywania."
}, },
"moderator": "Moderujący", "moderator": "Moderator",
"no": "Nie", "no": "Nie",
"participant": "Uczestnik", "participant": "Uczestnik",
"participantStats": "Statystyki uczestników", "participantStats": "Statystyki uczestników",
@ -422,10 +467,10 @@
"connectedOneMember": "{{name}} dołączył do spotkania", "connectedOneMember": "{{name}} dołączył do spotkania",
"connectedThreePlusMembers": "{{name}} i {{count}} innych osób dołączyło do spotkania", "connectedThreePlusMembers": "{{name}} i {{count}} innych osób dołączyło do spotkania",
"connectedTwoMembers": "{{first}} i {{second}} dołączyli do spotkania", "connectedTwoMembers": "{{first}} i {{second}} dołączyli do spotkania",
"disconnected": "rozłączone", "disconnected": "Rozłączono",
"focus": "Fokus konferencji", "focus": "Fokus konferencji",
"focusFail": "{{component}} jest niedostępny - ponowienie w ciągu {{ms}} sec", "focusFail": "{{component}} jest niedostępny - ponowienie w ciągu {{ms}} sec",
"grantedTo": "Prawa moderatora przyznane {{to}}!", "grantedTo": "Prawa moderatora przyznane dla {{to}}!",
"invitedOneMember": "{{name}} został zaproszony", "invitedOneMember": "{{name}} został zaproszony",
"invitedThreePlusMembers": "{{name}} i {{count}} innych osób zostało zaproszone", "invitedThreePlusMembers": "{{name}} i {{count}} innych osób zostało zaproszone",
"invitedTwoMembers": "{{first}} i {{second}} zostali zaproszeni", "invitedTwoMembers": "{{first}} i {{second}} zostali zaproszeni",
@ -442,16 +487,56 @@
"somebody": "Ktoś", "somebody": "Ktoś",
"startSilentTitle": "Dołączyłeś bez wyjścia dźwiękowego!", "startSilentTitle": "Dołączyłeś bez wyjścia dźwiękowego!",
"startSilentDescription": "Ponownie dołącz do spotkania, aby włączyć dźwięk", "startSilentDescription": "Ponownie dołącz do spotkania, aby włączyć dźwięk",
"suboptimalBrowserWarning": "", "suboptimalBrowserWarning": "Obawiamy się, że Twoje wrażenia ze spotkania nie będą zbyt dobre. Staramy się poprawić tą sytuację, a póki co użyj do spotkania jednej z <a href='{{recommendedBrowserPageLink}}' target='_blank'>przeglądarek w pełni obsługiwanych</a>.",
"suboptimalExperienceTitle": "Ostrzeżenie przeglądarki", "suboptimalExperienceTitle": "Ostrzeżenie przeglądarki",
"unmute": "Wyłącz wyciszenie", "unmute": "Wyłącz wyciszenie",
"newDeviceCameraTitle": "Wykryto nową kamerę", "newDeviceCameraTitle": "Wykryto nową kamerę",
"newDeviceAudioTitle": "Wykryto nowe urządzenie dźwiękowe", "newDeviceAudioTitle": "Wykryto nowe urządzenie dźwiękowe",
"newDeviceAction": "Użyj" "newDeviceAction": "Użyj",
"OldElectronAPPTitle": "Luka bezpieczeństwa!",
"oldElectronClientDescription1": "Najprawdopodobniej używasz starej wersji klienta Jitsi Meet, który jest podatny na luki bezpieczeństwa. Proszę zaktualizować do ",
"oldElectronClientDescription2": "najnowszej wersji",
"oldElectronClientDescription3": " teraz!"
}, },
"passwordSetRemotely": "wybrane przez innego uczestnika", "passwordSetRemotely": "wybrane przez innego uczestnika",
"passwordDigitsOnly": "", "passwordDigitsOnly": "Do {{number}} cyfr",
"poweredby": "napędzane dzięki", "poweredby": "napędzane dzięki",
"prejoin": {
"audioAndVideoError": "Błąd audio i wideo:",
"audioOnlyError": "Błąd audio:",
"audioTrackError": "Nie można utworzyć ścieżki audio.",
"calling": "Wybieranie",
"callMe": "Zadzwoń do mnie",
"callMeAtNumber": "Zadzwoń do mnie pod ten numer:",
"configuringDevices": "Konfigurowanie urządzeń...",
"connectedWithAudioQ": "Jesteś połączony głosowo?",
"copyAndShare": "Kopiuj i udostępnij link spotkania",
"dialInMeeting": "Wdzwoń się na spotkanie",
"dialInPin": "Wdzwoń się na spotkanie i wprowadź kod PIN:",
"dialing": "Wybieranie",
"doNotShow": "Nie pokazuj ponownie",
"errorDialOut": "Nie udało się wybrać numeru",
"errorDialOutDisconnected": "Nie udało się wybrać numeru. Rozłączono",
"errorDialOutFailed": "Nie udało się wybrać numeru. Połączenie nieudane",
"errorDialOutStatus": "Błąd podczas uzyskiwania stanu połączenia",
"errorStatusCode": "Błąd wybierania, kod statusu: {{status}}",
"errorValidation": "Weryfikacja numeru zakończona niepowodzeniem",
"iWantToDialIn": "Chcę się wdzwonić",
"joinAudioByPhone": "Dołącz przez telefon",
"joinMeeting": "Dołącz do spotkania",
"joinWithoutAudio": "Dołącz bez dzwięku",
"initiated": "Połączenie zainicjowane",
"linkCopied": "Link skopiowany do schowka",
"lookGood": "Wygląda na to, że Twój mikrofon działa poprawnie",
"or": "lub",
"premeeting": "Przed spotkaniem",
"showScreen": "Włącz ekran Przed spotkaniem",
"startWithPhone": "Uruchom przez telefon",
"screenSharingError": "Błąd udostępniania ekranu:",
"videoOnlyError": "Błąd wideo:",
"videoTrackError": "Nie można utworzyć ścieżki wideo.",
"viewAllNumbers": "zobacz numery"
},
"presenceStatus": { "presenceStatus": {
"busy": "Zajęte", "busy": "Zajęte",
"calling": "Dzwonienie…", "calling": "Dzwonienie…",
@ -474,8 +559,10 @@
}, },
"raisedHand": "Chcesz się odezwać ?", "raisedHand": "Chcesz się odezwać ?",
"recording": { "recording": {
"limitNotificationDescriptionWeb": "Ze względu na duże zapotrzebowanie twoje nagrywanie będzie ograniczone do {{limit}} minut. Aby strumieniować bez ograniczeń wybróbuj <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Ze względu na duże zapotrzebowanie twoje nagrywanie będzie ograniczone do {{limit}} minut. Aby strumieniować bez ograniczeń wybróbuj <3>{{app}}</3>.",
"authDropboxText": "Prześlij na Dropbox", "authDropboxText": "Prześlij na Dropbox",
"availableSpace": "", "availableSpace": "Dostępna przestrzeń: {{spaceLeft}} MB (około {{duration}} minut nagrania)",
"beta": "BETA", "beta": "BETA",
"busy": "Pracujemy nad uwolnieniem zasobów nagrywania. Proszę spróbować ponownie za kilka minut.", "busy": "Pracujemy nad uwolnieniem zasobów nagrywania. Proszę spróbować ponownie za kilka minut.",
"busyTitle": "Wszystkie urządzenia nagrywania są obecnie zajete", "busyTitle": "Wszystkie urządzenia nagrywania są obecnie zajete",
@ -484,7 +571,7 @@
"expandedOn": "Spotkanie jest obecnie nagrywane.", "expandedOn": "Spotkanie jest obecnie nagrywane.",
"expandedPending": "Nagrywanie się rozpoczyna…", "expandedPending": "Nagrywanie się rozpoczyna…",
"failedToStart": "Nagrywanie nie jest możliwe", "failedToStart": "Nagrywanie nie jest możliwe",
"fileSharingdescription": "Współdziel nagranie z uczestnikami spotkania", "fileSharingdescription": "Udostępnij nagranie uczestnikom spotkania",
"live": "NA ŻYWO", "live": "NA ŻYWO",
"loggedIn": "Zalogowano jako {{userName}}", "loggedIn": "Zalogowano jako {{userName}}",
"off": "Nagrywanie zatrzymane", "off": "Nagrywanie zatrzymane",
@ -497,24 +584,31 @@
"serviceName": "Usługa nagrywania", "serviceName": "Usługa nagrywania",
"signIn": "Zaloguj się", "signIn": "Zaloguj się",
"signOut": "Wyloguj się", "signOut": "Wyloguj się",
"unavailable": "", "unavailable": "Ups! {{serviceName}} w tej chwili niedostępny. Próbujemy rozwiązać ten problem. Spróbuj ponownie później.",
"unavailableTitle": "Nagrywanie niedostępne" "unavailableTitle": "Nagrywanie niedostępne"
}, },
"sectionList": { "sectionList": {
"pullToRefresh": "Przeciągnij, aby odświeżyć" "pullToRefresh": "Przeciągnij, aby odświeżyć"
}, },
"security": {
"about": "Możesz dodać a $t(lockRoomPassword) do spotkania. Uczestnicy będą musieli wprowadzić $t(lockRoomPassword) zanim zostaną dołączeni do spotkania.",
"aboutReadOnly": "Uczestnicy posiadający uprawnienia do moderacji mogą ustawić $t(lockRoomPassword) do spotkania. Uczestnicy będą musieli wprowadzić $t(lockRoomPassword) zanim zostaną dołączeni do spotkania.",
"insecureRoomNameWarning": "Nazwa pokoju nie jest bezpieczna. Niepowołaniu uczestnicy mogą dołączyć do spotkania. Proszę rozważyć ustawienie hasła spotkania używając przycisku Opcje zabezpieczeń.",
"securityOptions": "Opcje zabezpieczeń"
},
"settings": { "settings": {
"calendar": { "calendar": {
"about": "", "about": "{{appName}} integracji kalendarza służy do bezpiecznego dostępu do kalendarza, aby można było odczytywać nadchodzące wydarzenia.",
"disconnect": "Rozłącz", "disconnect": "Rozłącz",
"microsoftSignIn": "Zaloguj się z Microsoft", "microsoftSignIn": "Zaloguj się z Microsoft",
"signedIn": "", "signedIn": "Dostęp do wydarzeń kalendarza dla {{email}}. Kliknij poniższy przycisk Rozłącz aby zatrzymać dostęp do wydarzeń kalendarza.",
"title": "Kalendarz" "title": "Kalendarz"
}, },
"devices": "Urządzenia", "devices": "Urządzenia",
"followMe": "Wszyscy widzą mnie", "followMe": "Wszyscy widzą mnie",
"language": "Język", "language": "Język",
"loggedIn": "Zalogowano jako {{name}}", "loggedIn": "Zalogowano jako {{name}}",
"microphones": "Mikrofony",
"moderator": "Moderacja", "moderator": "Moderacja",
"more": "Więcej", "more": "Więcej",
"name": "Nazwa", "name": "Nazwa",
@ -522,41 +616,45 @@
"selectAudioOutput": "Wyjście audio", "selectAudioOutput": "Wyjście audio",
"selectCamera": "Kamera", "selectCamera": "Kamera",
"selectMic": "Mikrofon", "selectMic": "Mikrofon",
"speakers": "Głośniki",
"startAudioMuted": "Wycisz wszystkich dołączających", "startAudioMuted": "Wycisz wszystkich dołączających",
"startVideoMuted": "Ukryj wszystkich dołączających", "startVideoMuted": "Ukryj wszystkich dołączających",
"title": "Ustawienia" "title": "Ustawienia"
}, },
"settingsView": { "settingsView": {
"advanced": "", "advanced": "Zaawansowane",
"alertOk": "OK", "alertOk": "OK",
"alertCancel": "Anuluj",
"alertTitle": "Uwaga", "alertTitle": "Uwaga",
"alertURLText": "Wprowadzony adres URL serwera jest nieprawidłowy", "alertURLText": "Wprowadzony adres URL serwera jest nieprawidłowy",
"buildInfoSection": "Informacja o kompilacji", "buildInfoSection": "Informacja o kompilacji",
"conferenceSection": "Konferencja", "conferenceSection": "Konferencja",
"disableCallIntegration": "", "disableCallIntegration": "Wyłącz natywną integrację połczeń tel.",
"disableP2P": "", "disableP2P": "Wyłącz tryb Peer-To-Peer",
"disableCrashReporting": "Wyłącz raportowanie błędów",
"disableCrashReportingWarning": "Czy na pewno chcesz wyłączyć raportowanie błędów? Ustawienie zacznie funkcjonować po restarcie aplikacji.",
"displayName": "Wyświetlana nazwa", "displayName": "Wyświetlana nazwa",
"email": "E-mail", "email": "E-mail",
"header": "Ustawienia", "header": "Ustawienia",
"profileSection": "Profil", "profileSection": "Profil",
"serverURL": "Adres URL serwera", "serverURL": "Adres URL serwera",
"showAdvanced": "", "showAdvanced": "Pokaż ustawienia zawansowane",
"startWithAudioMuted": "Rozpocznij z wyciszonym dźwiękiem", "startWithAudioMuted": "Rozpocznij z wyciszonym dźwiękiem",
"startWithVideoMuted": "Rozpocznij z wyłączonym obrazem", "startWithVideoMuted": "Rozpocznij z wyłączonym obrazem",
"version": "Wersja" "version": "Wersja"
}, },
"share": { "share": {
"dialInfoText": "", "dialInfoText": "\n\n=====\n\nChcesz wdzwonić się ze swojego telefonu?\n\n{{defaultDialInNumber}}Kliknij w ten link aby zobaczyć numery wdzwaniania na to spotkanie\n{{dialInfoPageUrl}}",
"mainText": "Kliknij na poniższy odnośnik, aby dołączyć do spotkania:\n{{roomUrl}}" "mainText": "Kliknij na poniższy odnośnik, aby dołączyć do spotkania:\n{{roomUrl}}"
}, },
"speaker": "Głośnik", "speaker": "Mówca",
"speakerStats": { "speakerStats": {
"hours": "{{count}} godz.", "hours": "{{count}} godz.",
"minutes": "{{count}} min.", "minutes": "{{count}} min.",
"name": "Nazwa", "name": "Nazwa",
"seconds": "{{count}} sek.", "seconds": "{{count}} sek.",
"speakerStats": "Statystyki mówców", "speakerStats": "Statystyki mówców",
"speakerTime": "" "speakerTime": "Czas mówcy"
}, },
"startupoverlay": { "startupoverlay": {
"policyText": " ", "policyText": " ",
@ -576,70 +674,89 @@
"chat": "Przełączanie okna rozmowy", "chat": "Przełączanie okna rozmowy",
"document": "Przełączanie wspólnego dokumentu", "document": "Przełączanie wspólnego dokumentu",
"download": "Pobierz nasze aplikacje", "download": "Pobierz nasze aplikacje",
"embedMeeting": "Osadź spotkanie",
"e2ee": "Szyfrowanie End-to-End",
"feedback": "Zostaw swoją opinię", "feedback": "Zostaw swoją opinię",
"fullScreen": "Przełączanie trybu pełnoekranowego", "fullScreen": "Przełączanie trybu pełnoekranowego",
"grantModerator": "Przyznaj prawa moderowania",
"hangup": "Zostaw rozmowę", "hangup": "Zostaw rozmowę",
"help": "Pomoc", "help": "Pomoc",
"invite": "Zapraszaj ludzi", "invite": "Zaproś uczestników",
"kick": "Usuń uczestnika", "kick": "Usuń uczestnika",
"lobbyButton": "Włącz/wyłącz tryb lobby",
"localRecording": "Przełączanie lokalnych urządzeń sterujących zapisem danych", "localRecording": "Przełączanie lokalnych urządzeń sterujących zapisem danych",
"lockRoom": "Przełączenie hasła spotkania", "lockRoom": "Przełączenie hasła spotkania",
"moreActions": "Przełączanie menu więcej działań", "moreActions": "Przełączanie menu więcej działań",
"moreActionsMenu": "Więcej działań w menu", "moreActionsMenu": "Więcej działań w menu",
"moreOptions": "Pokaż więcej opcji",
"mute": "Uruchamianie wyciszonego audycji", "mute": "Uruchamianie wyciszonego audycji",
"muteEveryone": "Wycisz wszystkich",
"pip": "Tryb przełączania obrazu-w-obrazie", "pip": "Tryb przełączania obrazu-w-obrazie",
"privateMessage": "Wyślij wiadomość prywatną", "privateMessage": "Wyślij wiadomość prywatną",
"profile": "Edytuj swój profil", "profile": "Edytuj swój profil",
"raiseHand": "Przełączyć rękę w górę", "raiseHand": "Przełączyć rękę w górę",
"recording": "Przełączanie nagrywania", "recording": "Przełączanie nagrywania",
"remoteMute": "Wycisz uczestnika", "remoteMute": "Wycisz uczestnika",
"security": "Opcje zabezpieczeń",
"Settings": "Ustawienia przełączania", "Settings": "Ustawienia przełączania",
"sharedvideo": "Przełącz udostępnianie obrazu na YouTube", "sharedvideo": "Przełącz udostępnianie obrazu na YouTube",
"shareRoom": "Zaproś kogoś", "shareRoom": "Zaproś kogoś",
"shareYourScreen": "Przełączanie podziału ekranu", "shareYourScreen": "Przełączanie podziału ekranu",
"shortcuts": "Przełączanie skrótów klawiszowych", "shortcuts": "Przełączanie skrótów klawiszowych",
"show": "", "show": "Pokaż na scenie",
"speakerStats": "Przełączanie statystyk dotyczących mówców", "speakerStats": "Przełączanie statystyk dotyczących mówców",
"tileView": "Przełącz widok kafelkowy", "tileView": "Przełącz widok kafelkowy",
"toggleCamera": "Przełączanie kamery", "toggleCamera": "Przełączanie kamery",
"toggleFilmstrip": "Przełącz filmstrip",
"videomute": "Przełączanie wyciszonego filmu wideo", "videomute": "Przełączanie wyciszonego filmu wideo",
"videoblur": "Przełącz rozmazanie obrazu" "videoblur": "Przełącz rozmazanie obrazu"
}, },
"addPeople": "Dodaj ludzi do swojego telefonu", "addPeople": "Dodaj ludzi do swojej rozmowy",
"audioOnlyOff": "Wyłącz tryb słabego łącza", "audioOnlyOff": "Wyłącz tryb słabego łącza",
"audioOnlyOn": "Włącz tryb słabego łącza", "audioOnlyOn": "Włącz tryb słabego łącza",
"audioRoute": "Wybierz urządzenie dźwiękowe", "audioRoute": "Wybierz urządzenie dźwiękowe",
"authenticate": "Uwierzytelnianie", "authenticate": "Uwierzytelnianie",
"callQuality": "Zarządzanie jakością obrazu", "callQuality": "Zarządzanie jakością obrazu",
"chat": "Otwórz / Zamknij rozmowę", "chat": "Otwórz / Zamknij okno czatu",
"closeChat": "Zamknij rozmowę", "closeChat": "Zamknij czat",
"documentClose": "Zamknij wspólny dokument", "documentClose": "Zamknij udostępniony dokument",
"documentOpen": "Otwarty współdzielony dokument", "documentOpen": "Otwarty udostępniony dokument",
"download": "Pobierz nasze aplikacje", "download": "Pobierz nasze aplikacje",
"enterFullScreen": "Wyświetlanie pełnego ekranu", "e2ee": "Szyfrowanie End-to-End",
"enterTileView": "Wejdź w kafelkowy widok", "embedMeeting": "Osadź spotkanie",
"exitFullScreen": "Wyświetlanie pełnego ekranu", "enterFullScreen": "Wyświetl na pełnym ekranie",
"exitTileView": "Wyjdź z kafelkowego widoku", "enterTileView": "Wyświetl widok kafelkowy",
"exitFullScreen": "Zamknij pełny ekran",
"exitTileView": "Zamknij widok kafelkowy",
"feedback": "Zostaw swoją opinię", "feedback": "Zostaw swoją opinię",
"hangup": "Opuść", "hangup": "Opuść spotkanie",
"help": "Pomoc", "help": "Pomoc",
"invite": "Zapraszaj ludzi", "invite": "Zaproś uczestników",
"lobbyButtonDisable": "Wyłącz tryb lobby",
"lobbyButtonEnable": "Włącz tryb lobby",
"login": "Zaloguj", "login": "Zaloguj",
"logout": "Wyloguj", "logout": "Wyloguj",
"lowerYourHand": "Opuść rękę", "lowerYourHand": "Opuść rękę",
"moreActions": "Więcej działań", "moreActions": "Więcej działań",
"moreOptions": "Więcej opcji",
"mute": "Włącz / Wyłącz mikrofon", "mute": "Włącz / Wyłącz mikrofon",
"noAudioSignalTitle": "", "muteEveryone": "Wycisz wszystkich",
"noAudioSignalDesc": "", "noAudioSignalTitle": "Brak sygnału audio!",
"noAudioSignalDescSuggestion": "", "noAudioSignalDesc": "Jeżeli celowo nie wyciszyłeś mikrofonu w ustawieniach systemowych spróbuj innego urządzenia.",
"openChat": "Otwórz rozmowę", "noAudioSignalDescSuggestion": "Jeżeli celowo nie wyciszyłeś mikrofonu w ustawieniach systemowych spróbuj sugerowanego urządzenia.",
"noAudioSignalDialInDesc": "Możesz się również wdzwonić korzystając z numerów:",
"noAudioSignalDialInLinkDesc": "Numery wdzwaniania",
"noisyAudioInputTitle": "Twój mikrofon powoduje zakłócenia!",
"noisyAudioInputDesc": "Wygląda na to, że Twój mikrofon powoduje zakłócenia.",
"openChat": "Otwórz czat",
"pip": "Wprowadź tryb obrazu w obrazie", "pip": "Wprowadź tryb obrazu w obrazie",
"privateMessage": "Wyślij wiadomość prywatną", "privateMessage": "Wyślij wiadomość prywatną",
"profile": "Edytuj swój profil", "profile": "Edytuj swój profil",
"raiseHand": "Podnieś / Opuść rękę", "raiseHand": "Podnieś / Opuść rękę",
"raiseYourHand": "Podnieś rękę", "raiseYourHand": "Podnieś rękę",
"security": "Opcje zabezpieczeń",
"Settings": "Ustawienia", "Settings": "Ustawienia",
"sharedvideo": "Udostępnij wideo w Youtube", "sharedvideo": "Udostępnij wideo z Youtube",
"shareRoom": "Zaproś kogoś", "shareRoom": "Zaproś kogoś",
"shortcuts": "Wyświetl skróty", "shortcuts": "Wyświetl skróty",
"speakerStats": "Statystyki mówców", "speakerStats": "Statystyki mówców",
@ -657,7 +774,7 @@
}, },
"transcribing": { "transcribing": {
"ccButtonTooltip": "Uruchom / Zatrzymaj napisy", "ccButtonTooltip": "Uruchom / Zatrzymaj napisy",
"error": "Przepisywanie się nie powiodło. Proszę spróbować ponownie.", "error": "Przepisywanie nie powiodło się. Proszę spróbować ponownie.",
"expandedLabel": "Transkrypcja jest obecnie włączona", "expandedLabel": "Transkrypcja jest obecnie włączona",
"failedToStart": "Błąd uruchomienia transkrypcji", "failedToStart": "Błąd uruchomienia transkrypcji",
"labelToolTip": "Spotkanie jest transkrybowane", "labelToolTip": "Spotkanie jest transkrybowane",
@ -680,7 +797,7 @@
"safariGrantPermissions": "Wybierz <b><i>OK</i></b>, gdy przegladarka zapyta o pozwolenie." "safariGrantPermissions": "Wybierz <b><i>OK</i></b>, gdy przegladarka zapyta o pozwolenie."
}, },
"videoSIPGW": { "videoSIPGW": {
"busy": "", "busy": "Pracujemy nad uwolnieniem zasobów. Prosimy spróbować za kilka minut.",
"busyTitle": "Usługa pokoju jest obecnie zajęta", "busyTitle": "Usługa pokoju jest obecnie zajęta",
"errorAlreadyInvited": "{{displayName}} jest już zaproszony", "errorAlreadyInvited": "{{displayName}} jest już zaproszony",
"errorInvite": "Konferencja nie została jeszcze ustanowiona. Prosimy spróbować ponownie później.", "errorInvite": "Konferencja nie została jeszcze ustanowiona. Prosimy spróbować ponownie później.",
@ -709,13 +826,15 @@
}, },
"videothumbnail": { "videothumbnail": {
"domute": "Wyciszenie", "domute": "Wyciszenie",
"domuteOthers": "Wycisz pozostałych",
"flip": "Odwrócenie", "flip": "Odwrócenie",
"grantModerator": "Przyznaj prawa moderatora",
"kick": "Wyrzuć", "kick": "Wyrzuć",
"moderator": "Moderujący", "moderator": "Moderator",
"mute": "Uczestnik ma wyciszone audio", "mute": "Uczestnik ma wyciszone audio",
"muted": "Wyciszony", "muted": "Wyciszony",
"remoteControl": "Kontrola zdalna", "remoteControl": "Kontrola zdalna",
"show": "", "show": "Pokaż na scenie",
"videomute": "Uczestnik zatrzymał kamerę" "videomute": "Uczestnik zatrzymał kamerę"
}, },
"welcomepage": { "welcomepage": {
@ -730,22 +849,64 @@
}, },
"calendar": "Kalendarz", "calendar": "Kalendarz",
"connectCalendarButton": "Podłącz swój kalendarz", "connectCalendarButton": "Podłącz swój kalendarz",
"connectCalendarText": "", "connectCalendarText": "Podłącz swój kalendarz aby przeglądać wszystkie Twoje spotkania w {{app}}. Dodaj spotkania {{provider}} do swojego kalendarza i uruchamiaj je jednym kliknięciem.",
"enterRoomTitle": "Rozpocznij nowe spotkanie", "enterRoomTitle": "Rozpocznij nowe spotkanie",
"roomNameAllowedChars": "Nazwa spotkania nie powinna zawierać żadnego z tych znaków: ?, &, :, ', \", %, #.", "getHelp": "Pomoc",
"go": "IDŹ", "go": "Dalej",
"goSmall": "IDŹ", "goSmall": "Dalej",
"join": "",
"info": "Informacje", "info": "Informacje",
"join": "Utwórz / Dołącz",
"moderatedMessage": "lub <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">zarezerwuj adres spotkania</a> jeśli jesteś jedynym moderatorem.",
"privacy": "Polityka prywatności", "privacy": "Polityka prywatności",
"recentList": "Niedawno", "recentList": "Niedawno",
"recentListDelete": "Usuń", "recentListDelete": "Usuń",
"recentListEmpty": "Twoja ostatnia lista jest obecnie pusta. Rozmawiaj ze swoim zespołem, a wszystkie ostatnie spotkania znajdziesz tutaj.", "recentListEmpty": "Twoja ostatnia lista jest obecnie pusta. Rozmawiaj ze swoim zespołem, a wszystkie ostatnie spotkania znajdziesz tutaj.",
"reducedUIText": "Witamy w {{app}}!", "reducedUIText": "Witamy w {{app}}!",
"roomNameAllowedChars": "Nazwa spotkania nie powinna zawierać znaków: ?, &, :, ', \", %, #.",
"roomname": "Podaj nazwę sali konferencyjnej", "roomname": "Podaj nazwę sali konferencyjnej",
"roomnameHint": "Wprowadź nazwę lub adres URL pokoju, do którego chcesz dołączyć. Możesz wymyślić nazwę, po prostu pozwól, aby osoby, z którymi się spotykasz, znały ją tak, aby wpisały tę samą nazwę.", "roomnameHint": "Wprowadź nazwę lub adres URL pokoju, do którego chcesz dołączyć. Możesz wymyślić nazwę, po prostu pozwól, aby osoby, z którymi się spotykasz, znały ją tak, aby wpisały tę samą nazwę.",
"sendFeedback": "Wyślij opinię", "sendFeedback": "Wyślij opinię",
"terms": "Warunki korzystania", "terms": "Warunki korzystania",
"title": "Bezpieczna, w pełni funkcjonalna i całkowicie bezpłatna wideokonferencja" "title": "Bezpieczna, w pełni funkcjonalna i całkowicie bezpłatna wideokonferencja"
},
"lonelyMeetingExperience": {
"button": "Zaproś innych uczestników",
"youAreAlone": "Tylko ty uczestniczysz w tym spotkaniu"
},
"helpView": {
"header": "Centrum pomocy"
},
"lobby": {
"knockingParticipantList": "Oczekujący uczestnicy",
"allow": "Zezwól",
"backToKnockModeButton": "Brak hasła, poproś o dołączenie",
"dialogTitle": "Lobby",
"disableDialogContent": "Lobby jest aktualnie włączone. Ta funkcjonalność zapewnia, że niechciani uczetnicy nie mogą dołączyć do spotkania. Czy chcesz wyłączyć tę opcję?",
"disableDialogSubmit": "Wyłącz",
"emailField": "Podaj adres email",
"enableDialogPasswordField": "Ustaw hasło (opcjonalne)",
"enableDialogSubmit": "Włącz",
"enableDialogText": "Lobby umożliwia zabezpieczenie spotkania przed dostępem niechcianych osób. Uczestnik może dołączyć do spotkania tylko po zaakceptowaniu przez moderatora.",
"enterPasswordButton": "Hasło spotkania",
"enterPasswordTitle": "Wprowadź hasło aby dołączyć",
"invalidPassword": "Nieprawidłowe hasło",
"joiningMessage": "Dołączysz do spotkania po zaakceptowaniu Twojej prośby",
"joinWithPasswordMessage": "Dołączanie z hasłem, proszę czekać...",
"joinRejectedMessage": "Twoja prośba została odrzucona przez moderatora.",
"joinTitle": "Dołącz do spotkania",
"joiningTitle": "Dołączanie do spotkania...",
"joiningWithPasswordTitle": "Dołączanie z hasłem...",
"knockButton": "Poproś o dołączenie",
"knockTitle": "Ktoś chce dołączyć do spotkania",
"nameField": "Podaj swoje imię",
"notificationLobbyAccessDenied": "{{targetParticipantName}} został odrzucony przez {{originParticipantName}}",
"notificationLobbyAccessGranted": "{{targetParticipantName}} został zaakceptowany przez {{originParticipantName}}",
"notificationLobbyDisabled": "Lobby zostało wyłączone przez {{originParticipantName}}",
"notificationLobbyEnabled": "Lobby zostało włączone przez {{originParticipantName}}",
"notificationTitle": "Lobby",
"passwordField": "Wprowadź hasło",
"passwordJoinButton": "Dołącz",
"reject": "Odrzuć",
"toggleLabel": "Włącz / Wyłącz lobby"
} }
} }

View File

@ -269,7 +269,7 @@
"userPassword": "senha do usuário", "userPassword": "senha do usuário",
"WaitForHostMsg": "A conferência <b>{{room}}</b> ainda não começou. Se você é o anfitrião, faça a autenticação. Do contrário, aguarde a chegada do anfitrião.", "WaitForHostMsg": "A conferência <b>{{room}}</b> ainda não começou. Se você é o anfitrião, faça a autenticação. Do contrário, aguarde a chegada do anfitrião.",
"WaitForHostMsgWOk": "A conferência <b>{{room}}</b> ainda não começou. Se você é o anfitrião, pressione Ok para autenticar. Do contrário, aguarde a chegada do anfitrião.", "WaitForHostMsgWOk": "A conferência <b>{{room}}</b> ainda não começou. Se você é o anfitrião, pressione Ok para autenticar. Do contrário, aguarde a chegada do anfitrião.",
"WaitingForHost": "Esperando o hospedeiro...", "WaitingForHost": "Esperando o anfitrião...",
"Yes": "Sim", "Yes": "Sim",
"yourEntireScreen": "Toda sua tela", "yourEntireScreen": "Toda sua tela",
"screenSharingAudio": "Compartilhar áudio", "screenSharingAudio": "Compartilhar áudio",

View File

@ -1,28 +1,43 @@
{ {
"addPeople": { "addPeople": {
"add": "Пригласить", "add": "Пригласить",
"addContacts": "Пригласите других людей",
"copyInvite": "Скопировать приглашение на встречу",
"copyLink": "Скопировать ссылку на встречу",
"copyStream": "Скопировать ссылку на прямую транасляцию",
"countryNotSupported": "Эта страна пока не поддерживается.", "countryNotSupported": "Эта страна пока не поддерживается.",
"countryReminder": "Вызов не в США? Пожалуйста, убедитесь, что указали код страны!", "countryReminder": "Вызов не в США? Пожалуйста, убедитесь, что указали код страны!",
"defaultEmail": "Ваш адрес электронной почты",
"disabled": "Поиск не дал результата.", "disabled": "Поиск не дал результата.",
"failedToAdd": "Не удалось добавить участников", "failedToAdd": "Не удалось добавить участников",
"footerText": "Вызов номера отключен.", "footerText": "Вызов номера отключен.",
"googleEmail": "Электронная почта Google",
"inviteMoreHeader": "Сейчас вы одни в этой встрече",
"inviteMoreMailSubject": "Присоединиться к встрече {{appName}} ",
"inviteMorePrompt": "Пригласить других людей",
"linkCopied": "Ссылка скопирована в буфер обмена",
"loading": "Поиск людей и номеров телефонов", "loading": "Поиск людей и номеров телефонов",
"loadingNumber": "Проверка номера телефона", "loadingNumber": "Проверка номера телефона",
"loadingPeople": "Поиск людей для приглашения", "loadingPeople": "Поиск людей для приглашения",
"noResults": "Поиск не дал результата", "noResults": "Поиск не дал результата",
"noValidNumbers": "Пожалуйста, введите номер телефона", "noValidNumbers": "Пожалуйста, введите номер телефона",
"outlookEmail": "Электронная почта Outlook",
"searchNumbers": "Добавить номера телефонов", "searchNumbers": "Добавить номера телефонов",
"searchPeople": "Поиск людей", "searchPeople": "Поиск людей",
"searchPeopleAndNumbers": "Поиск людей или добавление их телефонов", "searchPeopleAndNumbers": "Поиск людей или добавление их телефонов",
"shareInvite": "Поделиться приглашением на встречу",
"shareLink": "Поделиться ссылкой на встречу чтобы пригласить других",
"shareStream": "Поделиться ссылкой на прямую трансляцию",
"telephone": "Номер: {{number}}", "telephone": "Номер: {{number}}",
"title": "Пригласить людей на эту встречу" "title": "Пригласить людей на эту встречу",
"yahooEmail": "Электронная почта Yahoo"
}, },
"audioDevices": { "audioDevices": {
"bluetooth": "Bluetooth", "bluetooth": "Bluetooth",
"headphones": "Наушники", "headphones": "Наушники",
"none": "Не обнаружены звуковые устройства",
"phone": "Телефон", "phone": "Телефон",
"speaker": "Колонка", "speaker": "Колонка"
"none": "Не обнаружены звуковые устройства"
}, },
"audioOnly": { "audioOnly": {
"audioOnly": "Только звук" "audioOnly": "Только звук"
@ -48,21 +63,21 @@
"chat": { "chat": {
"error": "Ошибка: Ваше сообщение не было отправлено. Причина: {{error}}", "error": "Ошибка: Ваше сообщение не было отправлено. Причина: {{error}}",
"fieldPlaceHolder": "Введите здесь ваше сообщение", "fieldPlaceHolder": "Введите здесь ваше сообщение",
"messagebox": "Введите сообщение",
"messageTo": "Личное сообщение пользователю {{recipient}}", "messageTo": "Личное сообщение пользователю {{recipient}}",
"noMessagesMessage": "В конференции пока нет никаких сообщений. Начните разговор!", "messagebox": "Введите сообщение",
"nickname": { "nickname": {
"popover": "Выберите имя", "popover": "Выберите имя",
"title": "Введите имя для использования чата" "title": "Введите имя для использования чата"
}, },
"noMessagesMessage": "В конференции пока нет никаких сообщений. Начните разговор!",
"privateNotice": "Личное сообщение пользователю {{recipient}}", "privateNotice": "Личное сообщение пользователю {{recipient}}",
"title": "Чат", "title": "Чат",
"you": "вы" "you": "вы"
}, },
"chromeExtensionBanner": { "chromeExtensionBanner": {
"installExtensionText": "Установите расширение для интеграции с Google Календарь и Office 365",
"buttonText": "Установить расширение Chrome", "buttonText": "Установить расширение Chrome",
"dontShowAgain": "Не показывай мне это снова" "dontShowAgain": "Не показывай мне это снова",
"installExtensionText": "Установите расширение для интеграции с Google Календарь и Office 365"
}, },
"connectingOverlay": { "connectingOverlay": {
"joiningRoom": "Пытаемся присоединиться к вашей конференции..." "joiningRoom": "Пытаемся присоединиться к вашей конференции..."
@ -77,10 +92,11 @@
"DISCONNECTED": "Отключено", "DISCONNECTED": "Отключено",
"DISCONNECTING": "Отключение", "DISCONNECTING": "Отключение",
"ERROR": "Ошибка", "ERROR": "Ошибка",
"RECONNECTING": "Проблема с сетью. Переподключение...", "FETCH_SESSION_ID": "Получение идентификатора сеанса…",
"GET_SESSION_ID_ERROR": "Ошибка получения идентификатора сеанса: {{code}}",
"GOT_SESSION_ID": "Получение идентификатора сеанса… Готово",
"LOW_BANDWIDTH": "Видео для {{displayName}} приостановлено из-за низкой пропускной способности", "LOW_BANDWIDTH": "Видео для {{displayName}} приостановлено из-за низкой пропускной способности",
"GOT_SESSION_ID": "Получение идентификатора сеанса … Готово", "RECONNECTING": "Проблема с сетью. Переподключение..."
"GET_SESSION_ID_ERROR": "Ошибка получения идентификатора сеанса: {{code}}"
}, },
"connectionindicator": { "connectionindicator": {
"address": "Адрес:", "address": "Адрес:",
@ -115,8 +131,7 @@
"status": "Связь:", "status": "Связь:",
"transport_0": "Метод отправки:", "transport_0": "Метод отправки:",
"transport_1": "Метода отправки:", "transport_1": "Метода отправки:",
"transport_2": "Методов отправки:", "transport_2": "Методов отправки:"
"e2e_rtt": ""
}, },
"dateUtils": { "dateUtils": {
"earlier": "Ранее", "earlier": "Ранее",
@ -128,6 +143,9 @@
"description": "Ничего не случилось? Мы попытались запустить вашу встречу в настольном приложении {{app}}. Повторите попытку или запустите ее в веб-приложении {{app}}.", "description": "Ничего не случилось? Мы попытались запустить вашу встречу в настольном приложении {{app}}. Повторите попытку или запустите ее в веб-приложении {{app}}.",
"descriptionWithoutWeb": "Ничего не произошло? Мы попытались запустить вашу конференцию в настольном приложении {{app}}", "descriptionWithoutWeb": "Ничего не произошло? Мы попытались запустить вашу конференцию в настольном приложении {{app}}",
"downloadApp": "Скачать приложение", "downloadApp": "Скачать приложение",
"ifDoNotHaveApp": "Если у вас еще нет приложения:",
"ifHaveApp": "Если вы уже установили приложение:",
"joinInApp": "Подключиться к этой встрече используя приложение",
"launchWebButton": "Запустить в браузере", "launchWebButton": "Запустить в браузере",
"openApp": "Перейти к приложению", "openApp": "Перейти к приложению",
"title": "Запуск вашей встречи в {{app}}...", "title": "Запуск вашей встречи в {{app}}...",
@ -147,15 +165,29 @@
"selectADevice": "Выбор устройства", "selectADevice": "Выбор устройства",
"testAudio": "Протестировать звук" "testAudio": "Протестировать звук"
}, },
"dialOut": {
"statusMessage": "сейчас {{status}}"
},
"dialog": { "dialog": {
"Back": "Назад",
"Cancel": "Отмена",
"IamHost": "Я организатор",
"Ok": "Ok",
"Remove": "Удалить",
"Share": "Поделиться",
"Submit": "ОК",
"WaitForHostMsg": "Конференция <b>{{room}}</b> еще не началась. Если вы организатор, пожалуйста, авторизируйтесь. В противном случае дождитесь организатора.",
"WaitForHostMsgWOk": "Конференция <b>{{room}}</b> еще не началась. Если вы организатор, пожалуйста, нажмите Ok для аутентификации. В противном случае, дождитесь организатора.",
"WaitingForHost": "Ждем организатора...",
"Yes": "Да",
"accessibilityLabel": { "accessibilityLabel": {
"liveStreaming": "Трансляция" "liveStreaming": "Трансляция"
}, },
"add": "Добавить",
"allow": "Разрешить", "allow": "Разрешить",
"alreadySharedVideoMsg": "Другой участник уже поделился ссылкой на видео. Данная конференция позволяет одновременно делиться только одним видео.", "alreadySharedVideoMsg": "Другой участник уже поделился ссылкой на видео. Данная конференция позволяет одновременно делиться только одним видео.",
"alreadySharedVideoTitle": "Допускается показ только одного видео", "alreadySharedVideoTitle": "Допускается показ только одного видео",
"applicationWindow": "Окно приложения", "applicationWindow": "Окно приложения",
"Back": "Назад",
"cameraConstraintFailedError": "Камера не отвечает определенным требованиям.", "cameraConstraintFailedError": "Камера не отвечает определенным требованиям.",
"cameraNotFoundError": "Камера не обнаружена.", "cameraNotFoundError": "Камера не обнаружена.",
"cameraNotSendingData": "Ошибка доступа к камере. Пожалуйста, проверьте, не использует ли камеру какая-нибудь другая программа. Вы можете также выбрать другое устройство из меню настроек или попробовать перезапустить приложение.", "cameraNotSendingData": "Ошибка доступа к камере. Пожалуйста, проверьте, не использует ли камеру какая-нибудь другая программа. Вы можете также выбрать другое устройство из меню настроек или попробовать перезапустить приложение.",
@ -163,7 +195,6 @@
"cameraPermissionDeniedError": "Нет доступа к камере. Вы можете участвовать во встрече, но другие не будут вас видеть. Используйте значок камеры в адресной строке браузера, чтобы устранить проблему.", "cameraPermissionDeniedError": "Нет доступа к камере. Вы можете участвовать во встрече, но другие не будут вас видеть. Используйте значок камеры в адресной строке браузера, чтобы устранить проблему.",
"cameraUnknownError": "Неизвестная ошибка использования камеры.", "cameraUnknownError": "Неизвестная ошибка использования камеры.",
"cameraUnsupportedResolutionError": "Ваша камера не поддерживает необходимое разрешение видео.", "cameraUnsupportedResolutionError": "Ваша камера не поддерживает необходимое разрешение видео.",
"Cancel": "Отмена",
"close": "Закрыть", "close": "Закрыть",
"conferenceDisconnectMsg": "Следует проверить интернет-соединение. Попытка восстановления связи через {{seconds}} с.", "conferenceDisconnectMsg": "Следует проверить интернет-соединение. Попытка восстановления связи через {{seconds}} с.",
"conferenceDisconnectTitle": "Вы отключены.", "conferenceDisconnectTitle": "Вы отключены.",
@ -176,21 +207,29 @@
"connectErrorWithMsg": "Ошибка. Невозможно установить связь для вашей встречи: {{msg}}", "connectErrorWithMsg": "Ошибка. Невозможно установить связь для вашей встречи: {{msg}}",
"connecting": "Подключение", "connecting": "Подключение",
"contactSupport": "Связь с поддержкой", "contactSupport": "Связь с поддержкой",
"copied": "Скопировано",
"copy": "Копировать", "copy": "Копировать",
"dismiss": "Отклонить", "dismiss": "Отклонить",
"displayNameRequired": "Привет! Как тебя зовут?", "displayNameRequired": "Привет! Как тебя зовут?",
"done": "Готово", "done": "Готово",
"e2eeDescription": "Сквозное шифрование в настоящее время является ЭКСПЕРИМЕНТАЛЬНЫМ. Имейте в виду, что включение сквозного шифрования эффективно отключит сервисы, предоставляемые на стороне сервера, такие как: запись, потоковое вещание и участие по телефону. Также имейте в виду, что собрание будет работать только для людей, присоединяющихся из браузеров с поддержкой вставляемых потоков.",
"e2eeLabel": "E2EE ключ",
"e2eeNoKey": "Отсутствует",
"e2eeSet": "Установить",
"e2eeToggleSet": "Установить ключ",
"e2eeWarning": "ПРЕДУПРЕЖДЕНИЕ. Похоже, что не все участники этой встречи поддерживают сквозное шифрование. Если вы включите его, они не смогут вас ни видеть, ни слышать.",
"enterDisplayName": "Пожалуйста, введите свое имя", "enterDisplayName": "Пожалуйста, введите свое имя",
"error": "Ошибка", "error": "Ошибка",
"externalInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.", "externalInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.",
"externalInstallationTitle": "Требуется расширение", "externalInstallationTitle": "Требуется расширение",
"goToStore": "Перейти к интернет-магазину", "goToStore": "Перейти к интернет-магазину",
"gracefulShutdown": "Технические работы. Пожалуйста, попробуйте позже.", "gracefulShutdown": "Технические работы. Пожалуйста, попробуйте позже.",
"IamHost": "Я организатор", "grantModeratorDialog": "Вы уверены, что хотите сделать этого участника модератором?",
"incorrectRoomLockPassword": "Неверный пароль", "grantModeratorTitle": "Сделать модератором",
"incorrectPassword": "Ошибка имени пользователя или пароля", "incorrectPassword": "Ошибка имени пользователя или пароля",
"inlineInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.", "incorrectRoomLockPassword": "Неверный пароль",
"inlineInstallExtension": "Установить", "inlineInstallExtension": "Установить",
"inlineInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.",
"internalError": "Что-то пошло не так. Ошибка: {{error}}", "internalError": "Что-то пошло не так. Ошибка: {{error}}",
"internalErrorTitle": "Внутренняя ошибка", "internalErrorTitle": "Внутренняя ошибка",
"kickMessage": "Вы можете связаться с {{participantDisplayName}} для получения более подробной информации.", "kickMessage": "Вы можете связаться с {{participantDisplayName}} для получения более подробной информации.",
@ -199,6 +238,7 @@
"kickParticipantTitle": "Выгнать этого участника?", "kickParticipantTitle": "Выгнать этого участника?",
"kickTitle": "Ай! {{participantDisplayName}} выгнал вас из конференции.", "kickTitle": "Ай! {{participantDisplayName}} выгнал вас из конференции.",
"liveStreaming": "Трансляция", "liveStreaming": "Трансляция",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Невозможно пока активна запись",
"liveStreamingDisabledForGuestTooltip": "Гости не могут начать трансляцию", "liveStreamingDisabledForGuestTooltip": "Гости не могут начать трансляцию",
"liveStreamingDisabledTooltip": "Возможность трансляции отключена", "liveStreamingDisabledTooltip": "Возможность трансляции отключена",
"lockMessage": "Не удалось запереть конференцию", "lockMessage": "Не удалось запереть конференцию",
@ -214,18 +254,25 @@
"micNotSendingDataTitle": "Ваш микрофон отключен системными настройками", "micNotSendingDataTitle": "Ваш микрофон отключен системными настройками",
"micPermissionDeniedError": "Нет доступа к микрофону. Вы можете участвовать во встрече, но другие не будут вас слышать. Используйте значок камеры в адресной строке браузера, чтобы устранить проблему.", "micPermissionDeniedError": "Нет доступа к микрофону. Вы можете участвовать во встрече, но другие не будут вас слышать. Используйте значок камеры в адресной строке браузера, чтобы устранить проблему.",
"micUnknownError": "Неизвестная ошибка использования микрофона.", "micUnknownError": "Неизвестная ошибка использования микрофона.",
"muteParticipantBody": "Вы не можете включить им звук, но они могут сделать это сами в любое время.", "muteEveryoneDialog": "Вы уверены, что хотите отключить микрофоны у всех? Вы не сможете включить их, но они могут включить себя в любой момент.",
"muteParticipantButton": "Выключить звук", "muteEveryoneElseDialog": "После отключения микрофонов у участников вы не сможете включить их, но они могут включить себя в любой момент.",
"muteEveryoneElseTitle": "Заглушить всех, за исключением {{whom}}?",
"muteEveryoneSelf": "себя",
"muteEveryoneStartMuted": "Теперь у всех микрофоны выключены",
"muteEveryoneTitle": "Заглушить всех?",
"muteParticipantBody": "Вы не можете включить им микрофон, но они могут сделать это сами в любое время.",
"muteParticipantButton": "Заглушить",
"muteParticipantDialog": "Вы уверены, что хотите отключить микрофон у данного пользователя? Вы не сможете отменить это действие, однако он сможет сам снова включить микрофон в любое время.", "muteParticipantDialog": "Вы уверены, что хотите отключить микрофон у данного пользователя? Вы не сможете отменить это действие, однако он сможет сам снова включить микрофон в любое время.",
"muteParticipantTitle": "Приглушить этого участника?", "muteParticipantTitle": "Заглушить этого участника?",
"Ok": "Ok", "passwordLabel": "Встреча была защищена участником. Пожалуйста, введите $t(lockRoomPasswordUppercase) чтобы присоединиться.",
"passwordLabel": "$t(lockRoomPasswordUppercase)",
"passwordNotSupported": "Установка $t(lockRoomPassword) для конференции не поддерживается.", "passwordNotSupported": "Установка $t(lockRoomPassword) для конференции не поддерживается.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) не поддерживается", "passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) не поддерживается",
"passwordRequired": "Требуется $t(lockRoomPasswordUppercase)", "passwordRequired": "Требуется $t(lockRoomPasswordUppercase)",
"popupError": "Ваш браузер блокирует всплывающие окна этого сайта. Пожалуйста, разрешите всплывающие окна в настройках безопасности браузера и попробуйте снова.", "popupError": "Ваш браузер блокирует всплывающие окна этого сайта. Пожалуйста, разрешите всплывающие окна в настройках безопасности браузера и попробуйте снова.",
"popupErrorTitle": "Заблокировано всплывающее окно", "popupErrorTitle": "Заблокировано всплывающее окно",
"readMore": "больше",
"recording": "Запись", "recording": "Запись",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Невозможно пока активно потоковое вещание",
"recordingDisabledForGuestTooltip": "Гости не могут записывать", "recordingDisabledForGuestTooltip": "Гости не могут записывать",
"recordingDisabledTooltip": "Невозможно начать запись", "recordingDisabledTooltip": "Невозможно начать запись",
"rejoinNow": "Подключиться снова", "rejoinNow": "Подключиться снова",
@ -236,13 +283,15 @@
"remoteControlShareScreenWarning": "Если нажмете \"Разрешить\", то поделитесь своим экраном!", "remoteControlShareScreenWarning": "Если нажмете \"Разрешить\", то поделитесь своим экраном!",
"remoteControlStopMessage": "Сессия удаленного управления завершена!", "remoteControlStopMessage": "Сессия удаленного управления завершена!",
"remoteControlTitle": "Удаленное управление рабочим столом", "remoteControlTitle": "Удаленное управление рабочим столом",
"Remove": "Удалить",
"removePassword": "Убрать $t(lockRoomPassword)", "removePassword": "Убрать $t(lockRoomPassword)",
"removeSharedVideoMsg": "Уверены, что хотите убрать видео, которым поделились?", "removeSharedVideoMsg": "Уверены, что хотите убрать видео, которым поделились?",
"removeSharedVideoTitle": "Убрать видео", "removeSharedVideoTitle": "Убрать видео",
"reservationError": "Ошибка системы резервирования", "reservationError": "Ошибка системы резервирования",
"reservationErrorMsg": "Код ошибки: {{code}}, сообщение: {{msg}}", "reservationErrorMsg": "Код ошибки: {{code}}, сообщение: {{msg}}",
"retry": "Повторить", "retry": "Повторить",
"screenSharingAudio": "Поделиться аудио",
"screenSharingFailed": "Ой! Кажется что-то пошло не так, мы не можем начать показ экрана!",
"screenSharingFailedTitle": "Сбой показа экрана!",
"screenSharingFailedToInstall": "Ошибка установки расширения для показа экрана.", "screenSharingFailedToInstall": "Ошибка установки расширения для показа экрана.",
"screenSharingFailedToInstallTitle": "Расширение для показа экрана не установлено", "screenSharingFailedToInstallTitle": "Расширение для показа экрана не установлено",
"screenSharingFirefoxPermissionDeniedError": "Что-то пошло не так, когда мы пытались поделиться вашим экраном. Пожалуйста, убедитесь, что вы дали нам разрешение на это. ", "screenSharingFirefoxPermissionDeniedError": "Что-то пошло не так, когда мы пытались поделиться вашим экраном. Пожалуйста, убедитесь, что вы дали нам разрешение на это. ",
@ -254,7 +303,6 @@
"sendPrivateMessageTitle": "Отправить личное сообщение?", "sendPrivateMessageTitle": "Отправить личное сообщение?",
"serviceUnavailable": "Служба недоступна", "serviceUnavailable": "Служба недоступна",
"sessTerminated": "Связь прервана", "sessTerminated": "Связь прервана",
"Share": "Поделиться",
"shareVideoLinkError": "Пожалуйста, укажите корректную ссылку Youtube.", "shareVideoLinkError": "Пожалуйста, укажите корректную ссылку Youtube.",
"shareVideoTitle": "Поделиться видео", "shareVideoTitle": "Поделиться видео",
"shareYourScreen": "Показать экран", "shareYourScreen": "Показать экран",
@ -268,7 +316,6 @@
"stopRecordingWarning": "Уверены, что хотите остановить запись?", "stopRecordingWarning": "Уверены, что хотите остановить запись?",
"stopStreamingWarning": "Уверены, что хотите остановить трансляцию?", "stopStreamingWarning": "Уверены, что хотите остановить трансляцию?",
"streamKey": "Ключ трансляции", "streamKey": "Ключ трансляции",
"Submit": "ОК",
"thankYou": "Спасибо, что используете {{appName}}!", "thankYou": "Спасибо, что используете {{appName}}!",
"token": "токен", "token": "токен",
"tokenAuthFailed": "Извините, вам не разрешено присоединиться к этому сеансу связи.", "tokenAuthFailed": "Извините, вам не разрешено присоединиться к этому сеансу связи.",
@ -276,21 +323,17 @@
"transcribing": "Расшифровка", "transcribing": "Расшифровка",
"unlockRoom": "Убрать $t(lockRoomPassword)", "unlockRoom": "Убрать $t(lockRoomPassword)",
"userPassword": "пароль пользователя", "userPassword": "пароль пользователя",
"WaitForHostMsg": "Конференция <b>{{room}}</b> еще не началась. Если вы организатор, пожалуйста, авторизируйтесь. В противном случае дождитесь организатора.", "yourEntireScreen": "Весь экран"
"WaitForHostMsgWOk": "Конференция <b>{{room}}</b> еще не началась. Если вы организатор, пожалуйста, нажмите Ok для аутентификации. В противном случае, дождитесь организатора.",
"WaitingForHost": "Ждем организатора...",
"Yes": "Да",
"yourEntireScreen": "Весь экран",
"muteEveryoneElseTitle": "Заглушить всех, за исключением {{whom}}?",
"screenSharingAudio": "Поделиться аудио",
"muteEveryoneSelf": "себя"
},
"dialOut": {
"statusMessage": "сейчас {{status}}"
}, },
"documentSharing": { "documentSharing": {
"title": "Общий Документ" "title": "Общий Документ"
}, },
"e2ee": {
"labelToolTip": "Аудио и видео связь по этому вызову защищена сквозным шифрованием"
},
"embedMeeting": {
"title": "Встроить эту встречу"
},
"feedback": { "feedback": {
"average": "Средне", "average": "Средне",
"bad": "Плохо", "bad": "Плохо",
@ -300,6 +343,9 @@
"veryBad": "Очень плохо", "veryBad": "Очень плохо",
"veryGood": "Очень хорошо" "veryGood": "Очень хорошо"
}, },
"helpView": {
"header": "Справка"
},
"incomingCall": { "incomingCall": {
"answer": "Ответ", "answer": "Ответ",
"audioCallTitle": "Входящий звонок", "audioCallTitle": "Входящий звонок",
@ -313,8 +359,8 @@
"cancelPassword": "Отменить $t(lockRoomPassword)", "cancelPassword": "Отменить $t(lockRoomPassword)",
"conferenceURL": "Ссылка:", "conferenceURL": "Ссылка:",
"country": "Страна", "country": "Страна",
"dialANumber": "Чтобы присоединиться к конференции, наберите один из этих номеров и введите pin-код", "dialANumber": "Чтобы присоединиться к конференции, наберите один из этих номеров и введите пин-код",
"dialInConferenceID": "PIN:", "dialInConferenceID": "ПИН:",
"dialInNotSupported": "К сожалению, набор номера в настоящее время не поддерживается.", "dialInNotSupported": "К сожалению, набор номера в настоящее время не поддерживается.",
"dialInNumber": "Номер:", "dialInNumber": "Номер:",
"dialInSummaryError": "Ошибка получения информации о наборе номера. Пожалуйста, повторите попытку позже", "dialInSummaryError": "Ошибка получения информации о наборе номера. Пожалуйста, повторите попытку позже",
@ -326,6 +372,7 @@
"inviteURLFirstPartGeneral": "Вас приглашают присоединиться к конференции.", "inviteURLFirstPartGeneral": "Вас приглашают присоединиться к конференции.",
"inviteURLFirstPartPersonal": "{{name}} приглашает Вас присоединиться к конференции. \n", "inviteURLFirstPartPersonal": "{{name}} приглашает Вас присоединиться к конференции. \n",
"inviteURLSecondPart": "\nПрисоединиться к конференции:\n{{url}}\n", "inviteURLSecondPart": "\nПрисоединиться к конференции:\n{{url}}\n",
"label": "Информация о конференции",
"liveStreamURL": "Трансляция:", "liveStreamURL": "Трансляция:",
"moreNumbers": "Больше номеров", "moreNumbers": "Больше номеров",
"noNumbers": "Нет номеров для набора.", "noNumbers": "Нет номеров для набора.",
@ -334,8 +381,13 @@
"numbers": "Номера для набора", "numbers": "Номера для набора",
"password": "$t(lockRoomPasswordUppercase):", "password": "$t(lockRoomPasswordUppercase):",
"title": "Поделиться", "title": "Поделиться",
"tooltip": "Поделитесь ссылкой и номером для подключения к этой конференции", "tooltip": "Поделитесь ссылкой и номером для подключения к этой конференции"
"label": "Информация о конференции" },
"inlineDialogFailure": {
"msg": "Небольшая заминка.",
"retry": "Попробовать снова",
"support": "Поддержка",
"supportMsg": "Если это продолжится, свяжитесь с"
}, },
"inviteDialog": { "inviteDialog": {
"alertText": "Не удалось пригласить некоторых участников.", "alertText": "Не удалось пригласить некоторых участников.",
@ -345,12 +397,6 @@
"searchPlaceholder": "Участник или номер телефона", "searchPlaceholder": "Участник или номер телефона",
"send": "Отправить" "send": "Отправить"
}, },
"inlineDialogFailure": {
"msg": "Небольшая заминка.",
"retry": "Попробовать снова",
"support": "Поддержка",
"supportMsg": "Если это продолжится, свяжитесь с"
},
"keyboardShortcuts": { "keyboardShortcuts": {
"focusLocal": "Фокус на ваше видео", "focusLocal": "Фокус на ваше видео",
"focusRemote": "Фокус на видео другого участника", "focusRemote": "Фокус на видео другого участника",
@ -383,23 +429,55 @@
"expandedPending": "Начинается прямая трансляция...", "expandedPending": "Начинается прямая трансляция...",
"failedToStart": "Ошибка трансляции видео", "failedToStart": "Ошибка трансляции видео",
"getStreamKeyManually": "Прямые трансляций не найдены. Попробуйте получить ключ прямой трансляции от YouTube.", "getStreamKeyManually": "Прямые трансляций не найдены. Попробуйте получить ключ прямой трансляции от YouTube.",
"googlePrivacyPolicy": "Политика конфиденциальности Google",
"invalidStreamKey": "Похоже ключ прямой трансляции неверен.", "invalidStreamKey": "Похоже ключ прямой трансляции неверен.",
"limitNotificationDescriptionNative": "Ваша трансляция будет ограничена {{limit}} мин. Для неограниченного просмотра попробуйте {{app}}.",
"limitNotificationDescriptionWeb": "Из-за высокой нагрузки ваша потоковая передача будет ограничена {{limit}} мин. Для неограниченной потоковой передачи попробуйте <a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>.",
"off": "Трансляция остановлена", "off": "Трансляция остановлена",
"offBy": "{{name}} остановил прямую трансляцию", "offBy": "{{name}} остановил прямую трансляцию",
"on": "Трансляция", "on": "Трансляция",
"onBy": "{{name}} начал прямую трансляцию", "onBy": "{{name}} начал прямую трансляцию",
"pending": "Начинаем трансляцию...", "pending": "Начинаем трансляцию...",
"serviceName": "Служба трансляции", "serviceName": "Служба трансляции",
"signedInAs": "В настоящее время вы вошли в систему как:",
"signIn": "Войти через Google", "signIn": "Войти через Google",
"signInCTA": "Войдите или введите свой ключ трансляции YouTube.", "signInCTA": "Войдите или введите свой ключ трансляции YouTube.",
"signOut": "Выход", "signOut": "Выход",
"signedInAs": "В настоящее время вы вошли в систему как:",
"start": "Начать трансляцию", "start": "Начать трансляцию",
"streamIdHelp": "Что это?", "streamIdHelp": "Что это?",
"unavailableTitle": "Трансляция недоступна", "unavailableTitle": "Трансляция недоступна",
"googlePrivacyPolicy": "Политика конфиденциальности Google",
"youtubeTerms": "Условия использования YouTube" "youtubeTerms": "Условия использования YouTube"
}, },
"lobby": {
"disableDialogContent": "В настоящее время включен режим лобби. Эта функция гарантирует, что нежелательные участники не смогут присоединиться к вашей встрече. Вы хотите его отключить?",
"disableDialogSubmit": "Отключить",
"emailField": "Введите ваш адрес электронной почты",
"enableDialogPasswordField": "Установите пароль (необязательно)",
"enableDialogSubmit": "Включить",
"enableDialogText": "Режим лобби позволяет защитить вашу встречу, позволяя людям входить только после официального одобрения модератором.",
"enterPasswordButton": "Введите пароль встречи",
"enterPasswordTitle": "Введите пароль чтобы присоединиться к встрече",
"invalidPassword": "Неверный пароль",
"joinRejectedMessage": "Ваш запрос на присоединение был отклонен модератором.",
"joinTitle": "Присоединиться к встрече",
"joinWithPasswordMessage": "Пытаюсь присоединиться с паролем, подождите...",
"joiningMessage": "Вы присоединитесь к встрече, как только кто-то примет ваш запрос",
"joiningTitle": "Просьба присоединиться к встрече...",
"joiningWithPasswordTitle": "Присоединение с паролем...",
"knockButton": "Попросить присоединиться",
"knockTitle": "Кто-то хочет присоединиться к встрече",
"knockingParticipantList": "Список ожидающих участников",
"nameField": "Введите ваше имя",
"notificationLobbyAccessDenied": "{{originParticipantName}} запретил присоединиться {{targetParticipantName}}",
"notificationLobbyAccessGranted": "{{originParticipantName}}разрешил присоединиться {{targetParticipantName}} ",
"notificationLobbyDisabled": "Лобби отключено пользователем {{originParticipantName}}",
"notificationLobbyEnabled": "Лобби включено пользователем {{originParticipantName}}",
"notificationTitle": "Лобби",
"passwordField": "Введите пароль встречи",
"passwordJoinButton": "Присоединиться",
"reject": "Отказать",
"toggleLabel": "Включить лобби"
},
"localRecording": { "localRecording": {
"clientState": { "clientState": {
"off": "Отключен", "off": "Отключен",
@ -431,8 +509,15 @@
}, },
"lockRoomPassword": "пароль", "lockRoomPassword": "пароль",
"lockRoomPasswordUppercase": "Пароль", "lockRoomPasswordUppercase": "Пароль",
"lonelyMeetingExperience": {
"button": "Пригласить",
"getHelp": "Получить помощь",
"title": "Защищенная, полнофункциональная и совершенно бесплатная система видеоконференций",
"youAreAlone": "Вы один в видеоконференции"
},
"me": "я", "me": "я",
"notify": { "notify": {
"OldElectronAPPTitle": "Уязвимость в системе безопасности!",
"connectedOneMember": "{{name}} присоединился к конференции", "connectedOneMember": "{{name}} присоединился к конференции",
"connectedThreePlusMembers": "{{name}} и {{count}} других пользователей присоединились к конференции", "connectedThreePlusMembers": "{{name}} и {{count}} других пользователей присоединились к конференции",
"connectedTwoMembers": "{{first}} и {{second}} присоединились к конференции", "connectedTwoMembers": "{{first}} и {{second}} присоединились к конференции",
@ -447,25 +532,64 @@
"me": "Я", "me": "Я",
"moderator": "Получены права модератора!", "moderator": "Получены права модератора!",
"muted": "Вы начали разговор без звука.", "muted": "Вы начали разговор без звука.",
"mutedTitle": "Вы без звука!",
"mutedRemotelyTitle": "{{participantDisplayName}} отключил Вам микрофон!",
"mutedRemotelyDescription": "Вы всегда можете включить микрофон, когда будете готовы говорить. Отключите его, когда закончите, чтобы не транслировать шумы в конференцию.", "mutedRemotelyDescription": "Вы всегда можете включить микрофон, когда будете готовы говорить. Отключите его, когда закончите, чтобы не транслировать шумы в конференцию.",
"mutedRemotelyTitle": "{{participantDisplayName}} отключил Вам микрофон!",
"mutedTitle": "Вы без звука!",
"newDeviceAction": "Использовать",
"newDeviceAudioTitle": "Обнаружено новое аудиоустройство",
"newDeviceCameraTitle": "Обнаружена новая камера",
"oldElectronClientDescription1": "Похоже, вы используете старую версию клиента Jitsi Meet, которая имеет известные уязвимости в системе безопасности. Убедитесь, что вы обновили до нашей ",
"oldElectronClientDescription2": "последней версии",
"oldElectronClientDescription3": " сейчас!",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) удален другим участником.", "passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) удален другим участником.",
"passwordSetRemotely": "Другой участник установил $t(lockRoomPasswordUppercase)", "passwordSetRemotely": "Другой участник установил $t(lockRoomPasswordUppercase)",
"raisedHand": "{{name}} хотел бы выступить.", "raisedHand": "{{name}} хотел бы выступить.",
"somebody": "Кто-то", "somebody": "Кто-то",
"startSilentTitle": "У вас отсутствует звук!",
"startSilentDescription": "Перезайдите в конференцию, чтобы включить звук", "startSilentDescription": "Перезайдите в конференцию, чтобы включить звук",
"startSilentTitle": "У вас отсутствует звук!",
"suboptimalBrowserWarning": "К сожалению, ваш браузер не полностью поддерживает данную систему вэбконференций. Мы работаем над проблемой, однако, пока рекомендуем вам воспользоваться <a href='{{recommendedBrowserPageLink}}' target='_blank'> следующими браузерами</a>.", "suboptimalBrowserWarning": "К сожалению, ваш браузер не полностью поддерживает данную систему вэбконференций. Мы работаем над проблемой, однако, пока рекомендуем вам воспользоваться <a href='{{recommendedBrowserPageLink}}' target='_blank'> следующими браузерами</a>.",
"suboptimalExperienceTitle": "Предупреждение браузера", "suboptimalExperienceTitle": "Предупреждение браузера",
"unmute": "Включить микрофон", "unmute": "Включить микрофон"
"newDeviceCameraTitle": "Обнаружена новая камера",
"newDeviceAudioTitle": "Обнаружено новое аудиоустройство",
"newDeviceAction": "Использовать"
}, },
"passwordSetRemotely": "установлен другим участником",
"passwordDigitsOnly": "До {{number}} цифр", "passwordDigitsOnly": "До {{number}} цифр",
"passwordSetRemotely": "установлен другим участником",
"poweredby": "работает на", "poweredby": "работает на",
"prejoin": {
"audioAndVideoError": "Ошибка звука и видео:",
"audioOnlyError": "Ошибка звука:",
"audioTrackError": "Не удалось создать аудио дорожку.",
"callMe": "Позвоните мне",
"callMeAtNumber": "Позвоните мне по этому номеру:",
"calling": "Вызываем",
"configuringDevices": "Настраиваются устройства...",
"connectedWithAudioQ": "Вы подключили звук?",
"copyAndShare": "Скопировать и поделиться ссылкой на встречу",
"dialInMeeting": "Дозвониться до встречи",
"dialInPin": "Дозвониться до встречи и ввести ПИН код:",
"dialing": "Дозвон",
"doNotShow": "Не показывать снова",
"errorDialOut": "Не удалось дозвониться",
"errorDialOutDisconnected": "Не удалось дозвониться. Отключено",
"errorDialOutFailed": "Не удалось дозвониться. Сбой вызова",
"errorDialOutStatus": "Ошибка получения статуса вызова",
"errorStatusCode": "Ошибка вызова, код статуса: {{status}}",
"errorValidation": "Проверка номера не удалась",
"iWantToDialIn": "Я хочу дозвониться",
"initiated": "Вызов инициирован",
"joinAudioByPhone": "Подключиться с телефонной связью",
"joinMeeting": "Присоединиться ко встрече",
"joinWithoutAudio": "Присоединиться без звука",
"linkCopied": "Ссылка скопирована в буфер обмена",
"lookGood": "Кажется ваш микрофон работает правильно",
"or": "или",
"premeeting": "Перед подключением",
"screenSharingError": "Ошибка показа экрана:",
"showScreen": "Включить экран перед подключением",
"startWithPhone": "Начать с телефонной связью",
"videoOnlyError": "Ошибка видео:",
"videoTrackError": "Не удалось создать видео дорожку.",
"viewAllNumbers": "посмотреть всех участников"
},
"presenceStatus": { "presenceStatus": {
"busy": "Занят", "busy": "Занят",
"calling": "Вызываю...", "calling": "Вызываю...",
@ -499,14 +623,16 @@
"expandedPending": "Начинаем запись конференции...", "expandedPending": "Начинаем запись конференции...",
"failedToStart": "Ошибка начала записи", "failedToStart": "Ошибка начала записи",
"fileSharingdescription": "Поделиться записью с участниками конференции", "fileSharingdescription": "Поделиться записью с участниками конференции",
"live": "Прямая трансляция", "limitNotificationDescriptionNative": "Из-за высокой нагрузки ваша запись будет ограничена {{limit}} мин. Для неограниченного количества записей попробуйте <3> {{app}} </3>.",
"limitNotificationDescriptionWeb": "Из-за высокой нагрузки ваша запись будет ограничена {{limit}} мин. Для неограниченного количества записей попробуйте <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"live": "В ЭФИРЕ",
"loggedIn": "Вошел как {{userName}}", "loggedIn": "Вошел как {{userName}}",
"off": "Запись остановлена", "off": "Запись остановлена",
"offBy": "{{name}} остановил запись", "offBy": "{{name}} остановил запись",
"on": "Запись", "on": "Запись",
"onBy": "{{name}} включил запись", "onBy": "{{name}} включил запись",
"pending": "Подготовка записи конференции. . .", "pending": "Подготовка записи конференции. . .",
"rec": дет запись", "rec": ДЕТ ЗАПИСЬ",
"serviceDescription": "Ваша запись будет сохранена соответствующей службой", "serviceDescription": "Ваша запись будет сохранена соответствующей службой",
"serviceName": "Служба записи", "serviceName": "Служба записи",
"signIn": "Вход", "signIn": "Вход",
@ -517,6 +643,12 @@
"sectionList": { "sectionList": {
"pullToRefresh": "Потяните для обновления" "pullToRefresh": "Потяните для обновления"
}, },
"security": {
"about": "Вы можете добавить к собранию $t(lockRoomPassword). Участникам необходимо будет предоставить $t(lockRoomPassword), прежде чем им будет разрешено присоединиться к собранию.",
"aboutReadOnly": "Участники-модераторы могут добавить к собранию $t(lockRoomPassword). Участникам необходимо будет предоставить $t(lockRoomPassword), прежде чем им будет разрешено присоединиться к собранию.",
"insecureRoomNameWarning": "Имя комнаты небезопасно. Нежелательные участники могут присоединиться к вашей конференции. Подумайте о том, чтобы защитить вашу встречу используя настройки безопасности.",
"securityOptions": "Настройки безопасности"
},
"settings": { "settings": {
"calendar": { "calendar": {
"about": "Интеграция с календарем {{appName}} используется для безопасного доступа к вашему календарю и синхронизации запланированных мероприятий.", "about": "Интеграция с календарем {{appName}} используется для безопасного доступа к вашему календарю и синхронизации запланированных мероприятий.",
@ -529,6 +661,7 @@
"followMe": "Все следуют за мной", "followMe": "Все следуют за мной",
"language": "Язык", "language": "Язык",
"loggedIn": "Вошел как {{name}}", "loggedIn": "Вошел как {{name}}",
"microphones": "Микрофоны",
"moderator": "Модератор", "moderator": "Модератор",
"more": "Больше опций", "more": "Больше опций",
"name": "Имя", "name": "Имя",
@ -536,11 +669,10 @@
"selectAudioOutput": "Звуковой выход", "selectAudioOutput": "Звуковой выход",
"selectCamera": "Камера", "selectCamera": "Камера",
"selectMic": "Микрофон", "selectMic": "Микрофон",
"speakers": "Динамики",
"startAudioMuted": "Все начинают с выключенным звуком", "startAudioMuted": "Все начинают с выключенным звуком",
"startVideoMuted": "Все начинают в скрытом режиме", "startVideoMuted": "Все начинают в скрытом режиме",
"title": "Настройки", "title": "Настройки"
"speakers": "Динамики",
"microphones": "Микрофоны"
}, },
"settingsView": { "settingsView": {
"advanced": "Дополнительные", "advanced": "Дополнительные",
@ -550,6 +682,8 @@
"buildInfoSection": "Информация о сборке", "buildInfoSection": "Информация о сборке",
"conferenceSection": "Номера для набора", "conferenceSection": "Номера для набора",
"disableCallIntegration": "Отключить встроенную интеграцию вызовов", "disableCallIntegration": "Отключить встроенную интеграцию вызовов",
"disableCrashReporting": "Отключить отправку отчетов о сбоях",
"disableCrashReportingWarning": "Вы действительно хотите отключить отчеты о сбоях? Настройка будет применена после перезапуска приложения.",
"disableP2P": "Отключить режим Peer-To-Peer", "disableP2P": "Отключить режим Peer-To-Peer",
"displayName": "Отображаемое имя", "displayName": "Отображаемое имя",
"email": "Email", "email": "Email",
@ -565,7 +699,7 @@
"dialInfoText": "\n\n=====\n\nПросто хотите набрать номер на Вашем телефоне?\n\n{{defaultDialInNumber}}Щелкните на эту ссылку, чтобы просмотреть телефонные номера для этой конференции\n{{dialInfoPageUrl}}", "dialInfoText": "\n\n=====\n\nПросто хотите набрать номер на Вашем телефоне?\n\n{{defaultDialInNumber}}Щелкните на эту ссылку, чтобы просмотреть телефонные номера для этой конференции\n{{dialInfoPageUrl}}",
"mainText": "Нажмите на ссылку чтобы присоединиться к конференции:\n{{roomUrl}}" "mainText": "Нажмите на ссылку чтобы присоединиться к конференции:\n{{roomUrl}}"
}, },
"speaker": "Колонка", "speaker": "Спикер",
"speakerStats": { "speakerStats": {
"hours": "{{count}}ч", "hours": "{{count}}ч",
"minutes": "{{count}}м", "minutes": "{{count}}м",
@ -584,7 +718,9 @@
"title": "Видеосвязь прервана. Причина: этот компьютер перешел в режим сна." "title": "Видеосвязь прервана. Причина: этот компьютер перешел в режим сна."
}, },
"toolbar": { "toolbar": {
"Settings": "Настройки",
"accessibilityLabel": { "accessibilityLabel": {
"Settings": "Вкл/Выкл меню настроек",
"audioOnly": "Вкл/Выкл только звук", "audioOnly": "Вкл/Выкл только звук",
"audioRoute": "Выбрать аудиоустройство", "audioRoute": "Выбрать аудиоустройство",
"callQuality": "Качество связи", "callQuality": "Качество связи",
@ -592,36 +728,41 @@
"chat": "Показать/скрыть окно чата", "chat": "Показать/скрыть окно чата",
"document": "Закрыть общий документ", "document": "Закрыть общий документ",
"download": "Скачать приложение", "download": "Скачать приложение",
"e2ee": "Сквозное шифрование",
"embedMeeting": "Встроить встречу",
"feedback": "Оставить отзыв", "feedback": "Оставить отзыв",
"fullScreen": "Полноэкранный/оконный режим", "fullScreen": "Полноэкранный/оконный режим",
"grantModerator": "Сделать модератором",
"hangup": "Завершить звонок", "hangup": "Завершить звонок",
"help": "Справка", "help": "Справка",
"invite": "Пригласить", "invite": "Пригласить",
"kick": "Выкинуть участника", "kick": "Выкинуть участника",
"lobbyButton": "Вкл/Выкл режим лобби",
"localRecording": "Вкл/Выкл кнопки записи", "localRecording": "Вкл/Выкл кнопки записи",
"lockRoom": "Установить пароль", "lockRoom": "Установить пароль",
"moreActions": "Показать/скрыть меню доп. настроек", "moreActions": "Показать/скрыть меню доп. настроек",
"moreOptions": "Меню доп. настроек",
"moreActionsMenu": "Меню доп. настроек", "moreActionsMenu": "Меню доп. настроек",
"moreOptions": "Меню доп. настроек",
"mute": "Вкл/Выкл звук", "mute": "Вкл/Выкл звук",
"muteEveryone": "Выкл. микрофон у всех",
"pip": "Вкл/Выкл режим Картинка-в-картинке", "pip": "Вкл/Выкл режим Картинка-в-картинке",
"privateMessage": "Отправить личное сообщение", "privateMessage": "Отправить личное сообщение",
"profile": "Редактировать профиль", "profile": "Редактировать профиль",
"raiseHand": "Поднять руку", "raiseHand": "Поднять руку",
"recording": "Вкл/Выкл запись", "recording": "Вкл/Выкл запись",
"remoteMute": "Отключить участнику микрофон", "remoteMute": "Отключить участнику микрофон",
"Settings": "Вкл/Выкл меню настроек", "security": "Настройки безопасности",
"sharedvideo": "Вкл/Выкл Youtube - трансляцию",
"shareRoom": "Отправить приглашение", "shareRoom": "Отправить приглашение",
"shareYourScreen": "Вкл/Выкл демонстрацию экрана", "shareYourScreen": "Вкл/Выкл демонстрацию экрана",
"sharedvideo": "Вкл/Выкл Youtube - трансляцию",
"shortcuts": "Вкл/Выкл значки", "shortcuts": "Вкл/Выкл значки",
"show": "Показать крупным планом", "show": "Показать крупным планом",
"speakerStats": "Вкл/Выкл статистику", "speakerStats": "Вкл/Выкл статистику",
"tileView": "Вкл/Выкл плитку", "tileView": "Вкл/Выкл плитку",
"toggleCamera": "Переключить камеру", "toggleCamera": "Переключить камеру",
"videomute": "Вкл/Выкл видео", "toggleFilmstrip": "Включить диафильм",
"muteEveryone": "Выкл. микрофон у всех", "videoblur": "Вкл/Выкл размытие фона",
"videoblur": "Вкл/Выкл размытие фона" "videomute": "Вкл/Выкл видео"
}, },
"addPeople": "Добавить людей к вашему сеансу связи", "addPeople": "Добавить людей к вашему сеансу связи",
"audioOnlyOff": "Отключить режим экономии пропуской способности", "audioOnlyOff": "Отключить режим экономии пропуской способности",
@ -634,6 +775,8 @@
"documentClose": "Закрыть общий документ", "documentClose": "Закрыть общий документ",
"documentOpen": "Открыть общий документ", "documentOpen": "Открыть общий документ",
"download": "Скачать приложение", "download": "Скачать приложение",
"e2ee": "Сквозное шифрование",
"embedMeeting": "Встроить встречу",
"enterFullScreen": "Полный экран", "enterFullScreen": "Полный экран",
"enterTileView": "Общий план", "enterTileView": "Общий план",
"exitFullScreen": "Полный экран", "exitFullScreen": "Полный экран",
@ -642,39 +785,44 @@
"hangup": "Выход", "hangup": "Выход",
"help": "Справка", "help": "Справка",
"invite": "Пригласить", "invite": "Пригласить",
"lobbyButtonDisable": "Отключить режим лобби",
"lobbyButtonEnable": "Включить режим лобби",
"login": "Войти", "login": "Войти",
"logout": "Завершить сеанс", "logout": "Завершить сеанс",
"lowerYourHand": "Опустить руку", "lowerYourHand": "Опустить руку",
"moreActions": "Больше", "moreActions": "Больше действий",
"moreOptions": "Больше настроек",
"mute": "Микрофон (вкл./выкл.)", "mute": "Микрофон (вкл./выкл.)",
"muteEveryone": "Выкл. микрофон у всех", "muteEveryone": "Выкл. микрофон у всех",
"noAudioSignalTitle": "От вашего микрофона не идет звуковой сигнал!",
"noAudioSignalDesc": "Если вы специально не отключали микрофон в системных настройках, подумайте о том, чтобы поменять его.", "noAudioSignalDesc": "Если вы специально не отключали микрофон в системных настройках, подумайте о том, чтобы поменять его.",
"noAudioSignalDescSuggestion": "Если вы специально не отключали микрофон в системных настройках, вы можете попробовать использовать следующее устройство:", "noAudioSignalDescSuggestion": "Если вы специально не отключали микрофон в системных настройках, вы можете попробовать использовать следующее устройство:",
"noisyAudioInputTitle": "Похоже, ваш микрофон создает шум!", "noAudioSignalDialInDesc": "Вы можете также дозвониться используя:",
"noAudioSignalDialInLinkDesc": "Номера для дозвона",
"noAudioSignalTitle": "От вашего микрофона не идет звуковой сигнал!",
"noisyAudioInputDesc": "Возможно, ваш микрофон создает шум. Вы можете выключить его или смените устройство.", "noisyAudioInputDesc": "Возможно, ваш микрофон создает шум. Вы можете выключить его или смените устройство.",
"noisyAudioInputTitle": "Похоже, ваш микрофон создает шум!",
"openChat": "Открыть чат", "openChat": "Открыть чат",
"pip": "Вкл режим Картинка-в-картинке", "pip": "Вкл режим Картинка-в-картинке",
"privateMessage": "Отправить личное сообщение", "privateMessage": "Отправить личное сообщение",
"profile": "Редактировать профиль", "profile": "Редактировать профиль",
"raiseHand": "Хочу говорить", "raiseHand": "Хочу говорить",
"raiseYourHand": "Поднять руку", "raiseYourHand": "Поднять руку",
"Settings": "Настройки", "security": "Настройки безопасности",
"sharedvideo": "Видео YouTube",
"shareRoom": "Отправить приглашение", "shareRoom": "Отправить приглашение",
"sharedvideo": "Видео YouTube",
"shortcuts": "Комбинации клавиш", "shortcuts": "Комбинации клавиш",
"speakerStats": "Статистика", "speakerStats": "Статистика",
"startScreenSharing": "Начать трансляцию с экрана", "startScreenSharing": "Начать трансляцию с экрана",
"startSubtitles": "Включить субтитры", "startSubtitles": "Включить субтитры",
"startvideoblur": "Размыть фон на видео",
"stopScreenSharing": "Остановить трансляцию с экрана", "stopScreenSharing": "Остановить трансляцию с экрана",
"stopSubtitles": "Отключить субтитры",
"stopSharedVideo": "Остановить видео на YouTube", "stopSharedVideo": "Остановить видео на YouTube",
"stopSubtitles": "Отключить субтитры",
"stopvideoblur": "Отключить размытие фона",
"talkWhileMutedPopup": "Пытаетесь говорить? У вас отключен звук.", "talkWhileMutedPopup": "Пытаетесь говорить? У вас отключен звук.",
"tileViewToggle": "Вкл/выкл плитку", "tileViewToggle": "Вкл/выкл плитку",
"toggleCamera": "Вкл/выкл камеру", "toggleCamera": "Вкл/выкл камеру",
"videomute": "Камера", "videomute": "Камера"
"startvideoblur": "Размыть фон на видео",
"stopvideoblur": "Отключить размытие фона"
}, },
"transcribing": { "transcribing": {
"ccButtonTooltip": "Вкл. / Выкл. субтитры", "ccButtonTooltip": "Вкл. / Выкл. субтитры",
@ -685,8 +833,7 @@
"off": "Расшифровка остановлена", "off": "Расшифровка остановлена",
"pending": "Подготовка расшифровки конференции...", "pending": "Подготовка расшифровки конференции...",
"start": "Вкл/Выкл показ субтитров", "start": "Вкл/Выкл показ субтитров",
"stop": "Вкл/Выкл показ субтитров", "stop": "Вкл/Выкл показ субтитров"
"tr": ""
}, },
"userMedia": { "userMedia": {
"androidGrantPermissions": "Выберите <b><i>Разрешить</i></b>, когда браузер спросит о разрешениях.", "androidGrantPermissions": "Выберите <b><i>Разрешить</i></b>, когда браузер спросит о разрешениях.",
@ -732,6 +879,7 @@
"domute": "Выключить звук", "domute": "Выключить звук",
"domuteOthers": "Выключить остальных", "domuteOthers": "Выключить остальных",
"flip": "Отразить", "flip": "Отразить",
"grantModerator": "Сделать модератором",
"kick": "Выкинуть", "kick": "Выкинуть",
"moderator": "Модератор", "moderator": "Модератор",
"mute": "Без звука", "mute": "Без звука",
@ -754,26 +902,22 @@
"connectCalendarButton": "Привязать календарь", "connectCalendarButton": "Привязать календарь",
"connectCalendarText": "Подключите календарь, чтобы увидеть все ваши конференции в {{app}}. Кроме того, добавив {{provider}} конференций в календарь, вы сможете запускать их одним щелчком мышки.", "connectCalendarText": "Подключите календарь, чтобы увидеть все ваши конференции в {{app}}. Кроме того, добавив {{provider}} конференций в календарь, вы сможете запускать их одним щелчком мышки.",
"enterRoomTitle": "Начать новую видеоконференцию", "enterRoomTitle": "Начать новую видеоконференцию",
"roomNameAllowedChars": "Название конференции не должно содержать следующие символы: ?, &, :, ', \", %, #.", "getHelp": "Справка",
"go": "ОК", "go": "ОК",
"goSmall": "ОК", "goSmall": "ОК",
"join": "СОЗДАТЬ / ПРИСОЕДИНИТЬСЯ",
"info": "Инфо", "info": "Инфо",
"join": "СОЗДАТЬ / ПРИСОЕДИНИТЬСЯ",
"moderatedMessage": "Или заранее <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">зарезервируйте URL-адрес встречи</a>, где вы будете единственным модератором.",
"privacy": "Приватность", "privacy": "Приватность",
"recentList": "Недавние", "recentList": "Недавние",
"recentListDelete": "Удалить", "recentListDelete": "Удалить",
"recentListEmpty": "Сейчас ваш список недавно проведенных конференций пуст. По мере вашего пользования сервисом он будет пополняться.", "recentListEmpty": "Сейчас ваш список недавно проведенных конференций пуст. По мере вашего пользования сервисом он будет пополняться.",
"reducedUIText": "Добро пожаловать в {{app}}!", "reducedUIText": "Добро пожаловать в {{app}}!",
"roomNameAllowedChars": "Название конференции не должно содержать следующие символы: ?, &, :, ', \", %, #.",
"roomname": "Укажите название комнаты", "roomname": "Укажите название комнаты",
"roomnameHint": "Укажите название комнаты или ее адрес. Можете сами создать название и передать его будущим участникам встречи, чтобы они использовали именно его.", "roomnameHint": "Укажите название комнаты или ее адрес. Можете сами создать название и передать его будущим участникам встречи, чтобы они использовали именно его.",
"sendFeedback": "Обратная связь", "sendFeedback": "Обратная связь",
"terms": "Условия", "terms": "Условия",
"title": "Защищенная, полнофункциональная и совершенно бесплатная система видеоконференций" "title": "Защищенная, полнофункциональная и совершенно бесплатная система видеоконференций"
},
"lonelyMeetingExperience": {
"button": "Пригласить",
"youAreAlone": "Вы один в видеоконференции",
"title": "Защищенная, полнофункциональная и совершенно бесплатная система видеоконференций",
"getHelp": "Получить помощь"
} }
} }

View File

@ -71,8 +71,7 @@
}, },
"privateNotice": "{{recipient}} için özel mesaj", "privateNotice": "{{recipient}} için özel mesaj",
"title": "Sohbet", "title": "Sohbet",
"you": "sen", "you": "sen"
}, },
"connectingOverlay": { "connectingOverlay": {

View File

@ -102,6 +102,7 @@
"bandwidth": "Estimated bandwidth:", "bandwidth": "Estimated bandwidth:",
"bitrate": "Bitrate:", "bitrate": "Bitrate:",
"bridgeCount": "Server count: ", "bridgeCount": "Server count: ",
"codecs": "Codecs (A/V): ",
"connectedTo": "Connected to:", "connectedTo": "Connected to:",
"e2e_rtt": "E2E RTT:", "e2e_rtt": "E2E RTT:",
"framerate": "Frame rate:", "framerate": "Frame rate:",
@ -110,6 +111,7 @@
"localaddress_plural": "Local addresses:", "localaddress_plural": "Local addresses:",
"localport": "Local port:", "localport": "Local port:",
"localport_plural": "Local ports:", "localport_plural": "Local ports:",
"maxEnabledResolution": "send max",
"more": "Show more", "more": "Show more",
"packetloss": "Packet loss:", "packetloss": "Packet loss:",
"quality": { "quality": {
@ -189,6 +191,7 @@
"connectErrorWithMsg": "Oops! Something went wrong and we couldn't connect to the conference: {{msg}}", "connectErrorWithMsg": "Oops! Something went wrong and we couldn't connect to the conference: {{msg}}",
"connecting": "Connecting", "connecting": "Connecting",
"contactSupport": "Contact support", "contactSupport": "Contact support",
"copied": "Copied",
"copy": "Copy", "copy": "Copy",
"dismiss": "Dismiss", "dismiss": "Dismiss",
"displayNameRequired": "Hi! Whats your name?", "displayNameRequired": "Hi! Whats your name?",
@ -202,6 +205,8 @@
"enterDisplayName": "Please enter your name here", "enterDisplayName": "Please enter your name here",
"error": "Error", "error": "Error",
"gracefulShutdown": "Our service is currently down for maintenance. Please try again later.", "gracefulShutdown": "Our service is currently down for maintenance. Please try again later.",
"grantModeratorDialog": "Are you sure you want to make this participant a moderator?",
"grantModeratorTitle": "Grant moderator",
"IamHost": "I am the host", "IamHost": "I am the host",
"incorrectRoomLockPassword": "Incorrect password", "incorrectRoomLockPassword": "Incorrect password",
"incorrectPassword": "Incorrect username or password", "incorrectPassword": "Incorrect username or password",
@ -313,6 +318,9 @@
"e2ee": { "e2ee": {
"labelToolTip": "Audio and Video Communication on this call is end-to-end encrypted" "labelToolTip": "Audio and Video Communication on this call is end-to-end encrypted"
}, },
"embedMeeting": {
"title": "Embed this meeting"
},
"feedback": { "feedback": {
"average": "Average", "average": "Average",
"bad": "Bad", "bad": "Bad",
@ -498,6 +506,7 @@
"audioAndVideoError": "Audio and video error:", "audioAndVideoError": "Audio and video error:",
"audioOnlyError": "Audio error:", "audioOnlyError": "Audio error:",
"audioTrackError": "Could not create audio track.", "audioTrackError": "Could not create audio track.",
"calling": "Calling",
"callMe": "Call me", "callMe": "Call me",
"callMeAtNumber": "Call me at this number:", "callMeAtNumber": "Call me at this number:",
"configuringDevices": "Configuring devices...", "configuringDevices": "Configuring devices...",
@ -521,7 +530,8 @@
"linkCopied": "Link copied to clipboard", "linkCopied": "Link copied to clipboard",
"lookGood": "It sounds like your microphone is working properly", "lookGood": "It sounds like your microphone is working properly",
"or": "or", "or": "or",
"calling": "Calling", "premeeting": "Pre meeting",
"showScreen": "Enable pre meeting screen",
"startWithPhone": "Start with phone audio", "startWithPhone": "Start with phone audio",
"screenSharingError": "Screen sharing error:", "screenSharingError": "Screen sharing error:",
"videoOnlyError": "Video error:", "videoOnlyError": "Video error:",
@ -665,9 +675,11 @@
"chat": "Toggle chat window", "chat": "Toggle chat window",
"document": "Toggle shared document", "document": "Toggle shared document",
"download": "Download our apps", "download": "Download our apps",
"embedMeeting": "Embed meeting",
"e2ee": "End-to-End Encryption", "e2ee": "End-to-End Encryption",
"feedback": "Leave feedback", "feedback": "Leave feedback",
"fullScreen": "Toggle full screen", "fullScreen": "Toggle full screen",
"grantModerator": "Grant Moderator",
"hangup": "Leave the call", "hangup": "Leave the call",
"help": "Help", "help": "Help",
"invite": "Invite people", "invite": "Invite people",
@ -712,6 +724,7 @@
"documentOpen": "Open shared document", "documentOpen": "Open shared document",
"download": "Download our apps", "download": "Download our apps",
"e2ee": "End-to-End Encryption", "e2ee": "End-to-End Encryption",
"embedMeeting": "Embed meeting",
"enterFullScreen": "View full screen", "enterFullScreen": "View full screen",
"enterTileView": "Enter tile view", "enterTileView": "Enter tile view",
"exitFullScreen": "Exit full screen", "exitFullScreen": "Exit full screen",
@ -816,6 +829,7 @@
"domute": "Mute", "domute": "Mute",
"domuteOthers": "Mute everyone else", "domuteOthers": "Mute everyone else",
"flip": "Flip", "flip": "Flip",
"grantModerator": "Grant Moderator",
"kick": "Kick out", "kick": "Kick out",
"moderator": "Moderator", "moderator": "Moderator",
"mute": "Participant is muted", "mute": "Participant is muted",
@ -839,16 +853,17 @@
"connectCalendarText": "Connect your calendar to view all your meetings in {{app}}. Plus, add {{provider}} meetings to your calendar and start them with one click.", "connectCalendarText": "Connect your calendar to view all your meetings in {{app}}. Plus, add {{provider}} meetings to your calendar and start them with one click.",
"enterRoomTitle": "Start a new meeting", "enterRoomTitle": "Start a new meeting",
"getHelp": "Get help", "getHelp": "Get help",
"roomNameAllowedChars": "Meeting name should not contain any of these characters: ?, &, :, ', \", %, #.",
"go": "GO", "go": "GO",
"goSmall": "GO", "goSmall": "GO",
"join": "CREATE / JOIN",
"info": "Info", "info": "Info",
"join": "CREATE / JOIN",
"moderatedMessage": "Or <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">book a meeting URL</a> in advance where you are the only moderator.",
"privacy": "Privacy", "privacy": "Privacy",
"recentList": "Recent", "recentList": "Recent",
"recentListDelete": "Delete", "recentListDelete": "Delete",
"recentListEmpty": "Your recent list is currently empty. Chat with your team and you will find all your recent meetings here.", "recentListEmpty": "Your recent list is currently empty. Chat with your team and you will find all your recent meetings here.",
"reducedUIText": "Welcome to {{app}}!", "reducedUIText": "Welcome to {{app}}!",
"roomNameAllowedChars": "Meeting name should not contain any of these characters: ?, &, :, ', \", %, #.",
"roomname": "Enter room name", "roomname": "Enter room name",
"roomnameHint": "Enter the name or URL of the room you want to join. You may make a name up, just let the people you are meeting know it so that they enter the same name.", "roomnameHint": "Enter the name or URL of the room you want to join. You may make a name up, just let the people you are meeting know it so that they enter the same name.",
"sendFeedback": "Send feedback", "sendFeedback": "Send feedback",
@ -863,6 +878,7 @@
"header": "Help center" "header": "Help center"
}, },
"lobby": { "lobby": {
"knockingParticipantList": "Knocking participant list",
"allow": "Allow", "allow": "Allow",
"backToKnockModeButton": "No password, ask to join instead", "backToKnockModeButton": "No password, ask to join instead",
"dialogTitle": "Lobby mode", "dialogTitle": "Lobby mode",
@ -884,6 +900,11 @@
"knockButton": "Ask to Join", "knockButton": "Ask to Join",
"knockTitle": "Someone wants to join the meeting", "knockTitle": "Someone wants to join the meeting",
"nameField": "Enter your name", "nameField": "Enter your name",
"notificationLobbyAccessDenied": "{{targetParticipantName}} has been rejected to join by {{originParticipantName}}",
"notificationLobbyAccessGranted": "{{targetParticipantName}} has been allowed to join by {{originParticipantName}}",
"notificationLobbyDisabled": "Lobby has been disabled by {{originParticipantName}}",
"notificationLobbyEnabled": "Lobby has been enabled by {{originParticipantName}}",
"notificationTitle": "Lobby",
"passwordField": "Enter meeting password", "passwordField": "Enter meeting password",
"passwordJoinButton": "Join", "passwordJoinButton": "Join",
"reject": "Reject", "reject": "Reject",

View File

@ -21,6 +21,7 @@ import {
import { isEnabled as isDropboxEnabled } from '../../react/features/dropbox'; import { isEnabled as isDropboxEnabled } from '../../react/features/dropbox';
import { setE2EEKey } from '../../react/features/e2ee'; import { setE2EEKey } from '../../react/features/e2ee';
import { invite } from '../../react/features/invite'; import { invite } from '../../react/features/invite';
import { toggleLobbyMode } from '../../react/features/lobby/actions.web';
import { RECORDING_TYPES } from '../../react/features/recording/constants'; import { RECORDING_TYPES } from '../../react/features/recording/constants';
import { getActiveSession } from '../../react/features/recording/functions'; import { getActiveSession } from '../../react/features/recording/functions';
import { muteAllParticipants } from '../../react/features/remote-video-menu/actions'; import { muteAllParticipants } from '../../react/features/remote-video-menu/actions';
@ -89,6 +90,9 @@ function initCommands() {
APP.store.dispatch(muteAllParticipants(localIds)); APP.store.dispatch(muteAllParticipants(localIds));
}, },
'toggle-lobby': isLobbyEnabled => {
APP.store.dispatch(toggleLobbyMode(isLobbyEnabled));
},
'password': password => { 'password': password => {
const { conference, passwordRequired } const { conference, passwordRequired }
= APP.store.getState()['features/base/conference']; = APP.store.getState()['features/base/conference'];

View File

@ -31,6 +31,7 @@ const commands = {
displayName: 'display-name', displayName: 'display-name',
e2eeKey: 'e2ee-key', e2eeKey: 'e2ee-key',
email: 'email', email: 'email',
toggleLobby: 'toggle-lobby',
hangup: 'video-hangup', hangup: 'video-hangup',
muteEveryone: 'mute-everyone', muteEveryone: 'mute-everyone',
password: 'password', password: 'password',
@ -277,6 +278,7 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
this._transport = new Transport({ this._transport = new Transport({
backend: new PostMessageTransportBackend({ backend: new PostMessageTransportBackend({
postisOptions: { postisOptions: {
allowedOrigin: new URL(this._url).origin,
scope: `jitsi_meet_external_api_${id}`, scope: `jitsi_meet_external_api_${id}`,
window: this._frame.contentWindow window: this._frame.contentWindow
} }

View File

@ -6,6 +6,7 @@ const UI = {};
import EventEmitter from 'events'; import EventEmitter from 'events';
import Logger from 'jitsi-meet-logger'; import Logger from 'jitsi-meet-logger';
import { isMobileBrowser } from '../../react/features/base/environment/utils';
import { getLocalParticipant } from '../../react/features/base/participants'; import { getLocalParticipant } from '../../react/features/base/participants';
import { toggleChat } from '../../react/features/chat'; import { toggleChat } from '../../react/features/chat';
import { setDocumentUrl } from '../../react/features/etherpad'; import { setDocumentUrl } from '../../react/features/etherpad';
@ -15,7 +16,7 @@ import {
dockToolbox, dockToolbox,
setToolboxEnabled, setToolboxEnabled,
showToolbox showToolbox
} from '../../react/features/toolbox'; } from '../../react/features/toolbox/actions.web';
import UIEvents from '../../service/UI/UIEvents'; import UIEvents from '../../service/UI/UIEvents';
import EtherpadManager from './etherpad/Etherpad'; import EtherpadManager from './etherpad/Etherpad';
@ -154,6 +155,12 @@ UI.start = function() {
sharedVideoManager = new SharedVideoManager(eventEmitter); sharedVideoManager = new SharedVideoManager(eventEmitter);
if (isMobileBrowser()) {
$('body').addClass('mobile-browser');
} else {
$('body').addClass('desktop-browser');
}
if (interfaceConfig.filmStripOnly) { if (interfaceConfig.filmStripOnly) {
$('body').addClass('filmstrip-only'); $('body').addClass('filmstrip-only');
APP.store.dispatch(setNotificationsEnabled(false)); APP.store.dispatch(setNotificationsEnabled(false));

View File

@ -1,7 +1,7 @@
/* global $, APP, interfaceConfig */ /* global $, APP, interfaceConfig */
import { getSharedDocumentUrl, setDocumentEditingState } from '../../../react/features/etherpad'; import { getSharedDocumentUrl, setDocumentEditingState } from '../../../react/features/etherpad';
import { getToolboxHeight } from '../../../react/features/toolbox'; import { getToolboxHeight } from '../../../react/features/toolbox/functions.web';
import Filmstrip from '../videolayout/Filmstrip'; import Filmstrip from '../videolayout/Filmstrip';
import LargeContainer from '../videolayout/LargeContainer'; import LargeContainer from '../videolayout/LargeContainer';
import VideoLayout from '../videolayout/VideoLayout'; import VideoLayout from '../videolayout/VideoLayout';

View File

@ -12,11 +12,9 @@ import {
participantLeft, participantLeft,
pinParticipant pinParticipant
} from '../../../react/features/base/participants'; } from '../../../react/features/base/participants';
import { import { dockToolbox, showToolbox } from '../../../react/features/toolbox/actions.web';
dockToolbox, import { getToolboxHeight } from '../../../react/features/toolbox/functions.web';
getToolboxHeight, import { YOUTUBE_PARTICIPANT_NAME } from '../../../react/features/youtube-player/constants';
showToolbox
} from '../../../react/features/toolbox';
import UIEvents from '../../../service/UI/UIEvents'; import UIEvents from '../../../service/UI/UIEvents';
import UIUtil from '../util/UIUtil'; import UIUtil from '../util/UIUtil';
import Filmstrip from '../videolayout/Filmstrip'; import Filmstrip from '../videolayout/Filmstrip';
@ -305,7 +303,7 @@ export default class SharedVideoManager {
conference: APP.conference._room, conference: APP.conference._room,
id: self.url, id: self.url,
isFakeParticipant: true, isFakeParticipant: true,
name: 'YouTube' name: YOUTUBE_PARTICIPANT_NAME
})); }));
APP.store.dispatch(pinParticipant(self.url)); APP.store.dispatch(pinParticipant(self.url));

View File

@ -1,7 +1,7 @@
/* global $, APP */ /* global $, APP */
import { jitsiLocalStorage } from '@jitsi/js-utils';
import Logger from 'jitsi-meet-logger'; import Logger from 'jitsi-meet-logger';
import { jitsiLocalStorage } from 'js-utils';
import { import {
NOTIFICATION_TIMEOUT, NOTIFICATION_TIMEOUT,

View File

@ -12,6 +12,7 @@ import {
JitsiParticipantConnectionStatus JitsiParticipantConnectionStatus
} from '../../../react/features/base/lib-jitsi-meet'; } from '../../../react/features/base/lib-jitsi-meet';
import { VIDEO_TYPE } from '../../../react/features/base/media'; import { VIDEO_TYPE } from '../../../react/features/base/media';
import { CHAT_SIZE } from '../../../react/features/chat';
import { import {
updateKnownLargeVideoResolution updateKnownLargeVideoResolution
} from '../../../react/features/large-video'; } from '../../../react/features/large-video';
@ -323,7 +324,18 @@ export default class LargeVideoManager {
* Update container size. * Update container size.
*/ */
updateContainerSize() { updateContainerSize() {
this.width = UIUtil.getAvailableVideoWidth(); let widthToUse = UIUtil.getAvailableVideoWidth();
const { isOpen } = APP.store.getState()['features/chat'];
if (isOpen) {
/**
* If chat state is open, we re-compute the container width
* by subtracting the default width of the chat.
*/
widthToUse -= CHAT_SIZE;
}
this.width = widthToUse;
this.height = window.innerHeight; this.height = window.innerHeight;
} }

View File

@ -451,7 +451,7 @@ export default class SmallVideo {
*/ */
selectDisplayMode(input) { selectDisplayMode(input) {
// Display name is always and only displayed when user is on the stage // Display name is always and only displayed when user is on the stage
if (input.isCurrentlyOnLargeVideo && !input.tileViewEnabled) { if (input.isCurrentlyOnLargeVideo && !input.tileViewActive) {
return input.isVideoPlayable && !input.isAudioOnly ? DISPLAY_BLACKNESS_WITH_NAME : DISPLAY_AVATAR_WITH_NAME; return input.isVideoPlayable && !input.isAudioOnly ? DISPLAY_BLACKNESS_WITH_NAME : DISPLAY_AVATAR_WITH_NAME;
} else if (input.isVideoPlayable && input.hasVideo && !input.isAudioOnly) { } else if (input.isVideoPlayable && input.hasVideo && !input.isAudioOnly) {
// check hovering and change state to video with name // check hovering and change state to video with name
@ -472,7 +472,7 @@ export default class SmallVideo {
isCurrentlyOnLargeVideo: this.isCurrentlyOnLargeVideo(), isCurrentlyOnLargeVideo: this.isCurrentlyOnLargeVideo(),
isHovered: this._isHovered(), isHovered: this._isHovered(),
isAudioOnly: APP.conference.isAudioOnly(), isAudioOnly: APP.conference.isAudioOnly(),
tileViewEnabled: shouldDisplayTileView(APP.store.getState()), tileViewActive: shouldDisplayTileView(APP.store.getState()),
isVideoPlayable: this.isVideoPlayable(), isVideoPlayable: this.isVideoPlayable(),
hasVideo: Boolean(this.selectVideoElement().length), hasVideo: Boolean(this.selectVideoElement().length),
connectionStatus: APP.conference.getParticipantConnectionStatus(this.id), connectionStatus: APP.conference.getParticipantConnectionStatus(this.id),

View File

@ -1,6 +1,6 @@
// FIXME: change to '../API' when we update to webpack2. If we do this now all // FIXME: change to '../API' when we update to webpack2. If we do this now all
// files from API modules will be included in external_api.js. // files from API modules will be included in external_api.js.
import { PostMessageTransportBackend, Transport } from 'js-utils/transport'; import { PostMessageTransportBackend, Transport } from '@jitsi/js-utils/transport';
import { getJitsiMeetGlobalNS } from '../../react/features/base/util'; import { getJitsiMeetGlobalNS } from '../../react/features/base/util';
import { API_ID } from '../API/constants'; import { API_ID } from '../API/constants';

8957
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -20,7 +20,7 @@
"@atlaskit/dropdown-menu": "6.1.25", "@atlaskit/dropdown-menu": "6.1.25",
"@atlaskit/field-text": "7.0.19", "@atlaskit/field-text": "7.0.19",
"@atlaskit/field-text-area": "4.0.15", "@atlaskit/field-text-area": "4.0.15",
"@atlaskit/flag": "9.1.8", "@atlaskit/flag": "13.0.0",
"@atlaskit/icon": "15.0.3", "@atlaskit/icon": "15.0.3",
"@atlaskit/inline-dialog": "5.3.0", "@atlaskit/inline-dialog": "5.3.0",
"@atlaskit/inline-message": "7.0.10", "@atlaskit/inline-message": "7.0.10",
@ -32,6 +32,7 @@
"@atlaskit/theme": "7.0.2", "@atlaskit/theme": "7.0.2",
"@atlaskit/toggle": "5.0.14", "@atlaskit/toggle": "5.0.14",
"@atlaskit/tooltip": "12.1.13", "@atlaskit/tooltip": "12.1.13",
"@jitsi/js-utils": "1.0.1",
"@microsoft/microsoft-graph-client": "1.1.0", "@microsoft/microsoft-graph-client": "1.1.0",
"@react-native-community/async-storage": "1.3.4", "@react-native-community/async-storage": "1.3.4",
"@react-native-community/google-signin": "3.0.1", "@react-native-community/google-signin": "3.0.1",
@ -54,11 +55,10 @@
"jquery-contextmenu": "2.4.5", "jquery-contextmenu": "2.4.5",
"jquery-i18next": "1.2.1", "jquery-i18next": "1.2.1",
"js-md5": "0.6.1", "js-md5": "0.6.1",
"js-utils": "github:jitsi/js-utils#cf11996bd866fdb47326c59a5d3bc24be17282d4",
"jwt-decode": "2.2.0", "jwt-decode": "2.2.0",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#4fec06db7fc59a88021ec0b409eda47f21c42902", "lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#d37024751843711b219ebbe184c4d9c0ae99b7a3",
"libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d", "libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
"lodash": "4.17.13", "lodash": "4.17.19",
"moment": "2.19.4", "moment": "2.19.4",
"moment-duration-format": "2.2.2", "moment-duration-format": "2.2.2",
"pixelmatch": "5.1.0", "pixelmatch": "5.1.0",
@ -81,7 +81,7 @@
"react-native-svg-transformer": "0.13.0", "react-native-svg-transformer": "0.13.0",
"react-native-swipeout": "2.3.6", "react-native-swipeout": "2.3.6",
"react-native-watch-connectivity": "0.4.3", "react-native-watch-connectivity": "0.4.3",
"react-native-webrtc": "1.75.3", "react-native-webrtc": "1.84.0",
"react-native-webview": "7.4.1", "react-native-webview": "7.4.1",
"react-native-youtube-iframe": "1.2.3", "react-native-youtube-iframe": "1.2.3",
"react-redux": "7.1.0", "react-redux": "7.1.0",
@ -90,6 +90,7 @@
"redux": "4.0.4", "redux": "4.0.4",
"redux-thunk": "2.2.0", "redux-thunk": "2.2.0",
"rnnoise-wasm": "github:jitsi/rnnoise-wasm.git#566a16885897704d6e6d67a1d5ac5d39781db2af", "rnnoise-wasm": "github:jitsi/rnnoise-wasm.git#566a16885897704d6e6d67a1d5ac5d39781db2af",
"rtcstats": "github:jitsi/rtcstats#v6.1.3",
"styled-components": "3.4.9", "styled-components": "3.4.9",
"util": "0.12.1", "util": "0.12.1",
"uuid": "3.1.0", "uuid": "3.1.0",
@ -112,8 +113,8 @@
"babel-eslint": "10.0.1", "babel-eslint": "10.0.1",
"babel-loader": "8.0.4", "babel-loader": "8.0.4",
"circular-dependency-plugin": "5.2.0", "circular-dependency-plugin": "5.2.0",
"clean-css": "3.4.25", "clean-css-cli": "4.3.0",
"css-loader": "0.28.7", "css-loader": "3.6.0",
"eslint": "5.6.1", "eslint": "5.6.1",
"eslint-config-jitsi": "github:jitsi/eslint-config-jitsi#1.0.3", "eslint-config-jitsi": "github:jitsi/eslint-config-jitsi#1.0.3",
"eslint-plugin-flowtype": "2.50.3", "eslint-plugin-flowtype": "2.50.3",
@ -124,6 +125,7 @@
"expose-loader": "0.7.5", "expose-loader": "0.7.5",
"flow-bin": "0.104.0", "flow-bin": "0.104.0",
"imports-loader": "0.7.1", "imports-loader": "0.7.1",
"jest": "26.1.0",
"jetifier": "1.6.4", "jetifier": "1.6.4",
"metro-react-native-babel-preset": "0.56.0", "metro-react-native-babel-preset": "0.56.0",
"node-sass": "4.14.1", "node-sass": "4.14.1",
@ -143,6 +145,7 @@
"scripts": { "scripts": {
"lint": "eslint . && flow", "lint": "eslint . && flow",
"postinstall": "jetify", "postinstall": "jetify",
"test": "jest",
"validate": "npm ls" "validate": "npm ls"
}, },
"browser": { "browser": {

View File

@ -538,6 +538,26 @@ export function createRemoteVideoMenuButtonEvent(buttonName, attributes) {
}; };
} }
/**
* The rtcstats websocket onclose event. We send this to amplitude in order
* to detect trace ws prematurely closing.
*
* @param {Object} closeEvent - The event with which the websocket closed.
* @returns {Object} The event in a format suitable for sending via
* sendAnalytics.
*/
export function createRTCStatsTraceCloseEvent(closeEvent) {
const event = {
action: 'trace.onclose',
source: 'rtcstats'
};
event.code = closeEvent.code;
event.reason = closeEvent.reason;
return event;
}
/** /**
* Creates an event indicating that an action related to video blur * Creates an event indicating that an action related to video blur
* occurred (e.g. It was started or stopped). * occurred (e.g. It was started or stopped).

View File

@ -1,6 +1,7 @@
// @flow // @flow
import { API_ID } from '../../../modules/API'; import { API_ID } from '../../../modules/API/constants';
import { getName as getAppName } from '../app/functions';
import { import {
checkChromeExtensionsInstalled, checkChromeExtensionsInstalled,
isMobileBrowser isMobileBrowser
@ -30,6 +31,16 @@ export function sendAnalytics(event: Object) {
} }
} }
/**
* Return saved amplitude identity info such as session id, device id and user id. We assume these do not change for
* the duration of the conference.
*
* @returns {Object}
*/
export function getAmplitudeIdentity() {
return analytics.amplitudeIdentityProps;
}
/** /**
* Resets the analytics adapter to its initial state - removes handlers, cache, * Resets the analytics adapter to its initial state - removes handlers, cache,
* disabled state, etc. * disabled state, etc.
@ -92,6 +103,8 @@ export function createHandlers({ getState }: { getState: Function }) {
try { try {
const amplitude = new AmplitudeHandler(handlerConstructorOptions); const amplitude = new AmplitudeHandler(handlerConstructorOptions);
analytics.amplitudeIdentityProps = amplitude.getIdentityProps();
handlers.push(amplitude); handlers.push(amplitude);
// eslint-disable-next-line no-empty // eslint-disable-next-line no-empty
} catch (e) {} } catch (e) {}
@ -117,7 +130,9 @@ export function createHandlers({ getState }: { getState: Function }) {
}) })
.catch(e => { .catch(e => {
analytics.dispose(); analytics.dispose();
if (handlers.length !== 0) {
logger.error(e); logger.error(e);
}
return []; return [];
})); }));
@ -153,10 +168,13 @@ export function initAnalytics({ getState }: { getState: Function }, handlers: Ar
permanentProperties.group = group; permanentProperties.group = group;
} }
// Report the application name
permanentProperties.appName = getAppName();
// Report if user is using websocket // Report if user is using websocket
permanentProperties.websocket = navigator.product !== 'ReactNative' && typeof config.websocket === 'string'; permanentProperties.websocket = navigator.product !== 'ReactNative' && typeof config.websocket === 'string';
// permanentProperties is external api // Report if user is using the external API
permanentProperties.externalApi = typeof API_ID === 'number'; permanentProperties.externalApi = typeof API_ID === 'number';
// Report if we are loaded in iframe // Report if we are loaded in iframe

View File

@ -65,4 +65,17 @@ export default class AmplitudeHandler extends AbstractHandler {
this._extractName(event), this._extractName(event),
event); event);
} }
/**
* Return amplitude identity information.
*
* @returns {Object}
*/
getIdentityProps() {
return {
sessionId: amplitude.getInstance(this._amplitudeOptions).getSessionId(),
deviceId: amplitude.getInstance(this._amplitudeOptions).options.deviceId,
userId: amplitude.getInstance(this._amplitudeOptions).options.userId
};
}
} }

View File

@ -284,11 +284,12 @@ export function maybeRedirectToWelcomePage(options: Object = {}) {
// if close page is enabled redirect to it, without further action // if close page is enabled redirect to it, without further action
if (enableClosePage) { if (enableClosePage) {
const { isGuest } = getState()['features/base/jwt']; const { isGuest, jwt } = getState()['features/base/jwt'];
// save whether current user is guest or not, before navigating // save whether current user is guest or not, and pass auth token,
// to close page // before navigating to close page
window.sessionStorage.setItem('guest', isGuest); window.sessionStorage.setItem('guest', isGuest);
window.sessionStorage.setItem('jwt', jwt);
let path = 'close.html'; let path = 'close.html';

View File

@ -4,7 +4,9 @@ import React from 'react';
import { setColorScheme } from '../../base/color-scheme'; import { setColorScheme } from '../../base/color-scheme';
import { DialogContainer } from '../../base/dialog'; import { DialogContainer } from '../../base/dialog';
import { CALL_INTEGRATION_ENABLED, SERVER_URL_CHANGE_ENABLED, updateFlags } from '../../base/flags'; import { updateFlags } from '../../base/flags/actions';
import { CALL_INTEGRATION_ENABLED, SERVER_URL_CHANGE_ENABLED } from '../../base/flags/constants';
import { getFeatureFlag } from '../../base/flags/functions';
import { Platform } from '../../base/react'; import { Platform } from '../../base/react';
import { DimensionsDetector, clientResized } from '../../base/responsive-ui'; import { DimensionsDetector, clientResized } from '../../base/responsive-ui';
import { updateSettings } from '../../base/settings'; import { updateSettings } from '../../base/settings';
@ -83,11 +85,14 @@ export class App extends AbstractApp {
super.componentDidMount(); super.componentDidMount();
this._init.then(() => { this._init.then(() => {
const { dispatch, getState } = this.state.store;
// We set these early enough so then we avoid any unnecessary re-renders. // We set these early enough so then we avoid any unnecessary re-renders.
const { dispatch } = this.state.store; dispatch(setColorScheme(this.props.colorScheme));
dispatch(updateFlags(this.props.flags));
// Check if serverURL is configured externally and not allowed to change. // Check if serverURL is configured externally and not allowed to change.
const serverURLChangeEnabled = this.props.flags[SERVER_URL_CHANGE_ENABLED]; const serverURLChangeEnabled = getFeatureFlag(getState(), SERVER_URL_CHANGE_ENABLED, true);
if (!serverURLChangeEnabled) { if (!serverURLChangeEnabled) {
// As serverURL is provided externally, so we push it to settings. // As serverURL is provided externally, so we push it to settings.
@ -100,8 +105,6 @@ export class App extends AbstractApp {
} }
} }
dispatch(setColorScheme(this.props.colorScheme));
dispatch(updateFlags(this.props.flags));
dispatch(updateSettings(this.props.userInfo || {})); dispatch(updateSettings(this.props.userInfo || {}));
// Update settings with feature-flag. // Update settings with feature-flag.

View File

@ -1,6 +1,6 @@
// @flow // @flow
import { generateRoomWithoutSeparator } from 'js-utils/random'; import { generateRoomWithoutSeparator } from '@jitsi/js-utils/random';
import type { Component } from 'react'; import type { Component } from 'react';
import { isRoomValid } from '../base/conference'; import { isRoomValid } from '../base/conference';

View File

@ -37,10 +37,12 @@ import '../recent-list/middleware';
import '../recording/middleware'; import '../recording/middleware';
import '../rejoin/middleware'; import '../rejoin/middleware';
import '../room-lock/middleware'; import '../room-lock/middleware';
import '../rtcstats/middleware';
import '../subtitles/middleware'; import '../subtitles/middleware';
import '../toolbox/middleware'; import '../toolbox/middleware';
import '../transcribing/middleware'; import '../transcribing/middleware';
import '../video-layout/middleware'; import '../video-layout/middleware';
import '../video-quality/middleware';
import '../videosipgw/middleware'; import '../videosipgw/middleware';
import './middleware'; import './middleware';

View File

@ -11,6 +11,7 @@ import '../base/dialog/reducer';
import '../base/flags/reducer'; import '../base/flags/reducer';
import '../base/jwt/reducer'; import '../base/jwt/reducer';
import '../base/known-domains/reducer'; import '../base/known-domains/reducer';
import '../base/lastn/reducer';
import '../base/lib-jitsi-meet/reducer'; import '../base/lib-jitsi-meet/reducer';
import '../base/logging/reducer'; import '../base/logging/reducer';
import '../base/media/reducer'; import '../base/media/reducer';

View File

@ -1,6 +1,6 @@
// @flow // @flow
import { jitsiLocalStorage } from 'js-utils'; import { jitsiLocalStorage } from '@jitsi/js-utils';
import _ from 'lodash'; import _ from 'lodash';
import React, { Component, Fragment } from 'react'; import React, { Component, Fragment } from 'react';
import { I18nextProvider } from 'react-i18next'; import { I18nextProvider } from 'react-i18next';
@ -122,14 +122,14 @@ export default class BaseApp extends Component<*, State> {
* @returns {ReactElement} * @returns {ReactElement}
*/ */
render() { render() {
const { route: { component }, store } = this.state; const { route: { component, props }, store } = this.state;
if (store) { if (store) {
return ( return (
<I18nextProvider i18n = { i18next }> <I18nextProvider i18n = { i18next }>
<Provider store = { store }> <Provider store = { store }>
<Fragment> <Fragment>
{ this._createMainElement(component) } { this._createMainElement(component, props) }
<SoundCollection /> <SoundCollection />
{ this._createExtraElement() } { this._createExtraElement() }
{ this._renderDialogContainer() } { this._renderDialogContainer() }

View File

@ -58,6 +58,11 @@ export type Props = {
*/ */
status?: ?string, status?: ?string,
/**
* TestId of the element, if any.
*/
testId?: string,
/** /**
* URL of the avatar, if any. * URL of the avatar, if any.
*/ */
@ -122,6 +127,7 @@ class Avatar<P: Props> extends PureComponent<P, State> {
id, id,
size, size,
status, status,
testId,
url url
} = this.props; } = this.props;
const { avatarFailed } = this.state; const { avatarFailed } = this.state;
@ -134,6 +140,7 @@ class Avatar<P: Props> extends PureComponent<P, State> {
onAvatarLoadError: undefined, onAvatarLoadError: undefined,
size, size,
status, status,
testId,
url: undefined url: undefined
}; };

View File

@ -25,7 +25,12 @@ type Props = AbstractProps & {
/** /**
* One of the expected status strings (e.g. 'available') to render a badge on the avatar, if necessary. * One of the expected status strings (e.g. 'available') to render a badge on the avatar, if necessary.
*/ */
status?: ?string status?: ?string,
/**
* TestId of the element, if any.
*/
testId?: string
}; };
/** /**
@ -45,6 +50,7 @@ export default class StatelessAvatar extends AbstractStatelessAvatar<Props> {
return ( return (
<div <div
className = { `${this._getAvatarClassName()} ${this._getBadgeClassName()}` } className = { `${this._getAvatarClassName()} ${this._getBadgeClassName()}` }
data-testid = { this.props.testId }
id = { this.props.id } id = { this.props.id }
style = { this._getAvatarStyle(this.props.color) }> style = { this._getAvatarStyle(this.props.color) }>
<Icon <Icon
@ -59,6 +65,7 @@ export default class StatelessAvatar extends AbstractStatelessAvatar<Props> {
<div className = { this._getBadgeClassName() }> <div className = { this._getBadgeClassName() }>
<img <img
className = { this._getAvatarClassName() } className = { this._getAvatarClassName() }
data-testid = { this.props.testId }
id = { this.props.id } id = { this.props.id }
onError = { this.props.onAvatarLoadError } onError = { this.props.onAvatarLoadError }
src = { url } src = { url }
@ -71,6 +78,7 @@ export default class StatelessAvatar extends AbstractStatelessAvatar<Props> {
return ( return (
<div <div
className = { `${this._getAvatarClassName()} ${this._getBadgeClassName()}` } className = { `${this._getAvatarClassName()} ${this._getBadgeClassName()}` }
data-testid = { this.props.testId }
id = { this.props.id } id = { this.props.id }
style = { this._getAvatarStyle(this.props.color) }> style = { this._getAvatarStyle(this.props.color) }>
<svg <svg
@ -97,6 +105,7 @@ export default class StatelessAvatar extends AbstractStatelessAvatar<Props> {
<div className = { this._getBadgeClassName() }> <div className = { this._getBadgeClassName() }>
<img <img
className = { this._getAvatarClassName('defaultAvatar') } className = { this._getAvatarClassName('defaultAvatar') }
data-testid = { this.props.testId }
id = { this.props.id } id = { this.props.id }
src = { this.props.defaultAvatar || 'images/avatar.png' } src = { this.props.defaultAvatar || 'images/avatar.png' }
style = { this._getAvatarStyle() } /> style = { this._getAvatarStyle() } />

View File

@ -0,0 +1,125 @@
// @flow
import React, { useState } from 'react';
import { translate } from '../../base/i18n';
import { Icon, IconCheck, IconCopy } from '../../base/icons';
import { copyText } from '../../base/util';
type Props = {
/**
* Css class to apply on container
*/
className: string,
/**
* The displayed text
*/
displayedText: string,
/**
* The text that needs to be copied (might differ from the displayedText)
*/
textToCopy: string,
/**
* The text displayed on mouse hover
*/
textOnHover: string,
/**
* The text displayed on copy success
*/
textOnCopySuccess: string
};
/**
* Component meant to enable users to copy the conference URL.
*
* @returns {React$Element<any>}
*/
function CopyButton({ className, displayedText, textToCopy, textOnHover, textOnCopySuccess }: Props) {
const [ isClicked, setIsClicked ] = useState(false);
const [ isHovered, setIsHovered ] = useState(false);
/**
* Click handler for the element.
*
* @returns {void}
*/
function onClick() {
setIsHovered(false);
if (copyText(textToCopy)) {
setIsClicked(true);
setTimeout(() => {
setIsClicked(false);
}, 2500);
}
}
/**
* Hover handler for the element.
*
* @returns {void}
*/
function onHoverIn() {
if (!isClicked) {
setIsHovered(true);
}
}
/**
* Hover handler for the element.
*
* @returns {void}
*/
function onHoverOut() {
setIsHovered(false);
}
/**
* Renders the content of the link based on the state.
*
* @returns {React$Element<any>}
*/
function renderContent() {
if (isClicked) {
return (
<>
<div className = 'copy-button-content selected'>
{textOnCopySuccess}
</div>
<Icon src = { IconCheck } />
</>
);
}
return (
<>
<div className = 'copy-button-content'>
{isHovered ? textOnHover : displayedText}
</div>
<Icon src = { IconCopy } />
</>
);
}
return (
<div
className = { `${className} copy-button${isClicked ? ' clicked' : ''}` }
onClick = { onClick }
onMouseOut = { onHoverOut }
onMouseOver = { onHoverIn }>
{ renderContent() }
</div>
);
}
CopyButton.defaultProps = {
className: ''
};
export default translate(CopyButton);

View File

@ -117,14 +117,15 @@ StateListenerRegistry.register(
maxReceiverVideoQuality, maxReceiverVideoQuality,
preferredVideoQuality preferredVideoQuality
} = currentState; } = currentState;
const changedConference = conference !== previousState.conference;
const changedPreferredVideoQuality const changedPreferredVideoQuality
= preferredVideoQuality !== previousState.preferredVideoQuality; = preferredVideoQuality !== previousState.preferredVideoQuality;
const changedMaxVideoQuality = maxReceiverVideoQuality !== previousState.maxReceiverVideoQuality; const changedMaxVideoQuality = maxReceiverVideoQuality !== previousState.maxReceiverVideoQuality;
if (changedPreferredVideoQuality || changedMaxVideoQuality) { if (changedConference || changedPreferredVideoQuality || changedMaxVideoQuality) {
_setReceiverVideoConstraint(conference, preferredVideoQuality, maxReceiverVideoQuality); _setReceiverVideoConstraint(conference, preferredVideoQuality, maxReceiverVideoQuality);
} }
if (changedPreferredVideoQuality) { if (changedConference || changedPreferredVideoQuality) {
_setSenderVideoConstraint(conference, preferredVideoQuality); _setSenderVideoConstraint(conference, preferredVideoQuality);
} }
}); });
@ -460,7 +461,10 @@ function _sendTones({ getState }, next, action) {
*/ */
function _setReceiverVideoConstraint(conference, preferred, max) { function _setReceiverVideoConstraint(conference, preferred, max) {
if (conference) { if (conference) {
conference.setReceiverVideoConstraint(Math.min(preferred, max)); const value = Math.min(preferred, max);
conference.setReceiverVideoConstraint(value);
logger.info(`setReceiverVideoConstraint: ${value}`);
} }
} }

View File

@ -1,6 +1,6 @@
// @flow // @flow
import { jitsiLocalStorage } from 'js-utils'; import { jitsiLocalStorage } from '@jitsi/js-utils';
import type { Dispatch } from 'redux'; import type { Dispatch } from 'redux';
import { addKnownDomains } from '../known-domains'; import { addKnownDomains } from '../known-domains';

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