Compare commits

..

1 Commits

Author SHA1 Message Date
Hristo Terezov
9235000a7f ref(remote-control): Use React/Redux. 2020-12-11 14:24:33 -06:00
89 changed files with 1915 additions and 4033 deletions

1
.gitignore vendored
View File

@@ -69,7 +69,6 @@ buck-out/
*.framework
android/app/debug
android/app/release
ios/sdk/out
# precommit-hook
.jshintignore

View File

@@ -25,5 +25,5 @@ android.enableDexingArtifactTransform.desugaring=false
android.useAndroidX=true
android.enableJetifier=true
appVersion=20.6.0
sdkVersion=2.12.0
appVersion=20.5.0
sdkVersion=2.11.0

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.jitsi.meet.sdk">
<!-- XXX ACCESS_NETWORK_STATE is required by WebRTC. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -35,7 +34,7 @@
android:launchMode="singleTask"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:windowSoftInputMode="adjustResize"/>
android:windowSoftInputMode="adjustResize"></activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
<service
@@ -49,13 +48,6 @@
<service
android:name="org.jitsi.meet.sdk.JitsiMeetOngoingConferenceService"
android:foregroundServiceType="mediaProjection" />
<provider
android:name="com.reactnativecommunity.webview.RNCWebViewFileProvider"
android:authorities="${applicationId}.fileprovider"
android:enabled="false"
tools:replace="android:authorities">
</provider>
</application>
</manifest>

View File

@@ -16,11 +16,8 @@
package org.jitsi.meet.sdk;
import android.media.AudioAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioFocusRequest;
import android.media.AudioManager;
import android.os.Build;
import java.util.HashSet;
import java.util.Set;
@@ -63,7 +60,7 @@ class AudioDeviceHandlerGeneric implements
private AudioManager audioManager;
/**
* {@link Runnable} for running audio device detection in the audio thread.
* {@link Runnable} for running audio device detection the main thread.
* This is only used on Android >= M.
*/
private final Runnable onAudioDeviceChangeRunner = new Runnable() {
@@ -145,7 +142,7 @@ class AudioDeviceHandlerGeneric implements
// Some other application potentially stole our audio focus
// temporarily. Restore our mode.
if (audioFocusLost) {
module.resetAudioRoute();
module.updateAudioRoute();
}
audioFocusLost = false;
break;
@@ -219,24 +216,8 @@ class AudioDeviceHandlerGeneric implements
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setMicrophoneMute(false);
int gotFocus;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
gotFocus = audioManager.requestAudioFocus(new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.build()
)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(this)
.build()
);
} else {
gotFocus = audioManager.requestAudioFocus(this, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN);
}
if (gotFocus == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
if (audioManager.requestAudioFocus(this, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN)
== AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
JitsiMeetLogger.w(TAG + " Audio focus request failed");
return false;
}

View File

@@ -16,7 +16,6 @@
package org.jitsi.meet.sdk;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Build;
@@ -257,7 +256,7 @@ class AudioModeModule extends ReactContextBaseJavaModule {
if (mode != -1) {
JitsiMeetLogger.i(TAG + " User selected device set to: " + device);
userSelectedDevice = device;
updateAudioRoute(mode, false);
updateAudioRoute(mode);
}
}
});
@@ -277,22 +276,13 @@ class AudioModeModule extends ReactContextBaseJavaModule {
return;
}
Activity currentActivity = getCurrentActivity();
if (currentActivity != null) {
if (mode == DEFAULT) {
currentActivity.setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE);
} else {
currentActivity.setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
}
}
runInAudioThread(new Runnable() {
@Override
public void run() {
boolean success;
try {
success = updateAudioRoute(mode, false);
success = updateAudioRoute(mode);
} catch (Throwable e) {
success = false;
JitsiMeetLogger.e(e, TAG + " Failed to update audio route for mode: " + mode);
@@ -331,7 +321,7 @@ class AudioModeModule extends ReactContextBaseJavaModule {
* @return {@code true} if the audio route was updated successfully;
* {@code false}, otherwise.
*/
private boolean updateAudioRoute(int mode, boolean force) {
private boolean updateAudioRoute(int mode) {
JitsiMeetLogger.i(TAG + " Update audio route for mode: " + mode);
if (!audioDeviceHandler.setMode(mode)) {
@@ -366,7 +356,7 @@ class AudioModeModule extends ReactContextBaseJavaModule {
// If the previously selected device and the current default one
// match, do nothing.
if (!force && selectedDevice != null && selectedDevice.equals(audioDevice)) {
if (selectedDevice != null && selectedDevice.equals(audioDevice)) {
return true;
}
@@ -431,16 +421,7 @@ class AudioModeModule extends ReactContextBaseJavaModule {
*/
void updateAudioRoute() {
if (mode != -1) {
updateAudioRoute(mode, false);
}
}
/**
* Re-sets the current audio route. Needed when focus is lost and regained.
*/
void resetAudioRoute() {
if (mode != -1) {
updateAudioRoute(mode, true);
updateAudioRoute(mode);
}
}

View File

@@ -594,42 +594,6 @@ export default {
};
},
/**
* Displays error notifications according to the state carried by {@code errors} object returned
* by {@link createInitialLocalTracks}.
* @param {Object} errors - the errors (if any) returned by {@link createInitialLocalTracks}.
*
* @returns {void}
* @private
*/
_displayErrorsForCreateInitialLocalTracks(errors) {
const {
audioAndVideoError,
audioOnlyError,
screenSharingError,
videoOnlyError
} = errors;
// FIXME If there will be microphone error it will cover any screensharing dialog, but it's still better than in
// the reverse order where the screensharing dialog will sometimes be closing the microphone alert
// ($.prompt.close(); is called). Need to figure out dialogs chaining to fix that.
if (screenSharingError) {
this._handleScreenSharingError(screenSharingError);
}
if (audioAndVideoError || audioOnlyError) {
if (audioOnlyError || videoOnlyError) {
// If both requests for 'audio' + 'video' and 'audio' only failed, we assume that there are some
// problems with user's microphone and show corresponding dialog.
APP.store.dispatch(notifyMicError(audioOnlyError));
APP.store.dispatch(notifyCameraError(videoOnlyError));
} else {
// If request for 'audio' + 'video' failed, but request for 'audio' only was OK, we assume that we had
// problems with camera and show corresponding dialog.
APP.store.dispatch(notifyCameraError(audioAndVideoError));
}
}
},
/**
* Creates local media tracks and connects to a room. Will show error
* dialogs in case accessing the local microphone and/or camera failed. Will
@@ -650,11 +614,38 @@ export default {
*/
createInitialLocalTracksAndConnect(roomName, options = {}) {
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks(options);
const {
audioAndVideoError,
audioOnlyError,
screenSharingError,
videoOnlyError
} = errors;
return Promise.all([ tryCreateLocalTracks, connect(roomName) ])
.then(([ tracks, con ]) => {
this._displayErrorsForCreateInitialLocalTracks(errors);
// FIXME If there will be microphone error it will cover any
// screensharing dialog, but it's still better than in
// the reverse order where the screensharing dialog will
// sometimes be closing the microphone alert ($.prompt.close();
// is called). Need to figure out dialogs chaining to fix that.
if (screenSharingError) {
this._handleScreenSharingError(screenSharingError);
}
if (audioAndVideoError || audioOnlyError) {
if (audioOnlyError || videoOnlyError) {
// If both requests for 'audio' + 'video' and 'audio'
// only failed, we assume that there are some problems
// with user's microphone and show corresponding dialog.
APP.store.dispatch(notifyMicError(audioOnlyError));
APP.store.dispatch(notifyCameraError(videoOnlyError));
} else {
// If request for 'audio' + 'video' failed, but request
// for 'audio' only was OK, we assume that we had
// problems with camera and show corresponding dialog.
APP.store.dispatch(
notifyCameraError(audioAndVideoError));
}
}
return [ tracks, con ];
});
@@ -762,15 +753,7 @@ export default {
// they may remain as empty strings.
this._initDeviceList(true);
if (isPrejoinPageVisible(APP.store.getState())) {
return APP.store.dispatch(initPrejoin(tracks, errors));
}
logger.debug('Prejoin screen no longer displayed at the time when tracks were created');
this._displayErrorsForCreateInitialLocalTracks(errors);
return this._setLocalAudioVideoStreams(tracks);
return APP.store.dispatch(initPrejoin(tracks, errors));
}
const [ tracks, con ] = await this.createInitialLocalTracksAndConnect(

View File

@@ -14,6 +14,9 @@ var config = {
// Domain for authenticated users. Defaults to <domain>.
// authdomain: 'jitsi-meet.example.com',
// Call control component (Jigasi).
// call_control: 'callcontrol.jitsi-meet.example.com',
// Focus component domain. Defaults to focus.<domain>.
// focus: 'focus.jitsi-meet.example.com',
@@ -91,11 +94,6 @@ var config = {
// input and will suggest another valid device if one is present.
enableNoAudioDetection: true,
// Enabling this will show a "Save Logs" link in the GSM popover that can be
// used to collect debug information (XMPP IQs, SDP offer/answer cycles)
// about the call.
// enableSaveLogs: false,
// Enabling this will run the lib-jitsi-meet noise detection module which will
// notify the user if there is noise, other than voice, coming from the current
// selected microphone. The purpose it to let the user know that the input could
@@ -122,7 +120,7 @@ var config = {
// Valid values are in the range 6000 to 510000
// opusMaxAverageBitrate: 20000,
// Enables support for opus-red (redundancy for Opus).
// Enables redundancy for Opus
// enableOpusRed: false
// Video
@@ -304,11 +302,18 @@ var config = {
// Disables or enables RTX (RFC 4588) (defaults to false).
// disableRtx: false,
// Disables or enables TCC support in this client (default: enabled).
// Disables or enables TCC (the default is in Jicofo and set to true)
// (draft-holmer-rmcat-transport-wide-cc-extensions-01). This setting
// affects congestion control, it practically enables send-side bandwidth
// estimations.
// enableTcc: true,
// Disables or enables REMB support in this client (default: enabled).
// enableRemb: true,
// Disables or enables REMB (the default is in Jicofo and set to false)
// (draft-alvestrand-rmcat-remb-03). This setting affects congestion
// control, it practically enables recv-side bandwidth estimations. When
// both TCC and REMB are enabled, TCC takes precedence. When both are
// disabled, then bandwidth estimations are disabled.
// enableRemb: false,
// Enables ICE restart logic in LJM and displays the page reload overlay on
// ICE failure. Current disabled by default because it's causing issues with
@@ -318,11 +323,23 @@ var config = {
// TCC sequence numbers starting from 0.
// enableIceRestart: false,
// Defines the minimum number of participants to start a call (the default
// is set in Jicofo and set to 2).
// minParticipants: 2,
// Use TURN/UDP servers for the jitsi-videobridge connection (by default
// we filter out TURN/UDP because it is usually not needed since the
// bridge itself is reachable via UDP)
// useTurnUdp: false
// Enables / disables a data communication channel with the Videobridge.
// Values can be 'datachannel', 'websocket', true (treat it as
// 'datachannel'), undefined (treat it as 'datachannel') and false (don't
// open any channel).
// openBridgeChannel: true,
openBridgeChannel: 'websocket',
// UI
//
@@ -367,13 +384,6 @@ var config = {
// When 'true', it shows an intermediate page before joining, where the user can configure their devices.
// prejoinPageEnabled: false,
// If etherpad integration is enabled, setting this to true will
// automatically open the etherpad when a participant joins. This
// does not affect the mobile app since opening an etherpad
// obscures the conference controls -- it's better to let users
// choose to open the pad on their own in that case.
// openSharedDocumentOnJoin: false,
// 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
// set or the lobby is not enabled.
@@ -383,9 +393,6 @@ var config = {
// Document should be focused for this option to work
// enableAutomaticUrlCopy: false,
// Base URL for a Gravatar-compatible service. Defaults to libravatar.
// gravatarBaseURL: 'https://seccdn.libravatar.org/avatar/';
// Stats
//
@@ -598,9 +605,6 @@ var config = {
// If set to true all muting operations of remote participants will be disabled.
// disableRemoteMute: true,
// Enables support for lip-sync for this client (if the browser supports it).
// enableLipSync: false
/**
External API url used to receive branding specific information.
If there is no url set or there are missing fields, the defaults are applied.
@@ -623,12 +627,6 @@ var config = {
// otherwise the app doesn't render it.
// moderatedRoomServiceUrl: 'https://moderated.jitsi-meet.example.com',
// Hides the conference timer.
// hideConferenceTimer: true,
// Sets the conference subject
// subject: 'Conference Subject',
// List of undocumented settings used in jitsi-meet
/**
_immediateReloadThreshold
@@ -675,11 +673,12 @@ var config = {
disableAP
disableHPF
disableNS
enableLipSync
enableTalkWhileMuted
forceJVB121Ratio
forceTurnRelay
hiddenDomain
ignoreStartMuted
startBitrate
*/

View File

@@ -15,8 +15,9 @@
box-sizing: border-box;
display: flex;
flex-direction: column;
height: 100vh;
height: calc(100vh - 200px);
width: 100vw;
margin: 100px 0px;
}
.filmstrip__videos .videocontainer {
@@ -94,7 +95,7 @@
border: 0;
box-sizing: border-box;
display: block;
margin: 2px;
margin: 5px;
}
video {

View File

@@ -1,7 +1,6 @@
platform :ios, '11.0'
workspace 'jitsi-meet'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
install! 'cocoapods', :deterministic_uuids => false
target 'jitsi-meet' do
project 'app/app.xcodeproj'

View File

@@ -293,10 +293,10 @@ PODS:
- React
- react-native-splash-screen (3.2.0):
- React
- react-native-webrtc (1.87.1):
- React-Core
- react-native-webview (11.0.2):
- react-native-webrtc (1.84.1):
- React-Core
- react-native-webview (10.9.0):
- React
- React-RCTActionSheet (0.61.5-jitsi.2):
- React-Core/RCTActionSheetHeaders (= 0.61.5-jitsi.2)
- React-RCTAnimation (0.61.5-jitsi.2):
@@ -562,8 +562,8 @@ SPEC CHECKSUMS:
react-native-keep-awake: eba3137546b10003361b37c761f6c429b59814ae
react-native-netinfo: 8d8db463bcc5db66a8ac5c48a7d86beb3b92f61a
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
react-native-webrtc: 40eca4cac200fda34fb843da07e3402211bbbd10
react-native-webview: b2542d6fd424bcc3e3b2ec5f854f0abb4ec86c87
react-native-webrtc: edd689b0d5a462d7a6f6f52bca3f9414fc0ee11c
react-native-webview: 6ee7868ca8eba635dbf7963986d1ab7959da0391
React-RCTActionSheet: bcbc311dc3b47bc8efb2737ff0940239a45789a9
React-RCTAnimation: 65f61080ce632f6dea23d52e354ffac9948396c6
React-RCTBlob: 70d88f7b68b5c44953cdb286ac2e36a7a509a97e
@@ -582,6 +582,6 @@ SPEC CHECKSUMS:
RNWatch: a5320c959c75e72845c07985f3e935e58998f1d3
Yoga: 96b469c5e81ff51b917b92e8c3390642d4ded30c
PODFILE CHECKSUM: f6626cd705333112182cedbe175ae2f9006e8874
PODFILE CHECKSUM: f2400f8e5a52c4d91697cbacba6956569efc5ab8
COCOAPODS: 1.10.0
COCOAPODS: 1.9.3

View File

@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 52;
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -13,6 +13,8 @@
0B412F211EDEE95300B1A0A6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0B412F201EDEE95300B1A0A6 /* Main.storyboard */; };
0B5418471F7C5D8C00A2DD86 /* MeetingRowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B5418461F7C5D8C00A2DD86 /* MeetingRowController.swift */; };
0B7001701F7C51CC005944F4 /* InCallController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B70016F1F7C51CC005944F4 /* InCallController.swift */; };
0BD6B4371EF82A6B00D1F4CD /* WebRTC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0BD6B4361EF82A6B00D1F4CD /* WebRTC.framework */; };
0BD6B4381EF82A6B00D1F4CD /* WebRTC.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0BD6B4361EF82A6B00D1F4CD /* WebRTC.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
0BEA5C291F7B8F73000D0AB4 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0BEA5C271F7B8F73000D0AB4 /* Interface.storyboard */; };
0BEA5C2B1F7B8F73000D0AB4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0BEA5C2A1F7B8F73000D0AB4 /* Assets.xcassets */; };
0BEA5C321F7B8F73000D0AB4 /* JitsiMeetCompanion Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 0BEA5C311F7B8F73000D0AB4 /* JitsiMeetCompanion Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
@@ -26,8 +28,6 @@
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
695AF3ED6F686F9C5EE40F9A /* libPods-jitsi-meet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 489E8EFE2C720D10F5961AEF /* libPods-jitsi-meet.a */; };
DE050389256E904600DEE3A5 /* WebRTC.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE050388256E904600DEE3A5 /* WebRTC.xcframework */; };
DE05038A256E904600DEE3A5 /* WebRTC.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DE050388256E904600DEE3A5 /* WebRTC.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
DE4C456121DE1E4E00EA0709 /* FIRUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = DE4C455F21DE1E4E00EA0709 /* FIRUtilities.m */; };
E588011722789D43008B0561 /* JitsiMeetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = E58801132278944E008B0561 /* JitsiMeetContext.swift */; };
E5C97B63227A1EB400199214 /* JitsiMeetCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5C97B62227A1EB400199214 /* JitsiMeetCommands.swift */; };
@@ -57,8 +57,8 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
DE05038A256E904600DEE3A5 /* WebRTC.xcframework in Embed Frameworks */,
0B26BE6F1EC5BC3C00EEFB41 /* JitsiMeet.framework in Embed Frameworks */,
0BD6B4381EF82A6B00D1F4CD /* WebRTC.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@@ -117,10 +117,8 @@
4670A512A688E2DC34528282 /* Pods-jitsi-meet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-jitsi-meet.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-jitsi-meet/Pods-jitsi-meet.debug.xcconfig"; sourceTree = "<group>"; };
489E8EFE2C720D10F5961AEF /* libPods-jitsi-meet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-jitsi-meet.a"; sourceTree = BUILT_PRODUCTS_DIR; };
B3B083EB1D4955FF0069CEE7 /* app.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = app.entitlements; sourceTree = "<group>"; };
DE050388256E904600DEE3A5 /* WebRTC.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WebRTC.xcframework; path = "../../node_modules/react-native-webrtc/apple/WebRTC.xcframework"; sourceTree = "<group>"; };
DE4C455F21DE1E4E00EA0709 /* FIRUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIRUtilities.m; sourceTree = "<group>"; };
DE4C456021DE1E4E00EA0709 /* FIRUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIRUtilities.h; sourceTree = "<group>"; };
DEFDBBDB25656E3B00344B23 /* WebRTC.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WebRTC.xcframework; path = "../../node_modules/react-native-webrtc/ios/WebRTC.xcframework"; sourceTree = "<group>"; };
E58801132278944E008B0561 /* JitsiMeetContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JitsiMeetContext.swift; sourceTree = "<group>"; };
E5C97B62227A1EB400199214 /* JitsiMeetCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JitsiMeetCommands.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -138,8 +136,8 @@
buildActionMask = 2147483647;
files = (
0B26BE6E1EC5BC3C00EEFB41 /* JitsiMeet.framework in Frameworks */,
0BD6B4371EF82A6B00D1F4CD /* WebRTC.framework in Frameworks */,
695AF3ED6F686F9C5EE40F9A /* libPods-jitsi-meet.a in Frameworks */,
DE050389256E904600DEE3A5 /* WebRTC.xcframework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -156,9 +154,7 @@
0B26BE711EC5BC4D00EEFB41 /* Frameworks */ = {
isa = PBXGroup;
children = (
DE050388256E904600DEE3A5 /* WebRTC.xcframework */,
0B26BE6D1EC5BC3C00EEFB41 /* JitsiMeet.framework */,
DEFDBBDB25656E3B00344B23 /* WebRTC.xcframework */,
0BD6B4361EF82A6B00D1F4CD /* WebRTC.framework */,
489E8EFE2C720D10F5961AEF /* libPods-jitsi-meet.a */,
);
@@ -294,6 +290,8 @@
13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */,
0B26BE701EC5BC3C00EEFB41 /* Embed Frameworks */,
B35383AD1DDA0083008F406A /* Adjust embedded framework architectures */,
DE3A859324C701EA009B7D76 /* Copy WebRTC dSYM */,
0BB7DA181EC9E695007AAE98 /* Adjust ATS */,
DEF4813D224925A2002AD03A /* Copy Google Plist file */,
DE11877A21EE09640078D059 /* Setup Google reverse URL handler */,
@@ -422,6 +420,20 @@
shellPath = /bin/sh;
shellScript = "../scripts/run-packager.sh\n";
};
B35383AD1DDA0083008F406A /* Adjust embedded framework architectures */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Adjust embedded framework architectures";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "../scripts/fixup-frameworks.sh\n";
};
B6607F42A5CF0C76E98929E2 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@@ -462,6 +474,24 @@
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";
};
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 */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@@ -622,8 +652,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
SKIP_INSTALL = YES;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 4.0;
@@ -650,11 +679,7 @@
DEVELOPMENT_TEAM = FC967L3QRG;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = watchos/extension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet.watchkit.extension;
PRODUCT_NAME = "${TARGET_NAME}";
SDKROOT = watchos;
@@ -688,17 +713,12 @@
DEVELOPMENT_TEAM = FC967L3QRG;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = watchos/extension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet.watchkit.extension;
PRODUCT_NAME = "${TARGET_NAME}";
SDKROOT = watchos;
SKIP_INSTALL = YES;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 4.0;
@@ -709,6 +729,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 4670A512A688E2DC34528282 /* Pods-jitsi-meet.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDebug;
CODE_SIGN_ENTITLEMENTS = app.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
@@ -717,11 +738,16 @@
DEAD_CODE_STRIPPING = NO;
DEVELOPMENT_TEAM = FC967L3QRG;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = src/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"../../node_modules/react-native-webrtc/ios",
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
);
INFOPLIST_FILE = src/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
OTHER_LDFLAGS = (
"$(inherited)",
@@ -738,6 +764,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 09AA3B93E4CC62D84B424690 /* Pods-jitsi-meet.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIconRelease;
CODE_SIGN_ENTITLEMENTS = app.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
@@ -745,11 +772,16 @@
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = FC967L3QRG;
ENABLE_BITCODE = YES;
INFOPLIST_FILE = src/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"../../node_modules/react-native-webrtc/ios",
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
);
INFOPLIST_FILE = src/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
OTHER_LDFLAGS = (
"$(inherited)",

View File

@@ -45,8 +45,6 @@
#endif
}];
[jitsiMeet application:application didFinishLaunchingWithOptions:launchOptions];
// Initialize Crashlytics and Firebase if a valid GoogleService-Info.plist file was provided.
if ([FIRUtilities appContainsRealServiceInfoPlist]) {
NSLog(@"Enabling Firebase");
@@ -57,6 +55,8 @@
ViewController *rootController = (ViewController *)self.window.rootViewController;
[jitsiMeet showSplashScreen:rootController.view];
[jitsiMeet application:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}

View File

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

View File

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

View File

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

15
ios/scripts/bitcode.sh Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/bash
# This script will download a bitcode build of the WebRTC framework, if needed.
if [[ ! "$CONFIGURATION" = "Debug" ]]; then
RN_WEBRTC="$SRCROOT/../../node_modules/react-native-webrtc"
if otool -arch arm64 -l $RN_WEBRTC/ios/WebRTC.framework/WebRTC | grep -q LLVM; then
echo "WebRTC framework has bitcode"
else
echo "WebRTC framework has NO bitcode"
$RN_WEBRTC/tools/downloadBitcode.sh
fi
fi

39
ios/scripts/fixup-frameworks.sh Executable file
View File

@@ -0,0 +1,39 @@
#!/bin/bash
# This script gets executed from Xcode to fixup the embedded frameworks and
# bundle the necessary architectures.
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
if lipo -info "$FRAMEWORK_EXECUTABLE_PATH" | grep -q -v "^Non-fat"
then
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
fi
done
if [ -n "$EXTRACTED_ARCHS" ]
then
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
fi
done

View File

@@ -24,36 +24,8 @@ popd
# Build the SDK
pushd ${PROJECT_REPO}
rm -rf ios/sdk/out
xcodebuild clean \
-workspace ios/jitsi-meet.xcworkspace \
-scheme JitsiMeet
xcodebuild archive \
-workspace ios/jitsi-meet.xcworkspace \
-scheme JitsiMeet \
-configuration Release \
-sdk iphonesimulator \
-destination='generic/platform=iOS Simulator' \
-archivePath ios/sdk/out/ios-simulator \
VALID_ARCHS=x86_64 \
ENABLE_BITCODE=NO \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild archive \
-workspace ios/jitsi-meet.xcworkspace \
-scheme JitsiMeet \
-configuration Release \
-sdk iphoneos \
-destination='generic/platform=iOS' \
-archivePath ios/sdk/out/ios-device \
VALID_ARCHS=arm64 \
ENABLE_BITCODE=NO \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild -create-xcframework \
-framework ios/sdk/out/ios-device.xcarchive/Products/Library/Frameworks/JitsiMeet.framework \
-framework ios/sdk/out/ios-simulator.xcarchive/Products/Library/Frameworks/JitsiMeet.framework \
-output ios/sdk/out/JitsiMeet.xcframework
rm -rf ios/sdk/JitsiMeet.framework
xcodebuild -workspace ios/jitsi-meet.xcworkspace -scheme JitsiMeet -destination='generic/platform=iOS' -configuration Release ENABLE_BITCODE=NO clean archive
if [[ $DO_GIT_TAG == 1 ]]; then
git tag ios-sdk-${SDK_VERSION}
fi
@@ -62,8 +34,12 @@ popd
pushd ${RELEASE_REPO}
# Put the new files in the repo
cp -a ${PROJECT_REPO}/ios/sdk/out/JitsiMeet.xcframework Frameworks/
cp -a ${PROJECT_REPO}/node_modules/react-native-webrtc/apple/WebRTC.xcframework Frameworks/
cp -r ${PROJECT_REPO}/ios/sdk/JitsiMeet.framework Frameworks/
cp -r ${PROJECT_REPO}/node_modules/react-native-webrtc/ios/WebRTC.framework Frameworks/
# Strip bitcode
xcrun bitcode_strip -r Frameworks/JitsiMeet.framework/JitsiMeet -o Frameworks/JitsiMeet.framework/JitsiMeet
xcrun bitcode_strip -r Frameworks/WebRTC.framework/WebRTC -o Frameworks/WebRTC.framework/WebRTC
# Add all files to git
if [[ $DO_GIT_TAG == 1 ]]; then

View File

@@ -81,6 +81,8 @@
0BCA495C1EC4B6C600B793EE /* AudioMode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioMode.m; sourceTree = "<group>"; };
0BCA495D1EC4B6C600B793EE /* POSIX.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = POSIX.m; sourceTree = "<group>"; };
0BCA495E1EC4B6C600B793EE /* Proximity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Proximity.m; sourceTree = "<group>"; };
0BCA49631EC4B76D00B793EE /* WebRTC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebRTC.framework; path = "../../node_modules/react-native-webrtc/ios/WebRTC.framework"; sourceTree = "<group>"; };
0BCA496B1EC4BBF900B793EE /* jitsi.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = jitsi.ttf; path = ../../fonts/jitsi.ttf; sourceTree = "<group>"; };
0BD906E51EC0C00300C8C18E /* JitsiMeet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JitsiMeet.framework; sourceTree = BUILT_PRODUCTS_DIR; };
0BD906E81EC0C00300C8C18E /* JitsiMeet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiMeet.h; sourceTree = "<group>"; };
0BD906E91EC0C00300C8C18E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -151,6 +153,7 @@
0BC4B8681F8C01E100CE8B21 /* CallKitIcon.png */,
C6245F5B2053091D0040BE68 /* image-resize@2x.png */,
C6245F5C2053091D0040BE68 /* image-resize@3x.png */,
0BCA496B1EC4BBF900B793EE /* jitsi.ttf */,
75635B0820751D6D00F29C9F /* joined.wav */,
75635B0920751D6D00F29C9F /* left.wav */,
C30F88D1CB0F4F5593216D24 /* liveStreamingOff.mp3 */,
@@ -237,6 +240,7 @@
0B93EF7A1EC608550030D24D /* CoreText.framework */,
0BB9AD781F5EC6D7001C08DB /* Intents.framework */,
03F2ADC957FF109849B7FCA1 /* libPods-JitsiMeet.a */,
0BCA49631EC4B76D00B793EE /* WebRTC.framework */,
);
name = Frameworks;
sourceTree = "<group>";
@@ -317,6 +321,7 @@
buildConfigurationList = 0BD906ED1EC0C00300C8C18E /* Build configuration list for PBXNativeTarget "JitsiMeet" */;
buildPhases = (
26796D8589142D80C8AFDA51 /* [CP] Check Pods Manifest.lock */,
DE3D81D6228B50FB00A6C149 /* Bitcode */,
0BD906E01EC0C00300C8C18E /* Sources */,
0BD906E11EC0C00300C8C18E /* Frameworks */,
0BD906E21EC0C00300C8C18E /* Headers */,
@@ -449,6 +454,24 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-JitsiMeet/Pods-JitsiMeet-resources.sh\"\n";
showEnvVarsInLog = 0;
};
DE3D81D6228B50FB00A6C149 /* Bitcode */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = Bitcode;
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "../scripts/bitcode.sh\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -612,6 +635,7 @@
baseConfigurationReference = 98E09B5C73D9036B4ED252FC /* Pods-JitsiMeet.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
@@ -622,6 +646,7 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = src/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -630,6 +655,7 @@
SUPPORTS_MACCATALYST = NO;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 5.0;
};
name = Debug;
@@ -639,6 +665,7 @@
baseConfigurationReference = 9C77CA3CC919B081F1A52982 /* Pods-JitsiMeet.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
@@ -649,6 +676,7 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_BITCODE = YES;
INFOPLIST_FILE = src/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -656,6 +684,7 @@
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = NO;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 5.0;
};
name = Release;

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1020"
version = "1.3">
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
@@ -72,5 +72,23 @@
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
<PostActions>
<ExecutionAction
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Run Script"
scriptText = "exec &gt; /tmp/${PROJECT_NAME}_archive.log 2&gt;&amp;1&#10;&#10;UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal&#10;&#10;if [ &quot;true&quot; == ${ALREADYINVOKED:-false} ]&#10;then&#10;echo &quot;RECURSION: Detected, stopping&quot;&#10;else&#10;export ALREADYINVOKED=&quot;true&quot;&#10;&#10;# make sure the output directory exists&#10;mkdir -p &quot;${UNIVERSAL_OUTPUTFOLDER}&quot;&#10;&#10;echo &quot;Building for iPhoneSimulator&quot;&#10;xcodebuild -workspace &quot;${WORKSPACE_PATH}&quot; -scheme &quot;${TARGET_NAME}&quot; -configuration ${CONFIGURATION} -sdk iphonesimulator -destination &apos;platform=iOS Simulator,name=iPhone 8&apos; ONLY_ACTIVE_ARCH=NO ARCHS=&apos;x86_64&apos; BUILD_DIR=&quot;${BUILD_DIR}&quot; BUILD_ROOT=&quot;${BUILD_ROOT}&quot; ENABLE_BITCODE=YES OTHER_CFLAGS=&quot;-fembed-bitcode&quot; BITCODE_GENERATION_MODE=bitcode build&#10;&#10;# Step 1. Copy the framework structure (from iphoneos build) to the universal folder&#10;echo &quot;Copying to output folder&quot;&#10;cp -R &quot;${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FULL_PRODUCT_NAME}&quot; &quot;${UNIVERSAL_OUTPUTFOLDER}/&quot;&#10;&#10;# Step 2. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory&#10;SIMULATOR_SWIFT_MODULES_DIR=&quot;${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/Modules/${TARGET_NAME}.swiftmodule/.&quot;&#10;if [ -d &quot;${SIMULATOR_SWIFT_MODULES_DIR}&quot; ]; then&#10;cp -R &quot;${SIMULATOR_SWIFT_MODULES_DIR}&quot; &quot;${UNIVERSAL_OUTPUTFOLDER}/${TARGET_NAME}.framework/Modules/${TARGET_NAME}.swiftmodule&quot;&#10;fi&#10;&#10;# Step 3. Create universal binary file using lipo and place the combined executable in the copied framework directory&#10;echo &quot;Combining executables&quot;&#10;lipo -create -output &quot;${UNIVERSAL_OUTPUTFOLDER}/${EXECUTABLE_PATH}&quot; &quot;${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${EXECUTABLE_PATH}&quot; &quot;${BUILD_DIR}/${CONFIGURATION}-iphoneos/${EXECUTABLE_PATH}&quot;&#10;&#10;fi&#10;&#10;# Step 4. Convenience step to copy the framework to the project&amp;apos;s directory&#10;echo &quot;Copying to project dir&amp;quot&quot;&#10;yes | cp -Rf ${UNIVERSAL_OUTPUTFOLDER}/${FULL_PRODUCT_NAME} ${PROJECT_DIR}&#10;">
<EnvironmentBuildable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "0BD906E41EC0C00300C8C18E"
BuildableName = "JitsiMeet.framework"
BlueprintName = "JitsiMeet"
ReferencedContainer = "container:sdk.xcodeproj">
</BuildableReference>
</EnvironmentBuildable>
</ActionContent>
</ExecutionAction>
</PostActions>
</ArchiveAction>
</Scheme>

View File

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

View File

@@ -18,29 +18,6 @@
import CallKit
import Foundation
public protocol CXProviderProtocol: class {
var configuration: CXProviderConfiguration { get set }
func setDelegate(_ delegate: CXProviderDelegate?, queue: DispatchQueue?)
func reportNewIncomingCall(with UUID: UUID, update: CXCallUpdate, completion: @escaping (Error?) -> Void)
func reportCall(with UUID: UUID, updated update: CXCallUpdate)
func reportCall(with UUID: UUID, endedAt dateEnded: Date?, reason endedReason: CXCallEndedReason)
func reportOutgoingCall(with UUID: UUID, startedConnectingAt dateStartedConnecting: Date?)
func reportOutgoingCall(with UUID: UUID, connectedAt dateConnected: Date?)
func invalidate()
}
public protocol CXCallControllerProtocol: class {
var calls: [CXCall] { get }
func request(_ transaction: CXTransaction, completion: @escaping (Error?) -> Swift.Void)
}
extension CXProvider: CXProviderProtocol {}
extension CXCallController: CXCallControllerProtocol {
public var calls: [CXCall] {
return callObserver.calls
}
}
/// JitsiMeet CallKit proxy
// NOTE: The methods this class exposes are meant to be called in the UI thread.
// All delegate methods called by JMCallKitEmitter will be called in the UI thread.
@@ -49,17 +26,11 @@ extension CXCallController: CXCallControllerProtocol {
private override init() {}
// MARK: - CallKit proxy
public static var callKitProvider: CXProviderProtocol?
public static var callKitCallController: CXCallControllerProtocol?
private static var provider: CXProviderProtocol {
callKitProvider ?? defaultProvider
}
private static var callController: CXCallControllerProtocol {
callKitCallController ?? defaultCallController
}
private static var provider: CXProvider = {
let configuration = CXProviderConfiguration(localizedName: "")
return CXProvider(configuration: configuration)
}()
private static var providerConfiguration: CXProviderConfiguration? {
didSet {
@@ -68,15 +39,10 @@ extension CXCallController: CXCallControllerProtocol {
provider.setDelegate(emitter, queue: nil)
}
}
private static let defaultCallController: CXCallController = {
private static let callController: CXCallController = {
return CXCallController()
}()
private static var defaultProvider: CXProvider = {
let configuration = CXProviderConfiguration(localizedName: "")
return CXProvider(configuration: configuration)
}()
private static let emitter: JMCallKitEmitter = {
return JMCallKitEmitter()
@@ -86,16 +52,10 @@ extension CXCallController: CXCallControllerProtocol {
/// Defaults to enabled, set to false when you don't want to use CallKit.
@objc public static var enabled: Bool = true {
didSet {
if callKitProvider == nil {
provider.invalidate()
}
provider.invalidate()
if enabled {
guard isProviderConfigured() else { return }
if callKitProvider == nil {
defaultProvider = CXProvider(configuration: providerConfiguration!)
}
guard isProviderConfigured() else { return; }
provider = CXProvider(configuration: providerConfiguration!)
provider.setDelegate(emitter, queue: nil)
} else {
provider.setDelegate(nil, queue: nil)
@@ -132,18 +92,19 @@ extension CXCallController: CXCallControllerProtocol {
}
@objc public static func hasActiveCallForUUID(_ callUUID: String) -> Bool {
let activeCallForUUID = callController.calls.first {
let activeCallForUUID = callController.callObserver.calls.first {
$0.uuid == UUID(uuidString: callUUID)
}
guard activeCallForUUID != nil else { return false }
return true
}
@objc public static func reportNewIncomingCall(UUID: UUID,
handle: String?,
displayName: String?,
hasVideo: Bool,
completion: @escaping (Error?) -> Void) {
@objc public static func reportNewIncomingCall(
UUID: UUID,
handle: String?,
displayName: String?,
hasVideo: Bool,
completion: @escaping (Error?) -> Void) {
guard enabled else { return }
let callUpdate = makeCXUpdate(handle: handle,
@@ -171,6 +132,7 @@ extension CXCallController: CXCallControllerProtocol {
endedAt dateEnded: Date?,
reason endedReason: CXCallEndedReason) {
guard enabled else { return }
provider.reportCall(with: UUID,
endedAt: dateEnded,
reason: endedReason)
@@ -180,6 +142,7 @@ extension CXCallController: CXCallControllerProtocol {
with UUID: UUID,
startedConnectingAt dateStartedConnecting: Date?) {
guard enabled else { return }
provider.reportOutgoingCall(with: UUID,
startedConnectingAt: dateStartedConnecting)
}

View File

@@ -1,5 +1,4 @@
{
"ar": "العربية",
"en": "الإنجليزية",
"af": "الأفريكانية",
"bg": "البلغارية",
@@ -39,9 +38,5 @@
"sk": "السلوفاكية",
"lt": "الليتوانية",
"id": "الإندونيسية",
"he": "العبرية",
"mr":"الماراثى",
"kab": "قَبَلي",
"ro": "الرومانية",
"sl": "السلوفينية",
"he": "العبرية"
}

View File

@@ -1,50 +1,27 @@
{
"en": "Angličtina",
"af": "Afrikánština",
"ar": "Arabština",
"az": "Ázerbájdžánština",
"af": "",
"az": "",
"bg": "Bulharština",
"ca": "Katalánština",
"cs": "Čeština",
"da": "Dánština",
"cs": "",
"de": "Němčina",
"el": "Řečtina",
"enGB": "Angličtina (Spojené království)",
"el": "",
"eo": "Esperanto",
"es": "Španělština",
"esUS": "Španělština (Latinská Amerika)",
"et": "Estonština",
"eu": "Baskičtina",
"fi": "Finština",
"fr": "Francouština",
"frCA": "Francouzština (Kanada)",
"he": "Hebrejština",
"mr":"Maráthština",
"hr": "Chorvatština",
"hu": "Maďarština",
"hy": "Arménština",
"id": "Indonéština",
"it": "Italština",
"ja": "Japonština",
"kab": "Kabylština",
"ko": "Korejština",
"lt": "Litevština",
"nl": "Nizozemština",
"ja": "",
"ko": "",
"nb": "Norština Bokmal",
"oc": "Okcitánština",
"pl": "Polština",
"ptBR": "Portugalština (Brazílie)",
"ptBR": "Portugalština (Brazilská)",
"ru": "Ruština",
"ro": "Rumunština",
"sc": "Sardinština",
"sk": "Slovenština",
"sl": "Slovinština",
"sr": "Srbština",
"sv": "Švédština",
"th": "Thajština",
"tr": "Turečtina",
"uk": "Ukrajinština",
"vi": "Vietnamština",
"zhCN": "Čínština (Čína)",
"zhTW": "Čínština (Taiwan)"
}
"vi": "",
"zhCN": "Čínština (Čína)"
}

View File

@@ -1,36 +0,0 @@
{
"en": "ინგლისური",
"af": "აფრიკული",
"bg": "ბულგარული",
"ca": "კატალონიური",
"cs": "ჩეხური",
"de": "გერმანული",
"el": "ბერძნული",
"enGB": "ინგლისური (დიდი ბრიტანეთი)",
"eo": "ესტონური",
"es": "ესპანური",
"esUS": "ესპანური (ლათინური ამერიკა)",
"fi": "ფინური",
"fr": "ფრანგული",
"frCA": "ფრანგული (კანადური)",
"hr": "ხორვატიული",
"hu": "უნგრული",
"hy": "სომხური",
"it": "იტალიური",
"ja": "იაპონური",
"ka": "ქართული",
"ko": "კორეული",
"nl": "ჰოლანდიური",
"oc": "ოქსიტანური",
"pl": "პოლონური",
"ptBR": "პორტუგალიური (ბრაზილია)",
"ru": "რუსული",
"sr": "სერბული",
"sv": "შვედური",
"tr": "თურქული",
"vi": "ვიეტნამური",
"zhCN": "ჩინური (ჩინეთი)",
"zhTW": "ჩინური (ტაივანი)",
"et": "ესტონური",
"da": "დანიური"
}

View File

@@ -1,47 +1,32 @@
{
"en": "英语",
"af": "南非荷兰语",
"ar": "阿拉伯语",
"bg": "保加利亚语",
"ca": "加泰罗尼亚语",
"cs": "捷克语",
"da": "丹麦语",
"de": "德语",
"el": "希腊语",
"enGB": "英语(英国)",
"eo": "世界语",
"es": "西班牙语",
"esUS": "西班牙语(拉丁美洲)",
"et": "爱沙尼亚语",
"eu": "巴斯克语",
"fi": "芬兰语",
"fr": "法语",
"frCA": "法语(加拿大)",
"he": "希伯来语",
"mr":"马拉地语",
"hr": "克罗地亚语",
"hu": "匈牙利语",
"hy": "亚美尼亚语",
"id": "印度尼西亚语",
"it": "意大利语",
"ja": "日语",
"kab": "卡比尔语",
"ko": "韩语",
"lt": "立陶宛语",
"nl": "荷兰语",
"oc": "欧西坦语",
"pl": "波兰语",
"ptBR": "葡萄牙语(巴西)",
"ru": "俄语",
"ro": "罗马尼亚语",
"sc": "撒丁岛语",
"sk": "斯洛伐克语",
"sl": "斯洛文尼亚语",
"sv": "瑞典语",
"th": "泰语",
"tr": "土耳其语",
"uk": "乌克兰语",
"vi": "越南语",
"zhCN": "中文(中国)",
"zhTW": "中文(台湾)"
}
}

View File

@@ -28,8 +28,6 @@
"kab": "Kabyle",
"ko": "Korean",
"lt": "Lithuanian",
"ml": "Malayalam",
"lv": "Latvian",
"nl": "Dutch",
"oc": "Occitan",
"pl": "Polish",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -707,7 +707,7 @@
"kick": "Teilnehmer entfernen",
"lobbyButton": "Lobbymodus ein-/ausschalten",
"localRecording": "Lokale Aufzeichnungssteuerelemente ein-/ausschalten",
"lockRoom": "Konferenzpasswort ein-/ausschalten",
"lockRoom": "Konferenzpasswort ein-/auschalten",
"moreActions": "Menü „Weitere Aktionen“ ein-/ausschalten",
"moreActionsMenu": "Menü „Weitere Aktionen“",
"moreOptions": "Menü „Weitere Optionen“",
@@ -864,7 +864,7 @@
"join": "Zum Teilnehmen tippen",
"roomname": "Konferenzname eingeben"
},
"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.",
"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": {
"audio": "Audio",
"video": "Video"

View File

@@ -18,7 +18,7 @@
"linkCopied": "Link copiado al portapapeles",
"loading": "Buscando por contacto y número telefónico",
"loadingNumber": "Validando el número telefónico",
"loadingPeople": "Buscando contactos a invitar",
"loadingPeople": "Buscando contactos a invitar",
"noResults": "No se encontraron coincidencias",
"noValidNumbers": "Por favor ingrese un número de teléfono",
"outlookEmail": "Correo de Outlook",
@@ -100,11 +100,9 @@
},
"connectionindicator": {
"address": "Dirección:",
"audio_ssrc": "Audio SSRC:",
"bandwidth": "Ancho de banda estimado:",
"bitrate": "Tasa de transferencia:",
"bridgeCount": "Contador del servidor: ",
"codecs": "Codecs (A/V):",
"connectedTo": "Conectado a:",
"e2e_rtt": "E2E RTT:",
"framerate": "Fotogramas por segundo:",
@@ -113,10 +111,8 @@
"localaddress_plural": "Direcciones locales:",
"localport": "Puerto local:",
"localport_plural": "Puertos locales:",
"maxEnabledResolution": "enviar max",
"more": "Mostrar más",
"packetloss": "Pérdida de paquetes:",
"participant_id": "ID participante:",
"quality": {
"good": "Buena",
"inactive": "Inactivo",
@@ -128,12 +124,10 @@
"remoteaddress_plural": "Direcciones remotas:",
"remoteport": "Puerto remoto:",
"remoteport_plural": "Puertos remotos:",
"savelogs": "Guardar logs",
"resolution": "Resolución:",
"status": "Calidad:",
"transport": "Transporte:",
"transport_plural": "Transportes:",
"video_ssrc": "Video SSRC:"
"transport_plural": "Transportes:"
},
"dateUtils": {
"earlier": "Anterior",
@@ -171,7 +165,6 @@
"accessibilityLabel": {
"liveStreaming": "Transmisión en vivo"
},
"add": "Agregar",
"allow": "Permitir",
"alreadySharedVideoMsg": "Otro participante ya está compartiendo un vídeo. Esta conferencia sólo permite compartir un vídeo a la vez.",
"alreadySharedVideoTitle": "Solo se permite un vídeo compartido a la vez",
@@ -196,13 +189,11 @@
"connectError": "¡Oops! Algo salió mal y no fue posible conectarnos a la conferencia.",
"connectErrorWithMsg": "¡Oops! Algo salió mal y no fue posible conectarnos a la conferencia: {{msg}}",
"connecting": "Conectando",
"copied": "Copiado",
"contactSupport": "Contacta al soporte técnico",
"copy": "Copiar",
"dismiss": "Descartar",
"displayNameRequired": "¡Hola! ¿Cuál es tu nombre?",
"done": "Listo",
"e2eeLabel": "Habilitar cifrado Extremo-a-Extremo",
"e2eeDescription": "El cifrado de extremo a extremo es actualmente EXPERIMENTAL. Tenga en cuenta que activarlo puede deshabilitar servicios como: grabación, transmisión en vivo y participación telefónica. Además, esta reunión solo funcionará con personas que se unan con un navegador.",
"e2eeWarning": "ADVERTENCIA: No todos los participantes de esta reunión soportan el cifrado de extremo a extremo. Si usted habilita esta opción, ellos no podrán verlo ni oírlo.",
"enterDisplayName": "Por favor ingresa tu nombre aquí",
@@ -211,8 +202,6 @@
"externalInstallationTitle": "Extensión requerida",
"goToStore": "Ir a la tienda web",
"gracefulShutdown": "Nuestro servicio se encuentra en mantenimiento. Por favor, intente más tarde.",
"grantModeratorDialog": "¿Estas seguro de que quieres convertir a este participante en moderator?",
"grantModeratorTitle": "Convertir en moderador",
"IamHost": "Soy el anfitrión",
"incorrectRoomLockPassword": "Contraseña incorrecta",
"incorrectPassword": "Nombre de usuario o contraseña incorrecta",
@@ -225,7 +214,6 @@
"kickParticipantDialog": "¿Seguro que quiere expulsar a este participante?",
"kickParticipantTitle": "¿Expulsar a este participante?",
"kickTitle": "¡Ay! {{participantDisplayName}} te expulsó de la reunión",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "No es posible mientras la grabación este activa",
"liveStreaming": "Transmisión en vivo",
"liveStreamingDisabledForGuestTooltip": "Los invitados no pueden iniciar la transmisión en vivo.",
"liveStreamingDisabledTooltip": "Las trasmisiones están deshabilitadas.",
@@ -259,9 +247,7 @@
"passwordRequired": "$t(lockRoomPasswordUppercase) necesario",
"popupError": "Su navegador está bloqueando las ventanas emergentes de este sitio. Habilite las ventanas emergentes en la configuración de seguridad de su navegador y vuelva a intentarlo.",
"popupErrorTitle": "Ventana emergente bloqueada",
"readMore": "mas",
"recording": "Grabando",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "No es posible mientras la transmisión en vivo este activa",
"recordingDisabledForGuestTooltip": "Los invitados no pueden iniciar grabaciones.",
"recordingDisabledTooltip": "Inicio de grabación desactivado.",
"rejoinNow": "Reunirse ahora",
@@ -280,8 +266,6 @@
"reservationErrorMsg": "Código de error: {{code}}, mensaje: {{msg}}",
"retry": "Reintentar",
"screenSharingAudio": "Compartir audio",
"screenSharingFailed": "¡Oops! ¡Algo salio mal, no se pudo iniciar la compartición de su pantalla!",
"screenSharingFailedTitle": "¡Fallo al compartir su pantalla!",
"screenSharingFailedToInstall": "¡Uy! La extensión de uso compartido de pantalla no se pudo instalar.",
"screenSharingFailedToInstallTitle": "La extensión de uso compartido de pantalla no se pudo instalar",
"screenSharingFirefoxPermissionDeniedError": "Algo salió mal al compartir pantalla. Asegúrate de habernos dado permiso para hacerlo.",
@@ -333,9 +317,6 @@
"embedMeeting": {
"title": "Insertar reunión en sitio web"
},
"embedMeeting": {
"title": "Insertar esta reunión"
},
"feedback": {
"average": "Promedio",
"bad": "Mala",
@@ -425,9 +406,6 @@
"errorLiveStreamNotEnabled": "La transmisión en vivo no está activada en {{email}}. Por favor, activa la transmisión en vivo o inicia sesión en una cuenta con la transmisión en vivo activada.",
"expandedOff": "La transmisión en vivo se ha detenido",
"expandedOn": "La reunión se está transmitiendo a YouTube.",
"googlePrivacyPolicy": "Política de Privacidad de Google",
"limitNotificationDescriptionWeb": "Debido a la alta demanda su transmisión estará limitada a {{limit}} minutos. Puede obtener transmisiones ilimitadas en <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Su transmisión estará limitada a {{limit}} minutos. Puede obtener transmisiones ilimitadas en {{app}}.",
"expandedPending": "La transmisión en vivo se está iniciando…",
"failedToStart": "La transmisión en vivo no se pudo iniciar",
"getStreamKeyManually": "No pudimos encontrar tu clave de transmisión. Por favor, obtenla de la página de YouTube y pégala.",
@@ -444,8 +422,7 @@
"signOut": "Cerrar sesión",
"start": "Iniciar una transmisión en vivo",
"streamIdHelp": "¿Qué es esto?",
"unavailableTitle": "Transmisión en vivo no disponible",
"youtubeTerms": "Términos de servicios de YouTube"
"unavailableTitle": "Transmisión en vivo no disponible"
},
"localRecording": {
"clientState": {
@@ -518,29 +495,6 @@
"passwordDigitsOnly": "Hasta {{number]] cifras",
"poweredby": "con tecnología de",
"prejoin": {
"audioDeviceProblem": "Hay un problema con su dispositivo de audio",
"connection": {
"good": "¡Su conexión a internet es buena!",
"nonOptimal": "Su conexión a internet no es óptima",
"poor": "Tiene una conexión a internet pobre"
},
"connectionDetails": {
"audioClipping": "Prevemos que su audio tendrá recortes.",
"audioHighQuality": "Prevemos que su audio tendrá excelente calidad.",
"audioLowNoVideo": "Prevemos que la calidad de su audio será baja y sin video.",
"goodQuality": "¡Genial! La calidad de sus medios será excelente.",
"noMediaConnectivity": "No pudimos encontrar una forma de establecer la conectividad de medios para esta prueba. Esto suele ser causado por un firewall o NAT.",
"noVideo": "Prevemos que su video será terrible.",
"undetectable": "Si aún no puede realizar llamadas en el navegador, le recomendamos que se asegure de que los altavoces, el micrófono y la cámara estén configurados correctamente, que haya concedido los derechos de su navegador para usar el micrófono y la cámara, y que la versión de su navegador esté actualizada. Si aún tiene problemas para llamar, debería comunicarse con el desarrollador de la aplicación web.",
"veryPoorConnection": "Prevemos que la calidad de su llamada será realmente terrible.",
"videoFreezing": "Prevemos que su video se congelará, se volverá negro y se pixelará.",
"videoHighQuality": "Prevemos que su video tendrá buena calidad.",
"videoLowQuality": "Prevemos que su video tendrá baja calidad en términos de velocidad de fotogramas y resolución.",
"videoTearing": "Prevemos que su video se pixelará o tendrá artefactos visuales."
},
"errorMissingName": "Ingrese su nombre para unirse a la reunión",
"premeeting": "Pre-reunión",
"showScreen": "Habilitar pantalla pre-reunión",
"audioAndVideoError": "Error en audio y vídeo:",
"audioOnlyError": "Error en audio:",
"audioTrackError": "No se pudo crear la pista de audio.",
@@ -607,8 +561,6 @@
"expandedPending": "La grabación se está iniciando…",
"failedToStart": "No se pudo iniciar la grabación",
"fileSharingdescription": "Compartir la grabación con los participantes de la reunión",
"limitNotificationDescriptionWeb": "Debido a la alta demanda su grabación estará limitada a {{limit}} minutos. Puede obtener grabaciones ilimitadas en <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Su grabación estará limitada a {{limit}} minutos. Puede obtener grabaciones ilimitadas en <3>{{app}}</3>.",
"live": "EN VIVO",
"loggedIn": "Sesión iniciada como {{userName}}",
"off": "Grabación detenida",
@@ -628,7 +580,6 @@
"pullToRefresh": "Mueve el dedo para abajo para actualizar."
},
"security": {
"aboutReadOnly": "Los participantes moderadores pueden agregar una $t(lockRoomPassword) a la reunión. Los participantes deberán proporcionar la $t(lockRoomPassword) antes de que se les permita unirse a la reunión.",
"about": "Puedes agregar una contraseña a la reunión. Los participantes necesitarán la contraseña para unirse a la reunión.",
"insecureRoomNameWarning": "El nombre de la sala es inseguro. Participantes no deseados pueden llegar a unirse a la reunión.",
"securityOptions": "Opciones de seguridad"
@@ -656,7 +607,6 @@
"speakers": "Altavoces",
"startAudioMuted": "Todos inician silenciados",
"startVideoMuted": "Todos inician con cámara desactivada",
"speakers": "Parlantes",
"title": "Ajustes"
},
"settingsView": {
@@ -711,8 +661,6 @@
"cc": "Alternar subtítulos",
"chat": "Alternar ventana de chat",
"document": "Alternar documento compartido",
"embedMeeting": "Insertar reunión",
"grantModerator": "Convertir en moderador",
"download": "Descargar nuestras aplicaciones",
"e2ee": "Cifrado de extremo a extremo",
"feedback": "Dejar comentarios",
@@ -723,7 +671,6 @@
"lobbyButtonDisable": "Desactivar sala de espera",
"lobbyButtonEnable": "Activar sala de espera",
"kick": "Expulsar participante",
"lobbyButton": "Activar / desactivar el modo lobby",
"localRecording": "Alternar controles de grabación local",
"lockRoom": "Alternar contraseña de la reunión",
"moreActions": "Alternar más acciones",
@@ -762,7 +709,6 @@
"documentClose": "Cerrar documento compartido",
"documentOpen": "Abrir documento compartido",
"download": "Descarga nuestras aplicaciones",
"embedMeeting": "Insertar reunión",
"e2ee": "Cifrado de extremo a extremo",
"enterFullScreen": "Pantalla completa",
"enterTileView": "Ver en cuadrícula",
@@ -772,8 +718,6 @@
"hangup": "Colgar",
"help": "Ayuda",
"invite": "Invitar personas",
"lobbyButtonDisable": "Desactivar el modo lobby",
"lobbyButtonEnable": "Activar el modo lobby",
"login": "Inicio de sesión",
"logout": "Cerrar sesión",
"lowerYourHand": "Bajar la mano",
@@ -868,7 +812,6 @@
"domute": "Silenciar",
"domuteOthers": "Silenciar a todos",
"flip": "Voltear",
"grantModerator": "Convertir en moderador",
"kick": "Expulsar",
"moderator": "Moderador",
"mute": "Se silenció el participante",
@@ -897,7 +840,6 @@
"goSmall": "IR",
"join": "CREAR / UNIRSE",
"info": "Información",
"moderatedMessage": "O <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">reserve con antelación una URL de reunión</a> en la que usted sea el único moderador.",
"privacy": "Privacidad",
"recentList": "Reciente",
"recentListDelete": "Eliminar",
@@ -949,4 +891,4 @@
"reject": "Rechazar",
"toggleLabel": "Activar sala de espera"
}
}
}

View File

@@ -18,7 +18,7 @@
"linkCopied": "Link copiado al portapapeles",
"loading": "Buscando por contacto y número telefónico",
"loadingNumber": "Validando el número telefónico",
"loadingPeople": "Buscando contactos a invitar",
"loadingPeople": "Buscando contactos a invitar",
"noResults": "No se encontraron coincidencias",
"noValidNumbers": "Por favor ingrese un número de teléfono",
"outlookEmail": "Correo de Outlook",
@@ -100,11 +100,9 @@
},
"connectionindicator": {
"address": "Dirección:",
"audio_ssrc": "Audio SSRC:",
"bandwidth": "Ancho de banda estimado:",
"bitrate": "Tasa de transferencia:",
"bridgeCount": "Contador del servidor: ",
"codecs": "Codecs (A/V):",
"connectedTo": "Conectado a:",
"e2e_rtt": "E2E RTT:",
"framerate": "Fotogramas por segundo:",
@@ -113,10 +111,8 @@
"localaddress_plural": "Direcciones locales:",
"localport": "Puerto local:",
"localport_plural": "Puertos locales:",
"maxEnabledResolution": "enviar max",
"more": "Mostrar más",
"packetloss": "Pérdida de paquetes:",
"participant_id": "ID participante:",
"quality": {
"good": "Buena",
"inactive": "Inactivo",
@@ -129,11 +125,9 @@
"remoteport": "Puerto remoto:",
"remoteport_plural": "Puertos remotos:",
"resolution": "Resolución:",
"savelogs": "Guardar logs",
"status": "Calidad:",
"transport": "Transporte:",
"transport_plural": "Transportes:",
"video_ssrc": "Video SSRC:"
"transport_plural": "Transportes:"
},
"dateUtils": {
"earlier": "Anterior",
@@ -171,7 +165,6 @@
"accessibilityLabel": {
"liveStreaming": "Transmisión en vivo"
},
"add": "Agregar",
"allow": "Permitir",
"alreadySharedVideoMsg": "Otro participante ya está compartiendo un video. Esta conferencia sólo permite compartir un video a la vez.",
"alreadySharedVideoTitle": "Solo se permite un video compartido a la vez",
@@ -196,13 +189,11 @@
"connectError": "¡Oops! Algo salió mal y no fue posible conectarnos a la conferencia.",
"connectErrorWithMsg": "¡Oops! Algo salió mal y no fue posible conectarnos a la conferencia: {{msg}}",
"connecting": "Conectando",
"copied": "Copiado",
"contactSupport": "Contacta al soporte técnico",
"copy": "Copiar",
"dismiss": "Descartar",
"displayNameRequired": "¡Hola! ¿Cuál es tu nombre?",
"done": "Listo",
"e2eeLabel": "Habilitar cifrado Extremo-a-Extremo",
"e2eeDescription": "El cifrado de extremo a extremo es actualmente EXPERIMENTAL. Tenga en cuenta que activarlo puede deshabilitar servicios como: grabación, transmisión en vivo y participación telefónica. Además, esta reunión solo funcionará con personas que se unan con un navegador.",
"e2eeWarning": "ADVERTENCIA: No todos los participantes de esta reunión soportan el cifrado de extremo a extremo. Si usted habilita esta opción, ellos no podrán verlo ni oírlo.",
"enterDisplayName": "Por favor ingresa tu nombre aquí",
@@ -211,8 +202,6 @@
"externalInstallationTitle": "Extensión requerida",
"goToStore": "Ir a la tienda web",
"gracefulShutdown": "Nuestro servicio se encuentra en mantenimiento. Por favor, intente más tarde.",
"grantModeratorDialog": "¿Estas seguro de que quieres convertir a este participante en moderator?",
"grantModeratorTitle": "Convertir en moderador",
"IamHost": "Soy el anfitrión",
"incorrectRoomLockPassword": "Contraseña incorrecta",
"incorrectPassword": "Nombre de usuario o contraseña incorrecta",
@@ -226,7 +215,6 @@
"kickParticipantTitle": "¿Expulsar a este participante?",
"kickTitle": "¡Ay! {{participantDisplayName}} te expulsó de la reunión",
"liveStreaming": "Transmisión en vivo",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "No es posible mientras la grabación este activa",
"liveStreamingDisabledForGuestTooltip": "Los invitados no pueden iniciar la transmisión en vivo.",
"liveStreamingDisabledTooltip": "Las trasmisiones están deshabilitadas.",
"lockMessage": "No se pudo bloquear la conferencia.",
@@ -259,8 +247,6 @@
"passwordRequired": "$t(lockRoomPasswordUppercase) necesario",
"popupError": "Su navegador está bloqueando las ventanas emergentes de este sitio. Habilite las ventanas emergentes en la configuración de seguridad de su navegador y vuelva a intentarlo.",
"popupErrorTitle": "Ventana emergente bloqueada",
"readMore": "mas",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "No es posible mientras la transmisión en vivo este activa",
"recording": "Grabando",
"recordingDisabledForGuestTooltip": "Los invitados no pueden iniciar grabaciones.",
"recordingDisabledTooltip": "Inicio de grabación desactivado.",
@@ -280,8 +266,6 @@
"reservationErrorMsg": "Código de error: {{code}}, mensaje: {{msg}}",
"retry": "Reintentar",
"screenSharingAudio": "Compartir audio",
"screenSharingFailed": "¡Oops! ¡Algo salio mal, no se pudo iniciar la compartición de su pantalla!",
"screenSharingFailedTitle": "¡Fallo al compartir su pantalla!",
"screenSharingFailedToInstall": "¡Uy! La extensión de uso compartido de pantalla no se pudo instalar.",
"screenSharingFailedToInstallTitle": "La extensión de uso compartido de pantalla no se pudo instalar",
"screenSharingFirefoxPermissionDeniedError": "Algo salió mal al compartir pantalla. Asegúrate de habernos dado permiso para hacerlo.",
@@ -333,9 +317,6 @@
"embedMeeting": {
"title": "Insertar reunión en sitio web"
},
"embedMeeting": {
"title": "Insertar esta reunión"
},
"feedback": {
"average": "Promedio",
"bad": "Mala",
@@ -427,9 +408,6 @@
"expandedOn": "La reunión se está transmitiendo a YouTube.",
"expandedPending": "La transmisión en vivo se está iniciando…",
"failedToStart": "La transmisión en vivo no se pudo iniciar",
"googlePrivacyPolicy": "Política de Privacidad de Google",
"limitNotificationDescriptionWeb": "Debido a la alta demanda su transmisión estará limitada a {{limit}} minutos. Puede obtener transmisiones ilimitadas en <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Su transmisión estará limitada a {{limit}} minutos. Puede obtener transmisiones ilimitadas en {{app}}.",
"getStreamKeyManually": "No pudimos encontrar tu clave de transmisión. Por favor, obtenla de la página de YouTube y pégala.",
"invalidStreamKey": "Es posible que la clave de transmisión sea incorrecta, o no es de YouTube.",
"off": "Se detuvo la transmisión",
@@ -444,8 +422,7 @@
"signOut": "Cerrar sesión",
"start": "Iniciar una transmisión en vivo",
"streamIdHelp": "¿Qué es esto?",
"unavailableTitle": "Transmisión en vivo no disponible",
"youtubeTerms": "Términos de servicios de YouTube"
"unavailableTitle": "Transmisión en vivo no disponible"
},
"localRecording": {
"clientState": {
@@ -518,29 +495,6 @@
"passwordDigitsOnly": "Hasta {{number]] cifras",
"poweredby": "con tecnología de",
"prejoin": {
"audioDeviceProblem": "Hay un problema con su dispositivo de audio",
"connection": {
"good": "¡Su conexión a internet es buena!",
"nonOptimal": "Su conexión a internet no es óptima",
"poor": "Tiene una conexión a internet pobre"
},
"connectionDetails": {
"audioClipping": "Prevemos que su audio tendrá recortes.",
"audioHighQuality": "Prevemos que su audio tendrá excelente calidad.",
"audioLowNoVideo": "Prevemos que la calidad de su audio será baja y sin video.",
"goodQuality": "¡Genial! La calidad de sus medios será excelente.",
"noMediaConnectivity": "No pudimos encontrar una forma de establecer la conectividad de medios para esta prueba. Esto suele ser causado por un firewall o NAT.",
"noVideo": "Prevemos que su video será terrible.",
"undetectable": "Si aún no puede realizar llamadas en el navegador, le recomendamos que se asegure de que los altavoces, el micrófono y la cámara estén configurados correctamente, que haya concedido los derechos de su navegador para usar el micrófono y la cámara, y que la versión de su navegador esté actualizada. Si aún tiene problemas para llamar, debería comunicarse con el desarrollador de la aplicación web.",
"veryPoorConnection": "Prevemos que la calidad de su llamada será realmente terrible.",
"videoFreezing": "Prevemos que su video se congelará, se volverá negro y se pixelará.",
"videoHighQuality": "Prevemos que su video tendrá buena calidad.",
"videoLowQuality": "Prevemos que su video tendrá baja calidad en términos de velocidad de fotogramas y resolución.",
"videoTearing": "Prevemos que su video se pixelará o tendrá artefactos visuales."
},
"errorMissingName": "Ingrese su nombre para unirse a la reunión",
"premeeting": "Pre-reunión",
"showScreen": "Habilitar pantalla pre-reunión",
"audioAndVideoError": "Error en audio y video:",
"audioOnlyError": "Error en audio:",
"audioTrackError": "No se pudo crear la pista de audio.",
@@ -605,8 +559,6 @@
"expandedOff": "Grabación detenida",
"expandedOn": "La reunión está siendo grabada.",
"expandedPending": "La grabación se está iniciando…",
"limitNotificationDescriptionWeb": "Debido a la alta demanda su grabación estará limitada a {{limit}} minutos. Puede obtener grabaciones ilimitadas en <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Su grabación estará limitada a {{limit}} minutos. Puede obtener grabaciones ilimitadas en <3>{{app}}</3>.",
"failedToStart": "No se pudo iniciar la grabación",
"fileSharingdescription": "Compartir la grabación con los participantes de la reunión",
"live": "EN VIVO",
@@ -628,7 +580,6 @@
"pullToRefresh": "Mueve el dedo para abajo para actualizar."
},
"security": {
"aboutReadOnly": "Los participantes moderadores pueden agregar una $t(lockRoomPassword) a la reunión. Los participantes deberán proporcionar la $t(lockRoomPassword) antes de que se les permita unirse a la reunión.",
"about": "Puedes agregar una contraseña a la reunión. Los participantes necesitarán la contraseña para unirse a la reunión.",
"insecureRoomNameWarning": "El nombre de la sala es inseguro. Participantes no deseados pueden llegar a unirse a la reunión.",
"securityOptions": "Opciones de seguridad"
@@ -686,10 +637,10 @@
},
"speaker": "Participante",
"speakerStats": {
"hours": "{{count}} h",
"minutes": "{{count}} min",
"hours": "{{count}} h",
"minutes": "{{count}} min",
"name": "Nombre",
"seconds": "{{count}} s",
"seconds": "{{count}} s",
"speakerStats": "Estadísticas de participantes",
"speakerTime": "Tiempo hablado"
},
@@ -711,9 +662,6 @@
"chat": "Alternar ventana de chat",
"document": "Alternar documento compartido",
"download": "Descargar nuestras aplicaciones",
"embedMeeting": "Insertar reunión",
"grantModerator": "Convertir en moderador",
"lobbyButton": "Activar / desactivar sala de espera",
"e2ee": "Cifrado de extremo a extremo",
"feedback": "Dejar comentarios",
"fullScreen": "Alternar pantalla completa",
@@ -760,7 +708,6 @@
"closeChat": "Cerrar chat",
"documentClose": "Cerrar documento compartido",
"documentOpen": "Abrir documento compartido",
"embedMeeting": "Insertar reunión",
"download": "Descarga nuestras aplicaciones",
"e2ee": "Cifrado de extremo a extremo",
"enterFullScreen": "Pantalla completa",
@@ -771,8 +718,6 @@
"hangup": "Colgar",
"help": "Ayuda",
"invite": "Invitar personas",
"lobbyButtonDisable": "Desactivar el modo lobby",
"lobbyButtonEnable": "Activar el modo lobby",
"login": "Inicio de sesión",
"logout": "Cerrar sesión",
"lowerYourHand": "Bajar la mano",
@@ -801,11 +746,9 @@
"speakerStats": "Estadísticas de los hablantes",
"startScreenSharing": "Comenzar a compartir pantalla",
"startSubtitles": "Iniciar subtítulos",
"startvideoblur": "Desenfocar mi fondo",
"stopScreenSharing": "Dejar de compartir pantalla",
"stopSubtitles": "Detener subtítulos",
"stopSharedVideo": "Detener video de YouTube",
"stopvideoblur": "Desactivar el desenfoque de fondo",
"talkWhileMutedPopup": "¿Intentas hablar? Estás silenciado.",
"tileViewToggle": "Activar o desactivar vista en cuadrícula",
"toggleCamera": "Activar o desactivar cámara",
@@ -868,7 +811,6 @@
"videothumbnail": {
"domute": "Silenciar",
"domuteOthers": "Silenciar a todos",
"grantModerator": "Convertir en moderador",
"flip": "Voltear",
"kick": "Expulsar",
"moderator": "Moderador",
@@ -898,7 +840,6 @@
"goSmall": "IR",
"join": "CREAR / UNIRSE",
"info": "Información",
"moderatedMessage": "O <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">reserve con antelación una URL de reunión</a> en la que usted sea el único moderador.",
"privacy": "Privacidad",
"recentList": "Reciente",
"recentListDelete": "Eliminar",
@@ -950,4 +891,4 @@
"reject": "Rechazar",
"toggleLabel": "Activar sala de espera"
}
}
}

View File

@@ -53,7 +53,7 @@
"join": "Joindre",
"joinTooltip": "Rejoindre la réunion",
"nextMeeting": "prochaine réunion",
"noEvents": "Il n'y a pas d'événement à venir.",
"noEvents": "Il n'y a pas dévénement à venir.",
"ongoingMeeting": "La réunion en cours",
"permissionButton": "Afficher les réglages",
"permissionMessage": "La permission du calendrier est requise pour afficher vos réunions dans l'application.",
@@ -80,7 +80,7 @@
"dontShowAgain": "Ne plus me montrer ceci"
},
"connectingOverlay": {
"joiningRoom": "Connexion à la réunion ..."
"joiningRoom": "Connexion à la réunion"
},
"connection": {
"ATTACHED": "Attachée",
@@ -92,29 +92,25 @@
"DISCONNECTED": "Déconnecté",
"DISCONNECTING": "Déconnexion en cours",
"ERROR": "Erreur",
"RECONNECTING": "Un problème réseau est survenue. Reconnexion en cours ...",
"FETCH_SESSION_ID": "Obtention d'un identifiant de session ...",
"GET_SESSION_ID_ERROR": "Obtenir une erreur d'identifiant de session : {{code}}",
"GOT_SESSION_ID": "Obtention d'un identifiant de session ... Terminée",
"RECONNECTING": "Un problème réseau est survenue. Reconnexion en cours...",
"FETCH_SESSION_ID": "Obtention dun identifiant de session",
"GET_SESSION_ID_ERROR": "Obtenir une erreur didentifiant de session : {{code}}",
"GOT_SESSION_ID": "Obtention dun identifiant de session Terminée",
"LOW_BANDWIDTH": "La vidéo de {{displayName}} a été désactivée pour économiser de la bande passante"
},
"connectionindicator": {
"address": "Adresse :",
"audio_ssrc": "Audio SSRC :",
"bandwidth": "Bande passante estimée :",
"bitrate": "Débit :",
"bridgeCount": "Nombre de serveurs :",
"codecs": "Codecs (A/V) :",
"e2e_rtt": "E2E RTT :",
"bridgeCount": "Nombre de serveurs : ",
"connectedTo": "Connecté à :",
"framerate": "Images par seconde :",
"less": "Cacher les détails",
"less": "Cacher le détail",
"localaddress": "Adresse locale :",
"localaddress_plural": "Adresses locales :",
"localport": "Port local :",
"localport_plural": "Ports locaux :",
"maxEnabledResolution": "débit max",
"more": "Montrer les détails",
"more": "Montrer le détail",
"packetloss": "Perte de paquets :",
"quality": {
"good": "Bien",
@@ -128,11 +124,10 @@
"remoteport": "Port distant :",
"remoteport_plural": "Ports distants :",
"resolution": "Résolution :",
"savelogs": "Enregistrer les logs",
"status": "Connexion :",
"transport": "Transport :",
"transport_plural": "Transports :",
"video_ssrc": "Video SSRC :"
"e2e_rtt": "E2E RTT :"
},
"dateUtils": {
"earlier": "Plus tôt",
@@ -149,7 +144,7 @@
"joinInApp": "Rejoindre la réunion en utilisant l'application",
"launchWebButton": "Lancer dans le navigateur",
"openApp": "Continuer vers l'application",
"title": "Lancement de votre réunion dans {{app}} en cours ...",
"title": "Lancement de votre réunion dans {{app}} en cours...",
"tryAgainButton": "Réessayez sur le bureau"
},
"defaultLink": "ex. {{url}}",
@@ -185,45 +180,41 @@
"cameraUnsupportedResolutionError": "Votre appareil ne prend pas en charge la résolution vidéo requise.",
"Cancel": "Annuler",
"close": "Fermer",
"conferenceDisconnectMsg": "Veuillez vérifier votre connexion réseau. Reconnexion dans {{seconds}} sec ...",
"conferenceDisconnectMsg": "Veuillez vérifier votre connexion réseau. Reconnexion dans {{seconds}} sec...",
"conferenceDisconnectTitle": "Vous avez été déconnecté.",
"conferenceReloadMsg": "On essaie d'arranger ça. Reconnexion dans {{seconds}} secondes ...",
"conferenceReloadMsg": "On essaie d'arranger ça. Reconnexion dans {{seconds}} secondes...",
"conferenceReloadTitle": "Malheureusement, un problème est survenu",
"confirm": "Confirmer",
"confirmNo": "Non",
"confirmYes": "Oui",
"connectError": "Oups ! Un problème est survenu et la connexion à la conférence est impossible.",
"connectErrorWithMsg": "Oups ! Un problème est survenu et la connexion à la conférence est impossible : {{msg}}",
"connectError": "Oups! Un problème est survenu et la connexion à la conférence est impossible.",
"connectErrorWithMsg": "Oups! Un problème est survenu et la connexion à la conférence est impossible: {{msg}}",
"connecting": "Connexion en cours",
"contactSupport": "Contacter le support",
"copied": "Copié",
"copy": "Copier",
"dismiss": "Rejeter",
"displayNameRequired": "Bonjour ! Quel est votre nom ?",
"displayNameRequired": "Bonjour! Quel est votre nom ?",
"done": "Terminé",
"e2eeDescription": "Le cryptage de Bout-en-Bout est actuellement EXPERIMENTAL. Veuillez garder à l'esprit que l'activation du cryptage de Bout-en-Bout désactivera les services fournis côté serveur tels que : l'enregistrement, la diffusion en direct et la participation par téléphone. Gardez également à l'esprit que la réunion ne fonctionnera que pour les personnes qui se joignent à partir de navigateurs prenant en charge les flux insérables.",
"e2eeLabel": "Activer le cryptage de Bout-en-Bout",
"e2eeWarning": "ATTENTION : Tous les participants de cette réunion ne semblent pas prendre en charge le chiffrement de Bout-en-Bout. Si vous activez le cryptage, ils ne pourront ni vous voir, ni vous entendre.",
"enterDisplayName": "Merci de saisir votre nom ici",
"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.",
"externalInstallationTitle": "Extension requise",
"goToStore": "Aller sur le webstore",
"gracefulShutdown": "Notre service est actuellement en maintenance. Veuillez réessayer plus tard.",
"grantModeratorDialog": "Êtes-vous sûr de vouloir rendre ce participant modérateur ?",
"grantModeratorTitle": "Nommer modérateur",
"IamHost": "Je suis l'hôte",
"gracefulShutdown": "Le service est actuellement en maintenance. Réessayez plus tard.",
"IamHost": "Je suis lhôte",
"incorrectRoomLockPassword": "Mot de passe incorrect",
"incorrectPassword": "Nom d'utilisateur ou mot de passe incorrect",
"inlineInstallationMsg": "Vous devez installer notre extension de partage de bureau.",
"inlineInstallExtension": "Installer maintenant",
"internalError": "Oups ! Quelque chose s'est mal passée. L'erreur suivante s'est produite : {{error}}",
"internalError": "Oups! Quelque chose s'est mal passée. L'erreur suivante s'est produite: {{error}}",
"internalErrorTitle": "Erreur interne",
"kickMessage": "Vous pouvez contacter {{participantDisplayName}} pour plus de détails.",
"kickParticipantButton": "Expulser",
"kickParticipantDialog": "Êtes-vous sûr(e) de vouloir expulser ce participant ?",
"kickParticipantTitle": "Expulser ce participant ?",
"kickTitle": "Oups ! vous avez été expulsé(e) par {{participantDisplayName}}",
"kickTitle": "Oups! vous avez été expulsé(e) par {{participantDisplayName}}",
"liveStreaming": "Direct",
"liveStreamingDisabledForGuestTooltip": "Les invités ne peuvent démarrer la diffusion en direct.",
"liveStreamingDisabledTooltip": "La diffusion en direct est désactivé",
@@ -232,7 +223,7 @@
"lockTitle": "Échec du verrouillage",
"logoutQuestion": "Voulez-vous vraiment vous déconnecter et arrêter la conférence ?",
"logoutTitle": "Déconnexion",
"maxUsersLimitReached": "Le nombre maximal de participant est atteint. Le conférence est complète. Merci de contacter l'organisateur de la réunion ou réessayer plus tard !",
"maxUsersLimitReached": "Le nombre maximal de participant est atteint. Le conférence est complète. Merci de contacter l'organisateur de la réunion ou réessayer plus tard!",
"maxUsersLimitReachedTitle": "Le nombre maximal de participants est atteint",
"micConstraintFailedError": "Votre microphone ne satisfait pas certaines des contraintes nécessaires.",
"micNotFoundError": "Le microphone n'a pas été détecté.",
@@ -257,17 +248,16 @@
"passwordRequired": "$t(lockRoomPasswordUppercase) requis",
"popupError": "Votre navigateur bloque les fenêtres pop-up. Veuillez autoriser les fenêtres pop-up dans les paramètres de votre navigateur.",
"popupErrorTitle": "Pop-up bloquée",
"readMore": "plus",
"recording": "Enregistrement",
"recordingDisabledForGuestTooltip": "Les invités ne peuvent enregistrer.",
"recordingDisabledTooltip": "L'enregistrement est désactivé.",
"rejoinNow": "Rejoindre maintenant",
"remoteControlAllowedMessage": "{{user}} a accepté votre demande de prise en main à distance !",
"remoteControlDeniedMessage": "{{user}} a refusé votre demande de prise en main à distance !",
"remoteControlErrorMessage": "Une erreur s'est produite lors de la demande d'autorisation de prise en main à distance avec {{user}} !",
"remoteControlErrorMessage": "Une erreur s'est produite lors de la demande dautorisation de prise en main à distance avec {{user}} !",
"remoteControlRequestMessage": "Voulez-vous autoriser {{user}} à contrôler votre bureau ?",
"remoteControlShareScreenWarning": "Si vous appuyez sur \"Autoriser\", vous allez partager votre écran !",
"remoteControlStopMessage": "La prise en main à distance est terminée !",
"remoteControlStopMessage": "La prise en main à distance est terminée!",
"remoteControlTitle": "Contrôle de bureau à distance",
"Remove": "Supprimer",
"removePassword": "Supprimer le $t(lockRoomPassword)",
@@ -276,15 +266,11 @@
"reservationError": "Erreur du système de réservation",
"reservationErrorMsg": "Code d'erreur: {{code}}, message: {{msg}}",
"retry": "Réessayer",
"screenSharingAudio": "Partager l'audio",
"screenSharingFailed": "Oops ! Quelque chose s'est mal passée, nous n'avons pas pu démarrer le partage d'écran !",
"screenSharingFailedTitle": "Echec du partage d'écran !",
"screenSharingPermissionDeniedError": "Oops ! Un problème est survenu avec vos autorisations de partage d'écran. Veuillez réessayer.",
"screenSharingFailedToInstall": "Oups ! Votre extension de partage d'écran n'a pas pu être installée.",
"screenSharingFailedToInstall": "Oups! Votre extension de partage d'écran n'a pas pu être installée.",
"screenSharingFailedToInstallTitle": "L'extension de partage d'écran n'a pas pu être installée",
"screenSharingFirefoxPermissionDeniedError": "Quelque chose s'est mal passé pendant que nous essayions de partager votre écran. S'il vous plaît assurez-vous que vous nous avez donné la permission de le faire. ",
"screenSharingFirefoxPermissionDeniedTitle": "Oups ! Nous ne pouvions pas démarrer le partage d'écran !",
"screenSharingPermissionDeniedError": "Oups ! Une erreur s'est produite avec vos autorisations d'extension de partage d'écran. Veuillez rafraîchir et réessayer.",
"screenSharingFirefoxPermissionDeniedTitle": "Oups! Nous ne pouvions pas démarrer le partage d'écran !",
"screenSharingPermissionDeniedError": "Oups! Une erreur s'est produite avec vos autorisations d'extension de partage d'écran. Veuillez rafraîchir et réessayer.",
"sendPrivateMessage": "Vous avez récemment reçu un message privé. Aviez-vous l'intention d'y répondre en privé, ou vouliez-vous envoyer votre message au groupe ?",
"sendPrivateMessageCancel": "Envoyer au groupe",
"sendPrivateMessageOk": "Envoyer en privé",
@@ -292,14 +278,14 @@
"serviceUnavailable": "Service indisponible",
"sessTerminated": "Appel terminé",
"Share": "Partager",
"shareVideoLinkError": "Veuillez renseigner un lien Youtube fonctionnel.",
"shareVideoLinkError": "Fournissez s'il vous plaît un lien Youtube fonctionnel.",
"shareVideoTitle": "Partager une vidéo",
"shareYourScreen": "Partager votre écran",
"shareYourScreenDisabled": "Le partage d'écran est désactivé.",
"shareYourScreenDisabledForGuest": "Les invités ne peuvent pas partager leur écran.",
"shareYourScreen": "Partagez votre écran",
"shareYourScreenDisabled": "Le partage décran est désactivé.",
"shareYourScreenDisabledForGuest": "Les invités ne peuvent partager l'écran.",
"startLiveStreaming": "Démarrer la diffusion en direct",
"startRecording": "Commencer l'enregistrement",
"startRemoteControlErrorMessage": "Une erreur est survenue lors de la tentative de démarrage de la session de contrôle à distance !",
"startRemoteControlErrorMessage": "Une erreur est survenue lors de la tentative de démarrage de la session de contrôle à distance!",
"stopLiveStreaming": "Arrêter la diffusion en direct",
"stopRecording": "Arrêter l'enregistrement",
"stopRecordingWarning": "Désirez-vous vraiment arrêter l'enregistrement ?",
@@ -317,7 +303,8 @@
"WaitForHostMsgWOk": "La conférence <b>{{room}}</b> n'a pas encore commencé. Si vous en êtes l'hôte, veuillez appuyer sur Ok pour vous authentifier. Sinon, veuillez attendre son arrivée.",
"WaitingForHost": "En attente de l'hôte ...",
"Yes": "Oui",
"yourEntireScreen": "Votre écran entier"
"yourEntireScreen": "Votre écran entier",
"screenSharingAudio": "Partager laudio"
},
"dialOut": {
"statusMessage": "est maintenant {{status}}"
@@ -325,12 +312,6 @@
"documentSharing": {
"title": "Document partagé"
},
"e2ee": {
"labelToolTip": "L'audio et la vidéo de cette conférence sont cryptés de Bout-en-Bout"
},
"embedMeeting": {
"title": "Intégrer cette réunion"
},
"feedback": {
"average": "Moyen",
"bad": "Mauvais",
@@ -365,7 +346,7 @@
"invitePhoneAlternatives": "Vous cherchez un numéro d'appel différent ?\nAfficher les numéros d'appel de la réunion: {{url}}\n\n\nSi vous appelez également via un téléphone de salle, vous pouvez vous connecter sans audio: {{silentUrl}}",
"inviteURLFirstPartGeneral": "Vous êtes invité(e) à participer à une réunion.",
"inviteURLFirstPartPersonal": "{{name}} vous invite à une réunion.\n",
"inviteURLSecondPart": "\nRejoindre la réunion :\n{{url}}\n",
"inviteURLSecondPart": "\nRejoindre la réunion:\n{{url}}\n",
"liveStreamURL": "Diffusion en direct :",
"moreNumbers": "Plus de numéros ",
"noNumbers": "Numéros non trouvés",
@@ -422,17 +403,15 @@
"errorLiveStreamNotEnabled": "La diffusion en direct n'est pas activée pour {{email}}. Merci de l'activer ou de vous connecter avec un compte où elle est déjà activée.",
"expandedOff": "La diffusion en direct a été arrêtée",
"expandedOn": "La conférence est en cours de diffusion sur YouTube.",
"expandedPending": "La diffusion en direct a commencé ...",
"expandedPending": "La diffusion en direct a commencé...",
"failedToStart": "La diffusion n'as pas réussi à démarrer",
"getStreamKeyManually": "Nous n'avons pu récupérer aucun flux en direct. Essayez d'obtenir votre clé de diffusion en direct sur YouTube.",
"getStreamKeyManually": "Nous n'avons pu récupérer aucun flux en direct. Essayez dobtenir votre clé de diffusion en direct sur YouTube.",
"invalidStreamKey": "La clé de diffusion en direct n'est peut-être pas correcte.",
"limitNotificationDescriptionWeb": "En raison de la forte demande, votre diffusion sera limitée à {{limit}} min. Pour un streaming illimité, essayez <a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>.",
"limitNotificationDescriptionNative": "Votre diffusion sera limitée à {{limit}} min. Pour un streaming illimité, essayez {{app}}.",
"off": "Le Streaming a été arrêté",
"offBy": "{{name}} a arrêté la diffusion en continu",
"on": "En direct",
"onBy": "{{name}} a démarré la diffusion en continu",
"pending": "Lancement du direct ...",
"on": "Direct",
"onBy": "{{name}} démarré la diffusion en continu",
"pending": "Commencer le direct...",
"serviceName": "Service de diffusion en direct",
"signedInAs": "Vous êtes connecté en tant que :",
"signIn": "Se connecter avec Google",
@@ -441,7 +420,7 @@
"start": "Démarrer la diffusion en direct",
"streamIdHelp": "Qu'est-ce que c'est ?",
"unavailableTitle": "La diffusion est indisponible",
"youtubeTerms": "Conditions d'utilisation de YouTube",
"youtubeTerms": "Conditions dutilisation de YouTube",
"googlePrivacyPolicy": "Politique de confidentialité de Google"
},
"localRecording": {
@@ -492,24 +471,20 @@
"moderator": "Droits modérateur accordés !",
"muted": "Vous avez commencé la conversation en muet.",
"mutedTitle": "Vous êtes en muet !",
"mutedRemotelyTitle": "Votre micro a été coupé par {{participantDisplayName}} !",
"mutedRemotelyTitle": "Votre micro a été coupé par {{participantDisplayName}}!",
"mutedRemotelyDescription": "Vous pouvez toujours activer votre micro pour prendre la parole. Désactivez votre micro quand vous terminez pour éviter les bruits parasites.",
"passwordRemovedRemotely": "Le $t(lockRoomPassword) a été supprimé par un autre participant",
"passwordSetRemotely": "Un $t(lockRoomPassword) a été défini par un autre participant",
"raisedHand": "{{name}} aimerait prendre la parole.",
"somebody": "Quelqu'un",
"startSilentTitle": "Vous avez rejoint sans sortie audio !",
"startSilentTitle": "Vous avez rejoint sans sortie audio!",
"startSilentDescription": "Rejoignez la réunion de nouveau pour activer l'audio",
"suboptimalBrowserWarning": "Nous craignons que votre expérience de réunion en ligne ne soit bonne ici. Nous cherchons des moyens d'améliorer cela, mais d'ici-là, essayez d'utiliser l'un des <a href='{{recommendedBrowserPageLink}}' target='_blank'>navigateurs supportés</a>.",
"suboptimalBrowserWarning": "Nous craignons que votre expérience de réunion en ligne ne soit bonne ici. Nous cherchons des moyens daméliorer cela, mais dici-là, essayez dutiliser lun des <a href='{{recommendedBrowserPageLink}}' target='_blank'>navigateurs supportés</a>.",
"suboptimalExperienceTitle": "Avertissement du navigateur",
"unmute": "Rétablir le son",
"newDeviceCameraTitle": "Nouvelle caméra détectée",
"newDeviceAudioTitle": "Nouveau périphérique audio détecté",
"newDeviceAction": "Utiliser",
"OldElectronAPPTitle": "Vulnérabilité de sécurité !",
"oldElectronClientDescription1": "Vous semblez utiliser une ancienne version du client Jitsi Meet qui présente des vulnérabilités de sécurité connues. Veuillez vous assurer de mettre à jour vers notre ",
"oldElectronClientDescription2": "dernière build",
"oldElectronClientDescription3": " rapidement !"
"newDeviceAction": "Utiliser"
},
"passwordSetRemotely": "défini par un autre participant",
"passwordDigitsOnly": "Jusqu'à {{number}} chiffres",
@@ -518,40 +493,19 @@
"audioAndVideoError": "Erreur audio et video:",
"audioOnlyError": "Erreur audio:",
"audioTrackError": "N'a pas pu créer la piste audio.",
"calling": "Appel",
"callMe": "Appelez-moi",
"callMeAtNumber": "Appelez-moi à ce numéro :",
"configuringDevices": "Configuration des appareils ...",
"connectedWithAudioQ": "Êtes-vous connecté avec le microphone ?",
"connection": {
"good": "Votre connexion Internet est bonne !",
"nonOptimal": "Votre connexion n'est pas optimale",
"poor": "Vous avez une mauvaise connexion"
},
"connectionDetails": {
"audioClipping": "Attendez vous à ce que votre audio soit coupé.",
"audioHighQuality": "Votre audio sera de bonne qualité.",
"audioLowNoVideo": "Attendez vous à une faible qualité audio et aucune vidéo",
"goodQuality": "Impressionnant ! La qualité de vos médias sera excellente",
"noMediaConnectivity": "Nous n'avons pas pu trouver un moyen d'établir une connectivité multimédia pour ce test. Cela est généralement causé par un pare-feu ou un NAT.",
"noVideo": "Attendez vous à ce que votre qualité vidéo soit très mauvaise.",
"undetectable": "Si vous ne parvenez toujours pas à passer des appels dans le navigateur, nous vous recommandons de vous assurer que vos haut-parleurs, microphone et caméra sont correctement configurés, que vous avez accordé à votre navigateur les droits d'utiliser votre microphone et votre caméra et que la version de votre navigateur est à jour. Si vous rencontrez toujours des difficultés pour appeler, vous devez contacter le développeur de l'application Web.",
"veryPoorConnection": "Attendez vous à ce que la qualité de votre appel soit très mauvaise",
"videoFreezing": "Attendez vous à ce que votre vidéo saute, soit noire, et pixelisée.",
"videoHighQuality": "Votre vidéo sera de bonne qualité",
"videoLowQuality": "Votre vidéo sera de basse qualité en terme d'images par seconde et de résolution.",
"videoTearing": "Attendez vous à ce que votre vidéo soit pixélisée ou contienne des artefacts visuels."
},
"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 :",
"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",
"errorMissingName": "Veuillez entrer votre nom pour entrer en conférence",
"errorStatusCode": "Erreur de numérotation, code d'état: {{status}}",
"errorValidation": "La validation du numéro a échoué",
"iWantToDialIn": "Je veux me connecter",
@@ -563,8 +517,6 @@
"lookGood": "Il semble que votre microphone fonctionne correctement",
"or": "ou",
"calling": "Appel",
"premeeting": "Pré-séance",
"showScreen": "Activer l'écran de pré-séance",
"startWithPhone": "Commencez avec l'audio du téléphone",
"screenSharingError": "Erreur de partage d'écran:",
"videoOnlyError": "Erreur vidéo:",
@@ -573,17 +525,17 @@
},
"presenceStatus": {
"busy": "Occupé",
"calling": "Appel ...",
"calling": "Appel...",
"connected": "Connecté",
"connecting": "Connexion en cours ...",
"connecting2": "Connexion en cours* ...",
"connecting": "Connexion en cours...",
"connecting2": "Connexion en cours*...",
"disconnected": "Déconnecté",
"expired": "Expiré",
"ignored": "Ignoré",
"initializingCall": "Lancement de l'appel ...",
"initializingCall": "Lancement de l'appel...",
"invited": "Invité(e)",
"rejected": "Rejeté",
"ringing": "Appel en cours ..."
"ringing": "Appel en cours..."
},
"profile": {
"setDisplayNameLabel": "Choisissez un pseudo",
@@ -594,45 +546,37 @@
"raisedHand": "Aimerait prendre la parole",
"recording": {
"authDropboxText": "Téléchargement vers Dropbox",
"availableSpace": "Espace disponible : {{spaceLeft}} Mo (approximativement {{duration}} minutes d'enregistrement)",
"availableSpace": "Espace disponible: {{spaceLeft}} Mo (approximativement {{duration}} minutes d'enregistrement)",
"beta": "BETA",
"busy": "Nous sommes en train de libérer les ressources d'enregistrement. Réessayez dans quelques minutes.",
"busyTitle": "Tous les enregistreurs sont actuellement occupés",
"error": "Échec de l'enregistrement. Veuillez réessayer.",
"expandedOff": "L'enregistrement a été arrêté",
"expandedOn": "Cette conférence est actuellement en cours d'enregistrement.",
"expandedPending": "Démarrage de l'enregistrement ...",
"expandedPending": "Démarrage de l'enregistrement...",
"failedToStart": "L'enregistrement n'as pas réussi à démarrer",
"fileSharingdescription": "Partager l'enregistrement avec les participants de la réunion",
"limitNotificationDescriptionWeb": "En raison d'une forte demande, votre enregistrement sera limité à {{limit}} min. Pour des enregistrements illimités, essayez <a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>.",
"limitNotificationDescriptionNative": "En raison d'une forte demande, votre enregistrement sera limité à {{limit}} min. Pour des enregistrements illimités, essayez <3> {{app}} </3>.",
"live": "DIRECT",
"loggedIn": "Connecté en tant que {{userName}}",
"off": "Enregistrement arrêté",
"offBy": "{{name}} a arrêté l'enregistrement",
"on": "Enregistrement",
"onBy": "{{name}} a démarré l'enregistrement",
"pending": "Préparation de l'enregistrement de la réunion ...",
"pending": "Préparation de l'enregistrement de la réunion...",
"rec": "REC",
"serviceDescription": "Votre enregistrement sera enregistré par le service dédié",
"serviceName": "Service d'enregistrement",
"signIn": "Se connecter",
"signOut": "Se déconnecter",
"unavailable": "Oups ! Le {{serviceName}} est actuellement indisponible. Nous tentons de résoudre le problème. Veuillez réessayer plus tard.",
"unavailable": "Oups! Le {{serviceName}} est actuellement indisponible. Nous tentons de résoudre le problème. Veuillez réessayer plus tard.",
"unavailableTitle": "Enregistrement indisponible"
},
"sectionList": {
"pullToRefresh": "Tirer pour recharger"
},
"security": {
"about": "Vous pouvez ajouter un mot de passe à votre réunion. Les participants devront fournir le mot de passe avant qu'ils soient autorisés à rejoindre la réunion.",
"aboutReadOnly": "Les modérateurs peuvent ajouter un mot de passe à la réunion. Les participants devront fournir le mot de passe avant qu'ils soient autorisés à rejoindre la réunion.",
"insecureRoomNameWarning": "Le nom de la salle est peu sûr. Des participants non désirés peuvent rejoindre votre réunion. Pensez à sécuriser votre réunion en cliquant sur le bouton de sécurité.",
"securityOptions": "Options de sécurité"
},
"settings": {
"calendar": {
"about": "L'intégration de {{appName}} avec votre calendrier permet d'accéder de manière sécurisée aux événement à venir.",
"about": "L'intégration de {{appName}} avec votre calendrier permet daccéder de manière sécurisée aux événement à venir.",
"disconnect": "Se déconnecter",
"microsoftSignIn": "Se connecter avec Microsoft",
"signedIn": "Accès aux événements du calendrier {{email}}. Cliquez sur le bouton se déconnecter ci-dessous pour arrêter l'accès aux événements du calendrier.",
@@ -642,7 +586,6 @@
"followMe": "Tout le monde me suit",
"language": "Langue",
"loggedIn": "Connecté en tant que {{name}}",
"microphones": "Microphones",
"moderator": "Modérateur",
"more": "Plus",
"name": "Nom",
@@ -650,23 +593,21 @@
"selectAudioOutput": "Sortie audio",
"selectCamera": "Caméra",
"selectMic": "Microphone",
"speakers": "Intervenants",
"startAudioMuted": "Tout le monde commence en muet",
"startVideoMuted": "Tout le monde commence sans vidéo",
"title": "Paramètres"
"title": "Paramètres",
"microphones": "Microphones",
"speakers": "Intervenants"
},
"settingsView": {
"advanced": "Avancé",
"alertOk": "D'accord",
"alertCancel": "Annuler",
"alertTitle": "Avertissement",
"alertURLText": "L'URL du serveur est invalide",
"buildInfoSection": "Informations de build",
"conferenceSection": "Conférence",
"disableCallIntegration": "Désactiver l'intégration d'appels native",
"disableP2P": "Désactiver le mode pair à pair",
"disableCrashReporting": "Désactiver les rapports de plantage",
"disableCrashReportingWarning": "Etes-vous certain de vouloir désactiver les rapports de plantage ? Le paramètre sera effectif après le redémarrage de l'application.",
"displayName": "Pseudo",
"email": "Email",
"header": "Paramètres",
@@ -692,7 +633,6 @@
},
"startupoverlay": {
"policyText": " ",
"genericTitle": "La conférence a besoin d'utiliser votre microphone et votre caméra.",
"title": "{{app}} a besoin d'accéder à votre microphone et votre caméra."
},
"suspendedoverlay": {
@@ -709,41 +649,37 @@
"chat": "Afficher/masquer la discussion instantanée",
"document": "Activer/désactiver le document partagé",
"download": "Télécharger nos applications",
"embedMeeting": "Intégrer la réunion",
"feedback": "Laisser des commentaires",
"fullScreen": "Activer/désactiver le plein écran",
"grantModerator": "Nommer modérateur",
"hangup": "Quitter la conversation",
"help": "Aide",
"invite": "Inviter des participants",
"kick": "Expulser le participant",
"lobbyButton": "Activer / désactiver le mode lobby",
"localRecording": "Activer/désactiver les contrôles d'enregistrement local",
"lockRoom": "Activer/Désactiver le mot de passe de la réunion",
"moreActions": "Activer/désactiver le menu d'actions supplémentaires",
"moreActionsMenu": "Menu d'actions supplémentaires",
"moreOptions": "Voir plus d'options",
"mute": "Activer/désactiver l'audio",
"muteEveryone": "Rendre muet tout le monde",
"pip": "Activer/désactiver le mode Picture in Picture",
"privateMessage": "Envoyer un message privé",
"profile": "Éditer votre profil",
"raiseHand": "Lever/baisser la main",
"recording": "Activer/désactiver l'enregistrement",
"remoteMute": "Désactiver le micro du participant",
"security": "Options de sécurité",
"Settings": "Afficher/masquer le menu des paramètres",
"sharedvideo": "Démarrer/arrêter le partage de vidéo YouTube",
"shareRoom": "Inviter quelqu'un",
"shareYourScreen": "Activer/désactiver le partage d'écran",
"shareYourScreen": "Activer/désactiver le partage décran",
"shortcuts": "Afficher/masquer les raccourcis",
"show": "Afficher en premier plan",
"speakerStats": "Afficher/cacher les statistiques de parole",
"tileView": "Activer/désactiver la vue mosaïque",
"toggleCamera": "Changer de caméra",
"toggleFilmstrip": "Basculer de pellicule",
"videomute": "Activer/désactiver la vidéo",
"videoblur": "Activer/désactiver le flou de la vidéo"
"videoblur": "Activer/désactiver le flou de la vidéo",
"muteEveryone": "Mettre tout le monde en sourdine",
"moreOptions": "Afficher plus d'options",
"toggleFilmstrip": "Basculer la bande de film"
},
"addPeople": "Ajouter des personnes à votre appel",
"audioOnlyOff": "Désactiver le mode bande passante réduite",
@@ -756,8 +692,6 @@
"documentClose": "Fermer le document partagé",
"documentOpen": "Ouvrir le document partagé",
"download": "Télécharger nos applications",
"e2ee": "Cryptage de Bout-en-Bout",
"embedMeeting": "Intégrer la réunion",
"enterFullScreen": "Afficher en plein écran",
"enterTileView": "Accéder au mode mosaïque",
"exitFullScreen": "Quitter le mode plein écran",
@@ -778,8 +712,6 @@
"noAudioSignalTitle": "Il n'y a pas de signal provenant de votre micro !",
"noAudioSignalDesc": "Si vous n'avez pas délibérément coupé le son des paramètres du système ou du matériel, envisagez de changer de périphérique utilisé.",
"noAudioSignalDescSuggestion": "Si vous n'avez pas délibérément coupé le son des paramètres du système ou du matériel, pensez à utiliser le périphérique suivant :",
"noAudioSignalDialInDesc": "Vous pouvez également appeler en utilisant :",
"noAudioSignalDialInLinkDesc": "Numéros d'appel",
"noisyAudioInputTitle": "Votre microphone semble être bruyant !",
"noisyAudioInputDesc": "Il semble que votre microphone fasse du bruit, veuillez le couper ou changer de périphérique.",
"openChat": "Ouvrir le chat",
@@ -788,7 +720,6 @@
"profile": "Éditer votre profil",
"raiseHand": "Lever / Baisser la main",
"raiseYourHand": "Lever la main",
"security": "Options de sécurité",
"Settings": "Paramètres",
"sharedvideo": "Partager une vidéo YouTube",
"shareRoom": "Inviter quelqu'un",
@@ -804,7 +735,9 @@
"toggleCamera": "Changer de caméra",
"videomute": "Démarrer / Arrêter la caméra",
"startvideoblur": "Flouter mon arrière plan",
"stopvideoblur": "Désactiver le flou d'arrière-plan"
"stopvideoblur": "Désactiver le flou d'arrière-plan",
"noAudioSignalDialInDesc": "Vous pouvez également composer un numéro en utilisant :",
"noAudioSignalDialInLinkDesc": "Numéros d'appel"
},
"transcribing": {
"ccButtonTooltip": "Activer/Désactiver les sous-titres",
@@ -813,7 +746,7 @@
"failedToStart": "Échec de démarrage de la transcription",
"labelToolTip": "La transcription de la réunion est en cours",
"off": "La transcription désactivée",
"pending": "Préparation de la transcription de la réunion ...",
"pending": "Préparation de la transcription de la réunion...",
"start": "Afficher/masquer les sous-titres",
"stop": "Désactiver le sous-titrage",
"tr": "TR"
@@ -842,7 +775,7 @@
},
"videoStatus": {
"audioOnly": "VOIX",
"audioOnlyExpanded": "Vous êtes en mode bande passante réduite. Dans ce mode, vous ne recevrez que le partage audio et le partage d'écran.",
"audioOnlyExpanded": "Vous êtes en mode bande passante réduite. Dans ce mode, vous ne recevrez que le partage audio et le partage décran.",
"callQuality": "Qualité vidéo",
"hd": "HD",
"hdTooltip": "Regardez la vidéo en haute définition",
@@ -885,27 +818,22 @@
"connectCalendarButton": "Connecter votre calendrier",
"connectCalendarText": "Connectez-vous à votre calendrier pour afficher toutes les réunions {{app}}. Ajoutez également les réunions de {{provider}} à votre calendrier et démarrez-les d'un simple clic.",
"enterRoomTitle": "Démarrer une nouvelle réunion",
"getHelp": "Obtenir de l'aide",
"roomNameAllowedChars": "Le nom de la réunion ne doit contenir aucun de ces caractères : ?, &, :, ', \", %, #.",
"go": "Créer",
"goSmall": "Créer",
"headerTitle": "Jitsi Meet",
"headerSubtitle": "Conférences sécurisées et de haute qualité",
"info": "Infos",
"join": "CRÉER / REJOINDRE",
"jitsiOnMobile": "Jitsi sur mobile télécharger notre application et démarrez des conférences de n'import où",
"moderatedMessage": "Ou <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">réserver une URL de réunion</a> à l'avance et où vous êtes le seul modérateur.",
"info": "Infos",
"privacy": "Confidentialité",
"recentList": "Récent",
"recentListDelete": "Supprimer",
"recentListEmpty": "Votre liste récente est actuellement vide. Discuter avec votre équipe et vous trouverez toutes vos réunions récentes ici.",
"reducedUIText": "Bienvenue sur {{app}} !",
"roomNameAllowedChars": "Le nom de la réunion ne doit contenir aucun de ces caractères : ?, &, :, ', \", %, #.",
"reducedUIText": "Bienvenue sur {{app}}!",
"roomname": "Saisissez un nom de salle",
"roomnameHint": "Entrez le nom ou l'URL de la salle que vous souhaitez rejoindre. Vous pouvez faire un nom, laissez les gens que vous rencontrerez le savoir afin qu'ils entrent le même nom.",
"sendFeedback": "Envoyer votre avis",
"startMeeting": "Démarrer la conférence",
"terms": "Termes",
"title": "Système de vidéoconférence sécurisé, riche en fonctionnalités et gratuit"
"title": "Système de vidéoconférence sécurisé, riche en fonctionnalités et gratuit",
"getHelp": "Obtenir de l'aide"
},
"lonelyMeetingExperience": {
"button": "Inviter d'autres personnes",
@@ -915,36 +843,37 @@
"header": "Centre d'aide"
},
"lobby": {
"knockingParticipantList": "Liste des participants en attente",
"knockingParticipantList" : "Liste des participants en attente",
"allow": "Autoriser",
"backToKnockModeButton": "Aucun mot de passe, demander à rejoindre plutôt",
"dialogTitle": "Mode salle d'attente",
"disableDialogContent": "Le mode salle d'attente est actuellement activé. Cette fonctionnalité garantit que les participants indésirables ne peuvent pas rejoindre votre réunion. Souhaitez-vous la désactiver ?",
"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 (optionnel)",
"enableDialogSubmit": "Activer",
"enableDialogText": "Le mode salle d'attente vous permet de protéger votre réunion en autorisant les personnes à entrer qu'après l'approbation formelle d'un modérateur.",
"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 ...",
"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 ...",
"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",
"notificationLobbyAccessDenied": "{{targetParticipantName}} a été refusé par {{originParticipantName}}",
"notificationLobbyAccessGranted": "{{targetParticipantName}} a été accepté par {{originParticipantName}}",
"notificationLobbyDisabled": "Lobby a été désactivé par {{originParticipantName}}",
"notificationLobbyEnabled": "Lobby a été activé par {{originParticipantName}}",
"notificationTitle": "Lobby",
"passwordField": "Saisissez le mot de passe de la réunion",
"passwordJoinButton": "Rejoindre",
"reject": "Refuser",
"toggleLabel": "Activer la salle d'attente"
"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

@@ -1,43 +1,28 @@
{
"addPeople": {
"add": "Invita",
"addContacts": "Invita tuoi contatti",
"copyInvite": "Copia invito della riunione",
"copyLink": "Copia collegamento della riunione",
"copyStream": "Copia collegamento della diretta",
"countryNotSupported": "Non supportiamo ancora questa destinazione.",
"countryReminder": "Stai chiamando fuori dagli Stati Uniti? Assicurati d'inserire il prefisso internazionale!",
"defaultEmail": "Tua Email di default",
"disabled": "Non puoi invitare persone.",
"failedToAdd": "L'aggiunta di nuove persone è fallita",
"footerText": "La chiamata all'esterno è disabilitata.",
"googleEmail": "Email Google",
"inviteMoreHeader": "Sei l'unico presente alla riunione",
"inviteMoreMailSubject": "Unisciti alla riunione {{appName}}",
"inviteMorePrompt": "Invita altra gente",
"linkCopied": "Collegamento copiato negli appunti",
"loading": "Sto cercando persone e numeri di telefono",
"loadingNumber": "Sto validando il numero di telefono",
"loadingPeople": "Sto cercando le persone da invitare",
"noResults": "Nessun risultato corrispondente",
"noValidNumbers": "Per favore inserire un numero di telefono",
"outlookEmail": "Email Outlook",
"searchNumbers": "Aggiungi numeri di telefono",
"searchPeople": "Cerca persone",
"searchPeopleAndNumbers": "Cerca persone o aggiungi i loro numeri di telefono",
"shareInvite": "Condividi invito alla riunione",
"shareLink": "Condividi il collegamento alla riunione per invitare altri",
"shareStream": "Condividi il collegamento alla diretta",
"telephone": "Telefono: {{number}}",
"title": "Invita persone a questa riunione",
"yahooEmail": "Email Yahoo"
"title": "Invita persone a questo meeting"
},
"audioDevices": {
"bluetooth": "Bluetooth",
"headphones": "Cuffie",
"phone": "Telefono",
"speaker": "Vivavoce",
"none": "Nessun disposistivo audio esistente"
"none": ""
},
"audioOnly": {
"audioOnly": "Solo audio"
@@ -62,25 +47,20 @@
},
"chat": {
"error": "Errore: il tuo messaggio “{{originalText}}” non e stato inviato. Motivo: {{error}}",
"fieldPlaceHolder": "Scrivi qui il tuo messaggio",
"messagebox": "Digitare un messaggio",
"messageTo": "Messaggio privato per {{recipient}}",
"noMessagesMessage": "Non ci sono ancora messaggi nella riunione. Comincia una conversazione, qui!",
"nickname": {
"popover": "Scegli un nickname",
"title": "Inserire un nickname per utilizzare la chat"
},
"privateNotice": "Messaggio privato per {{recipient}}",
"title": "Chat",
"you": "tu"
},
"chromeExtensionBanner": {
"installExtensionText": "Installa un'estensione per integrare Google Calendar e Office 365",
"buttonText": "Installa l'estensione Chrome",
"dontShowAgain": "Non mostrare più questo messaggio"
"you": "",
"privateNotice": "",
"noMessagesMessage": "",
"messageTo": "",
"fieldPlaceHolder": ""
},
"connectingOverlay": {
"joiningRoom": "Collegamento alla riunione in corso…"
"joiningRoom": "Collegamento al tuo meeting in corso…"
},
"connection": {
"ATTACHED": "Collegato",
@@ -92,27 +72,24 @@
"DISCONNECTED": "Disconnesso",
"DISCONNECTING": "Disconnessione in corso",
"ERROR": "Errore",
"FETCH_SESSION_ID": "Sto ottenendo ID di sessione...",
"GET_SESSION_ID_ERROR": "Id dell'errore di sessione: {{code}}",
"GOT_SESSION_ID": "Ricevuto ID di sessione",
"LOW_BANDWIDTH": "Il video per {{displayName}} è stato interrotto per risparmiare banda"
"RECONNECTING": "Si è verificato un problema di rete. Riconnessione...",
"LOW_BANDWIDTH": "",
"GOT_SESSION_ID": "",
"GET_SESSION_ID_ERROR": "",
"FETCH_SESSION_ID": ""
},
"connectionindicator": {
"address": "Indirizzo:",
"audio_ssrc": "Audio SSRC:",
"bandwidth": "Banda stimata:",
"bitrate": "Bitrate:",
"bridgeCount": "Contatore server:",
"codecs": "Codec (A/V): ",
"connectedTo": "Connesso a:",
"e2e_rtt": "E2E RTT:",
"framerate": "Fotogrammi al secondo:",
"less": "Mostra meno",
"localaddress": "Indirizzo locale:",
"localaddress_plural": "Indirizzi locali:",
"localport": "Porta locale:",
"localport_plural": "Porte locali:",
"maxEnabledResolution": "manda max",
"more": "Mostra di più",
"packetloss": "Perdita pacchetti:",
"quality": {
@@ -127,12 +104,11 @@
"remoteport": "Porta remota:",
"remoteport_plural": "Porte remote:",
"resolution": "Risoluzione:",
"savelogs": "Salva log",
"participant_id": "Id participante:",
"status": "Connessione:",
"transport": "Trasporto:",
"transport_plural": "Trasporti:",
"video_ssrc": "Video SSRC:"
"turn": "(ruota)",
"e2e_rtt": ""
},
"dateUtils": {
"earlier": "Prima",
@@ -142,7 +118,7 @@
"deepLinking": {
"appNotInstalled": "Per partecipare a questo meeting sul tuo telefono ti serve l'app mobile di {{app}}",
"description": "Non è successo nulla? Abbiamo provato ad avviare la tua videoconferenza sull'app desktop di {{app}}. Prova di nuovo o avviala nell'app web di {{app}}.",
"descriptionWithoutWeb": "Non è successo niente? Abbiamo provato ad avviare la riunione nell'app per desktop {{app}}",
"descriptionWithoutWeb": "",
"downloadApp": "Scarica l'app",
"ifDoNotHaveApp": "Se non hai ancora l'app:",
"ifHaveApp": "Se hai già l'app:",
@@ -152,7 +128,6 @@
"tryAgainButton": "Prova di nuovo sul desktop"
},
"defaultLink": "es. {{url}}",
"defaultNickname": "es. Anna Rossi",
"deviceError": {
"cameraError": "Impossibile accedere alla videocamera",
"cameraPermission": "Errore nell'ottenere i permessi per la videocamera",
@@ -167,9 +142,8 @@
},
"dialog": {
"accessibilityLabel": {
"liveStreaming": "Diretta streaming"
"liveStreaming": "Diretta"
},
"add": "Aggiungi",
"allow": "Consenti",
"alreadySharedVideoMsg": "Un altro utente sta condividendo un video. Questa conferenza permette di condividere un solo video alla volta.",
"alreadySharedVideoTitle": "È permesso un solo video alla volta",
@@ -195,26 +169,25 @@
"connectErrorWithMsg": "Oops! Qualcosa è andato storto e non ti puoi collegare alla conferenza: {{msg}}",
"connecting": "Connessione",
"contactSupport": "Contatta il supporto",
"copied": "Copiato",
"copy": "Copia",
"dismiss": "Scarta",
"displayNameRequired": "Tutti devono avere un nome",
"done": "Fatto",
"e2eeDescription": "La crittografia punto-a-punto al momento è SPERIMENTALE. Tieni presente che attivandola disabiliterai i servizi svolti dal server, come: la registrazione su Dropobox, le dirette streaming e la partecipazione usando solo telefoni. Tieni anche presente che la riunione funzionerà solo per chi si collega usando browser che supportano flussi inseribili (insertable streams).",
"e2eeLabel": "Attiva la crittografia punto-a-punto",
"e2eeWarning": "ATTENZIONE: non tutti i partecipanti a questa riunione sembrano supportare le funzionalità di crittografia punto-a-punto. Se la attivi, non potranno sentirti, o vederti.",
"enterDisplayName": "Inserisci qui il tuo nome",
"enterDisplayName": "Inserisci il nome da visualizzare",
"error": "Errore",
"externalInstallationMsg": "Devi installare la nostra estensione per la condivisione desktop.",
"externalInstallationTitle": "Richiesta estensione",
"goToStore": "Vai al negozio on-line",
"gracefulShutdown": "Il nostro servizio è al momento spento per manutenzione. Si prega di riprovare più tardi.",
"grantModeratorDialog": "Sei sicuro di voler rendere moderatore questo partecipante?",
"grantModeratorTitle": "Autorizza moderatore",
"IamHost": "Sono l'organizzatore",
"incorrectRoomLockPassword": "Password errata",
"incorrectRoomLockPassword": "",
"incorrectPassword": "Nome utente o password errati",
"inlineInstallationMsg": "Devi installare la nostra estensione per la condivisione desktop.",
"inlineInstallExtension": "Installa adesso",
"internalError": "Ops! Qualcosa è andato storto. Questo è l'errore: {{error}}",
"internalErrorTitle": "Errore interno",
"kickMessage": "Acc! Sei stato espulso dal meeting!",
"kickParticipantButton": "Butta fuori",
"kickParticipantButton": "Espelli",
"kickParticipantDialog": "Sei sicuro di voler espellere questo partecipante?",
"kickParticipantTitle": "Espellere questi partecipante?",
"kickTitle": "Espulso dal meeting",
@@ -230,28 +203,21 @@
"maxUsersLimitReachedTitle": "Raggiunto limite partecipanti",
"micConstraintFailedError": "Il tuo microfono non soddisfa alcuni dei requisiti richiesti.",
"micNotFoundError": "Microfono non trovato.",
"micNotSendingData": "Non riusciamo a ricevere suoni dal microfono scelto. Prova a selezionare nelle impostazioni un microfono diverso, o a riavviare l'applicazione.",
"micNotSendingData": "Non riusciamo a ricevere suoni dal microfono scelto. Prova a selezionare nelle impostazioni un microfono diverso, o a riavvare l'applicazione.",
"micNotSendingDataTitle": "Impossibile accedere al microfono",
"micPermissionDeniedError": "Non hai concesso il permesso di usare il microfono. Puoi comunque partecipare alla conferenza ma gli altri non potranno sentirti. Usa il bottone a forma di telecamera nella barra degli indirizzi per cambiare impostazioni.",
"micUnknownError": "Impossibile usare il microfono per un motivo sconosciuto.",
"muteEveryoneElseDialog": "Una volta zittiti, non potrai riattivargli i microfoni, ma loro potranno farlo in qualsiasi momento.",
"muteEveryoneElseTitle": "Zittisco tutti eccetto {{whom}}?",
"muteEveryoneDialog": "Sei sicuro di voler zittire tutti? Non potrai riattivar loro il microfono, ma loro potranno farlo in qualsiasi momento.",
"muteEveryoneTitle": "Zittisco tutti?",
"muteEveryoneSelf": "te stesso",
"muteEveryoneStartMuted": "Tutti cominciano a microfono spento, d'adessp in avanti",
"muteParticipantBody": "Non sarai in grado di riattivare il loro microfono, ma loro potranno riattivarlo in qualsiasi momento.",
"muteParticipantButton": "Zittisci",
"muteParticipantDialog": "Sei sicuro di voler zittire questo partecipante? Saranno lui a doversi riattivare l'audio, per parlare.",
"muteParticipantTitle": "Zittisco questo partecipante?",
"Ok": "OK",
"passwordLabel": "La riunione è stata bloccata da un partecipante. Immetti la $t(lockRoomPassword) per collegarti, per favore.",
"passwordNotSupported": "Le password per le riunioni non sono supportate.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) non supportato",
"passwordRequired": "E' richiesto $t(lockRoomPasswordUppercase)",
"popupError": "Il tuo browser sta bloccando i pop-up da questo sito. Per favore abilita i pop-up dalle impostazioni di sicurezza del browser e riprova.",
"muteParticipantBody": "Tu non sarai in grado di riattivare il loro audio, ma loro potranno riattivarlo in qualsiasi momento.",
"muteParticipantButton": "Silenzia partecipante",
"muteParticipantDialog": "Sei sicuro di voler disattivare l'audio di questo partecipante? Saranno loro a doversi riattivare l'audio, per parlare.",
"muteParticipantTitle": "Silenzio questo partecipante?",
"Ok": "Ok",
"passwordLabel": "",
"passwordNotSupported": "Le password per le videoconferenze non sono supportate.",
"passwordNotSupportedTitle": "",
"passwordRequired": "",
"popupError": "Il tuo browser sta bloccando i pop-up da questo sito. Per favore abilità i pop-up dalle impostazioni di sicurezza del browser e riprova.",
"popupErrorTitle": "Pop-up bloccato",
"readMore": "altro",
"recording": "Registrazione",
"recordingDisabledForGuestTooltip": "Gli ospiti non possono avviare una registrazione.",
"recordingDisabledTooltip": "Registrazione disabilitata.",
@@ -270,14 +236,11 @@
"reservationError": "Errore di sistema in prenotazione",
"reservationErrorMsg": "Codice di errore: {{code}}, messaggio: {{msg}}",
"retry": "Riprova",
"screenSharingAudio": "Condividi audio",
"screenSharingFailed": "Ops! Non è stato possibile avviare la condivisione dello schermo!",
"screenSharingFailedTitle": "Condivisione dello schermo fallita!",
"screenSharingPermissionDeniedError": "Qualcosa non funziona nei permessi di condivisione dello schermo. Ricarica e prova ancora, autorizzando la condivisione.",
"sendPrivateMessage": "Hai ricevuto un messaggio privato, poco fa. Vorresti rispondergli privatamente, o vuoi mandare la risposta al gruppo?",
"sendPrivateMessageCancel": "Invia al gruppo",
"sendPrivateMessageOk": "Invia privatamente",
"sendPrivateMessageTitle": "Mando privatamente?",
"screenSharingFailedToInstall": "Oh! Non è stato possibile installare l'estensione per la condivisione schermo.",
"screenSharingFailedToInstallTitle": "Impossibile installare l'estensione per la condivisione schermo",
"screenSharingFirefoxPermissionDeniedError": "Qualcosa è andato storto mentre cercavamo di condividere il tuo schermo. Assicurati di averci dato il premesso di condivisione.",
"screenSharingFirefoxPermissionDeniedTitle": "Ops! Non siamo stati in grado di avviare la condivisione schermo!",
"screenSharingPermissionDeniedError": "Oops! Qualcosa è andato storto con le impostazioni dell'estensione per la condivisione dello schermo. Ricarica la pagina e prova di nuovo.",
"serviceUnavailable": "Servizio non disponibile",
"sessTerminated": "Chiamata terminata",
"Share": "Condividi",
@@ -285,6 +248,7 @@
"shareVideoTitle": "Condividi un video",
"shareYourScreen": "Condividi schermo",
"shareYourScreenDisabled": "Condivisione schermo disabilitata.",
"shareYourScreenDisabledForGuest": "Gli ospiti non possono condividere lo schermo.",
"startLiveStreaming": "Inizia una diretta",
"startRecording": "Inizia a registrare",
"startRemoteControlErrorMessage": "Si è verificato un errore cercando di avviare la sessione di controllo remoto!",
@@ -305,19 +269,21 @@
"WaitForHostMsgWOk": "La conferenza <b>{{room}}</b> non è ancora cominciata. Se sei l'organizzatore, allora premi OK per autenticarti. Altrimenti, aspetta l'arrivo dell'organizzatore.",
"WaitingForHost": "In attesa dell'organizzatore ...",
"Yes": "Sì",
"yourEntireScreen": "Schermo intero"
"yourEntireScreen": "Schermo intero",
"sendPrivateMessageTitle": "",
"sendPrivateMessageOk": "",
"sendPrivateMessageCancel": "",
"sendPrivateMessage": "",
"screenSharingAudio": "",
"muteEveryoneStartMuted": "",
"muteEveryoneSelf": "",
"muteEveryoneTitle": "",
"muteEveryoneDialog": "",
"muteEveryoneElseTitle": "",
"muteEveryoneElseDialog": ""
},
"dialOut": {
"statusMessage": "è {{status}}"
},
"documentSharing": {
"title": "Documento condiviso"
},
"e2ee": {
"labelToolTip": "Le comunicazioni audio e video di questa chiamata, sono crittografate dall'origine alla destinazione"
},
"embedMeeting": {
"title": "Incorpora questa riunione altrove"
"statusMessage": ora {{status}}"
},
"feedback": {
"average": "Media",
@@ -343,14 +309,14 @@
"country": "Paese",
"dialANumber": "Per collegarti telefonicamente al meeting, chiama uno di questi numeri e metti il pin.",
"dialInConferenceID": "PIN:",
"dialInNotSupported": "Spiacenti, la partecipazione solo telefonica non è supportata attualmente",
"dialInNotSupported": "Spiacenti, la partecipazionne solo telefonica non è supportata attualmente",
"dialInNumber": "Componi:",
"dialInSummaryError": "Errore nella ricerca dei numeri telefonici. Riprova più tardi.",
"dialInTollFree": "Numero verde",
"genericError": "Ops, qualcosa è andato storto.",
"inviteLiveStream": "Per vedere la diretta di questo meeting, clicca su questo link: {{url}}",
"invitePhone": "ATTENZIONE E' UNA CHIAMATA INTERNAZIONALE A PAGAMENTO! NON E' GRATUITA. Per seguire solo telefonicamente, clicca: {{number}},,{{conferenceID}}#",
"invitePhoneAlternatives": "Cerchi un numero diverso da chiamare?\nEcco dei numeri telefonici per collegarsi alle riunioni: {{url}}\n\n\nSe entri in riunione anche col computer, entra senza attivare l'audio: {{silentUrl}}",
"invitePhone": "Per seguire solo telefonicamente, clicca: {{number}},,{{conferenceID}}#",
"invitePhoneAlternatives": "",
"inviteURLFirstPartGeneral": "Invito a connettersi ad una conferenza.",
"inviteURLFirstPartPersonal": "{{name}} ti sta invitando ad un meeting.\n",
"inviteURLSecondPart": "\nPartecipa al meeting:\n{{url}}\n",
@@ -366,12 +332,12 @@
"label": "Informazioni meeting"
},
"inviteDialog": {
"alertText": "Errore nell'invitare alcuni partecipanti.",
"alertText": "",
"header": "Invita",
"searchCallOnlyPlaceholder": "Inserisci numero di telefono",
"searchPeopleOnlyPlaceholder": "Cerca partecipanti",
"searchPlaceholder": "Partecipante o numero di telefono",
"send": "Invia"
"searchPeopleOnlyPlaceholder": "",
"searchPlaceholder": "",
"send": ""
},
"inlineDialogFailure": {
"msg": "Un piccolo inconveniente.",
@@ -394,11 +360,9 @@
"toggleScreensharing": "Cambia modalità tra videocamera e condivisione schermo",
"toggleShortcuts": "Mostra o nascondi le scorciatoie",
"videoMute": "Accendo o spegni la videocamera",
"videoQuality": "Imposta qualità della telefonata"
"videoQuality": ""
},
"liveStreaming": {
"limitNotificationDescriptionWeb": "Data l'alta domanda la tua diretta sarà limitata a {{limit}} minuti. Per dirette illimitate, prova <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "La tua diretta sarà limitata a {{limit}} minuti. Per dirette illimitate, prova {{app}}.",
"busy": "Stiamo cercando di liberare risorse per la diretta. Riprova tra qualche minuto.",
"busyTitle": "Tutti gli streamer sono impegnati al momento",
"changeSignIn": "Cambia account",
@@ -415,9 +379,7 @@
"getStreamKeyManually": "Non siamo stati in grado di trovare nessuna trasmissione dal vivo. Prova ad ottenere una chiave stream da Youtube",
"invalidStreamKey": "La chiave stream potrebbe non essere corretta.",
"off": "La diretta si è interrotta",
"offBy": "{{name}} ha fermato la diretta",
"on": "Trasmissione in diretta",
"onBy": "{{name}} ha iniziato la diretta",
"pending": "Avvio diretta...",
"serviceName": "Servizio live streaming",
"signedInAs": "Sei attualmente collegato come:",
@@ -427,8 +389,10 @@
"start": "Inizia una diretta",
"streamIdHelp": "Cos'è questo?",
"unavailableTitle": "La diretta non è disponibile",
"youtubeTerms": "YouTube terms of services",
"googlePrivacyPolicy": "Google Privacy Policy"
"onBy": "",
"offBy": "",
"googlePrivacyPolicy": "Google Privacy Policy",
"youtubeTerms": "YouTube terms of services"
},
"localRecording": {
"clientState": {
@@ -479,84 +443,24 @@
"muted": "Hai iniziato la conversazione con l'audio disattivato.",
"mutedTitle": "Hai l'audio disattivato!",
"mutedRemotelyTitle": "Ti è stato disattivato l'audio da {{participantDisplayName}}!",
"mutedRemotelyDescription": "Puoi sempre attivare il microfono, quando vuoi parlare. Spegni il microfono quando hai finito, per non introdurre rumori di fondo nella riunione.",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) è stata tolta da un altro partecipante",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) è stata messa da un altro partecipante",
"mutedRemotelyDescription": "",
"passwordRemovedRemotely": "",
"passwordSetRemotely": "",
"raisedHand": "{{name}} vorrebbe intervenire.",
"somebody": "Qualcuno",
"startSilentTitle": "Sei entrato in riunione senza aver scelto un dispositivo audio per sentire!",
"startSilentDescription": "Entra di nuovo in riunione, per attivare l'audio",
"startSilentTitle": "",
"startSilentDescription": "",
"suboptimalExperienceDescription": "Ehm... temiamo che la tua esperienza con {{appName}} non sarà granché su questo browser. Stiamo cercando di migliorare la situazione ma, per il momento, prova ad utilizzare uno di questi <a href='{{recommendedBrowserPageLink}}' target='_blank'>browser supportati</a>.",
"suboptimalExperienceTitle": "Problemi con il browser",
"unmute": "Accendi microfono",
"unmute": "",
"newDeviceCameraTitle": "Trovata nuova videocamera",
"newDeviceAudioTitle": "Trovata nuova origine audio",
"newDeviceAction": "OK, usala",
"OldElectronAPPTitle": "Falla di sicurezza!",
"oldElectronClientDescription1": "Sembri stare usando una versione obsoleta di Jitsi Meet che ha delle falle di sicurezza note. Assicurati di aggiornarla presso il nostro ",
"oldElectronClientDescription2": "ultima build",
"oldElectronClientDescription3": " ora!"
"newDeviceAction": "Usala",
"suboptimalBrowserWarning": "Ci spiace che la tua videoconferenza non sarà ottimale, qui. Stiamo cercando modi per migliorare, ma fino ad allora per favore prova ad usare <a href='{{recommendedBrowserPageLink}}' target='_blank'>browser supportati completamente/a>."
},
"passwordSetRemotely": "definita da altro utente",
"passwordDigitsOnly": "Fino a {{number}} cifre",
"poweredby": "offerto da",
"prejoin": {
"audioAndVideoError": "Errore audio e video:",
"audioDeviceProblem": "C'è un problema con il tuo microfono",
"audioOnlyError": "Errore audio:",
"audioTrackError": "Impossibile creare traccia audio.",
"calling": "Chiamando",
"callMe": "Chiamami",
"callMeAtNumber": "Chiamami a questo numero:",
"configuringDevices": "Configurazione dispositivi...",
"connectedWithAudioQ": "Sei connesso con l'audio?",
"connection": {
"good": "La tua connessione Internet sembra buona!",
"nonOptimal": "La tua connessione Internet non è ottimale",
"poor": "La tua connessione Internet è scarsa"
},
"connectionDetails": {
"audioClipping": "Ci aspettiamo che il tuo audio sarà a sighiozzo.",
"audioHighQuality": "Ci aspettiamo che il tuo audio sarà di eccellente qualità.",
"audioLowNoVideo": "Ci aspettiamo una bassa qualità audio e che il video sia assente.",
"goodQuality": "Ottimo! La tue funzioni multimediali andranno alla grande.",
"noMediaConnectivity": "Non siamo riusciti a stabilire una connessione multimediale per fare questo test. Questo è tipicamente causato da un firewall o dal NAT.",
"noVideo": "Ci aspettiamo una pessima qualità video.",
"undetectable": "Se non riesci ancora a fare chiamate nel browser, ti consigliamo di verificare che il microfono e la tua videocamera siano configurate correttamente, che tu abbia dato al browser i permessi di usare microfono e videocamera, e che il tuo browser sia aggiornato all'ultima versione. Se hai ancora problemi, dovresti contattare lo sviluppatore dell'applicazione web.",
"veryPoorConnection": "Ci aspettiamo una qualità della chiamata davvero terribile.",
"videoFreezing": "Ci aspettiamo che il video si blocchi, sparisca, o sia molto pixelato.",
"videoHighQuality": "Ci aspettiamo che il video sia di buona qualità.",
"videoLowQuality": "Ci aspettiamo che il video abbia pochi fotogrammi al secondo e sia a bassa risoluzione.",
"videoTearing": "Ci aspettiamo che il video sia pixelato e abbia deformazioni visive."
},
"copyAndShare": "Copia e condividi il collegamento della riunione",
"dialInMeeting": "Chiama e collegati alla riunione",
"dialInPin": "Chiama e inserisci il PIN per entrare nella riunione:",
"dialing": "Chiamata",
"doNotShow": "Non mostrare più questa finestra",
"errorDialOut": "Impossibile fare la chiamata",
"errorDialOutDisconnected": "Impossibile fare la chiamata. Occupato",
"errorDialOutFailed": "Impossibile fare la chiamata. Chiamata fallita",
"errorDialOutStatus": "Errore nel ricevere lo stato della rete",
"errorMissingName": "Inserire il proprio nome, per accedere alla riunione",
"errorStatusCode": "Errore nella chiamata, codice: {{status}}",
"errorValidation": "Numero inesistente",
"iWantToDialIn": "Voglio chiamare il numero",
"joinAudioByPhone": "Collegati usando un telefono, per parlare",
"joinMeeting": "Collegati alla riunione",
"joinWithoutAudio": "Collegati senza poter parlare",
"initiated": "Chiamata avviata",
"linkCopied": "Collegamento copiato negli appunti",
"lookGood": "Sembra che il tuo microfono funzioni correttamente",
"or": "o",
"premeeting": "Attesa riunione",
"showScreen": "Avvia la schermata d'attesa della riunione",
"startWithPhone": "Avvia usando il telefono, per parlare",
"screenSharingError": "Errore di condivisione dello schermo:",
"videoOnlyError": "Errore video:",
"videoTrackError": "Impossibile creare la traccia video.",
"viewAllNumbers": "vedi tutti i numeri"
},
"presenceStatus": {
"busy": "Occupato",
"calling": "Chiamata…",
@@ -577,10 +481,7 @@
"setEmailLabel": "Imposta la mail gravatar",
"title": "Profilo"
},
"raisedHand": "Vorrebbe parlare",
"recording": {
"limitNotificationDescriptionWeb": "Data l'alta domanda la tua registrazione sarà limitata a {{limit}} minuti. Per registrazioni illimitate, prova <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "La tua registrazione sarà limitata a {{limit}} minuti. Per registrazioni illimitate, prova <3>{{app}}</3>.",
"authDropboxText": "Carica su Dropbox",
"availableSpace": "Spazio disponibile: {{spaceLeft}} MB (rimangono approssimativamente {{duration}} minuti di registrazione)",
"beta": "BETA",
@@ -591,31 +492,25 @@
"expandedOn": "La registrazione della conferenza è attiva.",
"expandedPending": "La registrazione è in fase di avvio…",
"failedToStart": "Non è stato possibile avviare la registrazione",
"fileSharingdescription": "Condividi la registrazione con i partecipanti alla riunione",
"fileSharingdescription": "",
"live": "DIRETTA",
"loggedIn": "Accesso effettuato come {{userName}}",
"off": "Registrazione interrotta",
"offBy": "{{name}} registrazione fermata",
"on": "Registrazione",
"onBy": "{{name}} registrazione iniziata",
"pending": "In preparazione alla registrazione della conferenza…",
"rec": "REC",
"serviceDescription": "La tua registrazione verrà salvata dal servizio di registrazione che hai scelto",
"serviceDescription": "",
"serviceName": "Servizio di registrazione",
"signIn": "Entra",
"signOut": "Esci",
"unavailable": "Ops! Il {{serviceName}} non è al momento disponibile. Stiamo lavorando per risolvere il problema. Riprova più tardi.",
"unavailableTitle": "Registrazione non disponibile"
"unavailableTitle": "Registrazione non disponibile",
"onBy": "{{name}} registrazione iniziata",
"offBy": "{{name}} registrazione fermata"
},
"sectionList": {
"pullToRefresh": "Trascina per aggiornare"
},
"security": {
"about": "Puoi aggiungere alla riunione una $t(lockRoomPassword). I partecipanti dovranno fornire la $t(lockRoomPassword) per essere autorizzati a partecipare alla riunione.",
"aboutReadOnly": "I moderatori della riunione possono aggiungere $t(lockRoomPassword). I partecipanti dovranno fornire la $t(lockRoomPassword) per essere autorizzati a partecipare alla riunione.",
"insecureRoomNameWarning": "La riunione non è protetta. Dei partecipanti indesiderati potrebbero unirsi alla riunione. Puoi proteggere l'accesso alla riunione col bottone sicurezza.",
"securityOptions": "Impostazioni sicurezza"
},
"settings": {
"calendar": {
"about": "Lintegrazione del calendario con {{appName}} e consigliata per accedere in sicurezza al proprio calendario per poter leggere i prossimi appuntamenti ",
@@ -642,26 +537,23 @@
"microphones": "Microfoni"
},
"settingsView": {
"advanced": "Avanzate",
"alertOk": "OK",
"alertCancel": "Annulla",
"alertTitle": "Attenzione",
"alertURLText": "L'URL del server inserito non è valido",
"buildInfoSection": "Versione",
"conferenceSection": "Conferenza",
"disableCallIntegration": "Disattiva l'integrazione delle chiamate native",
"disableP2P": "Disattiva la modalità punto-punto",
"disableCrashReporting": "Disattiva la diagnostica dei crash",
"disableCrashReportingWarning": "Sei sicuro di voler disattivare la diagnostica dei crash? Quest'impostazione verrà eseguita al prossimo avvio dell'app.",
"displayName": "Nome visualizzato",
"email": "Email",
"header": "Impostazioni",
"profileSection": "Profilo",
"serverURL": "URL del server",
"showAdvanced": "Impostazioni avanzate",
"startWithAudioMuted": "Inizia con l'audio disattivato",
"startWithVideoMuted": "Avvia con il video disattivato",
"version": "Versione"
"version": "Versione",
"showAdvanced": "Mostra impostazioni avanzate",
"disableP2P": "Disabilita modalità uno-a-uno",
"disableCallIntegration": "Disabilita integrazione nativa delle chiamate",
"advanced": "Avanzate"
},
"share": {
"dialInfoText": "\n\n=====\n\nVuoi solo ascoltare la conferenza da un telefono?\n\n{{defaultDialInNumber}}Clicca questo link per vedere i numeri telefonici di questo meeting\n{{dialInfoPageUrl}}",
@@ -673,113 +565,90 @@
"minutes": "{{count}}m",
"name": "Nome",
"seconds": "{{count}}s",
"speakerStats": "Statistiche",
"speakerTime": "Tempo"
"speakerStats": "Statistiche del relatore",
"speakerTime": "Tempo del relatore"
},
"startupoverlay": {
"policyText": " ",
"genericTitle": "Per la riunione devono essere usati il tuo microfono e la tua videocamera.",
"title": "{{app}} ha bisogno di usare il tuo microfono e la tua videocamera."
"title": "{{app}} chiede di usare il tuo microfono e la tua videocamera."
},
"suspendedoverlay": {
"rejoinKeyTitle": "Ricollegati",
"text": "Premi il pulsante <i>Ricollegati</i> per ricollegarti.",
"title": "La video chiamata si è interrotta perché il computer è stato sospeso."
"title": "La video chiamata si è interrotta perchè il computer è stato sospeso."
},
"toolbar": {
"accessibilityLabel": {
"audioOnly": "Attiva/disattiva solo audio",
"audioRoute": "Scegli l'uscita audio",
"callQuality": "Imposta qualità della chiamata",
"callQuality": "Gestisci qualità della chiamata",
"cc": "Attiva/disattiva sottotitoli",
"chat": "Attiva/disattiva la chat",
"document": "Attiva/disattiva documento condiviso",
"download": "Scarica le nostre app",
"embedMeeting": "Incorpora riunione altrove",
"feedback": "Lascia un feedback",
"fullScreen": "Attiva/disattiva schermo intero",
"grantModerator": "Autorizza Moderator",
"hangup": "Lascia la conferenza",
"help": "Aiuto",
"invite": "Invita persone",
"kick": "Espelli partecipante",
"lobbyButton": "Attiva/disattiva sala d'attesa",
"localRecording": "Abilita controlli di registrazione locale",
"lockRoom": "Attiva o disattiva password",
"moreActions": "Attiva o disattiva menu avanzato",
"moreActionsMenu": "Menu avanzato",
"moreOptions": "Più opzioni",
"mute": "Attiva/disattiva audio",
"muteEveryone": "Zittisci tutti",
"pip": "Attiva/disattiva immagine nellimmagine",
"privateMessage": "Invia messaggio privato",
"profile": "Modifica profilo",
"raiseHand": "Attiva/disattiva alzata di mano",
"recording": "Attiva/disattiva registrazione",
"remoteMute": "Zittisci partecipante",
"security": "Impostazioni sicurezza",
"remoteMute": "Disattiva audio partecipante",
"Settings": "Attiva/disattiva impostazioni",
"sharedvideo": "Attiva/disattiva condivisione YouTube",
"shareRoom": "Invita qualcuno",
"shareYourScreen": "Attiva/disattiva condivisione schermo",
"shortcuts": "Attiva/disattiva scorciatoie",
"show": "Mostra in primo piano",
"show": "",
"speakerStats": "Attiva/disattiva statistiche relatore",
"tileView": "Vedi tutti i partecipanti insieme, o uno solo",
"toggleCamera": "Cambia videocamera",
"toggleFilmstrip": "Attiva/disattiva pellicola",
"videomute": "Attiva/disattiva videocamera",
"videoblur": "Attiva/disattiva offuscamento video"
"videoblur": "Attiva/disattiva offuscamento video",
"privateMessage": "Invia messaggio privato",
"muteEveryone": "Zittisci tutti",
"moreOptions": "Mostra più opzioni",
"help": "Aiuto",
"download": "Scarica altre app"
},
"addPeople": "Aggiungi persone alla chiamata",
"audioOnlyOff": "Anche video",
"audioOnlyOn": "Solo audio",
"audioRoute": "Scegli l'uscita audio",
"authenticate": "Autenticazione",
"callQuality": "Imposta qualità della chiamata",
"callQuality": "Gestisci qualità della chiamata",
"chat": "Apri / Chiudi chat",
"closeChat": "Chiudi chat",
"documentClose": "Chiudi documento condiviso",
"documentOpen": "Apri documento condiviso",
"download": "Scarica le nostre app",
"e2ee": "Crittografia punto-punto",
"embedMeeting": "Incorpora riunione altrove",
"enterFullScreen": "Visualizza a schermo intero",
"enterTileView": "Vedi tutti i partecipanti",
"exitFullScreen": "Esci da schermo intero",
"exitTileView": "Vedi una persona sola",
"feedback": "Lascia un feedback",
"hangup": "Butta giù",
"help": "Aiuto",
"hangup": "Esci",
"invite": "Invita persone",
"lobbyButtonDisable": "Disabilita sala d'attesa",
"lobbyButtonEnable": "Abilita sala d'attesa",
"login": "Login",
"logout": "Logout",
"lowerYourHand": "Abbassa la mano",
"moreActions": "Più azioni",
"moreOptions": "Più opzioni",
"mute": "Attiva / Disattiva microfono",
"muteEveryone": "Zittisci tutti",
"noAudioSignalTitle": "Non arrivano suoni dal tuo microfono!",
"noAudioSignalDesc": "Se non l'hai disabilitato intenzionalmente nelle impostazioni, prova a cambiare dispositivo di input.",
"noAudioSignalDescSuggestion": "Se non l'hai disabilitato intenzionalmente nelle impostazioni, prova a scegliere il dispositivo consigliato.",
"noAudioSignalDialInDesc": "Puoi anche chiamare usando:",
"noAudioSignalDialInLinkDesc": "Numberi di telefono",
"noisyAudioInputTitle": "Il tuo microfono sembra rumoroso!",
"noisyAudioInputDesc": "Sembra che il tuo microfono faccia dei rumori, prova a spegnerlo o cambiarlo per favore.",
"mute": "Microfono Attiva / Disattiva",
"openChat": "Apri una chat",
"pip": "Abilita visualizzazione immagine nellimmagine",
"privateMessage": "invia un messaggio privato",
"profile": "Modifica profilo",
"raiseHand": "Alza / Abbassa la mano",
"raiseYourHand": "Alza la mano",
"security": "Impostazioni sicurezza",
"Settings": "Impostazioni",
"sharedvideo": "Condividi un video Youtube",
"shareRoom": "Invita partecipante",
"shortcuts": "Visualizza scorciatoie",
"speakerStats": "Statistiche",
"speakerStats": "Statistiche dell'interlocutore",
"startScreenSharing": "Inizia la condivisione dello schermo",
"startSubtitles": "Avvia sottotitoli",
"stopScreenSharing": "Ferma la condivisione dello schermo",
@@ -828,37 +697,34 @@
},
"videoStatus": {
"audioOnly": "AUD",
"audioOnlyExpanded": "Hai attivato la modalità solo audio. Questa modalità permette di risparmiare banda, ma non vedrai gli altri partecipanti.",
"audioOnlyExpanded": "Hai attivato la modalità solo audio. Questa modalità permette di rispamiare banda, ma non vedrai gli altri partecipanti.",
"callQuality": "Qualità video",
"hd": "HD",
"hdTooltip": "Stai vedendo in alta definizione",
"highDefinition": "Alta definizione",
"labelTooiltipNoVideo": "Nessun video",
"labelTooltipAudioOnly": "Hai attivato la modalità solo audio",
"ld": "LD",
"ldTooltip": "Stai vedendo a bassa definizione",
"lowDefinition": "Bassa definizione",
"onlyAudioAvailable": "È disponibile solo l'audio",
"onlyAudioSupported": "Per questo browser è supportato solo l'audio.",
"sd": "SD",
"sdTooltip": "Stai vedendo a definizione standard",
"standardDefinition": "Definizione standard"
},
"videothumbnail": {
"domute": "Disattiva audio",
"domuteOthers": "Zittisci tutti gli altri",
"flip": "Rifletti",
"grantModerator": "Autorizza moderatore",
"kick": "Butta fuori",
"kick": "Espelli",
"moderator": "Moderatore",
"mute": "Il partecipante ha il microfono spento",
"mute": "Il partecipante è in muto",
"muted": "Audio disattivato",
"remoteControl": "Controllo remoto",
"show": "Mostra in primo piano",
"videomute": "Il partecipante ha la videocamera spenta"
"show": "",
"videomute": "Silenzia il video"
},
"welcomepage": {
"accessibilityLabel": {
"join": "Tap per accedere",
"roomname": "Inserisci nome stanza"
"roomname": "Inserisci Nome Stanza"
},
"appDescription": "Avvia una videochiamata con tutto il team. Invita tutti quelli che conosci. {{app}} è una soluzione per effettuare videoconferenze totalmente crittografata, 100% open source, che puoi usare sempre, ogni giorno, gratuitamente senza bisogno di un account.",
"audioVideoSwitch": {
@@ -867,68 +733,34 @@
},
"calendar": "Calendario",
"connectCalendarButton": "Collega calendario",
"connectCalendarText": "Connetti il tuo calendario per vedere tutte le riunione dentro {{app}}. Poi, aggiungi {{provider}} di riunioni al tuo calendario, per avviarle con un clic.",
"connectCalendarText": "",
"enterRoomTitle": "Avvia una nuova conferenza",
"getHelp": "Trova aiuto",
"go": "VAI",
"goSmall": "VAI",
"headerTitle": "Jitsi Meet",
"headerSubtitle": "Secure and high quality meetings",
"info": "Informazioni chiamata",
"join": "UNISCITI",
"jitsiOnMobile": "Jitsi su mobile scarica le nostre app e dai inizio ad una riunione dovunque tu sia",
"moderatedMessage": "O <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">prepara una URL</a> in anticipo, per le riunioni di cui sei il moderatore.",
"info": "Informazioni",
"privacy": "Privacy",
"recentList": "Recente",
"recentListDelete": "Cancella",
"recentListEmpty": "La tua lista è vuota. Chatta con qualcuno del tuo team e lo vedrai apparire nella lista di meeting recenti.",
"reducedUIText": "Benvenuto in {{app}}!",
"roomNameAllowedChars": "Il nome della riunione non deve contenere questi caratteri: ?, &, :, ', \", %, #.",
"roomname": "Inserisci nome stanza",
"reducedUIText": "",
"roomname": "Inserisci Nome Stanza",
"roomnameHint": "Inserisci il nome o l'URL della stanza alla quale vuoi accedere. Puoi anche inventarti un nome, assicurati solo che le persone che vuoi contattare lo sappiano, così che possano inserire lo stesso nome.",
"sendFeedback": "Invia feedback",
"startMeeting": "Inizia riunione",
"terms": "Termini di utilizzo",
"title": "Il sistema di videoconferenza sicuro, funzionale e completamente gratuito."
"title": "Il sistema di conferenza sicuro, funzionale e completamente gratuito."
},
"documentSharing": {
"title": ""
},
"defaultNickname": "",
"chromeExtensionBanner": {
"dontShowAgain": "",
"buttonText": "",
"installExtensionText": ""
},
"raisedHand": "Vorrebbe parlare",
"lonelyMeetingExperience": {
"button": "invita altri",
"button": "Invita altri",
"youAreAlone": "Sei l'unico in riunione"
},
"helpView": {
"header": "Aiuto"
},
"lobby": {
"knockingParticipantList": "Lista dei partecipanti in attesa",
"allow": "Autorizza",
"backToKnockModeButton": "No password, ask to join instead",
"dialogTitle": "Sala d'attesa",
"disableDialogContent": "Sala d'attesa attiva. Questa funzione ti permette di non dare accesso alla riunione a partecipanti indesiderati. Vuoi disattivarla?",
"disableDialogSubmit": "Disattiva",
"emailField": "Inserisci il tuo indirizzo Email",
"enableDialogPasswordField": "Imposta password (opzionale)",
"enableDialogSubmit": "Attiva",
"enableDialogText": "La sala d'attesa ti permette di proteggere la tua riunione concedendo l'ingresso solo alle persone autorizzate da un moderatore.",
"enterPasswordButton": "Inserisci password riunione",
"enterPasswordTitle": "Inserisci la password per entrare nella riunione",
"invalidPassword": "Password errata",
"joiningMessage": "Entrerai nella riunione, non appena qualcuno approva la tua richiesta",
"joinWithPasswordMessage": "Ho inviato la password per entrare, attendi...",
"joinRejectedMessage": "La tua richiesta d'accesso è stata respinta da un moderatore.",
"joinTitle": "Entra in riunione",
"joiningTitle": "Richiesta inviata...",
"joiningWithPasswordTitle": "Entrando con la password...",
"knockButton": "Chiedi d'entrare",
"knockTitle": "Qualcuno vuole entrare in riunione",
"nameField": "Scrivi il tuo nome",
"notificationLobbyAccessDenied": "{{targetParticipantName}} è stato respinto da {{originParticipantName}}",
"notificationLobbyAccessGranted": "{{targetParticipantName}} è stato autorizzato ad entrare da {{originParticipantName}}",
"notificationLobbyDisabled": "La sala d'attesa è stata disattivata da {{originParticipantName}}",
"notificationLobbyEnabled": "La sala d'attesa è stata attivata da {{originParticipantName}}",
"notificationTitle": "Sala d'attesa",
"passwordField": "Inserisci la password della riunione",
"passwordJoinButton": "Entra",
"reject": "Respingi",
"toggleLabel": "Attiva sala d'attesa"
}
}

View File

@@ -2,7 +2,7 @@
"addPeople": {
"add": "초대",
"addContacts": "연락처로 초대하세요",
"copyInvite": "의 초대 복사",
"copyInvite": "의 초대 복사",
"copyLink": "회의 링크 복사",
"copyStream": "라이브 스트리밍 링크 복사",
"countryNotSupported": "아직 해당 지역을 지원하지 않습니다.",
@@ -17,7 +17,7 @@
"inviteMorePrompt": "더 많은 사람을 초대하세요",
"linkCopied": "링크가 클립보드에 복사되었습니다.",
"loading": "사람 및 전화번호 검색",
"loadingNumber": "전화번호 확인중",
"loadingNumber": "전화번호 확인 중",
"loadingPeople": "초대할 사람 찾기",
"noResults": "일치하는 검색 결과 없음",
"noValidNumbers": "전화 번호를 입력하십시오.",
@@ -80,21 +80,21 @@
"dontShowAgain": "다시 보지 않기"
},
"connectingOverlay": {
"joiningRoom": "회의에 연결중 ..."
"joiningRoom": "회의에 연결 중 ..."
},
"connection": {
"ATTACHED": "첨부",
"AUTHENTICATING": "인증중",
"AUTHENTICATING": "인증 중",
"AUTHFAIL": "인증 실패",
"CONNECTED": "연결됨",
"CONNECTING": "연결중",
"CONNECTED": "연결 됨",
"CONNECTING": "연결 중",
"CONNFAIL": "연결 실패",
"DISCONNECTED": "연결 끊김",
"DISCONNECTING": "연결 종료중",
"DISCONNECTING": "연결 종료 중",
"ERROR": "에러",
"RECONNECTING": "네트워크 문제가 발생했습니다. 다시 연결중...",
"GET_SESSION_ID_ERROR": "세션 ID 가져오기 오류 : {{code}}",
"GOT_SESSION_ID": "세션 ID를 가져오는중 ... 완료",
"RECONNECTING": "네트워크 문제가 발생했습니다. 다시 연결 중...",
"GET_SESSION_ID_ERROR": "세션 ID 가져 오기 오류 : {{code}}",
"GOT_SESSION_ID": "세션 ID를 가져 오는 중 ... 완료",
"LOW_BANDWIDTH": "대역폭을 절약하기 위해 {{displayName}}의 동영상이 중지되었습니다."
},
"connectionindicator": {
@@ -160,16 +160,16 @@
},
"add": "추가",
"allow": "허락",
"alreadySharedVideoMsg": "다른 참가자가 이미 비디오를 공유하고 있습니다. 이 회의는 한 번에 하나의 공유 비디오만 허용합니다.",
"alreadySharedVideoTitle": "한 번에 하나의 공유 비디오만 허용됩니다",
"alreadySharedVideoMsg": "다른 참가자가 이미 비디오를 공유하고 있습니다. 이 회의는 한 번에 하나의 공유 비디오 만 허용합니다.",
"alreadySharedVideoTitle": "한 번에 하나의 공유 비디오 만 허용됩니다",
"applicationWindow": "응용 프로그램 창",
"Back": "뒤로가기",
"cameraConstraintFailedError": "카메라가 필요한 제약 조건 중 일부를 만족하지 못합니다",
"cameraNotFoundError": "카메라를 찾을 수 없습니다",
"cameraNotSendingData": "카메라에 액세스 할 수 없습니다. 다른 응용 프로그램이 장치를 사용하고 있는지 확인한 후 설정 메뉴에서 다른 장치를 선택하거나 응용 프로그램을 다시 로드하십시오.",
"cameraNotSendingData": "카메라에 액세스 할 수 없습니다. 다른 응용 프로그램이 장치를 사용하고 있는지 확인한 후 설정 메뉴에서 다른 장치를 선택하거나 응용 프로그램을 다시로드하십시오.",
"cameraNotSendingDataTitle": "카메라에 액세스 할 수 없습니다",
"cameraPermissionDeniedError": "카메라 사용 권한을 부여하지 않았습니다. 회의에 계속 참여할 수 있지만 다른 참석자는 귀하를 볼 수 없습니다. 검색 주소창의 카메라 버튼을 사용하여 문제를 해결하십시오.",
"cameraUnknownError": "알 수 없는 이유로 카메라를 사용할 수 없습니다",
"cameraUnknownError": "알 수없는 이유로 카메라를 사용할 수 없습니다",
"cameraUnsupportedResolutionError": "카메라가 필요한 비디오 해상도를 지원하지 않습니다",
"Cancel": "취소",
"close": "닫기",
@@ -182,7 +182,7 @@
"confirmYes": "예",
"connectError": "죄송합니다. 문제가 발생하여 회의에 연결할 수 없습니다",
"connectErrorWithMsg": "죄송합니다. 뭔가 잘못되어 회의에 연결할 수 없습니다: {{msg}}",
"connecting": "연결중",
"connecting": "연결 중",
"contactSupport": "지원 연락처",
"copy": "복사",
"dismiss": "",
@@ -190,7 +190,7 @@
"done": "완료",
"enterDisplayName": "당신의 이름을 입력해주세요.",
"error": "에러",
"externalInstallationMsg": "데스크톱 공유 확장 프로그램을 설치해야 합니다",
"externalInstallationMsg": "데스크톱 공유 확장 프로그램을 설치해야합니다",
"externalInstallationTitle": "확장 프로그램이 필요합니다",
"goToStore": "웹 스토어로 이동",
"gracefulShutdown": "서비스는 현재 유지 관리를 위해 중단되었습니다. 나중에 다시 시도 해주십시오.",
@@ -227,7 +227,7 @@
"muteParticipantDialog": "",
"muteParticipantTitle": "이 참가자를 음소거 하시겠습니까?",
"Ok": "확인",
"passwordLabel": "잠긴 회의입니다. 회의에 참여하려면 비밀번호를 입력하세요.",
"passwordLabel": "잠긴 회의 입니다. 회의에 참여하려면 비밀번호를 입력하세요.",
"passwordNotSupported": "회의 비밀번호 설정은 지원되지 않습니다",
"passwordNotSupportedTitle": "비밀번호 미지원",
"passwordRequired": "비밀번호 필수",
@@ -285,8 +285,8 @@
"transcribing": "",
"unlockRoom": "회의 비밀번호 제거",
"userPassword": "사용자 비밀번호",
"WaitForHostMsg": "<b>{{room}}</b> 회의가 시작되지 않았습니다. 호스트인 경우 인증하십시오. 그렇지 않으면 호스트가 도착할 때까지 기다리십시오.",
"WaitForHostMsgWOk": "<b>{{room}}</b> 회의가 아직 시작되지 않았습니다. 호스트인 경우 확인을 눌러 인증하십시오. 그렇지 않으면 호스트가 도착할 때까지 기다리십시오.",
"WaitForHostMsg": "<b>{{room}}</b> 회의가 시작되지 않았습니다. 호스트 인 경우 인증하십시오. 그렇지 않으면 호스트가 도착할 때까지 기다리십시오.",
"WaitForHostMsgWOk": "<b>{{room}}</b> 회의가 아직 시작되지 않았습니다. 호스트 인 경우 확인을 눌러 인증하십시오. 그렇지 않으면 호스트가 도착할 때까지 기다리십시오.",
"WaitingForHost": "호스트를 기다리는 중입니다…",
"Yes": "예",
"yourEntireScreen": "전체 화면"
@@ -382,7 +382,7 @@
"enterStreamKey": "YouTube 실시간 스트리밍 키를 입력하십시오",
"error": "실시간 스트리밍에 실패했습니다. 다시 시도하십시오.",
"errorAPI": "YouTube 방송에 액세스하는 중에 오류가 발생했습니다. 다시 로그인하십시오.",
"errorLiveStreamNotEnabled": "{{email}}에 의해 라이브 스트리밍이 활성화되지 않았습니다. 라이브 스트리밍을 활성화하거나 라이브 스트리밍이 활성화된 계정으로 로그인하십시오.",
"errorLiveStreamNotEnabled": "{{email}}에 의해 라이브 스트리밍이 활성화되지 않았습니다. 라이브 스트리밍을 활성화하거나 라이브 스트리밍이 활성화 된 계정으로 로그인하십시오.",
"expandedOff": "라이브 스트리밍이 중지되었습니다",
"expandedOn": "현재 회의가 YouTube로 스트리밍되고 있습니다.",
"expandedPending": "라이브 스트리밍이 시작됩니다 ...",
@@ -471,17 +471,17 @@
"poweredby": "powered by",
"presenceStatus": {
"busy": "바쁨",
"calling": "전화 거는중",
"connected": "연결됨",
"connecting": "연결중",
"connecting2": "연결중*",
"calling": "전화 거는 중",
"connected": "연결 됨",
"connecting": "연결 중",
"connecting2": "연결 중*",
"disconnected": "연결 끊김",
"expired": "만료됨",
"ignored": "무시됨",
"initializingCall": "통화 초기화중",
"invited": "초대됨",
"rejected": "거부됨",
"ringing": "전화중"
"expired": "만료 됨",
"ignored": "무시 됨",
"initializingCall": "통화 초기화 중",
"invited": "초대 됨",
"rejected": "거부 됨",
"ringing": "전화 중"
},
"profile": {
"setDisplayNameLabel": "표시 이름 설정",
@@ -494,10 +494,10 @@
"availableSpace": "사용 가능한 공간 : {{spaceLeft}}MB (약 {{duration}}분 녹화)",
"beta": "베타",
"busy": "레코딩 자원을 확보하고 있습니다. 몇 분 후에 다시 시도하십시오.",
"busyTitle": "모든 레코더가 현재 사용중입니다",
"busyTitle": "모든 레코더가 현재 사용 중입니다",
"error": "레코딩이 실패했습니다. 다시 시도하십시오.",
"expandedOff": "레코딩이 중지됨",
"expandedOn": "회의가 현재 녹화중입니다.",
"expandedOn": "회의가 현재 녹화 중입니다.",
"expandedPending": "녹화가 시작됩니다 ...",
"failedToStart": "레코딩을 시작하지 못했습니다",
"fileSharingdescription": "회의 참가자와 녹음 공유",
@@ -618,7 +618,7 @@
"audioOnlyOff": "음성전용 모드 끄기",
"audioOnlyOn": "음성전용 모드 끄기",
"audioRoute": "음성 장비 선택하기",
"authenticate": "인증중",
"authenticate": "인증 중",
"callQuality": "품질 설정하기",
"chat": "대화 열기/닫기",
"closeChat": "대화 닫기",
@@ -665,7 +665,7 @@
"transcribing": {
"ccButtonTooltip": "자막 시작/종료",
"error": "레코딩이 실패했습니다. 다시 시도하십시오.",
"expandedLabel": "현재 스크립트 작성중",
"expandedLabel": "현재 스크립트 작성 중",
"failedToStart": "스크립트 작성을 시작하지 못했습니다.",
"labelToolTip": "회의가 기록되고 있습니다.",
"off": "스크립트 작성이 중지되었습니다.",
@@ -698,7 +698,7 @@
},
"videoStatus": {
"audioOnly": "오디오 전용",
"audioOnlyExpanded": "낮은 대역폭 모드에 있습니다. 이 모드에서는 오디오 및 화면 공유만 수신합니다.",
"audioOnlyExpanded": "낮은 대역폭 모드에 있습니다. 이 모드에서는 오디오 및 화면 공유 만 수신합니다.",
"callQuality": "비디오 품질",
"hd": "HD",
"highDefinition": "고해상도",

View File

@@ -1,930 +0,0 @@
{
"addPeople": {
"add": "ക്ഷണിക്കുക ",
"addContacts": "നിങ്ങളുടെ കോണ്ടാക്ടുകളെ ക്ഷണിക്കുക ",
"copyInvite": "മീറ്റിംഗ് ക്ഷണം പകർത്തുക",
"copyLink": "മീറ്റിംഗ് ലിങ്ക് പകർത്തുക",
"copyStream": "തത്സമയ സ്ട്രീമിംഗ് ലിങ്ക് പകർത്തുക",
"countryNotSupported": "ഞങ്ങൾ ഇതുവരെ ഈ ലക്ഷ്യസ്ഥാനത്തെ പിന്തുണയ്ക്കുന്നില്ല.",
"countryReminder": "യുഎസിന് പുറത്ത് വിളിക്കുന്നുണ്ടോ? നിങ്ങൾ രാജ്യ കോഡിലാണ് ആരംഭിക്കുന്നതെന്ന് ഉറപ്പാക്കുക!",
"defaultEmail": "നിങ്ങളുടെ സ്ഥിരസ്ഥിതി ഇമെയിൽ",
"disabled": "നിങ്ങൾക്ക് ആളുകളെ ക്ഷണിക്കാൻ കഴിയില്ല.",
"failedToAdd": "പങ്കെടുക്കുന്നവരെ ചേർക്കുന്നതിൽ പരാജയപ്പെട്ടു",
"footerText": "ഡയൽ ചെയ്യുന്നത് പ്രവർത്തനരഹിതമാക്കി.",
"googleEmail": "Google Email",
"inviteMoreHeader": "മീറ്റിംഗിൽ നിങ്ങൾ മാത്രമേയുള്ളൂ ",
"inviteMoreMailSubject": "Join {{appName}} meeting",
"inviteMorePrompt": "കൂടുതൽ ആളുകളെ ക്ഷണിക്കുക",
"linkCopied": "ലിങ്ക് ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി",
"loading": "ആളുകൾക്കും ഫോൺ നമ്പറുകൾക്കുമായി തിരയുന്നു",
"loadingNumber": "ഫോൺ നമ്പർ സാധൂകരിക്കുന്നു",
"loadingPeople": "ആളുകളെ ക്ഷണിക്കാൻ തിരയുന്നു ",
"noResults": "പൊരുത്തപ്പെടുന്ന തിരയൽ ഫലങ്ങളൊന്നുമില്ല",
"noValidNumbers": "ഒരു ഫോൺ നമ്പർ നൽകുക",
"outlookEmail": "Outlook Email",
"searchNumbers": "ഫോൺ നമ്പറുകൾ ചേർക്കുക",
"searchPeople": "ആളുകൾക്കായി തിരയുക",
"searchPeopleAndNumbers": "ആളുകൾക്കായി തിരയുക അല്ലെങ്കിൽ അവരുടെ ഫോൺ നമ്പറുകൾ ചേർക്കുക",
"shareInvite": "മീറ്റിംഗ് ക്ഷണം പങ്കിടുക",
"shareLink": "മറ്റുള്ളവരെ ക്ഷണിക്കുന്നതിന് മീറ്റിംഗ് ലിങ്ക് പങ്കിടുക",
"shareStream": "തത്സമയ സ്ട്രീമിംഗ് ലിങ്ക് പങ്കിടുക",
"telephone": "Telephone: {{number}}",
"title": "ഈ മീറ്റിംഗിലേക്ക് ആളുകളെ ക്ഷണിക്കുക",
"yahooEmail": "Yahoo Email"
},
"audioDevices": {
"bluetooth": "Bluetooth",
"headphones": "ഹെഡ്‌ഫോണുകൾ",
"phone": "ഫോൺ",
"speaker": "സ്പീക്കർ",
"none": "ഓഡിയോ ഉപകരണങ്ങളൊന്നും ലഭ്യമല്ല"
},
"audioOnly": {
"audioOnly": "കുറഞ്ഞ ബാൻഡ്‌വിഡ്ത്ത്"
},
"calendarSync": {
"addMeetingURL": "ഒരു മീറ്റിംഗ് ലിങ്ക് ചേർക്കുക",
"confirmAddLink": "ഈ ഇവന്റിലേക്ക് Jitsi ലിങ്ക് ചേർക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?",
"error": {
"appConfiguration": "Calendar integration is not properly configured.",
"generic": "An error has occurred. Please check your calendar settings or try refreshing the calendar.",
"notSignedIn": "An error occurred while authenticating to see calendar events. Please check your calendar settings and try logging in again."
},
"join": "ചേരുക",
"joinTooltip": "മീറ്റിംഗിൽ ചേരുക",
"nextMeeting": "അടുത്ത മീറ്റിംഗ്",
"noEvents": "വരാനിരിക്കുന്ന ഇവന്റുകളൊന്നും ഷെഡ്യൂൾ ചെയ്തിട്ടില്ല.",
"ongoingMeeting": "നടന്നുകൊണ്ടിരിക്കുന്ന മീറ്റിംഗ്",
"permissionButton": "ക്രമീകരണങ്ങൾ തുറക്കുക",
"permissionMessage": "അപ്ലിക്കേഷനിൽ നിങ്ങളുടെ മീറ്റിംഗുകൾ കാണാൻ കലണ്ടർ അനുമതി ആവശ്യമാണ്.",
"refresh": "കലണ്ടർ പുതുക്കുക",
"today": "ഇന്ന്"
},
"chat": {
"error": "പിശക്: നിങ്ങളുടെ മെസ്സേജ് അയച്ചില്ല. കാരണം: {{error}}",
"fieldPlaceHolder": "നിങ്ങളുടെ മെസ്സേജ് ഇവിടെ ടൈപ്പുചെയ്യുക",
"messagebox": "ഒരു മെസ്സേജ് ടൈപ്പുചെയ്യുക",
"messageTo": "{{recipient}}-ലേക്കുള്ള സ്വകാര്യ സന്ദേശം",
"noMessagesMessage": "മീറ്റിംഗിൽ ഇതുവരെ മെസ്സേജുകളൊന്നുമില്ല. ഇവിടെ ഒരു സംഭാഷണം ആരംഭിക്കുക!",
"nickname": {
"popover": "ഒരു വിളിപ്പേര് തിരഞ്ഞെടുക്കുക",
"title": "ചാറ്റ് ഉപയോഗിക്കുന്നതിന് ഒരു വിളിപ്പേര് നൽകുക"
},
"privateNotice": " {{recipient}}-ലേക്കുള്ള സ്വകാര്യ സന്ദേശം",
"title": "Chat",
"you": "നിങ്ങൾ"
},
"chromeExtensionBanner": {
"installExtensionText": "Install the extension for Google Calendar and Office 365 integration",
"buttonText": "Chrome എക്സ്റ്റൻഷൻ ഇൻസ്റ്റാൾ ചെയ്യുക",
"dontShowAgain": "ഇത് എന്നെ വീണ്ടും കാണിക്കരുത്"
},
"connectingOverlay": {
"joiningRoom": "നിങ്ങളുടെ മീറ്റിംഗിലേക്ക് നിങ്ങളെ ബന്ധിപ്പിക്കുന്നു ..."
},
"connection": {
"ATTACHED": "അറ്റാച്ചുചെയ്തു",
"AUTHENTICATING": "പ്രാമാണീകരിക്കുന്നു",
"AUTHFAIL": "പ്രാമാണീകരണം പരാജയപ്പെട്ടു",
"CONNECTED": "Connected",
"CONNECTING": "Connecting",
"CONNFAIL": "Connection failed",
"DISCONNECTED": "Disconnected",
"DISCONNECTING": "ഡിസ്കണനെക്ട ചെയ്യുന്നു ",
"ERROR": "Error",
"FETCH_SESSION_ID": "സെഷൻ ഐഡി നേടുന്നു ...",
"GET_SESSION_ID_ERROR": "Get session-id error: {{code}}",
"GOT_SESSION_ID": "സെഷൻ ഐഡി നേടുന്നു... ചെയ്‌തു",
"LOW_BANDWIDTH": "Video for {{displayName}} has been turned off to save bandwidth"
},
"connectionindicator": {
"address": "Address:",
"bandwidth": "Estimated bandwidth:",
"bitrate": "Bitrate:",
"bridgeCount": "Server count: ",
"codecs": "Codecs (A/V): ",
"connectedTo": "Connected to:",
"e2e_rtt": "E2E RTT:",
"framerate": "Frame rate:",
"less": "Show less",
"localaddress": "Local address:",
"localaddress_plural": "Local addresses:",
"localport": "Local port:",
"localport_plural": "Local ports:",
"maxEnabledResolution": "send max",
"more": "Show more",
"packetloss": "Packet loss:",
"quality": {
"good": "Good",
"inactive": "Inactive",
"lost": "Lost",
"nonoptimal": "Nonoptimal",
"poor": "Poor"
},
"remoteaddress": "Remote address:",
"remoteaddress_plural": "Remote addresses:",
"remoteport": "Remote port:",
"remoteport_plural": "Remote ports:",
"resolution": "Resolution:",
"status": "Connection:",
"transport": "Transport:",
"transport_plural": "Transports:"
},
"dateUtils": {
"earlier": "നേരത്തെ",
"today": "ഇന്ന്",
"yesterday": "ഇന്നലെ"
},
"deepLinking": {
"appNotInstalled": "You need the {{app}} mobile app to join this meeting on your phone.",
"description": "Nothing happened? We tried launching your meeting in the {{app}} desktop app. Try again or launch it in the {{app}} web app.",
"descriptionWithoutWeb": "Nothing happened? We tried launching your meeting in the {{app}} desktop app.",
"downloadApp": "ആപ്പ് ഡൌൺലോഡ് ചെയ്യുക ",
"ifDoNotHaveApp": "If you don't have the app yet:",
"ifHaveApp": "നിങ്ങൾക്ക് അപ്ലിക്കേഷൻ ഉണ്ടെങ്കിൽ:",
"joinInApp": "അപ്ലിക്കേഷൻ ഉപയോഗിച്ച് ഈ മീറ്റിംഗിൽ ചേരുക",
"launchWebButton": "വെബിൽ സമാരംഭിക്കുക",
"title": "Launching your meeting in {{app}}...",
"tryAgainButton": "ഡെസ്ക്ടോപ്പിൽ വീണ്ടും ശ്രമിക്കുക"
},
"defaultLink": "e.g. {{url}}",
"defaultNickname": "ex. Jane Pink",
"deviceError": {
"cameraError": "നിങ്ങളുടെ ക്യാമറ ആക്‌സസ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു",
"cameraPermission": "ക്യാമറ അനുമതി നേടുന്നതിൽ പിശക്",
"microphoneError": "നിങ്ങളുടെ മൈക്രോഫോൺ ആക്‌സസ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു",
"microphonePermission": "മൈക്രോഫോൺ അനുമതി നേടുന്നതിൽ പിശക്"
},
"deviceSelection": {
"noPermission": "അനുമതി നൽകിയിട്ടില്ല",
"previewUnavailable": "പ്രിവ്യൂ ലഭ്യമല്ല",
"selectADevice": "ഒരു ഉപകരണം തിരഞെടുക്കുക ",
"testAudio": "ഒരു ടെസ്റ്റ് ശബ്‌ദം പ്ലേ ചെയ്യുക"
},
"dialog": {
"accessibilityLabel": {
"liveStreaming": "തത്സമയ സംപ്രേക്ഷണം"
},
"add": "ചേർക്കുക",
"allow": "അനുവദിക്കുക",
"alreadySharedVideoMsg": "Another participant is already sharing a video. This conference allows only one shared video at a time.",
"alreadySharedVideoTitle": "Only one shared video is allowed at a time",
"applicationWindow": "Application window",
"Back": "Back",
"cameraConstraintFailedError": "Your camera does not satisfy some of the required constraints.",
"cameraNotFoundError": "Camera was not found.",
"cameraNotSendingData": "We are unable to access your camera. Please check if another application is using this device, select another device from the settings menu or try to reload the application.",
"cameraNotSendingDataTitle": "Unable to access camera",
"cameraPermissionDeniedError": "You have not granted permission to use your camera. You can still join the conference but others won't see you. Use the camera button in the address bar to fix this.",
"cameraUnknownError": "Cannot use camera for an unknown reason.",
"cameraUnsupportedResolutionError": "Your camera does not support required video resolution.",
"Cancel": "റദ്ദാക്കുക",
"close": "അടയ്‌ക്കുക",
"conferenceDisconnectMsg": "You may want to check your network connection. Reconnecting in {{seconds}} sec...",
"conferenceDisconnectTitle": "You have been disconnected.",
"conferenceReloadMsg": "ഞങ്ങൾ ഇത് പരിഹരിക്കാൻ ശ്രമിക്കുകയാണ്. {{seconds}} സെക്കൻഡിൽ വീണ്ടും കണക്റ്റുചെയ്യുന്നു ...",
"conferenceReloadTitle": "നിർഭാഗ്യവശാൽ, എന്തോ കുഴപ്പം സംഭവിച്ചു.",
"confirm": "Confirm",
"confirmNo": "No",
"confirmYes": "Yes",
"connectError": "Oops! Something went wrong and we couldn't connect to the conference.",
"connectErrorWithMsg": "Oops! Something went wrong and we couldn't connect to the conference: {{msg}}",
"connecting": "Connecting",
"contactSupport": "Contact support",
"copied": "Copied",
"copy": "Copy",
"dismiss": "Dismiss",
"displayNameRequired": "ഹായ്! താങ്കളുടെ പേരെന്താണ്?",
"done": "ചെയ്‌തു",
"e2eeDescription": "End-to-End Encryption is currently EXPERIMENTAL. Please keep in mind that turning on end-to-end encryption will effectively disable server-side provided services such as: recording, live streaming and phone participation. Also keep in mind that the meeting will only work for people joining from browsers with support for insertable streams.",
"e2eeLabel": "Enable End-to-End Encryption",
"e2eeWarning": "WARNING: Not all participants in this meeting seem to have support for End-to-End encryption. If you enable it they won't be able to see nor hear you.",
"enterDisplayName": "നിങ്ങളുടെ പേര് ഇവിടെ നൽകുക",
"error": "Error",
"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": "ഞാൻ ഹോസ്റ്റാണ് ",
"incorrectRoomLockPassword": "പാസ്‌വേഡ് തെറ്റാണ്",
"incorrectPassword": "തെറ്റായ ഉപയോക്തൃ നാമം അല്ലെങ്കിൽ പാസ്വേഡ്",
"internalError": "Oops! Something went wrong. The following error occurred: {{error}}",
"internalErrorTitle": "Internal error",
"kickMessage": "You can contact {{participantDisplayName}} for more details.",
"kickParticipantButton": "പുറത്താക്കുക ",
"kickParticipantDialog": "ഈ പങ്കാളിയെ പുറത്താക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?",
"kickParticipantTitle": "ഈ പങ്കാളിയെ പുറത്താക്കണോ?",
"kickTitle": "ശൊ! {{participantDisplayName}} നിങ്ങളെ പുറത്താക്കി",
"liveStreaming": "തത്സമയ സംപ്രേക്ഷണം",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "റെക്കോർഡിംഗ് സജീവമായിരിക്കുമ്പോൾ സാധ്യമല്ല",
"liveStreamingDisabledForGuestTooltip": "അതിഥികൾക്ക് തത്സമയ സ്ട്രീം ആരംഭിക്കാൻ കഴിയില്ല",
"liveStreamingDisabledTooltip": "തത്സമയ സ്ട്രീം തുടങ്ങുക പ്രവർത്തനരഹിതമാക്കി.",
"lockMessage": "കോൺഫറൻസ് ലോക്ക് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു.",
"lockRoom": "മീറ്റിംഗ് ചേർക്കുക $t(lockRoomPasswordUppercase)",
"lockTitle": "ലോക്ക് പരാജയപ്പെട്ടു",
"logoutQuestion": "ലോഗൗട്ട് ചെയ്യാനും കോൺഫറൻസ് നിർത്താനും നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?",
"logoutTitle": "ലോഗൗട്ട്",
"maxUsersLimitReached": "പങ്കെടുക്കുന്നവരുടെ പരമാവധി എണ്ണം പരിധിയിലെത്തി. സമ്മേളനം നിറഞ്ഞു. മീറ്റിംഗ് ഉടമയുമായി ബന്ധപ്പെടുക അല്ലെങ്കിൽ പിന്നീട് വീണ്ടും ശ്രമിക്കുക!",
"maxUsersLimitReachedTitle": "പങ്കെടുക്കുന്നവരുടെ പരമാവധി പരിധി എത്തി",
"micConstraintFailedError": "നിങ്ങളുടെ മൈക്രോഫോൺ ആവശ്യമായ ചില പരിമിതികളെ തൃപ്തിപ്പെടുത്തുന്നില്ല.",
"micNotFoundError": "മൈക്രോഫോൺ കണ്ടെത്തിയില്ല.",
"micNotSendingData": "Go to your computer's settings to unmute your mic and adjust its level",
"micNotSendingDataTitle": "നിങ്ങളുടെ സിസ്റ്റം ക്രമീകരണങ്ങളാൽ മൈക്ക് മ്യൂട്ട് ആണ്.",
"micPermissionDeniedError": "നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കാൻ അനുമതി നൽകിയിട്ടില്ല. നിങ്ങൾക്ക് കോൺഫറൻസിൽ ചേരാനാകും, പക്ഷേ മറ്റുള്ളവർക്ക് നിങ്ങളെ കേൾക്കാനാകില്ല. ഇത് പരിഹരിക്കാൻ താഴേയുള്ള ക്യാമറ ബട്ടൺ ഉപയോഗിക്കുക.",
"micUnknownError": "അജ്ഞാതമായ കാരണത്താൽ മൈക്രോഫോൺ ഉപയോഗിക്കാൻ കഴിയില്ല.",
"muteEveryoneElseDialog": "അവരെ നിശബ്ദമാക്കിയാൽ, നിങ്ങൾക്ക് അവയെ അൺമ്യൂട്ട് ചെയ്യാൻ കഴിയില്ല, എന്നാൽ അവർക്ക് എപ്പോൾ വേണമെങ്കിലും സ്വയം അൺമ്യൂട്ട് ചെയ്യാൻ കഴിയും.",
"muteEveryoneElseTitle": "{{whom}} ഒഴികെ എല്ലാവരെയും നിശബ്ദമാക്കുക?",
"muteEveryoneDialog": "എല്ലാവരേയും നിശബ്ദമാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? നിങ്ങൾക്ക് അവയെ അൺമ്യൂട്ട് ചെയ്യാൻ കഴിയില്ല, എന്നാൽ അവർക്ക് എപ്പോൾ വേണമെങ്കിലും സ്വയം അൺമ്യൂട്ട് ചെയ്യാൻ കഴിയും.",
"muteEveryoneTitle": "എല്ലാവരേയും നിശബ്ദമാക്കണോ?",
"muteEveryoneSelf": "നിങ്ങൾ സ്വയം",
"muteEveryoneStartMuted": "എല്ലാവരെയും ഇപ്പോൾ മുതൽ നിശബ്ദമാക്കാൻ തുടങ്ങും ",
"muteParticipantBody": "നിങ്ങൾക്ക് അവയെ അൺമ്യൂട്ട് ചെയ്യാൻ കഴിയില്ല, എന്നാൽ അവർക്ക് എപ്പോൾ വേണമെങ്കിലും സ്വയം അൺമ്യൂട്ട് ചെയ്യാൻ കഴിയും.",
"muteParticipantButton": "നിശബ്ദമാക്കുക",
"muteParticipantDialog": "ഈ പങ്കാളിയെ നിശബ്ദമാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? നിങ്ങൾക്ക് അവയെ അൺമ്യൂട്ട് ചെയ്യാൻ കഴിയില്ല, എന്നാൽ അവർക്ക് എപ്പോൾ വേണമെങ്കിലും സ്വയം അൺമ്യൂട്ട് ചെയ്യാൻ കഴിയും.",
"muteParticipantTitle": "ഈ പങ്കാളിയെ നിശബ്ദമാക്കണോ?",
"Ok": "OK",
"passwordLabel": "The meeting has been locked by a participant. Please enter the $t(lockRoomPassword) to join.",
"passwordNotSupported": "Setting a meeting $t(lockRoomPassword) is not supported.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) not supported",
"passwordRequired": "$t(lockRoomPasswordUppercase) required",
"popupError": "Your browser is blocking pop-up windows from this site. Please enable pop-ups in your browser's security settings and try again.",
"popupErrorTitle": "Pop-up blocked",
"readMore": "more",
"recording": "Recording",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Not possible while a live stream is active",
"recordingDisabledForGuestTooltip": "Guests can't start recordings.",
"recordingDisabledTooltip": "Start recording disabled.",
"rejoinNow": "Rejoin now",
"remoteControlAllowedMessage": "{{user}} accepted your remote control request!",
"remoteControlDeniedMessage": "{{user}} rejected your remote control request!",
"remoteControlErrorMessage": "An error occurred while trying to request remote control permissions from {{user}}!",
"remoteControlRequestMessage": "Will you allow {{user}} to remotely control your desktop?",
"remoteControlShareScreenWarning": "Note that if you press \"Allow\" you will share your screen!",
"remoteControlStopMessage": "The remote control session ended!",
"remoteControlTitle": "Remote desktop control",
"Remove": "Remove",
"removePassword": "Remove $t(lockRoomPassword)",
"removeSharedVideoMsg": "Are you sure you would like to remove your shared video?",
"removeSharedVideoTitle": "Remove shared video",
"reservationError": "Reservation system error",
"reservationErrorMsg": "Error code: {{code}}, message: {{msg}}",
"retry": "Retry",
"screenSharingAudio": "Share audio",
"screenSharingFailed": "Oops! Something went wrong, we werent able to start screen sharing!",
"screenSharingFailedTitle": "Screen sharing failed!",
"screenSharingPermissionDeniedError": "Oops! Something went wrong with your screen sharing permissions. Please reload and try again.",
"sendPrivateMessage": "You recently received a private message. Did you intend to reply to that privately, or you want to send your message to the group?",
"sendPrivateMessageCancel": "Send to the group",
"sendPrivateMessageOk": "Send privately",
"sendPrivateMessageTitle": "Send privately?",
"serviceUnavailable": "Service unavailable",
"sessTerminated": "Call terminated",
"Share": "Share",
"shareVideoLinkError": "Please provide a correct youtube link.",
"shareVideoTitle": "Share a video",
"shareYourScreen": "Share your screen",
"shareYourScreenDisabled": "Screen sharing disabled.",
"shareYourScreenDisabledForGuest": "Guests can't screen share.",
"startLiveStreaming": "Start live stream",
"startRecording": "Start recording",
"startRemoteControlErrorMessage": "An error occurred while trying to start the remote control session!",
"stopLiveStreaming": "Stop live stream",
"stopRecording": "Stop recording",
"stopRecordingWarning": "Are you sure you would like to stop the recording?",
"stopStreamingWarning": "Are you sure you would like to stop the live streaming?",
"streamKey": "Live stream key",
"Submit": "സമർപ്പിക്കുക",
"thankYou": "{{appName}} ഉപയോഗിച്ചതിന് നന്ദി!",
"token": "token",
"tokenAuthFailed": "ക്ഷമിക്കണം, ഈ കോളിൽ ചേരാൻ നിങ്ങളെ അനുവദിച്ചിട്ടില്ല.",
"tokenAuthFailedTitle": "പ്രാമാണീകരണം പരാജയപ്പെട്ടു",
"transcribing": "ട്രാൻസ്‌ക്രൈബുചെയ്യുന്നു",
"unlockRoom": "Remove meeting $t(lockRoomPassword)",
"userPassword": "ഉപയോക്തൃ പാസ്‌വേഡ്",
"WaitForHostMsg": "The conference <b>{{room}}</b> has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
"WaitForHostMsgWOk": "The conference <b>{{room}}</b> has not yet started. If you are the host then please press Ok to authenticate. Otherwise, please wait for the host to arrive.",
"WaitingForHost": "ഹോസ്റ്റിനായി കാത്തിരിക്കുന്നു ...",
"Yes": "Yes",
"yourEntireScreen": "നിങ്ങളുടെ മുഴുവൻ സ്ക്രീനും "
},
"dialOut": {
"statusMessage": "is now {{status}}"
},
"documentSharing": {
"title": "പങ്കിട്ട പ്രമാണം"
},
"e2ee": {
"labelToolTip": "ഈ കോളിലെ ഓഡിയോ, വീഡിയോ ആശയവിനിമയം എൻഡ്-ടു-എൻഡ് എൻ‌ക്രിപ്റ്റ് ചെയ്തിരിക്കുന്നു"
},
"embedMeeting": {
"title": "ഈ മീറ്റിംഗ് എംബെഡ് ചെയ്യുക "
},
"feedback": {
"average": "ശരാശരി",
"bad": " മോശം",
"detailsLabel": "ഇതിനെക്കുറിച്ച് കൂടുതൽ ഞങ്ങളോട് പറയുക.",
"good": "നല്ലത്",
"rateExperience": "നിങ്ങളുടെ മീറ്റിംഗ് അനുഭവം റേറ്റുചെയ്യുക",
"veryBad": "വളരെ മോശം",
"veryGood": "വളരെ നല്ലത്"
},
"incomingCall": {
"answer": "കോളിന് മറുപടി നൽകുക",
"audioCallTitle": "ഇൻകമിംഗ് കോൾ",
"decline": "നിരസിക്കുക",
"productLabel": "Jitsi Meet-ൽ നിന്ന്",
"videoCallTitle": "ഇൻകമിംഗ് വീഡിയോ കോൾ"
},
"info": {
"accessibilityLabel": "Show info",
"addPassword": "Add $t(lockRoomPassword)",
"cancelPassword": "Cancel $t(lockRoomPassword)",
"conferenceURL": "Link:",
"country": "Country",
"dialANumber": "To join your meeting, dial one of these numbers and then enter the pin.",
"dialInConferenceID": "PIN:",
"dialInNotSupported": "Sorry, dialing in is currently not supported.",
"dialInNumber": "Dial-in:",
"dialInSummaryError": "Error fetching dial-in info now. Please try again later.",
"dialInTollFree": "Toll Free",
"genericError": "Whoops, something went wrong.",
"inviteLiveStream": "To view the live stream of this meeting, click this link: {{url}}",
"invitePhone": "To join by phone instead, tap this: {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "Looking for a different dial-in number?\nSee meeting dial-in numbers: {{url}}\n\n\nIf also dialing-in through a room phone, join without connecting to audio: {{silentUrl}}",
"inviteURLFirstPartGeneral": "You are invited to join a meeting.",
"inviteURLFirstPartPersonal": "{{name}} is inviting you to a meeting.\n",
"inviteURLSecondPart": "\nJoin the meeting:\n{{url}}\n",
"liveStreamURL": "Live stream:",
"moreNumbers": "More numbers",
"noNumbers": "No dial-in numbers.",
"noPassword": "None",
"noRoom": "No room was specified to dial-in into.",
"numbers": "Dial-in Numbers",
"password": "$t(lockRoomPasswordUppercase):",
"title": "Share",
"tooltip": "Share link and dial-in info for this meeting",
"label": "Meeting info"
},
"inviteDialog": {
"alertText": "Failed to invite some participants.",
"header": "Invite",
"searchCallOnlyPlaceholder": "Enter phone number",
"searchPeopleOnlyPlaceholder": "Search for participants",
"searchPlaceholder": "Participant or phone number",
"send": "Send"
},
"inlineDialogFailure": {
"msg": "We stumbled a bit.",
"retry": "Try again",
"support": "Support",
"supportMsg": "If this keeps happening, reach out to"
},
"keyboardShortcuts": {
"focusLocal": "Focus on your video",
"focusRemote": "Focus on another person's video",
"fullScreen": "View or exit full screen",
"keyboardShortcuts": "Keyboard shortcuts",
"localRecording": "Show or hide local recording controls",
"mute": "Mute or unmute your microphone",
"pushToTalk": "Push to talk",
"raiseHand": "Raise or lower your hand",
"showSpeakerStats": "Show speaker stats",
"toggleChat": "Open or close the chat",
"toggleFilmstrip": "Show or hide video thumbnails",
"toggleScreensharing": "Switch between camera and screen sharing",
"toggleShortcuts": "Show or hide keyboard shortcuts",
"videoMute": "Start or stop your camera",
"videoQuality": "Manage call quality"
},
"liveStreaming": {
"limitNotificationDescriptionWeb": "Due to high demand your streaming will be limited to {{limit}} min. For unlimited streaming try <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Your streaming will be limited to {{limit}} min. For unlimited streaming try {{app}}.",
"busy": "We're working on freeing streaming resources. Please try again in a few minutes.",
"busyTitle": "All streamers are currently busy",
"changeSignIn": "Switch accounts.",
"choose": "Choose a live stream",
"chooseCTA": "Choose a streaming option. You're currently logged in as {{email}}.",
"enterStreamKey": "Enter your YouTube live stream key here.",
"error": "Live Streaming failed. Please try again.",
"errorAPI": "An error occurred while accessing your YouTube broadcasts. Please try logging in again.",
"errorLiveStreamNotEnabled": "Live Streaming is not enabled on {{email}}. Please enable live streaming or log into an account with live streaming enabled.",
"expandedOff": "The live streaming has stopped",
"expandedOn": "The meeting is currently being streamed to YouTube.",
"expandedPending": "The live streaming is being started...",
"failedToStart": "Live Streaming failed to start",
"getStreamKeyManually": "We werent able to fetch any live streams. Try getting your live stream key from YouTube.",
"invalidStreamKey": "Live stream key may be incorrect.",
"off": "Live Streaming stopped",
"offBy": "{{name}} stopped the live streaming",
"on": "Live Streaming",
"onBy": "{{name}} started the live streaming",
"pending": "Starting Live Stream...",
"serviceName": "Live Streaming service",
"signedInAs": "You are currently signed in as:",
"signIn": "Sign in with Google",
"signInCTA": "Sign in or enter your live stream key from YouTube.",
"signOut": "Sign out",
"start": "Start a live stream",
"streamIdHelp": "What's this?",
"unavailableTitle": "Live Streaming unavailable",
"youtubeTerms": "YouTube terms of services",
"googlePrivacyPolicy": "Google Privacy Policy"
},
"localRecording": {
"clientState": {
"off": "Off",
"on": "On",
"unknown": "Unknown"
},
"dialogTitle": "Local Recording Controls",
"duration": "Duration",
"durationNA": "N/A",
"encoding": "Encoding",
"label": "LOR",
"labelToolTip": "Local recording is engaged",
"localRecording": "Local Recording",
"me": "Me",
"messages": {
"engaged": "Local recording engaged.",
"finished": "Recording session {{token}} finished. Please send the recorded file to the moderator.",
"finishedModerator": "Recording session {{token}} finished. The recording of the local track has been saved. Please ask the other participants to submit their recordings.",
"notModerator": "You are not the moderator. You cannot start or stop local recording."
},
"moderator": "Moderator",
"no": "No",
"participant": "Participant",
"participantStats": "Participant Stats",
"sessionToken": "Session Token",
"start": "Start Recording",
"stop": "Stop Recording",
"yes": "Yes"
},
"lockRoomPassword": "password",
"lockRoomPasswordUppercase": "Password",
"me": "me",
"notify": {
"connectedOneMember": "{{name}} joined the meeting",
"connectedThreePlusMembers": "{{name}} and {{count}} others joined the meeting",
"connectedTwoMembers": "{{first}} and {{second}} joined the meeting",
"disconnected": "disconnected",
"focus": "Conference focus",
"focusFail": "{{component}} not available - retry in {{ms}} sec",
"grantedTo": "Moderator rights granted to {{to}}!",
"invitedOneMember": "{{name}} has been invited",
"invitedThreePlusMembers": "{{name}} and {{count}} others have been invited",
"invitedTwoMembers": "{{first}} and {{second}} have been invited",
"kickParticipant": "{{kicked}} was kicked by {{kicker}}",
"me": "Me",
"moderator": "Moderator rights granted!",
"muted": "You have started the conversation muted.",
"mutedTitle": "You're muted!",
"mutedRemotelyTitle": "You have been muted by {{participantDisplayName}}!",
"mutedRemotelyDescription": "You can always unmute when you're ready to speak. Mute back when you're done to keep noise away from the meeting.",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) removed by another participant",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) set by another participant",
"raisedHand": "{{name}} would like to speak.",
"somebody": "Somebody",
"startSilentTitle": "You joined with no audio output!",
"startSilentDescription": "Rejoin the meeting to enable audio",
"suboptimalBrowserWarning": "We are afraid your meeting experience isn't going to be that great here. We are looking for ways to improve this, but until then please try using one of the <a href='{{recommendedBrowserPageLink}}' target='_blank'>fully supported browsers</a>.",
"suboptimalExperienceTitle": "Browser Warning",
"unmute": "Unmute",
"newDeviceCameraTitle": "New camera detected",
"newDeviceAudioTitle": "New audio device detected",
"newDeviceAction": "Use",
"OldElectronAPPTitle": "Security vulnerability!",
"oldElectronClientDescription1": "You appear to be using an old version of the Jitsi Meet client which has known security vulnerabilities. Please make sure you update to our ",
"oldElectronClientDescription2": "latest build",
"oldElectronClientDescription3": " now!"
},
"passwordSetRemotely": "set by another participant",
"passwordDigitsOnly": "Up to {{number}} digits",
"poweredby": "powered by",
"prejoin": {
"audioAndVideoError": "Audio and video error:",
"audioDeviceProblem": "There is a problem with your audio device",
"audioOnlyError": "Audio error:",
"audioTrackError": "Could not create audio track.",
"calling": "Calling",
"callMe": "Call me",
"callMeAtNumber": "Call me at this number:",
"configuringDevices": "Configuring devices...",
"connectedWithAudioQ": "Youre connected with audio?",
"connection": {
"good": "Your internet connection looks good!",
"nonOptimal": "Your internet connection is not optimal",
"poor": "You have a poor internet connection"
},
"connectionDetails": {
"audioClipping": "We expect your audio to be clipped.",
"audioHighQuality": "We expect your audio to have excellent quality.",
"audioLowNoVideo": "We expect your audio quality to be low and no video.",
"goodQuality": "Awesome! Your media quality is going to be great.",
"noMediaConnectivity": "We could not find a way to establish media connectivity for this test. This is typically caused by a firewall or NAT.",
"noVideo": "We expect that your video will be terrible.",
"undetectable": "If you still can not make calls in browser, we recommend that you make sure your speakers, microphone and camera are properly set up, that you have granted your browser rights to use your microphone and camera, and that your browser version is up-to-date. If you still have trouble calling, you should contact the web application developer.",
"veryPoorConnection": "We expect your call quality to be really terrible.",
"videoFreezing": "We expect your video to freeze, turn black, and be pixelated.",
"videoHighQuality": "We expect your video to have good quality.",
"videoLowQuality": "We expect your video to have low quality in terms of frame rate and resolution.",
"videoTearing": "We expect your video to be pixelated or have visual artefacts."
},
"copyAndShare": "Copy & share meeting link",
"dialInMeeting": "Dial into the meeting",
"dialInPin": "Dial into the meeting and enter PIN code:",
"dialing": "Dialing",
"doNotShow": "Don't show this again",
"errorDialOut": "Could not dial out",
"errorDialOutDisconnected": "Could not dial out. Disconnected",
"errorDialOutFailed": "Could not dial out. Call failed",
"errorDialOutStatus": "Error getting dial out status",
"errorMissingName": "Please enter your name to join the meeting",
"errorStatusCode": "Error dialing out, status code: {{status}}",
"errorValidation": "Number validation failed",
"iWantToDialIn": "I want to dial in",
"joinAudioByPhone": "Join with phone audio",
"joinMeeting": "Join meeting",
"joinWithoutAudio": "Join without audio",
"initiated": "Call initiated",
"linkCopied": "Link copied to clipboard",
"lookGood": "It sounds like your microphone is working properly",
"or": "or",
"premeeting": "Pre meeting",
"showScreen": "Enable pre meeting screen",
"startWithPhone": "Start with phone audio",
"screenSharingError": "Screen sharing error:",
"videoOnlyError": "Video error:",
"videoTrackError": "Could not create video track.",
"viewAllNumbers": "view all numbers"
},
"presenceStatus": {
"busy": "തിരക്ക്",
"calling": "വിളിക്കുന്നു ...",
"connected": "Connected",
"connecting": "Connecting...",
"connecting2": "Connecting*...",
"disconnected": "Disconnected",
"expired": "Expired",
"ignored": "Ignored",
"initializingCall": "Initializing Call...",
"invited": "Invited",
"rejected": "Rejected",
"ringing": "Ringing..."
},
"profile": {
"setDisplayNameLabel": "Set your display name",
"setEmailInput": "Enter e-mail",
"setEmailLabel": "Set your gravatar email",
"title": "Profile"
},
"raisedHand": "Would like to speak",
"recording": {
"limitNotificationDescriptionWeb": "Due to high demand your recording will be limited to {{limit}} min. For unlimited recordings try <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Due to high demand your recording will be limited to {{limit}} min. For unlimited recordings try <3>{{app}}</3>.",
"authDropboxText": "Upload to Dropbox",
"availableSpace": "Available space: {{spaceLeft}} MB (approximately {{duration}} minutes of recording)",
"beta": "BETA",
"busy": "We're working on freeing recording resources. Please try again in a few minutes.",
"busyTitle": "All recorders are currently busy",
"error": "Recording failed. Please try again.",
"expandedOff": "Recording has stopped",
"expandedOn": "The meeting is currently being recorded.",
"expandedPending": "Recording is being started...",
"failedToStart": "Recording failed to start",
"fileSharingdescription": "Share recording with meeting participants",
"live": "LIVE",
"loggedIn": "Logged in as {{userName}}",
"off": "Recording stopped",
"offBy": "{{name}} stopped the recording",
"on": "Recording",
"onBy": "{{name}} started the recording",
"pending": "Preparing to record the meeting...",
"rec": "REC",
"serviceDescription": "Your recording will be saved by the recording service",
"serviceName": "Recording service",
"signIn": "Sign in",
"signOut": "Sign out",
"unavailable": "Oops! The {{serviceName}} is currently unavailable. We're working on resolving the issue. Please try again later.",
"unavailableTitle": "Recording unavailable"
},
"sectionList": {
"pullToRefresh": "Pull to refresh"
},
"security": {
"about": "You can add a $t(lockRoomPassword) to your meeting. Participants will need to provide the $t(lockRoomPassword) before they are allowed to join the meeting.",
"aboutReadOnly": "Moderator participants can add a $t(lockRoomPassword) to the meeting. Participants will need to provide the $t(lockRoomPassword) before they are allowed to join the meeting.",
"insecureRoomNameWarning": "The room name is unsafe. Unwanted participants may join your conference. Consider securing your meeting using the security button.",
"securityOptions": "Security options"
},
"settings": {
"calendar": {
"about": "The {{appName}} calendar integration is used to securely access your calendar so it can read upcoming events.",
"disconnect": "Disconnect",
"microsoftSignIn": "Sign in with Microsoft",
"signedIn": "Currently accessing calendar events for {{email}}. Click the Disconnect button below to stop accessing calendar events.",
"title": "Calendar"
},
"devices": "Devices",
"followMe": "Everyone follows me",
"language": "Language",
"loggedIn": "Logged in as {{name}}",
"microphones": "Microphones",
"moderator": "Moderator",
"more": "More",
"name": "Name",
"noDevice": "None",
"selectAudioOutput": "Audio output",
"selectCamera": "Camera",
"selectMic": "Microphone",
"speakers": "Speakers",
"startAudioMuted": "Everyone starts muted",
"startVideoMuted": "Everyone starts hidden",
"title": "Settings"
},
"settingsView": {
"advanced": "Advanced",
"alertOk": "OK",
"alertCancel": "Cancel",
"alertTitle": "Warning",
"alertURLText": "The entered server URL is invalid",
"buildInfoSection": "Build Information",
"conferenceSection": "Conference",
"disableCallIntegration": "Disable native call integration",
"disableP2P": "Disable Peer-To-Peer mode",
"disableCrashReporting": "Disable crash reporting",
"disableCrashReportingWarning": "Are you sure you want to disable crash reporting? The setting will be applied after you restart the app.",
"displayName": "Display name",
"email": "Email",
"header": "Settings",
"profileSection": "Profile",
"serverURL": "Server URL",
"showAdvanced": "Show advanced settings",
"startWithAudioMuted": "Start with audio muted",
"startWithVideoMuted": "Start with video muted",
"version": "Version"
},
"share": {
"dialInfoText": "\n\n=====\n\nJust want to dial in on your phone?\n\n{{defaultDialInNumber}}Click this link to see the dial in phone numbers for this meeting\n{{dialInfoPageUrl}}",
"mainText": "Click the following link to join the meeting:\n{{roomUrl}}"
},
"speaker": "Speaker",
"speakerStats": {
"hours": "{{count}}h",
"minutes": "{{count}}m",
"name": "Name",
"seconds": "{{count}}s",
"speakerStats": "Speaker Stats",
"speakerTime": "Speaker Time"
},
"startupoverlay": {
"policyText": " ",
"title": "{{app}} needs to use your microphone and camera."
},
"suspendedoverlay": {
"rejoinKeyTitle": "Rejoin",
"text": "Press the <i>Rejoin</i> button to reconnect.",
"title": "Your video call was interrupted because this computer went to sleep."
},
"toolbar": {
"accessibilityLabel": {
"audioOnly": "Toggle audio only",
"audioRoute": "Select the sound device",
"callQuality": "Manage video quality",
"cc": "Toggle subtitles",
"chat": "Toggle chat window",
"document": "Toggle shared document",
"download": "Download our apps",
"embedMeeting": "Embed meeting",
"feedback": "Leave feedback",
"fullScreen": "Toggle full screen",
"grantModerator": "Grant Moderator",
"hangup": "Leave the call",
"help": "Help",
"invite": "Invite people",
"kick": "Kick participant",
"lobbyButton": "Enable/disable lobby mode",
"localRecording": "Toggle local recording controls",
"lockRoom": "Toggle meeting password",
"moreActions": "Toggle more actions menu",
"moreActionsMenu": "More actions menu",
"moreOptions": "Show more options",
"mute": "Toggle mute audio",
"muteEveryone": "Mute everyone",
"pip": "Toggle Picture-in-Picture mode",
"privateMessage": "Send private message",
"profile": "Edit your profile",
"raiseHand": "Toggle raise hand",
"recording": "Toggle recording",
"remoteMute": "Mute participant",
"security": "Security options",
"Settings": "Toggle settings",
"sharedvideo": "Toggle Youtube video sharing",
"shareRoom": "Invite someone",
"shareYourScreen": "Toggle screenshare",
"shortcuts": "Toggle shortcuts",
"show": "Show on stage",
"speakerStats": "Toggle speaker statistics",
"tileView": "Toggle tile view",
"toggleCamera": "Toggle camera",
"toggleFilmstrip": "Toggle filmstrip",
"videomute": "Toggle mute video",
"videoblur": "Toggle video blur"
},
"addPeople": "Add people to your call",
"audioOnlyOff": "Disable low bandwidth mode",
"audioOnlyOn": "Enable low bandwidth mode",
"audioRoute": "Select the sound device",
"authenticate": "Authenticate",
"callQuality": "Manage video quality",
"chat": "Open / Close chat",
"closeChat": "Close chat",
"documentClose": "Close shared document",
"documentOpen": "Open shared document",
"download": "Download our apps",
"e2ee": "End-to-End Encryption",
"embedMeeting": "Embed meeting",
"enterFullScreen": "View full screen",
"enterTileView": "Enter tile view",
"exitFullScreen": "Exit full screen",
"exitTileView": "Exit tile view",
"feedback": "Leave feedback",
"hangup": "Leave",
"help": "Help",
"invite": "Invite people",
"lobbyButtonDisable": "Disable lobby mode",
"lobbyButtonEnable": "Enable lobby mode",
"login": "Login",
"logout": "Logout",
"lowerYourHand": "Lower your hand",
"moreActions": "More actions",
"moreOptions": "More options",
"mute": "Mute / Unmute",
"muteEveryone": "Mute everyone",
"noAudioSignalTitle": "There is no input coming from your mic!",
"noAudioSignalDesc": "If you did not purposely mute it from system settings or hardware, consider switching the device.",
"noAudioSignalDescSuggestion": "If you did not purposely mute it from system settings or hardware, consider switching to the suggested device.",
"noAudioSignalDialInDesc": "You can also dial-in using:",
"noAudioSignalDialInLinkDesc": "Dial-in numbers",
"noisyAudioInputTitle": "Your microphone appears to be noisy!",
"noisyAudioInputDesc": "It sounds like your microphone is making noise, please consider muting or changing the device.",
"openChat": "Open chat",
"pip": "Enter Picture-in-Picture mode",
"privateMessage": "Send private message",
"profile": "Edit your profile",
"raiseHand": "Raise / Lower your hand",
"raiseYourHand": "Raise your hand",
"security": "Security options",
"Settings": "Settings",
"sharedvideo": "Share a YouTube video",
"shareRoom": "Invite someone",
"shortcuts": "View shortcuts",
"speakerStats": "Speaker stats",
"startScreenSharing": "Start screen sharing",
"startSubtitles": "Start subtitles",
"stopScreenSharing": "Stop screen sharing",
"stopSubtitles": "Stop subtitles",
"stopSharedVideo": "Stop YouTube video",
"talkWhileMutedPopup": "Trying to speak? You are muted.",
"tileViewToggle": "Toggle tile view",
"toggleCamera": "Toggle camera",
"videomute": "Start / Stop camera",
"startvideoblur": "Blur my background",
"stopvideoblur": "Disable background blur"
},
"transcribing": {
"ccButtonTooltip": "Start / Stop subtitles",
"error": "Transcribing failed. Please try again.",
"expandedLabel": "Transcribing is currently on",
"failedToStart": "Transcribing failed to start",
"labelToolTip": "The meeting is being transcribed",
"off": "Transcribing stopped",
"pending": "Preparing to transcribe the meeting...",
"start": "Start showing subtitles",
"stop": "Stop showing subtitles",
"tr": "TR"
},
"userMedia": {
"androidGrantPermissions": "Select <b><i>Allow</i></b> when your browser asks for permissions.",
"chromeGrantPermissions": "Select <b><i>Allow</i></b> when your browser asks for permissions.",
"edgeGrantPermissions": "Select <b><i>Yes</i></b> when your browser asks for permissions.",
"electronGrantPermissions": "Please grant permissions to use your camera and microphone",
"firefoxGrantPermissions": "Select <b><i>Share Selected Device</i></b> when your browser asks for permissions.",
"iexplorerGrantPermissions": "Select <b><i>OK</i></b> when your browser asks for permissions.",
"nwjsGrantPermissions": "Please grant permissions to use your camera and microphone",
"operaGrantPermissions": "Select <b><i>Allow</i></b> when your browser asks for permissions.",
"react-nativeGrantPermissions": "Select <b><i>Allow</i></b> when your browser asks for permissions.",
"safariGrantPermissions": "Select <b><i>OK</i></b> when your browser asks for permissions."
},
"videoSIPGW": {
"busy": "We're working on freeing resources. Please try again in a few minutes.",
"busyTitle": "The Room service is currently busy",
"errorAlreadyInvited": "{{displayName}} already invited",
"errorInvite": "Conference not established yet. Please try again later.",
"errorInviteFailed": "We're working on resolving the issue. Please try again later.",
"errorInviteFailedTitle": "Inviting {{displayName}} failed",
"errorInviteTitle": "Error inviting room",
"pending": "{{displayName}} has been invited"
},
"videoStatus": {
"audioOnly": "AUD",
"audioOnlyExpanded": "You are in low bandwidth mode. In this mode you will receive only audio and screen sharing.",
"callQuality": "Video Quality",
"hd": "HD",
"hdTooltip": "Viewing high definition video",
"highDefinition": "High definition",
"labelTooiltipNoVideo": "No video",
"labelTooltipAudioOnly": "Low bandwidth mode enabled",
"ld": "LD",
"ldTooltip": "Viewing low definition video",
"lowDefinition": "Low definition",
"onlyAudioAvailable": "Only audio is available",
"onlyAudioSupported": "We only support audio in this browser.",
"sd": "SD",
"sdTooltip": "Viewing standard definition video",
"standardDefinition": "Standard definition"
},
"videothumbnail": {
"domute": "Mute",
"domuteOthers": "Mute everyone else",
"flip": "Flip",
"grantModerator": "Grant Moderator",
"kick": "Kick out",
"moderator": "Moderator",
"mute": "Participant is muted",
"muted": "Muted",
"remoteControl": "Start / Stop remote control",
"show": "Show on stage",
"videomute": "Participant has stopped the camera"
},
"welcomepage": {
"accessibilityLabel": {
"join": "Tap to join",
"roomname": "Enter room name"
},
"appDescription": "Go ahead, video chat with the whole team. In fact, invite everyone you know. {{app}} is a fully encrypted, 100% open source video conferencing solution that you can use all day, every day, for free — with no account needed.",
"audioVideoSwitch": {
"audio": "Voice",
"video": "Video"
},
"calendar": "Calendar",
"connectCalendarButton": "Connect your calendar",
"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",
"getHelp": "Get help",
"go": "GO",
"goSmall": "GO",
"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": "സ്വകാര്യത",
"recentList": "സമീപകാലം",
"recentListDelete": "ഇല്ലാതാക്കുക",
"recentListEmpty": "Your recent list is currently empty. Chat with your team and you will find all your recent meetings here.",
"reducedUIText": "Welcome to {{app}}!",
"roomNameAllowedChars": "Meeting name should not contain any of these characters: ?, &, :, ', \", %, #.",
"roomname": "റൂമിന്റെ പേര് നൽകുക",
"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": "ഫീഡ്‌ബാക്ക് അയയ്‌ക്കുക",
"terms": "നിബന്ധനകൾ",
"title": "സുരക്ഷിതവും പൂർണ്ണമായും സൗജന്യ വീഡിയോ കോൺഫറൻസിംഗും"
},
"lonelyMeetingExperience": {
"button": "മറ്റുള്ളവരെ ക്ഷണിക്കുക",
"youAreAlone": "മീറ്റിംഗിൽ നിങ്ങൾ മാത്രമേയുള്ളൂ "
},
"helpView": {
"header": "സഹായകേന്ദ്രം"
},
"lobby": {
"knockingParticipantList": "Knocking participant list",
"allow": "അനുവദിക്കുക",
"backToKnockModeButton": "പാസ്‌വേഡ് ഇല്ല, പകരം ചേരാൻ ആവശ്യപ്പെടുക",
"dialogTitle": "ലോബി മോഡ്",
"disableDialogContent": "ലോബി മോഡ് നിലവിൽ പ്രാപ്തമാക്കി. അനാവശ്യ പങ്കാളികൾക്ക് നിങ്ങളുടെ മീറ്റിംഗിൽ ചേരാനാവില്ലെന്ന് ഈ സവിശേഷത ഉറപ്പാക്കുന്നു. ഇത് പ്രവർത്തനരഹിതമാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?",
"disableDialogSubmit": "പ്രവർത്തനരഹിതമാക്കുക",
"emailField": "നിങ്ങളുടെ ഇമെയിൽ വിലാസം നൽകുക",
"enableDialogPasswordField": "പാസ്‌വേഡ് സജ്ജമാക്കുക (ഓപ്ഷണൽ)",
"enableDialogSubmit": "പ്രവർത്തനക്ഷമമാക്കുക",
"enableDialogText": "Lobby mode lets you protect your meeting by only allowing people to enter after a formal approval by a moderator.",
"enterPasswordButton": "മീറ്റിംഗ് പാസ്‌വേഡ് നൽകുക ",
"enterPasswordTitle": "മീറ്റിംഗിൽ ചേരാൻ പാസ്‌വേഡ് നൽകുക",
"invalidPassword": "പാസ്‌വേഡ് അസാധുവാണ്",
"joiningMessage": "ആരെങ്കിലും നിങ്ങളുടെ അഭ്യർത്ഥന സ്വീകരിച്ചാലുടൻ നിങ്ങൾ മീറ്റിംഗിൽ ചേരും",
"joinWithPasswordMessage": "പാസ്‌വേഡുമായി ചേരാൻ ശ്രമിക്കുന്നു, ദയവായി കാത്തിരിക്കുക ...",
"joinRejectedMessage": "നിങ്ങളുടെ ചേരൽ അഭ്യർത്ഥന ഒരു മോഡറേറ്റർ നിരസിച്ചു.",
"joinTitle": "മീറ്റിംഗിൽ ചേരുക",
"joiningTitle": "മീറ്റിംഗിൽ ചേരാൻ ആവശ്യപ്പെടുന്നു ...",
"joiningWithPasswordTitle": "പാസ്‌വേഡുമായി ചേരുന്നു ...",
"knockButton": "ചേരാൻ ആവശ്യപ്പെടുക",
"knockTitle": "ആരോ മീറ്റിംഗിൽ ചേരാൻ ശ്രമിക്കുന്നു ",
"nameField": "നിങ്ങളുടെ പേര് നൽകുക",
"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": "{{originParticipantName}} ലോബി പ്രാപ്തമാക്കി",
"notificationTitle": "ലോബി",
"passwordField": "മീറ്റിംഗ് പാസ്‌വേഡ് നൽകുക",
"passwordJoinButton": "ചേരുക",
"reject": "നിരസിക്കുക",
"toggleLabel": "ലോബി പ്രവർത്തനക്ഷമമാക്കുക"
}
}

View File

@@ -104,7 +104,7 @@
},
"deepLinking": {
"downloadApp": "Last ned programmet",
"openApp": "Fortsett til programmet"
"openApp": "Fortsett til programmet",
},
"defaultLink": "f.eks.",
"deviceError": {

View File

@@ -1,36 +1,21 @@
{
"addPeople": {
"add": "Convidar",
"addContacts": "Convide seus contatos",
"copyInvite": "Copiar convite da reunião",
"copyLink": "Copiar link da reunião",
"copyStream": "Copiar link da transmissão ao vivo",
"countryNotSupported": "Ainda não suportamos este destino.",
"countryReminder": "Ligando de fora dos EUA? Por favor, certifique-se de começar com o código do país!",
"defaultEmail": "Seu email padrão",
"disabled": "Você não pode convidar pessoas.",
"failedToAdd": "Falha em adicionar participantes",
"footerText": "Discagem está desativada.",
"googleEmail": "E-mail Google",
"inviteMoreHeader": "Você é o único na reunião",
"inviteMoreMailSubject": "Entre na reunião {{appName}}",
"inviteMorePrompt": "Convide mais pessoas",
"linkCopied": "Link copiado para a área de transferência",
"loading": "Procurando por pessoas e números de telefone",
"loadingNumber": "Validando o número de telefone",
"loadingPeople": "Procurando por pessoas para convidar",
"noResults": "Nenhum resultado de busca correspondente",
"noValidNumbers": "Por favor, digite um número de telefone",
"outlookEmail": "E-mail Outlook ",
"searchNumbers": "Adicionar números de telefone",
"searchPeople": "Pesquisar pessoas",
"searchPeopleAndNumbers": "Pesquisar por pessoas ou adicionar seus números de telefone",
"shareInvite": "Compartilhar convite da reunião",
"shareLink": "Compartilhando o link da reunião",
"shareStream": "Compartilhar o link da transmissão ao vivo",
"telephone": "Telefone: {{number}}",
"title": "Convide pessoas para sua reunião",
"yahooEmail": "E-mail Yahoo"
"title": "Convide pessoas para sua reunião"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -74,11 +59,6 @@
"title": "Bate-papo",
"you": "você"
},
"chromeExtensionBanner": {
"installExtensionText": "Instale a extensão para integrar com Google Calendar e Office 365",
"buttonText": "Instalar extensão do Chrome",
"dontShowAgain": "Não me mostre isso de novo"
},
"connectingOverlay": {
"joiningRoom": "Conectando você à reunião…"
},
@@ -92,27 +72,24 @@
"DISCONNECTED": "Desconectado",
"DISCONNECTING": "Desconectando",
"ERROR": "Erro",
"FETCH_SESSION_ID": "Obtendo ID da sessão...",
"GET_SESSION_ID_ERROR": "Erro ao obter o ID da sessão: {{code}}",
"RECONNECTING": "Ocorreu um problema de rede. Reconectando...",
"LOW_BANDWIDTH": "O vídeo de {{displayName}} foi desativado para economizar largura de banda",
"GOT_SESSION_ID": "Obtendo ID da sessão... Feito",
"LOW_BANDWIDTH": "O vídeo de {{displayName}} foi desativado para economizar largura de banda"
"GET_SESSION_ID_ERROR": "Erro ao obter o ID da sessão: {{code}}",
"FETCH_SESSION_ID": "Obtendo ID da sessão..."
},
"connectionindicator": {
"address": "Endereço:",
"audio_ssrc": "Aúdio SSRC:",
"bandwidth": "Largura de banda estimada:",
"bitrate": "Taxa de bits:",
"bridgeCount": "Servidores: ",
"codecs": "Codecs (A/V): ",
"connectedTo": "Conectado a:",
"e2e_rtt": "E2E RTT:",
"framerate": "Taxa de quadros:",
"less": "Mostrar menos",
"localaddress": "Endereço local:",
"localaddress_plural": "Endereços locais:",
"localport": "Porta local:",
"localport_plural": "Portas locais:",
"maxEnabledResolution": "envio máx",
"more": "Mostrar mais",
"packetloss": "Perda de pacote:",
"quality": {
@@ -127,12 +104,10 @@
"remoteport": "Porta remota:",
"remoteport_plural": "Portas remotas:",
"resolution": "Resolução:",
"savelogs": "Grave os logs",
"participant_id": "Id participante:",
"status": "Conexão:",
"transport": "Transporte:",
"transport_plural": "Transportes:",
"video_ssrc": "Video SSRC:"
"e2e_rtt": "E2E RTT:"
},
"dateUtils": {
"earlier": "Mais cedo",
@@ -144,10 +119,8 @@
"description": "Nada acontece? Estamos tentando iniciar sua reunião no aplicativo desktop {{app}}. Tente novamente ou inicie ele na aplicação web {{app}}.",
"descriptionWithoutWeb": "Nada aconteceu? Tentamos iniciar sua reunião no aplicativo de desktop {{app}}.",
"downloadApp": "Baixe o Aplicativo",
"ifDoNotHaveApp": "Se você não tem o app ainda:",
"ifHaveApp": "Se você já tem o app:",
"joinInApp": "Entrar na reunião usando o app",
"launchWebButton": "Iniciar na web",
"openApp": "Continue na aplicação",
"title": "Iniciando sua reunião no {{app}}...",
"tryAgainButton": "Tente novamente no desktop"
},
@@ -169,7 +142,6 @@
"accessibilityLabel": {
"liveStreaming": "Transmissão ao vivo"
},
"add": "Adicionar",
"allow": "Permitir",
"alreadySharedVideoMsg": "Outro participante já está compartilhando um vídeo. Esta conferência permite apenas um vídeo compartilhado por vez.",
"alreadySharedVideoTitle": "Somente um vídeo compartilhado é permitido por vez",
@@ -195,22 +167,21 @@
"connectErrorWithMsg": "Oops! Alguma coisa está errada e não podemos conectar à conferência: {{msg}}",
"connecting": "Conectando",
"contactSupport": "Contate o suporte",
"copied": "Copiado",
"copy": "Copiar",
"dismiss": "Dispensar",
"displayNameRequired": "Oi! Qual o seu nome?",
"done": "Feito",
"e2eeDescription": "Encriptação ponto-a-ponto é, no momento, EXPERIMENTAL. Por favor tenha em mente que habilitar a encriptação ponto-a-ponto irá desativar os serviços disponíveis no servidor como: gravação, transmissão ao vivo e telefonar participantes. Além disso a reunião só irá funcionar para os participantes entrando em browsers com suporte a funcionalidade.",
"e2eeLabel": "Enable End-to-End Encryption",
"e2eeWarning": "WARNING: Not all participants in this meeting seem to have support for End-to-End encryption. If you enable it they won't be able to see nor hear you.",
"enterDisplayName": "Digite seu nome aqui",
"error": "Erro",
"gracefulShutdown": "Nosso serviço está em manutenção. Tente novamente mais tarde.",
"grantModeratorDialog": "Tem certeza que quer participar como moderador da reunião?",
"grantModeratorTitle": "Permitir moderador",
"externalInstallationMsg": "Você precisa instalar nossa extensão de compartilhamento de tela.",
"externalInstallationTitle": "Extensão requerida",
"goToStore": "Vá para a loja virtual",
"gracefulShutdown": "O sistema está em manutenção. Por favor tente novamente mais tarde.",
"IamHost": "Eu sou o anfitrião",
"incorrectRoomLockPassword": "Senha incorreta",
"incorrectPassword": "Usuário ou senha incorretos",
"inlineInstallationMsg": "Você precisa instalar nossa extensão de compartilhamento de tela.",
"inlineInstallExtension": "Instalar agora",
"internalError": "Oops! Alguma coisa está errada. O seguinte erro ocorreu: {{error}}",
"internalErrorTitle": "Erro interno",
"kickMessage": "Você pode contatar com {{participantDisplayName}} para obter mais detalhes.",
@@ -219,7 +190,6 @@
"kickParticipantTitle": "Chutar este participante?",
"kickTitle": "Ai! {{participantDisplayName}} expulsou você da reunião",
"liveStreaming": "Transmissão ao Vivo",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Não é possível transmitir enquanto a gravação está ativa",
"liveStreamingDisabledForGuestTooltip": "Visitantes não podem iniciar transmissão ao vivo.",
"liveStreamingDisabledTooltip": "Iniciar transmissão ao vivo desativada.",
"lockMessage": "Falha ao travar a conferência.",
@@ -235,12 +205,6 @@
"micNotSendingDataTitle": "Seu microfone está mudo pelas configurações do sistema",
"micPermissionDeniedError": "Não foi permitido acessar o seu microfone. Você ainda pode entrar na conferência, mas sem enviar áudio. Clique no botão do microfone para tentar reparar.",
"micUnknownError": "Não pode usar o microfone por uma razão desconhecida.",
"muteEveryoneElseDialog": "Uma vez silenciados, você não poderá reativar o som deles, mas eles poderão reativar o som a qualquer momento.",
"muteEveryoneElseTitle": "Silenciar todo mundo exceto {{whom}}?",
"muteEveryoneDialog": "Tem certeza que deseja silenciar todos? Você não poderá ativar o som deles, mas eles podem ativar o som eles mesmo a qualquer momento.",
"muteEveryoneTitle": "Silenciar todos?",
"muteEveryoneSelf": "a si próprio",
"muteEveryoneStartMuted": "Todos iniciam silenciados daqui para frente",
"muteParticipantBody": "Você não está habilitado para tirar o mudo deles, mas eles podem tirar o mudo deles mesmos a qualquer tempo.",
"muteParticipantButton": "Mudo",
"muteParticipantDialog": "Tem certeza de que deseja silenciar este participante? Você não poderá desfazer isso, mas o participante pode reabilitar o áudio a qualquer momento.",
@@ -252,9 +216,7 @@
"passwordRequired": "$t(lockRoomPasswordUppercase) requerido",
"popupError": "Seu navegador está bloqueando janelas popup deste site. Habilite os popups nas configurações de segurança no seu navegador e tente novamente.",
"popupErrorTitle": "Popup bloqueado",
"readMore": "mais...",
"recording": "Gravando",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Não é possível transmitir enquanto a gravação está ativa",
"recordingDisabledForGuestTooltip": "Visitantes não podem iniciar gravações.",
"recordingDisabledTooltip": "Iniciar gravação desativada.",
"rejoinNow": "Reconectar agora",
@@ -266,15 +228,16 @@
"remoteControlStopMessage": "A sessão de controle remoto terminou!",
"remoteControlTitle": "Conexão de área de trabalho remota",
"Remove": "Remover",
"removePassword": "Remover $t(lockRoomPassword)",
"removePassword": "Remove $t(lockRoomPassword)",
"removeSharedVideoMsg": "Deseja remover seu vídeo compartilhado?",
"removeSharedVideoTitle": "Remover vídeo compartilhado",
"reservationError": "Erro de sistema de reserva",
"reservationErrorMsg": "Código do erro: {{code}}, mensagem: {{msg}}",
"retry": "Tentar novamente",
"screenSharingAudio": "Compartilha áudio",
"screenSharingFailed": "Oops! Alguma coisa de errado aconteceu, não é possível habilitar o compartilhamento de tela!",
"screenSharingFailedTitle": "Falha ao compartilhar a tela!",
"screenSharingFailedToInstall": "Oops! Falhou a instalação da extensão de compartilhamento de tela.",
"screenSharingFailedToInstallTitle": "A extensão de compartilhamento de tela falhou ao instalar",
"screenSharingFirefoxPermissionDeniedError": "Algo deu errado enquanto estávamos tentando compartilhar sua tela. Por favor, certifique-se de que você nos deu permissão para fazê-lo. ",
"screenSharingFirefoxPermissionDeniedTitle": "Opa! Não foi possível iniciar o compartilhamento de tela!",
"screenSharingPermissionDeniedError": "Oops! Alguma coisa está errada com suas permissões de compartilhamento de tela. Recarregue e tente de novo.",
"sendPrivateMessage": "Você enviou uma mensagem privada recentemente. Tem intenção de responder em privado, ou deseja enviar sua mensagem para o grupo?",
"sendPrivateMessageCancel": "Enviar para o grupo",
@@ -308,20 +271,21 @@
"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 anfitrião...",
"Yes": "Sim",
"yourEntireScreen": "Toda sua tela"
},
"yourEntireScreen": "Toda sua tela",
"screenSharingAudio": "Compartilhar áudio",
"muteEveryoneStartMuted": "Todos iniciam silenciados daqui para frente",
"muteEveryoneSelf": "a si próprio",
"muteEveryoneDialog": "Tem certeza que deseja silenciar todos? Você não poderá ativar o som deles, mas eles podem ativar o som eles mesmo a qualquer momento.",
"muteEveryoneTitle": "Silenciar todos?",
"muteEveryoneElseTitle": "Silenciar todo mundo exceto {{whom}}?",
"muteEveryoneElseDialog": "Uma vez silenciados, você não poderá reativar o som deles, mas eles poderão reativar o som a qualquer momento."
},
"dialOut": {
"statusMessage": "está agora {{status}}"
},
"documentSharing": {
"title": "Documento compartilhado"
},
"e2ee": {
"labelToolTip": "Comunição de áudio e vídeo da reunião encriptados ponto a ponto"
},
"embedMeeting": {
"title": "Reunião em formato compacto"
},
"feedback": {
"average": "Média",
"bad": "Ruim",
@@ -400,8 +364,6 @@
"videoQuality": "Gerenciar qualidade da chamada"
},
"liveStreaming": {
"limitNotificationDescriptionWeb": "Devido a alta demanda sua transmissão será limitada a {{limit}} minutos. Para transmissão ilimitada tente <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Sua transmissão será limitada a {{limit}} minutos. Para transmissão ilimitada tente {{app}}.",
"busy": "Estamos trabalhando para liberar os recursos de transmissão. Tente novamente em alguns minutos.",
"busyTitle": "Todas as transmissões estão atualmente ocupadas",
"changeSignIn": "Alternar contas.",
@@ -430,8 +392,8 @@
"start": "Iniciar uma transmissão ao vivo",
"streamIdHelp": "O que é isso?",
"unavailableTitle": "Transmissão ao vivo indisponível",
"youtubeTerms": "Termos de serviços do YouTube",
"googlePrivacyPolicy": "Política de Privacidade do Google"
"googlePrivacyPolicy": "Política de Privacidade do Google",
"youtubeTerms": "Termos de serviços do YouTube"
},
"localRecording": {
"clientState": {
@@ -494,72 +456,11 @@
"unmute": "Ativar som",
"newDeviceCameraTitle": "Nova câmera detectada",
"newDeviceAudioTitle": "Novo dispositivo de áudio detectado",
"newDeviceAction": "Usar",
"OldElectronAPPTitle": "Vulnerabilidade de segurança!",
"oldElectronClientDescription1": "Você está usando um versão antiga do cliente Jitsi Meet que possui uma conhecida vulnerabilidade de segurança. Por favor tenha certeza de atulizar para a nossa ",
"oldElectronClientDescription2": "última versão",
"oldElectronClientDescription3": " agora!"
"newDeviceAction": "Usar"
},
"passwordSetRemotely": "Definido por outro participante",
"passwordDigitsOnly": "Até {{number}} dígitos",
"poweredby": "distribuído por",
"prejoin": {
"audioAndVideoError": "Erro de áudio e vídeo error:",
"audioDeviceProblem": "Tem um problema com seu dispositivo de áudio",
"audioOnlyError": "Erro de áudio:",
"audioTrackError": "Não é possível criar a faixa de áudio.",
"calling": "Ligando",
"callMe": "Me ligue",
"callMeAtNumber": "Me ligue nesse número:",
"configuringDevices": "Configurando dispositivos...",
"connectedWithAudioQ": "Você está conectado com áudio?",
"connection": {
"good": "Sua conexão com a internet parece boa!",
"nonOptimal": "Sua conexão com a internet não é boa",
"poor": "Você tem uma conexão a internet ruim"
},
"connectionDetails": {
"audioClipping": "Espera-se um áudio que pique.",
"audioHighQuality": "Espera-se um áudio de excelente qualidade.",
"audioLowNoVideo": "Espera-se uma qualidade baixa de áudio e sem vídeo.",
"goodQuality": "Muito bom! Qualidade da mídia será muito boa.",
"noMediaConnectivity": "Não conseguimos estabelcer conexão com as mídias para o teste. Normalmente é um problema de firewall ou NAT.",
"noVideo": "Espera-se um vídeo de qualidade ruim.",
"undetectable": "Se você continuar fazendo a chamada no browser, recomenda-se que o alto-falante, microfones e câmera estejam corretamente configurados, que você permitiu que o browser acesse seu microfone e câmera, e o browser esteja atualizado. Se ainda assim tenha problemas na chamada, contacte o desenvolvedor da aplicação.",
"veryPoorConnection": "Espera-se que a qualidade da chamada seja ruim.",
"videoFreezing": "Espera-se um vídeo congelado, preto ou pixelado.",
"videoHighQuality": "Espera-se um vídeo de boa qualidade.",
"videoLowQuality": "Espera-se um vídeo de baixa qualidade em termos de taxa de frame e resolução.",
"videoTearing": "Espera-se um vídeo pixelado ou com artefatos visuais."
},
"copyAndShare": "Copiar e compartilhar o link da reunião",
"dialInMeeting": "Discar para a reunião",
"dialInPin": "Discar para a reunião e inserir o código PIN:",
"dialing": "Discando",
"doNotShow": "Não mostre esta tela novamente",
"errorDialOut": "Não é possível discar",
"errorDialOutDisconnected": "Não é possível discar. Desconectando",
"errorDialOutFailed": "Não é possível discar. Chamada finalizada",
"errorDialOutStatus": "Erro ao tentar discar",
"errorMissingName": "Por favor entre com seu nome para participar da reunião",
"errorStatusCode": "Erro ao discar, código de estado: {{status}}",
"errorValidation": "Validação do número falhou",
"iWantToDialIn": "Eu quere discar",
"joinAudioByPhone": "Participar com o áudio via ligação",
"joinMeeting": "Particar da reunião",
"joinWithoutAudio": "Particar sem áudio",
"initiated": "Chamada iniciada",
"linkCopied": "Link copiado para a área de transferência",
"lookGood": "Seu microfone está funcionando corretamente",
"or": "ou",
"premeeting": "Pré-reunião",
"showScreen": "Habiltar tela pré-reunião",
"startWithPhone": "Iniciar com o áudio da ligação",
"screenSharingError": "Erro de compartilhamento de tela:",
"videoOnlyError": "Erro de vídeo:",
"videoTrackError": "Não é possível criar faixa de vídeo.",
"viewAllNumbers": "veja todos os números"
},
"presenceStatus": {
"busy": "Ocupado",
"calling": "Chamando...",
@@ -582,8 +483,6 @@
},
"raisedHand": "Gostaria de falar",
"recording": {
"limitNotificationDescriptionWeb": "Devido a demanda, sua gravação ficará limitada a {{limit}} minutos. Para gravação ilimitada tente <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Devido a demanda, sua gravação ficará limitada a {{limit}} minutos. Para gravação ilimitada tente <3>{{app}}</3>.",
"authDropboxText": "Enviar para o Dropbox",
"availableSpace": "Espaço disponível: {{spaceLeft}} MB (aproximadamente {{duration}} minutos de gravação)",
"beta": "BETA",
@@ -614,9 +513,9 @@
"pullToRefresh": "Puxe para atualizar"
},
"security": {
"about": "Voce pode adicionar $t(lockRoomPassword) a sua reunião. Participantes terão que fornecer $t(lockRoomPassword) antes de entrar na reunião.",
"aboutReadOnly": "Moderadores podem adicionar $t(lockRoomPassword) à reunião. Participantes terão que fornecer $t(lockRoomPassword) antes de entrar na reunião.",
"insecureRoomNameWarning": "A sala é insegura. Participantes não desejados podem entrar na reunião. Considere adicionar seguança no botão segurança.",
"about": "Voce pode adicionar uma $t(lockRoomPassword) em sua reunião. Participantes irão precisar informar a $t(lockRoomPassword) antes de se juntarem na reunião.",
"aboutReadOnly": "Moderadores podem adicionar uma $t(lockRoomPassword) na reunião. Participantes irão precisar informar a $t(lockRoomPassword) antes de se juntarem na reunião",
"insecureRoomNameWarning": "Essa sala não está protegida. Participantes indesejados poderão entrar na sua reunião. Considere configurar a segurança da sua reunião utilizando o botão de segurança.",
"securityOptions": "Opções de segurança"
},
"settings": {
@@ -631,7 +530,6 @@
"followMe": "Todos me seguem",
"language": "Idioma",
"loggedIn": "Conectado como {{name}}",
"microphones": "Microfones",
"moderator": "Moderador",
"more": "Mais",
"name": "Nome",
@@ -639,23 +537,21 @@
"selectAudioOutput": "Saída de áudio",
"selectCamera": "Câmera",
"selectMic": "Microfone",
"speakers": "Alto-faltantes",
"startAudioMuted": "Todos iniciam mudos",
"startVideoMuted": "Todos iniciam ocultos",
"title": "Configurações"
"title": "Configurações",
"speakers": "Alto-faltantes",
"microphones": "Microfones"
},
"settingsView": {
"advanced": "Avançado",
"alertOk": "OK",
"alertCancel": "Cancelar",
"alertTitle": "Atenção",
"alertURLText": "A URL digitada do servidor é inválida",
"buildInfoSection": "Informações de compilação",
"conferenceSection": "Conferência",
"disableCallIntegration": "Desativar integração de chamada nativa",
"disableP2P": "Desativar modo ponto a ponto",
"disableCrashReporting": "Desabilitar aviso de falha",
"disableCrashReportingWarning": "Tem certeza eue quer desabilitar o aviso de falha? A opção será habilitada após reiniciar o app.",
"displayName": "Nome de exibição",
"email": "E-mail",
"header": "Configurações",
@@ -697,29 +593,23 @@
"chat": "Alternar para janela de chat",
"document": "Alternar para documento compartilhado",
"download": "Baixe nossos aplicativos",
"embedMeeting": "Reunião em modo compacto",
"feedback": "Deixar feedback",
"fullScreen": "Alternar para tela cheia",
"grantModerator": "Atribuir Moderador",
"hangup": "Sair da chamada",
"help": "Ajuda",
"invite": "Convidar pessoas",
"kick": "Remover participante",
"lobbyButton": "Habilitar/desabilitar sala de espera",
"localRecording": "Alternar controles de gravação local",
"lockRoom": "Ativar/desativar senha de reunião",
"moreActions": "Alternar mais menu de ações",
"moreActionsMenu": "Menu de mais ações",
"moreOptions": "Mostrar mais opções",
"mute": "Alternar mudo do áudio",
"muteEveryone": "Silenciar todos",
"pip": "Alternar modo Picture-in-Picture",
"privateMessage": "Enviar mensagem privada",
"profile": "Editar seu perfil",
"raiseHand": "Alternar levantar a mão",
"recording": "Alternar gravação",
"remoteMute": "Silenciar participante",
"security": "Opções de segurança",
"Settings": "Alternar configurações",
"sharedvideo": "Alternar compartilhamento de vídeo do YouTube",
"shareRoom": "Convidar alguém",
@@ -729,9 +619,11 @@
"speakerStats": "Alternar estatísticas do apresentador",
"tileView": "Alternar visualização em blocos",
"toggleCamera": "Alternar câmera",
"toggleFilmstrip": "Alterar tira de filme",
"videomute": "Alternar mudo do vídeo",
"videoblur": "Alternar desfoque de vídeo"
"videoblur": "Alternar desfoque de vídeo",
"toggleFilmstrip": "Alterar tira de filme",
"muteEveryone": "Silenciar todos",
"moreOptions": "Mostrar mais opções"
},
"addPeople": "Adicionar pessoas à sua chamada",
"audioOnlyOff": "Desabilitar modo de largura de banda baixa",
@@ -744,8 +636,6 @@
"documentClose": "Fechar documento compartilhado",
"documentOpen": "Abrir documento compartilhado",
"download": "Baixe nossos aplicativos",
"e2ee": "Encriptação ponto a ponto",
"embedMeeting": "Reunião em formato compacto",
"enterFullScreen": "Ver em tela cheia",
"enterTileView": "Entrar em exibição de bloco",
"exitFullScreen": "Sair da tela cheia",
@@ -754,29 +644,20 @@
"hangup": "Sair",
"help": "Ajuda",
"invite": "Convidar pessoas",
"lobbyButtonDisable": "Desabilitar sala de espera",
"lobbyButtonEnable": "Habilitar sala de espera",
"login": "Iniciar sessão",
"logout": "Encerrar sessão",
"lowerYourHand": "Baixar a mão",
"moreActions": "Mais ações",
"moreOptions": "Mais opções",
"mute": "Mudo / Não mudo",
"muteEveryone": "Silenciar todos",
"noAudioSignalTitle": "Não há entrada de áudio vindo do seu microfone!",
"noAudioSignalDesc": "Se você não o desativou propositalmente das configurações do sistema ou do hardware, considere trocar o dispositivo.",
"noAudioSignalDescSuggestion": "Se você não o desativou propositalmente das configurações do sistema ou do hardware, considere trocar para o dispositivo sugerido.",
"noAudioSignalDialInDesc": "Você também pode discar usando:",
"noAudioSignalDialInLinkDesc": "Discar números",
"noisyAudioInputTitle": "O seu microfone parece estar barulhento!",
"noisyAudioInputDesc": "Parece que o microfone está fazendo barulho, considere silenciar ou alterar o dispositivo.",
"openChat": "Abrir chat",
"pip": "Entrar em modo Quadro-a-Quadro",
"privateMessage": "Enviar mensagem privada",
"profile": "Editar seu perfil",
"raiseHand": "Erguer / Baixar sua mão",
"raiseYourHand": "Levantar a mão",
"security": "Opções de segurança",
"Settings": "Configurações",
"sharedvideo": "Compartilhar um vídeo do YouTube",
"shareRoom": "Convidar alguém",
@@ -792,7 +673,13 @@
"toggleCamera": "Alternar câmera",
"videomute": "Iniciar ou parar a câmera",
"startvideoblur": "Desfocar meu plano de fundo",
"stopvideoblur": "Desativar desfoque de fundo"
"stopvideoblur": "Desativar desfoque de fundo",
"noisyAudioInputDesc": "Parece que o microfone está fazendo barulho, considere silenciar ou alterar o dispositivo.",
"noisyAudioInputTitle": "O seu microfone parece estar barulhento!",
"noAudioSignalDialInLinkDesc": "Discar números",
"noAudioSignalDialInDesc": "Você também pode discar usando:",
"muteEveryone": "Silenciar todos",
"moreOptions": "Mais opções"
},
"transcribing": {
"ccButtonTooltip": "Iniciar/parar legendas",
@@ -848,16 +735,15 @@
},
"videothumbnail": {
"domute": "Mudo",
"domuteOthers": "Silenciar todos os demais",
"flip": "Inverter",
"grantModerator": "Atribuir Moderador",
"kick": "Expulsar",
"moderator": "Moderador",
"mute": "Participante está mudo",
"muted": "Mudo",
"remoteControl": "Controle remoto",
"show": "Mostrar no palco",
"videomute": "O participante parou a câmera"
"videomute": "O participante parou a câmera",
"domuteOthers": "Silenciar todos os demais"
},
"welcomepage": {
"accessibilityLabel": {
@@ -873,33 +759,36 @@
"connectCalendarButton": "Conectar seu calendário",
"connectCalendarText": "Conecte seu calendário para ver todas as reuniões em {{app}}. Além disso, adicione reuniões de {{provider}} ao seu calendário e inicie-as com apenas um clique.",
"enterRoomTitle": "Iniciar uma nova reunião",
"getHelp": "Obter ajuda",
"roomNameAllowedChars": "Nome da reunião não deve conter qualquer um destes caracteres: ?. &, :, ', \", %, #.",
"go": "IR",
"goSmall": "IR",
"join": "CRIAR / ENTRAR",
"info": "Informações",
"moderatedMessage": "Ou <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">agende uma URL de reunião</a> antes, onde você é o único moderador.",
"privacy": "Política de Privacidade",
"recentList": "Recente",
"recentListDelete": "Remover",
"recentListEmpty": "Sua lista recente está vazia. As reuniões que você realizar serão exibidas aqui.",
"reducedUIText": "Bem-vindo ao {{app}}!",
"roomNameAllowedChars": "Nome da reunião não deve conter qualquer um destes caracteres: ?. &, :, ', \", %, #.",
"roomname": "Digite o nome da sala",
"roomnameHint": "Digite o nome ou a URL da sala que você deseja entrar. Você pode digitar um nome, e apenas deixe para as pessoas que você quer se reunir digitem o mesmo nome.",
"sendFeedback": "Enviar comentários",
"terms": "Termos",
"title": "Videoconferências mais seguras, flexíveis e totalmente gratuitas"
"title": "Videoconferências mais seguras, flexíveis e totalmente gratuitas",
"getHelp": "Obter ajuda"
},
"helpView": {
"header": "Centro de ajuda"
},
"lonelyMeetingExperience": {
"youAreAlone": "Você é o único na reunião",
"button": "Convidar outros"
},
"helpView": {
"header": "Centro de ajuda"
"chromeExtensionBanner": {
"dontShowAgain": "Não me mostre isso de novo",
"buttonText": "Instalar extensão do Chrome",
"installExtensionText": "Instale a extensão para integrar com Google Calendar e Office 365"
},
"lobby": {
"knockingParticipantList": "Remover lista de participantes",
"allow": "Permitir",
"backToKnockModeButton": "Sem senha, peça para se juntar",
"dialogTitle": "modo Lobby",
@@ -921,11 +810,6 @@
"knockButton": "Peça para participar",
"knockTitle": "Alguém deseja participar da conferência",
"nameField": "Informe seu nome",
"notificationLobbyAccessDenied": "{{targetParticipantName}} foi rejeitado por {{originParticipantName}}",
"notificationLobbyAccessGranted": "{{targetParticipantName}} foi aceito por {{originParticipantName}}",
"notificationLobbyDisabled": "Sala de Espera foi desabilitada por {{originParticipantName}}",
"notificationLobbyEnabled": "Sala de Espera foi habilitada por {{originParticipantName}}",
"notificationTitle": "Sala de espera",
"passwordField": "Informe a senha da conferência",
"passwordJoinButton": "Solicitar",
"reject": "Rejeitar",

View File

@@ -824,7 +824,7 @@
"stopvideoblur": "Отключить размытие фона",
"talkWhileMutedPopup": "Пытаетесь говорить? У вас отключен звук.",
"tileViewToggle": "Вкл/выкл плитку",
"toggleCamera": "Переключить камеру",
"toggleCamera": "Вкл/выкл камеру",
"videomute": "Камера"
},
"transcribing": {

View File

@@ -320,7 +320,7 @@
"liveStreamURL": "Livesändning:",
"moreNumbers": "Fler nummer",
"noNumbers": "Inga inringningsnummer.",
"noPassword": "Inget lösenord",
"noPassword": "Inga enheter",
"noRoom": "Inget rum specificerades för inringning.",
"numbers": "Inringningsnummer",
"password": "$t(lockRoomPasswordUppercase):",

View File

@@ -1,36 +1,21 @@
{
"addPeople": {
"add": "添加",
"addContacts": "添加联系人",
"copyInvite": "复制邀请链接",
"copyLink": "复制会议链接",
"copyStream": "复制直播链接",
"countryNotSupported": "当前国家暂时未被支持。",
"countryReminder": "尝试在美国之外通话?请检查国家代码!",
"defaultEmail": "默认邮箱",
"disabled": "关闭",
"failedToAdd": "添加失败",
"footerText": "底部文本",
"googleEmail": "Google 邮箱",
"inviteMoreHeader": "会议中仅你一人",
"inviteMoreMailSubject": "加入 {{appName}} 会议",
"inviteMorePrompt": "邀请更多人",
"linkCopied": "链接已经复制到剪切板",
"loading": "正在加载",
"loadingNumber": "正在加载号码",
"loadingPeople": "正在加载会议人员",
"noResults": "没有找到查询结果",
"noValidNumbers": "无效号码",
"outlookEmail": "Outlook 邮箱",
"searchNumbers": "查询号码",
"searchPeople": "查找人员",
"searchPeopleAndNumbers": "搜索成员或添加其电话号码",
"shareInvite": "分享会议邀请链接",
"shareLink": "分享会议链接以邀请其他人",
"shareStream": "分享直播链接",
"telephone": "电话号码: {{number}}",
"title": "会议标题",
"yahooEmail": "Yahoo 邮箱"
"title": "会议标题"
},
"audioDevices": {
"bluetooth": "蓝牙",
@@ -75,9 +60,9 @@
"you": "您"
},
"chromeExtensionBanner": {
"installExtensionText": "安装用于Google日历和Office 365集成的扩展插件",
"buttonText": "安装谷歌浏览器扩展插件",
"dontShowAgain": "不再展示"
"installExtensionText": "",
"buttonText": "",
"dontShowAgain": ""
},
"connectingOverlay": {
"joiningRoom": "会议连接中…"
@@ -92,26 +77,18 @@
"DISCONNECTED": "已断开连接",
"DISCONNECTING": "断开连接中",
"ERROR": "错误",
"FETCH_SESSION_ID": "获取 session-id...",
"GET_SESSION_ID_ERROR": "获取 session-id 错误: {{code}}",
"GOT_SESSION_ID": "获取 session-id... 完成",
"LOW_BANDWIDTH": "关闭 {{displayName}} 的视频以节省带宽"
"RECONNECTING": "网络错误,重连中。。。"
},
"connectionindicator": {
"address": "地址:",
"bandwidth": "估计带宽:",
"bitrate": "比特率:",
"bridgeCount": "服务器数量:",
"codecs": "编解码器A / V",
"connectedTo": "连接到:",
"e2e_rtt": "端到端时延 RTT:",
"framerate": "帧率:",
"less": "显示更少",
"localaddress": "本地地址:",
"localaddress_plural": "本地地址:",
"localport": "本地端口:",
"localport_plural": "本地端口:",
"maxEnabledResolution": "发送最大",
"more": "显示更多",
"packetloss": "丢包:",
"quality": {
@@ -122,13 +99,10 @@
"poor": "差"
},
"remoteaddress": "远程地址:",
"remoteaddress_plural": "远程地址:",
"remoteport": "远程端口:",
"remoteport_plural": "远程端口:",
"resolution": "分辨率:",
"status": "连接:",
"transport": "传输:",
"transport_plural": "传输:"
"transport": "传输:"
},
"dateUtils": {
"earlier": "更早的",
@@ -137,18 +111,16 @@
},
"deepLinking": {
"appNotInstalled": "您需要在手机上安装 {{app}} 这个应用才能参加会议。",
"description": "无响应?正在尝试启动桌面 {{app}} 召开会议。重试或启动网页版 {{app}} 召开会议。",
"description": "无响应?正在尝试启动桌面{{app}}召开会议。重试或启动网页版{{app}}召开会议。",
"descriptionWithoutWeb": "无响应?已尝试启动客户端{{app}}召开会议。",
"downloadApp": "下载应用",
"ifDoNotHaveApp": "尚未安装此 APP:",
"ifHaveApp": "如果您已经拥有该 APP:",
"joinInApp": "使用 APP 参加会议",
"launchWebButton": "在网页中启动",
"openApp": "继续",
"title": "在 {{app}}中登录会议…",
"tryAgainButton": "请尝试重启桌面版应用程序"
},
"defaultLink": "例如 {{url}}",
"defaultNickname": "例如 视频会议开发者",
"defaultNickname": "例如 星视通",
"deviceError": {
"cameraError": "无法访问您的摄像头",
"cameraPermission": "无法获得摄像头访问权限",
@@ -165,7 +137,6 @@
"accessibilityLabel": {
"liveStreaming": "流媒体直播"
},
"add": "添加",
"allow": "允许",
"alreadySharedVideoMsg": "另一位参与者已经在分享视频了,这次会议一次只允许一个人分享视频。",
"alreadySharedVideoTitle": "只能共享一个视频",
@@ -191,22 +162,21 @@
"connectErrorWithMsg": "发生错误,无法连接至会议: {{msg}}",
"connecting": "连接中",
"contactSupport": "联系我们",
"copied": "已复制",
"copy": "复制",
"dismiss": "解除,离开",
"displayNameRequired": "嗨! 你叫什么名字?",
"done": "完成",
"e2eeDescription": "端到端加密目前是实验性的。请记住,启用端到端加密将有效地禁用服务器端提供的服务,例如:录制,实时流和电话参与。还请记住,该会议仅适用于从浏览器加入,且支持视频流传输的参会者。",
"e2eeLabel": "开启端到端加密",
"e2eeWarning": "警告: 并非所有会议参与者都支持端到端加密。如果启用它,他们将无法看到您或听到您的声音。",
"enterDisplayName": "请输入您的名称",
"error": "错误",
"grantModeratorDialog": "您确定要让此参会者成为主持人吗?",
"grantModeratorTitle": "授权为主持人",
"externalInstallationMsg": "您需要安装桌面共享扩展",
"externalInstallationTitle": "需要扩展程序",
"goToStore": "跳转至应用商店",
"gracefulShutdown": "服务器正在维护,请稍后再试。",
"IamHost": "我是主持人。",
"incorrectRoomLockPassword": "密码错误",
"incorrectPassword": "错误的用户名或者密码",
"inlineInstallationMsg": "您需要安装桌面共享扩展",
"inlineInstallExtension": "立刻安装",
"internalError": "哎呀!出现了点问题。错误: {{error}}",
"internalErrorTitle": "内部错误",
"kickMessage": "你可以联系{{participantDisplayName}}以了解更多信息。",
@@ -215,7 +185,6 @@
"kickParticipantTitle": "静音该与会者吗?",
"kickTitle": "对不起,您被 {{participantDisplayName}} 踢出了会议。",
"liveStreaming": "流媒体直播中",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "录制处于活动状态时无法启动流媒体直播",
"liveStreamingDisabledForGuestTooltip": "访客无法启动流媒体直播。",
"liveStreamingDisabledTooltip": "禁止启动流媒体。",
"lockMessage": "锁定会议失败。",
@@ -231,12 +200,6 @@
"micNotSendingDataTitle": "您的麦克风被系统静音",
"micPermissionDeniedError": "您未授权使用麦克风,您仍可参加会议但是其他人无法听到,使用地址栏里的摄像头按钮来启动麦克风。",
"micUnknownError": "未知错误,麦克风不可用。",
"muteEveryoneElseDialog": "静音后,您将无法对其进行静音,但是他们可以随时对自己进行静音。",
"muteEveryoneElseTitle": "静音其他人除了 {{whom}}?",
"muteEveryoneDialog": "您确定要让所有人静音吗?您将无法取消静音,但是他们可以随时取消静音。",
"muteEveryoneTitle": "静音所有人?",
"muteEveryoneSelf": "自己",
"muteEveryoneStartMuted": "从现在起,所有人开始静音",
"muteParticipantBody": "您无法对他们解除静音,但是他们自己可以随时解除静音。",
"muteParticipantButton": "静音",
"muteParticipantDialog": "您确定要将此参与者静音吗?您将无法取消静音,但他们可以随时取消静音。",
@@ -248,15 +211,13 @@
"passwordRequired": "需 $t(lockRoomPasswordUppercase)",
"popupError": "您的浏览器在此网站上阻止了弹出式窗口。请在浏览器的安全设置中打开它并再试一次。",
"popupErrorTitle": "弹出窗口被拦截",
"readMore": "更多",
"recording": "录制中",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "直播时无法使用录制功能",
"recordingDisabledForGuestTooltip": "访客无法开启录制。",
"recordingDisabledTooltip": "开始录制被禁用。",
"rejoinNow": "马上重新加入",
"remoteControlAllowedMessage": "{{user}} 接受了您的远程控制请求",
"remoteControlDeniedMessage": "{{user}} 拒绝了您的远程控制请求",
"remoteControlErrorMessage": "在尝试向 {{user}} 请求远程控制权限时发生了一个错误!",
"remoteControlErrorMessage": "在尝试向{{user}}请求远程控制权限时发生了一个错误!",
"remoteControlRequestMessage": "你允许 {{user}} 远程控制你的桌面吗?",
"remoteControlShareScreenWarning": "注意:如果按下“允许”你将共享你的屏幕!",
"remoteControlStopMessage": "远程控制结束!",
@@ -268,14 +229,15 @@
"reservationError": "预定系统错误",
"reservationErrorMsg": "错误代号: {{code}}, 提示信息: {{msg}}",
"retry": "重试",
"screenSharingAudio": "共享音频",
"screenSharingFailed": "哎呀!发生了错误,我们无法启动屏幕共享!",
"screenSharingFailedTitle": "屏幕共享失败!",
"screenSharingFailedToInstall": "哎呀!屏幕共享插件安装失败。",
"screenSharingFailedToInstallTitle": "屏幕共享插件安装失败",
"screenSharingFirefoxPermissionDeniedError": "尝试进行屏幕共享时遇到了问题。请确认给予了相应的权限。",
"screenSharingFirefoxPermissionDeniedTitle": "哎呀!我们无法启动屏幕共享!",
"screenSharingPermissionDeniedError": "哎呀!您的屏幕共享插件似乎遇到了权限问题。请刷新页面并重试。",
"sendPrivateMessage": "您最近收到了一条私人留言。您是否打算私下回复此消息,或者要将消息发送给该群组?",
"sendPrivateMessageCancel": "发送到群组",
"sendPrivateMessageOk": "私下发送",
"sendPrivateMessageTitle": "私下发送?",
"sendPrivateMessage": "",
"sendPrivateMessageCancel": "",
"sendPrivateMessageOk": "",
"sendPrivateMessageTitle": "",
"serviceUnavailable": "服务不可用",
"sessTerminated": "会话结束",
"Share": "分享",
@@ -310,13 +272,7 @@
"statusMessage": "现在状态为 {{status}}"
},
"documentSharing": {
"title": "共享文件"
},
"e2ee": {
"labelToolTip": "此呼叫上的音频和视频通信已进行端到端加密"
},
"embedMeeting": {
"title": "嵌入会议"
"title": ""
},
"feedback": {
"average": "平均",
@@ -348,11 +304,11 @@
"dialInTollFree": "免费电话",
"genericError": "糟糕!出错了。",
"inviteLiveStream": "若要查看此会议的实时直播,请单击此链接:{{url}}",
"invitePhone": "要通过电话加入,请输入:{{number}}{{conferenceID}}\n",
"invitePhoneAlternatives": "寻找其他拨入号码?\n查看会议拨入号码{{url}}\n\n\n如果还通过会议内电话拨入则在不连接音频的情况下加入{{silentUrl}}",
"invitePhone": "",
"invitePhoneAlternatives": "",
"inviteURLFirstPartGeneral": "您被邀请加入一个会议。",
"inviteURLFirstPartPersonal": "{{name}} 正在邀请您加入一个会议。\n",
"inviteURLSecondPart": "\n加入会议\n{{url}}\n",
"inviteURLSecondPart": "",
"liveStreamURL": "直播:",
"moreNumbers": "更多成员",
"noNumbers": "无呼入号码。",
@@ -396,8 +352,6 @@
"videoQuality": "管理通话质量"
},
"liveStreaming": {
"limitNotificationDescriptionWeb": "由于需求量大,您的流媒体传输将被限制为 {{limit}} 分钟。若想不限流,请尝试<a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>。",
"limitNotificationDescriptionNative": "您的流媒体传输将被限制为 {{limit}} 分钟。若想不限流,请尝试 {{app}}。",
"busy": "我们正在释放串流资源。请几分钟后再试。",
"busyTitle": "所有的串流设备正忙",
"changeSignIn": "切换帐号",
@@ -406,7 +360,7 @@
"enterStreamKey": "在此输入您的 YouTube 串流密钥。",
"error": "流媒体直播失败。请重试。",
"errorAPI": "在访问您的 YouTube 直播服务时发生问题。请重新登录。",
"errorLiveStreamNotEnabled": " {{email}} 未启用流媒体直播。请使用流媒体直播或登录启用了流媒体直播的帐户。",
"errorLiveStreamNotEnabled": "{{email}} 未启用流媒体直播。请使用流媒体直播或登录启用了流媒体直播的帐户。",
"expandedOff": "流媒体直播已被关闭",
"expandedOn": "会议当前正在YouTube上直播。",
"expandedPending": "启动直播中。。。",
@@ -414,9 +368,9 @@
"getStreamKeyManually": "我们无法获取任何直播。尝试从YouTube获取流媒体直播密钥。",
"invalidStreamKey": "流媒体直播密钥可能不正确。",
"off": "流媒体直播已停止",
"offBy": "{{name}}停止了直播",
"offBy": "",
"on": "流媒体直播中",
"onBy": "{{name}}开起了直播",
"onBy": "",
"pending": "启动流媒体。。。",
"serviceName": "直播服务",
"signedInAs": "您当前登录为:",
@@ -425,9 +379,7 @@
"signOut": "登出",
"start": "开始",
"streamIdHelp": "这是什么?",
"unavailableTitle": "流媒体直播不可用",
"youtubeTerms": "YouTube 服务条款",
"googlePrivacyPolicy": "Google 隐私权政策"
"unavailableTitle": "流媒体直播不可用"
},
"localRecording": {
"clientState": {
@@ -467,95 +419,34 @@
"connectedTwoMembers": "{{first}} 和 {{second}} 加入会议",
"disconnected": "已断开连接",
"focus": "会议聚焦",
"focusFail": "{{component}} 不可用 - 在 {{ms}} 秒后重试",
"grantedTo": "主持权限已授予 {{to}}",
"focusFail": "{{component}} 不可用 - 在{{ms}}秒后重试",
"grantedTo": "主持权限已授予{{to}}",
"invitedOneMember": "{{name}} 已被邀请",
"invitedThreePlusMembers": "邀请了 {{name}} 和另外 {{count}} 个人",
"invitedTwoMembers": " {{first}} 和 {{second}} 已被邀请",
"kickParticipant": " {{kick}} 踢了 {{kicked}}",
"invitedThreePlusMembers": "",
"invitedTwoMembers": "",
"kickParticipant": "",
"me": "自己",
"moderator": "已授权主持人权限!",
"muted": "您已经开始了通话,并处于静音状态。",
"mutedTitle": "您已被静音!",
"mutedRemotelyTitle": "{{participantDisplayName}} 已使您静音!",
"mutedRemotelyDescription": "准备讲话时,您可以随时取消静音。完成后将其静音以使会议远离喧嚣。",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) 被另一位参会者删除",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) 被另一位参会者设置",
"mutedRemotelyTitle": "",
"mutedRemotelyDescription": "",
"passwordRemovedRemotely": "",
"passwordSetRemotely": "",
"raisedHand": "{{name}} 想要发言。",
"somebody": "某人",
"startSilentTitle": "您加入时没有音频输出!",
"startSilentDescription": "重新加入会议以启用音频",
"suboptimalBrowserWarning": "我们担心您的会议体验在这里不会那么好。我们正在寻找改善此问题的方法,但是在此之前,请尝试使用<a href='{{recommendedBrowserPageLink}}' target='_blank'>完全兼容的浏览器</a>。",
"startSilentTitle": "",
"startSilentDescription": "",
"suboptimalBrowserWarning": "",
"suboptimalExperienceTitle": "浏览器警告",
"unmute": "取消静音",
"unmute": "",
"newDeviceCameraTitle": "检测到新相机",
"newDeviceAudioTitle": "检测到新音频设备",
"newDeviceAction": "使用",
"OldElectronAPPTitle": "安全漏洞!",
"oldElectronClientDescription1": "您似乎正在使用具有已知安全漏洞的Jitsi Meet客户端的旧版本。请确保您更新到最新版本",
"oldElectronClientDescription2": "最新版本",
"oldElectronClientDescription3": " 现在!"
"newDeviceAction": "使用"
},
"passwordSetRemotely": "由其他与会者设置",
"passwordDigitsOnly": "最多 {{number}} 位数字",
"passwordDigitsOnly": "",
"poweredby": "技术支持",
"prejoin": {
"audioAndVideoError": "音频和视频错误:",
"audioDeviceProblem": "您的音频设备有问题",
"audioOnlyError": "音频错误:",
"audioTrackError": "无法创建音轨。",
"calling": "拨号",
"callMe": "打给我",
"callMeAtNumber": "用这个号码打给我:",
"configuringDevices": "配置设备...",
"connectedWithAudioQ": "您连接了音频吗?",
"connection": {
"good": "网络信号好",
"nonOptimal": "网络信号一般",
"poor": "网络信号差"
},
"connectionDetails": {
"audioClipping": "音频信号差,可能被剪切忽略。",
"audioHighQuality": "音频质量好",
"audioLowNoVideo": "音频质量低并且没有视频。",
"goodQuality": "太棒了!您的媒体质量很好。",
"noMediaConnectivity": "媒体连接失败。可能是由防火墙或NAT引起的。",
"noVideo": "视频信号差",
"undetectable": "如果仍然无法在浏览器中正常参会建议您确保正确设置扬声器麦克风和摄像头并授予浏览器使用麦克风和摄像头的权限并且浏览器版本为最新版本。如果仍然无法通话则应与Web应用程序开发人员联系。",
"veryPoorConnection": "通话质量非常差",
"videoFreezing": "您的视频可能被冻结,变黑并被像素化。",
"videoHighQuality": "视频质量高",
"videoLowQuality": "视频帧频和分辨率较低",
"videoTearing": "视频像素化或有视觉伪像。"
},
"copyAndShare": "复制并分享会议链接",
"dialInMeeting": "拨入会议",
"dialInPin": "拨入会议并输入PIN码:",
"dialing": "拨号",
"doNotShow": "不再显示",
"errorDialOut": "无法拨出",
"errorDialOutDisconnected": "无法拨出。断线",
"errorDialOutFailed": "无法拨出。通话失败",
"errorDialOutStatus": "获取拨出状态时出错",
"errorMissingName": "请输入您的姓名参加会议",
"errorStatusCode": "拨出错误,状态码:{{status}}",
"errorValidation": "号码验证失败",
"iWantToDialIn": "我想拨入",
"joinAudioByPhone": "加入电话音频",
"joinMeeting": "参加会议",
"joinWithoutAudio": "无音频加入",
"initiated": "通话已启动",
"linkCopied": "链接已复制到剪贴板",
"lookGood": "麦克风工作正常",
"or": "或",
"premeeting": "会前",
"showScreen": "用会议前屏幕",
"startWithPhone": "使用手机音频开始",
"screenSharingError": "屏幕共享错误:",
"videoOnlyError": "视频错误:",
"videoTrackError": "无法创建视频轨道。",
"viewAllNumbers": "查看所有数字"
},
"presenceStatus": {
"busy": "忙碌",
"calling": "通话中…",
@@ -578,8 +469,6 @@
},
"raisedHand": "请求发言",
"recording": {
"limitNotificationDescriptionWeb": "由于需求量大,您的录音将被限制为 {{limit}} 分钟。对于无限录音,请尝试<a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>。",
"limitNotificationDescriptionNative": "由于需求量大,您的录音将被限制为 {{limit}} 分钟。对于无限录音,请尝试<3> {{app}} </ 3>。",
"authDropboxText": "上传至Dropbox",
"availableSpace": "可用空间:{{spaceLeft}} MB大约可录 {{duration}} 分钟) ",
"beta": "BETA",
@@ -594,9 +483,9 @@
"live": "直播",
"loggedIn": "以 {{userName}} 登录",
"off": "录制已停止",
"offBy": "{{name}} 停止了录音",
"offBy": "",
"on": "录制中",
"onBy": "{{name}} 开始录音",
"onBy": "",
"pending": "正在准备录制会议…",
"rec": "REC录制",
"serviceDescription": "录制服务将保存您的录制",
@@ -609,25 +498,18 @@
"sectionList": {
"pullToRefresh": "下拉刷新"
},
"security": {
"about": "您可以为会议添加 $t(lockRoomPassword) ,参会人员必须先提供 $t(lockRoomPassword) 才能加入会议。",
"aboutReadOnly": "主持人可以为会议添加 $t(lockRoomPassword) ,参会人员必须先提供 $t(lockRoomPassword) 才能加入会议。",
"insecureRoomNameWarning": "房间名称不安全。非法参会者可以加入您的会议。考虑使用安全按钮保护会议安全。",
"securityOptions": "安全选项"
},
"settings": {
"calendar": {
"about": "{{appName}} 的日历集成用于安全访问您的日历,以便它可以读取即将发生的事件。",
"disconnect": "断开连接",
"microsoftSignIn": "Microsoft帐号登录",
"signedIn": "目前通过 {{email}} 获取日历事件。点击下方断开连接按钮停止访问。",
"title": "题"
"signedIn": "目前通过{{email}}获取日历事件。点击下方断开连接按钮停止访问。",
"title": "题"
},
"devices": "设备",
"followMe": "分机随行",
"language": "语言",
"loggedIn": "以 {{name}} 登录",
"microphones": "移动手机",
"loggedIn": "以{{name}} 登录",
"moderator": "管理员",
"more": "更多",
"name": "名称",
@@ -635,7 +517,6 @@
"selectAudioOutput": "音频输出",
"selectCamera": "摄像头",
"selectMic": "麦克风",
"speakers": "发言人",
"startAudioMuted": "所有人开始时静音",
"startVideoMuted": "所有人开始时隐藏视频画面",
"title": "抬头"
@@ -643,15 +524,12 @@
"settingsView": {
"advanced": "高级",
"alertOk": "确认",
"alertCancel": "取消",
"alertTitle": "警告",
"alertURLText": "服务器 URL 无效",
"buildInfoSection": "生成信息",
"conferenceSection": "会议",
"disableCallIntegration": "禁用本地电话",
"disableP2P": "禁用P2P对等模式",
"disableCrashReporting": "禁用崩溃报告",
"disableCrashReportingWarning": "您确定要禁用崩溃报告吗?重启应用后生效。",
"disableCallIntegration": "",
"disableP2P": "",
"displayName": "显示名称",
"email": "电子邮件",
"header": "设置",
@@ -664,14 +542,14 @@
},
"share": {
"dialInfoText": "拨号文本",
"mainText": "点击以下链接加入会议:{{roomUrl}}"
"mainText": "点击以下链接加入会议:{{roomUrl}}\n"
},
"speaker": "发言人",
"speakerStats": {
"hours": "{{count}}",
"minutes": "{{count}}",
"hours": "{{count}}h",
"minutes": "{{count}}m",
"name": "名称",
"seconds": "{{count}}",
"seconds": "{{count}}s",
"speakerStats": "发言者状态",
"speakerTime": "发言者时间"
},
@@ -693,45 +571,38 @@
"chat": "显示 / 隐藏 聊天窗口",
"document": "开启 / 关闭 文档共享",
"download": "下载应用",
"embedMeeting": "嵌入会议",
"feedback": "提供反馈",
"fullScreen": "进入 / 退出 全屏模式",
"grantModerator": "授权主持人",
"hangup": "退出聊天室",
"help": "帮助",
"help": "",
"invite": "邀请",
"kick": "踢除成员",
"lobbyButton": "开启 / 关闭 大厅模式",
"localRecording": "显示 / 隐藏 本地录制选项",
"lockRoom": "切换会议室锁定",
"moreActions": "显示 / 隐藏 更多选择",
"moreActionsMenu": "更多选择",
"moreOptions": "更多选项",
"mute": "静音 / 取消静音",
"muteEveryone": "全员静音",
"pip": "切换子母画面模式",
"privateMessage": "",
"profile": "编辑您的简介",
"raiseHand": "举手 / 取消举手",
"recording": "开启 / 停止 视频录制",
"remoteMute": "静音与会者",
"security": "安全选项",
"Settings": "显示 / 隐藏 设置",
"sharedvideo": "开启 / 关闭 YouTube 影片分享",
"shareRoom": "邀请他人",
"shareYourScreen": "开启 / 关闭 屏幕分享",
"shortcuts": "切换快捷方式",
"show": "主屏展示",
"show": "",
"speakerStats": "显示 / 隐藏 演说者资料",
"tileView": "画面模式",
"toggleCamera": "切换相机",
"toggleFilmstrip": "切换幻灯片",
"videomute": "静音 / 取消静音",
"videoblur": "切换至视频模糊"
"videoblur": ""
},
"addPeople": "添加成员到您的通话中",
"audioOnlyOff": "禁用低带宽模式",
"audioOnlyOn": "开启低带宽模式",
"audioOnlyOff": "",
"audioOnlyOn": "",
"audioRoute": "选择音频设备",
"authenticate": "认证",
"callQuality": "管理通话质量",
@@ -740,43 +611,34 @@
"documentClose": "关闭文档共享",
"documentOpen": "开启文档共享",
"download": "下载应用",
"e2ee": "端到端加密",
"embedMeeting": "嵌入会议",
"enterFullScreen": "开启全屏",
"enterTileView": "切换视图",
"exitFullScreen": "退出全屏",
"exitTileView": "退出平铺模式",
"feedback": "提供反馈",
"hangup": "离开",
"help": "帮助",
"help": "",
"invite": "邀请",
"lobbyButtonDisable": "关闭大厅模式",
"lobbyButtonEnable": "开启大厅模式",
"login": "登录",
"logout": "登出",
"lowerYourHand": "放手",
"moreActions": "更多操作",
"moreOptions": "更多选项",
"mute": "静音 / 解除静音",
"muteEveryone": "全员静音",
"noAudioSignalTitle": "您的麦克风没有输入!",
"noAudioSignalDesc": "如果您没有特意在系统设置或硬件静音,请考虑切换设备。",
"noAudioSignalDescSuggestion": "如果您没有特意在系统设置或硬件静音,请考虑切换至指定设备。",
"noAudioSignalDialInDesc": "您也可以使用:",
"noAudioSignalDialInLinkDesc": "拨入号码",
"noisyAudioInputTitle": "您的麦克风似乎很吵!",
"noisyAudioInputDesc": "听起来您的麦克风正在发出声音,请考虑静音或更改设备。",
"noAudioSignalTitle": "",
"noAudioSignalDesc": "",
"noAudioSignalDescSuggestion": "",
"noisyAudioInputTitle": "",
"noisyAudioInputDesc": "",
"openChat": "开启聊天",
"pip": "进入子母画面模式",
"privateMessage": "发送私信",
"privateMessage": "",
"profile": "编辑您的简介",
"raiseHand": "请求 / 取消 发言",
"raiseYourHand": "举手",
"security": "安全选项",
"Settings": "设置",
"sharedvideo": "分享YouTube视频",
"shareRoom": "邀请他人",
"shortcuts": "查看快捷键",
"shortcuts": "",
"speakerStats": "发言者状态",
"startScreenSharing": "开启屏幕共享",
"startSubtitles": "开启字幕",
@@ -787,8 +649,8 @@
"tileViewToggle": "画面模式",
"toggleCamera": "切换相机",
"videomute": "开启 / 关闭 摄像头",
"startvideoblur": "开启背景模糊",
"stopvideoblur": "关闭背景模糊"
"startvideoblur": "",
"stopvideoblur": ""
},
"transcribing": {
"ccButtonTooltip": "开启 / 关闭字幕",
@@ -826,13 +688,13 @@
},
"videoStatus": {
"audioOnly": "仅语音支持",
"audioOnlyExpanded": "您处于低带宽模式。在此模式下,您将仅接收音频和屏幕共享。",
"audioOnlyExpanded": "",
"callQuality": "呼叫质量",
"hd": "高清",
"hdTooltip": "观看高清视频",
"highDefinition": "高清",
"labelTooiltipNoVideo": "无视频",
"labelTooltipAudioOnly": "低带宽模式开启",
"labelTooltipAudioOnly": "",
"ld": "低清",
"ldTooltip": "观看普清视频",
"lowDefinition": "低清",
@@ -844,16 +706,14 @@
},
"videothumbnail": {
"domute": "静音",
"domuteOthers": "静音其他人",
"flip": "翻转",
"grantModerator": "授权主持人",
"kick": "踢出",
"moderator": "管理员",
"mute": "与会者已被静音",
"muted": "已静音",
"remoteControl": "启动 / 停止 远程控制",
"show": "主屏展示",
"videomute": "参会者已关闭摄像头"
"remoteControl": "",
"show": "",
"videomute": ""
},
"welcomepage": {
"accessibilityLabel": {
@@ -869,62 +729,20 @@
"connectCalendarButton": "连接您的日历",
"connectCalendarText": "连接您的日历",
"enterRoomTitle": "开启一个新的会议",
"getHelp": "获得帮助",
"roomNameAllowedChars": "",
"go": "开始",
"goSmall": "开始",
"join": "",
"info": "信息",
"join": "创建 / 加入",
"moderatedMessage": "或<a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">提前预订会议URL </a>,您是唯一的主持人。",
"privacy": "隐私",
"recentList": "最近",
"recentListDelete": "删除",
"recentListEmpty": "目前没有使用。与你的团队成员聊天,即可在此处找到最近所有会议。",
"reducedUIText": "欢迎使用 {{app}}",
"roomNameAllowedChars": "会议名称不应包含以下任何字符:?, &, :, ', \", %, #.",
"reducedUIText": "",
"roomname": "请输入房间名",
"roomnameHint": "请输入您想加入房间的 URL 地址或者房间名。您也可以想个房名创建房间,只要其他人输入和您一样的名称就能加入您的房间。",
"sendFeedback": "发送反馈",
"terms": "条款",
"title": "安全,功能完善和完全开源的视频会议"
},
"lonelyMeetingExperience": {
"button": "邀请他人",
"youAreAlone": "您是会议中唯一的一个"
},
"helpView": {
"header": "帮助中心"
},
"lobby": {
"knockingParticipantList": "点击参会者名单",
"allow": "允许",
"backToKnockModeButton": "没有密码,询问加入",
"dialogTitle": "大厅模式",
"disableDialogContent": "大厅模式目前已启用。此功能可确保非法参会者无法加入您的会议。您要禁用它吗?",
"disableDialogSubmit": "关闭",
"emailField": "请输入邮箱",
"enableDialogPasswordField": "设置密码 (可选)",
"enableDialogSubmit": "开启",
"enableDialogText": "大厅模式可让您只允许他人在主持人正式批准后才能进入会议,从而保护您的会议。",
"enterPasswordButton": "输入会议密码",
"enterPasswordTitle": "输入密码参会",
"invalidPassword": "无效的密码",
"joiningMessage": "有人接受您的请求后,您将立即加入会议",
"joinWithPasswordMessage": "尝试使用密码参会,请稍候...",
"joinRejectedMessage": "您的参会请求已被主持人拒绝。",
"joinTitle": "加入会议",
"joiningTitle": "要求参加会议...",
"joiningWithPasswordTitle": "正在使用密码参会...",
"knockButton": "要求加入",
"knockTitle": "有人想参加会议",
"nameField": "输入你的名字",
"notificationLobbyAccessDenied": "{{targetParticipantName}} 参会请求被 {{originParticipantName}} 拒绝",
"notificationLobbyAccessGranted": "{{targetParticipantName}} 参会请求被 {{originParticipantName}} 允许",
"notificationLobbyDisabled": "大厅模式被 {{originParticipantName}} 关闭",
"notificationLobbyEnabled": "大厅模式被 {{originParticipantName}} 开启",
"notificationTitle": "大厅",
"passwordField": "输入参会密码",
"passwordJoinButton": "加入",
"reject": "拒绝",
"toggleLabel": "开启大厅模式"
}
}

View File

@@ -300,7 +300,6 @@
"tokenAuthFailedTitle": "Authentication failed",
"transcribing": "Transcribing",
"unlockRoom": "Remove meeting $t(lockRoomPassword)",
"user": "user",
"userPassword": "user password",
"WaitForHostMsg": "The conference <b>{{room}}</b> has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
"WaitForHostMsgWOk": "The conference <b>{{room}}</b> has not yet started. If you are the host then please press Ok to authenticate. Otherwise, please wait for the host to arrive.",
@@ -394,7 +393,8 @@
"toggleFilmstrip": "Show or hide video thumbnails",
"toggleScreensharing": "Switch between camera and screen sharing",
"toggleShortcuts": "Show or hide keyboard shortcuts",
"videoMute": "Start or stop your camera"
"videoMute": "Start or stop your camera",
"videoQuality": "Manage call quality"
},
"liveStreaming": {
"limitNotificationDescriptionWeb": "Due to high demand your streaming will be limited to {{limit}} min. For unlimited streaming try <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",

View File

@@ -0,0 +1,14 @@
{
"google-auth": {
"matchPatterns": {
"url": "accounts.google.com"
},
"target": "electron"
},
"dropbox-auth": {
"matchPatterns": {
"url": "dropbox.com/oauth2/authorize"
},
"target": "electron"
}
}

View File

@@ -7,6 +7,7 @@ import {
Transport
} from '../../transport';
import electronPopupsConfig from './electronPopupsConfig.json';
import {
getAvailableDevices,
getCurrentDevices,
@@ -1069,4 +1070,16 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
stopRecording(mode) {
this.executeCommand('startRecording', mode);
}
/**
* Returns the configuration for electron for the windows that are open
* from Jitsi Meet.
*
* @returns {Promise<Object>}
*
* NOTE: For internal use only.
*/
_getElectronPopupsConfig() {
return Promise.resolve(electronPopupsConfig);
}
}

View File

@@ -221,10 +221,6 @@ UI.initEtherpad = name => {
const url = new URL(name, config.etherpad_base);
APP.store.dispatch(setDocumentUrl(url.toString()));
if (config.openSharedDocumentOnJoin) {
etherpadManager.toggleEtherpad();
}
};
/**

View File

@@ -17,7 +17,6 @@ function getPasswordInputHtml() {
return `
<input name="username" type="text"
class="input-control"
data-i18n="[placeholder]dialog.user"
placeholder=${placeholder} autofocus>
<input name="password" type="password"
class="input-control"

View File

@@ -218,11 +218,21 @@ export default class LargeVideoManager {
// change the avatar url on large
this.updateAvatar();
// If the user's connection is disrupted then the avatar will be
// displayed in case we have no video image cached. That is if
// there was a user switch (image is lost on stream detach) or if
// the video was not rendered, before the connection has failed.
const wasUsersImageCached
= !isUserSwitch && container.wasVideoRendered;
const isVideoMuted = !stream || stream.isMuted();
const participant = getParticipantById(APP.store.getState(), id);
const connectionStatus = participant?.connectionStatus;
const isVideoRenderable = !isVideoMuted
&& (APP.conference.isLocalId(id) || connectionStatus === JitsiParticipantConnectionStatus.ACTIVE);
const isVideoRenderable
= !isVideoMuted
&& (APP.conference.isLocalId(id)
|| connectionStatus
=== JitsiParticipantConnectionStatus.ACTIVE
|| wasUsersImageCached);
const showAvatar
= isVideoContainer

View File

@@ -13,8 +13,6 @@ import {
JitsiParticipantConnectionStatus
} from '../../../react/features/base/lib-jitsi-meet';
import { getParticipantById } from '../../../react/features/base/participants';
import { isTestModeEnabled } from '../../../react/features/base/testing';
import { updateLastTrackVideoMediaEvent } from '../../../react/features/base/tracks';
import { PresenceLabel } from '../../../react/features/presence-status';
import { stopController, requestRemoteControl } from '../../../react/features/remote-control';
import { RemoteVideoMenuTriggerButton } from '../../../react/features/remote-video-menu';
@@ -25,15 +23,6 @@ import SmallVideo from './SmallVideo';
const logger = Logger.getLogger(__filename);
/**
* List of container events that we are going to process, will be added as listener to the
* container for every event in the list. The latest event will be stored in redux.
*/
const containerEvents = [
'abort', 'canplay', 'canplaythrough', 'emptied', 'ended', 'error', 'loadeddata', 'loadedmetadata', 'loadstart',
'pause', 'play', 'playing', 'ratechange', 'stalled', 'suspend', 'waiting'
];
/**
*
* @param {*} spanId
@@ -217,20 +206,23 @@ export default class RemoteVideo extends SmallVideo {
}
/**
* The remote video is considered "playable" once the can play event has been received.
* The remote video is considered "playable" once the can play event has been received. It will be allowed to
* display video also in {@link JitsiParticipantConnectionStatus.INTERRUPTED} if the video has received the canplay
* event and was not muted while not in ACTIVE state. This basically means that there is stalled video image cached
* that could be displayed. It's used to show "grey video image" in user's thumbnail when there are connectivity
* issues.
*
* @inheritdoc
* @override
*/
isVideoPlayable() {
const participant = getParticipantById(APP.store.getState(), this.id);
const { connectionStatus } = participant || {};
const { connectionStatus, mutedWhileDisconnected } = participant || {};
return (
super.isVideoPlayable()
&& this._canPlayEventReceived
&& connectionStatus === JitsiParticipantConnectionStatus.ACTIVE
);
return super.isVideoPlayable()
&& this._canPlayEventReceived
&& (connectionStatus === JitsiParticipantConnectionStatus.ACTIVE
|| (connectionStatus === JitsiParticipantConnectionStatus.INTERRUPTED && !mutedWhileDisconnected));
}
/**
@@ -256,8 +248,6 @@ export default class RemoteVideo extends SmallVideo {
* @param {*} stream
*/
waitForPlayback(streamElement, stream) {
$(streamElement).hide();
const webRtcStream = stream.getOriginalStream();
const isVideo = stream.isVideoTrack();
@@ -267,12 +257,7 @@ export default class RemoteVideo extends SmallVideo {
const listener = () => {
this._canPlayEventReceived = true;
logger.info(`${this.id} video is now active`, streamElement);
if (streamElement) {
$(streamElement).show();
}
this.VideoLayout.remoteVideoActive(streamElement, this.id);
streamElement.removeEventListener('canplay', listener);
// Refresh to show the video
@@ -312,6 +297,8 @@ export default class RemoteVideo extends SmallVideo {
// Put new stream element always in front
streamElement = UIUtils.prependChild(this.container, streamElement);
$(streamElement).hide();
this.waitForPlayback(streamElement, stream);
stream.attach(streamElement);
@@ -322,13 +309,6 @@ export default class RemoteVideo extends SmallVideo {
// attached we need to update the menu in order to show the volume
// slider.
this.updateRemoteVideoMenu();
} else if (isTestModeEnabled(APP.store.getState())) {
const cb = name => APP.store.dispatch(updateLastTrackVideoMediaEvent(stream, name));
containerEvents.forEach(event => {
streamElement.addEventListener(event, cb.bind(this, event));
});
}
}

View File

@@ -433,7 +433,7 @@ export default class SmallVideo {
*/
computeDisplayModeInput() {
let isScreenSharing = false;
let connectionStatus;
let connectionStatus, mutedWhileDisconnected;
const state = APP.store.getState();
const participant = getParticipantById(state, this.id);
@@ -443,6 +443,7 @@ export default class SmallVideo {
isScreenSharing = typeof track !== 'undefined' && track.videoType === 'desktop';
connectionStatus = participant.connectionStatus;
mutedWhileDisconnected = participant.mutedWhileDisconnected;
}
return {
@@ -453,6 +454,7 @@ export default class SmallVideo {
isVideoPlayable: this.isVideoPlayable(),
hasVideo: Boolean(this.selectVideoElement().length),
connectionStatus,
mutedWhileDisconnected,
canPlayEventReceived: this._canPlayEventReceived,
videoStream: Boolean(this.videoStream),
isScreenSharing,

View File

@@ -5,8 +5,7 @@ import React from 'react';
import ReactDOM from 'react-dom';
import { browser } from '../../../react/features/base/lib-jitsi-meet';
import { isTestModeEnabled } from '../../../react/features/base/testing';
import { ORIENTATION, LargeVideoBackground, updateLastLargeVideoMediaEvent } from '../../../react/features/large-video';
import { ORIENTATION, LargeVideoBackground } from '../../../react/features/large-video';
import { LAYOUTS, getCurrentLayout } from '../../../react/features/video-layout';
/* eslint-enable no-unused-vars */
import UIEvents from '../../../service/UI/UIEvents';
@@ -20,15 +19,6 @@ export const VIDEO_CONTAINER_TYPE = 'camera';
const FADE_DURATION_MS = 300;
/**
* List of container events that we are going to process, will be added as listener to the
* container for every event in the list. The latest event will be stored in redux.
*/
const containerEvents = [
'abort', 'canplay', 'canplaythrough', 'emptied', 'ended', 'error', 'loadeddata', 'loadedmetadata', 'loadstart',
'pause', 'play', 'playing', 'ratechange', 'stalled', 'suspend', 'waiting'
];
/**
* Returns an array of the video dimensions, so that it keeps it's aspect
* ratio and fits available area with it's larger dimension. This method
@@ -233,6 +223,14 @@ export class VideoContainer extends LargeContainer {
this.$remotePresenceMessage = $('#remotePresenceMessage');
/**
* Indicates whether or not the video stream attached to the video
* element has started(which means that there is any image rendered
* even if the video is stalled).
* @type {boolean}
*/
this.wasVideoRendered = false;
this.$wrapper = $('#largeVideoWrapper');
/**
@@ -241,12 +239,17 @@ export class VideoContainer extends LargeContainer {
* video anyway.
*/
this.$wrapperParent = this.$wrapper.parent();
this.avatarHeight = $('#dominantSpeakerAvatarContainer').height();
this.$video[0].onplaying = function(event) {
const onPlayingCallback = function(event) {
if (typeof resizeContainer === 'function') {
resizeContainer(event);
}
};
this.wasVideoRendered = true;
}.bind(this);
this.$video[0].onplaying = onPlayingCallback;
/**
* A Set of functions to invoke when the video element resizes.
@@ -256,14 +259,6 @@ export class VideoContainer extends LargeContainer {
this._resizeListeners = new Set();
this.$video[0].onresize = this._onResize.bind(this);
if (isTestModeEnabled(APP.store.getState())) {
const cb = name => APP.store.dispatch(updateLastLargeVideoMediaEvent(name));
containerEvents.forEach(event => {
this.$video[0].addEventListener(event, cb.bind(this, event));
});
}
}
/**
@@ -478,6 +473,10 @@ export class VideoContainer extends LargeContainer {
return;
}
// The stream has changed, so the image will be lost on detach
this.wasVideoRendered = false;
// detach old stream
if (this.stream) {
this.stream.detach(this.$video[0]);

View File

@@ -1,4 +1,4 @@
/* global APP */
/* global APP, $ */
import Logger from 'jitsi-meet-logger';
@@ -313,6 +313,15 @@ const VideoLayout = {
remoteVideo.updateView();
},
// FIXME: what does this do???
remoteVideoActive(videoElement, resourceJid) {
logger.info(`${resourceJid} video is now active`, videoElement);
if (videoElement) {
$(videoElement).show();
}
this._updateLargeVideoIfDisplayed(resourceJid, true);
},
/**
* On video muted event.
*/

52
package-lock.json generated
View File

@@ -3302,9 +3302,9 @@
}
},
"@jitsi/js-utils": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@jitsi/js-utils/-/js-utils-1.0.3.tgz",
"integrity": "sha512-m6mZz7R716mHP21lTKQffyM0nNFu3Fe/EHCaOVLFY/vdPsaUl9DhypJqtPIYzRUfPnmnugdaxcxrUeSZQXQzVA==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@jitsi/js-utils/-/js-utils-1.0.2.tgz",
"integrity": "sha512-ls+X9tn9EemUQwPEBr7Z0UD4sjRtwcu1Bh4MUo0Hv4arp0KVzcCYCW+mofsvuZvHg8xJX12LLNVgUKi1X5XTGg==",
"requires": {
"bowser": "2.7.0",
"js-md5": "0.7.3"
@@ -6989,11 +6989,6 @@
"gud": "^1.0.0"
}
},
"cross-os": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/cross-os/-/cross-os-1.3.0.tgz",
"integrity": "sha512-9kViqCcAwlPLTeSDPlyC2FdMQ5UVPtGZUnGV8vYDcBA3olJ/hDR7H6IfrNJft2DlKONleHf8CMhD+7Uv2tBnEw=="
},
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -10593,8 +10588,8 @@
"integrity": "sha512-+f/4OLeqY8RAmXnonI1ffeY1DR8kMNJPhv5WMFehchf7U71cjMQVKkOz1n6asz6kfVoAqKNWJz1A/18i18AcXA=="
},
"jitsi-meet-logger": {
"version": "github:jitsi/jitsi-meet-logger#4add5bac2e4cea73a05f42b7596ee03c7f7a2567",
"from": "github:jitsi/jitsi-meet-logger#v1.0.0"
"version": "github:jitsi/jitsi-meet-logger#5ec92357570dc8f0b7ffc1528820721c84c6af8b",
"from": "github:jitsi/jitsi-meet-logger#5ec92357570dc8f0b7ffc1528820721c84c6af8b"
},
"jquery": {
"version": "3.5.1",
@@ -10776,8 +10771,8 @@
}
},
"lib-jitsi-meet": {
"version": "github:jitsi/lib-jitsi-meet#9f65e8fab3635ff2e05a5dcff7cc16b33215b6be",
"from": "github:jitsi/lib-jitsi-meet#9f65e8fab3635ff2e05a5dcff7cc16b33215b6be",
"version": "github:jitsi/lib-jitsi-meet#d2153eb404ddadef6d5b89ae8c499fa144280531",
"from": "github:jitsi/lib-jitsi-meet#d2153eb404ddadef6d5b89ae8c499fa144280531",
"requires": {
"@jitsi/js-utils": "1.0.2",
"@jitsi/sdp-interop": "1.0.3",
@@ -10785,7 +10780,7 @@
"async": "0.9.0",
"base64-js": "1.3.1",
"current-executing-script": "0.1.3",
"jitsi-meet-logger": "github:jitsi/jitsi-meet-logger#v1.0.0",
"jitsi-meet-logger": "github:jitsi/jitsi-meet-logger#5ec92357570dc8f0b7ffc1528820721c84c6af8b",
"lodash.clonedeep": "4.5.0",
"lodash.debounce": "4.0.8",
"lodash.isequal": "4.5.0",
@@ -10797,24 +10792,6 @@
"webrtc-adapter": "7.5.0"
},
"dependencies": {
"@jitsi/js-utils": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@jitsi/js-utils/-/js-utils-1.0.2.tgz",
"integrity": "sha512-ls+X9tn9EemUQwPEBr7Z0UD4sjRtwcu1Bh4MUo0Hv4arp0KVzcCYCW+mofsvuZvHg8xJX12LLNVgUKi1X5XTGg==",
"requires": {
"bowser": "2.7.0",
"js-md5": "0.7.3"
}
},
"jitsi-meet-logger": {
"version": "github:jitsi/jitsi-meet-logger#4add5bac2e4cea73a05f42b7596ee03c7f7a2567",
"from": "github:jitsi/jitsi-meet-logger#v1.0.0"
},
"js-md5": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz",
"integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ=="
},
"uuid": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz",
@@ -14288,12 +14265,11 @@
"integrity": "sha512-iqdJ1KpZbR4XGahgVmaeibB7kDhyMT7wrylINgJaYBY38IAiI0LF32VX1umO4pko6n21YF5I/kSeNQ+OXGqqow=="
},
"react-native-webrtc": {
"version": "1.87.1",
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.87.1.tgz",
"integrity": "sha512-XIztid40ohLUoOIDqpavskyAPzopWIjNOoC/y3AtTymt+o+W/rIHZ9Qw8JZCaIjWh2AIrcO2wtb/f1aMWSz2Zw==",
"version": "1.84.1",
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.84.1.tgz",
"integrity": "sha512-ewZBgKE+YhLaivo9Wh6aiaEp8ZRvFMqblrkDl1nptQiNNH6CungoAzSOxGDnHWAxepRfiUrW5qnADrsYKmaNeQ==",
"requires": {
"base64-js": "^1.1.2",
"cross-os": "^1.3.0",
"event-target-shim": "^1.0.5",
"prop-types": "^15.5.10",
"uuid": "^3.3.2"
@@ -14307,9 +14283,9 @@
}
},
"react-native-webview": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.0.2.tgz",
"integrity": "sha512-GDyIBRbCZ2wbMUGCxA7LufSEbSoWKOzkFB8YljmAffA15tzN6ccvGEquB/hkk5KhvoYy300kwJyEmyBeG6d/AA==",
"version": "10.9.0",
"resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-10.9.0.tgz",
"integrity": "sha512-zYZfmdJca/xRbwvvOfPhzL59SQC4L0W9rPWVF4zMi7BMDdCVHXVp0wKZ9KzmqxZNwadZNTxl5s0pvd6p3S34Fg==",
"requires": {
"escape-string-regexp": "2.0.0",
"invariant": "2.2.4"

View File

@@ -32,7 +32,7 @@
"@atlaskit/theme": "7.0.2",
"@atlaskit/toggle": "5.0.14",
"@atlaskit/tooltip": "12.1.13",
"@jitsi/js-utils": "1.0.3",
"@jitsi/js-utils": "1.0.2",
"@microsoft/microsoft-graph-client": "1.1.0",
"@react-native-community/async-storage": "1.3.4",
"@react-native-community/google-signin": "3.0.1",
@@ -50,13 +50,13 @@
"i18next-browser-languagedetector": "3.0.1",
"i18next-xhr-backend": "3.0.0",
"jQuery-Impromptu": "github:trentrichardson/jQuery-Impromptu#v6.0.0",
"jitsi-meet-logger": "github:jitsi/jitsi-meet-logger#v1.0.0",
"jitsi-meet-logger": "github:jitsi/jitsi-meet-logger#5ec92357570dc8f0b7ffc1528820721c84c6af8b",
"jquery": "3.5.1",
"jquery-contextmenu": "2.4.5",
"jquery-i18next": "1.2.1",
"js-md5": "0.6.1",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#9f65e8fab3635ff2e05a5dcff7cc16b33215b6be",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#d2153eb404ddadef6d5b89ae8c499fa144280531",
"libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
"lodash": "4.17.19",
"moment": "2.19.4",
@@ -84,8 +84,8 @@
"react-native-svg-transformer": "0.14.3",
"react-native-url-polyfill": "1.2.0",
"react-native-watch-connectivity": "0.4.3",
"react-native-webrtc": "1.87.1",
"react-native-webview": "11.0.2",
"react-native-webrtc": "1.84.1",
"react-native-webview": "10.9.0",
"react-native-youtube-iframe": "1.2.3",
"react-redux": "7.1.0",
"react-textarea-autosize": "7.1.0",

View File

@@ -11,7 +11,7 @@ import JitsiMeetJS, {
browser,
isAnalyticsEnabled
} from '../base/lib-jitsi-meet';
import { getJitsiMeetGlobalNS, loadScript, parseURIString } from '../base/util';
import { getJitsiMeetGlobalNS, loadScript } from '../base/util';
import { AmplitudeHandler, MatomoHandler } from './handlers';
import logger from './logger';
@@ -166,8 +166,6 @@ export function initAnalytics({ getState }: { getState: Function }, handlers: Ar
} = config;
const { group, server } = state['features/base/jwt'];
const roomName = state['features/base/conference'].room;
const { locationURL = {} } = state['features/base/connection'];
const { tenant } = parseURIString(locationURL.href) || {};
const permanentProperties = {};
if (server) {
@@ -189,9 +187,6 @@ export function initAnalytics({ getState }: { getState: Function }, handlers: Ar
// Report if we are loaded in iframe
permanentProperties.inIframe = _inIframe();
// Report the tenant from the URL.
permanentProperties.tenant = tenant || '/';
// Optionally, include local deployment information based on the
// contents of window.config.deploymentInfo.
if (deploymentInfo) {

View File

@@ -37,6 +37,7 @@ import '../overlay/middleware';
import '../recent-list/middleware';
import '../recording/middleware';
import '../rejoin/middleware';
import '../remote-control/middleware';
import '../room-lock/middleware';
import '../rtcstats/middleware';
import '../subtitles/middleware';

View File

@@ -10,7 +10,6 @@ import '../noise-detection/middleware';
import '../old-client-notification/middleware';
import '../power-monitor/middleware';
import '../prejoin/middleware';
import '../remote-control/middleware';
import '../shared-video/middleware';
import '../talk-while-muted/middleware';

View File

@@ -43,6 +43,7 @@ import '../notifications/reducer';
import '../overlay/reducer';
import '../recent-list/reducer';
import '../recording/reducer';
import '../remote-control/reducer';
import '../settings/reducer';
import '../subtitles/reducer';
import '../toolbox/reducer';

View File

@@ -8,7 +8,6 @@ import '../no-audio-signal/reducer';
import '../noise-detection/reducer';
import '../power-monitor/reducer';
import '../prejoin/reducer';
import '../remote-control/reducer';
import '../screenshot-capture/reducer';
import '../shared-video/reducer';
import '../talk-while-muted/reducer';

View File

@@ -196,6 +196,17 @@ export const SET_PENDING_SUBJECT_CHANGE = 'SET_PENDING_SUBJECT_CHANGE';
*/
export const SET_ROOM = 'SET_ROOM';
/**
* The type of (redux) action, which indicates if a SIP gateway is enabled on
* the server.
*
* {
* type: SET_SIP_GATEWAY_ENABLED
* isSIPGatewayEnabled: boolean
* }
*/
export const SET_SIP_GATEWAY_ENABLED = 'SET_SIP_GATEWAY_ENABLED';
/**
* The type of (redux) action which updates the current known status of the
* moderator features for starting participants as audio or video muted.

View File

@@ -20,6 +20,7 @@ import {
SET_PASSWORD,
SET_PENDING_SUBJECT_CHANGE,
SET_ROOM,
SET_SIP_GATEWAY_ENABLED,
SET_START_MUTED_POLICY
} from './actionTypes';
import { isRoomValid } from './functions';
@@ -89,6 +90,9 @@ ReducerRegistry.register(
case SET_ROOM:
return _setRoom(state, action);
case SET_SIP_GATEWAY_ENABLED:
return _setSIPGatewayEnabled(state, action);
case SET_START_MUTED_POLICY:
return {
...state,
@@ -412,3 +416,16 @@ function _setRoom(state, action) {
});
}
/**
* Reduces a specific Redux action SET_SIP_GATEWAY_ENABLED of the feature
* base/conference.
*
* @param {Object} state - The Redux state of the feature base/conference.
* @param {Action} action - The Redux action SET_SIP_GATEWAY_ENABLED to reduce.
* @private
* @returns {Object} The new state of the feature base/conference after the
* reduction of the specified action.
*/
function _setSIPGatewayEnabled(state, action) {
return set(state, 'isSIPGatewayEnabled', action.isSIPGatewayEnabled);
}

View File

@@ -90,6 +90,7 @@ export default [
'disableRemoteMute',
'disableRtx',
'disableSimulcast',
'disableSuspendVideo',
'disableThirdPartyRequests',
'displayJids',
'doNotStoreRoom',
@@ -114,10 +115,8 @@ export default [
'fileRecordingsEnabled',
'firefox_fake_device',
'forceJVB121Ratio',
'forceTurnRelay',
'gatherStats',
'googleApiApplicationClientID',
'hideConferenceTimer',
'hiddenDomain',
'hideLobbyButton',
'hosts',
@@ -128,8 +127,8 @@ export default [
'liveStreamingEnabled',
'localRecording',
'maxFullResolutionParticipants',
'minParticipants',
'openBridgeChannel',
'openSharedDocumentOnJoin',
'opusMaxAverageBitrate',
'p2p',
'pcStatsInterval',
@@ -141,6 +140,7 @@ export default [
'resolution',
'startAudioMuted',
'startAudioOnly',
'startBitrate',
'startScreenSharing',
'startSilent',
'startVideoMuted',

View File

@@ -59,7 +59,7 @@ export function getInviteURL(stateOrGetState: Function | Object): string {
if (inviteDomain) {
const meetingId
= state['features/base/config'].brandingRoomAlias || urlWithoutParams.pathname.replace(/\//, '');
= state['features/base/config'].brandingRoomAlias || urlWithoutParams.pathname.replace('/', '');
return `${inviteDomain}/${meetingId}`;
}

View File

@@ -68,13 +68,14 @@ function _updateLastN({ getState }) {
return;
}
let lastN = typeof config.channelLastN === 'undefined' ? -1 : config.channelLastN;
const defaultLastN = typeof config.channelLastN === 'undefined' ? -1 : config.channelLastN;
let lastN = defaultLastN;
// Apply last N limit based on the # of participants and channelLastN settings.
// Apply last N limit based on the # of participants
const limitedLastN = limitLastN(participantCount, lastNLimits);
if (limitedLastN !== undefined) {
lastN = lastN === -1 ? limitedLastN : Math.min(limitedLastN, lastN);
lastN = limitedLastN;
}
if (typeof appState !== 'undefined' && appState !== 'active') {

View File

@@ -21,6 +21,7 @@ import {
getLocalParticipant,
getNormalizedDisplayName,
getParticipantDisplayName,
figureOutMutedWhileDisconnectedStatus,
getParticipantById
} from './functions';
import logger from './logger';
@@ -219,12 +220,15 @@ export function muteRemoteParticipant(id) {
* }}
*/
export function participantConnectionStatusChanged(id, connectionStatus) {
return {
type: PARTICIPANT_UPDATED,
participant: {
connectionStatus,
id
}
return (dispatch, getState) => {
return {
type: PARTICIPANT_UPDATED,
participant: {
connectionStatus,
id,
mutedWhileDisconnected: figureOutMutedWhileDisconnectedStatus(getState(), id, connectionStatus)
}
};
};
}

View File

@@ -1,12 +1,11 @@
// @flow
import { getGravatarURL } from '@jitsi/js-utils/avatar';
import type { Store } from 'redux';
import { JitsiParticipantConnectionStatus } from '../lib-jitsi-meet';
import { MEDIA_TYPE, shouldRenderVideoTrack } from '../media';
import { toState } from '../redux';
import { getTrackByMediaTypeAndParticipant } from '../tracks';
import { getTrackByMediaTypeAndParticipant, isRemoteTrackMuted } from '../tracks';
import { createDeferred } from '../util';
import {
@@ -24,39 +23,30 @@ declare var interfaceConfig: Object;
*/
const AVATAR_QUEUE = [];
const AVATAR_CHECKED_URLS = new Map();
/* eslint-disable arrow-body-style, no-unused-vars */
/* eslint-disable arrow-body-style */
const AVATAR_CHECKER_FUNCTIONS = [
(participant, _) => {
participant => {
return participant && participant.isJigasi ? JIGASI_PARTICIPANT_ICON : null;
},
(participant, _) => {
participant => {
return participant && participant.avatarURL ? participant.avatarURL : null;
},
(participant, store) => {
if (participant && participant.email) {
// TODO: remove once libravatar has deployed their new scaled up infra. -saghul
const gravatarBaseURL
= store.getState()['features/base/config'].gravatarBaseURL ?? 'https://www.gravatar.com/avatar/';
return getGravatarURL(participant.email, gravatarBaseURL);
}
return null;
participant => {
return participant && participant.email ? getGravatarURL(participant.email) : null;
}
];
/* eslint-enable arrow-body-style, no-unused-vars */
/* eslint-enable arrow-body-style */
/**
* Resolves the first loadable avatar URL for a participant.
*
* @param {Object} participant - The participant to resolve avatars for.
* @param {Store} store - Redux store.
* @returns {Promise}
*/
export function getFirstLoadableAvatarUrl(participant: Object, store: Store<any, any>) {
export function getFirstLoadableAvatarUrl(participant: Object) {
const deferred = createDeferred();
const fullPromise = deferred.promise
.then(() => _getFirstLoadableAvatarUrl(participant, store))
.then(() => _getFirstLoadableAvatarUrl(participant))
.then(src => {
if (AVATAR_QUEUE.length) {
@@ -369,16 +359,54 @@ export function shouldRenderParticipantVideo(stateful: Object | Function, id: st
return participantIsInLargeVideoWithScreen;
}
/**
* Figures out the value of mutedWhileDisconnected status by taking into
* account remote participant's network connectivity and video muted status.
* The flag is set to <tt>true</tt> if remote participant's video gets muted
* during his media connection disruption. This is to prevent black video
* being render on the thumbnail, because even though once the video has
* been played the image usually remains on the video element it seems that
* after longer period of the video element being hidden this image can be
* lost.
*
* @param {Object|Function} stateful - Object or function that can be resolved
* to the Redux state.
* @param {string} participantID - The ID of the participant.
* @param {string} [connectionStatus] - A connection status to be used.
* @returns {boolean} - The mutedWhileDisconnected value.
*/
export function figureOutMutedWhileDisconnectedStatus(
stateful: Function | Object, participantID: string, connectionStatus: ?string) {
const state = toState(stateful);
const participant = getParticipantById(state, participantID);
if (!participant || participant.local) {
return undefined;
}
const isActive = (connectionStatus || participant.connectionStatus) === JitsiParticipantConnectionStatus.ACTIVE;
const isVideoMuted = isRemoteTrackMuted(state['features/base/tracks'], MEDIA_TYPE.VIDEO, participantID);
let mutedWhileDisconnected = participant.mutedWhileDisconnected || false;
if (!isActive && isVideoMuted) {
mutedWhileDisconnected = true;
} else if (isActive && !isVideoMuted) {
mutedWhileDisconnected = false;
}
return mutedWhileDisconnected;
}
/**
* Resolves the first loadable avatar URL for a participant.
*
* @param {Object} participant - The participant to resolve avatars for.
* @param {Store} store - Redux store.
* @returns {?string}
*/
async function _getFirstLoadableAvatarUrl(participant, store) {
async function _getFirstLoadableAvatarUrl(participant) {
for (let i = 0; i < AVATAR_CHECKER_FUNCTIONS.length; i++) {
const url = AVATAR_CHECKER_FUNCTIONS[i](participant, store);
const url = AVATAR_CHECKER_FUNCTIONS[i](participant);
if (url) {
if (AVATAR_CHECKED_URLS.has(url)) {

View File

@@ -12,6 +12,7 @@ import {
import { JitsiConferenceEvents } from '../lib-jitsi-meet';
import { MiddlewareRegistry, StateListenerRegistry } from '../redux';
import { playSound, registerSound, unregisterSound } from '../sounds';
import { getTrackByJitsiTrack, TRACK_ADDED, TRACK_REMOVED, TRACK_UPDATED } from '../tracks';
import {
DOMINANT_SPEAKER_CHANGED,
@@ -41,7 +42,8 @@ import {
getLocalParticipant,
getParticipantById,
getParticipantCount,
getParticipantDisplayName
getParticipantDisplayName,
figureOutMutedWhileDisconnectedStatus
} from './functions';
import { PARTICIPANT_JOINED_FILE, PARTICIPANT_LEFT_FILE } from './sounds';
@@ -71,24 +73,16 @@ MiddlewareRegistry.register(store => next => action => {
break;
case DOMINANT_SPEAKER_CHANGED: {
// Ensure the raised hand state is cleared for the dominant speaker
// and only if it was set when this is the local participant
// Ensure the raised hand state is cleared for the dominant speaker.
const { conference, id } = action.participant;
const participant = getLocalParticipant(store.getState());
const isLocal = participant && participant.id === id;
if (isLocal && participant.raisedHand === undefined) {
// if local was undefined, let's leave it like that
// avoids sending unnecessary presence updates
break;
}
participant
&& store.dispatch(participantUpdated({
conference,
id,
local: isLocal,
local: participant.id === id,
raisedHand: false
}));
@@ -143,6 +137,10 @@ MiddlewareRegistry.register(store => next => action => {
case PARTICIPANT_UPDATED:
return _participantJoinedOrUpdated(store, next, action);
case TRACK_ADDED:
case TRACK_REMOVED:
case TRACK_UPDATED:
return _trackChanged(store, next, action);
}
return next(action);
@@ -374,8 +372,7 @@ function _maybePlaySounds({ getState, dispatch }, action) {
* @private
* @returns {Object} The value returned by {@code next(action)}.
*/
function _participantJoinedOrUpdated(store, next, action) {
const { dispatch, getState } = store;
function _participantJoinedOrUpdated({ dispatch, getState }, next, action) {
const { participant: { avatarURL, e2eeEnabled, email, id, local, name, raisedHand } } = action;
// Send an external update of the local participant's raised hand state
@@ -384,10 +381,10 @@ function _participantJoinedOrUpdated(store, next, action) {
if (local) {
const { conference } = getState()['features/base/conference'];
// Send raisedHand signalling only if there is a change
if (conference && raisedHand !== getLocalParticipant(getState()).raisedHand) {
conference.setLocalParticipantProperty('raisedHand', raisedHand);
}
conference
&& conference.setLocalParticipantProperty(
'raisedHand',
raisedHand);
}
}
@@ -411,7 +408,7 @@ function _participantJoinedOrUpdated(store, next, action) {
const participantId = !id && local ? getLocalParticipant(getState()).id : id;
const updatedParticipant = getParticipantById(getState(), participantId);
getFirstLoadableAvatarUrl(updatedParticipant, store)
getFirstLoadableAvatarUrl(updatedParticipant)
.then(url => {
dispatch(setLoadableAvatarUrl(participantId, url));
});
@@ -469,6 +466,55 @@ function _registerSounds({ dispatch }) {
dispatch(registerSound(PARTICIPANT_LEFT_SOUND_ID, PARTICIPANT_LEFT_FILE));
}
/**
* Notifies the feature base/participants that the action there has been a change in the tracks of the participants.
*
* @param {Store} store - The redux store in which the specified {@code action} is being dispatched.
* @param {Dispatch} next - The redux {@code dispatch} function to dispatch the specified {@code action} in the
* specified {@code store}.
* @param {Action} action - The redux action {@code PARTICIPANT_JOINED} or {@code PARTICIPANT_UPDATED} which is being
* dispatched in the specified {@code store}.
* @private
* @returns {Object} The value returned by {@code next(action)}.
*/
function _trackChanged({ dispatch, getState }, next, action) {
const { jitsiTrack } = action.track;
let track;
if (action.type === TRACK_REMOVED) {
track = getTrackByJitsiTrack(getState()['features/base/tracks'], jitsiTrack);
}
const result = next(action);
if (action.type !== TRACK_REMOVED) {
track = getTrackByJitsiTrack(getState()['features/base/tracks'], jitsiTrack);
}
if (typeof track === 'undefined' || track.local) {
return result;
}
const { participantId } = track;
const state = getState();
const participant = getParticipantById(state, participantId);
if (!participant) {
return result;
}
const mutedWhileDisconnected = figureOutMutedWhileDisconnectedStatus(state, participantId);
if (participant.mutedWhileDisconnected !== mutedWhileDisconnected) {
dispatch(participantUpdated({
id: participantId,
mutedWhileDisconnected
}));
}
return result;
}
/**
* Unregisters sounds related with the participants feature.
*

View File

@@ -221,6 +221,7 @@ function _participantJoined({ participant }) {
isJigasi,
loadableAvatarUrl,
local: local || false,
mutedWhileDisconnected: local ? undefined : false,
name,
pinned: pinned || false,
presence,

View File

@@ -1,8 +1,5 @@
// @flow
import { MEDIA_TYPE } from '../media';
import { getTrackByMediaTypeAndParticipant } from '../tracks';
/**
* Indicates whether the test mode is enabled. When it's enabled
* {@link TestHint} and other components from the testing package will be
@@ -16,43 +13,3 @@ export function isTestModeEnabled(state: Object): boolean {
return Boolean(testingConfig && testingConfig.testMode);
}
/**
* Returns the video type of the remote participant's video.
*
* @param {Store} store - The redux store.
* @param {string} id - The participant ID for the remote video.
* @returns {MEDIA_TYPE}
*/
export function getRemoteVideoType({ getState }: Object, id: String): boolean {
return getTrackByMediaTypeAndParticipant(getState()['features/base/tracks'], MEDIA_TYPE.VIDEO, id)?.videoType;
}
/**
* Returns whether the last media event received for large video indicates that the video is playing, if not muted.
*
* @param {Store} store - The redux store.
* @returns {boolean}
*/
export function isLargeVideoReceived({ getState }: Object): boolean {
const largeVideoParticipantId = getState()['features/large-video'].participantId;
const videoTrack = getTrackByMediaTypeAndParticipant(
getState()['features/base/tracks'], MEDIA_TYPE.VIDEO, largeVideoParticipantId);
const lastMediaEvent = getState()['features/large-video'].lastMediaEvent;
return videoTrack && !videoTrack.muted && (lastMediaEvent === 'playing' || lastMediaEvent === 'canplaythrough');
}
/**
* Returns whether the last media event received for a remote video indicates that the video is playing, if not muted.
*
* @param {Store} store - The redux store.
* @param {string} id - The participant ID for the remote video.
* @returns {boolean}
*/
export function isRemoteVideoReceived({ getState }: Object, id: String): boolean {
const videoTrack = getTrackByMediaTypeAndParticipant(getState()['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
const lastMediaEvent = videoTrack.lastMediaEvent;
return !videoTrack.muted && (lastMediaEvent === 'playing' || lastMediaEvent === 'canplaythrough');
}

View File

@@ -1,18 +1,10 @@
// @flow
import { CONFERENCE_WILL_JOIN } from '../conference';
import { SET_CONFIG } from '../config';
import { JitsiConferenceEvents } from '../lib-jitsi-meet';
import { MiddlewareRegistry } from '../redux';
import { getJitsiMeetGlobalNS } from '../util';
import { setConnectionState } from './actions';
import {
getRemoteVideoType,
isLargeVideoReceived,
isRemoteVideoReceived,
isTestModeEnabled
} from './functions';
import logger from './logger';
/**
@@ -27,13 +19,6 @@ MiddlewareRegistry.register(store => next => action => {
case CONFERENCE_WILL_JOIN:
_bindConferenceConnectionListener(action.conference, store);
break;
case SET_CONFIG: {
const result = next(action);
_bindTortureHelpers(store);
return result;
}
}
return next(action);
@@ -67,29 +52,6 @@ function _bindConferenceConnectionListener(conference, { dispatch }) {
null, JitsiConferenceEvents.CONNECTION_INTERRUPTED, dispatch));
}
/**
* Binds all the helper functions needed by torture.
*
* @param {Store} store - The redux store.
* @private
* @returns {void}
*/
function _bindTortureHelpers(store) {
const { getState } = store;
// We bind helpers only if testing mode is enabled
if (!isTestModeEnabled(getState())) {
return;
}
// All torture helper methods go in here
getJitsiMeetGlobalNS().testing = {
getRemoteVideoType: getRemoteVideoType.bind(null, store),
isLargeVideoReceived: isLargeVideoReceived.bind(null, store),
isRemoteVideoReceived: isRemoteVideoReceived.bind(null, store)
};
}
/**
* The handler function for conference connection events which wil store the
* latest even name in the Redux store of feature testing.

View File

@@ -104,14 +104,3 @@ export const TRACK_UPDATED = 'TRACK_UPDATED';
* }
*/
export const TRACK_WILL_CREATE = 'TRACK_WILL_CREATE';
/**
* Action to update the redux store with the current media event name of the video track.
*
* @returns {{
* type: TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT,
* track: Track,
* name: string
* }}
*/
export const TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT = 'TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT';

View File

@@ -23,8 +23,7 @@ import {
TRACK_NO_DATA_FROM_SOURCE,
TRACK_REMOVED,
TRACK_UPDATED,
TRACK_WILL_CREATE,
TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT
TRACK_WILL_CREATE
} from './actionTypes';
import {
createLocalTracksF,
@@ -705,22 +704,3 @@ export function setNoSrcDataNotificationUid(uid) {
uid
};
}
/**
* Updates the last media event received for a video track.
*
* @param {JitsiRemoteTrack} track - JitsiTrack instance.
* @param {string} name - The current media event name for the video.
* @returns {{
* type: TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT,
* track: Track,
* name: string
* }}
*/
export function updateLastTrackVideoMediaEvent(track, name) {
return {
type: TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT,
track,
name
};
}

View File

@@ -8,7 +8,6 @@ import {
TRACK_CREATE_ERROR,
TRACK_NO_DATA_FROM_SOURCE,
TRACK_REMOVED,
TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT,
TRACK_UPDATED,
TRACK_WILL_CREATE
} from './actionTypes';
@@ -41,7 +40,6 @@ import {
* @param {Track|undefined} state - Track to be modified.
* @param {Object} action - Action object.
* @param {string} action.type - Type of action.
* @param {string} action.name - Name of last media event.
* @param {string} action.newValue - New participant ID value (in this
* particular case).
* @param {string} action.oldValue - Old participant ID value (in this
@@ -79,20 +77,6 @@ function track(state, action) {
}
break;
}
case TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT: {
const t = action.track;
if (state.jitsiTrack === t) {
if (state.lastMediaEvent !== action.name) {
return {
...state,
lastMediaEvent: action.name
};
}
}
break;
}
case TRACK_NO_DATA_FROM_SOURCE: {
const t = action.track;
@@ -120,7 +104,6 @@ ReducerRegistry.register('features/base/tracks', (state = [], action) => {
switch (action.type) {
case PARTICIPANT_ID_CHANGED:
case TRACK_NO_DATA_FROM_SOURCE:
case TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT:
case TRACK_UPDATED:
return state.map(t => track(t, action));

View File

@@ -363,11 +363,6 @@ export function parseURIString(uri: ?string) {
}
obj.room = room;
if (contextRootEndIndex > 1) {
// The part of the pathname from the beginning to the room name is the tenant.
obj.tenant = pathname.substring(1, contextRootEndIndex);
}
return obj;
}
@@ -519,7 +514,7 @@ export function urlObjectToString(o: Object): ?string {
// pathname
// Web's ExternalAPI roomName
const room = o.roomName || o.room;
const room = _fixRoom(o.roomName || o.room);
if (room
&& (url.pathname.endsWith('/')

View File

@@ -96,8 +96,7 @@ class NavigationBar extends Component<Props> {
*/
function _mapStateToProps(state) {
return {
_conferenceTimerEnabled:
getFeatureFlag(state, CONFERENCE_TIMER_ENABLED, true) && !state['features/base/config'].hideConferenceTimer,
_conferenceTimerEnabled: getFeatureFlag(state, CONFERENCE_TIMER_ENABLED, true),
_meetingName: getConferenceName(state),
_meetingNameEnabled: getFeatureFlag(state, MEETING_NAME_ENABLED, true),
_visible: isToolboxVisible(state)

View File

@@ -16,12 +16,7 @@ import ParticipantsCount from './ParticipantsCount';
type Props = {
/**
* Whether the conference timer should be shown or not.
*/
_hideConferenceTimer: Boolean,
/**
* Whether the participant count should be shown or not.
* Whether then participant count should be shown or not.
*/
_showParticipantCount: boolean,
@@ -51,13 +46,13 @@ class Subject extends Component<Props> {
* @returns {ReactElement}
*/
render() {
const { _hideConferenceTimer, _showParticipantCount, _subject, _visible } = this.props;
const { _showParticipantCount, _subject, _visible } = this.props;
return (
<div className = { `subject ${_visible ? 'visible' : ''}` }>
<span className = 'subject-text'>{ _subject }</span>
{ _showParticipantCount && <ParticipantsCount /> }
{ !_hideConferenceTimer && <ConferenceTimer /> }
<ConferenceTimer />
</div>
);
}
@@ -70,8 +65,6 @@ class Subject extends Component<Props> {
* @param {Object} state - The Redux state.
* @private
* @returns {{
* _hideConferenceTimer: boolean,
* _showParticipantCount: boolean,
* _subject: string,
* _visible: boolean
* }}
@@ -80,7 +73,6 @@ function _mapStateToProps(state) {
const participantCount = getParticipantCount(state);
return {
_hideConferenceTimer: Boolean(state['features/base/config'].hideConferenceTimer),
_showParticipantCount: participantCount > 2,
_subject: getConferenceName(state),
_visible: isToolboxVisible(state) && participantCount > 1

View File

@@ -84,12 +84,6 @@ type Props = AbstractProps & {
*/
dispatch: Dispatch<any>,
/**
* Whether or not should display the "Save Logs" link in the local video
* stats table.
*/
enableSaveLogs: boolean,
/**
* Whether or not clicking the indicator should display a popover for more
* details.
@@ -392,7 +386,6 @@ class ConnectionIndicator extends AbstractConnectionIndicator<Props, State> {
codec = { codec }
connectionSummary = { this._getConnectionStatusTip() }
e2eRtt = { e2eRtt }
enableSaveLogs = { this.props.enableSaveLogs }
framerate = { framerate }
isLocalVideo = { this.props.isLocalVideo }
maxEnabledResolution = { maxEnabledResolution }
@@ -447,8 +440,7 @@ export function _mapStateToProps(state: Object, ownProps: Props) {
const participant
= typeof participantId === 'undefined' ? getLocalParticipant(state) : getParticipantById(state, participantId);
const props = {
_connectionStatus: participant?.connectionStatus,
enableSaveLogs: state['features/base/config'].enableSaveLogs
_connectionStatus: participant?.connectionStatus
};
if (conference) {

View File

@@ -54,11 +54,6 @@ type Props = {
*/
e2eRtt: number,
/**
* Whether or not should display the "Save Logs" link.
*/
enableSaveLogs: boolean,
/**
* The endpoint id of this client.
*/
@@ -158,13 +153,13 @@ class ConnectionStatsTable extends Component<Props> {
* @returns {ReactElement}
*/
render() {
const { isLocalVideo, enableSaveLogs } = this.props;
const { isLocalVideo } = this.props;
return (
<div className = 'connection-info'>
{ this._renderStatistics() }
<div className = 'connection-actions'>
{ isLocalVideo && enableSaveLogs ? this._renderSaveLogs() : null}
{ isLocalVideo ? this._renderSaveLogs() : null}
{ this._renderShowMoreLink() }
</div>
{ this.props.shouldShowMore ? this._renderAdditionalStats() : null }

View File

@@ -17,32 +17,23 @@ const TILE_VIEW_SIDE_MARGINS = 10 * 2;
* @param {Object} windowSize - The size of the window.
* @param {boolean} isChatOpen - Whether the chat panel is displayed, in
* order to properly compute the tile view size.
* @param {boolean} isToolboxVisible - Whether the toolbox is visible, in order
* to adjust the available size.
* @returns {{
* type: SET_TILE_VIEW_DIMENSIONS,
* dimensions: Object
* }}
*/
export function setTileViewDimensions(
dimensions: Object, windowSize: Object, isChatOpen: boolean, isToolboxVisible: boolean) {
export function setTileViewDimensions(dimensions: Object, windowSize: Object, isChatOpen: boolean) {
const { clientWidth, clientHeight } = windowSize;
let heightToUse = clientHeight;
let widthToUse = clientWidth;
if (isChatOpen) {
widthToUse -= CHAT_SIZE;
}
if (isToolboxVisible) {
// The distance from the top and bottom of the screen, to avoid overlapping UI elements.
heightToUse -= 150;
}
const thumbnailSize = calculateThumbnailSizeForTileView({
...dimensions,
clientWidth: widthToUse,
clientHeight: heightToUse
clientHeight
});
const filmstripWidth = dimensions.columns * (TILE_VIEW_SIDE_MARGINS + thumbnailSize.width);

View File

@@ -94,13 +94,17 @@ export function calculateThumbnailSizeForTileView({
clientWidth,
clientHeight
}: Object) {
// The distance from the top and bottom of the screen, as set by CSS, to
// avoid overlapping UI elements.
const topBottomPadding = 200;
// Minimum space to keep between the sides of the tiles and the sides
// of the window.
const sideMargins = 30 * 2;
const verticalMargins = visibleRows * 10;
const viewWidth = clientWidth - sideMargins;
const viewHeight = clientHeight - verticalMargins;
const viewHeight = clientHeight - topBottomPadding - verticalMargins;
const initialWidth = viewWidth / columns;
const aspectRatioHeight = initialWidth / TILE_ASPECT_RATIO;
const height = Math.floor(Math.min(aspectRatioHeight, viewHeight / visibleRows));

View File

@@ -30,7 +30,6 @@ MiddlewareRegistry.register(store => next => action => {
const { gridDimensions } = state['features/filmstrip'].tileViewDimensions;
const { clientHeight, clientWidth } = state['features/base/responsive-ui'];
const { isOpen } = state['features/chat'];
const { visible } = state['features/toolbox'];
store.dispatch(
setTileViewDimensions(
@@ -39,8 +38,7 @@ MiddlewareRegistry.register(store => next => action => {
clientHeight,
clientWidth
},
isOpen,
visible
isOpen
)
);
break;

View File

@@ -18,12 +18,10 @@ StateListenerRegistry.register(
if (shouldDisplayTileView(state)) {
const gridDimensions = getTileViewGridDimensions(state);
const oldGridDimensions = state['features/filmstrip'].tileViewDimensions.gridDimensions;
const { clientHeight, clientWidth } = state['features/base/responsive-ui'];
const { isOpen } = state['features/chat'];
if (!equals(gridDimensions, oldGridDimensions)) {
const { clientHeight, clientWidth } = state['features/base/responsive-ui'];
const { isOpen } = state['features/chat'];
const { visible } = state['features/toolbox'];
store.dispatch(
setTileViewDimensions(
gridDimensions,
@@ -31,8 +29,7 @@ StateListenerRegistry.register(
clientHeight,
clientWidth
},
isOpen,
visible
isOpen
)
);
}
@@ -51,7 +48,6 @@ StateListenerRegistry.register(
case LAYOUTS.TILE_VIEW: {
const { clientHeight, clientWidth } = state['features/base/responsive-ui'];
const { isOpen } = state['features/chat'];
const { visible } = state['features/toolbox'];
store.dispatch(
setTileViewDimensions(
@@ -60,8 +56,7 @@ StateListenerRegistry.register(
clientHeight,
clientWidth
},
isOpen,
visible
isOpen
)
);
break;
@@ -114,7 +109,6 @@ StateListenerRegistry.register(
if (shouldDisplayTileView(state)) {
const gridDimensions = getTileViewGridDimensions(state);
const { clientHeight, clientWidth } = state['features/base/responsive-ui'];
const { visible } = state['features/toolbox'];
store.dispatch(
setTileViewDimensions(
@@ -123,35 +117,7 @@ StateListenerRegistry.register(
clientHeight,
clientWidth
},
isChatOpen,
visible
)
);
}
});
/**
* Listens for changes in the chat state to calculate the dimensions of the tile view grid and the tiles.
*/
StateListenerRegistry.register(
/* selector */ state => state['features/toolbox'].visible,
/* listener */ (visible, store) => {
const state = store.getState();
if (shouldDisplayTileView(state)) {
const gridDimensions = getTileViewGridDimensions(state);
const { clientHeight, clientWidth } = state['features/base/responsive-ui'];
const { isOpen } = state['features/chat'];
store.dispatch(
setTileViewDimensions(
gridDimensions,
{
clientHeight,
clientWidth
},
isOpen,
visible
isChatOpen
)
);
}

View File

@@ -19,14 +19,3 @@ export const SELECT_LARGE_VIDEO_PARTICIPANT
*/
export const UPDATE_KNOWN_LARGE_VIDEO_RESOLUTION
= 'UPDATE_KNOWN_LARGE_VIDEO_RESOLUTION';
/**
* Action to update the redux store with the current media event name of large video.
*
* @returns {{
* type: UPDATE_LAST_LARGE_VIDEO_MEDIA_EVENT,
* name: string
* }}
*/
export const UPDATE_LAST_LARGE_VIDEO_MEDIA_EVENT
= 'UPDATE_LAST_LARGE_VIDEO_MEDIA_EVENT';

View File

@@ -61,20 +61,8 @@ export function selectParticipantInLargeVideo(participant: ?string) {
const state = getState();
const participantId = participant ?? _electParticipantInLargeVideo(state);
const largeVideo = state['features/large-video'];
const screenShares = state['features/video-layout'].screenShares;
let latestScreenshareParticipantId;
if (screenShares && screenShares.length) {
latestScreenshareParticipantId = screenShares[screenShares.length - 1];
}
// When trying to auto pin screenshare, always select the endpoint even though it happens to be
// the large video participant in redux (for the reasons listed above in the large video selection
// logic above). The auto pin screenshare logic kicks in after the track is added
// (which updates the large video participant and selects all endpoints because of the auto tile
// view mode). If the screenshare endpoint is not among the forwarded endpoints from the bridge,
// it needs to be selected again at this point.
if (participantId !== largeVideo.participantId || participantId === latestScreenshareParticipantId) {
if (participantId !== largeVideo.participantId) {
dispatch({
type: SELECT_LARGE_VIDEO_PARTICIPANT,
participantId

View File

@@ -6,8 +6,6 @@ import VideoLayout from '../../../modules/UI/videolayout/VideoLayout';
import { MEDIA_TYPE } from '../base/media';
import { getTrackByMediaTypeAndParticipant } from '../base/tracks';
import { UPDATE_LAST_LARGE_VIDEO_MEDIA_EVENT } from './actionTypes';
export * from './actions.any';
/**
@@ -85,19 +83,3 @@ export function resizeLargeVideo(width: number, height: number) {
}
};
}
/**
* Updates the last media event received for the large video.
*
* @param {string} name - The current media event name for the video.
* @returns {{
* type: UPDATE_LAST_LARGE_VIDEO_MEDIA_EVENT,
* name: string
* }}
*/
export function updateLastLargeVideoMediaEvent(name: String) {
return {
type: UPDATE_LAST_LARGE_VIDEO_MEDIA_EVENT,
name
};
}

View File

@@ -5,7 +5,7 @@ import { ReducerRegistry } from '../base/redux';
import {
SELECT_LARGE_VIDEO_PARTICIPANT,
UPDATE_KNOWN_LARGE_VIDEO_RESOLUTION, UPDATE_LAST_LARGE_VIDEO_MEDIA_EVENT
UPDATE_KNOWN_LARGE_VIDEO_RESOLUTION
} from './actionTypes';
ReducerRegistry.register('features/large-video', (state = {}, action) => {
@@ -36,13 +36,6 @@ ReducerRegistry.register('features/large-video', (state = {}, action) => {
...state,
resolution: action.resolution
};
case UPDATE_LAST_LARGE_VIDEO_MEDIA_EVENT:
return {
...state,
lastMediaEvent: action.name
};
}
return state;

View File

@@ -144,13 +144,12 @@ function _conferenceJoined({ dispatch }, next, action) {
* @param {Object} participant - The knocking participant.
* @returns {void}
*/
function _findLoadableAvatarForKnockingParticipant(store, { id }) {
const { dispatch, getState } = store;
function _findLoadableAvatarForKnockingParticipant({ dispatch, getState }, { id }) {
const updatedParticipant = getState()['features/lobby'].knockingParticipants.find(p => p.id === id);
const { disableThirdPartyRequests } = getState()['features/base/config'];
if (!disableThirdPartyRequests && updatedParticipant && !updatedParticipant.loadableAvatarUrl) {
getFirstLoadableAvatarUrl(updatedParticipant, store).then(loadableAvatarUrl => {
getFirstLoadableAvatarUrl(updatedParticipant).then(loadableAvatarUrl => {
if (loadableAvatarUrl) {
dispatch(participantIsKnockingOrUpdated({
loadableAvatarUrl,

View File

@@ -275,7 +275,7 @@ class Toolbox extends Component<Props, State> {
this._shouldShowButton('videoquality') && {
character: 'A',
exec: this._onShortcutToggleVideoQuality,
helpDescription: 'toolbar.callQuality'
helpDescription: 'keyboardShortcuts.videoQuality'
},
this._shouldShowButton('chat') && {
character: 'C',

View File

@@ -227,7 +227,7 @@ end
-- everything.
function is_feature_allowed(session, feature)
if (session.jitsi_meet_context_features == nil
or session.jitsi_meet_context_features[feature] == "true" or session.jitsi_meet_context_features[feature] == true) then
or session.jitsi_meet_context_features[feature] == "true") then
return true;
else
return false;

View File

@@ -7,7 +7,7 @@
<body>
<div class="error_page">
<h2>404 Not Found</h2>
<p class="error_page__message">You can create a new conversation <a class="link" onclick="window.location = window.location.protocol + '//' + window.location.hostname">here</a></p>
<p class="error_page__message">You can create new conversation <a class="link" href="/">here</a></p>
</div>
</body>
</html>