mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2026-05-24 06:37:49 +00:00
Compare commits
246 Commits
7145
...
token-veri
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de81d395c1 | ||
|
|
9af56d52c2 | ||
|
|
2a9c40f0d2 | ||
|
|
3ae18be21f | ||
|
|
9f5dbb21a7 | ||
|
|
2d14990b9e | ||
|
|
169c8ecb62 | ||
|
|
d608cf40f5 | ||
|
|
51a4e7daa3 | ||
|
|
7538bfc713 | ||
|
|
48e1f443ea | ||
|
|
2292ebe762 | ||
|
|
5425b52615 | ||
|
|
74f605e045 | ||
|
|
1918566581 | ||
|
|
ee8ba6696d | ||
|
|
15df3cb11e | ||
|
|
b77db024f5 | ||
|
|
c8a87e368a | ||
|
|
277ca23c52 | ||
|
|
55f66e236e | ||
|
|
70be08212d | ||
|
|
acb91990bf | ||
|
|
cd37cdd675 | ||
|
|
935a391525 | ||
|
|
d0f9231603 | ||
|
|
e461ec7027 | ||
|
|
5dc63f0632 | ||
|
|
f3dbf34842 | ||
|
|
66a9c4df25 | ||
|
|
e95a31c114 | ||
|
|
8565208d30 | ||
|
|
c1573057df | ||
|
|
904f820555 | ||
|
|
5172eda6b9 | ||
|
|
594a05a097 | ||
|
|
9ccdb62872 | ||
|
|
28d32cf740 | ||
|
|
ecc9b991ab | ||
|
|
5b83a91f9b | ||
|
|
bb7ae777b0 | ||
|
|
06e86a2f3e | ||
|
|
0a84dbb302 | ||
|
|
804f9041a6 | ||
|
|
7e8756a536 | ||
|
|
3b91e79675 | ||
|
|
dfc25e4519 | ||
|
|
d40aecb05d | ||
|
|
34e0b0392f | ||
|
|
8cc4a3c8b9 | ||
|
|
354a3c002a | ||
|
|
7d5eec779e | ||
|
|
90029003be | ||
|
|
c781884532 | ||
|
|
7272fd62a0 | ||
|
|
f21bd62ed0 | ||
|
|
842d0a9aef | ||
|
|
e06645a631 | ||
|
|
ebb65ea90c | ||
|
|
a7831ad809 | ||
|
|
80cfb80397 | ||
|
|
ae281e9935 | ||
|
|
b800ad8427 | ||
|
|
051cf67ce9 | ||
|
|
85e1333ad9 | ||
|
|
f02c7557af | ||
|
|
e82a5cf150 | ||
|
|
c92ce56110 | ||
|
|
4cae954eba | ||
|
|
b9d5838398 | ||
|
|
fcf723c679 | ||
|
|
06b67dcf44 | ||
|
|
61e9cacceb | ||
|
|
475c2f4606 | ||
|
|
20f2bfa449 | ||
|
|
4c0c36d233 | ||
|
|
59f1ee1e1e | ||
|
|
1af90a208e | ||
|
|
22c6b72a75 | ||
|
|
d8c7f8de81 | ||
|
|
f76122f0b0 | ||
|
|
63927db9e4 | ||
|
|
6b28af8329 | ||
|
|
ccebccf8e6 | ||
|
|
279a4efb83 | ||
|
|
ceac1ab25f | ||
|
|
2ba6bcf172 | ||
|
|
ae0669fa07 | ||
|
|
71627f97f7 | ||
|
|
e35338b73d | ||
|
|
a112d38943 | ||
|
|
b705c63a65 | ||
|
|
b4c8f7d097 | ||
|
|
74bac9806f | ||
|
|
65248d7d29 | ||
|
|
dc037bc8dd | ||
|
|
a22db037c7 | ||
|
|
44cc0f7e9a | ||
|
|
eafb337cd1 | ||
|
|
9b3be66287 | ||
|
|
1a10a00f74 | ||
|
|
a196bc27b8 | ||
|
|
ac8e4d9828 | ||
|
|
a6ade336b7 | ||
|
|
350443ad34 | ||
|
|
4c37ef7a2c | ||
|
|
3eedc2a49d | ||
|
|
aaeb1a90e5 | ||
|
|
ed89f9af20 | ||
|
|
863ad0b0e6 | ||
|
|
e2d701a8cc | ||
|
|
2710273069 | ||
|
|
07af18e284 | ||
|
|
519e37f567 | ||
|
|
7cf61eb776 | ||
|
|
f81446909c | ||
|
|
b4115593c0 | ||
|
|
f8bd8b616e | ||
|
|
be55ccd6f4 | ||
|
|
e7db18bd80 | ||
|
|
dff41e0fcb | ||
|
|
43be4324af | ||
|
|
c33baf4c96 | ||
|
|
f95a356025 | ||
|
|
1ba7765898 | ||
|
|
0346fca434 | ||
|
|
d267b2499d | ||
|
|
e3e5f1fbfa | ||
|
|
4697192b43 | ||
|
|
38a293f8f6 | ||
|
|
13e8f992b5 | ||
|
|
c384d0d3a9 | ||
|
|
2b71fa512b | ||
|
|
d381ceb040 | ||
|
|
e18c428f52 | ||
|
|
9fc32dc59b | ||
|
|
6f45622ef1 | ||
|
|
e56c7070c2 | ||
|
|
0aef7a36aa | ||
|
|
c030cf941e | ||
|
|
f6760e4ac7 | ||
|
|
9060c77307 | ||
|
|
a1d018eef4 | ||
|
|
3f724d8fb7 | ||
|
|
49d69a5a02 | ||
|
|
6db9e42876 | ||
|
|
ad3e8f9f53 | ||
|
|
9f39caa247 | ||
|
|
1402a63324 | ||
|
|
a9863e65c3 | ||
|
|
646c58f7d1 | ||
|
|
a78ea7ca9c | ||
|
|
8b8565bf60 | ||
|
|
b9e30f3c1b | ||
|
|
96b6edccf8 | ||
|
|
2af9dc88e6 | ||
|
|
eda25ca3c9 | ||
|
|
c99da17973 | ||
|
|
9e147d7842 | ||
|
|
d7afaf871f | ||
|
|
c4f6d37aa1 | ||
|
|
a5663872d9 | ||
|
|
007283aab3 | ||
|
|
3b612376f2 | ||
|
|
1a312e2140 | ||
|
|
6f5d0400b8 | ||
|
|
aec86cecc0 | ||
|
|
bf1dde7cd1 | ||
|
|
91e9005f08 | ||
|
|
57f9ea2865 | ||
|
|
1f6425fbfd | ||
|
|
e169979bab | ||
|
|
6e9e9c9a6a | ||
|
|
102a369bca | ||
|
|
b318b987a7 | ||
|
|
78ce68160a | ||
|
|
6aff616af4 | ||
|
|
0140a49641 | ||
|
|
732754c566 | ||
|
|
b360a9e572 | ||
|
|
f88fa81616 | ||
|
|
e0e66119f5 | ||
|
|
ba4784f149 | ||
|
|
7fb7c3de9c | ||
|
|
3d2d449d31 | ||
|
|
ca60c33dda | ||
|
|
162512496a | ||
|
|
7819c97839 | ||
|
|
e9c8603c3c | ||
|
|
9e165c337a | ||
|
|
58af1b98c0 | ||
|
|
6a077333c6 | ||
|
|
cb234e6b1b | ||
|
|
67a9f35176 | ||
|
|
9396e8b0c0 | ||
|
|
200d857012 | ||
|
|
1a22b7d0dd | ||
|
|
035cccb97b | ||
|
|
ca1c00acb0 | ||
|
|
8836669c9f | ||
|
|
13e818e135 | ||
|
|
fc0fd2d08c | ||
|
|
cc91cfe7b5 | ||
|
|
33564a311b | ||
|
|
2de416c1fa | ||
|
|
64838df712 | ||
|
|
84ad0200a8 | ||
|
|
046f9c53ab | ||
|
|
62f1139193 | ||
|
|
373be54b04 | ||
|
|
00c3ea07e7 | ||
|
|
5a64bd76fb | ||
|
|
57dbd3cf54 | ||
|
|
e772831f7c | ||
|
|
9363b79454 | ||
|
|
cf97ff724c | ||
|
|
c1f1c0d341 | ||
|
|
fd47225d30 | ||
|
|
0e9e884ab4 | ||
|
|
85d13ddfdf | ||
|
|
deadd8ad07 | ||
|
|
b9e5e5f114 | ||
|
|
e5d948af44 | ||
|
|
352ffa589c | ||
|
|
2dac69b679 | ||
|
|
a062fe0d0b | ||
|
|
67692149a2 | ||
|
|
ec4ab7c49c | ||
|
|
6efa4f2475 | ||
|
|
3a2a129f44 | ||
|
|
a828cacbfe | ||
|
|
5d840a5072 | ||
|
|
db5e63411f | ||
|
|
7457480f02 | ||
|
|
c834627949 | ||
|
|
2a0b87ee3e | ||
|
|
ff83276a2b | ||
|
|
0bea2926d2 | ||
|
|
aa3a8f24b8 | ||
|
|
be493c5343 | ||
|
|
47a2943682 | ||
|
|
5201f8791a | ||
|
|
0f4af44220 | ||
|
|
78bdbe2c3f | ||
|
|
e781bc9458 | ||
|
|
847d1dd4b7 |
@@ -1,6 +1,8 @@
|
||||
# The build artifacts of the jitsi-meet project.
|
||||
build/*
|
||||
|
||||
doc/*
|
||||
|
||||
# Third-party source code which we (1) do not want to modify or (2) try to
|
||||
# modify as little as possible.
|
||||
libs/*
|
||||
|
||||
16
.github/stale.yml
vendored
16
.github/stale.yml
vendored
@@ -1,16 +0,0 @@
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 90
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 7
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- confirmed
|
||||
staleLabel: wontfix
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs. Thank you
|
||||
for your contributions.
|
||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||
closeComment: false
|
||||
|
||||
12
.github/workflows/ci.yml
vendored
12
.github/workflows/ci.yml
vendored
@@ -12,14 +12,24 @@ jobs:
|
||||
with:
|
||||
node-version: 16
|
||||
cache: 'npm'
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v35
|
||||
- name: Get changed lang files
|
||||
id: lang-files
|
||||
run: echo "all=$(echo "${{ steps.changed-files.outputs.all_changed_files }}" | grep -oE 'lang\/\S+' | tr '\n' ' ')" >> "$GITHUB_OUTPUT"
|
||||
- run: npm install
|
||||
- name: Check git status
|
||||
run: git status
|
||||
- name: Normalize lang files to ensure sorted
|
||||
if: steps.lang-files.outputs.all
|
||||
run: npm run lang-sort
|
||||
- name: Check lang files are formatted correctly
|
||||
if: steps.lang-files.outputs.all
|
||||
run: npm run lint:lang
|
||||
- name: Check if the git repository is clean
|
||||
run: $(exit $(git status --porcelain --untracked-files=no | head -255 | wc -l)) || (echo "Dirty git tree"; git diff; exit 1)
|
||||
- run: npm run lint:ci
|
||||
- run: npm run lint:ci && npm run tsc:ci
|
||||
linux-build:
|
||||
name: Build Frontend (Linux)
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
21
.github/workflows/stale.yml
vendored
Normal file
21
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
name: 'Close stale issues and PRs'
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 1 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v8
|
||||
with:
|
||||
stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.'
|
||||
stale-pr-message: 'This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.'
|
||||
stale-issue-label: 'stale'
|
||||
stale-pr-label: 'stale'
|
||||
exempt-issue-labels: 'confirmed,help-needed'
|
||||
exempt-pr-labels: 'confirmed'
|
||||
days-before-issue-stale: 60
|
||||
days-before-pr-stale: 90
|
||||
days-before-issue-close: 10
|
||||
days-before-pr-close: 10
|
||||
17
.gitignore
vendored
17
.gitignore
vendored
@@ -61,8 +61,9 @@ buck-out/
|
||||
|
||||
# fastlane
|
||||
#
|
||||
*/fastlane/report.xml
|
||||
*/fastlane/Preview.html
|
||||
**/fastlane/report.xml
|
||||
**/fastlane/Preview.html
|
||||
**/fastlane/test_output
|
||||
|
||||
# Build artifacts
|
||||
*.jsbundle
|
||||
@@ -93,3 +94,15 @@ twa/*.aab
|
||||
twa/assetlinks.json
|
||||
|
||||
tsconfig.json
|
||||
|
||||
# React Native SDK
|
||||
#
|
||||
react-native-sdk/android/src
|
||||
react-native-sdk/images
|
||||
react-native-sdk/ios
|
||||
react-native-sdk/lang
|
||||
react-native-sdk/modules
|
||||
react-native-sdk/node_modules
|
||||
react-native-sdk/react
|
||||
react-native-sdk/service
|
||||
react-native-sdk/sounds
|
||||
|
||||
5
Makefile
5
Makefile
@@ -63,10 +63,7 @@ deploy-appbundle:
|
||||
|
||||
deploy-lib-jitsi-meet:
|
||||
cp \
|
||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.js \
|
||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.map \
|
||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.e2ee-worker.js \
|
||||
$(LIBJITSIMEET_DIR)/modules/browser/capabilities.json \
|
||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.* \
|
||||
$(DEPLOY_DIR)
|
||||
|
||||
deploy-olm:
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
android:extractNativeLibs="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:name=".MainApplication"
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
android:theme="@style/AppTheme">
|
||||
<meta-data
|
||||
@@ -17,7 +16,8 @@
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name"
|
||||
android:launchMode="singleTask"
|
||||
android:launchMode="singleInstance"
|
||||
android:taskAffinity=""
|
||||
android:name=".MainActivity"
|
||||
android:resizeableActivity="true"
|
||||
android:supportsPictureInPicture="true"
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
* Copyright @ 2022-present 8x8, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jitsi.meet;
|
||||
|
||||
import android.app.Application;
|
||||
import android.util.Log;
|
||||
|
||||
import com.facebook.react.ReactApplication;
|
||||
import com.facebook.react.ReactNativeHost;
|
||||
|
||||
import org.jitsi.meet.sdk.JitsiReactNativeHost;
|
||||
|
||||
/**
|
||||
* Application class for Jitsi Meet. The only reason why this exists is for Detox
|
||||
* to believe our app is a "greenfield" app. SDK users need not use this.
|
||||
*/
|
||||
public class MainApplication extends Application implements ReactApplication {
|
||||
private final ReactNativeHost mReactNativeHost = new JitsiReactNativeHost(this);
|
||||
|
||||
@Override
|
||||
public ReactNativeHost getReactNativeHost() {
|
||||
return mReactNativeHost;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
// Initialize RN
|
||||
Log.d(this.getClass().getCanonicalName(), "app onCreate");
|
||||
getReactNativeHost().getReactInstanceManager();
|
||||
}
|
||||
}
|
||||
@@ -10,16 +10,17 @@ buildscript {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.0.4'
|
||||
classpath 'com.android.tools.build:gradle:7.1.1'
|
||||
classpath 'com.google.gms:google-services:4.3.14'
|
||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
|
||||
}
|
||||
}
|
||||
|
||||
ext {
|
||||
kotlinVersion = "1.7.0"
|
||||
buildToolsVersion = "31.0.0"
|
||||
compileSdkVersion = 32
|
||||
minSdkVersion = 23
|
||||
minSdkVersion = 24
|
||||
targetSdkVersion = 32
|
||||
supportLibVersion = "28.0.0"
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ if [[ $MVN_HTTP == 1 ]]; then
|
||||
deploy:deploy-file \
|
||||
-Durl=${MVN_REPO} \
|
||||
-DrepositoryId=${MVN_REPO_ID} \
|
||||
-Dfile=react-native-${RN_VERSION}.aar \
|
||||
-Dfile=react-native-${RN_VERSION}-release.aar \
|
||||
-Dpackaging=aar \
|
||||
-DgeneratePom=false \
|
||||
-DpomFile=react-native-${RN_VERSION}.pom || true
|
||||
@@ -58,7 +58,7 @@ else
|
||||
mvn \
|
||||
deploy:deploy-file \
|
||||
-Durl=${MVN_REPO} \
|
||||
-Dfile=react-native-${RN_VERSION}.aar \
|
||||
-Dfile=react-native-${RN_VERSION}-release.aar \
|
||||
-Dpackaging=aar \
|
||||
-DgeneratePom=false \
|
||||
-DpomFile=react-native-${RN_VERSION}.pom
|
||||
|
||||
@@ -25,6 +25,7 @@ import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.module.annotations.ReactModule;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -32,7 +33,10 @@ import java.util.Map;
|
||||
class AppInfoModule
|
||||
extends ReactContextBaseJavaModule {
|
||||
|
||||
private static final String BUILD_CONFIG = "org.jitsi.meet.sdk.BuildConfig";
|
||||
public static final String NAME = "AppInfo";
|
||||
public static final boolean GOOGLE_SERVICES_ENABLED = getGoogleServicesEnabled();
|
||||
public static final boolean LIBRE_BUILD = getLibreBuild();
|
||||
|
||||
public AppInfoModule(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
@@ -75,8 +79,8 @@ class AppInfoModule
|
||||
constants.put(
|
||||
"version",
|
||||
packageInfo == null ? "" : packageInfo.versionName);
|
||||
constants.put("LIBRE_BUILD", BuildConfig.LIBRE_BUILD);
|
||||
constants.put("GOOGLE_SERVICES_ENABLED", BuildConfig.GOOGLE_SERVICES_ENABLED);
|
||||
constants.put("LIBRE_BUILD", LIBRE_BUILD);
|
||||
constants.put("GOOGLE_SERVICES_ENABLED", GOOGLE_SERVICES_ENABLED);
|
||||
|
||||
return constants;
|
||||
}
|
||||
@@ -85,4 +89,47 @@ class AppInfoModule
|
||||
public String getName() {
|
||||
return NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if libre google services object is null based on build configuration.
|
||||
*/
|
||||
private static boolean getGoogleServicesEnabled() {
|
||||
Object googleServicesEnabled = getBuildConfigValue("GOOGLE_SERVICES_ENABLED");
|
||||
|
||||
if (googleServicesEnabled !=null) {
|
||||
return (Boolean) googleServicesEnabled;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if libre build field is null based on build configuration.
|
||||
*/
|
||||
private static boolean getLibreBuild() {
|
||||
Object libreBuild = getBuildConfigValue("LIBRE_BUILD");
|
||||
|
||||
if (libreBuild !=null) {
|
||||
return (Boolean) libreBuild;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets build config value of a certain field.
|
||||
*
|
||||
* @param fieldName Field from build config.
|
||||
*/
|
||||
private static Object getBuildConfigValue(String fieldName) {
|
||||
try {
|
||||
Class<?> c = Class.forName(BUILD_CONFIG);
|
||||
Field f = c.getDeclaredField(fieldName);
|
||||
f.setAccessible(true);
|
||||
return f.get(null);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,6 +45,12 @@ class AudioDeviceHandlerGeneric implements
|
||||
*/
|
||||
private AudioModeModule module;
|
||||
|
||||
/**
|
||||
* Constant defining a Hearing Aid. Only available on API level >= 28.
|
||||
* The value of: AudioDeviceInfo.TYPE_HEARING_AID
|
||||
*/
|
||||
private static final int TYPE_HEARING_AID = 23;
|
||||
|
||||
/**
|
||||
* Constant defining a USB headset. Only available on API level >= 26.
|
||||
* The value of: AudioDeviceInfo.TYPE_USB_HEADSET
|
||||
@@ -85,6 +91,7 @@ class AudioDeviceHandlerGeneric implements
|
||||
break;
|
||||
case AudioDeviceInfo.TYPE_WIRED_HEADPHONES:
|
||||
case AudioDeviceInfo.TYPE_WIRED_HEADSET:
|
||||
case TYPE_HEARING_AID:
|
||||
case TYPE_USB_HEADSET:
|
||||
devices.add(AudioModeModule.DEVICE_HEADPHONES);
|
||||
break;
|
||||
|
||||
@@ -13,6 +13,7 @@ import android.telecom.PhoneAccount;
|
||||
import android.telecom.PhoneAccountHandle;
|
||||
import android.telecom.TelecomManager;
|
||||
import android.telecom.VideoProfile;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import com.facebook.react.bridge.Promise;
|
||||
@@ -357,7 +358,7 @@ public class ConnectionService extends android.telecom.ConnectionService {
|
||||
JitsiMeetLogger.i(TAG + " onDisconnect " + getCallUUID());
|
||||
WritableNativeMap data = new WritableNativeMap();
|
||||
data.putString("callUUID", getCallUUID());
|
||||
ReactInstanceManagerHolder.emitEvent(
|
||||
RNConnectionService.getInstance().emitEvent(
|
||||
"org.jitsi.meet:features/connection_service#disconnect",
|
||||
data);
|
||||
// The JavaScript side will not go back to the native with
|
||||
@@ -377,7 +378,7 @@ public class ConnectionService extends android.telecom.ConnectionService {
|
||||
JitsiMeetLogger.i(TAG + " onAbort " + getCallUUID());
|
||||
WritableNativeMap data = new WritableNativeMap();
|
||||
data.putString("callUUID", getCallUUID());
|
||||
ReactInstanceManagerHolder.emitEvent(
|
||||
RNConnectionService.getInstance().emitEvent(
|
||||
"org.jitsi.meet:features/connection_service#abort",
|
||||
data);
|
||||
// The JavaScript side will not go back to the native with
|
||||
@@ -406,7 +407,7 @@ public class ConnectionService extends android.telecom.ConnectionService {
|
||||
@Override
|
||||
public void onCallAudioStateChanged(CallAudioState state) {
|
||||
JitsiMeetLogger.d(TAG + " onCallAudioStateChanged: " + state);
|
||||
RNConnectionService module = ReactInstanceManagerHolder.getNativeModule(RNConnectionService.class);
|
||||
RNConnectionService module = RNConnectionService.getInstance();
|
||||
if (module != null) {
|
||||
module.onCallAudioStateChange(state);
|
||||
}
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import org.webrtc.VideoCodecInfo;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
/** Container for static helper functions related to dealing with H264 codecs. */
|
||||
class H264Utils {
|
||||
public static final String H264_FMTP_PROFILE_LEVEL_ID = "profile-level-id";
|
||||
public static final String H264_FMTP_LEVEL_ASYMMETRY_ALLOWED = "level-asymmetry-allowed";
|
||||
public static final String H264_FMTP_PACKETIZATION_MODE = "packetization-mode";
|
||||
|
||||
public static final String H264_PROFILE_CONSTRAINED_BASELINE = "42e0";
|
||||
public static final String H264_PROFILE_CONSTRAINED_HIGH = "640c";
|
||||
public static final String H264_LEVEL_3_1 = "1f"; // 31 in hex.
|
||||
public static final String H264_CONSTRAINED_HIGH_3_1 =
|
||||
H264_PROFILE_CONSTRAINED_HIGH + H264_LEVEL_3_1;
|
||||
public static final String H264_CONSTRAINED_BASELINE_3_1 =
|
||||
H264_PROFILE_CONSTRAINED_BASELINE + H264_LEVEL_3_1;
|
||||
|
||||
public static Map<String, String> getDefaultH264Params(boolean isHighProfile) {
|
||||
final Map<String, String> params = new HashMap<>();
|
||||
params.put(VideoCodecInfo.H264_FMTP_LEVEL_ASYMMETRY_ALLOWED, "1");
|
||||
params.put(VideoCodecInfo.H264_FMTP_PACKETIZATION_MODE, "1");
|
||||
params.put(VideoCodecInfo.H264_FMTP_PROFILE_LEVEL_ID,
|
||||
isHighProfile ? VideoCodecInfo.H264_CONSTRAINED_HIGH_3_1
|
||||
: VideoCodecInfo.H264_CONSTRAINED_BASELINE_3_1);
|
||||
return params;
|
||||
}
|
||||
|
||||
public static VideoCodecInfo DEFAULT_H264_BASELINE_PROFILE_CODEC =
|
||||
new VideoCodecInfo("H264", getDefaultH264Params(/* isHighProfile= */ false));
|
||||
public static VideoCodecInfo DEFAULT_H264_HIGH_PROFILE_CODEC =
|
||||
new VideoCodecInfo("H264", getDefaultH264Params(/* isHighProfile= */ true));
|
||||
}
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
@@ -177,8 +178,11 @@ public class JitsiMeetActivity extends AppCompatActivity
|
||||
}
|
||||
|
||||
protected void leave() {
|
||||
Intent hangupBroadcastIntent = BroadcastIntentHelper.buildHangUpIntent();
|
||||
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(hangupBroadcastIntent);
|
||||
if (this.jitsiView != null) {
|
||||
this.jitsiView.abort();
|
||||
} else {
|
||||
JitsiMeetLogger.w("Cannot leave, view is null");
|
||||
}
|
||||
}
|
||||
|
||||
private @Nullable
|
||||
@@ -295,6 +299,7 @@ public class JitsiMeetActivity extends AppCompatActivity
|
||||
JitsiMeetActivityDelegate.requestPermissions(this, permissions, requestCode, listener);
|
||||
}
|
||||
|
||||
@SuppressLint("MissingSuperCall")
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
|
||||
JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
|
||||
@@ -157,6 +157,14 @@ public class JitsiMeetView extends FrameLayout {
|
||||
setProps(options != null ? options.asProps() : new Bundle());
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method which aborts running RN by passing empty props.
|
||||
* This is only meant to be used from the enclosing Activity's onDestroy.
|
||||
*/
|
||||
public void abort() {
|
||||
setProps(new Bundle());
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the {@code ReactRootView} for the given app name with the given
|
||||
* props. Once created it's set as the view of this {@code FrameLayout}.
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import com.facebook.react.ReactInstanceManager;
|
||||
import com.facebook.react.ReactNativeHost;
|
||||
import com.facebook.react.ReactPackage;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This is the minimal implementation of ReactNativeHost that will make things like the
|
||||
* Detox testing framework believe we are a "greenfield" app.
|
||||
*
|
||||
* Generally speaking, apps using the SDK (other than the Jitsi Meet app itself) should not
|
||||
* need to use this because the
|
||||
*/
|
||||
public class JitsiReactNativeHost extends ReactNativeHost {
|
||||
public JitsiReactNativeHost(Application application) {
|
||||
super(application);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getUseDeveloperSupport() {
|
||||
// Unused since we override `createReactInstanceManager`.
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<ReactPackage> getPackages() {
|
||||
// Unused since we override `createReactInstanceManager`.
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ReactInstanceManager createReactInstanceManager() {
|
||||
ReactInstanceManagerHolder.initReactInstanceManager(this.getApplication());
|
||||
|
||||
return ReactInstanceManagerHolder.getReactInstanceManager();
|
||||
}
|
||||
}
|
||||
@@ -10,14 +10,19 @@ import android.telecom.PhoneAccount;
|
||||
import android.telecom.PhoneAccountHandle;
|
||||
import android.telecom.TelecomManager;
|
||||
import android.telecom.VideoProfile;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import com.facebook.react.bridge.NativeModule;
|
||||
import com.facebook.react.bridge.Promise;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.module.annotations.ReactModule;
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||
|
||||
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
|
||||
|
||||
@@ -35,6 +40,7 @@ class RNConnectionService extends ReactContextBaseJavaModule {
|
||||
|
||||
private static final String TAG = ConnectionService.TAG;
|
||||
|
||||
private static RNConnectionService sRNConnectionServiceInstance;
|
||||
/**
|
||||
* Handler for dealing with call state changes. We are acting as a proxy between ConnectionService
|
||||
* and other modules such as {@link AudioModeModule}.
|
||||
@@ -57,6 +63,11 @@ class RNConnectionService extends ReactContextBaseJavaModule {
|
||||
|
||||
RNConnectionService(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
sRNConnectionServiceInstance = this;
|
||||
}
|
||||
|
||||
static RNConnectionService getInstance() {
|
||||
return sRNConnectionServiceInstance;
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
@@ -226,4 +237,22 @@ class RNConnectionService extends ReactContextBaseJavaModule {
|
||||
interface CallAudioStateListener {
|
||||
void onCallAudioStateChange(android.telecom.CallAudioState callAudioState);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to send an event to JavaScript.
|
||||
*
|
||||
* @param eventName {@code String} containing the event name.
|
||||
* @param data {@code Object} optional ancillary data for the event.
|
||||
*/
|
||||
void emitEvent(
|
||||
String eventName,
|
||||
@Nullable Object data) {
|
||||
ReactContext reactContext = getReactApplicationContext();
|
||||
|
||||
if (reactContext != null) {
|
||||
reactContext
|
||||
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
|
||||
.emit(eventName, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -32,17 +31,17 @@ import com.facebook.react.jscexecutor.JSCExecutorFactory;
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||
import com.facebook.react.uimanager.ViewManager;
|
||||
import com.oney.WebRTCModule.EglUtils;
|
||||
import com.oney.WebRTCModule.RTCVideoViewManager;
|
||||
import com.oney.WebRTCModule.WebRTCModule;
|
||||
import com.oney.WebRTCModule.WebRTCModuleOptions;
|
||||
import com.oney.WebRTCModule.webrtcutils.H264AndSoftwareVideoDecoderFactory;
|
||||
import com.oney.WebRTCModule.webrtcutils.H264AndSoftwareVideoEncoderFactory;
|
||||
|
||||
import org.devio.rn.splashscreen.SplashScreenModule;
|
||||
import org.webrtc.EglBase;
|
||||
import org.webrtc.audio.AudioDeviceModule;
|
||||
import org.webrtc.audio.JavaAudioDeviceModule;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
class ReactInstanceManagerHolder {
|
||||
@@ -79,30 +78,11 @@ class ReactInstanceManagerHolder {
|
||||
nativeModules.add(new RNConnectionService(reactContext));
|
||||
}
|
||||
|
||||
// Initialize the WebRTC module by hand, since we want to override some
|
||||
// initialization options.
|
||||
WebRTCModule.Options options = new WebRTCModule.Options();
|
||||
|
||||
AudioDeviceModule adm = JavaAudioDeviceModule.builder(reactContext)
|
||||
.setEnableVolumeLogger(false)
|
||||
.createAudioDeviceModule();
|
||||
options.setAudioDeviceModule(adm);
|
||||
|
||||
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
|
||||
|
||||
options.setVideoDecoderFactory(new WebRTCVideoDecoderFactory(eglContext));
|
||||
options.setVideoEncoderFactory(new WebRTCVideoEncoderFactory(eglContext));
|
||||
|
||||
nativeModules.add(new WebRTCModule(reactContext, options));
|
||||
|
||||
return nativeModules;
|
||||
}
|
||||
|
||||
private static List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
||||
return Arrays.<ViewManager>asList(
|
||||
// WebRTC, see createNativeModules for details.
|
||||
new RTCVideoViewManager()
|
||||
);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
static List<ReactPackage> getReactNativePackages() {
|
||||
@@ -122,6 +102,7 @@ class ReactInstanceManagerHolder {
|
||||
new com.reactnativecommunity.webview.RNCWebViewPackage(),
|
||||
new com.kevinresol.react_native_default_preference.RNDefaultPreferencePackage(),
|
||||
new com.learnium.RNDeviceInfo.RNDeviceInfo(),
|
||||
new com.oney.WebRTCModule.WebRTCModulePackage(),
|
||||
new com.swmansion.gesturehandler.RNGestureHandlerPackage(),
|
||||
new org.linusu.RNGetRandomValuesPackage(),
|
||||
new com.rnimmersive.RNImmersivePackage(),
|
||||
@@ -239,35 +220,6 @@ class ReactInstanceManagerHolder {
|
||||
return reactInstanceManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method to initialize the React Native instance manager. We
|
||||
* create a single instance in order to load the JavaScript bundle a single
|
||||
* time. All {@code ReactRootView} instances will be tied to the one and
|
||||
* only {@code ReactInstanceManager}.
|
||||
*
|
||||
* This method is only meant to be called when integrating with {@code JitsiReactNativeHost}.
|
||||
*
|
||||
* @param app {@code Application} current running Application.
|
||||
*/
|
||||
static void initReactInstanceManager(Application app) {
|
||||
if (reactInstanceManager != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Log.d(TAG, "initializing RN with Application");
|
||||
|
||||
reactInstanceManager
|
||||
= ReactInstanceManager.builder()
|
||||
.setApplication(app)
|
||||
.setBundleAssetName("index.android.bundle")
|
||||
.setJSMainModulePath("index.android")
|
||||
.setJavaScriptExecutorFactory(getReactNativeJSFactory())
|
||||
.addPackages(getReactNativePackages())
|
||||
.setUseDeveloperSupport(BuildConfig.DEBUG)
|
||||
.setInitialLifecycleState(LifecycleState.BEFORE_CREATE)
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method to initialize the React Native instance manager. We
|
||||
* create a single instance in order to load the JavaScript bundle a single
|
||||
@@ -281,7 +233,15 @@ class ReactInstanceManagerHolder {
|
||||
return;
|
||||
}
|
||||
|
||||
Log.d(ReactInstanceManagerHolder.class.getCanonicalName(), "initializing RN with Activity");
|
||||
// Initialize the WebRTC module options.
|
||||
WebRTCModuleOptions options = WebRTCModuleOptions.getInstance();
|
||||
|
||||
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
|
||||
|
||||
options.videoDecoderFactory = new H264AndSoftwareVideoDecoderFactory(eglContext);
|
||||
options.videoEncoderFactory = new H264AndSoftwareVideoEncoderFactory(eglContext);
|
||||
|
||||
Log.d(TAG, "initializing RN with Activity");
|
||||
|
||||
reactInstanceManager
|
||||
= ReactInstanceManager.builder()
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
/** Enumeration of supported video codec types. */
|
||||
public enum VideoCodecMimeType {
|
||||
VP8("video/x-vnd.on2.vp8"),
|
||||
VP9("video/x-vnd.on2.vp9"),
|
||||
H264("video/avc"),
|
||||
AV1("video/av01");
|
||||
|
||||
private final String mimeType;
|
||||
|
||||
private VideoCodecMimeType(String mimeType) {
|
||||
this.mimeType = mimeType;
|
||||
}
|
||||
|
||||
String mimeType() {
|
||||
return mimeType;
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.webrtc.EglBase;
|
||||
import org.webrtc.HardwareVideoDecoderFactory;
|
||||
import org.webrtc.SoftwareVideoDecoderFactory;
|
||||
import org.webrtc.VideoCodecInfo;
|
||||
import org.webrtc.VideoDecoder;
|
||||
import org.webrtc.VideoDecoderFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This is a custom video decoder factory for WebRTC which behaves similarly
|
||||
* to the default one in iOS. It supports the following codecs:
|
||||
*
|
||||
* - In hardware: H.264 (baseline)
|
||||
* - In software: VP8, VP9, AV1
|
||||
*/
|
||||
public class WebRTCVideoDecoderFactory implements VideoDecoderFactory {
|
||||
private final VideoDecoderFactory hardwareVideoDecoderFactory;
|
||||
private final VideoDecoderFactory softwareVideoDecoderFactory = new SoftwareVideoDecoderFactory();
|
||||
|
||||
public WebRTCVideoDecoderFactory(@Nullable EglBase.Context eglContext) {
|
||||
this.hardwareVideoDecoderFactory = new HardwareVideoDecoderFactory(eglContext);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public VideoDecoder createDecoder(VideoCodecInfo codecInfo) {
|
||||
if (codecInfo.name.equalsIgnoreCase(VideoCodecMimeType.H264.name())) {
|
||||
return this.hardwareVideoDecoderFactory.createDecoder(codecInfo);
|
||||
}
|
||||
|
||||
return this.softwareVideoDecoderFactory.createDecoder(codecInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VideoCodecInfo[] getSupportedCodecs() {
|
||||
List<VideoCodecInfo> codecs = new ArrayList<>();
|
||||
|
||||
codecs.add(H264Utils.DEFAULT_H264_BASELINE_PROFILE_CODEC);
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.name(), new HashMap<>()));
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.name(), new HashMap<>()));
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.name(), new HashMap<>()));
|
||||
|
||||
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
|
||||
}
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.webrtc.EglBase;
|
||||
import org.webrtc.HardwareVideoEncoderFactory;
|
||||
import org.webrtc.SoftwareVideoEncoderFactory;
|
||||
import org.webrtc.VideoCodecInfo;
|
||||
import org.webrtc.VideoEncoder;
|
||||
import org.webrtc.VideoEncoderFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This is a custom video encoder factory for WebRTC which behaves similarly
|
||||
* to the default one in iOS. It supports the following codecs:
|
||||
*
|
||||
* - In hardware: H.264 (baseline)
|
||||
* - In software: VP8, VP9, AV1
|
||||
*/
|
||||
public class WebRTCVideoEncoderFactory implements VideoEncoderFactory {
|
||||
private final VideoEncoderFactory hardwareVideoEncoderFactory;
|
||||
private final VideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();
|
||||
|
||||
public WebRTCVideoEncoderFactory(@Nullable EglBase.Context eglContext) {
|
||||
this.hardwareVideoEncoderFactory =
|
||||
new HardwareVideoEncoderFactory(eglContext, false, false);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public VideoEncoder createEncoder(VideoCodecInfo codecInfo) {
|
||||
if (codecInfo.name.equalsIgnoreCase(VideoCodecMimeType.H264.name())) {
|
||||
return this.hardwareVideoEncoderFactory.createEncoder(codecInfo);
|
||||
}
|
||||
|
||||
return this.softwareVideoEncoderFactory.createEncoder(codecInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VideoCodecInfo[] getSupportedCodecs() {
|
||||
List<VideoCodecInfo> codecs = new ArrayList<>();
|
||||
|
||||
codecs.add(H264Utils.DEFAULT_H264_BASELINE_PROFILE_CODEC);
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.name(), new HashMap<>()));
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.name(), new HashMap<>()));
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.name(), new HashMap<>()));
|
||||
|
||||
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
|
||||
}
|
||||
}
|
||||
2
app.js
2
app.js
@@ -18,7 +18,6 @@ import './react/features/base/jitsi-local-storage/setup';
|
||||
import conference from './conference';
|
||||
import API from './modules/API';
|
||||
import UI from './modules/UI/UI';
|
||||
import keyboardshortcut from './modules/keyboardshortcut/keyboardshortcut';
|
||||
import translation from './modules/translation/translation';
|
||||
|
||||
// Initialize Olm as early as possible.
|
||||
@@ -38,7 +37,6 @@ window.APP = {
|
||||
'index.loaded': window.indexLoadedTime
|
||||
},
|
||||
|
||||
keyboardshortcut,
|
||||
translation,
|
||||
UI
|
||||
};
|
||||
|
||||
309
conference.js
309
conference.js
@@ -58,6 +58,7 @@ import {
|
||||
commonUserLeftHandling,
|
||||
getConferenceOptions,
|
||||
getVisitorOptions,
|
||||
restoreConferenceOptions,
|
||||
sendLocalParticipant
|
||||
} from './react/features/base/conference/functions';
|
||||
import { overwriteConfig } from './react/features/base/config/actions';
|
||||
@@ -86,6 +87,7 @@ import {
|
||||
} from './react/features/base/lib-jitsi-meet';
|
||||
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
|
||||
import {
|
||||
gumPending,
|
||||
setAudioAvailable,
|
||||
setAudioMuted,
|
||||
setAudioUnmutePermissions,
|
||||
@@ -99,6 +101,7 @@ import {
|
||||
getStartWithVideoMuted,
|
||||
isVideoMutedByUser
|
||||
} from './react/features/base/media/functions';
|
||||
import { IGUMPendingState } from './react/features/base/media/types';
|
||||
import {
|
||||
dominantSpeakerChanged,
|
||||
localParticipantAudioLevelChanged,
|
||||
@@ -139,6 +142,7 @@ import { downloadJSON } from './react/features/base/util/downloadJSON';
|
||||
import { showDesktopPicker } from './react/features/desktop-picker/actions';
|
||||
import { appendSuffix } from './react/features/display-name/functions';
|
||||
import { maybeOpenFeedbackDialog, submitFeedback } from './react/features/feedback/actions';
|
||||
import { initKeyboardShortcuts } from './react/features/keyboard-shortcuts/actions';
|
||||
import { maybeSetLobbyChatMessageListener } from './react/features/lobby/actions.any';
|
||||
import { setNoiseSuppressionEnabled } from './react/features/noise-suppression/actions';
|
||||
import { hideNotification, showNotification, showWarningNotification } from './react/features/notifications/actions';
|
||||
@@ -161,6 +165,7 @@ import { endpointMessageReceived } from './react/features/subtitles/actions.any'
|
||||
import { handleToggleVideoMuted } from './react/features/toolbox/actions.any';
|
||||
import { muteLocal } from './react/features/video-menu/actions.any';
|
||||
import { setIAmVisitor } from './react/features/visitors/actions';
|
||||
import { iAmVisitor } from './react/features/visitors/functions';
|
||||
import UIEvents from './service/UI/UIEvents';
|
||||
|
||||
const logger = Logger.getLogger(__filename);
|
||||
@@ -358,12 +363,16 @@ class ConferenceConnector {
|
||||
const [ vnode ] = params;
|
||||
|
||||
APP.store.dispatch(overwriteConfig(newConfig))
|
||||
.then(this._conference.leaveRoom())
|
||||
.then(APP.store.dispatch(setIAmVisitor(Boolean(vnode))))
|
||||
.then(() => this._conference.leaveRoom())
|
||||
.then(() => APP.store.dispatch(setIAmVisitor(Boolean(vnode))))
|
||||
|
||||
// we do not clear local tracks on error, so we need to manually clear them
|
||||
.then(APP.store.dispatch(destroyLocalTracks()))
|
||||
.then(() => APP.store.dispatch(destroyLocalTracks()))
|
||||
.then(() => {
|
||||
// Reset VideoLayout. It's destroyed in features/video-layout/middleware.web.js so re-initialize it.
|
||||
VideoLayout.initLargeVideo();
|
||||
VideoLayout.resizeVideoArea();
|
||||
|
||||
connect(this._conference.roomName).then(con => {
|
||||
this._conference.startConference(con, []);
|
||||
});
|
||||
@@ -402,10 +411,28 @@ class ConferenceConnector {
|
||||
room.leave(CONFERENCE_LEAVE_REASONS.UNRECOVERABLE_ERROR).then(() => connection.disconnect());
|
||||
break;
|
||||
|
||||
case JitsiConferenceErrors.CONFERENCE_MAX_USERS:
|
||||
case JitsiConferenceErrors.CONFERENCE_MAX_USERS: {
|
||||
APP.UI.notifyMaxUsersLimitReached();
|
||||
break;
|
||||
|
||||
// in case of max users(it can be from a visitor node), let's restore
|
||||
// oldConfig if any as we will be back to the main prosody
|
||||
const newConfig = restoreConferenceOptions(APP.store.getState());
|
||||
|
||||
if (newConfig) {
|
||||
APP.store.dispatch(overwriteConfig(newConfig))
|
||||
.then(() => this._conference.leaveRoom())
|
||||
.then(() => {
|
||||
_connectionPromise = connect(this._conference.roomName);
|
||||
|
||||
return _connectionPromise;
|
||||
})
|
||||
.then(con => {
|
||||
APP.connection = connection = con;
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case JitsiConferenceErrors.INCOMPATIBLE_SERVER_VERSIONS:
|
||||
APP.store.dispatch(reloadWithStoredParams());
|
||||
break;
|
||||
@@ -468,6 +495,21 @@ function disconnect() {
|
||||
return connection.disconnect().then(onDisconnected, onDisconnected);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the GUM pending state for the tracks that have failed.
|
||||
*
|
||||
* NOTE: Some of the track that we will be setting to GUM pending state NONE may not have failed but they may have
|
||||
* been requested. This won't be a problem because their current GUM pending state will be NONE anyway.
|
||||
* @param {JitsiLocalTrack} tracks - The tracks that have been created.
|
||||
* @returns {void}
|
||||
*/
|
||||
function setGUMPendingStateOnFailedTracks(tracks) {
|
||||
const tracksTypes = tracks.map(track => track.getType());
|
||||
const nonPendingTracks = [ MEDIA_TYPE.AUDIO, MEDIA_TYPE.VIDEO ].filter(type => !tracksTypes.includes(type));
|
||||
|
||||
APP.store.dispatch(gumPending(nonPendingTracks, IGUMPendingState.NONE));
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles CONNECTION_FAILED events from lib-jitsi-meet.
|
||||
*
|
||||
@@ -534,7 +576,7 @@ export default {
|
||||
);
|
||||
}
|
||||
|
||||
let tryCreateLocalTracks;
|
||||
let tryCreateLocalTracks = Promise.resolve([]);
|
||||
|
||||
// On Electron there is no permission prompt for granting permissions. That's why we don't need to
|
||||
// spend much time displaying the overlay screen. If GUM is not resolved within 15 seconds it will
|
||||
@@ -575,76 +617,66 @@ export default {
|
||||
|
||||
return [];
|
||||
});
|
||||
} else if (!requestedAudio && !requestedVideo) {
|
||||
// Resolve with no tracks
|
||||
tryCreateLocalTracks = Promise.resolve([]);
|
||||
} else {
|
||||
} else if (requestedAudio || requestedVideo) {
|
||||
APP.store.dispatch(gumPending(initialDevices, IGUMPendingState.PENDING_UNMUTE));
|
||||
tryCreateLocalTracks = createLocalTracksF({
|
||||
devices: initialDevices,
|
||||
timeout,
|
||||
firePermissionPromptIsShownEvent: true
|
||||
})
|
||||
.catch(err => {
|
||||
if (requestedAudio && requestedVideo) {
|
||||
|
||||
// Try audio only...
|
||||
errors.audioAndVideoError = err;
|
||||
|
||||
if (err.name === JitsiTrackErrors.TIMEOUT && !browser.isElectron()) {
|
||||
// In this case we expect that the permission prompt is still visible. There is no point of
|
||||
// executing GUM with different source. Also at the time of writing the following
|
||||
// inconsistency have been noticed in some browsers - if the permissions prompt is visible
|
||||
// and another GUM is executed the prompt does not change its content but if the user
|
||||
// clicks allow the user action isassociated with the latest GUM call.
|
||||
errors.audioOnlyError = err;
|
||||
errors.videoOnlyError = err;
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
return createLocalTracksF(audioOptions);
|
||||
} else if (requestedAudio && !requestedVideo) {
|
||||
errors.audioOnlyError = err;
|
||||
|
||||
return [];
|
||||
} else if (requestedVideo && !requestedAudio) {
|
||||
errors.videoOnlyError = err;
|
||||
|
||||
return [];
|
||||
}
|
||||
logger.error('Should never happen');
|
||||
})
|
||||
.catch(err => {
|
||||
// Log this just in case...
|
||||
if (!requestedAudio) {
|
||||
logger.error('The impossible just happened', err);
|
||||
}
|
||||
errors.audioOnlyError = err;
|
||||
|
||||
// Try video only...
|
||||
return requestedVideo
|
||||
? createLocalTracksF({
|
||||
devices: [ MEDIA_TYPE.VIDEO ],
|
||||
firePermissionPromptIsShownEvent: true
|
||||
})
|
||||
: [];
|
||||
})
|
||||
.catch(err => {
|
||||
// Log this just in case...
|
||||
if (!requestedVideo) {
|
||||
logger.error('The impossible just happened', err);
|
||||
}
|
||||
errors.videoOnlyError = err;
|
||||
.catch(async error => {
|
||||
if (error.name === JitsiTrackErrors.TIMEOUT && !browser.isElectron()) {
|
||||
errors.audioAndVideoError = error;
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
// Retry with separate gUM calls.
|
||||
const gUMPromises = [];
|
||||
const tracks = [];
|
||||
|
||||
if (requestedAudio) {
|
||||
gUMPromises.push(createLocalTracksF(audioOptions));
|
||||
}
|
||||
|
||||
if (requestedVideo) {
|
||||
gUMPromises.push(createLocalTracksF({
|
||||
devices: [ MEDIA_TYPE.VIDEO ],
|
||||
timeout,
|
||||
firePermissionPromptIsShownEvent: true
|
||||
}));
|
||||
}
|
||||
|
||||
const results = await Promise.allSettled(gUMPromises);
|
||||
let errorMsg;
|
||||
|
||||
results.forEach((result, idx) => {
|
||||
if (result.status === 'fulfilled') {
|
||||
tracks.push(result.value[0]);
|
||||
} else {
|
||||
errorMsg = result.reason;
|
||||
const isAudio = idx === 0;
|
||||
|
||||
logger.error(`${isAudio ? 'Audio' : 'Video'} track creation failed with error ${errorMsg}`);
|
||||
if (isAudio) {
|
||||
errors.audioOnlyError = errorMsg;
|
||||
} else {
|
||||
errors.videoOnlyError = errorMsg;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (errors.audioOnlyError && errors.videoOnlyError) {
|
||||
errors.audioAndVideoError = errorMsg;
|
||||
}
|
||||
|
||||
return tracks;
|
||||
});
|
||||
}
|
||||
|
||||
// Hide the permissions prompt/overlay as soon as the tracks are
|
||||
// created. Don't wait for the connection to be made, since in some
|
||||
// cases, when auth is required, for instance, that won't happen until
|
||||
// the user inputs their credentials, but the dialog would be
|
||||
// overshadowed by the overlay.
|
||||
// Hide the permissions prompt/overlay as soon as the tracks are created. Don't wait for the connection to
|
||||
// be established, as in some cases like when auth is required, connection won't be established until the user
|
||||
// inputs their credentials, but the dialog would be overshadowed by the overlay.
|
||||
tryCreateLocalTracks.then(tracks => {
|
||||
APP.store.dispatch(mediaPermissionPromptVisibilityChanged(false));
|
||||
|
||||
@@ -781,46 +813,55 @@ export default {
|
||||
* @returns {Promise}
|
||||
*/
|
||||
async init({ roomName }) {
|
||||
const state = APP.store.getState();
|
||||
const initialOptions = {
|
||||
startAudioOnly: config.startAudioOnly,
|
||||
startScreenSharing: config.startScreenSharing,
|
||||
startWithAudioMuted: getStartWithAudioMuted(APP.store.getState())
|
||||
|| isUserInteractionRequiredForUnmute(APP.store.getState()),
|
||||
startWithVideoMuted: getStartWithVideoMuted(APP.store.getState())
|
||||
|| isUserInteractionRequiredForUnmute(APP.store.getState())
|
||||
startWithAudioMuted: getStartWithAudioMuted(state) || isUserInteractionRequiredForUnmute(state),
|
||||
startWithVideoMuted: getStartWithVideoMuted(state) || isUserInteractionRequiredForUnmute(state)
|
||||
};
|
||||
|
||||
this.roomName = roomName;
|
||||
|
||||
try {
|
||||
// Initialize the device list first. This way, when creating tracks
|
||||
// based on preferred devices, loose label matching can be done in
|
||||
// cases where the exact ID match is no longer available, such as
|
||||
// when the camera device has switched USB ports.
|
||||
// when in startSilent mode we want to start with audio muted
|
||||
// Initialize the device list first. This way, when creating tracks based on preferred devices, loose label
|
||||
// matching can be done in cases where the exact ID match is no longer available, such as -
|
||||
// 1. When the camera device has switched USB ports.
|
||||
// 2. When in startSilent mode we want to start with audio muted
|
||||
await this._initDeviceList();
|
||||
} catch (error) {
|
||||
logger.warn('initial device list initialization failed', error);
|
||||
}
|
||||
|
||||
const handleStartAudioMuted = (options, tracks) => {
|
||||
if (options.startWithAudioMuted) {
|
||||
// Filter out the local tracks based on various config options, i.e., when user joins muted or is muted by
|
||||
// focus. However, audio track will always be created even though it is not added to the conference since we
|
||||
// want audio related features (noisy mic, talk while muted, etc.) to work even if the mic is muted.
|
||||
const handleInitialTracks = (options, tracks) => {
|
||||
let localTracks = tracks;
|
||||
|
||||
// No local tracks are added when user joins as a visitor.
|
||||
if (iAmVisitor(state)) {
|
||||
return [];
|
||||
}
|
||||
if (options.startWithAudioMuted || room?.isStartAudioMuted()) {
|
||||
// Always add the track on Safari because of a known issue where audio playout doesn't happen
|
||||
// if the user joins audio and video muted, i.e., if there is no local media capture.
|
||||
if (browser.isWebKitBased()) {
|
||||
this.muteAudio(true, true);
|
||||
} else {
|
||||
return tracks.filter(track => track.getType() !== MEDIA_TYPE.AUDIO);
|
||||
localTracks = localTracks.filter(track => track.getType() !== MEDIA_TYPE.AUDIO);
|
||||
}
|
||||
}
|
||||
if (room?.isStartVideoMuted()) {
|
||||
localTracks = localTracks.filter(track => track.getType() !== MEDIA_TYPE.VIDEO);
|
||||
}
|
||||
|
||||
return tracks;
|
||||
return localTracks;
|
||||
};
|
||||
|
||||
if (isPrejoinPageVisible(APP.store.getState())) {
|
||||
if (isPrejoinPageVisible(state)) {
|
||||
_connectionPromise = connect(roomName).then(c => {
|
||||
// we want to initialize it early, in case of errors to be able
|
||||
// to gather logs
|
||||
// We want to initialize it early, in case of errors to be able to gather logs.
|
||||
APP.connection = c;
|
||||
|
||||
return c;
|
||||
@@ -833,43 +874,38 @@ export default {
|
||||
APP.store.dispatch(makePrecallTest(this._getConferenceOptions()));
|
||||
|
||||
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks(initialOptions);
|
||||
const tracks = await tryCreateLocalTracks;
|
||||
const localTracks = await tryCreateLocalTracks;
|
||||
|
||||
// Initialize device list a second time to ensure device labels
|
||||
// get populated in case of an initial gUM acceptance; otherwise
|
||||
// they may remain as empty strings.
|
||||
// Initialize device list a second time to ensure device labels get populated in case of an initial gUM
|
||||
// acceptance; otherwise they may remain as empty strings.
|
||||
this._initDeviceList(true);
|
||||
|
||||
if (isPrejoinPageVisible(APP.store.getState())) {
|
||||
return APP.store.dispatch(initPrejoin(tracks, errors));
|
||||
if (isPrejoinPageVisible(state)) {
|
||||
APP.store.dispatch(gumPending([ MEDIA_TYPE.AUDIO, MEDIA_TYPE.VIDEO ], IGUMPendingState.NONE));
|
||||
|
||||
return APP.store.dispatch(initPrejoin(localTracks, errors));
|
||||
}
|
||||
|
||||
logger.debug('Prejoin screen no longer displayed at the time when tracks were created');
|
||||
|
||||
this._displayErrorsForCreateInitialLocalTracks(errors);
|
||||
|
||||
let localTracks = handleStartAudioMuted(initialOptions, tracks);
|
||||
const tracks = handleInitialTracks(initialOptions, localTracks);
|
||||
|
||||
// in case where gum is slow and resolves after the startAudio/VideoMuted coming from jicofo, we can be
|
||||
// join unmuted even though jicofo had instruct us to mute, so let's respect that before passing the tracks
|
||||
if (!browser.isWebKitBased()) {
|
||||
if (room?.isStartAudioMuted()) {
|
||||
localTracks = localTracks.filter(track => track.getType() !== MEDIA_TYPE.AUDIO);
|
||||
}
|
||||
}
|
||||
setGUMPendingStateOnFailedTracks(tracks);
|
||||
|
||||
if (room?.isStartVideoMuted()) {
|
||||
localTracks = localTracks.filter(track => track.getType() !== MEDIA_TYPE.VIDEO);
|
||||
}
|
||||
|
||||
return this._setLocalAudioVideoStreams(localTracks);
|
||||
return this._setLocalAudioVideoStreams(tracks);
|
||||
}
|
||||
|
||||
const [ tracks, con ] = await this.createInitialLocalTracksAndConnect(roomName, initialOptions);
|
||||
|
||||
this._initDeviceList(true);
|
||||
|
||||
return this.startConference(con, handleStartAudioMuted(initialOptions, tracks));
|
||||
const filteredTracks = handleInitialTracks(initialOptions, tracks);
|
||||
|
||||
setGUMPendingStateOnFailedTracks(filteredTracks);
|
||||
|
||||
return this.startConference(con, filteredTracks);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -992,6 +1028,7 @@ export default {
|
||||
showUI && APP.store.dispatch(notifyMicError(error));
|
||||
};
|
||||
|
||||
APP.store.dispatch(gumPending([ MEDIA_TYPE.AUDIO ], IGUMPendingState.PENDING_UNMUTE));
|
||||
createLocalTracksF({ devices: [ 'audio' ] })
|
||||
.then(([ audioTrack ]) => audioTrack)
|
||||
.catch(error => {
|
||||
@@ -1003,7 +1040,10 @@ export default {
|
||||
.then(async audioTrack => {
|
||||
await this._maybeApplyAudioMixerEffect(audioTrack);
|
||||
|
||||
this.useAudioStream(audioTrack);
|
||||
return this.useAudioStream(audioTrack);
|
||||
})
|
||||
.finally(() => {
|
||||
APP.store.dispatch(gumPending([ MEDIA_TYPE.AUDIO ], IGUMPendingState.NONE));
|
||||
});
|
||||
} else {
|
||||
muteLocalAudio(mute);
|
||||
@@ -1042,7 +1082,7 @@ export default {
|
||||
*/
|
||||
muteVideo(mute, showUI = true) {
|
||||
if (this.videoSwitchInProgress) {
|
||||
console.warn('muteVideo - unable to perform operations while video switch is in progress');
|
||||
logger.warn('muteVideo - unable to perform operations while video switch is in progress');
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -1083,6 +1123,8 @@ export default {
|
||||
|
||||
this.isCreatingLocalTrack = true;
|
||||
|
||||
APP.store.dispatch(gumPending([ MEDIA_TYPE.VIDEO ], IGUMPendingState.PENDING_UNMUTE));
|
||||
|
||||
// Try to create local video if there wasn't any.
|
||||
// This handles the case when user joined with no video
|
||||
// (dismissed screen sharing screen or in audio only mode), but
|
||||
@@ -1107,6 +1149,7 @@ export default {
|
||||
})
|
||||
.finally(() => {
|
||||
this.isCreatingLocalTrack = false;
|
||||
APP.store.dispatch(gumPending([ MEDIA_TYPE.VIDEO ], IGUMPendingState.NONE));
|
||||
});
|
||||
} else {
|
||||
// FIXME show error dialog if it fails (should be handled by react)
|
||||
@@ -1419,11 +1462,16 @@ export default {
|
||||
* @private
|
||||
*/
|
||||
_setLocalAudioVideoStreams(tracks = []) {
|
||||
const { dispatch } = APP.store;
|
||||
const pendingGUMDevicesToRemove = [];
|
||||
const promises = tracks.map(track => {
|
||||
if (track.isAudioTrack()) {
|
||||
pendingGUMDevicesToRemove.push(MEDIA_TYPE.AUDIO);
|
||||
|
||||
return this.useAudioStream(track);
|
||||
} else if (track.isVideoTrack()) {
|
||||
logger.debug(`_setLocalAudioVideoStreams is calling useVideoStream with track: ${track}`);
|
||||
pendingGUMDevicesToRemove.push(MEDIA_TYPE.VIDEO);
|
||||
|
||||
return this.useVideoStream(track);
|
||||
}
|
||||
@@ -1435,6 +1483,10 @@ export default {
|
||||
});
|
||||
|
||||
return Promise.allSettled(promises).then(() => {
|
||||
if (pendingGUMDevicesToRemove.length > 0) {
|
||||
dispatch(gumPending(pendingGUMDevicesToRemove, IGUMPendingState.NONE));
|
||||
}
|
||||
|
||||
this._localTracksInitialized = true;
|
||||
logger.log(`Initialized with ${tracks.length} local tracks`);
|
||||
});
|
||||
@@ -1977,7 +2029,10 @@ export default {
|
||||
|
||||
room.on(
|
||||
JitsiConferenceEvents.NON_PARTICIPANT_MESSAGE_RECEIVED,
|
||||
(...args) => APP.store.dispatch(nonParticipantMessageReceived(...args)));
|
||||
(...args) => {
|
||||
APP.store.dispatch(nonParticipantMessageReceived(...args));
|
||||
APP.API.notifyNonParticipantMessageReceived(...args);
|
||||
});
|
||||
|
||||
room.on(
|
||||
JitsiConferenceEvents.LOCK_STATE_CHANGED,
|
||||
@@ -2148,6 +2203,11 @@ export default {
|
||||
UIEvents.VIDEO_DEVICE_CHANGED,
|
||||
cameraDeviceId => {
|
||||
const videoWasMuted = this.isLocalVideoMuted();
|
||||
const localVideoTrack = getLocalJitsiVideoTrack(APP.store.getState());
|
||||
|
||||
if (localVideoTrack?.getDeviceId() === cameraDeviceId) {
|
||||
return;
|
||||
}
|
||||
|
||||
sendAnalytics(createDeviceChangedEvent('video', 'input'));
|
||||
|
||||
@@ -2278,10 +2338,7 @@ export default {
|
||||
|
||||
APP.UI.initConference();
|
||||
|
||||
if (!config.disableShortcuts) {
|
||||
APP.keyboardshortcut.init();
|
||||
}
|
||||
|
||||
dispatch(initKeyboardShortcuts());
|
||||
dispatch(conferenceJoined(room));
|
||||
|
||||
const jwt = APP.store.getState()['features/base/jwt'];
|
||||
@@ -2395,7 +2452,9 @@ export default {
|
||||
const { dispatch } = APP.store;
|
||||
const setAudioOutputPromise
|
||||
= setAudioOutputDeviceId(newDevices.audiooutput, dispatch)
|
||||
.catch(); // Just ignore any errors in catch block.
|
||||
.catch(err => {
|
||||
logger.error(`Failed to set the audio output device to ${newDevices.audiooutput} - ${err}`);
|
||||
});
|
||||
|
||||
promises.push(setAudioOutputPromise);
|
||||
}
|
||||
@@ -2433,7 +2492,7 @@ export default {
|
||||
}
|
||||
|
||||
// check for video
|
||||
if (!requestedInput.video) {
|
||||
if (requestedInput.video) {
|
||||
APP.store.dispatch(checkAndNotifyForNewDevice(newAvailDevices.videoInput, oldDevices.videoInput));
|
||||
}
|
||||
|
||||
@@ -2477,14 +2536,15 @@ export default {
|
||||
// Create the tracks and replace them only if the user is unmuted.
|
||||
if (requestedInput.audio || requestedInput.video) {
|
||||
let tracks = [];
|
||||
const realAudioDeviceId = hasDefaultMicChanged
|
||||
? getDefaultDeviceId(APP.store.getState(), 'audioInput') : newDevices.audioinput;
|
||||
|
||||
try {
|
||||
tracks = await mediaDeviceHelper.createLocalTracksAfterDeviceListChanged(
|
||||
createLocalTracksF,
|
||||
newDevices.videoinput,
|
||||
hasDefaultMicChanged
|
||||
? getDefaultDeviceId(APP.store.getState(), 'audioInput')
|
||||
: newDevices.audioinput);
|
||||
requestedInput.video ? newDevices.videoinput : null,
|
||||
requestedInput.audio ? realAudioDeviceId : null
|
||||
);
|
||||
} catch (error) {
|
||||
logger.error(`Track creation failed on device change, ${error}`);
|
||||
|
||||
@@ -2615,17 +2675,22 @@ export default {
|
||||
async leaveRoom(doDisconnect = true, reason = '') {
|
||||
APP.store.dispatch(conferenceWillLeave(room));
|
||||
|
||||
const maybeDisconnect = () => {
|
||||
if (doDisconnect) {
|
||||
return disconnect();
|
||||
}
|
||||
};
|
||||
|
||||
if (room && room.isJoined()) {
|
||||
return room.leave(reason).finally(() => {
|
||||
if (doDisconnect) {
|
||||
return disconnect();
|
||||
}
|
||||
return room.leave(reason).then(() => maybeDisconnect())
|
||||
.catch(e => {
|
||||
logger.error(e);
|
||||
|
||||
return maybeDisconnect();
|
||||
});
|
||||
}
|
||||
|
||||
if (doDisconnect) {
|
||||
return disconnect();
|
||||
}
|
||||
return maybeDisconnect();
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
28
config.js
28
config.js
@@ -74,6 +74,9 @@ var config = {
|
||||
//
|
||||
|
||||
testing: {
|
||||
// Allows the setting of a custom bandwidth value from the UI.
|
||||
// assumeBandwidth: true,
|
||||
|
||||
// Disables the End to End Encryption feature. Useful for debugging
|
||||
// issues related to insertable streams.
|
||||
// disableE2EE: false,
|
||||
@@ -422,22 +425,6 @@ var config = {
|
||||
// value will be used when the quality level is selected using "Manage Video Quality" slider.
|
||||
// startLastN: 1,
|
||||
|
||||
// Provides a way to use different "last N" values based on the number of participants in the conference.
|
||||
// The keys in an Object represent number of participants and the values are "last N" to be used when number of
|
||||
// participants gets to or above the number.
|
||||
//
|
||||
// For the given example mapping, "last N" will be set to 20 as long as there are at least 5, but less than
|
||||
// 29 participants in the call and it will be lowered to 15 when the 30th participant joins. The 'channelLastN'
|
||||
// will be used as default until the first threshold is reached.
|
||||
//
|
||||
// lastNLimits: {
|
||||
// 5: 20,
|
||||
// 30: 15,
|
||||
// 50: 10,
|
||||
// 70: 5,
|
||||
// 90: 2,
|
||||
// },
|
||||
|
||||
// Specify the settings for video quality optimizations on the client.
|
||||
// videoQuality: {
|
||||
// // Provides a way to prevent a video codec from being negotiated on the JVB connection. The codec specified
|
||||
@@ -1081,7 +1068,12 @@ var config = {
|
||||
// },
|
||||
|
||||
// e2ee: {
|
||||
// labels,
|
||||
// labels: {
|
||||
// description: '',
|
||||
// label: '',
|
||||
// tooltip: '',
|
||||
// warning: '',
|
||||
// },
|
||||
// externallyManagedKey: false,
|
||||
// },
|
||||
|
||||
@@ -1391,7 +1383,6 @@ var config = {
|
||||
dialOutRegionUrl
|
||||
disableRemoteControl
|
||||
displayJids
|
||||
e2eeLabels
|
||||
firefox_fake_device
|
||||
googleApiApplicationClientID
|
||||
iAmRecorder
|
||||
@@ -1422,6 +1413,7 @@ var config = {
|
||||
disableAGC
|
||||
disableAP
|
||||
disableHPF
|
||||
disableLocalStats
|
||||
disableNS
|
||||
enableTalkWhileMuted
|
||||
forceJVB121Ratio
|
||||
|
||||
@@ -1,99 +0,0 @@
|
||||
.audio-preview {
|
||||
display: inline-block;
|
||||
|
||||
&-content {
|
||||
position: relative;
|
||||
right: auto;
|
||||
margin-bottom: 4px;
|
||||
max-height: calc(100vh - 100px);
|
||||
overflow: auto;
|
||||
width: 300px;
|
||||
|
||||
&-ul {
|
||||
margin:0;
|
||||
padding:0;
|
||||
list-style-type: none;
|
||||
}
|
||||
}
|
||||
|
||||
&-header:hover {
|
||||
background-color: initial;
|
||||
cursor: initial;
|
||||
}
|
||||
|
||||
&-entry-text {
|
||||
max-width: 213px;
|
||||
|
||||
&.left-margin {
|
||||
margin-left: 36px;
|
||||
}
|
||||
}
|
||||
|
||||
&-speaker {
|
||||
position: relative;
|
||||
|
||||
&:hover, &:focus-within, &:focus {
|
||||
.audio-preview-test-button {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.audio-preview-entry-text {
|
||||
max-width: 178px;
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.audio-preview-entry-text {
|
||||
max-width: 238px;
|
||||
}
|
||||
}
|
||||
|
||||
&-microphone {
|
||||
position: relative;
|
||||
|
||||
&--nometer {
|
||||
.audio-preview-entry-text {
|
||||
max-width: 238px;
|
||||
}
|
||||
}
|
||||
|
||||
&--withmeter {
|
||||
.audio-preview-entry-text {
|
||||
max-width: 178px;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
&-icon {
|
||||
border-radius: 50%;
|
||||
display: inline-block;
|
||||
width: 14px;
|
||||
|
||||
&--exclamation {
|
||||
margin-left: 6px;
|
||||
|
||||
& svg {
|
||||
fill: #E54B4B;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-test-button {
|
||||
display: none;
|
||||
padding: 4px 10px;
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 6px;
|
||||
}
|
||||
|
||||
&-meter-mic {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 14px;
|
||||
}
|
||||
|
||||
&-checkbox-container {
|
||||
padding: 10px 16px;
|
||||
}
|
||||
}
|
||||
@@ -1,25 +1,31 @@
|
||||
.popover {
|
||||
margin: -16px -24px;
|
||||
z-index: $popoverZ;
|
||||
|
||||
.popover-content {
|
||||
margin: 16px 24px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
&.top {
|
||||
bottom: 8px;
|
||||
}
|
||||
&.hover {
|
||||
margin: -16px -24px;
|
||||
|
||||
&.bottom {
|
||||
top: 8px;
|
||||
}
|
||||
.popover-content {
|
||||
margin: 16px 24px;
|
||||
|
||||
&.left {
|
||||
right: 8px;
|
||||
}
|
||||
&.top {
|
||||
bottom: 8px;
|
||||
}
|
||||
|
||||
&.right {
|
||||
left: 8px;
|
||||
&.bottom {
|
||||
top: 4px;
|
||||
}
|
||||
|
||||
&.left {
|
||||
right: 4px;
|
||||
}
|
||||
|
||||
&.right {
|
||||
left: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,14 +197,6 @@
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.helper-link {
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
display: inline-block;
|
||||
flex-shrink: 0;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.warning-text {
|
||||
color:#FFD740;
|
||||
font-size: 12px;
|
||||
|
||||
@@ -32,6 +32,14 @@
|
||||
pointer-events: none;
|
||||
z-index: $toolbarZ + 2;
|
||||
|
||||
&.shift-up {
|
||||
bottom: calc(((#{$newToolbarSize} + 30px) * 2) * -1);
|
||||
|
||||
.toolbox-content {
|
||||
margin-bottom: 46px;
|
||||
}
|
||||
}
|
||||
|
||||
&.visible {
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
@@ -41,3 +41,36 @@
|
||||
display: -webkit-flex !important;
|
||||
display: flex !important;
|
||||
}
|
||||
|
||||
/**
|
||||
* resets default button styles,
|
||||
* mostly intended to be used on interactive elements that
|
||||
* differ from their default styles (e.g. <a>) or have custom styles
|
||||
*/
|
||||
.invisible-button {
|
||||
background: none;
|
||||
border: none;
|
||||
color: inherit;
|
||||
cursor: pointer;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* style an element the same as an <a>
|
||||
* useful on some cases where we visually have a link but it's actually a <button>
|
||||
*/
|
||||
.as-link {
|
||||
@extend .invisible-button;
|
||||
|
||||
display: inline;
|
||||
color: #44A5FF;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
|
||||
&:focus,
|
||||
&:hover,
|
||||
&:active {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
.video-preview {
|
||||
background: none;
|
||||
display: inline-block;
|
||||
|
||||
&-container {
|
||||
max-height: 456px;
|
||||
overflow: auto;
|
||||
margin-bottom: 4px;
|
||||
position: relative;
|
||||
right: auto;
|
||||
}
|
||||
|
||||
&-entry {
|
||||
cursor: pointer;
|
||||
height: 138px;
|
||||
width: 244px;
|
||||
position: relative;
|
||||
margin: 0 7px 4px;
|
||||
border-radius: 6px;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
&--selected {
|
||||
border: 2px solid #4687ED;
|
||||
}
|
||||
}
|
||||
|
||||
&-video {
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-error {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
height: 100%;
|
||||
justify-content: center;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-label {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
max-width: 100%;
|
||||
padding: 8px;
|
||||
z-index: 2;
|
||||
|
||||
&-text {
|
||||
background-color: rgba(0, 0, 0, 0.7);
|
||||
border-radius: 4px;
|
||||
padding: 4px 8px;
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
font-weight: 600;
|
||||
max-width: calc(100% - 16px);
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
width: fit-content;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
&-checkbox-container {
|
||||
padding: 10px 14px;
|
||||
}
|
||||
}
|
||||
@@ -108,6 +108,10 @@
|
||||
#largeVideoContainer {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
#largeVideoWrapper {
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
.button-control {
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
border: 1px solid $buttonBorder;
|
||||
vertical-align: baseline;
|
||||
height: 30px;
|
||||
min-width: 60px;
|
||||
padding: 4px 10px;
|
||||
margin: 0;
|
||||
line-height: 1.5em;
|
||||
outline: none;
|
||||
background-color: transparent;
|
||||
float: right;
|
||||
font-size: 14px;
|
||||
margin-left: 10px;
|
||||
color: $buttonColor;
|
||||
font-weight: $buttonFontWeight;
|
||||
@include transition(background-color .1s ease-out);
|
||||
|
||||
&[disabled] {
|
||||
color: #666;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
&_full-width {
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
border: 1px solid $buttonHoverBorder;
|
||||
background-color: $buttonHoverBackground;
|
||||
@include transition(background-color .1s ease-in);
|
||||
}
|
||||
|
||||
&:active {
|
||||
@include box-shadow(0, 0, 1px, $buttonShadowColor, true);
|
||||
}
|
||||
|
||||
&_light {
|
||||
color: $defaultDarkColor;
|
||||
background-color: $buttonLightBackground;
|
||||
border: 1px solid $buttonLightBorder;
|
||||
|
||||
&:hover {
|
||||
border: 1px solid $buttonLightHoverBorder;
|
||||
background-color: $buttonLightHoverBackground;
|
||||
}
|
||||
}
|
||||
|
||||
&_link {
|
||||
color: $buttonLinkColor;
|
||||
background-color: $buttonLinkBackground;
|
||||
|
||||
&:hover {
|
||||
background-color: $buttonLinkBackground;
|
||||
}
|
||||
}
|
||||
|
||||
&_overlay {
|
||||
color: $primaryButtonColor;
|
||||
background-color: $overlayButtonBg;
|
||||
border-radius: 2px;
|
||||
border: none;
|
||||
|
||||
&:hover {
|
||||
background-color: $primaryButtonBackground;
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
||||
&_primary {
|
||||
background-color: $primaryButtonBackground;
|
||||
border: 1px solid $primaryButtonBackground;
|
||||
color: $primaryButtonColor !important;
|
||||
font-weight: $primaryButtonFontWeight;
|
||||
|
||||
&:hover {
|
||||
border: 1px solid $primaryButtonHoverBackground;
|
||||
background-color: $primaryButtonHoverBackground;
|
||||
}
|
||||
|
||||
&[disabled] {
|
||||
color: $primaryButtonColor;
|
||||
}
|
||||
}
|
||||
|
||||
&_close {
|
||||
color: $defaultFontColor;
|
||||
}
|
||||
&_submit {
|
||||
color: $linkFontColor;
|
||||
&:hover {
|
||||
color: $linkHoverFontColor;
|
||||
}
|
||||
}
|
||||
|
||||
&_center {
|
||||
float: none !important;
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
.form-control {
|
||||
padding: $formPadding 0;
|
||||
|
||||
&:first-child {
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
&__text {
|
||||
margin: 8px 0;
|
||||
font-size: 1em
|
||||
}
|
||||
|
||||
&__label {
|
||||
font-size: 1em;
|
||||
font-weight: $labelFontWeight;
|
||||
}
|
||||
|
||||
&__em {
|
||||
color: $inputControlEmColor;
|
||||
}
|
||||
|
||||
&__container {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
@include flex();
|
||||
|
||||
.button-control {
|
||||
margin: 1px 0 1px 10px;
|
||||
}
|
||||
}
|
||||
|
||||
&__right {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a specific color for read only style.
|
||||
*/
|
||||
input:read-only {
|
||||
color: $readOnlyInputColor;
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
.input-control {
|
||||
@include transition(all .2s ease-in);
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
padding: 5px 7px;
|
||||
border-radius: $borderRadius;
|
||||
line-height: 32px;
|
||||
height: 32px;
|
||||
text-align: left;
|
||||
margin-bottom: 8px;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: inherit;
|
||||
}
|
||||
|
||||
&::selection {
|
||||
background-color: $defaultDarkSelectionColor;
|
||||
}
|
||||
|
||||
|
||||
&.error {
|
||||
color: $errorColor;
|
||||
border-color: $errorColor;
|
||||
}
|
||||
}
|
||||
|
||||
@include placeholder {
|
||||
color: $placeHolderColor;
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
.link {
|
||||
cursor: pointer;
|
||||
color: $linkFontColor;
|
||||
@include transition(color .1s ease-out);
|
||||
|
||||
&:hover {
|
||||
color: $linkHoverFontColor;
|
||||
text-decoration: underline;
|
||||
@include transition(color .1s ease-in);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper links are links that are meant to open a documentation page or more
|
||||
* detailed info.
|
||||
*/
|
||||
.helper-link {
|
||||
@extend .link;
|
||||
font-size: 12px;
|
||||
}
|
||||
@@ -33,8 +33,6 @@ $flagsImagePath: "../images/";
|
||||
@import 'mini_toolbox';
|
||||
@import 'modals/desktop-picker/desktop-picker';
|
||||
@import 'modals/dialog';
|
||||
@import 'modals/embed-meeting/embed-meeting';
|
||||
@import 'modals/feedback/feedback';
|
||||
@import 'modals/invite/info';
|
||||
@import 'modals/screen-share/share-audio';
|
||||
@import 'modals/screen-share/share-screen-warning';
|
||||
@@ -51,10 +49,6 @@ $flagsImagePath: "../images/";
|
||||
@import 'welcome_page_settings_toolbar';
|
||||
@import 'toolbars';
|
||||
@import 'redirect_page';
|
||||
@import 'components/form-control';
|
||||
@import 'components/link';
|
||||
@import 'components/button-control';
|
||||
@import 'components/input-control';
|
||||
@import 'components/input-slider';
|
||||
@import '404';
|
||||
@import 'policy';
|
||||
@@ -66,7 +60,6 @@ $flagsImagePath: "../images/";
|
||||
@import 'filmstrip/vertical_filmstrip';
|
||||
@import 'filmstrip/vertical_filmstrip_overrides';
|
||||
@import 'unsupported-browser/main';
|
||||
@import 'modals/invite/add-people';
|
||||
@import 'deep-linking/main';
|
||||
@import 'transcription-subtitles';
|
||||
@import '_meetings_list.scss';
|
||||
@@ -77,8 +70,6 @@ $flagsImagePath: "../images/";
|
||||
@import 'chrome-extension-banner';
|
||||
@import 'settings-button';
|
||||
@import 'meter';
|
||||
@import 'audio-preview';
|
||||
@import 'video-preview';
|
||||
@import 'premeeting/main';
|
||||
@import 'modals/invite/invite_more';
|
||||
@import 'modals/security/security';
|
||||
|
||||
@@ -12,24 +12,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Styling inline dialog errors.
|
||||
*/
|
||||
.inline-dialog-error {
|
||||
margin-top: 16px;
|
||||
|
||||
&-text {
|
||||
color: $dialogErrorText;
|
||||
margin-bottom: 8px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&-button {
|
||||
display: block;
|
||||
margin: 16px auto 0 auto;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Styling shared video dialog errors.
|
||||
*/
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
.embed-meeting {
|
||||
&-dialog {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
&-copy {
|
||||
color: white;
|
||||
font-size: 15px;
|
||||
margin-left: auto;
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
&-code {
|
||||
background: transparent;
|
||||
border: 1px solid #A4B8D1;
|
||||
color: white;
|
||||
font-size: 15px;
|
||||
height: 165px;
|
||||
line-height: 24px;
|
||||
padding: 8px;
|
||||
width: 100%;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
&-trigger {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 8px 8px 8px 16px;
|
||||
margin-top: 24px;
|
||||
width: calc(100% - 24px);
|
||||
height: 24px;
|
||||
background: #2A3A4B;
|
||||
border: 1px solid #5E6D7A;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
|
||||
.jitsi-icon {
|
||||
margin-right: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
@-webkit-keyframes shake-rotate {
|
||||
0% {
|
||||
-webkit-transform:scale(1) rotate(0deg);
|
||||
transform:scale(1) rotate(0deg)
|
||||
}
|
||||
|
||||
50% {
|
||||
-webkit-transform:scale(.8) rotate(-5deg);
|
||||
transform:scale(.8) rotate(-5deg)
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform:scale(1) rotate(3deg);
|
||||
transform:scale(1) rotate(3deg)
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes shake-rotate {
|
||||
0% {
|
||||
-webkit-transform:scale(1) rotate(0deg);
|
||||
transform:scale(1) rotate(0deg)
|
||||
}
|
||||
|
||||
50% {
|
||||
-webkit-transform:scale(.8) rotate(-5deg);
|
||||
transform:scale(.8) rotate(-5deg)
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform:scale(1) rotate(3deg);
|
||||
transform:scale(1) rotate(3deg)
|
||||
}
|
||||
}
|
||||
|
||||
.shake-rotate {
|
||||
display: inline-block;
|
||||
|
||||
-webkit-animation-duration: .4s;
|
||||
animation-duration: .4s;
|
||||
-webkit-animation-iteration-count: infinite;
|
||||
animation-iteration-count: infinite;
|
||||
-webkit-animation-name: shake-rotate;
|
||||
animation-name: shake-rotate;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out
|
||||
}
|
||||
@@ -41,10 +41,3 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Styles errors in the MultiSelectAutocomplete.
|
||||
*/
|
||||
.autocomplete-error {
|
||||
min-width: 260px;
|
||||
}
|
||||
|
||||
@@ -57,6 +57,10 @@
|
||||
line-height: 24px;
|
||||
border-collapse: collapse;
|
||||
|
||||
* {
|
||||
user-select: text;
|
||||
}
|
||||
|
||||
thead {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
@@ -1,57 +1,4 @@
|
||||
.invite-more {
|
||||
&-container {
|
||||
margin-bottom: 8px;
|
||||
transition: margin-bottom 0.3s;
|
||||
|
||||
&.elevated {
|
||||
margin-bottom: 36px;
|
||||
}
|
||||
}
|
||||
|
||||
&-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 16px;
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
border-radius: 8px;
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
line-height: 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
&-header {
|
||||
max-width: 100%;
|
||||
margin-bottom: 16px;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
&-button {
|
||||
display: flex;
|
||||
max-width: 100%;
|
||||
height: 40px;
|
||||
box-sizing: border-box;
|
||||
padding: 8px 16px;
|
||||
background: #0376DA;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
|
||||
@media (hover: hover) and (pointer: fine) {
|
||||
&:hover {
|
||||
background: #278ADF;
|
||||
}
|
||||
}
|
||||
|
||||
&-text {
|
||||
margin-left: 8px;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
&-dialog {
|
||||
color: #fff;
|
||||
font-size: 15px;
|
||||
@@ -65,59 +12,6 @@
|
||||
background: #5E6D7A;
|
||||
}
|
||||
|
||||
&.email-container {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 8px 8px 8px 16px;
|
||||
margin-top: 24px;
|
||||
width: calc(100% - 26px);
|
||||
height: 22px;
|
||||
|
||||
background: #2A3A4B;
|
||||
border: 1px solid #5E6D7A;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
|
||||
&.active {
|
||||
border-radius: 3px 3px 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
&.invite-buttons {
|
||||
width: 100%;
|
||||
text-align: right;
|
||||
margin-top: 8px;
|
||||
|
||||
& > a {
|
||||
display: inline-block;
|
||||
height: 24px;
|
||||
min-width: 48px;
|
||||
border-radius: 3px;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&-cancel {
|
||||
margin-right: 16px;
|
||||
padding: 7px 15px;
|
||||
background: #2A3A4B;
|
||||
border: 1px solid #5E6D7A;
|
||||
}
|
||||
|
||||
&-add {
|
||||
padding: 8px 16px;
|
||||
background: #0376DA;
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
& > a {
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.stream {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
@@ -158,14 +52,3 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.mobile-browser {
|
||||
.invite-more-content {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.invite-more-button {
|
||||
height: 48px;
|
||||
padding: 12px 16px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
&-actions {
|
||||
margin-top: 10px;
|
||||
a {
|
||||
button {
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
|
||||
@@ -208,3 +208,26 @@
|
||||
.lobby-button-margin {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.lobby-prejoin-error {
|
||||
background-color: #E04757;
|
||||
border-radius: 6px;
|
||||
box-sizing: border-box;
|
||||
color: white;
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
margin-bottom: 16px;
|
||||
margin-top: -8px;
|
||||
padding: 4px;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.lobby-prejoin-input {
|
||||
margin-bottom: 16px;
|
||||
width: 100%;
|
||||
|
||||
& input {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
@import 'lobby';
|
||||
@import 'premeeting-screens';
|
||||
@import 'prejoin';
|
||||
@import 'prejoin-third-party';
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
.prejoin {
|
||||
&-input-area {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-avatar {
|
||||
margin: 8px auto 16px;
|
||||
|
||||
&-name {
|
||||
color: white;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
line-height: 26px;
|
||||
margin-bottom: 32px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&-container {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
&-error {
|
||||
background-color: #E04757;
|
||||
border-radius: 6px;
|
||||
box-sizing: border-box;
|
||||
color: white;
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
margin-bottom: 16px;
|
||||
margin-top: -8px;
|
||||
padding: 4px;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.prejoin-preview {
|
||||
&-dropdown-btns {
|
||||
padding: 8px 0;
|
||||
width: 300px;
|
||||
background-color: #E0E0E0;
|
||||
border-radius: 3px;
|
||||
position: relative;
|
||||
top: -16px;
|
||||
}
|
||||
|
||||
&-dropdown-container {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
|
||||
/**
|
||||
* Override default InlineDialog behaviour, since it does not play nicely with relative widths
|
||||
*/
|
||||
& > div:nth-child(2) {
|
||||
background: #E0E0E0;
|
||||
padding: 0;
|
||||
position: absolute !important;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.prejoin-input {
|
||||
margin-bottom: 16px;
|
||||
width: 100%;
|
||||
|
||||
& input {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
3
debian/jitsi-meet-web-config.install
vendored
3
debian/jitsi-meet-web-config.install
vendored
@@ -1,3 +1,6 @@
|
||||
doc/debian/jitsi-meet/jitsi-meet.example /usr/share/jitsi-meet-web-config/
|
||||
doc/debian/jitsi-meet/jitsi-meet.example-apache /usr/share/jitsi-meet-web-config/
|
||||
config.js /usr/share/jitsi-meet-web-config/
|
||||
doc/jaas/nginx-jaas.conf /usr/share/jitsi-meet-web-config/
|
||||
doc/jaas/index-jaas.html /usr/share/jitsi-meet-web-config/
|
||||
doc/jaas/8x8.vc-config.js /usr/share/jitsi-meet-web-config/
|
||||
|
||||
2
debian/jitsi-meet-web.install
vendored
2
debian/jitsi-meet-web.install
vendored
@@ -12,3 +12,5 @@ resources/robots.txt /usr/share/jitsi-meet/
|
||||
resources/*.sh /usr/share/jitsi-meet/scripts/
|
||||
pwa-worker.js /usr/share/jitsi-meet/
|
||||
manifest.json /usr/share/jitsi-meet/
|
||||
doc/jaas/move-to-jaas.sh /usr/share/jitsi-meet/scripts/
|
||||
doc/jaas/update-asap-daily.sh /usr/share/jitsi-meet/scripts/
|
||||
|
||||
@@ -78,13 +78,18 @@ Component "conference.jitmeet.example.com" "muc"
|
||||
restrict_room_creation = true
|
||||
storage = "memory"
|
||||
modules_enabled = {
|
||||
"muc_hide_all";
|
||||
"muc_meeting_id";
|
||||
"muc_domain_mapper";
|
||||
"polls";
|
||||
--"token_verification";
|
||||
"muc_rate_limit";
|
||||
"muc_password_whitelist";
|
||||
}
|
||||
admins = { "focusUser@auth.jitmeet.example.com" }
|
||||
muc_password_whitelist = {
|
||||
"focusUser@auth.jitmeet.example.com"
|
||||
}
|
||||
muc_room_locking = false
|
||||
muc_room_default_public_jids = true
|
||||
|
||||
@@ -92,6 +97,7 @@ Component "breakout.jitmeet.example.com" "muc"
|
||||
restrict_room_creation = true
|
||||
storage = "memory"
|
||||
modules_enabled = {
|
||||
"muc_hide_all";
|
||||
"muc_meeting_id";
|
||||
"muc_domain_mapper";
|
||||
"muc_rate_limit";
|
||||
@@ -105,6 +111,7 @@ Component "breakout.jitmeet.example.com" "muc"
|
||||
Component "internal.auth.jitmeet.example.com" "muc"
|
||||
storage = "memory"
|
||||
modules_enabled = {
|
||||
"muc_hide_all";
|
||||
"ping";
|
||||
}
|
||||
admins = { "focusUser@auth.jitmeet.example.com", "jvb@auth.jitmeet.example.com" }
|
||||
@@ -139,6 +146,7 @@ Component "lobby.jitmeet.example.com" "muc"
|
||||
muc_room_locking = false
|
||||
muc_room_default_public_jids = true
|
||||
modules_enabled = {
|
||||
"muc_hide_all";
|
||||
"muc_rate_limit";
|
||||
"polls";
|
||||
}
|
||||
|
||||
@@ -58,6 +58,8 @@ server {
|
||||
|
||||
add_header Strict-Transport-Security "max-age=63072000" always;
|
||||
set $prefix "";
|
||||
set $custom_index "";
|
||||
set $config_js_location /etc/jitsi/meet/jitsi-meet.example.com-config.js;
|
||||
|
||||
ssl_certificate /etc/jitsi/meet/jitsi-meet.example.com.crt;
|
||||
ssl_certificate_key /etc/jitsi/meet/jitsi-meet.example.com.key;
|
||||
@@ -77,8 +79,10 @@ server {
|
||||
gzip_proxied no-cache no-store private expired auth;
|
||||
gzip_min_length 512;
|
||||
|
||||
include /etc/jitsi/meet/jaas/*.conf;
|
||||
|
||||
location = /config.js {
|
||||
alias /etc/jitsi/meet/jitsi-meet.example.com-config.js;
|
||||
alias $config_js_location;
|
||||
}
|
||||
|
||||
location = /external_api.js {
|
||||
@@ -92,6 +96,11 @@ server {
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
location ~ ^/_api/public/(.*)$ {
|
||||
autoindex off;
|
||||
alias /etc/jitsi/meet/public/$1;
|
||||
}
|
||||
|
||||
# ensure all static content can always be found first
|
||||
location ~ ^/(libs|css|static|images|fonts|lang|sounds|.well-known)/(.*)$
|
||||
{
|
||||
@@ -142,11 +151,12 @@ server {
|
||||
#}
|
||||
|
||||
location ~ ^/([^/?&:'"]+)$ {
|
||||
set $roomname "$1";
|
||||
try_files $uri @root_path;
|
||||
}
|
||||
|
||||
location @root_path {
|
||||
rewrite ^/(.*)$ / break;
|
||||
rewrite ^/(.*)$ /$custom_index break;
|
||||
}
|
||||
|
||||
location ~ ^/([^/?&:'"]+)/config.js$
|
||||
@@ -154,7 +164,14 @@ server {
|
||||
set $subdomain "$1.";
|
||||
set $subdir "$1/";
|
||||
|
||||
alias /etc/jitsi/meet/jitsi-meet.example.com-config.js;
|
||||
alias $config_js_location;
|
||||
}
|
||||
|
||||
# Matches /(TENANT)/pwa-worker.js or /(TENANT)/manifest.json to rewrite to / and look for file
|
||||
location ~ ^/([^/?&:'"]+)/(pwa-worker.js|manifest.json)$ {
|
||||
set $subdomain "$1.";
|
||||
set $subdir "$1/";
|
||||
rewrite ^/([^/?&:'"]+)/(pwa-worker.js|manifest.json)$ /$2;
|
||||
}
|
||||
|
||||
# BOSH for subdomains
|
||||
|
||||
7
doc/jaas/8x8.vc-config.js
Normal file
7
doc/jaas/8x8.vc-config.js
Normal file
@@ -0,0 +1,7 @@
|
||||
</script>
|
||||
<script src="https://8x8.vc/<!--# echo var="subdir" default="" -->config.js" onload="{
|
||||
config.p2p.disabledCodec='VP9';
|
||||
config.videoQuality.disabledCodec='VP9';
|
||||
config.e2ee = { externallyManagedKey: true };
|
||||
}"/>
|
||||
<script>
|
||||
22
doc/jaas/README.md
Normal file
22
doc/jaas/README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
## How to switch your deployment to [JaaS](https://jaas.8x8.vc) in one easy step
|
||||
|
||||
Note: By default it will have e2ee(end-to-end) encryption enabled that works only on chromium based browsers (Chrome, Edge, ...). If a participant joins from another browser or mobile the e2ee is turned off.
|
||||
|
||||
In order to use your deployment with JaaS you first need to login to your [JaaS Developer console](https://jaas.8x8.vc/#/apikeys) and generate a key pair.
|
||||
Use `Add API key` button and then `Generate API key pair`. Make sure you download the generated private key from:
|
||||
|
||||
<img src="generated_key_dialog.png" height="250">
|
||||
|
||||
Make sure you transfer this downloaded private key to your server. Copy the key id from:
|
||||
|
||||
<img src="api_keys_kid.png" height="200">
|
||||
|
||||
Now on your server run the helper script passing the private key file and the key id:
|
||||
|
||||
```
|
||||
sudo /usr/share/jitsi-meet/scripts/move-to-jaas.sh /my/path/test-key.pk <key_id>
|
||||
```
|
||||
|
||||
More information about JaaS Api keys at: https://developer.8x8.com/jaas/docs/jaas-console-api-keys
|
||||
|
||||
If you want to adjust the enabled services you can do that in /etc/jits/meet/jaas/nginx-jaas.conf. The part after `proxy_set_body` is the jwt token content that will be used for the client tokens. More info about the JaaS tokens: https://developer.8x8.com/jaas/docs/api-keys-jwt
|
||||
BIN
doc/jaas/api_keys_kid.png
Normal file
BIN
doc/jaas/api_keys_kid.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
BIN
doc/jaas/generated_key_dialog.png
Normal file
BIN
doc/jaas/generated_key_dialog.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
33
doc/jaas/index-jaas.html
Normal file
33
doc/jaas/index-jaas.html
Normal file
@@ -0,0 +1,33 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<script src='external_api.js' async></script>
|
||||
<style>html, body, #jaas-container { height: 100%; }</style>
|
||||
<script type="text/javascript">
|
||||
function getRoomName(pathname) {
|
||||
const contextRootEndIndex = pathname.lastIndexOf('/');
|
||||
|
||||
return pathname.substring(contextRootEndIndex + 1);
|
||||
}
|
||||
window.onload = () => {
|
||||
const jaasJwt = <!--#include virtual="/jaas-jwt" -->;
|
||||
const api = new JitsiMeetExternalAPI(
|
||||
window.location.host, {
|
||||
roomName: `${jaasJwt.tenant}/${jaasJwt.confId}`,
|
||||
parentNode: document.querySelector('#jaas-container'),
|
||||
jwt: jaasJwt.token,
|
||||
e2eeKey: jaasJwt.e2eeKey
|
||||
});
|
||||
api.addListener('videoConferenceJoined', () => {
|
||||
if (jaasJwt.e2eeKey) {
|
||||
console.info('Toggling e2ee on!')
|
||||
api.executeCommand('toggleE2EE', true);
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="jaas-container" />
|
||||
</body>
|
||||
</html>
|
||||
59
doc/jaas/move-to-jaas.sh
Executable file
59
doc/jaas/move-to-jaas.sh
Executable file
@@ -0,0 +1,59 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
PRIVATE_KEY=$1
|
||||
JAAS_KEY_ID=$2
|
||||
|
||||
if [ ! -f "${PRIVATE_KEY}" ] ; then
|
||||
echo "You need to specify a correct path for the private key as a first argument."
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
if [[ ! "${JAAS_KEY_ID}" =~ ^vpaas-magic-cookie-[0-9a-z]+/[0-9a-z]+$ ]]; then
|
||||
echo "Invalid key id passed as a second argument."
|
||||
exit 2;
|
||||
fi
|
||||
|
||||
command -v node >/dev/null 2>&1 || { echo >&2 "You must install node first, go to https://nodejs.org. Aborting."; exit 4; }
|
||||
|
||||
NODE_VER=$(node -v);
|
||||
NODE_MAJOR_VER=$(echo ${NODE_VER:1} | cut -d. -f1);
|
||||
|
||||
if [ "$NODE_MAJOR_VER" -lt "18" ]; then
|
||||
echo "Please install latest LTS version of node (18+)";
|
||||
exit 3;
|
||||
fi
|
||||
|
||||
# we need this util for debconf-set-selections
|
||||
sudo apt install debconf-utils
|
||||
|
||||
# Let's pre-set some settings for token-generator
|
||||
cat << EOF | sudo debconf-set-selections
|
||||
token-generator token-generator/private-key string ${PRIVATE_KEY}
|
||||
token-generator token-generator/kid string ${JAAS_KEY_ID}
|
||||
EOF
|
||||
|
||||
apt install token-generator
|
||||
|
||||
mkdir -p /etc/jitsi/meet/jaas
|
||||
|
||||
VPASS_COOKIE=$(echo -n ${JAAS_KEY_ID}| cut -d/ -f1)
|
||||
cp /usr/share/jitsi-meet-web-config/nginx-jaas.conf /etc/jitsi/meet/jaas
|
||||
sed -i "s/jaas_magic_cookie/${VPASS_COOKIE}/g" /etc/jitsi/meet/jaas/nginx-jaas.conf
|
||||
|
||||
cp /usr/share/jitsi-meet-web-config/8x8.vc-config.js /etc/jitsi/meet/jaas/
|
||||
echo "set \$config_js_location /etc/jitsi/meet/jaas/8x8.vc-config.js;" >> /etc/jitsi/meet/jaas/jaas-vars
|
||||
echo "set \$custom_index index-jaas.html;" >> /etc/jitsi/meet/jaas/jaas-vars
|
||||
|
||||
ln -s /usr/share/jitsi-meet-web-config/index-jaas.html /usr/share/jitsi-meet/index-jaas.html
|
||||
|
||||
# let's create the daily key now
|
||||
/usr/share/jitsi-meet/scripts/update-asap-daily.sh
|
||||
|
||||
# let's add to cron daily the update of the asap key
|
||||
if [ -d /etc/cron.daily ]; then
|
||||
ln -s /usr/share/jitsi-meet/scripts/update-asap-daily.sh /etc/cron.daily/update-jaas-asap.sh
|
||||
else
|
||||
echo "No /etc/cron.daily. Please add to your cron jobs to execute as root daily the script: /usr/share/jitsi-meet/scripts/update-asap-daily.sh"
|
||||
fi
|
||||
23
doc/jaas/nginx-jaas.conf
Normal file
23
doc/jaas/nginx-jaas.conf
Normal file
@@ -0,0 +1,23 @@
|
||||
include /etc/jitsi/meet/jaas/jaas-vars;
|
||||
location = /jaas-jwt {
|
||||
include /etc/jitsi/token-generator/daily-key;
|
||||
ssi on;
|
||||
proxy_method POST;
|
||||
proxy_set_header content-type "application/json";
|
||||
proxy_set_header Accept-Encoding "";
|
||||
proxy_set_header Authorization "Bearer $jaas_asap_key";
|
||||
proxy_pass_request_body off;
|
||||
proxy_set_body '{"sub":"jaas_magic_cookie","context":{"features":{"livestreaming":false,"outbound-call":false,"sip-outbound-call":false,"transcription":false,"recording":false},"user":{"moderator":true}},"room": "$roomname"}';
|
||||
proxy_pass http://127.0.0.1:8017/generate/client?e2eeKey=true&confId=true;
|
||||
}
|
||||
|
||||
location @magic_root_path {
|
||||
rewrite ^/(.*)$ /index.html break;
|
||||
}
|
||||
|
||||
# Anything that didn't match above, and isn't a real file, assume it's a room name and redirect to /
|
||||
location ~ ^/jaas_magic_cookie/(.*)$ {
|
||||
set $subdomain "jaas_magic_cookie.";
|
||||
set $subdir "jaas_magic_cookie/";
|
||||
try_files $1 @magic_root_path;
|
||||
}
|
||||
9
doc/jaas/update-asap-daily.sh
Executable file
9
doc/jaas/update-asap-daily.sh
Executable file
@@ -0,0 +1,9 @@
|
||||
JWT_KID=$(cat /etc/jitsi/token-generator/config | grep SYSTEM_ASAP_BASE_URL_MAPPINGS | cut -d= -f2- | jq -r .[].kid)
|
||||
JWT_DATE=$(echo -n $JWT_KID | cut -d/ -f2-)
|
||||
JWT_DATE=${JWT_DATE#jwt-}
|
||||
KEY_FILE=/etc/jitsi/token-generator/daily-key
|
||||
echo -n "set \$jaas_asap_key " > ${KEY_FILE}
|
||||
ASAP_KEY=$(ASAP_SIGNING_KEY_FILE=/etc/jitsi/token-generator/asap-${JWT_DATE}.key ASAP_JWT_KID="${JWT_KID}" ASAP_EXPIRES_IN="1 day" node /usr/share/token-generator/jwt.js| tail -n1)
|
||||
echo -n "${ASAP_KEY};" >> ${KEY_FILE}
|
||||
|
||||
service nginx reload
|
||||
12
globals.d.ts
vendored
12
globals.d.ts
vendored
@@ -10,12 +10,6 @@ declare global {
|
||||
API: any;
|
||||
conference: any;
|
||||
debugLogs: any;
|
||||
keyboardshortcut: {
|
||||
registerShortcut: Function;
|
||||
unregisterShortcut: Function;
|
||||
openDialog: Function;
|
||||
enable: Function;
|
||||
}
|
||||
};
|
||||
const interfaceConfig: any;
|
||||
|
||||
@@ -27,6 +21,7 @@ declare global {
|
||||
JitsiMeetElectron?: any;
|
||||
// selenium tests handler
|
||||
_sharedVideoPlayer: any;
|
||||
alwaysOnTop: { api: any };
|
||||
}
|
||||
|
||||
interface Document {
|
||||
@@ -37,4 +32,9 @@ declare global {
|
||||
const config: IConfig;
|
||||
|
||||
const JitsiMeetJS: any;
|
||||
|
||||
interface HTMLMediaElement {
|
||||
setSinkId: (id: string) => Promise<undefined>;
|
||||
stop: () => void;
|
||||
}
|
||||
}
|
||||
|
||||
1
globals.native.d.ts
vendored
1
globals.native.d.ts
vendored
@@ -30,6 +30,7 @@ interface IWindow {
|
||||
setImmediate: typeof setImmediate;
|
||||
clearImmediate: typeof clearImmediate;
|
||||
addEventListener: Function;
|
||||
removeEventListener: Function;
|
||||
}
|
||||
|
||||
interface INavigator {
|
||||
|
||||
13
index.html
13
index.html
@@ -13,10 +13,19 @@
|
||||
<link rel="manifest" id="manifest-placeholder">
|
||||
|
||||
<script>
|
||||
function contextRoot(pathname) {
|
||||
const contextRootEndIndex = pathname.lastIndexOf('/');
|
||||
|
||||
return (
|
||||
contextRootEndIndex === -1
|
||||
? '/'
|
||||
: pathname.substring(0, contextRootEndIndex + 1)
|
||||
);
|
||||
}
|
||||
window.EXCALIDRAW_ASSET_PATH = 'libs/';
|
||||
// Dynamically generate the manifest location URL. It must be served from the document origin, and we may have
|
||||
// the base pointing to the CDN. This way we can generate a full URL which will bypass the base.
|
||||
document.querySelector('#manifest-placeholder').setAttribute('href', window.location.origin + '/manifest.json');
|
||||
document.querySelector('#manifest-placeholder').setAttribute('href', window.location.origin + contextRoot(window.location.pathname) + 'manifest.json');
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
if (!JitsiMeetJS.app) {
|
||||
@@ -40,7 +49,7 @@
|
||||
|
||||
if (shouldRegisterWorker) {
|
||||
navigator.serviceWorker
|
||||
.register(window.location.origin + '/pwa-worker.js')
|
||||
.register(window.location.origin + contextRoot(window.location.pathname) + 'pwa-worker.js')
|
||||
.then(reg => {
|
||||
console.log('Service worker registered.', reg);
|
||||
})
|
||||
|
||||
@@ -70,7 +70,8 @@ var interfaceConfig = {
|
||||
|
||||
ENABLE_DIAL_OUT: true,
|
||||
|
||||
ENABLE_FEEDBACK_ANIMATION: false, // Enables feedback star animation.
|
||||
// DEPRECATED. Animation no longer supported.
|
||||
// ENABLE_FEEDBACK_ANIMATION: false,
|
||||
|
||||
FILM_STRIP_MAX_HEIGHT: 120,
|
||||
|
||||
|
||||
12
ios/Podfile
12
ios/Podfile
@@ -1,11 +1,13 @@
|
||||
require_relative '../node_modules/react-native/scripts/react_native_pods'
|
||||
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
|
||||
|
||||
platform :ios, '12.0'
|
||||
platform :ios, '12.4'
|
||||
workspace 'jitsi-meet'
|
||||
|
||||
install! 'cocoapods', :deterministic_uuids => false
|
||||
|
||||
production = ENV["PRODUCTION"] == "1"
|
||||
|
||||
target 'JitsiMeet' do
|
||||
project 'app/app.xcodeproj'
|
||||
|
||||
@@ -21,8 +23,10 @@ target 'JitsiMeetSDK' do
|
||||
#
|
||||
|
||||
config = use_native_modules!
|
||||
flags = get_default_flags()
|
||||
use_react_native!(
|
||||
:path => config["reactNativePath"],
|
||||
:path => config[:reactNativePath],
|
||||
:production => production,
|
||||
:hermes_enabled => false,
|
||||
:fabric_enabled => false,
|
||||
# An absolute path to your application root.
|
||||
@@ -42,7 +46,7 @@ target 'JitsiMeetSDK' do
|
||||
|
||||
pod 'CocoaLumberjack', '3.7.2'
|
||||
pod 'ObjectiveDropboxOfficial', '6.2.3'
|
||||
pod 'JitsiWebRTC', '~> 106.0.0'
|
||||
pod 'JitsiWebRTC', '~> 111.0.0'
|
||||
end
|
||||
|
||||
target 'JitsiMeetSDKLite' do
|
||||
@@ -81,7 +85,7 @@ post_install do |installer|
|
||||
end
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['SUPPORTS_MACCATALYST'] = 'NO'
|
||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
|
||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.4'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
563
ios/Podfile.lock
563
ios/Podfile.lock
@@ -3,24 +3,25 @@ PODS:
|
||||
- amplitude-react-native (2.7.0):
|
||||
- Amplitude (= 8.7.1)
|
||||
- React-Core
|
||||
- AppAuth (1.4.0):
|
||||
- AppAuth/Core (= 1.4.0)
|
||||
- AppAuth/ExternalUserAgent (= 1.4.0)
|
||||
- AppAuth/Core (1.4.0)
|
||||
- AppAuth/ExternalUserAgent (1.4.0)
|
||||
- AppAuth (1.6.1):
|
||||
- AppAuth/Core (= 1.6.1)
|
||||
- AppAuth/ExternalUserAgent (= 1.6.1)
|
||||
- AppAuth/Core (1.6.1)
|
||||
- AppAuth/ExternalUserAgent (1.6.1):
|
||||
- AppAuth/Core
|
||||
- boost (1.76.0)
|
||||
- CocoaLumberjack (3.7.2):
|
||||
- CocoaLumberjack/Core (= 3.7.2)
|
||||
- CocoaLumberjack/Core (3.7.2)
|
||||
- DoubleConversion (1.1.6)
|
||||
- FBLazyVector (0.68.6)
|
||||
- FBReactNativeSpec (0.68.6):
|
||||
- FBLazyVector (0.69.10)
|
||||
- FBReactNativeSpec (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.68.6)
|
||||
- RCTTypeSafety (= 0.68.6)
|
||||
- React-Core (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- ReactCommon/turbomodule/core (= 0.68.6)
|
||||
- RCTRequired (= 0.69.10)
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Core (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- Firebase/Analytics (8.15.0):
|
||||
- Firebase/Core
|
||||
- Firebase/Core (8.15.0):
|
||||
@@ -76,10 +77,10 @@ PODS:
|
||||
- GoogleUtilities/UserDefaults (~> 7.7)
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- fmt (6.2.1)
|
||||
- Giphy (2.1.20):
|
||||
- Giphy (2.2.4):
|
||||
- libwebp
|
||||
- giphy-react-native-sdk (1.7.0):
|
||||
- Giphy (= 2.1.20)
|
||||
- giphy-react-native-sdk (2.3.0):
|
||||
- Giphy (= 2.2.4)
|
||||
- React-Core
|
||||
- glog (0.3.5)
|
||||
- GoogleAppMeasurement (8.15.0):
|
||||
@@ -102,56 +103,56 @@ PODS:
|
||||
- GoogleUtilities/Network (~> 7.7)
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.7)"
|
||||
- nanopb (~> 2.30908.0)
|
||||
- GoogleDataTransport (9.1.4):
|
||||
- GoogleDataTransport (9.2.2):
|
||||
- GoogleUtilities/Environment (~> 7.7)
|
||||
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleSignIn (6.0.2):
|
||||
- AppAuth (~> 1.4)
|
||||
- GTMAppAuth (~> 1.0)
|
||||
- GTMSessionFetcher/Core (~> 1.1)
|
||||
- GoogleUtilities/AppDelegateSwizzler (7.7.0):
|
||||
- GoogleSignIn (6.2.4):
|
||||
- AppAuth (~> 1.5)
|
||||
- GTMAppAuth (~> 1.3)
|
||||
- GTMSessionFetcher/Core (< 3.0, >= 1.1)
|
||||
- GoogleUtilities/AppDelegateSwizzler (7.11.1):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network
|
||||
- GoogleUtilities/Environment (7.7.0):
|
||||
- GoogleUtilities/Environment (7.11.1):
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleUtilities/Logger (7.7.0):
|
||||
- GoogleUtilities/Logger (7.11.1):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/MethodSwizzler (7.7.0):
|
||||
- GoogleUtilities/MethodSwizzler (7.11.1):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network (7.7.0):
|
||||
- GoogleUtilities/Network (7.11.1):
|
||||
- GoogleUtilities/Logger
|
||||
- "GoogleUtilities/NSData+zlib"
|
||||
- GoogleUtilities/Reachability
|
||||
- "GoogleUtilities/NSData+zlib (7.7.0)"
|
||||
- GoogleUtilities/Reachability (7.7.0):
|
||||
- "GoogleUtilities/NSData+zlib (7.11.1)"
|
||||
- GoogleUtilities/Reachability (7.11.1):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/UserDefaults (7.7.0):
|
||||
- GoogleUtilities/UserDefaults (7.11.1):
|
||||
- GoogleUtilities/Logger
|
||||
- GTMAppAuth (1.2.2):
|
||||
- AppAuth/Core (~> 1.4)
|
||||
- GTMSessionFetcher/Core (~> 1.5)
|
||||
- GTMSessionFetcher/Core (1.7.0)
|
||||
- JitsiWebRTC (106.0.0)
|
||||
- libwebp (1.2.1):
|
||||
- libwebp/demux (= 1.2.1)
|
||||
- libwebp/mux (= 1.2.1)
|
||||
- libwebp/webp (= 1.2.1)
|
||||
- libwebp/demux (1.2.1):
|
||||
- GTMAppAuth (1.3.1):
|
||||
- AppAuth/Core (~> 1.6)
|
||||
- GTMSessionFetcher/Core (< 3.0, >= 1.5)
|
||||
- GTMSessionFetcher/Core (2.3.0)
|
||||
- JitsiWebRTC (111.0.2)
|
||||
- libwebp (1.2.4):
|
||||
- libwebp/demux (= 1.2.4)
|
||||
- libwebp/mux (= 1.2.4)
|
||||
- libwebp/webp (= 1.2.4)
|
||||
- libwebp/demux (1.2.4):
|
||||
- libwebp/webp
|
||||
- libwebp/mux (1.2.1):
|
||||
- libwebp/mux (1.2.4):
|
||||
- libwebp/demux
|
||||
- libwebp/webp (1.2.1)
|
||||
- libwebp/webp (1.2.4)
|
||||
- nanopb (2.30908.0):
|
||||
- nanopb/decode (= 2.30908.0)
|
||||
- nanopb/encode (= 2.30908.0)
|
||||
- nanopb/decode (2.30908.0)
|
||||
- nanopb/encode (2.30908.0)
|
||||
- ObjectiveDropboxOfficial (6.2.3)
|
||||
- PromisesObjC (2.1.1)
|
||||
- PromisesSwift (2.1.1):
|
||||
- PromisesObjC (= 2.1.1)
|
||||
- PromisesObjC (2.2.0)
|
||||
- PromisesSwift (2.2.0):
|
||||
- PromisesObjC (= 2.2.0)
|
||||
- RCT-Folly (2021.06.28.00-v2):
|
||||
- boost
|
||||
- DoubleConversion
|
||||
@@ -163,201 +164,203 @@ PODS:
|
||||
- DoubleConversion
|
||||
- fmt (~> 6.2.1)
|
||||
- glog
|
||||
- RCTRequired (0.68.6)
|
||||
- RCTTypeSafety (0.68.6):
|
||||
- FBLazyVector (= 0.68.6)
|
||||
- RCTRequired (0.69.10)
|
||||
- RCTTypeSafety (0.69.10):
|
||||
- FBLazyVector (= 0.69.10)
|
||||
- RCTRequired (= 0.69.10)
|
||||
- React-Core (= 0.69.10)
|
||||
- React (0.69.10):
|
||||
- React-Core (= 0.69.10)
|
||||
- React-Core/DevSupport (= 0.69.10)
|
||||
- React-Core/RCTWebSocket (= 0.69.10)
|
||||
- React-RCTActionSheet (= 0.69.10)
|
||||
- React-RCTAnimation (= 0.69.10)
|
||||
- React-RCTBlob (= 0.69.10)
|
||||
- React-RCTImage (= 0.69.10)
|
||||
- React-RCTLinking (= 0.69.10)
|
||||
- React-RCTNetwork (= 0.69.10)
|
||||
- React-RCTSettings (= 0.69.10)
|
||||
- React-RCTText (= 0.69.10)
|
||||
- React-RCTVibration (= 0.69.10)
|
||||
- React-bridging (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.68.6)
|
||||
- React-Core (= 0.68.6)
|
||||
- React (0.68.6):
|
||||
- React-Core (= 0.68.6)
|
||||
- React-Core/DevSupport (= 0.68.6)
|
||||
- React-Core/RCTWebSocket (= 0.68.6)
|
||||
- React-RCTActionSheet (= 0.68.6)
|
||||
- React-RCTAnimation (= 0.68.6)
|
||||
- React-RCTBlob (= 0.68.6)
|
||||
- React-RCTImage (= 0.68.6)
|
||||
- React-RCTLinking (= 0.68.6)
|
||||
- React-RCTNetwork (= 0.68.6)
|
||||
- React-RCTSettings (= 0.68.6)
|
||||
- React-RCTText (= 0.68.6)
|
||||
- React-RCTVibration (= 0.68.6)
|
||||
- React-callinvoker (0.68.6)
|
||||
- React-Codegen (0.68.6):
|
||||
- FBReactNativeSpec (= 0.68.6)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-callinvoker (0.69.10)
|
||||
- React-Codegen (0.69.10):
|
||||
- FBReactNativeSpec (= 0.69.10)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.68.6)
|
||||
- RCTTypeSafety (= 0.68.6)
|
||||
- React-Core (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- ReactCommon/turbomodule/core (= 0.68.6)
|
||||
- React-Core (0.68.6):
|
||||
- RCTRequired (= 0.69.10)
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Core (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-Core (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.68.6)
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-Core/Default (= 0.69.10)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/CoreModulesHeaders (0.68.6):
|
||||
- React-Core/CoreModulesHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/Default (0.68.6):
|
||||
- React-Core/Default (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/DevSupport (0.68.6):
|
||||
- React-Core/DevSupport (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.68.6)
|
||||
- React-Core/RCTWebSocket (= 0.68.6)
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-jsinspector (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-Core/Default (= 0.69.10)
|
||||
- React-Core/RCTWebSocket (= 0.69.10)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-jsinspector (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTActionSheetHeaders (0.68.6):
|
||||
- React-Core/RCTActionSheetHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTAnimationHeaders (0.68.6):
|
||||
- React-Core/RCTAnimationHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTBlobHeaders (0.68.6):
|
||||
- React-Core/RCTBlobHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTImageHeaders (0.68.6):
|
||||
- React-Core/RCTImageHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTLinkingHeaders (0.68.6):
|
||||
- React-Core/RCTLinkingHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTNetworkHeaders (0.68.6):
|
||||
- React-Core/RCTNetworkHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTSettingsHeaders (0.68.6):
|
||||
- React-Core/RCTSettingsHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTTextHeaders (0.68.6):
|
||||
- React-Core/RCTTextHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTVibrationHeaders (0.68.6):
|
||||
- React-Core/RCTVibrationHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTWebSocket (0.68.6):
|
||||
- React-Core/RCTWebSocket (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.68.6)
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsiexecutor (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-Core/Default (= 0.69.10)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-CoreModules (0.68.6):
|
||||
- React-CoreModules (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.6)
|
||||
- React-Codegen (= 0.68.6)
|
||||
- React-Core/CoreModulesHeaders (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-RCTImage (= 0.68.6)
|
||||
- ReactCommon/turbomodule/core (= 0.68.6)
|
||||
- React-cxxreact (0.68.6):
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/CoreModulesHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-RCTImage (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-cxxreact (0.69.10):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-callinvoker (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-jsinspector (= 0.68.6)
|
||||
- React-logger (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-runtimeexecutor (= 0.68.6)
|
||||
- React-jsi (0.68.6):
|
||||
- React-callinvoker (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsinspector (= 0.69.10)
|
||||
- React-logger (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- React-runtimeexecutor (= 0.69.10)
|
||||
- React-jsi (0.69.10):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-jsi/Default (= 0.68.6)
|
||||
- React-jsi/Default (0.68.6):
|
||||
- React-jsi/Default (= 0.69.10)
|
||||
- React-jsi/Default (0.69.10):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-jsiexecutor (0.68.6):
|
||||
- React-jsiexecutor (0.69.10):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-jsinspector (0.68.6)
|
||||
- React-logger (0.68.6):
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- React-jsinspector (0.69.10)
|
||||
- React-logger (0.69.10):
|
||||
- glog
|
||||
- react-native-background-timer (2.4.1):
|
||||
- React-Core
|
||||
@@ -371,8 +374,6 @@ PODS:
|
||||
- React-Core
|
||||
- react-native-pager-view (5.4.9):
|
||||
- React-Core
|
||||
- react-native-performance (2.1.0):
|
||||
- React-Core
|
||||
- react-native-safe-area-context (4.4.1):
|
||||
- RCT-Folly
|
||||
- RCTRequired
|
||||
@@ -389,76 +390,77 @@ PODS:
|
||||
- react-native-video/Video (6.0.0-alpha.1):
|
||||
- PromisesSwift
|
||||
- React-Core
|
||||
- react-native-webrtc (106.0.7):
|
||||
- JitsiWebRTC (~> 106.0.0)
|
||||
- react-native-webrtc (111.0.1):
|
||||
- JitsiWebRTC (~> 111.0.0)
|
||||
- React-Core
|
||||
- react-native-webview (11.15.1):
|
||||
- React-Core
|
||||
- React-perflogger (0.68.6)
|
||||
- React-RCTActionSheet (0.68.6):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.68.6)
|
||||
- React-RCTAnimation (0.68.6):
|
||||
- React-perflogger (0.69.10)
|
||||
- React-RCTActionSheet (0.69.10):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.69.10)
|
||||
- React-RCTAnimation (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.6)
|
||||
- React-Codegen (= 0.68.6)
|
||||
- React-Core/RCTAnimationHeaders (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- ReactCommon/turbomodule/core (= 0.68.6)
|
||||
- React-RCTBlob (0.68.6):
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTAnimationHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTBlob (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Codegen (= 0.68.6)
|
||||
- React-Core/RCTBlobHeaders (= 0.68.6)
|
||||
- React-Core/RCTWebSocket (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-RCTNetwork (= 0.68.6)
|
||||
- ReactCommon/turbomodule/core (= 0.68.6)
|
||||
- React-RCTImage (0.68.6):
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTBlobHeaders (= 0.69.10)
|
||||
- React-Core/RCTWebSocket (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-RCTNetwork (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTImage (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.6)
|
||||
- React-Codegen (= 0.68.6)
|
||||
- React-Core/RCTImageHeaders (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-RCTNetwork (= 0.68.6)
|
||||
- ReactCommon/turbomodule/core (= 0.68.6)
|
||||
- React-RCTLinking (0.68.6):
|
||||
- React-Codegen (= 0.68.6)
|
||||
- React-Core/RCTLinkingHeaders (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- ReactCommon/turbomodule/core (= 0.68.6)
|
||||
- React-RCTNetwork (0.68.6):
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTImageHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-RCTNetwork (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTLinking (0.69.10):
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTLinkingHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTNetwork (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.6)
|
||||
- React-Codegen (= 0.68.6)
|
||||
- React-Core/RCTNetworkHeaders (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- ReactCommon/turbomodule/core (= 0.68.6)
|
||||
- React-RCTSettings (0.68.6):
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTNetworkHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTSettings (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.6)
|
||||
- React-Codegen (= 0.68.6)
|
||||
- React-Core/RCTSettingsHeaders (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- ReactCommon/turbomodule/core (= 0.68.6)
|
||||
- React-RCTText (0.68.6):
|
||||
- React-Core/RCTTextHeaders (= 0.68.6)
|
||||
- React-RCTVibration (0.68.6):
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTSettingsHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTText (0.69.10):
|
||||
- React-Core/RCTTextHeaders (= 0.69.10)
|
||||
- React-RCTVibration (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Codegen (= 0.68.6)
|
||||
- React-Core/RCTVibrationHeaders (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- ReactCommon/turbomodule/core (= 0.68.6)
|
||||
- React-runtimeexecutor (0.68.6):
|
||||
- React-jsi (= 0.68.6)
|
||||
- ReactCommon/turbomodule/core (0.68.6):
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTVibrationHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-runtimeexecutor (0.69.10):
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (0.69.10):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-callinvoker (= 0.68.6)
|
||||
- React-Core (= 0.68.6)
|
||||
- React-cxxreact (= 0.68.6)
|
||||
- React-jsi (= 0.68.6)
|
||||
- React-logger (= 0.68.6)
|
||||
- React-perflogger (= 0.68.6)
|
||||
- React-bridging (= 0.69.10)
|
||||
- React-callinvoker (= 0.69.10)
|
||||
- React-Core (= 0.69.10)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-logger (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- RNCalendarEvents (2.2.0):
|
||||
- React
|
||||
- RNCAsyncStorage (1.17.3):
|
||||
@@ -471,8 +473,8 @@ PODS:
|
||||
- React-Core
|
||||
- RNGestureHandler (2.9.0):
|
||||
- React-Core
|
||||
- RNGoogleSignin (7.0.4):
|
||||
- GoogleSignIn (~> 6.0.0)
|
||||
- RNGoogleSignin (9.0.2):
|
||||
- GoogleSignIn (~> 6.2)
|
||||
- React-Core
|
||||
- RNScreens (3.13.1):
|
||||
- React-Core
|
||||
@@ -500,16 +502,16 @@ DEPENDENCIES:
|
||||
- Firebase/DynamicLinks (~> 8.0)
|
||||
- "giphy-react-native-sdk (from `../node_modules/@giphy/react-native-sdk`)"
|
||||
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
||||
- JitsiWebRTC (~> 106.0.0)
|
||||
- JitsiWebRTC (~> 111.0.0)
|
||||
- ObjectiveDropboxOfficial (= 6.2.3)
|
||||
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
|
||||
- RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
|
||||
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
|
||||
- React (from `../node_modules/react-native/`)
|
||||
- React-bridging (from `../node_modules/react-native/ReactCommon`)
|
||||
- React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
|
||||
- React-Codegen (from `build/generated/ios`)
|
||||
- React-Core (from `../node_modules/react-native/`)
|
||||
- React-Core/DevSupport (from `../node_modules/react-native/`)
|
||||
- React-Core/RCTWebSocket (from `../node_modules/react-native/`)
|
||||
- React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
|
||||
- React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
|
||||
@@ -523,7 +525,6 @@ DEPENDENCIES:
|
||||
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
|
||||
- react-native-orientation-locker (from `../node_modules/react-native-orientation-locker`)
|
||||
- react-native-pager-view (from `../node_modules/react-native-pager-view`)
|
||||
- react-native-performance (from `../node_modules/react-native-performance/ios`)
|
||||
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
|
||||
- "react-native-slider (from `../node_modules/@react-native-community/slider`)"
|
||||
- react-native-splash-screen (from `../node_modules/react-native-splash-screen`)
|
||||
@@ -605,6 +606,8 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/react-native/Libraries/TypeSafety"
|
||||
React:
|
||||
:path: "../node_modules/react-native/"
|
||||
React-bridging:
|
||||
:path: "../node_modules/react-native/ReactCommon"
|
||||
React-callinvoker:
|
||||
:path: "../node_modules/react-native/ReactCommon/callinvoker"
|
||||
React-Codegen:
|
||||
@@ -635,8 +638,6 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/react-native-orientation-locker"
|
||||
react-native-pager-view:
|
||||
:path: "../node_modules/react-native-pager-view"
|
||||
react-native-performance:
|
||||
:path: "../node_modules/react-native-performance/ios"
|
||||
react-native-safe-area-context:
|
||||
:path: "../node_modules/react-native-safe-area-context"
|
||||
react-native-slider:
|
||||
@@ -701,12 +702,12 @@ EXTERNAL SOURCES:
|
||||
SPEC CHECKSUMS:
|
||||
Amplitude: 834c7332dfb9640a751e21c13efb22a07c0c12d4
|
||||
amplitude-react-native: 0ed8cab759aafaa94961b82122bf56297da607ad
|
||||
AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7
|
||||
AppAuth: e48b432bb4ba88b10cb2bcc50d7f3af21e78b9c2
|
||||
boost: a7c83b31436843459a1961bfd74b96033dc77234
|
||||
CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da
|
||||
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
|
||||
FBLazyVector: 74b042924fe14da854ac4e87cefc417f583b22b1
|
||||
FBReactNativeSpec: cc0037b9914b9b1d92a15f179bc3e2e2c7cc0c6f
|
||||
DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
|
||||
FBLazyVector: a8af91c2b5a0029d12ff6b32e428863d63c48991
|
||||
FBReactNativeSpec: ec5e878f6452a3de5430e0b2324a4d4ae6ac63f6
|
||||
Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d
|
||||
FirebaseAnalytics: 7761cbadb00a717d8d0939363eb46041526474fa
|
||||
FirebaseCore: 5743c5785c074a794d35f2fff7ecc254a91e08b1
|
||||
@@ -715,72 +716,72 @@ SPEC CHECKSUMS:
|
||||
FirebaseDynamicLinks: 1dc816ef789c5adac6fede0b46d11478175c70e4
|
||||
FirebaseInstallations: 40bd9054049b2eae9a2c38ef1c3dd213df3605cd
|
||||
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
|
||||
Giphy: b6d5087521d251bb8c99cdc0eb07bbdf86d142d5
|
||||
giphy-react-native-sdk: 7abccf2b52123a0f30ce99da895ab6288023680c
|
||||
glog: 476ee3e89abb49e07f822b48323c51c57124b572
|
||||
Giphy: 6b5f6986c8df4f71e01a8ef86595f426b3439fb5
|
||||
giphy-react-native-sdk: fcda9639f8ca2cc47e0517b6ef11c19359db5f5a
|
||||
glog: 3d02b25ca00c2d456734d0bcff864cbc62f6ae1a
|
||||
GoogleAppMeasurement: 4c19f031220c72464d460c9daa1fb5d1acce958e
|
||||
GoogleDataTransport: 5fffe35792f8b96ec8d6775f5eccd83c998d5a3b
|
||||
GoogleSignIn: fd381840dbe7c1137aa6dc30849a5c3e070c034a
|
||||
GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1
|
||||
GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89
|
||||
GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91
|
||||
JitsiWebRTC: f441eb0e2d67f0588bf24e21c5162e97342714fb
|
||||
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
|
||||
GoogleDataTransport: 8378d1fa8ac49753ea6ce70d65a7cb70ce5f66e6
|
||||
GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a
|
||||
GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749
|
||||
GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd
|
||||
GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2
|
||||
JitsiWebRTC: 80f62908fcf2a1160e0d14b584323fb6e6be630b
|
||||
libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef
|
||||
nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96
|
||||
ObjectiveDropboxOfficial: fe206ce8c0bc49976c249d472db7fdbc53ebbd53
|
||||
PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
|
||||
PromisesSwift: 99fddfe4a0ec88a56486644c0da106694c92a604
|
||||
RCT-Folly: 4d8508a426467c48885f1151029bc15fa5d7b3b8
|
||||
RCTRequired: 92cbd71369a2de6add25fd2403ac39838f1b694f
|
||||
RCTTypeSafety: 494e8af41d7410ed0b877210859ee3984f37e6b4
|
||||
React: 59989499c0e8926a90d34a9ae0bdb2d1b5b53406
|
||||
React-callinvoker: 8187db1c71cf2c1c66e8f7328a0cf77a2b255d94
|
||||
React-Codegen: e806dc2f10ddae645d855cb58acf73ce41eb8ea5
|
||||
React-Core: fc7339b493e368ae079850a4721bdf716cf3dba2
|
||||
React-CoreModules: 2f54f6bbf2764044379332089fcbdaf79197021e
|
||||
React-cxxreact: ee119270006794976e1ab271f0111a5a88b16bcf
|
||||
React-jsi: ec691b2a475d13b1fd39f697145a526eeeb6661c
|
||||
React-jsiexecutor: b4ce4afc5dd9c8fdd2ac59049ccf420f288ecef7
|
||||
React-jsinspector: e396d5e56af08fce39f50571726b68a40f1e302d
|
||||
React-logger: cec52b3f8fb0be0d47b2cb75dec69de60f2de3b6
|
||||
PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef
|
||||
PromisesSwift: cf9eb58666a43bbe007302226e510b16c1e10959
|
||||
RCT-Folly: b9d9fe1fc70114b751c076104e52f3b1b5e5a95a
|
||||
RCTRequired: 3581db0757e7ff9be10718a56b3d79b6a6bd3bdf
|
||||
RCTTypeSafety: ce13e630c48340401ebfb28710959913f74b8b36
|
||||
React: cca8f2b7cce018f79847ca79847fa367b206e8a1
|
||||
React-bridging: b893643f09d3964afba6c347e00dd86cf10691e5
|
||||
React-callinvoker: 9ac7cba30428eddf7a06d1253f8e7561b5c97334
|
||||
React-Codegen: 65ff9fbddf8a17a6d4f495f71d365288f934a93a
|
||||
React-Core: 550b694774bc778b5c7bf7608fc12a484e01ec05
|
||||
React-CoreModules: c332d5b416cb3ccf972e7af79d496498a700e073
|
||||
React-cxxreact: c5c4106bfd2d0cee80b848e33b7ff4e35a721b16
|
||||
React-jsi: 6ff3fb9b9764a499c959e0096c0d384fa2b4beef
|
||||
React-jsiexecutor: 388f1c99404c848141d7ea162f61233d04829ede
|
||||
React-jsinspector: a4463b3411b8b9b37153255ef694a84c77ba3c7f
|
||||
React-logger: 2a0497622cbabc47fb769d97620952df14c1f814
|
||||
react-native-background-timer: 17ea5e06803401a379ebf1f20505b793ac44d0fe
|
||||
react-native-get-random-values: 30b3f74ca34e30e2e480de48e4add2706a40ac8f
|
||||
react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774
|
||||
react-native-netinfo: 27f287f2d191693f3b9d01a4273137fcf91c3b5d
|
||||
react-native-orientation-locker: 851f6510d8046ea2f14aa169b1e01fcd309a94ba
|
||||
react-native-pager-view: 3ee7d4c7697fb3ef788346e834a60cca97ed8540
|
||||
react-native-performance: f4b6604a9d5a8a7407e34a82fab6c641d9a3ec12
|
||||
react-native-safe-area-context: 99b24a0c5acd0d5dcac2b1a7f18c49ea317be99a
|
||||
react-native-slider: 6e9b86e76cce4b9e35b3403193a6432ed07e0c81
|
||||
react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
|
||||
react-native-video: bb6f12a7198db53b261fefb5d609dc77417acc8b
|
||||
react-native-webrtc: 0df36747802476e758af6b6dceccdeaed8c826c2
|
||||
react-native-webrtc: 2702afae1e59882b423e6077768ca0d1e6fc42ed
|
||||
react-native-webview: ea4899a1056c782afa96dd082179a66cbebf5504
|
||||
React-perflogger: 46620fc6d1c3157b60ed28434e08f7fd7f3f3353
|
||||
React-RCTActionSheet: b1f7e72a0ba760ec684df335c61f730b5179f5ff
|
||||
React-RCTAnimation: d73b62d42867ab608dfb10e100d8b91106275b18
|
||||
React-RCTBlob: b5f59693721d50967c35598158e6ca01b474c7de
|
||||
React-RCTImage: 37cf34d0c2fbef2e0278d42a7c5e8ea06a9fed6b
|
||||
React-RCTLinking: a11dced20019cf1c2ec7fd120f18b08f2851f79e
|
||||
React-RCTNetwork: ba097188e5eac42e070029e7cedd9b978940833a
|
||||
React-RCTSettings: 147073708a1c1bde521cf3af045a675682772726
|
||||
React-RCTText: 23f76ebfb2717d181476432e5ecf1c6c4a104c5e
|
||||
React-RCTVibration: be5f18ffc644f96f904e0e673ab639ca5d673ee8
|
||||
React-runtimeexecutor: d5498cfb7059bf8397b6416db4777843f3f4c1e7
|
||||
ReactCommon: 1974dab5108c79b40199f12a4833d2499b9f6303
|
||||
React-perflogger: bc57c4a953c1ec913b0d984cf4f2b9842a12bde0
|
||||
React-RCTActionSheet: 3efa3546119a1050f6c34a461b386dd9e36eaf0b
|
||||
React-RCTAnimation: e58fb9f1adf7b38af329881ea2740f43ffeea854
|
||||
React-RCTBlob: d2238645553c3ec787324268c0676148d86e6cc4
|
||||
React-RCTImage: e6d7c9ab978cae99364fcc96b9238fc7740a13da
|
||||
React-RCTLinking: 329e88ce217dad464ef34b5d0c40b3ceaac6c9ec
|
||||
React-RCTNetwork: c8967f2382aac31761ddb750fee53fa34cf7a4ee
|
||||
React-RCTSettings: 8a825b4b5ea58f6713a7c97eea6cc82e9895188b
|
||||
React-RCTText: ffcaac5c66bc065f2ccf79b6fe34585adb9e589b
|
||||
React-RCTVibration: 0039c986626b78242401931bb23c803935fae9d1
|
||||
React-runtimeexecutor: 5ebf1ddaa706bf2986123f22d2cad905443c2c5f
|
||||
ReactCommon: 65754b8932ea80272714988268bbfb9f303264a5
|
||||
RNCalendarEvents: 7e65eb4a94f53c1744d1e275f7fafcfaa619f7a3
|
||||
RNCAsyncStorage: 005c0e2f09575360f142d0d1f1f15e4ec575b1af
|
||||
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
|
||||
RNDefaultPreference: 08bdb06cfa9188d5da97d4642dac745218d7fb31
|
||||
RNDeviceInfo: 0400a6d0c94186d1120c3cbd97b23abc022187a9
|
||||
RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39
|
||||
RNGoogleSignin: c4381751eefd73c552b923ba347a9bfc6f18771c
|
||||
RNGoogleSignin: 22e468a9474dbcb8618d8847205ad4f0b2575d13
|
||||
RNScreens: 40a2cb40a02a609938137a1e0acfbf8fc9eebf19
|
||||
RNSound: 27e8268bdb0a1f191f219a33267f7e0445e8d62f
|
||||
RNSVG: f3b60aeeaa81960e2e0536c3a9eef50b667ef3a9
|
||||
RNWatch: dae6c858a2051dbdcfb00b9a86cf4d90400263b4
|
||||
Yoga: 7929b92b1828675c1bebeb114dae8cb8fa7ef6a3
|
||||
Yoga: d24d6184b6b85f742536bd93bd07d69d7b9bb4c1
|
||||
|
||||
PODFILE CHECKSUM: e671cdcdb80fab67e305861c36bfae8ed5a5b0ef
|
||||
PODFILE CHECKSUM: e3579df5272b8b697c9fdc0e55aa0845b189c4dd
|
||||
|
||||
COCOAPODS: 1.11.3
|
||||
|
||||
@@ -439,7 +439,7 @@
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "app" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
compatibilityVersion = "Xcode 12.0";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
@@ -1025,9 +1025,10 @@
|
||||
"$(inherited)",
|
||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
@@ -1078,8 +1079,9 @@
|
||||
"$(inherited)",
|
||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
|
||||
@@ -39,6 +39,11 @@
|
||||
[builder setFeatureFlag:@"ios.screensharing.enabled" withBoolean:YES];
|
||||
[builder setFeatureFlag:@"ios.recording.enabled" withBoolean:YES];
|
||||
builder.serverURL = [NSURL URLWithString:@"https://meet.jit.si"];
|
||||
#if TARGET_IPHONE_SIMULATOR
|
||||
// CallKit has started to create problems starting with the iOS 16 simulator.
|
||||
// Disable it since it never worked in the simulator anyway.
|
||||
[builder setFeatureFlag:@"call-integration.enabled" withBoolean:NO];
|
||||
#endif
|
||||
}];
|
||||
|
||||
[jitsiMeet application:application didFinishLaunchingWithOptions:launchOptions];
|
||||
|
||||
@@ -98,7 +98,6 @@ platform :ios do
|
||||
demo_account_required: false,
|
||||
distribute_external: true,
|
||||
groups: ENV["JITSI_BETA_TESTING_GROUPS"],
|
||||
reject_build_waiting_for_review: true,
|
||||
uses_non_exempt_encryption: false
|
||||
)
|
||||
|
||||
|
||||
@@ -472,7 +472,7 @@
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 0BD906DF1EC0C00300C8C18E /* Build configuration list for PBXProject "sdk" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
compatibilityVersion = "Xcode 12.0";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
@@ -526,7 +526,7 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "export NODE_BINARY=node\nexport NODE_ARGS=\"--max_old_space_size=4096\"\n../../node_modules/react-native/scripts/react-native-xcode.sh\n";
|
||||
shellScript = "WITH_ENVIRONMENT=\"../../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
|
||||
};
|
||||
26796D8589142D80C8AFDA51 /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
@@ -551,17 +551,12 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDK/Pods-JitsiMeetSDK-resources.sh",
|
||||
"${PODS_ROOT}/Amplitude/Sources/Resources/ComodoRsaDomainValidationCA.der",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/GoogleSignIn/GoogleSignIn.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
|
||||
inputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDK/Pods-JitsiMeetSDK-resources-${CONFIGURATION}-input-files.xcfilelist",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ComodoRsaDomainValidationCA.der",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
|
||||
outputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDK/Pods-JitsiMeetSDK-resources-${CONFIGURATION}-output-files.xcfilelist",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
@@ -641,15 +636,12 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite-resources.sh",
|
||||
"${PODS_ROOT}/Amplitude/Sources/Resources/ComodoRsaDomainValidationCA.der",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
|
||||
inputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite-resources-${CONFIGURATION}-input-files.xcfilelist",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ComodoRsaDomainValidationCA.der",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
|
||||
outputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite-resources-${CONFIGURATION}-output-files.xcfilelist",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
@@ -781,9 +773,10 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
@@ -837,8 +830,9 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
*/
|
||||
|
||||
#import <Intents/Intents.h>
|
||||
#import <WebRTC/RTCLogging.h>
|
||||
|
||||
#import "Orientation.h"
|
||||
|
||||
#import "JitsiMeet+Private.h"
|
||||
@@ -26,6 +26,8 @@
|
||||
#import "RNSplashScreen.h"
|
||||
#import "ScheenshareEventEmiter.h"
|
||||
|
||||
#import <react-native-webrtc/WebRTCModuleOptions.h>
|
||||
|
||||
#if !defined(JITSI_MEET_SDK_LITE)
|
||||
#import <RNGoogleSignin/RNGoogleSignin.h>
|
||||
#import "Dropbox.h"
|
||||
@@ -52,6 +54,12 @@
|
||||
|
||||
- (instancetype)init {
|
||||
if (self = [super init]) {
|
||||
#if 0
|
||||
// Initialize WebRTC options.
|
||||
WebRTCModuleOptions *options = [WebRTCModuleOptions sharedInstance];
|
||||
options.loggingSeverity = RTCLoggingSeverityInfo;
|
||||
#endif
|
||||
|
||||
// Initialize the one and only bridge for interfacing with React Native.
|
||||
_bridgeWrapper = [[RCTBridgeWrapper alloc] init];
|
||||
|
||||
@@ -63,11 +71,6 @@
|
||||
|
||||
// Register a log handler for React.
|
||||
registerReactLogHandler();
|
||||
|
||||
#if 0
|
||||
// Enable WebRTC logs
|
||||
RTCSetMinDebugLogLevel(RTCLoggingSeverityInfo);
|
||||
#endif
|
||||
}
|
||||
|
||||
return self;
|
||||
|
||||
@@ -39,6 +39,18 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "Geringe Bandbreite"
|
||||
},
|
||||
"bandwidthSettings": {
|
||||
"assumedBandwidthBps": "z.B. 10000000 für 10 Mbps",
|
||||
"assumedBandwidthBpsWarning": "Höhere Werte können zu Netzwerk-Problemen führen.",
|
||||
"customValue": "spezifischer Wert",
|
||||
"customValueEffect": "setzt den Wert in bps",
|
||||
"leaveEmpty": "leer lassen",
|
||||
"leaveEmptyEffect": "aktiviert die automatische Abschätzung",
|
||||
"possibleValues": "Mögliche Werte",
|
||||
"setAssumedBandwidthBps": "Angenommene Bandbreite (bps)",
|
||||
"title": "Einstellungen Bandbreite",
|
||||
"zeroEffect": "schaltet Video aus"
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"actions": {
|
||||
"add": "Breakout-Raum hinzufügen",
|
||||
@@ -156,6 +168,7 @@
|
||||
"localport_plural": "Lokale Ports:",
|
||||
"maxEnabledResolution": "max. senden",
|
||||
"more": "Mehr anzeigen",
|
||||
"no": "Nein",
|
||||
"packetloss": "Paketverlust:",
|
||||
"participant_id": "Personen-ID:",
|
||||
"quality": {
|
||||
@@ -174,7 +187,8 @@
|
||||
"status": "Verbindung:",
|
||||
"transport": "Protokoll:",
|
||||
"transport_plural": "Protokolle:",
|
||||
"video_ssrc": "Video-SSRC:"
|
||||
"video_ssrc": "Video-SSRC:",
|
||||
"yes": "Ja"
|
||||
},
|
||||
"dateUtils": {
|
||||
"earlier": "Früher",
|
||||
@@ -673,6 +687,7 @@
|
||||
"connectedTwoMembers": "{{first}} und {{second}} nehmen am Meeting teil",
|
||||
"dataChannelClosed": "Schlechte Videoqualität",
|
||||
"dataChannelClosedDescription": "Die Steuerungsverbindung (Bridge Channel) wurde unterbrochen, daher ist die Videoqulität auf die schlechteste Stufe limitiert.",
|
||||
"disabledIframe": "Die Einbettung ist nur für Demo-Zwecke vorgesehen. Diese Konferenz wird in {{timeout}} Minuten beendet.",
|
||||
"disconnected": "getrennt",
|
||||
"displayNotifications": "Benachrichtigungen anzeigen für",
|
||||
"dontRemindMe": "Nicht erinnern",
|
||||
@@ -867,9 +882,11 @@
|
||||
"lookGood": "Ihr Mikrofon scheint zu funktionieren.",
|
||||
"or": "oder",
|
||||
"premeeting": "Vorschau",
|
||||
"proceedAnyway": "Trotzdem fortsetzen",
|
||||
"screenSharingError": "Fehler bei Bildschirmfreigabe:",
|
||||
"showScreen": "Konferenzvorschau aktivieren",
|
||||
"startWithPhone": "Mit Telefonaudio starten",
|
||||
"unsafeRoomConsent": "Ich verstehe das Risiko und möchte der Konferenz beitreten",
|
||||
"videoOnlyError": "Videofehler:",
|
||||
"videoTrackError": "Videotrack konnte nicht erstellt werden.",
|
||||
"viewAllNumbers": "alle Nummern anzeigen"
|
||||
@@ -971,8 +988,14 @@
|
||||
"security": {
|
||||
"about": "Sie können Ihre Konferenz mit einem Passwort sichern. Teilnehmer müssen dieses eingeben, bevor sie an der Sitzung teilnehmen dürfen.",
|
||||
"aboutReadOnly": "Mit Moderationsrechten kann die Konferenz mit einem Passwort gesichert werden. Personen müssen dieses eingeben, bevor sie an der Sitzung teilnehmen dürfen.",
|
||||
"insecureRoomNameWarning": "Der Raumname ist unsicher. Unerwünschte Teilnehmer könnten Ihrer Konferenz beitreten",
|
||||
"title": "Sicherheitsoptionen"
|
||||
"insecureRoomNameWarningNative": "Der Raumname ist unsicher. Unerwünschte Teilnehmer könnten Ihrer Konferenz beitreten. {{recommendAction}} Lernen Sie mehr über die Absicherung Ihrer Konferenz ",
|
||||
"insecureRoomNameWarningWeb": "Der Raumname ist unsicher. Unerwünschte Teilnehmer könnten Ihrer Konferenz beitreten {{recommendAction}} Lernen Sie <a href=\"{{securityUrl}}\" rel=\"security\" target=\"_blank\">hier</a> mehr über die Absicherung Ihrer Konferenz.",
|
||||
"title": "Sicherheitsoptionen",
|
||||
"unsafeRoomActions": {
|
||||
"meeting": "Erwägen Sie die Absicherung Ihrer Konferenz über den Sicherheits-Button.",
|
||||
"prejoin": "Erwägen Sie einen einzigartigeren Raumnamen zu wählen.",
|
||||
"welcome": "Erwägen Sie einen einzigartigeren Raumnamen zu wählen oder wählen Sie einen der Vorschläge."
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"audio": "Audio",
|
||||
@@ -1140,6 +1163,7 @@
|
||||
"muteEveryoneElse": "Alle anderen stummschalten",
|
||||
"muteEveryoneElsesVideoStream": "Alle anderen Kameras ausschalten",
|
||||
"muteEveryonesVideoStream": "Alle Kameras ausschalten",
|
||||
"muteGUMPending": "Verbinde Ihr Mikrofon",
|
||||
"noiseSuppression": "Rauschunterdrückung",
|
||||
"openChat": "Chat öffnen",
|
||||
"participants": "Anwesende",
|
||||
@@ -1147,6 +1171,7 @@
|
||||
"privateMessage": "Private Nachricht senden",
|
||||
"profile": "Profil bearbeiten",
|
||||
"raiseHand": "Hand heben",
|
||||
"reactions": "Interaktionen",
|
||||
"reactionsMenu": "Interaktionsmenü öffnen / schließen",
|
||||
"recording": "Aufzeichnung ein-/ausschalten",
|
||||
"remoteMute": "Personen stummschalten",
|
||||
@@ -1172,6 +1197,7 @@
|
||||
"unmute": "Stummschaltung aufheben",
|
||||
"videoblur": "Unscharfer Hintergrund ein-/ausschalten",
|
||||
"videomute": "„Video stummschalten“ ein-/ausschalten",
|
||||
"videomuteGUMPending": "Verbinde Ihre Kamera",
|
||||
"videounmute": "Kamera einschalten"
|
||||
},
|
||||
"addPeople": "Personen zur Konferenz hinzufügen",
|
||||
@@ -1222,6 +1248,7 @@
|
||||
"mute": "Stummschalten",
|
||||
"muteEveryone": "Alle stummschalten",
|
||||
"muteEveryonesVideo": "Alle Kameras ausschalten",
|
||||
"muteGUMPending": "Verbinde Ihre Kamera",
|
||||
"noAudioSignalDesc": "Wenn Sie das Gerät nicht absichtlich über die Systemeinstellungen oder die Hardware stumm geschaltet haben, sollten Sie einen Wechsel des Geräts in Erwägung ziehen.",
|
||||
"noAudioSignalDescSuggestion": "Wenn Sie das Gerät nicht absichtlich über die Systemeinstellungen oder die Hardware stummgeschaltet haben, sollten Sie einen Wechsel auf das vorgeschlagene Gerät in Erwägung ziehen.",
|
||||
"noAudioSignalDialInDesc": "Sie können sich auch über die Einwahlnummer einwählen:",
|
||||
@@ -1244,6 +1271,7 @@
|
||||
"reactionLike": "Daumen hoch senden",
|
||||
"reactionSilence": "Stille senden",
|
||||
"reactionSurprised": "Überrascht senden",
|
||||
"reactions": "Interaktionen",
|
||||
"security": "Sicherheitsoptionen",
|
||||
"selectBackground": "Hintergrund auswählen",
|
||||
"shareRoom": "Person einladen",
|
||||
@@ -1266,6 +1294,7 @@
|
||||
"unmute": "Stummschaltung aufheben",
|
||||
"videoSettings": "Kameraeinstellungen",
|
||||
"videomute": "Kamera stoppen",
|
||||
"videomuteGUMPending": "Verbinde Ihre Kamera",
|
||||
"videounmute": "Kamera einschalten"
|
||||
},
|
||||
"transcribing": {
|
||||
@@ -1377,7 +1406,14 @@
|
||||
"webAssemblyWarning": "WebAssembly wird nicht unterstützt",
|
||||
"webAssemblyWarningDescription": "WebAssembly ist deaktiviert oder wird in diesem Browser nicht unterstützt"
|
||||
},
|
||||
"visitorsLabel": "Anzahl Gäste: {{count}}",
|
||||
"visitors": {
|
||||
"chatIndicator": "(Gast)",
|
||||
"labelTooltip": "Anzahl Gäste: {{count}}",
|
||||
"notification": {
|
||||
"description": "Bitte melden Sie sich um teilzunehmen",
|
||||
"title": "Sie sind Gast in der Konferenz"
|
||||
}
|
||||
},
|
||||
"volumeSlider": "Lautstärkeregler",
|
||||
"welcomepage": {
|
||||
"accessibilityLabel": {
|
||||
|
||||
1440
lang/main-el.json
1440
lang/main-el.json
File diff suppressed because it is too large
Load Diff
@@ -11,7 +11,6 @@
|
||||
"defaultEmail": "Dirección de correo por defecto",
|
||||
"disabled": "No puede invitar a otras personas.",
|
||||
"failedToAdd": "Error al agregar participantes",
|
||||
"footerText": "La marcación está desactivada.",
|
||||
"googleEmail": "Correo electrónico de Google",
|
||||
"inviteMoreHeader": "Usted se encuentra solo en la reunión",
|
||||
"inviteMoreMailSubject": "Unirse a la reunión {{appName}}",
|
||||
@@ -31,6 +30,7 @@
|
||||
},
|
||||
"audioDevices": {
|
||||
"bluetooth": "Bluetooth",
|
||||
"car": "Audio de automóvil",
|
||||
"headphones": "Auriculares",
|
||||
"none": "No hay dispositivos de audio disponibles",
|
||||
"phone": "Teléfono",
|
||||
@@ -39,6 +39,37 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "Solo sonido y pantalla compartida"
|
||||
},
|
||||
"bandwidthSettings": {
|
||||
"assumedBandwidthBps": "por ejemplo 10000000 para 10 Mbps",
|
||||
"assumedBandwidthBpsWarning": "Valores más altos podrían causar problemas de red.",
|
||||
"customValue": "valor personalizado",
|
||||
"customValueEffect": "para establecer el valor real de bps",
|
||||
"leaveEmpty": "dejar vacío",
|
||||
"leaveEmptyEffect": "para permitir que se realicen estimaciones",
|
||||
"possibleValues": "Valores posibles",
|
||||
"setAssumedBandwidthBps": "Ancho de banda asumido (bps)",
|
||||
"title": "Ajustes de ancho de banda",
|
||||
"zeroEffect": "para deshabilitar el video"
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"actions": {
|
||||
"add": "Agregar sala para grupos pequeños",
|
||||
"autoAssign": "Autoasignar a sala para grupos pequeños",
|
||||
"close": "Cerrar",
|
||||
"join": "Unirse",
|
||||
"leaveBreakoutRoom": "Abandonar sala para grupos pequeños",
|
||||
"more": "Más",
|
||||
"remove": "Quitar",
|
||||
"sendToBreakoutRoom": "Enviar participante a:"
|
||||
},
|
||||
"defaultName": "Sala para grupos pequeños #{{index}}",
|
||||
"mainRoom": "Sala principal",
|
||||
"notifications": {
|
||||
"joined": "Uniéndose a la sala para grupos pequeños \"{{name}}\"",
|
||||
"joinedMainRoom": "Uniéndose a la sala principal",
|
||||
"joinedTitle": "Salas para grupos pequeños"
|
||||
}
|
||||
},
|
||||
"calendarSync": {
|
||||
"addMeetingURL": "Agregar un vínculo a la reunión",
|
||||
"confirmAddLink": "¿Quiere añadir un enlace de Jitsi a este evento?",
|
||||
@@ -57,15 +88,27 @@
|
||||
"refresh": "Actualizar calendario",
|
||||
"today": "Hoy"
|
||||
},
|
||||
"carmode": {
|
||||
"actions": {
|
||||
"selectSoundDevice": "Elija un dispositivo de sonido"
|
||||
},
|
||||
"labels": {
|
||||
"buttonLabel": "Modo automóvil",
|
||||
"title": "Modo automóvil",
|
||||
"videoStopped": "Su video se ha detenido"
|
||||
}
|
||||
},
|
||||
"chat": {
|
||||
"enter": "Entrar en la sala",
|
||||
"error": "Error: su mensaje no se envío. Motivo: {{error}}",
|
||||
"fieldPlaceHolder": "Escriba su mensaje aquí",
|
||||
"lobbyChatMessageTo": "Mensaje de chat de lobby a {{recipient}}",
|
||||
"message": "Mensaje",
|
||||
"messageAccessibleTitle": "{{user}} dice:",
|
||||
"messageAccessibleTitleMe": "yo digo:",
|
||||
"messageTo": "Mensaje privado para {{recipient}}",
|
||||
"messagebox": "Escriba un mensaje",
|
||||
"newMessages": "Mensajes nuevos",
|
||||
"nickname": {
|
||||
"popover": "Selecciona un apodo",
|
||||
"title": "Introduce un apodo para usar el chat",
|
||||
@@ -85,6 +128,7 @@
|
||||
},
|
||||
"chromeExtensionBanner": {
|
||||
"buttonText": "Instalar extensión de Chrome",
|
||||
"buttonTextEdge": "Instalar extensión de Edge",
|
||||
"close": "Cerrar",
|
||||
"dontShowAgain": "No mostrar nuevamente",
|
||||
"installExtensionText": "Instalar la extensión para Google Calendar y la integración con Office 365"
|
||||
@@ -115,6 +159,7 @@
|
||||
"bridgeCount": "Contador del servidor: ",
|
||||
"codecs": "Codecs (A/V):",
|
||||
"connectedTo": "Conectado a:",
|
||||
"e2eeVerified": "",
|
||||
"framerate": "Fotogramas por segundo:",
|
||||
"less": "Mostrar menos",
|
||||
"localaddress": "Dirección local:",
|
||||
@@ -123,6 +168,7 @@
|
||||
"localport_plural": "Puertos locales:",
|
||||
"maxEnabledResolution": "enviar max",
|
||||
"more": "Mostrar más",
|
||||
"no": "no",
|
||||
"packetloss": "Pérdida de paquetes:",
|
||||
"participant_id": "ID participante:",
|
||||
"quality": {
|
||||
@@ -141,7 +187,8 @@
|
||||
"status": "Calidad:",
|
||||
"transport": "Transporte:",
|
||||
"transport_plural": "Transportes:",
|
||||
"video_ssrc": "Video SSRC:"
|
||||
"video_ssrc": "Video SSRC:",
|
||||
"yes": "sí"
|
||||
},
|
||||
"dateUtils": {
|
||||
"earlier": "Anterior",
|
||||
@@ -150,15 +197,24 @@
|
||||
},
|
||||
"deepLinking": {
|
||||
"appNotInstalled": "Necesitas la aplicación {{app}} para unirte a esta reunión en el teléfono.",
|
||||
"description": "¿No pasó nada? Hemos intentado iniciar la reunión en la aplicación de escritorio {{app}}. Intenta de nuevo o inicia en la aplicación web {{app}}.",
|
||||
"description": "¿No pasó nada? Intentamos iniciar la reunión en la aplicación de escritorio {{app}}. Intenta de nuevo o inicia en la aplicación web {{app}}.",
|
||||
"descriptionNew": "¿No pasó nada? Intentamos iniciar la reunión en la aplicación de escritorio {{app}}. <br /><br /> Puedes volver a intentarlo o iniciar en la aplicación web.",
|
||||
"descriptionWithoutWeb": "¿No pasó nada? Intentamos iniciar su reunión en la aplicación de escritorio {{app}}.",
|
||||
"downloadApp": "Descargar la app",
|
||||
"downloadMobileApp": "",
|
||||
"ifDoNotHaveApp": "Si aún no tienes la app:",
|
||||
"ifHaveApp": "Si ya tienes la app:",
|
||||
"joinInApp": "Unirse a la reunion usando la app",
|
||||
"joinInAppNew": "Unirse en la app",
|
||||
"joinInBrowser": "Unirse en el navegador",
|
||||
"launchMeetingLabel": "¿Cómo quieres unirte a la reunión?",
|
||||
"launchWebButton": "Iniciar en el navegador",
|
||||
"noMobileApp": "¿No tienes la aplicación?",
|
||||
"termsAndConditions": "Al continuar aceptas nuestros <a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>términos y condiciones.</a>",
|
||||
"title": "Iniciando la reunión en {{app}}…",
|
||||
"tryAgainButton": "Intentar de nuevo en el escritorio"
|
||||
"titleNew": "Iniciando la reunión.",
|
||||
"tryAgainButton": "Intentar de nuevo en el escritorio",
|
||||
"unsupportedBrowser": "Parece que estás usando un navegador para el que no tenemos soporte."
|
||||
},
|
||||
"defaultLink": "ej. {{url}}",
|
||||
"defaultNickname": "ej. Juan Pérez",
|
||||
@@ -169,11 +225,20 @@
|
||||
"microphonePermission": "Error al obtener permiso del micrófono"
|
||||
},
|
||||
"deviceSelection": {
|
||||
"hid": {
|
||||
"callControl": "Control de llamadas",
|
||||
"connectedDevices": "Dispositivos conectados:",
|
||||
"deleteDevice": "Eliminar dispositivo",
|
||||
"pairDevice": "Emparejar dispositivo"
|
||||
},
|
||||
"noPermission": "Permiso no concedido",
|
||||
"previewUnavailable": "Vista previa no disponible",
|
||||
"selectADevice": "Seleccionar un dispositivo",
|
||||
"testAudio": "Reproducir un sonido de prueba"
|
||||
},
|
||||
"dialIn": {
|
||||
"screenTitle": ""
|
||||
},
|
||||
"dialOut": {
|
||||
"statusMessage": "está {{status}}"
|
||||
},
|
||||
@@ -189,9 +254,13 @@
|
||||
"WaitingForHostTitle": "Esperando al anfitrión...",
|
||||
"Yes": "Sí",
|
||||
"accessibilityLabel": {
|
||||
"liveStreaming": "Transmisión en vivo"
|
||||
"close": "Cerrar diálogo",
|
||||
"liveStreaming": "Transmisión en vivo",
|
||||
"sharingTabs": "Opciones para compartir"
|
||||
},
|
||||
"add": "Agregar",
|
||||
"addMeetingNote": "Agrega una nota acerca de esta reunión",
|
||||
"addOptionalNote": "Agrega una nota (opcional):",
|
||||
"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",
|
||||
@@ -233,6 +302,7 @@
|
||||
"gracefulShutdown": "Nuestro servicio se encuentra en mantenimiento. Por favor, intente más tarde.",
|
||||
"grantModeratorDialog": "¿Estás seguro de que quieres convertir a este participante en moderador?",
|
||||
"grantModeratorTitle": "Convertir en moderador",
|
||||
"hide": "Esconder",
|
||||
"hideShareAudioHelper": "No volver a mostrar este diálogo",
|
||||
"incorrectPassword": "Nombre de usuario o contraseña incorrecta",
|
||||
"incorrectRoomLockPassword": "Contraseña incorrecta",
|
||||
@@ -243,9 +313,10 @@
|
||||
"kickParticipantDialog": "¿Seguro que quiere expulsar a este participante?",
|
||||
"kickParticipantTitle": "¿Expulsar a este participante?",
|
||||
"kickTitle": "¡Ay! {{participantDisplayName}} te expulsó de la reunión",
|
||||
"linkMeeting": "",
|
||||
"linkMeetingTitle": "",
|
||||
"liveStreaming": "Transmisión en vivo",
|
||||
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "No es posible mientras la grabación este activa",
|
||||
"liveStreamingDisabledTooltip": "Las trasmisiones están deshabilitadas.",
|
||||
"localUserControls": "Controles de usuario locales",
|
||||
"lockMessage": "No se pudo bloquear la conferencia.",
|
||||
"lockRoom": "Agregar $t(lockRoomPasswordUppercase) a la reunión",
|
||||
@@ -279,11 +350,11 @@
|
||||
"muteEveryonesVideoTitle": "¿Detener el vídeo de todos?",
|
||||
"muteParticipantBody": "No podrás quitarles el modo en silencio, pero ellos pueden quitárselo en cualquier momento.",
|
||||
"muteParticipantButton": "Silenciar",
|
||||
"muteParticipantDialog": "¿Seguro que quieres silenciar a este participante? No podrás revertir esta acción, pero el participante podrá hacerlo en cualquier momento",
|
||||
"muteParticipantTitle": "¿Silenciar a este participante?",
|
||||
"muteParticipantsVideoBody": "No podrás volver a encender la cámara, pero ellos pueden volver a encenderla en cualquier momento.",
|
||||
"muteParticipantsVideoBodyModerationOn": "",
|
||||
"muteParticipantsVideoButton": "Detener video",
|
||||
"muteParticipantsVideoDialog": "¿Estás seguro de que quieres apagar la cámara de este participante? No podrás volver a encender la cámara, pero ellos pueden volver a encenderla en cualquier momento.",
|
||||
"muteParticipantsVideoDialogModerationOn": "",
|
||||
"muteParticipantsVideoTitle": "¿Desactivar la cámara de este participante?",
|
||||
"noDropboxToken": "No hay un token válido de Dropbox",
|
||||
"password": "Contraseña",
|
||||
@@ -297,9 +368,9 @@
|
||||
"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": "más",
|
||||
"recentlyUsedObjects": "Tus objetos usados recientemente",
|
||||
"recording": "Grabando",
|
||||
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "No es posible mientras la transmisión en vivo este activa",
|
||||
"recordingDisabledTooltip": "Inicio de grabación desactivado.",
|
||||
"rejoinNow": "Reunirse ahora",
|
||||
"remoteControlAllowedMessage": "¡{{user}} ha aceptado tu solicitud de control remoto!",
|
||||
"remoteControlDeniedMessage": "¡{{user}} ha rechazado tu solicitud de control remoto!",
|
||||
@@ -319,6 +390,12 @@
|
||||
"screenSharingFailed": "¡Ups! ¡Algo salió mal, no se pudo iniciar la compartición de su pantalla!",
|
||||
"screenSharingFailedTitle": "¡Fallo al compartir su pantalla!",
|
||||
"screenSharingPermissionDeniedError": "¡Uy! Algo salió mal con tus permisos de extensión para compartir pantalla. Vuelve a cargar la página e intenta de nuevo.",
|
||||
"searchInSalesforce": "Buscar en Salesforce",
|
||||
"searchResults": "Resultados de búsqueda({{count}}",
|
||||
"searchResultsDetailsError": "",
|
||||
"searchResultsError": "Hubo un error recuperando los datos.",
|
||||
"searchResultsNotFound": "No se encontraron resultados.",
|
||||
"searchResultsTryAgain": "Vuelve a intentar usando palabras clave alternativas",
|
||||
"sendPrivateMessage": "Acabas de recibir un mensaje privado. ¿Deseas responder en privado o a todos?",
|
||||
"sendPrivateMessageCancel": "Enviar al grupo",
|
||||
"sendPrivateMessageOk": "Enviar en privado",
|
||||
@@ -341,7 +418,10 @@
|
||||
"shareVideoTitle": "Compartir un vídeo",
|
||||
"shareYourScreen": "Compartir pantalla",
|
||||
"shareYourScreenDisabled": "Se desactivó la opción para compartir pantalla.",
|
||||
"sharedVideoDialogError": "Error: URL inválido",
|
||||
"sharedVideoLinkPlaceholder": "Enlace de YouTube o enlace de vídeo directo",
|
||||
"show": "Mostrar",
|
||||
"start": "Iniciar",
|
||||
"startLiveStreaming": "Iniciar transmisión en vivo",
|
||||
"startRecording": "Iniciar grabación",
|
||||
"startRemoteControlErrorMessage": "Se produjo un error al intentar iniciar la sesión de control remoto.",
|
||||
@@ -359,6 +439,10 @@
|
||||
"user": "Usuario",
|
||||
"userIdentifier": "Identificador de usuario",
|
||||
"userPassword": "contraseña del usuario",
|
||||
"verifyParticipantConfirm": "",
|
||||
"verifyParticipantDismiss": "",
|
||||
"verifyParticipantQuestion": "",
|
||||
"verifyParticipantTitle": "Verificación de usuario",
|
||||
"videoLink": "Enlace de vídeo",
|
||||
"viewUpgradeOptions": "Ver opciones de mejora",
|
||||
"viewUpgradeOptionsContent": "Para obtener acceso ilimitado a las funciones premium, como la grabación, las transcripciones, el streaming RTMP y otras, tendrás que actualizar tu plan.",
|
||||
@@ -384,8 +468,14 @@
|
||||
"veryBad": "Muy mala",
|
||||
"veryGood": "Muy buena"
|
||||
},
|
||||
"helpView": {
|
||||
"title": "Centro de ayuda"
|
||||
"filmstrip": {
|
||||
"accessibilityLabel": {
|
||||
"heading": "Miniaturas de video"
|
||||
}
|
||||
},
|
||||
"giphy": {
|
||||
"noResults": "No se encontraron resultados :(",
|
||||
"search": "Busca en GIPHY"
|
||||
},
|
||||
"incomingCall": {
|
||||
"answer": "Contestar",
|
||||
@@ -427,9 +517,11 @@
|
||||
"noRoom": "No se especificó la sala a marcar.",
|
||||
"numbers": "Números para entrar por llamada telefónica:",
|
||||
"password": "$t(lockRoomPasswordUppercase):",
|
||||
"reachedLimit": "Alcanzaste el límite de tu plan.",
|
||||
"sip": "Dirección SIP",
|
||||
"title": "Compartir",
|
||||
"tooltip": "Compartir el enlace y acceso telefónico para esta reunión"
|
||||
"tooltip": "Compartir el enlace y acceso telefónico para esta reunión",
|
||||
"upgradeOptions": "Por favor revisa las opciones de mejora en"
|
||||
},
|
||||
"inlineDialogFailure": {
|
||||
"msg": "Tuvimos un pequeño tropiezo.",
|
||||
@@ -450,6 +542,7 @@
|
||||
"focusLocal": "Ver tu cámara",
|
||||
"focusRemote": "Ver la cámara de otras personas",
|
||||
"fullScreen": "Entrar o salir de pantalla completa",
|
||||
"giphyMenu": "Alternar menú GIPHY",
|
||||
"keyboardShortcuts": "Atajos de teclado",
|
||||
"localRecording": "Mostrar u ocultar controles de grabación local",
|
||||
"mute": "Activar o silenciar el micrófono",
|
||||
@@ -463,6 +556,10 @@
|
||||
"toggleShortcuts": "Mostrar u ocultar atajos del teclado",
|
||||
"videoMute": "Encender o apagar la cámara"
|
||||
},
|
||||
"largeVideo": {
|
||||
"screenIsShared": "Estás compartiendo tu pantalla",
|
||||
"showMeWhatImSharing": "Muéstrame qué estoy compartiendo"
|
||||
},
|
||||
"liveStreaming": {
|
||||
"busy": "Nuestros servidores andan un poco ocupados. Vuelve a intentarlo en unos minutos.",
|
||||
"busyTitle": "Todos los transmisores están ocupados",
|
||||
@@ -479,6 +576,7 @@
|
||||
"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.",
|
||||
"googlePrivacyPolicy": "Política de Privacidad de Google",
|
||||
"inProgress": "Grabación o transmisión en vivo en curso",
|
||||
"invalidStreamKey": "Es posible que la clave de transmisión sea incorrecta, o no es de YouTube.",
|
||||
"limitNotificationDescriptionNative": "Su transmisión estará limitada a {{limit}} minutos. Puede obtener transmisiones ilimitadas en {{app}}.",
|
||||
"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>.",
|
||||
@@ -488,6 +586,7 @@
|
||||
"onBy": "{{name}} inició la transmisión en vivo",
|
||||
"pending": "Iniciando transmisión en vivo…",
|
||||
"serviceName": "Servicio de transmisión en vivo",
|
||||
"sessionAlreadyActive": "Esta sesión ya está siendo grabada o transmitida en vivo.",
|
||||
"signIn": "Iniciar sesión con Google",
|
||||
"signInCTA": "Para transmitir a YouTube, inicia sesión o introduce la clave de transmisión. Para transmitir a otro lugar, introduce el URL (que empieza en rtmp), seguido de la clave de transmisión. Debe haber una diagonal (/) entre ambos.",
|
||||
"signOut": "Cerrar sesión",
|
||||
@@ -501,8 +600,8 @@
|
||||
"lobby": {
|
||||
"admit": "Admitir",
|
||||
"admitAll": "Admitir todo",
|
||||
"allow": "permitir",
|
||||
"backToKnockModeButton": "No hay contraseña, pide permiso para entrar.",
|
||||
"chat": "Chat",
|
||||
"dialogTitle": "Sala de espera",
|
||||
"disableDialogContent": "Sala de espera activada. Así no entrarán intrusos. ¿Quieres desactivarla?",
|
||||
"disableDialogSubmit": "Desactivar",
|
||||
@@ -515,6 +614,7 @@
|
||||
"errorMissingPassword": "Por favor, introduzca la contraseña de la reunión",
|
||||
"invalidPassword": "Contraseña inválida",
|
||||
"joinRejectedMessage": "Tu solicitud para entrar ha sido rechazada por un moderador.",
|
||||
"joinRejectedTitle": "Solicitud para entrar rechazada.",
|
||||
"joinTitle": "Entrar a la reunión",
|
||||
"joinWithPasswordMessage": "Tratando de entrar con contraseña, por favor espera...",
|
||||
"joiningMessage": "Podrás entrar tan pronto te acepten tu solicitud.",
|
||||
@@ -523,6 +623,8 @@
|
||||
"knockButton": "Pedir entrar",
|
||||
"knockTitle": "Alguien quiere entrar a la reunión",
|
||||
"knockingParticipantList": "Participantes que quieren entrar",
|
||||
"lobbyChatStartedNotification": "{{moderator}} inició un chat de lobby con {{attendee}}",
|
||||
"lobbyChatStartedTitle": "{{moderator}} inició un chat de lobby contigo.",
|
||||
"nameField": "Introduce tu nombre",
|
||||
"notificationLobbyAccessDenied": "{{originParticipantName}} no dejó entrar a {{targetParticipantName}}",
|
||||
"notificationLobbyAccessGranted": "{{originParticipantName}} permitió entrar a {{targetParticipantName}}",
|
||||
@@ -560,6 +662,7 @@
|
||||
"no": "No",
|
||||
"participant": "Participante",
|
||||
"participantStats": "Estadística de participantes",
|
||||
"selectTabTitle": "🎥 Por favor seleccione esta pestaña para grabar",
|
||||
"sessionToken": "Token de sesión",
|
||||
"start": "Iniciar grabación",
|
||||
"stop": "Detener grabación",
|
||||
@@ -576,18 +679,39 @@
|
||||
"OldElectronAPPTitle": "¡Aplicación obsoleta e insegura!",
|
||||
"allowAction": "Permitir",
|
||||
"allowedUnmute": "Puedes anular el silencio del micrófono, iniciar la cámara o compartir la pantalla.",
|
||||
"audioUnmuteBlockedDescription": "La operación de activación del micrófono ha sido bloqueada temporalmente debido a límites del sistema.",
|
||||
"audioUnmuteBlockedTitle": "¡Activación del micrófono bloqueado!",
|
||||
"chatMessages": "Mensajes del chat",
|
||||
"connectedOneMember": "{{name}} se unió a la reunión",
|
||||
"connectedThreePlusMembers": "{{name}} y {{count}} más se unieron a la reunión",
|
||||
"connectedTwoMembers": "{{first}} y {{second}} se unieron a la reunión",
|
||||
"dataChannelClosed": "",
|
||||
"dataChannelClosedDescription": "",
|
||||
"disabledIframe": "",
|
||||
"disconnected": "desconectado",
|
||||
"displayNotifications": "Mostrar notificaciones para",
|
||||
"dontRemindMe": "No me lo recuerdes",
|
||||
"focus": "Enfocar conferencia",
|
||||
"focusFail": "{{component}} no disponible. Vuelve a intentar en {{ms}} segundos",
|
||||
"gifsMenu": "GIPHY",
|
||||
"groupTitle": "Notificaciones",
|
||||
"hostAskedUnmute": "El moderador quiere que hables",
|
||||
"invitedOneMember": "{{name}} ha sido invitado",
|
||||
"invitedThreePlusMembers": "{{name}} y {{count}} más han sido invitados",
|
||||
"invitedTwoMembers": "{{first}} y {{second}} han sido invitados",
|
||||
"joinMeeting": "Unirse",
|
||||
"kickParticipant": "{{kicker}} sacó a {{kicked}}",
|
||||
"leftOneMember": "{{name}} abandonó la reunión",
|
||||
"leftThreePlusMembers": "{{name}} y muchos otros abandonaron la reunión",
|
||||
"leftTwoMembers": "{{first}} y {{second}} abandonaron la reunión",
|
||||
"linkToSalesforce": "Enlace a Salesforce",
|
||||
"linkToSalesforceDescription": "Puedes vincular el resumen de la reunión a un objeto Salesforce",
|
||||
"linkToSalesforceError": "Error al vincular la reunión a Salesforce",
|
||||
"linkToSalesforceKey": "",
|
||||
"linkToSalesforceProgress": "Vinculando reunión a Salesorce...",
|
||||
"linkToSalesforceSuccess": "La reunión fue vinculada a Salesforce",
|
||||
"localRecordingStarted": "{{name}} ha iniciado una grabación local.",
|
||||
"localRecordingStopped": "{{name}} ha detenido una grabación local.",
|
||||
"me": "Yo",
|
||||
"moderationInEffectCSDescription": "Por favor, levante la mano si quiere compartir su pantalla.",
|
||||
"moderationInEffectCSTitle": "La pantalla compartida está bloqueada por el moderador",
|
||||
@@ -608,16 +732,27 @@
|
||||
"newDeviceAction": "Usar",
|
||||
"newDeviceAudioTitle": "Se detectó un dispositivo de audio nuevo",
|
||||
"newDeviceCameraTitle": "Se detectó una cámara nueva",
|
||||
"noiseSuppressionDesktopAudioDescription": "La supresión de ruido no puede ser habilitada mientras comparte audio del escritorio, por favor deshabilítelo y vuelva a intentar.",
|
||||
"noiseSuppressionFailedTitle": "Error al activar la supresión de ruido",
|
||||
"noiseSuppressionNoTrackDescription": "Por favor active su micrófono primero.",
|
||||
"noiseSuppressionStereoDescription": "La supresión de ruido en audio estéreo no tiene soporte actualmente",
|
||||
"oldElectronClientDescription1": "Estás usando una versión vieja de la aplicación de Jitsi Meet que tiene problemas de seguridad. ¡Por favor, actualiza a la ",
|
||||
"oldElectronClientDescription2": "versión más reciente",
|
||||
"oldElectronClientDescription3": " YA!",
|
||||
"participantWantsToJoin": "Quiere unirse a la reunión",
|
||||
"participantsWantToJoin": "Quieren unirse a la reunión",
|
||||
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) eliminada por otro participante",
|
||||
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) agregada por otro participante",
|
||||
"raiseHandAction": "Levantar la mano",
|
||||
"raisedHand": "{{name}} quisiera hablar.",
|
||||
"raisedHands": "",
|
||||
"reactionSounds": "Desactivar sonidos",
|
||||
"reactionSoundsForAll": "Desactivar sonidos para todos",
|
||||
"screenShareNoAudio": "La casilla Compartir audio no estaba marcada en la pantalla de selección de ventanas.",
|
||||
"screenShareNoAudioTitle": "No se pudo compartir el audio del sistema.",
|
||||
"screenSharingAudioOnlyDescription": "Por favor tenga en cuenta que al compartir si pantalla está afectando el modo \"Mejor rendimiento\" y usará más ancho de banda",
|
||||
"screenSharingAudioOnlyTitle": "Modo \"Mejor rendimiento\"",
|
||||
"selfViewTitle": "Siempre puedes reactivar la vista propia en los ajustes",
|
||||
"somebody": "Alguien",
|
||||
"startSilentDescription": "Vuelve a ingresar para activar el audio",
|
||||
"startSilentTitle": "¡Te uniste sin audio!",
|
||||
@@ -625,7 +760,11 @@
|
||||
"suboptimalExperienceTitle": "¡Tu navegador no es compatible!",
|
||||
"unmute": "Reactivar micrófono",
|
||||
"videoMutedRemotelyDescription": "Siempre puedes volver a encenderlo.",
|
||||
"videoMutedRemotelyTitle": "Su vídeo ha sido desactivado por {{moderator}}"
|
||||
"videoMutedRemotelyTitle": "Su vídeo ha sido desactivado por {{moderator}}",
|
||||
"videoUnmuteBlockedDescription": "Las operaciones de desactivar la cámara y compartir pantalla hansido bloqueadas temporalmente debido a límites del sistema.",
|
||||
"videoUnmuteBlockedTitle": "¡Desactivar cámara y compartir pantalla bloqueados!",
|
||||
"viewLobby": "Ver lobby",
|
||||
"waitingParticipants": "{{waitingParticipants}} personas"
|
||||
},
|
||||
"participantsPane": {
|
||||
"actions": {
|
||||
@@ -635,6 +774,9 @@
|
||||
"audioModeration": "Desmutearse a sí mismos",
|
||||
"blockEveryoneMicCamera": "Bloquear el micrófono y la cámara de todos.",
|
||||
"invite": "Invitar a alguien",
|
||||
"moreModerationActions": "Más opciones de moderación",
|
||||
"moreModerationControls": "Más controles de moderación",
|
||||
"moreParticipantOptions": "Más opciones de participantes",
|
||||
"mute": "Silenciar",
|
||||
"muteAll": "Silenciar a todos los demás",
|
||||
"muteEveryoneElse": "Silenciar al resto",
|
||||
@@ -647,17 +789,22 @@
|
||||
"headings": {
|
||||
"lobby": "Vestíbulo ({{count}})",
|
||||
"participantsList": "Participantes en la reunión ({{count}})",
|
||||
"visitors": "Visitantes ({{count}})",
|
||||
"waitingLobby": "Esperando en el vestíbulo ({{count}})"
|
||||
},
|
||||
"search": "Buscar participantes",
|
||||
"title": "Participantes"
|
||||
},
|
||||
"passwordDigitsOnly": "Hasta {{number}} cifras",
|
||||
"passwordSetRemotely": "Definida por otro participante",
|
||||
"pinParticipant": "",
|
||||
"pinnedParticipant": "",
|
||||
"polls": {
|
||||
"answer": {
|
||||
"skip": "Saltar",
|
||||
"submit": "Enviar"
|
||||
},
|
||||
"by": "Por {{ name }}",
|
||||
"create": {
|
||||
"addOption": "Añadir opción",
|
||||
"answerPlaceholder": "Opción {{index}}",
|
||||
@@ -728,15 +875,18 @@
|
||||
"initiated": "Llamada iniciada",
|
||||
"joinAudioByPhone": "Entrar con audio de llamada telefónica",
|
||||
"joinMeeting": "Entrar a la reunión",
|
||||
"joinMeetingInLowBandwidthMode": "Entrar en modo de ancho de banda bajo",
|
||||
"joinWithoutAudio": "Entrar sin sonido",
|
||||
"keyboardShortcuts": "Activar los atajos de teclado",
|
||||
"linkCopied": "Se copió el link",
|
||||
"lookGood": "Tu micrófono funciona bien.",
|
||||
"or": "o",
|
||||
"premeeting": "Pre-reunión",
|
||||
"proceedAnyway": "Continuar de todos modos",
|
||||
"screenSharingError": "Error al compartir pantalla:",
|
||||
"showScreen": "Habilitar pantalla pre-reunión",
|
||||
"startWithPhone": "Iniciar con audio de llamada telefónica",
|
||||
"unsafeRoomConsent": "Comprendo los riesgos, quiero unirme a la reunión",
|
||||
"videoOnlyError": "Error con el vídeo:",
|
||||
"videoTrackError": "No se pudo crear la pista de vídeo.",
|
||||
"viewAllNumbers": "ver todos los números"
|
||||
@@ -763,6 +913,19 @@
|
||||
"title": "Perfil"
|
||||
},
|
||||
"raisedHand": "Desea hablar",
|
||||
"raisedHandsLabel": "Cantidad de manos levantadas",
|
||||
"record": {
|
||||
"already": {
|
||||
"linked": "La reunión ya está vinculada a este objeto Salesforce"
|
||||
},
|
||||
"type": {
|
||||
"account": "Cuenta",
|
||||
"contact": "Contacto",
|
||||
"lead": "",
|
||||
"opportunity": "Oportunidad",
|
||||
"owner": "Dueño"
|
||||
}
|
||||
},
|
||||
"recording": {
|
||||
"authDropboxText": "Subir a Dropbox",
|
||||
"availableSpace": "Espacio disponible: {{spaceLeft}} MB (aproximadamente {{duration}} minutos de grabación)",
|
||||
@@ -777,37 +940,66 @@
|
||||
"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",
|
||||
"highlight": "Destacar",
|
||||
"highlightMoment": "Destacar momento",
|
||||
"highlightMomentDisabled": "Puede destacar momentos cuando inicie la grabación",
|
||||
"highlightMomentSuccess": "Momento destacado",
|
||||
"highlightMomentSucessDescription": "Su momento destacado será agregado al resumen de la reunión.",
|
||||
"inProgress": "Grabación o transmisión en vivo en curso",
|
||||
"limitNotificationDescriptionNative": "Su grabación estará limitada a {{limit}} minutos. Puede obtener grabaciones ilimitadas en <3>{{app}}</3>.",
|
||||
"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>.",
|
||||
"linkGenerated": "Hemos generado un enlace a su grabación.",
|
||||
"live": "EN VIVO",
|
||||
"localRecordingNoNotificationWarning": "La grabación no será anunciada al resto de participantes. Necesitarás hacerles saber que la reunión está siendo grabada.",
|
||||
"localRecordingNoVideo": "El video no está siendo grabado",
|
||||
"localRecordingStartWarning": "Por favor asegúrese de detener la grabación antes de abandonar la reunión para guardarla.",
|
||||
"localRecordingStartWarningTitle": "Detenga la grabación para guardarla",
|
||||
"localRecordingVideoStop": "Detener su video también detendrá la grabación local. ¿Está seguro de querer continuar?",
|
||||
"localRecordingVideoWarning": "Para grabar su video debe tenerlo encendido al iniciar la grabación",
|
||||
"localRecordingWarning": "Asegúrese de seleccionar la pestaña actual para usar el video y audio correctos. La grabación está actualmente limitada a 1GB, que son aproximadamente 100 minutos.",
|
||||
"loggedIn": "Sesión iniciada como {{userName}}",
|
||||
"noMicPermission": "No se pudo crear la pista de micrófono. Por favor otorgue permiso para usar el micrófono.",
|
||||
"noStreams": "",
|
||||
"off": "Grabación detenida",
|
||||
"offBy": "{{name}} detuvo la grabación",
|
||||
"on": "Grabando",
|
||||
"onBy": "{{name}} comenzó la grabación",
|
||||
"onlyRecordSelf": "",
|
||||
"pending": "Preparando para grabar la reunión…",
|
||||
"rec": "GRA",
|
||||
"saveLocalRecording": "Guardar archivo de grabación localmente (Beta)",
|
||||
"serviceDescription": "El servicio de grabación guardará la grabación",
|
||||
"serviceDescriptionCloud": "Grabación en la nube",
|
||||
"serviceDescriptionCloudInfo": "Las reuniones grabadas son limpiadas 24h luego de su horario de grabación.",
|
||||
"serviceName": "Servicio de grabación",
|
||||
"sessionAlreadyActive": "Esta sesión ya está siendo grabada o transmitida en vivo.",
|
||||
"signIn": "Iniciar sesión",
|
||||
"signOut": "Cerrar sesión",
|
||||
"surfaceError": "Por favor seleccione la pestaña actual.",
|
||||
"title": "Grabando",
|
||||
"unavailable": "¡Uy! {{serviceName}} actualmente no está disponible. Estamos trabajando para resolver el problema. Vuelve a intentarlo más tarde.",
|
||||
"unavailableTitle": "Grabación no disponible",
|
||||
"uploadToCloud": "Subir a la nube"
|
||||
},
|
||||
"screenshareDisplayName": "Pantalla de {{name}}",
|
||||
"sectionList": {
|
||||
"pullToRefresh": "Mueve el dedo para abajo para actualizar."
|
||||
},
|
||||
"security": {
|
||||
"about": "Puedes agregar una contraseña a la reunión. Los participantes necesitarán la contraseña para unirse a la reunión.",
|
||||
"aboutReadOnly": "Los participantes moderadores pueden agregar una $t(lockRoomPassword) a la reunión. Los participantes deberán proporcionar la $t(lockRoomPassword) antes de que se les permita unirse a la reunión.",
|
||||
"insecureRoomNameWarning": "El nombre de la sala es inseguro. Participantes no deseados pueden llegar a unirse a la reunión.",
|
||||
"securityOptions": "Opciones de seguridad"
|
||||
"insecureRoomNameWarningNative": "El nombre de esta sala es inseguro. Participantes indeseados podrían ingresar a su reunión. {{recommendAction}} Aprenda más sobre asegurar su reunión ",
|
||||
"insecureRoomNameWarningWeb": "El nombre de esta sala es inseguro. Participantes indeseados podrían ingresar a su reunión. {{recommendAction}} Aprenda más sobre asegurar su reunión <a href=\"{{securityUrl}}\" rel=\"security\" target=\"_blank\">aquí</a>.",
|
||||
"title": "Opciones de seguridad",
|
||||
"unsafeRoomActions": {
|
||||
"meeting": "Considere hacer más segura su reunión utilizando el botón de seguridad.",
|
||||
"prejoin": "Considere utilizar un nombre de reunión más único.",
|
||||
"welcome": "Considere utilizar un nombre de reunión más único, o elija una de las sugerencias"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"audio": "Audio",
|
||||
"buttonLabel": "Ajustes",
|
||||
"calendar": {
|
||||
"about": "La integración del calendario de {{appName}} se usa para acceder al calendario de manera segura para que puedas estar al tanto de los próximos eventos.",
|
||||
"disconnect": "Desconectar",
|
||||
@@ -824,12 +1016,16 @@
|
||||
"incomingMessage": "Mensaje entrante",
|
||||
"language": "Idioma",
|
||||
"loggedIn": "Sesión iniciada como {{name}}",
|
||||
"maxStageParticipants": "",
|
||||
"microphones": "Micrófono",
|
||||
"moderator": "Moderador",
|
||||
"moderatorOptions": "Opciones de moderador",
|
||||
"more": "Más",
|
||||
"name": "Nombre",
|
||||
"noDevice": "Ninguno",
|
||||
"participantJoined": "Un articipante incorporado",
|
||||
"notifications": "Notificaciones",
|
||||
"participantJoined": "Un participante se ha unido",
|
||||
"participantKnocking": "Un participante ha ingresado al lobby",
|
||||
"participantLeft": "Un participante se ha ido",
|
||||
"playSounds": "Reproducir sonido",
|
||||
"reactions": "Reacciones de la reunión",
|
||||
@@ -837,12 +1033,15 @@
|
||||
"selectAudioOutput": "Salida de audio",
|
||||
"selectCamera": "Cámara",
|
||||
"selectMic": "Micrófono",
|
||||
"sounds": "Sonidos",
|
||||
"selfView": "Vista propia",
|
||||
"shortcuts": "Atajos",
|
||||
"speakers": "Altavoces",
|
||||
"startAudioMuted": "Todos inician silenciados",
|
||||
"startReactionsMuted": "Silenciar sonidos de reacción para todos",
|
||||
"startVideoMuted": "Todos inician con cámara desactivada",
|
||||
"talkWhileMuted": "Hablar en silencio",
|
||||
"title": "Ajustes"
|
||||
"title": "Ajustes",
|
||||
"video": "Video"
|
||||
},
|
||||
"settingsView": {
|
||||
"advanced": "Avanzado",
|
||||
@@ -857,13 +1056,21 @@
|
||||
"disableCrashReportingWarning": "¿Estás seguro que no deseas reportarnos los crasheos? La opción se activará al reiniciar la app.",
|
||||
"disableP2P": "Desactivar la comunicación directa (\"Peer-To-Peer\")",
|
||||
"displayName": "Nombre a mostrar",
|
||||
"displayNamePlaceholderText": "Por ejemplo: Juan Pérez",
|
||||
"email": "Correo electrónico",
|
||||
"emailPlaceholderText": "",
|
||||
"goTo": "Ir a",
|
||||
"header": "Configuración",
|
||||
"help": "Ayuda",
|
||||
"links": "Enlaces",
|
||||
"privacy": "Privacidad",
|
||||
"profileSection": "Perfil",
|
||||
"serverURL": "URL del servidor",
|
||||
"showAdvanced": "Mostrar configuración avanzada",
|
||||
"startCarModeInLowBandwidthMode": "Iniciar módo automóvil en modo ancho de banda bajo",
|
||||
"startWithAudioMuted": "Iniciar con el micrófono apagado",
|
||||
"startWithVideoMuted": "Iniciar con la cámara apagada",
|
||||
"terms": "Términos",
|
||||
"version": "Versión"
|
||||
},
|
||||
"share": {
|
||||
@@ -872,13 +1079,21 @@
|
||||
},
|
||||
"speaker": "Participante",
|
||||
"speakerStats": {
|
||||
"angry": "Enojado",
|
||||
"disgusted": "Disgustado",
|
||||
"displayEmotions": "Mostrar emociones",
|
||||
"fearful": "Temeroso",
|
||||
"happy": "Feliz",
|
||||
"hours": "{{count}} h",
|
||||
"minutes": "{{count}} min",
|
||||
"name": "Nombre",
|
||||
"neutral": "Neutral",
|
||||
"sad": "Triste",
|
||||
"search": "Buscar",
|
||||
"seconds": "{{count}} s",
|
||||
"speakerStats": "Estadísticas de participantes",
|
||||
"speakerTime": "Tiempo hablado"
|
||||
"speakerTime": "Tiempo hablado",
|
||||
"surprised": "Sorprendido"
|
||||
},
|
||||
"startupoverlay": {
|
||||
"genericTitle": "La reunión debe utilizar su micrófono y su cámara.",
|
||||
@@ -890,6 +1105,10 @@
|
||||
"text": "Presiona el botón <i>Reconectar</i> para volver a conectarte.",
|
||||
"title": "La vídeollamada se interrumpió porque la computadora estaba suspendida."
|
||||
},
|
||||
"termsView": {
|
||||
"title": "Términos"
|
||||
},
|
||||
"toggleTopPanelLabel": "Alternar panel superior",
|
||||
"toolbar": {
|
||||
"Settings": "Configuración",
|
||||
"accessibilityLabel": {
|
||||
@@ -897,60 +1116,89 @@
|
||||
"audioOnly": "Alternar cámaras de los demás",
|
||||
"audioRoute": "Seleccionar el dispositivo de sonido",
|
||||
"boo": "Boo",
|
||||
"breakoutRoom": "Unirse/abandonar sala para grupos pequeños",
|
||||
"callQuality": "Administrar la calidad de vídeo",
|
||||
"carmode": "Modo automóvil",
|
||||
"cc": "Alternar subtítulos",
|
||||
"chat": "Alternar ventana de chat",
|
||||
"clap": "Aplauso",
|
||||
"closeChat": "Cerrar chat",
|
||||
"closeMoreActions": "Cerrar el menú de más acciones",
|
||||
"closeParticipantsPane": "Cerrar panel de participantes",
|
||||
"collapse": "Colapsar",
|
||||
"document": "Alternar documento compartido",
|
||||
"documentClose": "Cerrar documento compartido",
|
||||
"documentOpen": "Abrir documento compartido",
|
||||
"download": "Descargar nuestras aplicaciones",
|
||||
"embedMeeting": "Insertar reunión",
|
||||
"endConference": "Terminar reunión para todos",
|
||||
"enterFullScreen": "Ver en pantalla completa",
|
||||
"enterTileView": "Ingresar en vista de mosaico",
|
||||
"exitFullScreen": "Salir de pantalla completa",
|
||||
"exitTileView": "Salir de vista de mosaico",
|
||||
"expand": "Ampliar",
|
||||
"feedback": "Dejar comentarios",
|
||||
"fullScreen": "Alternar pantalla completa",
|
||||
"giphy": "Alternar menú GIPHY",
|
||||
"grantModerator": "Convertir en moderador",
|
||||
"hangup": "Colgar",
|
||||
"heading": "Barra de herramientas",
|
||||
"help": "Ayuda",
|
||||
"hideWhiteboard": "Esconder pizarra",
|
||||
"invite": "Invitar personas",
|
||||
"kick": "Expulsar participante",
|
||||
"laugh": "Ríete",
|
||||
"leaveConference": "Abandonar reunión",
|
||||
"like": "Pulgares arriba",
|
||||
"linkToSalesforce": "Enlace a Salesforce",
|
||||
"lobbyButton": "Activar / desactivar el modo lobby",
|
||||
"localRecording": "Alternar controles de grabación local",
|
||||
"lockRoom": "Alternar contraseña de la reunión",
|
||||
"lowerHand": "Bajar mano",
|
||||
"moreActions": "Alternar más acciones",
|
||||
"moreActionsMenu": "Menú de más acciones",
|
||||
"moreOptions": "Mostrar más opciones",
|
||||
"mute": "Silenciar micrófono",
|
||||
"muteEveryone": "Silenciar a todos",
|
||||
"muteEveryoneElse": "Silenciar a todos los demás",
|
||||
"muteEveryoneElsesVideo": "Desactivar el vídeo de los demás",
|
||||
"muteEveryonesVideo": "Desactivar el vídeo de todos",
|
||||
"muteEveryoneElsesVideoStream": "Detener el video del resto",
|
||||
"muteEveryonesVideoStream": "Detener el video de todos",
|
||||
"muteGUMPending": "Conectando su micrófono",
|
||||
"noiseSuppression": "Supresión de ruido",
|
||||
"openChat": "Abrir chat",
|
||||
"participants": "Participantes",
|
||||
"pip": "Alternar modo ventana en miniatura",
|
||||
"privateMessage": "Enviar mensaje privado",
|
||||
"profile": "Editar perfil",
|
||||
"raiseHand": "Levantar o bajar la mano",
|
||||
"reactions": "Reacciones",
|
||||
"reactionsMenu": "Abrir / Cerrar el menú de reacciones",
|
||||
"recording": "Alternar grabación",
|
||||
"remoteMute": "Silenciar participante",
|
||||
"remoteVideoMute": "Desactivar la cámara del participante",
|
||||
"security": "Opciones de seguridad",
|
||||
"selectBackground": "Seleccione el fondo",
|
||||
"selfView": "Alternar vista propia",
|
||||
"shareRoom": "Invitar a alguien",
|
||||
"shareYourScreen": "Comenzar / detener compartir pantalla",
|
||||
"shareaudio": "Compartir audio",
|
||||
"sharedvideo": "Alternar vídeo compartido",
|
||||
"shortcuts": "Alternar accesos directos",
|
||||
"show": "Mostrar en primer",
|
||||
"showWhiteboard": "Mostrar vista propia",
|
||||
"silence": "Silencio",
|
||||
"speakerStats": "Alternar estadísticas del orador",
|
||||
"stopScreenSharing": "Dejar de compartir pantalla",
|
||||
"stopSharedVideo": "Detener video",
|
||||
"surprised": "Sorprendido",
|
||||
"tileView": "Alternar vista de mosaico",
|
||||
"toggleCamera": "Alternar cámara",
|
||||
"toggleFilmstrip": "Alternar mosaicos",
|
||||
"unmute": "Activar micrófono",
|
||||
"videoblur": "Alternar desenfoque de vídeo",
|
||||
"videomute": "Alternar vídeo"
|
||||
"videomute": "Alternar vídeo",
|
||||
"videomuteGUMPending": "Conectando tu cámara",
|
||||
"videounmute": "Encender cámara"
|
||||
},
|
||||
"addPeople": "Agregar personas a la llamada",
|
||||
"audioOnlyOff": "Mostrar cámaras de los demás",
|
||||
@@ -963,23 +1211,33 @@
|
||||
"chat": "Abrir o cerrar chat",
|
||||
"clap": "Aplauso",
|
||||
"closeChat": "Cerrar chat",
|
||||
"closeParticipantsPane": "Cerrar panel de participantes",
|
||||
"closeReactionsMenu": "Cerrar el menú de reacciones",
|
||||
"disableNoiseSuppression": "Desactivar supresión de ruido",
|
||||
"disableReactionSounds": "Puede desactivar los sonidos de reacción para esta reunión",
|
||||
"documentClose": "Cerrar documento compartido",
|
||||
"documentOpen": "Abrir documento compartido",
|
||||
"download": "Descarga nuestras aplicaciones",
|
||||
"e2ee": "Cifrado de extremo a extremo",
|
||||
"embedMeeting": "Insertar reunión",
|
||||
"enableNoiseSuppression": "Activar supresión de ruido",
|
||||
"endConference": "Terminar reunión para todos",
|
||||
"enterFullScreen": "Pantalla completa",
|
||||
"enterTileView": "Ver en cuadrícula",
|
||||
"exitFullScreen": "Salir de pantalla completa",
|
||||
"exitTileView": "Salir de vista de mosaico",
|
||||
"feedback": "Dejar sugerencias",
|
||||
"giphy": "Alternar menú GIPHY",
|
||||
"hangup": "Colgar",
|
||||
"help": "Ayuda",
|
||||
"hideWhiteboard": "Esconder pizarra",
|
||||
"invite": "Invitar personas",
|
||||
"joinBreakoutRoom": "Unirse a sala para grupos pequeños",
|
||||
"laugh": "Ríete",
|
||||
"leaveBreakoutRoom": "Abandonar sala para grupos pequeños",
|
||||
"leaveConference": "Abandonar reunión",
|
||||
"like": "Pulgares arriba",
|
||||
"linkToSalesforce": "",
|
||||
"lobbyButtonDisable": "Desactivar el modo lobby",
|
||||
"lobbyButtonEnable": "Activar el modo lobby",
|
||||
"login": "Inicio de sesión",
|
||||
@@ -990,11 +1248,13 @@
|
||||
"mute": "Activar o silenciar el micrófono",
|
||||
"muteEveryone": "Silenciar a todos",
|
||||
"muteEveryonesVideo": "Desactivar la cámara de todos",
|
||||
"muteGUMPending": "Conectando tu micrónono",
|
||||
"noAudioSignalDesc": "Checa si no está silenciado en tu configuración del sistema o dispositivo, o cambia de micrófono.",
|
||||
"noAudioSignalDescSuggestion": "Si no lo silenciaste a propósito desde la configuración del sistema o el dispositivo, intenta usar este otro micrófono:",
|
||||
"noAudioSignalDialInDesc": "Además, puedes llamar usando:",
|
||||
"noAudioSignalDialInLinkDesc": "Números de llamada",
|
||||
"noAudioSignalTitle": "¡No se registra audio de tu micrófono!",
|
||||
"noiseSuppression": "Supresión de ruido",
|
||||
"noisyAudioInputDesc": "Tu micrófono está haciendo ruido, siléncialo, ajusta su volumen en configuración del sistema, o cambia de micrófono.",
|
||||
"noisyAudioInputTitle": "Tu micrófono parece estar ruidoso",
|
||||
"openChat": "Abrir chat",
|
||||
@@ -1011,12 +1271,14 @@
|
||||
"reactionLike": "Enviar la reacción de los pulgares hacia arriba",
|
||||
"reactionSilence": "Enviar reacción de silencio",
|
||||
"reactionSurprised": "Enviar reacción de sorpresa",
|
||||
"reactions": "Reacciones",
|
||||
"security": "Opciones de seguridad",
|
||||
"selectBackground": "Seleccionar fondo",
|
||||
"shareRoom": "Invitar a alguien",
|
||||
"shareaudio": "Compartir audio",
|
||||
"sharedvideo": "Compartir un vídeo",
|
||||
"shortcuts": "Ver atajos del teclado",
|
||||
"showWhiteboard": "Mostrar pizarra",
|
||||
"silence": "Silencio",
|
||||
"speakerStats": "Estadísticas de los participantes",
|
||||
"startScreenSharing": "Comenzar a compartir pantalla",
|
||||
@@ -1029,8 +1291,11 @@
|
||||
"talkWhileMutedPopup": "¿Intentas hablar? Estás silenciado.",
|
||||
"tileViewToggle": "Activar o desactivar vista en cuadrícula",
|
||||
"toggleCamera": "Alternar cámara",
|
||||
"unmute": "Activar",
|
||||
"videoSettings": "Ajustes de vídeo",
|
||||
"videomute": "Iniciar o detener cámara"
|
||||
"videomute": "Detener cámara",
|
||||
"videomuteGUMPending": "Conectando tu cámara",
|
||||
"videounmute": "Iniciar cámara"
|
||||
},
|
||||
"transcribing": {
|
||||
"ccButtonTooltip": "Iniciar o detener subtítulos",
|
||||
@@ -1040,10 +1305,15 @@
|
||||
"labelToolTip": "La reunión se está transcribiendo",
|
||||
"off": "Transcripción detenida",
|
||||
"pending": "Preparando para transcribir la reunión…",
|
||||
"sourceLanguageDesc": "El lenguaje actual de la reunión es <b>{{sourceLanguage}}</b>. <br/> Puedes cambiarlo desde ",
|
||||
"sourceLanguageHere": "aquí",
|
||||
"start": "Mostrar subtítulos",
|
||||
"stop": "Dejar de mostrar subtítulos",
|
||||
"subtitles": "Subtítulos",
|
||||
"subtitlesOff": "",
|
||||
"tr": "TR"
|
||||
},
|
||||
"unpinParticipant": "",
|
||||
"userMedia": {
|
||||
"androidGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
|
||||
"chromeGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
|
||||
@@ -1067,20 +1337,26 @@
|
||||
"pending": "{{displayName}} ha sido invitado"
|
||||
},
|
||||
"videoStatus": {
|
||||
"adjustFor": "Ajustar para:",
|
||||
"audioOnly": "AUD",
|
||||
"audioOnlyExpanded": "Estás en modo de ancho de banda bajo. En este modo, sólo recibirás audio y pantalla compartida.",
|
||||
"bestPerformance": "Mejor rendimiento",
|
||||
"callQuality": "Calidad de vídeo",
|
||||
"hd": "HD",
|
||||
"hdTooltip": "Viendo vídeo en alta definición",
|
||||
"highDefinition": "Alta definición",
|
||||
"highestQuality": "Calidad máxima",
|
||||
"labelTooiltipNoVideo": "Sin vídeo",
|
||||
"labelTooltipAudioOnly": "Modo de ancho de banda bajo habilitado",
|
||||
"ld": "LD",
|
||||
"ldTooltip": "Viendo vídeo en baja definición",
|
||||
"lowDefinition": "Baja definición",
|
||||
"performanceSettings": "Ajustes de rendimiento",
|
||||
"recording": "Grabación en curso",
|
||||
"sd": "SD",
|
||||
"sdTooltip": "Viendo vídeo en definición estándar",
|
||||
"standardDefinition": "Definición estándar"
|
||||
"standardDefinition": "Definición estándar",
|
||||
"streaming": "Transmisión en curso"
|
||||
},
|
||||
"videothumbnail": {
|
||||
"connectionInfo": "Información de conexión",
|
||||
@@ -1090,12 +1366,19 @@
|
||||
"domuteVideoOfOthers": "Desactivar la cámara de todos los demás",
|
||||
"flip": "Voltear",
|
||||
"grantModerator": "Convertir en moderador",
|
||||
"hideSelfView": "Esconder vista propia",
|
||||
"kick": "Expulsar",
|
||||
"mirrorVideo": "Espejar mi video",
|
||||
"moderator": "Moderador",
|
||||
"mute": "Se silenció el participante",
|
||||
"muted": "Silenciado",
|
||||
"pinToStage": "",
|
||||
"remoteControl": "Control remoto",
|
||||
"screenSharing": "El participante está compartiendo su pantalla",
|
||||
"show": "Mostrar en primer plano",
|
||||
"showSelfView": "Mostrar vista propia",
|
||||
"unpinFromStage": "",
|
||||
"verify": "Verificar participante",
|
||||
"videoMuted": "Cámara desactivada",
|
||||
"videomute": "El participante paró su cámara"
|
||||
},
|
||||
@@ -1120,7 +1403,16 @@
|
||||
"slightBlur": "Desenfoque Ligero",
|
||||
"title": "Fondos virtuales",
|
||||
"uploadedImage": "Imagen subida {{index}}",
|
||||
"webAssemblyWarning": "No se admite WebAssembly"
|
||||
"webAssemblyWarning": "No se admite WebAssembly",
|
||||
"webAssemblyWarningDescription": "WebAssembly está desactivado o no cuenta con soporte en este navegador"
|
||||
},
|
||||
"visitors": {
|
||||
"chatIndicator": "(visitante)",
|
||||
"labelTooltip": "Cantidad de visitantes: {{count}}",
|
||||
"notification": {
|
||||
"description": "Levanta la mano para participar",
|
||||
"title": "Eres un visitante en la reunión"
|
||||
}
|
||||
},
|
||||
"volumeSlider": "Deslizador de volumen",
|
||||
"welcomepage": {
|
||||
@@ -1154,6 +1446,7 @@
|
||||
"microsoftLogo": "Logotipo de Microsoft",
|
||||
"policyLogo": "Logotipo de la política"
|
||||
},
|
||||
"meetingsAccessibilityLabel": "Reuniones",
|
||||
"mobileDownLoadLinkAndroid": "Descargar la aplicación móvil para Android",
|
||||
"mobileDownLoadLinkFDroid": "Descargar la aplicación móvil para F-Droid",
|
||||
"mobileDownLoadLinkIos": "Descargar la aplicación móvil para iOS",
|
||||
@@ -1162,13 +1455,21 @@
|
||||
"recentList": "Reciente",
|
||||
"recentListDelete": "Eliminar",
|
||||
"recentListEmpty": "Tu historial de reuniones está vacío. Reúnete y aparecerán aquí.",
|
||||
"recentMeetings": "Tus reuniones recientes",
|
||||
"reducedUIText": "¡Bienvenido a {{app}}!",
|
||||
"roomNameAllowedChars": "El nombre de la reunión no debe contener ninguno de estos caracteres: ?, &, :, ', \", %, #.",
|
||||
"roomname": "Introduce el nombre de la sala",
|
||||
"roomnameHint": "Introduce el nombre o URL de la sala a la que deseas unirte. Puedes inventar un nombre, simplemente infórmaselo a las personas con las que te reunirás para que introduzcan el mismo nombre.",
|
||||
"sendFeedback": "Enviar sugerencias",
|
||||
"settings": "Ajustes",
|
||||
"startMeeting": "Iniciar la reunión",
|
||||
"terms": "Términos",
|
||||
"title": "Videoconferencias seguras, con gran variedad de funcionalidades y completamente gratuitas"
|
||||
"title": "Videoconferencias seguras, con gran variedad de funcionalidades y completamente gratuitas",
|
||||
"upcomingMeetings": "Tus próximas reuniones"
|
||||
},
|
||||
"whiteboard": {
|
||||
"accessibilityLabel": {
|
||||
"heading": "Pizarra"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,8 @@
|
||||
{
|
||||
"addPeople": {
|
||||
"accessibilityLabel": {
|
||||
"meetingLink": "Link da reunião: {{url}}"
|
||||
},
|
||||
"add": "Convidar",
|
||||
"addContacts": "Convidar os seus contactos",
|
||||
"contacts": "contactos",
|
||||
@@ -39,6 +42,18 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "Largura de banda baixa"
|
||||
},
|
||||
"bandwidthSettings": {
|
||||
"assumedBandwidthBps": "p. ex. 10000000 para 10 Mbps",
|
||||
"assumedBandwidthBpsWarning": "Valores mais elevados podem causar problemas na rede.",
|
||||
"customValue": "valor personalizado",
|
||||
"customValueEffect": "para definir o valor actual de bps",
|
||||
"leaveEmpty": "deixar em branco",
|
||||
"leaveEmptyEffect": "para permitir a realização de estimativas",
|
||||
"possibleValues": "Valores possíveis",
|
||||
"setAssumedBandwidthBps": "Largura de banda presumida (bps)",
|
||||
"title": "Definições de largura de banda",
|
||||
"zeroEffect": "para desligar o vídeo"
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"actions": {
|
||||
"add": "Adicionar salas simultâneas",
|
||||
@@ -156,6 +171,7 @@
|
||||
"localport_plural": "Portas locais:",
|
||||
"maxEnabledResolution": "enviar máx",
|
||||
"more": "Mostrar mais",
|
||||
"no": "não",
|
||||
"packetloss": "Perda de pacote:",
|
||||
"participant_id": "Participante id:",
|
||||
"quality": {
|
||||
@@ -174,7 +190,8 @@
|
||||
"status": "Ligação:",
|
||||
"transport": "Transporte:",
|
||||
"transport_plural": "Transportes:",
|
||||
"video_ssrc": "Vídeo SSRC:"
|
||||
"video_ssrc": "Vídeo SSRC:",
|
||||
"yes": "sim"
|
||||
},
|
||||
"dateUtils": {
|
||||
"earlier": "Mais cedo",
|
||||
@@ -240,6 +257,8 @@
|
||||
"WaitingForHostTitle": "À espera do anfitrião ...",
|
||||
"Yes": "Sim",
|
||||
"accessibilityLabel": {
|
||||
"Cancel": "Cancelar (sair da caixa de diálogo)",
|
||||
"Ok": "OK (guardar e sair da caixa de diálogo)",
|
||||
"close": "Fechar caixa de diálogo",
|
||||
"liveStreaming": "Transmissão em direto",
|
||||
"sharingTabs": "Opções de partilha"
|
||||
@@ -319,13 +338,13 @@
|
||||
"micPermissionDeniedError": "Não concedeu autorização para utilizar o seu microfone. Ainda pode participar na conferência, mas outros não o ouvirão. Use o botão da câmara na barra de endereço para corrigir isto.",
|
||||
"micTimeoutError": "Não foi possível iniciar a fonte de áudio. Tempo limite expirado!",
|
||||
"micUnknownError": "Não pode usar microfone por uma razão desconhecida.",
|
||||
"moderationAudioLabel": "Permitir aos participantes reativar o som",
|
||||
"moderationVideoLabel": "Permitir aos participantes reativar o vídeo",
|
||||
"muteEveryoneDialog": "Os participantes podem reativar o som a qualquer momento.",
|
||||
"moderationAudioLabel": "Permitir aos participantes ligar o som",
|
||||
"moderationVideoLabel": "Permitir aos participantes ligar a câmara",
|
||||
"muteEveryoneDialog": "Os participantes podem ligar o som a qualquer momento.",
|
||||
"muteEveryoneDialogModerationOn": "Os participantes podem enviar um pedido para falar a qualquer momento.",
|
||||
"muteEveryoneElseDialog": "Uma vez silenciados, não poderá reativá-los, mas eles podem reativar-se a qualquer momento.",
|
||||
"muteEveryoneElseDialog": "Uma vez silenciados, não poderá reativá-los, mas eles podem ligar o microfone a qualquer momento.",
|
||||
"muteEveryoneElseTitle": "Silenciar todos excepto {{whom}}?",
|
||||
"muteEveryoneElsesVideoDialog": "Quando a câmara for desativada, não poderá voltar a ligá-la, mas eles podem voltar a ligá-la em qualquer momento.",
|
||||
"muteEveryoneElsesVideoDialog": "Quando a câmara for desligada, não poderá voltar a ligá-la, mas eles podem voltar a ligá-la em qualquer momento.",
|
||||
"muteEveryoneElsesVideoTitle": "Parar o vídeo de todos excepto {{whom}}?",
|
||||
"muteEveryoneSelf": "você mesmo",
|
||||
"muteEveryoneStartMuted": "A partir de agora, toda a gente começa a ficar calada",
|
||||
@@ -445,6 +464,9 @@
|
||||
"title": "Incorporar esta reunião"
|
||||
},
|
||||
"feedback": {
|
||||
"accessibilityLabel": {
|
||||
"yourChoice": "A sua escolha: {{rating}}"
|
||||
},
|
||||
"average": "Média",
|
||||
"bad": "Má",
|
||||
"detailsLabel": "Conte-nos mais sobre isso.",
|
||||
@@ -673,8 +695,10 @@
|
||||
"connectedTwoMembers": "{{first}} e {{second}} entraram na reunião",
|
||||
"dataChannelClosed": "Deficiência na qualidade do vídeo",
|
||||
"dataChannelClosedDescription": "O canal de ponte foi desconectado e, portanto, a qualidade do vídeo está limitada à sua configuração mais baixa.",
|
||||
"disabledIframe": "A incorporação destina-se apenas a fins de demonstração, pelo que esta chamada será desligada em {{timeout}} minutos.",
|
||||
"disconnected": "desconectado",
|
||||
"displayNotifications": "Mostrar notificações para",
|
||||
"dontRemindMe": "Não me lembre",
|
||||
"focus": "Foco da conferência",
|
||||
"focusFail": "{{component}} não disponĩvel - tente em {{ms}} seg.",
|
||||
"gifsMenu": "GIPHY",
|
||||
@@ -754,8 +778,8 @@
|
||||
"actions": {
|
||||
"allow": "Permitir aos participantes:",
|
||||
"allowVideo": "Permitir vídeo",
|
||||
"askUnmute": "Pedir para ligar o microfone",
|
||||
"audioModeration": "Ativar o microfone deles",
|
||||
"askUnmute": "Pedir para ligar o som",
|
||||
"audioModeration": "Ligar o microfone deles",
|
||||
"blockEveryoneMicCamera": "Bloquear o microfone e a câmara de todos",
|
||||
"invite": "Convidar alguém",
|
||||
"moreModerationActions": "Mais opções de moderação",
|
||||
@@ -866,9 +890,11 @@
|
||||
"lookGood": "O seu microfone funciona corretamente",
|
||||
"or": "ou",
|
||||
"premeeting": "Pré-reunião",
|
||||
"proceedAnyway": "Continuar na mesma",
|
||||
"screenSharingError": "Erro de partilha de ecrã:",
|
||||
"showScreen": "Ativar o ecrã de pré-reunião",
|
||||
"startWithPhone": "Iniciar com o áudio do telefone",
|
||||
"unsafeRoomConsent": "Compreendo os riscos, quero participar na reunião",
|
||||
"videoOnlyError": "Erro de vídeo:",
|
||||
"videoTrackError": "Não foi possível criar a pista de vídeo.",
|
||||
"viewAllNumbers": "ver todos os números"
|
||||
@@ -944,7 +970,7 @@
|
||||
"noStreams": "Não foi detetado nenhum sinal áudio ou vídeo.",
|
||||
"off": "Gravação parada",
|
||||
"offBy": "{{name}} parou a gravação",
|
||||
"on": "Gravando",
|
||||
"on": "Começou a gravação",
|
||||
"onBy": "{{name}} iniciou a gravação",
|
||||
"onlyRecordSelf": "Gravar apenas as minhas transmissões áudio e vídeo",
|
||||
"pending": "Preparando para gravar a reunião...",
|
||||
@@ -970,8 +996,14 @@
|
||||
"security": {
|
||||
"about": "Pode adicionar uma $t(lockRoomPassword) à sua reunião. Os participantes terão de fornecer a $t(lockRoomPassword) antes de serem autorizados a participar na reunião.",
|
||||
"aboutReadOnly": "Os participantes moderadores podem acrescentar uma $t(lockRoomPassword) à reunião. Os participantes terão de fornecer a $t(lockRoomPassword) antes de serem autorizados a participar na reunião.",
|
||||
"insecureRoomNameWarning": "O nome da sala é inseguro. Participantes indesejados podem juntar-se à sua conferência. Considere proteger a sua reunião utilizando o botão de segurança.",
|
||||
"title": "Opções de segurança"
|
||||
"insecureRoomNameWarningNative": "O nome da sala não é seguro. Participantes indesejados podem juntar-se à sua reunião. {{recommendAction}} Saiba mais sobre como proteger a sua reunião ",
|
||||
"insecureRoomNameWarningWeb": "O nome da sala não é seguro. Participantes indesejados podem juntar-se à sua reunião. {{recommendAction}} Saiba mais sobre como proteger a sua reunião <a href=\"{{securityUrl}}\" rel=\"security\" target=\"_blank\">here</a>.",
|
||||
"title": "Opções de Segurança",
|
||||
"unsafeRoomActions": {
|
||||
"meeting": "Considere a possibilidade de proteger a sua reunião utilizando o botão de segurança.",
|
||||
"prejoin": "Considere a utilização de um nome de reunião mais personalizado.",
|
||||
"welcome": "Considere utilizar um nome de reunião mais personalizado ou selecione uma das sugestões."
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"audio": "Áudio",
|
||||
@@ -1139,6 +1171,7 @@
|
||||
"muteEveryoneElse": "Silenciar todos os outros",
|
||||
"muteEveryoneElsesVideo": "Parar o vídeo de todos os outros",
|
||||
"muteEveryonesVideo": "Parar o vídeo de todos",
|
||||
"muteGUMPending": "A ligar o seu microfone",
|
||||
"noiseSuppression": "Supressão de ruído",
|
||||
"openChat": "Abrir chat",
|
||||
"participants": "Abrir painel de participantes",
|
||||
@@ -1146,6 +1179,7 @@
|
||||
"privateMessage": "Enviar mensagem privada",
|
||||
"profile": "Editar o seu perfil",
|
||||
"raiseHand": "Levantar a mão",
|
||||
"reactions": "Reações",
|
||||
"reactionsMenu": "Menu de reações",
|
||||
"recording": "Mudar gravação",
|
||||
"remoteMute": "Participante sem som",
|
||||
@@ -1171,6 +1205,7 @@
|
||||
"unmute": "Ligar microfone",
|
||||
"videoblur": "Mudar o desfoque de vídeo",
|
||||
"videomute": "Parar câmara",
|
||||
"videomuteGUMPending": "A ligar a sua câmara",
|
||||
"videounmute": "Iniciar câmara"
|
||||
},
|
||||
"addPeople": "Adicione pessoas à sua chamada",
|
||||
@@ -1221,6 +1256,7 @@
|
||||
"mute": "Desligar microfone",
|
||||
"muteEveryone": "Silenciar todos",
|
||||
"muteEveryonesVideo": "Desativar a câmara de todos",
|
||||
"muteGUMPending": "A ligar o seu microfone",
|
||||
"noAudioSignalDesc": "Se não o silenciou propositadamente a partir de configurações do sistema ou hardware, considere mudar de dispositivo.",
|
||||
"noAudioSignalDescSuggestion": "Se não o silenciou propositadamente a partir das configurações do sistema ou hardware, considere mudar para o dispositivo sugerido.",
|
||||
"noAudioSignalDialInDesc": "Também pode marcar usando:",
|
||||
@@ -1243,6 +1279,7 @@
|
||||
"reactionLike": "Enviar reação de aprovado",
|
||||
"reactionSilence": "Enviar reação de silêncio",
|
||||
"reactionSurprised": "Enviar reação de surpreendido",
|
||||
"reactions": "Reações",
|
||||
"security": "Opções de segurança",
|
||||
"selectBackground": "Selecionar plano de fundo",
|
||||
"shareRoom": "Convidar alguém",
|
||||
@@ -1265,6 +1302,7 @@
|
||||
"unmute": "Ligar microfone",
|
||||
"videoSettings": "Definições de vídeo",
|
||||
"videomute": "Parar câmara",
|
||||
"videomuteGUMPending": "A ligar a sua câmara",
|
||||
"videounmute": "Iniciar câmara"
|
||||
},
|
||||
"transcribing": {
|
||||
@@ -1311,7 +1349,7 @@
|
||||
"audioOnly": "AUD",
|
||||
"audioOnlyExpanded": "Está em modo de baixa largura de banda. Neste modo, receberá apenas partilha de áudio e ecrã.",
|
||||
"bestPerformance": "Melhor desempenho",
|
||||
"callQuality": "Qualidade de vídeo",
|
||||
"callQuality": "Qualidade de vídeo (0 para o melhor desempenho, 3 para a melhor qualidade)",
|
||||
"hd": "HD",
|
||||
"hdTooltip": "Ver vídeo em alta definição",
|
||||
"highDefinition": "Alta definição (HD)",
|
||||
@@ -1353,6 +1391,10 @@
|
||||
"videomute": "Participante parou a câmara"
|
||||
},
|
||||
"virtualBackground": {
|
||||
"accessibilityLabel": {
|
||||
"currentBackground": "Atual imagem de fundo: {{background}}",
|
||||
"selectBackground": "Selecionar uma imagem de fundo"
|
||||
},
|
||||
"addBackground": "Adicionar imagem de fundo",
|
||||
"apply": "Aplicar",
|
||||
"backgroundEffectError": "Falha ao aplicar efeito de fundo.",
|
||||
@@ -1376,7 +1418,14 @@
|
||||
"webAssemblyWarning": "WebAssembly não suportado",
|
||||
"webAssemblyWarningDescription": "WebAssembly desactivado ou não suportado por este navegador"
|
||||
},
|
||||
"visitorsLabel": "Número de visitantes: {{count}}",
|
||||
"visitors": {
|
||||
"chatIndicator": "(visitante)",
|
||||
"labelTooltip": "Número de visitantes: {{count}}",
|
||||
"notification": {
|
||||
"description": "Para participar levante a sua mão",
|
||||
"title": "É um visitante na reunião"
|
||||
}
|
||||
},
|
||||
"volumeSlider": "Controlo de volume",
|
||||
"welcomepage": {
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -68,9 +68,9 @@
|
||||
},
|
||||
"join": "Gå med",
|
||||
"joinTooltip": "Gå med i mötet",
|
||||
"nextMeeting": "nästa möte",
|
||||
"nextMeeting": "Nästa möte",
|
||||
"noEvents": "Det finns inga inbokade kommande aktiviteter.",
|
||||
"ongoingMeeting": "pågående möte",
|
||||
"ongoingMeeting": "Pågående möte",
|
||||
"permissionButton": "Öppna inställningar",
|
||||
"permissionMessage": "Tillåtelse från kalendern krävs för att se dina möten i appen.",
|
||||
"refresh": "Uppdatera kalender",
|
||||
@@ -147,6 +147,7 @@
|
||||
"bridgeCount": "Serverantal: ",
|
||||
"codecs": "Codecs (A/V):",
|
||||
"connectedTo": "Ansluten till:",
|
||||
"e2eeVerified": "E2EE verifierad",
|
||||
"framerate": "Bildfrekvens:",
|
||||
"less": "Visa mindre",
|
||||
"localaddress": "Lokal adress:",
|
||||
@@ -155,6 +156,7 @@
|
||||
"localport_plural": "Lokala portar:",
|
||||
"maxEnabledResolution": "Sänd maxiamlt",
|
||||
"more": "Visa mer",
|
||||
"no": "Nej",
|
||||
"packetloss": "Paketförluster:",
|
||||
"participant_id": "Deltagar id:",
|
||||
"quality": {
|
||||
@@ -173,7 +175,8 @@
|
||||
"status": "Anslutning:",
|
||||
"transport": "Transport:",
|
||||
"transport_plural": "Transporter:",
|
||||
"video_ssrc": "Video SSRC:"
|
||||
"video_ssrc": "Video SSRC:",
|
||||
"yes": "Ja"
|
||||
},
|
||||
"dateUtils": {
|
||||
"earlier": "Tidigare",
|
||||
@@ -183,17 +186,25 @@
|
||||
"deepLinking": {
|
||||
"appNotInstalled": "Du behöver mobilappen {{app}} för att gå med i det här mötet från din telefon.",
|
||||
"description": "Hände inget? Vi försökte starta mötet i programmet {{app}} i din skrivbordsapp. Försök igen eller starta det i webbappen {{app}}.",
|
||||
"descriptionNew": "Hände inget? Vi försökte starta mötet i programmet {{app}} i din skrivbordsapp. <br /><br /> Försök igen eller starta det på webben.",
|
||||
"descriptionWithoutWeb": "Händer inget? Vi försökte starta mötet i {{app}}-skrivbordsappen.",
|
||||
"downloadApp": "Hämta appen",
|
||||
"downloadMobileApp": "Ladda ner mobilappen",
|
||||
"ifDoNotHaveApp": "Om du inte har appen än:",
|
||||
"ifHaveApp": "Om du redan har appen:",
|
||||
"joinInApp": "Delta i detta möte med din app",
|
||||
"joinInAppNew": "Delta i appen",
|
||||
"joinInBrowser": "Delta på webben",
|
||||
"launchMeetingLabel": "Hur vill du delta i detta möte?",
|
||||
"launchWebButton": "Starta på webben",
|
||||
"noMobileApp": "Har du inte appen?",
|
||||
"termsAndConditions": "Genom att fortsätta godkänner du våra <a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>villkor.</a>",
|
||||
"title": "Startar ditt möte i {{app}} ...",
|
||||
"titleNew": "Startar ditt möte...",
|
||||
"tryAgainButton": "Försök igen på skrivbordet",
|
||||
"unsupportedBrowser": "Det verkar som att du använder en webbläsare som vi inte stöder."
|
||||
},
|
||||
"defaultLink": "t ex. {{url}}",
|
||||
"defaultLink": "t.ex. {{url}}",
|
||||
"defaultNickname": "till exempel Julia Eriksson",
|
||||
"deviceError": {
|
||||
"cameraError": "Det gick inte att komma åt kameran",
|
||||
@@ -202,6 +213,12 @@
|
||||
"microphonePermission": "Fel vid begäran om åtkomst till mikrofon"
|
||||
},
|
||||
"deviceSelection": {
|
||||
"hid": {
|
||||
"callControl": "Samtalskontroll",
|
||||
"connectedDevices": "Anslutna enheter",
|
||||
"deleteDevice": "Radera enhet",
|
||||
"pairDevice": "Para enhet"
|
||||
},
|
||||
"noPermission": "Behörighet nekad",
|
||||
"previewUnavailable": "Förhandsgranskning inte tillgänglig",
|
||||
"selectADevice": "Välj en enhet",
|
||||
@@ -225,7 +242,9 @@
|
||||
"WaitingForHostTitle": "Väntar på värden ...",
|
||||
"Yes": "Ja",
|
||||
"accessibilityLabel": {
|
||||
"liveStreaming": "Livesändning"
|
||||
"close": "Stäng",
|
||||
"liveStreaming": "Livesändning",
|
||||
"sharingTabs": "Delningsalternativ"
|
||||
},
|
||||
"add": "Lägg till",
|
||||
"addMeetingNote": "Mötesinformation",
|
||||
@@ -408,6 +427,10 @@
|
||||
"user": "Användare",
|
||||
"userIdentifier": "Användar-ID",
|
||||
"userPassword": "Lösenord",
|
||||
"verifyParticipantConfirm": "Dem matchar",
|
||||
"verifyParticipantDismiss": "Dem matchar inte",
|
||||
"verifyParticipantQuestion": "EXPERIMENTELLT: Fråga deltagaren; {{participantName}} om han/hon kan se samma innehåll, i samma ordning.",
|
||||
"verifyParticipantTitle": "Användarverifikation",
|
||||
"videoLink": "Videolänk",
|
||||
"viewUpgradeOptions": "Se uppgraderings alternativ",
|
||||
"viewUpgradeOptionsContent": "För att få obegränsad tillgång till premiumfunktioner som inspelning, transkriptioner, RTMP -streaming och mer måste du uppgradera din plan.",
|
||||
@@ -433,13 +456,15 @@
|
||||
"veryBad": "Mycket dåligt",
|
||||
"veryGood": "Mycket bra"
|
||||
},
|
||||
"filmstrip": {
|
||||
"accessibilityLabel": {
|
||||
"heading": "Videomineatyrer"
|
||||
}
|
||||
},
|
||||
"giphy": {
|
||||
"noResults": "Inga resultat funna :(",
|
||||
"search": "Sök efter GIPHY"
|
||||
},
|
||||
"helpView": {
|
||||
"title": "Hjälpcenter"
|
||||
},
|
||||
"incomingCall": {
|
||||
"answer": "Svara",
|
||||
"audioCallTitle": "Inkommande samtal",
|
||||
@@ -517,7 +542,8 @@
|
||||
"toggleParticipantsPane": "Visa eller dölj deltagarfönstret",
|
||||
"toggleScreensharing": "Växla mellan kamera och skärmdelning",
|
||||
"toggleShortcuts": "Visa eller dölj kortkommandon",
|
||||
"videoMute": "Aktivera / avaktivera din kamera"
|
||||
"videoMute": "Aktivera / inaktivera din kamera",
|
||||
"whiteboard": "Visa / dölj whiteboardtavlan"
|
||||
},
|
||||
"largeVideo": {
|
||||
"screenIsShared": "Du delar din skärm",
|
||||
@@ -563,7 +589,6 @@
|
||||
"lobby": {
|
||||
"admit": "Godkänn",
|
||||
"admitAll": "Godkänn alla",
|
||||
"allow": "Tillåt",
|
||||
"backToKnockModeButton": "Tillbaka till väntrum",
|
||||
"chat": "Chatt",
|
||||
"dialogTitle": "Väntrum",
|
||||
@@ -649,8 +674,12 @@
|
||||
"connectedOneMember": "{{name}} har gått med i mötet",
|
||||
"connectedThreePlusMembers": "{{name}} och {{count}} andra har gått med i mötet",
|
||||
"connectedTwoMembers": "{{first}} och {{second}} har gått med i mötet",
|
||||
"dataChannelClosed": "Försämrad videokvalitet",
|
||||
"dataChannelClosedDescription": "Bryggkanalen har kopplats bort och därmed är videokvaliteten begränsad till sin lägsta inställning",
|
||||
"disabledIframe": "Inbäddning är endast avsedd för demonstrationsändamål, så det här samtalet kommer att kopplas ner om {{timeout}} minuter.",
|
||||
"disconnected": "frånkopplad",
|
||||
"displayNotifications": "Visa aviseringar för",
|
||||
"dontRemindMe": "Påminn mig inte",
|
||||
"focus": "Konferensfokus",
|
||||
"focusFail": "{{component}} inte tillgänglig – försöker igen om {{ms}} sek",
|
||||
"gifsMenu": "GIPHY",
|
||||
@@ -659,6 +688,7 @@
|
||||
"invitedOneMember": "{{name}} har bjudits in",
|
||||
"invitedThreePlusMembers": "{{name}} och {{count}} andra har bjudits in",
|
||||
"invitedTwoMembers": "{{first}} och {{second}} har bjudits in",
|
||||
"joinMeeting": "Delta",
|
||||
"kickParticipant": "{{kicked}} sparkades ut av {{kicker}}",
|
||||
"leftOneMember": "{{name}} lämnade mötet",
|
||||
"leftThreePlusMembers": "{{name}} och många andra lämnade mötet",
|
||||
@@ -709,6 +739,8 @@
|
||||
"reactionSoundsForAll": "Inaktivera ljud för alla",
|
||||
"screenShareNoAudio": "\"Dela ljudrutan\" aktiverades inte i fönstret för val av fönster.",
|
||||
"screenShareNoAudioTitle": "Det gick inte att dela systemljud!",
|
||||
"screenSharingAudioOnlyDescription": "Observera att genom att dela din skärm påverkar du läget \"Bästa prestanda\" och du kommer att använda mer bandbredd.",
|
||||
"screenSharingAudioOnlyTitle": "Läget \"Bästa prestanda\"",
|
||||
"selfViewTitle": "Du kan alltid ta bort döljandet av självvyn från inställningarna",
|
||||
"somebody": "Någon",
|
||||
"startSilentDescription": "Anslut till mötet igen för att aktivera ljud",
|
||||
@@ -746,6 +778,7 @@
|
||||
"headings": {
|
||||
"lobby": "Väntrum ({{count}})",
|
||||
"participantsList": "Mötesdeltagare ({{count}})",
|
||||
"visitors": "Gäster ({{count}})",
|
||||
"waitingLobby": "Väntar i väntrum ({{count}})"
|
||||
},
|
||||
"search": "Sök efter deltagare",
|
||||
@@ -753,6 +786,7 @@
|
||||
},
|
||||
"passwordDigitsOnly": "Ange max {{number}} siffror",
|
||||
"passwordSetRemotely": "satt av en annan deltagare",
|
||||
"pinParticipant": "{{participantName}} - Fäst",
|
||||
"pinnedParticipant": "Deltagaren är fäst",
|
||||
"polls": {
|
||||
"answer": {
|
||||
@@ -837,9 +871,11 @@
|
||||
"lookGood": "Din mikrofon fungerar som den ska",
|
||||
"or": "eller",
|
||||
"premeeting": "Förmöte",
|
||||
"proceedAnyway": "Fortsätt ändå",
|
||||
"screenSharingError": "Skärmdelningsfel:",
|
||||
"showScreen": "Aktivera skärmen före mötet",
|
||||
"startWithPhone": "Börja med telefonljud",
|
||||
"unsafeRoomConsent": "Jag förstår riskerna, jag vill vara med på mötet",
|
||||
"videoOnlyError": "Videofel:",
|
||||
"videoTrackError": "Det gick inte att skapa videospår.",
|
||||
"viewAllNumbers": "visa alla nummer"
|
||||
@@ -858,9 +894,6 @@
|
||||
"rejected": "Avvisad",
|
||||
"ringing": "Ringer..."
|
||||
},
|
||||
"privacyView": {
|
||||
"title": "Privat"
|
||||
},
|
||||
"profile": {
|
||||
"avatar": "avatar",
|
||||
"setDisplayNameLabel": "Ange ditt visningsnamn",
|
||||
@@ -869,7 +902,7 @@
|
||||
"title": "Profil"
|
||||
},
|
||||
"raisedHand": "Räck upp handen",
|
||||
"raisedHandsLabel": "Antal upphöjda händer",
|
||||
"raisedHandsLabel": "Antal uppräckta händer",
|
||||
"record": {
|
||||
"already": {
|
||||
"linked": "Mötet är redan länkat till detta Salesforce-objekt."
|
||||
@@ -914,6 +947,7 @@
|
||||
"localRecordingVideoWarning": "För att spela in din video måste du ha den på när du startar inspelningen",
|
||||
"localRecordingWarning": "Se till att du väljer den aktuella fliken för att kunna använda rätt video och ljud. Inspelningen är för närvarande begränsad till 1 GB, vilket är cirka 100 minuter.",
|
||||
"loggedIn": "Inloggad som {{userName}}",
|
||||
"noMicPermission": "Mikrofonspåret kunde inte skapas. Vänligen ge tillstånd att använda mikrofonen.",
|
||||
"noStreams": "Ingen ljud- eller videoström upptäcktes.",
|
||||
"off": "Inspelningen avslutades",
|
||||
"offBy": "{{name}} avslutade inspelningen",
|
||||
@@ -943,10 +977,17 @@
|
||||
"security": {
|
||||
"about": "Du kan lägga till ett $t(lockRoomPassword) till ditt möte. Deltagarna måste ange $t(lockRoomPassword) innan de får gå med i mötet.",
|
||||
"aboutReadOnly": "Moderatorn kan lägga till ett $t(lockRoomPassword) till mötet. Deltagarna måste ange $t(lockRoomPassword) innan de får gå med i mötet.",
|
||||
"insecureRoomNameWarning": "Rummets namn är osäkert. Oönskade deltagare kan gå med i din konferens. Överväg att säkra ditt möte med hjälp av säkerhetsknappen.",
|
||||
"title": "Säkerhetsalternativ"
|
||||
"insecureRoomNameWarningNative": "Rumsnamnet är osäkert. Oönskade deltagare kan gå med i ditt möte. {{recommendAction}} Läs mer om att säkra ditt möte",
|
||||
"insecureRoomNameWarningWeb": "Rumsnamnet är osäkert. Oönskade deltagare kan gå med i ditt möte. {{recommendAction}} Läs mer om hur du säkerställer att du möter <a href=\"{{securityUrl}}\" rel=\"security\"-målet =\"_blank\">här</a>.",
|
||||
"title": "Säkerhetsalternativ",
|
||||
"unsafeRoomActions": {
|
||||
"meeting": "Överväg att göra ditt möte säkrare med hjälp av säkerhetsknappen.",
|
||||
"prejoin": "Överväg att använda ett mer unikt mötesnamn.",
|
||||
"welcome": "Överväg att använda ett mer unikt mötesnamn, eller välj ett av förslagen."
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"audio": "Ljud",
|
||||
"buttonLabel": "Inställningar",
|
||||
"calendar": {
|
||||
"about": "Kalenderintegrationen med {{appName}} används för att hämta din kalender på ett säkert sätt så att den kan läsa framtida händelser.",
|
||||
@@ -967,9 +1008,11 @@
|
||||
"maxStageParticipants": "Maximalt antal deltagare som kan fästas på huvudscenen",
|
||||
"microphones": "Mikrofoner",
|
||||
"moderator": "Moderator",
|
||||
"moderatorOptions": "Moderatoralternativ",
|
||||
"more": "Mer",
|
||||
"name": "Namn",
|
||||
"noDevice": "Inga enheter",
|
||||
"notifications": "Notifikationer",
|
||||
"participantJoined": "Deltagare ansluten",
|
||||
"participantKnocking": "Deltagare har anslutit till lobbyn",
|
||||
"participantLeft": "Deltagare lämnat mötet",
|
||||
@@ -980,13 +1023,14 @@
|
||||
"selectCamera": "Kamera",
|
||||
"selectMic": "Mikrofon",
|
||||
"selfView": "Självvy",
|
||||
"sounds": "Ljud",
|
||||
"shortcuts": "Genvägar",
|
||||
"speakers": "Högtalare",
|
||||
"startAudioMuted": "Alla börjar tystade",
|
||||
"startReactionsMuted": "Stäng av reaktionsljud för alla",
|
||||
"startVideoMuted": "Alla börjar osynliga",
|
||||
"talkWhileMuted": "Prata medan din ljud är inaktiverad",
|
||||
"title": "Inställningar"
|
||||
"title": "Inställningar",
|
||||
"video": "Video"
|
||||
},
|
||||
"settingsView": {
|
||||
"advanced": "Avancerat",
|
||||
@@ -1003,6 +1047,7 @@
|
||||
"displayName": "Skärmnamn",
|
||||
"displayNamePlaceholderText": "Exempel: John Doe",
|
||||
"email": "E-post",
|
||||
"emailPlaceholderText": "mejl@exempel.se",
|
||||
"goTo": "Gå till",
|
||||
"header": "Inställningar",
|
||||
"help": "Hjälp",
|
||||
@@ -1060,69 +1105,87 @@
|
||||
"audioOnly": "Slå av eller på ljudet",
|
||||
"audioRoute": "Välj ljudenhet",
|
||||
"boo": "Bua",
|
||||
"breakoutRoom": "Gå med i/lämna grupprum",
|
||||
"breakoutRoom": "Anslut eller lämna grupprum",
|
||||
"callQuality": "Hantera videokvalitet",
|
||||
"carmode": "Billäge",
|
||||
"cc": "Slå av eller på undertexter",
|
||||
"chat": "Öppna eller stäng chattfönster",
|
||||
"clap": "Klappa",
|
||||
"collapse": "Kollaps",
|
||||
"document": "Öppna eller stäng delat dokument",
|
||||
"download": "Ladda ner app",
|
||||
"clap": "Applådera",
|
||||
"closeChat": "Stäng chatten",
|
||||
"closeMoreActions": "Stäng menyn för fler åtgärder",
|
||||
"closeParticipantsPane": "Stäng deltagarfönstret",
|
||||
"collapse": "Minimera",
|
||||
"document": "Växla delat dokument",
|
||||
"documentClose": "Stäng delat dokument",
|
||||
"documentOpen": "Öppna delat dokument",
|
||||
"download": "Ladda ner våra appar",
|
||||
"embedMeeting": "Bädda in möte",
|
||||
"endConference": "Avsluta mötet för alla",
|
||||
"expand": "Expandera",
|
||||
"feedback": "Lämna återkoppling",
|
||||
"fullScreen": "Öppna eller stäng fullskärm",
|
||||
"giphy": "Växla GIPHY meny",
|
||||
"grantModerator": "Godkänn moderator",
|
||||
"hangup": "Lämna samtalet",
|
||||
"endConference": "Avsluta möte för alla",
|
||||
"enterFullScreen": "Visa helskärm",
|
||||
"enterTileView": "Öppna sida vid sida",
|
||||
"exitFullScreen": "Avsluta helskärm",
|
||||
"exitTileView": "Avsluta sida vid sida",
|
||||
"expand": "Utöka",
|
||||
"feedback": "Ge feedback",
|
||||
"fullScreen": "Växla helskärm",
|
||||
"giphy": "Växla GIPHY-menyn",
|
||||
"grantModerator": "Tilldela moderatorrättigheter",
|
||||
"hangup": "Lämna mötet",
|
||||
"heading": "Verktygsfält",
|
||||
"help": "Hjälp",
|
||||
"invite": "Bjud in andra",
|
||||
"hideWhiteboard": "Dölj whiteboard",
|
||||
"invite": "Bjud in personer",
|
||||
"kick": "Sparka ut deltagare",
|
||||
"laugh": "Skratta",
|
||||
"leaveConference": "Lämna möte",
|
||||
"leaveConference": "Lämna mötet",
|
||||
"like": "Tummen upp",
|
||||
"linkToSalesforce": "Länk till Salesforce",
|
||||
"lobbyButton": "Aktivera/inaktivera väntrumsläge",
|
||||
"localRecording": "Öppna eller stäng lokala inspelningsverktyg",
|
||||
"lockRoom": "Slå av eller på möteslösenord",
|
||||
"moreActions": "Öppna eller stäng menyn för fler åtgärder",
|
||||
"moreActionsMenu": "Meny för fler åtgärder",
|
||||
"lobbyButton": "Aktivera / inaktivera lobbyläge",
|
||||
"localRecording": "Växla lokala inspelningskontroller",
|
||||
"lockRoom": "Växla möteslösenord",
|
||||
"lowerHand": "Sänk din hand",
|
||||
"moreActions": "Fler åtgärder",
|
||||
"moreActionsMenu": "Menyn Fler åtgärder",
|
||||
"moreOptions": "Visa fler alternativ",
|
||||
"mute": "Slå av eller på ljud",
|
||||
"muteEveryone": "Tysta alla",
|
||||
"muteEveryoneElse": "Inkativerad ljud för alla andra",
|
||||
"mute": "Mute",
|
||||
"muteEveryone": "Stäng av ljudet för alla",
|
||||
"muteEveryoneElse": "Stäng av ljudet för alla andra",
|
||||
"muteEveryoneElsesVideoStream": "Stoppa alla andras video",
|
||||
"muteEveryonesVideoStream": "Stoppa allas video",
|
||||
"noiseSuppression": "Brusreducering",
|
||||
"participants": "Deltagare",
|
||||
"pip": "Öppna eller stäng bild-i-bild-läge",
|
||||
"noiseSuppression": "Brusdämpning",
|
||||
"openChat": "Öppna chatt",
|
||||
"participants": "Öppna deltagarfönstret",
|
||||
"pip": "Växla bild-i-bild-läge",
|
||||
"privateMessage": "Skicka privat meddelande",
|
||||
"profile": "Redigera din profil",
|
||||
"raiseHand": "Räck upp eller ta ner handen",
|
||||
"reactionsMenu": "Öppna7ständ meny för reaktioner",
|
||||
"recording": "Slå av eller på inspelning",
|
||||
"remoteMute": "Tysta deltagare",
|
||||
"remoteVideoMute": "Inaktivera kamera för deltagare",
|
||||
"raiseHand": "Räck upp handen",
|
||||
"reactions": "Reaktioner",
|
||||
"reactionsMenu": "Reaktionsmeny",
|
||||
"recording": "Växla inspelning",
|
||||
"remoteMute": "Ljud av deltagare",
|
||||
"remoteVideoMute": "Inaktivera kameran för deltagaren",
|
||||
"security": "Säkerhetsalternativ",
|
||||
"selectBackground": "Välj bakgrund",
|
||||
"selfView": "Växla självvy",
|
||||
"shareRoom": "Bjud in någon",
|
||||
"shareYourScreen": "Slå av eller på skärmdelning",
|
||||
"shareYourScreen": "Börja dela din skärm",
|
||||
"shareaudio": "Dela ljud",
|
||||
"sharedvideo": "Slå av eller på videodelning",
|
||||
"shortcuts": "Stäng eller öppna genvägar",
|
||||
"sharedvideo": "Dela video",
|
||||
"shortcuts": "Växla genvägar",
|
||||
"show": "Visa på scenen",
|
||||
"silence": "Tyst läge",
|
||||
"speakerStats": "Stäng eller öppna talarstatistik",
|
||||
"surprised": "Överaskning",
|
||||
"tileView": "Öppna eller stäng panelvyn",
|
||||
"showWhiteboard": "Visa whiteboard",
|
||||
"silence": "Tystnad",
|
||||
"speakerStats": "Växla deltagarstatistik",
|
||||
"stopScreenSharing": "Sluta dela din skärm",
|
||||
"stopSharedVideo": "Stoppa video",
|
||||
"surprised": "Förvånad",
|
||||
"tileView": "Växla sida vid sida",
|
||||
"toggleCamera": "Växla kamera",
|
||||
"toggleFilmstrip": "Växla filmremsa",
|
||||
"unmute": "Slå på ljudet",
|
||||
"videoblur": "Växla videooskärpa",
|
||||
"videomute": "Sätt på eller stäng av mikrofonen",
|
||||
"whiteboard": "Visa/dölj whiteboardtavlan"
|
||||
"videomute": "Stoppa kamera",
|
||||
"videounmute": "Starta kameran"
|
||||
},
|
||||
"addPeople": "Lägg till personer i samtal",
|
||||
"audioOnlyOff": "Avsluta ljudläget",
|
||||
@@ -1135,6 +1198,7 @@
|
||||
"chat": "Öppna / stäng chatten",
|
||||
"clap": "Klappa",
|
||||
"closeChat": "Stäng chatt",
|
||||
"closeParticipantsPane": "Stäng deltagarrutan",
|
||||
"closeReactionsMenu": "Stäng meny för reaktioner",
|
||||
"disableNoiseSuppression": "Inaktivera brusreducering",
|
||||
"disableReactionSounds": "Du kan inaktivera reaktionsljud för det här mötet",
|
||||
@@ -1143,6 +1207,7 @@
|
||||
"download": "Ladda ner vår app",
|
||||
"e2ee": "End-to-End kryptering",
|
||||
"embedMeeting": "Bädda in möte",
|
||||
"enableNoiseSuppression": "Aktivera brusreducering",
|
||||
"endConference": "Avsluta mötet för alla",
|
||||
"enterFullScreen": "Visa fullskärm",
|
||||
"enterTileView": "Öppna panelvy",
|
||||
@@ -1192,6 +1257,7 @@
|
||||
"reactionLike": "Skicka tummen upp",
|
||||
"reactionSilence": "Skicka tyst reaktion",
|
||||
"reactionSurprised": "Skicka reaktionen överaskad",
|
||||
"reactions": "Reaktioner",
|
||||
"security": "Säkerhetsalternativ",
|
||||
"selectBackground": "Välj bakgrund",
|
||||
"shareRoom": "Bjud in någon",
|
||||
@@ -1211,11 +1277,13 @@
|
||||
"talkWhileMutedPopup": "Försöker du tala? Din mikrofon är tystad.",
|
||||
"tileViewToggle": "Öppna eller stäng panelvyn",
|
||||
"toggleCamera": "Byta kamera",
|
||||
"unmute": "Slå på ljud",
|
||||
"videoSettings": "Video inställningar",
|
||||
"videomute": "Aktivera / avaktivera kameran"
|
||||
"videomute": "Inaktivera kameran",
|
||||
"videounmute": "Aktivera kameran"
|
||||
},
|
||||
"transcribing": {
|
||||
"ccButtonTooltip": "Starta / Avsluta undertexter",
|
||||
"ccButtonTooltip": "Aktivera / Inaktivera undertexter",
|
||||
"error": "Transkriberingen misslyckades. Försök igen.",
|
||||
"expandedLabel": "Transkribering är aktiverad",
|
||||
"failedToStart": "Det gick inte att starta transkribering",
|
||||
@@ -1230,6 +1298,7 @@
|
||||
"subtitlesOff": "Av",
|
||||
"tr": "TR"
|
||||
},
|
||||
"unpinParticipant": "Lossa deltagare",
|
||||
"userMedia": {
|
||||
"androidGrantPermissions": "Välj <b><i>Tillåt</i></b> när din webbläsare begär åtkomst.",
|
||||
"chromeGrantPermissions": "Välj <b><i>Tillåt</i></b> när din webbläsare begär åtkomst.",
|
||||
@@ -1268,9 +1337,11 @@
|
||||
"ldTooltip": "Titta på lågupplöst video",
|
||||
"lowDefinition": "Låg upplösning",
|
||||
"performanceSettings": "Prestandainställningar",
|
||||
"recording": "Inspelning pågår",
|
||||
"sd": "SD",
|
||||
"sdTooltip": "Titta på video med standardupplösning",
|
||||
"standardDefinition": "Normal upplösning"
|
||||
"standardDefinition": "Normal upplösning",
|
||||
"streaming": "Streaming pågår"
|
||||
},
|
||||
"videothumbnail": {
|
||||
"connectionInfo": "Anslutningsinformation",
|
||||
@@ -1282,6 +1353,7 @@
|
||||
"grantModerator": "Godkänn moderator",
|
||||
"hideSelfView": "Dölj självvyn",
|
||||
"kick": "Sparka ut",
|
||||
"mirrorVideo": "Spegelvänd video",
|
||||
"moderator": "Moderator",
|
||||
"mute": "Deltagaren har avstängd mikrofon",
|
||||
"muted": "Tystad",
|
||||
@@ -1291,8 +1363,9 @@
|
||||
"show": "Visa på scenen",
|
||||
"showSelfView": "Visa självvy",
|
||||
"unpinFromStage": "Ta loss",
|
||||
"videoMuted": "kamera inaktiverad",
|
||||
"videomute": "Deltagaren har stäng av kameran"
|
||||
"verify": "Verifiera",
|
||||
"videoMuted": "Kamera inaktiverad",
|
||||
"videomute": "Deltagaren har stängt av kameran"
|
||||
},
|
||||
"virtualBackground": {
|
||||
"addBackground": "Lägg till bakgrund",
|
||||
@@ -1318,6 +1391,14 @@
|
||||
"webAssemblyWarning": "WebAssembly stöds inte",
|
||||
"webAssemblyWarningDescription": "WebAssembly inaktiverad eller stöds inte av den här webbläsaren"
|
||||
},
|
||||
"visitors": {
|
||||
"chatIndicator": "(besökare)",
|
||||
"labelTooltip": "Antal besökare: {{count}}",
|
||||
"notification": {
|
||||
"description": "Räck upp handen för att delta",
|
||||
"title": "Du är en besökare i mötet"
|
||||
}
|
||||
},
|
||||
"volumeSlider": "Volymreglage",
|
||||
"welcomepage": {
|
||||
"accessibilityLabel": {
|
||||
@@ -1338,6 +1419,7 @@
|
||||
"go": "KÖR",
|
||||
"goSmall": "BÖRJA",
|
||||
"headerSubtitle": "Säkra möten med hög kvalitet",
|
||||
"headerTitle": "Jitsi Meet",
|
||||
"info": "Info",
|
||||
"jitsiOnMobile": "Jitsi på mobilen - ladda ner våra appar och starta ett möte var som helst",
|
||||
"join": "Gå med",
|
||||
@@ -1349,6 +1431,7 @@
|
||||
"microsoftLogo": "Microsoft logotyp",
|
||||
"policyLogo": "Policy-logotyp"
|
||||
},
|
||||
"meetingsAccessibilityLabel": "Möten",
|
||||
"mobileDownLoadLinkAndroid": "Ladda ner mobilappen för Android",
|
||||
"mobileDownLoadLinkFDroid": "Ladda ner mobilappen för F-droid",
|
||||
"mobileDownLoadLinkIos": "Ladda ner mobilappen för iOS",
|
||||
@@ -1357,6 +1440,7 @@
|
||||
"recentList": "Tidigare",
|
||||
"recentListDelete": "Radera",
|
||||
"recentListEmpty": "Inga tidigare möten. Chatta med ditt team och hitta alla tidigare möten där.",
|
||||
"recentMeetings": "Dina senaste möten",
|
||||
"reducedUIText": "Välkommen till {{app}}!",
|
||||
"roomNameAllowedChars": "Mötesnamn kan inte innehålla dessa tecken: ?, &,:, ', \",%, #.",
|
||||
"roomname": "Skriv in rumsnamn",
|
||||
@@ -1365,6 +1449,12 @@
|
||||
"settings": "Inställningar",
|
||||
"startMeeting": "Starta möte",
|
||||
"terms": "Villkor",
|
||||
"title": "Säkra, välutrustade och helt kostnadsfria videokonferenser"
|
||||
"title": "Säkra, välutrustade och helt kostnadsfria videokonferenser",
|
||||
"upcomingMeetings": "Dina kommande möten"
|
||||
},
|
||||
"whiteboard": {
|
||||
"accessibilityLabel": {
|
||||
"heading": "Whiteboard"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"add": "Mời",
|
||||
"copyInvite": "Sao chép lời mời",
|
||||
"countryNotSupported": "Chúng tôi chưa hỗ trợ đích đến này.",
|
||||
"countryReminder": "Đang gọi ra ngoài Mỹ? Đảm bảo bắt đầu bằng mã quốc gia!",
|
||||
"countryReminder": "Nhớ đảm bảo bắt đầu bằng mã quốc gia!",
|
||||
"disabled": "Bạn không thể mời thêm người.",
|
||||
"failedToAdd": "",
|
||||
"footerText": "Quay số bị tắt.",
|
||||
@@ -18,7 +18,7 @@
|
||||
"searchPeopleAndNumbers": "Tìm người và thêm số",
|
||||
"shareInvite": "Chia sẻ lời mời tham dự cuộc họp",
|
||||
"shareLink": "Chia sẻ đường dẫn để mời người khác tham dự cuộc họp",
|
||||
"telephone": "Số:{{number}}",
|
||||
"telephone": "Số: {{number}}",
|
||||
"title": "Mời người tham dự cuộc họp này"
|
||||
},
|
||||
"audioDevices": {
|
||||
@@ -28,24 +28,24 @@
|
||||
"speaker": "Diễn giả"
|
||||
},
|
||||
"audioOnly": {
|
||||
"audioOnly": "Chỉ âm thanh"
|
||||
"audioOnly": "Chỉ nghe âm thanh"
|
||||
},
|
||||
"calendarSync": {
|
||||
"addMeetingURL": "Thêm một liên kết họp",
|
||||
"confirmAddLink": "Bạn có muốn thêm một liên kiết tới sự kiện này?",
|
||||
"error": {
|
||||
"appConfiguration": "Tích hợp lịch chưa được cấu hình đúng.",
|
||||
"generic": "Một lỗi xuất hiện. Vui lòng kiểm tra cấu hình lịch hoặc thử làm tươi lịch.",
|
||||
"generic": "Có lỗi xảy ra. Vui lòng kiểm tra cấu hình lịch hoặc thử làm mới lịch.",
|
||||
"notSignedIn": "Một lỗi xảy ra khi xác thực để xem lịch sự kiện. Vui lòng kiểm tra cấu hình lịch và thử đăng nhập lại."
|
||||
},
|
||||
"join": "Tham gia",
|
||||
"joinTooltip": "Tham gia cuọc họp",
|
||||
"joinTooltip": "Tham gia cuộc họp",
|
||||
"nextMeeting": "Cuộc họp tiếp theo",
|
||||
"noEvents": "Không có sự kiện được lên lịch nào tiếp theo.",
|
||||
"ongoingMeeting": "cuộc họp đang diễn ra",
|
||||
"ongoingMeeting": "Cuộc họp đang diễn ra",
|
||||
"permissionButton": "Mở cấu hình",
|
||||
"permissionMessage": "Yêu cầu quyền truy cập Lịch để thấy cuộc họp của bạn trên ứng dụng.",
|
||||
"refresh": "Làm tươi lịch",
|
||||
"permissionMessage": "Yêu cầu quyền truy cập lịch để thấy cuộc họp của bạn trên ứng dụng.",
|
||||
"refresh": "Làm mới lịch",
|
||||
"today": "Hôm nay"
|
||||
},
|
||||
"chat": {
|
||||
@@ -53,16 +53,16 @@
|
||||
"messagebox": "Nhập nội dung tin nhắn",
|
||||
"nickname": {
|
||||
"popover": "Chọn tên",
|
||||
"title": "Nhập tên của bạn để tán gẫu",
|
||||
"titleWithPolls": "Nhập tên của bạn để tán gẫu"
|
||||
"title": "Nhập tên của bạn để gửi tin nhắn",
|
||||
"titleWithPolls": "Nhập tên của bạn để gửi tin nhắn"
|
||||
},
|
||||
"sendButton": "Gửi",
|
||||
"title": "Tán gẫu",
|
||||
"titleWithPolls": "Tán gẫu",
|
||||
"title": "Cuộc hội thoại",
|
||||
"titleWithPolls": "Cuộc hội thoại",
|
||||
"you": "bạn"
|
||||
},
|
||||
"connectingOverlay": {
|
||||
"joiningRoom": "Đang kết nối tới cuộc họp của bạn…"
|
||||
"joiningRoom": "Đang kết nối tới cuộc họp của bạn..."
|
||||
},
|
||||
"connection": {
|
||||
"ATTACHED": "Đã đính kèm",
|
||||
@@ -78,35 +78,35 @@
|
||||
},
|
||||
"connectionindicator": {
|
||||
"address": "Địa chỉ:",
|
||||
"bandwidth": "Băng thông ước tính:",
|
||||
"bandwidth": "Băng thông:",
|
||||
"bitrate": "Tốc độ:",
|
||||
"bridgeCount": "Máy chủ:",
|
||||
"connectedTo": "Đã kết nối tới:",
|
||||
"framerate": "Tỷ lệ khung hình:",
|
||||
"framerate": "FPS:",
|
||||
"less": "Hiển thị ít hơn",
|
||||
"localaddress_0": "Địa chỉ địa phương:",
|
||||
"localaddress_1": "Các địa chỉ địa phương:",
|
||||
"localport_0": "Cổng địa phương:",
|
||||
"localport_1": "Các cổng địa phương:",
|
||||
"localaddress_0": "IP thiết bị:",
|
||||
"localaddress_1": "Các IP thiết bị:",
|
||||
"localport_0": "Cổng thiết bị:",
|
||||
"localport_1": "Các cổng thiết bị:",
|
||||
"more": "Hiển thị nhiều hơn",
|
||||
"packetloss": "Mất gói tin:",
|
||||
"participant_id": "ID của người tham dự:",
|
||||
"packetloss": "Dữ liệu hỏng:",
|
||||
"participant_id": "ID người tham dự:",
|
||||
"quality": {
|
||||
"good": "Tốt",
|
||||
"inactive": "Không active",
|
||||
"inactive": "Đang treo máy",
|
||||
"lost": "Mất kết nối",
|
||||
"nonoptimal": "Không tối ưu",
|
||||
"poor": "Kém chất lượng"
|
||||
},
|
||||
"remoteaddress_0": "Địa chỉ từ xa:",
|
||||
"remoteaddress_1": "Các địa chỉ từ xa:",
|
||||
"remoteaddress_0": "IP từ xa:",
|
||||
"remoteaddress_1": "Các IP từ xa:",
|
||||
"remoteport_0": "Cổng từ xa:",
|
||||
"remoteport_1": "Các cổng từ xa:",
|
||||
"resolution": "Độ phân giải:",
|
||||
"status": "Kết nối:",
|
||||
"status": "Trạng thái kết nối:",
|
||||
"transport_0": "Vận chuyển:",
|
||||
"transport_1": "Các vận chuyển:",
|
||||
"turn": "turn"
|
||||
"turn": "lượt"
|
||||
},
|
||||
"dateUtils": {
|
||||
"earlier": "Sớm hơn",
|
||||
@@ -114,27 +114,27 @@
|
||||
"yesterday": "Hôm qua"
|
||||
},
|
||||
"deepLinking": {
|
||||
"appNotInstalled": "Bạn cần ứng dụng {{app}} mobile để tham gia vào cuộc họp này bằng điện thoại.",
|
||||
"description": "Không có gì diễn ra? Chúng tôi đang chạy cuộc họp trên ứng dụng desktop {{app}}. Thử lại hoặc chạy trên ứng dụng web {{app}}.",
|
||||
"descriptionWithoutWeb": "",
|
||||
"downloadApp": "Tải phần mềm",
|
||||
"launchWebButton": "Chạy trên web",
|
||||
"openApp": "Tiếp tục ứng dụng này",
|
||||
"appNotInstalled": "Bạn cần ứng dụng {{app}} để tham gia vào cuộc họp này bằng điện thoại.",
|
||||
"description": "Chúng tôi đã yêu cầu chạy cuộc họp trên ứng dụng {{app}}, ứng dụng vẫn không mở? Thử lại hoặc chạy trên trang web.",
|
||||
"descriptionWithoutWeb": "Chúng tôi đã yêu cầu chạy cuộc họp trên ứng dụng {{app}}, ứng dụng vẫn không mở? Hãy thử lại.",
|
||||
"downloadApp": "Tải ứng dụng",
|
||||
"launchWebButton": "Chạy trên trang web",
|
||||
"openApp": "Tiếp tục trên ứng dụng này",
|
||||
"title": "Thực hiện cuộc họp trên {{app}}…",
|
||||
"tryAgainButton": "Thử lại trên desktop"
|
||||
"tryAgainButton": "Thử lại"
|
||||
},
|
||||
"defaultLink": "ví dụ: {{url}}",
|
||||
"defaultLink": "Ví dụ: {{url}}",
|
||||
"deviceError": {
|
||||
"cameraError": "Truy cập camera thất bại",
|
||||
"cameraPermission": "Lỗi đọc quyền của camera",
|
||||
"microphoneError": "Truy cập Microphone thất bại",
|
||||
"microphonePermission": "Lỗi đọc quyền của microphone"
|
||||
"cameraPermission": "Lỗi cấp quyền camera",
|
||||
"microphoneError": "Truy cập micro thất bại",
|
||||
"microphonePermission": "Lỗi cấp quyền micro"
|
||||
},
|
||||
"deviceSelection": {
|
||||
"noPermission": "Không được cấp quyền",
|
||||
"previewUnavailable": "Xem trước không khả dụng",
|
||||
"selectADevice": "Chọn một thiết bị",
|
||||
"testAudio": "Chạy thử tệp âm thanh"
|
||||
"testAudio": "Phát thử âm thanh"
|
||||
},
|
||||
"dialOut": {
|
||||
"statusMessage": "hiện đang {{status}}"
|
||||
@@ -142,38 +142,38 @@
|
||||
"dialog": {
|
||||
"Back": "Quay lại",
|
||||
"Cancel": "Hủy",
|
||||
"IamHost": "Tôi là chủ nghị",
|
||||
"Ok": "Được",
|
||||
"IamHost": "Mình là quản trị viên",
|
||||
"Ok": "Đồng ý",
|
||||
"Remove": "Xóa",
|
||||
"Share": "Chia sẻ",
|
||||
"Submit": "Đăng ký",
|
||||
"WaitForHostMsg": "Cuộc họp chưa được khởi tạo. Nếu bạn là chủ nghị vui lòng xác thực. Nếu không, vui lòng đợi chủ nghị.",
|
||||
"WaitingForHost": "Đang đợi chủ nghị …",
|
||||
"WaitForHostMsg": "Cuộc họp chưa được bắt đầu. Nếu bạn là quản trị viên vui lòng xác thực. Nếu không, vui lòng đợi quản trị viên.",
|
||||
"WaitingForHost": "Đang đợi quản trị viên...",
|
||||
"Yes": "Có",
|
||||
"accessibilityLabel": {
|
||||
"liveStreaming": "Phát trực tuyến"
|
||||
},
|
||||
"allow": "Cho phép",
|
||||
"alreadySharedVideoMsg": "",
|
||||
"alreadySharedVideoTitle": "Mỗi lúc chỉ một người được chia sẻ video.",
|
||||
"alreadySharedVideoTitle": "Chỉ một người được chia sẻ video đồng thời.",
|
||||
"applicationWindow": "Cửa sổ ứng dụng",
|
||||
"cameraConstraintFailedError": "Camera của bạn không đáp ứng được một số yêu cầu bắt buộc.",
|
||||
"cameraNotFoundError": "Không tìm thấy camera.",
|
||||
"cameraNotSendingData": "Không truy cập được camera của bạn. Kiểm tra xem có ứng dung khác đang sử dụng camera không, hoặc chọn một camera khác trong phần cài đặt, hay tải lại ứng dụng",
|
||||
"cameraNotSendingDataTitle": "Không truy cập được camera",
|
||||
"cameraPermissionDeniedError": "Bạn chưa cho phép sử dụng camera của mình. Bạn vẫn có thể tham gia hội nghị nhưng những người khác sẽ không nhìn thấy bạn. Sử dụng nút camera trên thanh địa chỉ để sửa lỗi này.",
|
||||
"cameraUnknownError": "Không thể sử dụng camera vì lý do không rõ ràng.",
|
||||
"cameraPermissionDeniedError": "Bạn chưa cho phép sử dụng camera của mình. Bạn vẫn có thể tham gia cuộc họp nhưng những người khác sẽ không nhìn thấy bạn. Sử dụng nút camera trên thanh điều hướng để sửa lỗi này.",
|
||||
"cameraUnknownError": "Không thể sử dụng camera vì một lý do không xác định.",
|
||||
"cameraUnsupportedResolutionError": "Camera của bạn không hỗ trợ độ phân giải video yêu cầu.",
|
||||
"close": "Đóng",
|
||||
"conferenceDisconnectMsg": "Bạn có thể muốn kiểm tra kết nối mạng của mình. Đang kết nối lại trong {{seconds}} giây…",
|
||||
"conferenceDisconnectMsg": "Bạn có thể cần kiểm tra kết nối mạng của mình. Đang kết nối lại trong {{seconds}} giây...",
|
||||
"conferenceDisconnectTitle": "Bạn đã bị ngắt kết nối.",
|
||||
"conferenceReloadMsg": "Chúng tôi đang cố gắng sửa lỗi này. Đang kết nối lại trong {{seconds}} giây…",
|
||||
"conferenceReloadTitle": "Thật không may, có điều gì đó đã sai.",
|
||||
"conferenceReloadMsg": "Chúng tôi đang cố gắng sửa lỗi này. Đang kết nối lại trong {{seconds}} giây...",
|
||||
"conferenceReloadTitle": "Thật không may, đã có lỗi xảy ra.",
|
||||
"confirm": "Xác nhận",
|
||||
"confirmNo": "Không",
|
||||
"confirmYes": "Có",
|
||||
"connectError": "Rất tiếc! Đã xảy ra sự cố và chúng tôi không thể kết nối với hội nghị.",
|
||||
"connectErrorWithMsg": "Rất tiếc! Đã xảy ra sự cố và chúng tôi không thể kết nối với hội nghị: {{msg}}",
|
||||
"connectError": "Rất tiếc! Đã xảy ra sự cố và chúng tôi không thể kết nối với cuộc họp.",
|
||||
"connectErrorWithMsg": "Rất tiếc! Đã xảy ra sự cố và chúng tôi không thể kết nối với cuộc họp. Nguyên nhân: {{msg}}",
|
||||
"connecting": "Đang kết nối",
|
||||
"contactSupport": "Liên hệ hỗ trợ kỹ thuật",
|
||||
"copy": "Sao chép",
|
||||
@@ -189,39 +189,39 @@
|
||||
"externalInstallationTitle": "Yêu cầu tiện ích mở rộng",
|
||||
"goToStore": "Đi tới cửa hàng trên mạng",
|
||||
"gracefulShutdown": "Dịch vụ của chúng tôi hiện đang bảo trì. Vui lòng thử lại sau.",
|
||||
"grantModeratorDialog": " Bạn có thực sự muốn cấp quyền quản trị cho người này?",
|
||||
"grantModeratorDialog": "Bạn có thực sự muốn cấp quyền quản trị cho người này?",
|
||||
"incorrectPassword": "Tên người dùng hoặc mật khẩu không đúng",
|
||||
"incorrectRoomLockPassword": "",
|
||||
"incorrectRoomLockPassword": "Mật khẩu không đúng",
|
||||
"inlineInstallExtension": "Cài đặt ngay",
|
||||
"inlineInstallationMsg": "Bạn cần cài đặt tiện ích mở rộng chia sẻ máy tính của chúng tôi.",
|
||||
"internalError": "Duh! Có lỗi xẩy ra. Lỗi cụ thể là: {{error}}",
|
||||
"internalError": "Đã có lỗi xảy ra. Chi tiết: {{error}}",
|
||||
"internalErrorTitle": "Lỗi cục bộ",
|
||||
"kickMessage": "",
|
||||
"kickParticipantButton": "Đẩy ra",
|
||||
"kickParticipantDialog": "Bạn có chắc muốn đẩy người này ra?",
|
||||
"kickParticipantButton": "Đuổi ra",
|
||||
"kickParticipantDialog": "Bạn có chắc muốn đuổi người này ra?",
|
||||
"kickParticipantTitle": "Tắt tiếng của người tham dự này?",
|
||||
"kickTitle": "",
|
||||
"liveStreaming": "Phát trực tuyến",
|
||||
"liveStreamingDisabledForGuestTooltip": "Khách không thể phát trực tuyến.",
|
||||
"liveStreamingDisabledTooltip": "Khởi tạo phát trực tuyến đã tắt.",
|
||||
"lockMessage": "Khóa hội nghị thất bại.",
|
||||
"lockMessage": "Khóa cuộc họp thất bại.",
|
||||
"lockRoom": "",
|
||||
"lockTitle": "Khóa thất bại",
|
||||
"logoutQuestion": "Bạn có chắc chắn muốn đăng xuất và dừng hội nghị?",
|
||||
"logoutQuestion": "Bạn có chắc chắn muốn đăng xuất và dừng cuộc họp?",
|
||||
"logoutTitle": "Đăng xuất",
|
||||
"maxUsersLimitReached": "",
|
||||
"maxUsersLimitReachedTitle": "",
|
||||
"micConstraintFailedError": "Microphone của bạn không đáp ứng được một số yêu cầu bắt buộc.",
|
||||
"micNotFoundError": "Không tìm thấy microphone.",
|
||||
"micConstraintFailedError": "Micro của bạn không đáp ứng được một số yêu cầu bắt buộc.",
|
||||
"micNotFoundError": "Không tìm thấy micro.",
|
||||
"micNotSendingData": "",
|
||||
"micNotSendingDataTitle": "",
|
||||
"micPermissionDeniedError": "Bạn chưa cấp phép sử dụng microphone của bạn. Bạn vẫn có thể tham gia hội nghị nhưng những người khác sẽ không nghe thấy bạn. Sử dụng nút camera trên thanh địa chỉ để sửa lỗi này.",
|
||||
"micUnknownError": "Không thể sử dụng microphone vì lý do không rõ ràng.",
|
||||
"micPermissionDeniedError": "Bạn chưa cấp phép sử dụng micro của bạn. Bạn vẫn có thể tham gia hội nghị nhưng những người khác sẽ không nghe thấy bạn. Sử dụng nút micro trên thanh điều hướng để sửa lỗi này.",
|
||||
"micUnknownError": "Không thể sử dụng micro vì một lý do không xác định.",
|
||||
"muteEveryoneDialog": " Bạn có thực sự muốn tắt tiếng tất cả mọi người? Bạn sẽ không thể bật lại tiếng cho họ nhưng họ có thể tự mở tiếng lại bất kỳ lúc nào.",
|
||||
"muteEveryoneElseDialog": "Một khi đã tắt tiếng, bạn không thể bật lại. Nhưng họ có thể tự mở tiếng lại bất kỳ lúc nào.",
|
||||
"muteEveryoneElseTitle": "Tắt tiếng tất cả ngoại trừ {{whom}}?",
|
||||
"muteEveryoneTitle": "Tắt tiếng tất cả mọi người?",
|
||||
"muteEveryonesVideoDialog": " Bạn có chắc muốn tắt camera của tất cả mọi người? Bạn không thể mở lại camera của người tham dự nhưng họ có thể mở lại bất kỳ lúc nào.",
|
||||
"muteEveryonesVideoDialog": "Bạn có chắc muốn tắt camera của tất cả mọi người? Bạn không thể mở lại camera của người tham dự nhưng họ có thể mở lại bất kỳ lúc nào.",
|
||||
"muteEveryonesVideoTitle": "Tắt camera của tất cả mọi người?",
|
||||
"muteParticipantBody": "Bạn không thể tắt tiếng của họ, nhưng họ có thể tự tắt tiếng bất cứ lúc nào.",
|
||||
"muteParticipantButton": "Tắt tiếng",
|
||||
@@ -234,12 +234,12 @@
|
||||
"passwordNotSupported": "Phòng họp không hỗ trợ khóa bằng mật khẩu.",
|
||||
"passwordNotSupportedTitle": "",
|
||||
"passwordRequired": "",
|
||||
"popupError": "Trình duyệt của bạn đã chặn cửa sổ pop-up từ website hiện hành. Làm ơn cho phép pop-up trong cài đặt của trình duyệt và thử lại",
|
||||
"popupError": "Trình duyệt của bạn đã chặn cửa sổ pop-up từ trang web hiện tại. Vui lòng cho phép pop-up trong cài đặt của trình duyệt và thử lại",
|
||||
"popupErrorTitle": "Cửa sổ Pop-Up bị chặn",
|
||||
"recording": "Đang ghi âm",
|
||||
"recording": "Đang ghi hình",
|
||||
"recordingDisabledForGuestTooltip": "Khách không thể khởi tạo ghi hình.",
|
||||
"recordingDisabledTooltip": "Khởi động ghi âm đã bị tắt.",
|
||||
"rejoinNow": "Tham gia lại luôn",
|
||||
"recordingDisabledTooltip": "Khởi động ghi hình đã bị tắt.",
|
||||
"rejoinNow": "Tham gia lại ngay",
|
||||
"remoteControlAllowedMessage": "{{user}} đã chấp nhận yêu cầu điều khiển từ xa của bạn!",
|
||||
"remoteControlDeniedMessage": "{{user}} đã từ chối yêu cầu điều khiển từ xa của bạn!",
|
||||
"remoteControlErrorMessage": "Đã xảy ra lỗi khi cố gắng yêu cầu quyền điều khiển từ xa từ {{user}}!",
|
||||
@@ -254,11 +254,11 @@
|
||||
"reservationErrorMsg": "Mã lỗi: {{code}}, thông báo: {{msg}}",
|
||||
"retry": "Thử lại",
|
||||
"screenSharingAudio": "Chia sẻ âm thanh",
|
||||
"screenSharingFailedToInstall": "Duh! Không cài đặt được bộ mở rộng chia sẻ màn hình",
|
||||
"screenSharingFailedToInstallTitle": "Duh! Bộ mở rộng chia sẻ màn hình có vấn đề với cấu hình bảo mật. Làm ơn tải và thử lại ",
|
||||
"screenSharingFailedToInstall": "Lỗi! Không cài đặt được bộ mở rộng chia sẻ màn hình",
|
||||
"screenSharingFailedToInstallTitle": "Lỗi! Bộ mở rộng chia sẻ màn hình có vấn đề với cấu hình bảo mật. Vui lòng tải và thử lại ",
|
||||
"screenSharingFirefoxPermissionDeniedError": "Có gì đó sai khi chúng tôi cố gắng chia sẻ màn hình của bạn. Vui lòng đảm bảo bạn đã cho phép chúng tôi thực hiện.",
|
||||
"screenSharingFirefoxPermissionDeniedTitle": "Chúng tôi không thể chia sẻ màn hình!",
|
||||
"screenSharingPermissionDeniedError": "Không thể truy cập micro",
|
||||
"screenSharingPermissionDeniedError": "Không thể truy cập màn hình do lỗi cấp quyền",
|
||||
"serviceUnavailable": "Dịch vụ không khả dụng",
|
||||
"sessTerminated": "Cuộc gọi kết thúc",
|
||||
"shareVideoLinkError": "Vui lòng cung cấp liên kết chính xác.",
|
||||
@@ -267,13 +267,13 @@
|
||||
"shareYourScreenDisabled": "Chia sẻ màn hình đã tắt.",
|
||||
"shareYourScreenDisabledForGuest": "Khách không thể chia sẻ màn hình.",
|
||||
"startLiveStreaming": "Bắt đầu phát trực tuyến",
|
||||
"startRecording": "Bắt đầu ghi âm",
|
||||
"startRecording": "Bắt đầu ghi hình",
|
||||
"startRemoteControlErrorMessage": "Có lỗi khi thử khởi động phiên điều khiển từ xa",
|
||||
"stopLiveStreaming": "Dừng phát trực tuyến",
|
||||
"stopRecording": "Dừng ghi âm",
|
||||
"stopRecordingWarning": "Bạn có chắc chắn muốn dừng ghi âm không?",
|
||||
"stopRecording": "Dừng ghi hình",
|
||||
"stopRecordingWarning": "Bạn có chắc chắn muốn dừng ghi hình không?",
|
||||
"stopStreamingWarning": "Bạn có chắc chắn muốn dừng phát trực tuyến?",
|
||||
"streamKey": "Key phát trực tuyến",
|
||||
"streamKey": "Mã phát trực tuyến",
|
||||
"thankYou": "Cám ơn bạn đã sử dụng {{appName}}!",
|
||||
"token": "mã thông báo",
|
||||
"tokenAuthFailed": "Rất tiếc, bạn không được phép tham gia cuộc gọi này.",
|
||||
@@ -308,13 +308,13 @@
|
||||
"cancelPassword": "",
|
||||
"conferenceURL": "Liên kết:",
|
||||
"country": "Quốc gia",
|
||||
"dialANumber": "Để tham gia cuộc họp của bạn, quay một trong các số sau và nhập mã.",
|
||||
"dialANumber": "Để tham gia cuộc họp của bạn, gọi một trong các số sau và nhập mã.",
|
||||
"dialInConferenceID": "Mã:",
|
||||
"dialInNotSupported": "Xin lỗi, quay số không được hỗ trợ.",
|
||||
"dialInNumber": "Quay số:",
|
||||
"dialInSummaryError": "Lỗi nạp thông tin quay số. Vui lòng thử lại.",
|
||||
"dialInTollFree": "Miễn phí",
|
||||
"genericError": "Chà, có gì đó không ổn.",
|
||||
"genericError": "Lỗi, có gì đó không ổn.",
|
||||
"inviteLiveStream": "Để xem phát trực tuyến cuộc họp này, chọn liên kết: {{url}}",
|
||||
"invitePhone": "",
|
||||
"invitePhoneAlternatives": "",
|
||||
@@ -333,10 +333,10 @@
|
||||
"tooltip": "Chia sẻ liên kết và thông tin quay số của cuộc họp này"
|
||||
},
|
||||
"inlineDialogFailure": {
|
||||
"msg": "Chúng tôi hơi vấp chút.",
|
||||
"msg": "Chúng tôi đang xảy ra chút lỗi.",
|
||||
"retry": "Thử lại",
|
||||
"support": "Hỗ trợ",
|
||||
"supportMsg": "Nếu vẫn xảy ra, hãy liên hệ với"
|
||||
"supportMsg": "Nếu vẫn xảy ra, hãy liên hệ với "
|
||||
},
|
||||
"inviteDialog": {
|
||||
"alertText": "Không thể mời một vài người.",
|
||||
@@ -347,20 +347,20 @@
|
||||
"send": "Gửi"
|
||||
},
|
||||
"keyboardShortcuts": {
|
||||
"focusLocal": "Tập trung vào video của bạn",
|
||||
"focusRemote": "Tập trung vào hình ảnh của người khác",
|
||||
"focusLocal": "Tập trung vào khung hình của bạn",
|
||||
"focusRemote": "Tập trung vào khung hình của người khác",
|
||||
"fullScreen": "Xem hoặc thoát chế độ toàn màn hình",
|
||||
"keyboardShortcuts": "Phím tắt",
|
||||
"localRecording": "Hiện hoặc ẩn Kiểm soát ghi hình cục bộ",
|
||||
"mute": "Tắt hoặc bật microphone của bạn",
|
||||
"mute": "Tắt hoặc bật micro của bạn",
|
||||
"pushToTalk": "Ấn chuông để nói chuyện",
|
||||
"raiseHand": "Giơ hoặc Hạ tay",
|
||||
"raiseHand": "Giơ hoặc hạ tay",
|
||||
"showSpeakerStats": "Hiển thị thống kê của diễn giả",
|
||||
"toggleChat": "Mở hoặc Đóng cuộc hội thoại",
|
||||
"toggleChat": "Mở hoặc đóng cuộc hội thoại",
|
||||
"toggleFilmstrip": "Hiện hoặc ẩn hình ảnh thu nhỏ",
|
||||
"toggleScreensharing": "Chuyển đổi giữa camera và chia sẻ màn hình",
|
||||
"toggleShortcuts": "Hiện hoặc ẩn phím tắt",
|
||||
"videoMute": "Bật hoặc Tắt camera của bạn"
|
||||
"videoMute": "Bật hoặc tắt camera của bạn"
|
||||
},
|
||||
"liveStreaming": {
|
||||
"busy": "Chúng tôi đang giải phóng tài nguyên streaming. Xin thử lại sau vài phút.",
|
||||
@@ -374,13 +374,13 @@
|
||||
"errorLiveStreamNotEnabled": "Phát trực tuyến không được bật với email {{email}}. Vui lòng bật phát trực tuyến hoặc truy cập một tài khoản đã bật phát trực tuyến.",
|
||||
"expandedOff": "Phát trực tuyến đã dừng",
|
||||
"expandedOn": "Cuộc họp đang được phát trên Youtube.",
|
||||
"expandedPending": "Phát trực tuyến đang bắt đầu…",
|
||||
"expandedPending": "Phát trực tuyến đang bắt đầu...",
|
||||
"failedToStart": "Không thể bắt đầu phát trực tuyến",
|
||||
"getStreamKeyManually": "Không thể thu nhận phát trực tuyến nào. Thử lấy mã phát trực tuyến từ Youtube.",
|
||||
"invalidStreamKey": "Mã phát trực tuyến có thể sai.",
|
||||
"off": "Phát trực tuyến đã dừng",
|
||||
"on": "Phát trực tuyến",
|
||||
"pending": "Đang bắt đầu phát trực tuyến…",
|
||||
"pending": "Đang bắt đầu phát trực tuyến...",
|
||||
"serviceName": "Dịch vụ Phát trực tuyến",
|
||||
"signIn": "Đăng nhập với Google",
|
||||
"signInCTA": "Đăng nhập hoặc nhập key phát trực tuyến từ Youtube.",
|
||||
@@ -389,7 +389,7 @@
|
||||
"start": "Bắt đầu phát trực tuyến",
|
||||
"streamIdHelp": "Đây là gì?",
|
||||
"title": "Phát trực tuyến",
|
||||
"unavailableTitle": "Không Live Stream được"
|
||||
"unavailableTitle": "Không thể hát trực tuyến"
|
||||
},
|
||||
"localRecording": {
|
||||
"clientState": {
|
||||
@@ -401,23 +401,23 @@
|
||||
"duration": "Thời lượng",
|
||||
"durationNA": "Không",
|
||||
"encoding": "Mã hóa",
|
||||
"label": "Trời ơi",
|
||||
"label": "Ghi hình",
|
||||
"labelToolTip": "Ghi hình cục bộ đang bận",
|
||||
"localRecording": "Ghi hình cục bộ",
|
||||
"me": "Tôi",
|
||||
"messages": {
|
||||
"engaged": "Ghi hình cục bộ đã bận.",
|
||||
"finished": "Phiên ghi hình {{token}} đã kết thúc. Vui lòng gửi tệp ghi hình cho người điều hành.",
|
||||
"finishedModerator": "Token phiên ghi hình {{token}} đã kết thúc. Ghi hình cục bộ đã được lưu. Vui lòng hỏi những người tham gia khác để cung cấp ghi hình của họ.",
|
||||
"finishedModerator": "Phiên ghi hình {{token}} đã kết thúc. Ghi hình cục bộ đã được lưu. Vui lòng hỏi những người tham gia khác để cung cấp ghi hình của họ.",
|
||||
"notModerator": "Bạn không phải người điều hành. Bạn không thể khởi tạo hoặc dừng ghi hình."
|
||||
},
|
||||
"moderator": "Quản trị viên",
|
||||
"no": "Không",
|
||||
"participant": "Người tham gia",
|
||||
"participantStats": "Trạng thái người tham gia",
|
||||
"participant": "Người tham dự",
|
||||
"participantStats": "Thống kê người tham dự",
|
||||
"sessionToken": "Mã phiên",
|
||||
"start": "Bắt đầu ghi âm",
|
||||
"stop": "Dừng ghi âm",
|
||||
"start": "Bắt đầu ghi hình",
|
||||
"stop": "Dừng ghi hình",
|
||||
"yes": "Có"
|
||||
},
|
||||
"lockRoomPassword": "Mật khẩu",
|
||||
@@ -425,32 +425,32 @@
|
||||
"me": "Tôi",
|
||||
"notify": {
|
||||
"connectedOneMember": "{{name}} đã tham gia cuộc họp",
|
||||
"connectedThreePlusMembers": "{{name}} và{{count}} khác đã tham gia cuộc họp",
|
||||
"connectedTwoMembers": "{{first}} và{{second}} đã tham gia cuộc họp",
|
||||
"connectedThreePlusMembers": "{{name}} và {{count}} người khác đã tham gia cuộc họp",
|
||||
"connectedTwoMembers": "{{first}} và {{second}} đã tham gia cuộc họp",
|
||||
"disconnected": "đã ngắt kết nối",
|
||||
"focus": "Hội nghị tập trung",
|
||||
"focus": "Cuộc họp tập trung",
|
||||
"focusFail": "{{component}} không khả dụng - thử lại trong {{ms}} giây",
|
||||
"grantedTo": "Quyền của người điều hành đã được cấp cho {{to}}!",
|
||||
"grantedTo": "Quyền quản trị viên đã được cấp cho {{to}}!",
|
||||
"invitedOneMember": "{{name}} đã được mời",
|
||||
"invitedThreePlusMembers": "",
|
||||
"invitedTwoMembers": "",
|
||||
"kickParticipant": "",
|
||||
"me": "Tôi",
|
||||
"moderator": "Quyền của người điều hành đã được cấp!",
|
||||
"moderator": "Quyền quản trị viên đã được cấp!",
|
||||
"muted": "Bạn đã bắt đầu cuộc trò chuyện bị tắt tiếng.",
|
||||
"mutedRemotelyDescription": "",
|
||||
"mutedRemotelyTitle": "",
|
||||
"mutedTitle": "Bạn bị tắt tiếng!",
|
||||
"newDeviceAction": "Sử dụng",
|
||||
"newDeviceAudioTitle": "Thiết bị âm thanh mới được phát hiện",
|
||||
"newDeviceCameraTitle": "Camera mới được phát hiện",
|
||||
"newDeviceCameraTitle": "Thiết bị camera mới được phát hiện",
|
||||
"passwordRemovedRemotely": "",
|
||||
"passwordSetRemotely": "",
|
||||
"raisedHand": "{{name}} muốn phát biểu.",
|
||||
"somebody": "Ai đó",
|
||||
"startSilentDescription": "",
|
||||
"startSilentTitle": "",
|
||||
"suboptimalExperienceDescription": "Chúng tôi lo rằng trải nghiệm của bạn với {{appName}} đang không tốt. Chúng tôi đang tìm cách cải thiện, hiện tại thử một trong <a href='{{recommendedBrowserPageLink}}' target='_blank'>các trình duyệt được hỗ trợ</a>.",
|
||||
"suboptimalExperienceDescription": "Chúng tôi lo rằng trải nghiệm của bạn với {{appName}} đang không tốt. Chúng tôi đang tìm cách cải thiện, hiện tại thử một trong <a href='{{recommendedBrowserPageLink}}' target='_blank'>các trình duyệt được hỗ trợ</a>.",
|
||||
"suboptimalExperienceTitle": "Cảnh báo trình duyệt",
|
||||
"unmute": ""
|
||||
},
|
||||
@@ -461,7 +461,7 @@
|
||||
"mute": "Tắt tiếng",
|
||||
"muteAll": "Tắt tiếng tất cả mọi người",
|
||||
"muteEveryoneElse": "Tắt tiếng tất cả những người khác",
|
||||
"startModeration": "Unmute themselves or start video",
|
||||
"startModeration": "Tự bật tiếng hoặc bắt đầu video",
|
||||
"stopEveryonesVideo": "Tắt hình của tất cả mọi người",
|
||||
"stopVideo": "Tắt hình",
|
||||
"unblockEveryoneMicCamera": "Mở khóa camera và micro của tất cả mọi người"
|
||||
@@ -492,7 +492,7 @@
|
||||
"profile": {
|
||||
"setDisplayNameLabel": "Nhập tên hiển thị của bạn",
|
||||
"setEmailInput": "Nhập địa chỉ email",
|
||||
"setEmailLabel": "Nhập địa chỉ Gravatar thư điện tử của bạn",
|
||||
"setEmailLabel": "Nhập địa chỉ email tài khoản Gravatar của bạn",
|
||||
"title": "Hồ sơ"
|
||||
},
|
||||
"recording": {
|
||||
@@ -501,28 +501,28 @@
|
||||
"beta": "Bản thử nghiệm",
|
||||
"busy": "Chương trình đang bận giải phóng tài nguyên thu hình. Xin thử lại sau vài phút.",
|
||||
"busyTitle": "Tất cả các đầu ghi hình hiện đang bận.",
|
||||
"error": "Ghi âm không thành công. Vui lòng thử lại.",
|
||||
"error": "Ghi hình không thành công. Vui lòng thử lại.",
|
||||
"expandedOff": "Ghi hình đã dừng",
|
||||
"expandedOn": "Cuộc họp đang được ghi hình.",
|
||||
"expandedPending": "Ghi hình đang khởi động…",
|
||||
"failedToStart": "Khởi động ghi âm thất bại",
|
||||
"expandedPending": "Ghi hình đang khởi động...",
|
||||
"failedToStart": "Khởi động ghi hình thất bại",
|
||||
"fileSharingdescription": "Chia sẻ ghi hình với người tham gia họp",
|
||||
"live": "Trực tuyến",
|
||||
"loggedIn": "Đã đăng nhập dưới tên {{userName}}",
|
||||
"off": "Đã ngừng ghi âm",
|
||||
"on": "Đang ghi âm",
|
||||
"pending": "Đang chuẩn bị để ghi hình cuộc họp…",
|
||||
"off": "Đã ngừng ghi hình",
|
||||
"on": "Đang ghi hình",
|
||||
"pending": "Đang chuẩn bị để ghi hình cuộc họp...",
|
||||
"rec": "REC",
|
||||
"serviceDescription": "Ghi hình của bạn sẽ được lưu bởi dịch vụ ghi hình",
|
||||
"serviceName": "Dịch vụ ghi hình",
|
||||
"signIn": "Đăng nhập",
|
||||
"signOut": "Đăng xuất",
|
||||
"title": "Đang ghi âm",
|
||||
"title": "Đang ghi hình",
|
||||
"unavailable": "Rất tiếc! Dịch vụ {{serviceName}} đang không sẵn sàng. Chúng tôi đang xử lý vấn đề này. Vui lòng thử lại sau.",
|
||||
"unavailableTitle": "Ghi hình không hoạt động."
|
||||
},
|
||||
"sectionList": {
|
||||
"pullToRefresh": "Kéo để làm tươi"
|
||||
"pullToRefresh": "Kéo để làm mới"
|
||||
},
|
||||
"security": {
|
||||
"about": "Bạn có thể thiết lập mật khẩu cho cuộc họp. Người tham dự cần phải nhập mật khẩu trước khi được phép vào phòng họp.",
|
||||
@@ -547,7 +547,7 @@
|
||||
"noDevice": "Không",
|
||||
"selectAudioOutput": "Đầu ra âm thanh",
|
||||
"selectCamera": "Camera",
|
||||
"selectMic": "Microphone",
|
||||
"selectMic": "Micro",
|
||||
"startAudioMuted": "Mọi người bắt đầu đều bị tắt tiếng",
|
||||
"startVideoMuted": "Mọi người bắt đầu đều bị ẩn",
|
||||
"title": "Cài đặt"
|
||||
@@ -557,14 +557,14 @@
|
||||
"alertTitle": "Cảnh báo",
|
||||
"alertURLText": "URL máy chủ đã nhập không hợp lệ",
|
||||
"buildInfoSection": "Thông tin phiên bản",
|
||||
"conferenceSection": "Hội nghị",
|
||||
"conferenceSection": "Cuộc họp",
|
||||
"displayName": "Tên hiển thị",
|
||||
"email": "Email",
|
||||
"header": "Cài đặt",
|
||||
"profileSection": "Hồ sơ",
|
||||
"serverURL": "URL máy chủ",
|
||||
"startWithAudioMuted": "Bắt đầu mà không thu tiếng",
|
||||
"startWithVideoMuted": "Bắt đầu không thu hình",
|
||||
"startWithAudioMuted": "Bắt đầu không mở tiếng",
|
||||
"startWithVideoMuted": "Bắt đầu không hiện hình",
|
||||
"version": "Phiên bản"
|
||||
},
|
||||
"share": {
|
||||
@@ -573,72 +573,72 @@
|
||||
},
|
||||
"speaker": "Diễn giả",
|
||||
"speakerStats": {
|
||||
"hours": "{{count}}h",
|
||||
"minutes": "{{count}}m",
|
||||
"hours": "{{count}} giờ",
|
||||
"minutes": "{{count}} phút",
|
||||
"name": "Tên",
|
||||
"seconds": "{{count}}s",
|
||||
"seconds": "{{count}} giây",
|
||||
"speakerStats": "Thống kê về diễn giả",
|
||||
"speakerTime": "Thời gian của diễn giả"
|
||||
},
|
||||
"startupoverlay": {
|
||||
"policyText": " ",
|
||||
"title": "{{app}} cần sử dụng microphone và camera của bạn."
|
||||
"title": "{{app}} cần sử dụng micro và camera của bạn."
|
||||
},
|
||||
"suspendedoverlay": {
|
||||
"rejoinKeyTitle": "Tham gia lại",
|
||||
"text": "Bấm nút <i> Rejoin </i> để kết nối lại.",
|
||||
"title": "Cuộc gọi hình của bạn bị gián đoạn vì máy tính này chuyển sang trạng thái ngủ."
|
||||
"text": "Bấm nút <i> Tham gia lại </i> để kết nối lại.",
|
||||
"title": "Cuộc họp của bạn bị gián đoạn vì máy tính này chuyển sang trạng thái ngủ."
|
||||
},
|
||||
"toolbar": {
|
||||
"Settings": "Cài đặt",
|
||||
"accessibilityLabel": {
|
||||
"Settings": "Mở/Đóng Cấu hình",
|
||||
"audioOnly": "Chuyển sang chỉ tiếng",
|
||||
"audioOnly": "Chuyển sang chỉ nghe âm thanh",
|
||||
"audioRoute": "Chọn thiết bị âm thanh",
|
||||
"callQuality": "",
|
||||
"cc": "Mở/Đóng phụ đề",
|
||||
"chat": "Mở/Đóng cửa sổ Chat",
|
||||
"chat": "Mở/Đóng cuộc hội thoại",
|
||||
"document": "Mở/Đóng tài liệu được chia sẻ",
|
||||
"feedback": "Để lại phản hồi",
|
||||
"fullScreen": "Mở/Đóng toàn màn hình",
|
||||
"fullScreen": "Bật/Tắt toàn màn hình",
|
||||
"grantModerator": "Cấp quyền quản trị",
|
||||
"hangup": "Rời cuộc gọi",
|
||||
"invite": "Mời người tham gia",
|
||||
"kick": "Đẩy người tham gia ra",
|
||||
"localRecording": "Mở/Đóng điều khiển ghi hình cục bộ",
|
||||
"kick": "Đuổi người tham gia ra",
|
||||
"localRecording": "Bật/Tắt điều khiển ghi hình cục bộ",
|
||||
"lockRoom": "Mở/Đóng mật khẩu phòng họp",
|
||||
"moreActions": "Mở/Đóng Thêm hành động",
|
||||
"moreActionsMenu": "Menu Thêm hành động",
|
||||
"mute": "Mở/Đóng Tắt tiếng",
|
||||
"moreActions": "Xem thêm",
|
||||
"moreActionsMenu": "Menu thêm",
|
||||
"mute": "Bật/Tắt tiếng",
|
||||
"muteEveryone": "Tắt tiếng tất cả mọi người",
|
||||
"muteEveryoneElse": "Tắt tiếng những người khác",
|
||||
"muteEveryonesVideo": "Tắt tất cả camera",
|
||||
"pip": "Mở/Đóng chế độ Hình-trong-Hình",
|
||||
"pip": "Bật/Tắt chế độ Hình-trong-Hình",
|
||||
"profile": "Chỉnh sửa hồ sơ cá nhân",
|
||||
"raiseHand": "Mở/Đóng Giơ tay",
|
||||
"recording": "Mở/Đóng Ghi hình",
|
||||
"raiseHand": "Giơ/Hạ tay",
|
||||
"recording": "Bật/Tắt ghi hình",
|
||||
"remoteMute": "Tắt tiếng người tham gia",
|
||||
"selectBackground": "Chọn hình nền",
|
||||
"shareRoom": "Mời ai đó",
|
||||
"shareYourScreen": "Mở/Đóng Chia sẻ màn hình",
|
||||
"sharedvideo": "Mở/Đóng Chia",
|
||||
"shortcuts": "Mở/Đóng Phím tắt",
|
||||
"shareYourScreen": "Bật/Tắt chia sẻ màn hình",
|
||||
"sharedvideo": "Mở/Đóng chia sẻ video",
|
||||
"shortcuts": "Bật/Tắt phím tắt",
|
||||
"show": "",
|
||||
"speakerStats": "Mở/Đóng Thống kê",
|
||||
"tileView": "Mở/Đóng Xem dạng lưới",
|
||||
"toggleCamera": "Mở/Đóng Camera",
|
||||
"speakerStats": "Mở/Đóng thống kê",
|
||||
"tileView": "Mở/Đóng xem dạng lưới",
|
||||
"toggleCamera": "Bật/Tắt Camera",
|
||||
"videoblur": "Chuyển đổi làm mờ video",
|
||||
"videomute": "Mở/Đóng Tiếng, Hình"
|
||||
"videomute": "Bật/Tắt tiếng và hình"
|
||||
},
|
||||
"addPeople": "Thêm người vào cuộc gọi",
|
||||
"audioOnlyOff": "Chế độ chỉ tắt tiếng",
|
||||
"audioOnlyOn": "Bật chế độ Chỉ âm thanh",
|
||||
"addPeople": "Thêm người vào cuộc họp",
|
||||
"audioOnlyOff": "Tắt chế độ chỉ nghe âm thanh",
|
||||
"audioOnlyOn": "Bật chế độ chỉ nghe âm thanh",
|
||||
"audioRoute": "Chọn thiết bị âm thanh",
|
||||
"audioSettings": "Cài đặt âm thanh",
|
||||
"authenticate": "Xác thực",
|
||||
"callQuality": "Chỉnh chất lượng",
|
||||
"chat": "Mở / Đóng cuộc hội thoại",
|
||||
"closeChat": "Đóng Chat",
|
||||
"chat": "Mở/Đóng cuộc hội thoại",
|
||||
"closeChat": "Đóng cuộc hội thoại",
|
||||
"documentClose": "Đóng tài liệu được chia sẻ",
|
||||
"documentOpen": "Mở tài liệu được chia sẻ",
|
||||
"enterFullScreen": "Xem toàn màn hình",
|
||||
@@ -646,29 +646,29 @@
|
||||
"exitFullScreen": "Thoát toàn màn hình",
|
||||
"exitTileView": "Thoát xem dạng lưới",
|
||||
"feedback": "Để lại phản hồi",
|
||||
"hangup": "Thoát",
|
||||
"hangup": "Rời cuộc họp",
|
||||
"invite": "Mời người tham gia",
|
||||
"login": "Đăng nhập",
|
||||
"logout": "Đăng xuất",
|
||||
"lowerYourHand": "Hạ tay",
|
||||
"moreActions": "Thêm hành động",
|
||||
"mute": "Tắt tiếng / Bật tiếng",
|
||||
"mute": "Tắt/Bật tiếng",
|
||||
"muteEveryone": "Tắt tiếng tất cả mọi người",
|
||||
"muteEveryonesVideo": "Tắt tất cả camera",
|
||||
"noisyAudioInputDesc": "Dường như micro của bạn đang tạo ra tiếng ồn. Vui lòng tắt tiếng hoặc thay thiết bị khác.",
|
||||
"noisyAudioInputTitle": "Micro của bạn dường như có nhiều tiếng ồn!",
|
||||
"openChat": "Mở Chat",
|
||||
"openChat": "Mở cuộc hội thoại",
|
||||
"participants": "Những người tham dự",
|
||||
"pip": "Vào chế độ Ảnh-trong-Ảnh",
|
||||
"profile": "Chỉnh sửa hồ sơ cá nhân",
|
||||
"raiseHand": "Giơ / Hạ tay",
|
||||
"raiseHand": "Giơ/Hạ tay",
|
||||
"raiseYourHand": "Giơ tay",
|
||||
"security": "Tùy chọn bảo mật",
|
||||
"selectBackground": "Chọn hình nền",
|
||||
"shareRoom": "Mời ai đó",
|
||||
"shareRoom": "Chia sẻ phòng",
|
||||
"sharedvideo": "Chia sẻ video",
|
||||
"shortcuts": "Xem phím tắt",
|
||||
"speakerStats": "Thống kê về diễn giả",
|
||||
"speakerStats": "Thống kê về người tham dự",
|
||||
"startScreenSharing": "Bắt đầu chia sẻ màn hình",
|
||||
"startSubtitles": "Bắt đầu phụ đề",
|
||||
"startvideoblur": "",
|
||||
@@ -676,11 +676,11 @@
|
||||
"stopSharedVideo": "Dừng video",
|
||||
"stopSubtitles": "Dừng phụ đề",
|
||||
"stopvideoblur": "",
|
||||
"talkWhileMutedPopup": "Cố gắng để nói chuyện? Bạn đang tắt tiếng.",
|
||||
"tileViewToggle": "Mở/Đóng Xem dạng lưới",
|
||||
"toggleCamera": "Mở/Đóng Camera",
|
||||
"talkWhileMutedPopup": "Đang nói chuyện? Bạn đang tắt tiếng.",
|
||||
"tileViewToggle": "Mở/Đóng xem dạng lưới",
|
||||
"toggleCamera": "Mở/Đóng camera",
|
||||
"videoSettings": "Cài đặt hình ảnh",
|
||||
"videomute": "Bật / Tắt camera"
|
||||
"videomute": "Bật/Tắt camera"
|
||||
},
|
||||
"transcribing": {
|
||||
"ccButtonTooltip": "Chạy/Dừng phụ đề",
|
||||
@@ -689,7 +689,7 @@
|
||||
"failedToStart": "Khởi chạy phiên âm thất bại",
|
||||
"labelToolTip": "Cuộc họp đang được phiên âm",
|
||||
"off": "Phiên âm đã dừng",
|
||||
"pending": "Đang chuẩn bị phiên âm cuộc họp…",
|
||||
"pending": "Đang chuẩn bị phiên âm cuộc họp...",
|
||||
"start": "Bắt đầu hiển thị phụ đề",
|
||||
"stop": "Dừng hiển thị phụ đề",
|
||||
"tr": "TR"
|
||||
@@ -698,17 +698,17 @@
|
||||
"androidGrantPermissions": "Chọn <b><i>Cho phép</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
|
||||
"chromeGrantPermissions": "Chọn <b><i>Cho phép</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
|
||||
"edgeGrantPermissions": "Chọn <b><i>Có</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
|
||||
"electronGrantPermissions": "Vui lòng cấp quyền sử dụng camera và microphone của bạn",
|
||||
"electronGrantPermissions": "Vui lòng cấp quyền sử dụng camera và micro của bạn",
|
||||
"firefoxGrantPermissions": "Chọn <b><i>Chia sẻ thiết bị đã chọn</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
|
||||
"iexplorerGrantPermissions": "Chọn <b><i>Có</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
|
||||
"nwjsGrantPermissions": "Vui lòng cấp quyền sử dụng camera và microphone của bạn",
|
||||
"nwjsGrantPermissions": "Vui lòng cấp quyền sử dụng camera và micro của bạn",
|
||||
"operaGrantPermissions": "Chọn <b><i>Cho phép</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
|
||||
"react-nativeGrantPermissions": "Chọn <b><i>Cho phép</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
|
||||
"safariGrantPermissions": "Chọn <b><i>Có</i></b> khi trình duyệt của bạn yêu cầu cấp phép."
|
||||
},
|
||||
"videoSIPGW": {
|
||||
"busy": "Chúng tôi đang giải phóng tài nguyên. Vui lòng thử lại sau vài phút.",
|
||||
"busyTitle": "Dịch vụ Phòng họp đang bận",
|
||||
"busyTitle": "Dịch vụ phòng họp đang bận",
|
||||
"errorAlreadyInvited": "{{displayName}} đã được mời",
|
||||
"errorInvite": "Cuộc họp chưa được khởi tạo. Vui lòng thử lại.",
|
||||
"errorInviteFailed": "Chúng tôi đang xử lý vấn đề. Vui lòng thử lại sau.",
|
||||
@@ -718,22 +718,22 @@
|
||||
},
|
||||
"videoStatus": {
|
||||
"audioOnly": "AUD",
|
||||
"audioOnlyExpanded": "Bạn đang ở chế độ chỉ tiếng. Chế độ này giảm băng thông nhưng không thấy hình ảnh người khác.",
|
||||
"audioOnlyExpanded": "Bạn đang ở chế độ chỉ nghe âm thanh. Chế độ này giảm băng thông nhưng không thấy hình ảnh người khác.",
|
||||
"callQuality": "Chất lượng hình ảnh",
|
||||
"hd": "HD",
|
||||
"highDefinition": "HD",
|
||||
"highDefinition": "Độ phân giải cao",
|
||||
"labelTooiltipNoVideo": "Không hình ảnh",
|
||||
"labelTooltipAudioOnly": "Chế độ chỉ tiếng đã bật",
|
||||
"labelTooltipAudioOnly": "Chế độ chỉ nghe âm thanh đã bật",
|
||||
"ld": "LD",
|
||||
"lowDefinition": "Phân giải thấp",
|
||||
"lowDefinition": "Độ phân giải thấp",
|
||||
"onlyAudioAvailable": "Chỉ có âm thanh sẵn sàng",
|
||||
"onlyAudioSupported": "Chỉ hỗ trợ âm thanh trên trình duyệt này.",
|
||||
"sd": "SD",
|
||||
"standardDefinition": "Phân giải SD"
|
||||
"standardDefinition": "Độ phân giải thường"
|
||||
},
|
||||
"videothumbnail": {
|
||||
"domute": "Tắt tiếng",
|
||||
"flip": "Lật",
|
||||
"flip": "Lật hình",
|
||||
"grantModerator": "Cấp quyền quản trị",
|
||||
"kick": "Đẩy ra",
|
||||
"moderator": "Quản trị viên",
|
||||
@@ -771,22 +771,22 @@
|
||||
"join": "Chạm để tham gia",
|
||||
"roomname": "Nhập tên phòng"
|
||||
},
|
||||
"appDescription": "Tiếp tục, chat hình với toàn bộ nhóm. Thực tế, mời người bạn biết. {{app}} được mã hóa, 100% giải pháp hội nghị mã mở mà bạn có thể sử dụng hàng ngày, miễn phí.",
|
||||
"appDescription": "{{app}} được mã hóa, 100% giải pháp cuộc họp trực tuyến mã nguồn mở mà bạn có thể sử dụng hàng ngày, miễn phí.",
|
||||
"audioVideoSwitch": {
|
||||
"audio": "Tiếng",
|
||||
"video": "Hình ảnh"
|
||||
},
|
||||
"calendar": "Lịch",
|
||||
"connectCalendarButton": "Kết nối Lịch của bạn",
|
||||
"connectCalendarButton": "Kết nối lịch của bạn",
|
||||
"connectCalendarText": "Kết nối lịch của bạn để xem tất cả các cuộc họp {{app}}. Thêm, thêm cuộc họp {{provider}} vào lịch của bạn và bắt đầu.",
|
||||
"enterRoomTitle": "Bắt đầu cuộc họp mới",
|
||||
"go": "ĐI",
|
||||
"go": "Đi",
|
||||
"info": "Thông tin",
|
||||
"join": "THAM GIA",
|
||||
"join": "Tham gia",
|
||||
"privacy": "Bảo mật",
|
||||
"recentList": "Hiện tại",
|
||||
"recentListDelete": "Xóa",
|
||||
"recentListEmpty": "Danh sách cuộc họp rỗng. Thực hiện cuộc họp và bạn sẽ thấy danh sách hiện tại đây.",
|
||||
"recentListEmpty": "Danh sách cuộc họp trống. Thực hiện cuộc họp và bạn sẽ thấy danh sách hiện tại đây.",
|
||||
"reducedUIText": "",
|
||||
"roomname": "Nhập tên phòng",
|
||||
"roomnameHint": "Thêm tên hoặc URL của phòng họp bạn muốn tham gia. Ban có thể tạo tên phòng, gửi cho người bạn muốn mời để họ sử dụng tên đó.",
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
"shareInvite": "分享會議邀請",
|
||||
"shareLink": "分享會議連結以邀請他人",
|
||||
"shareStream": "複製分享連結",
|
||||
"sipAddresses": "SIP位址",
|
||||
"sipAddresses": "SIP 位址",
|
||||
"telephone": "電話號碼:{{number}}",
|
||||
"title": "邀請他人至會議",
|
||||
"yahooEmail": "Yahoo Email"
|
||||
"yahooEmail": "Yahoo! Email"
|
||||
},
|
||||
"audioDevices": {
|
||||
"bluetooth": "藍牙",
|
||||
@@ -60,7 +60,7 @@
|
||||
},
|
||||
"calendarSync": {
|
||||
"addMeetingURL": "增加會議連結",
|
||||
"confirmAddLink": "您要為此活動加入Jitsi連結嗎?",
|
||||
"confirmAddLink": "您要為此活動加入 Jitsi 連結嗎?",
|
||||
"error": {
|
||||
"appConfiguration": "行事曆整合尚未正確設定。",
|
||||
"generic": "發生錯誤,請檢查行事曆設定,或是重新整理行事曆。",
|
||||
@@ -81,8 +81,8 @@
|
||||
"selectSoundDevice": "選擇音訊裝置"
|
||||
},
|
||||
"labels": {
|
||||
"buttonLabel": "駕駛模式",
|
||||
"title": "駕駛模式",
|
||||
"buttonLabel": "行車模式",
|
||||
"title": "行車模式",
|
||||
"videoStopped": "您的視訊已停用"
|
||||
}
|
||||
},
|
||||
@@ -90,7 +90,7 @@
|
||||
"enter": "加入聊天室",
|
||||
"error": "錯誤:您的訊息未被傳送。原因:{{error}}",
|
||||
"fieldPlaceHolder": "在此輸入您的訊息",
|
||||
"lobbyChatMessageTo": "大厅聊天訊息傳送至{{recipient}}",
|
||||
"lobbyChatMessageTo": "大廳聊天訊息傳送至{{recipient}}",
|
||||
"message": "訊息",
|
||||
"messageAccessibleTitle": "{{user}}:",
|
||||
"messageAccessibleTitleMe": "說:",
|
||||
@@ -119,7 +119,7 @@
|
||||
"buttonTextEdge": "安裝 Edge 外掛程式",
|
||||
"close": "關閉",
|
||||
"dontShowAgain": "不要再問了",
|
||||
"installExtensionText": "安裝適用於Google行事曆及Office 365整合的擴充功能"
|
||||
"installExtensionText": "安裝適用於 Google 行事曆及 Office 365 整合的擴充功能"
|
||||
},
|
||||
"connectingOverlay": {
|
||||
"joiningRoom": "正在將您連接至您的會議……"
|
||||
@@ -131,7 +131,7 @@
|
||||
"CONNECTED": "已經連接",
|
||||
"CONNECTING": "連接中",
|
||||
"CONNFAIL": "連接失敗",
|
||||
"DISCONNECTED": "已經中斷連接",
|
||||
"DISCONNECTED": "已斷線",
|
||||
"DISCONNECTING": "中斷連接中",
|
||||
"ERROR": "錯誤",
|
||||
"FETCH_SESSION_ID": "正在取得工作階段ID……",
|
||||
@@ -182,11 +182,11 @@
|
||||
},
|
||||
"deepLinking": {
|
||||
"appNotInstalled": "您需要在手機上安裝{{app}}行動應用程式才能加入這場會議。",
|
||||
"description": "甚麼事情都沒發生?我們已嘗試在您的{{app}}桌面應用程式開啟會議。請再試一次,或是在{{app}}網路應用程式開啟會議。",
|
||||
"descriptionWithoutWeb": "甚麼事情都沒發生?我們已試著將您的會議在桌面應用程式{{app}}中啟動。",
|
||||
"description": "什麼事情都沒發生?我們已嘗試在您的{{app}}桌面應用程式開啟會議。請再試一次,或是在{{app}}網路應用程式開啟會議。",
|
||||
"descriptionWithoutWeb": "什麼事情都沒發生?我們已試著將您的會議在桌面應用程式{{app}}中啟動。",
|
||||
"downloadApp": "下載App",
|
||||
"ifDoNotHaveApp": "如果您尚未安裝App:",
|
||||
"ifHaveApp": "如果您已經此App:",
|
||||
"ifHaveApp": "如果您已經安裝此App:",
|
||||
"joinInApp": "使用App加入會議",
|
||||
"launchWebButton": "在瀏覽器開啟",
|
||||
"title": "正在{{app}}發起您的會議……",
|
||||
@@ -216,12 +216,12 @@
|
||||
"dialog": {
|
||||
"Back": "返回",
|
||||
"Cancel": "取消",
|
||||
"IamHost": "我是主持人",
|
||||
"IamHost": "我是會議主持人",
|
||||
"Ok": "確定",
|
||||
"Remove": "移除",
|
||||
"Share": "分享",
|
||||
"Submit": "提交",
|
||||
"WaitForHostMsg": "此會議尚未開始,如果您是主持人,請進行認證並以主持人身分開始會議。",
|
||||
"Submit": "送出",
|
||||
"WaitForHostMsg": "此會議尚未開始,如果您是會議主持人,請進行認證並以主持人身分開始會議。",
|
||||
"WaitingForHostTitle": "正在等候主持人加入……",
|
||||
"Yes": "是",
|
||||
"accessibilityLabel": {
|
||||
@@ -237,7 +237,7 @@
|
||||
"authenticationRequired": "需要驗證",
|
||||
"cameraConstraintFailedError": "您的網路攝影機不符合要求。",
|
||||
"cameraNotFoundError": "找不到網路攝影機。",
|
||||
"cameraNotSendingData": "我們無法存取您的網路攝影機,請檢查是否有其他應用程式正在使用這個裝置,并從裝置選單裡選擇其他設備或者重新載入。",
|
||||
"cameraNotSendingData": "我們無法存取您的網路攝影機,請檢查是否有其他應用程式正在使用這個裝置,並從裝置選單裡選擇其他設備或者重新載入。",
|
||||
"cameraNotSendingDataTitle": "無法存取網路攝影機",
|
||||
"cameraPermissionDeniedError": "未取得網路攝影機的存取權,您仍可參加會議,但其他人無法看到你。按一下網址列中的「攝影機」圖示 ,然後選取「一律允許」選項。",
|
||||
"cameraTimeoutError": "無法啟動視訊裝置,連線逾時!",
|
||||
@@ -268,7 +268,7 @@
|
||||
"embedMeeting": "嵌入會議",
|
||||
"enterDisplayName": "請在此輸入您自己的名字",
|
||||
"error": "錯誤",
|
||||
"gracefulShutdown": "我們目前正在維護中,請稍後再試。",
|
||||
"gracefulShutdown": "服務目前正在維護中,請稍後再試。",
|
||||
"grantModeratorDialog": "您確定要授予{{participantName}}主持人權限嗎?",
|
||||
"grantModeratorTitle": "授予主持人權限",
|
||||
"hide": "隱藏",
|
||||
@@ -283,7 +283,7 @@
|
||||
"kickParticipantTitle": "移除這位與會者?",
|
||||
"kickTitle": "噢!{{participantDisplayName}}將您從會議中移除",
|
||||
"linkMeeting": "連結會議",
|
||||
"linkMeetingTitle": "將會議連結至Salesforce",
|
||||
"linkMeetingTitle": "將會議連結至 Salesforce",
|
||||
"liveStreaming": "直播串流中",
|
||||
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "正在錄製,無法使用",
|
||||
"localUserControls": "本機使用者控制",
|
||||
@@ -297,7 +297,7 @@
|
||||
"maxUsersLimitReachedTitle": "與會人數已達上限",
|
||||
"micConstraintFailedError": "您的麥克風不符合要求。",
|
||||
"micNotFoundError": "未發現麥克風。",
|
||||
"micNotSendingData": "至電腦設定中解除麥克風靜音並調整大小",
|
||||
"micNotSendingData": "請至電腦設定中解除麥克風靜音並調整音量",
|
||||
"micNotSendingDataTitle": "您的麥克風由電腦系統設定為靜音",
|
||||
"micPermissionDeniedError": "您未允許麥克風的使用權限,雖然可以繼續參加會議但其他人將無法聽到您的聲音,利用位址欄中的網路攝影機按鈕修正這個問題。",
|
||||
"micTimeoutError": "無法啟動音訊裝置,連線逾時!",
|
||||
@@ -312,11 +312,11 @@
|
||||
"muteEveryoneElsesVideoTitle": "是否要關閉除了{{whom}}以外的人的網路攝影機?",
|
||||
"muteEveryoneSelf": "您自己",
|
||||
"muteEveryoneStartMuted": "現在所有人皆已靜音",
|
||||
"muteEveryoneTitle": "靜音所有人?",
|
||||
"muteEveryoneTitle": "要將所有人靜音嗎?",
|
||||
"muteEveryonesVideoDialog": "與會者隨時可以重新開啟自己的網路攝影機。",
|
||||
"muteEveryonesVideoDialogModerationOn": "與會者可以隨時傳送開啟視訊請求。",
|
||||
"muteEveryonesVideoDialogOk": "停用",
|
||||
"muteEveryonesVideoTitle": "停用所有人的網路攝影機?",
|
||||
"muteEveryonesVideoTitle": "要關閉所有人的網路攝影機嗎?",
|
||||
"muteParticipantBody": "您無法對他們解除靜音,但是他們自己隨時可以解除靜音。",
|
||||
"muteParticipantButton": "靜音",
|
||||
"muteParticipantsVideoBody": "您無法重新開啟,只有對方能自己重新開啟。",
|
||||
@@ -324,8 +324,8 @@
|
||||
"muteParticipantsVideoButton": "停用網路攝影機",
|
||||
"muteParticipantsVideoDialog": "確定要停用這位與會者的網路攝影機?您不能再重新開啟對方的網路攝影機,但他們隨時能重新開啟。",
|
||||
"muteParticipantsVideoDialogModerationOn": "您確定要關閉此與會者的網路攝影機嗎?您和他都無法再將視訊重新開啟。",
|
||||
"muteParticipantsVideoTitle": "停用此與會者的網路攝影機?",
|
||||
"noDropboxToken": "沒有有效的Dropbox token",
|
||||
"muteParticipantsVideoTitle": "要關閉此與會者的網路攝影機嗎?",
|
||||
"noDropboxToken": "沒有有效的 Dropbox token",
|
||||
"password": "密碼",
|
||||
"passwordLabel": "會議已被一位與會者鎖定,請輸入$t(lockRoomPassword)以加入。",
|
||||
"passwordNotSupported": "尚未支援設定會議$t(lockRoomPassword)。",
|
||||
@@ -337,7 +337,7 @@
|
||||
"popupError": "您的瀏覽器在此網站上阻擋彈出視窗,請在瀏覽器的安全設定中啟用並再試一次。",
|
||||
"popupErrorTitle": "彈出視窗遭到阻擋",
|
||||
"readMore": "更多",
|
||||
"recentlyUsedObjects": "您近期使用過的物件",
|
||||
"recentlyUsedObjects": "您最近使用過的物件",
|
||||
"recording": "錄製中",
|
||||
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "正在直播時無法使用",
|
||||
"rejoinNow": "立即重新加入",
|
||||
@@ -358,8 +358,8 @@
|
||||
"screenSharingAudio": "分享音訊",
|
||||
"screenSharingFailed": "噢喔!發生錯誤,我們無法啟動分享畫面!",
|
||||
"screenSharingFailedTitle": "分享畫面失敗!",
|
||||
"screenSharingPermissionDeniedError": "噢喔!您的影像分享權限發生問題,請重新載入并再試一次。",
|
||||
"searchInSalesforce": "在Salesforce中搜尋",
|
||||
"screenSharingPermissionDeniedError": "噢喔!您的影像分享權限發生問題,請重新載入並再試一次。",
|
||||
"searchInSalesforce": "在 Salesforce 中搜尋",
|
||||
"searchResults": "搜尋結果({{count}})",
|
||||
"searchResultsDetailsError": "取得擁有者資料時發生錯誤。",
|
||||
"searchResultsError": "取得資料時發生錯誤。",
|
||||
@@ -388,17 +388,17 @@
|
||||
"shareYourScreen": "分享您的畫面",
|
||||
"shareYourScreenDisabled": "畫面分享已停用。",
|
||||
"sharedVideoDialogError": "錯誤:網址無效",
|
||||
"sharedVideoLinkPlaceholder": "YouTube或影片網址",
|
||||
"sharedVideoLinkPlaceholder": "YouTube 或影片網址",
|
||||
"show": "顯示",
|
||||
"start": "開始",
|
||||
"startLiveStreaming": "啟動直播串流",
|
||||
"startLiveStreaming": "開始直播串流",
|
||||
"startRecording": "啟動錄製作業",
|
||||
"startRemoteControlErrorMessage": "嘗試啟動遠端控制階段時發生錯誤!",
|
||||
"stopLiveStreaming": "停用直播串流",
|
||||
"stopLiveStreaming": "停止直播串流",
|
||||
"stopRecording": "停用錄製",
|
||||
"stopRecordingWarning": "確定要停用錄製嗎?",
|
||||
"stopStreamingWarning": "確定要停用直播串流嗎?",
|
||||
"streamKey": "直播串流密鑰",
|
||||
"stopStreamingWarning": "確定要停止直播串流嗎?",
|
||||
"streamKey": "直播串流金鑰",
|
||||
"thankYou": "感謝您使用{{appName}}!",
|
||||
"token": "token",
|
||||
"tokenAuthFailed": "抱歉,您未被允許加入此會議。",
|
||||
@@ -410,7 +410,7 @@
|
||||
"userPassword": "用戶密碼",
|
||||
"videoLink": "影片連結",
|
||||
"viewUpgradeOptions": "查看升級方案",
|
||||
"viewUpgradeOptionsContent": "若要不受限地使用錄製、逐字稿、RTMP串流等進階版功能,您必須升級您的方案。",
|
||||
"viewUpgradeOptionsContent": "若要不受限制地使用錄製、逐字稿、RTMP 串流等進階版功能,您必須升級您的方案。",
|
||||
"viewUpgradeOptionsTitle": "您找到了進階版功能!",
|
||||
"yourEntireScreen": "您的整個畫面"
|
||||
},
|
||||
@@ -435,7 +435,7 @@
|
||||
},
|
||||
"giphy": {
|
||||
"noResults": "找不到任何結果 :(",
|
||||
"search": "搜尋 GIPHY"
|
||||
"search": "搜尋 GIPHY 圖庫"
|
||||
},
|
||||
"helpView": {
|
||||
"title": "說明中心"
|
||||
@@ -508,7 +508,7 @@
|
||||
"giphyMenu": "切換 GIPHY 選單",
|
||||
"keyboardShortcuts": "快捷鍵",
|
||||
"localRecording": "顯示或隱藏本機端錄製控制項",
|
||||
"mute": "靜音或解除靜音",
|
||||
"mute": "靜音或取消靜音",
|
||||
"pushToTalk": "按鍵通話",
|
||||
"raiseHand": "舉手或放下",
|
||||
"showSpeakerStats": "顯示聲音輸出數據",
|
||||
@@ -529,16 +529,16 @@
|
||||
"changeSignIn": "切換帳號",
|
||||
"choose": "選擇直播串流",
|
||||
"chooseCTA": "請選擇直播串流選項,您目前是以{{email}}身份登入。",
|
||||
"enterStreamKey": "在此輸入您的YouTube直播串流密鑰。",
|
||||
"enterStreamKey": "在此輸入您的 YouTube 直播串流金鑰。",
|
||||
"error": "直播串流失敗,請重試。",
|
||||
"errorAPI": "在存取您的YouTube直播時發生問題,請重新登入。",
|
||||
"errorAPI": "在存取您的 YouTube 直播時發生問題,請重新登入。",
|
||||
"errorLiveStreamNotEnabled": "直播在{{email}}尚未啟用,請開啟直播串流或登入有啟用直播串流的帳號。",
|
||||
"expandedOff": "直播已停用",
|
||||
"expandedOn": "會議目前正在YouTube上直播。",
|
||||
"expandedOn": "會議目前正在 YouTube 上直播。",
|
||||
"expandedPending": "直播串流正被啟動……",
|
||||
"failedToStart": "直播串流啟動失敗",
|
||||
"getStreamKeyManually": "我們無法解析任何直播串流,請嘗試從YouTube取得您的直播串流金鑰。",
|
||||
"googlePrivacyPolicy": "Google隱私權政策",
|
||||
"getStreamKeyManually": "我們無法解析任何直播串流,請嘗試從 YouTube 取得您的直播串流金鑰。",
|
||||
"googlePrivacyPolicy": "Google 隱私權政策",
|
||||
"inProgress": "正在錄製或直播",
|
||||
"invalidStreamKey": "直播串流金鑰可能不正確。",
|
||||
"limitNotificationDescriptionNative": "您的最大直播長度將被限制在{{limit}}分鐘,若要不受限的直播,請使用{{app}}。",
|
||||
@@ -551,18 +551,18 @@
|
||||
"serviceName": "直播串流服務",
|
||||
"sessionAlreadyActive": "已在錄製或直播此工作階段。",
|
||||
"signIn": "使用 Google 帳號登入",
|
||||
"signInCTA": "輸入YouTube直播串流密鑰,或登入帳號。",
|
||||
"signInCTA": "輸入 YouTube 直播串流金鑰,或登入帳號。",
|
||||
"signOut": "登出",
|
||||
"signedInAs": "您目前登入名稱為:",
|
||||
"start": "啟動直播串流",
|
||||
"streamIdHelp": "這是什麼?",
|
||||
"title": "直播串流",
|
||||
"unavailableTitle": "直播串流無法使用",
|
||||
"youtubeTerms": "YouTube服務條款"
|
||||
"youtubeTerms": "YouTube 服務條款"
|
||||
},
|
||||
"lobby": {
|
||||
"admit": "准許",
|
||||
"admitAll": "准許所有人",
|
||||
"admit": "準許",
|
||||
"admitAll": "準許所有人",
|
||||
"allow": "允許",
|
||||
"backToKnockModeButton": "請求加入",
|
||||
"chat": "聊天",
|
||||
@@ -613,13 +613,13 @@
|
||||
"durationNA": "不適用",
|
||||
"encoding": "編碼中",
|
||||
"label": "LOR",
|
||||
"labelToolTip": "本地端錄製投入中",
|
||||
"labelToolTip": "本地端錄製進行中",
|
||||
"localRecording": "本地端錄製中",
|
||||
"me": "我",
|
||||
"messages": {
|
||||
"engaged": "本地端錄製已投入。",
|
||||
"engaged": "本地端錄製已啟用。",
|
||||
"finished": "錄製階段{{token}}已完成,請傳送錄製檔案案至主持人。",
|
||||
"finishedModerator": "錄製階段{{token}}已完成,本地端錄製追蹤已存檔,請要求各與會者提交其錄製檔案案。",
|
||||
"finishedModerator": "錄製階段{{token}}已完成,本地端錄製追蹤已存檔,請要求各與會者提供其錄製檔案案。",
|
||||
"notModerator": "您不是主持人,無法啟動或停用本地端錄製。"
|
||||
},
|
||||
"moderator": "主持人",
|
||||
@@ -663,8 +663,8 @@
|
||||
"leftOneMember": "{{name}}已離開會議",
|
||||
"leftThreePlusMembers": "{{name}}與其他人已離開會議",
|
||||
"leftTwoMembers": "{{first}}與{{second}}已離開會議",
|
||||
"linkToSalesforce": "連結至Salesforce",
|
||||
"linkToSalesforceDescription": "您可以將會議摘要連結至Salesforce物件。",
|
||||
"linkToSalesforce": "連結至 Salesforce",
|
||||
"linkToSalesforceDescription": "您可以將會議摘要連結至 Salesforce 物件。",
|
||||
"linkToSalesforceError": "無法將會議連結至 Salesforce",
|
||||
"linkToSalesforceKey": "連結此會議",
|
||||
"linkToSalesforceProgress": "正在將會議連結至 Salesforce……",
|
||||
@@ -694,26 +694,26 @@
|
||||
"noiseSuppressionDesktopAudioDescription": "分享電腦音訊時無法啟用雜訊抑制,請停用後重試。",
|
||||
"noiseSuppressionFailedTitle": "啟用雜訊抑制失敗",
|
||||
"noiseSuppressionNoTrackDescription": "請先解除麥克風的靜音。",
|
||||
"noiseSuppressionStereoDescription": "目前不支持對身歷聲音訊啟用雜訊抑制。",
|
||||
"oldElectronClientDescription1": "您似乎正在使用存在已知安全漏洞的過時Jitsi Meet用戶端,請盡快更新到最新版本!",
|
||||
"noiseSuppressionStereoDescription": "目前不支援立體聲降噪功能。",
|
||||
"oldElectronClientDescription1": "您似乎正在使用存在已知安全漏洞的過時 Jitsi Meet 用戶端,請盡快更新到最新版本!",
|
||||
"oldElectronClientDescription2": "",
|
||||
"oldElectronClientDescription3": "",
|
||||
"participantWantsToJoin": "想要加入會議",
|
||||
"participantsWantToJoin": "想要加入會議",
|
||||
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase)已被其他與會者移除",
|
||||
"passwordSetRemotely": "$t(lockRoomPasswordUppercase)由其他與會者設定",
|
||||
"raiseHandAction": "舉手",
|
||||
"raiseHandAction": "舉手發言",
|
||||
"raisedHand": "{{name}}想要發言。",
|
||||
"raisedHands": "{{participantName}}與其他{{raisedHands}}人",
|
||||
"reactionSounds": "停用音效",
|
||||
"reactionSoundsForAll": "為所有人停用音效",
|
||||
"reactionSounds": "關閉音效",
|
||||
"reactionSoundsForAll": "為所有人關閉音效",
|
||||
"screenShareNoAudio": "您未在選擇視窗時勾選分享音訊",
|
||||
"screenShareNoAudioTitle": "無法分享電腦聲音!",
|
||||
"selfViewTitle": "您隨時可以在設定中取消隱藏本人視圖",
|
||||
"somebody": "某人",
|
||||
"startSilentDescription": "重新加入會議以啟用音訊",
|
||||
"startSilentTitle": "您加入時沒有啟用音訊!",
|
||||
"suboptimalBrowserWarning": "我们恐怕您本次會議體驗不佳,我們會想辦法改進的。在此期間,请尝试使用<a href='{{recommendedBrowserPageLink}}' target='_blank'>支援的瀏覽器</a> 。",
|
||||
"startSilentTitle": "您加入時沒有開啟音訊!",
|
||||
"suboptimalBrowserWarning": "我們恐怕您本次會議體驗不佳,我們會努力改善。在此期間,請嘗試使用<a href='{{recommendedBrowserPageLink}}' target='_blank'>支援的瀏覽器</a> 。",
|
||||
"suboptimalExperienceTitle": "瀏覽器警告",
|
||||
"unmute": "取消靜音",
|
||||
"videoMutedRemotelyDescription": "您隨時可以再次啟用。",
|
||||
@@ -732,7 +732,7 @@
|
||||
"blockEveryoneMicCamera": "停用所有人的麥克風和網路攝影機",
|
||||
"invite": "邀請他人",
|
||||
"moreModerationActions": "更多主持人選項",
|
||||
"moreModerationControls": "更多主持人控制項",
|
||||
"moreModerationControls": "更多主持人操作",
|
||||
"moreParticipantOptions": "更多與會者選項",
|
||||
"mute": "靜音",
|
||||
"muteAll": "靜音所有人",
|
||||
@@ -757,7 +757,7 @@
|
||||
"polls": {
|
||||
"answer": {
|
||||
"skip": "跳過",
|
||||
"submit": "提交"
|
||||
"submit": "送出"
|
||||
},
|
||||
"by": "由{{ name }}",
|
||||
"create": {
|
||||
@@ -765,7 +765,7 @@
|
||||
"answerPlaceholder": "選項{{index}}",
|
||||
"cancel": "取消",
|
||||
"create": "建立投票",
|
||||
"pollOption": "投票選項{{index}}",
|
||||
"pollOption": "選項{{index}}",
|
||||
"pollQuestion": "投票問題",
|
||||
"questionPlaceholder": "詢問問題",
|
||||
"removeOption": "移除選項",
|
||||
@@ -863,7 +863,7 @@
|
||||
},
|
||||
"profile": {
|
||||
"avatar": "頭像",
|
||||
"setDisplayNameLabel": "設定您的顯示名稱",
|
||||
"setDisplayNameLabel": "設定顯示名稱",
|
||||
"setEmailInput": "輸入您的電子信箱",
|
||||
"setEmailLabel": "設定您的 Gravatar 電子信箱",
|
||||
"title": "簡介"
|
||||
@@ -872,14 +872,14 @@
|
||||
"raisedHandsLabel": "舉手人數",
|
||||
"record": {
|
||||
"already": {
|
||||
"linked": "會議已連結至此Salesforce物件。"
|
||||
"linked": "會議已連結至此 Salesforce 物件。"
|
||||
},
|
||||
"type": {
|
||||
"account": "帳號",
|
||||
"contact": "聯絡人",
|
||||
"lead": "淺在客戶",
|
||||
"lead": "潛在客戶",
|
||||
"opportunity": "機會",
|
||||
"owner": "擁有者"
|
||||
"owner": "負責人"
|
||||
}
|
||||
},
|
||||
"recording": {
|
||||
@@ -891,7 +891,7 @@
|
||||
"copyLink": "複製連結",
|
||||
"error": "錄製失敗,請重試。",
|
||||
"errorFetchingLink": "取得錄製檔案連結時發生錯誤。",
|
||||
"expandedOff": "錄製已經停用",
|
||||
"expandedOff": "錄製已停止",
|
||||
"expandedOn": "此會議目前正在錄製。",
|
||||
"expandedPending": "錄製正在啟動……",
|
||||
"failedToStart": "錄製啟動失敗",
|
||||
@@ -907,17 +907,17 @@
|
||||
"linkGenerated": "我們建立了您的錄製檔案的連結。",
|
||||
"live": "直播",
|
||||
"localRecordingNoNotificationWarning": "系統不會主動知會與會者錄製已開啟,主持人需另行通知。",
|
||||
"localRecordingNoVideo": "没有錄製的視訊",
|
||||
"localRecordingNoVideo": "沒有錄製的視訊",
|
||||
"localRecordingStartWarning": "請確保在退出會議之前停用錄製以便保存。",
|
||||
"localRecordingStartWarningTitle": "停用錄製以保存",
|
||||
"localRecordingVideoStop": "停用您的視訊也將停用本地錄製,確定繼續嗎?",
|
||||
"localRecordingVideoStop": "關閉您的視訊也將停止本地錄製,確定繼續嗎?",
|
||||
"localRecordingVideoWarning": "錄製視訊必須在開始時啟用",
|
||||
"localRecordingWarning": "確保選擇當前分頁以錄製正確的視訊和音訊。錄製目前限制為1GB,大約100分鐘。",
|
||||
"localRecordingWarning": "確保選擇目前的分頁以錄製正確的視訊和音訊。錄製目前限制為1GB,約可錄製100分鐘。",
|
||||
"loggedIn": "以{{userName}}登入",
|
||||
"noStreams": "未檢測到音訊或視訊。",
|
||||
"off": "錄製已經停用",
|
||||
"off": "錄製已停用",
|
||||
"offBy": "{{name}}停用了錄製",
|
||||
"on": "錄製中",
|
||||
"on": "正在錄製",
|
||||
"onBy": "{{name}}啟動了錄製",
|
||||
"onlyRecordSelf": "",
|
||||
"pending": "準備錄製此會議……",
|
||||
@@ -930,7 +930,7 @@
|
||||
"sessionAlreadyActive": "已在錄製或直播此工作階段。",
|
||||
"signIn": "登入",
|
||||
"signOut": "登出",
|
||||
"surfaceError": "請選擇當前分頁",
|
||||
"surfaceError": "請選擇目前分頁",
|
||||
"title": "錄製中",
|
||||
"unavailable": "喔哦!{{serviceName}}目前無法使用,我們正在解決此問題,請稍後再試。",
|
||||
"unavailableTitle": "錄製無法使用",
|
||||
@@ -941,15 +941,15 @@
|
||||
"pullToRefresh": "下拉以重新整理"
|
||||
},
|
||||
"security": {
|
||||
"about": "您可以添加$t(lockRoomPassword)至您的會議,與會者在加入會議前必須先輸入$t(lockRoomPassword)。",
|
||||
"aboutReadOnly": "主持人可以添加$t(lockRoomPassword)至會議,與會者在加入會議前必須先輸入$t(lockRoomPassword)。",
|
||||
"about": "您可以新增$t(lockRoomPassword)至您的會議,與會者在加入會議前必須先輸入$t(lockRoomPassword)。",
|
||||
"aboutReadOnly": "主持人可以新增$t(lockRoomPassword)至會議,與會者在加入會議前必須先輸入$t(lockRoomPassword)。",
|
||||
"insecureRoomNameWarning": "會議室名稱過於簡單,任何人都可以加入此會議,請考慮使用安全性選項以保護您的會議安全。",
|
||||
"title": "安全性選項"
|
||||
},
|
||||
"settings": {
|
||||
"buttonLabel": "設定",
|
||||
"calendar": {
|
||||
"about": "{{appName}}行事曆整合以安全的方式存取您的行事曆中即將舉行的活動。",
|
||||
"about": "{{appName}}行事曆整合功能可安全地存取您行事曆中即將舉行的活動。",
|
||||
"disconnect": "中斷連接",
|
||||
"microsoftSignIn": "使用Microsoft帳號登入",
|
||||
"signedIn": "目前正在存取{{email}}的行事曆事件,點按下方中斷連接可以停用存取行事曆事件。",
|
||||
@@ -979,7 +979,7 @@
|
||||
"selectAudioOutput": "音訊輸出",
|
||||
"selectCamera": "網路攝影機",
|
||||
"selectMic": "麥克風",
|
||||
"selfView": "自我檢視",
|
||||
"selfView": "自身畫面",
|
||||
"sounds": "音訊",
|
||||
"speakers": "喇叭",
|
||||
"startAudioMuted": "所有人啟動時處於靜音",
|
||||
@@ -998,7 +998,7 @@
|
||||
"conferenceSection": "會議",
|
||||
"disableCallIntegration": "停用原生通話整合",
|
||||
"disableCrashReporting": "停用錯誤回報",
|
||||
"disableCrashReportingWarning": "您確定要停用錯誤回報嗎?變更將在重啟後生效。",
|
||||
"disableCrashReportingWarning": "您確定要停用錯誤回報功能嗎?變更將在重啟應用程式後生效。",
|
||||
"disableP2P": "停用點對點模式",
|
||||
"displayName": "顯示名稱",
|
||||
"displayNamePlaceholderText": "例如:John Doe",
|
||||
@@ -1011,15 +1011,15 @@
|
||||
"profileSection": "簡介",
|
||||
"serverURL": "伺服器網址",
|
||||
"showAdvanced": "顯示進階設定",
|
||||
"startCarModeInLowBandwidthMode": "同時啟用駕駛模式與低頻寬模式",
|
||||
"startCarModeInLowBandwidthMode": "同時啟用行車模式與低頻寬模式",
|
||||
"startWithAudioMuted": "啟動並靜音",
|
||||
"startWithVideoMuted": "啟動並關閉影像",
|
||||
"terms": "條款",
|
||||
"version": "版本"
|
||||
},
|
||||
"share": {
|
||||
"dialInfoText": "\n\n=====\n\n只想要透過手機撥入嗎?\n\n{{defaultDialInNumber}}點擊此連結來查看此會議的電話撥入號碼\n{{dialInfoPageUrl}}",
|
||||
"mainText": "點擊下方連結加入會議:\n{{roomUrl}}"
|
||||
"dialInfoText": "\n\n=====\n\n只想要透過手機撥打加入嗎?\n\n撥打{{defaultDialInNumber}}或點此連結來查看此會議的電話撥入號碼\n{{dialInfoPageUrl}}",
|
||||
"mainText": "點選下方連結加入會議:\n{{roomUrl}}"
|
||||
},
|
||||
"speaker": "喇叭",
|
||||
"speakerStats": {
|
||||
@@ -1028,13 +1028,13 @@
|
||||
"displayEmotions": "顯示表情",
|
||||
"fearful": "可怕",
|
||||
"happy": "笑臉",
|
||||
"hours": "{{count}}時",
|
||||
"minutes": "{{count}}分",
|
||||
"hours": "{{count}} 小時",
|
||||
"minutes": "{{count}} 分",
|
||||
"name": "名字",
|
||||
"neutral": "中立",
|
||||
"sad": "悲傷",
|
||||
"search": "搜尋",
|
||||
"seconds": "{{count}}秒",
|
||||
"seconds": "{{count}} 秒",
|
||||
"speakerStats": "發言統計",
|
||||
"speakerTime": "發言時間",
|
||||
"surprised": "驚訝"
|
||||
@@ -1042,11 +1042,11 @@
|
||||
"startupoverlay": {
|
||||
"genericTitle": "此會議需要使用您的麥克風和網路攝影機。",
|
||||
"policyText": " ",
|
||||
"title": "{{app}}需要使用您的麥克風和網路攝影機。"
|
||||
"title": "{{app}} 需要使用您的麥克風和網路攝影機。"
|
||||
},
|
||||
"suspendedoverlay": {
|
||||
"rejoinKeyTitle": "重新加入",
|
||||
"text": "按下 <i>重新加入</i> 按鈕重新連接。",
|
||||
"text": "按下 <i>重新加入</i> 按鈕以重新連接。",
|
||||
"title": "由於電腦進入休眠,您的視訊通話已經中斷。"
|
||||
},
|
||||
"termsView": {
|
||||
@@ -1062,19 +1062,19 @@
|
||||
"boo": "喝倒彩",
|
||||
"breakoutRoom": "加入/離開分組討論室",
|
||||
"callQuality": "管理視訊品質",
|
||||
"carmode": "駕駛模式",
|
||||
"carmode": "行車模式",
|
||||
"cc": "啟用/停用字幕",
|
||||
"chat": "打開/關閉聊天視窗",
|
||||
"clap": "鼓掌",
|
||||
"collapse": "收回",
|
||||
"document": "啟用/停用分享文檔",
|
||||
"document": "啟用/停用分享文件",
|
||||
"download": "下載我們的應用程式",
|
||||
"embedMeeting": "嵌入會議",
|
||||
"endConference": "全體會議結束",
|
||||
"expand": "展開",
|
||||
"feedback": "留下反饋",
|
||||
"feedback": "留下建議",
|
||||
"fullScreen": "啟用/停用全畫面",
|
||||
"giphy": "啟用/停用GIPHY選單",
|
||||
"giphy": "啟用/停用 GIPHY 選單",
|
||||
"grantModerator": "授予主持人權限",
|
||||
"hangup": "離開會議",
|
||||
"help": "協助",
|
||||
@@ -1083,7 +1083,7 @@
|
||||
"laugh": "大笑",
|
||||
"leaveConference": "離開會議",
|
||||
"like": "比讚",
|
||||
"linkToSalesforce": "連結至Salesforce",
|
||||
"linkToSalesforce": "連結至 Salesforce",
|
||||
"lobbyButton": "啟用/停用大廳模式",
|
||||
"localRecording": "啟用/停用本地端錄製控制",
|
||||
"lockRoom": "啟用/停用會議密碼",
|
||||
@@ -1092,7 +1092,7 @@
|
||||
"moreOptions": "顯示更多選項",
|
||||
"mute": "靜音/取消靜音",
|
||||
"muteEveryone": "將所有人靜音",
|
||||
"muteEveryoneElse": "全体静音",
|
||||
"muteEveryoneElse": "全體靜音",
|
||||
"muteEveryoneElsesVideoStream": "停用其他人的網路攝影機",
|
||||
"muteEveryonesVideoStream": "停用所有人的網路攝影機",
|
||||
"noiseSuppression": "雜訊抑制",
|
||||
@@ -1107,7 +1107,7 @@
|
||||
"remoteVideoMute": "停用與會者的網路攝影機",
|
||||
"security": "安全性選項",
|
||||
"selectBackground": "選擇背景",
|
||||
"selfView": "啟用/停用本人視圖",
|
||||
"selfView": "啟用/停用自身畫面",
|
||||
"shareRoom": "邀請他人",
|
||||
"shareYourScreen": "啟用/停用畫面分享",
|
||||
"shareaudio": "分享音訊",
|
||||
@@ -1149,7 +1149,7 @@
|
||||
"exitFullScreen": "離開全畫面",
|
||||
"exitTileView": "跳出畫廊檢視",
|
||||
"feedback": "回饋",
|
||||
"giphy": "啟用/停用GIPHY選單",
|
||||
"giphy": "啟用/停用 GIPHY 選單",
|
||||
"hangup": "離開會議",
|
||||
"help": "協助",
|
||||
"hideWhiteboard": "停用白板",
|
||||
@@ -1159,7 +1159,7 @@
|
||||
"leaveBreakoutRoom": "離開分組討論室",
|
||||
"leaveConference": "離開會議",
|
||||
"like": "比讚",
|
||||
"linkToSalesforce": "連結至Salesforce",
|
||||
"linkToSalesforce": "連結至 Salesforce",
|
||||
"lobbyButtonDisable": "停用大廳模式",
|
||||
"lobbyButtonEnable": "啟用大廳模式",
|
||||
"login": "登入",
|
||||
@@ -1216,13 +1216,13 @@
|
||||
},
|
||||
"transcribing": {
|
||||
"ccButtonTooltip": "啟動/停用字幕",
|
||||
"error": "轉錄失敗,請重試。",
|
||||
"error": "轉錄失敗,請再試一次。",
|
||||
"expandedLabel": "轉錄已開啟",
|
||||
"failedToStart": "轉錄啟動失敗",
|
||||
"labelToolTip": "此會議正在轉錄",
|
||||
"off": "轉錄已停用",
|
||||
"pending": "準備轉錄會議……",
|
||||
"sourceLanguageDesc": "會議語言當前設定為<b>{{sourceLanguage}}</b><br/>您可以在這裡",
|
||||
"sourceLanguageDesc": "會議語言目前設定為<b>{{sourceLanguage}}</b><br/>您可以在這裡",
|
||||
"sourceLanguageHere": "修改",
|
||||
"start": "開始顯示字幕",
|
||||
"stop": "停用顯示字幕",
|
||||
@@ -1246,7 +1246,7 @@
|
||||
"busy": "我們正在釋放資源,請過幾分鐘後再試。",
|
||||
"busyTitle": "會議室服務目前忙碌中",
|
||||
"errorAlreadyInvited": "{{displayName}}已經受邀",
|
||||
"errorInvite": "會議尚未開始,請稍後再試。",
|
||||
"errorInvite": "會議尚未開始,請稍候再試。",
|
||||
"errorInviteFailed": "我們正在努力解決這個問題,請稍後再試。",
|
||||
"errorInviteFailedTitle": "邀請{{displayName}}失敗",
|
||||
"errorInviteTitle": "會議室邀請錯誤",
|
||||
@@ -1286,7 +1286,7 @@
|
||||
"mute": "與會者處於靜音",
|
||||
"muted": "處於靜音",
|
||||
"pinToStage": "釘選至畫面",
|
||||
"remoteControl": "開始/停用遠端控制",
|
||||
"remoteControl": "啟用/停用遠端控制",
|
||||
"screenSharing": "與會者正在分享他們的畫面",
|
||||
"show": "顯示在台上",
|
||||
"showSelfView": "顯示自我檢視",
|
||||
@@ -1316,12 +1316,12 @@
|
||||
"title": "虛擬背景",
|
||||
"uploadedImage": "上傳圖片{{index}}",
|
||||
"webAssemblyWarning": "不支援 WebAssembly",
|
||||
"webAssemblyWarningDescription": "WebAssembly 遭停用或不被此連覽器支援"
|
||||
"webAssemblyWarningDescription": "WebAssembly 被停用或不被此瀏覽器支援"
|
||||
},
|
||||
"volumeSlider": "音量滑條",
|
||||
"volumeSlider": "音量滑桿",
|
||||
"welcomepage": {
|
||||
"accessibilityLabel": {
|
||||
"join": "點擊即可加入",
|
||||
"join": "點選即可加入",
|
||||
"roomname": "輸入會議室名稱"
|
||||
},
|
||||
"addMeetingName": "新增會議室名稱",
|
||||
@@ -1337,7 +1337,7 @@
|
||||
"getHelp": "取得協助",
|
||||
"go": "開始",
|
||||
"goSmall": "開始",
|
||||
"headerSubtitle": "安全且高品質的會議",
|
||||
"headerSubtitle": "安全且高品質的視訊會議",
|
||||
"headerTitle": "Jitsi Meet",
|
||||
"info": "資訊",
|
||||
"jitsiOnMobile": "Jitsi 手機應用程式 – 下載應用程式,不論何時何地都能發起會議",
|
||||
@@ -1345,15 +1345,15 @@
|
||||
"logo": {
|
||||
"calendar": "行事曆圖示",
|
||||
"desktopPreviewThumbnail": "桌面預覽縮圖",
|
||||
"googleLogo": "Google圖示",
|
||||
"logoDeepLinking": "Jitsi Meet圖示",
|
||||
"microsoftLogo": "Microsoft圖示",
|
||||
"googleLogo": "Google 圖示",
|
||||
"logoDeepLinking": "Jitsi Meet 圖示",
|
||||
"microsoftLogo": "Microsoft 圖示",
|
||||
"policyLogo": "政策圖示"
|
||||
},
|
||||
"mobileDownLoadLinkAndroid": "下載 Android 版本的手機應用程式",
|
||||
"mobileDownLoadLinkFDroid": "前往 F-Droid 下載 Android 版本的手機應用程式",
|
||||
"mobileDownLoadLinkIos": "下載 iOS 版本的手機應用程式",
|
||||
"moderatedMessage": "或以主持人身份<a href=\"{{url}}」rel=\"noopener noreferrer」target=\"_blank\">預先建立會議</a>。",
|
||||
"moderatedMessage": "或以主持人身份<a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">預先建立會議</a>。",
|
||||
"privacy": "隱私權",
|
||||
"recentList": "最近使用",
|
||||
"recentListDelete": "刪除",
|
||||
@@ -1361,7 +1361,7 @@
|
||||
"reducedUIText": "歡迎使用{{app}}!",
|
||||
"roomNameAllowedChars": "會議室名稱不應包含以下字元:? & : ' \" % #",
|
||||
"roomname": "輸入會議室名稱",
|
||||
"roomnameHint": "請輸入您想加入的會議室名稱或網址,您可以用個名稱來建立會議室,只要其他人輸入相同的名稱就能加入會議室喔。",
|
||||
"roomnameHint": "請輸入您想加入的會議室名稱或網址,您可以用一個名稱來建立會議室,只要其他人輸入相同的名稱就能加入會議室喔。",
|
||||
"sendFeedback": "傳送回饋",
|
||||
"settings": "設定",
|
||||
"startMeeting": "開始會議",
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
{
|
||||
"addPeople": {
|
||||
"accessibilityLabel": {
|
||||
"meetingLink": "Meeting link: {{url}}"
|
||||
},
|
||||
"add": "Invite",
|
||||
"addContacts": "Invite your contacts",
|
||||
"contacts": "contacts",
|
||||
@@ -39,6 +42,18 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "Low bandwidth"
|
||||
},
|
||||
"bandwidthSettings": {
|
||||
"assumedBandwidthBps": "e.g. 10000000 for 10 Mbps",
|
||||
"assumedBandwidthBpsWarning": "Higher values might cause network issues.",
|
||||
"customValue": "custom value",
|
||||
"customValueEffect": "to set the actual bps value",
|
||||
"leaveEmpty": "leave empty",
|
||||
"leaveEmptyEffect": "to allow estimations to take place",
|
||||
"possibleValues": "Possible values",
|
||||
"setAssumedBandwidthBps": "Assumed bandwidth (bps)",
|
||||
"title": "Bandwidth settings",
|
||||
"zeroEffect": "to disable video"
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"actions": {
|
||||
"add": "Add breakout room",
|
||||
@@ -156,6 +171,7 @@
|
||||
"localport_plural": "Local ports:",
|
||||
"maxEnabledResolution": "send max",
|
||||
"more": "Show more",
|
||||
"no": "no",
|
||||
"packetloss": "Packet loss:",
|
||||
"participant_id": "Participant id:",
|
||||
"quality": {
|
||||
@@ -174,7 +190,8 @@
|
||||
"status": "Connection:",
|
||||
"transport": "Transport:",
|
||||
"transport_plural": "Transports:",
|
||||
"video_ssrc": "Video SSRC:"
|
||||
"video_ssrc": "Video SSRC:",
|
||||
"yes": "yes"
|
||||
},
|
||||
"dateUtils": {
|
||||
"earlier": "Earlier",
|
||||
@@ -240,6 +257,8 @@
|
||||
"WaitingForHostTitle": "Waiting for the host ...",
|
||||
"Yes": "Yes",
|
||||
"accessibilityLabel": {
|
||||
"Cancel": "Cancel (leave dialog)",
|
||||
"Ok": "OK (save and leave dialog)",
|
||||
"close": "Close dialog",
|
||||
"liveStreaming": "Live Stream",
|
||||
"sharingTabs": "Sharing options"
|
||||
@@ -445,6 +464,9 @@
|
||||
"title": "Embed this meeting"
|
||||
},
|
||||
"feedback": {
|
||||
"accessibilityLabel": {
|
||||
"yourChoice": "Your choice: {{rating}}"
|
||||
},
|
||||
"average": "Average",
|
||||
"bad": "Bad",
|
||||
"detailsLabel": "Tell us more about it.",
|
||||
@@ -673,6 +695,7 @@
|
||||
"connectedTwoMembers": "{{first}} and {{second}} joined the meeting",
|
||||
"dataChannelClosed": "Video quality impaired",
|
||||
"dataChannelClosedDescription": "The bridge channel has been disconnected and thus video quality is limited to its lowest setting.",
|
||||
"disabledIframe": "Embedding is only meant for demo purposes, so this call will disconnect in {{timeout}} minutes.",
|
||||
"disconnected": "disconnected",
|
||||
"displayNotifications": "Display notifications for",
|
||||
"dontRemindMe": "Do not remind me",
|
||||
@@ -867,9 +890,11 @@
|
||||
"lookGood": "Your microphone is working properly",
|
||||
"or": "or",
|
||||
"premeeting": "Pre meeting",
|
||||
"proceedAnyway": "Proceed anyway",
|
||||
"screenSharingError": "Screen sharing error:",
|
||||
"showScreen": "Enable pre meeting screen",
|
||||
"startWithPhone": "Start with phone audio",
|
||||
"unsafeRoomConsent": "I understand the risks, I want to join the meeting",
|
||||
"videoOnlyError": "Video error:",
|
||||
"videoTrackError": "Could not create video track.",
|
||||
"viewAllNumbers": "view all numbers"
|
||||
@@ -971,8 +996,14 @@
|
||||
"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.",
|
||||
"title": "Security Options"
|
||||
"insecureRoomNameWarningNative": "The room name is unsafe. Unwanted participants may join your meeting. {{recommendAction}} Learn more about securing you meeting ",
|
||||
"insecureRoomNameWarningWeb": "The room name is unsafe. Unwanted participants may join your meeting. {{recommendAction}} Learn more about securing you meeting <a href=\"{{securityUrl}}\" rel=\"security\" target=\"_blank\">here</a>.",
|
||||
"title": "Security Options",
|
||||
"unsafeRoomActions": {
|
||||
"meeting": "Consider securing your meeting using the security button.",
|
||||
"prejoin": "Consider using a more unique meeting name.",
|
||||
"welcome": "Consider using a more unique meeting name, or pick one of the suggestions."
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"audio": "Audio",
|
||||
@@ -1140,6 +1171,7 @@
|
||||
"muteEveryoneElse": "Mute everyone else",
|
||||
"muteEveryoneElsesVideoStream": "Stop everyone else's video",
|
||||
"muteEveryonesVideoStream": "Stop everyone's video",
|
||||
"muteGUMPending": "Connecting your microphone",
|
||||
"noiseSuppression": "Noise suppression",
|
||||
"openChat": "Open chat",
|
||||
"participants": "Open participants pane",
|
||||
@@ -1147,6 +1179,7 @@
|
||||
"privateMessage": "Send private message",
|
||||
"profile": "Edit your profile",
|
||||
"raiseHand": "Raise your hand",
|
||||
"reactions": "Reactions",
|
||||
"reactionsMenu": "Reactions menu",
|
||||
"recording": "Toggle recording",
|
||||
"remoteMute": "Mute participant",
|
||||
@@ -1172,6 +1205,7 @@
|
||||
"unmute": "Unmute",
|
||||
"videoblur": "Toggle video blur",
|
||||
"videomute": "Stop camera",
|
||||
"videomuteGUMPending": "Connecting your camera",
|
||||
"videounmute": "Start camera"
|
||||
},
|
||||
"addPeople": "Add people to your call",
|
||||
@@ -1222,6 +1256,7 @@
|
||||
"mute": "Mute",
|
||||
"muteEveryone": "Mute everyone",
|
||||
"muteEveryonesVideo": "Disable everyone's camera",
|
||||
"muteGUMPending": "Connecting your microphone",
|
||||
"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:",
|
||||
@@ -1244,6 +1279,7 @@
|
||||
"reactionLike": "Send thumbs up reaction",
|
||||
"reactionSilence": "Send silence reaction",
|
||||
"reactionSurprised": "Send surprised reaction",
|
||||
"reactions": "Reactions",
|
||||
"security": "Security options",
|
||||
"selectBackground": "Select background",
|
||||
"shareRoom": "Invite someone",
|
||||
@@ -1266,6 +1302,7 @@
|
||||
"unmute": "Unmute",
|
||||
"videoSettings": "Video settings",
|
||||
"videomute": "Stop camera",
|
||||
"videomuteGUMPending": "Connecting your camera",
|
||||
"videounmute": "Start camera"
|
||||
},
|
||||
"transcribing": {
|
||||
@@ -1312,7 +1349,7 @@
|
||||
"audioOnly": "AUD",
|
||||
"audioOnlyExpanded": "You are in low bandwidth mode. In this mode you will receive only audio and screen sharing.",
|
||||
"bestPerformance": "Best performance",
|
||||
"callQuality": "Video Quality",
|
||||
"callQuality": "Video Quality (0 for best performance, 3 for highest quality)",
|
||||
"hd": "HD",
|
||||
"hdTooltip": "Viewing high definition video",
|
||||
"highDefinition": "High definition",
|
||||
@@ -1354,6 +1391,10 @@
|
||||
"videomute": "Participant has stopped the camera"
|
||||
},
|
||||
"virtualBackground": {
|
||||
"accessibilityLabel": {
|
||||
"currentBackground": "Current background: {{background}}",
|
||||
"selectBackground": "Select a background"
|
||||
},
|
||||
"addBackground": "Add background",
|
||||
"apply": "Apply",
|
||||
"backgroundEffectError": "Failed to apply background effect.",
|
||||
|
||||
@@ -10,7 +10,7 @@ The translation of Jitsi Meet is handled editing manually the language files.
|
||||
|
||||
You can use the `update-translation.js` script as follows to help you with that:
|
||||
|
||||
```js
|
||||
```sh
|
||||
cd lang
|
||||
node update-translation.js main-es.json
|
||||
```
|
||||
@@ -29,7 +29,7 @@ You can add translatable text in the HTML:
|
||||
* **via attribute on HTML element** - add **data-i18n** attribute with value the key of the translatable text.
|
||||
|
||||
|
||||
```
|
||||
```html
|
||||
<span data-i18n="dialog.OK">OK</span>
|
||||
```
|
||||
|
||||
@@ -37,7 +37,7 @@ You can add translatable text in the HTML:
|
||||
You can also use APP.translation.generateTranslationHTML(key, options) to get this HTML code as Javascript string.
|
||||
|
||||
|
||||
```
|
||||
```js
|
||||
APP.translation.generateTranslationHTML("dialog.OK") // returns <span data-i18n="dialog.OK">OK</span>
|
||||
```
|
||||
|
||||
@@ -46,7 +46,7 @@ You can add translatable text in the HTML:
|
||||
**Note:** If you dynamically add HTML elements don't forget to call APP.translation.translateElement(jquery_selector) to translate the text initially.
|
||||
|
||||
|
||||
```
|
||||
```js
|
||||
APP.translation.translateString("dialog.OK") // returns the value for the key of the current language file. "OK" for example.
|
||||
```
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// @flow
|
||||
|
||||
/* global APP */
|
||||
import Logger from '@jitsi/logger';
|
||||
|
||||
import { createApiEvent } from '../../react/features/analytics/AnalyticsEvents';
|
||||
@@ -18,12 +17,13 @@ import { isEnabledFromState } from '../../react/features/av-moderation/functions
|
||||
import {
|
||||
endConference,
|
||||
sendTones,
|
||||
setAssumedBandwidthBps,
|
||||
setFollowMe,
|
||||
setLocalSubject,
|
||||
setPassword,
|
||||
setSubject
|
||||
} from '../../react/features/base/conference/actions';
|
||||
import { getCurrentConference } from '../../react/features/base/conference/functions';
|
||||
import { getCurrentConference, isP2pActive } from '../../react/features/base/conference/functions';
|
||||
import { overwriteConfig } from '../../react/features/base/config/actions';
|
||||
import { getWhitelistedJSON } from '../../react/features/base/config/functions.any';
|
||||
import { toggleDialog } from '../../react/features/base/dialog/actions';
|
||||
@@ -113,14 +113,16 @@ import { isAudioMuteButtonDisabled } from '../../react/features/toolbox/function
|
||||
import { setTileView, toggleTileView } from '../../react/features/video-layout/actions.any';
|
||||
import { muteAllParticipants } from '../../react/features/video-menu/actions';
|
||||
import { setVideoQuality } from '../../react/features/video-quality/actions';
|
||||
import { toggleWhiteboard } from '../../react/features/whiteboard/actions.any';
|
||||
import { getJitsiMeetTransport } from '../transport';
|
||||
|
||||
import { API_ID, ENDPOINT_TEXT_MESSAGE_NAME } from './constants';
|
||||
import {
|
||||
API_ID,
|
||||
ENDPOINT_TEXT_MESSAGE_NAME
|
||||
} from './constants';
|
||||
|
||||
const logger = Logger.getLogger(__filename);
|
||||
|
||||
declare var APP: Object;
|
||||
|
||||
/**
|
||||
* List of the available commands.
|
||||
*/
|
||||
@@ -310,6 +312,17 @@ function initCommands() {
|
||||
|
||||
APP.store.dispatch(sendTones(tones, duration, pause));
|
||||
},
|
||||
'set-assumed-bandwidth-bps': value => {
|
||||
logger.debug('Set assumed bandwidth bps command received', value);
|
||||
|
||||
if (typeof value !== 'number' || isNaN(value)) {
|
||||
logger.error('Assumed bandwidth bps must be a number.');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
APP.store.dispatch(setAssumedBandwidthBps(value));
|
||||
},
|
||||
'set-follow-me': value => {
|
||||
logger.debug('Set follow me command received');
|
||||
|
||||
@@ -323,15 +336,16 @@ function initCommands() {
|
||||
},
|
||||
'set-large-video-participant': (participantId, videoType) => {
|
||||
logger.debug('Set large video participant command received');
|
||||
const { getState, dispatch } = APP.store;
|
||||
|
||||
if (!participantId) {
|
||||
sendAnalytics(createApiEvent('largevideo.participant.set'));
|
||||
APP.store.dispatch(selectParticipantInLargeVideo());
|
||||
dispatch(selectParticipantInLargeVideo());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const state = APP.store.getState();
|
||||
const state = getState();
|
||||
const participant = videoType === VIDEO_TYPE.DESKTOP
|
||||
? getVirtualScreenshareParticipantByOwnerId(state, participantId)
|
||||
: getParticipantById(state, participantId);
|
||||
@@ -342,8 +356,9 @@ function initCommands() {
|
||||
return;
|
||||
}
|
||||
|
||||
dispatch(setTileView(false));
|
||||
sendAnalytics(createApiEvent('largevideo.participant.set'));
|
||||
APP.store.dispatch(selectParticipantInLargeVideo(participant.id));
|
||||
dispatch(selectParticipantInLargeVideo(participant.id));
|
||||
},
|
||||
'set-participant-volume': (participantId, volume) => {
|
||||
APP.store.dispatch(setVolume(participantId, volume));
|
||||
@@ -812,6 +827,9 @@ function initCommands() {
|
||||
} else {
|
||||
logger.error(' End Conference not supported');
|
||||
}
|
||||
},
|
||||
'toggle-whiteboard': () => {
|
||||
APP.store.dispatch(toggleWhiteboard());
|
||||
}
|
||||
};
|
||||
transport.on('event', ({ data, name }) => {
|
||||
@@ -963,6 +981,10 @@ function initCommands() {
|
||||
callback(getRoomsInfo(APP.store.getState()));
|
||||
break;
|
||||
}
|
||||
case 'get-p2p-status': {
|
||||
callback(isP2pActive(APP.store.getState()));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@@ -1009,7 +1031,7 @@ function toggleScreenSharing(enable) {
|
||||
* @param {MouseEvent} event - The mouse event to sanitize.
|
||||
* @returns {Object}
|
||||
*/
|
||||
function sanitizeMouseEvent(event: MouseEvent) {
|
||||
function sanitizeMouseEvent(event) {
|
||||
const {
|
||||
clientX,
|
||||
clientY,
|
||||
@@ -1047,7 +1069,7 @@ function sanitizeMouseEvent(event: MouseEvent) {
|
||||
* Jitsi Meet.
|
||||
*/
|
||||
class API {
|
||||
_enabled: boolean;
|
||||
_enabled;
|
||||
|
||||
/**
|
||||
* Initializes the API. Setups message event listeners that will receive
|
||||
@@ -1082,7 +1104,7 @@ class API {
|
||||
* otherwise.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyLargeVideoVisibilityChanged(isHidden: boolean) {
|
||||
notifyLargeVideoVisibilityChanged(isHidden) {
|
||||
this._sendEvent({
|
||||
name: 'large-video-visibility-changed',
|
||||
isVisible: !isHidden
|
||||
@@ -1096,7 +1118,7 @@ class API {
|
||||
* @param {Object} event - The message to pass onto spot.
|
||||
* @returns {void}
|
||||
*/
|
||||
sendProxyConnectionEvent(event: Object) {
|
||||
sendProxyConnectionEvent(event) {
|
||||
this._sendEvent({
|
||||
name: 'proxy-connection-event',
|
||||
...event
|
||||
@@ -1109,7 +1131,7 @@ class API {
|
||||
* @param {Object} event - The event to be sent.
|
||||
* @returns {void}
|
||||
*/
|
||||
_sendEvent(event: Object = {}) {
|
||||
_sendEvent(event = {}) {
|
||||
if (this._enabled) {
|
||||
transport.sendEvent(event);
|
||||
}
|
||||
@@ -1122,7 +1144,7 @@ class API {
|
||||
* @param {boolean} isOpen - True if the chat panel is open.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyChatUpdated(unreadCount: number, isOpen: boolean) {
|
||||
notifyChatUpdated(unreadCount, isOpen) {
|
||||
this._sendEvent({
|
||||
name: 'chat-updated',
|
||||
unreadCount,
|
||||
@@ -1137,7 +1159,7 @@ class API {
|
||||
* @param {boolean} privateMessage - True if the message was a private message.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifySendingChatMessage(message: string, privateMessage: boolean) {
|
||||
notifySendingChatMessage(message, privateMessage) {
|
||||
this._sendEvent({
|
||||
name: 'outgoing-message',
|
||||
message,
|
||||
@@ -1151,7 +1173,7 @@ class API {
|
||||
* @param {MouseEvent} event - The mousemove event.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyMouseEnter(event: MouseEvent) {
|
||||
notifyMouseEnter(event) {
|
||||
this._sendEvent({
|
||||
name: 'mouse-enter',
|
||||
event: sanitizeMouseEvent(event)
|
||||
@@ -1164,7 +1186,7 @@ class API {
|
||||
* @param {MouseEvent} event - The mousemove event.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyMouseLeave(event: MouseEvent) {
|
||||
notifyMouseLeave(event) {
|
||||
this._sendEvent({
|
||||
name: 'mouse-leave',
|
||||
event: sanitizeMouseEvent(event)
|
||||
@@ -1177,7 +1199,7 @@ class API {
|
||||
* @param {MouseEvent} event - The mousemove event.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyMouseMove(event: MouseEvent) {
|
||||
notifyMouseMove(event) {
|
||||
this._sendEvent({
|
||||
name: 'mouse-move',
|
||||
event: sanitizeMouseEvent(event)
|
||||
@@ -1191,7 +1213,7 @@ class API {
|
||||
* @param {boolean} enabled - Whether or not the new moderation status is enabled.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyModerationChanged(mediaType: string, enabled: boolean) {
|
||||
notifyModerationChanged(mediaType, enabled) {
|
||||
this._sendEvent({
|
||||
name: 'moderation-status-changed',
|
||||
mediaType,
|
||||
@@ -1206,7 +1228,7 @@ class API {
|
||||
* @param {string} mediaType - Media type for which the participant was approved.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyParticipantApproved(participantId: string, mediaType: string) {
|
||||
notifyParticipantApproved(participantId, mediaType) {
|
||||
this._sendEvent({
|
||||
name: 'moderation-participant-approved',
|
||||
id: participantId,
|
||||
@@ -1221,7 +1243,7 @@ class API {
|
||||
* @param {string} mediaType - Media type for which the participant was rejected.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyParticipantRejected(participantId: string, mediaType: string) {
|
||||
notifyParticipantRejected(participantId, mediaType) {
|
||||
this._sendEvent({
|
||||
name: 'moderation-participant-rejected',
|
||||
id: participantId,
|
||||
@@ -1237,7 +1259,7 @@ class API {
|
||||
*
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyNotificationTriggered(title: string, description: string) {
|
||||
notifyNotificationTriggered(title, description) {
|
||||
this._sendEvent({
|
||||
description,
|
||||
name: 'notification-triggered',
|
||||
@@ -1251,7 +1273,7 @@ class API {
|
||||
* @param {number} videoQuality - The video quality. The number represents the maximum height of the video streams.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyVideoQualityChanged(videoQuality: number) {
|
||||
notifyVideoQualityChanged(videoQuality) {
|
||||
this._sendEvent({
|
||||
name: 'video-quality-changed',
|
||||
videoQuality
|
||||
@@ -1266,9 +1288,7 @@ class API {
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyReceivedChatMessage(
|
||||
{ body, id, nick, privateMessage, ts }: {
|
||||
body: *, id: string, nick: string, privateMessage: boolean, ts: *
|
||||
} = {}) {
|
||||
{ body, id, nick, privateMessage, ts } = {}) {
|
||||
if (APP.conference.isLocalId(id)) {
|
||||
return;
|
||||
}
|
||||
@@ -1291,7 +1311,7 @@ class API {
|
||||
* @param {Object} props - The display name of the user.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyUserJoined(id: string, props: Object) {
|
||||
notifyUserJoined(id, props) {
|
||||
this._sendEvent({
|
||||
name: 'participant-joined',
|
||||
id,
|
||||
@@ -1306,7 +1326,7 @@ class API {
|
||||
* @param {string} id - User id.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyUserLeft(id: string) {
|
||||
notifyUserLeft(id) {
|
||||
this._sendEvent({
|
||||
name: 'participant-left',
|
||||
id
|
||||
@@ -1321,7 +1341,7 @@ class API {
|
||||
* @param {string} role - The new user role.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyUserRoleChanged(id: string, role: string) {
|
||||
notifyUserRoleChanged(id, role) {
|
||||
this._sendEvent({
|
||||
name: 'participant-role-changed',
|
||||
id,
|
||||
@@ -1337,7 +1357,7 @@ class API {
|
||||
* @param {string} avatarURL - The new avatar URL of the participant.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyAvatarChanged(id: string, avatarURL: string) {
|
||||
notifyAvatarChanged(id, avatarURL) {
|
||||
this._sendEvent({
|
||||
name: 'avatar-changed',
|
||||
avatarURL,
|
||||
@@ -1352,7 +1372,7 @@ class API {
|
||||
* @param {Object} data - The event data.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyEndpointTextMessageReceived(data: Object) {
|
||||
notifyEndpointTextMessageReceived(data) {
|
||||
this._sendEvent({
|
||||
name: 'endpoint-text-message-received',
|
||||
data
|
||||
@@ -1366,7 +1386,7 @@ class API {
|
||||
* @param {string} faceExpression - Detected face expression.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyFaceLandmarkDetected(faceBox: Object, faceExpression: string) {
|
||||
notifyFaceLandmarkDetected(faceBox, faceExpression) {
|
||||
this._sendEvent({
|
||||
name: 'face-landmark-detected',
|
||||
faceBox,
|
||||
@@ -1380,7 +1400,7 @@ class API {
|
||||
* @param {Object} data - The event data.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifySharingParticipantsChanged(data: Object) {
|
||||
notifySharingParticipantsChanged(data) {
|
||||
this._sendEvent({
|
||||
name: 'content-sharing-participants-changed',
|
||||
data
|
||||
@@ -1394,7 +1414,7 @@ class API {
|
||||
* @param {Object} devices - The new device list.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyDeviceListChanged(devices: Object) {
|
||||
notifyDeviceListChanged(devices) {
|
||||
this._sendEvent({
|
||||
name: 'device-list-changed',
|
||||
devices
|
||||
@@ -1412,8 +1432,8 @@ class API {
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyDisplayNameChanged(
|
||||
id: string,
|
||||
{ displayName, formattedDisplayName }: Object) {
|
||||
id,
|
||||
{ displayName, formattedDisplayName }) {
|
||||
this._sendEvent({
|
||||
name: 'display-name-change',
|
||||
displayname: displayName,
|
||||
@@ -1431,8 +1451,8 @@ class API {
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyEmailChanged(
|
||||
id: string,
|
||||
{ email }: Object) {
|
||||
id,
|
||||
{ email }) {
|
||||
this._sendEvent({
|
||||
name: 'email-change',
|
||||
email,
|
||||
@@ -1444,10 +1464,10 @@ class API {
|
||||
* Notify external application (if API is enabled) that the an error has been logged.
|
||||
*
|
||||
* @param {string} logLevel - The message log level.
|
||||
* @param {Array} args - Array of strings composing the log message.
|
||||
* @param {Array<string>} args - Array of strings composing the log message.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyLog(logLevel: string, args: Array<string>) {
|
||||
notifyLog(logLevel, args) {
|
||||
this._sendEvent({
|
||||
name: 'log',
|
||||
logLevel,
|
||||
@@ -1465,7 +1485,7 @@ class API {
|
||||
* user and the type of the room.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyConferenceJoined(roomName: string, id: string, props: Object) {
|
||||
notifyConferenceJoined(roomName, id, props) {
|
||||
this._sendEvent({
|
||||
name: 'video-conference-joined',
|
||||
roomName,
|
||||
@@ -1480,7 +1500,7 @@ class API {
|
||||
* @param {string} roomName - User id.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyConferenceLeft(roomName: string) {
|
||||
notifyConferenceLeft(roomName) {
|
||||
this._sendEvent({
|
||||
name: 'video-conference-left',
|
||||
roomName
|
||||
@@ -1495,7 +1515,7 @@ class API {
|
||||
*
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyDataChannelClosed(code: number, reason: string) {
|
||||
notifyDataChannelClosed(code, reason) {
|
||||
this._sendEvent({
|
||||
name: 'data-channel-closed',
|
||||
code,
|
||||
@@ -1538,7 +1558,7 @@ class API {
|
||||
* @param {boolean} muted - The new muted status.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyAudioMutedStatusChanged(muted: boolean) {
|
||||
notifyAudioMutedStatusChanged(muted) {
|
||||
this._sendEvent({
|
||||
name: 'audio-mute-status-changed',
|
||||
muted
|
||||
@@ -1552,7 +1572,7 @@ class API {
|
||||
* @param {boolean} muted - The new muted status.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyVideoMutedStatusChanged(muted: boolean) {
|
||||
notifyVideoMutedStatusChanged(muted) {
|
||||
this._sendEvent({
|
||||
name: 'video-mute-status-changed',
|
||||
muted
|
||||
@@ -1566,7 +1586,7 @@ class API {
|
||||
* @param {boolean} available - True if available and false otherwise.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyAudioAvailabilityChanged(available: boolean) {
|
||||
notifyAudioAvailabilityChanged(available) {
|
||||
audioAvailable = available;
|
||||
this._sendEvent({
|
||||
name: 'audio-availability-changed',
|
||||
@@ -1581,7 +1601,7 @@ class API {
|
||||
* @param {boolean} available - True if available and false otherwise.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyVideoAvailabilityChanged(available: boolean) {
|
||||
notifyVideoAvailabilityChanged(available) {
|
||||
videoAvailable = available;
|
||||
this._sendEvent({
|
||||
name: 'video-availability-changed',
|
||||
@@ -1596,7 +1616,7 @@ class API {
|
||||
* @param {string} id - User id of the new on stage participant.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyOnStageParticipantChanged(id: string) {
|
||||
notifyOnStageParticipantChanged(id) {
|
||||
this._sendEvent({
|
||||
name: 'on-stage-participant-changed',
|
||||
id
|
||||
@@ -1610,7 +1630,7 @@ class API {
|
||||
* @param {boolean} isVisible - Whether the prejoin video is visible.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyPrejoinVideoVisibilityChanged(isVisible: boolean) {
|
||||
notifyPrejoinVideoVisibilityChanged(isVisible) {
|
||||
this._sendEvent({
|
||||
name: 'on-prejoin-video-changed',
|
||||
isVisible
|
||||
@@ -1644,7 +1664,7 @@ class API {
|
||||
* @param {string} message - Additional information about the error.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyOnCameraError(type: string, message: string) {
|
||||
notifyOnCameraError(type, message) {
|
||||
this._sendEvent({
|
||||
name: 'camera-error',
|
||||
type,
|
||||
@@ -1660,7 +1680,7 @@ class API {
|
||||
* @param {string} message - Additional information about the error.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyOnMicError(type: string, message: string) {
|
||||
notifyOnMicError(type, message) {
|
||||
this._sendEvent({
|
||||
name: 'mic-error',
|
||||
type,
|
||||
@@ -1676,7 +1696,7 @@ class API {
|
||||
* @param {string} error - A failure message, if any.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyFeedbackSubmitted(error: string) {
|
||||
notifyFeedbackSubmitted(error) {
|
||||
this._sendEvent({
|
||||
name: 'feedback-submitted',
|
||||
error
|
||||
@@ -1701,7 +1721,7 @@ class API {
|
||||
* be displayed or hidden.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyFilmstripDisplayChanged(visible: boolean) {
|
||||
notifyFilmstripDisplayChanged(visible) {
|
||||
this._sendEvent({
|
||||
name: 'filmstrip-display-changed',
|
||||
visible
|
||||
@@ -1718,7 +1738,7 @@ class API {
|
||||
* other participant.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyKickedOut(kicked: Object, kicker: Object) {
|
||||
notifyKickedOut(kicked, kicker) {
|
||||
this._sendEvent({
|
||||
name: 'participant-kicked-out',
|
||||
kicked,
|
||||
@@ -1747,7 +1767,7 @@ class API {
|
||||
* share is capturing.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyScreenSharingStatusChanged(on: boolean, details: Object) {
|
||||
notifyScreenSharingStatusChanged(on, details) {
|
||||
this._sendEvent({
|
||||
name: 'screen-sharing-status-changed',
|
||||
on,
|
||||
@@ -1762,7 +1782,7 @@ class API {
|
||||
* @param {string} id - Id of the dominant participant.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyDominantSpeakerChanged(id: string) {
|
||||
notifyDominantSpeakerChanged(id) {
|
||||
this._sendEvent({
|
||||
name: 'dominant-speaker-changed',
|
||||
id
|
||||
@@ -1776,7 +1796,7 @@ class API {
|
||||
* @param {string} subject - Conference subject.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifySubjectChanged(subject: string) {
|
||||
notifySubjectChanged(subject) {
|
||||
this._sendEvent({
|
||||
name: 'subject-change',
|
||||
subject
|
||||
@@ -1791,7 +1811,7 @@ class API {
|
||||
* otherwise.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyTileViewChanged(enabled: boolean) {
|
||||
notifyTileViewChanged(enabled) {
|
||||
this._sendEvent({
|
||||
name: 'tile-view-changed',
|
||||
enabled
|
||||
@@ -1804,7 +1824,7 @@ class API {
|
||||
* @param {string} localStorageContent - The new localStorageContent.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyLocalStorageChanged(localStorageContent: string) {
|
||||
notifyLocalStorageChanged(localStorageContent) {
|
||||
this._sendEvent({
|
||||
name: 'local-storage-changed',
|
||||
localStorageContent
|
||||
@@ -1818,7 +1838,7 @@ class API {
|
||||
* @param {boolean} handRaised - Whether user has raised hand.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyRaiseHandUpdated(id: string, handRaised: boolean) {
|
||||
notifyRaiseHandUpdated(id, handRaised) {
|
||||
this._sendEvent({
|
||||
name: 'raise-hand-updated',
|
||||
handRaised,
|
||||
@@ -1834,7 +1854,7 @@ class API {
|
||||
* @param {string} error - Error type or null if success.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyRecordingStatusChanged(on: boolean, mode: string, error?: string) {
|
||||
notifyRecordingStatusChanged(on, mode, error) {
|
||||
this._sendEvent({
|
||||
name: 'recording-status-changed',
|
||||
on,
|
||||
@@ -1851,7 +1871,7 @@ class API {
|
||||
* @param {number} ttl - The recording download link time to live.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyRecordingLinkAvailable(link: string, ttl: number) {
|
||||
notifyRecordingLinkAvailable(link, ttl) {
|
||||
this._sendEvent({
|
||||
name: 'recording-link-available',
|
||||
link,
|
||||
@@ -1865,7 +1885,7 @@ class API {
|
||||
* @param {Object} participant - Participant data such as id and name.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyKnockingParticipant(participant: Object) {
|
||||
notifyKnockingParticipant(participant) {
|
||||
this._sendEvent({
|
||||
name: 'knocking-participant',
|
||||
participant
|
||||
@@ -1878,7 +1898,7 @@ class API {
|
||||
* @param {Object} error - The error.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyError(error: Object) {
|
||||
notifyError(error) {
|
||||
this._sendEvent({
|
||||
name: 'error-occurred',
|
||||
error
|
||||
@@ -1892,7 +1912,7 @@ class API {
|
||||
* @param {boolean} preventExecution - Whether execution of the button click was prevented or not.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyToolbarButtonClicked(key: string, preventExecution: boolean) {
|
||||
notifyToolbarButtonClicked(key, preventExecution) {
|
||||
this._sendEvent({
|
||||
name: 'toolbar-button-clicked',
|
||||
key,
|
||||
@@ -1906,7 +1926,7 @@ class API {
|
||||
* @param {boolean} supported - If browser is supported or not.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyBrowserSupport(supported: boolean) {
|
||||
notifyBrowserSupport(supported) {
|
||||
this._sendEvent({
|
||||
name: 'browser-support',
|
||||
supported
|
||||
@@ -1993,6 +2013,50 @@ class API {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify external application (if API is enabled) if whiteboard state is
|
||||
* changed.
|
||||
*
|
||||
* @param {WhiteboardStatus} status - The new whiteboard status.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyWhiteboardStatusChanged(status) {
|
||||
this._sendEvent({
|
||||
name: 'whiteboard-status-changed',
|
||||
status
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify external application (if API is enabled) if non participant message
|
||||
* is received.
|
||||
*
|
||||
* @param {string} id - The resource id of the sender.
|
||||
* @param {Object} json - The json carried by the message.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyNonParticipantMessageReceived(id, json) {
|
||||
this._sendEvent({
|
||||
name: 'non-participant-message-received',
|
||||
id,
|
||||
message: json
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Notify the external application (if API is enabled) if the connection type changed.
|
||||
*
|
||||
* @param {boolean} isP2p - Whether the new connection is P2P.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyP2pStatusChanged(isP2p) {
|
||||
this._sendEvent({
|
||||
name: 'p2p-status-changed',
|
||||
isP2p
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Disposes the allocated resources.
|
||||
*
|
||||
|
||||
@@ -15,3 +15,10 @@ export const API_ID = parseURLParams(window.location).jitsi_meet_external_api_id
|
||||
* The payload name for the datachannel/endpoint text message event.
|
||||
*/
|
||||
export const ENDPOINT_TEXT_MESSAGE_NAME = 'endpoint-text-message';
|
||||
|
||||
/**
|
||||
* The min value that can be set for the assumed bandwidth.
|
||||
* Setting it to this value means not assuming any bandwidth,
|
||||
* but rather allowing the estimations to take place.
|
||||
*/
|
||||
export const MIN_ASSUMED_BANDWIDTH_BPS = -1;
|
||||
|
||||
63
modules/API/external/external_api.js
vendored
63
modules/API/external/external_api.js
vendored
@@ -36,7 +36,6 @@ const commands = {
|
||||
cancelPrivateChat: 'cancel-private-chat',
|
||||
closeBreakoutRoom: 'close-breakout-room',
|
||||
displayName: 'display-name',
|
||||
e2eeKey: 'e2ee-key',
|
||||
endConference: 'end-conference',
|
||||
email: 'email',
|
||||
grantModerator: 'grant-moderator',
|
||||
@@ -59,6 +58,7 @@ const commands = {
|
||||
sendEndpointTextMessage: 'send-endpoint-text-message',
|
||||
sendParticipantToRoom: 'send-participant-to-room',
|
||||
sendTones: 'send-tones',
|
||||
setAssumedBandwidthBps: 'set-assumed-bandwidth-bps',
|
||||
setFollowMe: 'set-follow-me',
|
||||
setLargeVideoParticipant: 'set-large-video-participant',
|
||||
setMediaEncryptionKey: 'set-media-encryption-key',
|
||||
@@ -89,7 +89,8 @@ const commands = {
|
||||
toggleSubtitles: 'toggle-subtitles',
|
||||
toggleTileView: 'toggle-tile-view',
|
||||
toggleVirtualBackgroundDialog: 'toggle-virtual-background',
|
||||
toggleVideo: 'toggle-video'
|
||||
toggleVideo: 'toggle-video',
|
||||
toggleWhiteboard: 'toggle-whiteboard'
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -127,8 +128,10 @@ const events = {
|
||||
'mouse-enter': 'mouseEnter',
|
||||
'mouse-leave': 'mouseLeave',
|
||||
'mouse-move': 'mouseMove',
|
||||
'non-participant-message-received': 'nonParticipantMessageReceived',
|
||||
'notification-triggered': 'notificationTriggered',
|
||||
'outgoing-message': 'outgoingMessage',
|
||||
'p2p-status-changed': 'p2pStatusChanged',
|
||||
'participant-joined': 'participantJoined',
|
||||
'participant-kicked-out': 'participantKickedOut',
|
||||
'participant-left': 'participantLeft',
|
||||
@@ -153,7 +156,8 @@ const events = {
|
||||
'subject-change': 'subjectChange',
|
||||
'suspend-detected': 'suspendDetected',
|
||||
'tile-view-changed': 'tileViewChanged',
|
||||
'toolbar-button-clicked': 'toolbarButtonClicked'
|
||||
'toolbar-button-clicked': 'toolbarButtonClicked',
|
||||
'whiteboard-status-changed': 'whiteboardStatusChanged'
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -313,6 +317,7 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
|
||||
* @param {string} [options.e2eeKey] - The key used for End-to-End encryption.
|
||||
* THIS IS EXPERIMENTAL.
|
||||
* @param {string} [options.release] - The key used for specifying release if enabled on the backend.
|
||||
* @param {string} [options.sandbox] - Sandbox directive for the created iframe, if desired.
|
||||
*/
|
||||
constructor(domain, ...args) {
|
||||
super();
|
||||
@@ -330,7 +335,8 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
|
||||
devices,
|
||||
userInfo,
|
||||
e2eeKey,
|
||||
release
|
||||
release,
|
||||
sandbox = ''
|
||||
} = parseArguments(args);
|
||||
const localStorageContent = jitsiLocalStorage.getItem('jitsiLocalStorage');
|
||||
|
||||
@@ -348,7 +354,7 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
|
||||
},
|
||||
release
|
||||
});
|
||||
this._createIFrame(height, width, onload);
|
||||
this._createIFrame(height, width, onload, sandbox);
|
||||
this._transport = new Transport({
|
||||
backend: new PostMessageTransportBackend({
|
||||
postisOptions: {
|
||||
@@ -381,11 +387,12 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
|
||||
* parseSizeParam for format details.
|
||||
* @param {Function} onload - The function that will listen
|
||||
* for onload event.
|
||||
* @param {string} sandbox - Sandbox directive for the created iframe, if desired.
|
||||
* @returns {void}
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
_createIFrame(height, width, onload) {
|
||||
_createIFrame(height, width, onload, sandbox) {
|
||||
const frameName = `jitsiConferenceFrame${id}`;
|
||||
|
||||
this._frame = document.createElement('iframe');
|
||||
@@ -393,26 +400,21 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
|
||||
this._frame.name = frameName;
|
||||
this._frame.id = frameName;
|
||||
this._setSize(height, width);
|
||||
this._frame.sandbox = [
|
||||
'allow-scripts',
|
||||
'allow-same-origin',
|
||||
'allow-popups',
|
||||
'allow-forms',
|
||||
'allow-downloads',
|
||||
'allow-top-navigation-by-user-activation'
|
||||
].join(' ');
|
||||
this._frame.setAttribute('allowFullScreen', 'true');
|
||||
this._frame.style.border = 0;
|
||||
|
||||
if (sandbox) {
|
||||
this._frame.sandbox = sandbox;
|
||||
}
|
||||
|
||||
if (onload) {
|
||||
// waits for iframe resources to load
|
||||
// and fires event when it is done
|
||||
this._frame.onload = onload;
|
||||
}
|
||||
this._frame.src = this._url;
|
||||
|
||||
this._frame = this._parentNode.appendChild(this._frame);
|
||||
|
||||
this._frame.src = this._url;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -560,7 +562,22 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
|
||||
switch (name) {
|
||||
case 'video-conference-joined': {
|
||||
if (typeof this._tmpE2EEKey !== 'undefined') {
|
||||
this.executeCommand(commands.e2eeKey, this._tmpE2EEKey);
|
||||
|
||||
const hexToBytes = hex => {
|
||||
const bytes = [];
|
||||
|
||||
for (let c = 0; c < hex.length; c += 2) {
|
||||
bytes.push(parseInt(hex.substring(c, c + 2), 16));
|
||||
}
|
||||
|
||||
return bytes;
|
||||
};
|
||||
|
||||
this.executeCommand('setMediaEncryptionKey', JSON.stringify({
|
||||
exportedKey: hexToBytes(this._tmpE2EEKey),
|
||||
index: 0
|
||||
}));
|
||||
|
||||
this._tmpE2EEKey = undefined;
|
||||
}
|
||||
|
||||
@@ -678,7 +695,6 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
|
||||
this._numberOfParticipants = allParticipants;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the rooms info in the conference.
|
||||
*
|
||||
@@ -690,6 +706,17 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the conference is P2P.
|
||||
*
|
||||
* @returns {Promise}
|
||||
*/
|
||||
isP2pActive() {
|
||||
return this._transport.sendRequest({
|
||||
name: 'get-p2p-status'
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds event listener to Meet Jitsi.
|
||||
*
|
||||
|
||||
20
modules/API/external/functions.js
vendored
20
modules/API/external/functions.js
vendored
@@ -1,5 +1,3 @@
|
||||
// @flow
|
||||
|
||||
import Logger from '@jitsi/logger';
|
||||
|
||||
const logger = Logger.getLogger(__filename);
|
||||
@@ -11,7 +9,7 @@ const logger = Logger.getLogger(__filename);
|
||||
* the external communication.
|
||||
* @returns {Promise}
|
||||
*/
|
||||
export function getAvailableDevices(transport: Object) {
|
||||
export function getAvailableDevices(transport) {
|
||||
return transport.sendRequest({
|
||||
type: 'devices',
|
||||
name: 'getAvailableDevices'
|
||||
@@ -29,7 +27,7 @@ export function getAvailableDevices(transport: Object) {
|
||||
* the external communication.
|
||||
* @returns {Promise}
|
||||
*/
|
||||
export function getCurrentDevices(transport: Object) {
|
||||
export function getCurrentDevices(transport) {
|
||||
return transport.sendRequest({
|
||||
type: 'devices',
|
||||
name: 'getCurrentDevices'
|
||||
@@ -50,7 +48,7 @@ export function getCurrentDevices(transport: Object) {
|
||||
* Default - 'input'.
|
||||
* @returns {Promise}
|
||||
*/
|
||||
export function isDeviceChangeAvailable(transport: Object, deviceType: string) {
|
||||
export function isDeviceChangeAvailable(transport, deviceType) {
|
||||
return transport.sendRequest({
|
||||
deviceType,
|
||||
type: 'devices',
|
||||
@@ -66,7 +64,7 @@ export function isDeviceChangeAvailable(transport: Object, deviceType: string) {
|
||||
* the external communication.
|
||||
* @returns {Promise}
|
||||
*/
|
||||
export function isDeviceListAvailable(transport: Object) {
|
||||
export function isDeviceListAvailable(transport) {
|
||||
return transport.sendRequest({
|
||||
type: 'devices',
|
||||
name: 'isDeviceListAvailable'
|
||||
@@ -81,7 +79,7 @@ export function isDeviceListAvailable(transport: Object) {
|
||||
* the external communication.
|
||||
* @returns {Promise}
|
||||
*/
|
||||
export function isMultipleAudioInputSupported(transport: Object) {
|
||||
export function isMultipleAudioInputSupported(transport) {
|
||||
return transport.sendRequest({
|
||||
type: 'devices',
|
||||
name: 'isMultipleAudioInputSupported'
|
||||
@@ -97,7 +95,7 @@ export function isMultipleAudioInputSupported(transport: Object) {
|
||||
* @param {string} id - The id of the new device.
|
||||
* @returns {Promise}
|
||||
*/
|
||||
export function setAudioInputDevice(transport: Object, label: string, id: string) {
|
||||
export function setAudioInputDevice(transport, label, id) {
|
||||
return _setDevice(transport, {
|
||||
id,
|
||||
kind: 'audioinput',
|
||||
@@ -114,7 +112,7 @@ export function setAudioInputDevice(transport: Object, label: string, id: string
|
||||
* @param {string} id - The id of the new device.
|
||||
* @returns {Promise}
|
||||
*/
|
||||
export function setAudioOutputDevice(transport: Object, label: string, id: string) {
|
||||
export function setAudioOutputDevice(transport, label, id) {
|
||||
return _setDevice(transport, {
|
||||
id,
|
||||
kind: 'audiooutput',
|
||||
@@ -130,7 +128,7 @@ export function setAudioOutputDevice(transport: Object, label: string, id: strin
|
||||
* @param {Object} device - The new device to be used.
|
||||
* @returns {Promise}
|
||||
*/
|
||||
function _setDevice(transport: Object, device) {
|
||||
function _setDevice(transport, device) {
|
||||
return transport.sendRequest({
|
||||
type: 'devices',
|
||||
name: 'setDevice',
|
||||
@@ -147,7 +145,7 @@ function _setDevice(transport: Object, device) {
|
||||
* @param {string} id - The id of the new device.
|
||||
* @returns {Promise}
|
||||
*/
|
||||
export function setVideoInputDevice(transport: Object, label: string, id: string) {
|
||||
export function setVideoInputDevice(transport, label, id) {
|
||||
return _setDevice(transport, {
|
||||
id,
|
||||
kind: 'videoinput',
|
||||
|
||||
@@ -11,11 +11,11 @@ import { setColorAlpha } from '../../react/features/base/util/helpers';
|
||||
import { setDocumentUrl } from '../../react/features/etherpad/actions';
|
||||
import { setFilmstripVisible } from '../../react/features/filmstrip/actions.any';
|
||||
import {
|
||||
joinLeaveNotificationsDisabled,
|
||||
setNotificationsEnabled,
|
||||
showNotification
|
||||
} from '../../react/features/notifications/actions';
|
||||
import { NOTIFICATION_TIMEOUT_TYPE } from '../../react/features/notifications/constants';
|
||||
import { joinLeaveNotificationsDisabled } from '../../react/features/notifications/functions';
|
||||
import {
|
||||
dockToolbox,
|
||||
setToolboxEnabled,
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// @flow
|
||||
|
||||
/* global APP */
|
||||
import Logger from '@jitsi/logger';
|
||||
|
||||
import { openConnection } from '../../../connection';
|
||||
@@ -23,7 +22,6 @@ import ExternalLoginDialog from './LoginDialog';
|
||||
|
||||
|
||||
let externalAuthWindow;
|
||||
declare var APP: Object;
|
||||
|
||||
const logger = Logger.getLogger(__filename);
|
||||
|
||||
@@ -77,7 +75,7 @@ function doExternalAuth(room, lockPassword) {
|
||||
* back with "?jwt={the JWT token}" query parameter added.
|
||||
* @param {string} [roomName] the name of the conference room.
|
||||
*/
|
||||
export function redirectToTokenAuthService(roomName: string) {
|
||||
export function redirectToTokenAuthService(roomName) {
|
||||
const config = APP.store.getState()['features/base/config'];
|
||||
|
||||
// FIXME: This method will not preserve the other URL params that were
|
||||
@@ -174,7 +172,7 @@ function initJWTTokenListener(room) {
|
||||
* @param {JitsiConference} room
|
||||
* @param {string} [lockPassword] password to use if the conference is locked
|
||||
*/
|
||||
function authenticate(room: Object, lockPassword: string) {
|
||||
function authenticate(room, lockPassword) {
|
||||
const config = APP.store.getState()['features/base/config'];
|
||||
|
||||
if (isTokenAuthEnabled(config) || room.isExternalAuthEnabled()) {
|
||||
@@ -189,7 +187,7 @@ function authenticate(room: Object, lockPassword: string) {
|
||||
* @param {JitsiConference} room
|
||||
* @param {string} [lockPassword] password to use if the conference is locked
|
||||
*/
|
||||
function requireAuth(room: Object, lockPassword: string) {
|
||||
function requireAuth(room, lockPassword) {
|
||||
if (isDialogOpen(APP.store, WaitForOwnerDialog) || isDialogOpen(APP.store, LoginDialog)) {
|
||||
return;
|
||||
}
|
||||
@@ -207,7 +205,7 @@ function requireAuth(room: Object, lockPassword: string) {
|
||||
* @param {string} [lockPassword] password to use if the conference is locked
|
||||
* @returns {Promise}
|
||||
*/
|
||||
function logout(room: Object) {
|
||||
function logout(room) {
|
||||
return new Promise(resolve => {
|
||||
room.room.moderator.logout(resolve);
|
||||
}).then(url => {
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
// @flow
|
||||
|
||||
declare var APP: Object;
|
||||
/* global APP */
|
||||
|
||||
export default {
|
||||
|
||||
@@ -10,7 +8,7 @@ export default {
|
||||
* @param {function} callback - callback to invoke when auth popup is closed.
|
||||
* @returns auth dialog
|
||||
*/
|
||||
showExternalAuthDialog(url: string, callback: ?Function) {
|
||||
showExternalAuthDialog(url, callback) {
|
||||
const dialog = APP.UI.messageHandler.openCenteredPopup(
|
||||
url, 910, 660,
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ const Filmstrip = {
|
||||
// horizontal film strip mode for calculating how tall large video
|
||||
// display should be.
|
||||
if (isFilmstripVisible(APP.store) && !interfaceConfig.VERTICAL_FILMSTRIP) {
|
||||
return document.querySelector('.filmstrip').offsetHeight;
|
||||
return document.querySelector('.filmstrip')?.offsetHeight ?? 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1,261 +0,0 @@
|
||||
/* global APP */
|
||||
import { jitsiLocalStorage } from '@jitsi/js-utils';
|
||||
import Logger from '@jitsi/logger';
|
||||
|
||||
import {
|
||||
ACTION_SHORTCUT_PRESSED as PRESSED,
|
||||
ACTION_SHORTCUT_RELEASED as RELEASED,
|
||||
createShortcutEvent
|
||||
} from '../../react/features/analytics/AnalyticsEvents';
|
||||
import { sendAnalytics } from '../../react/features/analytics/functions';
|
||||
import { clickOnVideo } from '../../react/features/filmstrip/actions';
|
||||
import { openSettingsDialog } from '../../react/features/settings/actions';
|
||||
import { SETTINGS_TABS } from '../../react/features/settings/constants';
|
||||
|
||||
const logger = Logger.getLogger(__filename);
|
||||
|
||||
/**
|
||||
* Map of shortcuts. When a shortcut is registered it enters the mapping.
|
||||
* @type {Map}
|
||||
*/
|
||||
const _shortcuts = new Map();
|
||||
|
||||
/**
|
||||
* Map of registered keyboard keys and translation keys describing the
|
||||
* action performed by the key.
|
||||
* @type {Map}
|
||||
*/
|
||||
const _shortcutsHelp = new Map();
|
||||
|
||||
/**
|
||||
* The key used to save in local storage if keyboard shortcuts are enabled.
|
||||
*/
|
||||
const _enableShortcutsKey = 'enableShortcuts';
|
||||
|
||||
/**
|
||||
* Prefer keyboard handling of these elements over global shortcuts.
|
||||
* If a button is triggered using the Spacebar it should not trigger PTT.
|
||||
* If an input element is focused and M is pressed it should not mute audio.
|
||||
*/
|
||||
const _elementsBlacklist = [
|
||||
'input',
|
||||
'textarea',
|
||||
'button',
|
||||
'[role=button]',
|
||||
'[role=menuitem]',
|
||||
'[role=radio]',
|
||||
'[role=tab]',
|
||||
'[role=option]',
|
||||
'[role=switch]',
|
||||
'[role=range]',
|
||||
'[role=log]'
|
||||
];
|
||||
|
||||
/**
|
||||
* An element selector for elements that have their own keyboard handling.
|
||||
*/
|
||||
const _focusedElementsSelector = `:focus:is(${_elementsBlacklist.join(',')})`;
|
||||
|
||||
/**
|
||||
* Maps keycode to character, id of popover for given function and function.
|
||||
*/
|
||||
const KeyboardShortcut = {
|
||||
|
||||
init() {
|
||||
this._initGlobalShortcuts();
|
||||
|
||||
window.onkeyup = e => {
|
||||
if (!this.getEnabled()) {
|
||||
return;
|
||||
}
|
||||
const key = this._getKeyboardKey(e).toUpperCase();
|
||||
const num = parseInt(key, 10);
|
||||
|
||||
if (!document.querySelector(_focusedElementsSelector)) {
|
||||
if (_shortcuts.has(key)) {
|
||||
_shortcuts.get(key).function(e);
|
||||
} else if (!isNaN(num) && num >= 0 && num <= 9) {
|
||||
APP.store.dispatch(clickOnVideo(num));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
window.onkeydown = e => {
|
||||
if (!this.getEnabled()) {
|
||||
return;
|
||||
}
|
||||
const focusedElement = document.querySelector(_focusedElementsSelector);
|
||||
|
||||
if (!focusedElement) {
|
||||
if (this._getKeyboardKey(e).toUpperCase() === ' ') {
|
||||
if (APP.conference.isLocalAudioMuted()) {
|
||||
sendAnalytics(createShortcutEvent(
|
||||
'push.to.talk',
|
||||
PRESSED));
|
||||
logger.log('Talk shortcut pressed');
|
||||
APP.conference.muteAudio(false);
|
||||
}
|
||||
}
|
||||
} else if (this._getKeyboardKey(e).toUpperCase() === 'ESCAPE') {
|
||||
// Allow to remove focus from selected elements using ESC key.
|
||||
if (focusedElement && focusedElement.blur) {
|
||||
focusedElement.blur();
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Enables/Disables the keyboard shortcuts.
|
||||
* @param {boolean} value - the new value.
|
||||
*/
|
||||
enable(value) {
|
||||
jitsiLocalStorage.setItem(_enableShortcutsKey, value);
|
||||
},
|
||||
|
||||
getEnabled() {
|
||||
// Should be enabled if not explicitly set to false
|
||||
// eslint-disable-next-line no-unneeded-ternary
|
||||
return jitsiLocalStorage.getItem(_enableShortcutsKey) === 'false' ? false : true;
|
||||
},
|
||||
|
||||
getShortcutsDescriptions() {
|
||||
return _shortcutsHelp;
|
||||
},
|
||||
|
||||
/**
|
||||
* Opens the {@SettingsDialog} dialog on the Shortcuts page.
|
||||
*
|
||||
* @returns {void}
|
||||
*/
|
||||
openDialog() {
|
||||
APP.store.dispatch(openSettingsDialog(SETTINGS_TABS.SHORTCUTS, false));
|
||||
},
|
||||
|
||||
/**
|
||||
* Registers a new shortcut.
|
||||
*
|
||||
* @param shortcutChar the shortcut character triggering the action
|
||||
* @param shortcutAttr the "shortcut" html element attribute mapping an
|
||||
* element to this shortcut and used to show the shortcut character on the
|
||||
* element tooltip
|
||||
* @param exec the function to be executed when the shortcut is pressed
|
||||
* @param helpDescription the description of the shortcut that would appear
|
||||
* in the help menu
|
||||
* @param altKey whether or not the alt key must be pressed.
|
||||
*/
|
||||
registerShortcut(// eslint-disable-line max-params
|
||||
shortcutChar,
|
||||
shortcutAttr,
|
||||
exec,
|
||||
helpDescription,
|
||||
altKey = false) {
|
||||
_shortcuts.set(altKey ? `:${shortcutChar}` : shortcutChar, {
|
||||
character: shortcutChar,
|
||||
function: exec,
|
||||
shortcutAttr,
|
||||
altKey
|
||||
});
|
||||
|
||||
if (helpDescription) {
|
||||
this._addShortcutToHelp(altKey ? `:${shortcutChar}` : shortcutChar, helpDescription);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Unregisters a shortcut.
|
||||
*
|
||||
* @param shortcutChar unregisters the given shortcut, which means it will
|
||||
* no longer be usable
|
||||
* @param altKey whether or not shortcut is combo with alt key
|
||||
*/
|
||||
unregisterShortcut(shortcutChar, altKey = false) {
|
||||
_shortcuts.delete(altKey ? `:${shortcutChar}` : shortcutChar);
|
||||
_shortcutsHelp.delete(shortcutChar);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param e a KeyboardEvent
|
||||
* @returns {string} e.key or something close if not supported
|
||||
*/
|
||||
_getKeyboardKey(e) {
|
||||
// If alt is pressed a different char can be returned so this takes
|
||||
// the char from the code. It also prefixes with a colon to differentiate
|
||||
// alt combo from simple keypress.
|
||||
if (e.altKey) {
|
||||
const key = e.code.replace('Key', '');
|
||||
|
||||
return `:${key}`;
|
||||
}
|
||||
|
||||
// If e.key is a string, then it is assumed it already plainly states
|
||||
// the key pressed. This may not be true in all cases, such as with Edge
|
||||
// and "?", when the browser cannot properly map a key press event to a
|
||||
// keyboard key. To be safe, when a key is "Unidentified" it must be
|
||||
// further analyzed by jitsi to a key using e.which.
|
||||
if (typeof e.key === 'string' && e.key !== 'Unidentified') {
|
||||
return e.key;
|
||||
}
|
||||
if (e.type === 'keypress'
|
||||
&& ((e.which >= 32 && e.which <= 126)
|
||||
|| (e.which >= 160 && e.which <= 255))) {
|
||||
return String.fromCharCode(e.which);
|
||||
}
|
||||
|
||||
// try to fallback (0-9A-Za-z and QWERTY keyboard)
|
||||
switch (e.which) {
|
||||
case 27:
|
||||
return 'Escape';
|
||||
case 191:
|
||||
return e.shiftKey ? '?' : '/';
|
||||
}
|
||||
if (e.shiftKey || e.type === 'keypress') {
|
||||
return String.fromCharCode(e.which);
|
||||
}
|
||||
|
||||
return String.fromCharCode(e.which).toLowerCase();
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Adds the given shortcut to the help dialog.
|
||||
*
|
||||
* @param shortcutChar the shortcut character
|
||||
* @param shortcutDescriptionKey the description of the shortcut
|
||||
* @private
|
||||
*/
|
||||
_addShortcutToHelp(shortcutChar, shortcutDescriptionKey) {
|
||||
_shortcutsHelp.set(shortcutChar, shortcutDescriptionKey);
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialise global shortcuts.
|
||||
* Global shortcuts are shortcuts for features that don't have a button or
|
||||
* link associated with the action. In other words they represent actions
|
||||
* triggered _only_ with a shortcut.
|
||||
*/
|
||||
_initGlobalShortcuts() {
|
||||
this.registerShortcut('?', null, () => {
|
||||
sendAnalytics(createShortcutEvent('help'));
|
||||
this.openDialog();
|
||||
}, 'keyboardShortcuts.toggleShortcuts');
|
||||
|
||||
// register SPACE shortcut in two steps to insure visibility of help
|
||||
// message
|
||||
this.registerShortcut(' ', null, () => {
|
||||
sendAnalytics(createShortcutEvent('push.to.talk', RELEASED));
|
||||
logger.log('Talk shortcut released');
|
||||
APP.conference.muteAudio(true);
|
||||
});
|
||||
this._addShortcutToHelp('SPACE', 'keyboardShortcuts.pushToTalk');
|
||||
|
||||
/**
|
||||
* FIXME: Currently focus keys are directly implemented below in
|
||||
* onkeyup. They should be moved to the SmallVideo instead.
|
||||
*/
|
||||
this._addShortcutToHelp('0', 'keyboardShortcuts.focusLocal');
|
||||
this._addShortcutToHelp('1-9', 'keyboardShortcuts.focusRemote');
|
||||
}
|
||||
};
|
||||
|
||||
export default KeyboardShortcut;
|
||||
@@ -1,15 +1,8 @@
|
||||
/* @flow */
|
||||
|
||||
import $ from 'jquery';
|
||||
import jqueryI18next from 'jquery-i18next';
|
||||
|
||||
import i18next from '../../react/features/base/i18n/i18next';
|
||||
|
||||
|
||||
type DocumentElement = {
|
||||
lang: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies that the {@link i18next} instance has finished its initialization.
|
||||
*
|
||||
@@ -18,7 +11,7 @@ type DocumentElement = {
|
||||
*/
|
||||
function _onI18nInitialized() {
|
||||
|
||||
const documentElement: DocumentElement
|
||||
const documentElement
|
||||
= document.documentElement || {};
|
||||
|
||||
$('[data-i18n]').localize();
|
||||
@@ -47,7 +40,7 @@ class Translation {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
generateTranslationHTML(key: string, options: Object) {
|
||||
generateTranslationHTML(key, options) {
|
||||
const optAttr
|
||||
= options ? ` data-i18n-options='${JSON.stringify(options)}'` : '';
|
||||
|
||||
@@ -60,7 +53,7 @@ class Translation {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
translateElement(selector: Object, options: Object) {
|
||||
translateElement(selector, options) {
|
||||
// XXX i18next expects undefined if options are missing.
|
||||
selector.localize(options ? options : undefined);
|
||||
}
|
||||
|
||||
9075
package-lock.json
generated
9075
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
84
package.json
84
package.json
@@ -16,30 +16,26 @@
|
||||
"readmeFilename": "README.md",
|
||||
"dependencies": {
|
||||
"@amplitude/react-native": "2.7.0",
|
||||
"@atlaskit/inline-dialog": "13.0.9",
|
||||
"@atlaskit/inline-message": "11.0.8",
|
||||
"@atlaskit/multi-select": "15.0.5",
|
||||
"@atlaskit/theme": "11.0.2",
|
||||
"@emotion/react": "11.10.0",
|
||||
"@emotion/styled": "11.10.0",
|
||||
"@emotion/react": "11.10.6",
|
||||
"@emotion/styled": "11.10.6",
|
||||
"@giphy/js-fetch-api": "4.7.1",
|
||||
"@giphy/react-components": "5.6.0",
|
||||
"@giphy/react-native-sdk": "1.7.0",
|
||||
"@giphy/react-components": "6.8.1",
|
||||
"@giphy/react-native-sdk": "2.3.0",
|
||||
"@hapi/bourne": "2.0.0",
|
||||
"@jitsi/excalidraw": "https://github.com/jitsi/excalidraw/releases/download/v0.0.12/jitsi-excalidraw-0.0.12.tgz",
|
||||
"@jitsi/excalidraw": "https://github.com/jitsi/excalidraw/releases/download/v0.0.14/jitsi-excalidraw-0.0.14.tgz",
|
||||
"@jitsi/js-utils": "2.0.5",
|
||||
"@jitsi/logger": "2.0.0",
|
||||
"@jitsi/rnnoise-wasm": "0.1.0",
|
||||
"@jitsi/rtcstats": "9.5.1",
|
||||
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz",
|
||||
"@microsoft/microsoft-graph-client": "3.0.1",
|
||||
"@mui/material": "5.10.2",
|
||||
"@mui/styles": "5.10.2",
|
||||
"@mui/material": "5.12.1",
|
||||
"@mui/styles": "5.12.0",
|
||||
"@react-native-async-storage/async-storage": "1.17.3",
|
||||
"@react-native-community/clipboard": "1.5.1",
|
||||
"@react-native-community/netinfo": "7.1.7",
|
||||
"@react-native-community/slider": "4.1.12",
|
||||
"@react-native-google-signin/google-signin": "7.0.4",
|
||||
"@react-native-google-signin/google-signin": "9.0.2",
|
||||
"@react-navigation/bottom-tabs": "6.5.3",
|
||||
"@react-navigation/elements": "1.3.13",
|
||||
"@react-navigation/material-top-tabs": "6.5.2",
|
||||
@@ -48,13 +44,9 @@
|
||||
"@svgr/webpack": "6.3.1",
|
||||
"@tensorflow/tfjs-backend-wasm": "3.13.0",
|
||||
"@tensorflow/tfjs-core": "3.13.0",
|
||||
"@types/amplitude-js": "8.16.2",
|
||||
"@types/audioworklet": "0.0.29",
|
||||
"@types/w3c-image-capture": "1.0.6",
|
||||
"@types/w3c-web-hid": "1.0.3",
|
||||
"@vladmandic/human": "2.6.5",
|
||||
"@vladmandic/human-models": "2.5.9",
|
||||
"@xmldom/xmldom": "0.7.9",
|
||||
"@xmldom/xmldom": "0.8.7",
|
||||
"amplitude-js": "8.2.1",
|
||||
"base64-js": "1.3.1",
|
||||
"bc-css-flags": "3.0.0",
|
||||
@@ -73,7 +65,7 @@
|
||||
"js-md5": "0.6.1",
|
||||
"js-sha512": "0.8.0",
|
||||
"jwt-decode": "2.2.0",
|
||||
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1610.0.0+a1bbdc1f/lib-jitsi-meet.tgz",
|
||||
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1643.0.0+0748d89a/lib-jitsi-meet.tgz",
|
||||
"lodash": "4.17.21",
|
||||
"moment": "2.29.4",
|
||||
"moment-duration-format": "2.2.2",
|
||||
@@ -81,13 +73,13 @@
|
||||
"optional-require": "1.0.3",
|
||||
"promise.allsettled": "1.0.4",
|
||||
"punycode": "2.1.1",
|
||||
"react": "17.0.2",
|
||||
"react-dom": "17.0.2",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0",
|
||||
"react-emoji-render": "1.2.4",
|
||||
"react-focus-lock": "2.5.1",
|
||||
"react-focus-on": "3.8.1",
|
||||
"react-i18next": "10.11.4",
|
||||
"react-linkify": "1.0.0-alpha",
|
||||
"react-native": "0.68.6",
|
||||
"react-native": "0.69.10",
|
||||
"react-native-background-timer": "2.4.1",
|
||||
"react-native-calendar-events": "2.2.0",
|
||||
"react-native-callstats": "3.73.7",
|
||||
@@ -112,7 +104,7 @@
|
||||
"react-native-url-polyfill": "1.3.0",
|
||||
"react-native-video": "https://git@github.com/react-native-video/react-native-video#7c48ae7c8544b2b537fb60194e9620b9fcceae52",
|
||||
"react-native-watch-connectivity": "1.0.11",
|
||||
"react-native-webrtc": "106.0.7",
|
||||
"react-native-webrtc": "111.0.1",
|
||||
"react-native-webview": "11.15.1",
|
||||
"react-native-youtube-iframe": "2.2.1",
|
||||
"react-redux": "7.1.0",
|
||||
@@ -123,7 +115,6 @@
|
||||
"redux-thunk": "2.4.1",
|
||||
"resemblejs": "4.0.0",
|
||||
"seamless-scroll-polyfill": "2.1.8",
|
||||
"styled-components": "3.4.9",
|
||||
"tss-react": "4.4.4",
|
||||
"util": "0.12.1",
|
||||
"uuid": "8.3.2",
|
||||
@@ -134,53 +125,64 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "7.16.0",
|
||||
"@babel/eslint-parser": "7.16.0",
|
||||
"@babel/eslint-parser": "7.21.8",
|
||||
"@babel/plugin-proposal-export-default-from": "7.16.0",
|
||||
"@babel/preset-env": "7.16.0",
|
||||
"@babel/preset-flow": "7.16.0",
|
||||
"@babel/preset-react": "7.16.0",
|
||||
"@jitsi/eslint-config": "4.1.5",
|
||||
"@types/amplitude-js": "8.16.2",
|
||||
"@types/audioworklet": "0.0.29",
|
||||
"@types/dom-screen-wake-lock": "1.0.1",
|
||||
"@types/js-md5": "0.4.3",
|
||||
"@types/lodash": "4.14.182",
|
||||
"@types/punycode": "2.1.0",
|
||||
"@types/react": "17.0.14",
|
||||
"@types/react-dom": "17.0.14",
|
||||
"@types/react-linkify": "1.0.1",
|
||||
"@types/react-native": "0.68.9",
|
||||
"@types/react-native": "0.69.20",
|
||||
"@types/react-native-keep-awake": "2.0.3",
|
||||
"@types/react-native-video": "5.0.14",
|
||||
"@types/react-redux": "7.1.24",
|
||||
"@types/react-window": "1.8.5",
|
||||
"@types/resemblejs": "^4.1.0",
|
||||
"@types/unorm": "1.3.28",
|
||||
"@types/uuid": "8.3.4",
|
||||
"@types/w3c-image-capture": "1.0.6",
|
||||
"@types/w3c-web-hid": "1.0.3",
|
||||
"@types/zxcvbn": "4.4.1",
|
||||
"@typescript-eslint/eslint-plugin": "5.30.5",
|
||||
"@typescript-eslint/parser": "5.30.4",
|
||||
"@typescript-eslint/eslint-plugin": "5.59.5",
|
||||
"@typescript-eslint/parser": "5.59.5",
|
||||
"babel-loader": "8.2.3",
|
||||
"babel-plugin-optional-require": "0.3.1",
|
||||
"circular-dependency-plugin": "5.2.0",
|
||||
"clean-css-cli": "4.3.0",
|
||||
"css-loader": "3.6.0",
|
||||
"eslint": "8.35.0",
|
||||
"eslint-plugin-flowtype": "8.0.3",
|
||||
"eslint-plugin-import": "2.25.2",
|
||||
"eslint": "8.40.0",
|
||||
"eslint-plugin-import": "2.27.5",
|
||||
"eslint-plugin-jsdoc": "37.0.3",
|
||||
"eslint-plugin-react": "7.26.1",
|
||||
"eslint-plugin-react-native": "3.11.0",
|
||||
"eslint-plugin-typescript-sort-keys": "2.1.0",
|
||||
"eslint-plugin-react": "7.32.2",
|
||||
"eslint-plugin-react-native": "4.0.0",
|
||||
"eslint-plugin-typescript-sort-keys": "2.3.0",
|
||||
"jetifier": "1.6.4",
|
||||
"metro-react-native-babel-preset": "0.67.0",
|
||||
"metro-react-native-babel-preset": "0.70.3",
|
||||
"patch-package": "6.4.7",
|
||||
"process": "0.11.10",
|
||||
"sass": "1.26.8",
|
||||
"style-loader": "3.3.1",
|
||||
"traverse": "0.6.6",
|
||||
"ts-loader": "9.4.1",
|
||||
"typescript": "4.7.4",
|
||||
"ts-loader": "9.4.2",
|
||||
"typescript": "5.0.4",
|
||||
"unorm": "1.6.0",
|
||||
"webpack": "5.57.1",
|
||||
"webpack": "5.76.0",
|
||||
"webpack-bundle-analyzer": "4.4.2",
|
||||
"webpack-cli": "4.9.0",
|
||||
"webpack-dev-server": "4.7.3"
|
||||
},
|
||||
"overrides": {
|
||||
"strophe.js@1.5.0": {
|
||||
"@xmldom/xmldom": "0.8.7"
|
||||
}
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
@@ -191,12 +193,14 @@
|
||||
"tsc:web": "tsc --noEmit --project tsconfig.web.json",
|
||||
"tsc:native": "tsc --noEmit --project tsconfig.native.json",
|
||||
"tsc:ci": "npm run tsc:web && npm run tsc:native",
|
||||
"lint:ci": "eslint --ext .js,.ts,.tsx --max-warnings 0 . && npm run tsc:ci && npm run lint:lang",
|
||||
"lint:ci": "eslint --ext .js,.ts,.tsx --max-warnings 0 .",
|
||||
"lint:lang": "for file in lang/*.json; do npx --yes jsonlint -q $file || exit 1; done",
|
||||
"lang-sort": "./resources/lang-sort.sh",
|
||||
"lint-fix": "eslint --ext .js,.ts,.tsx --max-warnings 0 --fix .",
|
||||
"postinstall": "patch-package --error-on-fail && jetify",
|
||||
"validate": "npm ls",
|
||||
"tsc-test:web": "tsc --project tsconfig.web.json --listFilesOnly | grep -v node_modules | grep native",
|
||||
"tsc-test:native": "tsc --project tsconfig.native.json --listFilesOnly | grep -v node_modules | grep web",
|
||||
"start": "make dev"
|
||||
},
|
||||
"resolutions": {
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
diff --git a/node_modules/@giphy/js-analytics/dist/send-pingback.js b/node_modules/@giphy/js-analytics/dist/send-pingback.js
|
||||
index 001345a..f303443 100644
|
||||
index 989f0ff..149e77c 100644
|
||||
--- a/node_modules/@giphy/js-analytics/dist/send-pingback.js
|
||||
+++ b/node_modules/@giphy/js-analytics/dist/send-pingback.js
|
||||
@@ -10,6 +10,9 @@ var global_1 = __importDefault(require("./global"));
|
||||
var environment = (global_1.default === null || global_1.default === void 0 ? void 0 : global_1.default.GIPHY_PINGBACK_URL) || 'https://pingback.giphy.com';
|
||||
var pingBackUrl = environment + "/v2/pingback?apikey=l0HlIwPWyBBUDAUgM";
|
||||
var pingBackUrl = "".concat(environment, "/v2/pingback?apikey=l0HlIwPWyBBUDAUgM");
|
||||
var sendPingback = function (events) {
|
||||
+ // Disabled.
|
||||
+ return Promise.resolve();
|
||||
+
|
||||
var headers = js_util_1.getGiphySDKRequestHeaders();
|
||||
var headers = (0, js_util_1.getGiphySDKRequestHeaders)();
|
||||
/* istanbul ignore next */
|
||||
headers === null || headers === void 0 ? void 0 : headers.set('Content-Type', 'application/json');
|
||||
@@ -1,12 +0,0 @@
|
||||
diff --git a/node_modules/@giphy/js-brand/dist/typography.js b/node_modules/@giphy/js-brand/dist/typography.js
|
||||
index af796bc..585fa00 100644
|
||||
--- a/node_modules/@giphy/js-brand/dist/typography.js
|
||||
+++ b/node_modules/@giphy/js-brand/dist/typography.js
|
||||
@@ -7,7 +7,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.css = exports.fontSize = exports.fontFamily = void 0;
|
||||
var emotion_1 = require("emotion");
|
||||
// eslint-disable-next-line
|
||||
-emotion_1.injectGlobal(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Rg.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Rg.woff') format('woff');\n}\n\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: bold;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Bd.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Bd.woff') format('woff');\n}\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: 900;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_XBd.woff') format('woff');\n}\n@font-face {\n font-family: 'nexablack'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/nexa_black-webfont.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/nexa_black-webfont.woff') format('woff');\n}\n@font-face {\n font-family: 'SSStandard'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/ss-standard.woff') format('woff');\n}\n@font-face {\n font-family: 'SSSocial'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/ss-social.woff') format('woff');\n}\n"], ["\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Rg.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Rg.woff') format('woff');\n}\n\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: bold;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Bd.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Bd.woff') format('woff');\n}\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: 900;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_XBd.woff') format('woff');\n}\n@font-face {\n font-family: 'nexablack'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/nexa_black-webfont.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/nexa_black-webfont.woff') format('woff');\n}\n@font-face {\n font-family: 'SSStandard'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/ss-standard.woff') format('woff');\n}\n@font-face {\n font-family: 'SSSocial'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/ss-social.woff') format('woff');\n}\n"])));
|
||||
exports.fontFamily = {
|
||||
title: "'nexablack', sans-serif",
|
||||
body: 'interface, Helvetica Neue, helvetica, sans-serif;',
|
||||
13
patches/@giphy+js-brand+2.2.2.patch
Normal file
13
patches/@giphy+js-brand+2.2.2.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
diff --git a/node_modules/@giphy/js-brand/dist/typography.js b/node_modules/@giphy/js-brand/dist/typography.js
|
||||
index 75ad96b..815cb8b 100644
|
||||
--- a/node_modules/@giphy/js-brand/dist/typography.js
|
||||
+++ b/node_modules/@giphy/js-brand/dist/typography.js
|
||||
@@ -6,7 +6,7 @@ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cook
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.css = exports.fontSize = exports.fontFamily = exports.addFonts = void 0;
|
||||
var emotion_1 = require("emotion");
|
||||
-var addFonts = function () { return (0, emotion_1.injectGlobal)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Rg.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Rg.woff') format('woff');\n}\n\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: bold;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Bd.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Bd.woff') format('woff');\n}\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: 900;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_XBd.woff') format('woff');\n}\n@font-face {\n font-family: 'nexablack'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/nexa_black-webfont.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/nexa_black-webfont.woff') format('woff');\n}\n@font-face {\n font-family: 'SSStandard'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/ss-standard.woff') format('woff');\n}\n@font-face {\n font-family: 'SSSocial'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/ss-social.woff') format('woff');\n}\n"], ["\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Rg.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Rg.woff') format('woff');\n}\n\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: bold;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Bd.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_Bd.woff') format('woff');\n}\n@font-face {\n font-family: 'interface';\n font-style: normal;\n font-weight: 900;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/InterFace_W_XBd.woff') format('woff');\n}\n@font-face {\n font-family: 'nexablack'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/nexa_black-webfont.woff2') format('woff2'),\n url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/nexa_black-webfont.woff') format('woff');\n}\n@font-face {\n font-family: 'SSStandard'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/ss-standard.woff') format('woff');\n}\n@font-face {\n font-family: 'SSSocial'; \n font-style: normal;\n font-weight: normal;\n src: url('https://s3.amazonaws.com/giphyscripts/react-giphy-brand/fonts/ss-social.woff') format('woff');\n}\n"]))); };
|
||||
+var addFonts = function () { };
|
||||
exports.addFonts = addFonts;
|
||||
try {
|
||||
// in an env where process.env exists,
|
||||
@@ -1,11 +0,0 @@
|
||||
diff --git a/node_modules/eslint-plugin-flowtype/dist/configs/recommended.json b/node_modules/eslint-plugin-flowtype/dist/configs/recommended.json
|
||||
index 90a0d69..2ad7d68 100644
|
||||
--- a/node_modules/eslint-plugin-flowtype/dist/configs/recommended.json
|
||||
+++ b/node_modules/eslint-plugin-flowtype/dist/configs/recommended.json
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
- "parser": "@babel/eslint",
|
||||
+ "parser": "@babel/eslint-parser",
|
||||
"parserOptions": {
|
||||
"babelOptions": {
|
||||
"plugins": [
|
||||
3
react-native-sdk/.npmrc
Normal file
3
react-native-sdk/.npmrc
Normal file
@@ -0,0 +1,3 @@
|
||||
package-lock=true
|
||||
; FIXME Set legacy-peer-deps=false when we upgrade RN.
|
||||
legacy-peer-deps=true
|
||||
48
react-native-sdk/README.md
Normal file
48
react-native-sdk/README.md
Normal file
@@ -0,0 +1,48 @@
|
||||
# <p align="center">Jitsi Meet React Native SDK</p>
|
||||
|
||||
|
||||
## Installation
|
||||
Inside your project, run `npm i @jitsi/react-native-sdk`.<br/><br/>Additionally if not already installed, the following dependencies need to be added:
|
||||
<br/>`npm i @react-native-async-storage/async-storage react-native-webrtc`
|
||||
|
||||
[comment]: # (These deps definitely need to be added manually, more could be neccesary)
|
||||
|
||||
### iOS
|
||||
|
||||
#### Project Info.plist
|
||||
- Add a *Privacy - Camera Usage Description*
|
||||
- Add a *Privacy - Microphone Usage Description*
|
||||
|
||||
#### General
|
||||
- Signing & capabilites:
|
||||
- Add Background modes
|
||||
- Audio
|
||||
- Voice over IP
|
||||
- Background fetch
|
||||
- Add Copy Sounds step:
|
||||
|
||||
```
|
||||
SOUNDS_DIR="${PROJECT_DIR}/../node_modules/rnsdk/sounds"
|
||||
cp $SOUNDS_DIR/* ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/
|
||||
```
|
||||
#### Podfile
|
||||
- At the beginning of your target step add `pod 'ObjectiveDropboxOfficial', :modular_headers => true`
|
||||
|
||||
Run `cd ios && pod install && cd ..`
|
||||
|
||||
### Android
|
||||
|
||||
- In your build.gradle have at least `minSdkVersion = 24`
|
||||
- TODO: HOW TO ADD COPY SOUNDS STEP
|
||||
- Under the `</application>` tag of your AndroidManifest.xml make sure that it includes
|
||||
```
|
||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
```
|
||||
|
||||
### TODOS
|
||||
- Ref ConnectionService to not rely on ReactInstanceHolder anymore
|
||||
- Add Copy Sounds step to build.gradle
|
||||
- Include copy sounds step in podspec (if possible)
|
||||
- Add ranges for dependencies
|
||||
- Add Build_Config for react native to AppInfoModule
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user