Compare commits

...

326 Commits

Author SHA1 Message Date
Hristo Terezov
e7cb719be0 feat(jibri-queue): JibriQueue support. 2020-08-18 12:57:48 -05:00
Tudor-Ovidiu Avram
e6676bb09a fix(prejoin) fix css loading path 2020-08-12 10:55:26 +03:00
Hristo Terezov
8e9a51f742 feat(Watermarks): Add deafault logo prop. 2020-08-11 18:24:44 -05:00
Saúl Ibarra Corretgé
004c1b65ad misc: drop babel.config.js file
This leaves jest testing non-functional, but having a babel.config.js interferes
with React Native.

Fixes: https://github.com/jitsi/jitsi-meet/issues/7450
2020-08-10 16:39:50 +02:00
Saúl Ibarra Corretgé
eabcc078ef android: fix adb reverse command in case of non-default port 2020-08-10 16:39:29 +02:00
Saúl Ibarra Corretgé
5b1f852783 rn: always reset the transform cache when starting the packager
It can help catch very weird bugs which are only triggered after a reset.
2020-08-10 16:39:29 +02:00
Saúl Ibarra Corretgé
5cf9a76f9e android: bump minimum API level to 23
Android < 23 is currently less than 3% for us so let's try to lower the
maintenance burden. Users can still download an older version no problem.
2020-08-10 16:37:20 +02:00
Saúl Ibarra Corretgé
3f33adc5d0 android: target API level 29
This will be mandatory later in the year for updating apps and it already is for
new apps.

https://support.google.com/googleplay/android-developer/answer/113469#targetsdk
2020-08-10 16:37:20 +02:00
Saúl Ibarra Corretgé
d9250aa986 android: bring back activity to the foreground when exiting PiP
When exiting PiP with by pressing the X the onPictureInPictureModeChanged method
is called. Since onResume is called a while after, in case the maximize button
is called, it's not easy to know if the user pressed the X button, and that was
the cause for exiting PiP.

So, in order to avoid show the user they are still in the meeting, bring the
activity to the foregound so they can hangup.
2020-08-10 16:36:30 +02:00
James Carbine
5b10d8f5ef Add config to hide logo-deep-linking on deeplinking page (#7346)
This adds the ability to configure hiding the logo on the deep linking page.
HIDE_DEEP_LINKING_LOGO defaults to false in the config.
The implementation also defaults to showing the logo if HIDE_DEEP_LINKING_LOGO
is missing from the config.
2020-08-10 09:30:16 -05:00
settyan117
02885ea716 lang: updated Japanese translation 2020-08-10 09:34:39 +02:00
Florian
7e70a57eb3 lang: update French translation 2020-08-10 09:33:04 +02:00
Alexey Napalkov
dbaa1168b3 lang: update Russian translation 2020-08-10 09:32:16 +02:00
Fabricio Oliveira
b1d691ca07 lang: update brazilian portuguese translation 2020-08-10 09:30:30 +02:00
Jaroslav Lichtblau
10a4612230 lang: update Czech translation 2020-08-10 09:29:42 +02:00
Aaron van Meerten
21767fa7cf Merge pull request #7481 from jitsi/aaronkvanmeerten/token-util-cache-in-object
FEAT: jwt pubkey cache inside object
2020-08-07 14:18:24 -05:00
Aaron van Meerten
0bd100f027 FIX: prosody: comment on destroy_request 2020-08-07 13:16:17 -05:00
Aaron van Meerten
f14a595462 FIX: prosody: destroy_request check 2020-08-07 13:15:55 -05:00
Hristo Terezov
5e4b8c747c feat(prejoin): Hide invite link 2020-08-07 12:28:05 -05:00
Aaron van Meerten
11ee71a51c FEAT: jwt pubkey cache inside object
Allows each module that does token validation to have its own cache
2020-08-07 11:51:44 -05:00
Mihai Uscat
c998d83f34 feat(welcome): Add variables. 2020-08-07 12:02:14 +03:00
Jaya Allamsetty
1a957ed85b feat(video-quality): Impose max-bitrates on video sender based on videoQuality settings (#7467)
* feat(video-quality): Impose max-bitrates on video sender based on config.js settings
Update to lib-jitsi-meet@latest
f74cd0abe9
2020-08-06 14:24:33 -04:00
Jaya Allamsetty
1dbb47b84f deps: lib-jitsi-meet@latest 2020-08-06 08:33:28 -04:00
paweldomas
4adaa6f1fd fix(last-n-limits): crash on undefined 2020-08-06 09:02:21 +02:00
Paweł Domas
b3b561f27a feat(video quality): add maxFullResolutionParticipants (#7403)
Add a config option with the default value of 2, which will cap the max recv video quality to SD if there's more than 2 participants in the conference while in the tile view mode.
2020-08-05 10:10:14 -05:00
Jesús Espino
a6a19a3002 Fix lint error 2020-08-05 10:07:18 -04:00
Jesús Espino
1426a5b4bc Restore dots menu on mobile 2020-08-05 10:07:18 -04:00
sellth
858ee557d4 lang: update German translation 2020-08-05 09:34:15 +02:00
Jaya Allamsetty
bd64c14aaa fix: Send SS stopped analytics event when SS was started in video mute state 2020-08-04 19:30:10 -04:00
Manuel Garcia
ce286f9be8 lang: fix typo 2020-08-04 10:02:21 +02:00
Paweł Domas
cc9cb6a874 feat(config): add last N limit mapping (#7422)
Adds 'lastNLimits' config value which allows to define last N value per number of participants.
See config.js for more details.
2020-08-03 12:39:17 -05:00
Atrate
168dbd6276 android: make app movable to SD card 2020-08-03 14:50:47 +02:00
Jesús Espino
400c86ad5e Adding responsive to jitsi logo, buttons and hiding some part of the interface (#7380)
* Adding responsive to jitsi logo, buttons and hiding some part of the interface
* moving media types thresholds to variables and apply only to screen
* hide chrome extension banner on very small view
* Hide filmstrip only on desktop narrow windows
2020-07-31 07:53:19 -04:00
Matthias Wuttke
b0650b8448 Pass JWT token to close page 2020-07-31 07:47:49 +02:00
dependabot[bot]
027cc1be96 chore(deps): bump elliptic from 6.5.2 to 6.5.3
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.2 to 6.5.3.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.2...v6.5.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-07-30 19:07:16 +02:00
ButterflyOfFire
9b32811ff2 lang: add missing kabyle language
Fixing missing kabyle language in the main file.
2020-07-29 17:05:27 +02:00
Saúl Ibarra Corretgé
a67d0fbf6c chore: remove some cycles 2020-07-29 09:31:38 +02:00
Saúl Ibarra Corretgé
af5d4c850b external_api: filter postis events origin 2020-07-28 11:36:42 +02:00
kauczu
7bfb2fc219 lang: update/fix Polish translation, add missing fields in main-pl.json (#7395)
* lang: update/fix Polish translation, add missing fields in main-pl.json

Based on actual main.json, merge #7382 and my translation.

    fixed incorrect context meaning of some fields,
    added missing fields and translated them,
    translated fields left in empty qoutes

* Update main-pl.json

* Update main-pl.json

* Update main-pl.json
2020-07-24 12:50:18 -05:00
Elliot Cooper
b814827df1 misc: replace certbot-auto with certbot 2020-07-24 16:35:52 +02:00
Bettenbuk Zoltan
240b033e76 feat: auto tile view 2020-07-24 11:06:34 +02:00
paweldomas
00b41dbb41 add mod_websocket patch for session event
It's to be used in docker-jitsi-meet to patch older
Prosody versions until this change becomes available.
2020-07-23 16:29:45 -05:00
damencho
2689be5d24 chore: Update lib-jitsi-meet. 2020-07-23 14:49:52 -05:00
damencho
f3da009d61 feat: Updates @atlaskit/flag to use the testId prop for integration tests. 2020-07-23 14:49:52 -05:00
damencho
ddc2b4f26e fix: Adds display name to notifications about lobby operations.
Display name for lobby operations notifications are taken from the list of knocking participants which is available only to moderators. In case of not all moderators the notifications were broken.
2020-07-23 14:49:52 -05:00
damencho
b106e51a10 feat: Adds id to the notifications and buttons so we can check for them in the integration tests. 2020-07-23 14:49:52 -05:00
damencho
0cef706b6a feat: Changes security dialog button to toggle dialog. 2020-07-23 14:49:52 -05:00
damencho
b9c20a3fd4 fix: Fixes syncing state about lobby in security dialog. 2020-07-23 14:49:52 -05:00
damencho
23507da59a feat: Adds id to the notifications so we can check for them in the integration tests. 2020-07-23 14:49:52 -05:00
Gabriel
4bfc80ecb9 external_api: add ability to toggle lobby 2020-07-23 16:03:53 +02:00
Saúl Ibarra Corretgé
52ce8031a3 Update react/features/chat/components/native/Chat.js 2020-07-23 15:45:30 +02:00
Saúl Ibarra Corretgé
aa9f06fa84 Update react/features/chat/components/native/Chat.js 2020-07-23 15:45:30 +02:00
Saúl Ibarra Corretgé
a758e98101 Update react/features/chat/components/native/Chat.js 2020-07-23 15:45:30 +02:00
tombrown86
63d4c2b84b onClose to return true to imply modal should close 2020-07-23 15:45:30 +02:00
tombrown86
4161e7bfe1 fix: no new msg notifications after opening chat modal [NATIVE]
call TOGGLE_CHAT action when chat modal is closed to correctly update chat isOpen state
2020-07-23 15:45:30 +02:00
Saúl Ibarra Corretgé
1c3cf325cb analytics: add app name to permanent properties 2020-07-23 15:40:02 +02:00
Saúl Ibarra Corretgé
fdbd681c8f config: fix opusMaxAverageBitrate option name
Must match the lib-jitsi-meet counterpart.

Fixes: https://github.com/jitsi/jitsi-meet/issues/7384
2020-07-23 15:14:48 +02:00
Tudor-Ovidiu Avram
f6433668d5 fix(prejoin) hide skip prejoin for exposed app 2020-07-23 13:22:28 +02:00
Tudor-Ovidiu Avram
1ae5630590 fix(prejoin) fix libs path 2020-07-23 13:22:28 +02:00
Tudor-Ovidiu Avram
b1e12d33ab feat(embed) implement embed meeting feature 2020-07-23 13:21:05 +02:00
Michał Orman
28094947a7 lang: updated Polish translations 2020-07-23 11:39:48 +02:00
Kevin Olbrich
a23dac2ab6 Add remark about focus username
https://github.com/jitsi/jitsi-meet/issues/7376
2020-07-22 19:45:12 -05:00
Tristian Flanagan
9e7a477797 feat(blur): terminate blur web worker when disabled (#7347)
* feat(blur): terminate blur web worker when disabled
2020-07-22 10:37:17 -04:00
Tudor-Ovidiu Avram
0fc748dc44 ui: create reusable copy button 2020-07-22 15:53:43 +02:00
Saúl Ibarra Corretgé
b831bb8350 config: add roomPasswordNumberOfDigits to whitelist 2020-07-22 15:23:38 +02:00
Saúl Ibarra Corretgé
16547b91a5 rn: fix overriding user-selected server URL
Fixes: https://github.com/jitsi/jitsi-meet/issues/7373
2020-07-22 15:23:09 +02:00
Gabriel Imre
1e3e15fc72 fix: use consistent moderator semantics
Use the same moderator semantics when adding items into the remote video menu as when showing/hiding the items themselves.
2020-07-22 10:41:41 +02:00
Saúl Ibarra Corretgé
9d6e21b77b security-dialog: restore digit-only password functionality 2020-07-21 10:44:39 -05:00
Dominik Wagner
48a58f8dae ios: specify the correct keyboard type and content
This way autocomplete and keyboards work correctly.
2020-07-21 17:06:41 +02:00
Đặng Minh Tiến
eb1ef0fa9c Update JitsiStreamPresenterEffect.js (#7362)
* Update JitsiStreamPresenterEffect.js
Create/terminate the Web Worker on effect start/stop so that we don't leak them.
2020-07-21 10:01:38 -04:00
Saúl Ibarra Corretgé
eaa715879a rn: update versions 2020-07-21 15:49:08 +02:00
Saúl Ibarra Corretgé
fde7cf4ab8 chat: fix crash on mobile 2020-07-21 15:25:19 +02:00
Saúl Ibarra Corretgé
46b444c498 settings: only import required action
Fixes crash on mobile due to chained imports.
2020-07-21 15:25:19 +02:00
Saúl Ibarra Corretgé
3cbadc72a1 analytics: only import required constant 2020-07-21 15:25:19 +02:00
Saúl Ibarra Corretgé
ddaaeccafa android: disable PiP on Android Go devices
Despite running Android 8.1, they don't support Picture-in-Picture.
2020-07-21 14:03:41 +02:00
Saúl Ibarra Corretgé
0751c6ab48 ios: fix uploading dSYMs to Crashlytics
Use Fastlane to get them from Apple after processing, them upload them.

Also make sure WebRTC dSYMs are included when uploading.
2020-07-21 13:33:18 +02:00
Saúl Ibarra Corretgé
76e4929add rn,tile-view: render display name on top of participant view
Makes the tiles consistent as the participant view is equally sized and the
avatar is always centered in the tile.
2020-07-21 13:18:48 +02:00
Saúl Ibarra Corretgé
e39c8d8ed6 rn,tile-view: render a larger avatar in tile view mode 2020-07-21 13:18:48 +02:00
Aaron van Meerten
4687187cca Merge pull request #7358 from bgrozev/update-lib-jitsi-meet
chore: Update lib-jitsi-meet.
2020-07-20 13:23:37 -04:00
Boris Grozev
f2c3401a79 chore: Update lib-jitsi-meet. 2020-07-20 11:43:07 -05:00
Saúl Ibarra Corretgé
43189f3e66 deps: lib-jitsi-meet@latest 2020-07-17 16:50:19 +02:00
Michael Telatynski
335b43036d Improve accessibility of Buttons in Webapp
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-07-17 16:32:33 +02:00
Vlad Piersec
b3ca51c7d0 feat(prejoin): Add settings options for prejoin page 2020-07-17 13:40:29 +03:00
Mihai Uscat
f9d545c531 feat(chat): Make chat push content to the side in tile view 2020-07-17 11:19:18 +03:00
Mihai Uscat
5f5468995f feat(chat): Make chat push content to the side in large view 2020-07-17 10:04:56 +03:00
paweldomas
bf7aa39947 ref: one place for setting max recv frame height
Moves the logic from all different places into single state
listener to combine all inputs into a single output.
2020-07-16 10:14:59 -05:00
paweldomas
ad948bdbe2 feat(StateListenerRegistry): add 'deepEquals' option
Adds an extra 'options' argument to the register method which
allows to use deep equality instead of a shallow one when comparing
the current and the previous selections.
2020-07-16 10:14:59 -05:00
Gabriel Imre
29366a0029 feat: add test hint for grant moderator availability 2020-07-16 13:54:03 +02:00
dependabot[bot]
0bec7c7ab7 chore(deps): bump lodash from 4.17.13 to 4.17.19
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.13 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.13...4.17.19)

Signed-off-by: dependabot[bot] <support@github.com>
2020-07-16 09:41:38 +02:00
Andrei Gavrilescu
29805edd02 feat(rtcstats): Integrate rtcstats (#6945)
* Integrate rtcstats

* expcetion handling / clean up

* order imports

* config fix

* remove mock amplitude handler

* additional comments

* lint fix

* address code review

* move rtcstats middleware

* link to jitsi rtcstats package

* address code review

* address code review / add ws onclose handler

* add display name / bump rtcstats version

* resolve import error
2020-07-15 18:22:00 +03:00
George Politis
11fd5363ce fix: Avoid overwriting the max resolution requested by the tile-view. (#7320)
Part of [1] replaces a `setPreferredVideoQuality` call with a
`setMaxReceiverVideoQuality` call. The change was part of a bigger
changeset that adds logic that tries to adjust the max based on reduced
ui turned on or off and allow to set prefered through the config.

However, by calling `setMaxReceiverVideoQuality` instead of
`setPreferredVideoQuality`, the new feature overrides the lower
resolution requested by tile-view earlier in some occasions.

This PR reverts back to using `setPreferredVideoQuality` instead of
`setMaxReceiverVideoQuality` as this achieves the same result without
overwriting the max set by the tile-view.

NOTE that this is a quick-fix and all the handling related to setting
the receive resolution will be reworked soon.

[1]: 7d513738d2
2020-07-15 15:55:30 +02:00
Tudor-Ovidiu Avram
1790c71c80 fix(disconnect) Fix quick disconnect errors 2020-07-15 15:32:56 +02:00
Saúl Ibarra Corretgé
36d95ed51f rn,conference: show lonely experience only after joining
Showing the modal earlier is weird because it will be closed as soon as we
connect. Also, we don't know if we are going to be alone until we join.
2020-07-15 15:32:34 +02:00
Vlad Piersec
ef0af1a8c0 fix(prejoin): Show decoded version of meeting uri 2020-07-15 13:21:36 +02:00
Gabriel Imre
b85cd2348f feat: add grant moderator functionality 2020-07-15 12:13:28 +02:00
Vlad Piersec
035f720a50 feat(prejoin): Add 'skip prejoin' button 2020-07-15 11:36:37 +02:00
yuriikaidan
c8444a9a0d lang: update Polish translation 2020-07-15 11:05:50 +02:00
utkarshmarwaha
7f5751b918 rn,flags: add flag to show/hide video share button 2020-07-15 10:48:56 +02:00
Dan Dascalescu
fc6bd3667c config: fix typo 2020-07-15 10:44:40 +02:00
Ivy
2c42dd0773 lang: update Japanese 2020-07-15 10:44:04 +02:00
vp8x8
1891ce0b24 fix(prejoin): Align avatar image on small screens (#7300)
Fixes: #7296
2020-07-15 10:43:00 +02:00
Mutusen
e34c5673b2 lang: update Esperanto translation 2020-07-15 10:24:10 +02:00
NicolasD
41ba55a6a9 rn,flags: add feature flag to enable / disable conference timer 2020-07-15 10:22:35 +02:00
Дамян Минков
758b60f92b fix: Updates coturn config on update. (#7306)
* fix: Updates coturn config on update.

* fix: Updates console message.
2020-07-14 13:16:53 -05:00
paweldomas
fcc69b92bb deps: update LJM to bring in new audio levels and e2ee tweaks
Updates LJM to ff1813cbb2e7d36f1cc0bbc2b8baa0a16c6346a4
2020-07-14 12:01:18 -05:00
Julian Vos
a697caea03 lang: update Dutch translation 2020-07-14 13:42:03 +02:00
abora8x8
5b89709483 Add hook for creating lobby before participants join (#7273)
* Add hook for create lobby

* Remove duplicated code
2020-07-13 11:29:35 -05:00
George Politis
e4ce3928dc feat: Exposes the max enabled resolution in the connection stats popover. (#7278)
* feat: Exposes the max enabled resolution in the connection stats popover.
* deps: lib-jitsi-meet@latest
2020-07-13 17:20:59 +02:00
plokta
b0188a7184 config: Add option to set preferred audio bitrate. (#7072)
The maxaveragebitrate parameter to be used by Opus can be configured
through the new opusMaxAvgBitrate config option. Values are restricted
by Opus to integers between 6000 to 510000. Works for non-p2p only.

move option to Audio section, add documentation

Co-authored-by: plokta <dev@plokta.eu>
2020-07-11 10:33:49 +02:00
Saúl Ibarra Corretgé
53281c2d42 analytics: avoid error log when there are no handlers 2020-07-10 17:55:18 +02:00
damencho
3da1b65757 fix: Fixes import of moved function. 2020-07-10 08:22:22 -05:00
Tudor-Ovidiu Avram
0e5091adba feat(prejoin) Expose prejoin app 2020-07-10 14:24:06 +02:00
Tudor-Ovidiu Avram
f376542441 feat(prejoin) cache media start options when on prejoin screen 2020-07-10 14:24:06 +02:00
Mihai Uscat
bd65108692 fix(SecurityDialog): Fix password action spacing 2020-07-10 13:26:48 +02:00
Saúl Ibarra Corretgé
546b0abe32 misc: add script to update LJM to the latest commit 2020-07-10 12:44:29 +02:00
Saúl Ibarra Corretgé
62ad7d3451 deps: lib-jitsi-meet@latest 2020-07-10 11:31:34 +02:00
ALAGBE Sola
5bc3128c71 config: fix typo 2020-07-10 11:10:19 +02:00
Saúl Ibarra Corretgé
b91d6b97a9 deps: jitsi/js-utils@1.0.0 2020-07-10 10:38:49 +02:00
Saúl Ibarra Corretgé
ce812591f9 conference: fix not applying max recv constraints
They also need to be applied when changing conferences.
2020-07-09 08:40:56 +02:00
Saúl Ibarra Corretgé
f32140c4b7 rn: set default resolution to 360p (experiment) 2020-07-09 08:40:56 +02:00
Saúl Ibarra Corretgé
7d513738d2 rn,flags: add ability to override resolution using a flag
Also, use the configured resolution to set it as the max received frame size.
2020-07-09 08:40:56 +02:00
Jaya Allamsetty
8d1bde3cb1 chore(deps): update lib-jitsi-meet to latest 2020-07-08 14:43:24 -04:00
Saúl Ibarra Corretgé
95825dcdd7 config: add flag to disable the E2EE support
This is useful for testing insertable streams related issues.
2020-07-08 17:19:36 +02:00
Saúl Ibarra Corretgé
a61f272303 deps: lib-jitsi-meet@latest 2020-07-08 17:19:36 +02:00
Vlad Piersec
3538761543 fix(prejoin): Don't add video track to connection on start if video muted 2020-07-08 15:58:13 +03:00
motiwardi
f22d5ed629 android: added configuration for user CA root trust 2020-07-08 14:50:56 +02:00
Saúl Ibarra Corretgé
f30dd9d881 deps: react-native-webrtc@1.84.0 2020-07-08 14:17:06 +02:00
Florian
4a3cd2596a Update main-fr.json
Translation 'prejoin'
2020-07-08 07:09:39 -05:00
Maxence Dalmais
4e1f42a665 Update mod_muc_poltergeist.lua
Add avatar to user context so it is picked by the web interface
2020-07-08 07:08:50 -05:00
Florian
1fff5d2567 Update main-fr.json
Some translations for "invite"
2020-07-07 10:48:53 -05:00
Florian
bbcc40a97e Update main-fr.json
Translate for "Add" in security option
2020-07-07 10:47:52 -05:00
Florian
bbf76296ed Update KnockingParticipantList.js
In order to translate the title.. Pull request #7246
2020-07-07 08:55:03 -05:00
Florian
e0b3a81a41 Update main-fr.json
Fix translate FR and add "Security" translations
2020-07-07 08:41:41 -05:00
Florian
1c122705bf Update main.json with missing KnockingParticipantList string (#7246)
Adding future translation possibilities
2020-07-07 08:40:18 -05:00
Frank de Lange
29c16e42bd Move STUN/TURN to IANA-assigned ports - 3478 and 5349 (TLS) (#6172)
* Move STUN/TURN to IANA-assigned ports - 3478 and 5349 (TLS)

* Change remaining references to TURNS port from 4445 to 5349

* Change back TURNS to 443
2020-07-07 08:14:28 -05:00
Cem Ibrahim ARI
8a19a34d19 fixed non valid json turkish language file 2020-07-07 08:00:25 -05:00
Tudor-Ovidiu Avram
d5832f226d fix(dialout) whitelist dialout flag 2020-07-07 11:00:49 +02:00
Saúl Ibarra Corretgé
4cfc8cd7a2 deps: update clean-css (reland)
Fix the incorrect paths (was a breaking change in version 4) by using the
`--skip-rebase` cli option.
2020-07-06 21:16:14 +02:00
Bettenbuk Zoltan
873ede0e06 feat: lobby related notifications 2020-07-06 17:31:16 +02:00
damencho
f73e9947c0 fix: Uses room jids for the lobby notifications. 2020-07-06 09:56:01 -05:00
Saúl Ibarra Corretgé
82711b3f23 Merge pull request #7226 from saghul/update-turn-cfg
turn: update default coturn configuration
2020-07-03 20:15:12 +02:00
Saúl Ibarra Corretgé
2f841fab73 turn: update default coturn configuration 2020-07-03 17:36:04 +02:00
Дамян Минков
b3a2905849 feat: Sends json messages notifying for lobby actions. (#7209)
* feat: Sends json messages notifying for lobby actions.

* squash: Fixes quotes to be consistent.

* fix: Fixes attempt to call global 'formdecode' (a nil value).
2020-07-03 08:26:44 -05:00
Vlad Piersec
5f579e9a15 fix(prejoin): Make display name mandatory only for lobby
A user should not be forced to enter a display name if the lobby is not enabled
for the room.
2020-07-03 16:13:54 +03:00
Vlad Piersec
ea2ea89ef7 fix(prejoin): dialout popup buttons 2020-07-03 11:49:25 +03:00
Vlad Piersec
a5f17a8033 feat(prejoin): Show avatar image on prejoin screen 2020-07-03 11:41:19 +03:00
Florian
4c6e9e7788 lang: update French translation 2020-07-03 10:36:58 +02:00
Saúl Ibarra Corretgé
a7e0df2623 toolbox: fix missing key prop
Fixes a React warning.
2020-07-03 10:35:35 +02:00
Hristo Terezov
da9a70129e Revert: clean-css update due to broken paths. 2020-07-02 15:30:15 -05:00
damencho
6d3d15a64b feat: Adds an option to validate a recording token. 2020-07-02 12:51:14 -05:00
damencho
b10a45bf98 fix: Fixes generating self-signed certificate.
The wrong quotes error:
req: Error on line 354 of config file "/dev/fd/63"
Error Loading extension section SAN
140403719438784:error:0E06C069:configuration file routines:NCONF_get_section:no conf:../crypto/conf/conf_lib.c:245:

Having the ip and specifying dns:
Error Loading extension section SAN
140127168778688:error:220A4076:X509 V3 routines:a2i_GENERAL_NAME:bad ip address:../crypto/x509v3/v3_alt.c:457:value=jitsi.example.com
140127168778688:error:22098080:X509 V3 routines:X509V3_EXT_nconf:error in extension:../crypto/x509v3/v3_conf.c:47:name=subjectAltName, value=DNS:localhost,DNS:jitsi.example.com,IP:jitsi.example.com
2020-07-02 10:33:09 -05:00
paweldomas
858a3d953c deps: LJM e66cc365014cd429280a95a379ad62d993217f6b
Update lib-jitsi-meet which adds the setNetworkInfo method.
2020-07-01 19:31:48 -05:00
paweldomas
1ff27b7298 fix: store.getState() called while the reducer is executing 2020-07-01 19:31:48 -05:00
paweldomas
bc43f00d28 feat: pass network info to LJM 2020-07-01 19:31:48 -05:00
Imre Faragó
bfd5db355d prosody muc_size plugin, room get info error fix (Traceback[httpserver]: /usr/lib/prosody/util/async.lua:137: /prosody-plugins/mod_muc_size.lua:141: attempt to concatenate local 'subdomain' (a nil value) 2020-07-01 08:04:41 -05:00
Дамян Минков
a4ca247056 Lobby required displayname (#7197)
* ref: Rename jitsi_bosh_query_room to jitsi_web_query_room.

This is no longer bosh only and is available for both bosh and websocket sessions.

* feat: Adds feature to disco-info indicating that display name is required.

* feat: Adds option to disable checking whether display name is required.

* ref: Clears auth_token when verification fails.

* squash: Fixing comments.

* squash: Updates to latest lib-jitsi-meet.
2020-06-30 08:15:08 -05:00
Quentí
eac891585b lang: update Occitan 2020-06-30 15:02:16 +02:00
Bettenbuk Zoltan
7d62020787 feat: add moderated service link to welcome page 2020-06-30 12:39:46 +02:00
Saúl Ibarra Corretgé
7d18183bf9 deps: css-loader@3.6.0 2020-06-30 11:27:39 +02:00
Saúl Ibarra Corretgé
346dac476a deps: clean-css@4.3.0 2020-06-30 11:27:39 +02:00
Saúl Ibarra Corretgé
b4ecef429a doc: add H1 to SECURITY.md 2020-06-30 09:07:57 +02:00
Dan Dascalescu
ea07515138 docs: improve English in config.js 2020-06-30 09:07:25 +02:00
Dan Dascalescu
79231914b9 docs: fix typo in interface_config.js 2020-06-30 09:06:38 +02:00
Jaya Allamsetty
0e1ecd3256 fix: disable audio/video settings popup on mobile browsers
Mobile devices do not support capture from multiple cameras/mics at a time.
2020-06-30 08:58:36 +02:00
Dan Dascalescu
0d15c01077 doc: TOOLBAR_BUTTONS clarifications 2020-06-30 08:57:25 +02:00
Jaya Allamsetty
216801720a chore(deps): update lib-jitsi-meet 2020-06-29 12:31:11 -04:00
Samuel Retika
312813e677 Adding isSharingScreen() to external API 2020-06-29 11:24:45 -04:00
Vlad Piersec
2b5787163e fix(prejoin): Replace the stored audio/video tracks when device list changes
When on prejoin screen, if the device list changes (devices are added or removed),
the newly created tracks do not properly replace the old ones, resulting in
errors after joining the meeting and trying to change the devices.
This change fixes the problem.
2020-06-29 12:26:55 +02:00
Dan Dascalescu
28632752ba docs: fix typo in interface_config.js 2020-06-26 23:02:56 +02:00
Selyan Slimane Amiri
7dfff1b455 Add translations in language and main files. (#7023)
* Update languages-kab.json

* Update main-kab.json

* Update main-kab.json

* Update main-kab.json

* Add kab entry in languages-kab.json
2020-06-26 11:45:26 -05:00
Vlad Piersec
99e7d636b7 fix(settings): Always show mic audio levels 2020-06-26 07:57:20 -04:00
Roman
4b1743bb2f android: add serverURL configuration for MDM/EMM environments
Android for Enterprise provides special feature for applications to obtain configuration through RestrictionManager remotely by some MDM solution.

Jitsi Meet can be remotely installed and provisioned with a proper URL (making URL not editable by the user) inside the Work Profile or Fully managed device.
2020-06-26 11:47:48 +02:00
Vlad Piersec
3b1ad9faff fix: Show audio/video options on lobby screen 2020-06-26 11:29:20 +02:00
Vlad Piersec
87b14c3711 fix(prejoin): copy meeting info 2020-06-26 11:28:49 +02:00
Titus-Andrei Moldovan
5811e0476c rn: fixes the bug on shared video not stopping when the user leaves the conferences 2020-06-26 10:54:49 +02:00
Titus-Andrei Moldovan
59750ba1f1 rn: refactors the YoutubeLargeVideo to be class component. Adds interval for sending the seek time every 5 seconds. 2020-06-26 10:54:49 +02:00
pierretux
b3de7fd52b lang: update French translation 2020-06-26 10:31:38 +02:00
Bettenbuk Zoltan
f68b9b7df9 fix: different description for non moderator participants in passcode dialog 2020-06-25 17:36:39 +02:00
Bettenbuk Zoltan
b534c4f624 ui: making the security menu more compact 2020-06-25 17:36:39 +02:00
Mihai Uscat
ab1c5805f4 feat(AddPeopleDialog): Enable contact invitation based on interfaceConfig flag 2020-06-25 10:36:02 -05:00
Bettenbuk Zoltan
0c6b0641f5 fix: layout of the insecure room name warning icon 2020-06-25 17:23:27 +02:00
Mihai Uscat
093254d948 fix(AddPeopleDialog): Improve contact invite form
- Disables the invite buttons while invites are ongoing
- Adds a keyboard shortcut (Enter) to send out invites
- Closes AddPeopleDialog upon successful invites sent
- Fixes the SecurityDialog closing when trying to set E2EE key via Enter shortcut
- Removes superfluous separator from SecurityDialog
2020-06-25 15:25:15 +02:00
Bettenbuk Zoltan
0494200383 fix: label tooltips are not visible in tile view 2020-06-25 14:05:34 +02:00
Saúl Ibarra Corretgé
16f1c167b8 interface_config: bring back config trailer 2020-06-23 21:00:27 +02:00
Saúl Ibarra Corretgé
97fd36a19a debian: fix postinst command 2020-06-23 17:46:44 +02:00
damencho
701d34248b fix: Fixes showing cc button when jwt is not used.
Fixes #7093.
2020-06-23 08:31:37 -05:00
Florian
e72dae5c32 lang: update French translation 2020-06-23 14:51:13 +02:00
paweldomas
811ee40d99 ref(constants): use 720 for the high quality level
720 is requested by default for the local video stream
and when using the quality slider the resolution would
be increased to 1080.

Note that this will limit the receive quality to 720 as well,
because both send and receive constraints are changed at
the same time when the quality slider is used.
2020-06-23 14:50:00 +02:00
egerardus
76eabf1f29 debian: add SAN when generating self-signed certs
Closes: #5547
2020-06-23 14:47:36 +02:00
Vangelis Zacharioudakis
01a8cc1478 lang: update Greek translation 2020-06-23 14:34:49 +02:00
Vlad Piersec
047c9b43ea fix: welcome page logo not being displayed 2020-06-23 10:29:41 +02:00
Dan Dascalescu
22d040ab76 doc: point to the Handbook repo 2020-06-23 09:39:14 +02:00
Hristo Terezov
4ac9ea258c ref(interfaceConfig): Order alphabetically. 2020-06-22 14:25:48 -05:00
Hristo Terezov
6bd64ee552 fix(jitsi-logo): URL 2020-06-22 13:28:52 -05:00
Jaya Allamsetty
7a1595f162 chore(deps): update lib-jitsi-meet 2020-06-20 08:49:19 -04:00
Jaya Allamsetty
07cad2a98f cleanup: Remove obsolete code related to SS extension
- Remove external install dialogs and fix related screensharing error handling.
- Remove obsolete options from config.js and from configWhitelist.js
2020-06-20 08:49:19 -04:00
Дамян Минков
6fbba52c6d feat: Adds a new option to disable lobby for guests. (#7094)
* feat: Adds a new option to disable lobby for guests.

* squash: Rename config option.

* squash: Comment update.
2020-06-19 14:50:31 -05:00
Gonçal
311d1c67ba Added all missing languages from languages.json
Added all missing languages from languages.json, with names in Catalan
2020-06-19 13:39:39 -05:00
Vlad Piersec
0aa54d8650 (prejoin): fix mobile 2020-06-19 16:46:43 +02:00
Bettenbuk Zoltan
74e0e10928 feat: new security icon 2020-06-19 12:25:24 +02:00
Vlad Piersec
4f169988a3 fix(prejoin): Store prejoin tracks in 'features/base/tracks' 2020-06-19 12:02:11 +02:00
Joey Marshment-Howell
ec6ed6e8ec config: whitelist option to hide chrome extension banner
saghul: torture tests also need it.
2020-06-19 09:15:10 +02:00
Aaron van Meerten
7b429afee6 Merge pull request #7080 from jitsi/fix-e2ee
fix(e2ee): hide if not supported.
2020-06-18 13:14:35 -05:00
Hristo Terezov
cab830aad1 fix(e2ee): hide if not supported. 2020-06-18 12:25:49 -05:00
Jaya Allamsetty
bd42c81cb8 chore(deps): Update lib-jitsi-meet 2020-06-18 11:51:28 -04:00
Saúl Ibarra Corretgé
f230fd4d04 subject: avoid sending an extra empty subject update
When setSubject is called too early we store it as pensing, but thanks to the
default parameter value, if undefined is passed to the function we'll store the
empty string.

This will trigger a needless update because undefined !== ''.
2020-06-18 14:52:17 +02:00
Saúl Ibarra Corretgé
eed57e7999 subject: only try to update the subject when the rol;e changes
Skip processing any other participant updates.
2020-06-18 14:52:17 +02:00
Vlad Piersec
8115f86f59 fix(prejoin): Fix CSS for prejoin page according to design 2020-06-18 14:43:37 +02:00
Bettenbuk Zoltan
28e5edfb50 ref: move e2ee field into security menu 2020-06-18 09:36:24 +02:00
Saúl Ibarra Corretgé
e936c6dc2c lang: improve wording 2020-06-17 20:35:57 +02:00
Saúl Ibarra Corretgé
8efd0f0829 unsafe-room: hide unsafe room label if a password or lobby are set 2020-06-17 20:35:57 +02:00
Saúl Ibarra Corretgé
a49f04f25b config: document enableInsecureRoomNameWarning and whitelist it 2020-06-17 20:35:57 +02:00
Bettenbuk Zoltan
bcffe0bba5 fix: lobby screen broken with prejoin disabled 2020-06-17 09:01:55 -05:00
Titus-Andrei Moldovan
482ba23954 rn: adds support for mobile youtube link 2020-06-17 15:10:54 +02:00
Titus-Andrei Moldovan
e87167dd2d rn: fixes the propagation of the paused event after the status was set to stop 2020-06-17 15:10:54 +02:00
erickvils
cf047a3c90 lang: update portuguese (BR) translation 2020-06-17 08:41:53 +02:00
Saúl Ibarra Corretgé
a8b8612304 rn,auth: trim the username
Fixes: https://github.com/jitsi/jitsi-meet/issues/5673
2020-06-17 08:39:58 +02:00
Saúl Ibarra Corretgé
95a5b8a8c1 rn,auth: don't auto-capitalize the password field
Fixes: https://github.com/jitsi/jitsi-meet/issues/5673
2020-06-17 08:39:58 +02:00
bgrozev
5867eaf560 config: remove obsolete options 2020-06-17 08:39:31 +02:00
Hafize Güngör
9143bb42d1 lang: fixes for Turkish translation 2020-06-17 08:37:43 +02:00
Boris Grozev
0e5dac623e chore: Update lib-jitsi-meet. 2020-06-16 16:59:21 -05:00
Boris Grozev
0c09ded76b feat: Add and whitelist the useTurnUdp config option. 2020-06-16 16:59:21 -05:00
damencho
929622b27c fix: Fixes setting subject from url.
There are occasions when role to moderator can change a little bit after joining the room, and initial try to set subject will silently be ignored if not moderator.
2020-06-16 12:44:44 -05:00
damencho
430125a8bd feat: Adds user props to analytics for iframe and external api. 2020-06-16 12:44:36 -05:00
damencho
66505666df feat: Hide Invite more when invite button is disabled. 2020-06-16 08:41:55 -05:00
Saúl Ibarra Corretgé
e5cffc71c4 config: cleanup no longer used interface_config options 2020-06-16 14:59:04 +02:00
Adam Wan
e3d66db3d7 config: add ability to hide the "invite more" header button 2020-06-16 13:07:37 +02:00
Saúl Ibarra Corretgé
e8e2b3c341 doc,gh: add pull request template 2020-06-16 11:24:15 +02:00
Saúl Ibarra Corretgé
abb724e173 doc: update CONTRIBUTING 2020-06-16 11:24:15 +02:00
Saúl Ibarra Corretgé
6e679f952f redux: refactor loading of middlewares and reducers
Up until now we relied on implicit loading of middlewares and reducers, through
having imports in each feature's index.js.

This leads to many complex import cycles which result in (sometimes) hard to fix
bugs in addition to (often) breaking mobile because a web-only feature gets
imported on mobile too, thanks to the implicit loading.

This PR changes that to make the process explicit. Both middlewares and reducers
are imported in a single place, the app entrypoint. They have been divided into
3 categories: any, web and native, which represent each of the platforms
  respectively.

Ideally no feature should have an index.js exporting actions, action types and
components, but that's a larger ordeal, so this is just the first step in
getting there. In order to both set example and avoid large cycles the app
feature has been refactored to not have an idex.js itself.
2020-06-16 11:24:15 +02:00
Saúl Ibarra Corretgé
80d7e5fb7f redux: move PersistenceRegistry to the redux feature 2020-06-16 11:24:15 +02:00
Saúl Ibarra Corretgé
7646618e5a rnnoise: simplify initialization 2020-06-16 10:49:33 +02:00
Jaya Allamsetty
6533071c4c chore(deps): update lib-jitsi-meet
Update to sdp-interop@1.0.3 for getting the fix for Firefox RTX audio-only issue
2020-06-15 11:22:29 -04:00
Emil Ivov
6aed9bc0c8 interface_config: enforce logo by default 2020-06-12 17:38:51 +02:00
Jaya Allamsetty
b7b861259b fix(UI): add playsinline attr for video element
> playinline attr needs to be set to true to stop local video from playing in full screen mode in Safari on iOS.
> This applies to the local video thumbnails and the camera previews from the device selection menu and video preview button
2020-06-12 09:30:46 -04:00
tmoldovan8x8
df64dd8f18 rn: add youtube player for mobile app 2020-06-12 12:15:16 +02:00
Vlad Piersec
8758c222c6 feat(branding): Add ability to customize logo & background 2020-06-10 14:58:27 +02:00
Bettenbuk Zoltan
29dc63fbcb ref: merge prejoin with lobby 2020-06-09 18:10:43 +02:00
Bettenbuk Zoltan
475a2ae596 feat: lobby feature
The lobby feature adds the possibility to lock a meeting and only allow people in after virtually knocking and going through formal approval
2020-06-09 18:10:43 +02:00
dependabot[bot]
338c960215 build(deps): bump websocket-extensions from 0.1.3 to 0.1.4
Bumps [websocket-extensions](https://github.com/faye/websocket-extensions-node) from 0.1.3 to 0.1.4.
- [Release notes](https://github.com/faye/websocket-extensions-node/releases)
- [Changelog](https://github.com/faye/websocket-extensions-node/blob/master/CHANGELOG.md)
- [Commits](https://github.com/faye/websocket-extensions-node/compare/0.1.3...0.1.4)

Signed-off-by: dependabot[bot] <support@github.com>
2020-06-09 10:09:02 +02:00
Jaya Allamsetty
e6093e0706 fix(UI): Highlight the audio device when we hover over it 2020-06-08 15:34:05 -04:00
Jaya Allamsetty
d1d968997e Disable audiosettings button on Firefox as it is not supported 2020-06-08 15:34:05 -04:00
Jaya Allamsetty
45570bc0e7 fix(device-selection): Update redux when a new speaker is selected
Update userSelectedAudioOutputDeviceId and userSelectedAudioOutputDeviceLabel when a new speaker is selected from the audio settings popup menu
2020-06-08 15:34:05 -04:00
Jaya Allamsetty
f4bcad02d8 fix(device-selection): Add a workaround for a chrome bug with default mic
Pass the real deviceId to gUM instead of 'default' for Chrome to return the correct media stream
2020-06-08 15:34:05 -04:00
khajaamin
26f7951894 Marathi language (#6615)
* Lang folder removed from proxy server and now using from local dev dir

* Added Marathi 100% langulage transalation
2020-06-08 12:33:40 -05:00
Richard Février
35dabb1a27 main-fr.json : remove duplicated key introduced by #6461 2020-06-08 12:13:36 -05:00
Murat Emir Cabaroğlu
c3b79802b2 add missing and fix wrong turkish translation 2020-06-08 11:17:28 -05:00
Дамян Минков
e6dbe65193 Moderated rooms or subdomains (#6959)
* fix: Fixes using token with no user context.

* feat(moderated): Adds option to add moderated rooms and subdomains.

When a user joins such room or subdomain in order to be a moderator needs to provide a valid jwt token for that room.

* squash: Renames function.

* ref: Removes filtering jicofo setting owners.

This will be disabled on jicofo side and will greatly simplify logic.
Also check the checks to avoid jwt for main domain to access subdomains and the other way around.

* fix: Skips allowners logic for admins.
2020-06-05 07:57:49 -05:00
Deepak Verma
ff23f81dfe flags: fix comment 2020-06-05 13:53:35 +02:00
Jaya Allamsetty
bc66c9063a chore(deps): update lib-jitsi-meet 2020-06-04 10:54:06 -04:00
Emil Ivov
974ef4a382 Merge pull request #6941 from jitsi/saghul-patch-5
shared-video: use a more recent video by default
2020-06-03 06:42:41 -05:00
Saúl Ibarra Corretgé
3bf82b573c shared-video: use a more recent video by default 2020-06-03 11:27:08 +02:00
hmuresan
b4b4339a1a external_api: add start/stop recording commands 2020-06-03 09:30:19 +02:00
Hristo Terezov
6773aed67f feat(recording): Limit notification 2020-06-02 16:00:54 -05:00
Saúl Ibarra Corretgé
d740752522 rn,responsive-ui: refactor dimensions detection
Use a dimensions detecting root component. The Dimensions module does not
measure the app's view size, but the Window, which may not be the same, for
example on iOS when PiP is used.

Also refactor the aspect ratio wrap component since it can be taken directly
from the store.

Last, remove the use of DimensionsDetector on LargeVideo and TileView since they
occupy the full-screen anyway.

Fixes PiP mode on iOS.
2020-06-02 16:54:28 +02:00
Marius Bardan
d93b219c7f lang: update RO translations 2020-06-02 10:19:06 +02:00
Marius Bardan
10cd150a07 lang: update RO translations 2020-06-02 10:19:06 +02:00
Jaya Allamsetty
a31f3c0c76 fix(config): Add missing capScreenshareBitrate to config.js 2020-05-29 14:04:30 -04:00
Simon Honegger
af39186a5f fix: typeof returns a string, so this condition was always true 2020-05-29 19:53:05 +02:00
Saúl Ibarra Corretgé
d4d1d0aa70 dev: add plugin for circular dependency detection
Example run: https://gist.github.com/saghul/e5e12edc108bdedbcbe65a3d7528235f
2020-05-29 10:37:09 +02:00
Saúl Ibarra Corretgé
3a88f4939c misc: break import cycle 2020-05-29 10:37:09 +02:00
Saúl Ibarra Corretgé
fe221fe4be deps: run npm audit fix 2020-05-29 10:37:09 +02:00
Jaya Allamsetty
1caaa47f5e chore(deps): update lib-jitsi-meet
fix(safari): Disable VAD processing on Safari - cfbb511bce
2020-05-28 17:19:07 -04:00
Hristo Terezov
a2c4d17e4d fix(record):web/mobile match disable functionality 2020-05-28 15:39:49 -05:00
Hristo Terezov
ce1de9e1e7 feat(recording): Disable buttons on active session 2020-05-28 15:39:49 -05:00
Hristo Terezov
3e7abf3da0 feat(subtitles): Disable for guests. 2020-05-28 13:43:18 -05:00
damencho
8b4f1789a6 chore(deps): Update lib-jitsi-meet, callstats using full URL. 2020-05-28 11:15:33 -05:00
Gabriel Imre
444e2b90df callstats: add siteID passing; sanitize confID path 2020-05-28 10:00:45 -05:00
Saúl Ibarra Corretgé
7de88995a5 labels: don't disable all labels when VIDEO_QUALITY_LABEL_DISABLED is set
Fixes: https://github.com/jitsi/jitsi-meet/issues/6880
2020-05-28 10:15:52 +02:00
Hristo Terezov
f0c6e934ce feat(config):InsecureRoomNameWarning config option 2020-05-27 18:03:15 -05:00
Дамян Минков
78b01d2c97 Adding whitelist and move away from using custom field for password. (#6621)
* Adding whitelist and move away from using custom field for password.

We re-use room lock for lobby password.

* Make sure we do not run muc-occupant-pre-join for non members only rooms.

* Destroying lobby room, when main room is destroyed or membersonly is disabled.

* Adds destroy reason.

* Clears lobby room instance on destroy.

Fixes problem with on/off/on of lobby feature.

* Add lobby room jid only when members only is on.

* Sends main room jid on lobby destroy.

We can use that in client loggic to auto-join lobby participants to main room as lobby is disabled while waiting.

* fix: Fixes using is_healthcheck_room.

* squash: Enables lobby rooms feature by default.

* chore(deps): Update lib-jitsi-meet, to enable lobby rooms.
2020-05-27 18:01:41 -05:00
Saúl Ibarra Corretgé
bf60be1654 style: fixup needlessly wrapped line 2020-05-27 16:45:11 +02:00
Saúl Ibarra Corretgé
5202a7e5b8 room-lock: use the proper text for the room lock prompt 2020-05-27 16:45:11 +02:00
Saúl Ibarra Corretgé
2af0c0ba17 rn: bump SDK version to 2.9.0 2020-05-27 15:35:58 +02:00
Saúl Ibarra Corretgé
fbb6486b5f deps: update react-native-watch-connectivity
It's back in active development and fixes a warning in iOS.
2020-05-27 15:35:58 +02:00
Saúl Ibarra Corretgé
a113151563 deps: update react-native-calendar-events
Rebase our patches (in PR) on top of latest master.

Sshould fix a crash when requesting permisssions.
2020-05-27 15:35:58 +02:00
Raider700
470fda3467 lang: add missing fields to German translation 2020-05-27 11:48:51 +02:00
Saúl Ibarra Corretgé
edea6316ab Update config.js 2020-05-27 08:43:48 +02:00
Saúl Ibarra Corretgé
adac9ee5f8 config: don't enable H.264 by default on P2P
We are not actively testing it and it currently crashes Chrome 83+ when insertable streams are used.
2020-05-27 08:43:48 +02:00
Saúl Ibarra Corretgé
af8bd876e6 deps: run npm audit fix
Skipped webpack, requires further investigation.
2020-05-27 00:16:20 +02:00
Jaya Allamsetty
403c4a7ee7 chore(deps): update lib-jitsi-meet
c94f6a570f
2020-05-26 17:14:21 -04:00
marius-bardan
21fe3c87a6 lang: enable support for romanian lang (#6869)
Co-authored-by: Marius Bardan <marius.bardan@8x8.com>
2020-05-26 15:05:41 +02:00
lorddavidiii
6ddac3bddf debian,turn: fix getting an external ip in IPv6 enabled networks 2020-05-26 13:20:34 +02:00
Mihai Uscat
663a65ad81 fix(SecurityDialog): fix button overflow 2020-05-26 10:22:22 +02:00
marius-bardan
5977f09202 lang: complete Romanian translation
Co-authored-by: Marius Bardan <marius.bardan@8x8.com>
2020-05-26 09:18:38 +02:00
Riccardo Magliocchetti
6be2a8575f lang: update document to match current reality 2020-05-25 17:26:15 +02:00
Suguru Hirahara
0d14e2fa5c gh: update 1-bug-report template
* Update 1-bug-report.md

- Comment out the general notice
- Add the information that questions and posts asking for help will be
closed
- Sort sections based on action stream -- steps, expected behaviour, (yet) actual behaviour
- Replace environment information with server-side and client-side ones

* Update .github/ISSUE_TEMPLATE/1-bug-report.md

Co-authored-by: Saúl Ibarra Corretgé <s@saghul.net>

Co-authored-by: Saúl Ibarra Corretgé <s@saghul.net>
2020-05-25 16:45:21 +02:00
qwertiko GmbH
1e0669d33b lang: fixes for German 2020-05-25 14:40:10 +02:00
Ricardo Brisighelli
d69c2c84d7 lang: update Spanish translation 2020-05-25 14:38:44 +02:00
Suguru Hirahara
0ea7a31b08 lang: add Arabic translation 2020-05-25 14:05:46 +02:00
Oleksa
6284e5fab3 lang: update Ukranian translation 2020-05-25 13:58:17 +02:00
Philip Eriksson
647852bd82 lang: fixes for Swedish 2020-05-25 13:52:15 +02:00
nordlolek
4e0d6e56bc rn,lang: bundle Slovenian translations 2020-05-25 13:46:37 +02:00
Quentí
c02763a29e lang: update for Occitan 2020-05-25 13:45:17 +02:00
Vangelis Zacharioudakis
0b8ec5a342 lang: add Greek language translation 2020-05-25 13:40:36 +02:00
huzaifahj
1a4be30ea1 lang: make "OK" capitalization consistent 2020-05-25 13:24:06 +02:00
tolgakaratas
d53d6e5fa8 lang,rn: bundle Turkish language 2020-05-25 13:20:54 +02:00
zzoond
93b05d13c3 lang: fix for russian 2020-05-25 11:27:50 +02:00
Michael Telatynski
79f4531bd2 lang: allow translation of accessibility label string "Edit your profile" 2020-05-25 11:26:25 +02:00
Jaya Allamsetty
5348fa19c8 feat: show option to join via browser on supported mobile browsers
Currently Chromium based browsers and Firefox are supported on Android
Only Safari is supported on iOS
2020-05-22 10:52:59 -04:00
Felix C. Stegerman
b25319fd2e add missing build dependency on nodejs 2020-05-21 10:29:36 -05:00
Felix C. Stegerman
63ca419e76 improve "open in app" page 2020-05-21 08:39:17 -04:00
Jonathan Lennox
393fb692ca Make TLS configs in Debian sample files follow Mozilla security guidelines. 2020-05-20 12:03:41 -05:00
JB BUGEAUD
735b686b98 Update of main fr translation (#6141)
* Update of main fr translation

Correct some non french sounding sentenses.  One example welcomepage.title, before "fully featured" was translated as "entièrement en vedette"  (which is gibberish) and now "riche en fonctionnalités".

* Fixing typo

Fixing missing comma

* Another typo fix

Yet another missing comma fixed.
2020-05-20 11:29:06 -05:00
Bettenbuk Zoltan
0598e7369b ref: eslint-config-jitsi@1.0.3 2020-05-20 17:14:29 +02:00
Suguru Hirahara
8c30e43b5f Retry "external_api: fixed using deeplinks"
Set target='_top' inside anchor.

Courtesy of #6700
Follow-up to: #6784
2020-05-20 10:18:29 -04:00
Mihai Uscat
75c836c70c feat(AddPeopleDialog): Update design; feat(SecurityDialog): Implement 2020-05-20 16:14:47 +02:00
Saúl Ibarra Corretgé
70d8fe91c3 deps: replace jsrsasign
We were only using a couple of utility functionss to parse tokens, not to
validate them in any way.
2020-05-20 15:06:19 +02:00
Julian1203
c6d5e103f5 lang: fixes for German 2020-05-20 12:20:56 +02:00
christian-sh
7f1f92cdf0 lang: fix passwordLabel translation in German
The former translation contained a typo and incorrect grammar.
2020-05-20 12:15:32 +02:00
Suguru Hirahara
8c02ba5ee9 doc: update README.md
- Fix a broken link (fixes #6780)
- Set direct links
- Add a link to the Docker installation guide
2020-05-20 08:07:32 +02:00
Jaya Allamsetty
5591144693 Revert "external_api: fixed using deeplinks"
This breaks the mobile deeplinking page
This reverts commit 532dadb245.
2020-05-19 16:43:10 -04:00
damencho
fa43539718 chore(deps): lib-jitsi-meet, skips sending an extra presence on join. 2020-05-19 15:39:20 -05:00
Jaya Allamsetty
7e0a36e88e chore(deps): Update lib-jitsi-meet
fix(Firefox): Enable RTX support on Firefox
E2EE fixes/improvements
fix(screenshare): Add google conference flag only when simulcast is on
fix(video-quality): Apply pending video constraints on p2p originator
2020-05-19 12:28:05 -04:00
msalmasi
532dadb245 external_api: fixed using deeplinks
This update opens links in the full body of the window so deeplinks will work on iOS Safari when using the external API in an iFrame.
2020-05-19 14:09:42 +02:00
Felix C. Stegerman
55051cc203 dev: don't proxy /lang/ 2020-05-19 11:58:21 +02:00
Vlad Piersec
4975f15345 fix(prejoin_page): Always show 'join without audio' & add disabled button.
* The prejoin page always displays the 'join without audio' option.
* The join button will be disabled if there is no input.
* Fix some CSS for the case when the user is not anonymous.
2020-05-19 11:47:55 +02:00
Alejandro Blanco
2e2d40c1d0 external-api: add muteEveryone command 2020-05-19 08:50:21 +02:00
Bettenbuk Zoltan
c08638da51 feat: insecure room name warning 2020-05-18 17:59:07 +02:00
Bettenbuk Zoltan
9525cab60f feat: icon type circular label 2020-05-18 17:59:07 +02:00
Bettenbuk Zoltan
21d5c895fc fix: package.lock version mismatch 2020-05-18 16:30:24 +02:00
Saúl Ibarra Corretgé
305a63e8f9 deep-linking: fix generating links for external API
The ocnfig is not overridden early enough.

Fixes: https://github.com/jitsi/jitsi-meet/issues/6489
2020-05-18 16:06:13 +02:00
Emil Ivov
2fef06772b Merge pull request #6755 from saghul/e2ee-label
e2ee: update padlock label tooltip
2020-05-18 07:51:37 -05:00
Vlad Piersec
b2895b7095 feat(prejoin_page): Add ability for guest to join audio by phone 2020-05-18 14:47:44 +02:00
Saúl Ibarra Corretgé
41dc14d30c e2ee: update padlock label tooltip 2020-05-18 14:12:00 +02:00
Suguru Hirahara
2ddfead4f5 doc: fix links on README 2020-05-18 11:53:58 +02:00
830 changed files with 33537 additions and 11968 deletions

View File

@@ -4,25 +4,45 @@ about: Create a report to help us improve
---
*This Issue tracker is only for reporting bugs and tracking code related issues.*
<!--
Before posting, please make sure you check community.jitsi.org to see if the same or similar bugs have already been discussed.
General questions, installation help, and feature requests can also be posted to community.jitsi.org.
This issue tracker is only for reporting bugs and tracking issues related to the source code.
## Description
---
Before posting, please make sure to check if the same or similar bugs have already been discussed: https://github.com/jitsi/jitsi-meet/issues
## Current behavior
---
General questions regarding usage, installation, etc. should be posted at https://community.jitsi.org. They will be closed if posted here.
## Expected Behavior
---
-->
## Possible Solution
---
### Description:
## Steps to reproduce
---
<!-- Please describe the bug clearly and concisely. -->
# Environment details
---
### Steps to reproduce:
1. <!-- Open '...' -->
2. <!-- Click on '...' -->
3. <!-- and so on... -->
### Expected behavior:
<!-- Please describe what should happen. -->
### Actual behavior:
<!-- Please describe what actually happens. -->
<!-- Please attach screenshot if possible. -->
### Server information:
- Jitsi Meet version:
- Operating System:
### Client information:
- Browser / app version:
- Operating System:
### Additional information:
<!-- Please provide additional information about the bug, if any. -->

5
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,5 @@
<!--
Thank you for your pull request. Please provide a thorough description below.
Contributors guide: https://github.com/jitsi/jitsi-meet/blob/master/CONTRIBUTING.md
-->

View File

@@ -123,3 +123,32 @@ in the agreement, unfortunately, we cannot accept your contribution.
respective variable, function, property is non-public i.e. private, protected,
or internal. In contrast, the lack of an underscore at the beginning of a name
signals public API.
### Feature layout
When adding a new feature, this would be the usual layout.
```
react/features/sample/
├── actionTypes.js
├── actions.js
├── components
│   ├── AnotherComponent.js
│   ├── OneComponent.js
│   └── index.js
├── middleware.js
└── reducer.js
```
The middleware must be imported in `react/features/app/` specifically
in `middlewares.any`, `middlewares.native.js` or `middlewares.web.js` where appropriate.
Likewise for the reducer.
An `index.js` file must not be provided for exporting actions, action types and
component. Features / files requiring those must import them explicitly.
This has not always been the case and the entire codebase hasn't been migrated to
this model but new features should follow this new layout.
When working on an old feature, adding the necessary changes to migrate to the new
model is encouraged.

View File

@@ -74,7 +74,7 @@ deploy-rnnoise-binary:
deploy-css:
$(NODE_SASS) $(STYLES_MAIN) $(STYLES_BUNDLE) && \
$(CLEANCSS) $(STYLES_BUNDLE) > $(STYLES_DESTINATION) ; \
$(CLEANCSS) --skip-rebase $(STYLES_BUNDLE) > $(STYLES_DESTINATION) ; \
rm $(STYLES_BUNDLE)
deploy-local:
@@ -82,7 +82,7 @@ deploy-local:
.NOTPARALLEL:
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-lib-jitsi-meet deploy-libflac
$(WEBPACK_DEV_SERVER)
$(WEBPACK_DEV_SERVER) --detect-circular-deps
source-package:
mkdir -p source_package/jitsi-meet/css && \

View File

@@ -10,9 +10,11 @@ Jitsi Meet allows very efficient collaboration. Users can stream their desktop o
On the client side, no installation is necessary. You just point your browser to the URL of your deployment. This section is about installing a Jitsi Meet suite on your server and hosting your own conferencing service.
Installing Jitsi Meet is a simple experience. For Debian-based system, following the [quick-install](https://github.com/jitsi/jitsi-meet/blob/master/doc/quick-install.md) document, which uses the package system. You can also see a demonstration of the process in [this tutorial video](https://jitsi.org/tutorial).
Installing Jitsi Meet is a simple experience. For Debian-based system, following the [quick install](https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart) document, which uses the package system. You can also see a demonstration of the process in [this tutorial video](https://jitsi.org/tutorial).
For other systems, or if you wish to install all components manually, see the [detailed manual installation instructions](https://github.com/jitsi/jitsi-meet/blob/master/doc/manual-install.md).
For other systems, or if you wish to install all components manually, see the [detailed manual installation instructions](https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-manual).
Installation with Docker is also available. Please see the [instruction](https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker).
## Download
@@ -46,9 +48,13 @@ You can also sign up for our open beta testing here:
* [Android](https://play.google.com/apps/testing/org.jitsi.meet)
* [iOS](https://testflight.apple.com/join/isy6ja7S)
## Release notes
Release notes for Jitsi Meet are maintained on [this repository](https://github.com/jitsi/jitsi-meet-release-notes).
## Development
For web development see [here](doc/development.md), and for mobile see [here](doc/mobile.md).
For web development see [here](https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-web), and for mobile see [here](https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-mobile).
## Contributing

View File

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

View File

@@ -1,12 +1,16 @@
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="org.jitsi.meet">
package="org.jitsi.meet"
android:installLocation="auto">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/AppTheme">
<meta-data
android:name="android.content.APP_RESTRICTIONS"
android:resource="@xml/app_restrictions" />
<activity
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize"
android:label="@string/app_name"

View File

@@ -16,9 +16,14 @@
package org.jitsi.meet;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.RestrictionEntry;
import android.content.RestrictionsManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.KeyEvent;
@@ -31,6 +36,7 @@ import org.jitsi.meet.sdk.JitsiMeetConferenceOptions;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collection;
import java.util.Map;
/**
@@ -48,6 +54,27 @@ public class MainActivity extends JitsiMeetActivity {
private static final int OVERLAY_PERMISSION_REQUEST_CODE
= (int) (Math.random() * Short.MAX_VALUE);
/**
* ServerURL configuration key for restriction configuration using {@link android.content.RestrictionsManager}
*/
public static final String RESTRICTION_SERVER_URL = "SERVER_URL";
/**
* Broadcast receiver for restrictions handling
*/
private BroadcastReceiver broadcastReceiver;
/**
* Flag if configuration is provided by RestrictionManager
*/
private boolean configurationByRestrictions = false;
/**
* Default URL as could be obtained from RestrictionManager
*/
private String defaultURL;
// JitsiMeetActivity overrides
//
@@ -68,7 +95,7 @@ public class MainActivity extends JitsiMeetActivity {
// In Debug builds React needs permission to write over other apps in
// order to display the warning and error overlays.
if (BuildConfig.DEBUG) {
if (canRequestOverlayPermission() && !Settings.canDrawOverlays(this)) {
if (!Settings.canDrawOverlays(this)) {
Intent intent
= new Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
@@ -85,16 +112,67 @@ public class MainActivity extends JitsiMeetActivity {
@Override
protected void initialize() {
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// As new restrictions including server URL are received,
// conference should be restarted with new configuration.
leave();
recreate();
}
};
registerReceiver(broadcastReceiver,
new IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED));
resolveRestrictions();
setJitsiMeetConferenceDefaultOptions();
super.initialize();
}
@Override
public void onDestroy() {
if (broadcastReceiver != null) {
unregisterReceiver(broadcastReceiver);
broadcastReceiver = null;
}
super.onDestroy();
}
private void setJitsiMeetConferenceDefaultOptions() {
// Set default options
JitsiMeetConferenceOptions defaultOptions
= new JitsiMeetConferenceOptions.Builder()
.setWelcomePageEnabled(true)
.setServerURL(buildURL("https://meet.jit.si"))
.setFeatureFlag("call-integration.enabled", false)
.build();
.setWelcomePageEnabled(true)
.setServerURL(buildURL(defaultURL))
.setFeatureFlag("call-integration.enabled", false)
.setFeatureFlag("resolution", 360)
.setFeatureFlag("server-url-change.enabled", !configurationByRestrictions)
.build();
JitsiMeet.setDefaultConferenceOptions(defaultOptions);
}
super.initialize();
private void resolveRestrictions() {
RestrictionsManager manager =
(RestrictionsManager) getSystemService(Context.RESTRICTIONS_SERVICE);
Bundle restrictions = manager.getApplicationRestrictions();
Collection<RestrictionEntry> entries = manager.getManifestRestrictions(
getApplicationContext().getPackageName());
for (RestrictionEntry restrictionEntry : entries) {
String key = restrictionEntry.getKey();
if (RESTRICTION_SERVER_URL.equals(key)) {
// If restrictions are passed to the application.
if (restrictions != null &&
restrictions.containsKey(RESTRICTION_SERVER_URL)) {
defaultURL = restrictions.getString(RESTRICTION_SERVER_URL);
configurationByRestrictions = true;
// Otherwise use default URL from app-restrictions.xml.
} else {
defaultURL = restrictionEntry.getSelectedString();
configurationByRestrictions = false;
}
}
}
}
@Override
@@ -107,8 +185,7 @@ public class MainActivity extends JitsiMeetActivity {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == OVERLAY_PERMISSION_REQUEST_CODE
&& canRequestOverlayPermission()) {
if (requestCode == OVERLAY_PERMISSION_REQUEST_CODE) {
if (Settings.canDrawOverlays(this)) {
initialize();
return;
@@ -131,6 +208,18 @@ public class MainActivity extends JitsiMeetActivity {
return super.onKeyUp(keyCode, event);
}
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode);
Log.d(TAG, "Is in picture-in-picture mode: " + isInPictureInPictureMode);
if (!isInPictureInPictureMode) {
this.startActivity(new Intent(this, getClass())
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
}
}
// Helper methods
//
@@ -141,10 +230,4 @@ public class MainActivity extends JitsiMeetActivity {
return null;
}
}
private boolean canRequestOverlayPermission() {
return
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M;
}
}

View File

@@ -1,3 +1,5 @@
<resources>
<string name="app_name">Jitsi Meet</string>
<string name="restriction_server_url_description">URL of Jitsi Meet server instance to connect to</string>
<string name="restriction_server_url_title">Server URL</string>
</resources>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<restrictions xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Server URL configuration -->
<restriction
android:defaultValue="https://meet.jit.si"
android:description="@string/restriction_server_url_description"
android:key="SERVER_URL"
android:restrictionType="string"
android:title="@string/restriction_server_url_title"/>
</restrictions>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,230 +0,0 @@
/*
* Copyright @ 2017-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
/**
* {@link AudioModeModule.AudioDeviceHandlerInterface} module implementing device handling for
* legacy (pre-M) Android versions.
*/
class AudioDeviceHandlerLegacy implements
AudioModeModule.AudioDeviceHandlerInterface,
AudioManager.OnAudioFocusChangeListener,
BluetoothHeadsetMonitor.Listener {
private final static String TAG = AudioDeviceHandlerLegacy.class.getSimpleName();
/**
* Reference to the main {@code AudioModeModule}.
*/
private AudioModeModule module;
/**
* Indicator that we have lost audio focus.
*/
private boolean audioFocusLost = false;
/**
* {@link AudioManager} instance used to interact with the Android audio
* subsystem.
*/
private AudioManager audioManager;
/**
* {@link BluetoothHeadsetMonitor} for detecting Bluetooth device changes in
* old (< M) Android versions.
*/
private BluetoothHeadsetMonitor bluetoothHeadsetMonitor;
public AudioDeviceHandlerLegacy(AudioManager audioManager) {
this.audioManager = audioManager;
}
/**
* Helper method to trigger an audio route update when Bluetooth devices are
* connected / disconnected.
*/
@Override
public void onBluetoothDeviceChange(final boolean deviceAvailable) {
module.runInAudioThread(new Runnable() {
@Override
public void run() {
if (deviceAvailable) {
module.addDevice(AudioModeModule.DEVICE_BLUETOOTH);
} else {
module.removeDevice(AudioModeModule.DEVICE_BLUETOOTH);
}
module.updateAudioRoute();
}
});
}
/**
* Helper method to trigger an audio route update when a headset is plugged
* or unplugged.
*/
private void onHeadsetDeviceChange() {
module.runInAudioThread(new Runnable() {
@Override
public void run() {
// XXX: isWiredHeadsetOn is not deprecated when used just for
// knowing if there is a wired headset connected, regardless of
// audio being routed to it.
//noinspection deprecation
if (audioManager.isWiredHeadsetOn()) {
module.addDevice(AudioModeModule.DEVICE_HEADPHONES);
} else {
module.removeDevice(AudioModeModule.DEVICE_HEADPHONES);
}
module.updateAudioRoute();
}
});
}
/**
* {@link AudioManager.OnAudioFocusChangeListener} interface method. Called
* when the audio focus of the system is updated.
*
* @param focusChange - The type of focus change.
*/
@Override
public void onAudioFocusChange(final int focusChange) {
module.runInAudioThread(new Runnable() {
@Override
public void run() {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN: {
JitsiMeetLogger.d(TAG + " Audio focus gained");
// Some other application potentially stole our audio focus
// temporarily. Restore our mode.
if (audioFocusLost) {
module.updateAudioRoute();
}
audioFocusLost = false;
break;
}
case AudioManager.AUDIOFOCUS_LOSS:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: {
JitsiMeetLogger.d(TAG + " Audio focus lost");
audioFocusLost = true;
break;
}
}
}
});
}
/**
* Helper method to set the output route to a Bluetooth device.
*
* @param enabled true if Bluetooth should use used, false otherwise.
*/
private void setBluetoothAudioRoute(boolean enabled) {
if (enabled) {
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
} else {
audioManager.setBluetoothScoOn(false);
audioManager.stopBluetoothSco();
}
}
@Override
public void start(AudioModeModule audioModeModule) {
JitsiMeetLogger.i("Using " + TAG + " as the audio device handler");
module = audioModeModule;
Context context = module.getContext();
// Setup runtime device change detection.
//
// Detect changes in wired headset connections.
IntentFilter wiredHeadSetFilter = new IntentFilter(AudioManager.ACTION_HEADSET_PLUG);
BroadcastReceiver wiredHeadsetReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
JitsiMeetLogger.d(TAG + " Wired headset added / removed");
onHeadsetDeviceChange();
}
};
context.registerReceiver(wiredHeadsetReceiver, wiredHeadSetFilter);
// Detect Bluetooth device changes.
bluetoothHeadsetMonitor = new BluetoothHeadsetMonitor(context, this);
// On Android < M, detect if we have an earpiece.
PackageManager pm = context.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
module.addDevice(AudioModeModule.DEVICE_EARPIECE);
}
// Always assume there is a speaker.
module.addDevice(AudioModeModule.DEVICE_SPEAKER);
}
@Override
public void stop() {
bluetoothHeadsetMonitor.stop();
bluetoothHeadsetMonitor = null;
}
@Override
public void setAudioRoute(String device) {
// Turn speaker on / off
audioManager.setSpeakerphoneOn(device.equals(AudioModeModule.DEVICE_SPEAKER));
// Turn bluetooth on / off
setBluetoothAudioRoute(device.equals(AudioModeModule.DEVICE_BLUETOOTH));
}
@Override
public boolean setMode(int mode) {
if (mode == AudioModeModule.DEFAULT) {
audioFocusLost = false;
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.abandonAudioFocus(this);
audioManager.setSpeakerphoneOn(false);
setBluetoothAudioRoute(false);
return true;
}
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setMicrophoneMute(false);
if (audioManager.requestAudioFocus(this, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN)
== AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
JitsiMeetLogger.w(TAG + " Audio focus request failed");
return false;
}
return true;
}
}

View File

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

View File

@@ -1,191 +0,0 @@
/*
* Copyright @ 2017-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
/**
* Helper class to detect and handle Bluetooth device changes. It monitors
* Bluetooth headsets being connected / disconnected and notifies the module
* about device changes when this occurs.
*/
class BluetoothHeadsetMonitor {
private final static String TAG = BluetoothHeadsetMonitor.class.getSimpleName();
/**
* The {@link Context} in which this module executes.
*/
private final Context context;
/**
* Reference to the {@link BluetoothAdapter} object, used to access Bluetooth functionality.
*/
private BluetoothAdapter adapter;
/**
* Reference to a proxy object which allows us to query connected devices.
*/
private BluetoothHeadset headset;
/**
* receiver registered for receiving Bluetooth connection state changes.
*/
private BroadcastReceiver receiver;
/**
* Listener for receiving Bluetooth device change events.
*/
private Listener listener;
public BluetoothHeadsetMonitor(Context context, Listener listener) {
this.context = context;
this.listener = listener;
}
private boolean getBluetoothHeadsetProfileProxy() {
adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter == null) {
JitsiMeetLogger.w(TAG + " Device doesn't support Bluetooth");
return false;
}
// XXX: The profile listener listens for system services of the given
// type being available to the application. That is, if our Bluetooth
// adapter has the "headset" profile.
BluetoothProfile.ServiceListener listener
= new BluetoothProfile.ServiceListener() {
@Override
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEADSET) {
headset = (BluetoothHeadset) proxy;
updateDevices();
}
}
@Override
public void onServiceDisconnected(int profile) {
// The logic is the same as the logic of onServiceConnected.
onServiceConnected(profile, /* proxy */ null);
}
};
return adapter.getProfileProxy(context, listener, BluetoothProfile.HEADSET);
}
private void onBluetoothReceiverReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
// XXX: This action will be fired when a Bluetooth headset is
// connected or disconnected to the system. This is not related to
// audio routing.
int state = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, -99);
switch (state) {
case BluetoothHeadset.STATE_CONNECTED:
case BluetoothHeadset.STATE_DISCONNECTED:
JitsiMeetLogger.d(TAG + " BT headset connection state changed: " + state);
updateDevices();
break;
}
} else if (action.equals(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)) {
// XXX: This action will be fired when the connection established
// with a Bluetooth headset (called a SCO connection) changes state.
// When the SCO connection is active we route audio to it.
int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -99);
switch (state) {
case AudioManager.SCO_AUDIO_STATE_CONNECTED:
case AudioManager.SCO_AUDIO_STATE_DISCONNECTED:
JitsiMeetLogger.d(TAG + " BT SCO connection state changed: " + state);
updateDevices();
break;
}
}
}
private void registerBluetoothReceiver() {
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
onBluetoothReceiverReceive(context, intent);
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
filter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
context.registerReceiver(receiver, filter);
}
/**
* Detects if there are new devices connected / disconnected and fires the
* {@link Listener} registered event.
*/
private void updateDevices() {
boolean headsetAvailable = (headset != null) && !headset.getConnectedDevices().isEmpty();
listener.onBluetoothDeviceChange(headsetAvailable);
}
public void start() {
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (!audioManager.isBluetoothScoAvailableOffCall()) {
JitsiMeetLogger.w(TAG + " Bluetooth SCO is not available");
return;
}
if (!getBluetoothHeadsetProfileProxy()) {
JitsiMeetLogger.w(TAG + " Couldn't get BT profile proxy");
return;
}
registerBluetoothReceiver();
// Initial detection.
updateDevices();
}
public void stop() {
if (receiver != null) {
context.unregisterReceiver(receiver);
}
if (adapter != null && headset != null) {
adapter.closeProfileProxy(BluetoothProfile.HEADSET, headset);
}
receiver = null;
headset = null;
adapter = null;
}
interface Listener {
void onBluetoothDeviceChange(boolean deviceAvailable);
}
}

View File

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

View File

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

View File

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

View File

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

2
app.js
View File

@@ -6,10 +6,10 @@ import 'jQuery-Impromptu';
import conference from './conference';
import API from './modules/API';
import UI from './modules/UI/UI';
import keyboardshortcut from './modules/keyboardshortcut/keyboardshortcut';
import remoteControl from './modules/remotecontrol/RemoteControl';
import translation from './modules/translation/translation';
import UI from './modules/UI/UI';
window.APP = {
API,

View File

@@ -1,20 +1,16 @@
/* global $, APP, JitsiMeetJS, config, interfaceConfig */
/* global APP, JitsiMeetJS, config, interfaceConfig */
import EventEmitter from 'events';
import Logger from 'jitsi-meet-logger';
import * as JitsiMeetConferenceEvents from './ConferenceEvents';
import { openConnection } from './connection';
import { ENDPOINT_TEXT_MESSAGE_NAME } from './modules/API/constants';
import AuthHandler from './modules/UI/authentication/AuthHandler';
import Recorder from './modules/recorder/Recorder';
import mediaDeviceHelper from './modules/devices/mediaDeviceHelper';
import * as RemoteControlEvents
from './service/remotecontrol/RemoteControlEvents';
import UIEvents from './service/UI/UIEvents';
import UIUtil from './modules/UI/util/UIUtil';
import mediaDeviceHelper from './modules/devices/mediaDeviceHelper';
import Recorder from './modules/recorder/Recorder';
import { createTaskQueue } from './modules/util/helpers';
import * as JitsiMeetConferenceEvents from './ConferenceEvents';
import {
createDeviceChangedEvent,
createStartSilentEvent,
@@ -26,17 +22,7 @@ import {
maybeRedirectToWelcomePage,
redirectToStaticPage,
reloadWithStoredParams
} from './react/features/app';
import {
initPrejoin,
isPrejoinPageEnabled,
isPrejoinPageVisible,
replacePrejoinAudioTrack,
replacePrejoinVideoTrack
} from './react/features/prejoin';
import EventEmitter from 'events';
} from './react/features/app/actions';
import {
AVATAR_ID_COMMAND,
AVATAR_URL_COMMAND,
@@ -62,6 +48,7 @@ import {
import {
checkAndNotifyForNewDevice,
getAvailableDevices,
getDefaultDeviceId,
notifyCameraError,
notifyMicError,
setAudioOutputDeviceId,
@@ -86,7 +73,6 @@ import {
setVideoAvailable,
setVideoMuted
} from './react/features/base/media';
import { showNotification } from './react/features/notifications';
import {
dominantSpeakerChanged,
getLocalParticipant,
@@ -109,6 +95,8 @@ import {
createLocalPresenterTrack,
createLocalTracksF,
destroyLocalTracks,
getLocalJitsiAudioTrack,
getLocalJitsiVideoTrack,
isLocalVideoTrackMuted,
isLocalTrackMuted,
isUserInteractionRequiredForUnmute,
@@ -116,7 +104,10 @@ import {
trackAdded,
trackRemoved
} from './react/features/base/tracks';
import { getJitsiMeetGlobalNS } from './react/features/base/util';
import {
getBackendSafePath,
getJitsiMeetGlobalNS
} from './react/features/base/util';
import { showDesktopPicker } from './react/features/desktop-picker';
import { appendSuffix } from './react/features/display-name';
import { setE2EEKey } from './react/features/e2ee';
@@ -124,16 +115,25 @@ import {
maybeOpenFeedbackDialog,
submitFeedback
} from './react/features/feedback';
import { showNotification } from './react/features/notifications';
import { mediaPermissionPromptVisibilityChanged } from './react/features/overlay';
import { suspendDetected } from './react/features/power-monitor';
import {
initPrejoin,
isPrejoinPageEnabled,
isPrejoinPageVisible
} from './react/features/prejoin';
import { createRnnoiseProcessorPromise } from './react/features/rnnoise';
import { toggleScreenshotCaptureEffect } from './react/features/screenshot-capture';
import { setSharedVideoStatus } from './react/features/shared-video';
import { AudioMixerEffect } from './react/features/stream-effects/audio-mixer/AudioMixerEffect';
import { createPresenterEffect } from './react/features/stream-effects/presenter';
import { endpointMessageReceived } from './react/features/subtitles';
import { createRnnoiseProcessorPromise } from './react/features/rnnoise';
import { toggleScreenshotCaptureEffect } from './react/features/screenshot-capture';
import UIEvents from './service/UI/UIEvents';
import * as RemoteControlEvents
from './service/remotecontrol/RemoteControlEvents';
const logger = require('jitsi-meet-logger').getLogger(__filename);
const logger = Logger.getLogger(__filename);
const eventEmitter = new EventEmitter();
@@ -296,12 +296,6 @@ class ConferenceConnector {
logger.error('CONFERENCE FAILED:', err, ...params);
switch (err) {
case JitsiConferenceErrors.CONNECTION_ERROR: {
const [ msg ] = params;
APP.UI.notifyConnectionFailed(msg);
break;
}
case JitsiConferenceErrors.NOT_ALLOWED_ERROR: {
// let's show some auth not allowed page
@@ -336,14 +330,6 @@ class ConferenceConnector {
APP.UI.notifyGracefulShutdown();
break;
case JitsiConferenceErrors.CONFERENCE_DESTROYED: {
const [ reason ] = params;
APP.UI.hideStats();
APP.UI.notifyConferenceDestroyed(reason);
break;
}
// FIXME FOCUS_DISCONNECTED is a confusing event name.
// What really happens there is that the library is not ready yet,
// because Jicofo is not available, but it is going to give it another
@@ -425,6 +411,10 @@ function disconnect() {
return Promise.resolve();
};
if (!connection) {
return onDisconnected();
}
return connection.disconnect().then(onDisconnected, onDisconnected);
}
@@ -1262,7 +1252,7 @@ export default {
items[key] = param[1];
}
if (typeof items.e2eekey !== undefined) {
if (typeof items.e2eekey !== 'undefined') {
APP.store.dispatch(setE2EEKey(items.e2eekey));
// Clean URL in browser history.
@@ -1368,7 +1358,13 @@ export default {
const options = config;
const { email, name: nick } = getLocalParticipant(APP.store.getState());
const { locationURL } = APP.store.getState()['features/base/connection'];
const state = APP.store.getState();
const { locationURL } = state['features/base/connection'];
const { tenant } = state['features/base/jwt'];
if (tenant) {
options.siteID = tenant;
}
if (options.enableDisplayNameInStats && nick) {
options.statisticsDisplayName = nick;
@@ -1380,7 +1376,7 @@ export default {
options.applicationName = interfaceConfig.APP_NAME;
options.getWiFiStatsMethod = this._getWiFiStatsMethod;
options.confID = `${locationURL.host}${locationURL.pathname}`;
options.confID = `${locationURL.host}${getBackendSafePath(locationURL.pathname)}`;
options.createVADProcessor = createRnnoiseProcessorPromise;
// Disable CallStats, if requessted.
@@ -1411,31 +1407,32 @@ export default {
/**
* Start using provided video stream.
* Stops previous video stream.
* @param {JitsiLocalTrack} [stream] new stream to use or null
* @param {JitsiLocalTrack} newTrack - new track to use or null
* @returns {Promise}
*/
useVideoStream(newStream) {
useVideoStream(newTrack) {
return new Promise((resolve, reject) => {
_replaceLocalVideoTrackQueue.enqueue(onFinish => {
/**
* When the prejoin page is visible there is no conference object
* created. The prejoin tracks are managed separately,
* so this updates the prejoin video track.
*/
if (isPrejoinPageVisible(APP.store.getState())) {
return APP.store.dispatch(replacePrejoinVideoTrack(newStream))
const state = APP.store.getState();
// When the prejoin page is displayed localVideo is not set
// so just replace the video track from the store with the new one.
if (isPrejoinPageVisible(state)) {
const oldTrack = getLocalJitsiVideoTrack(state);
return APP.store.dispatch(replaceLocalTrack(oldTrack, newTrack))
.then(resolve)
.catch(reject)
.then(onFinish);
}
APP.store.dispatch(
replaceLocalTrack(this.localVideo, newStream, room))
replaceLocalTrack(this.localVideo, newTrack, room))
.then(() => {
this.localVideo = newStream;
this._setSharingScreen(newStream);
if (newStream) {
APP.UI.addLocalVideoStream(newStream);
this.localVideo = newTrack;
this._setSharingScreen(newTrack);
if (newTrack) {
APP.UI.addLocalVideoStream(newTrack);
}
this.setVideoMuteStatus(this.isLocalVideoMuted());
})
@@ -1476,28 +1473,29 @@ export default {
/**
* Start using provided audio stream.
* Stops previous audio stream.
* @param {JitsiLocalTrack} [stream] new stream to use or null
* @param {JitsiLocalTrack} newTrack - new track to use or null
* @returns {Promise}
*/
useAudioStream(newStream) {
useAudioStream(newTrack) {
return new Promise((resolve, reject) => {
_replaceLocalAudioTrackQueue.enqueue(onFinish => {
/**
* When the prejoin page is visible there is no conference object
* created. The prejoin tracks are managed separately,
* so this updates the prejoin audio stream.
*/
if (isPrejoinPageVisible(APP.store.getState())) {
return APP.store.dispatch(replacePrejoinAudioTrack(newStream))
const state = APP.store.getState();
// When the prejoin page is displayed localAudio is not set
// so just replace the audio track from the store with the new one.
if (isPrejoinPageVisible(state)) {
const oldTrack = getLocalJitsiAudioTrack(state);
return APP.store.dispatch(replaceLocalTrack(oldTrack, newTrack))
.then(resolve)
.catch(reject)
.then(onFinish);
}
APP.store.dispatch(
replaceLocalTrack(this.localAudio, newStream, room))
replaceLocalTrack(this.localAudio, newTrack, room))
.then(() => {
this.localAudio = newStream;
this.localAudio = newTrack;
this.setAudioMuteStatus(this.isLocalAudioMuted());
})
.then(resolve)
@@ -1590,10 +1588,6 @@ export default {
if (didHaveVideo) {
promise = promise.then(() => createLocalTracksF({ devices: [ 'video' ] }))
.then(([ stream ]) => this.useVideoStream(stream))
.then(() => {
sendAnalytics(createScreenSharingEvent('stopped'));
logger.log('Screen sharing stopped.');
})
.catch(error => {
logger.error('failed to switch back to local video', error);
@@ -1610,6 +1604,8 @@ export default {
return promise.then(
() => {
this.videoSwitchInProgress = false;
sendAnalytics(createScreenSharingEvent('stopped'));
logger.info('Screen sharing stopped.');
},
error => {
this.videoSwitchInProgress = false;
@@ -1677,8 +1673,6 @@ export default {
* @private
*/
_createDesktopTrack(options = {}) {
let externalInstallation = false;
let DSExternalInstallationInProgress = false;
const didHaveVideo = !this.isLocalVideoMuted();
const getDesktopStreamPromise = options.desktopStream
@@ -1687,43 +1681,7 @@ export default {
desktopSharingSourceDevice: options.desktopSharingSources
? null : config._desktopSharingSourceDevice,
desktopSharingSources: options.desktopSharingSources,
devices: [ 'desktop' ],
desktopSharingExtensionExternalInstallation: {
interval: 500,
checkAgain: () => DSExternalInstallationInProgress,
listener: (status, url) => {
switch (status) {
case 'waitingForExtension': {
DSExternalInstallationInProgress = true;
externalInstallation = true;
const listener = () => {
// Wait a little bit more just to be sure that
// we won't miss the extension installation
setTimeout(() => {
DSExternalInstallationInProgress = false;
},
500);
APP.UI.removeListener(
UIEvents.EXTERNAL_INSTALLATION_CANCELED,
listener);
};
APP.UI.addListener(
UIEvents.EXTERNAL_INSTALLATION_CANCELED,
listener);
APP.UI.showExtensionExternalInstallationDialog(url);
break;
}
case 'extensionFound':
// Close the dialog.
externalInstallation && $.prompt.close();
break;
default:
// Unknown status
}
}
}
devices: [ 'desktop' ]
});
return getDesktopStreamPromise.then(desktopStreams => {
@@ -1747,15 +1705,8 @@ export default {
);
}
// close external installation dialog on success.
externalInstallation && $.prompt.close();
return desktopStreams;
}, error => {
DSExternalInstallationInProgress = false;
// close external installation dialog on success.
externalInstallation && $.prompt.close();
throw error;
});
},
@@ -1959,70 +1910,36 @@ export default {
/**
* Handles {@link JitsiTrackError} returned by the lib-jitsi-meet when
* trying to create screensharing track. It will either do nothing if
* the dialog was canceled on user's request or display inline installation
* dialog and ask the user to install the extension, once the extension is
* installed it will switch the conference to screensharing. The last option
* is that an unrecoverable error dialog will be displayed.
* the dialog was canceled on user's request or display an error if
* screensharing couldn't be started.
* @param {JitsiTrackError} error - The error returned by
* {@link _createDesktopTrack} Promise.
* @private
*/
_handleScreenSharingError(error) {
if (error.name === JitsiTrackErrors.CHROME_EXTENSION_USER_CANCELED) {
if (error.name === JitsiTrackErrors.SCREENSHARING_USER_CANCELED) {
return;
}
logger.error('failed to share local desktop', error);
if (error.name
=== JitsiTrackErrors.CHROME_EXTENSION_USER_GESTURE_REQUIRED) {
// If start with screen sharing the extension will fail to install
// (if not found), because the request has been triggered by the
// script. Show a dialog which asks user to click "install" and try
// again switching to the screen sharing.
APP.UI.showExtensionInlineInstallationDialog(
() => {
// eslint-disable-next-line no-empty-function
this.toggleScreenSharing().catch(() => {});
}
);
return;
}
// Handling:
// JitsiTrackErrors.PERMISSION_DENIED
// JitsiTrackErrors.CHROME_EXTENSION_INSTALLATION_ERROR
// JitsiTrackErrors.CONSTRAINT_FAILED
// JitsiTrackErrors.GENERAL
// JitsiTrackErrors.PERMISSION_DENIED
// JitsiTrackErrors.SCREENSHARING_GENERIC_ERROR
// and any other
let descriptionKey;
let titleKey;
if (error.name === JitsiTrackErrors.PERMISSION_DENIED) {
// in FF the only option for user is to deny access temporary or
// permanently and we only receive permission_denied
// we always show some info cause in case of permanently, no info
// shown will be bad experience
//
// TODO: detect interval between requesting permissions and received
// error, this way we can detect user interaction which will have
// longer delay
if (JitsiMeetJS.util.browser.isFirefox()) {
descriptionKey
= 'dialog.screenSharingFirefoxPermissionDeniedError';
titleKey = 'dialog.screenSharingFirefoxPermissionDeniedTitle';
} else {
descriptionKey = 'dialog.screenSharingPermissionDeniedError';
titleKey = 'dialog.screenSharingFailedToInstallTitle';
}
descriptionKey = 'dialog.screenSharingPermissionDeniedError';
titleKey = 'dialog.screenSharingFailedTitle';
} else if (error.name === JitsiTrackErrors.CONSTRAINT_FAILED) {
descriptionKey = 'dialog.cameraConstraintFailedError';
titleKey = 'deviceError.cameraError';
} else {
descriptionKey = 'dialog.screenSharingFailedToInstall';
titleKey = 'dialog.screenSharingFailedToInstallTitle';
} else if (error.name === JitsiTrackErrors.SCREENSHARING_GENERIC_ERROR) {
descriptionKey = 'dialog.screenSharingFailed';
titleKey = 'dialog.screenSharingFailedTitle';
}
APP.UI.messageHandler.showError({
@@ -2429,11 +2346,20 @@ export default {
micDeviceId => {
const audioWasMuted = this.isLocalAudioMuted();
// When the 'default' mic needs to be selected, we need to
// pass the real device id to gUM instead of 'default' in order
// to get the correct MediaStreamTrack from chrome because of the
// following bug.
// https://bugs.chromium.org/p/chromium/issues/detail?id=997689
const hasDefaultMicChanged = micDeviceId === 'default';
sendAnalytics(createDeviceChangedEvent('audio', 'input'));
createLocalTracksF({
devices: [ 'audio' ],
cameraDeviceId: null,
micDeviceId
micDeviceId: hasDefaultMicChanged
? getDefaultDeviceId(APP.store.getState(), 'audioInput')
: micDeviceId
})
.then(([ stream ]) => {
// if audio was muted before changing the device, mute
@@ -2457,6 +2383,12 @@ export default {
return this.useAudioStream(stream);
})
.then(() => {
if (hasDefaultMicChanged) {
// workaround for the default device to be shown as selected in the
// settings even when the real device id was passed to gUM because of the
// above mentioned chrome bug.
this.localAudio._realDeviceId = this.localAudio.deviceId = 'default';
}
logger.log(`switched local audio device: ${this.localAudio?.getDeviceId()}`);
this._updateAudioDeviceId();
@@ -2510,6 +2442,8 @@ export default {
if (state === 'stop'
|| state === 'start'
|| state === 'playing') {
const localParticipant = getLocalParticipant(APP.store.getState());
room.removeCommand(this.commands.defaults.SHARED_VIDEO);
room.sendCommandOnce(this.commands.defaults.SHARED_VIDEO, {
value: url,
@@ -2517,7 +2451,8 @@ export default {
state,
time,
muted: isMuted,
volume
volume,
from: localParticipant.id
}
});
} else {
@@ -2758,11 +2693,20 @@ export default {
checkAndNotifyForNewDevice(newAvailDevices.videoInput, oldDevices.videoInput));
}
// When the 'default' mic needs to be selected, we need to
// pass the real device id to gUM instead of 'default' in order
// to get the correct MediaStreamTrack from chrome because of the
// following bug.
// https://bugs.chromium.org/p/chromium/issues/detail?id=997689
const hasDefaultMicChanged = newDevices.audioinput === 'default';
promises.push(
mediaDeviceHelper.createLocalTracksAfterDeviceListChanged(
createLocalTracksF,
newDevices.videoinput,
newDevices.audioinput)
hasDefaultMicChanged
? getDefaultDeviceId(APP.store.getState(), 'audioInput')
: newDevices.audioinput)
.then(tracks => {
// If audio or video muted before, or we unplugged current
// device and selected new one, then mute new track.
@@ -2787,6 +2731,12 @@ export default {
// Use the new stream or null if we failed to obtain it.
return useStream(tracks.find(track => track.getType() === mediaType) || null)
.then(() => {
if (hasDefaultMicChanged) {
// workaround for the default device to be shown as selected in the
// settings even when the real device id was passed to gUM because of
// the above mentioned chrome bug.
this.localAudio._realDeviceId = this.localAudio.deviceId = 'default';
}
mediaType === 'audio'
? this._updateAudioDeviceId()
: this._updateVideoDeviceId();

144
config.js
View File

@@ -37,6 +37,8 @@ var config = {
clientNode: 'http://jitsi.org/jitsimeet',
// The real JID of focus participant - can be overridden here
// Do not change username - FIXME: Make focus username configurable
// https://github.com/jitsi/jitsi-meet/issues/7376
// focusUserJid: 'focus@auth.jitsi-meet.example.com',
@@ -44,6 +46,10 @@ var config = {
//
testing: {
// Disables the End to End Encryption feature. Useful for debugging
// issues related to insertable streams.
// disableE2EE: false,
// P2P test mode disables automatic switching to P2P when there are 2
// participants in the conference.
p2pTestMode: false
@@ -54,6 +60,13 @@ var config = {
// Disables the auto-play behavior of *all* newly created video element.
// This is useful when the client runs on a host with limited resources.
// noAutoPlayVideo: false
// Enable / disable 500 Kbps bitrate cap on desktop tracks. When enabled,
// simulcast is turned off for the desktop share. If presenter is turned
// on while screensharing is in progress, the max bitrate is automatically
// adjusted to 2.5 Mbps. This takes a value between 0 and 1 which determines
// the probability for this to be enabled.
// capScreenshareBitrate: 1 // 0 to disable
},
// Disables ICE/UDP by filtering out local and remote UDP candidates in
@@ -100,11 +113,20 @@ var config = {
// participants and to enable it back a reload is needed.
// startSilent: false
// Sets the preferred target bitrate for the Opus audio codec by setting its
// 'maxaveragebitrate' parameter. Currently not available in p2p mode.
// Valid values are in the range 6000 to 510000
// opusMaxAverageBitrate: 20000,
// Video
// Sets the preferred resolution (height) for local video. Defaults to 720.
// resolution: 720,
// How many participants while in the tile view mode, before the receiving video quality is reduced from HD to SD.
// Use -1 to disable.
// maxFullResolutionParticipants: 2
// w3c spec-compliant video constraints to use for video capture. Currently
// used by browsers that return true from lib-jitsi-meet's
// util#browser#usesNewGumFlow. The constraints are independent from
@@ -147,22 +169,6 @@ var config = {
// Desktop sharing
// The ID of the jidesha extension for Chrome.
desktopSharingChromeExtId: null,
// Whether desktop sharing should be disabled on Chrome.
// desktopSharingChromeDisabled: false,
// The media sources to use when using screen sharing with the Chrome
// extension.
desktopSharingChromeSources: [ 'screen', 'window', 'tab' ],
// Required version of Chrome extension
desktopSharingChromeMinExtVersion: '0.1',
// Whether desktop sharing should be disabled on Firefox.
// desktopSharingFirefoxDisabled: false,
// Optional desktop sharing frame rate options. Default value: min:5, max:5.
// desktopSharingFrameRate: {
// min: 5,
@@ -210,6 +216,52 @@ var config = {
// Default value for the channel "last N" attribute. -1 for unlimited.
channelLastN: -1,
// Provides a way to use different "last N" values based on the number of participants in the conference.
// The keys in an Object represent number of participants and the values are "last N" to be used when number of
// participants gets to or above the number.
//
// For the given example mapping, "last N" will be set to 20 as long as there are at least 5, but less than
// 29 participants in the call and it will be lowered to 15 when the 30th participant joins. The 'channelLastN'
// will be used as default until the first threshold is reached.
//
// lastNLimits: {
// 5: 20,
// 30: 15,
// 50: 10,
// 70: 5,
// 90: 2
// },
// Specify the settings for video quality optimizations on the client.
// videoQuality: {
//
// // Provides a way to configure the maximum bitrates that will be enforced on the simulcast streams for
// // video tracks. The keys in the object represent the type of the stream (LD, SD or HD) and the values
// // are the max.bitrates to be set on that particular type of stream. The actual send may vary based on
// // the available bandwidth calculated by the browser, but it will be capped by the values specified here.
// // This is currently not implemented on app based clients on mobile.
// maxBitratesVideo: {
// low: 200000,
// standard: 500000,
// high: 1500000
// }
// },
// // Options for the recording limit notification.
// recordingLimit: {
//
// // The recording limit in minutes. Note: This number appears in the notification text
// // but doesn't enforce the actual recording time limit. This should be configured in
// // jibri!
// limit: 60,
//
// // The name of the app with unlimited recordings.
// appName: 'Unlimited recordings APP',
//
// // The URL of the app with unlimited recordings.
// appURL: 'https://unlimited.recordings.app.com/'
// },
// Disables or enables RTX (RFC 4588) (defaults to false).
// disableRtx: false,
@@ -238,11 +290,14 @@ var config = {
// is set in Jicofo and set to 2).
// minParticipants: 2,
// Use XEP-0215 to fetch STUN and TURN servers.
// Use the TURN servers discovered via XEP-0215 for the jitsi-videobridge
// connection
// useStunTurn: true,
// Enable IPv6 support.
// useIPv6: true,
// Use TURN/UDP servers for the jitsi-videobridge connection (by default
// we filter out TURN/UDP because it is usually not needed since the
// bridge itself is reachable via UDP)
// useTurnUdp: false
// Enables / disables a data communication channel with the Videobridge.
// Values can be 'datachannel', 'websocket', true (treat it as
@@ -254,9 +309,6 @@ var config = {
// UI
//
// Use display name as XMPP nickname.
// useNicks: false,
// Require users to always specify a display name.
// requireDisplayName: true,
@@ -297,9 +349,14 @@ var config = {
// and microsoftApiApplicationClientID
// enableCalendarIntegration: false,
// When 'true', it shows an intermediate page before joining, where the user can configure its devices.
// When 'true', it shows an intermediate page before joining, where the user can configure their devices.
// prejoinPageEnabled: false,
// If true, shows the unsafe room name warning label when a room name is
// deemed unsafe (due to the simplicity in the name) and a password is not
// set or the lobby is not enabled.
// enableInsecureRoomNameWarning: false,
// Stats
//
@@ -317,10 +374,10 @@ var config = {
// callStatsID: '',
// callStatsSecret: '',
// enables sending participants display name to callstats
// Enables sending participants' display names to callstats
// enableDisplayNameInStats: false,
// enables sending participants email if available to callstats and other analytics
// Enables sending participants' emails (if available) to callstats and other analytics
// enableEmailInStats: false,
// Privacy
@@ -350,9 +407,9 @@ var config = {
// The STUN servers that will be used in the peer to peer connections
stunServers: [
// { urls: 'stun:jitsi-meet.example.com:4446' },
// { urls: 'stun:jitsi-meet.example.com:3478' },
{ urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' }
],
]
// Sets the ICE transport policy for the p2p connection. At the time
// of this writing the list of possible values are 'all' and 'relay',
@@ -364,7 +421,7 @@ var config = {
// If set to true, it will prefer to use H.264 for P2P calls (if H.264
// is supported).
preferH264: true
// preferH264: true
// If set to true, disable H.264 video codec by stripping it out of the
// SDP.
@@ -386,6 +443,15 @@ var config = {
// The Amplitude APP Key:
// amplitudeAPPKey: '<APP_KEY>'
// Configuration for the rtcstats server:
// In order to enable rtcstats one needs to provide a endpoint url.
// rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/,
// The interval at which rtcstats will poll getStats, defaults to 1000ms.
// If the value is set to 0 getStats won't be polled and the rtcstats client
// will only send data related to RTCPeerConnection events.
// rtcstatsPolIInterval: 1000
// Array of script URLs to load as lib-jitsi-meet "analytics handlers".
// scriptURLs: [
// "libs/analytics-ga.min.js", // google-analytics
@@ -490,6 +556,28 @@ var config = {
// If set to true all muting operations of remote participants will be disabled.
// disableRemoteMute: true,
/**
External API url used to receive branding specific information.
If there is no url set or there are missing fields, the defaults are applied.
None of the fields are mandatory and the response must have the shape:
{
// The hex value for the colour used as background
backgroundColor: '#fff',
// The url for the image used as background
backgroundImageUrl: 'https://example.com/background-img.png',
// The anchor url used when clicking the logo image
logoClickUrl: 'https://example-company.org',
// The url used for the image used as logo
logoImageUrl: 'https://example.com/logo-img.png'
}
*/
// brandingDataUrl: '',
// The URL of the moderated rooms microservice, if available. If it
// is present, a link to the service will be rendered on the welcome page,
// otherwise the app doesn't render it.
// moderatedRoomServiceUrl: 'https://moderated.jitsi-meet.example.com',
// List of undocumented settings used in jitsi-meet
/**
_immediateReloadThreshold

View File

@@ -1,20 +1,21 @@
/* global APP, JitsiMeetJS, config */
import { jitsiLocalStorage } from 'js-utils';
import { jitsiLocalStorage } from '@jitsi/js-utils';
import Logger from 'jitsi-meet-logger';
import AuthHandler from './modules/UI/authentication/AuthHandler';
import {
connectionEstablished,
connectionFailed
} from './react/features/base/connection';
} from './react/features/base/connection/actions';
import {
isFatalJitsiConnectionError,
JitsiConnectionErrors,
JitsiConnectionEvents
} from './react/features/base/lib-jitsi-meet';
import { setPrejoinDisplayNameRequired } from './react/features/prejoin/actions';
const logger = require('jitsi-meet-logger').getLogger(__filename);
const logger = Logger.getLogger(__filename);
/**
* The feature announced so we can distinguish jibri participants.
@@ -113,6 +114,10 @@ function connect(id, password, roomName) {
connection.addEventListener(
JitsiConnectionEvents.CONNECTION_FAILED,
connectionFailedHandler);
connection.addEventListener(
JitsiConnectionEvents.DISPLAY_NAME_REQUIRED,
displayNameRequiredHandler
);
/* eslint-disable max-params */
/**
@@ -166,6 +171,14 @@ function connect(id, password, roomName) {
reject(err);
}
/**
* Marks the display name for the prejoin screen as required.
* This can happen if a user tries to join a room with lobby enabled.
*/
function displayNameRequiredHandler() {
APP.store.dispatch(setPrejoinDisplayNameRequired());
}
checkForAttachParametersAndConnect(id, password, connection);
});
}

View File

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

View File

@@ -1,5 +1,6 @@
.audio-preview {
&-content {
background: #2A3A4B;
font-size: 15px;
line-height: 24px;
max-height: 456px;
@@ -32,7 +33,7 @@
margin-left: 48px;
&--selected {
background: rgba(28,32,37,0.5);
background: #1C2025;
cursor: initial;
margin-left: 0;
padding-left: 21px;
@@ -55,7 +56,7 @@
&:hover {
.audio-preview-entry {
background: rgba(255,255,255, 0.2);
background: #3F4E5E;
margin-left: 0;
padding-left: 48px;
@@ -80,8 +81,23 @@
&-microphone {
position: relative;
}
&:hover {
.audio-preview-entry {
background: #3F4E5E;
margin-left: 0;
padding-left: 48px;
&--selected {
padding-left: 21px;
}
}
}
.audio-preview-entry-text {
max-width: 196px;
}
}
&-icon {
border-radius: 50%;

View File

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

View File

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

75
css/_country-picker.scss Normal file
View File

@@ -0,0 +1,75 @@
.cpick {
border: 1px solid #A4B8D1;
color: #fff;
display: flex;
font-size: 15px;
height: 38px;
line-height: 24px;
&-selector {
align-items: center;
background-color: #283447;
border-right: 1px solid #A4B8D1;
cursor: pointer;
display: flex;
padding: 8px 10px;
position: relative;
width: 88px;
}
&-icon {
margin-right: 8px;
position: absolute;
right: 0;
top: 12px;
& > svg {
fill: #fff;
}
}
&-input {
padding: 8px;
background: #1C2025;
border: 0;
margin: 0;
color: #fff;
caret-color: #0376DA;
flex-grow: 1;
}
&-dropdown {
height: 190px;
overflow-y: auto;
width: 343px;
}
&-dropdown-entry {
align-items: center;
cursor: pointer;
display: flex;
height: 40px;
padding: 0 10px;
&:hover {
background-color: #66768b;
}
&-text {
color: #fff;
flex-grow: 1;
font-size: 15px;
line-height: 24px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
// Override @Atlaskit/inline-dialog styles
.cpick-container > div > div:nth-child(2) > div > div {
outline: none;
padding: 8px 0 0 0;
}

41
css/_e2ee.scss Normal file
View File

@@ -0,0 +1,41 @@
#e2ee-section {
.title {
font-weight: 700;
}
.description {
font-size: 13px;
margin: 15px 0;
.read-more {
cursor: pointer;
opacity: .7;
}
}
.key-field {
align-items: center;
display: flex;
flex-direction: row;
label {
font-size: 14px;
font-weight: 700;
}
input {
background-color: inherit;
border: none;
color: inherit;
flex: 1;
padding: 0 5px;
}
a {
color: #6FB1EA;
cursor: pointer;
font-size: 14px;
text-decoration: none;
}
}
}

68
css/_labels.scss Normal file
View File

@@ -0,0 +1,68 @@
.large-video-labels {
display: flex;
position: absolute;
top: 30px;
right: 30px;
transition: right 0.5s;
z-index: $filmstripVideosZ + 1;
.circular-label {
align-items: center;
color: white;
display: flex;
font-weight: bold;
justify-content: center;
margin-left: 8px;
opacity: 0.8;
}
.circular-label {
background: #B8C7E0;
}
.circular-label.e2ee {
align-items: center;
background: #76CF9C;
display: flex;
justify-content: center;
}
.circular-label.file {
background: #FF5630;
}
.circular-label.local-rec {
background: #FF5630;
}
.circular-label.stream {
background: #0065FF;
}
.circular-label.insecure {
background: $defaultWarningColor;
}
.recording-label.center-message {
background: $videoStateIndicatorBackground;
bottom: 50%;
display: block;
left: 50%;
padding: 10px;
position: fixed;
transform: translate(-50%, -50%);
z-index: $centeredVideoLabelZ;
}
}
.circular-label {
background: $videoStateIndicatorBackground;
border-radius: 50%;
box-sizing: border-box;
cursor: default;
font-size: 13px;
height: $videoStateIndicatorSize;
line-height: $videoStateIndicatorSize;
text-align: center;
min-width: $videoStateIndicatorSize;
}

144
css/_lobby.scss Normal file
View File

@@ -0,0 +1,144 @@
#lobby-screen {
.content {
.container {
align-items: center;
display: flex;
flex-direction: column;
.spinner {
margin: 30px;
}
.joining-message {
margin: 10px;
}
}
.form {
align-items: stretch;
display: flex;
flex-direction: column;
min-width: 400px;
}
.participant-info {
align-items: center;
display: flex;
flex-direction: column;
}
}
}
#lobby-section {
display: flex;
flex-direction: column;
.description {
font-size: 13px;
}
.control-row {
display: flex;
flex-direction: row;
justify-content: space-between;
margin-top: 15px;
label {
font-size: 14px;
font-weight: bold;
}
}
}
#knocking-participant-list {
background-color: $newToolbarBackgroundColor;
border: 1px solid rgba(255, 255, 255, .4);
border-radius: 8px;
display: flex;
flex-direction: column;
left: 0;
margin: 20px;
position: fixed;
top: 20;
transition: top 1s ease;
z-index: 100;
&.toolbox-visible {
// Same as toolbox subject position
top: 120px;
}
.title {
background-color: rgba(0, 0, 0, .2);
font-size: 1.2em;
padding: 15px
}
ul {
list-style-type: none;
padding: 0 15px 15px 15px;
li {
align-items: center;
display: flex;
flex-direction: row;
margin: 8px 0;
.details {
display: flex;
flex: 1;
flex-direction: column;
justify-content: space-evenly;
margin: 0 30px 0 10px;
}
button {
align-self: unset;
margin: 0 5px;
}
}
}
input {
align-self: stretch;
background-color: transparent;
border: 1px solid #B8C7E0;
border-radius: 4px;
color: white;
padding: 12px 8px;
&:focus {
border-color: rgb(3, 118, 218);
}
}
button {
align-self: stretch;
margin: 8px 0;
padding: 12px;
transition: .2s transform ease;
&:disabled {
opacity: .5;
}
&:hover {
transform: scale(1.05);
&:disabled {
transform: none;
}
}
&.borderLess {
background-color: transparent;
border-width: 0;
}
&.primary {
background-color: rgb(3, 118, 218);
border-width: 0;
}
}
}

74
css/_notifications.scss Normal file
View File

@@ -0,0 +1,74 @@
@include keyframes(exiting) {
from {
opacity: 1;
transform: translate(0, 0);
}
to {
opacity: 0;
transform: translate(-200px, 0);
}
}
.notificationsContainer {
display: flex;
position: absolute;
bottom: 0px;
flex-direction: column;
width: 400px;
left: 80px;
.topContainer {
padding-bottom: 16px;
// transition: height 0.4s ease-in-out;
.notification {
width: 400px;
z-index: 5;
&:nth-child(n+2) {
margin-top: 16px;
}
&.exiting {
animation-name: exiting;
animation-duration: 0.4s;
}
}
}
.bottomContainer {
margin-bottom: 64px;
position: relative;
height: 100%;
.notification {
width: 400px;
bottom: 0px;
&:nth-child(1) {
z-index: 5;
}
&:nth-child(n+2) {
transition: transform 0.4s ease-in-out;
z-index: 4;
position: absolute;
transform: translateY(100%) translateY(16px);
}
&:nth-child(n+4) {
display: none;
}
&.exiting {
animation-name: exiting;
animation-duration: 0.4s;
}
&.exiting+.notification {
transform: translateY(0);
}
}
}
}

187
css/_prejoin-dialog.scss Normal file
View File

@@ -0,0 +1,187 @@
.prejoin-dialog {
background: #1C2025;
box-shadow: 0px 2px 20px rgba(0, 0, 0, 0.5);
border-radius: 5px;
color: #fff;
height: 400px;
width: 375px;
&--small {
height: 300;
width: 400;
}
&-label {
font-size: 15px;
line-height: 24px;
&-num {
background: #2b3b4b;
border: 1px solid #A4B8D1;
border-radius: 50%;
color: #fff;
display: inline-block;
height: 24px;
margin-right: 8px;
width: 24px;
}
}
&-container {
align-items: center;
background: rgba(0,0,0,0.6);
display: flex;
height: 100vh;
justify-content: center;
left: 0;
position: absolute;
top: 0;
width: 100vw;
z-index: 3;
}
&-flag {
display: inline-block;
margin-right: 8px;
transform: scale(1.2);
}
&-title {
display: inline-block;
font-size: 24px;
line-height: 32px;
}
&-icon {
cursor: pointer;
> svg {
fill: #A4B8D1;
}
}
&-btn {
width: 309px;
}
&-dialin-container {
text-align: center;
}
&-delimiter {
background: #5f6266;
border: 0;
height: 1px;
margin: 0;
padding: 0;
width: 100%;
&-container {
margin: 16px 0 24px 0;
position: relative;
}
&-txt-container {
position: absolute;
text-align: center;
top: -8px;
width: 100%;
}
&-txt {
background: #1C2025;
color: #5f6266;
font-size: 11px;
text-transform: uppercase;
padding: 0 8px;
}
}
.prejoin-dialog-btn.primary,
.action-btn.prejoin-dialog-btn.text {
width: 310px;
}
}
.prejoin-dialog-callout {
padding: 16px;
&-header {
display: flex;
justify-content: space-between;
margin-bottom: 24px;
}
&-picker {
margin: 8px 0 16px 0;
}
}
.prejoin-dialog-dialin {
text-align: center;
&-header {
align-items: center;
margin: 16px 0 32px 16px;
display: flex;
}
&-icon {
margin-right: 16px;
}
&-num {
background: #3e474f;
border-radius: 4px;
display: inline-block;
font-size: 15px;
line-height: 24px;
margin: 4px;
padding: 8px;
&-container {
min-height: 48px;
margin: 8px 0;
}
}
&-link {
color: #6FB1EA;
cursor: pointer;
display: inline-block;
font-size: 13px;
line-height: 20px;
margin-bottom: 24px;
}
&-spaced-label {
margin-bottom: 16px;
margin-top: 28px;
}
&-btns {
&> div {
margin-bottom: 16px;
}
}
}
.prejoin-dialog-calling {
padding: 16px;
text-align: center;
&-header {
text-align: right;
}
&-label {
font-size: 15px;
margin: 8px 0 16px 0;
}
&-number {
font-size: 19px;
line-height: 28px;
margin: 16px 0;
}
}

View File

@@ -1,18 +1,4 @@
.prejoin {
&-full-page {
background: #1C2025;
position: absolute;
width: 100%;
height: 100%;
z-index: $toolbarZ + 1;
}
&-input-area-container {
position: absolute;
bottom: 48px;
width: 100%;
z-index: 2;
}
&-input-area {
margin: 0 auto;
@@ -27,48 +13,6 @@
margin-bottom: 16px;
}
&-btn {
border-radius: 3px;
color: #fff;
cursor: pointer;
display: inline-block;
font-size: 15px;
line-height: 24px;
padding: 7px 16px;
position: relative;
text-align: center;
width: 286px;
&--primary {
background: #0376DA;
border: 1px solid #0376DA;
}
&--secondary {
background: #2A3A4B;
border: 1px solid #5E6D7A;
}
&--text {
width: auto;
font-size: 13px;
margin: 0;
padding: 0;
}
}
&-btn-options {
align-items: center;
border-left: 1px solid #fff;
display: flex;
height: 100%;
justify-content: center;
position: absolute;
right: 0;
top: 0;
width: 40px;
}
&-text-btns {
display: flex;
justify-content: space-between;
@@ -92,13 +36,7 @@
}
&-checkbox-container {
align-items: center;
color: #fff;
display: none;
font-size: 13px;
justify-content: center;
line-height: 20px;
margin-top: 16px;
margin-bottom: 14px;
width: 100%;
}
}
@@ -150,6 +88,11 @@
@include name-placeholder;
}
}
&--text {
margin: 16px 0;
outline: none;
}
}
&-avatar.avatar {
@@ -157,25 +100,6 @@
margin: 200px auto 0 auto;
}
&-btn-container {
display: flex;
justify-content: center;
margin-top: 32px;
width: 100%;
&> div {
margin: 0 12px;
}
.settings-button-small-icon {
right: -8px;
&--hovered {
right: -10px;
}
}
}
&-overlay {
height: 100%;
position: absolute;
@@ -195,22 +119,20 @@
&-status {
align-items: center;
bottom: 0;
align-self: stretch;
color: #fff;
display: flex;
font-size: 13px;
min-height: 24px;
justify-content: center;
position: absolute;
text-align: center;
width: 100%;
z-index: 1;
&--warning {
background: rgba(241, 173, 51, 0.5)
background: rgba(241, 173, 51, 0.7)
}
&--ok {
background: rgba(49, 183, 106, 0.5);
background: rgba(49, 183, 106, 0.7);
}
}
@@ -269,63 +191,3 @@
}
}
.prejoin-copy {
&-meeting {
cursor: pointer;
color: #fff;
font-size: 15px;
font-weight: 300;
line-height: 24px;
position: relative;
}
&-url {
max-width: 278px;
padding: 8px 10px;
overflow: hidden;
text-overflow: ellipsis;
}
&-badge {
border-radius: 4px;
height: 100%;
line-height: 38px;
position: absolute;
padding-left: 10px;
text-align: left;
top: 0;
width: 100%;
&--hover {
background: #1C2025;
}
&--done {
background: #31B76A;
}
}
&-icon {
position: absolute;
right: 8px;
top: 8px;
&--white {
&> svg > path {
fill: #fff
}
}
&--light {
&> svg > path {
fill: #D1DBE8;
}
}
}
&-textarea {
position: absolute;
left: -9999px;
}
}

View File

@@ -0,0 +1,281 @@
/**
* Shared style for full screen local track based dialogs/modals.
*/
.premeeting-screen,
.preview-overlay {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
.premeeting-screen {
align-items: stretch;
background: radial-gradient(50% 50% at 50% 50%, #5D95C7 0%, #376288 100%), #FFFFFF;
display: flex;
flex-direction: column;
font-size: 1.3em;
z-index: $toolbarZ + 1;
.action-btn {
border-radius: 3px;
color: #fff;
cursor: pointer;
display: inline-block;
font-size: 15px;
line-height: 24px;
margin-top: 16px;
padding: 7px 16px;
position: relative;
text-align: center;
width: 286px;
&.primary {
background: #0376DA;
border: 1px solid #0376DA;
}
&.secondary {
background: transparent;
border: 1px solid #5E6D7A;
}
&.text {
width: auto;
font-size: 13px;
margin: 0;
padding: 0;
}
&.disabled {
background: #5E6D7A;
border: 1px solid #5E6D7A;
color: #AFB6BC;
cursor: initial;
.icon {
& > svg {
fill: #AFB6BC;
}
}
.options {
border-left: 1px solid #AFB6BC;
}
}
.options {
align-items: center;
border-left: 1px solid #fff;
display: flex;
height: 100%;
justify-content: center;
position: absolute;
right: 0;
top: 0;
width: 40px;
}
}
.preview-overlay {
background-image: linear-gradient(transparent, black);
z-index: $toolbarZ + 1;
}
.content {
align-items: center;
display: flex;
flex: 1;
flex-direction: column;
justify-content: flex-end;
z-index: $toolbarZ + 2;
.title {
color: #fff;
font-size: 24px;
line-height: 32px;
margin-bottom: 16px;
}
.copy-meeting {
align-items: center;
cursor: pointer;
color: #fff;
display: flex;
flex-direction: row;
font-size: 15px;
font-weight: 300;
justify-content: center;
line-height: 24px;
margin-bottom: 16px;
.url {
display: flex;
padding: 8px 10px;
&:hover {
background: #1C2025;
border-radius: 4px;
}
&.done {
background: #31B76A;
}
.jitsi-icon {
margin-left: 10px;
}
}
.copy-meeting-text {
width: 266px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
&:hover {
align-self: stretch;
}
textarea {
border-width: 0;
height: 0;
opacity: 0;
padding: 0;
width: 0;
}
}
input.field {
background-color: transparent;
border: 1px solid transparent;
color: white;
outline-width: 0;
padding: 8px 0;
text-align: center;
width: 100%;
&.focused {
border-bottom: 1px solid white;
}
&.error::placeholder {
color: $defaultWarningColor;
}
}
}
.media-btn-container {
display: flex;
justify-content: center;
margin: 32px 0;
width: 100%;
&> div {
margin: 0 12px;
}
.settings-button-small-icon {
right: -8px;
&--hovered {
right: -10px;
}
}
}
}
#preview {
height: 100%;
position: absolute;
width: 100%;
&.no-video {
background: radial-gradient(50% 50% at 50% 50%, #5B6F80 0%, #365067 100%), #FFFFFF;
text-align: center;
}
.preview-avatar-container {
width: 100%;
height: 80%;
display: flex;
align-items: center;
justify-content: center;
}
.avatar {
background: #A4B8D1;
}
video {
height: 100%;
object-fit: cover;
position: absolute;
width: 100%;
}
}
@mixin flex-centered() {
align-items: center;
display: flex;
justify-content: center;
}
@mixin icon-container($bg, $fill) {
.toggle-button-icon-container {
background: $bg;
svg {
fill: $fill
}
}
}
.toggle-button {
border-radius: 3px;
cursor: pointer;
color: #fff;
font-size: 13px;
height: 40px;
margin: 0 auto;
width: 320px;
@include flex-centered();
svg {
fill: transparent;
}
&:hover {
background: #1C2025;
@include icon-container(#A4B8D1, #1C2025);
}
&-container {
position: relative;
@include flex-centered();
}
&-icon-container {
border-radius: 50%;
left: -22px;
padding: 2px;
position: absolute;
}
&--toggled {
background: #75757A;
&:hover {
background: #75757A;
@include icon-container(#A4B8D1, #75757A);
}
@include icon-container(#A4B8D1, #75757A);
}
}

View File

@@ -115,3 +115,19 @@
font-size: 12px;
}
}
.jibri-queue-info {
display: flex;
flex-flow: column;
.footer {
background: #a4b8a4D1;
border-radius: 3px;
font-weight: bold;
color: #5e6d7a;
padding: 5px;
margin-right: 30px;
margin-top: 5px;
}
}

70
css/_responsive.scss Normal file
View File

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

View File

@@ -35,6 +35,10 @@
cursor: initial;
color: #fff;
background-color: #a4b8d1;
&:hover {
background-color: #a4b8d1;
}
}
svg {

View File

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

View File

@@ -101,7 +101,6 @@ $sidebarWidth: 375px;
* Misc.
*/
$borderRadius: 4px;
$defaultWatermarkLink: '../images/watermark.png';
$popoverMenuPadding: 13px;
$happySoftwareBackground: transparent;
$desktopAppDragBarHeight: 25px;
@@ -165,6 +164,9 @@ $unsupportedDesktopBrowserTextFontSize: 21px;
$watermarkWidth: 186px;
$watermarkHeight: 74px;
$welcomePageWatermarkWidth: 186px;
$welcomePageWatermarkHeight: 74px;
/**
* Welcome page variables.
*/
@@ -179,9 +181,12 @@ $welcomePageHeaderBackgroundPosition: none;
$welcomePageHeaderBackgroundRepeat: none;
$welcomePageHeaderBackgroundSize: none;
$welcomePageHeaderPaddingBottom: 0px;
$welcomePageHeaderMinHeight: fit-content;
$welcomePageHeaderTextMarginTop: 35px;
$welcomePageHeaderTextMarginBottom: 35px;
$welcomePageHeaderTextDisplay: flex;
$welcomePageHeaderTextWidth: 650px;
$welcomePageHeaderTextTitleMarginBottom: 16px;
$welcomePageHeaderTextTitleFontSize: 2.5rem;
@@ -196,6 +201,7 @@ $welcomePageHeaderTextDescriptionLineHeight: 24px;
$welcomePageHeaderTextDescriptionMarginBottom: 20px;
$welcomePageHeaderTextDescriptionAlignSelf: inherit;
$welcomePageEnterRoomDisplay: flex;
$welcomePageEnterRoomWidth: 680px;
$welcomePageEnterRoomPadding: 25px 30px;
$welcomePageEnterRoomBorderRadius: 0px;
@@ -271,3 +277,8 @@ $chromeExtensionBannerRight: 16px;
$chromeExtensionBannerTopInMeeting: 10px;
$chromeExtensionBannerRightInMeeeting: 10px;
/**
* media type thresholds
*/
$smallScreen: 700px;
$verySmallScreen: 500px;

View File

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

View File

@@ -21,18 +21,18 @@ body.welcome-page {
align-items: center;
display: flex;
flex-direction: column;
min-height: fit-content;
min-height: $welcomePageHeaderMinHeight;
overflow: hidden;
position: relative;
text-align: center;
.header-text {
display: flex;
display: $welcomePageHeaderTextDisplay;
flex-direction: column;
margin-top: $watermarkHeight + $welcomePageHeaderTextMarginTop;
margin-bottom: $welcomePageHeaderTextMarginBottom;
max-width: calc(100% - 40px);
width: 650px;
width: $welcomePageHeaderTextWidth;
z-index: $zindex2;
}
@@ -56,7 +56,7 @@ body.welcome-page {
}
#enter_room {
display: flex;
display: $welcomePageEnterRoomDisplay;
align-items: center;
max-width: calc(100% - 40px);
width: $welcomePageEnterRoomWidth;
@@ -71,9 +71,6 @@ body.welcome-page {
text-align: left;
color: #253858;
height: fit-content;
border-width: $welcomePageEnterRoomInputContainerBorderWidth;
border-style: $welcomePageEnterRoomInputContainerBorderStyle;
border-image: $welcomePageEnterRoomInputContainerBorderImage;
.enter-room-title {
display: $welcomePageEnterRoomTitleDisplay;
@@ -83,12 +80,30 @@ body.welcome-page {
}
.enter-room-input {
border: none;
border-width: $welcomePageEnterRoomInputContainerBorderWidth;
border-style: $welcomePageEnterRoomInputContainerBorderStyle;
border-image: $welcomePageEnterRoomInputContainerBorderImage;
display: inline-block;
width: 100%;
font-size: 14px;
}
.insecure-room-name-warning {
align-items: center;
color: $defaultWarningColor;
display: flex;
flex-direction: row;
margin-top: 5px;
.jitsi-icon {
margin-right: 15px;
svg {
fill: $defaultWarningColor
}
}
}
::placeholder {
color: #253858;
}
@@ -96,6 +111,22 @@ body.welcome-page {
}
#moderated-meetings {
max-width: calc(100% - 40px);
padding: 16px 0 39px 0;
width: $welcomePageEnterRoomWidth;
p {
color: $welcomePageDescriptionColor;
text-align: left;
a {
color: inherit;
font-weight: 600;
}
}
}
.tab-container {
font-size: 16px;
position: relative;
@@ -180,5 +211,10 @@ body.welcome-page {
position: absolute;
width: 100%;
height: 100%;
.watermark.leftwatermark {
width: $welcomePageWatermarkWidth;
height: $welcomePageWatermarkHeight;
}
}
}

38
css/buttons/copy.scss Normal file
View File

@@ -0,0 +1,38 @@
.copy-button {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 8px 8px 16px;
margin-top: 8px;
width: calc(100% - 24px);
height: 24px;
background: #0376DA;
border-radius: 4px;
cursor: pointer;
&:hover {
background: #278ADF;
font-weight: 600;
}
&-content {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 292px;
margin-right: 16px;
&.selected {
font-weight: 600;
}
}
&.clicked {
background: #31B76A;
}
& > div > svg > path {
fill: #fff;
}
}

View File

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

View File

@@ -40,9 +40,6 @@
#remotePresenceMessage {
display: none !important;
}
#largeVideoContainer {
background-color: $defaultBackground !important;
}
/**
* Thumbnail popover menus can overlap other thumbnails. Setting an auto

View File

@@ -33,9 +33,11 @@ $flagsImagePath: "../images/";
@import 'inlay';
@import 'reload_overlay/reload_overlay';
@import 'mini_toolbox';
@import 'buttons/copy.scss';
@import 'modals/desktop-picker/desktop-picker';
@import 'modals/device-selection/device-selection';
@import 'modals/dialog';
@import 'modals/embed-meeting/embed-meeting';
@import 'modals/feedback/feedback';
@import 'modals/invite/info';
@import 'modals/settings/settings';
@@ -75,6 +77,8 @@ $flagsImagePath: "../images/";
@import 'filmstrip/tile_view_overrides';
@import 'filmstrip/vertical_filmstrip';
@import 'filmstrip/vertical_filmstrip_overrides';
@import 'labels';
@import 'lobby';
@import 'unsupported-browser/main';
@import 'modals/invite/add-people';
@import 'deep-linking/main';
@@ -91,5 +95,13 @@ $flagsImagePath: "../images/";
@import 'audio-preview';
@import 'video-preview';
@import 'prejoin';
@import 'prejoin-dialog';
@import 'country-picker';
@import 'modals/invite/invite_more';
@import 'modals/security/security';
@import 'premeeting-screens';
@import 'e2ee';
@import 'responsive';
@import 'notifications';
/* Modules END */

View File

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

View File

@@ -3,6 +3,7 @@
*/
.modal-dialog-form {
.add-people-form-wrap {
margin-top: 8px;
.error {
padding-left: 5px;

View File

@@ -3,47 +3,6 @@
display: flex;
font-size: 14px;
.info-dialog-action-link {
display: inline-block;
line-height: 1.5em;
a {
cursor: pointer;
vertical-align: middle;
}
}
.info-dialog-action-link:before {
color: $linkFontColor;
content: '\2022';
font-size: 1.5em;
padding: 0 10px;
vertical-align: middle;
}
.info-dialog-action-link:first-child:before {
content: '';
padding: 0;
}
.info-dialog-action-links {
font-weight: bold;
margin-top: 10px;
white-space: nowrap;
}
.info-dialog-action-separator {
display: inline-block;
}
.info-dialog-copy-element {
opacity: 0;
pointer-events: none;
position: absolute;
-webkit-user-select: text;
user-select: text;
}
.info-dialog-column {
margin-right: 10px;
overflow: hidden;
@@ -56,52 +15,6 @@
}
}
.info-dialog-conference-url,
.info-dialog-live-stream-url {
width: max-content;
width: -moz-max-content;
width: -webkit-max-content;
word-break: break-all;
max-width: 400px;
display: flex;
align-items: center;
}
.info-dialog-dial-in {
word-break: break-all;
.conference-id,
.phone-number {
user-select: text;
}
}
.info-dialog-icon {
color: #6453C0;
font-size: 16px;
min-width: 30px;
}
.info-dialog-url-text,
.info-dialog-url-text:hover {
color: inherit;
cursor: inherit;
}
.info-dialog-url-icon {
display: inline-block;
margin-left: 5px;
svg {
cursor: pointer;
}
}
.info-dialog-title {
font-weight: bold;
margin-bottom: 10px;
}
.info-dialog-password,
.info-password,
.info-password-form {
@@ -125,6 +38,7 @@
}
.info-password-input {
width: 100%;
background-color: transparent;
border: none;
color: inherit;
@@ -223,10 +137,4 @@
-moz-user-select: text;
-webkit-user-select: text;
}
.info-dialog-url-text-unselectable {
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
}
}

View File

@@ -0,0 +1,216 @@
.invite-more {
&-container {
color: #fff;
font-weight: 600;
position: absolute;
width: 100%;
text-align: center;
z-index: $zindex2;
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
&.elevated {
z-index: $filmstripVideosZ + 1;
}
}
&-header {
font-size: 19px;
line-height: 28px;
margin: 24px 0 16px 0;
}
&-button {
display: flex;
margin: auto;
padding: 8px 16px;
width: fit-content;
width: -moz-fit-content;
height: 24px;
background: #0376DA;
border-radius: 3px;
font-size: 14px;
line-height: 24px;
cursor: pointer;
&:hover {
background: #278ADF;
}
&-text {
margin-left: 8px;
font-size: 15px;
line-height: 24px;
}
}
&-dialog {
color: #fff;
font-size: 15px;
line-height: 24px;
&.header {
display: flex;
justify-content: space-between;
margin: 16px 16px 24px;
width: calc(100% - 32px);
color: #fff;
font-weight: 600;
font-size: 24px;
line-height: 32px;
& > div > svg {
cursor: pointer;
fill: #A4B8D1;
}
}
&.separator {
margin: 24px 0 24px -20px;
padding: 0 20px;
width: 100%;
height: 1px;
background: #5E6D7A;
}
&.email-container {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 8px 8px 16px;
margin-top: 24px;
width: calc(100% - 26px);
height: 22px;
background: #2A3A4B;
border: 1px solid #5E6D7A;
border-radius: 3px;
cursor: pointer;
&.active {
border-radius: 3px 3px 0 0;
}
}
&.icon-container {
display: none;
&.active {
display: flex;
width: calc(100% - 26px);
padding: 8px 8px 8px 16px;
background: #2A3A4B;
border: 1px solid #5E6D7A;
border-top: none;
border-radius: 0 0 3px 3px;
& > * {
display: flex;
justify-content: center;
align-items: center;
height: 40px;
width: 40px;
border-radius: 4px;
cursor: pointer;
}
&:hover > div:hover {
background-color: rgba(255, 255, 255, 0.2);
}
& > :not(:last-child) {
margin-right: 16px;
}
.copy-invite-icon > div > svg > path {
fill: #A4B8D1;
}
}
}
&.dial-in-display {
.info-label {
color: #A4B8D1;
}
.dial-in-copy {
display: inline-block;
vertical-align: middle;
margin-left: 21px;
cursor: pointer;
}
}
&.invite-buttons {
width: 100%;
text-align: right;
margin-top: 8px;
& > a {
display: inline-block;
height: 24px;
width: 48px;
border-radius: 3px;
text-align: center;
text-decoration: none;
cursor: pointer;
}
&-cancel {
margin-right: 16px;
padding: 7px 15px;
background: #2A3A4B;
border: 1px solid #5E6D7A;
}
&-add {
padding: 8px 16px;
background: #0376DA;
}
&.disabled {
& > a {
pointer-events: none;
}
}
}
&.stream {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 8px 8px 16px;
margin-top: 8px;
width: calc(100% - 26px);
height: 22px;
background: #2A3A4B;
border: 1px solid #5E6D7A;
border-radius: 3px;
cursor: pointer;
&:hover {
font-weight: 600;
}
&-text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 292px;
&.selected {
font-weight: 600;
}
}
&.clicked {
background: #31B76A;
border: 1px solid #31B76A;
}
& > div > svg > path {
fill: #fff;
}
}
}
}

View File

@@ -0,0 +1,56 @@
.security {
&-dialog {
color: #fff;
font-size: 15px;
line-height: 24px;
&.password-section {
display: flex;
flex-direction: column;
.description {
font-size: 13px;
}
.password {
align-items: center;
display: flex;
justify-content: space-between;
margin-top: 15px;
&-actions {
a {
cursor: pointer;
text-decoration: none;
font-size: 14px;
color: #6FB1EA;
}
& > :first-child:not(:last-child) {
margin-right: 24px;
}
}
}
}
.separator-line {
margin: 24px 0 24px -20px;
padding: 0 20px;
width: 100%;
height: 1px;
background: #5E6D7A;
&:last-child {
display: none;
}
}
}
}
.new-toolbox .toolbox-content .toolbox-icon.toggled.security-toolbar-button {
border-width: 0;
&:not(:hover) {
background: unset;
}
}

View File

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

View File

@@ -144,65 +144,3 @@
#videoResolutionLabel {
z-index: $zindex3 + 1;
}
.large-video-labels {
display: flex;
position: absolute;
top: 30px;
right: 30px;
transition: right 0.5s;
z-index: $zindex3;
.circular-label {
color: white;
font-weight: bold;
margin-left: 8px;
opacity: 0.8;
}
.circular-label {
background: #B8C7E0;
}
.circular-label.e2ee {
align-items: center;
background: #76CF9C;
display: flex;
justify-content: center;
}
.circular-label.file {
background: #FF5630;
}
.circular-label.local-rec {
background: #FF5630;
}
.circular-label.stream {
background: #0065FF;
}
.recording-label.center-message {
background: $videoStateIndicatorBackground;
bottom: 50%;
display: block;
left: 50%;
padding: 10px;
position: fixed;
transform: translate(-50%, -50%);
z-index: $centeredVideoLabelZ;
}
}
.circular-label {
background: $videoStateIndicatorBackground;
border-radius: 50%;
box-sizing: border-box;
cursor: default;
font-size: 13px;
height: $videoStateIndicatorSize;
line-height: $videoStateIndicatorSize;
text-align: center;
min-width: $videoStateIndicatorSize;
}

2
debian/control vendored
View File

@@ -3,7 +3,7 @@ Section: net
Priority: extra
Maintainer: Jitsi Team <dev@jitsi.org>
Uploaders: Emil Ivov <emcho@jitsi.org>, Damian Minkov <damencho@jitsi.org>
Build-Depends: debhelper (>= 8.0.0)
Build-Depends: debhelper (>= 8.0.0), nodejs
Standards-Version: 3.9.6
Homepage: https://jitsi.org/meet

View File

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

View File

@@ -91,10 +91,14 @@ case "$1" in
CERT_CRT="/etc/jitsi/meet/$JVB_HOSTNAME.crt"
HOST="$( (hostname -s; echo localhost) | head -n 1)"
DOMAIN="$( (hostname -d; echo localdomain) | head -n 1)"
openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj \
openssl req -new -newkey rsa:4096 -days 3650 -nodes -x509 -subj \
"/O=$DOMAIN/OU=$HOST/CN=$JVB_HOSTNAME/emailAddress=webmaster@$HOST.$DOMAIN" \
-keyout $CERT_KEY \
-out $CERT_CRT
-out $CERT_CRT \
-reqexts SAN \
-extensions SAN \
-config <(cat /etc/ssl/openssl.cnf \
<(printf "[SAN]\nsubjectAltName=DNS:localhost,DNS:$JVB_HOSTNAME"))
fi
fi

View File

@@ -1,3 +1,3 @@
# Documentation
The Jitsi documentation has been moved to [The Handbook](https://jitsi.github.io/handbook/).
The Jitsi documentation has been moved to [The Handbook](https://jitsi.github.io/handbook/). The repo is https://github.com/jitsi/handbook.

View File

@@ -6,8 +6,8 @@ muc_mapper_domain_base = "jitmeet.example.com";
turncredentials_secret = "__turnSecret__";
turncredentials = {
{ type = "stun", host = "jitmeet.example.com", port = "4446" },
{ type = "turn", host = "jitmeet.example.com", port = "4446", transport = "udp" },
{ type = "stun", host = "jitmeet.example.com", port = "3478" },
{ type = "turn", host = "jitmeet.example.com", port = "3478", transport = "udp" },
{ type = "turns", host = "jitmeet.example.com", port = "443", transport = "tcp" }
};
@@ -15,6 +15,12 @@ cross_domain_bosh = false;
consider_bosh_secure = true;
-- https_ports = { }; -- Remove this line to prevent listening on port 5284
-- https://ssl-config.mozilla.org/#server=haproxy&version=2.1&config=intermediate&openssl=1.1.0g&guideline=5.4
ssl = {
protocol = "tlsv1_2+";
ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
}
VirtualHost "jitmeet.example.com"
-- enabled = false -- Remove this line to enable this host
authentication = "anonymous"
@@ -40,8 +46,12 @@ VirtualHost "jitmeet.example.com"
"speakerstats";
"turncredentials";
"conference_duration";
"muc_lobby_rooms";
}
c2s_require_encryption = false
lobby_muc = "lobby.jitmeet.example.com"
main_muc = "conference.jitmeet.example.com"
-- muc_lobby_whitelist = { "recorder.jitmeet.example.com" } -- Here we can whitelist jibri to enter lobby enabled rooms
Component "conference.jitmeet.example.com" "muc"
storage = "memory"
@@ -75,3 +85,9 @@ Component "speakerstats.jitmeet.example.com" "speakerstats_component"
Component "conferenceduration.jitmeet.example.com" "conference_duration_component"
muc_component = "conference.jitmeet.example.com"
Component "lobby.jitmeet.example.com" "muc"
storage = "memory"
restrict_room_creation = true
muc_room_locking = false
muc_room_default_public_jids = true

View File

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

View File

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

View File

@@ -21,11 +21,16 @@ server {
listen [::]:443 ssl;
server_name jitsi-meet.example.com;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED";
# Mozilla Guideline v5.4, nginx 1.17.7, OpenSSL 1.1.1d, intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=31536000";
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m; # about 40000 sessions
ssl_session_tickets off;
add_header Strict-Transport-Security "max-age=63072000" always;
ssl_certificate /etc/jitsi/meet/jitsi-meet.example.com.crt;
ssl_certificate_key /etc/jitsi/meet/jitsi-meet.example.com.key;

View File

@@ -11,14 +11,15 @@
ServerName jitsi-meet.example.com
SSLProtocol TLSv1 TLSv1.1 TLSv1.2
# enable HTTP/2, if available
Protocols h2 http/1.1
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /etc/jitsi/meet/jitsi-meet.example.com.crt
SSLCertificateKeyFile /etc/jitsi/meet/jitsi-meet.example.com.key
SSLCipherSuite "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED"
SSLHonorCipherOrder on
Header set Strict-Transport-Security "max-age=31536000"
Header always set Strict-Transport-Security "max-age=63072000"
DocumentRoot "/usr/share/jitsi-meet"
<Directory "/usr/share/jitsi-meet">
@@ -48,3 +49,9 @@
RewriteEngine on
RewriteRule ^/([a-zA-Z0-9]+)$ /index.html
</VirtualHost>
# Mozilla Guideline v5.4, Apache 2.4.41, OpenSSL 1.1.1d, intermediate configuration, no OCSP
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off

View File

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

View File

@@ -1,136 +1,23 @@
/* eslint-disable no-unused-vars, no-var, max-len */
/* eslint sort-keys: ["error", "asc", {"caseSensitive": false}] */
var interfaceConfig = {
// TO FIX: this needs to be handled from SASS variables. There are some
// methods allowing to use variables both in css and js.
DEFAULT_BACKGROUND: '#474747',
/**
* Whether or not the blurred video background for large video should be
* displayed on browsers that can support it.
*/
DISABLE_VIDEO_BACKGROUND: false,
INITIAL_TOOLBAR_TIMEOUT: 20000,
TOOLBAR_TIMEOUT: 4000,
TOOLBAR_ALWAYS_VISIBLE: false,
DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Jitster',
DEFAULT_LOCAL_DISPLAY_NAME: 'me',
SHOW_JITSI_WATERMARK: true,
JITSI_WATERMARK_LINK: 'https://jitsi.org',
// if watermark is disabled by default, it can be shown only for guests
SHOW_WATERMARK_FOR_GUESTS: true,
SHOW_BRAND_WATERMARK: false,
BRAND_WATERMARK_LINK: '',
SHOW_POWERED_BY: false,
SHOW_DEEP_LINKING_IMAGE: false,
GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true,
DISPLAY_WELCOME_PAGE_CONTENT: true,
DISPLAY_WELCOME_PAGE_TOOLBAR_ADDITIONAL_CONTENT: false,
APP_NAME: 'Jitsi Meet',
NATIVE_APP_NAME: 'Jitsi Meet',
PROVIDER_NAME: 'Jitsi',
LANG_DETECTION: true, // Allow i18n to detect the system language
INVITATION_POWERED_BY: true,
/**
* If we should show authentication block in profile
*/
AUTHENTICATION_ENABLE: true,
/**
* The name of the toolbar buttons to display in the toolbar. If present,
* the button will display. Exceptions are "livestreaming" and "recording"
* which also require being a moderator and some values in config.js to be
* enabled. Also, the "profile" button will not display for user's with a
* jwt.
*/
TOOLBAR_BUTTONS: [
'microphone', 'camera', 'closedcaptions', 'desktop', 'fullscreen',
'fodeviceselection', 'hangup', 'profile', 'info', 'chat', 'recording',
'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand',
'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts',
'tileview', 'videobackgroundblur', 'download', 'help', 'mute-everyone',
'e2ee'
],
SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile', 'calendar' ],
// Determines how the video would fit the screen. 'both' would fit the whole
// screen, 'height' would fit the original video height to the height of the
// screen, 'width' would fit the original video width to the width of the
// screen respecting ratio.
VIDEO_LAYOUT_FIT: 'both',
/**
* Whether to only show the filmstrip (and hide the toolbar).
*/
filmStripOnly: false,
/**
* Whether to show thumbnails in filmstrip as a column instead of as a row.
*/
VERTICAL_FILMSTRIP: true,
// A html text to be shown to guests on the close page, false disables it
CLOSE_PAGE_GUEST_HINT: false,
SHOW_PROMOTIONAL_CLOSE_PAGE: false,
RANDOM_AVATAR_URL_PREFIX: false,
RANDOM_AVATAR_URL_SUFFIX: false,
FILM_STRIP_MAX_HEIGHT: 120,
// Enables feedback star animation.
ENABLE_FEEDBACK_ANIMATION: false,
DISABLE_FOCUS_INDICATOR: false,
DISABLE_DOMINANT_SPEAKER_INDICATOR: false,
/**
* Whether the speech to text transcription subtitles panel is disabled.
* If {@code undefined}, defaults to {@code false}.
*
* @type {boolean}
*/
DISABLE_TRANSCRIPTION_SUBTITLES: false,
/**
* Whether the ringing sound in the call/ring overlay is disabled. If
* {@code undefined}, defaults to {@code false}.
*
* @type {boolean}
*/
DISABLE_RINGING: false,
AUDIO_LEVEL_PRIMARY_COLOR: 'rgba(255,255,255,0.4)',
AUDIO_LEVEL_SECONDARY_COLOR: 'rgba(255,255,255,0.2)',
POLICY_LOGO: null,
LOCAL_THUMBNAIL_RATIO: 16 / 9, // 16:9
REMOTE_THUMBNAIL_RATIO: 1, // 1:1
// Documentation reference for the live streaming feature.
LIVE_STREAMING_HELP_LINK: 'https://jitsi.org/live',
/**
* Whether the mobile app Jitsi Meet is to be promoted to participants
* attempting to join a conference in a mobile Web browser. If
* {@code undefined}, defaults to {@code true}.
* A UX mode where the last screen share participant is automatically
* pinned. Valid values are the string "remote-only" so remote participants
* get pinned but not local, otherwise any truthy value for all participants,
* and any falsy value to disable the feature.
*
* @type {boolean}
* Note: this mode is experimental and subject to breakage.
*/
MOBILE_APP_PROMO: true,
/**
* Maximum coeficient of the ratio of the large video to the visible area
* after the large video is scaled to fit the window.
*
* @type {number}
*/
MAXIMUM_ZOOMING_COEFFICIENT: 1.3,
/*
* If indicated some of the error dialogs may point to the support URL for
* help.
*/
SUPPORT_URL: 'https://community.jitsi.org/',
AUTO_PIN_LATEST_SCREEN_SHARE: 'remote-only',
BRAND_WATERMARK_LINK: '',
CLOSE_PAGE_GUEST_HINT: false, // A html text to be shown to guests on the close page, false disables it
/**
* Whether the connection indicator icon should hide itself based on
* connection strength. If true, the connection indicator will remain
@@ -157,51 +44,120 @@ var interfaceConfig = {
*/
CONNECTION_INDICATOR_DISABLED: false,
/**
* If true, hides the video quality label indicating the resolution status
* of the current large video.
*
* @type {boolean}
*/
VIDEO_QUALITY_LABEL_DISABLED: false,
DEFAULT_BACKGROUND: '#474747',
DEFAULT_LOCAL_DISPLAY_NAME: 'me',
DEFAULT_LOGO_URL: 'images/watermark.png',
DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Jitster',
DEFAULT_WELCOME_PAGE_LOGO_URL: 'images/watermark.png',
/**
* If true, will display recent list
*
* @type {boolean}
*/
RECENT_LIST_ENABLED: true,
DISABLE_DOMINANT_SPEAKER_INDICATOR: false,
// Names of browsers which should show a warning stating the current browser
// has a suboptimal experience. Browsers which are not listed as optimal or
// unsupported are considered suboptimal. Valid values are:
// chrome, chromium, edge, electron, firefox, nwjs, opera, safari
OPTIMAL_BROWSERS: [ 'chrome', 'chromium', 'firefox', 'nwjs', 'electron', 'safari' ],
// Browsers, in addition to those which do not fully support WebRTC, that
// are not supported and should show the unsupported browser page.
UNSUPPORTED_BROWSERS: [],
/**
* A UX mode where the last screen share participant is automatically
* pinned. Valid values are the string "remote-only" so remote participants
* get pinned but not local, otherwise any truthy value for all participants,
* and any falsy value to disable the feature.
*
* Note: this mode is experimental and subject to breakage.
*/
AUTO_PIN_LATEST_SCREEN_SHARE: 'remote-only',
/**
* If true, presence status: busy, calling, connected etc. is not displayed.
*/
DISABLE_PRESENCE_STATUS: false,
DISABLE_FOCUS_INDICATOR: false,
/**
* If true, notifications regarding joining/leaving are no longer displayed.
*/
DISABLE_JOIN_LEAVE_NOTIFICATIONS: false,
/**
* If true, presence status: busy, calling, connected etc. is not displayed.
*/
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}.
*
* @type {boolean}
*/
DISABLE_TRANSCRIPTION_SUBTITLES: false,
/**
* Whether or not the blurred video background for large video should be
* displayed on browsers that can support it.
*/
DISABLE_VIDEO_BACKGROUND: false,
DISPLAY_WELCOME_PAGE_CONTENT: true,
DISPLAY_WELCOME_PAGE_TOOLBAR_ADDITIONAL_CONTENT: false,
ENABLE_DIAL_OUT: true,
ENABLE_FEEDBACK_ANIMATION: false, // Enables feedback star animation.
FILM_STRIP_MAX_HEIGHT: 120,
/**
* Whether to only show the filmstrip (and hide the toolbar).
*/
filmStripOnly: false,
GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true,
/**
* Hide the logo on the deep linking pages.
*/
HIDE_DEEP_LINKING_LOGO: false,
/**
* Hide the invite prompt in the header when alone in the meeting.
*/
HIDE_INVITE_MORE_HEADER: false,
INITIAL_TOOLBAR_TIMEOUT: 20000,
JITSI_WATERMARK_LINK: 'https://jitsi.org',
LANG_DETECTION: true, // Allow i18n to detect the system language
LIVE_STREAMING_HELP_LINK: 'https://jitsi.org/live', // Documentation reference for the live streaming feature.
LOCAL_THUMBNAIL_RATIO: 16 / 9, // 16:9
/**
* Maximum coefficient of the ratio of the large video to the visible area
* after the large video is scaled to fit the window.
*
* @type {number}
*/
MAXIMUM_ZOOMING_COEFFICIENT: 1.3,
/**
* Whether the mobile app Jitsi Meet is to be promoted to participants
* attempting to join a conference in a mobile Web browser. If
* {@code undefined}, defaults to {@code true}.
*
* @type {boolean}
*/
MOBILE_APP_PROMO: true,
NATIVE_APP_NAME: 'Jitsi Meet',
// Names of browsers which should show a warning stating the current browser
// has a suboptimal experience. Browsers which are not listed as optimal or
// unsupported are considered suboptimal. Valid values are:
// chrome, chromium, edge, electron, firefox, nwjs, opera, safari
OPTIMAL_BROWSERS: [ 'chrome', 'chromium', 'firefox', 'nwjs', 'electron', 'safari' ],
POLICY_LOGO: null,
PROVIDER_NAME: 'Jitsi',
/**
* If true, will display recent list
*
* @type {boolean}
*/
RECENT_LIST_ENABLED: true,
REMOTE_THUMBNAIL_RATIO: 1, // 1:1
SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile', 'calendar' ],
SHOW_BRAND_WATERMARK: false,
/**
* Decides whether the chrome extension banner should be rendered on the landing page and during the meeting.
* If this is set to false, the banner will not be rendered at all. If set to true, the check for extension(s)
@@ -209,6 +165,64 @@ var interfaceConfig = {
*/
SHOW_CHROME_EXTENSION_BANNER: false,
SHOW_DEEP_LINKING_IMAGE: false,
SHOW_JITSI_WATERMARK: true,
SHOW_POWERED_BY: false,
SHOW_PROMOTIONAL_CLOSE_PAGE: false,
SHOW_WATERMARK_FOR_GUESTS: true, // if watermark is disabled by default, it can be shown only for guests
/*
* If indicated some of the error dialogs may point to the support URL for
* help.
*/
SUPPORT_URL: 'https://community.jitsi.org/',
TOOLBAR_ALWAYS_VISIBLE: false,
/**
* The name of the toolbar buttons to display in the toolbar, including the
* "More actions" menu. If present, the button will display. Exceptions are
* "livestreaming" and "recording" which also require being a moderator and
* some values in config.js to be enabled. Also, the "profile" button will
* not display for users with a JWT.
* Notes:
* - it's impossible to choose which buttons go in the "More actions" menu
* - it's impossible to control the placement of buttons
* - 'desktop' controls the "Share your screen" button
*/
TOOLBAR_BUTTONS: [
'microphone', 'camera', 'closedcaptions', 'desktop', 'embedmeeting', 'fullscreen',
'fodeviceselection', 'hangup', 'profile', 'chat', 'recording',
'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand',
'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts',
'tileview', 'videobackgroundblur', 'download', 'help', 'mute-everyone', 'security'
],
TOOLBAR_TIMEOUT: 4000,
// Browsers, in addition to those which do not fully support WebRTC, that
// are not supported and should show the unsupported browser page.
UNSUPPORTED_BROWSERS: [],
/**
* Whether to show thumbnails in filmstrip as a column instead of as a row.
*/
VERTICAL_FILMSTRIP: true,
// Determines how the video would fit the screen. 'both' would fit the whole
// screen, 'height' would fit the original video height to the height of the
// screen, 'width' would fit the original video width to the width of the
// screen respecting ratio.
VIDEO_LAYOUT_FIT: 'both',
/**
* If true, hides the video quality label indicating the resolution status
* of the current large video.
*
* @type {boolean}
*/
VIDEO_QUALITY_LABEL_DISABLED: false,
/**
* When enabled, the kick participant button will not be presented for users without a JWT
*/
@@ -261,15 +275,15 @@ var interfaceConfig = {
// List of undocumented settings
/**
INDICATOR_FONT_SIZES
MOBILE_DYNAMIC_LINK
PHONE_NUMBER_REGEX
*/
// Allow all above example options to include a trailing comma and
// prevent fear when commenting out the last value.
// eslint-disable-next-line sort-keys
makeJsonParserHappy: 'even if last key had a trailing comma'
// no configuration value should follow this line.
// No configuration value should follow this line.
};
/* eslint-enable no-unused-vars, no-var, max-len */

View File

@@ -287,13 +287,13 @@ PODS:
- React-jsinspector (0.61.5-jitsi.1)
- react-native-background-timer (2.1.1):
- React
- react-native-calendar-events (1.7.3):
- react-native-calendar-events (2.0.0):
- React
- react-native-keep-awake (4.0.0):
- React
- react-native-netinfo (4.1.5):
- React
- react-native-webrtc (1.75.3):
- react-native-webrtc (1.84.0):
- React
- react-native-webview (7.4.1):
- React
@@ -365,7 +365,7 @@ PODS:
- React
- RNSVG (9.7.1):
- React
- RNWatch (0.2.0):
- RNWatch (0.4.3):
- React
- Yoga (1.14.0)
@@ -566,10 +566,10 @@ SPEC CHECKSUMS:
React-jsiexecutor: de1c37cf59ae9adcbf2be82eea0e090dc3f3205e
React-jsinspector: b76c4e84a7833bb4c90549d59ed53ec299ff912b
react-native-background-timer: 0d34748e53a972507c66963490c775321a88f6f2
react-native-calendar-events: 2fe35a9294af05de0ed819d3a1b5dac048d2c010
react-native-calendar-events: 1442fad71a00388f933cfa25512588fec300fcf8
react-native-keep-awake: eba3137546b10003361b37c761f6c429b59814ae
react-native-netinfo: 8d8db463bcc5db66a8ac5c48a7d86beb3b92f61a
react-native-webrtc: 86d841823e66d68cc1f86712db1c2956056bf0c2
react-native-webrtc: 9268ae9a2bc9730796b0968d012327e92c392adf
react-native-webview: 4dbc1d2a4a6b9c5e9e723c62651917aa2b5e579e
React-RCTActionSheet: b72ddbfbe15b44ce691d128e4b582f4bb9abb540
React-RCTAnimation: cfaefba5024499d336b76ab850e6bd33b232b5e3
@@ -586,7 +586,7 @@ SPEC CHECKSUMS:
RNGoogleSignin: 39336070b35fc4cea6a98cf111e00480317be0ae
RNSound: c980916b596cc15c8dcd2f6ecd3b13c4881dbe20
RNSVG: aac12785382e8fd4f28d072fe640612e34914631
RNWatch: 09738b339eceb66e4d80a2371633ca5fb380fa42
RNWatch: a5320c959c75e72845c07985f3e935e58998f1d3
Yoga: 7b4209fda2441f99d54dd6cf4c82b094409bb68f
PODFILE CHECKSUM: 082858daebbe170e7a490de433e7f2a99e0c3701

View File

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

View File

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

View File

@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>20.3.0</string>
<string>20.4.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.3.0</string>
<string>20.4.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.3.0</string>
<string>20.4.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CLKComplicationPrincipalClass</key>

View File

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

View File

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

View File

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

View File

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

9
jest.config.js Normal file
View File

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

View File

@@ -1,34 +1,42 @@
{
"en": "",
"af": "",
"bg": "",
"ca": "",
"cs": "",
"da": "",
"de": "",
"el": "",
"enGB": "",
"eo": "",
"es": "",
"esUS": "",
"et": "",
"fi": "",
"fr": "",
"frCA": "",
"hr": "",
"hu": "",
"hy": "",
"it": "",
"ja": "",
"ko": "",
"nl": "",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"sv": "",
"tr": "",
"vi": "",
"zhCN": "",
"zhTW": ""
"en": "الإنجليزية",
"af": "الأفريكانية",
"bg": "البلغارية",
"ca": "الكاتالانية",
"cs": "التشيكية",
"da": "الدنماركية",
"de": "الألمانية",
"el": "اليونانية",
"enGB": "الإنجليزية (المملكة المتحدة)",
"eo": "الإسبرانتو",
"es": "الإسبانية",
"esUS": "الإسبانية (أمريكا اللاتينية)",
"et": "الإستونية",
"fi": "الفنلندية",
"fr": "الفرنسية",
"frCA": "الفرنسية (الكندية)",
"hr": "الكرواتية",
"hu": "الهنغارية",
"hy": "الأرمنية",
"it": "الإيطالية",
"ja": "اليابانية",
"ko": "الكورية",
"nl": "الهولندية",
"oc": "القسطانية",
"pl": "البولندية",
"ptBR": "البرتغالية (البرازيل)",
"ru": "الروسية",
"sv": "السويدية",
"tr": "التركية",
"vi": "الفيتنامية",
"zhCN": "الصينية (الصين)",
"zhTW": "الصينية (تايوان)",
"th": "التايلندية",
"sc": "السردينية",
"eu": "الباسكية",
"uk": "الأوكرانية",
"sk": "السلوفاكية",
"lt": "الليتوانية",
"id": "الإندونيسية",
"he": "العبرية"
}

View File

@@ -1,6 +1,7 @@
{
"en": "Anglès",
"af": "Afrikaans",
"ar": "Àrab",
"bg": "Búlgar",
"ca": "Català",
"cs": "Txec",
@@ -10,25 +11,36 @@
"enGB": "Anglès (Regne Unit)",
"eo": "Esperanto",
"es": "Espanyol",
"esUS": "Espanyol (Amèrica llatina)",
"esUS": "Espanyol (Amèrica Llatina)",
"et": "Estonià",
"eu": "Èuscar",
"fi": "Finès",
"fr": "Francès",
"frCA": "Francès (Canadà)",
"he": "Hebreu",
"mr": "Marathi",
"hr": "Croat",
"hu": "Hongarès",
"hy": "Armeni",
"id": "Indonesi",
"it": "Italià",
"ja": "Japonès",
"ko": "Coreà",
"lt": "Lituà",
"nl": "Neerlandès",
"oc": "Occità",
"pl": "Polonès",
"ptBR": "Portuguès (Brasil)",
"ru": "Rus",
"ro": "Romanès",
"sc": "Sard",
"sk": "Eslovac",
"sl": "Eslovè",
"sv": "Suec",
"th": "Tai",
"tr": "Turc",
"uk": "Ucraïnès",
"vi": "Vietnamita",
"zhCN": "Xinès (Xina)",
"zhTW": "Xinès (Taiwan)",
"et": "Estonià"
"zhTW": "Xinès (Taiwan)"
}

42
lang/languages-el.json Normal file
View File

@@ -0,0 +1,42 @@
{
"en": "Αγγλικά",
"af": "Αφρικανικά",
"bg": "Βουλγάρικα",
"ca": "Καταλανικά",
"cs": "Τσέχικα",
"da": "Δανέζικα",
"de": "Γερμανικά",
"el": "Ελληνικά",
"enGB": "Αγγλικά (Ηνωμένου Βασιλείου)",
"eo": "Εσπεράντο",
"es": "Ισπανικά",
"esUS": "Ισπανικά (Λατινικής Αμερικής)",
"et": "Εσθονικά",
"eu": "Βάσκικα",
"fi": "Φινλανδικά",
"fr": "Γαλλικά",
"frCA": "Γαλλικά (Καναδικά)",
"he": "Εβραϊκά",
"hr": "Κροατικά",
"hu": "Ουγγρικά",
"hy": "Αρμένικα",
"id": "Ινδονησιακά",
"it": "Ιταλικά",
"ja": "Ιαπωνικά",
"ko": "Κορεάτικα",
"lt": "Λιθουανικά",
"nl": "Ολλανδικά",
"oc": "Οξιτανικά",
"pl": "Πολωνικά",
"ptBR": "Πορτογαλικά (Βραζιλίας)",
"ru": "Ρωσικά",
"sc": "Σαρδηνικά",
"sk": "Σλοβακικά",
"sv": "Σουηδικά",
"th": "Ταϊλανδικά",
"tr": "Τουρκικά",
"uk": "Ουκρανικά",
"vi": "Βιετναμέζικα",
"zhCN": "Κινέζικα (Κίνας)",
"zhTW": "Κινέζικα (Ταϊβάν)"
}

View File

@@ -19,7 +19,7 @@
"ptBR": "Portuguese (Brazil)",
"ru": "Russian",
"sk": "",
"sl": "",
"sl": "Slovenian",
"sv": "Swedish",
"tr": "Turkish",
"vi": "Vietnamese",

View File

@@ -13,6 +13,7 @@
"it": "Taṭalyant",
"ja": "Tajapunit",
"ko": "Takurit",
"kab": "Taqbaylit",
"nb": "Tanurvijit Bukmal",
"oc": "Tuksitant",
"pl": "Tapulunit",
@@ -23,5 +24,25 @@
"sv": "Taswidit",
"tr": "Taṭurkit",
"vi": "Tavyitnamit",
"zhCN": "Tavyitnamit"
"zhCN": "Tavyitnamit",
"ro": "Tarumanit",
"ar": "Taɛrabt",
"zhTW": "Tacinwat (Taiwan)",
"uk": "Tukranit",
"th": "Tayland",
"sc": "Tasardit",
"nl": "Tahulandit",
"lt": "Taliṭwanit",
"id": "Tandunizit",
"hu": "Tahungrit",
"hr": "Takrwasit",
"he": "Taɛbrit",
"frCA": "Tafṛansist (Kanada)",
"fi": "Tafinit",
"eu": "Tabaskit",
"et": "Tastunit",
"esUS": "Taspanit (Temrikt Talatinit)",
"enGB": "Tagnizit (Tagldit i ddukklen)",
"da": "Tadanit",
"ca": "Takaṭalant"
}

38
lang/languages-mr.json Normal file
View File

@@ -0,0 +1,38 @@
{
"en": "English",
"af": "Afrikaans",
"az": "",
"bg": "Bulgarian",
"cs": "Czech",
"de": "German",
"el": "Greek",
"eo": "Esperanto",
"es": "Spanish",
"fr": "French",
"hy": "Armenian",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"nb": "",
"oc": "Occitan",
"pl": "Polish",
"ptBR": "Portuguese (Brazil)",
"ru": "Russian",
"sk": "",
"sl": "",
"sv": "Swedish",
"tr": "Turkish",
"vi": "Vietnamese",
"zhCN": "Chinese (China)",
"zhTW": "Chinese (Taiwan)",
"nl": "Dutch",
"hu": "Hungarian",
"hr": "Croatian",
"frCA": "French (Canadian)",
"fi": "Finnish",
"et": "Estonian",
"esUS": "Spanish (Latin America)",
"enGB": "English (United Kingdom)",
"da": "Danish",
"ca": "Catalan"
}

View File

@@ -30,5 +30,19 @@
"zhCN": "Chinés (China)",
"zhTW": "Chinés (Taiwan)",
"et": "Estonian",
"da": "Danés"
"da": "Danés",
"uk": "Ucraïnian",
"th": "Tai",
"sk": "Eslovac",
"sc": "Sarde",
"lt": "Lituanian",
"id": "Indonesian",
"he": "Ebrèu",
"eu": "Basc",
"mr": "Marathi",
"sl": "Eslovèn",
"ro": "Romanian",
"ar": "Arabi"
}

45
lang/languages-ro.json Normal file
View File

@@ -0,0 +1,45 @@
{
"en": "Engleză",
"af": "Afrikaans",
"ar": "Arabă",
"bg": "Bulgară",
"ca": "Catalană",
"cs": "Cehă",
"da": "Daneză",
"de": "Germană",
"el": "Greacă",
"enGB": "Engleză (Regatul Unit)",
"eo": "Esperanto",
"es": "Spaniolă",
"esUS": "Spaniolă (America Latină)",
"et": "Estonă",
"eu": "Bască",
"fi": "Finlandeză",
"fr": "Franceză",
"frCA": "Franceză (Canada)",
"he": "Ebraică",
"hr": "Croată",
"hu": "Maghiară",
"hy": "Armeană",
"id": "Indoneziană",
"it": "Italiană",
"ja": "Japoneză",
"ko": "Koreană",
"lt": "Lituaniană",
"nl": "Olandeză",
"oc": "Occitană",
"pl": "Poloneză",
"ptBR": "Portugheză (Brazilia)",
"ru": "Rusă",
"ro": "Română",
"sc": "Sardă",
"sk": "Slovacă",
"sl": "Slovenă",
"sv": "Suedeză",
"th": "Thailandeză",
"tr": "Turcă",
"uk": "Ucraineană",
"vi": "Vietnameză",
"zhCN": "Chineză (China)",
"zhTW": "Chineză (Taiwan)"
}

View File

@@ -1,27 +1,27 @@
{
"en": "Angleščina",
"af": "",
"az": "",
"af": "Afrikanščina",
"az": "Azerbajdanščina",
"bg": "Bolgarščina",
"cs": "",
"cs": "Češčina",
"de": "Nemščina",
"el": "",
"eo": "",
"es": "",
"el": "Grščina",
"eo": "Esperanto",
"es": "Španščina",
"fr": "Francoščina",
"hy": "",
"hy": "Armenščina",
"it": "Italjanščina",
"ja": "",
"ko": "",
"nb": "",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"sk": "",
"ja": "Japonščina",
"ko": "Korejščina",
"nb": "Norveščina (Bokmål)",
"oc": "Okcitanščina",
"pl": "Poljščina",
"ptBR": "Portugalščina (Brazilija)",
"ru": "Ruščina",
"sk": "Slovaščina",
"sl": "Slovenščina",
"sv": "",
"sv": "Švedščina",
"tr": "Turščina",
"vi": "",
"zhCN": ""
"vi": "Vietnamščina",
"zhCN": "kitajščina (poenostavljena)"
}

View File

@@ -1,6 +1,7 @@
{
"en": "English",
"af": "Afrikaans",
"ar": "Arabic",
"bg": "Bulgarian",
"ca": "Catalan",
"cs": "Czech",
@@ -17,12 +18,14 @@
"fr": "French",
"frCA": "French (Canadian)",
"he": "Hebrew",
"mr":"Marathi",
"hr": "Croatian",
"hu": "Hungarian",
"hy": "Armenian",
"id": "Indonesian",
"it": "Italian",
"ja": "Japanese",
"kab": "Kabyle",
"ko": "Korean",
"lt": "Lithuanian",
"nl": "Dutch",
@@ -30,8 +33,10 @@
"pl": "Polish",
"ptBR": "Portuguese (Brazil)",
"ru": "Russian",
"ro": "Romanian",
"sc": "Sardinian",
"sk": "Slovak",
"sl": "Slovenian",
"sv": "Swedish",
"th": "Thailand",
"tr": "Turkish",

File diff suppressed because it is too large Load Diff

View File

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

View File

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

889
lang/main-el.json Normal file
View File

@@ -0,0 +1,889 @@
{
"addPeople": {
"add": "Προσκάλεσε",
"addContacts": "Προσκάλεσε τις επαφές σου",
"copyInvite": "Αντίγραψε την πρόσκληση της συνάντησης",
"copyLink": "Αντίγραψε το σύνδεσμο της συνάντησης",
"copyStream": "Αντίγραψε το σύνδεσμο της ζωντανής μετάδοσης",
"countryNotSupported": "Δεν υποστηρίζουμε αυτόν τον προορισμό ακόμα.",
"countryReminder": "Κλήση εκτός ΗΠΑ; Παρακαλώ βεβαιωθείτε ότι ξεκινάτε με τον κωδικό της χώρας!",
"defaultEmail": "Το προεπιλεγμένο Email σου",
"disabled": "Δεν μπορείτε να προσκαλέσετε άτομα.",
"failedToAdd": "Αποτυχία προσθήκης συμμετεχόντων",
"footerText": "Η κλήση είναι απενεργοποιημένη.",
"googleEmail": "Google Email",
"inviteMoreHeader": "Είσαι ο μόναδικός συμμετέχων στη συνάντηση",
"inviteMoreMailSubject": "Συμμετοχή στη συνάντηση {{appName}}",
"inviteMorePrompt": "Πρόσκληση συμμετεχόντων",
"linkCopied": "Ο σύνδεσμος αντιγράφηκε στο πρόχειρο",
"loading": "Αναζήτηση για ανθρώπους και αριθμούς τηλεφώνου",
"loadingNumber": "Ο αριθμός τηλεφώνου επικυρώνεται",
"loadingPeople": "Γίνεται αναζήτηση για ανθρώπους που θα καλεστούν",
"noResults": "Δε βρέθηκαν αποτελέσματα αναζήτησης",
"outlookEmail": "Outlook Email",
"noValidNumbers": "Παρακαλώ εισάγετε έναν αριθμό τηλεφώνου",
"searchNumbers": "Προσθέστε αριθμούς τηλεφώνου",
"searchPeople": "Αναζήτηση για ανθρώπους",
"searchPeopleAndNumbers": "Αναζήτηση για ανθρώπους ή προσθήκη των αριθμών τηλεφώνου τους",
"shareInvite": "Κοινή χρήση πρόσκλησης συνάντησης",
"shareLink": "Κοινή χρήση συνδέσμου συνάντησης για πρόσκληση άλλων",
"shareStream": "Κοινή χρήση του συνδέσμου ζωντανής μετάδοσης",
"telephone": "Τηλέφωνο: {{number}}",
"title": "Καλέστε ανθρώπους σε αυτή τη συνάντηση",
"yahooEmail": "Yahoo Email"
},
"audioDevices": {
"bluetooth": "Bluetooth",
"headphones": "Ακουστικά",
"phone": "Τηλέφωνο",
"speaker": "Ομιλητής",
"none": "Δεν υπάρχουν διαθέσιμες συσκευές ήχου"
},
"audioOnly": {
"audioOnly": "Χαμηλό εύρος ζώνης"
},
"calendarSync": {
"addMeetingURL": "Προσθέστε έναν σύνδεσμο συνάντησης",
"confirmAddLink": "Θέλετε να προσθέσετε έναν σύνδεσμο Jitsi σε αυτό το γεγονός;",
"error": {
"appConfiguration": "Η ενσωμάτωση ημερολόγιου δεν έχει ρυθμιστεί σωστά.",
"generic": "Παρουσιάστηκε ένα σφάλμα. Παρακαλείστε να ελέγξετε τις ρυθμίσεις ημερολογίου σας ή να δοκιμάσετε να ανανεώσετε το ημερολόγιο.",
"notSignedIn": "Παρουσιάστηκε ένα σφάλμα κατά τον έλεγχο ταυτότητας προβολής ημερολογίου εκδηλώσεων. Παρακαλείστε να ελέγξετε τις ρυθμίσεις ημερολογίου και να δοκιμάσετε να συνδεθείτε ξανά."
},
"join": "Συμμετοχή",
"joinTooltip": "Συμμετοχή στη σύσκεψη",
"nextMeeting": "επόμενη συνάντηση",
"noEvents": "Δεν υπάρχουν προγραμματισμένες προσεχείς εκδηλώσεις.",
"ongoingMeeting": "συνάντηση σε εξέλιξη",
"permissionButton": "Άνοιγμα ρυθμίσεων",
"permissionMessage": "Η άδεια ημερολόγιου άδεια απαιτείται για να δείτε τις συναντήσεις σας στην εφαρμογή.",
"refresh": "Ανανεώστε το ημερολόγιο",
"today": "Σήμερα"
},
"chat": {
"error": "Σφάλμα: το μήνυμα δεν εστάλη. Λόγος: {{reason}}",
"fieldPlaceHolder": "Πληκτρολογήστε το μήνυμά σας εδώ",
"messagebox": "Πληκτρολογήστε ένα μήνυμα",
"messageTo": "Ιδιωτικό μήνυμα στον / στην {{recipient}}",
"noMessagesMessage": "Δεν υπάρχουν μηνύματα στη συνάντηση ακόμα. Ξεκινήστε μια συζήτηση εδώ!",
"nickname": {
"popover": "Επιλέξτε ένα ψευδώνυμο",
"title": "Εισάγετε ένα ψευδώνυμο για τη χρήση της συνομιλίας"
},
"privateNotice": "Ιδιωτικό μηνύμα στον / στην {recipient}}",
"title": "Συνομιλία",
"you": "Εσείς"
},
"chromeExtensionBanner": {
"installExtensionText": "Εγκαταστήσετε την επέκταση για την ενοποίηση του Google Calendar και του Office 365 ",
"buttonText": "Εγκαταστήστε την επέκταση του Chrome",
"dontShowAgain": "Μην μου το δείξεις αυτό ξανά"
},
"connectingOverlay": {
"joiningRoom": "Σας συνδέουμε για τη συνάντησή σας"
},
"connection": {
"ATTACHED": "Συνημμένο",
"AUTHENTICATING": "Έλεγχος ταυτότητας",
"AUTHFAIL": "Ο έλεγχος ταυτότητας απέτυχε",
"CONNECTED": "Συνδεδεμένος",
"CONNECTING": "Γίνεται σύνδεση",
"CONNFAIL": "Η σύνδεση απέτυχε",
"DISCONNECTED": "Αποσυνδεδεμένος",
"DISCONNECTING": "Γίνεται αποσύνδεση",
"ERROR": "Σφάλμα",
"FETCH_SESSION_ID": "Απόκτηση session-id...",
"GET_SESSION_ID_ERROR": "Λήψη session-id σφάλματος: {{code}}",
"GOT_SESSION_ID": "Απόκτηση session-id... Έγινε",
"LOW_BANDWIDTH": "Το βίντεο για το {{displayName}} έχει απενεργοποιηθεί για να εξοικονομήσετε εύρος ζώνης"
},
"connectionindicator": {
"address": "Διεύθυνση:",
"bandwidth": "Εκτιμώμενο εύρος ζώνης:",
"bitrate": "Ρυθμός μετάδοσης:",
"bridgeCount": "Αριθμός server: ",
"connectedTo": "Συνδεδεμένος με:",
"e2e_rtt": "E2E RTT:",
"framerate": "Ρυθμός ανανέωσης:",
"less": "Δείξε λιγότερα",
"localaddress": "Τοπική διεύθυνση:",
"localaddress_plural": "Τοπικές διευθύνσεις:",
"localport": "Τοπική θύρα:",
"localport_plural": "Τοπικές θύρες:",
"more": "Εμφάνιση περισσότερων",
"packetloss": "Απώλεια πακέτων:",
"quality": {
"good": "Καλή",
"inactive": "Ανενεργό",
"lost": "Χαμένη",
"nonoptimal": "Μέτρια",
"poor": "Κακή"
},
"remoteaddress": "Απομακρυσμένη διεύθυνση:",
"remoteaddress_plural": "Απομακρυσμένες διευθύνσεις:",
"remoteport": "Απομακρυσμένη θύρα:",
"remoteport_plural": "Απομακρυσμένες θύρες:",
"resolution": "Ανάλυση:",
"status": "Σύνδεση:",
"transport": "Μεταφορά:",
"transport_plural": "Μεταφορές:"
},
"dateUtils": {
"earlier": "Νωρίτερα",
"today": "Σήμερα",
"yesterday": "Χθες"
},
"deepLinking": {
"appNotInstalled": "Θα πρέπει να έχετε την εφαρμογή {{app}} για το κινητό σας για να συμμετάσχετε σε αυτήν την διάσκεψη στο τηλέφωνό σας.",
"description": "Δεν έγινε τίποτα; Προσπαθήσαμε να κάνουμε έναρξη σύσκεψης στο {{app}} desktop app. Προσπαθήστε ξανά ή ξεκινήστε το {{app}} web app.",
"descriptionWithoutWeb": "Δεν έγινε τίποτα; Προσπαθήσαμε να κάνουμε έναρξη σύσκεψης στο {{app}} desktop app.",
"downloadApp": "Κατεβάστε την εφαρμογή",
"ifDoNotHaveApp": "If you don't have the app yet:",
"ifHaveApp": "If you already have the app:",
"joinInApp": "Join this meeting using the app",
"launchWebButton": "Έναρξη στο web",
"title": "Γίνεται έναρξη της συνάντησής σας στο {{app}}...",
"tryAgainButton": "Προσπαθήστε ξανά στην επιφάνεια εργασίας"
},
"defaultLink": "π.χ. {{url}}",
"defaultNickname": "π.χ. Η Τζέιν Ρόουζ",
"deviceError": {
"cameraError": "Απέτυχε η πρόσβαση στη φωτογραφική μηχανή σας",
"cameraPermission": "Παρουσιάστηκε σφάλμα κατά τη λήψη άδειας χρήσης της κάμερας",
"microphoneError": "Αποτυχία πρόσβασης στο μικρόφωνο",
"microphonePermission": "Παρουσιάστηκε σφάλμα κατά τη λήψη άδειας χρήσης του μικρόφωνου"
},
"deviceSelection": {
"noPermission": "Δεν χορηγήθηκε άδεια χρήσης",
"previewUnavailable": "Προεπισκόπηση μη διαθέσιμη",
"selectADevice": "Επιλέξτε μια συσκευή",
"testAudio": "Παίξτε έναν δοκιμαστικό ήχο"
},
"dialog": {
"accessibilityLabel": {
"liveStreaming": "Ζωντανή ροή"
},
"add": "Add",
"allow": "Επίτρεψε",
"alreadySharedVideoMsg": "Ένας άλλος συμμετέχων κάνει ήδη κοινή προβολή βίντεο. Η διάσκεψη αυτή επιτρέπει μόνο ένα κοινόχρηστο βίντεο τη φορά.",
"alreadySharedVideoTitle": "Μόνο ένα κοινόχρηστο βίντεο επιτρέπεται τη φορά",
"applicationWindow": "Παράθυρο εφαρμογής",
"Back": "Πίσω",
"cameraConstraintFailedError": "Η κάμερα σας δεν πληρεί ορισμένους από τους απαιτούμενους περιορισμούς.",
"cameraNotFoundError": "Η κάμερα δε βρέθηκε.",
"cameraNotSendingData": "Δεν είμαστε σε θέση να έχουμε πρόσβαση στην κάμερα σας. Παρακαλώ ελέγξτε αν κάποια άλλη εφαρμογή τη χρησιμοποιεί, επιλέξτε μια άλλη συσκευή από το μενού ρυθμίσεων ή δοκιμάστε να φορτώσετε ξανά την εφαρμογή.",
"cameraNotSendingDataTitle": "Αδυναμία πρόσβασης στην κάμερα",
"cameraPermissionDeniedError": "Δεν έχετε δώσει άδεια χρήσης της κάμεράς σας. Μπορείτε ακόμα να συμμετάσχετε στη διάσκεψη, αλλά οι άλλοι δεν θα σας βλέπουν. Χρησιμοποιήστε το κουμπί με την κάμερα στη γραμμή διευθύνσεων για διορθώσετε αυτό το θέμα.",
"cameraUnknownError": "Δεν μπορείτε να χρησιμοποιήσετε την κάμερα για άγνωστο λόγο.",
"cameraUnsupportedResolutionError": "Η κάμερα σας δεν υποστηρίζει την απαιτούμενη ανάλυση του βίντεο.",
"Cancel": "Ακύρωση",
"close": "Κλείσιμο",
"conferenceDisconnectMsg": "Παρακαλώ ελέγξτε τη σύνδεση δικτύου σας. Επανασύνδεση σε {{seconds}} δευτερόλεπτα...",
"conferenceDisconnectTitle": "Έχετε αποσυνδεθεί.",
"conferenceReloadMsg": "Προσπαθούμε να το διορθώσουμε αυτό. Επανασύνδεση σε {{seconds}} δευτερόλεπτα...",
"conferenceReloadTitle": "Δυστυχώς, κάτι πήγε στραβά.",
"confirm": "Επιβεβαίωση",
"confirmNo": "Όχι",
"confirmYes": "Ναι",
"connectError": "Ουπς! Κάτι πήγε στραβά και δεν μπορούσαμε να συνδεθούμε με τη διάσκεψη.",
"connectErrorWithMsg": "Ουπς! Κάτι πήγε στραβά και δεν μπορούσαμε να συνδεθούμε με τη διάσκεψη: {{msg}}",
"connecting": "Γίνεται σύνδεση",
"contactSupport": "Επικοινωνήστε με την υποστήριξη",
"copy": "Αντιγραφή",
"dismiss": "Απόρριψη",
"displayNameRequired": "Γεια σου! Ποιο είναι το όνομα σου;",
"done": "Έγινε",
"e2eeDescription": "Η από άκρη σε άκρη κρυπτογράφηση είναι σήμερα σε ΠΕΙΡΑΜΑΤΙΚΟ στάδιο. Παρακαλώ να έχετε κατά νου ότι η ενεργοποίηση της από άκρη σε άκρη κρυπτογράφησης θα απενεργοποιήσει από την πλευρά του διακομιστή υπηρεσίες όπως: καταγραφή, live streaming και συμμετοχή μέσω τηλεφώνου. Επίσης, να έχετε κατά νου ότι η συνάντηση θα λειτουργήσει μόνο για τους ανθρώπους που συνδέονται από φυλλομετρητές με υποστήριξη για insertable streams.",
"e2eeNoKey": "None",
"e2eeSet": "Set",
"e2eeToggleSet": "Set key",
"e2eeWarning": "ΠΡΟΕΙΔΟΠΟΊΗΣΗ: Δε φαίνεται να έχουν όλοι οι συμμετέχοντες στη συνάντηση αυτή υποστήριξη για από άκρη σε άκρη κρυπτογράφηση. Αν την ενεργοποιήσετε, δεν θα μπορέσουν να σας δουν ούτε να σας ακούσουν.",
"enterDisplayName": "Παρακαλώ εισάγετε το όνομά σας εδώ",
"error": "Σφάλμα",
"gracefulShutdown": "Μας υπηρεσία είναι προς το παρόν εκτός λειτουργίας για συντήρηση. Παρακαλώ προσπαθήστε ξανά αργότερα.",
"IamHost": "Είμαι ο οικοδεσπότης",
"incorrectRoomLockPassword": "Εσφαλμένος κωδικός πρόσβασης",
"incorrectPassword": "Λανθασμένο όνομα χρήστη ή κωδικός πρόσβασης",
"internalError": "Ουπς! Κάτι πήγε στραβά. Παρουσιάστηκε το παρακάτω σφάλμα: {{error}}",
"internalErrorTitle": "Εσωτερικό σφάλμα",
"kickMessage": "Μπορείτε να επικοινωνήσετε με το {{participantDisplayName}} για περισσότερες λεπτομέρειες.",
"kickParticipantButton": "Αποβολή",
"kickParticipantDialog": "Είστε σίγουρος ότι θέλετε να αποβάλετε αυτόν τον συμμετέχοντα;",
"kickParticipantTitle": "Θέλετε να αποβάλετε αυτόν τον συμμετέχοντα;",
"kickTitle": "Ωχ! Ο/Η {{participantDisplayName}} σας απέβαλε από τη διάσκεψη",
"liveStreaming": "Ζωντανή ροή",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Not possible while recording is active",
"liveStreamingDisabledForGuestTooltip": "Οι επισκέπτες δεν μπορούν να ξεκινήσουν τη ζωντανή ροή",
"liveStreamingDisabledTooltip": "Έναρξη ζωντανής ροής απενεργοποιημένη",
"lockMessage": "Αποτυχία κλειδώματος της διάσκεψης.",
"lockRoom": "Προσθέστε συνάντηση $t(lockRoomPasswordUppercase)",
"lockTitle": "Το κλείδωμα απέτυχε",
"logoutQuestion": "Είστε σίγουρος ότι θέλετε να αποσυνδεθείτε και να σταματήσει η διάσκεψη;",
"logoutTitle": "Αποσύνδεση",
"maxUsersLimitReached": "Το όριο για τον μέγιστο αριθμό συμμετεχόντων έχει επιτευχθεί. Η διάσκεψη είναι πλήρης. Παρακαλείστε να επικοινωνήσετε με τον ιδιοκτήτη ή να δοκιμάστε ξανά αργότερα!",
"maxUsersLimitReachedTitle": "Ο αριθμός συμμετεχόντων έφτασε στο μέγιστο",
"micConstraintFailedError": "Το μικρόφωνο σας δεν πληρεί ορισμένους από τους απαιτούμενους περιορισμούς.",
"micNotFoundError": "Το μικρόφωνο δεν βρέθηκε.",
"micNotSendingData": "Πηγαίνετε στο ρυθμίσεις του υπολογιστή για να καταργήσετε τη σίγαση μικροφώνου σας και να ρυθμίσετε το επίπεδό του",
"micNotSendingDataTitle": "Το μικρόφωνο είναι σε σίγαση από τις ρυθμίσεις του συστήματός σας",
"micPermissionDeniedError": "Δεν έχετε την άδεια να χρησιμοποιήσετε το μικρόφωνο. Μπορείτε ακόμα να συμμετάσχετε στη διάσκεψη, αλλά οι άλλοι δεν θα μπορούν να σας ακούσουν. Χρησιμοποιήστε το κουμπί της κάμερας στη γραμμή διευθύνσεων για να το διορθώσετε αυτό.",
"micUnknownError": "Δεν μπορείτε να χρησιμοποιήσετε το μικρόφωνο για άγνωστο λόγο.",
"muteEveryoneElseDialog": "Όταν είναι σε σίγαση, δεν θα είστε σε θέση να καταργήσετε τη σίγαση τους, αλλά θα μπορούν να το κάνουν μόνοι τους ανά πάσα στιγμή.",
"muteEveryoneElseTitle": "Σίγαση όλων εκτός από {{whom}};",
"muteEveryoneDialog": "Είστε σίγουρος ότι θέλετε να θέσετε σε σίγαση τον καθένα; Δεν θα είστε σε θέση να καταργήσετε τη σίγαση, αλλά μπορούν να το κάνουν ανά πάσα στιγμή.",
"muteEveryoneTitle": "Σίγαση όλων;",
"muteEveryoneSelf": "τον εαυτό σας",
"muteEveryoneStartMuted": "Όλοι αρχίζουν με ενεργοποιημένη τη σίγαση από τώρα και στο εξής",
"muteParticipantBody": "Δεν θα είστε σε θέση να καταργήσετε τη σίγαση, αλλά μπορούν να το κάνουν ανά πάσα στιγμή.",
"muteParticipantButton": "Σίγαση",
"muteParticipantDialog": "Είστε σίγουρος ότι θέλετε να απενεργοποιήσετε αυτό το συμμετέχοντα; Δεν θα είστε σε θέση να καταργήσετε τη σίγαση, αλλά μπορούν να κάνουν ανά πάσα στιγμή.",
"muteParticipantTitle": "Σίγαση αυτού του συμμετέχοντα;",
"Ok": "Ok",
"passwordLabel": "Η συνάντηση έχει κλειδωθεί από έναν συμμετέχοντα. Παρακαλώ εισάγετε το $t(lockRoomPassword) για να κάνετε είσοδο.",
"passwordNotSupported": "Δεν υποστηρίζεται η ρύθμιση του $t(lockRoomPassword) της συνάντησης.",
"passwordNotSupportedTitle": "Δεν υποστηρίζεται $t(lockRoomPasswordUppercase)",
"passwordRequired": "Απαιτείται $t(lockRoomPasswordUppercase)",
"popupError": "Ο φυλλομετρητής σας μπλοκάρει τα pop-up windows από αυτό το site. Παρακαλούμε ενεργοποιήστε τα pop-ups στις ρυθμίσεις ασφαλείας του προγράμματος περιήγησής σας και προσπαθήστε ξανά.",
"popupErrorTitle": "Pop-up μπλοκαρίστηκε",
"recording": "Γίνεται εγγραφή",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Not possible while a live stream is active",
"recordingDisabledForGuestTooltip": "Οι επισκέπτες δεν μπορούν να ξεκινήσουν τις ηχογραφήσεις.",
"recordingDisabledTooltip": "Έναρξη εγγραφής απενεργοποιημένη.",
"rejoinNow": "Επανασύνδεση τώρα",
"remoteControlAllowedMessage": "O/H {{user}} έκανε αποδεκτό το αίτημα απομακρυσμένου ελέγχου!",
"remoteControlDeniedMessage": "O/H {{user}} απέρριψε το αίτημα απομακρυσμένου ελέγχου!",
"remoteControlErrorMessage": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια να αιτήματος δικαιωμάτων απομακρυσμένου ελέγχου από {{user}}!",
"remoteControlRequestMessage": "Θέλετα να επιτρέψετε στον/ην {{user}} να έχει απομακρυσμένο έλεγχο του υπολογιστή σας;",
"remoteControlShareScreenWarning": "Σημειώστε ότι εάν πατήσετε το πλήκτρο \"Αποδοχή\" θα μοιραστείτε την οθόνη σας!",
"remoteControlStopMessage": "Η περίοδος λειτουργίας απομακρυσμένου ελέγχου έληξε!",
"remoteControlTitle": "Απομακρυσμένος έλεγχος επιφάνειας εργασίας",
"Remove": "Αφαίρεση",
"removePassword": "Αφαίρεση $t(lockRoomPassword)",
"removeSharedVideoMsg": "Είστε σίγουρος ότι θέλετε να καταργήσετε το κοινόχρηστο βίντεο σας;",
"removeSharedVideoTitle": "Αφαιρέστε κοινόχρηστο βίντεο",
"reservationError": "Σφάλμα συστήματος κρατήσεων",
"reservationErrorMsg": "Κωδικός σφάλματος: {{code}}, μήνυμα: {{msg}}",
"retry": "Επανάληψη",
"screenSharingAudio": "Διαμοιρασμός ήχου",
"screenSharingFailedToInstall": "Ουπς! Η εγκατάσταση της επέκταση κοινής χρήσης οθόνης απέτυχε.",
"screenSharingFailedToInstallTitle": "Η εγκατάσταση της επέκταση κοινής χρήσης οθόνης απέτυχε",
"screenSharingPermissionDeniedError": "Ουπς! Κάτι πήγε στραβά με τα δικαιώματα της επέκτασης κοινής χρήσης οθόνης. Παρακαλώ ξαναφορτώστε και προσπαθήστε ξανά.",
"sendPrivateMessage": "Πρόσφατα λάβατε ένα προσωπικό μήνυμα. Σκοπεύετε να απαντήσετε σε αυτό ιδιωτικά ή θέλετε να στείλετε το μήνυμά σας στην ομάδα;",
"sendPrivateMessageCancel": "Στείλτε στην ομάδα",
"sendPrivateMessageOk": "Στείλτε ιδιωτικά",
"sendPrivateMessageTitle": "Θέλετε να στείλετε ιδιωτικά;",
"serviceUnavailable": "Η υπηρεσία δεν είναι διαθέσιμη",
"sessTerminated": "Η κλήση τερματίστηκε",
"Share": "Μοιραστείτε",
"shareVideoLinkError": "Παρακαλώ δώστε έναν σωστό σύνδεσμο youtube.",
"shareVideoTitle": "Μοιραστείτε ένα βίντεο",
"shareYourScreen": "Μοιραστείτε την οθόνη σας",
"shareYourScreenDisabled": "Η κοινή χρήση οθόνης απενεργοποιήθηκε.",
"shareYourScreenDisabledForGuest": "Οι επισκέπτες δεν μπορούν να μοιραστούν την οθόνη τους.",
"startLiveStreaming": "Έναρξη ζωντανής ροής",
"startRecording": "Ξεκινήστε την εγγραφή",
"startRemoteControlErrorMessage": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια να ξεκινήσει η λειτουργία απομακρυσμένου ελέγχου!",
"stopLiveStreaming": "Τερματισμός ζωντανής ροής",
"stopRecording": "Τερματισμός εγγραφής",
"stopRecordingWarning": "Είστε σίγουρος ότι θέλετε να διακόψετε την εγγραφή;",
"stopStreamingWarning": "Είστε σίγουρος ότι θέλετε να διακόψετε τη ζωντανή ροή;",
"streamKey": "Κλειδί ζωντανής ροής",
"Submit": "Υποβολή",
"thankYou": "Σας ευχαριστούμε για τη χρήση του {{appName}}!",
"token": "token",
"tokenAuthFailed": "Συγνώμη, δεν επιτρέπεται να συμμετάσχετε σε αυτήν την κλήση.",
"tokenAuthFailedTitle": "Ο έλεγχος ταυτότητας απέτυχε",
"transcribing": "Γίνεται μεταγραφή",
"unlockRoom": "Αφαιρέστε το $t(lockRoomPassword) της συνάντησης",
"userPassword": "κωδικός πρόσβασης χρήστη",
"WaitForHostMsg": "Η διάσκεψη <b>{{room}}</b> δεν έχει ακόμη αρχίσει. Αν είστε ο οικοδεσπότης, τότε παρακαλούμε να πιστοποιήσετε τον εαυτό σας. Διαφορετικά, σας παρακαλώ να περιμένετε να συνδεθεί ο οικοδεσπότης.",
"WaitForHostMsgWOk": "Η διάσκεψη <b>{{room}}</b> δεν έχει ακόμη αρχίσει. Αν είστε ο οικοδεσπότης, τότε παρακαλούμε πατήστε ΟΚ για να πιστοποιήσετε τον εαυτό σας. Διαφορετικά, σας παρακαλώ να περιμένετε να συνδεθεί ο οικοδεσπότης.",
"WaitingForHost": "Αναμονή για τον οικοδεσπότη ...",
"Yes": "Ναι",
"yourEntireScreen": "Ολόκληρη την οθόνη σας"
},
"dialOut": {
"statusMessage": "είναι τώρα {{status}}"
},
"documentSharing": {
"title": "Κοινόχρηστο Έγγραφο"
},
"e2ee": {
"labelToolTip": "Όλοι οι συμμετέχοντες στη συνάντηση αυτή έχουν ενεργοποιήσει την από άκρη σε άκρη κρυπτογράφηση"
},
"feedback": {
"average": "Μέτριο",
"bad": "Κακό",
"detailsLabel": "Πείτε μου περισσότερα γι ' αυτό.",
"good": "Καλό",
"rateExperience": "Αξιολογήστε την εμπειρία της συνάντησης σας",
"veryBad": "Πολύ κακό",
"veryGood": "Πολύ καλό"
},
"incomingCall": {
"answer": "Απάντηση",
"audioCallTitle": "Εισερχόμενη κλήση",
"decline": "Απόρριψη",
"productLabel": "από το Jitsi Meet",
"videoCallTitle": "Εισερχόμενη κλήση βίντεο"
},
"info": {
"accessibilityLabel": "Εμφάνιση πληροφοριών",
"addPassword": "Προσθέστε $t(lockRoomPassword)",
"cancelPassword": "Ακύρωση $t(lockRoomPassword)",
"conferenceURL": "Σύνδεσμος:",
"country": "Χώρα",
"dialANumber": "Για να συνδεθείτε στη συνάντησή σας, καλέστε έναν από αυτούς τους αριθμούς και στη συνέχεια πληκτρολογήστε το pin.",
"dialInConferenceID": "PIN:",
"dialInNotSupported": "Συγγνώμη, η εισερχόμενη κλήση προς το παρόν δεν υποστηρίζεται.",
"dialInNumber": "Εισερχόμενη κλήση:",
"dialInSummaryError": "Σφάλμα ανάκτησης πληροφοριών εισερχόμενης κλήσης. Παρακαλώ προσπαθήστε ξανά αργότερα.",
"dialInTollFree": "Δωρεάν",
"genericError": "Ουπς, κάτι πήγε στραβά.",
"inviteLiveStream": "Για να δείτε τη ζωντανή ροή αυτής της συνάντησης, κάντε κλικ σε αυτό το σύνδεσμο: {{url}}",
"invitePhone": "Για να συμμετάσχετε με τηλέφωνο, πληκτρολογήστε: {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "Ψάχνετε για ένα διαφορετικό εισερχόμενο αριθμό;\nΔείτε τους εισερχόμενους αριθμούς αυτής της συνάντησης : {{url}}\n\n\nΑν επίσης καλείτε μέσω τηλεφώνου δωματίου, συμμετάσχετε χωρίς σύνδεση ήχου: {{silentUrl}}",
"inviteURLFirstPartGeneral": "Σας προσκαλούμε να συμμετάσχετε σε μια σύσκεψη.",
"inviteURLFirstPartPersonal": "{{name}} σας προσκαλεί σε μια συνάντηση.\n",
"inviteURLSecondPart": "\nΣυμμετάσχετε στη σύσκεψη:\n{{url}}\n",
"liveStreamURL": "Ζωντανή ροή:",
"moreNumbers": "Περισσότερα νούμερα",
"noNumbers": "Δεν υπάρχουν εισερχόμενοι αριθμοί.",
"noPassword": "Κανένα",
"noRoom": "Δεν ορίστηκε δωμάτιο για εισερχόμενη κλήση.",
"numbers": "Εισερχόμενοι αριθμοί",
"password": "$t(lockRoomPasswordUppercase):",
"title": "Μοιραστείτε",
"tooltip": "Μοιραστείτε το σύνδεσμο και πληροφορίες εισερχόμενης κλήσης για τη συνάντηση αυτή",
"label": "Πληροφορίες συνάντησης"
},
"inviteDialog": {
"alertText": "Η εφαρμογή απέτυχε να καλέσει μερικούς συμμετέχοντες.",
"header": "Προσκάλεσε",
"searchCallOnlyPlaceholder": "Εισάγετε τον αριθμό τηλεφώνου",
"searchPeopleOnlyPlaceholder": "Αναζήτηση συμμετεχόντων",
"searchPlaceholder": "Συμμετέχοντας ή αριθμός τηλεφώνου",
"send": "Στείλτε"
},
"inlineDialogFailure": {
"msg": "Πέσαμε λίγο.",
"retry": "Προσπαθήστε ξανά",
"support": "Υποστήριξη",
"supportMsg": "Εάν αυτό συνεχίζει να συμβαίνει, επικοινωνήστε με"
},
"keyboardShortcuts": {
"focusLocal": "Εστίαση στο βίντεο σας",
"focusRemote": "Εστίαση στο βίντεο ενός άλλου προσώπου",
"fullScreen": "Είσοδος ή έξοδος από πλήρη οθόνη",
"keyboardShortcuts": "Συντομεύσεις πληκτρολογίου",
"localRecording": "Εμφάνιση ή απόκρυψη χειριστηρίων καταγραφής",
"mute": "Σίγαση ή κατάργηση της σίγασης του μικροφώνου σας",
"pushToTalk": "Πιέστε για να μιλήσετε",
"raiseHand": "Σηκώστε ή χαμηλώστε το χέρι σας",
"showSpeakerStats": "Εμφάνιση στατιστικών ομιλητή",
"toggleChat": "Ανοίξτε ή κλείστε τη συνομιλία",
"toggleFilmstrip": "Εμφάνιση ή απόκρυψη μικρογραφιών βίντεο",
"toggleScreensharing": "Εναλλαγή μεταξύ κάμερας και κοινής χρήσης οθόνης",
"toggleShortcuts": "Εμφάνιση ή απόκρυψη των συντομεύσεων πληκτρολογίου",
"videoMute": "Άνοιγμα ή κλείσιμο κάμερας",
"videoQuality": "Διαχειριστείτε την ποιότητα της κλήσης"
},
"liveStreaming": {
"busy": "Δουλεύουμε για την απελευθέρωση πόρων streaming. Παρακαλώ δοκιμάστε ξανά σε λίγα λεπτά.",
"busyTitle": "Όλες οι streamers είναι απασχολημένοι",
"changeSignIn": "Εναλλαγή λογαριασμών.",
"choose": "Επιλέξτε μία ζωντανή ροή",
"chooseCTA": "Επιλέξτε μία streaming επιλογή. Αυτή την στιγμή είστε συνδεδεμένοι ως {{email}}.",
"enterStreamKey": "Εισάγετε το κλειδί της ζωντανής ροής του YouTube εδώ.",
"error": "Η ζωντανή ροή απέτυχε. Παρακαλώ δοκιμάστε ξανά.",
"errorAPI": "Παρουσιάστηκε ένα σφάλμα κατά την πρόσβαση στίς μεταδόσεις YouTube. Παρακαλώ δοκιμάστε να συνδεθείτε ξανά.",
"errorLiveStreamNotEnabled": "Η ζωντανή ροή δεν είναι ενεργοποιημένη στο {{email}}. Παρακαλούμε να ενεργοποιήσετε τη ζωντανή ροή ή να συνδεθείτε σε ένα λογαριασμό με ενεργοποιημένη τη ζωντανή ροή.",
"expandedOff": "Η ζωντανή ροή έχει σταματήσει",
"expandedOn": "Η συνάντηση αυτή τη στιγμή μεταδίδεται στο YouTube.",
"expandedPending": "Η ζωντανή ροή πρόκειται να ξεκινήσει...",
"failedToStart": "Η ζωντανή ροή απέτυχε να ξεκινήσει",
"getStreamKeyManually": "Δεν ήμασταν σε θέση να φέρουμε κάποια ζωντανή ροή. Προσπαθήστε να πάρετε το κλειδί της ζωντανής ροής από το YouTube.",
"invalidStreamKey": "Το κλειδί της ζωντανής ροής μπορεί να είναι εσφαλμένο.",
"limitNotificationDescriptionNative": "Your streaming will be limited to {{limit}} min. For unlimited streaming try {{app}}.",
"limitNotificationDescriptionWeb": "Due to high demand your streaming will be limited to {{limit}} min. For unlimited streaming try <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"off": "Η ζωντανή ροή σταμάτησε",
"offBy": "Ο/Η {{name}} σταμάτησε τη ζωντανή ροή",
"on": "Ζωντανή ροή",
"onBy": "Ο/Η {{name}} ξεκίνησε τη ζωντανή ροή",
"pending": "Η ζωντανή ροή ξεκινά...",
"serviceName": "Υπηρεσία ζωντανής ροής",
"signedInAs": "Είστε συνδεδεμένοι ως:",
"signIn": "Συνδεθείτε με το Google",
"signInCTA": "Συνδεθείτε ή εισάγετε το το κλειδί της ζωντανής ροής από το YouTube.",
"signOut": "Έξοδος",
"start": "Ξεκινήστε μια ζωντανή ροή",
"streamIdHelp": "Τι είναι αυτό;",
"unavailableTitle": "Ζωντανή ροή μη διαθέσιμη",
"youtubeTerms": "Όροι υπηρεσιών YouTube",
"googlePrivacyPolicy": "Πολιτική Απορρήτου της Google"
},
"localRecording": {
"clientState": {
"off": "Κλειστό",
"on": "Ανοικτό",
"unknown": "Άγνωστο"
},
"dialogTitle": "Κοντρόλ τοπικής καταγραφής",
"duration": "Διάρκεια",
"durationNA": "Δ/Υ",
"encoding": "Κωδικοποίηση",
"label": "LOR",
"labelToolTip": "Η τοπική καταγραφή είναι απασχολημένη",
"localRecording": "Τοπική Καταγραφή",
"me": "Εγώ",
"messages": {
"engaged": "Η Τοπική καταγραφή είναι απασχολημένη.",
"finished": "Η καταγραφή {{token}} τελείωσε. Παρακαλούμε να στείλετε το αρχείο καταγραφής στο συντονιστή.",
"finishedModerator": "Η καταγραφή {{token}} τελείωσε. Η καταγραφή της τοπικής ροής έχει αποθηκευθεί. Παρακαλώ ζητήστε από τους άλλους συμμετέχοντες να υποβάλουν τις καταγραφές τους.",
"notModerator": "Δεν είστε ο συντονιστής. Δεν μπορείτε να ξεκινήσετε ή να σταματήσετε την τοπική καταγραφή."
},
"moderator": "Συντονιστής",
"no": "Όχι",
"participant": "Συμμετέχων",
"participantStats": "Στατιστικά συμμετεχόντων",
"sessionToken": "Token Συνεδρίας",
"start": "Ξεκινήστε την καταγραφή",
"stop": "Σταματήστε την καταγραφή",
"yes": "Ναι"
},
"lockRoomPassword": "κωδικός πρόσβασης",
"lockRoomPasswordUppercase": "Κωδικός πρόσβασης",
"me": "Εγώ",
"notify": {
"connectedOneMember": "{{name}} μπήκε στην συνάντηση",
"connectedThreePlusMembers": "Ο/Η {{name}} και {{count}} άλλοι μπήκαν στην συνάντηση",
"connectedTwoMembers": "Ο {{first}} και ο {{second}} μπήκαν στην συνάντηση",
"disconnected": "αποσυνδεμένος",
"focus": "Εστίαση στη διάσκεψη",
"focusFail": "Το {{component}} δεν είναι διαθέσιμο - επανάληψη σε {{ms}} sec",
"grantedTo": "Χορηγήθηκαν δικαιώματα συντονιστή στον/ην {{to}}!",
"invitedOneMember": "Ο/Η {{name}} έχει προσκληθεί",
"invitedThreePlusMembers": "Ο/Η {{name}} και {{count}} άλλοι έχουν προσκληθεί",
"invitedTwoMembers": "Ο {{first}} και ο {{second}} έχουν προσκληθεί",
"kickParticipant": "Ο/Η {{kicked}} απλοβλήθηκε από τον/ην {{kicker}}",
"me": "Εγώ",
"moderator": "Χορηγήθηκαν δικαιώματα συντονιστή!",
"muted": "Έχετε ξεκινήσει τη συζήτηση σε σίγαση.",
"mutedTitle": "Είσαι σε σίγαση!",
"mutedRemotelyTitle": "Έχετε μπει σε σίγαση από τον/ην {{participantDisplayName}}!",
"mutedRemotelyDescription": "Μπορείτε πάντα να καταργήσετε τη σίγαση, όταν είστε έτοιμος να μιλήσετε. Ενεργοποιήστε ξανά τη σίγαση όταν τελειώσετε, για να κρατήσετε μακριά τον θόρυβο από τη διάσκεψη.",
"passwordRemovedRemotely": "Το $t(lockRoomPasswordUppercase) αφαιρέθηκε από έναν άλλον συμμετέχοντα",
"passwordSetRemotely": "Το $t(lockRoomPasswordUppercase) ορίστηκε από άλλον συμμετέχοντα",
"raisedHand": "Ο/Η {{name}} θα ήθελε να μιλήσει.",
"somebody": "Κάποιος",
"startSilentTitle": "Μπήκες χωρίς συσκευή εξόδου ήχου!",
"startSilentDescription": "Ξαναμπείτε στη συνάντηση για να ενεργοποιήσετε τον ήχο",
"suboptimalBrowserWarning": "Φοβόμαστε ότι η εμπειρία σας στη συνάντηση δεν θα είναι καλή εδώ. Ψάχνουμε για τρόπους για να το βελτιώσουμε αυτό, αλλά μέχρι τότε παρακαλώ δοκιμάστε να χρησιμοποιήσετε ένα από τα <a href='static/recommendedBrowsers.html' target='_blank'>πλήρως υποστηριζόμενα προγράμματα περιήγησης</a>.",
"suboptimalExperienceTitle": "Προειδοποίηση πρόγραμματος περιήγησης",
"unmute": "Κατάργηση σίγασης",
"newDeviceCameraTitle": "Εντοπίστηκε νέα κάμερα",
"newDeviceAudioTitle": "Εντοπίστηκε νέα συσκευή ήχου",
"newDeviceAction": "Χρήση",
"OldElectronAPPTitle": "Θέμα ευπάθειας ασφαλείας!",
"oldElectronClientDescription1": "Φαίνεται ότι χρησιμοποιείτε μια παλιά έκδοση του πελάτη Jitsi Meet που έχει γνωστά θέματα ευπάθειας ασφαλείας. Παρακαλώ βεβαιωθείτε ότι έχετε την ενημερωμένη έκδοση για ",
"oldElectronClientDescription2": "πρόσφατη έκδοση μας",
"oldElectronClientDescription3": " τώρα!"
},
"passwordSetRemotely": "ορίστηκε από άλλον συμμετέχοντα",
"passwordDigitsOnly": "Έως {{number}} ψηφία",
"poweredby": "με τη δύναμη του",
"prejoin": {
"audioAndVideoError": "Σφάλμα ήχου και βίντεο:",
"audioOnlyError": "Σφάλμα ήχου:",
"audioTrackError": "Δεν ήταν δυνατή η δημιουργία κομματιού ήχου.",
"callMe": "Κάλεσέ με",
"callMeAtNumber": "Κάλεσέ με σε αυτό το νούμερο:",
"configuringDevices": "Γίνεται παραμετροποίηση συσκευών...",
"connectedWithAudioQ": "Είστε συνδεδεμένοι με ήχο;",
"copyAndShare": "Αντιγραφή και κοινή χρήση συνδέσμου συνάντησης",
"dialInMeeting": "Κλήση στη συνάντηση",
"dialInPin": "Κλήση στη συνάντηση και εισαγωγή κωδικού PIN:",
"dialing": "Γίνεται κλήση",
"doNotShow": "Να μην εμφανιστεί αυτό ξανά",
"errorDialOut": "Η κλήση δεν ήταν δυνατή",
"errorDialOutDisconnected": "Η κλήση δεν ήταν δυνατή. Έγινε αποσύνδεση",
"errorDialOutFailed": "Η κλήση δεν ήταν δυνατή. Η κλήση απέτυχε",
"errorDialOutStatus": "Σφάλμα λήψης κατάστασης κλήσης",
"errorStatusCode": "Σφάλμα κλήσης, κωδικός κατάστασης: {{status}}",
"errorValidation": "Η επικύρωση του αριθμού απέτυχε",
"iWantToDialIn": "Θέλω να κάνω κλήση",
"joinAudioByPhone": "Συμμετοχή με ήχο τηλεφώνου",
"joinMeeting": "Συμμετοχή στη συνάντηση",
"joinWithoutAudio": "Συμμετοχή χωρίς ήχο",
"initiated": "Η κλήση ξεκίνησε",
"linkCopied": "Ο σύνδεσμος αντιγράφηκε στο πρόχειρο",
"lookGood": "Ακούγεται ότι το μικρόφωνο σας λειτουργεί άψογα",
"or": "ή",
"calling": "Γίνεται κλήση",
"startWithPhone": "Έναρξη με ήχο τηλεφώνου",
"screenSharingError": "Σφάλμα διαμοιρασμού οθόνης:",
"videoOnlyError": "Σφάλμα βίντεο:",
"videoTrackError": "Δεν ήταν δυνατή η δημιουργία κομματιού βίντεο.",
"viewAllNumbers": "προβολή όλων των αριθμών"
},
"presenceStatus": {
"busy": "Απασχολημένος",
"calling": "Γίνεται κλήση...",
"connected": "Συνδεδεμένος",
"connecting": "Γίνεται σύνδεση...",
"connecting2": "Γίνεται σύνδεση*...",
"disconnected": "Αποσυνδεθηκε",
"expired": "Έληξε",
"ignored": "Αγνοούνται",
"initializingCall": "Προετοιμασία Κλήσης...",
"invited": "Προσκλήθηκε",
"rejected": "Απορρίφθηκε",
"ringing": "Χτυπάει..."
},
"profile": {
"setDisplayNameLabel": "Ρυθμίστε το όνομα εμφάνισής σας",
"setEmailInput": "Εισάγετε το e-mail",
"setEmailLabel": "Ρυθμίστε το gravatar email",
"title": "Προφίλ"
},
"raisedHand": "Θα ήθελα να μιλήσω",
"recording": {
"limitNotificationDescriptionWeb": "Λόγω υψηλής ζήτησης η εγγραφή σας θα περιριστεί σε {{limit}} λεπτά. Για απεριόριστες εγγραφές, δοκιμάστε το <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Λόγω υψηλής ζήτησης η εγγραφή σας θα περιριστεί σε {{limit}} λεπτά. Για απεριόριστες εγγραφές, δοκιμάστε <3>{{app}}</3>.",
"authDropboxText": "Ανεβάστε στο Dropbox",
"availableSpace": "Διαθέσιμος χώρος: {{spaceLeft}} MB (περίπου {{duration}} λεπτά εγγραφής)",
"beta": "BETA",
"busy": "Δουλεύουμε για την απελευθέρωση καταγραφής πόρων. Παρακαλώ δοκιμάστε ξανά σε λίγα λεπτά.",
"busyTitle": "Όλοι οι καταγραφείς είναι απασχολημένοι",
"error": "Η καταγραφή απέτυχε. Παρακαλώ δοκιμάστε ξανά.",
"expandedOff": "Η καταγραφή έχει διακοπεί",
"expandedOn": "Η συνάντηση καταγράφεται.",
"expandedPending": "Η καταγραφή τίθεται σε λειτουργία...",
"failedToStart": "Η καταγραφή απέτυχε να ξεκινήσει",
"fileSharingdescription": "Μοιραστείτε την καταγραφή με τους συμμετέχοντες της συνάντησης",
"live": "ΖΩΝΤΑΝΑ",
"loggedIn": "Συνδεδεμένοι ως {{userName}}",
"off": "Η καταγραφή σταμάτησε",
"offBy": "Ο/Η {{name}} σταματήσε την καταγραφή",
"on": "Καταγραφή",
"onBy": "Ο/Η {{name}} ξεκίνησε την καταγραφή",
"pending": "Προετοιμασία για την καταγραφή της σύσκεψης...",
"rec": "ΚΑΤΑΓΡΑΦΗ",
"serviceDescription": "Η καταγραφή σας θα αποθηκευτεί από την υπηρεσία καταγραφής",
"serviceName": "Υπηρεσία καταγραφής",
"signIn": "Σύνδεση",
"signOut": "Αποσύνδεση",
"unavailable": "Ουπς! Το {{serviceName}} δεν είναι διαθέσιμο προς το παρόν. Δουλεύουμε για την επίλυση του ζητήματος. Παρακαλώ προσπαθήστε ξανά αργότερα.",
"unavailableTitle": "Η καταγραφή δεν είναι διαθέσιμη"
},
"sectionList": {
"pullToRefresh": "Τραβήξτε για να ανανεώσετε"
},
"security": {
"about": "Έχετε τη δυνατότητα να προσθέσετε κωδικό στη συνάντησή σας. Οι συμμετέχοντες θα πρέπει να τον εισάγουν για να τους δοθεί πρόσβαση στη συνάντηση.",
"insecureRoomNameWarning": "Το όνομα του διαδρόμου δεν είναι ασφαλές. Ανεπιθύμητοι συμμετέχοντες μπορεί να συμμετάσχουν στη συνάντησή σας. Σκεφτείτε το να ασφαλίσετε τη συνάντηση σας χρησιμοποιώντας το κουμπί Ασφάλεια.",
"securityOptions": "Επιλογές ασφαλείας"
},
"settings": {
"calendar": {
"about": "H σύνδεση ημερολογίου του {{appName}} χρησιμοποιείται για την ασφαλή πρόσβαση του ημερολογίου σας, ώστε να μπορεί να διαβάσει τις επερχόμενες εκδηλώσεις.",
"disconnect": "Αποσύνδεση",
"microsoftSignIn": "Σύνδεση με τη Microsoft",
"signedIn": "Πραγματοποιείται πρόσβαση σε ημερολόγιο εκδηλώσεων για το {{email}}. Κάντε κλικ στο κουμπί Αποσύνδεση παρακάτω, για να σταματήσει η πρόσβαση σε συμβάντα ημερολογίου.",
"title": "Ημερολόγιο"
},
"devices": "Συσκευές",
"followMe": "Όλοι με ακολουθούν",
"language": "Γλώσσα",
"loggedIn": "Συνδεδεμένος ως {{name}}",
"microphones": "Μικρόφωνα",
"moderator": "Συντονιστής",
"more": "Περισσότερα",
"name": "Όνομα",
"noDevice": "Κανένα",
"selectAudioOutput": "Έξοδος ήχου",
"selectCamera": "Κάμερα",
"selectMic": "Μικρόφωνο",
"speakers": "Ηχεία",
"startAudioMuted": "Όλοι ξεκινούν σε σίγαση",
"startVideoMuted": "Όλοι ξεκινούν σε απόκρυψη",
"title": "Ρυθμίσεις"
},
"settingsView": {
"advanced": "Για προχωρημένους",
"alertOk": "OK",
"alertTitle": "Προειδοποίηση",
"alertURLText": "Η διεύθυνση URL του διακομοστή που εισάγατε δεν είναι έγκυρη",
"buildInfoSection": "Πληροφορίες έκδοσης",
"conferenceSection": "Συνέδριο",
"disableCallIntegration": "Απενεργοποίηση ολοκλήρωσης εγγενούς κλήσης",
"disableP2P": "Απενεργοποίηση λειτουργίας Peer-to-Peer",
"displayName": "Εμφανιζόμενο όνομα",
"email": "E-mail",
"header": "Ρυθμίσεις",
"profileSection": "Προφίλ",
"serverURL": "Διεύθυνση URL του διακομιστή",
"showAdvanced": "Εμφάνιση ρυθμίσεων για προχωρημένους",
"startWithAudioMuted": "Ξεκινήστε με σίγαση ήχου",
"startWithVideoMuted": "Ξεκινήστε με το βίντεο σε σίγαση",
"version": "Έκδοση",
"alertCancel": "Ακύρωση",
"disableCrashReporting": "Απενεργοποίηση αναφοράς σφαλμάτων",
"disableCrashReportingWarning": "Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε την αναφορά σφαλμάτων; Η ρύθμιση θα εφαρμοστεί μετά την επανεκκίνηση της εφαρμογής."
},
"share": {
"dialInfoText": "\n\n=====\n\nΘέλω απλά να καλέσετε με το τηλέφωνό σας;\n\n{{defaultDialInNumber}}κάντε Κλικ σε αυτό το σύνδεσμο για να δείτε τους τηλεφωνικούς αριθμούς κλήσης για αυτή τη συνάντηση\n{{dialInfoPageUrl}}",
"mainText": "Κάντε κλικ στον παρακάτω σύνδεσμο για να συμμετάσχετε στη σύσκεψη:\n{{roomUrl}}"
},
"speaker": "Ομιλητής",
"speakerStats": {
"hours": "{{count}}ω",
"minutes": "{{count}}λ",
"name": "Όνομα",
"seconds": "{{count}}δ",
"speakerStats": "Στατιστικά ομιλητή",
"speakerTime": "Χρόνος ομιλητή"
},
"startupoverlay": {
"policyText": " ",
"title": "Το {{app}} πρέπει να χρησιμοποιήσει το μικρόφωνο και την κάμερά σας."
},
"suspendedoverlay": {
"rejoinKeyTitle": "Επανασύνδεση",
"text": "Πατήστε το <i>Επανασύνδεση</i> για να επανασυνδεθείτε.",
"title": "Η Βίντεο κλήση διακόπηκε, επειδή ο υπολογιστής αυτός μπήκε σε κατάσταση αναστολής."
},
"toolbar": {
"accessibilityLabel": {
"audioOnly": "Εναλλαγή ήχου μόνο",
"audioRoute": "Επιλέξτε τη συσκευή ήχου",
"callQuality": "Διαχειριστείτε την ποιότητα του βίντεο",
"cc": "Εναλλαγή υποτίτλων",
"chat": "Εναλλαγή παραθύρου συνομιλίας",
"document": "Εναλλαγή κοινοχρήστου εγγράφου",
"download": "Κατεβάστε τις εφαρμογές μας",
"e2ee": "End-to-End Κρυπτογράφηση",
"feedback": "Αφήστε σχόλια",
"fullScreen": "Εναλλαγή σε πλήρη οθόνη",
"hangup": "Απόχώρηση από την κλήση",
"help": "Βοήθεια",
"invite": "Πρόσκληση συμμετεχόντων",
"kick": "Αποβολή συμμετέχοντα",
"lobbyButton": "Ενεργοποίηση/απενεργοποίηση λειτουργίας διαδρόμου",
"localRecording": "Εναλλαγή ελέγχων τοπικής καταγραφής",
"lockRoom": "Εναλλαγή κωδικού πρόσβασης συνάντησης",
"moreActions": "Εναλλαγή μενού περισσότερων ενεργειών",
"moreActionsMenu": "Μενού περισσότερων ενεργειών",
"moreOptions": "Εμφάνιση περισσότερων επιλογών",
"mute": "Εναλλαγή σίγασης ήχου",
"muteEveryone": "Σίγαση όλων",
"pip": "Εναλλαγή λειτουργίας Picture-in-Picture",
"privateMessage": "Αποστολή ιδιωτικού μηνύματος",
"profile": "Επεξεργαστείτε το προφίλ σας",
"raiseHand": "Εναλλαγή σηκώματος χεριού",
"recording": "Εναλλαγή καταγραφής",
"remoteMute": "Σίγαση συμμετέχοντα",
"security": "Επιλογές ασφαλείας",
"Settings": "Εναλλαγή ρυθμίσεων",
"sharedvideo": "Εναλλαγή κοινής χρήσης βίντεο στο Youtube",
"shareRoom": "Προσκαλέστε κάποιον",
"shareYourScreen": "Εναλλαγή κοινής χρήσης οθόνης",
"shortcuts": "Εναλλαγή συντομεύσεων",
"show": "Εμφάνιση στη σκηνή",
"speakerStats": "Εναλλαγή στατιστικών ομιλητών",
"tileView": "Εναλλαγή άποψης εικονιδίων",
"toggleCamera": "Εναλλαγή κάμερας",
"toggleFilmstrip": "Εναλλαγή filmstrip",
"videomute": "Εναλλαγή σίγασης βίντεο",
"videoblur": "Εναλλαγή θολούρας βίντεο"
},
"addPeople": "Προσθήκη ατόμων στην κλήση σας",
"audioOnlyOff": "Απενεργοποίηση λειτουργίας χαμηλού εύρους ζώνης",
"audioOnlyOn": "Ενεργοποίηση λειτουργίας χαμηλού εύρους ζώνης",
"audioRoute": "Επιλέξτε τη συσκευή ήχου",
"authenticate": "Έλεγχος ταυτότητας",
"callQuality": "Διαχειριστείτε την ποιότητα του βίντεο",
"chat": "Άνοιγμα / κλείσιμο chat",
"closeChat": "Κλείσιμο chat",
"documentClose": "Κλείσιμο κοινόχρηστου εγγράφου",
"documentOpen": "Άνοιγμα κοινόχρηστο εγγράφου",
"download": "Κατεβάστε τις εφαρμογές μας",
"e2ee": "End-to-End Κρυπτογράφηση",
"enterFullScreen": "Δείτε σε πλήρη οθόνη",
"enterTileView": "Είσοδος σε προβολή εικονιδίων",
"exitFullScreen": "Έξοδος από πλήρη οθόνη",
"exitTileView": "Έξοδος από προβολή εικονιδίων",
"feedback": "Αφήστε σχόλια",
"hangup": "Αποσύνδεση",
"help": "Βοήθεια",
"invite": "Πρόσκληση συμμετεχόντων",
"lobbyButtonDisable": "Απενεργοποίηση λειτουργίας διαδρόμου",
"lobbyButtonEnable": "Ενεργοποίηση λειτουργίας διαδρόμου",
"login": "Είσοδος",
"logout": "Αποσύνδεση",
"lowerYourHand": "Κατεβάστε το χέρι σας",
"moreActions": "Περισσότερες ενέργειες",
"moreOptions": "Περισσότερες επιλογές",
"mute": "Σίγαση / Κατάργηση Σίγασης",
"muteEveryone": "Σίγαση όλων",
"noAudioSignalTitle": "Δεν υπάρχει ήχος από το μικρόφωνο σας!",
"noAudioSignalDesc": "Αν δεν του κάνατε σίγαση ηθελημένα από τις ρυθμίσεις του συστήματος ή του υλικού, εξετάστε την αντικατάσταση της συσκευής.",
"noAudioSignalDescSuggestion": "Αν δεν του κάνατε σίγαση ηθελημένα από τις ρυθμίσεις του συστήματος ή του υλικού, εξετάστε τη χρήση της προτεινόμενης συσκευής.",
"noAudioSignalDialInDesc": "Μπορείτε επίσης να καλέσετε χρησιμοποιώντας:",
"noAudioSignalDialInLinkDesc": "Αριθμοί κλήσης",
"noisyAudioInputTitle": "Το μικρόφωνο φαίνεται να είναι θορυβώδες!",
"noisyAudioInputDesc": "Το μικρόφωνό σας πιθανόν να κάνει θόρυβο, παρακαλούμε χρησιμοποιήστε τη σίγαση ή την αντικατάσταση της συσκευής.",
"openChat": "Ανοικτή συνομιλία",
"pip": "Είσοδος σε λειτουργία Picture-in-Picture",
"privateMessage": "Αποστολή ιδιωτικού μηνύματος",
"profile": "Επεξεργαστείτε το προφίλ σας",
"raiseHand": "Σηκώστε / κατεβάστε το χέρι σας",
"raiseYourHand": "Σηκώστε το χέρι σας",
"security": "Επιλογές ασφαλείας",
"Settings": "Ρυθμίσεις",
"sharedvideo": "Μοιραστείτε βίντεο στο YouTube",
"shareRoom": "Προσκαλέστε κάποιον",
"shortcuts": "Δείτε τις συντομεύσεις",
"speakerStats": "Στατιστικά ομιλητών",
"startScreenSharing": "Ξεκινήστε την κοινή χρήση οθόνης",
"startSubtitles": "Έναρξη υποτίτλων",
"stopScreenSharing": "Διακόψτε την κοινή χρήση οθόνης",
"stopSubtitles": "Σταμάτημα υποτίτλων",
"stopSharedVideo": "Σταμάτημα του βίντεο YouTube",
"talkWhileMutedPopup": "Προσπαθείτε να μιλήσετε; Είστε σε σίγαση.",
"tileViewToggle": "Εναλλαγή προβολής εικονιδίων",
"toggleCamera": "Εναλλαγή κάμερας",
"videomute": "Άνοιγμα / κλείσιμο κάμερας",
"startvideoblur": "Θόλωσε το φόντο μου",
"stopvideoblur": "Απενεργοποίηση θόλωσης του φόντου"
},
"transcribing": {
"ccButtonTooltip": "Άνοιγμα / κλείσιμο υποτίτλων",
"error": "Η μεταγραφή απέτυχε. Παρακαλώ δοκιμάστε ξανά.",
"expandedLabel": "Η Μεταγραφή είναι ενεργοποιημένη",
"failedToStart": "Η Μεταγραφή απέτυχε να ξεκινήσει",
"labelToolTip": "Η συνάντηση μεταγράφεται",
"off": "Η Μεταγραφή σταμάτησε",
"pending": "Προετοιμασία για μεταγραφή της συνάντησης...",
"start": "Εμφάνιση υποτίτλων",
"stop": "Απόκρυψη υποτίτλων",
"tr": "TR"
},
"userMedia": {
"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": "Γίνεται προσπάθεια για την απελευθέρωση πόρων. Παρακαλώ δοκιμάστε ξανά σε λίγα λεπτά.",
"busyTitle": "Η υπηρεσία Δωματίου είναι απασχολημένη",
"errorAlreadyInvited": "{{displayName}} έχει ήδη προσκληθεί",
"errorInvite": "Το Συνέδριο δεν έχει συσταθεί ακόμα. Παρακαλώ προσπαθήστε ξανά αργότερα.",
"errorInviteFailed": "Γίνεται προσπάθεια για την επίλυση του ζητήματος. Παρακαλώ προσπαθήστε ξανά αργότερα.",
"errorInviteFailedTitle": "Η πρόσκληση του/ης {{displayName}} απέτυχε",
"errorInviteTitle": "Σφάλμα πρόσκλησης δωματίου",
"pending": "Ο/Η {{displayName}} έχει προσκληθεί"
},
"videoStatus": {
"audioOnly": "AUD",
"audioOnlyExpanded": "Είστε σε λειτουργία χαμηλού εύρους ζώνης. Σε αυτή τη λειτουργία, θα λάβετε μόνο ήχο και κοινή χρήση οθόνης.",
"callQuality": "Ποιότητα Βίντεο",
"hd": "HD",
"hdTooltip": "Προβολή βίντεο υψηλής ευκρίνειας",
"highDefinition": "Υψηλής ευκρίνειας",
"labelTooiltipNoVideo": "Χωρίς βίντεο",
"labelTooltipAudioOnly": "Η Λειτουργία χαμηλού εύρους ζώνης είναι ενεργοποιημένη",
"ld": "LD",
"ldTooltip": "Προβολή χαμηλής ευκρίνειας βίντεο",
"lowDefinition": "Χαμηλής ευκρίνειας",
"onlyAudioAvailable": "Μόνο ο ήχος είναι διαθέσιμος",
"onlyAudioSupported": "Υποστηρίζουμε μόνο ήχο σε αυτό το πρόγραμμα περιήγησης.",
"sd": "SD",
"sdTooltip": "Προβολή βίντεο τυπικής ανάλυσης",
"standardDefinition": "Τυπική ανάλυση"
},
"videothumbnail": {
"domute": "Σίγαση",
"domuteOthers": "Σίγαση όλων των άλλων",
"flip": "Περιστροφή",
"kick": "Αποβολή",
"moderator": "Συντονιστής",
"mute": "Ο συμμετέχων είναι σε σίγαση",
"muted": "Σίγαση",
"remoteControl": "Ενεργοποίηση / απενεργοποίηση απομακρυσμένου ελέγχου",
"show": "Εμφάνιση στη σκηνή",
"videomute": "Ο συμμετέχων έχει σταματήσει την κάμερα"
},
"welcomepage": {
"accessibilityLabel": {
"join": "Πατήστε για να κάνετε είσοδο",
"roomname": "Εισάγετε το όνομα δωματίου"
},
"appDescription": "Εμπρός, κάντε video chat με όλη την ομάδα. Στην πραγματικότητα, καλέστε όλους τους γνωστούς σας. Το {{app}} μια πλήρως κρυπτογραφημένη, 100% open source λύση τηλεδιάσκεψης που μπορείτε να χρησιμοποιήσετε για όλη την ημέρα, κάθε μέρα, εντελώς δωρεάν — χωρίς να απαιτείται δημιουργία λογαριασμού.",
"audioVideoSwitch": {
"audio": "Φωνή",
"video": "Βίντεο"
},
"calendar": "Ημερολόγιο",
"connectCalendarButton": "Συνδέστε το ημερολόγιο",
"connectCalendarText": "Συνδέστε το ημερολόγιο για να δείτε όλες τις συναντήσεις σας στο {{app}}. Επιπλέον, προσθέστε συναντήσεις στο {{provider}} ημερολόγιό σας και ξεκινήστε με ένα κλικ.",
"enterRoomTitle": "Ξεκινήστε μια νέα συνάντηση",
"getHelp": "Βοήθεια",
"roomNameAllowedChars": "Το όνομα συνάντησης δεν πρέπει να περιέχει οποιονδήποτε από αυτούς τους χαρακτήρες: ?, &, :, ', \", %, #.",
"go": "ΠΑΜΕ",
"goSmall": "ΠΑΜΕ",
"join": "ΔΗΜΙΟΥΡΓΙΑ / ΕΙΣΟΔΟΣ",
"info": "Πληροφορίες",
"privacy": "Απόρρητο",
"recentList": "Πρόσφατες",
"recentListDelete": "Διαγραφή",
"recentListEmpty": "Η λίστα με τα πρόσφατα σας είναι άδεια. Συνομιλήστε με την ομάδα σας και θα βρείτε όλες τις πρόσφατες συναντήσεις εδώ.",
"reducedUIText": "Καλώς ήρθατε στο {{app}}!",
"roomname": "Εισάγετε το όνομα δωματίου",
"roomnameHint": "Εισάγετε το όνομα ή τη διεύθυνση URL του δωματίου στο οποίο θέλετε να συμμετάσχετε. Μπορείτε να βρείτε ένα όνομα, απλά ενημερώστε τους συμμετέχοντες, έτσι ώστε να εισάγουν το ίδιο όνομα.",
"sendFeedback": "Στείλτε τα σχόλιά σας",
"terms": "Όροι",
"title": "Ασφαλής, πλήρως εξοπλισμένη, και εντελώς δωρεάν βίντεο συνομιλία"
},
"lonelyMeetingExperience": {
"button": "Προσκαλέστε κι άλλους",
"youAreAlone": "Είστε ο μόνος στη συνάντηση"
},
"helpView": {
"header": "Κέντρο βοήθειας"
},
"lobby": {
"allow": "Επίτρεψε",
"backToKnockModeButton": "Χωρίς κωδικό, ζητήστε πρόσβαση αντί αυτού",
"dialogTitle": "Λειτουργία διαδρόμου",
"disableDialogContent": "Η λειτουργία διαδρόμου είναι ενεργοποιημένη. Αυτή η λειτουργία εξασφαλιζει ότι οι ανεπιθύμητοι συμμετέχοντες δεν μπορούν να προστεθούν στη συνάντηση. Θέλετε να την απαεργοποιήσετε;",
"disableDialogSubmit": "Απενεργοποίηση",
"emailField": "Εισάγετε τη διεύθυνση email σας",
"enableDialogPasswordField": "Ορισμός κωδικού (προαιρετικός)",
"enableDialogSubmit": "Ενεργοποίηση",
"enableDialogText": "Η ενεργοποίηση λειτουργίας διαδρόμου σας επιτρέπει να προστατεύσετε τη συνάντηση σας, επιτρέποντας την είσοδο μόνο μετά από επίσημη έγκριση από έναν διαχειριστή.",
"enterPasswordButton": "Εισαγωγή κωδικού συνάντησής",
"enterPasswordTitle": "Εισάγετε κωδικό για να προστεθείτε στη συνομιλία",
"invalidPassword": "Εσφαλμένος κωδικός",
"joiningMessage": "Θα προστεθείτε στη συνάντηση μόλις κάποιος αποδεχτεί το αίτημά σας",
"joinWithPasswordMessage": "Γίνεται προσπάθεια εισόδου με κωδικό, παρακαλώ περιμένετε...",
"joinRejectedMessage": "Το αίτημα εισόδου σας απορρίφθηκε από έναν διαχειριστή.",
"joinTitle": "Προσθήκη σε συνάντηση",
"joiningTitle": "Γίνεται αίτηση εισόδου σε συνάντηση...",
"joiningWithPasswordTitle": "Γίνεται είσοδος με κωδικό...",
"knockButton": "Αίτημα εισόδου",
"knockTitle": "Κάποιος θέλει να προστεθεί στη συνάντηση",
"nameField": "Εισάγετε το όνομά σας",
"passwordField": "Εισάγετε τον κωδικό συνάντησης",
"passwordJoinButton": "Είσοδος",
"reject": "Απόρριψη",
"toggleLabel": "Ενεργοποίηση διαδρόμου"
}
}

View File

@@ -120,8 +120,10 @@
"description": "Nothing happened? We tried launching your meeting in the {{app}} desktop app. Try again or launch it in the {{app}} web app.",
"descriptionWithoutWeb": "",
"downloadApp": "Download the app",
"ifDoNotHaveApp": "If you don't have the app yet:",
"ifHaveApp": "If you already have the app:",
"joinInApp": "Join this meeting using the app",
"launchWebButton": "Launch in web",
"openApp": "Continue to the app",
"title": "Launching your meeting in {{app}}…",
"tryAgainButton": "Try again in desktop"
},

File diff suppressed because it is too large Load Diff

View File

@@ -1,21 +1,36 @@
{
"addPeople": {
"add": "Invitar",
"countryNotSupported": "Aún no contamos con soporte a este destino.",
"addContacts": "Invitar a sus contactos",
"copyInvite": "Copiar la invitación a la reunión",
"copyLink": "Copiar el link de la reunión",
"copyStream": "Copiar el link de la transmisión en vivo",
"countryNotSupported": "Aun no contamos con soporte a este destino.",
"countryReminder": "¿Llamando fuera de los Estados Unidos? ¡Por favor, asegúrese de empezar con el código de país!",
"defaultEmail": "Dirección de correo por defecto",
"disabled": "No puede invitar a otras personas.",
"failedToAdd": "Error al agregar participantes",
"footerText": "La marcación está desactivada.",
"loading": "Búsqueda de personas y números de teléfono",
"loadingNumber": "Validando el número de teléfono",
"loadingPeople": "Buscando contactos a invitar",
"googleEmail": "Correo electrónico de Google",
"inviteMoreHeader": "Usted se encuentra solo en la reunión",
"inviteMoreMailSubject": "Unirse a la reunion {{appName}}",
"inviteMorePrompt": "Invitar a más personas",
"linkCopied": "Link copiado al portapapeles",
"loading": "Buscando por contacto y número telefónico",
"loadingNumber": "Validando el número telefónico",
"loadingPeople": "Buscando contactos a invitar",
"noResults": "No se encontraron coincidencias",
"noValidNumbers": "Por favor ingrese un número de teléfono",
"searchNumbers": "Agregar números de teléfono",
"searchPeople": "Búsqueda de personas",
"outlookEmail": "Correo de Outlook",
"searchNumbers": "Agregar números telefónicos",
"searchPeople": "Búscar personas",
"searchPeopleAndNumbers": "Buscar personas o añadir sus números de teléfono",
"shareInvite": "Compartir la invitación a la reunión",
"shareLink": "Compartir el link de la reunion",
"shareStream": "Compartie el link de la transmición en vivo",
"telephone": "Teléfono: {{number}}",
"title": "Invitar a otras personas a esta reunión"
"title": "Invitar a otras personas a esta reunión",
"yahooEmail": "Correo de Yahoo"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -32,7 +47,7 @@
"confirmAddLink": "¿Quiere añadir un enlace de Jitsi a este evento?",
"error": {
"appConfiguration": "La integración del calendario no está configurada correctamente",
"generic": "Se ha producido un error. Compruebe la configuración del calendario o pruebe a recargarlo",
"generic": "Se ha producido un error. Compruebe la configuración del calendario o pruebe cargarlo nuevamente.",
"notSignedIn": "Se ha producido un error de autenticación para ver los eventos del calendario. Compruebe la configuración del calendario e intente iniciar sesión de nuevo"
},
"join": "Unirse",
@@ -60,9 +75,9 @@
"you": "usted"
},
"chromeExtensionBanner": {
"installExtensionText": "",
"buttonText": "",
"dontShowAgain": ""
"installExtensionText": "Instalar la extensión para Google Calendar y la integración con Office 365",
"buttonText": "Instalar extensión de Chrome",
"dontShowAgain": "No mostrar nuevamente"
},
"connectingOverlay": {
"joiningRoom": "Conectándose a su reunión…"
@@ -78,10 +93,10 @@
"DISCONNECTING": "Desconectando",
"ERROR": "Error",
"RECONNECTING": "Ocurrió un problema en la red. Reconectando...",
"LOW_BANDWIDTH": "",
"GOT_SESSION_ID": "",
"GET_SESSION_ID_ERROR": "",
"FETCH_SESSION_ID": ""
"FETCH_SESSION_ID": "Obteniendo session-ID…",
"GET_SESSION_ID_ERROR": "Obtener session-id error: {{code}}",
"GOT_SESSION_ID": "Obteniendo session-ID… Listo",
"LOW_BANDWIDTH": "Video para {{displayName}} ha sido deshabilitado para economizar ancho de banda"
},
"connectionindicator": {
"address": "Dirección:",
@@ -89,13 +104,14 @@
"bitrate": "Tasa de transferencia:",
"bridgeCount": "Contador del servidor: ",
"connectedTo": "Conectado a:",
"e2e_rtt": "E2E RTT:",
"framerate": "Fotogramas por segundo:",
"less": "Mostrar menos",
"localaddress": "Dirección local:",
"localaddress_plural": "Direcciones locales:",
"localport": "Puerto local:",
"localport_plural": "Puertos locales:",
"more": "Ver más",
"more": "Mostrar más",
"packetloss": "Pérdida de paquetes:",
"quality": {
"good": "Bueno",
@@ -124,6 +140,10 @@
"descriptionWithoutWeb": "¿No pasó nada? Intentamos iniciar su reunión en la aplicación de escritorio {{app}}.",
"downloadApp": "Descargar la app",
"launchWebButton": "Iniciar en web",
"ifDoNotHaveApp": "Si aún no tienes la app:",
"ifHaveApp": "Si ya tienes la app:",
"joinInApp": "Unirse a la reunion usando la app",
"launchWebButton": "Iniciar en la Web",
"openApp": "Continuar a la aplicación",
"title": "Iniciar su reunión en {{app}}…",
"tryAgainButton": "Intentar de nuevo en el escritorio"
@@ -175,6 +195,8 @@
"dismiss": "Descartar",
"displayNameRequired": "¡Hola! ¿Cuál es tu nombre?",
"done": "Listo",
"e2eeDescription": "El cifrado Extremo-a-Extremo es actualmente EXPERIMENTAL. Tenga en cuenta que activar el cifrado extremo-a-extremo puede deshabilitar servicios en el servidor como: grabación, transmisión en vivo y participación telefónica. Sin embargo tenga en cuenta que esta reunion solo funcionará con personas que se unan usando un navegador.",
"e2eeWarning": "ATENCION: No todos los participantes de esta reunión soportan cifrado Extremo-a-Extremo. Si usted habilita el cifrado ellos no podrán verlo ni oirlo.",
"enterDisplayName": "Por favor ingresa tu nombre aquí",
"error": "Error",
"externalInstallationMsg": "Necesita instalar nuestra extensión para compartir escritorio.",
@@ -244,6 +266,7 @@
"reservationError": "Error del sistema de reservación",
"reservationErrorMsg": "Código de error: {{code}}, message: {{msg}}",
"retry": "Reintentar",
"screenSharingAudio": "Compartir audio",
"screenSharingFailedToInstall": "Oops! Su extensión de uso compartido de pantalla no se pudo instalar.",
"screenSharingFailedToInstallTitle": "La extensión para compartir la pantalla no se pudo instalar",
"screenSharingFirefoxPermissionDeniedError": "Algo salió mal mientras tratábamos de compartir la pantalla. Por favor, asegúrese de que nos ha dado permiso para hacerlo. ",
@@ -290,6 +313,9 @@
"documentSharing": {
"title": "Compartir documento"
},
"e2ee": {
"labelToolTip": "La comunicación de Audio y Video en esta reunión está cifrada Extremo-a-Extremo"
},
"feedback": {
"average": "Promedio",
"bad": "Malo",
@@ -458,11 +484,49 @@
"unmute": "Dejar de silenciar",
"newDeviceCameraTitle": "Se ha detectado una nueva cámara",
"newDeviceAudioTitle": "Se ha detectado un nuevo dispositivo de audio",
"newDeviceAction": "Usar"
"newDeviceAction": "Usar",
"OldElectronAPPTitle": "Vulnerabilidades de Seguridad!",
"oldElectronClientDescription1": "Aparentemente usted está usuado una versión antigua de Jitsi Meet que tiene problemas de seguridad. Por favor actualice la versión con nuestra ",
"oldElectronClientDescription2": "ultima versión",
"oldElectronClientDescription3": " ahora!"
},
"passwordSetRemotely": "definida por otro participante",
"passwordDigitsOnly": "Hasta {{number]] cifras",
"poweredby": "con tecnología de",
"prejoin": {
"audioAndVideoError": "Error en Audio y video:",
"audioOnlyError": "Error en Audio:",
"audioTrackError": "No se pured crear la pista de Audio.",
"callMe": "Llámame",
"callMeAtNumber": "Llamame a este número:",
"configuringDevices": "Configurando dispositivos...",
"connectedWithAudioQ": "Usted está conectado con Audio?",
"copyAndShare": "Cipie y comparta el link de la reuinión",
"dialInMeeting": "Marcar a la reunión",
"dialInPin": "Marcar a la reunión e ingresarel código PIN:",
"dialing": "Marcando",
"doNotShow": "No mostrar nuevamente",
"errorDialOut": "Could not dial out",
"errorDialOutDisconnected": "Could not dial out. Disconnected",
"errorDialOutFailed": "Could not dial out. Call failed",
"errorDialOutStatus": "Error getting dial out status",
"errorStatusCode": "Error dialing out, status code: {{status}}",
"errorValidation": "Number validation failed",
"iWantToDialIn": "I want to dial in",
"joinAudioByPhone": "Join with phone audio",
"joinMeeting": "Join meeting",
"joinWithoutAudio": "Join without audio",
"initiated": "Call initiated",
"linkCopied": "Link copied to clipboard",
"lookGood": "It sounds like your microphone is working properly",
"or": "or",
"calling": "Calling",
"startWithPhone": "Start with phone audio",
"screenSharingError": "Screen sharing error:",
"videoOnlyError": "Video error:",
"videoTrackError": "Could not create video track.",
"viewAllNumbers": "view all numbers"
},
"passwordSetRemotely": "definido por otro participante",
"passwordDigitsOnly": "Hasta {{number}} dígitos",
"poweredby": "proporcionado por",
"presenceStatus": {
"busy": "Ocupado",
"calling": "Llamando…",
@@ -514,6 +578,11 @@
"sectionList": {
"pullToRefresh": "Actualizar"
},
"security": {
"about": "Usted puede agregar una contraseña a la reunión. Los participantes necesitaran la contraseña para unirse a la reunión.",
"insecureRoomNameWarning": "El nombre de la sala es inseguro. Participantes no deseados pueden llegar a unirse a la reunión.",
"securityOptions": "Opciones de seguridad"
},
"settings": {
"calendar": {
"about": "La integración del calendario {{appName}} se utiliza para acceder de forma segura a su calendario para que pueda leer los próximos eventos.",
@@ -526,6 +595,7 @@
"followMe": "Todos me siguen",
"language": "Idioma",
"loggedIn": "Sesión iniciada como {{name}}",
"microphones": "Micrófono",
"moderator": "Moderador",
"more": "Más",
"name": "Nombre",
@@ -540,6 +610,7 @@
"settingsView": {
"advanced": "Avanzado",
"alertOk": "OK",
"alertCancel": "Cancelar",
"alertTitle": "Aviso",
"alertURLText": "La dirección URL del servidor no es válida",
"buildInfoSection": "Información de la compilación",
@@ -549,6 +620,8 @@
"displayName": "Nombre a mostrar",
"email": "Email",
"header": "Ajustes",
"email": "Correo electrónico",
"header": "Configuración",
"profileSection": "Perfil",
"serverURL": "URL del servidor",
"showAdvanced": "Mostrar configuración avanzada",
@@ -587,6 +660,7 @@
"chat": "Alternar ventana de chat",
"document": "Alternar documento compartido",
"download": "Descarga nuestras aplicaciones",
"e2ee": "Cifrado Extremo-a-Extremo",
"feedback": "Dejar comentarios",
"fullScreen": "Alternar pantalla completa",
"hangup": "Dejar la llamada",
@@ -604,6 +678,7 @@
"raiseHand": "Levantar / Bajar tu mano",
"recording": "Activar grabación",
"remoteMute": "Silenciar participante",
"security": "Opciones de seguridad",
"Settings": "Alternar configuración",
"sharedvideo": "Alternar compartir un vídeo de YouTube",
"shareRoom": "Invitar a alguien",
@@ -613,6 +688,7 @@
"speakerStats": "Alternar estadísticas del orador",
"tileView": "Alternar vista de mosaico",
"toggleCamera": "Alternar cámara",
"toggleFilmstrip": "Alternar mosaicos",
"videomute": "Alternar silencio de video",
"videoblur": "Alternar desenfoque de video"
},
@@ -627,6 +703,7 @@
"documentClose": "Cerrar documento compartido",
"documentOpen": "Abrir documento compartido",
"download": "Descarga nuestras aplicaciones",
"e2ee": "Cifrado Extremo-a-Extremo",
"enterFullScreen": "Ver pantalla completa",
"enterTileView": "Entrar en vista de mosaico",
"exitFullScreen": "Salir de pantalla completa",
@@ -645,14 +722,17 @@
"noAudioSignalTitle": "¡No hay entrada proveniente de su micrófono!",
"noAudioSignalDesc": "Si no lo silenció a propósito desde la configuración del sistema o el dispositivo, considere cambiar el dispositivo.",
"noAudioSignalDescSuggestion": "Si no lo silenció a propósito desde la configuración del sistema o el dispositivo, considere usar el siguiente dispositivo:",
"noisyAudioInputTitle": "",
"noisyAudioInputDesc": "",
"noAudioSignalDialInDesc": "Usted puede además llamar usando:",
"noAudioSignalDialInLinkDesc": "Números de llamada",
"noisyAudioInputTitle": "Su micrófono parece estar ruidoso",
"noisyAudioInputDesc": "Parece que su micráfono está haciendo ruido, por favor considere silenciarlo o cambiar de dispositivo.",
"openChat": "Abrir chat",
"pip": "Entra en el modo Picture-in-Picture",
"privateMessage": "Enviar mensaje privado",
"profile": "Editar tu perfil",
"raiseHand": "Levantar / Bajar tu mano",
"raiseYourHand": "Alzar la mano",
"security": "Opciones de seguridad",
"Settings": "Ajustes",
"sharedvideo": "Compartir un vídeo de YouTube",
"shareRoom": "Invitar a alguien",
@@ -748,6 +828,7 @@
"connectCalendarButton": "Conecte su calendario",
"connectCalendarText": "Conecte su calendario para ver todas sus reuniones en {{app}}. Plus, add {{provider}}reuniones a tu calendario e iniciarlas con un solo clic.",
"enterRoomTitle": "Comenzar una reunión",
"getHelp": "Obtener ayuda",
"roomNameAllowedChars": "El nombre de la reunión no debe contener ninguno de estos caracteres: ?, &, :, ', \", %, #.",
"go": "IR",
"goSmall": "IR",
@@ -767,5 +848,8 @@
"lonelyMeetingExperience": {
"button": "Invitar a otros",
"youAreAlone": "Eres el único en la reunión"
},
"helpView": {
"header": "Centro de ayuda"
}
}

View File

@@ -1,21 +1,36 @@
{
"addPeople": {
"add": "Invitar",
"addContacts": "Invitar a sus contactos",
"copyInvite": "Copiar la invitación a la reunión",
"copyLink": "Copiar el link de la reunión",
"copyStream": "Copiar el link de la transmisión en vivo",
"countryNotSupported": "Aun no contamos con soporte a este destino.",
"countryReminder": "¿Llamando fuera de los Estados Unidos? ¡Por favor, asegúrese de empezar con el código de país!",
"defaultEmail": "Dirección de correo por defecto",
"disabled": "No puede invitar a otras personas.",
"failedToAdd": "Error al agregar participantes",
"footerText": "La marcación está desactivada.",
"loading": "Buscar personas y números de teléfono",
"loadingNumber": "Validando el número de teléfono",
"loadingPeople": "Buscando contactos a invitar",
"googleEmail": "Correo electrónico de Google",
"inviteMoreHeader": "Usted se encuentra solo en la reunión",
"inviteMoreMailSubject": "Unirse a la reunion {{appName}}",
"inviteMorePrompt": "Invitar a más personas",
"linkCopied": "Link copiado al portapapeles",
"loading": "Buscando por contacto y número telefónico",
"loadingNumber": "Validando el número telefónico",
"loadingPeople": "Buscando contactos a invitar",
"noResults": "No se encontraron coincidencias",
"noValidNumbers": "Por favor ingrese un número de teléfono",
"outlookEmail": "Correo de Outlook",
"searchNumbers": "Agregar números telefónicos",
"searchPeople": "Búsqueda de personas",
"searchPeople": "Buscar personas",
"searchPeopleAndNumbers": "Buscar personas o añadir sus números de teléfono",
"shareInvite": "Compartir la invitación a la reunión",
"shareLink": "Compartir el link de la reunion",
"shareStream": "Compartie el link de la transmición en vivo",
"telephone": "Teléfono: {{number}}",
"title": "Invitar a otras personas a esta reunión"
"title": "Invitar a otras personas a esta reunión",
"yahooEmail": "Correo de Yahoo"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -89,6 +104,7 @@
"bitrate": "Tasa de transferencia:",
"bridgeCount": "Contador del servidor: ",
"connectedTo": "Conectado a:",
"e2e_rtt": "E2E RTT:",
"framerate": "Fotogramas por segundo:",
"less": "Mostrar menos",
"localaddress": "Dirección local:",
@@ -123,6 +139,9 @@
"description": "¿No pasó nada? Hemos intentado iniciar su reunión en la aplicación {{app}} de escritorio. intente de nuevo o inicie en la aplicación {{app}} vía web.",
"descriptionWithoutWeb": "¿No pasó nada? Intentamos iniciar su reunión en la aplicación {{app}} de escritorio.",
"downloadApp": "Descargar la aplicación",
"ifDoNotHaveApp": "Si aún no tienes la app:",
"ifHaveApp": "Si ya tienes la app:",
"joinInApp": "Unirse a la reunion usando la app",
"launchWebButton": "Iniciar en la Web",
"openApp": "Continuar a la aplicación",
"title": "Iniciando la reunión en {{app}}…",
@@ -175,6 +194,8 @@
"dismiss": "Descartar",
"displayNameRequired": "¡Hola! ¿Cuál es tu nombre?",
"done": "Listo",
"e2eeDescription": "El cifrado Extremo-a-Extremo es actualmente EXPERIMENTAL. Tenga en cuenta que activar el cifrado extremo-a-extremo puede deshabilitar servicios en el servidor como: grabación, transmisión en vivo y participación telefónica. Sin embargo tenga en cuenta que esta reunion solo funcionará con personas que se unan usando un navegador.",
"e2eeWarning": "ATENCION: No todos los participantes de esta reunión soportan cifrado Extremo-a-Extremo. Si usted habilita el cifrado ellos no podrán verlo ni oirlo.",
"enterDisplayName": "Por favor ingresa tu nombre aquí",
"error": "Error",
"externalInstallationMsg": "Necesita instalar nuestra extensión para compartir escritorio.",
@@ -244,6 +265,7 @@
"reservationError": "Error del sistema de reservaciones",
"reservationErrorMsg": "Código de error: {{code}}, mensaje: {{msg}}",
"retry": "Volver a intentar",
"screenSharingAudio": "Compartir audio",
"screenSharingFailedToInstall": "¡Uy! La extensión de uso compartido de pantalla no se pudo instalar.",
"screenSharingFailedToInstallTitle": "La extensión de uso compartido de pantalla no se pudo instalar",
"screenSharingFirefoxPermissionDeniedError": "Algo salió mal cuando intentamos compartir su pantalla. Asegúrese de habernos dado permiso para hacerlo.",
@@ -289,6 +311,9 @@
"documentSharing": {
"title": "Documento Compartido"
},
"e2ee": {
"labelToolTip": "La comunicación de Audio y Video en esta reunión está cifrada Extremo-a-Extremo"
},
"feedback": {
"average": "Promedio",
"bad": "Malo",
@@ -457,11 +482,49 @@
"unmute": "Reactivar el sonido",
"newDeviceCameraTitle": "Se detectó una cámara nueva",
"newDeviceAudioTitle": "Se detectó un dispositivo de audio nuevo",
"newDeviceAction": "Usar"
"newDeviceAction": "Usar",
"OldElectronAPPTitle": "Vulnerabilidades de Seguridad!",
"oldElectronClientDescription1": "Aparentemente usted está usuado una versión antigua de Jitsi Meet que tiene problemas de seguridad. Por favor actualice la versión con nuestra ",
"oldElectronClientDescription2": "ultima versión",
"oldElectronClientDescription3": " ahora!"
},
"passwordSetRemotely": "definida por otro participante",
"passwordDigitsOnly": "Hasta {{number]] cifras",
"poweredby": "con tecnología de",
"prejoin": {
"audioAndVideoError": "Error en Audio y video:",
"audioOnlyError": "Error en Audio:",
"audioTrackError": "No se pured crear la pista de Audio.",
"callMe": "Llámame",
"callMeAtNumber": "Llamame a este número:",
"configuringDevices": "Configurando dispositivos...",
"connectedWithAudioQ": "Usted está conectado con Audio?",
"copyAndShare": "Cipie y comparta el link de la reuinión",
"dialInMeeting": "Marcar a la reunión",
"dialInPin": "Marcar a la reunión e ingresarel código PIN:",
"dialing": "Marcando",
"doNotShow": "No mostrar nuevamente",
"errorDialOut": "Could not dial out",
"errorDialOutDisconnected": "Could not dial out. Disconnected",
"errorDialOutFailed": "Could not dial out. Call failed",
"errorDialOutStatus": "Error getting dial out status",
"errorStatusCode": "Error dialing out, status code: {{status}}",
"errorValidation": "Number validation failed",
"iWantToDialIn": "I want to dial in",
"joinAudioByPhone": "Join with phone audio",
"joinMeeting": "Join meeting",
"joinWithoutAudio": "Join without audio",
"initiated": "Call initiated",
"linkCopied": "Link copied to clipboard",
"lookGood": "It sounds like your microphone is working properly",
"or": "or",
"calling": "Calling",
"startWithPhone": "Start with phone audio",
"screenSharingError": "Screen sharing error:",
"videoOnlyError": "Video error:",
"videoTrackError": "Could not create video track.",
"viewAllNumbers": "view all numbers"
},
"presenceStatus": {
"busy": "Ocupado",
"calling": "Llamando…",
@@ -513,6 +576,11 @@
"sectionList": {
"pullToRefresh": "Tirar para actualizar"
},
"security": {
"about": "Usted puede agregar una contraseña a la reunión. Los participantes necesitaran la contraseña para unirse a la reunión.",
"insecureRoomNameWarning": "El nombre de la sala es inseguro. Participantes no deseados pueden llegar a unirse a la reunión.",
"securityOptions": "Opciones de seguridad"
},
"settings": {
"calendar": {
"about": "La integración del calendario de {{appName}} se usa para acceder al calendario de manera segura para que puedas leer los próximos eventos.",
@@ -525,6 +593,7 @@
"followMe": "Todos me siguen",
"language": "Idioma",
"loggedIn": "Sesión iniciada como {{name}}",
"microphones": "Micrófono",
"moderator": "Moderador",
"more": "Más",
"name": "Nombre",
@@ -532,6 +601,7 @@
"selectAudioOutput": "Salida de audio",
"selectCamera": "Cámara",
"selectMic": "Micrófono",
"speakers": "Altavoces",
"startAudioMuted": "Todos comienzan con silenciados",
"startVideoMuted": "Todos comienzan con cámara desactivada",
"title": "Configuración"
@@ -539,12 +609,15 @@
"settingsView": {
"advanced": "Avanzado",
"alertOk": "Aceptar",
"alertCancel": "Cancelar",
"alertTitle": "Advertencia",
"alertURLText": "La dirección URL de servidor introducida no es válida",
"buildInfoSection": "Información de compilación",
"conferenceSection": "Conferencia",
"disableCallIntegration": "Desactivar la integración nativa de llamadas",
"disableP2P": "Desactiver el modo \"Peer-To-Peer\"",
"disableP2P": "Desactivar el modo \"Peer-To-Peer\"",
"disableCrashReporting": "Disable crash reporting",
"disableCrashReportingWarning": "Are you sure you want to disable crash reporting? The setting will be applied after you restart the app.",
"displayName": "Nombre para mostrar",
"email": "Correo electrónico",
"header": "Configuración",
@@ -586,6 +659,7 @@
"chat": "Alternar ventana de chat",
"document": "Alternar documento compartido",
"download": "Descargar nuestras aplicaciones",
"e2ee": "Cifrado Extremo-a-Extremo",
"feedback": "Dejar comentario",
"fullScreen": "Alternar pantalla completa",
"hangup": "Dejar la llamada",
@@ -605,6 +679,7 @@
"raiseHand": "Alternar levantar la mano",
"recording": "Alternar grabación",
"remoteMute": "Silenciar participante",
"security": "Opciones de seguridad",
"Settings": "Alternar configuración",
"sharedvideo": "Alternar uso compartido de video de YouTube",
"shareRoom": "Invitar a alguien",
@@ -614,6 +689,7 @@
"speakerStats": "Alternar estadísticas del altavoz",
"tileView": "Alternar vista de mosaico",
"toggleCamera": "Alternar cámara",
"toggleFilmstrip": "Alternar mosaicos",
"videomute": "Alternar silenciar video",
"videoblur": "Cambiar el desenfoque del fondo"
},
@@ -628,6 +704,7 @@
"documentClose": "Cerrar documento compartido",
"documentOpen": "Abrir documento compartido",
"download": "Descargar nuestras aplicaciones",
"e2ee": "Cifrado Extremo-a-Extremo",
"enterFullScreen": "Ver pantalla completa",
"enterTileView": "Introducir vista de mosaico",
"exitFullScreen": "Salir de pantalla completa",
@@ -656,6 +733,7 @@
"profile": "Editar el perfil",
"raiseHand": "Levantar/bajar la mano",
"raiseYourHand": "Levantar la mano",
"security": "Opciones de seguridad",
"Settings": "Configuración",
"sharedvideo": "Compartir un video de YouTube",
"shareRoom": "Invitar a alguien",
@@ -751,6 +829,7 @@
"connectCalendarButton": "Conectar el calendario",
"connectCalendarText": "Conecte su calendario para ver todas sus reuniones en {{app}}. Además, agregue reuniones {{provider}} a su calendario e inícielas con un solo clic.",
"enterRoomTitle": "Iniciar una nueva reunión",
"getHelp": "Obtener ayuda",
"roomNameAllowedChars": "El nombre de la reunión no debe contener ninguno de estos caracteres: ?, &, :, ', \", %, #.",
"go": "IR",
"goSmall": "IR",
@@ -766,5 +845,12 @@
"sendFeedback": "Enviar comentario",
"terms": "Términos",
"title": "Conferencias en video seguras, con gran variedad de funciones y completamente gratuitas"
},
"lonelyMeetingExperience": {
"button": "Invitar a otros",
"youAreAlone": "Usted está solo en la reunión"
},
"helpView": {
"header": "Centro de ayuda"
}
}

View File

@@ -175,9 +175,6 @@
"dismiss": "Baztertu",
"displayNameRequired": "Kaixo! Zein da zure izena?",
"done": "Eginda",
"e2eeDescription": "",
"e2eeLabel": "",
"e2eeTitle": "",
"e2eeWarning": "",
"enterDisplayName": "Sartu zure izena hemen",
"error": "Errorea",

View File

@@ -1,21 +1,36 @@
{
"addPeople": {
"add": "Inviter",
"countryNotSupported": "Nous ne supportons pas encore cette destination.",
"countryReminder": "Appel hors des États-Unis ? Veuillez commencer avec le code du pays !",
"addContacts": "Inviter vos contacts",
"copyInvite": "Copier l'invitation à la réunion",
"copyLink": "Copier le lien de la réunion",
"copyStream": "Copier le lien de diffision en direct",
"countryNotSupported": "Cette destination n'est pas actuellement supportée.",
"countryReminder": "Appel hors des États-Unis ? Veuillez débuter par le code du pays !",
"defaultEmail": "Votre email par défaut",
"disabled": "Vous ne pouvez pas inviter quelqu'un.",
"failedToAdd": "Erreur lors de l'ajout des participants",
"footerText": "Appels sortants désactivés.",
"googleEmail": "Gmail",
"inviteMoreHeader": "Vous êtes seul(e) dans la réunion",
"inviteMoreMailSubject": "Rejoindre une réunion {{appName}}",
"inviteMorePrompt": "Inviter d'autres personnes",
"linkCopied": "Lien copié dans le presse-papiers",
"loading": "Rechercher des personnes et des numéros de téléphone",
"loadingNumber": "Validation du numéro de téléphone",
"loadingPeople": "Recherche de personnes à inviter",
"noResults": "Aucun résultat de recherche correspondant",
"noValidNumbers": "Veuillez entrer un numéro de téléphone",
"outlookEmail": "Outlook",
"searchNumbers": "Ajouter des numéros de téléphone",
"searchPeople": "Rechercher une personne",
"searchPeopleAndNumbers": "Rechercher des personnes ou ajouter leurs numéros de téléphone",
"shareInvite": "Partager l'invitation à la réunion",
"shareLink": "Partager le lien de la réunion pour inviter d'autres personnes",
"shareStream": "Partager le lien de diffusion en direct",
"telephone": "Téléphone : {{number}}",
"title": "Inviter une personne à cette réunion"
"title": "Inviter une personne à cette réunion",
"yahooEmail": "Yahoo"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -33,7 +48,7 @@
"error": {
"appConfiguration": "L'intégration du calendrier n'est pas correctement configurée.",
"generic": "Une erreur s'est produite. Veuillez vérifier les paramètres de votre calendrier ou tenter de l'actualiser.",
"notSignedIn": "Une erreur s'est produite lors de l'authentification permettant d'afficher les événements du calendrier. Veuillez vérifier les paramètres de votre calendrier et essayer de vous reconnecter."
"notSignedIn": "Une erreur d'authentification s'est produite lors de la tentative d'afficher les événements du calendrier. Veuillez vérifier les paramètres de votre calendrier et essayer de nouveau."
},
"join": "Joindre",
"joinTooltip": "Rejoindre la réunion",
@@ -81,7 +96,7 @@
"FETCH_SESSION_ID": "Obtention dun identifiant de session…",
"GET_SESSION_ID_ERROR": "Obtenir une erreur didentifiant de session : {{code}}",
"GOT_SESSION_ID": "Obtention dun identifiant de session… Terminée",
"LOW_BANDWIDTH": "La vidéo de {{displayName}} a été désactivée pour économiser de la ba de passante"
"LOW_BANDWIDTH": "La vidéo de {{displayName}} a été désactivée pour économiser de la bande passante"
},
"connectionindicator": {
"address": "Adresse :",
@@ -147,6 +162,7 @@
"accessibilityLabel": {
"liveStreaming": "Diffusion en direct"
},
"add": "Ajouter",
"allow": "Autoriser",
"alreadySharedVideoMsg": "Un autre participant est en train de partager sa vidéo. Cette conférence ne permet de partager qu'une seule vidéo à la fois.",
"alreadySharedVideoTitle": "Une seule vidéo partagée est autorisée à la fois",
@@ -156,7 +172,7 @@
"cameraNotFoundError": "La caméra n'a pas été trouvée.",
"cameraNotSendingData": "Nous sommes incapables d'accéder à votre caméra. Veuillez sélectionner un autre périphérique dans les paramètres ou rafraîchir la page.",
"cameraNotSendingDataTitle": "Impossible d'accéder à votre caméra",
"cameraPermissionDeniedError": "Vous n'avez pas autorisé l'utilisation de votre caméra. Vous pouvez toujours participer à la conférence, mais les autres ne vont pas vous voir. Utilisez le bouton de la caméra dans la barre d'adresse pour résoudre ce problème.",
"cameraPermissionDeniedError": "Vous n'avez pas autorisé l'utilisation de votre caméra. Vous pouvez toujours participer à la conférence, mais les autres ne pourront pas vous voir. Utilisez le bouton de la caméra dans la barre d'adresse pour résoudre ce problème.",
"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.",
"Cancel": "Annuler",
@@ -174,10 +190,12 @@
"contactSupport": "Contacter le support",
"copy": "Copier",
"dismiss": "Rejeter",
"displayNameRequired": "Salut! Quel est votre nom ?",
"displayNameRequired": "Bonjour! Quel est votre nom ?",
"done": "Terminé",
"enterDisplayName": "Merci de saisir votre nom ici",
"error": "Erreur",
"grantModeratorDialog": "Êtes vous sûr de vouloir rendre ce participant modérateur?",
"grantModeratorTitle": "Nommer modérateur",
"externalInstallationMsg": "Vous devez installer notre extension de partage de bureau.",
"externalInstallationTitle": "Extension requise",
"goToStore": "Aller sur le webstore",
@@ -304,7 +322,7 @@
"answer": "Répondre",
"audioCallTitle": "Appel entrant",
"decline": "Rejeter",
"productLabel": "de Jitsi Meet",
"productLabel": "via Jitsi Meet",
"videoCallTitle": "Appel vidéo entrant"
},
"info": {
@@ -327,8 +345,8 @@
"inviteURLFirstPartPersonal": "{{name}} vous invite à une réunion.\n",
"inviteURLSecondPart": "\nRejoindre la réunion:\n{{url}}\n",
"liveStreamURL": "Diffusion en direct :",
"moreNumbers": "Plus de numéros",
"noNumbers": "Aucun numéro à composer.",
"moreNumbers": "Plus de numéros ",
"noNumbers": "Numéros non trouvés",
"noPassword": "Aucun",
"noRoom": "Aucune réunion n'a été spécifiée pour l'appel entrant.",
"numbers": "Numéros d'appel",
@@ -349,7 +367,7 @@
"msg": "Nous avons trébuché un peu.",
"retry": "Réessayer",
"support": "Support",
"supportMsg": "Si cela continue, prenez contact avec"
"supportMsg": "Si ceci persiste, contactez"
},
"keyboardShortcuts": {
"focusLocal": "Épingler ma vidéo",
@@ -369,11 +387,13 @@
"videoQuality": "Accorder la qualité des appels"
},
"liveStreaming": {
"busy": "Nous travaillons sur la libération des ressources de Streaming. Veuillez réessayez dans quelques minutes.",
"busyTitle": "Tous les streamers sont actuellement occupés",
"busy": "Nous tentons de libérer des ressources de diffusion. Veuillez réessayez dans quelques minutes.",
"busyTitle": "Tous les flux sont actuellement occupés",
"changeSignIn": "Changer de compte.",
"choose": "Choisir un flux live",
"choose": "Choisir un flux en direct",
"chooseCTA": "Choisissez une option de diffusion. Vous êtes actuellement connecté comme {{email}}.",
"enterStreamKey": "Entrez votre clé de diffusion Youtube ici",
"error": "La diffusion a échouée. Veuillez réessayer ultérieurement.",
"enterStreamKey": "Entrez votre clé de flux direct YouTube ici.",
"error": "Le Streaming a échoué. Veuillez réessayer.",
"errorAPI": "Une erreur s'est produite lors de l'accès à vos diffusions YouTube. Veuillez réessayer de vous connecter.",
@@ -381,7 +401,7 @@
"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é...",
"failedToStart": "Le Streaming n'as pas réussi à démarrer",
"failedToStart": "La diffusion n'as pas réussi à démarrer",
"getStreamKeyManually": "Nous n'avons pu récupérer aucun flux en direct. Essayez dobtenir votre clé de diffusion en direct sur YouTube.",
"invalidStreamKey": "La clé de diffusion en direct n'est peut-être pas correcte.",
"off": "Le Streaming a été arrêté",
@@ -392,12 +412,12 @@
"serviceName": "Service de diffusion en direct",
"signedInAs": "Vous êtes connecté en tant que :",
"signIn": "Se connecter avec Google",
"signInCTA": "Connectez vous ou entrez votre clé de flux live provenant de Youtube.",
"signInCTA": "Connectez vous ou saisissez votre clé de diffusion Youtube.",
"signOut": "Se déconnecter",
"start": "Démarrer la diffusion en direct",
"streamIdHelp": "Qu'est-ce que c'est?",
"unavailableTitle": "Le Streaming est indisponible",
"youtubeTerms": "Conditions dutilisation des services YouTube",
"streamIdHelp": "Qu'est-ce que c'est ?",
"unavailableTitle": "La diffusion est indisponible",
"youtubeTerms": "Conditions dutilisation de YouTube",
"googlePrivacyPolicy": "Politique de confidentialité de Google"
},
"localRecording": {
@@ -466,6 +486,40 @@
"passwordSetRemotely": "défini par un autre participant",
"passwordDigitsOnly": "Jusqu'à {{number}} chiffres",
"poweredby": "produit par",
"prejoin": {
"audioAndVideoError": "Erreur audio et video:",
"audioOnlyError": "Erreur audio:",
"audioTrackError": "N'a pas pu créer la piste audio.",
"callMe": "Appelez-moi",
"callMeAtNumber": "Appelez-moi à ce numéro:",
"configuringDevices": "Configuration des appareils...",
"connectedWithAudioQ": "Êtes-vous connecté avec le microphone?",
"copyAndShare": "Copier & partager le lien",
"dialInMeeting": "Participez à la réunion",
"dialInPin": "Participez à la réunion et saisir le code PIN:",
"dialing": "Numérotation",
"doNotShow": "Ne plus afficher ceci",
"errorDialOut": "Impossible de composer le numéro",
"errorDialOutDisconnected": "Impossible de composer le numéro. Déconnecté",
"errorDialOutFailed": "Impossible de composer le numéro. L'appel a échoué",
"errorDialOutStatus": "Erreur lors de l'obtention de l'état d'appel sortant",
"errorStatusCode": "Erreur de numérotation, code d'état: {{status}}",
"errorValidation": "La validation du numéro a échoué",
"iWantToDialIn": "Je veux me connecter",
"joinAudioByPhone": "Rejoindre avec l'audio du téléphone",
"joinMeeting": "Rejoindre la réunion",
"joinWithoutAudio": "Rejoignez sans microphone",
"initiated": "Appel lancé",
"linkCopied": "Lien copié dans le presse-papiers",
"lookGood": "Il semble que votre microphone fonctionne correctement",
"or": "ou",
"calling": "Appel",
"startWithPhone": "Commencez avec l'audio du téléphone",
"screenSharingError": "Erreur de partage d'écran:",
"videoOnlyError": "Erreur vidéo:",
"videoTrackError": "Impossible de créer une piste vidéo.",
"viewAllNumbers": "voir tous les numéros"
},
"presenceStatus": {
"busy": "Occupé",
"calling": "Appel...",
@@ -511,7 +565,7 @@
"serviceName": "Service d'enregistrement",
"signIn": "Se connecter",
"signOut": "Se déconnecter",
"unavailable": "Oups! Le {{serviceName}} est actuellement indisponible. Nous travaillons sur la résolution du problème. Veuillez réessayer plus tard.",
"unavailable": "Oups! Le {{serviceName}} est actuellement indisponible. Nous tentons de résoudre le problème. Veuillez réessayer plus tard.",
"unavailableTitle": "Enregistrement indisponible"
},
"sectionList": {
@@ -648,13 +702,13 @@
"lowerYourHand": "Baisser la main",
"moreActions": "Plus d'actions",
"moreOptions": "Plus d'options",
"mute": "Activer / Désactiver le micro",
"muteEveryone": "Couper le micro de tout le monde",
"noAudioSignalTitle": "Il n'y a pas d'entrée provenant de votre micro !",
"noAudioSignalDesc": "Si vous n'avez pas délibérément coupé le son des paramètres du système ou du matériel, envisagez de changer le périphérique.",
"noAudioSignalDescSuggestion": "Si vous n'avez pas délibérément coupé le son des paramètres du système ou du matériel, pensez à utiliser le périphérique suivant.",
"mute": "Muet / Actif",
"muteEveryone": "Couper le micro à tout le monde",
"noAudioSignalTitle": "Il n'y a pas de signal provenant de votre micro !",
"noAudioSignalDesc": "Si vous n'avez pas délibérément coupé le son des paramètres du système ou du matériel, envisagez de changer de périphérique utilisé.",
"noAudioSignalDescSuggestion": "Si vous n'avez pas délibérément coupé le son des paramètres du système ou du matériel, pensez à utiliser le périphérique suivant :",
"noisyAudioInputTitle": "Votre microphone semble être bruyant !",
"noisyAudioInputDesc": "Il semble que votre microphone fasse du bruit, pensez à le mettre en sourdine ou à changer d'appareil.",
"noisyAudioInputDesc": "Il semble que votre microphone fasse du bruit, veuillez le couper ou changer de périphérique.",
"openChat": "Ouvrir le chat",
"pip": "Entrer en mode Picture-in-Picture",
"privateMessage": "Envoyer un message privé",
@@ -677,7 +731,6 @@
"videomute": "Démarrer / Arrêter la caméra",
"startvideoblur": "Flouter mon arrière plan",
"stopvideoblur": "Désactiver le flou d'arrière-plan",
"muteEveryone": "Mettre tout le monde en sourdine",
"noAudioSignalDialInDesc": "Vous pouvez également composer un numéro en utilisant :",
"noAudioSignalDialInLinkDesc": "Numéros d'appel"
},
@@ -694,23 +747,23 @@
"tr": "TR"
},
"userMedia": {
"androidGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande des autorisations.",
"chromeGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande des autorisations.",
"edgeGrantPermissions": "Sélectionnez <b><i>Oui</i></b> quand le navigateur demande les permissions.",
"electronGrantPermissions": "Merci d'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 des autorisations.",
"iexplorerGrantPermissions": "Sélectionnez <b><i>OK</i></b> quand le navigateur demande les permissions.",
"nwjsGrantPermissions": "Merci d'autoriser le partage de votre camera et microphone",
"operaGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande des autorisations.",
"react-nativeGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande des autorisations.",
"safariGrantPermissions": "Sélectionnez <b><i>OK</i></b> quand le navigateur demande les permissions."
"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 travaillons sur la libération des ressources. Veuillez réessayez dans quelques minutes.",
"busy": "Nous tentons de libérer les ressources requises. Veuillez réessayez dans quelques minutes.",
"busyTitle": "Le service du Salon est actuellement occupé",
"errorAlreadyInvited": "{{displayName}} est déjà invité(e)",
"errorInvite": "La conférence n'est pas encore établie. Veuillez réessayer plus tard.",
"errorInviteFailed": "Nous travaillons sur la résolution du problème. Veuillez réessayer plus tard.",
"errorInviteFailed": "Nous tentons de résoudre le problème. Veuillez réessayer plus tard.",
"errorInviteFailedTitle": "l'invitation de {{displayName}} a échoué",
"errorInviteTitle": "Erreur lors de l'invitation",
"pending": "{{displayName}} a été invité(e)"
@@ -737,6 +790,7 @@
"domute": "Couper le micro",
"domuteOthers": "Couper le micro de tous les autres",
"flip": "Balancer",
"grantModerator": "Nommer modérateur",
"kick": "Exclure",
"moderator": "Modérateur",
"mute": "Un participant a coupé son micro",
@@ -750,7 +804,7 @@
"join": "Touchez pour rejoindre",
"roomname": "Saisissez un nom de salle"
},
"appDescription": "Allez-y, chat vidéo avec toute l'équipe. En fait, invitez tout le monde que vous connaissez. {{app}} est une solution de visioconférence entièrement chiffrée et 100% open source que vous pouvez utiliser toute la journée, tous les jours, gratuitement— aucun compte requis.",
"appDescription": "Foncez tchater en vidéo avec toute le monde. En fait, vous pouvez inviter tout ceux que vous connaissez. {{app}} est une solution de visioconférence entièrement chiffrée et 100% libre que vous pouvez utiliser en permanence, chaque jours, et sans aucun compte requis.",
"audioVideoSwitch": {
"audio": "Voix",
"video": "Vidéo"
@@ -773,7 +827,7 @@
"roomnameHint": "Entrez le nom ou l'URL de la salle que vous souhaitez rejoindre. Vous pouvez faire un nom, laissez les gens que vous rencontrerez le savoir afin qu'ils entrent le même nom.",
"sendFeedback": "Envoyer votre avis",
"terms": "Termes",
"title": "Vidéoconférence Sécurisée, entièrement en vedette et gratuite",
"title": "Système de vidéoconférence sécurisé, riche en fonctionnalités et gratuit",
"getHelp": "Obtenir de l'aide"
},
"lonelyMeetingExperience": {
@@ -782,5 +836,39 @@
},
"helpView": {
"header": "Centre d'aide"
},
"lobby": {
"knockingParticipantList" : "Liste des participants en attente",
"allow": "Autoriser",
"backToKnockModeButton": "Aucun mot de passe, demander à rejoindre plutôt",
"dialogTitle": "Mode lobby",
"disableDialogContent": "Le mode lobby est actuellement activé. Cette fonctionnalité garantit que les participants indésirables ne peuvent pas rejoindre votre réunion. Souhaitez-vous la désactiver?",
"disableDialogSubmit": "Désactiver",
"emailField": "Saisissez votre adresse email",
"enableDialogPasswordField": "Définir le mot de passe (optionel)",
"enableDialogSubmit": "Activer",
"enableDialogText": "Le mode lobby vous permet de protéger votre réunion en autorisant les personnes à entrer qu'après l'approbation formelle d'un modérateur.",
"enterPasswordButton": "Saisissez un mot de passe de réunion",
"enterPasswordTitle": "Saisissez le mot de passe pour rejoindre la réunion",
"invalidPassword": "Mot de passe invalide",
"joiningMessage": "Vous allez rejoindre une réunion dès que quelqu'un aura accepté votre demande",
"joinWithPasswordMessage": "Tentative de rejoindre avec mot de passe, patientez s'il vous plait...",
"joinRejectedMessage": "Votre requête pour rejoindre une réunion a été refusée par un modérateur.",
"joinTitle": "Rejoindre une réunion",
"joiningTitle": "Demander à rejoindre une réunion...",
"joiningWithPasswordTitle": "Rejoindre avec mot de passe...",
"knockButton": "Demander à rejoindre",
"knockTitle": "Quelqu'un souhaite rejoindre la réunion",
"nameField": "Saisissez votre nom",
"passwordField": "Saisissez le mot de passe de la réunion",
"passwordJoinButton": "Rejoindre",
"reject": "Refuser",
"toggleLabel": "Activer le lobby"
},
"security": {
"about": "Vous pouvez ajouter un mot de passe à votre réunion. Les participants devront fournir le mot de passe avant qu'ils soient autorisés à rejoindre la réunion.",
"aboutReadOnly": "Les modérateurs peuvent ajouter un mot de passe à la réunion. Les participants devront fournir le mot de passe avant qu'ils soient autorisés à rejoindre la réunion.",
"insecureRoomNameWarning": "Le nom de la salle est peu sûr. Des participants non désirés peuvent rejoindre votre réunion. Pensez à sécuriser votre réunion en cliquant sur le bouton de sécurité.",
"securityOptions": "Options de sécurité"
}
}

View File

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

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