Compare commits

...

22 Commits

Author SHA1 Message Date
Boris Grozev
7469e7fa3d chore(package.json): Update js-utils 2020-04-01 08:59:47 -05:00
paweldomas
c170970992 feat(Filmstrip): accessibility label for toggle filmstrip button 2020-04-01 08:49:12 -05:00
Saúl Ibarra Corretgé
d19a659871 ios: update Crasshlytics and fix uploadding symbols 2020-04-01 15:31:28 +02:00
Saúl Ibarra Corretgé
955b24be9d rn,cc: add feature-flag to disable close captions 2020-04-01 15:29:21 +02:00
Saúl Ibarra Corretgé
de6c7e0117 rn,invite: add share button to add people dialog 2020-04-01 15:26:29 +02:00
Bettenbuk Zoltan
feb8fe9e34 api: add private message flag to outgoingMessage 2020-04-01 11:58:48 +02:00
Steve Frécinaux
aff6d4b36d Fix mod_muc_max_occupants to properly ignore whitelisted users
In a typical Jitsi Meet setup, this plugin can be used to limit the number of
occupants in a meeting room, while ignoring "utility" users. Such a
configuration could be:

    muc_max_occupants = 2
    muc_access_whitelist = {
        "focus@auth.meet.jitsi";
    }

It would be expected that this configuration allows two users to attend the
meeting room, but in practice only one is allowed, because the whitelist is not
honoured.

This commit fixes it by actually updating the `user` and `domain` variables
being checked. After this change, the scenario above works just fine.
2020-03-31 16:38:23 -05:00
damencho
45c60717d6 debian: add post remove script for jitsi-meet-turnserver package
Reloads the webserver as the config had changed.
2020-03-31 16:27:25 -05:00
Saúl Ibarra Corretgé
6596e27f69 Prevent meetings from being crawled by Google 2020-03-31 21:45:28 +02:00
Saúl Ibarra Corretgé
8cba7e91d3 ci: build the frontend in GH actions
It should help catch bugs such as bundle bloat easier.
2020-03-31 21:44:48 +02:00
Hristo Terezov
3a871cbed8 feat(remote-menu):option for disable mute and kick 2020-03-31 10:06:30 -05:00
Bettenbuk Zoltan
a46fd60788 fix: accented room name display 2020-03-31 14:16:21 +02:00
Juri
97735ff548 lang: fix Estonian translations 2020-03-31 13:10:38 +02:00
James Baird
9fdc18d1ec welcome: hide tabs if nothing to show 2020-03-31 13:06:04 +02:00
Bartosz Dziewoński
4a21882345 lang: translation improvements and corrections for Polish 2020-03-31 09:43:13 +02:00
damencho
cb0cea4ebd Adds a note to re-run Let’s Encrypt script on jetty upgrade. 2020-03-31 09:36:30 +02:00
damencho
b894daa9cf Cleans created users on purging. 2020-03-31 09:36:30 +02:00
damencho
06641a7dd6 This is to prevent item-not-found when multiple users try to join at the same time.
This is to prevent item-not-found when multiple users try to join while jicofo is still configuring the room. Credits @paweldomas
2020-03-31 09:36:30 +02:00
Saúl Ibarra Corretgé
94f7b570d7 debian: fix creating internal MUC 2020-03-30 17:01:27 -05:00
Saúl Ibarra Corretgé
ca5605620a rn: update versions, apps 20.2, sdk 2.7 2020-03-30 15:45:16 +02:00
nicolae-stroncea
8d0202113a doc: clarify required Node / npm versions 2020-03-30 15:09:43 +02:00
Julian1203
f2e59226c0 lang: update german translation 2020-03-30 15:05:31 +02:00
48 changed files with 667 additions and 306 deletions

View File

@@ -1,10 +1,10 @@
name: Linter
name: Simple CI
on: [pull_request]
jobs:
run-linter:
name: Run Linter
run-ci:
name: Build Frontend
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
@@ -13,3 +13,4 @@ jobs:
node-version: '12.x'
- run: npm install
- run: npm run lint
- run: make

View File

@@ -20,5 +20,5 @@
android.useAndroidX=true
android.enableJetifier=true
appVersion=20.1.0
sdkVersion=2.6.0
appVersion=20.2.0
sdkVersion=2.8.0

View File

@@ -459,6 +459,15 @@ var config = {
// downloadAppsUrl: 'https://docs.example.com/our-apps.html'
// },
// Options related to the remote participant menu.
// remoteVideoMenu: {
// // If set to true the 'Kick out' button will be disabled.
// disableKick: true
// },
// If set to true all muting operations of remote participants will be disabled.
// disableRemoteMute: true,
// List of undocumented settings used in jitsi-meet
/**
_immediateReloadThreshold

View File

@@ -136,7 +136,7 @@ case "$1" in
echo -e "\nComponent \"internal.auth.$JVB_HOSTNAME\" \"muc\"" >> $PROSODY_HOST_CONFIG
echo -e " storage = \"null\"" >> $PROSODY_HOST_CONFIG
echo -e " modules_enabled = { \"ping\"; }" >> $PROSODY_HOST_CONFIG
echo -e " admins = { \"focusUser@auth.jitmeet.example.com\", \"jvb@auth.jitmeet.example.com\" }" >> $PROSODY_HOST_CONFIG
echo -e " admins = { \"$JICOFO_AUTH_USER@auth.$JVB_HOSTNAME\", \"jvb@auth.$JVB_HOSTNAME\" }" >> $PROSODY_HOST_CONFIG
fi
if [ ! -f /var/lib/prosody/$JVB_HOSTNAME.crt ]; then

View File

@@ -36,13 +36,17 @@ case "$1" in
rm -f /etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua
rm -f /etc/prosody/conf.d/$JVB_HOSTNAME.cfg.lua
JICOFO_AUTH_DOMAIN="auth.$JVB_HOSTNAME"
# clean up generated certificates
rm -f /etc/prosody/certs/$JVB_HOSTNAME.crt
rm -f /etc/prosody/certs/$JVB_HOSTNAME.key
rm -f /etc/prosody/certs/auth.$JVB_HOSTNAME.crt
rm -f /etc/prosody/certs/auth.$JVB_HOSTNAME.key
rm -rf /var/lib/prosody/auth.$JVB_HOSTNAME.*
rm -f /etc/prosody/certs/$JICOFO_AUTH_DOMAIN.crt
rm -f /etc/prosody/certs/$JICOFO_AUTH_DOMAIN.key
rm -rf /var/lib/prosody/$JICOFO_AUTH_DOMAIN.*
rm -rf /var/lib/prosody/$JVB_HOSTNAME.*
# clean created users
rm -rf /var/lib/prosody/`echo $JICOFO_AUTH_DOMAIN | sed -e "s/\./%2e/g"`
fi
# Clear the debconf variable

60
debian/jitsi-meet-turnserver.postrm vendored Normal file
View File

@@ -0,0 +1,60 @@
#!/bin/sh
# postrm script for jitsi-meet-turnserver
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <postrm> `remove'
# * <postrm> `purge'
# * <old-postrm> `upgrade' <new-version>
# * <new-postrm> `failed-upgrade' <old-version>
# * <new-postrm> `abort-install'
# * <new-postrm> `abort-install' <old-version>
# * <new-postrm> `abort-upgrade' <old-version>
# * <disappearer's-postrm> `disappear' <overwriter>
# <overwriter-version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
# Load debconf
. /usr/share/debconf/confmodule
case "$1" in
remove)
if [ -x "/etc/init.d/nginx" ]; then
invoke-rc.d nginx reload || true
fi
if [ -x "/etc/init.d/apache2" ]; then
invoke-rc.d apache2 reload || true
fi
;;
purge)
if [ -x "/etc/init.d/nginx" ]; then
invoke-rc.d nginx reload || true
fi
if [ -x "/etc/init.d/apache2" ]; then
invoke-rc.d apache2 reload || true
fi
# Clear the debconf variable
db_purge
;;
upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
;;
*)
echo "postrm called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
db_stop
exit 0

View File

@@ -120,6 +120,8 @@ case "$1" in
echo ""
echo "You are using jetty to serve jitsi-meet, we are now upgrading you to use nginx!"
echo ""
echo "If you are using Lets Encrypt certificates please re-run the script."
echo ""
echo "------------------------------------------------"
echo ""

View File

@@ -11,4 +11,5 @@ fonts /usr/share/jitsi-meet/
images /usr/share/jitsi-meet/
lang /usr/share/jitsi-meet/
connection_optimization /usr/share/jitsi-meet/
resources/robots.txt /usr/share/jitsi-meet/
resources/*.sh /usr/share/jitsi-meet/scripts/

View File

@@ -50,6 +50,8 @@ Component "conference.jitmeet.example.com" "muc"
-- "token_verification";
}
admins = { "focusUser@auth.jitmeet.example.com" }
muc_room_locking = false
muc_room_default_public_jids = true
-- internal muc component
Component "internal.auth.jitmeet.example.com" "muc"

View File

@@ -225,6 +225,8 @@ npm install
make
```
_NOTE: When installing on older distributions keep in mind that you need Node.js >= 10 and npm >= 6._
Edit host names in `/srv/jitsi-meet/config.js` (see also the example config file):
```
var config = {

View File

@@ -5,10 +5,10 @@ require_relative '../node_modules/@react-native-community/cli-platform-ios/nativ
target 'jitsi-meet' do
project 'app/app.xcodeproj'
pod 'Crashlytics', '~> 3.12.0'
pod 'Fabric', '~> 1.9.0'
pod 'Firebase/Core', '~> 5.18.0'
pod 'Firebase/DynamicLinks', '~> 5.18.0'
pod 'Crashlytics', '~> 3.14.0'
pod 'Fabric', '~> 1.10.2'
pod 'Firebase/Core', '~> 6.16.0'
pod 'Firebase/DynamicLinks', '~> 6.16.0'
end
target 'JitsiMeet' do

View File

@@ -11,10 +11,10 @@ PODS:
- CocoaLumberjack (3.5.3):
- CocoaLumberjack/Core (= 3.5.3)
- CocoaLumberjack/Core (3.5.3)
- Crashlytics (3.12.0):
- Fabric (~> 1.9.0)
- Crashlytics (3.14.0):
- Fabric (~> 1.10.2)
- DoubleConversion (1.1.6)
- Fabric (1.9.0)
- Fabric (1.10.2)
- FBLazyVector (0.61.5-jitsi.1)
- FBReactNativeSpec (0.61.5-jitsi.1):
- Folly (= 2018.10.22.00)
@@ -23,34 +23,48 @@ PODS:
- React-Core (= 0.61.5-jitsi.1)
- React-jsi (= 0.61.5-jitsi.1)
- ReactCommon/turbomodule/core (= 0.61.5-jitsi.1)
- Firebase/Core (5.18.0):
- Firebase/Core (6.16.0):
- Firebase/CoreOnly
- FirebaseAnalytics (= 5.7.0)
- Firebase/CoreOnly (5.18.0):
- FirebaseCore (= 5.3.1)
- Firebase/DynamicLinks (5.18.0):
- FirebaseAnalytics (= 6.2.2)
- Firebase/CoreOnly (6.16.0):
- FirebaseCore (= 6.6.1)
- Firebase/DynamicLinks (6.16.0):
- Firebase/CoreOnly
- FirebaseDynamicLinks (= 3.4.1)
- FirebaseAnalytics (5.7.0):
- FirebaseCore (~> 5.3)
- FirebaseInstanceID (~> 3.6)
- GoogleAppMeasurement (= 5.7.0)
- GoogleUtilities/AppDelegateSwizzler (~> 5.2)
- GoogleUtilities/MethodSwizzler (~> 5.2)
- GoogleUtilities/Network (~> 5.2)
- "GoogleUtilities/NSData+zlib (~> 5.2)"
- nanopb (~> 0.3)
- FirebaseAnalyticsInterop (1.2.0)
- FirebaseCore (5.3.1):
- GoogleUtilities/Logger (~> 5.2)
- FirebaseDynamicLinks (3.4.1):
- FirebaseAnalytics (~> 5.1)
- FirebaseAnalyticsInterop (~> 1.0)
- FirebaseCore (~> 5.2)
- FirebaseInstanceID (3.7.0):
- FirebaseCore (~> 5.2)
- GoogleUtilities/Environment (~> 5.2)
- GoogleUtilities/UserDefaults (~> 5.2)
- FirebaseDynamicLinks (~> 4.0.6)
- FirebaseAnalytics (6.2.2):
- FirebaseCore (~> 6.6)
- FirebaseInstanceID (~> 4.3)
- GoogleAppMeasurement (= 6.2.2)
- GoogleUtilities/AppDelegateSwizzler (~> 6.0)
- GoogleUtilities/MethodSwizzler (~> 6.0)
- GoogleUtilities/Network (~> 6.0)
- "GoogleUtilities/NSData+zlib (~> 6.0)"
- nanopb (= 0.3.9011)
- FirebaseAnalyticsInterop (1.5.0)
- FirebaseCore (6.6.1):
- FirebaseCoreDiagnostics (~> 1.2)
- FirebaseCoreDiagnosticsInterop (~> 1.2)
- GoogleUtilities/Environment (~> 6.5)
- GoogleUtilities/Logger (~> 6.5)
- FirebaseCoreDiagnostics (1.2.2):
- FirebaseCoreDiagnosticsInterop (~> 1.2)
- GoogleDataTransportCCTSupport (~> 2.0)
- GoogleUtilities/Environment (~> 6.5)
- GoogleUtilities/Logger (~> 6.5)
- nanopb (~> 0.3.901)
- FirebaseCoreDiagnosticsInterop (1.2.0)
- FirebaseDynamicLinks (4.0.8):
- FirebaseAnalyticsInterop (~> 1.3)
- FirebaseCore (~> 6.2)
- FirebaseInstallations (1.1.1):
- FirebaseCore (~> 6.6)
- GoogleUtilities/UserDefaults (~> 6.5)
- PromisesObjC (~> 1.2)
- FirebaseInstanceID (4.3.2):
- FirebaseCore (~> 6.6)
- FirebaseInstallations (~> 1.0)
- GoogleUtilities/Environment (~> 6.5)
- GoogleUtilities/UserDefaults (~> 6.5)
- Folly (2018.10.22.00):
- boost-for-react-native
- DoubleConversion
@@ -61,33 +75,37 @@ PODS:
- DoubleConversion
- glog
- glog (0.3.5)
- GoogleAppMeasurement (5.7.0):
- GoogleUtilities/AppDelegateSwizzler (~> 5.2)
- GoogleUtilities/MethodSwizzler (~> 5.2)
- GoogleUtilities/Network (~> 5.2)
- "GoogleUtilities/NSData+zlib (~> 5.2)"
- nanopb (~> 0.3)
- GoogleAppMeasurement (6.2.2):
- GoogleUtilities/AppDelegateSwizzler (~> 6.0)
- GoogleUtilities/MethodSwizzler (~> 6.0)
- GoogleUtilities/Network (~> 6.0)
- "GoogleUtilities/NSData+zlib (~> 6.0)"
- nanopb (= 0.3.9011)
- GoogleDataTransport (5.1.0)
- GoogleDataTransportCCTSupport (2.0.1):
- GoogleDataTransport (~> 5.1)
- nanopb (~> 0.3.901)
- GoogleSignIn (5.0.1):
- AppAuth (~> 1.2)
- GTMAppAuth (~> 1.0)
- GTMSessionFetcher/Core (~> 1.1)
- GoogleUtilities/AppDelegateSwizzler (5.4.1):
- GoogleUtilities/AppDelegateSwizzler (6.5.2):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Environment (5.4.1)
- GoogleUtilities/Logger (5.4.1):
- GoogleUtilities/Environment (6.5.2)
- GoogleUtilities/Logger (6.5.2):
- GoogleUtilities/Environment
- GoogleUtilities/MethodSwizzler (5.4.1):
- GoogleUtilities/MethodSwizzler (6.5.2):
- GoogleUtilities/Logger
- GoogleUtilities/Network (5.4.1):
- GoogleUtilities/Network (6.5.2):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (5.4.1)"
- GoogleUtilities/Reachability (5.4.1):
- "GoogleUtilities/NSData+zlib (6.5.2)"
- GoogleUtilities/Reachability (6.5.2):
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (5.4.1):
- GoogleUtilities/UserDefaults (6.5.2):
- GoogleUtilities/Logger
- GTMAppAuth (1.0.0):
- AppAuth/Core (~> 1.0)
@@ -97,12 +115,13 @@ PODS:
- GTMSessionFetcher/Core (1.2.2)
- GTMSessionFetcher/Full (1.2.2):
- GTMSessionFetcher/Core (= 1.2.2)
- nanopb (0.3.901):
- nanopb/decode (= 0.3.901)
- nanopb/encode (= 0.3.901)
- nanopb/decode (0.3.901)
- nanopb/encode (0.3.901)
- nanopb (0.3.9011):
- nanopb/decode (= 0.3.9011)
- nanopb/encode (= 0.3.9011)
- nanopb/decode (0.3.9011)
- nanopb/encode (0.3.9011)
- ObjectiveDropboxOfficial (3.9.4)
- PromisesObjC (1.2.8)
- RCTRequired (0.61.5-jitsi.1)
- RCTTypeSafety (0.61.5-jitsi.1):
- FBLazyVector (= 0.61.5-jitsi.1)
@@ -352,13 +371,13 @@ DEPENDENCIES:
- Amplitude-iOS (~> 4.0.4)
- BVLinearGradient (from `../node_modules/react-native-linear-gradient`)
- CocoaLumberjack (~> 3.5.3)
- Crashlytics (~> 3.12.0)
- Crashlytics (~> 3.14.0)
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
- Fabric (~> 1.9.0)
- Fabric (~> 1.10.2)
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector/`)
- FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec/`)
- Firebase/Core (~> 5.18.0)
- Firebase/DynamicLinks (~> 5.18.0)
- Firebase/Core (~> 6.16.0)
- Firebase/DynamicLinks (~> 6.16.0)
- Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`)
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
- ObjectiveDropboxOfficial (~> 3.9.4)
@@ -401,23 +420,29 @@ SPEC REPOS:
- Amplitude-iOS
- boost-for-react-native
- CocoaLumberjack
- ObjectiveDropboxOfficial
trunk:
- AppAuth
- Crashlytics
- Fabric
- Firebase
- FirebaseAnalytics
- FirebaseAnalyticsInterop
- FirebaseCore
- FirebaseCoreDiagnostics
- FirebaseCoreDiagnosticsInterop
- FirebaseDynamicLinks
- FirebaseInstallations
- FirebaseInstanceID
- GoogleAppMeasurement
- GoogleUtilities
- nanopb
- ObjectiveDropboxOfficial
trunk:
- AppAuth
- GoogleDataTransport
- GoogleDataTransportCCTSupport
- GoogleSignIn
- GoogleUtilities
- GTMAppAuth
- GTMSessionFetcher
- nanopb
- PromisesObjC
EXTERNAL SOURCES:
BVLinearGradient:
@@ -501,26 +526,32 @@ SPEC CHECKSUMS:
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
CocoaLumberjack: 2f44e60eb91c176d471fdba43b9e3eae6a721947
Crashlytics: 07fb167b1694128c1c9a5a5cc319b0e9c3ca0933
Crashlytics: 540b7e5f5da5a042647227a5e3ac51d85eed06df
DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2
Fabric: f988e33c97f08930a413e08123064d2e5f68d655
Fabric: 706c8b8098fff96c33c0db69cbf81f9c551d0d74
FBLazyVector: 4a5251159a3ed05dc11cc8b74cf937869935814b
FBReactNativeSpec: 6fa602a20993212cc9877a81838578ffb0008bc9
Firebase: 02f3281965c075426141a0ce1277e9de6649cab9
FirebaseAnalytics: 23851fe602c872130a2c5c55040b302120346cc2
FirebaseAnalyticsInterop: efbe45c8385ec626e29f9525e5ebd38520dfb6c1
FirebaseCore: 52f851b30e11360f1e67cf04b1edfebf0a47a2d3
FirebaseDynamicLinks: f209c3caccd82102caa0e91d393e3ccc593501fd
FirebaseInstanceID: bd6fc5a258884e206fd5c474ebe4f5b00e21770e
Firebase: 497158b816d0a86fc31babbd05546fcd7e6083ff
FirebaseAnalytics: cf95d3aab897612783020fbd98401d5366f135ee
FirebaseAnalyticsInterop: 3f86269c38ae41f47afeb43ebf32a001f58fcdae
FirebaseCore: 85064903ed6c28e47fec9c7bd149d94ba1b6b6e7
FirebaseCoreDiagnostics: e9b4cd8ba60dee0f2d13347332e4b7898cca5b61
FirebaseCoreDiagnosticsInterop: 296e2c5f5314500a850ad0b83e9e7c10b011a850
FirebaseDynamicLinks: 417dc6dbb6013233c77558290d73296f429656a6
FirebaseInstallations: acb3216eb9784d3b1d2d2d635ff74fa892cc0c44
FirebaseInstanceID: 7ee0d6777013bb952f377b41965bf132b6a075be
Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51
glog: 1f3da668190260b06b429bb211bfbee5cd790c28
GoogleAppMeasurement: 6cf307834da065863f9faf4c0de0a936d81dd832
GoogleAppMeasurement: d0560d915abf15e692e8538ba1d58442217b6aff
GoogleDataTransport: b29a21d813e906014ca16c00897827e40e4a24ab
GoogleDataTransportCCTSupport: 6f15a89b0ca35d6fa523e1f752ef818588885988
GoogleSignIn: 3a51b9bb8e48b635fd7f4272cee06ca260345b86
GoogleUtilities: 1e25823cbf46540b4284f6ef8e17b3a68ee12bbc
GoogleUtilities: ad0f3b691c67909d03a3327cc205222ab8f42e0e
GTMAppAuth: 4deac854479704f348309e7b66189e604cf5e01e
GTMSessionFetcher: 61bb0f61a4cb560030f1222021178008a5727a23
nanopb: 2901f78ea1b7b4015c860c2fdd1ea2fee1a18d48
nanopb: 18003b5e52dab79db540fe93fe9579f399bd1ccd
ObjectiveDropboxOfficial: a5afefc83f6467c42c45f2253f583f2ad1ffc701
PromisesObjC: c119f3cd559f50b7ae681fa59dc1acd19173b7e6
RCTRequired: f63dd90a89a60602acdd44c42e5d2645ca60ab79
RCTTypeSafety: 24a3c6d55684046ed550b1d0ef083a9bf71c8bd4
React: 71c5a51135f291c3b32c0b558e167b858ae50e84
@@ -553,6 +584,6 @@ SPEC CHECKSUMS:
RNWatch: 09738b339eceb66e4d80a2371633ca5fb380fa42
Yoga: 7b4209fda2441f99d54dd6cf4c82b094409bb68f
PODFILE CHECKSUM: 0fdfa45ae809c9460c80be3e0d4bbb822fccc418
PODFILE CHECKSUM: f615794fb9184757b00cd16e534824ba6ee2fc98
COCOAPODS: 1.8.4

View File

@@ -293,7 +293,7 @@
B35383AD1DDA0083008F406A /* Adjust embedded framework architectures */,
0BB7DA181EC9E695007AAE98 /* Adjust ATS */,
DEF4813D224925A2002AD03A /* Copy Google Plist file */,
DEC2069321CBBD6900072F03 /* Setup Fabric */,
DEC2069321CBBD6900072F03 /* Setup Crashlytics */,
DE11877A21EE09640078D059 /* Setup Google reverse URL handler */,
DE4F6D6E22005C0400DE699E /* Setup Dropbox */,
0BEA5C491F7B8F73000D0AB4 /* Embed Watch Content */,
@@ -492,7 +492,7 @@
shellPath = /bin/sh;
shellScript = "INFO_PLIST=\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"\nDROPBOX_KEY_FILE=\"$PROJECT_DIR/dropbox.key\"\n\nif [[ -f $DROPBOX_KEY_FILE ]]; then\n /usr/libexec/PlistBuddy -c \"Delete :LSApplicationQueriesSchemes\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes array\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes:0 string 'dbapi-2'\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes:1 string 'dbapi-8-emm'\" $INFO_PLIST\n\n DROPBOX_KEY=$(head -n 1 $DROPBOX_KEY_FILE)\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLName string dropbox\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLSchemes array\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLSchemes:0 string $DROPBOX_KEY\" $INFO_PLIST\nfi\n";
};
DEC2069321CBBD6900072F03 /* Setup Fabric */ = {
DEC2069321CBBD6900072F03 /* Setup Crashlytics */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -501,14 +501,14 @@
);
inputPaths = (
);
name = "Setup Fabric";
name = "Setup Crashlytics";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "${PODS_ROOT}/Fabric/run\n";
shellScript = "GOOGLE_PLIST=\"$PROJECT_DIR/GoogleService-Info.plist\"\n\nif [[ -f $GOOGLE_PLIST ]]; then\n if [ \"${CONFIGURATION}\" != \"Debug\" ]; then\n find \"${DWARF_DSYM_FOLDER_PATH}\" -name \"*.dSYM\" | xargs -I \\{\\} ${PODS_ROOT}/Fabric/upload-symbols -gsp $GOOGLE_PLIST -p ios \\{\\}\n fi\nfi\n";
};
DEF4813D224925A2002AD03A /* Copy Google Plist file */ = {
isa = PBXShellScriptBuildPhase;

View File

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

View File

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

View File

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

View File

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

View File

@@ -28,5 +28,5 @@
"tr": "Turco",
"vi": "Vietnamita",
"zhCN": "Chino (China)",
"zhTW": "Chino (Taiwan)\"msgstr \""
"zhTW": "Chino (Taiwan)"
}

View File

@@ -28,5 +28,5 @@
"tr": "Turco",
"vi": "Vietnamita",
"zhCN": "Chino (China)",
"zhTW": "Chino (Taiwan)\"msgstr \""
"zhTW": "Chino (Taiwan)"
}

View File

@@ -28,5 +28,5 @@
"tr": "Török",
"vi": "Vietnámi",
"zhCN": "Kínai (Kína)",
"zhTW": "Kínai (Tajvan)\"msgstr \""
"zhTW": "Kínai (Tajvan)"
}

View File

@@ -1,32 +1,32 @@
{
"en": "Angielski",
"af": "Afrykanerski",
"bg": "Bułgarski",
"ca": "Kataloński",
"cs": "Czeski",
"de": "Niemiecki",
"el": "Grecki",
"enGB": "Angielski (Zjednoczone Królestwo)",
"eo": "Esperanto",
"es": "Hiszpański",
"esUS": "Hiszpański (Ameryka Łacińska)",
"fi": "Fiński",
"fr": "Francuski",
"frCA": "Francuski (kanadyjski)",
"hr": "Chorwacki",
"hu": "Węgierski",
"hy": "Ormiański",
"it": "Włoski",
"ja": "Japoński",
"ko": "Koreański",
"nl": "Holenderski",
"oc": "Oksytański",
"pl": "Polski",
"ptBR": "Portugalski (brazylijski)",
"ru": "Rosyjski",
"sv": "Szwedzki",
"tr": "Turecki",
"vi": "Wietnamski",
"zhCN": "Chiński (Chiny)",
"zhTW": "Chiński (Tajwan)\"msgstr \""
"en": "angielski",
"af": "afrykanerski",
"bg": "bułgarski",
"ca": "kataloński",
"cs": "czeski",
"de": "niemiecki",
"el": "grecki",
"enGB": "angielski (Zjednoczone Królestwo)",
"eo": "esperanto",
"es": "hiszpański",
"esUS": "hiszpański (Ameryka Łacińska)",
"fi": "fiński",
"fr": "francuski",
"frCA": "francuski (kanadyjski)",
"hr": "chorwacki",
"hu": "węgierski",
"hy": "ormiański",
"it": "włoski",
"ja": "japoński",
"ko": "koreański",
"nl": "holenderski",
"oc": "oksytański",
"pl": "polski",
"ptBR": "portugalski (brazylijski)",
"ru": "rosyjski",
"sv": "szwedzki",
"tr": "turecki",
"vi": "wietnamski",
"zhCN": "chiński (Chiny)",
"zhTW": "chiński (Tajwan)"
}

View File

@@ -28,5 +28,5 @@
"tr": "Turco",
"vi": "Vietnamita",
"zhCN": "Chinês (China)",
"zhTW": "Chinês (Taiwan)\"msgstr \""
"zhTW": "Chinês (Taiwan)"
}

View File

@@ -28,5 +28,5 @@
"tr": "Turkish",
"vi": "Vietnamese",
"zhCN": "中文 简体 (中国)",
"zhTW": "中文 正體 (台灣)\"msgstr \""
"zhTW": "中文 正體 (台灣)"
}

View File

@@ -20,7 +20,7 @@
"audioDevices": {
"bluetooth": "Bluetooth",
"headphones": "Kopfhörer",
"phone": "Telefon",
"phone": "Hörer",
"speaker": "Lautsprecher",
"none": "Keine Audiogeräte verfügbar"
},
@@ -29,19 +29,19 @@
},
"calendarSync": {
"addMeetingURL": "Meeting-Link hinzufügen",
"confirmAddLink": "Wollen Sie einen Jitsi-Link zu dieser Veranstaltung hinzufügen?",
"confirmAddLink": "Wollen Sie einen Jitsi-Link zu diesem Termin hinzufügen?",
"error": {
"appConfiguration": "Kalenderintegration ist nicht richtig konfiguriert.",
"generic": "Ein Fehler ist aufgetreten. Prüfen Sie Ihre Kalendereinstellungen oder versuchen Sie, den Kalender zu aktualisieren.",
"notSignedIn": "Ein Fehler ist während der Authentifizierung zur Anzeige von Kalendererveranstaltungen aufgetreten. Prüfen Sie Ihre Kalendereinstellungen oder versuchen Sie, sich erneut anzumelden."
"notSignedIn": "Ein Fehler ist während der Authentifizierung zur Anzeige von Kalenderertermine aufgetreten. Prüfen Sie Ihre Kalendereinstellungen oder versuchen Sie, sich erneut anzumelden."
},
"join": "Teilnehmen",
"joinTooltip": "Am Meeting teilnehmen",
"nextMeeting": "Nächste Konferenz",
"noEvents": "Es sind keine bevorstehenden Veranstaltungen geplant.",
"noEvents": "Es gibt keine bevorstehenden Termine.",
"ongoingMeeting": "Laufendes Meeting",
"permissionButton": "Einstellungen öffnen",
"permissionMessage": "Die App benötigt Zugriff auf den Kalender, um die Termine und Konferenzen anzuzeigen.",
"permissionMessage": "Die App benötigt Zugriff auf den Kalender, um Termine und Konferenzen anzuzeigen.",
"refresh": "Kalender aktualisieren",
"today": "Heute"
},
@@ -78,9 +78,9 @@
"DISCONNECTING": "Verbindung wird getrennt",
"ERROR": "Fehler",
"FETCH_SESSION_ID": "Sitzungs-ID erhalten...",
"GET_SESSION_ID_ERROR": "Session-ID-Fehler erhalten: {{code}}",
"GET_SESSION_ID_ERROR": "Sitzungs-ID-Fehler erhalten: {{code}}",
"GOT_SESSION_ID": "Sitzungs-ID erhalten... Beendet",
"LOW_BANDWIDTH": "Video für {{displayName}} wurde ausgeschaltet um Bandbreite einzusparen"
"LOW_BANDWIDTH": "Video für {{displayName}} wurde ausgeschaltet, um Bandbreite einzusparen"
},
"connectionindicator": {
"address": "Adresse:",
@@ -119,9 +119,9 @@
"yesterday": "Gestern"
},
"deepLinking": {
"appNotInstalled": "Sie benötigen die {{app}}-App, um der Konferenz auf dem Smartphone beizutreten.",
"appNotInstalled": "Sie benötigen die {{app}}-App, um der Konferenz auf dem Smartphone beizutreten.",
"description": "Nichts passiert? Wir haben versucht, die Konferenz in {{app}} zu öffnen. Versuchen Sie es erneut oder treten Sie der Konferenz in {{app}} im Web bei.",
"descriptionWithoutWeb": "Ist nichts passiert? Wir haben versucht, Ihre Besprechung in der {{{app}}} Desktop-App zu starten.",
"descriptionWithoutWeb": "Ist nichts passiert? Wir haben versucht, Ihre Besprechung in der {{{app}}}“-Desktop-App zu starten.",
"downloadApp": "App herunterladen",
"launchWebButton": "Im Web öffnen",
"openApp": "In der App fortfahren",
@@ -153,13 +153,13 @@
"Back": "Zurück",
"cameraConstraintFailedError": "Ihre Kamera erfüllt die notwendigen Anforderungen nicht.",
"cameraNotFoundError": "Kamera nicht gefunden.",
"cameraNotSendingData": "Die Kamera ist nicht verfügbar. Bitte prüfen ob eine andere Applikation die Kamera verwendet, eine andere Kamera vom Einstellungs-Menu auswählen oder die Applikation neu laden.",
"cameraNotSendingData": "Die Kamera ist nicht verfügbar. Bitte prüfen, ob eine andere Applikation die Kamera verwendet, eine andere Kamera vom Einstellungs-Menü auswählen oder die Applikation neu laden.",
"cameraNotSendingDataTitle": "Zugriff auf Kamera nicht möglich",
"cameraPermissionDeniedError": "Die Berechtigung zur Verwendung der Kamera wurde nicht erteilt. Sie können trotzdem an der Konferenz teilnehmen, aber die anderen Teilnehmer können Sie nicht sehen. Verwenden Sie die Kamera-Schaltfläche in der Adressleiste um die Berechtigungen zu erteilen.",
"cameraUnknownError": "Die Kamera kann aus einem unbekannten Grund nicht verwendet werden.",
"cameraUnsupportedResolutionError": "Die Kamera unterstützt die erforderliche Auflösung nicht.",
"Cancel": "Abbrechen",
"close": "Schliessen",
"close": "Schließen",
"conferenceDisconnectMsg": "Prüfen Sie allenfalls Ihre Netzwerkverbindung. Verbinde in {{seconds}} Sekunden...",
"conferenceDisconnectTitle": "Ihre Verbindung ist getrennt worden.",
"conferenceReloadMsg": "Wir versuchen das zu beheben. Verbinde in {{seconds}} Sekunden...",
@@ -177,14 +177,14 @@
"done": "Fertig",
"enterDisplayName": "Bitte geben Sie hier Ihren Namen ein",
"error": "Fehler",
"externalInstallationMsg": "Die Bildschirmfreigabeerweiterung muss installiert werden.",
"externalInstallationMsg": "Die Bildschirmfreigabe-Erweiterung muss installiert werden.",
"externalInstallationTitle": "Erweiterung erforderlich",
"goToStore": "Zum Store",
"gracefulShutdown": "Der Dienst steht momentan wegen Wartungsarbeiten nicht zur Verfügung. Bitte versuchen Sie es später noch einmal.",
"IamHost": "Ich bin der Organisator",
"incorrectRoomLockPassword": "Falsches Passwort",
"incorrectPassword": "Benutzername oder Passwort ungültig",
"inlineInstallationMsg": "Die Bildschirmfreigabeerweiterung muss installiert werden.",
"inlineInstallationMsg": "Die Bildschirmfreigabe-Erweiterung muss installiert werden.",
"inlineInstallExtension": "Jetzt installieren",
"internalError": "Oh! Es hat etwas nicht funktioniert. Der folgende Fehler ist aufgetreten: {{error}}",
"internalErrorTitle": "Interner Fehler",
@@ -193,9 +193,9 @@
"kickParticipantDialog": "Wollen Sie diesen Teilnehmer wirklich entfernen?",
"kickParticipantTitle": "Teilnehmer stummschalten?",
"kickTitle": "Autsch! {{participantDisplayName}} hat Sie aus dem Meeting geworfen.",
"liveStreaming": "Live-Streaming",
"liveStreamingDisabledForGuestTooltip": "Gäste können kein Live-Streaming starten.",
"liveStreamingDisabledTooltip": "Starten des Live-Streams deaktiviert.",
"liveStreaming": "Livestreaming",
"liveStreamingDisabledForGuestTooltip": "Gäste können kein Livestreaming starten.",
"liveStreamingDisabledTooltip": "Starten des Livestreams deaktiviert.",
"lockMessage": "Die Konferenz konnte nicht gesperrt werden.",
"lockRoom": "Meeting $t(lockRoomPasswordUppercase) hinzufügen",
"lockTitle": "Sperren fehlgeschlagen",
@@ -210,7 +210,7 @@
"micPermissionDeniedError": "Die Berechtigung zur Verwendung des Mikrofons wurde nicht erteilt. Sie können trotzdem an der Konferenz teilnehmen, aber die anderen Teilnehmer können Sie nicht hören. Verwenden Sie die Kamera-Schaltfläche in der Adressleiste um die Berechtigungen zu erteilen.",
"micUnknownError": "Das Mikrofon kann aus einem unbekannten Grund nicht verwendet werden.",
"muteEveryoneElseDialog": "Einmal stummgeschaltet, können Sie deren Stummschaltung nicht mehr beenden, aber sie können ihre Stummschaltung jederzeit selbst beenden.",
"muteEveryoneElseTitle": "Alle ausser {{whom}} stummschaten?",
"muteEveryoneElseTitle": "Alle außer {{whom}} stummschaten?",
"muteEveryoneDialog": "Wollen Sie wirklich alle stummschalten? Sie können deren Stummschaltung nicht mehr beenden, aber sie können ihre Stummschaltung jederzeit selbst beenden.",
"muteEveryoneTitle": "Alle stummschalten?",
"muteEveryoneSelf": "sich selbst",
@@ -224,7 +224,7 @@
"passwordNotSupported": "Setzen eines Konferenz-Passworts ist nicht unterstützt",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) nicht unterstützt",
"passwordRequired": "$t(lockRoomPasswordUppercase) erforderlich",
"popupError": "Ihr Browser blockiert Pop-ups von dieser Website. Bitte aktivieren Sie Popups in den Sicherheitseinstellungen des Browsers und versuchen Sie es erneut.",
"popupError": "Ihr Browser blockiert Pop-ups von dieser Website. Bitte aktivieren Sie Pop-ups in den Sicherheitseinstellungen des Browsers und versuchen Sie es erneut.",
"popupErrorTitle": "Pop-up blockiert",
"recording": "Aufnahme",
"recordingDisabledForGuestTooltip": "Gäste können keine Aufzeichnungen starten.",
@@ -233,7 +233,7 @@
"remoteControlAllowedMessage": "{{user}} hat die Anfrage zur Fernsteuerung angenommen.",
"remoteControlDeniedMessage": "{{user}} hat die Anfrage zur Fernsteuerung verweigert.",
"remoteControlErrorMessage": "Beim Anfordern der Fernsteuerungsberechtigung von {{user}} ist ein Fehler aufgetreten.",
"remoteControlRequestMessage": "Möchten Sie {{user}} erlauben den Computer fernzusteuern?",
"remoteControlRequestMessage": "Möchten Sie {{user}} erlauben, den Computer fernzusteuern?",
"remoteControlShareScreenWarning": "Achtung, wenn Sie die Anfrage genehmigen, starten Sie die Bildschirmfreigabe!",
"remoteControlStopMessage": "Die Fernsteuerung wurde beendet.",
"remoteControlTitle": "Fernsteuerung",
@@ -264,21 +264,21 @@
"startLiveStreaming": "Einen Livestream starten",
"startRecording": "Aufnahme starten",
"startRemoteControlErrorMessage": "Beim Versuch die Fernsteuerung zu starten ist ein Fehler aufgetreten.",
"stopLiveStreaming": "Live-Streaming stoppen",
"stopLiveStreaming": "Livestreaming stoppen",
"stopRecording": "Aufnahme stoppen",
"stopRecordingWarning": "Sind Sie sicher, dass Sie die Aufnahme stoppen möchten?",
"stopStreamingWarning": "Sind Sie sicher, dass Sie das Live-Streaming stoppen möchten?",
"stopStreamingWarning": "Sind Sie sicher, dass Sie das Livestreaming stoppen möchten?",
"streamKey": "Name/Schlüssel für den Stream",
"Submit": "OK",
"thankYou": "Danke für die Verwendung von {{appName}}!",
"token": "Token",
"tokenAuthFailed": "Sie sind nicht berechtigt dieser Konferenz beizutreten.",
"tokenAuthFailed": "Sie sind nicht berechtigt, dieser Konferenz beizutreten.",
"tokenAuthFailedTitle": "Authentifizierung fehlgeschlagen",
"transcribing": "Wird transkribiert",
"unlockRoom": "Meeting $t(lockRoomPassword) entfernen",
"userPassword": "Benutzerpasswort",
"WaitForHostMsg": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Wenn Sie der Veranstalter sind, authentifizieren Sie sich. Warten Sie andernfalls, bis der Veranstalter erscheint.",
"WaitForHostMsgWOk": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Wenn Sie der Veranstalter sind, drücken Sie zum Authentifizieren auf OK. Warten Sie andernfalls, bis der Veranstalter erscheint.",
"WaitForHostMsg": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Wenn Sie der Organisator sind, authentifizieren Sie sich. Warten Sie andernfalls, bis der Veranstalter erscheint.",
"WaitForHostMsgWOk": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Wenn Sie der Organisator sind, drücken Sie zum Authentifizieren auf OK. Warten Sie andernfalls, bis der Veranstalter erscheint.",
"WaitingForHost": "Warten auf den Organisator...",
"Yes": "Ja",
"yourEntireScreen": "Ganzer Bildschirm"
@@ -347,7 +347,7 @@
"msg": "Es ist ein Fehler aufgetreten.",
"retry": "Erneut versuchen",
"support": "Support",
"supportMsg": "Wenn der Fehler erneut auftritt, bitte kontaktieren sie"
"supportMsg": "Wenn der Fehler erneut auftritt, bitte kontaktieren Sie"
},
"keyboardShortcuts": {
"focusLocal": "Lokales Video fokussieren",
@@ -356,7 +356,7 @@
"keyboardShortcuts": "Tastenkürzel",
"localRecording": "Lokale Aufzeichnungssteuerelemente ein- oder ausblenden",
"mute": "Stummschaltung aktivieren oder deaktivieren",
"pushToTalk": "Drücken, um zu sprechen",
"pushToTalk": "Push-to-Talk (Sprechtaste)",
"raiseHand": "Hand erheben",
"showSpeakerStats": "Statistiken für Sprecher anzeigen",
"toggleChat": "Chat öffnen oder schließen",
@@ -370,31 +370,31 @@
"busy": "Es werden Resourcen zum Streamen bereitgestellt. Bitte in ein paar Minuten erneut versuchen.",
"busyTitle": "Alle Streaming-Instanzen sind in Gebrauch",
"changeSignIn": "Konten wechseln.",
"choose": "Live stream auswählen",
"choose": "Livestream auswählen",
"chooseCTA": "Streaming-Option auswählen. Sie sind aktuell als {{email}} angemeldet.",
"enterStreamKey": "Name/Schlüssel für den YouTube Livestream hier eingeben.",
"error": "Das Live-Streaming ist fehlgeschlagen. Bitte versuchen Sie es erneut.",
"errorAPI": "Beim abrufen der YouTube Livestreams ist ein Fehler aufgetreten. Bitte versuchen Sie sich erneut anzumelden.",
"errorLiveStreamNotEnabled": "Live-Streaming ist für {{email}} nicht aktiviert. Aktivieren Sie das Live-Streaming oder melden Sie sich bei einem Konto mit aktiviertem Live-Streaming an.",
"expandedOff": "Live-Streaming wurde angehalten",
"enterStreamKey": "Name/Schlüssel für den YouTube-Livestream hier eingeben.",
"error": "Das Livestreaming ist fehlgeschlagen. Bitte versuchen Sie es erneut.",
"errorAPI": "Beim Abrufen der YouTube-Livestreams ist ein Fehler aufgetreten. Bitte versuchen Sie, sich erneut anzumelden.",
"errorLiveStreamNotEnabled": "Livestreaming ist für {{email}} nicht aktiviert. Aktivieren Sie das Livestreaming oder melden Sie sich bei einem Konto mit aktiviertem Livestreaming an.",
"expandedOff": "Livestreaming wurde angehalten",
"expandedOn": "Das Meeting wird momentan an YouTube gestreamt.",
"expandedPending": "Live-Streaming wird gestartet...",
"failedToStart": "Live-Streaming konnte nicht gestartet werden",
"getStreamKeyManually": "Wir waren nicht in der Lage, Live-Streams abzurufen. Versuchen Sie, Ihren Live-Stream-Schlüssel von YouTube zu erhalten.",
"invalidStreamKey": "Der Live-Stream-Schlüssel ist u. U. falsch.",
"off": "Live-Streaming gestoppt",
"offBy": "{{name}} stoppte das Live-Streaming",
"on": "Live-Streaming",
"onBy": "{{name}} startete das Live-Streaming",
"pending": "Live-Stream wird gestartet...",
"serviceName": "Live Streaming-Dienst",
"expandedPending": "Livestreaming wird gestartet...",
"failedToStart": "Livestreaming konnte nicht gestartet werden",
"getStreamKeyManually": "Wir waren nicht in der Lage, Livestreams abzurufen. Versuchen Sie, Ihren Livestream-Schlüssel von YouTube zu erhalten.",
"invalidStreamKey": "Der Livestream-Schlüssel ist u. U. falsch.",
"off": "Livestreaming gestoppt",
"offBy": "{{name}} stoppte das Livestreaming",
"on": "Livestreaming",
"onBy": "{{name}} startete das Livestreaming",
"pending": "Livestream wird gestartet...",
"serviceName": "Livestreaming-Dienst",
"signedInAs": "Sie sind derzeit angemeldet als:",
"signIn": "Mit Google anmelden",
"signInCTA": "Anmelden oder den Name/Schlüssel des YouTube Livestreams eingeben.",
"signInCTA": "Anmelden oder den Namen/Schlüssel des YouTube-Livestreams eingeben.",
"signOut": "Abmelden",
"start": "Einen Livestream starten",
"streamIdHelp": "Was ist das?",
"unavailableTitle": "Live-Streaming nicht verfügbar"
"unavailableTitle": "Livestreaming nicht verfügbar"
},
"localRecording": {
"clientState": {
@@ -413,7 +413,7 @@
"messages": {
"engaged": "Lokale Aufzeichnung ist aktiviert",
"finished": "Aufzeichnung der Sitzung {{token}} ist beendet. Senden Sie die aufgezeichnete Datei an den Moderator.",
"finishedModerator": "Aufzeichnung der Sitzung {{token}} ist beendet. Die Aufzeichnung der lokalen Verlaufs wurde gespeichert. Bitten Sie die anderen Teilnehmer, ihre Aufzeichnungen zu übermitteln.",
"finishedModerator": "Aufzeichnung der Sitzung {{token}} ist beendet. Die Aufzeichnung des lokalen Verlaufs wurde gespeichert. Bitten Sie die anderen Teilnehmer, ihre Aufzeichnungen zu übermitteln.",
"notModerator": "Sie sind nicht der Moderator. Sie können die lokale Aufzeichnung nicht starten oder stoppen."
},
"moderator": "Moderator",
@@ -451,8 +451,8 @@
"raisedHand": "{{name}} möchte sprechen.",
"somebody": "Jemand",
"startSilentTitle": "Sie sind ohne Audioausgabe beigetreten!",
"startSilentDescription": "Treten Sie dem Meeting noch einma bei, um Ihr Audio zu aktivieren",
"suboptimalExperienceDescription": "Tut uns leid, aber die Konferenz wird mit {{appName}} kein grossartiges Erlebnis. Wir versuchen immer die Situation zu verbessern, bis dahin empfehlen wir aber die Verwendung einer der <a href=\"static/recommendedBrowsers.html\" target=\"_blank\">vollständig unterstützen Browser</a>.",
"startSilentDescription": "Treten Sie dem Meeting noch einmal bei, um Ihr Audio zu aktivieren",
"suboptimalExperienceDescription": "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=\"static/recommendedBrowsers.html\" target=\"_blank\">vollständig unterstützen Browser</a>.",
"suboptimalExperienceTitle": "Browserwarnung",
"unmute": "Stummschaltung aufheben",
"newDeviceCameraTitle": "Neue Kamera erkannt",
@@ -479,7 +479,7 @@
"profile": {
"setDisplayNameLabel": "Anzeigename festlegen",
"setEmailInput": "E-Mail eingeben",
"setEmailLabel": "E-Mail Adresse für Gravatar",
"setEmailLabel": "E-Mail-Adresse für Gravatar",
"title": "Profil"
},
"raisedHand": "Ich möchte sprechen",
@@ -487,7 +487,7 @@
"authDropboxText": "In Dropbox hochladen",
"availableSpace": "Verfügbarer Speicherplatz: {{spaceLeft}} MB (ca. {{duration}} Minuten Aufzeichnung)",
"beta": "BETA",
"busy": "Es werden Resourcen für eine Aufnahme bereitgestellt. Bitte in ein paar Minuten erneut versuchen.",
"busy": "Es werden Ressourcen für eine Aufnahme bereitgestellt. Bitte in ein paar Minuten erneut versuchen.",
"busyTitle": "Alle Aufnahme-Instanzen sind in Gebrauch",
"error": "Die Aufzeichnung ist fehlgeschlagen. Bitte versuchen Sie es erneut.",
"expandedOff": "Aufzeichnung wurde gestoppt",
@@ -511,14 +511,14 @@
"unavailableTitle": "Aufnahme nicht verfügbar"
},
"sectionList": {
"pullToRefresh": "Ziehen um zu aktualisieren"
"pullToRefresh": "Ziehen, um zu aktualisieren"
},
"settings": {
"calendar": {
"about": "Die Kalenderintegration von {{appName}} wird verwendet, um ein sicheres Zugreifen auf Ihren Kalender und Auslesen der bevorstehenden Veranstaltungen zu ermöglichen.",
"about": "Die Kalenderintegration von {{appName}} wird verwendet, um ein sicheres Zugreifen auf Ihren Kalender und Auslesen der bevorstehenden Termine zu ermöglichen.",
"disconnect": "Getrennt",
"microsoftSignIn": "Mit Microsoft anmelden",
"signedIn": "Momentan wird auf Kalenderveranstaltungen von {{email}} zugegriffen. Klicken Sie auf die folgende Schaltfläche „Trennen“, um den Zugriff auf die Kalenderveranstaltungen zu stoppen.",
"signedIn": "Momentan wird auf Kalendertermine von {{email}} zugegriffen. Klicken Sie auf die folgende Schaltfläche „Trennen“, um den Zugriff auf die Kalendertermine zu stoppen.",
"title": "Kalender"
},
"devices": "Geräte",
@@ -540,7 +540,7 @@
"advanced": "Erweitert",
"alertOk": "OK",
"alertTitle": "Warnung",
"alertURLText": "Die angegebene Server URL ist ungültig",
"alertURLText": "Die angegebene Server-URL ist ungültig",
"buildInfoSection": "Build-Informationen",
"conferenceSection": "Konferenz",
"disableCallIntegration": "Native Anrufintegration deaktivieren",
@@ -549,7 +549,7 @@
"email": "E-Mail",
"header": "Einstellungen",
"profileSection": "Profil",
"serverURL": "Server URL",
"serverURL": "Server-URL",
"showAdvanced": "Erweiterte Einstellungen anzeigen",
"startWithAudioMuted": "Stumm beitreten",
"startWithVideoMuted": "Ohne Video beitreten",
@@ -574,20 +574,20 @@
},
"suspendedoverlay": {
"rejoinKeyTitle": "Erneut teilnehmen",
"text": "<i>Erneut teilnehmen</i> Schaltfläche betätigen um erneut zu verbinden.",
"title": "Die Konferenz wurde unterbrochen, weil der Standbymodus aktiviert wurde."
"text": "<i>Erneut teilnehmen</i>“-Schaltfläche betätigen, um erneut zu verbinden.",
"title": "Die Konferenz wurde unterbrochen, weil der Standby-Modus aktiviert wurde."
},
"toolbar": {
"accessibilityLabel": {
"audioOnly": "Nur Audio ein-/ausschalten",
"audioOnly": "Nur Audio ein-/ausschalten",
"audioRoute": "Audiogerät auswählen",
"callQuality": "Qualitätseinstellungen",
"cc": "Untertitel ein-/ausschalten",
"chat": "Chatfenster ein-/ausblenden",
"document": "Geteiltes Dokument schliessen",
"document": "Geteiltes Dokument schließen",
"download": "Unsere Apps herunterladen",
"feedback": "Feedback hinterlassen",
"fullScreen": "Vollbildschirm ein-/ausblenden",
"fullScreen": "Vollbildmodus aktivieren/deaktivieren",
"hangup": "Anruf beenden",
"help": "Hilfe",
"invite": "Teilnehmer einladen",
@@ -623,9 +623,9 @@
"audioRoute": "Audiogerät auswählen",
"authenticate": "Anmelden",
"callQuality": "Qualitätseinstellungen",
"chat": "Chat öffnen / schliessen",
"chat": "Chat öffnen / schließen",
"closeChat": "Chat schließen",
"documentClose": "Geteiltes Dokument schliessen",
"documentClose": "Geteiltes Dokument schließen",
"documentOpen": "Geteiltes Dokument öffnen",
"download": "Unsere Apps herunterladen",
"enterFullScreen": "Vollbildmodus",
@@ -649,7 +649,7 @@
"noAudioSignalDialInDesc": "Sie können sich auch über die Einwahlnummer einwählen:",
"noAudioSignalDialInLinkDesc" : "Einwahlnummern:",
"noisyAudioInputTitle": "Ihr Mikrofon scheint lärmintensiv zu sein!",
"noisyAudioInputDesc": "Es klingt, als ob Ihr Mikrofon Geräusche macht. Bitte überlegen Sie, ob Sie das Gerät stummschalten oder austauschen wollen.",
"noisyAudioInputDesc": "Es klingt, als ob Ihr Mikrofon Störgeräusche verursacht. Bitte überlegen Sie, ob Sie das Gerät stummschalten oder austauschen wollen.",
"openChat": "Chat öffnen",
"pip": "Bild-in-Bild-Modus einschalten",
"privateMessage": "Private Nachricht senden",
@@ -666,7 +666,7 @@
"stopScreenSharing": "Bildschirmfreigabe stoppen",
"stopSubtitles": "Untertitel ausschalten",
"stopSharedVideo": "YouTube-Video stoppen",
"talkWhileMutedPopup": "Versuchen sie zu sprechen? Ihr Mikrofon ist stummgeschaltet.",
"talkWhileMutedPopup": "Versuchen Sie zu sprechen? Ihr Mikrofon ist stummgeschaltet.",
"tileViewToggle": "Kachelansicht ein-/ausschalten",
"toggleCamera": "Kamera wechseln",
"videomute": "Kamera starten / stoppen",
@@ -710,19 +710,19 @@
"videoStatus": {
"audioOnly": "AUD",
"audioOnlyExpanded": "Sie befinden sich im Modus „Nur Audio“. Dieser Modus benötigt weniger Bandbreite, Sie sehen jedoch nicht die Videos der anderen.",
"callQuality": "Video-Qualität",
"callQuality": "Videoqualität",
"hd": "HD",
"hdTooltip": "Video wird in hoher Auflösung angezeigt",
"highDefinition": "Hohe Auflösung",
"labelTooiltipNoVideo": "Kein Video",
"labelTooltipAudioOnly": "Nur-Audio Modus aktiv",
"labelTooltipAudioOnly": "Nur Audio“-Modus aktiv",
"ld": "LD",
"ldTooltip": "Video wird in niedriger Auflösung angezeigt",
"lowDefinition": "Niedrige Auflösung",
"onlyAudioAvailable": "Nur Ton",
"onlyAudioSupported": "In diesem Browser wird nur Audio unterstützt.",
"p2pEnabled": "Ende-zu-Ende aktiviert",
"p2pVideoQualityDescription": "Im Ende-zu-Ende-Modus kann die empfangene Videoqualität nur zwischen hoch und Nur-Audio umgeschaltet werden. Andere Einstellungen werden erst beim Verlassen des Ende-zu-Ende-Modus berücksichtigt.",
"p2pVideoQualityDescription": "Im Ende-zu-Ende-Modus kann die empfangene Videoqualität nur zwischen „Hoch und Nur Audio umgeschaltet werden. Andere Einstellungen werden erst beim Verlassen des Ende-zu-Ende-Modus berücksichtigt.",
"recHighDefinitionOnly": "Hohe Qualität wird bevorzugt.",
"sd": "SD",
"sdTooltip": "Video wird in Standardauflösung angezeigt",
@@ -745,9 +745,9 @@
"join": "Zum Teilnehmen tippen",
"roomname": "Konferenzname eingeben"
},
"appDescription": "Auf geht's! Beginne eine Videokonferenz mit dem ganzen Team. Oder besser noch, lade alle ein, die du kennst. {{app}} ist eine vollständig verschlüsselte, aus 100% Open-Source-Software bestehende Videokonferenzlösung, die du den ganzen Tag kostenlos verwenden kannst — ohne Registrierung.",
"appDescription": "Auf geht's! Starten Sie eine Videokonferenz mit dem ganzen Team. Oder besser noch: Laden Sie alle ein, die Sie kennen. {{app}} ist eine vollständig verschlüsselte, aus 100% Open-Source-Software bestehende Videokonferenzlösung, die Sie den ganzen Tag kostenlos verwenden können — ohne Registrierung.",
"audioVideoSwitch": {
"audio": "Sprache",
"audio": "Audio",
"video": "Video"
},
"calendar": "Kalender",
@@ -759,15 +759,15 @@
"goSmall": "Los",
"join": "Beitreten",
"info": "Informationen",
"privacy": "Privatsphäre",
"privacy": "Datenschutz",
"recentList": "Letzte",
"recentListDelete": "Löschen",
"recentListEmpty": "Die Liste „Letzte“ ist momentan leer. Chatten Sie mit Ihrem Team. Sie finden all Ihre letzten Meetings hier.",
"reducedUIText": "Willkommen bei {{app}}!",
"roomname": "Konferenzname eingeben",
"roomnameHint": "Name oder URL der Konferenz, der Sie beitreten möchten. Sie können einen Namen erfinden, er muss nur den anderen Teilnehmern übermittelt werden, damit sie der gleichen Konferenz beitreten.",
"sendFeedback": "Senden Sie uns Ihr Feedback",
"terms": "Bedingungen",
"roomnameHint": "Name oder URL der Konferenz, der Sie beitreten möchten. Sie können einen Namen erfinden, er muss nur den anderen Teilnehmern übermittelt werden, damit diese der gleichen Konferenz beitreten.",
"sendFeedback": "Feedback senden",
"terms": "AGB",
"title": "Sichere, mit umfassenden Funktionen ausgestattete und vollkommen kostenlose Videokonferenzen"
}
}

View File

@@ -21,7 +21,8 @@
"bluetooth": "Bluetooth",
"headphones": "Kõrvaklapid",
"phone": "Telefon",
"speaker": "Kõlar"
"speaker": "Kõlar",
"none": "Heli vahendid pole kättesaadavad"
},
"audioOnly": {
"audioOnly": "Ainult heli"
@@ -46,12 +47,22 @@
},
"chat": {
"error": "Viga: sõnumi \"{{originalText}}\" saatmine ebaõnnestus. Põhjus: {{error}}",
"fieldPlaceHolder": "Sisesta oma sõnum siia",
"messagebox": "Sisesta sõnum",
"messageTo": "Privaatsõnum kasutajale {{recipient}}",
"noMessagesMessage": "Kirjavahetust pole veel alustatud. Alusta kirjavahetust siin!",
"nickname": {
"popover": "Sisesta nimi",
"title": "Sisesta nimi, et kõnega alustada"
},
"title": "Kõne"
"privateNotice": "Privaatsõnum kasutajale {{recipient}}",
"title": "Kõne",
"you": "you"
},
"chromeExtensionBanner": {
"installExtensionText": "Paigalda Google Kalendri laiendus ja Office 365 integratsioon",
"buttonText": "Paigalda Chrome'i laiendus",
"dontShowAgain": "Ära rohkem näita"
},
"connectingOverlay": {
"joiningRoom": "Kõnega ühendamine..."
@@ -66,7 +77,10 @@
"DISCONNECTED": "Ühendus katkestatud",
"DISCONNECTING": "Ühenduse katkestamine...",
"ERROR": "Viga",
"RECONNECTING": "Võrguühenduse viga. Ühenduse taastamine..."
"FETCH_SESSION_ID": "Sessiooni-ID püüdmine...",
"GET_SESSION_ID_ERROR": "Sessiooni-ID püüdmisel tekkis viga: {{code}}",
"GOT_SESSION_ID": "Sessiooni-ID püüdmine... Tehtud",
"LOW_BANDWIDTH": "Kasutaja {{displayName}} video on ülekandekiiruse parandamiseks välja lülitatud"
},
"connectionindicator": {
"address": "Aadress:",
@@ -74,6 +88,7 @@
"bitrate": "Andmeedastuskiirus:",
"bridgeCount": "Serverite arv: ",
"connectedTo": "Ühendatud:",
"e2e_rtt": "E2E RTT:",
"framerate": "Ekraani eraldusvõime:",
"less": "Näita vähem",
"localaddress": "Lokaalne aadress:",
@@ -96,8 +111,7 @@
"resolution": "Resolutsioon:",
"status": "Ühendus:",
"transport": "Transport:",
"transport_plural": "Transpordid:",
"turn": " (turn)"
"transport_plural": "Transpordid:"
},
"dateUtils": {
"earlier": "Varem",
@@ -107,7 +121,7 @@
"deepLinking": {
"appNotInstalled": "Kõnega liitumiseks läbi mobiiltelefoni on vaja paigaldada {{app}} rakendus.",
"description": "Midagi ei juhtunud? Proovisime ühendust luua töölaua rakendusega. Proovi uuesti või käivita {{app}} rakendus.",
"descriptionWithoutWeb": "",
"descriptionWithoutWeb": "Midagi ei juhtunud? Televastuvõttu prooviti avada töölaua rakendusest {{app}}.",
"downloadApp": "Laadi rakendus alla",
"launchWebButton": "Käivita veebis",
"openApp": "Jätka töölaua rakendusega",
@@ -115,6 +129,7 @@
"tryAgainButton": "Proovi töölaua rakendusega uuesti "
},
"defaultLink": "nt {{url}}",
"defaultNickname": "nt. Mari Maasikas",
"deviceError": {
"cameraError": "Ei saanud kaameraga ühendust",
"cameraPermission": "Puudub õigus kasutada kaamerat",
@@ -167,7 +182,7 @@
"goToStore": "Mine veebipoodi",
"gracefulShutdown": "Rakendus on hoolduseks ajutiselt maas. Proovi hiljem uuesti!",
"IamHost": "Mina olen võõrustaja",
"incorrectRoomLockPassword": "",
"incorrectRoomLockPassword": "Vale parool",
"incorrectPassword": "Vale kasutajanimi või parool",
"inlineInstallationMsg": "Töölauale tuleb paigaldada jagamise laiendus.",
"inlineInstallExtension": "Paiglada kohe",
@@ -194,6 +209,12 @@
"micNotSendingDataTitle": "Mikrofon pole kättesaadav.",
"micPermissionDeniedError": "Mikrofoni kasutamine on keelatud. Kõnega on võimalik ühineda, aga teised Sind ei kuule. Mikrofoni kasutamiseks vajuta aadressiribal mikrofoni nupule.",
"micUnknownError": "Mikrofoni ei saa kasutada. Põhjus teadmata.",
"muteEveryoneElseDialog": "Peale mikrofoni vaigistamist saab ainult kasutaja ise oma mikrofoni tagasi sisse lülitada.",
"muteEveryoneElseTitle": "Vaigista kõikide teiste mikrofonid, välja arvatud {{whom}}?",
"muteEveryoneDialog": "Oled kindel, et soovid kõikide teiste mikrofonid vaigistada? Neid saab tagasi sisse lülitada ainult kasutaja ise.",
"muteEveryoneTitle": "Vaigista kõik?",
"muteEveryoneSelf": "Sina ise",
"muteEveryoneStartMuted": "Edaspidi alustavad kõik välja lülitatud mikrofonidega",
"muteParticipantBody": "Teiste kasutajate mikrofoni ei saa sisse lülitada. Kasutaja saab ise otsutada, kas mikrofon on sees või väljas.",
"muteParticipantButton": "Lülita mikrofon välja",
"muteParticipantDialog": "Oled kindel, et soovid kasutaja mikrofoni välja lülitada? Seda saab ainult kasutaja ise sisse tagasi lülitada.",
@@ -228,6 +249,10 @@
"screenSharingFirefoxPermissionDeniedError": "Ekraani jagamisega läks midagi valesti! Veendu, et oled ekraani jagamiseks loa andnud.",
"screenSharingFirefoxPermissionDeniedTitle": "Oih, ekraani jagamist ei saanud alustada!",
"screenSharingPermissionDeniedError": "Oih, midagi läks valesti ekraanijagamise laienduse õigustega! Värskenda ja proovi uuesti.",
"sendPrivateMessage": "Sulle saabus privaatsõnum. Kas soovid vastata privaatselt või avalikult?",
"sendPrivateMessageCancel": "Saada sõnum avalikult",
"sendPrivateMessageOk": "Saada sõnum privaatselt",
"sendPrivateMessageTitle": "Saada privaatselt?",
"serviceUnavailable": "Teenus pole kättesaadav",
"sessTerminated": "Kõne lõpetatud",
"Share": "Jaga",
@@ -261,6 +286,9 @@
"dialOut": {
"statusMessage": "on staatusega {{status}}"
},
"documentSharing": {
"title": "Jagatud dokument"
},
"feedback": {
"average": "Keskmine",
"bad": "Halb",
@@ -274,7 +302,7 @@
"answer": "Vasta",
"audioCallTitle": "Sissetulev kõne",
"decline": "Lõpeta",
"productLabel": "Jitsi Meet televastuvõtt",
"productLabel": "Jitsi",
"videoCallTitle": "Sissetulev videokõne"
},
"info": {
@@ -292,7 +320,7 @@
"genericError": "Oih, midagi läks valesti!",
"inviteLiveStream": "Otseülekande nägemiseks vajuta lingile: {{url}}",
"invitePhone": "Üks klikk heliga sissehelistamiseks: {{number}},,{{conferenceID}}#",
"invitePhoneAlternatives": "",
"invitePhoneAlternatives": "Otsid teist sissehelistamise numbrit?\nVaata sissehelistamise numbreid: {{url}}\n\n\nKui helistad läbi ruumi, ühine kõnega väljalülitatud mikrofoni režiimis: {{silentUrl}}",
"inviteURLFirstPartGeneral": "Oled kõnesse kutsutud.",
"inviteURLFirstPartPersonal": "{{name}} kutsub Sind kõnesse.\n",
"inviteURLSecondPart": "\nÜhine kõnega:\n{{url}}\n",
@@ -335,7 +363,8 @@
"toggleFilmstrip": "Näita/peida video eelvaade",
"toggleScreensharing": "Vaheta kaamera ja ekraanijagamise vahel",
"toggleShortcuts": "Näita/peida klaviatuuri kiirvalikud",
"videoMute": "Lülita kaamera sisse/välja"
"videoMute": "Lülita kaamera sisse/välja",
"videoQuality": "Halda kõne kvaliteeti"
},
"liveStreaming": {
"busy": "Toimub ülekande ressursi vabastamine. Proovi mõne minuti pärast uuesti.",
@@ -354,7 +383,9 @@
"getStreamKeyManually": "Ülekandjaid ei leitud. Leia YouTubest otseülekande võti.",
"invalidStreamKey": "Otseülekande võti võib olla vale.",
"off": "Otseülekanne on peatatud",
"offBy": "{{name}} lõpetas otseülekande",
"on": "Otseülekanne",
"onBy": "{{name}} alustas otseülekandega",
"pending": "Otseülekande alustamine...",
"serviceName": "Otseülekande teenus",
"signedInAs": "Oled sisse logitud kasutajana:",
@@ -414,16 +445,16 @@
"muted": "Alustasid kõnet väljalülitatud mikrofoniga.",
"mutedTitle": "Mikrofon on välja lülitatud!",
"mutedRemotelyTitle": "Sinu mikrofon lülitati välja kasutaja {{participantDisplayName}} poolt!",
"mutedRemotelyDescription": "",
"passwordRemovedRemotely": "",
"passwordSetRemotely": "",
"mutedRemotelyDescription": "Saad alati oma mikrofoni sisse lülitada, kui soovid rääkida. Lülita mikrofon peale rääkimist uuesti välja liigse müra ja kaja vältimiseks.",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) eemaldatud teise kasutaja poolt",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) lisatud teise kasutaja poolt",
"raisedHand": "{{name}} soovib rääkida.",
"somebody": "Keegi",
"startSilentTitle": "",
"startSilentDescription": "",
"startSilentTitle": "Ühinesid ilma mikrofonita!",
"startSilentDescription": "Mikrofoni kasutamiseks ühine kõnega uuesti",
"suboptimalExperienceDescription": "Rakenduse {{appName}} parima kvaliteedi tagamiseks palun kasuta <a href='static/recommendedBrowsers.html' target='_blank'>ühte nendest veebilehitsejatest</a>.",
"suboptimalExperienceTitle": "Veebilehitseja hoiatus",
"unmute": "",
"unmute": "Lülita mikrofon sisse",
"newDeviceCameraTitle": "Leitud uus kaamera",
"newDeviceAudioTitle": "Leitud uus heliseadeldis",
"newDeviceAction": "Kasuta"
@@ -451,6 +482,7 @@
"setEmailLabel": "Sisesta gravatar email",
"title": "Profiil"
},
"raisedHand": "Soovin rääkida",
"recording": {
"authDropboxText": "Lisa Dropboxi",
"availableSpace": "Vaba ruum: {{spaceLeft}} MB (ca {{duration}} minutit salvestamist)",
@@ -466,7 +498,9 @@
"live": "Otse",
"loggedIn": "Sisseloginud kasutajana {{userName}}",
"off": "Salvestamine on lõpetatud",
"offBy": "{{name}} lõpetas salvestamise",
"on": "Salvestatakse",
"onBy": "{{name}} alustas salvestamist",
"pending": "Kõne salvestamise ettevalmistus...",
"rec": "REC",
"serviceDescription": "Salvestus toimub teenuse kaudu",
@@ -503,16 +537,20 @@
"title": "Seaded"
},
"settingsView": {
"advanced": "Täpsem",
"alertOk": "OK",
"alertTitle": "Hoiatus",
"alertURLText": "Sisestatud link ei ole õige",
"buildInfoSection": "Versioon",
"conferenceSection": "Kõne",
"disableCallIntegration": "Lülita kohaliku kõne integratsioon välja",
"disableP2P": "Lülita otseühendus välja",
"displayName": "Kasutatav nimi",
"email": "E-mail",
"header": "Seaded",
"profileSection": "Profiil",
"serverURL": "Serveri link",
"showAdvanced": "Näita täpsemaid seadistusi",
"startWithAudioMuted": "Alusta väljalülitatud heliga",
"startWithVideoMuted": "Alusta väljalülitatud videoga",
"version": "Versioon"
@@ -547,17 +585,22 @@
"cc": "Kasuta subtiitreid",
"chat": "Kasuta vestluse akent",
"document": "Kasuta jagatud dokumente",
"download": "Laadi rakendus alla",
"feedback": "Jäta tagasiside",
"fullScreen": "Kasuta täisekraani",
"hangup": "Lahku kõnest",
"help": "Abi",
"invite": "Kutsu inimesi",
"kick": "Eemalda kõneleja",
"localRecording": "Näita salvestamise paneeli",
"lockRoom": "Kasuta kõne parooli",
"moreActions": "Kasuta toimingute menüüd",
"moreActionsMenu": "Toimingute menüü",
"moreOptions": "Näita rohkem valikuid",
"mute": "Lülita heli välja",
"muteEveryone": "Vaigista kõikide mikrofonid",
"pip": "Kasuta pilt-pildis vaadet",
"privateMessage": "Saada privaatsõnum",
"profile": "Muuda profiili",
"raiseHand": "Käe tõstmine",
"recording": "Salvestamine",
@@ -567,12 +610,12 @@
"shareRoom": "Kutsu",
"shareYourScreen": "Jaga ekraani",
"shortcuts": "Kasuta kiirvalikuid",
"show": "",
"show": "Näita laval",
"speakerStats": "Kõnelejate statistika",
"tileView": "Paneelvaade",
"toggleCamera": "Kasuta kaamerat",
"videomute": "Video väljalülitamine",
"videoblur": ""
"videoblur": "Video hägustamine"
},
"addPeople": "Lisa kõnesse inimesi",
"audioOnlyOff": "Lülita “ainult heli” valik välja",
@@ -584,20 +627,32 @@
"closeChat": "Sulge vestlus",
"documentClose": "Sulge jagatud dokument",
"documentOpen": "Ava jagatud dokument",
"download": "Laadi rakendus alla",
"enterFullScreen": "Vaata täisekraanil",
"enterTileView": "Vaata paneelvaates",
"exitFullScreen": "Välju täisekraani vaatest",
"exitTileView": "Välju paneelvaatest",
"feedback": "Jäta tagasiside",
"hangup": "Lahku",
"help": "Abi",
"invite": "Kutsu",
"login": "Logi sisse",
"logout": "Logi välja",
"lowerYourHand": "Langeta kätt",
"moreActions": "Rohkem tegevusi",
"moreOptions": "Rohkem valikuid",
"mute": "Mikrofon sisse/välja",
"muteEveryone": "Vaigista kõikide mikrofonid",
"noAudioSignalTitle": "Mikrofon ei püüa sisendit kinni!",
"noAudioSignalDesc": "Kui Sa ei lülitanud mikrofoni seadistustest tahtlikult välja, kaalu seadme vahetamist.",
"noAudioSignalDescSuggestion": "Kui Sa ei lülitanud mikrofoni seadistustest tahtlikult välja, kaalu seadme vahetamist.",
"noAudioSignalDialInDesc": "Võid sisse helistada valides:",
"noAudioSignalDialInLinkDesc" : "Sissehelistamise numbrid",
"noisyAudioInputTitle": "Mikrofonis on müra! Tundub, et läbi mikrofoni kostub palju helisid. Kaalu mikrofoni välja lülitamist või seadme vahetamist.",
"noisyAudioInputDesc": "Tundub, et läbi mikrofoni kostub palju helisid. Kaalu mikrofoni välja lülitamist või seadme vahetamist.",
"openChat": "Ava vestlus",
"pip": "Ava pilt-pildis vaade",
"privateMessage": "Saada privaatsõnum",
"profile": "Muuda profiili",
"raiseHand": "Tõsta/langeta kätt",
"raiseYourHand": "Tõsta kätt",
@@ -615,8 +670,8 @@
"tileViewToggle": "Näita paneelvaadet",
"toggleCamera": "Kasuta kaamerat",
"videomute": "Kaamera sisse/välja",
"startvideoblur": "",
"stopvideoblur": ""
"startvideoblur": "Tausta hägustamine",
"stopvideoblur": "Lülita tausta hägustamine välja"
},
"transcribing": {
"ccButtonTooltip": "Subtiitrid sisse/välja",
@@ -657,28 +712,32 @@
"audioOnlyExpanded": "Kasutad kõnes ainult heli. See hõivab ülekandekiirust vähem, aga video jagamine on välja lülitatud.",
"callQuality": "Kõne kvaliteet",
"hd": "HD",
"hdTooltip": "Video vaatamine kõrgkvaliteediga",
"highDefinition": "Kõrgresolutsioon",
"labelTooiltipNoVideo": "Video puudub",
"labelTooltipAudioOnly": "Valitud on “ainult heli” seadistus",
"ld": "LD",
"lowDefinition": "Madal resolutsioon",
"ldTooltip": "Video vaatamine madala kvaliteediga",
"lowDefinition": "Madal",
"onlyAudioAvailable": "Saab kasutada ainult heli",
"onlyAudioSupported": "Selles veebilehitsejas on toetatud ainult heli.",
"p2pEnabled": "Otseühendus on sisse lülitatud",
"p2pVideoQualityDescription": "Otseühenduse režiimis saab vastuvõetava kõne heli olla “ainult heli“, või kõrge. Teisi seadistusi ei saa valida.",
"recHighDefinitionOnly": "Eelistan kõrgresolutsiooni.",
"sd": "SD",
"standardDefinition": "Vaikimisi kasutatav resolutsioon"
"sdTooltip": "Video vaatamine vaikekvaliteediga",
"standardDefinition": "Vaike resolutsioon"
},
"videothumbnail": {
"domute": "Lülita mikrofon välja",
"domuteOthers": "Vaigista teiste mikrofonid",
"flip": "Pööra",
"kick": "Eemalda kõnest",
"moderator": "Moderaator",
"mute": "Kasutaja mikrofon välja lülitatud",
"muted": "Mikrofon välja lülitatud",
"remoteControl": "Kaugjuhtimine",
"show": "",
"show": "Näita laval",
"videomute": "Kasutaja on kaamera peatanud"
},
"welcomepage": {
@@ -693,20 +752,26 @@
},
"calendar": "Kalender",
"connectCalendarButton": "Ühenda kalender",
"connectCalendarText": "",
"connectCalendarText": "Ühenda oma kalender, et kõiki kohtumisi näha rakenduses {{app}}. Lisa {{provider}} kohtumised kalendrisse ja alusta kõnesid ühe klikiga.",
"enterRoomTitle": "Alusta uut kõnet",
"roomNameAllowedChars": "Televastuvõtu nimi ei tohi sisaldada sümboleid: ?, &, :, ', \", %, #.",
"go": "Mine",
"goSmall": "Mine",
"join": "Ühine",
"info": "Info",
"privacy": "Privaatsus",
"recentList": "Hiljutised",
"recentListDelete": "Kustuta",
"recentListEmpty": "Hiljutiste valikute nimekiri on tühi. Vestle kasutajatega ja leia oma hiljutised kõned siit.",
"reducedUIText": "",
"reducedUIText": "Tere tulemast rakendusse {{app}}!",
"roomname": "Sisesta ruumi nimi",
"roomnameHint": "Sisesta ruumi nimi või link, millega soovid ühinega. Võid nime välja mõelda, aga anna osalejatele sellest teada, et nad saaksid ruumiga ühineda.",
"sendFeedback": "Saada tagasiside",
"terms": "Tingimused",
"title": "Turvaline, võimalusi täis ja tasuta keskkond videokõnede jaoks."
},
"lonelyMeetingExperience": {
"button": "Kutsu teisi",
"youAreAlone": "Asud hetkel ruumis üksi"
}
}

View File

@@ -53,7 +53,7 @@
"noMessagesMessage": "",
"nickname": {
"popover": "Wybierz swój nick",
"title": "Wpisz swoje imię i nazwisko, aby użyć rozmowy"
"title": "Wpisz swoją nazwę, aby użyć rozmowy"
},
"privateNotice": "Prywatna wiadomość do {{recipient}}",
"title": "Rozmowa",
@@ -76,38 +76,38 @@
},
"connectionindicator": {
"address": "Adres:",
"bandwidth": "Zakładana przepustowość:",
"bandwidth": "Szacowana przepustowość:",
"bitrate": "Szybkość transmisji:",
"bridgeCount": "Liczba serwerów: ",
"connectedTo": "Podłączone do:",
"framerate": "Częstotliwość wyświetlania klatek:",
"framerate": "Klatek na sekundę:",
"less": "Pokaż mniej",
"localaddress_0": "Adres lokalny:",
"localaddress_1": "Adresy lokalne:",
"localaddress_2": "Adresów lokalnych:",
"localaddress_2": "Adresy lokalne:",
"localport_0": "Port lokalny:",
"localport_1": "Porty lokalne:",
"localport_2": "Portów lokalnych:",
"localport_2": "Porty lokalne:",
"more": "Pokaż więcej",
"packetloss": "Strata pakietów:",
"packetloss": "Utrata pakietów:",
"quality": {
"good": "Prawdziwy",
"inactive": "Nieaktywny",
"lost": "Zaginiony",
"good": "Dobre",
"inactive": "Nieaktywne",
"lost": "Utracone",
"nonoptimal": "Nieoptymalne",
"poor": "Słaby"
"poor": "Słabe"
},
"remoteaddress_0": "Adres zdalny:",
"remoteaddress_1": "Adresy zdalne:",
"remoteaddress_2": "Adresów zdalnych:",
"remoteaddress_2": "Adresy zdalne:",
"remoteport_0": "Port zdalny:",
"remoteport_1": "Porty zdalne:",
"remoteport_2": "Portów zdalnych:",
"remoteport_2": "Porty zdalne:",
"resolution": "Rozdzielczość:",
"status": "Połączenie:",
"transport_0": "Przekazywanie:",
"transport_1": "Przekazywania:",
"transport_2": "Przekazywań:"
"transport_0": "Transport:",
"transport_1": "Transporty:",
"transport_2": "Transporty:"
},
"dateUtils": {
"earlier": "Wcześniej",
@@ -128,7 +128,7 @@
"defaultNickname": "np. Ziutek Kowalski",
"deviceError": {
"cameraError": "Błąd dostępu do Twojej kamery",
"cameraPermission": "Błąd podczas przetwarzania uprawnień do kamery",
"cameraPermission": "Błąd podczas otrzymywania uprawnień do kamery",
"microphoneError": "Błąd dostępu do Twojego mikrofonu",
"microphonePermission": "Błąd podczas otrzymywania uprawnień do mikrofonu"
},
@@ -209,7 +209,7 @@
"muteParticipantButton": "Wyciszenie",
"muteParticipantDialog": "Czy na pewno wyciszyć tego uczestnika? Nie będziesz mógł wyłączyć wyciszenia uczestników, ale oni mogą samodzielnie wyłączyć wyciszenie w dowolnym momencie.",
"muteParticipantTitle": "Wyciszyć tego uczestnika?",
"Ok": "Ok",
"Ok": "OK",
"passwordLabel": "$t(lockRoomPasswordUppercase)",
"passwordNotSupported": "Ustanowienie spotkania $t(lockRoomPassword) nie jest obsługiwane.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) nie jest obsługiwane",
@@ -280,16 +280,16 @@
"title": "Współdzielony dokument"
},
"feedback": {
"average": "Średni",
"bad": "Źle",
"average": "Średnio",
"bad": "Źle",
"detailsLabel": "Powiedz nam o tym więcej.",
"good": "Prawdziwy",
"rateExperience": "Oceń proszę swoje doświadczenia z konferencji",
"good": "Dobrze",
"rateExperience": "Jak oceniasz tę konferencję?",
"veryBad": "Bardzo źle",
"veryGood": "1: Bardzo dobrze"
"veryGood": "Bardzo dobrze"
},
"incomingCall": {
"answer": "Odpowiedz",
"answer": "Odbierz",
"audioCallTitle": "Przychodzące połączenie",
"decline": "Odrzuć",
"productLabel": "z Jitsi Meet",
@@ -512,18 +512,18 @@
"title": "Kalendarz"
},
"devices": "Urządzenia",
"followMe": "Wszyscy za mną",
"followMe": "Wszyscy widzą mnie",
"language": "Język",
"loggedIn": "Zalogowano jako {{name}}",
"moderator": "Moderujący",
"moderator": "Moderacja",
"more": "Więcej",
"name": "Nazwa",
"noDevice": "Brak",
"selectAudioOutput": "Wyjście audio",
"selectCamera": "Kamera",
"selectMic": "Mikrofon",
"startAudioMuted": "Wszyscy się wyciszyli",
"startVideoMuted": "Wszyscy się ukryli",
"startAudioMuted": "Wycisz wszystkich dołączających",
"startVideoMuted": "Ukryj wszystkich dołączających",
"title": "Ustawienia"
},
"settingsView": {
@@ -600,7 +600,7 @@
"shortcuts": "Przełączanie skrótów klawiszowych",
"show": "",
"speakerStats": "Przełączanie statystyk dotyczących mówców",
"tileView": "Przełączanie kafelkowego widoku",
"tileView": "Przełącz widok kafelkowy",
"toggleCamera": "Przełączanie kamery",
"videomute": "Przełączanie wyciszonego filmu wideo",
"videoblur": "Przełącz rozmazanie obrazu"
@@ -626,9 +626,9 @@
"invite": "Zapraszaj ludzi",
"login": "Zaloguj",
"logout": "Wyloguj",
"lowerYourHand": "Opuść swą rękę",
"lowerYourHand": "Opuść rękę",
"moreActions": "Więcej działań",
"mute": "Wycisz / Pogłośnij",
"mute": "Włącz / Wyłącz mikrofon",
"noAudioSignalTitle": "",
"noAudioSignalDesc": "",
"noAudioSignalDescSuggestion": "",
@@ -636,13 +636,13 @@
"pip": "Wprowadź tryb obrazu w obrazie",
"privateMessage": "Wyślij wiadomość prywatną",
"profile": "Edytuj swój profil",
"raiseHand": "Podnieś / Opuść swą rękę",
"raiseYourHand": "Podnieś swą rękę",
"raiseHand": "Podnieś / Opuść rękę",
"raiseYourHand": "Podnieś rękę",
"Settings": "Ustawienia",
"sharedvideo": "Udostępniaj wideo w Youtube",
"sharedvideo": "Udostępnij wideo w Youtube",
"shareRoom": "Zaproś kogoś",
"shortcuts": "Wyświetlanie skrótów",
"speakerStats": "Statystyki głośników",
"shortcuts": "Wyświetl skróty",
"speakerStats": "Statystyki mówców",
"startScreenSharing": "Zacznij współdzielenie ekranu",
"startSubtitles": "Uruchom napisy",
"stopScreenSharing": "Zatrzymaj współdzielenie ekranu",

View File

@@ -614,6 +614,7 @@
"speakerStats": "Toggle speaker statistics",
"tileView": "Toggle tile view",
"toggleCamera": "Toggle camera",
"toggleFilmstrip": "Toggle filmstrip",
"videomute": "Toggle mute video",
"videoblur": "Toggle video blur"
},

View File

@@ -369,12 +369,14 @@ class API {
* Notify external application (if API is enabled) that message was sent.
*
* @param {string} message - Message body.
* @param {boolean} privateMessage - True if the message was a private message.
* @returns {void}
*/
notifySendingChatMessage(message: string) {
notifySendingChatMessage(message: string, privateMessage: boolean) {
this._sendEvent({
name: 'outgoing-message',
message
message,
privateMessage
});
}

View File

@@ -53,7 +53,7 @@
"jquery-contextmenu": "2.4.5",
"jquery-i18next": "1.2.1",
"js-md5": "0.6.1",
"js-utils": "github:jitsi/js-utils#91c5e53ca5fa42907c88d56bc78254e6e56e058d",
"js-utils": "github:jitsi/js-utils#0b2cef90613a74777fefd98d4ee3eda3879809ab",
"jsrsasign": "8.0.12",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#a7950f8ebb489225c2e8bf41fe65f330b3de0874",

View File

@@ -164,7 +164,7 @@ export function getConferenceName(stateful: Function | Object): string {
|| subject
|| callDisplayName
|| (callee && callee.name)
|| _.startCase(safeDecodeURIComponent(room));
|| safeStartCase(safeDecodeURIComponent(room));
}
/**
@@ -351,3 +351,19 @@ export function sendLocalParticipant(
conference.setDisplayName(name);
}
/**
* A safe implementation of lodash#startCase that doesn't deburr the string.
*
* NOTE: According to lodash roadmap, lodash v5 will have this function.
*
* Code based on https://github.com/lodash/lodash/blob/master/startCase.js.
*
* @param {string} s - The string to do start case on.
* @returns {string}
*/
function safeStartCase(s = '') {
return _.words(`${s}`.replace(/['\u2019]/g, '')).reduce(
(result, word, index) => result + (index ? ' ' : '') + _.upperFirst(word)
, '');
}

View File

@@ -88,6 +88,7 @@ export default [
'disableLocalVideoFlip',
'disableNS',
'disableRemoteControl',
'disableRemoteMute',
'disableRtx',
'disableSuspendVideo',
'disableThirdPartyRequests',
@@ -126,6 +127,7 @@ export default [
'pcStatsInterval',
'preferH264',
'requireDisplayName',
'remoteVideoMenu',
'resolution',
'startAudioMuted',
'startAudioOnly',

View File

@@ -43,7 +43,9 @@ const INITIAL_RN_STATE = {
p2p: {
disableH264: false,
preferH264: true
}
},
remoteVideoMenu: {}
};
ReducerRegistry.register('features/base/config', (state = _getInitialState(), action) => {

View File

@@ -13,6 +13,12 @@ export const CALENDAR_ENABLED = 'calendar.enabled';
*/
export const CALL_INTEGRATION_ENABLED = 'call-integration.enabled';
/**
* Flag indicating if chat should be enabled.
* Default: enabled (true).
*/
export const CLOSE_CAPTIONS_ENABLED = 'close-captions.enabled';
/**
* Flag indicating if chat should be enabled.
* Default: enabled (true).

View File

@@ -64,6 +64,7 @@ export { default as IconSettings } from './settings.svg';
export { default as IconSignalLevel0 } from './signal_cellular_0.svg';
export { default as IconSignalLevel1 } from './signal_cellular_1.svg';
export { default as IconSignalLevel2 } from './signal_cellular_2.svg';
export { default as IconShare } from './share.svg';
export { default as IconShareDesktop } from './share-desktop.svg';
export { default as IconShareDoc } from './share-doc.svg';
export { default as IconShareVideo } from './shared-video.svg';

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" enable-background="new 0 0 50 50"><path d="M30.3 13.7L25 8.4l-5.3 5.3-1.4-1.4L25 5.6l6.7 6.7z"/><path d="M24 7h2v21h-2z"/><path d="M35 40H15c-1.7 0-3-1.3-3-3V19c0-1.7 1.3-3 3-3h7v2h-7c-.6 0-1 .4-1 1v18c0 .6.4 1 1 1h20c.6 0 1-.4 1-1V19c0-.6-.4-1-1-1h-7v-2h7c1.7 0 3 1.3 3 3v18c0 1.7-1.3 3-3 3z"/></svg>

After

Width:  |  Height:  |  Size: 361 B

View File

@@ -76,12 +76,12 @@ MiddlewareRegistry.register(store => next => action => {
} else {
// Sending the message if privacy notice doesn't need to be shown.
if (typeof APP !== 'undefined') {
APP.API.notifySendingChatMessage(action.message);
}
const { privateMessageRecipient } = state['features/chat'];
if (typeof APP !== 'undefined') {
APP.API.notifySendingChatMessage(action.message, Boolean(privateMessageRecipient));
}
if (privateMessageRecipient) {
conference.sendPrivateTextMessage(privateMessageRecipient.id, action.message);
_persistSentPrivateMessage(store, privateMessageRecipient.id, action.message);

View File

@@ -10,6 +10,7 @@ import {
sendAnalytics
} from '../../../analytics';
import { Icon, IconMenuDown, IconMenuUp } from '../../../base/icons';
import { translate } from '../../../base/i18n';
import { connect } from '../../../base/redux';
import { dockToolbox } from '../../../toolbox';
@@ -87,7 +88,12 @@ type Props = {
/**
* The redux {@code dispatch} function.
*/
dispatch: Dispatch<any>
dispatch: Dispatch<any>,
/**
* Invoked to obtain translated strings.
*/
t: Function
};
/**
@@ -338,10 +344,12 @@ class Filmstrip extends Component <Props> {
*/
_renderToggleButton() {
const icon = this.props._visible ? IconMenuDown : IconMenuUp;
const { t } = this.props;
return (
<div className = 'filmstrip__toolbar'>
<button
aria-label = { t('toolbar.accessibilityLabel.toggleFilmstrip') }
id = 'toggleFilmstripButton'
onClick = { this._onToolbarToggleFilmstrip }>
<Icon src = { icon } />
@@ -387,4 +395,4 @@ function _mapStateToProps(state) {
};
}
export default connect(_mapStateToProps)(Filmstrip);
export default translate(connect(_mapStateToProps)(Filmstrip));

View File

@@ -13,9 +13,18 @@ import {
View
} from 'react-native';
import { ColorSchemeRegistry } from '../../../../base/color-scheme';
import { AlertDialog, openDialog } from '../../../../base/dialog';
import { translate } from '../../../../base/i18n';
import { Icon, IconCancelSelection, IconCheck, IconClose, IconPhone, IconSearch } from '../../../../base/icons';
import {
Icon,
IconCancelSelection,
IconCheck,
IconClose,
IconPhone,
IconSearch,
IconShare
} from '../../../../base/icons';
import {
AvatarListItem,
HeaderWithNavigation,
@@ -23,6 +32,7 @@ import {
type Item
} from '../../../../base/react';
import { connect } from '../../../../base/redux';
import { beginShareRoom } from '../../../../share-room';
import { setAddPeopleDialogVisible } from '../../../actions.native';
@@ -39,6 +49,11 @@ import styles, {
type Props = AbstractProps & {
/**
* The color schemed style of the Header.
*/
_headerStyles: Object,
/**
* True if the invite dialog should be open, false otherwise.
*/
@@ -113,6 +128,7 @@ class AddPeopleDialog extends AbstractAddPeopleDialog<Props, State> {
this._onCloseAddPeopleDialog = this._onCloseAddPeopleDialog.bind(this);
this._onInvite = this._onInvite.bind(this);
this._onPressItem = this._onPressItem.bind(this);
this._onShareMeeting = this._onShareMeeting.bind(this);
this._onTypeQuery = this._onTypeQuery.bind(this);
this._setFieldRef = this._setFieldRef.bind(this);
}
@@ -137,7 +153,8 @@ class AddPeopleDialog extends AbstractAddPeopleDialog<Props, State> {
render() {
const {
_addPeopleEnabled,
_dialOutEnabled
_dialOutEnabled,
_headerStyles
} = this.props;
const { inviteItems, selectableItems } = this.state;
@@ -206,6 +223,9 @@ class AddPeopleDialog extends AbstractAddPeopleDialog<Props, State> {
renderItem = { this._renderItem } />
</View>
</SafeAreaView>
<SafeAreaView style = { [ styles.bottomBar, _headerStyles.headerOverlay ] }>
{ this._renderShareMeetingButton() }
</SafeAreaView>
</KeyboardAvoidingView>
</SlidingView>
);
@@ -349,6 +369,22 @@ class AddPeopleDialog extends AbstractAddPeopleDialog<Props, State> {
};
}
_onShareMeeting: () => void
/**
* Shows the system share sheet to share the meeting information.
*
* @returns {void}
*/
_onShareMeeting() {
if (this.state.inviteItems.length > 0) {
// The use probably intended to invite people.
this._onInvite();
} else {
this.props.dispatch(beginShareRoom());
}
}
_onTypeQuery: string => void
/**
@@ -526,6 +562,24 @@ class AddPeopleDialog extends AbstractAddPeopleDialog<Props, State> {
);
}
/**
* Renders a button to share the meeting info.
*
* @returns {React#Element<*>}
*/
_renderShareMeetingButton() {
const { _headerStyles } = this.props;
return (
<TouchableOpacity
onPress = { this._onShareMeeting }>
<Icon
src = { IconShare }
style = { [ _headerStyles.headerButtonText, styles.shareIcon ] } />
</TouchableOpacity>
);
}
_setFieldRef: ?TextInput => void
/**
@@ -567,6 +621,7 @@ class AddPeopleDialog extends AbstractAddPeopleDialog<Props, State> {
function _mapStateToProps(state: Object) {
return {
..._abstractMapStateToProps(state),
_headerStyles: ColorSchemeRegistry.get(state, 'Header'),
_isVisible: state['features/invite'].inviteDialogVisible
};
}

View File

@@ -23,6 +23,12 @@ export default {
flex: 1
},
bottomBar: {
alignItems: 'center',
flexDirection: 'row',
justifyContent: 'space-around'
},
clearButton: {
alignItems: 'center',
justifyContent: 'center',
@@ -124,6 +130,10 @@ export default {
width: ICON_SIZE + 16
},
shareIcon: {
fontSize: 42
},
unselectIcon: {
color: LIGHT_GREY,
fontSize: 16,

View File

@@ -40,6 +40,16 @@ type Props = {
*/
_bottomSheetStyles: StyleType,
/**
* Whether or not to display the kick button.
*/
_disableKick: boolean,
/**
* Whether or not to display the remote mute buttons.
*/
_disableRemoteMute: boolean,
/**
* True if the menu is currently open, false otherwise.
*/
@@ -75,7 +85,7 @@ class RemoteVideoMenu extends Component<Props> {
* @inheritdoc
*/
render() {
const { participant } = this.props;
const { _disableKick, _disableRemoteMute, participant } = this.props;
const buttonProps = {
afterClick: this._onCancel,
showLabel: true,
@@ -83,6 +93,19 @@ class RemoteVideoMenu extends Component<Props> {
styles: this.props._bottomSheetStyles.buttons
};
const buttons = [];
if (!_disableRemoteMute) {
buttons.push(<MuteButton { ...buttonProps } />);
}
if (!_disableKick) {
buttons.push(<KickButton { ...buttonProps } />);
}
buttons.push(<PinButton { ...buttonProps } />);
buttons.push(<PrivateMessageButton { ...buttonProps } />);
return (
<BottomSheet onCancel = { this._onCancel }>
<View style = { styles.participantNameContainer }>
@@ -93,10 +116,7 @@ class RemoteVideoMenu extends Component<Props> {
{ this.props._participantDisplayName }
</Text>
</View>
<MuteButton { ...buttonProps } />
<KickButton { ...buttonProps } />
<PinButton { ...buttonProps } />
<PrivateMessageButton { ...buttonProps } />
{ buttons }
</BottomSheet>
);
}
@@ -130,13 +150,15 @@ class RemoteVideoMenu extends Component<Props> {
*/
function _mapStateToProps(state, ownProps) {
const { participant } = ownProps;
const { remoteVideoMenu = {}, disableRemoteMute } = state['features/base/config'];
const { disableKick } = remoteVideoMenu;
return {
_bottomSheetStyles:
ColorSchemeRegistry.get(state, 'BottomSheet'),
_bottomSheetStyles: ColorSchemeRegistry.get(state, 'BottomSheet'),
_disableKick: Boolean(disableKick),
_disableRemoteMute: Boolean(disableRemoteMute),
_isOpen: isDialogOpen(state, RemoteVideoMenu_),
_participantDisplayName: getParticipantDisplayName(
state, participant.id)
_participantDisplayName: getParticipantDisplayName(state, participant.id)
};
}

View File

@@ -26,6 +26,16 @@ declare var interfaceConfig: Object;
*/
type Props = {
/**
* Whether or not to display the kick button.
*/
_disableKick: boolean,
/**
* Whether or not to display the remote mute buttons.
*/
_disableRemoteMute: Boolean,
/**
* Whether or not the participant is a conference moderator.
*/
@@ -157,6 +167,8 @@ class RemoteVideoMenuTriggerButton extends Component<Props> {
*/
_renderRemoteVideoMenu() {
const {
_disableKick,
_disableRemoteMute,
_isModerator,
initialVolumeValue,
isAudioMuted,
@@ -169,22 +181,27 @@ class RemoteVideoMenuTriggerButton extends Component<Props> {
const buttons = [];
if (_isModerator) {
buttons.push(
<MuteButton
isAudioMuted = { isAudioMuted }
key = 'mute'
participantID = { participantID } />
);
buttons.push(
<MuteEveryoneElseButton
key = 'mute-others'
participantID = { participantID } />
);
buttons.push(
<KickButton
key = 'kick'
participantID = { participantID } />
);
if (!_disableRemoteMute) {
buttons.push(
<MuteButton
isAudioMuted = { isAudioMuted }
key = 'mute'
participantID = { participantID } />
);
buttons.push(
<MuteEveryoneElseButton
key = 'mute-others'
participantID = { participantID } />
);
}
if (!_disableKick) {
buttons.push(
<KickButton
key = 'kick'
participantID = { participantID } />
);
}
}
if (remoteControlState) {
@@ -236,9 +253,13 @@ class RemoteVideoMenuTriggerButton extends Component<Props> {
*/
function _mapStateToProps(state) {
const participant = getLocalParticipant(state);
const { remoteVideoMenu = {}, disableRemoteMute } = state['features/base/config'];
const { disableKick } = remoteVideoMenu;
return {
_isModerator: Boolean(participant?.role === PARTICIPANT_ROLE.MODERATOR)
_isModerator: Boolean(participant?.role === PARTICIPANT_ROLE.MODERATOR),
_disableKick: Boolean(disableKick),
_disableRemoteMute: Boolean(disableRemoteMute)
};
}

View File

@@ -1,5 +1,6 @@
// @flow
import { getFeatureFlag, CLOSE_CAPTIONS_ENABLED } from '../../base/flags';
import { translate } from '../../base/i18n';
import { IconClosedCaption } from '../../base/icons';
import { connect } from '../../base/redux';
@@ -20,5 +21,24 @@ class ClosedCaptionButton
toggledLabel = 'transcribing.stop';
}
export default translate(connect(_abstractMapStateToProps)(
ClosedCaptionButton));
/**
* Maps (parts of) the redux state to the associated props for this component.
*
* @param {Object} state - The redux state.
* @param {Object} ownProps - The properties explicitly passed to the component
* instance.
* @private
* @returns {Props}
*/
export function mapStateToProps(state: Object, ownProps: Object) {
const { transcribingEnabled } = state['features/base/config'];
const enabled = getFeatureFlag(state, CLOSE_CAPTIONS_ENABLED, true) && transcribingEnabled;
const { visible = enabled } = ownProps;
return {
..._abstractMapStateToProps(state, ownProps),
visible
};
}
export default translate(connect(mapStateToProps)(ClosedCaptionButton));

View File

@@ -22,5 +22,4 @@ class ClosedCaptionButton
toggledLabel = 'toolbar.stopSubtitles';
}
export default translate(connect(_abstractMapStateToProps)(
ClosedCaptionButton));
export default translate(connect(_abstractMapStateToProps)(ClosedCaptionButton));

View File

@@ -64,11 +64,12 @@ function _mapStateToProps(state: Object, ownProps: Props) {
const localParticipant = getLocalParticipant(state);
const isModerator = localParticipant.role === PARTICIPANT_ROLE.MODERATOR;
const { visible } = ownProps;
const { disableRemoteMute } = state['features/base/config'];
return {
isModerator,
localParticipantId: localParticipant.id,
visible: visible && isModerator
visible: visible && isModerator && !disableRemoteMute
};
}

View File

@@ -7,6 +7,7 @@ import type { Dispatch } from 'redux';
import { createWelcomePageEvent, sendAnalytics } from '../../analytics';
import { appNavigate } from '../../app';
import { isCalendarEnabled } from '../../calendar-sync';
import { isRecentListEnabled } from '../../recent-list/functions';
/**
* {@code AbstractWelcomePage}'s React {@code Component} prop types.
@@ -18,6 +19,11 @@ type Props = {
*/
_calendarEnabled: boolean,
/**
* Whether the recent list is enabled
*/
_recentListEnabled: Boolean,
/**
* Room name to join to.
*/
@@ -239,6 +245,7 @@ export class AbstractWelcomePage extends Component<Props, *> {
export function _mapStateToProps(state: Object) {
return {
_calendarEnabled: isCalendarEnabled(state),
_recentListEnabled: isRecentListEnabled(),
_room: state['features/base/conference'].room,
_settings: state['features/base/settings']
};

View File

@@ -285,7 +285,7 @@ class WelcomePage extends AbstractWelcomePage {
return null;
}
const { _calendarEnabled, t } = this.props;
const { _calendarEnabled, _recentListEnabled, t } = this.props;
const tabs = [];
@@ -296,10 +296,16 @@ class WelcomePage extends AbstractWelcomePage {
});
}
tabs.push({
label: t('welcomepage.recentList'),
content: <RecentList />
});
if (_recentListEnabled) {
tabs.push({
label: t('welcomepage.recentList'),
content: <RecentList />
});
}
if (tabs.length === 0) {
return null;
}
return (
<Tabs

View File

@@ -46,6 +46,7 @@ local function check_for_max_occupants(event)
-- For each person in the room that's not on the whitelist, subtract one
-- from the count.
for _, occupant in room:each_occupant() do
user, domain, res = split_jid(occupant.bare_jid);
if not whitelist:contains(domain) and not whitelist:contains(user..'@'..domain) then
slots = slots - 1
end

3
resources/robots.txt Normal file
View File

@@ -0,0 +1,3 @@
User-agent: *
Allow: /$
Disallow: /