Compare commits

..

1 Commits

Author SHA1 Message Date
Calin-Teodor
e049cfc85a chore(rn, versions): bump app and SDK versions 2024-07-31 18:12:33 +03:00
655 changed files with 11790 additions and 39937 deletions

View File

@@ -30,10 +30,12 @@ body:
- label: Android mobile app
- label: iOS mobile app
- label: Custom app using a mobile SDK
validations:
required: true
- type: input
attributes:
label: Browser / app / sdk version
description: Please provide the version of the browser / app / sdk where the problem manifests.
description: Please provice the version of the browser / app / sdk where the problem manifests.
validations:
required: true
- type: textarea

View File

@@ -34,13 +34,9 @@ jobs:
- 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 && npm run tsc:ci
frontend:
name: Build Frontend
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest]
linux-build:
name: Build Frontend (Linux)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
@@ -53,11 +49,20 @@ jobs:
npm -v
- run: npm install
- run: make
- name: Check config.js syntax
run: node config.js
android-rn-bundle-build:
macos-ci:
name: Build Frontend (macOS)
runs-on: macOS-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- run: npm install
- run: make
android-build:
name: Build mobile bundle (Android)
runs-on: macos-15
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
@@ -70,9 +75,13 @@ jobs:
npm -v
- run: npm install
- run: npx react-native bundle --entry-file react/index.native.js --platform android --bundle-output /tmp/android.bundle --reset-cache
ios-rn-bundle-build:
ios-build:
name: Build mobile bundle (iOS)
runs-on: macos-15
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-13, macos-14]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
@@ -88,83 +97,20 @@ jobs:
run: |
uname -a
xcode-select -p
sudo xcode-select -s /Applications/Xcode_16.2.app/Contents/Developer
sudo xcode-select -s /Applications/Xcode_15.2.app/Contents/Developer
xcodebuild -version
- name: setup-cocoapods
uses: ruby/setup-ruby@v1
uses: maxim-lobanov/setup-cocoapods@v1
with:
ruby-version: '3.4'
bundler-cache: true
- run: npx react-native info
podfile-path: ios/Podfile.lock
- name: Install Pods
working-directory: ./ios
run: bundle exec pod install --repo-update --deployment
run: |
pod --version
cd ios
pod install --repo-update
- 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: npx react-native bundle --entry-file react/index.native.js --platform ios --bundle-output /tmp/ios.bundle --reset-cache
android-sdk-build:
name: Build mobile SDK (Android)
runs-on: ubuntu-latest
container: reactnativecommunity/react-native-android:v13.0
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'npm'
- name: Check Node / npm versions
run: |
node -v
npm -v
- run: npm install
- run: |
cd android
./gradlew :sdk:clean
./gradlew :sdk:assembleRelease
ios-sdk-build:
name: Build mobile SDK (iOS)
runs-on: macos-15
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'npm'
- name: Check Node / npm versions
run: |
node -v
npm -v
- run: npm install
- name: setup Xcode
run: |
uname -a
xcode-select -p
sudo xcode-select -s /Applications/Xcode_16.2.app/Contents/Developer
xcodebuild -version
- name: setup-cocoapods
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.4'
bundler-cache: true
- run: npx react-native info
- name: Install Pods
working-directory: ./ios
run: bundle exec pod install --repo-update --deployment
- run: |
xcodebuild clean \
-workspace ios/jitsi-meet.xcworkspace \
-scheme JitsiMeetSDK
xcodebuild archive \
-workspace ios/jitsi-meet.xcworkspace \
-scheme JitsiMeetSDK \
-configuration Release \
-sdk iphoneos \
-destination='generic/platform=iOS' \
-archivePath ios/sdk/out/ios-device \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild -create-xcframework \
-framework ios/sdk/out/ios-device.xcarchive/Products/Library/Frameworks/JitsiMeetSDK.framework \
-output ios/sdk/out/JitsiMeetSDK.xcframework
- run: ls -lR ios/sdk/out
debian-build:
name: Test Debian packages build
runs-on: ubuntu-latest

10
.gitignore vendored
View File

@@ -38,7 +38,6 @@ DerivedData
*.dSYM.zip
*.xcuserstate
project.xcworkspace
**/.xcode.env.local
# Android/IntelliJ
#
@@ -62,7 +61,6 @@ buck-out/
# fastlane
#
.bundle/
**/fastlane/report.xml
**/fastlane/Preview.html
**/fastlane/test_output
@@ -102,9 +100,6 @@ tsconfig.json
react-native-sdk/*.tgz
react-native-sdk/android/src
!react-native-sdk/android/src/main/java/org/jitsi/meet/sdk/JitsiMeetReactNativePackage.java
!react-native-sdk/android/src/main/java/org/jitsi/meet/sdk/JitsiMeetOngoingConferenceService.java
!react-native-sdk/android/src/main/java/org/jitsi/meet/sdk/JMOngoingConferenceModule.java
!react-native-sdk/android/src/main/java/org/jitsi/meet/sdk/RNOngoingNotification.java
react-native-sdk/images
react-native-sdk/ios
react-native-sdk/lang
@@ -113,8 +108,3 @@ react-native-sdk/node_modules
react-native-sdk/react
react-native-sdk/service
react-native-sdk/sounds
# tests
tests/.env
test-results

2
.nvmrc
View File

@@ -1 +1 @@
22
20

16
Gemfile
View File

@@ -1,16 +0,0 @@
source "https://rubygems.org"
ruby ">= 3.4.0"
gem "cocoapods", "~> 1.16"
# (Optional) Fastlane for automation
gem "fastlane"
gem "abbrev"
gem "logger"
gem "mutex_m"
gem "csv"
gem "bigdecimal"
# (Optional) Bundler itself to ensure consistency
gem "bundler"

View File

@@ -1,331 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.7)
base64
nkf
rexml
abbrev (0.1.2)
activesupport (7.2.2.1)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.3.1)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
json (>= 1.5.1)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.1)
aws-partitions (1.1050.0)
aws-sdk-core (3.218.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
base64
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.98.0)
aws-sdk-core (~> 3, >= 3.216.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.181.0)
aws-sdk-core (~> 3, >= 3.216.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.11.0)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
benchmark (0.4.0)
bigdecimal (3.1.9)
claide (1.1.0)
cocoapods (1.16.2)
addressable (~> 2.8)
claide (>= 1.0.2, < 2.0)
cocoapods-core (= 1.16.2)
cocoapods-deintegrate (>= 1.0.3, < 2.0)
cocoapods-downloader (>= 2.1, < 3.0)
cocoapods-plugins (>= 1.0.0, < 2.0)
cocoapods-search (>= 1.0.0, < 2.0)
cocoapods-trunk (>= 1.6.0, < 2.0)
cocoapods-try (>= 1.1.0, < 2.0)
colored2 (~> 3.1)
escape (~> 0.0.4)
fourflusher (>= 2.3.0, < 3.0)
gh_inspector (~> 1.0)
molinillo (~> 0.8.0)
nap (~> 1.0)
ruby-macho (>= 2.3.0, < 3.0)
xcodeproj (>= 1.27.0, < 2.0)
cocoapods-core (1.16.2)
activesupport (>= 5.0, < 8)
addressable (~> 2.8)
algoliasearch (~> 1.0)
concurrent-ruby (~> 1.1)
fuzzy_match (~> 2.0.4)
nap (~> 1.0)
netrc (~> 0.11)
public_suffix (~> 4.0)
typhoeus (~> 1.0)
cocoapods-deintegrate (1.0.5)
cocoapods-downloader (2.1)
cocoapods-plugins (1.0.0)
nap
cocoapods-search (1.0.1)
cocoapods-trunk (1.6.0)
nap (>= 0.8, < 2.0)
netrc (~> 0.11)
cocoapods-try (1.2.0)
colored (1.2)
colored2 (3.1.2)
commander (4.6.0)
highline (~> 2.0.0)
concurrent-ruby (1.3.5)
connection_pool (2.5.0)
csv (3.3.2)
declarative (0.0.20)
digest-crc (0.7.0)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.6.20240107)
dotenv (2.8.1)
drb (2.2.1)
emoji_regex (3.2.3)
escape (0.0.4)
ethon (0.16.0)
ffi (>= 1.15.0)
excon (0.112.0)
faraday (1.10.4)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
faraday-httpclient (~> 1.0)
faraday-multipart (~> 1.0)
faraday-net_http (~> 1.0)
faraday-net_http_persistent (~> 1.0)
faraday-patron (~> 1.0)
faraday-rack (~> 1.0)
faraday-retry (~> 1.0)
ruby2_keywords (>= 0.0.4)
faraday-cookie_jar (0.0.7)
faraday (>= 0.8.0)
http-cookie (~> 1.0.0)
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-multipart (1.1.0)
multipart-post (~> 2.0)
faraday-net_http (1.0.2)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
faraday-retry (1.0.3)
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.0)
fastlane (2.226.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
babosa (>= 1.0.3, < 2.0.0)
bundler (>= 1.12.0, < 3.0.0)
colored (~> 1.2)
commander (~> 4.6)
dotenv (>= 2.1.1, < 3.0.0)
emoji_regex (>= 0.1, < 4.0)
excon (>= 0.71.0, < 1.0.0)
faraday (~> 1.0)
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
fastlane-sirp (>= 1.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
google-cloud-env (>= 1.6.0, < 2.0.0)
google-cloud-storage (~> 1.31)
highline (~> 2.0)
http-cookie (~> 1.0.5)
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
naturally (~> 2.2)
optparse (>= 0.1.1, < 1.0.0)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.5)
simctl (~> 1.6.3)
terminal-notifier (>= 2.0.0, < 3.0.0)
terminal-table (~> 3)
tty-screen (>= 0.6.3, < 1.0.0)
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.4.0)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
ffi (1.17.1)
ffi (1.17.1-aarch64-linux-gnu)
ffi (1.17.1-aarch64-linux-musl)
ffi (1.17.1-arm-linux-gnu)
ffi (1.17.1-arm-linux-musl)
ffi (1.17.1-arm64-darwin)
ffi (1.17.1-x86-linux-gnu)
ffi (1.17.1-x86-linux-musl)
ffi (1.17.1-x86_64-darwin)
ffi (1.17.1-x86_64-linux-gnu)
ffi (1.17.1-x86_64-linux-musl)
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.3)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
mini_mime (~> 1.0)
representable (~> 3.0)
retriable (>= 2.0, < 4.a)
rexml
google-apis-iamcredentials_v1 (0.17.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.31.0)
google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.7.1)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.4.0)
google-cloud-storage (1.47.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.31.0)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.8.1)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
highline (2.0.3)
http-cookie (1.0.8)
domain_name (~> 0.5)
httpclient (2.8.3)
i18n (1.14.7)
concurrent-ruby (~> 1.0)
jmespath (1.6.2)
json (2.10.1)
jwt (2.10.1)
base64
logger (1.6.6)
mini_magick (4.13.2)
mini_mime (1.1.5)
minitest (5.25.4)
molinillo (0.8.0)
multi_json (1.15.0)
multipart-post (2.4.1)
mutex_m (0.3.0)
nanaimo (0.4.0)
nap (1.1.0)
naturally (2.2.1)
netrc (0.11.0)
nkf (0.2.0)
optparse (0.6.0)
os (1.1.4)
plist (3.7.2)
public_suffix (4.0.7)
rake (13.2.1)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.4.1)
rouge (3.28.0)
ruby-macho (2.5.1)
ruby2_keywords (0.0.5)
rubyzip (2.4.1)
securerandom (0.4.1)
security (0.1.5)
signet (0.19.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
multi_json (~> 1.10)
simctl (1.6.10)
CFPropertyList
naturally
sysrandom (1.0.5)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
trailblazer-option (0.1.2)
tty-cursor (0.7.1)
tty-screen (0.8.2)
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
typhoeus (1.4.1)
ethon (>= 0.9.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
uber (0.1.0)
unicode-display_width (2.6.0)
word_wrap (1.0.0)
xcodeproj (1.27.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
nanaimo (~> 0.4.0)
rexml (>= 3.3.6, < 4.0)
xcpretty (0.4.0)
rouge (~> 3.28.0)
xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7)
PLATFORMS
aarch64-linux-gnu
aarch64-linux-musl
arm-linux-gnu
arm-linux-musl
arm64-darwin
ruby
x86-linux-gnu
x86-linux-musl
x86_64-darwin
x86_64-linux-gnu
x86_64-linux-musl
DEPENDENCIES
abbrev
bigdecimal
bundler
cocoapods (~> 1.16)
csv
fastlane
logger
mutex_m
RUBY VERSION
ruby 3.4.2p28
BUNDLED WITH
2.6.3

View File

@@ -17,16 +17,16 @@ STYLES_BUNDLE = css/all.bundle.css
STYLES_DESTINATION = css/all.css
STYLES_MAIN = css/main.scss
ifeq ($(OS),Windows_NT)
WEBPACK = .\node_modules\.bin\webpack --progress
WEBPACK_DEV_SERVER = .\node_modules\.bin\webpack serve --mode development --progress
WEBPACK = .\node_modules\.bin\webpack
WEBPACK_DEV_SERVER = .\node_modules\.bin\webpack serve --mode development
else
WEBPACK = ./node_modules/.bin/webpack --progress
WEBPACK_DEV_SERVER = ./node_modules/.bin/webpack serve --mode development --progress
WEBPACK = ./node_modules/.bin/webpack
WEBPACK_DEV_SERVER = ./node_modules/.bin/webpack serve --mode development
endif
all: compile deploy
all: compile deploy clean
compile: clean
compile:
NODE_OPTIONS=--max-old-space-size=8192 \
$(WEBPACK)
@@ -48,6 +48,8 @@ deploy-appbundle:
$(BUILD_DIR)/external_api.min.js.map \
$(BUILD_DIR)/alwaysontop.min.js \
$(BUILD_DIR)/alwaysontop.min.js.map \
$(BUILD_DIR)/analytics-ga.min.js \
$(BUILD_DIR)/analytics-ga.min.js.map \
$(BUILD_DIR)/face-landmarks-worker.min.js \
$(BUILD_DIR)/face-landmarks-worker.min.js.map \
$(BUILD_DIR)/noise-suppressor-worklet.min.js \

View File

@@ -34,7 +34,7 @@ mobile apps:
| Android | Android (F-Droid) | iOS |
|:-:|:-:|:-:|
| [<img src="resources/img/google-play-badge.png" height="50">](https://play.google.com/store/apps/details?id=org.jitsi.meet) | [<img src="resources/img/f-droid-badge.png" height="50">](https://f-droid.org/packages/org.jitsi.meet/) | [<img src="resources/img/appstore-badge.png" height="50">](https://itunes.apple.com/us/app/jitsi-meet/id1165103905) |
| [<img src="resources/img/google-play-badge.png" height="50">](https://play.google.com/store/apps/details?id=org.jitsi.meet) | [<img src="resources/img/f-droid-badge.png" height="50">](https://f-droid.org/en/packages/org.jitsi.meet/) | [<img src="resources/img/appstore-badge.png" height="50">](https://itunes.apple.com/us/app/jitsi-meet/id1165103905) |
If you are feeling adventurous and want to get an early scoop of the features as they are being
developed you can also sign up for our open beta testing here:

View File

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

View File

@@ -15,6 +15,12 @@ def vcode = (int) (((new Date().getTime() / 1000) - 1546297200) / 10)
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
packagingOptions {
jniLibs {
excludes += ['lib/*/libhermes*.so']
}
}
defaultConfig {
applicationId 'org.jitsi.meet'

View File

@@ -211,6 +211,11 @@ public class MainActivity extends JitsiMeetActivity {
super.onPictureInPictureModeChanged(isInPictureInPictureMode);
Log.d(TAG, "Is in picture-in-picture mode: " + isInPictureInPictureMode);
if (!isInPictureInPictureMode) {
this.startActivity(new Intent(this, getClass())
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
}
}
// Helper methods

View File

@@ -17,13 +17,15 @@ buildscript {
}
ext {
kotlinVersion = "1.9.24"
buildToolsVersion = "34.0.0"
kotlinVersion = "1.7.0"
buildToolsVersion = "33.0.2"
compileSdkVersion = 34
minSdkVersion = 26
minSdkVersion = 24
targetSdkVersion = 34
supportLibVersion = "28.0.0"
ndkVersion = "26.1.10909125"
// We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP.
ndkVersion = "23.1.7779620"
// The Maven artifact groupId of the third-party react-native modules which
// Jitsi Meet SDK for Android depends on and which are not available in
@@ -41,12 +43,14 @@ ext {
googleServicesEnabled = project.file('app/google-services.json').exists() && !libreBuild
//React Native and Hermes Version
rnVersion = "0.75.5"
//React Native Version
rnVersion = "0.73.8"
}
allprojects {
repositories {
// Android JSC is installed from npm.
maven { url("$rootDir/../node_modules/jsc-android/dist") }
mavenCentral()
google()
maven { url 'https://www.jitpack.io' }
@@ -69,29 +73,10 @@ allprojects {
}
}
// Due to a dependency conflict between React Native and the Fresco library used by GiphySDK,
// GIFs appear as static images instead of animating
// https://github.com/Giphy/giphy-react-native-sdk/commit/7fe466ed6fddfaec95f9cbc959d33bd75ad8f900
configurations.configureEach {
resolutionStrategy {
forcedModules = [
'com.facebook.fresco:fresco:3.2.0',
'com.facebook.fresco:animated-gif:3.2.0',
'com.facebook.fresco:animated-base:3.2.0',
'com.facebook.fresco:animated-drawable:3.2.0',
'com.facebook.fresco:animated-webp:3.2.0',
'com.facebook.fresco:webpsupport:3.2.0',
'com.facebook.fresco:imagepipeline-okhttp3:3.2.0',
'com.facebook.fresco:middleware:3.2.0',
'com.facebook.fresco:nativeimagetranscoder:3.2.0'
]
}
}
// Third-party react-native modules which Jitsi Meet SDK for Android depends
// on and which are not available in third-party Maven repositories need to
// be deployed in a Maven repository of ours.
//
if (project.name.startsWith('react-native-')) {
apply plugin: 'maven-publish'

View File

@@ -26,5 +26,5 @@ android.useAndroidX=true
android.enableJetifier=true
android.bundle.enableUncompressedNativeLibs=false
appVersion=99.0.0
sdkVersion=0.0.0
appVersion=24.3.0
sdkVersion=9.3.0

View File

@@ -9,6 +9,8 @@ THE_MVN_REPO=${MVN_REPO:-${1:-$DEFAULT_MVN_REPO}}
MVN_HTTP=0
DEFAULT_SDK_VERSION=$(grep sdkVersion ${THIS_DIR}/../gradle.properties | cut -d"=" -f2)
SDK_VERSION=${OVERRIDE_SDK_VERSION:-${DEFAULT_SDK_VERSION}}
JSC_VERSION="r"$(jq -r '.dependencies."jsc-android"' ${THIS_DIR}/../../node_modules/react-native/package.json | cut -d . -f 1 | cut -c 2-)
DO_GIT_TAG=${GIT_TAG:-0}
if [[ $THE_MVN_REPO == http* ]]; then
MVN_HTTP=1
@@ -22,7 +24,34 @@ export MVN_REPO=$THE_MVN_REPO
echo "Releasing Jitsi Meet SDK ${SDK_VERSION}"
echo "Using ${MVN_REPO} as the Maven repo"
if [[ $MVN_HTTP == 0 ]]; then
if [[ $MVN_HTTP == 1 ]]; then
# Push JSC
echo "Pushing JSC ${JSC_VERSION} to the Maven repo"
pushd ${THIS_DIR}/../../node_modules/jsc-android/dist/org/webkit/android-jsc/${JSC_VERSION}
mvn \
deploy:deploy-file \
-Durl=${MVN_REPO} \
-DrepositoryId=${MVN_REPO_ID} \
-Dfile=android-jsc-${JSC_VERSION}.aar \
-Dpackaging=aar \
-DgeneratePom=false \
-DpomFile=android-jsc-${JSC_VERSION}.pom || true
popd
else
# Push JSC, if necessary
if [[ ! -d ${MVN_REPO}/org/webkit/android-jsc/${JSC_VERSION} ]]; then
echo "Pushing JSC ${JSC_VERSION} to the Maven repo"
pushd ${THIS_DIR}/../../node_modules/jsc-android/dist/org/webkit/android-jsc/${JSC_VERSION}
mvn \
deploy:deploy-file \
-Durl=${MVN_REPO} \
-Dfile=android-jsc-${JSC_VERSION}.aar \
-Dpackaging=aar \
-DgeneratePom=false \
-DpomFile=android-jsc-${JSC_VERSION}.pom
popd
fi
# Check if an SDK with that same version has already been released
if [[ -d ${MVN_REPO}/org/jitsi/react/jitsi-meet-sdk/${SDK_VERSION} ]]; then
echo "There is already a release with that version in the Maven repo!"
@@ -38,12 +67,15 @@ pushd ${THIS_DIR}/../
./gradlew publish
popd
# The artifacts are now on the Maven repo, commit them
if [[ $MVN_HTTP == 0 ]]; then
if [[ $DO_GIT_TAG == 1 ]]; then
# The artifacts are now on the Maven repo, commit them
pushd ${MVN_REPO_PATH}
git add -A .
git commit -m "Jitsi Meet SDK + dependencies: ${SDK_VERSION}"
popd
# Tag the release
git tag android-sdk-${SDK_VERSION}
fi
# Done!

View File

@@ -2,4 +2,4 @@
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
exec ${THIS_DIR}/../../node_modules/react-native/scripts/packager.sh --reset-cache
exec ${THIS_DIR}/../../node_modules/react-native/scripts/launchPackager.command --reset-cache

View File

@@ -8,7 +8,6 @@ android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
buildConfigField "String", "SDK_VERSION", "\"$sdkVersion\""
}
buildTypes {
@@ -42,7 +41,6 @@ dependencies {
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
api "com.facebook.react:react-android:$rootProject.ext.rnVersion"
api "com.facebook.react:hermes-android:$rootProject.ext.rnVersion"
//noinspection GradleDynamicVersion
implementation 'org.webkit:android-jsc:+'
@@ -58,7 +56,7 @@ dependencies {
if (!rootProject.ext.libreBuild) {
implementation project(':react-native-amplitude')
implementation project(':react-native-giphy')
implementation(project(':react-native-google-signin')) {
implementation(project(":react-native-google-signin")) {
exclude group: 'com.google.android.gms'
exclude group: 'androidx'
}
@@ -140,7 +138,8 @@ android.libraryVariants.all { def variant ->
// Run the bundler
commandLine(
"node",
"node_modules/react-native/scripts/bundle.js",
"node_modules/react-native/local-cli/cli.js",
"bundle",
"--platform", "android",
"--dev", "${devEnabled}",
"--reset-cache",

View File

@@ -1,5 +1,5 @@
/*
* Copyright @ 2017-present 8x8, Inc.
* Copyright @ 2017-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -37,7 +37,6 @@ class AppInfoModule
public static final String NAME = "AppInfo";
public static final boolean GOOGLE_SERVICES_ENABLED = getGoogleServicesEnabled();
public static final boolean LIBRE_BUILD = getLibreBuild();
public static final String SDK_VERSION = getSdkVersion();
public AppInfoModule(ReactApplicationContext reactContext) {
super(reactContext);
@@ -80,7 +79,6 @@ class AppInfoModule
constants.put(
"version",
packageInfo == null ? "" : packageInfo.versionName);
constants.put("sdkVersion", SDK_VERSION);
constants.put("LIBRE_BUILD", LIBRE_BUILD);
constants.put("GOOGLE_SERVICES_ENABLED", GOOGLE_SERVICES_ENABLED);
@@ -118,19 +116,6 @@ class AppInfoModule
return false;
}
/**
* Gets the SDK version.
*/
private static String getSdkVersion() {
Object sdkVersion = getBuildConfigValue("SDK_VERSION");
if (sdkVersion !=null) {
return (String) sdkVersion;
}
return "";
}
/**
* Gets build config value of a certain field.
*

View File

@@ -18,6 +18,7 @@ package org.jitsi.meet.sdk;
import android.content.Context;
import android.media.AudioManager;
import android.os.Build;
import android.telecom.CallAudioState;
import androidx.annotation.RequiresApi;
@@ -33,6 +34,7 @@ import org.jitsi.meet.sdk.log.JitsiMeetLogger;
* {@link AudioModeModule.AudioDeviceHandlerInterface} module implementing device handling for
* Android versions >= O when ConnectionService is enabled.
*/
@RequiresApi(Build.VERSION_CODES.O)
class AudioDeviceHandlerConnectionService implements
AudioModeModule.AudioDeviceHandlerInterface,
RNConnectionService.CallAudioStateListener {

View File

@@ -20,6 +20,7 @@ import android.media.AudioAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioFocusRequest;
import android.media.AudioManager;
import android.os.Build;
import java.util.HashSet;
import java.util.Set;
@@ -226,17 +227,22 @@ class AudioDeviceHandlerGeneric implements
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setMicrophoneMute(false);
int gotFocus = audioManager.requestAudioFocus(new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.build()
)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(this)
.build()
);
int gotFocus;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
gotFocus = audioManager.requestAudioFocus(new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.build()
)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(this)
.build()
);
} else {
gotFocus = audioManager.requestAudioFocus(this, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN);
}
if (gotFocus == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
JitsiMeetLogger.w(TAG + " Audio focus request failed");

View File

@@ -20,6 +20,7 @@ import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Build;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
@@ -57,6 +58,7 @@ import java.util.concurrent.Executors;
* Before a call has started and after it has ended the
* {@code AudioModeModule.DEFAULT} mode should be used.
*/
@SuppressLint("AnnotateVersionCheck")
@ReactModule(name = AudioModeModule.NAME)
class AudioModeModule extends ReactContextBaseJavaModule {
public static final String NAME = "AudioMode";
@@ -82,10 +84,11 @@ class AudioModeModule extends ReactContextBaseJavaModule {
/**
* Whether or not the ConnectionService is used for selecting audio devices.
*/
private static boolean useConnectionService_ = true;
private static final boolean supportsConnectionService = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
private static boolean useConnectionService_ = supportsConnectionService;
static boolean useConnectionService() {
return useConnectionService_;
return supportsConnectionService && useConnectionService_;
}
/**
@@ -136,11 +139,6 @@ class AudioModeModule extends ReactContextBaseJavaModule {
*/
private String userSelectedDevice;
/**
* Whether or not audio is disabled.
*/
private boolean audioDisabled;
/**
* Initializes a new module instance. There shall be a single instance of
* this module throughout the lifetime of the application.
@@ -241,12 +239,6 @@ class AudioModeModule extends ReactContextBaseJavaModule {
audioDeviceHandler.stop();
}
audioDeviceHandler = null;
if (audioDisabled) {
return;
}
if (useConnectionService()) {
audioDeviceHandler = new AudioDeviceHandlerConnectionService(audioManager);
} else {
@@ -289,27 +281,6 @@ class AudioModeModule extends ReactContextBaseJavaModule {
});
}
@ReactMethod
public void setDisabled(final boolean disabled, final Promise promise) {
if (audioDisabled == disabled) {
promise.resolve(null);
return;
}
JitsiMeetLogger.i(TAG + " audio disabled: " + disabled);
audioDisabled = disabled;
setAudioDeviceHandler();
if (disabled) {
mode = -1;
availableDevices.clear();
resetSelectedDevice();
}
promise.resolve(null);
}
/**
* Public method to set the current audio mode.
*
@@ -319,12 +290,7 @@ class AudioModeModule extends ReactContextBaseJavaModule {
*/
@ReactMethod
public void setMode(final int mode, final Promise promise) {
if (audioDisabled) {
promise.resolve(null);
return;
}
if (mode < DEFAULT || mode > VIDEO_CALL) {
if (mode != DEFAULT && mode != AUDIO_CALL && mode != VIDEO_CALL) {
promise.reject("setMode", "Invalid audio mode " + mode);
return;
}

View File

@@ -78,11 +78,7 @@ public class BroadcastAction {
SEND_CHAT_MESSAGE("org.jitsi.meet.SEND_CHAT_MESSAGE"),
SET_VIDEO_MUTED("org.jitsi.meet.SET_VIDEO_MUTED"),
SET_CLOSED_CAPTIONS_ENABLED("org.jitsi.meet.SET_CLOSED_CAPTIONS_ENABLED"),
TOGGLE_CAMERA("org.jitsi.meet.TOGGLE_CAMERA"),
SHOW_NOTIFICATION("org.jitsi.meet.SHOW_NOTIFICATION"),
HIDE_NOTIFICATION("org.jitsi.meet.HIDE_NOTIFICATION"),
START_RECORDING("org.jitsi.meet.START_RECORDING"),
STOP_RECORDING("org.jitsi.meet.STOP_RECORDING");
TOGGLE_CAMERA("org.jitsi.meet.TOGGLE_CAMERA");
private final String action;

View File

@@ -91,7 +91,7 @@ public class BroadcastEvent {
VIDEO_MUTED_CHANGED("org.jitsi.meet.VIDEO_MUTED_CHANGED"),
READY_TO_CLOSE("org.jitsi.meet.READY_TO_CLOSE"),
TRANSCRIPTION_CHUNK_RECEIVED("org.jitsi.meet.TRANSCRIPTION_CHUNK_RECEIVED"),
CUSTOM_BUTTON_PRESSED("org.jitsi.meet.CUSTOM_BUTTON_PRESSED");
CUSTOM_OVERFLOW_MENU_BUTTON_PRESSED("org.jitsi.meet.CUSTOM_OVERFLOW_MENU_BUTTON_PRESSED");
private static final String CONFERENCE_BLURRED_NAME = "CONFERENCE_BLURRED";
private static final String CONFERENCE_FOCUSED_NAME = "CONFERENCE_FOCUSED";
@@ -109,7 +109,7 @@ public class BroadcastEvent {
private static final String VIDEO_MUTED_CHANGED_NAME = "VIDEO_MUTED_CHANGED";
private static final String READY_TO_CLOSE_NAME = "READY_TO_CLOSE";
private static final String TRANSCRIPTION_CHUNK_RECEIVED_NAME = "TRANSCRIPTION_CHUNK_RECEIVED";
private static final String CUSTOM_BUTTON_PRESSED_NAME = "CUSTOM_BUTTON_PRESSED";
private static final String CUSTOM_OVERFLOW_MENU_BUTTON_PRESSED_NAME = "CUSTOM_OVERFLOW_MENU_BUTTON_PRESSED";
private final String action;
@@ -164,8 +164,8 @@ public class BroadcastEvent {
return READY_TO_CLOSE;
case TRANSCRIPTION_CHUNK_RECEIVED_NAME:
return TRANSCRIPTION_CHUNK_RECEIVED;
case CUSTOM_BUTTON_PRESSED_NAME:
return CUSTOM_BUTTON_PRESSED;
case CUSTOM_OVERFLOW_MENU_BUTTON_PRESSED_NAME:
return CUSTOM_OVERFLOW_MENU_BUTTON_PRESSED;
}
return null;

View File

@@ -1,13 +1,11 @@
package org.jitsi.meet.sdk;
import android.content.Intent;
import android.os.Bundle;
public class BroadcastIntentHelper {
public static Intent buildSetAudioMutedIntent(boolean muted) {
Intent intent = new Intent(BroadcastAction.Type.SET_AUDIO_MUTED.getAction());
intent.putExtra("muted", muted);
return intent;
}
@@ -19,21 +17,18 @@ public class BroadcastIntentHelper {
Intent intent = new Intent(BroadcastAction.Type.SEND_ENDPOINT_TEXT_MESSAGE.getAction());
intent.putExtra("to", to);
intent.putExtra("message", message);
return intent;
}
public static Intent buildToggleScreenShareIntent(boolean enabled) {
Intent intent = new Intent(BroadcastAction.Type.TOGGLE_SCREEN_SHARE.getAction());
intent.putExtra("enabled", enabled);
return intent;
}
public static Intent buildOpenChatIntent(String participantId) {
Intent intent = new Intent(BroadcastAction.Type.OPEN_CHAT.getAction());
intent.putExtra("to", participantId);
return intent;
}
@@ -45,98 +40,28 @@ public class BroadcastIntentHelper {
Intent intent = new Intent(BroadcastAction.Type.SEND_CHAT_MESSAGE.getAction());
intent.putExtra("to", participantId);
intent.putExtra("message", message);
return intent;
}
public static Intent buildSetVideoMutedIntent(boolean muted) {
Intent intent = new Intent(BroadcastAction.Type.SET_VIDEO_MUTED.getAction());
intent.putExtra("muted", muted);
return intent;
}
public static Intent buildSetClosedCaptionsEnabledIntent(boolean enabled) {
Intent intent = new Intent(BroadcastAction.Type.SET_CLOSED_CAPTIONS_ENABLED.getAction());
intent.putExtra("enabled", enabled);
return intent;
}
public static Intent buildRetrieveParticipantsInfo(String requestId) {
Intent intent = new Intent(BroadcastAction.Type.RETRIEVE_PARTICIPANTS_INFO.getAction());
intent.putExtra("requestId", requestId);
return intent;
}
public static Intent buildToggleCameraIntent() {
return new Intent(BroadcastAction.Type.TOGGLE_CAMERA.getAction());
}
public static Intent buildShowNotificationIntent(
String appearance, String description, String timeout, String title, String uid) {
Intent intent = new Intent(BroadcastAction.Type.SHOW_NOTIFICATION.getAction());
intent.putExtra("appearance", appearance);
intent.putExtra("description", description);
intent.putExtra("timeout", timeout);
intent.putExtra("title", title);
intent.putExtra("uid", uid);
return intent;
}
public static Intent buildHideNotificationIntent(String uid) {
Intent intent = new Intent(BroadcastAction.Type.HIDE_NOTIFICATION.getAction());
intent.putExtra("uid", uid);
return intent;
}
public enum RecordingMode {
FILE("file"),
STREAM("stream");
private final String mode;
RecordingMode(String mode) {
this.mode = mode;
}
public String getMode() {
return mode;
}
}
public static Intent buildStartRecordingIntent(
RecordingMode mode,
String dropboxToken,
boolean shouldShare,
String rtmpStreamKey,
String rtmpBroadcastID,
String youtubeStreamKey,
String youtubeBroadcastID,
Bundle extraMetadata,
boolean transcription) {
Intent intent = new Intent(BroadcastAction.Type.START_RECORDING.getAction());
intent.putExtra("mode", mode.getMode());
intent.putExtra("dropboxToken", dropboxToken);
intent.putExtra("shouldShare", shouldShare);
intent.putExtra("rtmpStreamKey", rtmpStreamKey);
intent.putExtra("rtmpBroadcastID", rtmpBroadcastID);
intent.putExtra("youtubeStreamKey", youtubeStreamKey);
intent.putExtra("youtubeBroadcastID", youtubeBroadcastID);
intent.putExtra("extraMetadata", extraMetadata);
intent.putExtra("transcription", transcription);
return intent;
}
public static Intent buildStopRecordingIntent(RecordingMode mode, boolean transcription) {
Intent intent = new Intent(BroadcastAction.Type.STOP_RECORDING.getAction());
intent.putExtra("mode", mode.getMode());
intent.putExtra("transcription", transcription);
return intent;
}
}

View File

@@ -37,6 +37,7 @@ import java.util.Objects;
*
* @author Pawel Domas
*/
@RequiresApi(api = Build.VERSION_CODES.O)
public class ConnectionService extends android.telecom.ConnectionService {
/**

View File

@@ -97,10 +97,6 @@ class ExternalAPIModule extends ReactContextBaseJavaModule {
constants.put("SET_VIDEO_MUTED", BroadcastAction.Type.SET_VIDEO_MUTED.getAction());
constants.put("SET_CLOSED_CAPTIONS_ENABLED", BroadcastAction.Type.SET_CLOSED_CAPTIONS_ENABLED.getAction());
constants.put("TOGGLE_CAMERA", BroadcastAction.Type.TOGGLE_CAMERA.getAction());
constants.put("SHOW_NOTIFICATION", BroadcastAction.Type.SHOW_NOTIFICATION.getAction());
constants.put("HIDE_NOTIFICATION", BroadcastAction.Type.HIDE_NOTIFICATION.getAction());
constants.put("START_RECORDING", BroadcastAction.Type.START_RECORDING.getAction());
constants.put("STOP_RECORDING", BroadcastAction.Type.STOP_RECORDING.getAction());
return constants;
}

View File

@@ -54,8 +54,6 @@ public class JitsiMeetActivity extends AppCompatActivity
private static final String ACTION_JITSI_MEET_CONFERENCE = "org.jitsi.meet.CONFERENCE";
private static final String JITSI_MEET_CONFERENCE_OPTIONS = "JitsiMeetConferenceOptions";
private boolean isReadyToClose;
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -126,8 +124,6 @@ public class JitsiMeetActivity extends AppCompatActivity
@Override
public void onDestroy() {
JitsiMeetLogger.i("onDestroy()");
// Here we are trying to handle the following corner case: an application using the SDK
// is using this Activity for displaying meetings, but there is another "main" Activity
// with other content. If this Activity is "swiped out" from the recent list we will get
@@ -135,10 +131,7 @@ public class JitsiMeetActivity extends AppCompatActivity
// current meeting, but when our view is detached from React the JS <-> Native bridge won't
// be operational so the external API won't be able to notify the native side that the
// conference terminated. Thus, try our best to clean up.
if (!isReadyToClose) {
JitsiMeetLogger.i("onDestroy(): leaving...");
leave();
}
leave();
this.jitsiView = null;
@@ -156,12 +149,8 @@ public class JitsiMeetActivity extends AppCompatActivity
@Override
public void finish() {
if (!isReadyToClose) {
JitsiMeetLogger.i("finish(): leaving...");
leave();
}
leave();
JitsiMeetLogger.i("finish(): finishing...");
super.finish();
}
@@ -181,8 +170,8 @@ public class JitsiMeetActivity extends AppCompatActivity
}
public void join(JitsiMeetConferenceOptions options) {
if (this.jitsiView != null) {
this.jitsiView.join(options);
if (this.jitsiView != null) {
this.jitsiView .join(options);
} else {
JitsiMeetLogger.w("Cannot join, view is null");
}
@@ -263,7 +252,6 @@ public class JitsiMeetActivity extends AppCompatActivity
protected void onReadyToClose() {
JitsiMeetLogger.i("SDK is ready to close");
isReadyToClose = true;
finish();
}
@@ -271,8 +259,8 @@ public class JitsiMeetActivity extends AppCompatActivity
// JitsiMeetLogger.i("Transcription chunk received: " + extraData);
// }
// protected void onCustomButtonPressed(HashMap<String, Object> extraData) {
// JitsiMeetLogger.i("Custom button pressed: " + extraData);
// protected void onCustomOverflowMenuButtonPressed(HashMap<String, Object> extraData) {
// JitsiMeetLogger.i("Custom overflow menu button pressed: " + extraData);
// }
// Activity lifecycle methods
@@ -361,8 +349,8 @@ public class JitsiMeetActivity extends AppCompatActivity
// case TRANSCRIPTION_CHUNK_RECEIVED:
// onTranscriptionChunkReceived(event.getData());
// break;
// case CUSTOM_BUTTON_PRESSED:
// onCustomButtonPressed(event.getData());
// case CUSTOM_OVERFLOW_MENU_BUTTON_PRESSED:
// onCustomOverflowMenuButtonPressed(event.getData());
// break;
}
}

View File

@@ -42,7 +42,7 @@ public class JitsiMeetActivityDelegate {
/**
* Tells whether or not the permissions request is currently in progress.
*
* @return {@code true} if the permissions are being requested or {@code false} otherwise.
* @return {@code true} if the permssions are being requested or {@code false} otherwise.
*/
static boolean arePermissionsBeingRequested() {
return permissionListener != null;

View File

@@ -270,6 +270,11 @@ public class JitsiMeetConferenceOptions implements Parcelable {
Bundle asProps() {
Bundle props = new Bundle();
// Android always has the PiP flag set by default.
if (!featureFlags.containsKey("pip.enabled")) {
featureFlags.putBoolean("pip.enabled", true);
}
props.putBundle("flags", featureFlags);
Bundle urlProps = new Bundle();

View File

@@ -51,39 +51,39 @@ import java.util.Random;
*
* See: https://developer.android.com/guide/components/services
*/
public class JitsiMeetOngoingConferenceService extends Service implements OngoingConferenceTracker.OngoingConferenceListener {
public class JitsiMeetOngoingConferenceService extends Service
implements OngoingConferenceTracker.OngoingConferenceListener {
private static final String TAG = JitsiMeetOngoingConferenceService.class.getSimpleName();
private static final String ACTIVITY_DATA_KEY = "activityDataKey";
private static final String EXTRA_DATA_KEY = "extraDataKey";
private static final String EXTRA_DATA_BUNDLE_KEY = "extraDataBundleKey";
private static final String IS_AUDIO_MUTED_KEY = "isAudioMuted";
private static final int PERMISSIONS_REQUEST_CODE = (int) (Math.random() * Short.MAX_VALUE);
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver();
private static final int PERMISSIONS_REQUEST_CODE = (int) (Math.random() * Short.MAX_VALUE);
private boolean isAudioMuted;
private Class tapBackActivity;
static final int NOTIFICATION_ID = new Random().nextInt(99999) + 10000;
private static void doLaunch(Context context, HashMap<String, Object> extraData) {
Activity activity = (Activity) context;
OngoingNotification.createNotificationChannel(activity);
OngoingNotification.createNotificationChannel((Activity) context);
Intent intent = new Intent(context, JitsiMeetOngoingConferenceService.class);
Bundle extraDataBundle = new Bundle();
extraDataBundle.putSerializable(EXTRA_DATA_KEY, extraData);
intent.putExtra(EXTRA_DATA_BUNDLE_KEY, extraDataBundle);
intent.putExtra(ACTIVITY_DATA_KEY, activity.getClass().getCanonicalName());
ComponentName componentName;
try {
componentName = context.startForegroundService(intent);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
componentName = context.startForegroundService(intent);
} else {
componentName = context.startService(intent);
}
} catch (RuntimeException e) {
// Avoid crashing due to ForegroundServiceStartNotAllowedException (API level 31).
// See: https://developer.android.com/guide/components/foreground-services#background-start-restrictions
@@ -154,7 +154,7 @@ public class JitsiMeetOngoingConferenceService extends Service implements Ongoin
public void onCreate() {
super.onCreate();
Notification notification = OngoingNotification.buildOngoingConferenceNotification(isAudioMuted, this, tapBackActivity);
Notification notification = OngoingNotification.buildOngoingConferenceNotification(isAudioMuted, this);
if (notification == null) {
stopSelf();
JitsiMeetLogger.w(TAG + " Couldn't start service, notification is null");
@@ -190,28 +190,13 @@ public class JitsiMeetOngoingConferenceService extends Service implements Ongoin
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
final String actionName = intent.getAction();
final Action action = Action.fromName(actionName);
if (action != Action.HANGUP) {
Boolean isAudioMuted = tryParseIsAudioMuted(intent);
Boolean isAudioMuted = tryParseIsAudioMuted(intent);
if (isAudioMuted != null) {
this.isAudioMuted = Boolean.parseBoolean(intent.getStringExtra("muted"));
}
if (isAudioMuted != null) {
this.isAudioMuted = Boolean.parseBoolean(intent.getStringExtra("muted"));
if (tapBackActivity == null) {
String targetActivityName = intent.getExtras().getString(ACTIVITY_DATA_KEY);
Class<? extends Activity> targetActivity = null;
try {
targetActivity = Class.forName(targetActivityName).asSubclass(Activity.class);
tapBackActivity = targetActivity;
} catch (ClassNotFoundException e) {
JitsiMeetLogger.w(TAG + " Could not find target Activity: " + targetActivityName);
}
}
Notification notification = OngoingNotification.buildOngoingConferenceNotification(this.isAudioMuted, this, tapBackActivity);
Notification notification = OngoingNotification.buildOngoingConferenceNotification(isAudioMuted, this);
if (notification == null) {
stopSelf();
JitsiMeetLogger.w(TAG + " Couldn't start service, notification is null");
@@ -221,6 +206,9 @@ public class JitsiMeetOngoingConferenceService extends Service implements Ongoin
}
}
final String actionName = intent.getAction();
final Action action = Action.fromName(actionName);
// When starting the service, there is no action passed in the intent
if (action != null) {
switch (action) {
@@ -293,9 +281,8 @@ public class JitsiMeetOngoingConferenceService extends Service implements Ongoin
@Override
public void onReceive(Context context, Intent intent) {
Class tapBackActivity = JitsiMeetOngoingConferenceService.this.tapBackActivity;
isAudioMuted = Boolean.parseBoolean(intent.getStringExtra("muted"));
Notification notification = OngoingNotification.buildOngoingConferenceNotification(isAudioMuted, context, tapBackActivity);
Notification notification = OngoingNotification.buildOngoingConferenceNotification(isAudioMuted, context);
if (notification == null) {
stopSelf();
JitsiMeetLogger.w(TAG + " Couldn't update service, notification is null");

View File

@@ -29,6 +29,8 @@ import android.content.Intent;
import androidx.annotation.StringRes;
import androidx.core.app.NotificationCompat;
import android.os.Build;
/**
* Helper class for creating the ongoing notification which is used with
@@ -43,6 +45,10 @@ class OngoingNotification {
static final String ONGOING_CONFERENCE_CHANNEL_ID = "JitsiOngoingConferenceChannel";
static void createNotificationChannel(Activity context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
return;
}
if (context == null) {
JitsiMeetLogger.w(TAG + " Cannot create notification channel: no current context");
return;
@@ -67,13 +73,14 @@ class OngoingNotification {
notificationManager.createNotificationChannel(channel);
}
static Notification buildOngoingConferenceNotification(Boolean isMuted, Context context, Class tapBackActivity) {
static Notification buildOngoingConferenceNotification(Boolean isMuted, Context context) {
if (context == null) {
JitsiMeetLogger.w(TAG + " Cannot create notification: no current context");
return null;
}
Intent notificationIntent = new Intent(context, tapBackActivity == null ? context.getClass() : tapBackActivity);
Intent notificationIntent = new Intent(context, context.getClass());
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, ONGOING_CONFERENCE_CHANNEL_ID);

View File

@@ -20,6 +20,7 @@ import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.PictureInPictureParams;
import android.os.Build;
import android.util.Rational;
import com.facebook.react.bridge.Promise;
@@ -52,7 +53,7 @@ class PictureInPictureModule extends ReactContextBaseJavaModule {
// Android Go devices don't support PiP. There doesn't seem to be a better way to detect it than
// to use ActivityManager.isLowRamDevice().
// https://stackoverflow.com/questions/58340558/how-to-detect-android-go
isSupported = !am.isLowRamDevice();
isSupported = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !am.isLowRamDevice();
}
/**
@@ -81,6 +82,7 @@ class PictureInPictureModule extends ReactContextBaseJavaModule {
* including when the activity is not visible (paused or stopped), if the
* screen is locked or if the user has an activity pinned.
*/
@TargetApi(Build.VERSION_CODES.O)
public void enterPictureInPicture() {
if (!isEnabled) {
return;

View File

@@ -3,6 +3,7 @@ package org.jitsi.meet.sdk;
import android.annotation.SuppressLint;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.telecom.DisconnectCause;
import android.telecom.PhoneAccount;
@@ -31,6 +32,7 @@ import org.jitsi.meet.sdk.log.JitsiMeetLogger;
*
* @author Pawel Domas
*/
@RequiresApi(api = Build.VERSION_CODES.O)
@ReactModule(name = RNConnectionService.NAME)
class RNConnectionService extends ReactContextBaseJavaModule {
@@ -51,6 +53,7 @@ class RNConnectionService extends ReactContextBaseJavaModule {
* @param audioRoute the new audio route to be set. See
* {@link android.telecom.CallAudioState} constants prefixed with "ROUTE_".
*/
@RequiresApi(api = Build.VERSION_CODES.O)
static void setAudioRoute(int audioRoute) {
for (ConnectionService.ConnectionImpl c
: ConnectionService.getConnections()) {

View File

@@ -21,13 +21,13 @@ import android.util.Log;
import androidx.annotation.Nullable;
import com.facebook.hermes.reactexecutor.HermesExecutorFactory;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.common.LifecycleState;
import com.facebook.react.jscexecutor.JSCExecutorFactory;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.uimanager.ViewManager;
import com.oney.WebRTCModule.EglUtils;
@@ -156,6 +156,11 @@ class ReactInstanceManagerHolder {
return packages;
}
static JSCExecutorFactory getReactNativeJSFactory() {
// Keep on using JSC, the jury is out on Hermes.
return new JSCExecutorFactory("", "");
}
/**
* Helper function to send an event to JavaScript.
*
@@ -200,6 +205,18 @@ class ReactInstanceManagerHolder {
? reactContext.getNativeModule(nativeModuleClass) : null;
}
/**
* Gets the current {@link Activity} linked to React Native.
*
* @return An activity attached to React Native.
*/
static Activity getCurrentActivity() {
ReactContext reactContext
= reactInstanceManager != null
? reactInstanceManager.getCurrentReactContext() : null;
return reactContext != null ? reactContext.getCurrentActivity() : null;
}
static ReactInstanceManager getReactInstanceManager() {
return reactInstanceManager;
}
@@ -235,7 +252,7 @@ class ReactInstanceManagerHolder {
.setCurrentActivity(activity)
.setBundleAssetName("index.android.bundle")
.setJSMainModulePath("index.android")
.setJavaScriptExecutorFactory(new HermesExecutorFactory())
.setJavaScriptExecutorFactory(getReactNativeJSFactory())
.addPackages(getReactNativePackages())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)

2
app.js
View File

@@ -1,4 +1,4 @@
/* Jitsi Meet app main entrypoint. */
/* application specific logic */
// Re-export jQuery
// FIXME: Remove this requirement from torture tests.

View File

@@ -5,12 +5,5 @@ module.exports = {
plugins: [ 'react-native-paper/babel' ]
}
},
// This happens because react native has conflict with @babel/plugin-transform-private-methods plugin
// https://github.com/ethers-io/ethers.js/discussions/4309#discussioncomment-6694524
plugins: [ 'optional-require',
[ '@babel/plugin-transform-private-methods', {
'loose': true
} ]
]
plugins: [ 'optional-require' ]
};

View File

@@ -27,7 +27,6 @@ import {
conferenceJoinInProgress,
conferenceJoined,
conferenceLeft,
conferencePropertiesChanged,
conferenceSubjectChanged,
conferenceTimestampChanged,
conferenceUniqueIdSet,
@@ -112,7 +111,6 @@ import {
import {
getLocalParticipant,
getNormalizedDisplayName,
getParticipantByIdOrUndefined,
getVirtualScreenshareParticipantByOwnerId
} from './react/features/base/participants/functions';
import { updateSettings } from './react/features/base/settings/actions';
@@ -137,11 +135,11 @@ import {
isUserInteractionRequiredForUnmute
} from './react/features/base/tracks/functions';
import { downloadJSON } from './react/features/base/util/downloadJSON';
import { getJitsiMeetGlobalNSConnectionTimes } from './react/features/base/util/helpers';
import { openLeaveReasonDialog } from './react/features/conference/actions.web';
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 {
@@ -155,6 +153,7 @@ import {
NOTIFICATION_TIMEOUT_TYPE
} from './react/features/notifications/constants';
import { isModerationNotificationDisplayed } from './react/features/notifications/functions';
import { mediaPermissionPromptVisibilityChanged } from './react/features/overlay/actions';
import { suspendDetected } from './react/features/power-monitor/actions';
import { initPrejoin, isPrejoinPageVisible } from './react/features/prejoin/functions';
import { disableReceiver, stopReceiver } from './react/features/remote-control/actions';
@@ -164,7 +163,6 @@ import { toggleScreenshotCaptureSummary } from './react/features/screenshot-capt
import { AudioMixerEffect } from './react/features/stream-effects/audio-mixer/AudioMixerEffect';
import { createRnnoiseProcessor } from './react/features/stream-effects/rnnoise';
import { handleToggleVideoMuted } from './react/features/toolbox/actions.any';
import { transcriberJoined, transcriberLeft } from './react/features/transcribing/actions';
import { muteLocal } from './react/features/video-menu/actions.any';
const logger = Logger.getLogger(__filename);
@@ -172,9 +170,7 @@ let room;
/*
* Logic to open a desktop picker put on the window global for
* lib-jitsi-meet to detect and invoke.
*
* TODO: remove once the Electron SDK supporting gDM has been out for a while.
* lib-jitsi-meet to detect and invoke
*/
window.JitsiMeetScreenObtainer = {
openDesktopPicker(options, onSourceChoose) {
@@ -289,7 +285,7 @@ class ConferenceConnector {
},
descriptionKey: 'dialog.reservationErrorMsg',
titleKey: 'dialog.reservationError'
}));
}, NOTIFICATION_TIMEOUT_TYPE.LONG));
break;
}
@@ -297,7 +293,7 @@ class ConferenceConnector {
APP.store.dispatch(showErrorNotification({
descriptionKey: 'dialog.gracefulShutdown',
titleKey: 'dialog.serviceUnavailable'
}));
}, NOTIFICATION_TIMEOUT_TYPE.LONG));
break;
// FIXME FOCUS_DISCONNECTED is a confusing event name.
@@ -416,10 +412,9 @@ export default {
* without any audio tracks.
* @param {boolean} options.startWithVideoMuted - will start the conference
* without any video tracks.
* @param {boolean} recordTimeMetrics - If true time metrics will be recorded.
* @returns {Promise<JitsiLocalTrack[]>, Object}
*/
createInitialLocalTracks(options = {}, recordTimeMetrics = false) {
createInitialLocalTracks(options = {}) {
const errors = {};
// Always get a handle on the audio input device so that we have statistics (such as "No audio input" or
@@ -436,6 +431,15 @@ export default {
requestedVideo = true;
}
if (!config.disableInitialGUM) {
JitsiMeetJS.mediaDevices.addEventListener(
JitsiMediaDevicesEvents.PERMISSION_PROMPT_IS_SHOWN,
browserName =>
APP.store.dispatch(
mediaPermissionPromptVisibilityChanged(true, browserName))
);
}
let tryCreateLocalTracks = Promise.resolve([]);
// On Electron there is no permission prompt for granting permissions. That's why we don't need to
@@ -444,7 +448,8 @@ export default {
const timeout = browser.isElectron() ? 15000 : 60000;
const audioOptions = {
devices: [ MEDIA_TYPE.AUDIO ],
timeout
timeout,
firePermissionPromptIsShownEvent: true
};
// Spot uses the _desktopSharingSourceDevice config option to use an external video input device label as
@@ -479,14 +484,24 @@ export default {
} else if (requestedAudio || requestedVideo) {
tryCreateLocalTracks = APP.store.dispatch(createInitialAVTracks({
devices: initialDevices,
timeout
}, recordTimeMetrics)).then(({ tracks, errors: pErrors }) => {
timeout,
firePermissionPromptIsShownEvent: true
})).then(({ tracks, errors: pErrors }) => {
Object.assign(errors, pErrors);
return tracks;
});
}
// 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));
return tracks;
});
return {
tryCreateLocalTracks,
errors
@@ -544,10 +559,10 @@ export default {
* If prejoin page is enabled open an new connection in the background
* and create local tracks.
*
* @param {{ roomName: string, shouldDispatchConnect }} options
* @param {{ roomName: string }} options
* @returns {Promise}
*/
async init({ roomName, shouldDispatchConnect }) {
async init({ roomName }) {
const state = APP.store.getState();
const initialOptions = {
startAudioOnly: config.startAudioOnly,
@@ -555,12 +570,8 @@ export default {
startWithAudioMuted: getStartWithAudioMuted(state) || isUserInteractionRequiredForUnmute(state),
startWithVideoMuted: getStartWithVideoMuted(state) || isUserInteractionRequiredForUnmute(state)
};
const connectionTimes = getJitsiMeetGlobalNSConnectionTimes();
const startTime = window.performance.now();
connectionTimes['conference.init.start'] = startTime;
logger.debug(`Executed conference.init with roomName: ${roomName} (performance.now=${startTime})`);
logger.debug(`Executed conference.init with roomName: ${roomName}`);
this.roomName = roomName;
@@ -593,65 +604,32 @@ export default {
return localTracks;
};
const { dispatch, getState } = APP.store;
const createLocalTracksStart = window.performance.now();
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks(initialOptions);
connectionTimes['conference.init.createLocalTracks.start'] = createLocalTracksStart;
logger.debug(`(TIME) createInitialLocalTracks: ${createLocalTracksStart} `);
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks(initialOptions, true);
tryCreateLocalTracks.then(async tr => {
const createLocalTracksEnd = window.performance.now();
connectionTimes['conference.init.createLocalTracks.end'] = createLocalTracksEnd;
logger.debug(`(TIME) createInitialLocalTracks finished: ${createLocalTracksEnd} `);
dispatch(setInitialGUMPromise(tryCreateLocalTracks.then(async tr => {
const tracks = handleInitialTracks(initialOptions, tr);
this._initDeviceList(true);
const { initialGUMPromise } = getState()['features/base/media'];
if (isPrejoinPageVisible(getState())) {
dispatch(gumPending([ MEDIA_TYPE.AUDIO, MEDIA_TYPE.VIDEO ], IGUMPendingState.NONE));
// Since the conference is not yet created in redux this function will execute synchronous
// which will guarantee us that the local tracks are added to redux before we proceed.
initPrejoin(tracks, errors, dispatch);
connectionTimes['conference.init.end'] = window.performance.now();
// resolve the initialGUMPromise in case connect have finished so that we can proceed to join.
if (initialGUMPromise) {
logger.debug('Resolving the initialGUM promise! (prejoinVisible=true)');
initialGUMPromise.resolve({
tracks,
errors
});
}
logger.debug('Clear the initialGUM promise! (prejoinVisible=true)');
// For prejoin we don't need the initial GUM promise since the tracks are already added to the store
// via initPrejoin
dispatch(setInitialGUMPromise());
// Note: Not sure if initPrejoin needs to be async. But let's wait for it just to be sure the
// tracks are added.
initPrejoin(tracks, errors, dispatch);
} else {
APP.store.dispatch(displayErrorsForCreateInitialLocalTracks(errors));
setGUMPendingStateOnFailedTracks(tracks, APP.store.dispatch);
connectionTimes['conference.init.end'] = window.performance.now();
if (initialGUMPromise) {
logger.debug('Resolving the initialGUM promise!');
initialGUMPromise.resolve({
tracks,
errors
});
}
}
});
if (shouldDispatchConnect) {
logger.info('Dispatching connect from init since prejoin is not visible.');
return {
tracks,
errors
};
})));
if (!isPrejoinPageVisible(getState())) {
dispatch(connect());
}
},
@@ -1014,7 +992,7 @@ export default {
},
/**
* Will be filled with values only when config.testing.testMode is true.
* Will be filled with values only when config.debug is enabled.
* Its used by torture to check audio levels.
*/
audioLevelsMap: {},
@@ -1401,19 +1379,28 @@ export default {
/**
* Creates desktop (screensharing) {@link JitsiLocalTrack}
*
* @param {Object} [options] - Screen sharing options that will be passed to
* createLocalTracks.
* @param {Object} [options.desktopSharing]
* @param {Object} [options.desktopStream] - An existing desktop stream to
* use instead of creating a new desktop stream.
* @return {Promise.<JitsiLocalTrack>} - A Promise resolved with
* {@link JitsiLocalTrack} for the screensharing or rejected with
* {@link JitsiTrackError}.
*
* @private
*/
_createDesktopTrack() {
_createDesktopTrack(options = {}) {
const didHaveVideo = !this.isLocalVideoMuted();
const getDesktopStreamPromise = createLocalTracksF({
desktopSharingSourceDevice: config._desktopSharingSourceDevice,
devices: [ 'desktop' ]
});
const getDesktopStreamPromise = options.desktopStream
? Promise.resolve([ options.desktopStream ])
: createLocalTracksF({
desktopSharingSourceDevice: options.desktopSharingSources
? null : config._desktopSharingSourceDevice,
desktopSharingSources: options.desktopSharingSources,
devices: [ 'desktop' ]
});
return getDesktopStreamPromise.then(desktopStreams => {
// Stores the "untoggle" handler which remembers whether was
@@ -1590,9 +1577,9 @@ export default {
newLvl = 0;
}
if (config.testing?.testMode) {
if (config.debug) {
this.audioLevelsMap[id] = newLvl;
if (config.testing?.debugAudioLevels) {
if (config.debugAudioLevels) {
logger.log(`AudioLevel:${id}/${newLvl}`);
}
}
@@ -1696,16 +1683,6 @@ export default {
}
);
room.on(
JitsiConferenceEvents.TRANSCRIPTION_STATUS_CHANGED,
(status, id, abruptly) => {
if (status === JitsiMeetJS.constants.transcriptionStatus.ON) {
APP.store.dispatch(transcriberJoined(id));
} else if (status === JitsiMeetJS.constants.transcriptionStatus.OFF) {
APP.store.dispatch(transcriberLeft(id, abruptly));
}
});
room.on(
JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED,
(participant, data) => {
@@ -1732,10 +1709,6 @@ export default {
JitsiConferenceEvents.LOCK_STATE_CHANGED,
(...args) => APP.store.dispatch(lockStateChanged(room, ...args)));
room.on(
JitsiConferenceEvents.PROPERTIES_CHANGED,
properties => APP.store.dispatch(conferencePropertiesChanged(properties)));
room.on(JitsiConferenceEvents.KICKED, (participant, reason, isReplaced) => {
if (isReplaced) {
// this event triggers when the local participant is kicked, `participant`
@@ -1802,17 +1775,12 @@ export default {
room.addCommandListener(
this.commands.defaults.AVATAR_URL,
(data, from) => {
const participant = getParticipantByIdOrUndefined(APP.store, from);
// if already set from presence(jwt), skip the command processing
if (!participant?.avatarURL) {
APP.store.dispatch(
participantUpdated({
conference: room,
id: from,
avatarURL: data.value
}));
}
APP.store.dispatch(
participantUpdated({
conference: room,
id: from,
avatarURL: data.value
}));
});
room.on(
@@ -2031,6 +1999,7 @@ export default {
APP.UI.initConference();
dispatch(initKeyboardShortcuts());
dispatch(conferenceJoined(room));
const jwt = APP.store.getState()['features/base/jwt'];
@@ -2065,9 +2034,8 @@ export default {
const { dispatch } = APP.store;
return dispatch(getAvailableDevices())
.then(() => {
this.updateAudioIconEnabled();
this.updateVideoIconEnabled();
.then(devices => {
APP.UI.onAvailableDevicesChanged(devices);
});
}
@@ -2232,8 +2200,7 @@ export default {
return Promise.all(promises)
.then(() => {
this.updateAudioIconEnabled();
this.updateVideoIconEnabled();
APP.UI.onAvailableDevicesChanged(filteredDevices);
});
},

250
config.js
View File

@@ -84,8 +84,9 @@ var config = {
// Allows the setting of a custom bandwidth value from the UI.
// assumeBandwidth: true,
// Enables use of getDisplayMedia in electron
// electronUseGetDisplayMedia: false,
// Disables the End to End Encryption feature. Useful for debugging
// issues related to insertable streams.
// disableE2EE: false,
// Enables the use of the codec selection API supported by the browsers .
// enableCodecSelectionAPI: false,
@@ -106,12 +107,6 @@ var config = {
// Dump transcripts to a <transcript> element for debugging.
// dumpTranscript: false,
// Log the audio levels.
// debugAudioLevels: true,
// Will replace ice candidates IPs with invalid ones in order to fail ice.
// failICE: true,
},
// Disables moderator indicators.
@@ -218,45 +213,14 @@ var config = {
// installation. Specifically, these files are needed:
// - https://meet.example.com/libs/krisp/krisp.mjs
// - https://meet.example.com/libs/krisp/models/model_8.kw
// - https://meet.example.com/libs/krisp/models/model_nc.kw
// - https://meet.example.com/libs/krisp/models/model_bvc.kw
// - https://meet.example.com/libs/krisp/assets/bvc-allowed.txt
// In case when you have known BVC supported devices and you want to extend allowed devices list
// - https://meet.example.com/libs/krisp/assets/bvc-allowed-ext.txt
// In case when you have known BVC supported devices and you want to extend allowed devices list
// - https://meet.example.com/libs/krisp/models/model_inbound_8.kw
// - https://meet.example.com/libs/krisp/models/model_inbound_16.kw
// In case when you want to use inbound noise suppression models
// NOTE: Krisp JS SDK v2.0.0 was tested.
// - https://meet.example.com/libs/krisp/models/model_16.kw
// - https://meet.example.com/libs/krisp/models/model_32.kw
// NOTE: Krisp JS SDK v1.0.9 was tested.
// noiseSuppression: {
// krisp: {
// enabled: false,
// logProcessStats: false,
// debugLogs: false,
// useBVC: false,
// bufferOverflowMS: 1000,
// inboundModels: {
// modelInbound8: 'model_inbound_8.kef',
// modelInbound16: 'model_inbound_16.kef',
// },
// preloadInboundModels: {
// modelInbound8: 'model_inbound_8.kef',
// modelInbound16: 'model_inbound_16.kef',
// },
// preloadModels: {
// modelBVC: 'model_bvc.kef',
// model8: 'model_8.kef',
// modelNC: 'model_nc_mq.kef',
// },
// models: {
// modelBVC: 'model_bvc.kef',
// model8: 'model_8.kef',
// modelNV: 'model_nc_mq.kef',
// },
// bvc: {
// allowedDevices: 'bvc-allowed.txt',
// allowedDevicesExt: 'bvc-allowed-ext.txt',
// }
// },
// },
@@ -268,26 +232,9 @@ var config = {
// Sets the preferred resolution (height) for local video. Defaults to 720.
// resolution: 720,
// DEPRECATED. Please use raisedHands.disableRemoveRaisedHandOnFocus instead.
// Specifies whether the raised hand will hide when someone becomes a dominant speaker or not
// disableRemoveRaisedHandOnFocus: false,
// Specifies which raised hand related config should be set.
// raisedHands: {
// // Specifies whether the raised hand can be lowered by moderator.
// disableLowerHandByModerator: false,
// // Specifies whether there is a notification before hiding the raised hand
// // when someone becomes the dominant speaker.
// disableLowerHandNotification: true,
// // Specifies whether there is a notification when you are the next speaker in line.
// disableNextSpeakerNotification: false,
// // Specifies whether the raised hand will hide when someone becomes a dominant speaker or not.
// disableRemoveRaisedHandOnFocus: false,
// },
// speakerStats: {
// // Specifies whether the speaker stats is enable or not.
// disabled: false,
@@ -371,6 +318,9 @@ var config = {
// Recording
// DEPRECATED. Use recordingService.enabled instead.
// fileRecordingsEnabled: false,
// Enable the dropbox integration.
// dropbox: {
// appKey: '<APP_KEY>', // Specify your app key here.
@@ -391,8 +341,6 @@ var config = {
// // If true, shows a warning label in the prejoin screen to point out the possibility that
// // the call you're joining might be recorded.
// // showPrejoinWarning: true,
// // If true, the notification for recording start will display a link to download the cloud recording.
// // showRecordingLink: true,
// },
// recordingService: {
@@ -465,7 +413,7 @@ var config = {
// // Translation languages.
// // Available languages can be found in
// // ./lang/translation-languages.json.
// // ./src/react/features/transcribing/translation-languages.json.
// translationLanguages: ['en', 'es', 'fr', 'ro'],
// // Important languages to show on the top of the language list.
@@ -486,10 +434,6 @@ var config = {
// // Enables automatic turning on transcribing when recording is started
// autoTranscribeOnRecord: false,
// // Enables automatic request of subtitles when transcriber is present in the meeting, uses the default
// // language that is set
// autoCaptionOnTranscribe: false,
// },
// Misc
@@ -515,17 +459,12 @@ var config = {
// videoQuality: {
//
// // Provides a way to set the codec preference on desktop based endpoints.
// codecPreferenceOrder: [ 'VP9', 'VP8', 'H264', 'AV1' ],
// codecPreferenceOrder: [ 'VP9', 'VP8', 'H264' ],
//
// // Provides a way to set the codec for screenshare.
// screenshareCodec: 'AV1',
// mobileScreenshareCodec: 'VP8',
//
// // Enables the adaptive mode in the client that will make runtime adjustments to selected codecs and received
// // videos for a better user experience. This mode will kick in only when CPU overuse is reported in the
// // WebRTC statistics for the outbound video streams.
// enableAdaptiveMode: false,
//
// // Codec specific settings for scalability modes and max bitrates.
// av1: {
// maxBitratesVideo: {
@@ -576,6 +515,30 @@ var config = {
// useKSVC: true
// },
//
// DEPRECATED! Use `codec specific settings` instead.
// // Provides a way to configure the maximum bitrates that will be enforced on the simulcast streams for
// // video tracks. The keys in the object represent the type of the stream (LD, SD or HD) and the values
// // are the max.bitrates to be set on that particular type of stream. The actual send may vary based on
// // the available bandwidth calculated by the browser, but it will be capped by the values specified here.
// // This is currently not implemented on app based clients on mobile.
// maxBitratesVideo: {
// H264: {
// low: 200000,
// standard: 500000,
// high: 1500000,
// },
// VP8 : {
// low: 200000,
// standard: 500000,
// high: 1500000,
// },
// VP9: {
// low: 100000,
// standard: 300000,
// high: 1200000,
// },
// },
//
// // The options can be used to override default thresholds of video thumbnail heights corresponding to
// // the video quality levels used in the application. At the time of this writing the allowed levels are:
// // 'low' - for the low quality level (180p at the time of this writing)
@@ -593,6 +556,22 @@ var config = {
//
// // Provides a way to set the codec preference on mobile devices, both on RN and mobile browser based endpoint
// mobileCodecPreferenceOrder: [ 'VP8', 'VP9', 'H264' ],
//
// // DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead.
// // Provides a way to prevent a video codec from being negotiated on the JVB connection. The codec specified
// // here will be removed from the list of codecs present in the SDP answer generated by the client. If the
// // same codec is specified for both the disabled and preferred option, the disable settings will prevail.
// // Note that 'VP8' cannot be disabled since it's a mandatory codec, the setting will be ignored in this case.
// disabledCodec: 'H264',
//
// // DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead.
// // Provides a way to set a preferred video codec for the JVB connection. If 'H264' is specified here,
// // simulcast will be automatically disabled since JVB doesn't support H264 simulcast yet. This will only
// // rearrange the the preference order of the codecs in the SDP answer generated by the browser only if the
// // preferred codec specified here is present. Please ensure that the JVB offers the specified codec for this
// // to take effect.
// preferredCodec: 'VP8',
//
// },
// Notification timeouts
@@ -600,7 +579,6 @@ var config = {
// short: 2500,
// medium: 5000,
// long: 10000,
// extraLong: 60000,
// },
// // Options for the recording limit notification.
@@ -630,6 +608,14 @@ var config = {
// Disables or enables REMB support in this client (default: enabled).
// enableRemb: true,
// Enables ICE restart logic in LJM and displays the page reload overlay on
// ICE failure. Current disabled by default because it's causing issues with
// signaling when Octo is enabled. Also when we do an "ICE restart"(which is
// not a real ICE restart), the client maintains the TCC sequence number
// counter, but the bridge resets it. The bridge sends media packets with
// TCC sequence numbers starting from 0.
// enableIceRestart: false,
// Enables forced reload of the client when the call is migrated as a result of
// the bridge going down.
// enableForcedReload: true,
@@ -752,9 +738,6 @@ var config = {
// and microsoftApiApplicationClientID
// enableCalendarIntegration: false,
// The client id for the google APIs used for the calendar integration, youtube livestreaming, etc.
// googleApiApplicationClientID: '<client_id>',
// Configs for prejoin page.
// prejoinConfig: {
// // When 'true', it shows an intermediate page before joining, where the user can configure their devices.
@@ -766,11 +749,6 @@ var config = {
// hideDisplayName: false,
// // List of buttons to hide from the extra join options dropdown.
// hideExtraJoinButtons: ['no-audio', 'by-phone'],
// // Configuration for pre-call test
// // By setting preCallTestEnabled, you enable the pre-call test in the prejoin page.
// // ICE server credentials need to be provided over the preCallTestICEUrl
// preCallTestEnabled: false,
// preCallTestICEUrl: ''
// },
// When 'true', the user cannot edit the display name.
@@ -789,6 +767,10 @@ var config = {
// set or the lobby is not enabled.
// enableInsecureRoomNameWarning: false,
// Whether to automatically copy invitation URL after creating a room.
// Document should be focused for this option to work
// enableAutomaticUrlCopy: false,
// Array with avatar URL prefixes that need to use CORS.
// corsAvatarURLs: [ 'https://www.gravatar.com/avatar/' ],
@@ -873,7 +855,7 @@ var config = {
// Overrides the buttons displayed in the main toolbar. Depending on the screen size the number of displayed
// buttons varies from 2 buttons to 8 buttons. Every array in the mainToolbarButtons array will replace the
// corresponding default buttons configuration matched by the number of buttons specified in the array. Arrays with
// more than 8 buttons or less then 2 buttons will be ignored. When there there isn't an override for a certain
// more than 8 buttons or less then 2 buttons will be ignored. When there there isn't an override for a cerain
// configuration (for example when 3 buttons are displayed) the default jitsi-meet configuration will be used.
// The order of the buttons in the array is preserved.
// mainToolbarButtons: [
@@ -1086,12 +1068,24 @@ var config = {
// { urls: 'stun:jitsi-meet.example.com:3478' },
{ urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' },
],
// DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead.
// Provides a way to set the video codec preference on the p2p connection. Acceptable
// codec values are 'VP8', 'VP9' and 'H264'.
// preferredCodec: 'H264',
// DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead.
// Provides a way to prevent a video codec from being negotiated on the p2p connection.
// disabledCodec: '',
},
analytics: {
// True if the analytics should be disabled
// disabled: false,
// The Google Analytics Tracking ID:
// googleAnalyticsTrackingId: 'your-tracking-id-UA-123456-1',
// Matomo configuration:
// matomoEndpoint: 'https://your-matomo-endpoint/',
// matomoSiteID: '42',
@@ -1129,6 +1123,7 @@ var config = {
// Array of script URLs to load as lib-jitsi-meet "analytics handlers".
// scriptURLs: [
// "libs/analytics-ga.min.js", // google-analytics
// "https://example.com/my-custom-analytics.js",
// ],
@@ -1214,7 +1209,6 @@ var config = {
// warning: '',
// },
// externallyManagedKey: false,
// disabled: false,
// },
// Options related to end-to-end (participant to participant) ping.
@@ -1432,13 +1426,6 @@ var config = {
*/
// dynamicBrandingUrl: '',
// A list of allowed URL domains for shared video.
//
// NOTE:
// '*' is allowed value and it will allow any URL to be used for shared video. We do not recommend using '*',
// use it at your own risk!
// sharedVideoAllowedURLDomains: [ ],
// Options related to the participants pane.
// participantsPane: {
// // Enables feature
@@ -1562,61 +1549,25 @@ var config = {
// and will automatically redirect to the token service to get the token for the meeting.
// tokenAuthUrlAutoRedirect: false
// You can put an array of values to target different entity types in the invite dialog.
// Valid values are "phone", "room", "sip", "user", "videosipgw" and "email"
// peopleSearchQueryTypes: ["user", "email"],
// Directory endpoint which is called for invite dialog autocomplete
// peopleSearchUrl: "https://myservice.com/api/people",
// Endpoint which is called to send invitation requests
// inviteServiceUrl: "https://myservice.com/api/invite",
// For external entities (e. g. email), the localStorage key holding the token value for directory authentication
// peopleSearchTokenLocation: "mytoken",
// Options related to visitors.
// visitors: {
// // Starts audio/video when the participant is promoted from visitor.
// enableMediaOnPromote: {
// audio: true,
// video: true
// },
// },
// The default type of desktop sharing sources that will be used in the electron app.
// desktopSharingSources: ['screen', 'window'],
// Disables the echo cancelation for local audio tracks.
// disableAEC: true,
// Disables the auto gain control for local audio tracks.
// disableAGC: true,
// Disables the audio processing (echo cancelation, auto gain control and noise suppression) for local audio tracks.
// disableAP: true,
// Disables the anoise suppression for local audio tracks.
// disableNS: true,
// Replaces the display name with the JID of the participants.
// displayJids: true,
// Enables disables talk while muted detection.
// enableTalkWhileMuted: true,
// Sets the peer connection ICE transport policy to "relay".
// forceTurnRelay: true,
// List of undocumented settings used in jitsi-meet
/**
_immediateReloadThreshold
debug
debugAudioLevels
deploymentInfo
dialOutAuthUrl
dialOutCodesUrl
dialOutRegionUrl
disableRemoteControl
displayJids
firefox_fake_device
googleApiApplicationClientID
iAmRecorder
iAmSipGateway
microsoftApiApplicationClientID
peopleSearchQueryTypes
peopleSearchUrl
requireDisplayName
*/
/**
@@ -1632,7 +1583,14 @@ var config = {
_peerConnStatusRtcMuteTimeout
avgRtpStatsN
desktopSharingSources
disableAEC
disableAGC
disableAP
disableHPF
disableLocalStats
disableNS
enableTalkWhileMuted
forceTurnRelay
hiddenDomain
hiddenFromRecorderFeatureEnabled
ignoreStartMuted
@@ -1709,7 +1667,7 @@ var config = {
// 'notify.participantsWantToJoin', // shown when lobby is enabled and participants request to join meeting
// 'notify.passwordRemovedRemotely', // shown when a password has been removed remotely
// 'notify.passwordSetRemotely', // shown when a password has been set remotely
// 'notify.raisedHand', // shown when a participant used raise hand,
// 'notify.raisedHand', // shown when a partcipant used raise hand,
// 'notify.screenShareNoAudio', // shown when the audio could not be shared for the selected screen
// 'notify.screenSharingAudioOnlyTitle', // shown when the best performance has been affected by screen sharing
// 'notify.selfViewTitle', // show "You can always un-hide the self-view from settings"
@@ -1730,7 +1688,7 @@ var config = {
// 'toolbar.noAudioSignalTitle', // shown when a broken mic is detected
// 'toolbar.noisyAudioInputTitle', // shown when noise is detected for the current microphone
// 'toolbar.talkWhileMutedPopup', // shown when user tries to speak while muted
// 'transcribing.failed', // shown when transcribing fails
// 'transcribing.failedToStart', // shown when transcribing fails to start
// ],
// List of notifications to be disabled. Works in tandem with the above setting.
@@ -1740,7 +1698,7 @@ var config = {
// disableFilmstripAutohiding: false,
// filmstrip: {
// // Disable the vertical/horizontal filmstrip.
// // Disable the vertical/horizonal filmstrip.
// disabled: false,
// // Disables user resizable filmstrip. Also, allows configuration of the filmstrip
// // (width, tiles aspect ratios) through the interfaceConfig options.
@@ -1789,6 +1747,8 @@ var config = {
// tileTime: 5000,
// // Limit results by rating: g, pg, pg-13, r. Default value: g.
// rating: 'pg',
// // The proxy server url for giphy requests in the web app.
// proxyUrl: 'https://giphy-proxy.example.com',
// },
// Logging
@@ -1799,10 +1759,9 @@ var config = {
// //disableLogCollector: true,
// // Individual loggers are customizable.
// loggers: {
// // The following are too verbose in their logging with the default level.
// 'modules/RTC/TraceablePeerConnection.js': 'info',
// 'modules/xmpp/strophe.util.js': 'log',
// },
// // The following are too verbose in their logging with the default level.
// 'modules/RTC/TraceablePeerConnection.js': 'info',
// 'modules/xmpp/strophe.util.js': 'log',
// },
// Application logo url
@@ -1858,11 +1817,14 @@ var config = {
// Hide login button on auth dialog, you may want to enable this if you are using JWT tokens to authenticate users
// hideLoginButton: true,
// If true remove the tint foreground on focused user camera in filmstrip
// disableCameraTintForeground: false,
};
// Temporary backwards compatibility with old mobile clients.
config.flags = config.flags || {};
config.flags.sourceNameSignaling = true;
config.flags.sendMultipleVideoStreams = true;
config.flags.receiveMultipleVideoStreams = true;
// Set the default values for JaaS customers
if (enableJaaS) {
config.dialInNumbersUrl = 'https://conference-mapper.jitsi.net/v1/access/dids';

View File

@@ -1,8 +1,5 @@
@use './variables';
#chat-conversation-container {
// extract message input height
box-sizing: border-box;
height: calc(100% - 64px);
overflow: hidden;
position: relative;
@@ -12,7 +9,7 @@
box-sizing: border-box;
flex: 1;
font-size: 10pt;
height: calc(100% - 10px);
height: 100%;
line-height: 20px;
overflow: auto;
padding: 16px;
@@ -22,13 +19,6 @@
display: flex;
flex-direction: column;
&.focus-visible {
outline: 0;
margin: 4px;
border-radius: 0 0 variables.$borderRadius variables.$borderRadius;
box-shadow: 0px 0px 0px 2px #4687ed; // focus01/primary07
}
& > :first-child {
margin-top: auto;
}

View File

@@ -19,11 +19,11 @@
flex-direction: column;
.description {
color: #2f3237;
font-size: 14px;
line-height: 18px;
margin-bottom: 16px;
max-width: 436px;
color: #2f3237;
font-size: 14px;
line-height: 18px;
margin-bottom: 16px;
max-width: 436px;
}
}
@@ -127,8 +127,7 @@
cursor: pointer;
}
&.with-click-handler:hover,
&.with-click-handler:focus {
&.with-click-handler:hover {
background-color: #c7ddff;
}
@@ -156,22 +155,14 @@
margin-right: 16px;
position: absolute;
&>svg {
&> svg {
fill: #0074e0;
}
}
.item:hover,
.item:focus,
.item:focus-within {
.item:hover, .item:focus, .item:focus-within {
.delete-meeting {
display: block;
}
.delete-meeting:hover {
&>svg {
fill: #4687ED;
}
}
}
}
}

View File

@@ -1,14 +1,14 @@
@use 'sass:math';
.reactions-menu {
width: 330px;
width: 280px;
background: #242528;
box-shadow: 0px 3px 16px rgba(0, 0, 0, 0.6), 0px 0px 4px 1px rgba(0, 0, 0, 0.25);
border-radius: 6px;
padding: 16px;
&.with-gif {
width: 380px;
width: 328px;
.reactions-row .toolbox-button:last-of-type {
top: 3px;

View File

@@ -0,0 +1,26 @@
.transcription-subtitles {
bottom: $newToolbarSize + 40px;
font-size: 16px;
font-weight: 1000;
left: 50%;
max-width: 50vw;
opacity: 0.80;
overflow-wrap: break-word;
pointer-events: none;
position: absolute;
text-shadow: 0px 0px 1px rgba(0,0,0,0.3),
0px 1px 1px rgba(0,0,0,0.3),
1px 0px 1px rgba(0,0,0,0.3),
0px 0px 1px rgba(0,0,0,0.3);
transform: translateX(-50%);
z-index: 7;
&.lifted {
// Lift subtitle above toolbar+dominant speaker box.
bottom: $newToolbarSize + 36px + 40px;
}
span {
background: black;
}
}

View File

@@ -18,7 +18,8 @@
*/
#dominantSpeaker,
#largeVideoElementsContainer,
#sharedVideo {
#sharedVideo,
.stage-participant-label {
display: none;
}

View File

@@ -61,6 +61,7 @@ $flagsImagePath: "../images/";
@import 'filmstrip/vertical_filmstrip_overrides';
@import 'unsupported-browser/main';
@import 'deep-linking/main';
@import 'transcription-subtitles';
@import '_meetings_list.scss';
@import 'navigate_section_list';
@import 'third-party-branding/google';

3
debian/control vendored
View File

@@ -20,8 +20,7 @@ Description: WebRTC JavaScript video conferences
Package: jitsi-meet-web-config
Architecture: all
Pre-Depends: nginx | nginx-full | nginx-extras | openresty | apache2
Depends: openssl, curl
Depends: openssl, nginx | nginx-full | nginx-extras | openresty | apache2, curl
Description: Configuration for web serving of Jitsi Meet
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
Videobridge to provide high quality, scalable video conferences.

View File

@@ -252,10 +252,9 @@ case "$1" in
if [ "$PROSODY_CONFIG_PRESENT" = "false" ]; then
invoke-rc.d prosody restart || true
# In case we had updated the certificates and restarted prosody, let's restart and the bridge and jicofo if possible
# In case we had updated the certificates and restarted prosody, let's restart and the bridge if possible
if [ -d /run/systemd/system ] && [ "$CERT_ADDED_TO_TRUST" = "true" ]; then
systemctl restart jitsi-videobridge2.service >/dev/null || true
systemctl restart jicofo.service >/dev/null || true
fi
fi
;;

View File

@@ -175,6 +175,22 @@ case "$1" in
fi
fi
# Fixes multi-stream flags to workaround problem with mobile joining a multi-stream call with multi-stream disabled
FIX_MSG="// Temporary backwards compatibility with old mobile clients."
if ! grep -q "^${FIX_MSG}" $JITSI_MEET_CONFIG; then
echo $FIX_MSG >> $JITSI_MEET_CONFIG
echo "config.flags = config.flags || {};" >> $JITSI_MEET_CONFIG
fi
if ! grep -q "^config.flags.sourceNameSignaling*" $JITSI_MEET_CONFIG; then
echo "config.flags.sourceNameSignaling = true;" >> $JITSI_MEET_CONFIG
fi
if ! grep -q "^config.flags.sendMultipleVideoStreams*" $JITSI_MEET_CONFIG; then
echo "config.flags.sendMultipleVideoStreams = true;" >> $JITSI_MEET_CONFIG
fi
if ! grep -q "^config.flags.receiveMultipleVideoStreams*" $JITSI_MEET_CONFIG; then
echo "config.flags.receiveMultipleVideoStreams = true;" >> $JITSI_MEET_CONFIG
fi
if [[ "$FORCE_OPENRESTY" = "true" ]]; then
NGX_COMMON_CONF_PATH="/usr/local/openresty/nginx/conf/$JVB_HOSTNAME.conf"
NGX_SVC_NAME=openresty

View File

@@ -119,10 +119,8 @@ Component "internal.auth.jitmeet.example.com" "muc"
VirtualHost "auth.jitmeet.example.com"
modules_enabled = {
"limits_exception";
"smacks";
}
authentication = "internal_hashed"
smacks_hibernation_time = 15;
-- Proxy to jicofo's user JID, so that it doesn't have to register as a component.
Component "focus.jitmeet.example.com" "client_proxy"

View File

@@ -154,8 +154,6 @@ server {
proxy_pass http://127.0.0.1:8888/conference-request/v1$1;
add_header "Cache-Control" "no-cache, no-store";
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Content-Type';
}
location ~ ^/([^/?&:'"]+)/conference-request/v1(\/.*)?$ {
rewrite ^/([^/?&:'"]+)/conference-request/v1(\/.*)?$ /conference-request/v1$2;

1
globals.d.ts vendored
View File

@@ -18,6 +18,7 @@ declare global {
JITSI_MEET_LITE_SDK?: boolean;
interfaceConfig?: any;
JitsiMeetJS?: any;
JitsiMeetElectron?: any;
PressureObserver?: any;
PressureRecord?: any;
ReactNativeWebView?: any;

1
globals.native.d.ts vendored
View File

@@ -40,7 +40,6 @@ interface IWindow {
interface INavigator {
product: string;
userAgent: string;
}
declare global {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -69,11 +69,6 @@
window.indexLoadedTime = window.performance.now();
console.log("(TIME) index.html loaded:\t", indexLoadedTime);
window.addEventListener('load', function() {
window.loadedEventTime = window.performance.now();
console.log("(TIME) window loaded event:\t", loadedEventTime);
});
// XXX the code below listeners for errors and displays an error message
// in the document body when any of the required files fails to load.
// The intention is to prevent from displaying broken page.

View File

@@ -41,6 +41,14 @@ var interfaceConfig = {
*/
DISABLE_PRESENCE_STATUS: false,
/**
* Whether the ringing sound in the call/ring overlay is disabled. If
* {@code undefined}, defaults to {@code false}.
*
* @type {boolean}
*/
DISABLE_RINGING: false,
/**
* Whether the speech to text transcription subtitles panel is disabled.
* If {@code undefined}, defaults to {@code false}.
@@ -62,6 +70,9 @@ var interfaceConfig = {
ENABLE_DIAL_OUT: true,
// DEPRECATED. Animation no longer supported.
// ENABLE_FEEDBACK_ANIMATION: false,
FILM_STRIP_MAX_HEIGHT: 120,
GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true,
@@ -216,7 +227,7 @@ var interfaceConfig = {
/**
* Specify custom URL for downloading f droid app.
*/
// MOBILE_DOWNLOAD_LINK_F_DROID: 'https://f-droid.org/packages/org.jitsi.meet/',
// MOBILE_DOWNLOAD_LINK_F_DROID: 'https://f-droid.org/en/packages/org.jitsi.meet/',
// Connection indicators (
// CONNECTION_INDICATOR_AUTO_HIDE_ENABLED,

View File

@@ -1,6 +1,2 @@
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
. ${THIS_DIR}/../node_modules/react-native/scripts/find-node-for-xcode.sh
export NODE_BINARY=$(command -v node)
export ENTRY_FILE="${PROJECT_DIR}/../../index.ios.js"

View File

@@ -5,7 +5,7 @@ require Pod::Executable.execute_command('node', ['-p',
{paths: [process.argv[1]]},
)', __dir__]).strip
platform :ios, '15.1'
platform :ios, '13.4'
workspace 'jitsi-meet'
install! 'cocoapods', :deterministic_uuids => false
@@ -32,7 +32,7 @@ target 'JitsiMeetSDK' do
flags = get_default_flags()
use_react_native!(
:path => config[:reactNativePath],
:hermes_enabled => true,
:hermes_enabled => false,
:fabric_enabled => false,
# An absolute path to your application root.
:app_path => "#{Pod::Config.instance.installation_root}/.."
@@ -65,7 +65,7 @@ target 'JitsiMeetSDKLite' do
config = use_native_modules!
use_react_native!(
:path => config[:reactNativePath],
:hermes_enabled => true,
:hermes_enabled => false,
:fabric_enabled => false,
# An absolute path to your application root.
:app_path => "#{Pod::Config.instance.installation_root}/.."
@@ -90,10 +90,9 @@ post_install do |installer|
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
end
end
target.build_configurations.each do |config|
config.build_settings['SUPPORTS_MACCATALYST'] = 'NO'
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.1'
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.4'
config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited) -no-verify-emitted-module-interface'
end
end

File diff suppressed because it is too large Load Diff

View File

@@ -17,8 +17,6 @@
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>1C8F.1</string>
<string>C56D.1</string>
<string>CA92.1</string>
</array>
</dict>

View File

@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 60;
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
@@ -24,9 +24,6 @@
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
2681BB562C7A0B42CFBA6719 /* libPods-JitsiMeet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D6152FF9E9F7B0E86F70A21D /* libPods-JitsiMeet.a */; };
361974E2A13624D7735D619D /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 5C1BE20ECD5DEEB48FED90B5 /* PrivacyInfo.xcprivacy */; };
4341A9062CF0D63200940D93 /* hermes.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4341A9052CF0D63200940D93 /* hermes.xcframework */; };
4341A9072CF0D63200940D93 /* hermes.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4341A9052CF0D63200940D93 /* hermes.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
4E90F9402632D1AB001102D4 /* Atomic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E90F93F2632D1AB001102D4 /* Atomic.swift */; };
4EB06024260E026600F524C5 /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EC49B8625BED71300E76218 /* ReplayKit.framework */; };
4EB06027260E026600F524C5 /* SampleHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB06026260E026600F524C5 /* SampleHandler.swift */; };
@@ -77,7 +74,6 @@
dstSubfolderSpec = 10;
files = (
DEA9F28A258A6EA800D4CD74 /* JitsiMeetSDK.framework in Embed Frameworks */,
4341A9072CF0D63200940D93 /* hermes.xcframework in Embed Frameworks */,
FD572B9927EDF32300A800FB /* GiphyUISDK.xcframework in Embed Frameworks */,
DED016F228ECBC9D009D5E8D /* WebRTC.xcframework in Embed Frameworks */,
);
@@ -146,7 +142,6 @@
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
3E0F4ED943C0B12BE77F6B45 /* Pods-JitsiMeet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet.release.xcconfig"; path = "Target Support Files/Pods-JitsiMeet/Pods-JitsiMeet.release.xcconfig"; sourceTree = "<group>"; };
4341A9052CF0D63200940D93 /* hermes.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = hermes.xcframework; path = "../Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework"; sourceTree = "<group>"; };
4E90F93F2632D1AB001102D4 /* Atomic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Atomic.swift; sourceTree = "<group>"; };
4EB06023260E026600F524C5 /* JitsiMeetBroadcastExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = JitsiMeetBroadcastExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
4EB06026260E026600F524C5 /* SampleHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleHandler.swift; sourceTree = "<group>"; };
@@ -156,7 +151,6 @@
4EB0603A260E09D000F524C5 /* DarwinNotificationCenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DarwinNotificationCenter.swift; sourceTree = "<group>"; };
4EB0603B260E09D000F524C5 /* SampleUploader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SampleUploader.swift; sourceTree = "<group>"; };
4EC49B8625BED71300E76218 /* ReplayKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReplayKit.framework; path = System/Library/Frameworks/ReplayKit.framework; sourceTree = SDKROOT; };
5C1BE20ECD5DEEB48FED90B5 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
6132EF172BDFF13200BBE14D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = ../PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
756FCE06C08D9B947653C98A /* Pods-JitsiMeet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet.debug.xcconfig"; path = "Target Support Files/Pods-JitsiMeet/Pods-JitsiMeet.debug.xcconfig"; sourceTree = "<group>"; };
B3B083EB1D4955FF0069CEE7 /* app.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = app.entitlements; sourceTree = "<group>"; };
@@ -169,7 +163,7 @@
DEFDBBDB25656E3B00344B23 /* WebRTC.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WebRTC.xcframework; path = "../../node_modules/react-native-webrtc/ios/WebRTC.xcframework"; sourceTree = "<group>"; };
E58801132278944E008B0561 /* JitsiMeetContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JitsiMeetContext.swift; sourceTree = "<group>"; };
E5C97B62227A1EB400199214 /* JitsiMeetCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JitsiMeetCommands.swift; sourceTree = "<group>"; };
FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:925PGC4MV7:Giphy, Inc."; lastKnownFileType = wrapper.xcframework; name = GiphyUISDK.xcframework; path = ../Pods/Giphy/GiphySDK/GiphyUISDK.xcframework; sourceTree = "<group>"; };
FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = GiphyUISDK.xcframework; path = ../Pods/Giphy/GiphySDK/GiphyUISDK.xcframework; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -188,7 +182,6 @@
DEA9F289258A6EA800D4CD74 /* JitsiMeetSDK.framework in Frameworks */,
FD572B9827EDF32300A800FB /* GiphyUISDK.xcframework in Frameworks */,
2681BB562C7A0B42CFBA6719 /* libPods-JitsiMeet.a in Frameworks */,
4341A9062CF0D63200940D93 /* hermes.xcframework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -213,7 +206,6 @@
0B26BE711EC5BC4D00EEFB41 /* Frameworks */ = {
isa = PBXGroup;
children = (
4341A9052CF0D63200940D93 /* hermes.xcframework */,
DED016F028ECBC9D009D5E8D /* WebRTC.xcframework */,
FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */,
DEA9F288258A6EA800D4CD74 /* JitsiMeetSDK.framework */,
@@ -303,7 +295,6 @@
4EB06025260E026600F524C5 /* JitsiMeetBroadcast Extension */,
CDD71F5E1157E9F283DF92A8 /* Pods */,
6132EF172BDFF13200BBE14D /* PrivacyInfo.xcprivacy */,
5C1BE20ECD5DEEB48FED90B5 /* PrivacyInfo.xcprivacy */,
);
indentWidth = 2;
sourceTree = "<group>";
@@ -495,7 +486,6 @@
0B412F211EDEE95300B1A0A6 /* Main.storyboard in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
361974E2A13624D7735D619D /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -516,7 +506,7 @@
files = (
);
inputPaths = (
$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH,
"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH",
);
name = "Adjust ATS";
outputPaths = (
@@ -549,7 +539,7 @@
inputFileListPaths = (
);
inputPaths = (
$PROJECT_DIR/app.entitlements,
"$PROJECT_DIR/app.entitlements",
);
name = "Update App Entitlements";
outputFileListPaths = (
@@ -591,7 +581,7 @@
inputFileListPaths = (
);
inputPaths = (
$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH,
"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH",
);
name = "Setup Google reverse URL handler";
outputFileListPaths = (
@@ -611,7 +601,7 @@
inputFileListPaths = (
);
inputPaths = (
$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH,
"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH",
);
name = "Setup Dropbox";
outputFileListPaths = (
@@ -868,6 +858,7 @@
baseConfigurationReference = 756FCE06C08D9B947653C98A /* Pods-JitsiMeet.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDebug;
CODE_SIGN_ENTITLEMENTS = app.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
@@ -889,11 +880,6 @@
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet;
PRODUCT_NAME = "jitsi-meet";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
@@ -902,6 +888,7 @@
baseConfigurationReference = 3E0F4ED943C0B12BE77F6B45 /* Pods-JitsiMeet.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIconRelease;
CODE_SIGN_ENTITLEMENTS = app.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
@@ -922,11 +909,6 @@
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet;
PRODUCT_NAME = "jitsi-meet";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
@@ -958,10 +940,6 @@
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet.broadcast.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@@ -997,10 +975,6 @@
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet.broadcast.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -1011,7 +985,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CC = "";
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
CLANG_CXX_LIBRARY = "libc++";
@@ -1038,7 +1011,6 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
CXX = "";
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
@@ -1062,9 +1034,7 @@
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
);
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD = "";
LDPLUSPLUS = "";
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "$(inherited)";
@@ -1072,9 +1042,8 @@
OTHER_LDFLAGS = "$(inherited)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
TARGETED_DEVICE_FAMILY = "1,2";
USE_HERMES = true;
USE_HERMES = false;
};
name = Debug;
};
@@ -1082,7 +1051,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CC = "";
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
CLANG_CXX_LIBRARY = "libc++";
@@ -1109,7 +1077,6 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
CXX = "";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
@@ -1129,9 +1096,7 @@
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
);
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD = "";
LDPLUSPLUS = "";
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_CFLAGS = "$(inherited)";
OTHER_CPLUSPLUSFLAGS = "$(inherited)";
@@ -1140,7 +1105,7 @@
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
TARGETED_DEVICE_FAMILY = "1,2";
USE_HERMES = true;
USE_HERMES = false;
VALIDATE_PRODUCT = YES;
};
name = Release;

View File

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

View File

@@ -29,19 +29,11 @@
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
JitsiMeet *jitsiMeet = [JitsiMeet sharedInstance];
#if 0
jitsiMeet.webRtcLoggingSeverity = WebRTCLoggingSeverityVerbose;
#endif
jitsiMeet.conferenceActivityType = JitsiMeetConferenceActivityType;
jitsiMeet.customUrlScheme = @"org.jitsi.meet";
jitsiMeet.universalLinkDomains = @[@"meet.jit.si", @"alpha.jitsi.net", @"beta.meet.jit.si"];
jitsiMeet.defaultConferenceOptions = [JitsiMeetConferenceOptions fromBuilder:^(JitsiMeetConferenceOptionsBuilder *builder) {
// For testing configOverrides a room needs to be set
// builder.room = @"https://meet.jit.si/test0988test";
[builder setFeatureFlag:@"welcomepage.enabled" withBoolean:YES];
[builder setFeatureFlag:@"ios.screensharing.enabled" withBoolean:YES];
[builder setFeatureFlag:@"ios.recording.enabled" withBoolean:YES];

View File

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

View File

@@ -88,8 +88,8 @@
[self _onJitsiMeetViewDelegateEvent:@"CONFERENCE_WILL_JOIN" withData:data];
}
// - (void)customButtonPressed:(NSDictionary *)data {
// [self _onJitsiMeetViewDelegateEvent:@"CUSTOM_BUTTON_PRESSED" withData:data];
// - (void)customOverflowMenuButtonPressed:(NSDictionary *)data {
// [self _onJitsiMeetViewDelegateEvent:@"CUSTOM_OVERFLOW_MENU_BUTTON_PRESSED" withData:data];
// }
#if 0

View File

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

View File

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

View File

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

View File

@@ -1,12 +1,14 @@
#!/bin/bash
set -e -u -x
set -e -u
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
PROJECT_REPO=$(realpath ${THIS_DIR}/../..)
RELEASE_REPO=$(realpath ${THIS_DIR}/../../../jitsi-meet-ios-sdk-releases)
DEFAULT_SDK_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${THIS_DIR}/../sdk/src/Lite-Info.plist)
SDK_VERSION=${OVERRIDE_SDK_VERSION:-${DEFAULT_SDK_VERSION}}
DO_GIT_TAG=${GIT_TAG:-0}
echo "Releasing Jitsi Meet SDK Lite ${SDK_VERSION}"
@@ -48,18 +50,22 @@ xcodebuild -create-xcframework \
-framework ios/sdk/out/ios-device.xcarchive/Products/Library/Frameworks/JitsiMeetSDK.framework \
-framework ios/sdk/out/ios-simulator.xcarchive/Products/Library/Frameworks/JitsiMeetSDK.framework \
-output ios/sdk/out/JitsiMeetSDK.xcframework
if [[ $DO_GIT_TAG == 1 ]]; then
git tag ios-sdk-lite-${SDK_VERSION}
fi
popd
pushd ${RELEASE_REPO}
# Put the new files in the repo
cp -a ${PROJECT_REPO}/ios/sdk/out/JitsiMeetSDK.xcframework lite/Frameworks/
cp -a ${PROJECT_REPO}/ios/Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework lite/Frameworks/
# Add all files to git
git add -A .
git commit --allow-empty -m "${SDK_VERSION} lite"
git tag "${SDK_VERSION}-lite"
if [[ $DO_GIT_TAG == 1 ]]; then
git add -A .
git commit -m "${SDK_VERSION} lite"
git tag "${SDK_VERSION}-lite"
fi
popd

View File

@@ -1,12 +1,14 @@
#!/bin/bash
set -e -u -x
set -e -u
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
PROJECT_REPO=$(realpath ${THIS_DIR}/../..)
RELEASE_REPO=$(realpath ${THIS_DIR}/../../../jitsi-meet-ios-sdk-releases)
DEFAULT_SDK_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${THIS_DIR}/../sdk/src/Info.plist)
SDK_VERSION=${OVERRIDE_SDK_VERSION:-${DEFAULT_SDK_VERSION}}
DO_GIT_TAG=${GIT_TAG:-0}
echo "Releasing Jitsi Meet SDK ${SDK_VERSION}"
@@ -48,18 +50,22 @@ xcodebuild -create-xcframework \
-framework ios/sdk/out/ios-device.xcarchive/Products/Library/Frameworks/JitsiMeetSDK.framework \
-framework ios/sdk/out/ios-simulator.xcarchive/Products/Library/Frameworks/JitsiMeetSDK.framework \
-output ios/sdk/out/JitsiMeetSDK.xcframework
if [[ $DO_GIT_TAG == 1 ]]; then
git tag ios-sdk-${SDK_VERSION}
fi
popd
pushd ${RELEASE_REPO}
# Put the new files in the repo
cp -a ${PROJECT_REPO}/ios/sdk/out/JitsiMeetSDK.xcframework Frameworks/
cp -a ${PROJECT_REPO}/ios/Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework Frameworks/
# Add all files to git
git add -A .
git commit --allow-empty -m "${SDK_VERSION}"
git tag "${SDK_VERSION}"
if [[ $DO_GIT_TAG == 1 ]]; then
git add -A .
git commit -m "${SDK_VERSION}"
git tag ${SDK_VERSION}
fi
popd

View File

@@ -2,4 +2,4 @@
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
exec ${THIS_DIR}/../../node_modules/react-native/scripts/packager.sh --reset-cache
exec ${THIS_DIR}/../../node_modules/react-native/scripts/launchPackager.command --reset-cache

View File

@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -727,7 +727,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CC = "";
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@@ -758,7 +757,6 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
CXX = "";
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
@@ -778,9 +776,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD = "";
LDPLUSPLUS = "";
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "$(inherited)";
@@ -788,9 +784,8 @@
OTHER_LDFLAGS = "$(inherited)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
TARGETED_DEVICE_FAMILY = "1,2";
USE_HERMES = true;
USE_HERMES = false;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
@@ -800,7 +795,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CC = "";
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@@ -831,7 +825,6 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
CXX = "";
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -848,9 +841,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD = "";
LDPLUSPLUS = "";
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_CFLAGS = "$(inherited)";
OTHER_CPLUSPLUSFLAGS = "$(inherited)";
@@ -859,7 +850,7 @@
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
TARGETED_DEVICE_FAMILY = "1,2";
USE_HERMES = true;
USE_HERMES = false;
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
@@ -871,6 +862,7 @@
baseConfigurationReference = 09A78016288AF50ACD28A10D /* Pods-JitsiMeetSDK.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
@@ -881,24 +873,16 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
INFOPLIST_FILE = src/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_INSTALL_OBJC_HEADER = NO;
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
@@ -907,6 +891,7 @@
baseConfigurationReference = 891FE43DAD30BC8976683100 /* Pods-JitsiMeetSDK.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
@@ -917,23 +902,15 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
INFOPLIST_FILE = src/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_INSTALL_OBJC_HEADER = NO;
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
@@ -942,6 +919,7 @@
baseConfigurationReference = 8F48C340DE0D91D1012976C5 /* Pods-JitsiMeetSDKLite.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
@@ -957,24 +935,16 @@
"JITSI_MEET_SDK_LITE=1",
);
INFOPLIST_FILE = "src/Lite-Info.plist";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios;
PRODUCT_NAME = JitsiMeetSDK;
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_INSTALL_OBJC_HEADER = NO;
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
@@ -983,6 +953,7 @@
baseConfigurationReference = 86389F55993FAAF6AEB3FA3E /* Pods-JitsiMeetSDKLite.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
@@ -998,23 +969,15 @@
JITSI_MEET_SDK_LITE,
);
INFOPLIST_FILE = "src/Lite-Info.plist";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios;
PRODUCT_NAME = JitsiMeetSDK;
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_INSTALL_OBJC_HEADER = NO;
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};

View File

@@ -21,7 +21,6 @@
#import <WebRTC/WebRTC.h>
#import "JitsiAudioSession+Private.h"
#import "callkit/JMCallKitProxy.h"
// Audio mode
@@ -55,7 +54,6 @@ static NSString * const kDeviceTypeUnknown = @"UNKNOWN";
RTCAudioSessionConfiguration *audioCallConfig;
RTCAudioSessionConfiguration *videoCallConfig;
RTCAudioSessionConfiguration *earpieceConfig;
BOOL audioDisabled;
BOOL forceSpeaker;
BOOL forceEarpiece;
BOOL isSpeakerOn;
@@ -148,36 +146,9 @@ RCT_EXPORT_MODULE();
#pragma mark - Exported methods
RCT_EXPORT_METHOD(setDisabled:(BOOL)disabled
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
if (audioDisabled == disabled) {
resolve(nil);
return;
}
RCTLogInfo(@"[AudioMode] audio disabled: %d", disabled);
audioDisabled = disabled;
JMCallKitProxy.enabled = !disabled;
RTCAudioSession *session = JitsiAudioSession.rtcAudioSession;
if (disabled) {
[session removeDelegate:self];
} else {
[session addDelegate:self];
}
session.useManualAudio = disabled;
}
RCT_EXPORT_METHOD(setMode:(int)mode
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
if (audioDisabled) {
resolve(nil);
return;
}
RTCAudioSessionConfiguration *config = [self configForMode:mode];
NSError *error;
@@ -206,11 +177,6 @@ RCT_EXPORT_METHOD(setMode:(int)mode
RCT_EXPORT_METHOD(setAudioDevice:(NSString *)device
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
if (audioDisabled) {
resolve(nil);
return;
}
RCTLogInfo(@"[AudioMode] Selected device: %@", device);
RTCAudioSession *session = JitsiAudioSession.rtcAudioSession;
@@ -273,10 +239,6 @@ RCT_EXPORT_METHOD(setAudioDevice:(NSString *)device
}
RCT_EXPORT_METHOD(updateDeviceList) {
if (audioDisabled) {
return;
}
[self notifyDevicesChanged];
}

View File

@@ -18,11 +18,6 @@
static NSString * const sendEventNotificationName = @"org.jitsi.meet.SendEvent";
typedef NS_ENUM(NSInteger, RecordingMode) {
RecordingModeFile,
RecordingModeStream
};
@interface ExternalAPI : RCTEventEmitter<RCTBridgeModule>
- (void)sendHangUp;
@@ -32,13 +27,9 @@ typedef NS_ENUM(NSInteger, RecordingMode) {
- (void)retrieveParticipantsInfo:(void (^)(NSArray*))completion;
- (void)openChat:(NSString*)to;
- (void)closeChat;
- (void)sendChatMessage:(NSString*)message :(NSString*)to;
- (void)sendChatMessage:(NSString*)message :(NSString*)to ;
- (void)sendSetVideoMuted:(BOOL)muted;
- (void)sendSetClosedCaptionsEnabled:(BOOL)enabled;
- (void)toggleCamera;
- (void)showNotification:(NSString*)appearance :(NSString*)description :(NSString*)timeout :(NSString*)title :(NSString*)uid;
- (void)hideNotification:(NSString*)uid;
- (void)startRecording:(RecordingMode)mode :(NSString*)dropboxToken :(BOOL)shouldShare :(NSString*)rtmpStreamKey :(NSString*)rtmpBroadcastID :(NSString*)youtubeStreamKey :(NSString*)youtubeBroadcastID :(NSDictionary*)extraMetadata :(BOOL)transcription;
- (void)stopRecording:(RecordingMode)mode :(BOOL)transcription;
@end

View File

@@ -28,10 +28,6 @@ static NSString * const sendChatMessageAction = @"org.jitsi.meet.SEND_CHAT_MESSA
static NSString * const setVideoMutedAction = @"org.jitsi.meet.SET_VIDEO_MUTED";
static NSString * const setClosedCaptionsEnabledAction = @"org.jitsi.meet.SET_CLOSED_CAPTIONS_ENABLED";
static NSString * const toggleCameraAction = @"org.jitsi.meet.TOGGLE_CAMERA";
static NSString * const showNotificationAction = @"org.jitsi.meet.SHOW_NOTIFICATION";
static NSString * const hideNotificationAction = @"org.jitsi.meet.HIDE_NOTIFICATION";
static NSString * const startRecordingAction = @"org.jitsi.meet.START_RECORDING";
static NSString * const stopRecordingAction = @"org.jitsi.meet.STOP_RECORDING";
@implementation ExternalAPI
@@ -56,11 +52,7 @@ RCT_EXPORT_MODULE();
@"SEND_CHAT_MESSAGE": sendChatMessageAction,
@"SET_VIDEO_MUTED" : setVideoMutedAction,
@"SET_CLOSED_CAPTIONS_ENABLED": setClosedCaptionsEnabledAction,
@"TOGGLE_CAMERA": toggleCameraAction,
@"SHOW_NOTIFICATION": showNotificationAction,
@"HIDE_NOTIFICATION": hideNotificationAction,
@"START_RECORDING": startRecordingAction,
@"STOP_RECORDING": stopRecordingAction
@"TOGGLE_CAMERA": toggleCameraAction
};
};
@@ -86,11 +78,7 @@ RCT_EXPORT_MODULE();
sendChatMessageAction,
setVideoMutedAction,
setClosedCaptionsEnabledAction,
toggleCameraAction,
showNotificationAction,
hideNotificationAction,
startRecordingAction,
stopRecordingAction
toggleCameraAction
];
}
@@ -192,59 +180,4 @@ RCT_EXPORT_METHOD(sendEvent:(NSString *)name
[self sendEventWithName:toggleCameraAction body:nil];
}
- (void)showNotification:(NSString*)appearance :(NSString*)description :(NSString*)timeout :(NSString*)title :(NSString*)uid {
NSMutableDictionary *data = [[NSMutableDictionary alloc] init];
data[@"appearance"] = appearance;
data[@"description"] = description;
data[@"timeout"] = timeout;
data[@"title"] = title;
data[@"uid"] = uid;
[self sendEventWithName:showNotificationAction body:data];
}
- (void)hideNotification:(NSString*)uid {
NSMutableDictionary *data = [[NSMutableDictionary alloc] init];
data[@"uid"] = uid;
[self sendEventWithName:hideNotificationAction body:data];
}
static inline NSString *RecordingModeToString(RecordingMode mode) {
switch (mode) {
case RecordingModeFile:
return @"file";
case RecordingModeStream:
return @"stream";
default:
return nil;
}
}
- (void)startRecording:(RecordingMode)mode :(NSString*)dropboxToken :(BOOL)shouldShare :(NSString*)rtmpStreamKey :(NSString*)rtmpBroadcastID :(NSString*)youtubeStreamKey :(NSString*)youtubeBroadcastID :(NSDictionary*)extraMetadata :(BOOL)transcription {
NSString *modeString = RecordingModeToString(mode);
NSDictionary *data = @{
@"mode": modeString,
@"dropboxToken": dropboxToken,
@"shouldShare": @(shouldShare),
@"rtmpStreamKey": rtmpStreamKey,
@"rtmpBroadcastID": rtmpBroadcastID,
@"youtubeStreamKey": youtubeStreamKey,
@"youtubeBroadcastID": youtubeBroadcastID,
@"extraMetadata": extraMetadata,
@"transcription": @(transcription)
};
[self sendEventWithName:startRecordingAction body:data];
}
- (void)stopRecording:(RecordingMode)mode :(BOOL)transcription {
NSString *modeString = RecordingModeToString(mode);
NSDictionary *data = @{
@"mode": modeString,
@"transcription": @(transcription)
};
[self sendEventWithName:stopRecordingAction body:data];
}
@end

View File

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

View File

@@ -24,15 +24,11 @@
}
+ (void)activateWithAudioSession:(AVAudioSession *)session {
if (!self.rtcAudioSession.useManualAudio) {
[self.rtcAudioSession audioSessionDidActivate:session];
}
[self.rtcAudioSession audioSessionDidActivate:session];
}
+ (void)deactivateWithAudioSession:(AVAudioSession *)session {
if (!self.rtcAudioSession.useManualAudio) {
[self.rtcAudioSession audioSessionDidDeactivate:session];
}
[self.rtcAudioSession audioSessionDidDeactivate:session];
}
@end

View File

@@ -19,15 +19,6 @@
#import <JitsiMeetSDK/JitsiMeetConferenceOptions.h>
// Matches RTCLoggingSeverity from RTCLogging.h
typedef NS_ENUM(NSInteger, WebRTCLoggingSeverity) {
WebRTCLoggingSeverityVerbose,
WebRTCLoggingSeverityInfo,
WebRTCLoggingSeverityWarning,
WebRTCLoggingSeverityError,
WebRTCLoggingSeverityNone,
};
@interface JitsiMeet : NSObject
/**
@@ -35,35 +26,20 @@ typedef NS_ENUM(NSInteger, WebRTCLoggingSeverity) {
* SiriKit or Handoff, for example.
*/
@property (copy, nonatomic, nullable) NSString *conferenceActivityType;
/**
* Custom URL scheme used for deep-linking.
*/
@property (copy, nonatomic, nullable) NSString *customUrlScheme;
/**
* List of domains used for universal linking.
*/
@property (copy, nonatomic, nullable) NSArray<NSString *> *universalLinkDomains;
/**
* Default conference options used for all conferences. These options will be merged
* with those passed to JitsiMeetView.join when joining a conference.
*/
@property (nonatomic, nullable) JitsiMeetConferenceOptions *defaultConferenceOptions;
/**
* Custom RTCAudioDevice implementation.
* https://github.com/jitsi/webrtc/blob/M124/sdk/objc/components/audio/RTCAudioDevice.h
* https://github.com/mstyura/RTCAudioDevice
*/
@property (nonatomic, strong, nullable) id rtcAudioDevice;
/**
* Specify WebRTC logging severity.
*/
@property (nonatomic, assign) WebRTCLoggingSeverity webRtcLoggingSeverity;
#pragma mark - This class is a singleton
+ (instancetype _Nonnull)sharedInstance;

View File

@@ -54,9 +54,14 @@
- (instancetype)init {
if (self = [super init]) {
#if 0
// Initialize WebRTC options.
self.rtcAudioDevice = nil;
self.webRtcLoggingSeverity = WebRTCLoggingSeverityNone;
WebRTCModuleOptions *options = [WebRTCModuleOptions sharedInstance];
options.loggingSeverity = RTCLoggingSeverityInfo;
#endif
// Initialize the one and only bridge for interfacing with React Native.
_bridgeWrapper = [[RCTBridgeWrapper alloc] init];
// Initialize the listener for handling start/stop screensharing notifications.
_screenshareEventEmiter = [[ScheenshareEventEmiter alloc] init];
@@ -137,12 +142,6 @@
return;
};
// Initialize WebRTC options.
WebRTCModuleOptions *options = [WebRTCModuleOptions sharedInstance];
options.audioDevice = _rtcAudioDevice;
options.loggingSeverity = (RTCLoggingSeverity)_webRtcLoggingSeverity;
// Initialize the one and only bridge for interfacing with React Native.
_bridgeWrapper = [[RCTBridgeWrapper alloc] init];
}
@@ -232,9 +231,6 @@
}
- (void)setDefaultConferenceOptions:(JitsiMeetConferenceOptions *)defaultConferenceOptions {
// For testing configOverrides a room needs to be set,
// thus the following check needs to be commented out
if (defaultConferenceOptions != nil && defaultConferenceOptions.room != nil) {
@throw [NSException exceptionWithName:@"RuntimeError"
reason:@"'room' must be null in the default conference options"
@@ -250,8 +246,6 @@
}
- (RCTBridge *)getReactBridge {
// Initialize bridge lazily.
[self instantiateReactNativeBridge];
return _bridgeWrapper.bridge;
}

View File

@@ -21,8 +21,6 @@
#import "JitsiMeetConferenceOptions.h"
#import "JitsiMeetViewDelegate.h"
typedef NS_ENUM(NSInteger, RecordingMode);
@interface JitsiMeetView : UIView
@property (nonatomic, nullable, weak) id<JitsiMeetViewDelegate> delegate;
@@ -49,9 +47,5 @@ typedef NS_ENUM(NSInteger, RecordingMode);
- (void)setVideoMuted:(BOOL)muted;
- (void)setClosedCaptionsEnabled:(BOOL)enabled;
- (void)toggleCamera;
- (void)showNotification:(NSString * _Nonnull)appearance :(NSString * _Nullable)description :(NSString * _Nullable)timeout :(NSString * _Nullable)title :(NSString * _Nullable)uid;
- (void)hideNotification:(NSString * _Nullable)uid;
- (void)startRecording:(RecordingMode)mode :(NSString * _Nullable)dropboxToken :(BOOL)shouldShare :(NSString * _Nullable)rtmpStreamKey :(NSString * _Nullable)rtmpBroadcastID :(NSString * _Nullable)youtubeStreamKey :(NSString * _Nullable)youtubeBroadcastID :(NSString * _Nullable)extraMetadata :(BOOL)transcription;
- (void)stopRecording:(RecordingMode)mode :(BOOL)transcription;
@end

View File

@@ -143,26 +143,6 @@ static NSString *const PiPEnabledFeatureFlag = @"pip.enabled";
[externalAPI toggleCamera];
}
- (void)showNotification:(NSString *)appearance :(NSString *)description :(NSString *)timeout :(NSString *)title :(NSString *)uid {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI showNotification:appearance :description :timeout :title :uid];
}
-(void)hideNotification:(NSString *)uid {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI hideNotification:uid];
}
- (void)startRecording:(RecordingMode)mode :(NSString *)dropboxToken :(BOOL)shouldShare :(NSString *)rtmpStreamKey :(NSString *)rtmpBroadcastID :(NSString *)youtubeStreamKey :(NSString *)youtubeBroadcastID :(NSString *)extraMetadata :(BOOL)transcription {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI startRecording:mode :dropboxToken :shouldShare :rtmpStreamKey :rtmpBroadcastID :youtubeStreamKey :youtubeBroadcastID :extraMetadata :transcription];
}
- (void)stopRecording:(RecordingMode)mode :(BOOL)transcription {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI stopRecording:mode :transcription];
}
#pragma mark Private methods
- (void)registerObservers {

View File

@@ -128,6 +128,6 @@
*
* The `data` dictionary contains a `id`, `text` key.
*/
- (void)customButtonPressed:(NSDictionary *)data;
- (void)customOverflowMenuButtonPressed:(NSDictionary *)data;
@end

View File

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

View File

@@ -37,7 +37,6 @@
"ml": "മലയാളം",
"mn": "Монгол",
"mr": "मराठी",
"nb": "Norsk bokmål",
"nl": "Nederlands",
"oc": "Occitan",
"pl": "Polski",

View File

@@ -68,7 +68,7 @@
"DISCONNECTED": "Ontkoppeld",
"DISCONNECTING": "Ontkoppel tans",
"ERROR": "Fout",
"RECONNECTING": "n Netwerkprobleem het voorgekom. Herkoppel tans"
"RECONNECTING": "n Netwerkprobleem het voorgekom. Herkoppel tans..."
},
"connectionindicator": {
"address": "Adres:",
@@ -426,7 +426,7 @@
"somebody": "Iemand",
"startSilentDescription": "",
"startSilentTitle": "",
"suboptimalExperienceDescription": "Gits ons is bevrees u ervaring met {{appName}} gaan nie so goed wees hier nie. Ons soek maniere om dit die hoof te bied, maar probeer intussen een van die <a href='{{recommendedBrowserPageLink}}' target='_blank'>volledig ondersteunde blaaiers</a>.",
"suboptimalExperienceDescription": "Gits... ons is bevrees u ervaring met {{appName}} gaan nie so goed wees hier nie. Ons soek maniere om dit die hoof te bied, maar probeer intussen een van die <a href='{{recommendedBrowserPageLink}}' target='_blank'>volledig ondersteunde blaaiers</a>.",
"suboptimalExperienceTitle": "Blaaierwaarskuwing",
"unmute": ""
},
@@ -443,7 +443,7 @@
"calling": "Bel tans…",
"connected": "Gekoppel",
"connecting": "Koppel tans…",
"connecting2": "Koppel tans*",
"connecting2": "Koppel tans*...",
"disconnected": "Ontkoppeld",
"expired": "Verval",
"ignored": "Geïgnoreer",
@@ -641,7 +641,16 @@
"tr": ""
},
"userMedia": {
"grantPermissions": "Gee asb. toestemming vir die gebruik van u kamera en mikrofoon."
"androidGrantPermissions": "Kies <b><i>Allow</i></b> wanneer die blaaier vir toestemming vra.",
"chromeGrantPermissions": "Kies <b><i>Allow</i></b> wanneer die blaaier vir toestemming vra.",
"edgeGrantPermissions": "Kies <b><i>Yes</i></b> wanneer die blaaier vir toestemming vra.",
"electronGrantPermissions": "Gee asb. toestemming vir die gebruik van u kamera en mikrofoon",
"firefoxGrantPermissions": "Kies <b><i>Deel gekose toestel</i></b> wanneer die blaaier vir toestemming vra.",
"iexplorerGrantPermissions": "Kies <b><i>OK</i></b> wanneer die blaaier vir toestemming vra.",
"nwjsGrantPermissions": "Gee asb. toestemming vir die gebruik van u kamera en mikrofoon",
"operaGrantPermissions": "Kies <b><i>Allow</i></b> wanneer die blaaier vir toestemming vra.",
"react-nativeGrantPermissions": "Kies <b><i>Allow</i></b> wanneer die blaaier vir toestemming vra.",
"safariGrantPermissions": "Kies <b><i>OK</i></b> wanneer die blaaier vir toestemming vra."
},
"videoSIPGW": {
"busy": "Ons probeer tans hulpbronne vry te stel. Probeer gerus weer oor n paar minute.",

View File

@@ -122,7 +122,7 @@
"installExtensionText": "نزِّل الإضافة للدمج مع رزنامة غوغل ورزنامة أوفيس 365"
},
"connectingOverlay": {
"joiningRoom": "قيد وصلك بالإجتماع"
"joiningRoom": "قيد وصلك بالإجتماع..."
},
"connection": {
"ATTACHED": "رُبِط",
@@ -134,7 +134,7 @@
"DISCONNECTED": "فُصِل",
"DISCONNECTING": "قيد الفصل",
"ERROR": "خطأ",
"FETCH_SESSION_ID": "قيد الحصول على مُعرِّف الجلسة",
"FETCH_SESSION_ID": "قيد الحصول على مُعرِّف الجلسة...",
"GET_SESSION_ID_ERROR": "خطأ في الحصول على مُعرِّف الجلسة: {{code}}",
"GOT_SESSION_ID": "جرى الحصول على مُعرِّف الجلسة",
"LOW_BANDWIDTH": "أوقف فيديو {{displayName}} لتوفير كمية البيانات المتبادلة"
@@ -189,7 +189,7 @@
"ifHaveApp": "إن كان لديك التطبيق:",
"joinInApp": "انضم للمُلتقى عبر تطبيق الجوال",
"launchWebButton": "افتح تطبيق الويب",
"title": "قيد عقد مُلتقىك في {{app}}",
"title": "قيد عقد مُلتقىك في {{app}}...",
"tryAgainButton": "جرب مرة أخرى في تطبيق الحاسوب",
"unsupportedBrowser": "يبدو أنك تستخدم متصفحًا لا ندعمه."
},
@@ -222,7 +222,7 @@
"Share": "شارك",
"Submit": "أرسل",
"WaitForHostMsg": "لم يبدأ المؤتمر بعد. إن كنت المضيف والراعي، فنرجو تأكيد ذلك عبر الاستيثاق أو انتظر وصول المضيف رجاءً. ",
"WaitingForHostTitle": "في انتظار المضيف",
"WaitingForHostTitle": "في انتظار المضيف ...",
"Yes": "نعم",
"accessibilityLabel": {
"liveStreaming": "بث حي مباشر"
@@ -244,9 +244,9 @@
"cameraUnknownError": "يصعب استعمال الكاميرا لأسباب مجهولة.",
"cameraUnsupportedResolutionError": "لا تدعم كاميرتك دقة الفيديو المطلوبة.",
"close": "أغلق",
"conferenceDisconnectMsg": "قد تضطر للتحقق من اتصال الشبكة لديك. سيعاد الاتصال خلال {{seconds}} ثانية",
"conferenceDisconnectMsg": "قد تضطر للتحقق من اتصال الشبكة لديك. سيعاد الاتصال خلال {{seconds}} ثانية...",
"conferenceDisconnectTitle": "فُصِل الاتصال لديك.",
"conferenceReloadMsg": "نحاول إصلاح الأمر. سيعاد الاتصال خلال {{seconds}} ثانية",
"conferenceReloadMsg": "نحاول إصلاح الأمر. سيعاد الاتصال خلال {{seconds}} ثانية...",
"conferenceReloadTitle": "لم تسر الأمور على ما يرام، نأسف لذلك!",
"confirm": "أكِّد",
"confirmNo": "لا",
@@ -531,7 +531,7 @@
"errorLiveStreamNotEnabled": "البث الحي غير مفعَّل على على {{email}}. فعَّل البث الحي رجاءً، أو سجِّل الدخل إلى حسابٍ مُفعَّل فيه البث الحي",
"expandedOff": "أُوقِف البث الحي",
"expandedOn": "يجري بث المُلتقى على يوتيوب",
"expandedPending": "تبدأ عملية البث الحي",
"expandedPending": "تبدأ عملية البث الحي...",
"failedToStart": "فشلت عملية بدء البث الحي",
"getStreamKeyManually": "لم نتمكن من الوصول إلى أي بث حي. جرب جلب مفتاح بث حي خاص بك من يوتيوب.",
"googlePrivacyPolicy": "سياسية خصوصية غوغل",
@@ -574,10 +574,10 @@
"joinRejectedMessage": "رفض رئيس الجلسة منحك الإذن بالدخول إلى المُلتقى",
"joinRejectedTitle": "تم رفض طلب الانضمام.",
"joinTitle": "انضم للمُلتقى",
"joinWithPasswordMessage": "الرجاء الانتظار أثناء محاولة الدخول دون كلمة مرور",
"joinWithPasswordMessage": "الرجاء الانتظار أثناء محاولة الدخول دون كلمة مرور...",
"joiningMessage": "ستتمكن من الانضمام للمُلتقى بعد الموافقة على طلبك",
"joiningTitle": "يجري طلب إذنٍ للدخول",
"joiningWithPasswordTitle": "الدخول مع كلمة مرور",
"joiningTitle": "يجري طلب إذنٍ للدخول...",
"joiningWithPasswordTitle": "الدخول مع كلمة مرور...",
"knockButton": "اطلب إذن الدخول",
"knockTitle": "يريد أحدٌ الدخول إلى المُلتقى",
"knockingParticipantList": "تنبيه قائمة المشاركين",
@@ -658,7 +658,7 @@
"linkToSalesforceDescription": "يمكنك ربط ملخص الاجتماع بكائن Salesforce.",
"linkToSalesforceError": "فشل ربط المُلتقى بـ Salesforce",
"linkToSalesforceKey": "ربط هذا المُلتقى",
"linkToSalesforceProgress": "جارٍ ربط الاجتماع بـ Salesforce",
"linkToSalesforceProgress": "جارٍ ربط الاجتماع بـ Salesforce ...",
"linkToSalesforceSuccess": "تم ربط الاجتماع بـ Salesforce",
"localRecordingStarted": "بدأ {{name}} تسجيلًا محليًا.",
"localRecordingStopped": "أوقف {{name}} التسجيل المحلي.",
@@ -789,7 +789,7 @@
"callMe": "اتصل بي",
"callMeAtNumber": "اتصل بي على هذا الرقم:",
"calling": "قيد الاتصال",
"configuringDevices": "يجري ضبط الأجهزة",
"configuringDevices": "يجري ضبط الأجهزة...",
"connectedWithAudioQ": "هل متصل بجهاز صوت؟",
"connection": {
"good": "اتصال الإنترنت لديك جيد!",
@@ -843,17 +843,17 @@
},
"presenceStatus": {
"busy": "مشغول",
"calling": "يتحدث",
"calling": "يتحدث...",
"connected": "متصل",
"connecting": "يتصل",
"connecting2": "يتصل",
"connecting": "يتصل...",
"connecting2": "يتصل...",
"disconnected": "غير الاتصال",
"expired": "منتهي الصلاحية",
"ignored": "مهمل",
"initializingCall": "تهيئة مكالمة",
"initializingCall": "تهيئة مكالمة...",
"invited": "مدعو",
"rejected": "مرفوض",
"ringing": "يرن"
"ringing": "يرن..."
},
"privacyView": {
"title": "خصوصية"
@@ -890,7 +890,7 @@
"errorFetchingLink": "خطأ في جلب رابط التسجيل.",
"expandedOff": "أوقٍف التسجيل",
"expandedOn": "يُسجَّل المُلتقى الآن",
"expandedPending": "بدء التسجيل",
"expandedPending": "بدء التسجيل...",
"failedToStart": "فشل بدء التسجيل",
"fileSharingdescription": "شارك التسجيل مع المشاركين للمُلتقى",
"highlight": "تسليط الضوء",
@@ -917,7 +917,7 @@
"on": "تسجيل",
"onBy": "بدأ {{name}} التسجيل",
"onlyRecordSelf": "تسجيل فقط دفق الصوت والفيديو الخاصة بي",
"pending": "التحضير لتسجيل المُلتقى",
"pending": "التحضير لتسجيل المُلتقى...",
"rec": "تسجيل",
"saveLocalRecording": "حفظ ملف التسجيل محليا",
"serviceDescription": "ستحفظ خدمة التسجيل الفيديو المستجل",
@@ -1215,7 +1215,7 @@
"failedToStart": "فشلت عملية بدء الإذاعة",
"labelToolTip": "يجري إذاعة المُلتقى",
"off": "أوقفت الإذاعة",
"pending": "التحضير لإذاعة المُلتقى",
"pending": "التحضير لإذاعة المُلتقى...",
"start": "بدء إظهار الترجمة",
"stop": "إيقاف عرض الترجمة",
"subtitles": "ترجمات",
@@ -1223,7 +1223,16 @@
"tr": "يذاع"
},
"userMedia": {
"grantPermissions": "امنح إذنًا باستعمال الكاميرا والمايكروفون."
"androidGrantPermissions": "اختر <b><i>السماح</i></b> عندما يطلب المتصفح الأذونات.",
"chromeGrantPermissions": "اختر <b><i>السماح</i></b> عندما يطلب المتصفح الأذونات.",
"edgeGrantPermissions": "اختر <b><i>نعم</i></b> عندما يطلب المتصفح الأذونات.",
"electronGrantPermissions": "امنح إذنًا باستعمال الكاميرا والمايكروفون.",
"firefoxGrantPermissions": "اختر <b><i>مشاركة الجهاز المحدَّد</i></b> عندما يطل بالمتصفح الأذونات.",
"iexplorerGrantPermissions": "اختر <b><i>تمام</i></b> عندما يطلب المتصفح الأذونات.",
"nwjsGrantPermissions": "امنح إذنًا باستعمال الكاميرا والمايكروفون.",
"operaGrantPermissions": "اختر <b><i>السماح</i></b> عندما يطلب المتصفح الأذونات.",
"react-nativeGrantPermissions": "اختر <b><i>السماح</i></b> عندما يطلب المتصفح الأذونات.",
"safariGrantPermissions": "اختر <b><i>تمام</i></b> عندما يطلب المتصفح الأذونات."
},
"videoSIPGW": {
"busy": "نعمل على تحرير الموارد. حاول مرة أخرى لاحقًا بعد بضعة دقائق.",
@@ -1293,7 +1302,7 @@
"image6": "غابة",
"image7": "شروق الشمس",
"none": "بدون",
"pleaseWait": "يرجى الانتظار",
"pleaseWait": "يرجى الانتظار...",
"removeBackground": "إزالة خلفية",
"slightBlur": "طمس طفيف",
"title": "خلفيات افتراضية",

View File

@@ -489,7 +489,7 @@
"calling": "Выклікаю…",
"connected": "Падключана",
"connecting": "Падлучэнне…",
"connecting2": "Падлучэнне *",
"connecting2": "Падлучэнне * ...",
"disconnected": "Адключана",
"expired": "Скончыўся",
"ignored": "праігнаравалі",
@@ -714,7 +714,16 @@
"tr": "TR"
},
"userMedia": {
"grantPermissions": "Калі ласка, дайце дазвол на доступ да камеры і мікрафону."
"androidGrantPermissions": "Калі ласка, пазначце <b> <i> Дазволіць </i> </b>, калі браўзэр спытае пра дазволы.",
"chromeGrantPermissions": "Калі ласка, пазначце <b> <i> Дазволіць </i> </b>, калі браўзэр спытае пра дазволы.",
"edgeGrantPermissions": "Калі ласка, пазначце <b> <i> Ды </i> </b>, калі браўзэр спытае пра дазволы.",
"electronGrantPermissions": "Калі ласка, дайце дазвол на доступ да камеры і мікрафону",
"firefoxGrantPermissions": "Калі ласка, пазначце <b> <i> Падзяліцца абраным прыладай </i> </b>, калі браўзэр спытае пра дазволы.",
"iexplorerGrantPermissions": "Калі ласка, пазначце <b> <i> OK </i> </b>, калі браўзэр спытае пра дазволы.",
"nwjsGrantPermissions": "Калі ласка, дайце дазвол на доступ да камеры і мікрафону",
"operaGrantPermissions": "Калі ласка, пазначце <b> <i> Дазволіць </i> </b>, калі браўзэр спытае пра дазволы.",
"react-nativeGrantPermissions": "Калі ласка, пазначце <b> <i> Дазволіць </i> </b>, калі браўзэр спытае пра дазволы.",
"safariGrantPermissions": "Калі ласка, пазначце <b> <i> OK </i> </b>, калі браўзэр спытае пра дазволы."
},
"videoSIPGW": {
"busy": "Мы працуем над вызваленнем рэсурсаў. Калі ласка, паспрабуйце праз некалькі хвілін.",

View File

@@ -80,7 +80,7 @@
"installExtensionText": "Инсталирайте разширенията за Google Calendar и Office 365"
},
"connectingOverlay": {
"joiningRoom": "Свързване с вашата среща"
"joiningRoom": "Свързване с вашата среща..."
},
"connection": {
"ATTACHED": "Прикрепен",
@@ -92,11 +92,11 @@
"DISCONNECTED": "Изключен",
"DISCONNECTING": "Прекъсване на връзката",
"ERROR": "Грешка",
"FETCH_SESSION_ID": "Отваряне на сесия",
"FETCH_SESSION_ID": "Отваряне на сесия...",
"GET_SESSION_ID_ERROR": "Грешка при отваряне на сесията: {{code}}",
"GOT_SESSION_ID": "Отваряне на сесията Готово",
"GOT_SESSION_ID": "Отваряне на сесията... Готово",
"LOW_BANDWIDTH": "Видеото на {{displayName}} беше изключено, поради слаба Интернет връзка",
"RECONNECTING": "Появи се проблем с мрежата. Връзваме се наново"
"RECONNECTING": "Появи се проблем с мрежата. Връзваме се наново..."
},
"connectionindicator": {
"address": "Адрес:",
@@ -140,7 +140,7 @@
"downloadApp": "Свалете приложението",
"launchWebButton": "Заредете уеб страницата",
"openApp": "Продължете към приложението",
"title": "Зареждане на срещата в {{app}}",
"title": "Зареждане на срещата в {{app}}...",
"tryAgainButton": "Пробвайте отново"
},
"defaultLink": "напр. {{url}}",
@@ -169,7 +169,7 @@
"Share": "Споделяне",
"Submit": "Изпращане",
"WaitForHostMsg": "Конференцията все още не е започнала. Ако сте домакинът, тогава се идентифицирайте. В противен случай изчакайте докато домакинът пристигне.",
"WaitingForHost": "Чакаме домакина",
"WaitingForHost": "Чакаме домакина...",
"Yes": "Да",
"accessibilityLabel": {
"liveStreaming": "Излъчване на живо"
@@ -398,7 +398,7 @@
"errorLiveStreamNotEnabled": "Предаването на живо не е пуснато за {{email}}. Моля, активирайте го или сменете акаунта.",
"expandedOff": "Предаването на живо бе спряно",
"expandedOn": "Срещата се излъчва на живо в YouTube.",
"expandedPending": "Излъчването на живо се стартира",
"expandedPending": "Излъчването на живо се стартира...",
"failedToStart": "Излъчването на живо не успя да започне",
"getStreamKeyManually": "Не успяхме да открием никакво предаване на живо. Опитайте да вземете ключа за такова от YouTube.",
"googlePrivacyPolicy": "Политика за поверителност на Google",
@@ -433,10 +433,10 @@
"invalidPassword": "Невалидна парола",
"joinRejectedMessage": "Вашето желание за включване беше отхвърлено от модератор.",
"joinTitle": "Включи се в срещата",
"joinWithPasswordMessage": "Опит за включване с парола, моля изчакайте",
"joinWithPasswordMessage": "Опит за включване с парола, моля изчакайте...",
"joiningMessage": "Ще влезете в срещата, когато някой ви приеме",
"joiningTitle": "Изчаква одобрение",
"joiningWithPasswordTitle": "Включване с парола",
"joiningTitle": "Изчаква одобрение...",
"joiningWithPasswordTitle": "Включване с парола...",
"knockButton": "Поискай достъп",
"knockTitle": "Някой желае да се включи в срещата",
"knockingParticipantList": "Списък с чакащи участници",
@@ -535,17 +535,17 @@
"poweredby": "с подкрепата на",
"presenceStatus": {
"busy": "Зает",
"calling": "Обаждане",
"calling": "Обаждане...",
"connected": "Свързан",
"connecting": "Свързване",
"connecting2": "Свързване*",
"connecting": "Свързване...",
"connecting2": "Свързване*...",
"disconnected": "Изключен",
"expired": "Изтекъл",
"ignored": "Пренебрегнат",
"initializingCall": "Започване на обаждането",
"initializingCall": "Започване на обаждането...",
"invited": "Поканен",
"rejected": "Отхвърлен",
"ringing": "Звъни"
"ringing": "Звъни..."
},
"profile": {
"setDisplayNameLabel": "Задайте екранното си име",
@@ -563,7 +563,7 @@
"error": "Грешка при опит за запис. Моля, опитайте отново.",
"expandedOff": "Записът спря",
"expandedOn": "Срещата се записва в момента.",
"expandedPending": "Записът започва",
"expandedPending": "Записът започва...",
"failedToStart": "Неуспешен опит за записване",
"fileSharingdescription": "Споделете записа с участниците в срещата",
"live": "На Живо",
@@ -572,7 +572,7 @@
"offBy": "{{name}} спря записа",
"on": "Запис",
"onBy": "{{name}} пусна запис",
"pending": "Стартира запис на срещата",
"pending": "Стартира запис на срещата...",
"rec": "ЗАПИС",
"serviceDescription": "Записът Ви ще се запише от специална записваща услуга",
"serviceName": "Записваща услуга",
@@ -764,13 +764,22 @@
"failedToStart": "Транскрибирането не успя при пускане",
"labelToolTip": "Тази среща се транскрибира",
"off": "Транскрибирането спря",
"pending": "Стартира се транскрибиране на срещата",
"pending": "Стартира се транскрибиране на срещата...",
"start": "Започва показване на субтитри",
"stop": "Спира показване на субтитри",
"tr": "СУБ"
},
"userMedia": {
"grantPermissions": "Моля, разрешете използването на камерата и микрофона."
"androidGrantPermissions": "Изберете <b><i>Разрешаване</i></b>, когато браузърът Ви помоли за разрешение.",
"chromeGrantPermissions": "Изберете <b><i>Разрешаване</i></b>, когато браузърът Ви помоли за разрешение.",
"edgeGrantPermissions": "Изберете <b><i>Да</i></b>, когато браузърът Ви помоли за разрешение.",
"electronGrantPermissions": "Моля, разрешете използването на камерата и микрофона",
"firefoxGrantPermissions": "Изберете <b><i>Споделяне на избраното устройство</i></b>, когато браузърът Ви помоли за разрешение.",
"iexplorerGrantPermissions": "Изберете <b><i>Добре</i></b>, когато браузърът Ви помоли за разрешение.",
"nwjsGrantPermissions": "Моля, разрешете използването на камерата и микрофона",
"operaGrantPermissions": "Изберете <b><i>Разрешаване</i></b>, когато браузърът Ви помоли за разрешение.",
"react-nativeGrantPermissions": "Изберете <b><i>Разрешаване</i></b>, когато браузърът Ви помоли за разрешение.",
"safariGrantPermissions": "Изберете <b><i>Добре</i></b>, когато браузърът Ви помоли за разрешение."
},
"videoSIPGW": {
"busy": "Работим по освобождаване на ресурси. Моля, опитайте след няколко минути.",

View File

@@ -19,7 +19,7 @@
"noResults": "No s'ha trobat cap resultat coincident",
"outlookEmail": "Correu d'Outlook",
"phoneNumbers": "números de telèfon",
"searching": "S'està cercant",
"searching": "S'està cercant...",
"shareInvite": "Comparteix la invitació a la reunió",
"shareLink": "Compartiu l'enllaç de la reunió per a convidar altres persones",
"shareStream": "Comparteix l'enllaç de la transmissió en directe",
@@ -122,7 +122,7 @@
"installExtensionText": "Instal·la l'extensió per a la integració amb Google Calendar i Office 365"
},
"connectingOverlay": {
"joiningRoom": "S'està connectat a la reunió"
"joiningRoom": "S'està connectat a la reunió..."
},
"connection": {
"ATTACHED": "Adjunt",
@@ -134,9 +134,9 @@
"DISCONNECTED": "Desconnectat",
"DISCONNECTING": "S'està desconnectant",
"ERROR": "Error",
"FETCH_SESSION_ID": "S'està obtenint un identificador de sessió",
"FETCH_SESSION_ID": "S'està obtenint un identificador de sessió...",
"GET_SESSION_ID_ERROR": "S'ha produït un error en obtenir l'identificador de la sessió: {{code}}",
"GOT_SESSION_ID": "Obtenció d'identificador de sessió. Fet",
"GOT_SESSION_ID": "Obtenció d'identificador de sessió.... Fet",
"LOW_BANDWIDTH": "S'ha apagat el vídeo de {{displayName}} per a estalviar amplada de banda"
},
"connectionindicator": {
@@ -189,7 +189,7 @@
"ifHaveApp": "Si ja teniu l'aplicació:",
"joinInApp": "Uniu-vos a aquesta reunió amb l'aplicació",
"launchWebButton": "Inicia al web",
"title": "S'està iniciant la reunió en {{app}}.",
"title": "S'està iniciant la reunió en {{app}}....",
"tryAgainButton": "Torna-ho a intentar en l'escriptori",
"unsupportedBrowser": "Sembla que useu un navegador que no suportem."
},
@@ -222,7 +222,7 @@
"Share": "Comparteix",
"Submit": "Tramet",
"WaitForHostMsg": "La conferència encara no ha començat. Si en sou l'amfitrió, autentiqueu-vos. Altrament, espereu que arribi l'amfitrió.",
"WaitingForHostTitle": "S'està esperant l'amfitrió",
"WaitingForHostTitle": "S'està esperant l'amfitrió...",
"Yes": "Sí",
"accessibilityLabel": {
"liveStreaming": "Transmissió en directe"
@@ -244,9 +244,9 @@
"cameraUnknownError": "Per algun motiu desconegut, no es pot usar la càmera.",
"cameraUnsupportedResolutionError": "La vostra càmera no permet la resolució de vídeo requerida.",
"close": "Tanca",
"conferenceDisconnectMsg": "Potser voleu comprovar la connexió a la xarxa. Es tornarà a connectar en {{seconds}} segons",
"conferenceDisconnectMsg": "Potser voleu comprovar la connexió a la xarxa. Es tornarà a connectar en {{seconds}} segons...",
"conferenceDisconnectTitle": "Esteu desconnectat.",
"conferenceReloadMsg": "Intentem de corregir-ho. Tornem a connectar en {{seconds}} segons",
"conferenceReloadMsg": "Intentem de corregir-ho. Tornem a connectar en {{seconds}} segons...",
"conferenceReloadTitle": "Malauradament, alguna cosa no ha anat bé.",
"confirm": "Confirmo",
"confirmNo": "No",
@@ -535,7 +535,7 @@
"errorLiveStreamNotEnabled": "La transmissió en directe no està activada a ̣{{email}}. Activeu-la o inicieu sessió en un compte que tingui la transmissió en directe activada.",
"expandedOff": "S'ha aturat la transmissió en directe",
"expandedOn": "Ara mateix, la reunió s'està transmetent a Youtube.",
"expandedPending": "S'ha iniciat la transmissió en directe",
"expandedPending": "S'ha iniciat la transmissió en directe...",
"failedToStart": "No s'ha pogut iniciar la transmissió en directe",
"getStreamKeyManually": "No hem pogut obtenir cap transmissió en directe. Intenteu d'aconseguir la clau de transmissió en directe del YouTube.",
"googlePrivacyPolicy": "Polítiques de privadesa de Google",
@@ -547,7 +547,7 @@
"offBy": "{{name}} ha aturat la transmissió en directe",
"on": "Ha començat la transmissió en directe",
"onBy": "{{name}} ha iniciat la transmissió en directe",
"pending": "S'està iniciant la transmissió en directe",
"pending": "S'està iniciant la transmissió en directe...",
"serviceName": "Servei de transmissió en directe",
"sessionAlreadyActive": "Aquesta sessió ja s'està enregistrant o s'està emetent en directe.",
"signIn": "Inicia sessió amb Google",
@@ -578,10 +578,10 @@
"joinRejectedMessage": "La vostra sol·licitud ha estat rebutjada per un moderador.",
"joinRejectedTitle": "S'ha rebutjat la petició d'unir-s'hi.",
"joinTitle": "Entra a la reunió",
"joinWithPasswordMessage": "S'està intentant unir-s'hi amb contrasenya, espereu",
"joinWithPasswordMessage": "S'està intentant unir-s'hi amb contrasenya, espereu...",
"joiningMessage": "Us unireu a la reunió de seguida que algú accepti la sol·licitud",
"joiningTitle": "S'ha demanat per a entrar a la reunió",
"joiningWithPasswordTitle": "Afegeix-m'hi amb contrasenya",
"joiningTitle": "S'ha demanat per a entrar a la reunió...",
"joiningWithPasswordTitle": "Afegeix-m'hi amb contrasenya...",
"knockButton": "Demana d'unir-se",
"knockTitle": "Algú vol unir-se a la reunió",
"knockingParticipantList": "Llista de participants que piquen per a entrar",
@@ -665,7 +665,7 @@
"linkToSalesforceDescription": "Podeu enllaçar el resum de la reunió a un objecte Salesforce.",
"linkToSalesforceError": "No s'ha pogut enllaçar la reunió a Salesforce",
"linkToSalesforceKey": "Enllaça aquesta reunió",
"linkToSalesforceProgress": "S'està enllaçant la reunió a Salesforce",
"linkToSalesforceProgress": "S'està enllaçant la reunió a Salesforce...",
"linkToSalesforceSuccess": "La reunió s'ha enllaçat a Salesforce",
"localRecordingStarted": "{{name}} ha iniciat un enregistrament local.",
"localRecordingStopped": "{{name}} ha aturat has stopped a local recording.",
@@ -796,7 +796,7 @@
"callMe": "Truca'm",
"callMeAtNumber": "Truca'm a aquest número:",
"calling": "S'està trucant",
"configuringDevices": "S'estan configurant els aparells",
"configuringDevices": "S'estan configurant els aparells...",
"connectedWithAudioQ": "Heu connectat amb àudio?",
"connection": {
"good": "La vostra connexió a internet sembla bona!",
@@ -850,17 +850,17 @@
},
"presenceStatus": {
"busy": "Ocupat",
"calling": "S'està trucant",
"calling": "S'està trucant...",
"connected": "Connectat",
"connecting": "Està connectant",
"connecting2": "Està connectant*",
"connecting": "Està connectant...",
"connecting2": "Està connectant*...",
"disconnected": "Desconnectat",
"expired": "Ha expirat",
"ignored": "Ignorat",
"initializingCall": "S'està inicialitzant la trucada",
"initializingCall": "S'està inicialitzant la trucada...",
"invited": "Convidat",
"rejected": "Rebutjat",
"ringing": "Està sonat"
"ringing": "Està sonat..."
},
"privacyView": {
"title": "Privadesa"
@@ -897,7 +897,7 @@
"errorFetchingLink": "S'ha produït un error en obtenir l'enllaç de l'enregistrament.",
"expandedOff": "S'ha aturat l'enregistrament",
"expandedOn": "S'està enregistrant la reunió.",
"expandedPending": "S'ha iniciat l'enregistrament",
"expandedPending": "S'ha iniciat l'enregistrament...",
"failedToStart": "No s'ha pogut iniciar l'enregistrament",
"fileSharingdescription": "Compartiu l'enllaç de l'enregistrament de la reunió amb els participants",
"highlight": "Destaca",
@@ -924,7 +924,7 @@
"on": "L'enregistrament ha començat",
"onBy": "{{name}} ha iniciat l'enregistrament",
"onlyRecordSelf": "Enregistra només el meu àudio i vídeo",
"pending": "S'està preparant per a enregistrar la reunió",
"pending": "S'està preparant per a enregistrar la reunió...",
"rec": "ENREG",
"saveLocalRecording": "Desa el fitxer de l'enregistrament en local (beta)",
"serviceDescription": "El servei d'enregistrament desarà el vostre enregistrament",
@@ -1227,7 +1227,7 @@
"failedToStart": "No s'ha pogut iniciar la transcripció",
"labelToolTip": "La reunió s'està transcrivint",
"off": "La transcripció s'ha aturat",
"pending": "S'està preparant per a enregistrar la reunió",
"pending": "S'està preparant per a enregistrar la reunió...",
"sourceLanguageDesc": "La llengua actual de la reunió és <b>{{sourceLanguage}}</b>. <br/> Podeu canviar-la",
"sourceLanguageHere": "aquí",
"start": "Activa els subtítols",
@@ -1237,7 +1237,16 @@
"tr": "TR"
},
"userMedia": {
"grantPermissions": "Concediu permisos per a usar la càmera i el micròfon."
"androidGrantPermissions": "Seleccioneu <b><i>Permet</i></b> si el navegador us sol·licita permisos.",
"chromeGrantPermissions": "Seleccioneu <b><i>Permet</i></b> si el navegador us sol·licita permisos.",
"edgeGrantPermissions": "Seleccioneu <b><i>Sí</i></b> si el navegador us sol·licita permisos.",
"electronGrantPermissions": "S'està intentant accedir a la vostra càmera i micròfon",
"firefoxGrantPermissions": "Seleccioneu <b><i>Comparteix l'aparell seleccionat</i></b> si el navegador us sol·licita permisos.",
"iexplorerGrantPermissions": "Seleccioneu <b><i>D'acord</i></b> si el navegador us sol·licita permisos.",
"nwjsGrantPermissions": "Concediu permisos per a usar la càmera i el micròfon",
"operaGrantPermissions": "Seleccioneu <b><i>Permet</i></b> si el navegador us sol·licita permisos.",
"react-nativeGrantPermissions": "Seleccioneu <b><i>Permet</i></b> si el navegador us sol·licita permisos.",
"safariGrantPermissions": "Seleccioneu <b><i>D'acord</i></b> si el navegador us sol·licita permisos."
},
"videoSIPGW": {
"busy": "Treballem per a alliberar recursos. Torneu-ho a intentar en uns minuts.",
@@ -1307,7 +1316,7 @@
"image6": "Bosc",
"image7": "Sortida de sol",
"none": "Cap",
"pleaseWait": "Espereu",
"pleaseWait": "Espereu...",
"removeBackground": "Elimina el fons",
"slightBlur": "Desenfocament lleu",
"title": "Fons virtuals",

File diff suppressed because it is too large Load Diff

View File

@@ -83,7 +83,7 @@
"GET_SESSION_ID_ERROR": "Hent session-id fejl: {{code}}",
"GOT_SESSION_ID": "Henter session-ID… Udført",
"LOW_BANDWIDTH": "Video for {{displayName}} er slået fra for at spare båndbredde",
"RECONNECTING": "Et netværksproblem opstod. Forbinder igen"
"RECONNECTING": "Et netværksproblem opstod. Forbinder igen..."
},
"connectionindicator": {
"address": "Adresse:",
@@ -458,7 +458,7 @@
"somebody": "Nogen",
"startSilentDescription": "",
"startSilentTitle": "",
"suboptimalExperienceDescription": "Hmmm vi er bange for at din oplevelse med {{appName}} ikke vil være optimal. Vi arbejder på at forbedre dette, men indtil da forsøg venligst at bruge en af følgende <a href='{{recommendedBrowserPageLink}}' target='_blank'>fuldt understøttede internet browsere</a>.",
"suboptimalExperienceDescription": "Hmmm... vi er bange for at din oplevelse med {{appName}} ikke vil være optimal. Vi arbejder på at forbedre dette, men indtil da forsøg venligst at bruge en af følgende <a href='{{recommendedBrowserPageLink}}' target='_blank'>fuldt understøttede internet browsere</a>.",
"suboptimalExperienceTitle": "Browser-advarsel",
"unmute": ""
},
@@ -475,7 +475,7 @@
"calling": "Ringer op…",
"connected": "Forbundet",
"connecting": "Forbinder…",
"connecting2": "Forbinder*",
"connecting2": "Forbinder*...",
"disconnected": "Forbindelse afbrudt",
"expired": "Udløbet",
"ignored": "Ignoreret",
@@ -697,7 +697,16 @@
"tr": "TR"
},
"userMedia": {
"grantPermissions": "Giv tilladelse til at dit kamera og din mikrofon benyttes."
"androidGrantPermissions": "Vælg <b><i> Tillad</i> </b>, når din browser beder om tilladelser",
"chromeGrantPermissions": "Vælg <b><i> Tillad</i> </b>, når din browser beder om tilladelser",
"edgeGrantPermissions": "Vælg <b><i>Ja</i> </b>, når din browser beder om tilladelser",
"electronGrantPermissions": "Giv tilladelse til at dit kamera og din mikrofon benyttes",
"firefoxGrantPermissions": "Vælg <b> <i> Del valgt enhed </i> </b>, når din browser beder om tilladelser",
"iexplorerGrantPermissions": "Vælg <b><i>OK</i> </b>, når din browser beder om tilladelser",
"nwjsGrantPermissions": "Giv tilladelse til at dit kamera og din mikrofon benyttes",
"operaGrantPermissions": "Vælg <b><i> Tillad</i> </b>, når din browser beder om tilladelser",
"react-nativeGrantPermissions": "Vælg <b><i> Tillad</i> </b>, når din browser beder om tilladelser",
"safariGrantPermissions": "Vælg <b><i>OK</i> </b>, når din browser beder om tilladelser"
},
"videoSIPGW": {
"busy": "Vi arbejder på at frigøre ressourcer. Prøv igen om et par minutter",

View File

@@ -16,13 +16,13 @@
"failedToAdd": "Fehler beim Hinzufügen von Personen",
"googleEmail": "Google-E-Mail",
"inviteMoreHeader": "Sie sind alleine in der Sitzung",
"inviteMoreMailSubject": "An {{appName}} Konferenz teilnehmen",
"inviteMoreMailSubject": "An {{appName}} Meeting teilnehmen",
"inviteMorePrompt": "Mehr Leute einladen",
"linkCopied": "Link in die Zwischenablage kopiert",
"noResults": "Keine passenden Ergebnisse",
"outlookEmail": "Outlook-E-Mail",
"phoneNumbers": "Telefonnummern",
"searching": "Suche",
"searching": "Suche...",
"shareInvite": "Einladung zur Versammlung teilen",
"shareLink": "Teilen Sie den Konferenzlink, um andere einzuladen",
"shareStream": "Den Livestreaminglink freigeben",
@@ -89,10 +89,10 @@
"notSignedIn": "Ein Fehler ist während der Authentifizierung zur Anzeige von Kalenderterminen aufgetreten. Prüfen Sie Ihre Kalendereinstellungen oder versuchen Sie, sich erneut anzumelden."
},
"join": "Teilnehmen",
"joinTooltip": "Am Konferenz teilnehmen",
"joinTooltip": "Am Meeting teilnehmen",
"nextMeeting": "Nächste Konferenz",
"noEvents": "Es gibt keine bevorstehenden Termine.",
"ongoingMeeting": "Laufende Konferenz",
"ongoingMeeting": "Laufendes Meeting",
"permissionButton": "Einstellungen öffnen",
"permissionMessage": "Die App benötigt Zugriff auf den Kalender, um Termine und Konferenzen anzuzeigen.",
"refresh": "Kalender aktualisieren",
@@ -145,7 +145,7 @@
"installExtensionText": "Installieren Sie die Erweiterung für die Integration von Google Calendar und Office 365"
},
"connectingOverlay": {
"joiningRoom": "Eine Verbindung zu Ihrer Konferenz wird hergestellt…"
"joiningRoom": "Eine Verbindung zu Ihrem Meeting wird hergestellt…"
},
"connection": {
"ATTACHED": "Angehängt",
@@ -215,7 +215,7 @@
"downloadMobileApp": "Aus dem App Store herunterladen",
"ifDoNotHaveApp": "Wenn Sie die App noch nicht haben:",
"ifHaveApp": "Wenn Sie die App bereits haben:",
"joinInApp": "Mit der App an der Konferenz teilnehmen",
"joinInApp": "Mit der App am Meeting teilnehmen",
"joinInAppNew": "Mit der App",
"joinInBrowser": "Im Browser",
"launchMeetingLabel": "Wie möchten Sie an der Konferenz teilnehmen?",
@@ -225,7 +225,7 @@
"or": "oder",
"termsAndConditions": "Indem Sie fortfahren, stimmen Sie unseren <a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>Nutzungsbedingungen</a> zu.",
"title": "Die Konferenz wird in {{app}} geöffnet …",
"titleNew": "Konferenz starten",
"titleNew": "Konferenz starten ...",
"tryAgainButton": "Erneut versuchen",
"unsupportedBrowser": "Sie verwenden einen Browser, der noch nicht unterstützt wird."
},
@@ -258,7 +258,7 @@
"dialog": {
"Back": "Zurück",
"Cancel": "Abbrechen",
"IamHost": "Ich leite die Konferenz",
"IamHost": "Ich leite das Meeting",
"Ok": "OK",
"Remove": "Entfernen",
"Share": "Teilen",
@@ -317,7 +317,7 @@
"e2eeLabel": "Ende-zu-Ende-Verschlüsselung aktivieren",
"e2eeWarning": "WARNUNG: Nicht alle Personen dieser Konferenz scheinen Ende-zu-Ende-Verschlüsselung zu unterstützen. Wenn Sie diese aktivieren, können die entsprechenden Personen nichts mehr sehen oder hören.",
"e2eeWillDisableDueToMaxModeDescription": "WARNUNG: Ende-zu-Ende-Verschlüsselung wird automatisch deaktiviert, wenn weitere Anwesende an der Konferenz teilnehmen.",
"embedMeeting": "Konferenz einbetten",
"embedMeeting": "Besprechung einbetten",
"enterDisplayName": "Bitte geben Sie hier Ihren Namen ein",
"error": "Fehler",
"errorRoomCreationRestriction": "Sie haben versucht, zu schnell beizutreten, bitte versuchen Sie es gleich noch einmal.",
@@ -334,8 +334,7 @@
"kickParticipantButton": "Entfernen",
"kickParticipantDialog": "Wollen Sie diese Person wirklich entfernen?",
"kickParticipantTitle": "Person entfernen?",
"kickSystemTitle": "Autsch! Sie wurden aus der Konferenz geworfen",
"kickTitle": "Autsch! {{participantDisplayName}} hat Sie aus der Konferenz geworfen",
"kickTitle": "Autsch! {{participantDisplayName}} hat Sie aus dem Meeting geworfen",
"linkMeeting": "Konferenz verlinken",
"linkMeetingTitle": "Konferenz mit Salesforce verlinken",
"liveStreaming": "Livestreaming",
@@ -382,7 +381,7 @@
"muteParticipantsVideoTitle": "Die Kamera von dieser Person ausschalten?",
"noDropboxToken": "Kein gültiges Dropbox-Token",
"password": "Passwort",
"passwordLabel": "Diese Konferenz wurde gesichert. Bitte geben Sie das $t(lockRoomPasswordUppercase) ein, um der Konferenz beizutreten.",
"passwordLabel": "Dieses Meeting wurde gesichert. Bitte geben Sie das $t(lockRoomPasswordUppercase) ein, um dem Meeting beizutreten.",
"passwordNotSupported": "Das Festlegen eines Konferenzpassworts wird nicht unterstützt.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) nicht unterstützt",
"passwordRequired": "$t(lockRoomPasswordUppercase) erforderlich",
@@ -440,10 +439,7 @@
"shareScreenWarningD2": "müssen Sie Ihre Audiofreigabe stoppen und dann die Bildschirmfreigabe mit der Option \"Audio freigeben\" starten.",
"shareScreenWarningH1": "Wenn Sie Ihren Bildschirm freigeben wollen:",
"shareScreenWarningTitle": "Sie müssen die Audiofreigabe beenden, bevor Sie den Bildschirm freigeben können",
"shareVideoConfirmPlay": "Sie öffnen dazu eine externe Seite. Möchten Sie fortfahren?",
"shareVideoConfirmPlayTitle": "{{name}} hat mit Ihnen ein Video geteilt.",
"shareVideoLinkError": "Bitte einen gültigen Link angeben.",
"shareVideoLinkStopped": "Das Video von {{name}} wurde gestoppt.",
"shareVideoTitle": "Video teilen",
"shareYourScreen": "Bildschirmfreigabe ein-/ausschalten",
"shareYourScreenDisabled": "Bildschirmfreigabe deaktiviert.",
@@ -556,13 +552,13 @@
"invitePhone": "Wenn Sie stattdessen per Telefon beitreten möchten, wählen sie: {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "Suchen Sie nach einer anderen Einwahlnummer ?\nEinwahlnummern der Konferenz anzeigen: {{url}}\n\n\nWenn Sie sich auch über ein Raumtelefon einwählen, nehmen Sie teil, ohne sich mit dem Ton zu verbinden: {{silentUrl}}",
"inviteSipEndpoint": "Um mit SIP teilzunehmen, folgende Adresse nutzen: {{sipUri}}",
"inviteTextiOSInviteUrl": "An Konferenz teilnehmen: {{inviteUrl}}.",
"inviteTextiOSInviteUrl": "Am Meeting teilnehmen: {{inviteUrl}}.",
"inviteTextiOSJoinSilent": "Wenn Sie über ein Konferenztelefon teilnehmen, können Sie diesen Link nutzen um ohne Ton an der Konferenz teilzunehmen: {{silentUrl}}.",
"inviteTextiOSPersonal": "{{name}} lädt Sie zu einer Konferenz ein.",
"inviteTextiOSPersonal": "{{name}} lädt Sie zu einem Meeting ein.",
"inviteTextiOSPhone": "Nutzen Sie folgende Nummer um via Telefon teilzunehmen: {{number}},,{{conferenceID}}#. Wenn Sie nach einer anderen Einwahlnummer suchen, finden Sie die vollständige Liste hier: {{didUrl}}.",
"inviteURLFirstPartGeneral": "Sie wurden zur Teilnahme an einer Konferenz eingeladen.",
"inviteURLFirstPartPersonal": "{{name}} lädt Sie zu einer Konferenz ein.\n",
"inviteURLSecondPart": "\nAm Konferenz teilnehmen:\n{{url}}\n",
"inviteURLFirstPartGeneral": "Sie wurden zur Teilnahme an einem Meeting eingeladen.",
"inviteURLFirstPartPersonal": "{{name}} lädt Sie zu einem Meeting ein.\n",
"inviteURLSecondPart": "\nAm Meeting teilnehmen:\n{{url}}\n",
"label": "Einwahlinformationen",
"liveStreamURL": "Livestream:",
"moreNumbers": "Weitere Telefonnummern",
@@ -576,7 +572,7 @@
"sip": "SIP-Adresse",
"sipAudioOnly": "SIP-Adresse (nur Ton)",
"title": "Teilen",
"tooltip": "Freigabe-Link und Einwahlinformationen für diese Konferenz",
"tooltip": "Freigabe-Link und Einwahlinformationen für dieses Meeting",
"upgradeOptions": "Bitte prüfen Sie Ihre Upgrade-Optionen auf",
"whiteboardError": "Whiteboard konnte nicht geladen werden. Bitte versuchen Sie es später erneut."
},
@@ -628,7 +624,7 @@
"errorAPI": "Beim Abrufen der YouTube-Livestreams ist ein Fehler aufgetreten. Bitte versuchen Sie, sich erneut anzumelden.",
"errorLiveStreamNotEnabled": "Livestreaming ist für {{email}} nicht aktiviert. Aktivieren Sie das Livestreaming oder melden Sie sich bei einem Konto mit aktiviertem Livestreaming an.",
"expandedOff": "Livestream wurde angehalten",
"expandedOn": "Die Konferenz wird momentan an YouTube gestreamt.",
"expandedOn": "Das Meeting wird momentan an YouTube gestreamt.",
"expandedPending": "Livestream wird gestartet …",
"failedToStart": "Livestream konnte nicht gestartet werden",
"getStreamKeyManually": "Wir waren nicht in der Lage, Livestreams abzurufen. Versuchen Sie, Ihren Livestream-Schlüssel von YouTube zu erhalten.",
@@ -732,17 +728,14 @@
"me": "ich",
"notify": {
"OldElectronAPPTitle": "Sicherheitslücke!",
"allowAudio": "Mikrofon einschalten",
"allowBoth": "Beides",
"allowVideo": "Kamera einschalten",
"allowAction": "Erlauben",
"allowedUnmute": "Sie können die Stummschaltung aufheben, Ihre Kamera einschalten oder Ihren Bildschirm teilen.",
"audioUnmuteBlockedDescription": "Díe Stummschaltung kann aus Überlastungsschutzgründen temporär nicht aufgehoben werden.",
"audioUnmuteBlockedTitle": "Stummschaltung kann nicht aufgehoben werden!",
"chatMessages": "Chatnachrichten",
"connectedOneMember": "{{name}} nimmt an der Konferenz teil",
"connectedThreePlusMembers": "{{name}} und {{count}} andere Personen nehmen an der Konferenz teil",
"connectedTwoMembers": "{{first}} und {{second}} nehmen an der Konferenz teil",
"connectionFailed": "Verbindung fehlgeschlagen. Bitte versuchen Sie es später noch einmal.",
"connectedOneMember": "{{name}} nimmt am Meeting teil",
"connectedThreePlusMembers": "{{name}} und {{count}} andere Personen nehmen am Meeting teil",
"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.",
"dataChannelClosedDescriptionWithAudio": "Die Steuerungsverbindung (Bridge Channel) wurde unterbrochen, daher können Video- und Tonprobleme auftreten.",
@@ -757,9 +750,6 @@
"gifsMenu": "GIPHY",
"groupTitle": "Benachrichtigungen",
"hostAskedUnmute": "Die Moderation bittet Sie, das Mikrofon zu aktivieren",
"invalidTenant": "Ungültiger Tenant",
"invalidTenantHyphenDescription": "Der von Ihnen genutzte Tenantname ist unfültig (beginnt oder endet mit '-').",
"invalidTenantLengthDescription": "Der von Ihnen genutzte Tenantname ist zu lang.",
"invitedOneMember": "{{name}} wurde eingeladen",
"invitedThreePlusMembers": "{{name}} und {{count}} andere wurden eingeladen",
"invitedTwoMembers": "{{first}} und {{second}} wurden eingeladen",
@@ -772,7 +762,7 @@
"linkToSalesforceDescription": "Sie können die Zusammenfassung der Konferenz mit einem Objekt bei Salesforce verlinken.",
"linkToSalesforceError": "Konferenz konnte nicht mit Salesforce verlinkt werden",
"linkToSalesforceKey": "Konferenz verlinken",
"linkToSalesforceProgress": "Konferenz wird mit Salesforce verlinkt",
"linkToSalesforceProgress": "Konferenz wird mit Salesforce verlinkt...",
"linkToSalesforceSuccess": "Die Konferenz wurde mit Salesforce verlinkt",
"localRecordingStarted": "{{name}} hat eine lokale Aufzeichnung gestartet.",
"localRecordingStopped": "{{name}} hat eine lokale Aufzeichnung gestoppt.",
@@ -790,13 +780,12 @@
"moderationToggleDescription": "von {{participantDisplayName}}",
"moderator": "Moderationsrechte vergeben!",
"muted": "Der Konferenz wurde stumm beigetreten.",
"mutedRemotelyDescription": "Sie können jederzeit die Stummschaltung aufheben, wenn Sie bereit sind zu sprechen. Wenn Sie fertig sind, können Sie sich wieder stummschalten, um Geräusche von der Konferenz fernzuhalten.",
"mutedRemotelyDescription": "Sie können jederzeit die Stummschaltung aufheben, wenn Sie bereit sind zu sprechen. Wenn Sie fertig sind, können Sie sich wieder stummschalten, um Geräusche vom Meeting fernzuhalten.",
"mutedRemotelyTitle": "Sie wurden von {{participantDisplayName}} stummgeschaltet!",
"mutedTitle": "Stummschaltung aktiv!",
"newDeviceAction": "Verwenden",
"newDeviceAudioTitle": "Neues Audiogerät erkannt",
"newDeviceCameraTitle": "Neue Kamera erkannt",
"nextToSpeak": "Sie sind als Nächstes an der Reihe zu sprechen",
"noiseSuppressionDesktopAudioDescription": "Die Rauschunterdrückung kann nicht genutzt werden, wenn der Computersound geteilt wird, bitte zuerst deaktivieren und dann nochmals versuchen.",
"noiseSuppressionFailedTitle": "Rauschunterdrückung konnte nicht gestartet werden",
"noiseSuppressionStereoDescription": "Rauschunterdrückung unterstützt aktuell keinen Stereoton.",
@@ -818,7 +807,7 @@
"screenSharingAudioOnlyTitle": "Modus \"Beste Leistung\"",
"selfViewTitle": "Sie können die eigene Ansicht immer in den Einstellungen reaktivieren",
"somebody": "Jemand",
"startSilentDescription": "Treten Sie der Konferenz noch einmal bei, um Ihr Audio zu aktivieren",
"startSilentDescription": "Treten Sie dem Meeting noch einmal bei, um Ihr Audio zu aktivieren",
"startSilentTitle": "Sie sind ohne Audioausgabe beigetreten!",
"suboptimalBrowserWarning": "Tut uns leid, aber die Konferenz wird mit {{appName}} kein großartiges Erlebnis. Wir versuchen immer die Situation zu verbessern, bis dahin empfehlen wir aber die Verwendung einer der <a href=\"{{recommendedBrowserPageLink}}\" target=\"_blank\">vollständig unterstützen Browser</a>.",
"suboptimalExperienceTitle": "Browserwarnung",
@@ -826,17 +815,13 @@
"suggestRecordingDescription": "Möchten Sie eine Aufzeichnung starten?",
"suggestRecordingTitle": "Konferenz aufzeichnen",
"unmute": "Stummschaltung aufheben",
"unmuteVideo": "Kamera einschalten",
"videoMutedRemotelyDescription": "Sie können sie jederzeit wieder einschalten.",
"videoMutedRemotelyTitle": "Ihre Kamera wurde von {{participantDisplayName}} ausgeschaltet!",
"videoUnmuteBlockedDescription": "Die Kamera und Bildschirmfreigabe kann aus Überlastungsschutzgründen temporär nicht eingeschaltet werden.",
"videoUnmuteBlockedTitle": "Kamera und Bildschirmfreigabe kann nicht aktiviert werden!",
"viewLobby": "Lobby ansehen",
"viewParticipants": "Personen anzeigen",
"viewVisitors": "Gäste anzeigen",
"waitingParticipants": "{{waitingParticipants}} Personen",
"waitingVisitors": "In der Lobby wartende Gäste: {{waitingVisitors}}",
"waitingVisitorsTitle": "Die Konferenz wurde noch nicht gestartet!",
"whiteboardLimitDescription": "Bitte speichern Sie Ihre Inhalte, da das Nutzungslimit bald erreicht wird und dann Ihr Whiteboard geschlossen wird.",
"whiteboardLimitTitle": "Whiteboard-Nutzung"
},
@@ -850,10 +835,7 @@
"audioModeration": "Für sich selbst die Stummschaltung aufzuheben",
"blockEveryoneMicCamera": "Kamera und Mikrofon von allen sperren",
"breakoutRooms": "Breakout-Räume",
"goLive": "Live gehen",
"invite": "Person einladen",
"lowerAllHands": "Alle Hände senken",
"lowerHand": "Hand senken",
"moreModerationActions": "Weitere Moderationsoptionen",
"moreModerationControls": "Weitere Moderationsoptionen",
"moreParticipantOptions": "Mehr Optionen für Anwesende",
@@ -870,7 +852,6 @@
"headings": {
"lobby": "Lobby ({{count}})",
"participantsList": "Anwesende ({{count}})",
"visitorInQueue": " (Wartende Gäste {{count}})",
"visitorRequests": " (Anfragen {{count}})",
"visitors": "Gäste ({{count}})",
"waitingLobby": "In der Lobby ({{count}})"
@@ -884,13 +865,10 @@
"pinnedParticipant": "Die Person ist angeheftet",
"polls": {
"answer": {
"edit": "Bearbeiten",
"send": "Senden",
"skip": "Überspringen",
"submit": "Speichern"
},
"by": "Von {{ name }}",
"closeButton": "Umfrage schließen",
"create": {
"addOption": "Antwort hinzufügen",
"answerPlaceholder": "Antwort {{index}}",
@@ -900,8 +878,7 @@
"pollQuestion": "Frage",
"questionPlaceholder": "Eine Frage stellen",
"removeOption": "Antwort entfernen",
"save": "Erstellen",
"send": "Senden"
"send": "Erstellen"
},
"errors": {
"notUniqueOption": "Optionen müssen einzigartig sein"
@@ -930,11 +907,9 @@
"configuringDevices": "Geräte werden eingerichtet …",
"connectedWithAudioQ": "Sie sind mit Audio verbunden?",
"connection": {
"failed": "Verbindungstest fehlgeschlagen!",
"good": "Ihre Internetverbindung sieht gut aus!",
"nonOptimal": "Ihre Internetverbindung ist nicht optimal.",
"poor": "Sie haben eine schlechte Internetverbindung.",
"running": "Verbindung wird getestet…"
"poor": "Sie haben eine schlechte Internetverbindung."
},
"connectionDetails": {
"audioClipping": "Ihr Ton wird wahrscheinlich abgehackt sein.",
@@ -943,7 +918,6 @@
"goodQuality": "Großartig! Ihre Bild- und Tonqualität sollte super sein.",
"noMediaConnectivity": "Es konnte für diesen Test keine Medienverbindung hergestellt werden. Das wird gewöhnlich durch eine Firewall oder ein NAT ausgelöst.",
"noVideo": "Ihr Bild wird wahrscheinlich eine schlechte Qualität haben.",
"testFailed": "Der Verbindungstest ist fehlgeschlagen, dies beeinträchtigt evtl. Ihre Qualität.",
"undetectable": "Wenn Sie mit Ihrem Browser weiterhin Probleme in Konferenzen haben, sollten Sie die Verbindung und Funktion Ihrer Lautsprecher, Ihres Mikrofons und Ihrer Kamera überprüfen. Stellen Sie außerdem sicher, dass Ihr Browser die erforderlichen Rechte hat, auf das Mikrofon und die Kamera zuzugreifen, und dass Sie die neuste Browserversion installiert haben. Sollten Sie immer noch Probleme haben, kontaktieren Sie bitte den Support der Webanwendung.",
"veryPoorConnection": "Ihre Konferenzqualität wird wahrscheinlich sehr schlecht sein.",
"videoFreezing": "Ihr Bild wird wahrscheinlich einfrieren, schwarz werden und eine geringe Auflösung haben.",
@@ -1030,7 +1004,7 @@
"error": "Die Aufzeichnung ist fehlgeschlagen. Bitte versuchen Sie es erneut.",
"errorFetchingLink": "Der Link zur Aufzeichnung konnte nicht geladen werden.",
"expandedOff": "Aufzeichnung wurde gestoppt",
"expandedOn": "Die Konferenz wird momentan aufgezeichnet.",
"expandedOn": "Das Meeting wird momentan aufgezeichnet.",
"expandedPending": "Aufzeichnung wird gestartet…",
"failedToStart": "Die Aufnahme konnte nicht gestartet werden",
"fileSharingdescription": "Aufzeichnung mit den Personen der Konferenz teilen",
@@ -1038,7 +1012,7 @@
"highlightMoment": "Moment als Highlight festhalten",
"highlightMomentDisabled": "Sie können Momente als Highlights festhalten, sobald die Aufnahme startet",
"highlightMomentSuccess": "Highlight festgehalten",
"highlightMomentSucessDescription": "Ihr festgehaltener Moment wird zur Zusammenfassung der Konferenz hinzugefügt.",
"highlightMomentSucessDescription": "Ihr festgehaltener Moment wird zur Zusammenfassung des Meeting hinzugefügt.",
"inProgress": "Aufzeichnung gestartet",
"limitNotificationDescriptionNative": "Wegen hoher Nachfrage ist Ihre Aufnahme auf {{limit}} Min. begrenzt. Für unlimitierte Aufnahmen nutzen Sie bitte <3>{{app}}</3>.",
"limitNotificationDescriptionWeb": "Wegen hoher Nachfrage ist Ihre Aufnahme auf {{limit}} Min. begrenzt. Für unlimitierte Aufnahmen nutzen Sie bitte <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
@@ -1058,8 +1032,7 @@
"on": "Aufnahme",
"onBy": "{{name}} startete die Aufnahme",
"onlyRecordSelf": "Nur eigenes Kamerabild und Ton aufzeichnen",
"pending": "Aufzeichnung der Konferenz wird vorbereitet…",
"policyError": "Sie haben die Aufzeichnung zu früh gestartet. Bitte versuchen Sie es später noch einmal.",
"pending": "Aufzeichnung des Meetings wird vorbereitet…",
"recordAudioAndVideo": "Kamera und Ton aufzeichnen",
"recordTranscription": "Transkription aufzeichnen",
"saveLocalRecording": "Aufzeichnung lokal abspeichern",
@@ -1108,7 +1081,6 @@
"desktopShareWarning": "Sie müssen die Bildschirmfreigabe neustarten, damit die Einstellung übernommen wird.",
"devices": "Geräte",
"followMe": "Follow-me für alle Personen",
"followMeRecorder": "Aufnahme folgt mir",
"framesPerSecond": "FPS",
"incomingMessage": "Eingehende Nachricht",
"language": "Sprache",
@@ -1174,8 +1146,8 @@
"version": "Version"
},
"share": {
"dialInfoText": "\n\n=====\n\nWollen Sie sich nur auf Ihrem Telefon einwählen?\n\n{{defaultDialInNumber}}Klicken Sie auf diesen Link, um die eingewählten Telefonnummern für diese Konferenz zu sehen\n{{dialInfoPageUrl}}",
"mainText": "Klicken Sie auf den folgenden Link, um der Konferenz beizutreten:\n{{roomUrl}}"
"dialInfoText": "\n\n=====\n\nWollen Sie sich nur auf Ihrem Telefon einwählen?\n\n{{defaultDialInNumber}}Klicken Sie auf diesen Link, um die eingewählten Telefonnummern für dieses Meeting zu sehen\n{{dialInfoPageUrl}}",
"mainText": "Klicken Sie auf den folgenden Link, um dem Meeting beizutreten:\n{{roomUrl}}"
},
"speaker": "Sprecher/-in",
"speakerStats": {
@@ -1255,7 +1227,6 @@
"lobbyButton": "Lobbymodus ein-/ausschalten",
"localRecording": "Lokale Aufzeichnungssteuerelemente ein-/ausschalten",
"lockRoom": "Konferenzpasswort ein-/ausschalten",
"love": "Herz",
"lowerHand": "Hand senken",
"moreActions": "Menü „Weitere Einstellungen“ ein-/ausschalten",
"moreActionsMenu": "Menü „Weitere Einstellungen“",
@@ -1273,7 +1244,6 @@
"privateMessage": "Private Nachricht senden",
"profile": "Profil bearbeiten",
"raiseHand": "Hand heben",
"react": "Chat-Interaktionen",
"reactions": "Interaktionen",
"reactionsMenu": "Interaktionsmenü öffnen / schließen",
"recording": "Aufzeichnung ein-/ausschalten",
@@ -1345,7 +1315,6 @@
"lobbyButtonEnable": "Lobbymodus aktivieren",
"login": "Anmelden",
"logout": "Abmelden",
"love": "Herz",
"lowerYourHand": "Hand senken",
"moreActions": "Weitere Einstellungen",
"moreOptions": "Weitere Optionen",
@@ -1371,7 +1340,6 @@
"raiseYourHand": "Melden",
"reactionBoo": "Buhen senden",
"reactionClap": "Klatschen senden",
"reactionHeart": "Herz senden",
"reactionLaugh": "Lachen senden",
"reactionLike": "Daumen hoch senden",
"reactionSilence": "Stille senden",
@@ -1397,7 +1365,7 @@
"tileViewToggle": "Kachelansicht ein-/ausschalten",
"toggleCamera": "Kamera wechseln",
"unmute": "Stummschaltung aufheben",
"videoSettings": "Kamera-Einstellungen",
"videoSettings": "Kameraeinstellungen",
"videomute": "Kamera stoppen",
"videomuteGUMPending": "Verbinde Ihre Kamera",
"videounmute": "Kamera einschalten"
@@ -1405,8 +1373,8 @@
"transcribing": {
"ccButtonTooltip": "Untertitel ein-/ausschalten",
"expandedLabel": "Transkribieren ist derzeit eingeschaltet",
"failed": "Transkribieren fehlgeschlagen",
"labelToolTip": "Die Konferenz wird transkribiert",
"failedToStart": "Transkribieren konnte nicht gestartet werden",
"labelToolTip": "Das Meeting wird transkribiert",
"sourceLanguageDesc": "Aktuell ist die Sprache der Konferenz auf <b>{{sourceLanguage}}</b> eingestellt. <br/> Sie könne dies hier ",
"sourceLanguageHere": "ändern",
"start": "Anzeige der Untertitel starten",
@@ -1417,7 +1385,16 @@
},
"unpinParticipant": "{{participantName}} - Nicht mehr anheften",
"userMedia": {
"grantPermissions": "Bitte Berechtigungen zur Verwendung der Kamera und des Mikrofons erteilen."
"androidGrantPermissions": "Wählen Sie <b><i>Zulassen</i></b>, wenn der Browser um Berechtigungen bittet.",
"chromeGrantPermissions": "Wählen Sie <b><i>Zulassen</i></b>, wenn der Browser um Berechtigungen bittet.",
"edgeGrantPermissions": "Wählen Sie <b><i>Ja</i></b>, wenn der Browser um Berechtigungen bittet.",
"electronGrantPermissions": "Bitte Berechtigungen zur Verwendung der Kamera und des Mikrofons erteilen",
"firefoxGrantPermissions": "Wählen Sie <b><i>Erlauben</i></b>, wenn der Browser um Berechtigungen bittet.",
"iexplorerGrantPermissions": "Wählen Sie <b><i>OK</i></b>, wenn der Browser um Berechtigungen bittet.",
"nwjsGrantPermissions": "Bitte Berechtigungen zur Verwendung der Kamera und des Mikrofons erteilen",
"operaGrantPermissions": "Wählen Sie <b><i>Zulassen</i></b>, wenn der Browser um Berechtigungen bittet.",
"react-nativeGrantPermissions": "Wählen Sie <b><i>Erlauben</i></b>, wenn der Browser um Berechtigungen bittet.",
"safariGrantPermissions": "Wählen Sie <b><i>OK</i></b>, wenn der Browser um Berechtigungen bittet."
},
"videoSIPGW": {
"busy": "Es stehen keine freien Ressourcen zur Verfügung. Bitte versuchen Sie es später noch einmal.",
@@ -1496,7 +1473,7 @@
"image6": "Wald",
"image7": "Sonnenaufgang",
"none": "keiner",
"pleaseWait": "Bitte warten",
"pleaseWait": "Bitte warten...",
"removeBackground": "Hintergrund entfernen",
"slightBlur": "Hintergrund leicht unscharf",
"title": "Hintergründe",
@@ -1506,22 +1483,16 @@
},
"visitors": {
"chatIndicator": "(Gast)",
"joinMeeting": {
"description": "Sie beobachten derzeit diese Konferenz.",
"raiseHand": "Hand heben",
"title": "Konferenz wird beigetreten",
"wishToSpeak": "Wenn Sie sprechen möchten, heben Sie bitte unten Ihre Hand und warten Sie auf die Zustimmung der Moderation"
},
"labelTooltip": "Anzahl Gäste: {{count}}",
"notification": {
"demoteDescription": "Hierhin verschoben von {{actor}}, bitte melden Sie sich um teilzunehmen",
"description": "Bitte melden Sie sich um teilzunehmen",
"noMainParticipantsDescription": "Eine Person muss die Konferenz starten. Bitte versuchen Sie es gleich noch einmal.",
"noMainParticipantsTitle": "Diese Konferenz wurde noch nicht gestartet.",
"noVisitorLobby": "Sie können nicht teilnehmen, solange die Lobby für diese Konferenz aktiviert ist.",
"notAllowedPromotion": "Eine Person muss Ihre Anfrage erst erlauben.",
"title": "Sie sind Gast in der Konferenz"
},
"waitingMessage": "Sie werden der Konferenz beitreten, sobald sie gestartet ist!"
}
},
"volumeSlider": "Lautstärkeregler",
"welcomepage": {
@@ -1537,15 +1508,15 @@
},
"calendar": "Kalender",
"connectCalendarButton": "Kalender verbinden",
"connectCalendarText": "Verbinden Sie Ihren Kalender, um all Ihre Konferenzen in {{app}} anzuzeigen. Fügen Sie zudem {{provider}}-Konferenzen in Ihren Kalender ein und starten Sie sie mit nur einem Klick.",
"enterRoomTitle": "Neue Konferenz starten",
"connectCalendarText": "Verbinden Sie Ihren Kalender, um all Ihre Meetings in {{app}} anzuzeigen. Fügen Sie zudem {{provider}}-Meetings in Ihren Kalender ein und starten Sie sie mit nur einem Klick.",
"enterRoomTitle": "Neues Meeting starten",
"getHelp": "Hilfe",
"go": "Los",
"goSmall": "Los",
"headerSubtitle": "Sichere und hochqualitative Konferenzen",
"headerSubtitle": "Sichere und hochqualitative Meetings",
"headerTitle": "Jitsi Meet",
"info": "Einwahlinformationen",
"jitsiOnMobile": "Jitsi unterwegs einfach unsere Apps herunterladen und Konferenzen von überall starten",
"jitsiOnMobile": "Jitsi unterwegs einfach unsere Apps herunterladen und Meetings von überall starten",
"join": "ERSTELLEN / BEITRETEN",
"logo": {
"calendar": "Kalender Logo",
@@ -1571,7 +1542,7 @@
"roomnameHint": "Name oder URL der Konferenz, der Sie beitreten möchten. Sie können einen Namen erfinden, er muss nur den anderen Personen übermittelt werden, damit diese der gleichen Konferenz beitreten.",
"sendFeedback": "Feedback senden",
"settings": "Einstellungen",
"startMeeting": "Konferenz starten",
"startMeeting": "Meeting starten",
"terms": "AGB",
"title": "Sichere, voll funktionale und komplett kostenlose Videokonferenzen",
"upcomingMeetings": "Ihre zukünftigen Konferenzen"

View File

@@ -19,7 +19,7 @@
"noResults": "Žedne se góźece rezulaty pytanja njedajo",
"outlookEmail": "Outlook-e-mail",
"phoneNumbers": "telefonowe numery",
"searching": "Pytanje trajo",
"searching": "Pytanje trajo...",
"shareInvite": "pśepšosenje na zgromaźinu spśistupniś",
"shareLink": "Spśistupniśo link za konferencu, aby drugich pśepšosyli.",
"shareStream": "link za livestream spśistupniś",
@@ -666,7 +666,7 @@
"linkToSalesforceDescription": "Wy móžośo wopowěsć wót konference pśez link z objektom pla Saleforce zwězaś.",
"linkToSalesforceError": "Konferenz njejo mógła se ze Saleforce zwězaś.",
"linkToSalesforceKey": "konferencu zalinkowaś",
"linkToSalesforceProgress": "Zwězanje konference ze Salesforce se twari",
"linkToSalesforceProgress": "Zwězanje konference ze Salesforce se twari...",
"linkToSalesforceSuccess": "Konferenca jo se ze Salesforce zwězała.",
"localRecordingStarted": "{{name}} jo lokalne nagrawanje zachopił/-a.",
"localRecordingStopped": "{{name}} jo lokalne nagrawanje dokóńcował/-a.",
@@ -1238,7 +1238,16 @@
"tr": "TR"
},
"userMedia": {
"grantPermissions": "pšawa k wužywanju Wašeje kamery a mikrofona wuźěliś."
"androidGrantPermissions": "Wuzwólśo opciju <b><i>pśiwdaś</i></b>, gaž browser wó pšawa pšosy.",
"chromeGrantPermissions": "Wuzwólśo opciju <b><i>pśiwdaś</i></b>, gaž browser wó pšawa pšosy.",
"edgeGrantPermissions": "Wuzwólśo opciju <b><i>jo</i></b>, gaž browser wó pšawa pšosy.",
"electronGrantPermissions": "pšawa k wužywanju Wašeje kamery a mikrofona wuźěliś",
"firefoxGrantPermissions": "Wuzwólśo opciju <b><i>dowóliś</i></b>, gaž browser wó pšawa pšosy.",
"iexplorerGrantPermissions": "Wuzwólśo opciju <b><i>OK</i></b>, gaž browser wó pšawa pšosy.",
"nwjsGrantPermissions": "pšawa k wužywanju Wašeje kamery a mikrofona wuźěliś",
"operaGrantPermissions": "Wuzwólśo opciju <b><i>pśiwdaś</i></b>, gaž browser wó pšawa pšosy.",
"react-nativeGrantPermissions": "Wuzwólśo opciju <b><i>dowóliś</i></b>, gaž browser wó pšawa pšosy.",
"safariGrantPermissions": "Wuzwólśo opciju <b><i>OK</i></b>, gaž browser wó pšawa pšosy."
},
"videoSIPGW": {
"busy": "Źěłamy na tom, aby resurse se k dispoziciji stajili. Wopytajśo za pór minutow hyšći raz.",
@@ -1310,7 +1319,7 @@
"image6": "góla",
"image7": "górjejhyśe słyńcka",
"none": "žeden motiw",
"pleaseWait": "Cakajśo",
"pleaseWait": "Cakajśo...",
"removeBackground": "slězynu wótpóraś",
"slightBlur": "slězyna pitśku njewótša",
"title": "slězyny",

View File

@@ -19,7 +19,7 @@
"noResults": "Δε βρέθηκαν αποτελέσματα αναζήτησης",
"outlookEmail": "Outlook Email",
"phoneNumbers": "τηλεφωνικοί αριθμοί",
"searching": "Αναζήτηση",
"searching": "Αναζήτηση...",
"shareInvite": "Μοίρασε την πρόσκληση στη συνάντηση",
"shareLink": "Μοίρασε αυτό το σύνδεσμο της συνάντησης για να προσκαλέσεις και άλλα άτομα",
"shareStream": "Διαμοιρασμός του συνδέσμου ζωντανής μετάδοσης",
@@ -122,7 +122,7 @@
"installExtensionText": "Εγκατάσταση της επέκτασης για ενσωμάτωση του Google Calendar και του Office 365"
},
"connectingOverlay": {
"joiningRoom": "Σύνδεση στη σύσκεψη σας"
"joiningRoom": "Σύνδεση στη σύσκεψη σας..."
},
"connection": {
"ATTACHED": "Συνημμένο",
@@ -134,9 +134,9 @@
"DISCONNECTED": "Αποσυνδέθηκε",
"DISCONNECTING": "Γίνεται αποσύνδεση",
"ERROR": "Σφάλμα",
"FETCH_SESSION_ID": "Απόκτηση session-id",
"FETCH_SESSION_ID": "Απόκτηση session-id...",
"GET_SESSION_ID_ERROR": "Λήψη σφάλματος session-id: {{code}}",
"GOT_SESSION_ID": "Απόκτηση session-id Έγινε",
"GOT_SESSION_ID": "Απόκτηση session-id... Έγινε",
"LOW_BANDWIDTH": "Η εικόνα για {{displayName}} απενεργοποιήθηκε για εξοικονόμηση ταχύτητας"
},
"connectionindicator": {
@@ -157,7 +157,7 @@
"maxEnabledResolution": "αποστολή μέγιστης",
"more": "Περισσότερα",
"packetloss": "Απώλειες πακέτων:",
"participant_id": "Id συμμετέχοντα:",
"participant_id": "Id συμμετέχων:",
"quality": {
"good": "Καλή",
"inactive": "Ανενεργό",
@@ -182,7 +182,7 @@
"yesterday": "Χθες"
},
"deepLinking": {
"appNotInstalled": "Χρειάζεστε την εφαρμογή {{app}} για το κινητό σας για συμμετοχή σε αυτή τη σύσκεψη μέσα από το τηλέφωνό σας.",
"appNotInstalled": "Χρειάζεστε την εφαρμογή {{app}} για το κινητό σας για συμμετοχή σε αυτή τη σύσκεψη στο τηλέφωνό σας.",
"description": "Δεν έγινε τίποτα; Έγινε προσπάθεια να ξεκινήσει η σύσκεψη με την εφαρμογή desktop {{app}}. Προσπαθήστε ξανά ή μπείτε από το web το {{app}}.",
"descriptionNew": "Δεν έγινε τίποτα; Έγινε προσπάθεια να ξεκινήσει η σύσκεψη με την εφαρμογή desktop {{app}}. <br /><br /> Προσπαθήστε ξανά ή μπείτε από το web.",
"descriptionWithoutWeb": "Δεν έγινε τίποτα; Έγινε προσπάθεια να ξεκινήσει η σύσκεψη στην εφαρμογή desktop {{app}}.",
@@ -197,8 +197,8 @@
"launchWebButton": "Εκκίνηση στο web",
"noMobileApp": "Δεν έχετε την εφαρμογή;",
"termsAndConditions": "Με το να συνεχίσετε συμφωνείτε με τους <a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>όρους και συνθήκες.</a>",
"title": "Έναρξη της σύσκεψης σας στο {{app}}",
"titleNew": "Δημιουργία της σύσκεψης σας",
"title": "Έναρξη της σύσκεψης σας στο {{app}}...",
"titleNew": "Δημιουργία της σύσκεψης σας...",
"tryAgainButton": "Προσπαθήστε ξανά στο desktop",
"unsupportedBrowser": "Φαίνεται ότι χρησιμοποιείτε ένα browser που δεν υποστηρίζουμε."
},
@@ -236,8 +236,8 @@
"Remove": "Αφαίρεση",
"Share": "Μοιραστείτε",
"Submit": "Υποβολή",
"WaitForHostMsg": "Η σύσκεψη δεν έχει αρχίσει ακόμη. Αν είστε διοργανωτής, τότε παρακαλούμε να ταυτοποιήσετε τον εαυτό σας. Διαφορετικά, παρακαλώ αναμείνετε να συνδεθεί κάποιος διοργανωτής.",
"WaitingForHostTitle": "Αναμονή για διοργανωτή",
"WaitForHostMsg": "Η σύσκεψη δεν έχει αρχίσει ακόμη. Αν είστε διοργανωτής, τότε παρακαλούμε να ταυτοποιήσετε τον εαυτό σας. Διαφορετικά, παρακαλώ αναμένατε να συνδεθεί κάποιος διοργανωτής.",
"WaitingForHostTitle": "Αναμονή για διοργανωτή ...",
"Yes": "Ναι",
"accessibilityLabel": {
"close": "Κλείσιμο",
@@ -261,9 +261,9 @@
"cameraUnknownError": "Αδυναμία χρήσης της κάμερας για κάποιο άγνωστο λόγο.",
"cameraUnsupportedResolutionError": "Η κάμερα σας δεν υποστηρίζει την απαιτούμενη ανάλυση εικόνας.",
"close": "Κλείσιμο",
"conferenceDisconnectMsg": "Παρακαλώ ελέγξτε τη δικτυακή σύνδεση σας. Επανασύνδεση σε {{seconds}} δευτερόλεπτα",
"conferenceDisconnectMsg": "Παρακαλώ ελέγξτε τη δικτυακή σύνδεση σας. Επανασύνδεση σε {{seconds}} δευτερόλεπτα...",
"conferenceDisconnectTitle": "Έχετε αποσυνδεθεί.",
"conferenceReloadMsg": "Προσπαθούμε να το διορθώσουμε. Επανασύνδεση σε {{seconds}} δευτερόλεπτα",
"conferenceReloadMsg": "Προσπαθούμε να το διορθώσουμε. Επανασύνδεση σε {{seconds}} δευτερόλεπτα...",
"conferenceReloadTitle": "Δυστυχώς, κάτι πήγε στραβά.",
"confirm": "Επιβεβαίωση",
"confirmNo": "Όχι",
@@ -296,8 +296,8 @@
"internalErrorTitle": "Εσωτερικό σφάλμα",
"kickMessage": "Μπορείτε να επικοινωνήσετε με το {{participantDisplayName}} για περισσότερες λεπτομέρειες.",
"kickParticipantButton": "Αποβολή",
"kickParticipantDialog": "Σίγουρα θέλετε να αποβάλλετε αυτόν το συμμετέχοντα;",
"kickParticipantTitle": "Αποβολή αυτού του συμμετέχοντα;",
"kickParticipantDialog": "Σίγουρα θέλετε να αποβάλλεται αυτόν το συμμετέχων;",
"kickParticipantTitle": "Αποβολή αυτού του συμμετέχων;",
"kickTitle": "Ωχ! Ο/Η {{participantDisplayName}} σας απέβαλε από τη σύσκεψη",
"linkMeeting": "Σύνδεση σύσκεψης",
"linkMeetingTitle": "Σύνδεση σύσκεψης στο Salesforce",
@@ -318,7 +318,7 @@
"micNotSendingDataTitle": "Το μικρόφωνο είναι σε σίγηση στις ρυθμίσεις του συστήματός σας",
"micPermissionDeniedError": "Δεν έχετε δώσει την άδεια για χρήση του μικροφώνου. Μπορείτε ακόμα να συμμετάσχετε στη σύσκεψη, αλλά οι άλλοι δεν θα μπορούν να σας ακούσουν. Χρησιμοποιήστε το κουμπί της κάμερας στη γραμμή διεύθυνσης για να το διορθώσετε.",
"micTimeoutError": "Αδυναμία εκκίνησης της πηγής ήχου. Λήξη του χρονικού ορίου!",
"micUnknownError": "Αδυναμία χρήσης του μικροφώνου για ένα άγνωστο λόγο.",
"micUnknownError": "Αδυναμία χρήσης του μικρόφωνου για ένα άγνωστο λόγο.",
"moderationAudioLabel": "Επιτρέψτε στους συμμετέχοντες να καταργούν τη σίγηση τους",
"moderationVideoLabel": "Επιτρέψτε στους συμμετέχοντες να ξεκινούν το βίντεο τους",
"muteEveryoneDialog": "Οι συμμετέχοντες μπορούν να καταργούν την σίγηση τους.",
@@ -339,12 +339,12 @@
"muteParticipantsVideoBody": "Δε θα μπορείτε εσείς να ενεργοποιήσετε ξανά τη κάμερα, αλλά αυτοί θα μπορούν οποιαδήποτε στιγμή.",
"muteParticipantsVideoBodyModerationOn": "Δε θα μπορείτε εσείς να ενεργοποιήσετε ξανά τη κάμερα, αλλά ούτε και αυτοί.",
"muteParticipantsVideoButton": "Διακοπή του βίντεο",
"muteParticipantsVideoDialog": "Θέλετε σίγουρα να κλείσετε τη κάμερα του συμμετέχοντα; Δε θα μπορείτε να την ενεργοποιήσετε ξανά, μόνο αυτοί θα μπορούν να την ανοίξουν.",
"muteParticipantsVideoDialogModerationOn": "Θέλετε σίγουρα να κλείσετε τη κάμερα του συμμετέχοντα; Δε θα μπορείτε να την ενεργοποιήσετε ξανά, ούτε αυτοί θα μπορούν.",
"muteParticipantsVideoTitle": "Απενεργοποίηση της κάμερας αυτού του συμμετέχοντα;",
"muteParticipantsVideoDialog": "Θέλετε σίγουρα να κλείσετε τη κάμερα του συμμετέχων; Δε θα μπορείτε να την ενεργοποιήσετε ξανά, μόνο αυτοί θα μπορούν να την ανοίξουν.",
"muteParticipantsVideoDialogModerationOn": "Θέλετε σίγουρα να κλείσετε τη κάμερα του συμμετέχων; Δε θα μπορείτε να την ενεργοποιήσετε ξανά, ούτε αυτοί θα μπορούν.",
"muteParticipantsVideoTitle": "Απενεργοποίηση της κάμερας αυτού του συμμετέχων;",
"noDropboxToken": "Μη έγκυρο διακριτικό Dropbox",
"password": "Κωδικός πρόσβασης",
"passwordLabel": "Η συνάντηση έχει κλειδωθεί από κάποιον συμμετέχοντα. Παρακαλώ εισάγετε το $t(lockRoomPassword) για να συμμετέχετε.",
"passwordLabel": "Η συνάντηση έχει κλειδωθεί από έναν συμμετέχων. Παρακαλώ εισάγετε το $t(lockRoomPassword) για να συμμετέχετε.",
"passwordNotSupported": "Ο ορισμός ενός $t(lockRoomPassword) στη συνάντηση δεν υποστηρίζεται.",
"passwordNotSupportedTitle": "Δεν υποστηρίζεται $t(lockRoomPasswordUppercase)",
"passwordRequired": "Απαιτείται $t(lockRoomPasswordUppercase)",
@@ -427,7 +427,7 @@
"userPassword": "Κωδικός πρόσβασης χρήστη",
"verifyParticipantConfirm": "Ταιριάζουν",
"verifyParticipantDismiss": "Δεν ταιριάζουν",
"verifyParticipantQuestion": "ΠΕΙΡΑΜΑΤΙΚΟ: Ρωτήστε τον συμμετέχοντα {{participantName}} αν βλέπουν το ίδιο περιεχόμενο, με την ίδια σειρά.",
"verifyParticipantQuestion": "ΠΕΙΡΑΜΑΤΙΚΟ: Ρωτήστε το συμμετέχων {{participantName}} αν βλέπουν το ίδιο περιεχόμενο, με την ίδια σειρά.",
"verifyParticipantTitle": "Πιστοποίηση χρήστη",
"videoLink": "Σύνδεσμο βίντεο",
"viewUpgradeOptions": "Εμφάνιση επιλογών αναβάθμισης",
@@ -514,7 +514,7 @@
"inviteDialog": {
"alertText": "Αποτυχία πρόσκλησης μερικών συμμετεχόντων.",
"header": "Πρόσκληση",
"searchCallOnlyPlaceholder": "Εισάγετε τον τηλεφωνικό αριθμό",
"searchCallOnlyPlaceholder": "Εισάγετε το τηλεφωνικό αριθμό",
"searchPeopleOnlyPlaceholder": "Αναζήτηση συμμετεχόντων",
"searchPlaceholder": "Συμμετέχων ή αριθμός τηλεφώνου",
"send": "Αποστολή"
@@ -523,7 +523,7 @@
"keyboardShortcuts": {
"focusLocal": "Εστίαση στο βίντεο σας",
"focusRemote": "Εστίαση στο βίντεο ενός άλλου",
"fullScreen": "Εναλλαγή πλήρους οθόνης",
"fullScreen": "Εναλλαγή πλήρης οθόνης",
"giphyMenu": "Εναλλαγή μενού GIPHY",
"keyboardShortcuts": "Συντομεύσεις πληκτρολογίου",
"localRecording": "Εμφάνιση ή απόκρυψη χειριστηρίων καταγραφής",
@@ -554,7 +554,7 @@
"errorLiveStreamNotEnabled": "Η ζωντανή ροή δεν είναι ενεργοποιημένη για το {{email}}. Ενεργοποιήστε τη ζωντανή ροή ή συνδεθείτε σε ένα λογαριασμό με ενεργοποιημένη τη ζωντανή ροή.",
"expandedOff": "Η ζωντανή ροή σταμάτησε",
"expandedOn": "Η σύσκεψη μεταδίδεται τώρα στο YouTube.",
"expandedPending": "Η ζωντανή ροή πρόκειται να ξεκινήσει",
"expandedPending": "Η ζωντανή ροή πρόκειται να ξεκινήσει...",
"failedToStart": "Η ζωντανή ροή απέτυχε να ξεκινήσει",
"getStreamKeyManually": "Αδυναμία λήψης κάποιας ζωντανής ροής. Προσπαθήστε να πάρετε το κλειδί ζωντανής ροής από το YouTube.",
"googlePrivacyPolicy": "Πολιτική Απορρήτου της Google",
@@ -566,7 +566,7 @@
"offBy": "{{name}} σταμάτησε τη ζωντανή ροή",
"on": "Η Ζωντανή Ροή ξεκίνησε",
"onBy": "{{name}} ξεκίνησε τη ζωντανή ροή",
"pending": "Η Ζωντανή Ροή Ξεκινάει",
"pending": "Η Ζωντανή Ροή Ξεκινάει...",
"serviceName": "Υπηρεσία Ζωντανής Ροής",
"sessionAlreadyActive": "Η συνεδρία ήδη γράφεται ή είναι σε ζωντανή ροή.",
"signIn": "Συνδεθείτε μέσω του Google",
@@ -596,10 +596,10 @@
"joinRejectedMessage": "Το αίτημα εισόδου σας απορρίφθηκε από έναν συντονιστή.",
"joinRejectedTitle": "Το αίτημα σύνδεσης απορρίφθηκε.",
"joinTitle": "Συμμετοχή στη Σύσκεψη",
"joinWithPasswordMessage": "Γίνεται είσοδος με κωδικό, παρακαλώ περιμένετε",
"joinWithPasswordMessage": "Γίνεται είσοδος με κωδικό, παρακαλώ περιμένετε...",
"joiningMessage": "Θα προστεθείτε στη σύσκεψη μόλις κάποιος αποδεχτεί το αίτημά σας",
"joiningTitle": "Αίτηση εισόδου στη σύσκεψη",
"joiningWithPasswordTitle": "Είσοδος με κωδικό πρόσβασης",
"joiningTitle": "Αίτηση εισόδου στη σύσκεψη...",
"joiningWithPasswordTitle": "Είσοδος με κωδικό πρόσβασης...",
"knockButton": "Αίτηση Συμμετοχής",
"knockTitle": "Κάποιος θέλει να συμμετέχει στη σύσκεψη",
"knockingParticipantList": "Ειδοποίηση λίστας συμμετεχόντων",
@@ -714,8 +714,8 @@
"oldElectronClientDescription3": " τώρα!",
"participantWantsToJoin": "Θέλει να συμμετέχει στη σύσκεψη",
"participantsWantToJoin": "Θέλουν να συμμετέχουν στη σύσκεψη",
"passwordRemovedRemotely": "Το $t(lockRoomPasswordUppercase) αφαιρέθηκε από έναν άλλον συμμετέχοντα",
"passwordSetRemotely": "Το $t(lockRoomPasswordUppercase) ορίστηκε από άλλον συμμετέχοντα",
"passwordRemovedRemotely": "Το $t(lockRoomPasswordUppercase) αφαιρέθηκε από έναν άλλον συμμετέχων",
"passwordSetRemotely": "Το $t(lockRoomPasswordUppercase) ορίστηκε από άλλον συμμετέχων",
"raiseHandAction": "Σήκωσε χέρι",
"raisedHand": "Θέλει να μιλήσει.",
"raisedHands": "ο/η {{participantName}} και {{raisedHands}} άλλοι",
@@ -772,7 +772,7 @@
"title": "Συμμετέχοντες"
},
"passwordDigitsOnly": "Έως {{number}} ψηφία",
"passwordSetRemotely": "Ορίστηκε από ένα άλλον συμμετέχοντα",
"passwordSetRemotely": "Ορίστηκε από ένα άλλον συμμετέχων",
"pinParticipant": "{{participantName}} - Διατήρηση",
"pinnedParticipant": "Ο συμμετέχων έχει διατηρηθεί",
"polls": {
@@ -816,7 +816,7 @@
"callMe": "Καλέστε με",
"callMeAtNumber": "Καλέστε με σε αυτό το νούμερο:",
"calling": "Γίνεται κλήση",
"configuringDevices": "Ρύθμιση συσκευών",
"configuringDevices": "Ρύθμιση συσκευών...",
"connectedWithAudioQ": "Είστε συνδεδεμένοι με ήχο;",
"connection": {
"good": "Η σύνδεση σας στο Διαδίκτυο φαίνεται καλή!",
@@ -870,17 +870,17 @@
},
"presenceStatus": {
"busy": "Κατειλημμένο",
"calling": "Καλεί",
"calling": "Καλεί...",
"connected": "Συνδέθηκε",
"connecting": "Γίνεται σύνδεση",
"connecting2": "Γίνεται σύνδεση*",
"connecting": "Γίνεται σύνδεση...",
"connecting2": "Γίνεται σύνδεση*...",
"disconnected": "Αποσυνδέθηκε",
"expired": "Έληξε",
"ignored": "Αγνοήθηκε",
"initializingCall": "Αρχικοποίηση Κλήσης",
"initializingCall": "Αρχικοποίηση Κλήσης...",
"invited": "Προσκλήθηκε",
"rejected": "Απορρίφθηκε",
"ringing": "Καλεί"
"ringing": "Καλεί..."
},
"profile": {
"avatar": "avatar",
@@ -911,7 +911,7 @@
"errorFetchingLink": "Σφάλμα στη λήψη του συνδέσμου καταγραφής.",
"expandedOff": "Η καταγραφή έχει διακοπεί",
"expandedOn": "Αυτή τη στιγμή η σύσκεψη καταγράφεται.",
"expandedPending": "Η καταγραφή ξεκινά",
"expandedPending": "Η καταγραφή ξεκινά...",
"failedToStart": "Η καταγραφή απέτυχε να ξεκινήσει",
"fileSharingdescription": "Μοιραστείτε την καταγραφή με τους συμμετέχοντες της σύσκεψης",
"highlight": "Επισήμανση",
@@ -939,7 +939,7 @@
"on": "Η καταγραφή ξεκίνησε",
"onBy": "Ο/Η {{name}} ξεκίνησε την καταγραφή",
"onlyRecordSelf": "Καταγραφή μόνο των δικών μου ροών ήχου και βίντεο",
"pending": "Προετοιμασία για την καταγραφή της σύσκεψης",
"pending": "Προετοιμασία για την καταγραφή της σύσκεψης...",
"rec": "ΕΓΓΡΑΦΗ",
"saveLocalRecording": "Αποθήκευση καταγραφής τοπικά (Beta)",
"serviceDescription": "Η καταγραφή σας θα αποθηκευτεί από την υπηρεσία καταγραφής",
@@ -1101,7 +1101,7 @@
"download": "Κατεβάστε τις εφαρμογές μας",
"embedMeeting": "Ενσωμάτωση σύσκεψης",
"endConference": "Λήξη της σύσκεψης για όλους",
"enterFullScreen": "Εμφάνιση πλήρους οθόνης",
"enterFullScreen": "Εμφάνιση πλήρης οθόνης",
"enterTileView": "Είσοδος σε προβολή εικονιδίων",
"exitFullScreen": "Έξοδος από πλήρη οθόνη",
"exitTileView": "Έξοδος από προβολή εικονιδίων",
@@ -1115,7 +1115,7 @@
"help": "Βοήθεια",
"hideWhiteboard": "Απόκρυψη μαυροπίνακα",
"invite": "Προσκαλέστε άτομα",
"kick": "Αποβολή συμμετέχοντα",
"kick": "Αποβολή συμμετέχων",
"laugh": "Γέλιο",
"leaveConference": "Αποχώρηση από την σύσκεψη",
"like": "Εγκρίνω",
@@ -1141,8 +1141,8 @@
"raiseHand": "Σηκώστε το χέρι σας",
"reactionsMenu": "Μενού αντιδράσεων",
"recording": "Εναλλαγή καταγραφής",
"remoteMute": "Σίγηση συμμετέχοντα",
"remoteVideoMute": "Απενεργοποίηση της κάμερας του συμμετέχοντα",
"remoteMute": "Σίγηση συμμετέχων",
"remoteVideoMute": "Απενεργοποίηση της κάμερας του συμμετέχων",
"security": "Επιλογές ασφαλείας",
"selectBackground": "Επιλογή Φόντου",
"selfView": "Εναλλαγή αυτοπροβολής",
@@ -1188,7 +1188,7 @@
"embedMeeting": "Ενσωμάτωση σύσκεψης",
"enableNoiseSuppression": "Ενεργοποίηση εξάλειψης θορύβου",
"endConference": "Λήξη της σύσκεψης για όλους",
"enterFullScreen": "Εμφάνιση πλήρους οθόνης",
"enterFullScreen": "Εμφάνιση πλήρης οθόνης",
"enterTileView": "Προβολή εικονιδίων",
"exitFullScreen": "Έξοδος από πλήρη οθόνη",
"exitTileView": "Έξοδος από προβολή εικονιδίων",
@@ -1267,7 +1267,7 @@
"failedToStart": "Η μεταγραφή απέτυχε να ξεκινήσει",
"labelToolTip": "Η συνάντηση μεταγράφεται",
"off": "Η μεταγραφή σταμάτησε",
"pending": "Προετοιμασία για μεταγραφή της συνάντησης",
"pending": "Προετοιμασία για μεταγραφή της συνάντησης...",
"sourceLanguageDesc": "Η γλώσσα της σύσκεψης αυτή τη στιγμή έχει οριστεί σε <b>{{sourceLanguage}}</b>.<br/>Μπορείτε να την αλλάξετε από ",
"sourceLanguageHere": "εδώ",
"start": "Εμφάνιση υποτίτλων",
@@ -1278,7 +1278,16 @@
},
"unpinParticipant": "{{participantName}} - Μη Διατήρηση",
"userMedia": {
"grantPermissions": "Παρακαλούμε παραχωρήστε την άδεια για χρήση της κάμερα και του μικροφώνου."
"androidGrantPermissions": "Επιλέξτε <b><i>Αποδοχή</i></b> όταν ο browser ζητήσει για άδεια χρήσης.",
"chromeGrantPermissions": "Επιλέξτε <b><i>Αποδοχή</i></b> όταν ο browser ζητήσει για άδεια χρήσης.",
"edgeGrantPermissions": "Επιλέξτε <b><i>Ναι</i></b> όταν ο browser ζητήσει για άδεια χρήσης.",
"electronGrantPermissions": "Δοκιμή πρόσβασης της κάμερας και του μικροφώνου",
"firefoxGrantPermissions": "Επιλέξτε <b><i>Μοιραστείτε την Επιλεγμένη Συσκευή</i></b> όταν ο browser ζητήσει για άδεια.",
"iexplorerGrantPermissions": "Επιλέξτε <b><i>OK</i></b> όταν ο browser σας ζητήσει άδεια χρήσης.",
"nwjsGrantPermissions": "Παρακαλούμε παραχωρήστε την άδεια για χρήση της κάμερα και του μικροφώνου",
"operaGrantPermissions": "Επιλέξτε <b><i>Αποδοχή</i></b> όταν ο browser σας ζητήσει για άδεια χρήσης.",
"react-nativeGrantPermissions": "Επιλέξτε <b><i>Αποδοχή</i></b> όταν ο browser σας ζητήσει για άδεια χρήσης.",
"safariGrantPermissions": "Επιλέξτε <b><i>OK</i></b> όταν ο browser σας ζητήσει άδεια χρήσης."
},
"videoSIPGW": {
"busy": "Γίνεται προσπάθεια για την απελευθέρωση πόρων. Παρακαλώ δοκιμάστε ξανά σε λίγα λεπτά.",
@@ -1328,11 +1337,11 @@
"muted": "Σίγηση",
"pinToStage": "Διατήρηση στη σκηνή",
"remoteControl": "Εκκίνηση / Διακοπή ελέγχου από μακριά",
"screenSharing": "Ο συμμετέχων διαμοιράζεται την οθόνη του",
"screenSharing": "Ο συμμετέχων μοιράζει την οθόνη τους",
"show": "Εμφάνιση στη σκηνή",
"showSelfView": "Εμφάνιση αυτοπροβολής",
"unpinFromStage": "Μη διατήρηση",
"verify": "Επιβεβαίωση συμμετέχοντα",
"verify": "Επιβεβαίωση συμμετέχων",
"videoMuted": "Η κάμερα απενεργοποιήθηκε",
"videomute": "Ο συμμετέχων σταμάτησε τη κάμερα"
},
@@ -1352,7 +1361,7 @@
"image6": "Δάσος ",
"image7": "Ανατολή",
"none": "Κανένα",
"pleaseWait": "Παρακαλώ αναμένατε",
"pleaseWait": "Παρακαλώ αναμένατε...",
"removeBackground": "Αφαίρεση φόντου",
"slightBlur": "Μισό Θόλωμα",
"title": "Εικονικά φόντα",

View File

@@ -222,7 +222,7 @@
"noMobileApp": "Ĉu vi ne jam havas la aplikaĵon?",
"termsAndConditions": "Daŭrigante, vi konsentas kun niaj <a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>kondiĉoj.</a>",
"title": "Enirante vian kunvenon per {{app}}…",
"titleNew": "Enirante vian kunvenon",
"titleNew": "Enirante vian kunvenon...",
"tryAgainButton": "Provu denove per la komputila aplikaĵo",
"unsupportedBrowser": "Ŝajnas ke vi uzas nesubtenitan retumilon"
},
@@ -1373,7 +1373,16 @@
},
"unpinParticipant": "{{participantName}} - Malpingli",
"userMedia": {
"grantPermissions": "Bonvolu doni la permeson uzi viajn kameraon kaj mikrofonon."
"androidGrantPermissions": "Elektu <b><i>Permesi</i></b> kiam via foliumilo petos permesojn.",
"chromeGrantPermissions": "Elektu <b><i>Permesi</i></b> kiam via foliumilo petos permesojn.",
"edgeGrantPermissions": "Elektu <b><i>Jes</i></b> kiam via foliumilo petos permesojn.",
"electronGrantPermissions": "Bonvolu doni la permeson uzi viajn kameraon kaj mikrofonon",
"firefoxGrantPermissions": "Elektu <b><i>Havigi elektitan aparaton</i></b> kiam via foliumilo petos permesojn.",
"iexplorerGrantPermissions": "Elektu <b><i>Bone</i></b> kiam via foliumilo petos permesojn.",
"nwjsGrantPermissions": "Bonvolu doni la permeson uzi viajn kameraon kaj mikrofonon",
"operaGrantPermissions": "Elektu <b><i>Permesi</i></b> kiam via foliumilo petos permesojn.",
"react-nativeGrantPermissions": "Elektu <b><i>Permesi</i></b> kiam via foliumilo petos permesojn.",
"safariGrantPermissions": "Elektu <b><i>Bone</i></b> kiam via foliumilo petos permesojn."
},
"videoSIPGW": {
"busy": "Ni klopodas liberigi rimedojn. Bonvolu reprovi post kelkaj minutoj.",

View File

@@ -19,7 +19,7 @@
"noResults": "No se encontraron coincidencias",
"outlookEmail": "Correo de Outlook",
"phoneNumbers": "números de teléfono",
"searching": "Buscando",
"searching": "Buscando...",
"shareInvite": "Compartir la invitación a la reunión",
"shareLink": "Compartir el enlace de la reunion",
"shareStream": "Compartir el enlace de la transmisión en vivo",
@@ -251,7 +251,7 @@
"Share": "Compartir",
"Submit": "Enviar",
"WaitForHostMsg": "La conferencia aún no ha comenzado. Si eres el anfitrión, inicia sesión. De lo contrario, espera a que llegue el anfitrión.",
"WaitingForHostTitle": "Esperando al anfitrión",
"WaitingForHostTitle": "Esperando al anfitrión...",
"Yes": "Sí",
"accessibilityLabel": {
"close": "Cerrar diálogo",
@@ -614,10 +614,10 @@
"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",
"joinWithPasswordMessage": "Tratando de entrar con contraseña, por favor espera...",
"joiningMessage": "Podrás entrar tan pronto te acepten tu solicitud.",
"joiningTitle": "Pidiendo entrar a la reunión",
"joiningWithPasswordTitle": "Uniéndose con la contraseña",
"joiningTitle": "Pidiendo entrar a la reunión...",
"joiningWithPasswordTitle": "Uniéndose con la contraseña...",
"knockButton": "Pedir entrar",
"knockTitle": "Alguien quiere entrar a la reunión",
"knockingParticipantList": "Participantes que quieren entrar",
@@ -704,7 +704,7 @@
"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",
"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.",
@@ -839,7 +839,7 @@
"callMe": "Llámame",
"callMeAtNumber": "Llamame a este número:",
"calling": "Llamando",
"configuringDevices": "Configurando dispositivos",
"configuringDevices": "Configurando dispositivos...",
"connectedWithAudioQ": "¿Estás está conectado con audio?",
"connection": {
"good": "¡Su conexión a internet es buena!",
@@ -1318,7 +1318,16 @@
},
"unpinParticipant": "",
"userMedia": {
"grantPermissions": "Otorga permisos para usar la cámara y el micrófono."
"androidGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
"chromeGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
"edgeGrantPermissions": "Selecciona <b><i>Sí</i></b> cuando el navegador solicite permisos.",
"electronGrantPermissions": "Otorga permisos para usar la cámara y el micrófono",
"firefoxGrantPermissions": "Selecciona <b><i>Compartir dispositivo seleccionado</i></b> cuando el navegador solicite permisos.",
"iexplorerGrantPermissions": "Selecciona <b><i>Aceptar</i></b> cuando el navegador solicite permisos.",
"nwjsGrantPermissions": "Otorga permisos para usar la cámara y el micrófono",
"operaGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
"react-nativeGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
"safariGrantPermissions": "Selecciona <b><i>Aceptar</i></b> cuando el navegador solicite permisos."
},
"videoSIPGW": {
"busy": "Estamos trabajando para liberar recursos. Vuelve a intentarlo en unos minutos.",
@@ -1392,7 +1401,7 @@
"image6": "Bosque",
"image7": "Amanecer",
"none": "Ninguno",
"pleaseWait": "Por favor, espera",
"pleaseWait": "Por favor, espera...",
"removeBackground": "Eliminar el fondo",
"slightBlur": "Desenfoque Ligero",
"title": "Fondos virtuales",

View File

@@ -27,7 +27,7 @@
"searchNumbers": "Agregar números telefónicos",
"searchPeople": "Buscar personas",
"searchPeopleAndNumbers": "Buscar personas o añadir sus números de teléfono",
"searching": "Buscando",
"searching": "Buscando...",
"shareInvite": "Compartir la invitación a la reunión",
"shareLink": "Compartir el link de la reunion",
"shareStream": "Compartir el link de la transmición en vivo",
@@ -112,7 +112,7 @@
"GET_SESSION_ID_ERROR": "Obtener session-id error: {{code}}",
"GOT_SESSION_ID": "Obteniendo session-ID… Listo",
"LOW_BANDWIDTH": "El video para {{displayName}} ha sido desactivado para ahorrar ancho de banda",
"RECONNECTING": "Ocurrió un problema en la red. Reconectando"
"RECONNECTING": "Ocurrió un problema en la red. Reconectando..."
},
"connectionindicator": {
"address": "Dirección:",
@@ -195,7 +195,7 @@
"Submit": "Enviar",
"WaitForHostMsg": "La conferencia aún no ha comenzado. Si eres el anfitrión, inicia sesión. De lo contrario, espera a que llegue el anfitrión.",
"WaitingForHost": "Esperando al anfitrión…",
"WaitingForHostTitle": "Esperando al anfitrión",
"WaitingForHostTitle": "Esperando al anfitrión...",
"Yes": "Sí",
"accessibilityLabel": {
"liveStreaming": "Transmisión en vivo"
@@ -536,10 +536,10 @@
"invalidPassword": "Contraseña inválida",
"joinRejectedMessage": "Tu solicitud para entrar ha sido rechazada por un moderador.",
"joinTitle": "Entrar a la reunión",
"joinWithPasswordMessage": "Tratando de entrar con contraseña, por favor espera",
"joinWithPasswordMessage": "Tratando de entrar con contraseña, por favor espera...",
"joiningMessage": "Podrás entrar tan pronto te acepten tu solicitud.",
"joiningTitle": "Pidiendo entrar a la reunión",
"joiningWithPasswordTitle": "Uniéndose con la contraseña",
"joiningTitle": "Pidiendo entrar a la reunión...",
"joiningWithPasswordTitle": "Uniéndose con la contraseña...",
"knockButton": "Pedir entrar",
"knockTitle": "Alguien quiere entrar a la reunión",
"knockingParticipantList": "Participantes que quieren entrar",
@@ -715,7 +715,7 @@
"callMe": "Llámame",
"callMeAtNumber": "Llamame a este número:",
"calling": "Llamando",
"configuringDevices": "Configurando dispositivos",
"configuringDevices": "Configurando dispositivos...",
"connectedWithAudioQ": "¿Estás está conectado con audio?",
"connection": {
"good": "¡Su conexión a internet es buena!",
@@ -1075,7 +1075,16 @@
"tr": "TR"
},
"userMedia": {
"grantPermissions": "Otorga permisos para usar la cámara y el micrófono."
"androidGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
"chromeGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
"edgeGrantPermissions": "Selecciona <b><i>Sí</i></b> cuando el navegador solicite permisos.",
"electronGrantPermissions": "Otorga permisos para usar la cámara y el micrófono",
"firefoxGrantPermissions": "Selecciona <b><i>Compartir dispositivo seleccionado</i></b> cuando el navegador solicite permisos.",
"iexplorerGrantPermissions": "Selecciona <b><i>Aceptar</i></b> cuando el navegador solicite permisos.",
"nwjsGrantPermissions": "Otorga permisos para usar la cámara y el micrófono",
"operaGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
"react-nativeGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
"safariGrantPermissions": "Selecciona <b><i>Aceptar</i></b> cuando el navegador solicite permisos."
},
"videoSIPGW": {
"busy": "Estamos trabajando para liberar recursos. Vuelve a intentarlo en unos minutos.",
@@ -1138,7 +1147,7 @@
"image6": "Bosque",
"image7": "Amanecer",
"none": "Ninguno",
"pleaseWait": "Por favor, espera",
"pleaseWait": "Por favor, espera...",
"removeBackground": "Eliminar el fondo",
"slightBlur": "Desenfoque Ligero",
"title": "Fondos virtuales",

View File

@@ -478,7 +478,7 @@
"calling": "Helistamine…",
"connected": "Ühendatud",
"connecting": "Ühendamine…",
"connecting2": "Ühendamine*",
"connecting2": "Ühendamine*...",
"disconnected": "Lahti ühendatud",
"expired": "Aegunud",
"ignored": "Eiratud",
@@ -700,7 +700,16 @@
"tr": "TR"
},
"userMedia": {
"grantPermissions": "Luba kasutada kaamerat ja mikrofoni."
"androidGrantPermissions": "Vali <b><i>Luba</i></b>, kui veebilehitseja küsib nõusolekut.",
"chromeGrantPermissions": "Vali <b><i>Luba</i></b>, kui veebilehitseja küsib nõusolekut.",
"edgeGrantPermissions": "Vali <b><i>Jah</i></b>, kui veebilehitseja küsib nõusolekut.",
"electronGrantPermissions": "Luba kasutada kaamerat ja mikrofoni",
"firefoxGrantPermissions": "Vali <b><i>Jaga valitud vahendit</i></b>, kui veebilehitseja küsib nõusolekut.",
"iexplorerGrantPermissions": "Vali <b><i>OK</i></b>, kui veebilehitseja küsib nõusolekut.",
"nwjsGrantPermissions": "Luba kasutada kaamerat ja mikrofoni",
"operaGrantPermissions": "Vali <b><i>Luba</i></b>, kui veebilehitseja küsib nõusolekut.",
"react-nativeGrantPermissions": "Vali <b><i>Luba</i></b>, kui veebilehitseja küsib nõusolekut.",
"safariGrantPermissions": "Vali <b><i>OK</i></b>, kui veebilehitseja küsib nõusolekut."
},
"videoSIPGW": {
"busy": "Vabastatakse ressurssi… Proovi mõne minuti pärast uuesti.",

View File

@@ -20,7 +20,7 @@
"noResults": "Ez dago bat datorren bilaketa-emaitzarik",
"outlookEmail": "Outlook Email",
"phoneNumbers": "telefono zenbakiak",
"searching": "Bilatzen",
"searching": "Bilatzen...",
"shareInvite": "Partekatu bilerarako gonbidapena",
"shareLink": "Partekatu bileraren esteka beste partaide batzuk gonbidatzeko",
"shareStream": "Partekatu zuzenekoaren esteka",
@@ -182,7 +182,7 @@
"Share": "Partekatu",
"Submit": "Bidali",
"WaitForHostMsg": "Konferentzia oraindik ez da hasi. Ostalaria bazara, autentifikatu. Bestela, itxaron ostalaria iritsi arte.",
"WaitingForHostTitle": "Antolatzailearen zain",
"WaitingForHostTitle": "Antolatzailearen zain...",
"Yes": "Bai",
"accessibilityLabel": {
"liveStreaming": "Zuzeneko Erreprodukzioa"
@@ -477,10 +477,10 @@
"invalidPassword": "Pasahitza ez da zuzena",
"joinRejectedMessage": "Sartzeko eskaera ukatu egin du moderatzaile batek",
"joinTitle": "Sartu bileran",
"joinWithPasswordMessage": "Pasahitz gabe sartzen saiatzen, itxaron mesedez",
"joinWithPasswordMessage": "Pasahitz gabe sartzen saiatzen, itxaron mesedez...",
"joiningMessage": "Norbaitek zure eskaera sartu bezain laster sartuko zara bileran",
"joiningTitle": "Sartzeko eskatzen",
"joiningWithPasswordTitle": "Pasahitzarekin sartzen",
"joiningTitle": "Sartzeko eskatzen...",
"joiningWithPasswordTitle": "Pasahitzarekin sartzen...",
"knockButton": "Eskatu sartzea",
"knockTitle": "Norbaitek bileran sartu nahi du",
"knockingParticipantList": "Zain dauden parte-hartzaileak",
@@ -602,7 +602,7 @@
"callMe": "Deitu nazazu",
"callMeAtNumber": "Deitu nazazu zenbaki honetara:",
"calling": "Deitzen",
"configuringDevices": "Gailuak konfiguratzen",
"configuringDevices": "Gailuak konfiguratzen...",
"connectedWithAudioQ": "Audioarekin konektatuta zaude?",
"connection": {
"good": "Zure internet konexioa ondo dabil!",
@@ -913,13 +913,22 @@
"failedToStart": "Ezin da transkripzioa hasi",
"labelToolTip": "Bilera transkribatzen ari da",
"off": "Transkripzioa gelditu da",
"pending": "Bileraren transkripzioa prestatzen",
"pending": "Bileraren transkripzioa prestatzen ...",
"start": "Erakutsi azpitituluak",
"stop": "Utzi azpitituluak erakusten",
"tr": "TR"
},
"userMedia": {
"grantPermissions": "Mesedez, eman zure kamera eta mikrofonoa erabiltzeko baimenak."
"androidGrantPermissions": "Hautatu <b><i>Baimendu</i></b> zure nabigatzaileak baimenak eskatzen dituenean.",
"chromeGrantPermissions": "Hautatu <b><i>Baimendu</i></b> zure nabigatzaileak baimenak eskatzen dituenean.",
"edgeGrantPermissions": "Hautatu <b><i>Bai</i></b> zure nabigatzaileak baimenak eskatzen dituenean.",
"electronGrantPermissions": "Mesedez eman zure kamera eta mikrofonoa erabiltzeko baimenak",
"firefoxGrantPermissions": "Hautatu <b><i>Partekatutako hautatutako gailua</i></b> zure nabigatzaileak baimenak eskatzen dituenean.",
"iexplorerGrantPermissions": "Hautatu <b><i>Ados</i></b> zure nabigatzaileak baimenak eskatzen dituenean.",
"nwjsGrantPermissions": "Mesedez, eman zure kamera eta mikrofonoa erabiltzeko baimenak",
"operaGrantPermissions": "Hautatu <b><i>Baimendu</i></b> zure nabigatzaileak baimenak eskatzen dituenean.",
"react-nativeGrantPermissions": "Hautatu <b><i>Baimendu</i></b> zure nabigatzaileak baimenak eskatzen dituenean.",
"safariGrantPermissions": "Hautatu <b><i>Ados</i></b> zure nabigatzaileak baimenak eskatzen dituenean."
},
"videoSIPGW": {
"busy": "Baliabideak askatzeko lanetan gabiltza. Mesedez, saiatu berriro minutu batzuk barru.",
@@ -979,7 +988,7 @@
"image6": "Basoa",
"image7": "Egunsentia",
"none": "Bat ere ez",
"pleaseWait": "Itxaron mesedez",
"pleaseWait": "Itxaron mesedez...",
"removeBackground": "Kendu atzeko planoa",
"slightBlur": "Lausotze arina",
"title": "Atzeko plano birtualak",

View File

@@ -22,7 +22,7 @@
"noResults": "هیچ نتیجه‌ای مطابق با جستجو یافت نشد",
"outlookEmail": "رایانامهٔ اوت‌لوک",
"phoneNumbers": "شماره تلفن‌ها",
"searching": "درحال جستجو",
"searching": "درحال جستجو...",
"shareInvite": "هم‌رسانی دعوت‌نامهٔ جلسه",
"shareLink": "هم‌رسانی پیوند جلسه برای دعوت دیگران",
"shareStream": "هم‌رسانی پیوند پخش زنده",
@@ -137,7 +137,7 @@
"installExtensionText": "برای اتصال به تقویم گوگل و برنامه آفیس 365 افزونه را نصب کنید"
},
"connectingOverlay": {
"joiningRoom": "درحال اتصال شما به جلسه"
"joiningRoom": "درحال اتصال شما به جلسه..."
},
"connection": {
"ATTACHED": "پیوست‌شده",
@@ -149,9 +149,9 @@
"DISCONNECTED": "قطع شد",
"DISCONNECTING": "درحال قطع اتصال",
"ERROR": "خطا",
"FETCH_SESSION_ID": "دریافت شناسهٔ جلسه",
"FETCH_SESSION_ID": "دریافت شناسهٔ جلسه...",
"GET_SESSION_ID_ERROR": "خطا در دریافت شناسهٔ جلسه: {{code}}",
"GOT_SESSION_ID": "دریافت شناسهٔ جلسه انجام شد",
"GOT_SESSION_ID": "دریافت شناسهٔ جلسه... انجام شد",
"LOW_BANDWIDTH": "برای صرفه‌جویی در پهنای باند، ویدیو برای {{displayName}} غیرفعال شد"
},
"connectionindicator": {
@@ -214,8 +214,8 @@
"launchWebButton": "استفاده از نسخه‌ٔ وب",
"noMobileApp": "برنامه را نصب نکرده‌اید؟",
"termsAndConditions": "با ادامه‌دادن، با <a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>شرایط و ضوابط</a> ما موافقت می‌کنید.",
"title": "درحال اجرای جلسهٔ شما در {{app}}",
"titleNew": "درحال اجرای جلسهٔ شما",
"title": "درحال اجرای جلسهٔ شما در {{app}}...",
"titleNew": "درحال اجرای جلسهٔ شما...",
"tryAgainButton": "با نسخه‌ٔ میزکار دوباره تلاش کنید",
"unsupportedBrowser": "به نظر می‌رسد در حال استفاده از یک مرورگر پشتیبانی‌نشده هستید."
},
@@ -254,7 +254,7 @@
"Share": "هم‌رسانی",
"Submit": "ارسال",
"WaitForHostMsg": "کنفرانس هنوز شروع نشده است، اگر میزبان هستید وارد شوید، در غیراین صورت تا رسیدن میزبان و شروع جلسه منتظر بمانید.",
"WaitingForHostTitle": "در انتظار میزبان",
"WaitingForHostTitle": "در انتظار میزبان ...",
"Yes": "بله",
"accessibilityLabel": {
"Cancel": "لغو (ترک‌کردن پنجرهٔ گفتگو)",
@@ -280,9 +280,9 @@
"cameraUnknownError": "به دلایلی نامشخص نمی‌توان از دوربین استفاده کرد.",
"cameraUnsupportedResolutionError": "دوربین شما از وضوح تصویر مورد نیاز پشتیبانی نمی‌کند.",
"close": "بستن",
"conferenceDisconnectMsg": "شاید بخواهید اتصال شبکه خود را بررسی کنید. تلاش برای اتصال دوباره در {{seconds}} ثانیه دیگر",
"conferenceDisconnectMsg": "شاید بخواهید اتصال شبکه خود را بررسی کنید. تلاش برای اتصال دوباره در {{seconds}} ثانیه دیگر...",
"conferenceDisconnectTitle": "اتصال شما قطع شده‌است.",
"conferenceReloadMsg": "ما در حال تلاش برای حل این مشکل هستیم. تلاش برای اتصال دوباره در {{seconds}} ثانیه دیگر",
"conferenceReloadMsg": "ما در حال تلاش برای حل این مشکل هستیم. تلاش برای اتصال دوباره در {{seconds}} ثانیه دیگر...",
"conferenceReloadTitle": "متأسفانه مشکلی پیش آمد.",
"confirm": "تأیید",
"confirmNo": "خیر",
@@ -580,7 +580,7 @@
"errorLiveStreamNotEnabled": "پخش زنده برای {{email}} فعال نیست. لطفاً پخش زنده را فعال کنید یا وارد یک حساب کاربری با پخش زندهٔ فعال شوید.",
"expandedOff": "پخش زنده متوقف شده است",
"expandedOn": "این جلسه درحال حاضر در یوتیوب درحال پخش است.",
"expandedPending": "پخش زنده در حال شروع است",
"expandedPending": "پخش زنده در حال شروع است...",
"failedToStart": "شروع پخش زنده ناموفق بود",
"getStreamKeyManually": "ما نتوانستیم هیچ پخش زنده‌ای را دریافت کنیم. کلید پخش زنده خود را به‌صورت دستی از یوتیوب دریافت کنید.",
"googlePrivacyPolicy": "سیاست محرمانگی گوگل",
@@ -592,7 +592,7 @@
"offBy": "{{name}} پخش زنده را متوقف کرد",
"on": "پخش زنده شروع شد",
"onBy": "{{name}} پخش زنده را شروع کرد",
"pending": "درحال شروع پخش زنده",
"pending": "درحال شروع پخش زنده...",
"serviceName": "خدمت پخش زنده",
"sessionAlreadyActive": "این جلسه از قبل درحال ضبط یا پخش زنده است.",
"signIn": "ورود با حساب گوگل",
@@ -622,10 +622,10 @@
"joinRejectedMessage": "درخواست پیوستن شما توسط مدیر جلسه رد شد.",
"joinRejectedTitle": "درخواست شما رد شد.",
"joinTitle": "پیوستن به جلسه",
"joinWithPasswordMessage": "تلاش برای پیوستن به جلسه با گذرواژه؛ شکیبا باشید",
"joinWithPasswordMessage": "تلاش برای پیوستن به جلسه با گذرواژه؛ شکیبا باشید...",
"joiningMessage": "به محض پذیرش درخواست شما، به جلسه خواهید پیوست",
"joiningTitle": "درخواست برای پیوستن به جلسه",
"joiningWithPasswordTitle": "درحال پیوستن با گذرواژه",
"joiningTitle": "درخواست برای پیوستن به جلسه...",
"joiningWithPasswordTitle": "درحال پیوستن با گذرواژه...",
"knockButton": "درخواست برای پیوستن",
"knockTitle": "یک نفر می‌خواهد به جلسه بپیوندد",
"knockingParticipantList": "فهرست شرکت‌کنندگان درانتظار",
@@ -712,7 +712,7 @@
"linkToSalesforceDescription": "شما می‌توانید خلاصهٔ جلسه را به یک شیء Salesforce پیوند دهید.",
"linkToSalesforceError": "خطا در پیوند جلسه به Salesforce",
"linkToSalesforceKey": "پیونددادن این جلسه",
"linkToSalesforceProgress": "درحال پیونددادن این جلسه به Salesforce",
"linkToSalesforceProgress": "درحال پیونددادن این جلسه به Salesforce...",
"linkToSalesforceSuccess": "این جلسه به Salesforce پیوند داده شد",
"localRecordingStarted": "{{name}} یک ضبط محلی را شروع کرده است.",
"localRecordingStopped": "{{name}} یک ضبط محلی را متوقف کرده است.",
@@ -847,7 +847,7 @@
"callMe": "با من تماس بگیرید",
"callMeAtNumber": "با این شماره با من تماس بگیرید:",
"calling": "درحال تماس",
"configuringDevices": "پیکربندی دستگاه‌ها",
"configuringDevices": "پیکربندی دستگاه‌ها...",
"connectedWithAudioQ": "از طریق صدا متصل هستید؟",
"connection": {
"good": "اتصال اینترنت شما خوب به‌نظر می‌رسد!",
@@ -903,17 +903,17 @@
},
"presenceStatus": {
"busy": "مشغول",
"calling": "درحال تماس‌گرفتن",
"calling": "درحال تماس‌گرفتن...",
"connected": "متصل‌شده",
"connecting": "درحال اتصال",
"connecting2": "درحال اتصال*",
"connecting": "درحال اتصال...",
"connecting2": "درحال اتصال*...",
"disconnected": "قطع‌شده",
"expired": "منقضی‌شده",
"ignored": "نادیده‌گرفته",
"initializingCall": "درحال آغاز تماس",
"initializingCall": "درحال آغاز تماس...",
"invited": "دعوت‌شده",
"rejected": "ردشده",
"ringing": "درحال زنگ‌زدن"
"ringing": "درحال زنگ‌زدن..."
},
"profile": {
"avatar": "چِهرَک",
@@ -947,7 +947,7 @@
"errorFetchingLink": "خطا در واکِشی پیوند ضبط.",
"expandedOff": "ضبط متوقف شده است",
"expandedOn": "این جلسه هم‌اکنون درحال ضبط‌شدن است.",
"expandedPending": "ضبط درحال شروع است",
"expandedPending": "ضبط درحال شروع است...",
"failedToStart": "شروع ضبط ناموفق بود",
"fileSharingdescription": "هم‌رسانی پیوند ضبط با شرکت‌کنندگان جلسه",
"highlight": "علامت‌گذاری",
@@ -975,7 +975,7 @@
"on": "ضبط جلسه شروع شد",
"onBy": "{{name}} ضبط جلسه را شروع کرد",
"onlyRecordSelf": "فقط جریان‌های صدا و تصویر من را ضبط کن",
"pending": "درحال آماده‌شدن برای ضبط جلسه",
"pending": "درحال آماده‌شدن برای ضبط جلسه...",
"rec": "ضبط",
"saveLocalRecording": "ذخیرهٔ پروندهٔ ضبط به صورت محلی (آزمایشی)",
"serviceDescription": "ضبط شما توسط خدمتِ ضبط ذخیره خواهد شد",
@@ -1315,7 +1315,7 @@
"failedToStart": "شروع ترانویسی ناموفق بود",
"labelToolTip": "جلسه درحال ترانویسی است",
"off": "توقف ترانویسی",
"pending": "درحال آماده‌شدن برای ترانویسی جلسه",
"pending": "درحال آماده‌شدن برای ترانویسی جلسه...",
"sourceLanguageDesc": "هم‌اکنون زمان جلسه روی <b>{{sourceLanguage}}</b> تنظیم شده است.<br/> می‌توانید آن را از این‌جا تغییر دهید ",
"sourceLanguageHere": "این‌جا",
"start": "شروع نمایش زیرنویس‌ها",
@@ -1326,7 +1326,16 @@
},
"unpinParticipant": "{{participantName}} - برداشتن سنجاق",
"userMedia": {
"grantPermissions": "لطفاً اجازهٔ استفاده از دوربین و میکروفون خود را بدهید."
"androidGrantPermissions": "هنگامی که مرورگرتان اجازهٔ دسترسی می‌خواهد، <b><i>اجازه‌دادن</i></b> را انتخاب کنید.",
"chromeGrantPermissions": "هنگامی که مرورگرتان اجازهٔ دسترسی می‌خواهد، <b><i>اجازه‌دادن</i></b> را انتخاب کنید.",
"edgeGrantPermissions": "هنگامی که مرورگرتان اجازهٔ دسترسی می‌خواهد، <b><i>بله</i></b> را انتخاب کنید.",
"electronGrantPermissions": "درحال تلاش برای دسترسی به دوربین و میکروفون شما",
"firefoxGrantPermissions": "هنگامی که مرورگرتان اجازهٔ دسترسی می‌خواهد، <b><i>هم‌رسانی دستگاه انتخاب‌شده</i></b> را انتخاب کنید.",
"iexplorerGrantPermissions": "هنگامی که مرورگرتان اجازهٔ دسترسی می‌خواهد، <b><i>تأیید</i></b> را انتخاب کنید.",
"nwjsGrantPermissions": "لطفاً اجازهٔ استفاده از دوربین و میکروفون خود را بدهید",
"operaGrantPermissions": "هنگامی که مرورگرتان اجازهٔ دسترسی می‌خواهد، <b><i>اجازه‌دادن</i></b> را انتخاب کنید.",
"react-nativeGrantPermissions": "هنگامی که مرورگرتان اجازهٔ دسترسی می‌خواهد، <b><i>اجازه‌دادن</i></b> را انتخاب کنید.",
"safariGrantPermissions": "هنگامی که مرورگرتان اجازهٔ دسترسی می‌خواهد، <b><i>تأیید</i></b> را انتخاب کنید."
},
"videoSIPGW": {
"busy": "ما درحال آزادسازی منابع هستیم؛ لطفاً دقایقی دیگر دوباره تلاش کنید.",
@@ -1404,7 +1413,7 @@
"image6": "جنگل ",
"image7": "طلوع خورشید",
"none": "هیچ‌یک",
"pleaseWait": "لطفاً شکیبا باشید",
"pleaseWait": "لطفاً شکیبا باشید...",
"removeBackground": "حذف پس‌زمینه",
"slightBlur": "نیمه‌تار",
"title": "پس‌زمینه‌های مجازی",

View File

@@ -69,7 +69,7 @@
"DISCONNECTED": "Ei yhteyttä",
"DISCONNECTING": "Yhteyttä katkaistaan",
"ERROR": "Virhe",
"RECONNECTING": "Tapahtui verkkovirhe. Yhdistetään uudelleen"
"RECONNECTING": "Tapahtui verkkovirhe. Yhdistetään uudelleen..."
},
"connectionindicator": {
"address": "Osoite:",
@@ -449,7 +449,7 @@
"calling": "Soitetaan…",
"connected": "Yhdistetty",
"connecting": "Yhdistetään…",
"connecting2": "Yhdistetään*",
"connecting2": "Yhdistetään*...",
"disconnected": "Ei yhteyttä",
"expired": "Vanhentunut",
"ignored": "Sivuutettu",
@@ -649,7 +649,16 @@
"tr": "TR"
},
"userMedia": {
"grantPermissions": "Myönnä käyttöoikeudet laitteesi kameran ja mikrofonin käyttöön."
"androidGrantPermissions": "Valitse <b><i>Salli</i></b>, kun selain pyytää käyttöoikeuksia.",
"chromeGrantPermissions": "Valitse <b><i>Salli</i></b>, kun selain pyytää käyttöoikeuksia.",
"edgeGrantPermissions": "Valitse <b><i>Kyllä</i></b>, kun selain pyytää käyttöoikeuksia.",
"electronGrantPermissions": "Myönnä käyttöoikeudet laitteesi kameran ja mikrofonin käyttöön.",
"firefoxGrantPermissions": "Valitse <b><i>Jaa havaittu laite</i></b>, kun selain pyytää käyttöoikeuksia.",
"iexplorerGrantPermissions": "Valitse <b><i>OK</i></b>, kun selain pyytää käyttöoikeuksia.",
"nwjsGrantPermissions": "Myönnä käyttöoikeudet laitteesi kameran ja mikrofonin käyttöön.",
"operaGrantPermissions": "Valitse <b><i>Salli</i></b>, kun selain pyytää käyttöoikeuksia.",
"react-nativeGrantPermissions": "Valitse <b><i>Salli</i></b>, kun selain pyytää käyttöoikeuksia.",
"safariGrantPermissions": "Valitse <b><i>OK</i></b>, kun selain pyytää käyttöoikeuksia."
},
"videoSIPGW": {
"busy": "Yritämme vapauttaa resursseja. Yritä uudelleen muutaman minuutin kuluttua.",

View File

@@ -22,7 +22,7 @@
"noResults": "Aucun résultat de recherche correspondant",
"outlookEmail": "Outlook",
"phoneNumbers": "Numéros de téléphone",
"searching": "Recherche",
"searching": "Recherche...",
"shareInvite": "Partager l'invitation à la réunion",
"shareLink": "Partager le lien de la réunion pour inviter d'autres personnes",
"shareStream": "Partager le lien de diffusion en direct",
@@ -145,7 +145,7 @@
"installExtensionText": "Installer l'extension pour l'intégration de Google Calendar et Office 365"
},
"connectingOverlay": {
"joiningRoom": "Connexion à la réunion"
"joiningRoom": "Connexion à la réunion ..."
},
"connection": {
"ATTACHED": "Attachée",
@@ -157,9 +157,9 @@
"DISCONNECTED": "Déconnecté",
"DISCONNECTING": "Déconnexion en cours",
"ERROR": "Erreur",
"FETCH_SESSION_ID": "Obtention d'un identifiant de session",
"FETCH_SESSION_ID": "Obtention d'un identifiant de session ...",
"GET_SESSION_ID_ERROR": "Obtenir une erreur d'identifiant de session : {{code}}",
"GOT_SESSION_ID": "Obtention d'un identifiant de session Terminée",
"GOT_SESSION_ID": "Obtention d'un identifiant de session ... Terminée",
"LOW_BANDWIDTH": "La vidéo de {{displayName}} a été coupée pour économiser de la bande passante"
},
"connectionindicator": {
@@ -224,8 +224,8 @@
"noMobileApp": "Vous navez pas lapplication ?",
"or": "OU",
"termsAndConditions": "En continuant, vous acceptez nos <a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>conditions générales dutilisation.</a>",
"title": "Lancement de votre réunion dans {{app}} en cours",
"titleNew": "Lancement de votre réunion",
"title": "Lancement de votre réunion dans {{app}} en cours ...",
"titleNew": "Lancement de votre réunion ...",
"tryAgainButton": "Réessayez sur le bureau",
"unsupportedBrowser": "Il semble que vous utilisez un navigateur non supporté."
},
@@ -266,7 +266,7 @@
"WaitForHostMsg": "La conférence n'a pas encore commencé. Si vous en êtes l'hôte, veuillez vous authentifier. Sinon, veuillez attendre son arrivée.",
"WaitForHostNoAuthMsg": "La conférence n'a pas encore commencé car aucun modérateur n'est encore arrivé. Veuillez patienter.",
"WaitingForHostButton": "Attendre l'hôte",
"WaitingForHostTitle": "En attente de l'hôte",
"WaitingForHostTitle": "En attente de l'hôte ...",
"Yes": "Oui",
"accessibilityLabel": {
"Cancel": "Annuler (quiter la popup)",
@@ -294,9 +294,9 @@
"cameraUnknownError": "Vous ne pouvez pas utiliser la caméra pour une raison inconnue.",
"cameraUnsupportedResolutionError": "Votre appareil ne prend pas en charge la résolution vidéo requise.",
"close": "Fermer",
"conferenceDisconnectMsg": "Veuillez vérifier votre connexion réseau. Reconnexion dans {{seconds}} sec",
"conferenceDisconnectMsg": "Veuillez vérifier votre connexion réseau. Reconnexion dans {{seconds}} sec ...",
"conferenceDisconnectTitle": "Vous avez été déconnecté.",
"conferenceReloadMsg": "On essaie d'arranger ça. Reconnexion dans {{seconds}} secondes",
"conferenceReloadMsg": "On essaie d'arranger ça. Reconnexion dans {{seconds}} secondes ...",
"conferenceReloadTitle": "Malheureusement, un problème est survenu",
"confirm": "Confirmer",
"confirmNo": "Non",
@@ -334,7 +334,6 @@
"kickParticipantButton": "Expulser",
"kickParticipantDialog": "Êtes-vous sûr(e) de vouloir expulser ce participant ?",
"kickParticipantTitle": "Expulser ce participant ?",
"kickSystemTitle": "Oups ! Vous avez été expulsé de la réunion",
"kickTitle": "Oups ! vous avez été expulsé(e) par {{participantDisplayName}}",
"linkMeeting": "Relier la conférence",
"linkMeetingTitle": "Relier la conférence à Salesforce",
@@ -440,10 +439,7 @@
"shareScreenWarningD2": "vous devez arrêter le partage d'audio, démarrer le partage d'écran et cocher l'option \"Partager l'audio\".",
"shareScreenWarningH1": "Si vous voulez partager uniquement votre écran:",
"shareScreenWarningTitle": "Vous devez cesser de partager votre audio avant de partager votre écran",
"shareVideoConfirmPlay": "Vous êtes sur le point d'ouvrir un site web externe. Voulez-vous continuer ?",
"shareVideoConfirmPlayTitle": "{{name}} a partagé une vidéo avec vous.",
"shareVideoLinkError": "Veuillez renseigner un lien de diffusion vidéo fonctionnel.",
"shareVideoLinkStopped": "La vidéo de {{name}} a été arrêtée.",
"shareVideoTitle": "Partager une vidéo",
"shareYourScreen": "Partager votre écran",
"shareYourScreenDisabled": "Le partage d'écran est désactivé.",
@@ -629,7 +625,7 @@
"errorLiveStreamNotEnabled": "La diffusion en direct n'est pas activée pour {{email}}. Merci de l'activer ou de vous connecter avec un compte où elle est déjà activée.",
"expandedOff": "La diffusion en direct a été arrêtée",
"expandedOn": "La conférence est en cours de diffusion sur YouTube.",
"expandedPending": "La diffusion en direct a commencé",
"expandedPending": "La diffusion en direct a commencé ...",
"failedToStart": "La diffusion n'a pas réussi à démarrer",
"getStreamKeyManually": "Nous n'avons pas réussi à récupérer un flux de direct. Essayez d'obtenir votre clé de diffusion en direct sur YouTube.",
"googlePrivacyPolicy": "Politique de confidentialité de Google",
@@ -641,8 +637,7 @@
"offBy": "{{name}} a arrêté la diffusion en direct",
"on": "En direct",
"onBy": "{{name}} a démarré la diffusion en direct",
"pending": "Lancement du direct",
"policyError": "Vous avez essayé de démarrer une diffusion en direct trop rapidement. Veuillez réessayer plus tard !",
"pending": "Lancement du direct ...",
"serviceName": "Service de diffusion en direct",
"sessionAlreadyActive": "Cette session est déjà en cours d'enregistrement ou de diffusion.",
"signIn": "Se connecter avec Google",
@@ -672,10 +667,10 @@
"joinRejectedMessage": "Votre requête pour rejoindre une réunion a été refusée par un modérateur.",
"joinRejectedTitle": "Demande d'accès rejetée.",
"joinTitle": "Rejoindre une réunion",
"joinWithPasswordMessage": "Tentative de rejoindre avec mot de passe, patientez s'il vous plait",
"joinWithPasswordMessage": "Tentative de rejoindre avec mot de passe, patientez s'il vous plait ...",
"joiningMessage": "Vous allez rejoindre une réunion dès que quelqu'un aura accepté votre demande",
"joiningTitle": "Demander à rejoindre une réunion",
"joiningWithPasswordTitle": "Rejoindre avec mot de passe",
"joiningTitle": "Demander à rejoindre une réunion ...",
"joiningWithPasswordTitle": "Rejoindre avec mot de passe ...",
"knockButton": "Demander à rejoindre",
"knockTitle": "Quelqu'un souhaite rejoindre la réunion",
"knockingParticipantList": "Liste des participants en attente",
@@ -741,7 +736,6 @@
"connectedOneMember": "{{name}} a rejoint la réunion",
"connectedThreePlusMembers": "{{name}} et {{count}} autres personnes ont rejoint la réunion",
"connectedTwoMembers": "{{first}} et {{second}} ont rejoint la réunion",
"connectionFailed": "Connexion échouée. Veuillez réessayer plus tard !",
"dataChannelClosed": "Qualité vidéo dégradée",
"dataChannelClosedDescription": "Le canal de communication avec le Bridge a été interrompu, la qualité vidéo se trouve limitée à sa valeur la plus faible.",
"dataChannelClosedDescriptionWithAudio": "Le canal de pont est fermé, ce qui peut entraîner des perturbations de l'audio et de la vidéo.",
@@ -756,9 +750,6 @@
"gifsMenu": "GIPHY",
"groupTitle": "Notifications",
"hostAskedUnmute": "Le modérateur souhaite vous donner la parole",
"invalidTenant": "Tenant invalide",
"invalidTenantHyphenDescription": "Le tenant que vous utilisez est invalide (commence ou se termine par '-').",
"invalidTenantLengthDescription": "Le tenant que vous utilisez est trop long.",
"invitedOneMember": "{{name}} a été invité(e)",
"invitedThreePlusMembers": "{{name}} et {{count}} autres ont été invités",
"invitedTwoMembers": "{{first}} et {{second}} ont été invités",
@@ -771,7 +762,7 @@
"linkToSalesforceDescription": "Vous pouvez lier le résumé de la conférence à un objet Salesforce.",
"linkToSalesforceError": "Impossible de relier la conférence à Salesforce",
"linkToSalesforceKey": "Relier cette conférence",
"linkToSalesforceProgress": "Liaison de la conférence à Salesforce",
"linkToSalesforceProgress": "Liaison de la conférence à Salesforce...",
"linkToSalesforceSuccess": "La conférence a été reliée à Salesforce",
"localRecordingStarted": "{{name}} a commencé un enregistrement local.",
"localRecordingStopped": "{{name}} a arrêté un enregistrement local.",
@@ -795,7 +786,6 @@
"newDeviceAction": "Utiliser",
"newDeviceAudioTitle": "Nouveau périphérique audio détecté",
"newDeviceCameraTitle": "Nouvelle caméra détectée",
"nextToSpeak": "Vous êtes le prochain à prendre la parole",
"noiseSuppressionDesktopAudioDescription": "La suppression de bruit ne peut pas être activée en même temps que la partage audio du système, veuillez le désactiver et réessayer.",
"noiseSuppressionFailedTitle": "Échec du démarrage de la suppression de bruit",
"noiseSuppressionStereoDescription": "La suppression de bruit dune source stéréo nest pas encore supportée.",
@@ -830,7 +820,6 @@
"videoUnmuteBlockedDescription": "Le rétablissement de la vidéo a été bloqué temporairement en raison de limites système.",
"videoUnmuteBlockedTitle": "Rétablissement de la caméra bloqué !",
"viewLobby": "Voir la salle d'attente",
"viewParticipants": "Voir les participants",
"viewVisitors": "Voir les visiteurs",
"waitingParticipants": "{{waitingParticipants}} personnes",
"waitingVisitors": "Visiteurs en attente dans la file : {{waitingVisitors}}",
@@ -850,8 +839,6 @@
"breakoutRooms": "Salles annexes",
"goLive": "Passer en direct",
"invite": "Inviter quelqu'un",
"lowerAllHands": "Abaisser toutes les mains",
"lowerHand": "Abaisser la main",
"moreModerationActions": "Options de modération supplémentaires",
"moreModerationControls": "Options de modération supplémentaires",
"moreParticipantOptions": "Options supplémentaires pour les participants",
@@ -888,7 +875,6 @@
"submit": "Envoyer"
},
"by": "Par {{ name }}",
"closeButton": "Fermer le sondage",
"create": {
"addOption": "Ajouter une option",
"answerPlaceholder": "Option {{index}}",
@@ -925,14 +911,12 @@
"callMe": "Appelez-moi",
"callMeAtNumber": "Appelez-moi à ce numéro :",
"calling": "Appel",
"configuringDevices": "Configuration des appareils",
"configuringDevices": "Configuration des appareils ...",
"connectedWithAudioQ": "Êtes-vous connecté avec le microphone ?",
"connection": {
"failed": "Le test de connexion a échoué !",
"good": "Votre connexion Internet est bonne !",
"nonOptimal": "Votre connexion n'est pas optimale",
"poor": "Vous avez une mauvaise connexion",
"running": "Exécution du test de connexion…"
"poor": "Vous avez une mauvaise connexion"
},
"connectionDetails": {
"audioClipping": "Attendez vous à ce que votre son soit coupé.",
@@ -941,7 +925,6 @@
"goodQuality": "Impressionnant ! La qualité de vos médias sera excellente",
"noMediaConnectivity": "Nous n'avons pas pu trouver un moyen d'établir une connectivité multimédia pour ce test. Cela est généralement causé par un pare-feu ou un NAT.",
"noVideo": "Attendez vous à ce que votre qualité vidéo soit très mauvaise.",
"testFailed": "Le test de connexion a rencontré des problèmes inattendus, mais cela pourrait ne pas affecter votre expérience.",
"undetectable": "Si vous ne parvenez toujours pas à passer des appels dans le navigateur, nous vous recommandons de vous assurer que vos haut-parleurs, microphone et caméra sont correctement configurés, que vous avez accordé à votre navigateur les droits d'utiliser votre microphone et votre caméra et que la version de votre navigateur est à jour. Si vous rencontrez toujours des difficultés pour appeler, vous devez contacter le développeur de l'application Web.",
"veryPoorConnection": "Attendez vous à ce que la qualité de votre appel soit très mauvaise",
"videoFreezing": "Attendez vous à ce que votre vidéo saute, soit noire, et pixelisée.",
@@ -985,17 +968,17 @@
},
"presenceStatus": {
"busy": "Occupé",
"calling": "Appel",
"calling": "Appel ...",
"connected": "Connecté",
"connecting": "Connexion en cours",
"connecting2": "Connexion en cours*",
"connecting": "Connexion en cours ...",
"connecting2": "Connexion en cours* ...",
"disconnected": "Déconnecté",
"expired": "Expiré",
"ignored": "Ignoré",
"initializingCall": "Lancement de l'appel",
"initializingCall": "Lancement de l'appel ...",
"invited": "Invité(e)",
"rejected": "Rejeté",
"ringing": "Appel en cours"
"ringing": "Appel en cours ..."
},
"profile": {
"avatar": "avatar",
@@ -1029,7 +1012,7 @@
"errorFetchingLink": "Erreur de récupération du lien d'enregistrement.",
"expandedOff": "L'enregistrement a été arrêté",
"expandedOn": "Cette conférence est actuellement en cours d'enregistrement.",
"expandedPending": "Démarrage de l'enregistrement",
"expandedPending": "Démarrage de l'enregistrement ...",
"failedToStart": "L'enregistrement n'a pas réussi à démarrer",
"fileSharingdescription": "Partager l'enregistrement avec les participants de la réunion",
"highlight": "Souligner",
@@ -1056,8 +1039,7 @@
"on": "Enregistrement",
"onBy": "{{name}} a démarré l'enregistrement",
"onlyRecordSelf": "Enregistrer seulement mon audio et ma vidéo.",
"pending": "Préparation de l'enregistrement de la réunion",
"policyError": "Vous avez essayé de démarrer un enregistrement trop rapidement. Veuillez réessayer plus tard !",
"pending": "Préparation de l'enregistrement de la réunion ...",
"recordAudioAndVideo": "Enregistrer l'audio et la vidéo",
"recordTranscription": "Enregistrer la transcription",
"saveLocalRecording": "Sauvegarder lenregistrement local (Beta)",
@@ -1106,7 +1088,6 @@
"desktopShareWarning": "Vous devez repartager l'écran pour que ces paramètres soient utilisés.",
"devices": "Périphériques",
"followMe": "Tout le monde me suit",
"followMeRecorder": "L'enregistreur me suit",
"framesPerSecond": "images par seconde",
"incomingMessage": "un message arrive",
"language": "Langue",
@@ -1253,7 +1234,6 @@
"lobbyButton": "Activer / Désactiver le mode salle d'attente",
"localRecording": "Activer / Désactiver les contrôles d'enregistrement local",
"lockRoom": "Activer / Désactiver le mot de passe de la réunion",
"love": "Cœur",
"lowerHand": "Baisser la main",
"moreActions": "Activer / Désactiver le menu d'actions supplémentaires",
"moreActionsMenu": "Menu d'actions supplémentaires",
@@ -1271,7 +1251,6 @@
"privateMessage": "Envoyer un message privé",
"profile": "Éditer votre profil",
"raiseHand": "Lever la main",
"react": "Réactions aux messages",
"reactions": "Réactions",
"reactionsMenu": "Ouvrir / fermer le menu réactions",
"recording": "Activer / Désactiver l'enregistrement",
@@ -1343,7 +1322,6 @@
"lobbyButtonEnable": "Activer le mode salle d'attente / contrôle des participant(e)s",
"login": "Connexion",
"logout": "Déconnexion",
"love": "Cœur",
"lowerYourHand": "Baisser la main",
"moreActions": "Plus d'actions",
"moreOptions": "Plus d'options",
@@ -1369,7 +1347,6 @@
"raiseYourHand": "Lever la main",
"reactionBoo": "Envoyer réaction huer",
"reactionClap": "Envoyer réaction applaudir",
"reactionHeart": "Envoyer une réaction en forme de cœur",
"reactionLaugh": "Envoyer réaction rire",
"reactionLike": "Envoyer réaction approuver",
"reactionSilence": "Envoyer réaction silence",
@@ -1403,7 +1380,7 @@
"transcribing": {
"ccButtonTooltip": "Activer / Désactiver les sous-titres",
"expandedLabel": "La transcription est actuellement activée",
"failed": "La transcription a échoué",
"failedToStart": "Échec de démarrage de la transcription",
"labelToolTip": "La transcription de la réunion est en cours",
"sourceLanguageDesc": "Actuellement, la langue de la réunion est sélectionnée à <b>{{sourceLanguage}}</b>. <br/> Vous pouvez la changer à partir de ",
"sourceLanguageHere": "ici",
@@ -1415,7 +1392,16 @@
},
"unpinParticipant": "Désépingler - {{participantName}}",
"userMedia": {
"grantPermissions": "Veuillez autoriser le partage de votre camera et microphone."
"androidGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande votre autorisation.",
"chromeGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande votre autorisation.",
"edgeGrantPermissions": "Sélectionnez <b><i>Oui</i></b> quand le navigateur demande votre autorisation.",
"electronGrantPermissions": "Veuillez autoriser le partage de votre camera et microphone.",
"firefoxGrantPermissions": "Sélectionnez <b><i>Partager le périphérique sélectionné</i></b> lorsque votre navigateur demande votre autorisation.",
"iexplorerGrantPermissions": "Sélectionnez <b><i>OK</i></b> quand le navigateur demande votre autorisation.",
"nwjsGrantPermissions": "Veuillez autoriser le partage de votre camera et microphone.",
"operaGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande votre autorisation.",
"react-nativeGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande votre autorisation.",
"safariGrantPermissions": "Sélectionnez <b><i>OK</i></b> quand le navigateur demande votre autorisation."
},
"videoSIPGW": {
"busy": "Nous tentons de libérer les ressources requises. Veuillez réessayez dans quelques minutes.",
@@ -1494,7 +1480,7 @@
"image6": "Forêt ",
"image7": "Lever de soleil",
"none": "Rien",
"pleaseWait": "Veuillez patienter",
"pleaseWait": "Veuillez patienter...",
"removeBackground": "Supprimer l'arrière-plan",
"slightBlur": "Léger flou",
"title": "Arrière-plan virtuel",
@@ -1504,15 +1490,10 @@
},
"visitors": {
"chatIndicator": "(visiteur)",
"joinMeeting": {
"description": "Vous êtes actuellement un observateur dans cette conférence.",
"raiseHand": "Levez la main",
"title": "Rejoindre la réunion",
"wishToSpeak": "Si vous souhaitez prendre la parole, veuillez lever la main ci-dessous et attendre l'approbation du modérateur."
},
"labelTooltip": "Nombre de Visiteurs: {{count}}",
"labelTooltip": "Nombre de Visiteurs",
"notification": {
"demoteDescription": "Envoyé ici par {{actor}}, levez la main pour participer",
"description": "Pour participer lever la main.",
"noMainParticipantsDescription": "Un participant doit démarrer la réunion. Veuillez réessayer dans un moment.",
"noMainParticipantsTitle": "Cette réunion n'a pas encore commencé.",
"noVisitorLobby": "Vous ne pouvez pas rejoindre tant qu'une salle d'attente est activée pour la réunion.",

View File

@@ -29,7 +29,7 @@
"searchNumbers": "Ajouter des numéros de téléphone",
"searchPeople": "Rechercher des personnes",
"searchPeopleAndNumbers": "Rechercher des personnes ou ajouter des numéros de téléphone",
"searching": "Recherche",
"searching": "Recherche...",
"shareInvite": "Partager l'invitation à la réunion",
"shareLink": "Partager le lien de la réunion pour inviter d'autres personnes",
"shareStream": "Partager le lien de diffusion en direct",
@@ -158,11 +158,11 @@
"DISCONNECTED": "Déconnecté",
"DISCONNECTING": "Déconnexion en cours",
"ERROR": "Erreur",
"FETCH_SESSION_ID": "Obtention d'un identifiant de session",
"FETCH_SESSION_ID": "Obtention d'un identifiant de session ...",
"GET_SESSION_ID_ERROR": "Obtenir une erreur d'identifiant de session: {{code}}",
"GOT_SESSION_ID": "Obtention d'un identifiant de session Terminée",
"GOT_SESSION_ID": "Obtention d'un identifiant de session ... Terminée",
"LOW_BANDWIDTH": "La vidéo de {{displayName}} a été coupée pour économiser de la bande passante",
"RECONNECTING": "Un problème de réseau est survenu. Reconnexion en cours"
"RECONNECTING": "Un problème de réseau est survenu. Reconnexion en cours..."
},
"connectionindicator": {
"address": "Adresse :",
@@ -225,7 +225,7 @@
"openApp": "Continuer vers l'application",
"termsAndConditions": "En continuant, vous acceptez nos <a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>conditions générales dutilisation.</a>",
"title": "Démarrage de votre réunion dans {{app}} en cours…",
"titleNew": "Démarrage de votre réunion",
"titleNew": "Démarrage de votre réunion ...",
"tryAgainButton": "Veuillez réessayer sur votre ordinateur",
"unsupportedBrowser": "Il semble que vous utilisez un navigateur non supporté."
},
@@ -266,7 +266,7 @@
"WaitForHostMsg": "La conférence n'a pas encore démarré. Si vous êtes l'hôte, veuillez vous authentifier. Sinon, veuillez attendre que l'hôte arrive.",
"WaitingForHost": "En attente de l'hôte…",
"WaitingForHostButton": "Attendre l'hôte",
"WaitingForHostTitle": "En attente de l'hôte",
"WaitingForHostTitle": "En attente de l'hôte ...",
"Yes": "Oui",
"accessibilityLabel": {
"Cancel": "Annuler (quiter la fenêtre)",
@@ -676,10 +676,10 @@
"joinRejectedMessage": "Votre requête pour rejoindre une réunion a été refusée par un modérateur.",
"joinRejectedTitle": "Demande d'accès rejetée.",
"joinTitle": "Rejoindre une réunion",
"joinWithPasswordMessage": "Tentative de rejoindre avec mot de passe, patientez s'il vous plait",
"joinWithPasswordMessage": "Tentative de rejoindre avec mot de passe, patientez s'il vous plait ...",
"joiningMessage": "Vous allez rejoindre une réunion dès que quelqu'un aura accepté votre demande",
"joiningTitle": "Demander à rejoindre une réunion",
"joiningWithPasswordTitle": "Rejoindre avec mot de passe",
"joiningTitle": "Demander à rejoindre une réunion ...",
"joiningWithPasswordTitle": "Rejoindre avec mot de passe ...",
"knockButton": "Demander à rejoindre",
"knockTitle": "Quelqu'un souhaite rejoindre la réunion",
"knockingParticipantList": "Liste des participants en attente",
@@ -770,7 +770,7 @@
"linkToSalesforceDescription": "Vous pouvez lier le résumé de la conférence à un objet Salesforce.",
"linkToSalesforceError": "Impossible de relier la conférence à Salesforce",
"linkToSalesforceKey": "Relier cette conférence",
"linkToSalesforceProgress": "Liaison de la conférence à Salesforce",
"linkToSalesforceProgress": "Liaison de la conférence à Salesforce...",
"linkToSalesforceSuccess": "La conférence a été reliée à Salesforce",
"localRecordingStarted": "{{name}} a commencé un enregistrement local.",
"localRecordingStopped": "{{name}} a arrêté un enregistrement local.",
@@ -907,7 +907,7 @@
"callMe": "Appelez-moi",
"callMeAtNumber": "Appelez-moi à ce numéro :",
"calling": "Appel",
"configuringDevices": "Configuration des appareils",
"configuringDevices": "Configuration des appareils ...",
"connectedWithAudioQ": "Êtes-vous connecté avec le microphone ?",
"connection": {
"good": "Votre connexion Internet est bonne !",
@@ -966,7 +966,7 @@
"calling": "Appel en cours…",
"connected": "Connecté",
"connecting": "Connexion en cours…",
"connecting2": "Connexion en cours*",
"connecting2": "Connexion en cours*...",
"disconnected": "Déconnecté",
"expired": "Expiré",
"ignored": "Ignoré",
@@ -1381,7 +1381,16 @@
},
"unpinParticipant": "Désépingler - {{participantName}}",
"userMedia": {
"grantPermissions": "Veuillez accorder l'autorisation d'utiliser votre caméra et votre micro."
"androidGrantPermissions": "Sélectionner <b><i>Autoriser</i></b> lorsque votre navigateur vous demande l'autorisation.",
"chromeGrantPermissions": "Sélectionner <b><i>Autoriser</i></b> lorsque votre navigateur vous demande l'autorisation.",
"edgeGrantPermissions": "Sélectionner <b><i>Oui</i></b> lorsque votre navigateur demande l'autorisation.",
"electronGrantPermissions": "Veuillez accorder l'autorisation d'utiliser votre caméra et votre micro",
"firefoxGrantPermissions": "Sélectionner <b><i>Partager le dispositif sélectionné</i></b> lorsque votre navigateur demande l'autorisation.",
"iexplorerGrantPermissions": "Sélectionner <b><i>OK</i></b> lorsque votre navigateur demande l'autorisation.",
"nwjsGrantPermissions": "Veuillez accorder l'autorisation d'utiliser votre caméra et votre micro",
"operaGrantPermissions": "Sélectionner <b><i>Autoriser</i></b> lorsque votre navigateur vous demande l'autorisation.",
"react-nativeGrantPermissions": "Sélectionner <b><i>Autoriser</i></b> lorsque votre navigateur vous demande l'autorisation.",
"safariGrantPermissions": "Sélectionner <b><i>OK</i></b> lorsque votre navigateur demande l'autorisation."
},
"videoSIPGW": {
"busy": "Libération des ressources en cours. Veuillez réessayer dans quelques minutes.",
@@ -1461,7 +1470,7 @@
"image6": "Forêt ",
"image7": "Lever de soleil",
"none": "Rien",
"pleaseWait": "Veuillez patienter",
"pleaseWait": "Veuillez patienter...",
"removeBackground": "Supprimer l'arrière-plan",
"slightBlur": "Léger flou",
"title": "Arrière-plan virtuel",

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