Compare commits

...

138 Commits

Author SHA1 Message Date
Saúl Ibarra Corretgé
ef9913c1c7 fix(rn) fix broken mobile build
Importing the entire feature triggers web UI imports.
2021-12-11 15:22:03 +01:00
Дамян Минков
ce195d82d6 chore(deps) lib-jitsi-meet@latest
* fix: Fixes set effect and correct presence state.

8a95fda259...d630bc32a1
2021-12-10 15:39:51 -06:00
Jaya Allamsetty
229e65133c feat(media) Disable desktopshare when the video sender limit is reached. 2021-12-10 14:58:55 -05:00
Jaya Allamsetty
11eb6689dc chore(deps) lib-jitsi-meet@latest
* fix(presence): Do not sent presence if there is no active media session.
* fix: server-side callstats is never enabled (#1823)
* fix(JitsiConference) squelch bogus p2p session end error

8aa35dae40...8a95fda259
2021-12-10 12:23:43 -05:00
Calinteodor
bf3cc65f4c feat(security) created SecurityOptions React Navigation screen (#10509)
* feat(security) Security Options screen
2021-12-10 18:23:27 +02:00
Hristo Terezov
75e6dd389f feat(index.html): Add fonts.html SSI. 2021-12-10 10:20:54 -06:00
Rokixy
076113940b typo fix
dekstopAudioStream --> desktopAudioStream
2021-12-10 09:03:18 -06:00
Saúl Ibarra Corretgé
e6accd40e1 fix(breakout-rooms) ensure we use the same media types when joining
Only audio and video are considered. Screen sharing won't be preserved.
2021-12-10 15:51:06 +01:00
Saúl Ibarra Corretgé
7f0cfed981 fix(rn,breakout-rooms) create desired local tracks when joining rooms 2021-12-10 15:50:11 +01:00
Saúl Ibarra Corretgé
9279586e8c fix(tracks) fix disposing of local tracks
Don't just clear the storage for them, local tracks must be disposed, in order
for RN capturer to be freed for example.
2021-12-10 15:49:44 +01:00
Robert Pintilii
f8908c143e fix(disableSelfView) Fix issue with remote participant video (#10582)
Fix issue where last participant is shown as inactive when the self view is hidden
2021-12-10 15:16:02 +02:00
Saúl Ibarra Corretgé
c705dbaa2f fix(rn,breakout-rooms) fix not rendering display names 2021-12-10 13:37:59 +01:00
Saúl Ibarra Corretgé
1fa43ca4e7 chore(rn,versions) bump app and sdk versions 2021-12-10 10:05:34 +01:00
Jaya Allamsetty
9528cbad0e fix(notifications) Adjust the timeout for unmute blocked notifications. 2021-12-09 14:03:16 -06:00
Jaya Allamsetty
a23d57b5ff fix(shortcuts) Ignore keyboard shortcuts when the button are disabled. 2021-12-09 14:03:16 -06:00
Дамян Минков
ae5c364333 fix(breakout-rooms) cleanup local tracks when a conference is left. 2021-12-09 12:13:59 -06:00
Jaya Allamsetty
700c7c523d feat(tracks) Clean up the track if a source addition is rejected. (#10562)
* feat(tracks) Clean up the track if a source addition is rejected.
When jicofo rejects a source-add because of sendder limits, dispose and remove the local track from the conference.

* chore(deps) update LJM to latest.
2021-12-09 07:48:55 -06:00
Calin Chitu
5dbf4845fb feat(chat) keyboard covering input on android fix 2021-12-09 14:51:27 +02:00
Payetus
661a3d34be fix(lang) update Catalan translation
Co-authored-by: Payetus <payet91@gmail.xom>
2021-12-09 13:27:21 +01:00
Robert Pintilii
0e9b40c410 fix(notifications) Create web middleware (#10568)
Fixes broken native
2021-12-09 13:31:43 +02:00
Avram Tudor
51b827ebb0 fix(browser-compatibility) hide launch in web for unsupported mobile browsers (#10569) 2021-12-09 13:16:08 +02:00
Avram Tudor
16a2c729e0 chore(deps) lib-jitsi-meet@latest (#10566)
* fix(browser-capabilities) expose supported mobile browsers

e9e37099a1...161da84ac0
2021-12-09 12:36:11 +02:00
Saúl Ibarra Corretgé
ed5bb871f4 fix(android) fix NoClassDefFoundError for Landroid/graphics/ColorSpace
Fixes: https://github.com/jitsi/jitsi-meet/issues/10182
2021-12-09 10:51:42 +01:00
robertpin
d96ecc5b65 fix(screenshot-capture) Use feature on web only
Fixes broken native
2021-12-09 10:02:23 +01:00
robertpin
41f11e5adb feat(self-view) Added ability to hide self view
Added config option disableSelfView. This disables it on web and native

Added button on local video menu and toggle in settings on web to change the setting
2021-12-09 08:45:16 +01:00
Saúl Ibarra Corretgé
c48aa44af3 fix(breakout-rooms) cleanup remote tracks when a conference is left 2021-12-08 16:52:38 -06:00
Christoph Settgast
085b07efcd fix(rn) join conference if started by moderator
Issue was that APP is not defined at this place on mobile,
thus this raising ReferenceError which caused the waitForOwner to break

Closes: #10211
2021-12-08 16:52:23 -06:00
Saúl Ibarra Corretgé
60dcac96a6 fix(breakout-rooms) fix non-functional context menu
Close the menu after sending a participant to a breakout room, that will detach
the context menu from the current participant and it will work properly when
they join back.
2021-12-08 15:11:18 -06:00
robertpin
2e22eb5169 fix(overflow-drawer) Only use overflow drawer on mobile 2021-12-08 19:55:16 +01:00
Дамян Минков
e2beb2f3b1 chore(deps) lib-jitsi-meet@latest
* fix(tpc) disable ulpfec on chrome 96 (jitsi/lib-jitsi-meet#1816)
* fix: Fixes call to _setTrackMuteStatus.
* Refactor presence update (jitsi/lib-jitsi-meet#1814)

9e5d83f4ac...e9e37099a1
2021-12-08 12:41:47 -05:00
tmoldovan8x8
664f23a395 chore(rn) updates react-native-webrtc 2021-12-08 18:00:04 +02:00
Robert Pintilii
dc20b2fafe fix(screenshot-capture) Update screenshot capture feature (#10443)
* fix(screenshot-capture) Update screenshot capture feature

Add participants jid list to request

Enable screenshot capture only when recording is also on

Updated interval
2021-12-08 16:15:59 +02:00
Saúl Ibarra Corretgé
00ae2dc6a9 fix(virtual-backgrounds) make error message translatable 2021-12-08 15:12:32 +01:00
Saúl Ibarra Corretgé
a182f53cdc fix(virtual-backgrounds) fix error if we failed to load the model
If another try is made, show an error notification instead of failing with an
exception.
2021-12-08 15:12:32 +01:00
Horatiu Muresan
9b3f254c6b feat(end-meet-for-all) Trigger notifyReadyToClose event on end meetin… (#10549) 2021-12-08 16:11:31 +02:00
Vlad Piersec
0188086dde fix(participants-list): Avoid ui moving on input focus 2021-12-08 15:32:51 +02:00
JH
340698a546 fix(lang) update sv translation 2021-12-08 14:05:45 +01:00
SiderealArt
0920bda7b8 fix(lang) update Traditional Chinese (Taiwan) translation 2021-12-08 09:14:11 +01:00
Horatiu Muresan
10e5b2f572 feat(prejoin) Add possibility to hide extra join options buttons (#10434) 2021-12-08 09:53:19 +02:00
José Luís Andrade
81e9d01921 fix(lang) update Portuguese translation 2021-12-08 08:33:21 +01:00
Gabriel Borlea
0d5beb0c4e fix(facial-expressions) load worker as a blob 2021-12-08 08:27:17 +01:00
Ali Alhaidary
b890f34a53 fix(lang) update Arabic translation 2021-12-08 08:25:38 +01:00
Jaya Allamsetty
b19e4d76b5 fix(media) dispatch the unmute blocked action irrepective of the muted state.
This fixes an issue where the user muted by focus is able to unmute themselves even when the sender limit has been reached.
2021-12-07 17:13:29 -06:00
Christoph Settgast
65589937ea fix(breakout,av-moderation): support non-ascii tenant names
Same applies to tenant names as it applies to room names, as the
tenants/subdomains are prefixed to the room names in prosody.

Signed-off-by: Christoph Settgast <csett86@web.de>
2021-12-07 18:31:36 +01:00
Christoph Settgast
a6bc51cff1 fix(breakout,av-moderation): support non-ascii room names
rooms are created in prosody in their urlencoded form, eg täst
becomes t%c3%a4st@conference.jitsi.example.org

As local params = formdecode(query) contains an urldecode, we
need to reencode the room name so that the room can be found in
prosody.

Closes: #10525
Signed-off-by: Christoph Settgast <csett86@web.de>
2021-12-07 18:31:36 +01:00
Saúl Ibarra Corretgé
ae3fb20d65 fix(breakout-rooms) fix not waiting to leave the room
We need to wait for it before we start joining.
2021-12-07 16:40:13 +01:00
Vlad Piersec
bfc0567e32 fix(rn,chat): Fix chat and polls title 2021-12-07 11:13:25 +01:00
Mihaela Dumitru
0fb29a0c7a feat(external-api): enhance recordingLinkAvailable to provide ttl info 2021-12-07 10:57:04 +01:00
gpatel-fr
822850d888 fix(lang) update french translation 2021-12-04 13:18:24 +01:00
Christoph Settgast
64e6c5f461 fix(lang) update German translation 2021-12-04 07:20:26 +01:00
Andrei Oltean
a077043f1b feat: (moderate-reaction-sounds) enable moderator to mute reaction sounds 2021-12-03 18:36:57 +02:00
tmoldovan8x8
646fdef6bb fix(screen-sharing, picture-in-picture) re-enables PIP after stopping screen-share 2021-12-03 15:44:19 +02:00
Saúl Ibarra Corretgé
da0cb2b837 feat(breakout-rooms) add notification when joining rooms 2021-12-03 10:48:31 +01:00
Saúl Ibarra Corretgé
4401ea8818 fix(rn,navbar) fix invalid boolean check
`startTimestamp` is not a boolean, so make sure we return one.
2021-12-03 08:38:58 +01:00
Saúl Ibarra Corretgé
449e226e23 chore(deps) lib-jitsi-meet@latest
* fix(JitsiConference) properly handle leave() errors

61aef90835...9e5d83f4ac
2021-12-02 22:49:34 +01:00
Jasper Hugo
ed6f6cf766 feat(tile-view): allow disabling thumbnail enlargement 2021-12-02 21:21:12 +01:00
Saúl Ibarra Corretgé
79b0360d2e chore(deps) lib-jitsi-meet@latest
* fix(ChatRoom) make sure we wait for all promises on leave()
* fix(ChatRoom) make sure EMUC is destroyed
* fix(JitsiConference) make sure RTC is always destroyed
* fix(log) don't log full stanzas
* fix(avmoderation,breakout-rooms) dispose handlers when leaving

6b3d3d2783...61aef90835
2021-12-02 17:09:02 +01:00
Saúl Ibarra Corretgé
322ec107cd fix(rn,conference) hide timer until it has started
It may never start if the component is not deployed.
2021-12-02 16:04:45 +01:00
Saúl Ibarra Corretgé
3cbddb9d6a fix(breakout-rooms) mark function as async
Not all code paths return a Promise, make sure it does.
2021-12-02 15:49:36 +01:00
gpatel-fr
76667066e2 fix(lang) update french translation + fix 2 existing translations 2021-12-02 15:06:21 +01:00
Tudor D. Pop
c172a27f24 feat(notifications) coalesce participant left and raised hand notifications 2021-12-02 14:17:07 +01:00
Saúl Ibarra Corretgé
40a76940ac fix(rn,external-api) remove dead code 2021-12-02 13:26:15 +01:00
Saúl Ibarra Corretgé
be53c4c522 fix(rn,breakout-rooms) wait for the room to be left
Just like on web, we wait for the current room to be left in order to avoid all
kinds of problems.
2021-12-02 13:26:15 +01:00
Andrei Oltean
8ef48a8a1d feat: (speaker-stats) fix refresh and minor refactoring 2021-12-02 14:11:08 +02:00
Hristo Terezov
827e8201d4 fix(dropbox): OAuth to use postMessage. 2021-12-01 13:44:47 -06:00
Saúl Ibarra Corretgé
591eab7c97 fix(breakout-rooms) make sure participants in breakout rooms have a display name 2021-12-01 18:52:36 +01:00
Saúl Ibarra Corretgé
d9f71ee238 fix(etherpad) fix Etherpad closing when dominant speaker changes
Fixes: https://github.com/jitsi/jitsi-meet/issues/8109
2021-12-01 16:08:38 +01:00
Mejans
054564ab0a New strings translated
So to be up to date
2021-12-01 15:53:45 +01:00
Saúl Ibarra Corretgé
3548485e84 fix(participants) fix unpinning when switching conferences 2021-12-01 15:36:49 +01:00
Saúl Ibarra Corretgé
8393118330 fix(etherpad) fix loading Etherpad on web
Fixes: https://github.com/jitsi/jitsi-meet/issues/10486
2021-12-01 15:02:36 +01:00
Saúl Ibarra Corretgé
991a0e22a8 fix(conference) fix broken dispatch on mobile 2021-12-01 15:02:36 +01:00
Saúl Ibarra Corretgé
7a479b967c fix(modal) remove dead code 2021-12-01 15:02:36 +01:00
Saúl Ibarra Corretgé
0be0d6a76e fix(breakout-rooms) fix when using tenants 2021-12-01 13:50:36 +01:00
Christoph Settgast
60b551a339 fix(lang) update German translation 2021-12-01 06:57:17 +01:00
Hristo Terezov
208586cead fix(gravatar): Add crossOrigin attribute.
In cross origin issolated mode we need to explicitly add crossOrigin
attribute for all resources that are loaded with CORS headers.
2021-11-30 16:15:20 -06:00
Jaya Allamsetty
c7765cc1b7 feat(conference) Implement audio/video mute disable when sender limit is reached.
* feat(conference) Impl audio/video mute disable when sender limit is reached.
Jicofo sends a presence when the audio/video sender limit is reached in the conference. The client can then proceed to disable the audio and video mute buttons when this occurs.

* squash: use a different action type and show notification.
2021-11-30 15:08:25 -05:00
Дамян Минков
d8487c25b2 Revert "fix(Prejoin): Make prejoin name noneditable only when taken from jwt"
This reverts commit af7c316827.
2021-11-30 11:39:16 -06:00
Дамян Минков
2adb5dc7d6 fix: Fixes correct state in lobby screen on wrong password.
Fixes #9869.
2021-11-30 11:39:07 -06:00
Saúl Ibarra Corretgé
cc931986f6 fix(breakout-rooms) fix no video when coming back to main room
Re-create local tracks so we have a clean state.
2021-11-30 11:38:54 -06:00
Saúl Ibarra Corretgé
ce35a88299 fix(breakout-rooms) disable recording and live-streaming
There is currently no way to directly join a breakout room, so Jibri won't know
what to do. This shall be revisited in the future.
2021-11-30 11:38:54 -06:00
Saúl Ibarra Corretgé
58ef2974c9 fix(breakout-rooms) disable lobby in breakout rooms
The main room lobby gets diverted to the rooms, things can get confusing. We
might need to revisit this in the future.
2021-11-30 11:38:54 -06:00
Saúl Ibarra Corretgé
43647f1302 fix(conference) simplify code
Unify the 2 functions used to leave the room into a single one.
2021-11-30 11:38:54 -06:00
Saúl Ibarra Corretgé
599ed10325 fix(conference) remove dead code
Went for a different approach, this code is dead now.
2021-11-30 11:38:54 -06:00
Hristo Terezov
fb9d28a667 chore(deps) lib-jitsi-meet@latest
* feat: Handle disableBeforeUnloadHandlers option.
* feat(conference) Implement audio/video mute disable when sender limit is reached. Jicofo sends a presence when the audio/video sender limit is reaced in the conference. The client can then proceed to disable the audio and video mute buttons when this occurs.

f4f7db2e5f...6b3d3d2783
2021-11-30 07:11:42 +01:00
Hristo Terezov
b2d6054e1c feat: Add disableBeforeUnloadHandlers option 2021-11-29 19:49:51 -06:00
Дамян Минков
2097d77666 feat: Enables muc rate limit for lobby and breakout muc components. 2021-11-29 18:33:48 -06:00
Mihaela Dumitru
4ed7211286 fix(share-video): stop video from the participant list 2021-11-29 13:03:41 +02:00
Calin Chitu
5c67e8b4ce feat(config) defaultLocalDisplayName and defaultRemoteDisplayName 2021-11-26 18:52:43 +02:00
Saúl Ibarra Corretgé
00a74ca47a fix(breakout-rooms) fix checking if a user is in a room
Breakout rooms are just reserved UUIDs, they need not exist as actual MUCs,
until a participant joins. Thus, take this into account when checking if a
participant is in a room.
2021-11-26 16:18:54 +01:00
Saúl Ibarra Corretgé
4a88ad098a fix(rn,settings) only show "disable call integration" on Android
It;';s not implemented on iOS.
2021-11-26 15:30:27 +01:00
Saúl Ibarra Corretgé
dd20e8626e fix(breakout-rooms) fix operations when inside a breakout room
Fix not being able to create / remove breakout rooms when the moderator is
inside a breakout room.
2021-11-26 12:51:11 +01:00
Andrei Gavrilescu
0fc381fc6f feat(rtcstats): send facial expressions to rtcstats-server (#10461)
* send facial expressions to rtcstats

* remove comment

* remove extra line
2021-11-26 12:24:28 +02:00
tmoldovan8x8
73fb586d59 fix(external-api) send AUDIO_MUTED_CHANGED event only when value changed 2021-11-26 12:09:21 +02:00
Alex Bumbu
6cd6c0a043 fix(ios) avoid creating CXProvider objects when CallKit is disabled
Co-authored-by: Saúl Ibarra Corretgé <saghul@jitsi.org>
2021-11-26 10:47:03 +01:00
Saúl Ibarra Corretgé
896e752113 feat(lint) treat warnings as errors 2021-11-26 10:18:31 +01:00
Saúl Ibarra Corretgé
c5920bb8a5 fix(lint) fix all eslint warnings 2021-11-26 10:18:31 +01:00
Calin Chitu
1623dc4989 feat(branding) added native extension to updateTheme helper 2021-11-26 08:46:42 +01:00
Szymon Ruciński
41db8711f0 fix(lang) update Polish translation 2021-11-26 08:45:54 +01:00
Szymon Ruciński
a0edf329ae fix(lang) update Polish translation 2021-11-26 08:45:32 +01:00
robertpin
c2ab8935c1 fix(breakout-rooms) Improve breakout rooms
Don't show more menu on the main room

Fix join room on mobile web

When moving to room reset breakout rooms state to avoid showing incorrect data before response from prosody is received
2021-11-26 08:40:42 +01:00
Andrei Oltean
70b8ccc097 feat: (speaker-stats) add speaker stats feature to native 2021-11-25 20:17:49 +02:00
Calinteodor
cc63ff1c3c feat(conference) UI updates for mobile navigation bar (#10437)
* feat(conference) updated native navigation bar and toolbox styles
2021-11-25 18:41:03 +02:00
Saúl Ibarra Corretgé
4a5982da1f fix(breakout-rooms) make sure the default name is monotonically increasing 2021-11-25 16:50:33 +01:00
Saúl Ibarra Corretgé
fc16bfa6cb chore(deps) lib-jitsi-meet@latest
* fix(breakout-rooms) send whole payload on update event

0261073faf...f4f7db2e5f
2021-11-25 16:03:15 +01:00
Saúl Ibarra Corretgé
9a2aa3848c fix(config) add transcribingEnabled to whitelist
Fixes: https://github.com/jitsi/jitsi-meet/issues/10326
2021-11-25 15:27:59 +01:00
tmoldovan8x8
0a65ec1dfa fix(android) set facebook groupId for all react-native dependencies 2021-11-25 14:55:24 +02:00
Saúl Ibarra Corretgé
7bbc3bcf9e chore(rn,deps) react-native-webrtc@1.94.0 2021-11-25 12:15:56 +01:00
Christoph Settgast
48b12b4e00 fix(lang) update German translation 2021-11-25 07:18:05 +01:00
Hristo Terezov
91413fbd96 feat(load-test): Unmute video. 2021-11-24 14:37:05 -06:00
George Politis
03848fb3f8 chore(deps) lib-jitsi-meet@latest (#10436)
feat: Enables the moderator to {dis/en}able bridge-side rtcstats.

https://github.com/jitsi/lib-jitsi-meet/pull/1789
0261073faf
2021-11-24 15:57:32 +00:00
Payetus
e8cf932abb fix(lang) update translations for Catalan 2021-11-24 16:55:02 +01:00
Saúl Ibarra Corretgé
1a93da8c35 fix(breakout-rooms) cleanup code 2021-11-24 16:27:05 +01:00
Saúl Ibarra Corretgé
73e8f5703c fix(breakout-rooms) avoid accessing invalid room objects 2021-11-24 16:27:05 +01:00
Saúl Ibarra Corretgé
a203a92060 fix(breakout-rooms) simplify code 2021-11-24 16:27:05 +01:00
Saúl Ibarra Corretgé
ef93584c2b fix(breakout-rooms) fix error in case main room is no longer available 2021-11-24 16:27:05 +01:00
Tudor D. Pop
a618697e34 feat(notifications) revisit timeouts and make them configurable 2021-11-24 12:05:27 +01:00
titus.moldovan
64e504f349 fix(android) fixes error in BroadcastEvent 2021-11-24 11:29:56 +01:00
Saúl Ibarra Corretgé
994f6307b9 fix(TileViewButton) fix on mobile
`setOverflowMenuVisible` doesn't exist on mobile.
2021-11-24 11:05:38 +01:00
Saúl Ibarra Corretgé
d7b581e338 feat)rn,sdk) introduce a "ready to close" event
This event is the event host applications need to listen to for knowing when to
dispose the SDK from now on.

Since the introduction of breakout rooms it's possible that we navigate from one
meeting to another, so there will be several conference join / terminations.

In addition, local track destruction is now moved to SET_ROOM when there is no
room, aka, we are going back to the welcome page or to the black page.
2021-11-24 09:58:48 +01:00
Robert Pintilii
763d975445 fix(rn, participants-pane) Show raised hand indicator (#10424)
Make name container limited width and add ellipsis text overflow

Show raise hand status live in participants pane
2021-11-24 09:46:01 +02:00
Avram Tudor
42e62e013d fix(filmstrip) remove border from filmstrip (#10367) 2021-11-24 05:26:22 +02:00
George Politis
04b085e062 fix: Updates the default value of rtcstatsEnabled to match the code. (#10425) 2021-11-23 21:38:20 +00:00
Jaya Allamsetty
83e22524bc chore(deps) lib-jitsi-meet@latest
* fix(TPC): Select 1 as the default scale factor for p2p. This fixes an issue where a user is not able to unmute their video if the MediaStreamTrack associated with the camera stream returns a null value for the track height.
* Save track source name to JitsiRemoteTrack

bdfbb82087...a1c966058c
2021-11-23 15:10:41 -05:00
Calin Chitu
909173cdb5 feat(ui) reverted tokens updates 2021-11-23 16:58:40 +02:00
Calin Chitu
5d1bf9e649 feat(ui) updateTheme helper for client branding 2021-11-23 16:58:40 +02:00
hmuresan
14a422ba83 fix(linguistics) Use 'email' instead of 'e-mail' 2021-11-23 16:00:08 +02:00
Robert Pintilii
0106e68728 chore(breakout-rooms) Added analytics (#10421) 2021-11-23 15:14:59 +02:00
Saúl Ibarra Corretgé
c843744df1 fix(rn,sdk) drop deprecated option enableWelcomePage
It got replaced by a feature flag.
2021-11-23 13:49:14 +01:00
Saúl Ibarra Corretgé
f6f7406d24 fix(rn,sdk) remove deprecated color scheme prop
It has been non-functional for a while.
2021-11-23 13:49:14 +01:00
Vlad Piersec
76a976b5d1 fix(Avatar): Display correctly any emoji/special character in a avatar initials 2021-11-23 13:56:45 +02:00
Saúl Ibarra Corretgé
2e7c06d045 fix(rn,welcome-page) don't create video track unnecessarily
We are no longer rendering it, so skip creating it altogether and make sure it's
destroyed on meeting end.
2021-11-23 12:25:39 +01:00
hmuresan
9fbbcbbd31 fix(prejoin) Fix prejoin app 2021-11-23 11:40:50 +02:00
Greg Galperin
6101cd2c1a fix(lang) update Russian translation 2021-11-22 07:52:44 +01:00
Mejans
41d654b2dc fix(lang) update Occitan translation 2021-11-22 07:52:14 +01:00
Ali Alhaidary
c381a3eed4 fix(lang) update Arabic translation 2021-11-22 07:48:40 +01:00
csett86
f42fe0ce17 fix(lang) update German translation
Signed-off-by: Christoph Settgast <csett86@web.de>
2021-11-22 07:46:13 +01:00
gpatel-fr
b277812e8e fix(lang) update french translation 2021-11-20 11:51:55 +01:00
Jaya Allamsetty
fad5ac9048 feat(video-quality): Always prioritize SS in tile view. 2021-11-19 13:28:13 -05:00
305 changed files with 5238 additions and 2699 deletions

View File

@@ -85,4 +85,9 @@
# ^^^ We added the above when we switched minifyEnabled on.
# Rule to avoid build errors related to SVGs.
-keep public class com.horcrux.svg.** {*;}
-keep public class com.horcrux.svg.** {*;}
# https://github.com/facebook/fresco/issues/2638
-keep public class com.facebook.imageutils.** {
public *;
}

View File

@@ -150,8 +150,8 @@ public class MainActivity extends JitsiMeetActivity {
// Set default options
JitsiMeetConferenceOptions defaultOptions
= new JitsiMeetConferenceOptions.Builder()
.setWelcomePageEnabled(true)
.setServerURL(buildURL(defaultURL))
.setFeatureFlag("welcomepage.enabled", true)
.setFeatureFlag("call-integration.enabled", false)
.setFeatureFlag("resolution", 360)
.setFeatureFlag("server-url-change.enabled", !configurationByRestrictions)
@@ -182,11 +182,6 @@ public class MainActivity extends JitsiMeetActivity {
}
}
@Override
protected void onConferenceTerminated(HashMap<String, Object> extraData) {
Log.d(TAG, "Conference terminated: " + extraData);
}
// Activity lifecycle method overrides
//

View File

@@ -26,5 +26,5 @@ android.useAndroidX=true
android.enableJetifier=true
android.bundle.enableUncompressedNativeLibs=false
appVersion=21.5.0
sdkVersion=4.0.0
appVersion=21.6.0
sdkVersion=4.1.0

View File

@@ -68,6 +68,7 @@ dependencies {
implementation project(':react-native-async-storage')
implementation project(':react-native-background-timer')
implementation project(':react-native-calendar-events')
implementation project(':react-native-community_clipboard')
implementation project(':react-native-community_netinfo')
implementation project(':react-native-default-preference')
implementation project(':react-native-gesture-handler')
@@ -217,7 +218,7 @@ publishing {
def groupId = it.moduleGroup
def artifactId = it.moduleName
if (artifactId.startsWith('react-native-') && groupId.equals('jitsi-meet')) {
if (artifactId.startsWith('react-native-')) {
groupId = rootProject.ext.moduleGroupId
}

View File

@@ -86,8 +86,8 @@ public class BroadcastEvent {
PARTICIPANTS_INFO_RETRIEVED("org.jitsi.meet.PARTICIPANTS_INFO_RETRIEVED"),
CHAT_MESSAGE_RECEIVED("org.jitsi.meet.CHAT_MESSAGE_RECEIVED"),
CHAT_TOGGLED("org.jitsi.meet.CHAT_TOGGLED"),
VIDEO_MUTED_CHANGED("org.jitsi.meet.VIDEO_MUTED_CHANGED");
VIDEO_MUTED_CHANGED("org.jitsi.meet.VIDEO_MUTED_CHANGED"),
READY_TO_CLOSE("org.jitsi.meet.READY_TO_CLOSE");
private static final String CONFERENCE_WILL_JOIN_NAME = "CONFERENCE_WILL_JOIN";
private static final String CONFERENCE_JOINED_NAME = "CONFERENCE_JOINED";
@@ -101,6 +101,7 @@ public class BroadcastEvent {
private static final String CHAT_MESSAGE_RECEIVED_NAME = "CHAT_MESSAGE_RECEIVED";
private static final String CHAT_TOGGLED_NAME = "CHAT_TOGGLED";
private static final String VIDEO_MUTED_CHANGED_NAME = "VIDEO_MUTED_CHANGED";
private static final String READY_TO_CLOSE_NAME = "READY_TO_CLOSE";
private final String action;
@@ -147,6 +148,8 @@ public class BroadcastEvent {
return CHAT_TOGGLED;
case VIDEO_MUTED_CHANGED_NAME:
return VIDEO_MUTED_CHANGED;
case READY_TO_CLOSE_NAME:
return READY_TO_CLOSE;
}
return null;

View File

@@ -194,7 +194,6 @@ public class JitsiMeetActivity extends AppCompatActivity
protected void onConferenceTerminated(HashMap<String, Object> extraData) {
JitsiMeetLogger.i("Conference terminated: " + extraData);
finish();
}
protected void onConferenceWillJoin(HashMap<String, Object> extraData) {
@@ -217,6 +216,11 @@ public class JitsiMeetActivity extends AppCompatActivity
}
}
protected void onReadyToClose() {
JitsiMeetLogger.i("SDK is ready to close");
finish();
}
// Activity lifecycle methods
//
@@ -298,6 +302,9 @@ public class JitsiMeetActivity extends AppCompatActivity
case PARTICIPANT_LEFT:
onParticipantLeft(event.getData());
break;
case READY_TO_CLOSE:
onReadyToClose();
break;
}
}
}

View File

@@ -45,11 +45,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
*/
private String token;
/**
* Color scheme override, see: https://github.com/jitsi/jitsi-meet/blob/dbedee5e22e5dcf9c92db96ef5bb3c9982fc526d/react/features/base/color-scheme/defaultScheme.js
*/
private Bundle colorScheme;
/**
* Config. See: https://github.com/jitsi/jitsi-meet/blob/master/config.js
*/
@@ -77,10 +72,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
return token;
}
public Bundle getColorScheme() {
return colorScheme;
}
public Bundle getFeatureFlags() {
return featureFlags;
}
@@ -97,7 +88,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
private String room;
private String token;
private Bundle colorScheme;
private Bundle config;
private Bundle featureFlags;
@@ -152,19 +142,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
return this;
}
/**
* Sets the color scheme override so the app is themed. See:
* https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/color-scheme/defaultScheme.js
* for the structure.
* @param colorScheme - A color scheme to be applied to the app.
* @return - The {@link Builder} object itself so the method calls can be chained.
*/
public Builder setColorScheme(Bundle colorScheme) {
this.colorScheme = colorScheme;
return this;
}
/**
* Indicates the conference will be joined with the microphone muted.
* @param audioMuted - Muted indication.
@@ -198,19 +175,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
return this;
}
/**
* Sets the welcome page enabled / disabled. The welcome page lists recent meetings and
* calendar appointments and it's meant to be used by standalone applications. Defaults to
* false.
* @param enabled - Whether the welcome page should be enabled or not.
* @return - The {@link Builder} object itself so the method calls can be chained.
*/
public Builder setWelcomePageEnabled(boolean enabled) {
this.featureFlags.putBoolean("welcomepage.enabled", enabled);
return this;
}
public Builder setFeatureFlag(String flag, boolean value) {
this.featureFlags.putBoolean(flag, value);
@@ -276,7 +240,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
options.serverURL = this.serverURL;
options.room = this.room;
options.token = this.token;
options.colorScheme = this.colorScheme;
options.config = this.config;
options.featureFlags = this.featureFlags;
options.userInfo = this.userInfo;
@@ -292,7 +255,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
serverURL = (URL) in.readSerializable();
room = in.readString();
token = in.readString();
colorScheme = in.readBundle();
config = in.readBundle();
featureFlags = in.readBundle();
userInfo = new JitsiMeetUserInfo(in.readBundle());
@@ -308,10 +270,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
props.putBundle("flags", featureFlags);
if (colorScheme != null) {
props.putBundle("colorScheme", colorScheme);
}
Bundle urlProps = new Bundle();
// The room is fully qualified
@@ -360,7 +318,6 @@ public class JitsiMeetConferenceOptions implements Parcelable {
dest.writeSerializable(serverURL);
dest.writeString(room);
dest.writeString(token);
dest.writeBundle(colorScheme);
dest.writeBundle(config);
dest.writeBundle(featureFlags);
dest.writeBundle(userInfo != null ? userInfo.asBundle() : new Bundle());

View File

@@ -180,6 +180,7 @@ class ReactInstanceManagerHolder {
new com.calendarevents.CalendarEventsPackage(),
new com.corbt.keepawake.KCKeepAwakePackage(),
new com.facebook.react.shell.MainReactPackage(),
new com.reactnativecommunity.clipboard.ClipboardPackage(),
new com.reactnativecommunity.netinfo.NetInfoPackage(),
new com.oblador.performance.PerformancePackage(),
new com.reactnativecommunity.slider.ReactSliderPackage(),

View File

@@ -9,6 +9,8 @@ include ':react-native-background-timer'
project(':react-native-background-timer').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-background-timer/android')
include ':react-native-calendar-events'
project(':react-native-calendar-events').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-calendar-events/android')
include ':react-native-community_clipboard'
project(':react-native-community_clipboard').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/clipboard/android')
include ':react-native-community_netinfo'
project(':react-native-community_netinfo').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/netinfo/android')
include ':react-native-default-preference'

View File

@@ -9,6 +9,7 @@ import { ENDPOINT_TEXT_MESSAGE_NAME } from './modules/API/constants';
import { AUDIO_ONLY_SCREEN_SHARE_NO_TRACK } from './modules/UI/UIErrors';
import AuthHandler from './modules/UI/authentication/AuthHandler';
import UIUtil from './modules/UI/util/UIUtil';
import VideoLayout from './modules/UI/videolayout/VideoLayout';
import mediaDeviceHelper from './modules/devices/mediaDeviceHelper';
import Recorder from './modules/recorder/Recorder';
import { createTaskQueue } from './modules/util/helpers';
@@ -70,7 +71,8 @@ import {
JitsiMediaDevicesEvents,
JitsiParticipantConnectionStatus,
JitsiTrackErrors,
JitsiTrackEvents
JitsiTrackEvents,
JitsiRecordingConstants
} from './react/features/base/lib-jitsi-meet';
import {
getStartWithAudioMuted,
@@ -79,14 +81,15 @@ import {
MEDIA_TYPE,
setAudioAvailable,
setAudioMuted,
setAudioUnmutePermissions,
setVideoAvailable,
setVideoMuted
setVideoMuted,
setVideoUnmutePermissions
} from './react/features/base/media';
import {
dominantSpeakerChanged,
getLocalParticipant,
getNormalizedDisplayName,
getParticipantById,
localParticipantConnectionStatusChanged,
localParticipantRoleChanged,
participantConnectionStatusChanged,
@@ -123,7 +126,11 @@ import {
maybeOpenFeedbackDialog,
submitFeedback
} from './react/features/feedback';
import { isModerationNotificationDisplayed, showNotification } from './react/features/notifications';
import {
isModerationNotificationDisplayed,
showNotification,
NOTIFICATION_TIMEOUT_TYPE
} from './react/features/notifications';
import { mediaPermissionPromptVisibilityChanged, toggleSlowGUMOverlay } from './react/features/overlay';
import { suspendDetected } from './react/features/power-monitor';
import {
@@ -134,6 +141,7 @@ import {
setJoiningInProgress,
setPrejoinPageVisibility
} from './react/features/prejoin';
import { getActiveSession } from './react/features/recording/functions';
import { disableReceiver, stopReceiver } from './react/features/remote-control';
import { setScreenAudioShareState, isScreenAudioShared } from './react/features/screen-share/';
import { toggleScreenshotCaptureSummary } from './react/features/screenshot-capture';
@@ -231,17 +239,6 @@ function sendData(command, value) {
room.sendCommand(command, { value });
}
/**
* Get user nickname by user id.
* @param {string} id user id
* @returns {string?} user nickname or undefined if user is unknown.
*/
function getDisplayName(id) {
const participant = getParticipantById(APP.store.getState(), id);
return participant && participant.name;
}
/**
* Mute or unmute local audio stream if it exists.
* @param {boolean} muted - if audio stream should be muted or unmuted.
@@ -357,7 +354,10 @@ class ConferenceConnector {
case JitsiConferenceErrors.FOCUS_DISCONNECTED: {
const [ focus, retrySec ] = params;
APP.UI.notifyFocusDisconnected(focus, retrySec);
APP.store.dispatch(showNotification({
descriptionKey: focus,
titleKey: retrySec
}, NOTIFICATION_TIMEOUT_TYPE.SHORT));
break;
}
@@ -755,7 +755,7 @@ export default {
APP.store.dispatch(showNotification({
descriptionKey: 'notify.startSilentDescription',
titleKey: 'notify.startSilentTitle'
}));
}, NOTIFICATION_TIMEOUT_TYPE.LONG));
}
// XXX The API will take care of disconnecting from the XMPP
@@ -1211,14 +1211,6 @@ export default {
return room.isConnectionInterrupted();
},
/**
* Obtains the local display name.
* @returns {string|undefined}
*/
getLocalDisplayName() {
return getDisplayName(this.getMyUserId());
},
/**
* Finds JitsiParticipant for given id.
*
@@ -1231,29 +1223,6 @@ export default {
return room ? room.getParticipantById(id) : null;
},
/**
* Gets the display name foe the <tt>JitsiParticipant</tt> identified by
* the given <tt>id</tt>.
*
* @param id {string} the participant's id(MUC nickname/JVB endpoint id)
*
* @return {string} the participant's display name or the default string if
* absent.
*/
getParticipantDisplayName(id) {
const displayName = getDisplayName(id);
if (displayName) {
return displayName;
}
if (APP.conference.isLocalId(id)) {
return APP.translation.generateTranslationHTML(
interfaceConfig.DEFAULT_LOCAL_DISPLAY_NAME);
}
return interfaceConfig.DEFAULT_REMOTE_DISPLAY_NAME;
},
getMyUserId() {
return room && room.myUserId();
},
@@ -1364,10 +1333,19 @@ export default {
/**
* Used by the Breakout Rooms feature to join a breakout room or go back to the main room.
*/
async joinRoom(roomName, isBreakoutRoom = false) {
async joinRoom(roomName, options) {
// Reset VideoLayout. It's destroyed in features/video-layout/middleware.web.js so re-initialize it.
VideoLayout.initLargeVideo();
VideoLayout.resizeVideoArea();
// Restore initial state.
this._localTracksInitialized = false;
this.isSharingScreen = false;
this.localPresenterVideo = null;
this.roomName = roomName;
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks();
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks(options);
const localTracks = await tryCreateLocalTracks;
this._displayErrorsForCreateInitialLocalTracks(errors);
@@ -1377,33 +1355,15 @@ export default {
track.mute();
}
});
this._createRoom(localTracks, isBreakoutRoom);
this._createRoom(localTracks);
return new Promise((resolve, reject) => {
new ConferenceConnector(resolve, reject).connect();
});
},
_createRoom(localTracks, isBreakoutRoom = false) {
const extraOptions = {};
if (isBreakoutRoom) {
// We must be in a room already.
if (!room?.xmpp?.breakoutRoomsComponentAddress) {
throw new Error('Breakout Rooms not enabled');
}
// TODO: re-evaluate this. -saghul
extraOptions.customDomain = room.xmpp.breakoutRoomsComponentAddress;
}
room
= connection.initJitsiConference(
APP.conference.roomName,
{
...this._getConferenceOptions(),
...extraOptions
});
_createRoom(localTracks) {
room = connection.initJitsiConference(APP.conference.roomName, this._getConferenceOptions());
// Filter out the tracks that are muted (except on Safari).
const tracks = browser.isWebKitBased() ? localTracks : localTracks.filter(track => !track.isMuted());
@@ -1751,10 +1711,10 @@ export default {
= this._turnScreenSharingOff.bind(this, didHaveVideo);
const desktopVideoStream = desktopStreams.find(stream => stream.getType() === MEDIA_TYPE.VIDEO);
const dekstopAudioStream = desktopStreams.find(stream => stream.getType() === MEDIA_TYPE.AUDIO);
const desktopAudioStream = desktopStreams.find(stream => stream.getType() === MEDIA_TYPE.AUDIO);
if (dekstopAudioStream) {
dekstopAudioStream.on(
if (desktopAudioStream) {
desktopAudioStream.on(
JitsiTrackEvents.LOCAL_TRACK_STOPPED,
() => {
logger.debug(`Local screensharing audio track stopped. ${this.isSharingScreen}`);
@@ -1976,7 +1936,9 @@ export default {
.then(() => {
this.videoSwitchInProgress = false;
if (config.enableScreenshotCapture) {
APP.store.dispatch(toggleScreenshotCaptureSummary(true));
if (getActiveSession(APP.store.getState(), JitsiRecordingConstants.mode.FILE)) {
APP.store.dispatch(toggleScreenshotCaptureSummary(true));
}
}
sendAnalytics(createScreenSharingEvent('started'));
logger.log('Screen sharing started');
@@ -2174,6 +2136,8 @@ export default {
}
});
room.on(JitsiConferenceEvents.TRACK_UNMUTE_REJECTED, track => APP.store.dispatch(destroyLocalTracks(track)));
room.on(JitsiConferenceEvents.SUBJECT_CHANGED,
subject => APP.store.dispatch(conferenceSubjectChanged(subject)));
@@ -2215,6 +2179,10 @@ export default {
(id, displayName) => {
const formattedDisplayName
= getNormalizedDisplayName(displayName);
const state = APP.store.getState();
const {
defaultRemoteDisplayName
} = state['features/base/config'];
APP.store.dispatch(participantUpdated({
conference: room,
@@ -2226,7 +2194,7 @@ export default {
formattedDisplayName:
appendSuffix(
formattedDisplayName
|| interfaceConfig.DEFAULT_REMOTE_DISPLAY_NAME)
|| defaultRemoteDisplayName)
});
}
);
@@ -2298,6 +2266,17 @@ export default {
APP.store.dispatch(suspendDetected());
});
room.on(
JitsiConferenceEvents.AUDIO_UNMUTE_PERMISSIONS_CHANGED,
disableAudioMuteChange => {
APP.store.dispatch(setAudioUnmutePermissions(disableAudioMuteChange));
});
room.on(
JitsiConferenceEvents.VIDEO_UNMUTE_PERMISSIONS_CHANGED,
disableVideoMuteChange => {
APP.store.dispatch(setVideoUnmutePermissions(disableVideoMuteChange));
});
APP.UI.addListener(UIEvents.AUDIO_MUTED, muted => {
this.muteAudio(muted);
});
@@ -2364,7 +2343,12 @@ export default {
}
Promise.allSettled(promises)
.then(() => APP.UI.notifyInitiallyMuted());
.then(() => {
APP.store.dispatch(showNotification({
titleKey: 'notify.mutedTitle',
descriptionKey: 'notify.muted'
}, NOTIFICATION_TIMEOUT_TYPE.SHORT));
});
});
room.on(
@@ -2929,7 +2913,7 @@ export default {
Promise.all([
requestFeedbackPromise,
this.leaveRoomAndDisconnect()
this.leaveRoom()
])
.then(values => {
this._room = undefined;
@@ -2950,27 +2934,23 @@ export default {
/**
* Leaves the room.
*
* @param {boolean} doDisconnect - Wether leaving the room should also terminate the connection.
* @returns {Promise}
*/
leaveRoom() {
if (room && room.isJoined()) {
return room.leave();
}
},
/**
* Leaves the room and calls JitsiConnection.disconnect.
*
* @returns {Promise}
*/
leaveRoomAndDisconnect() {
async leaveRoom(doDisconnect = true) {
APP.store.dispatch(conferenceWillLeave(room));
if (room && room.isJoined()) {
return room.leave().then(disconnect, disconnect);
return room.leave().finally(() => {
if (doDisconnect) {
return disconnect();
}
});
}
return disconnect();
if (doDisconnect) {
return disconnect();
}
},
/**

View File

@@ -83,6 +83,9 @@ var config = {
// Disables polls feature.
// disablePolls: false,
// Disables self-view tile. (hides it from tile view and from filmstrip)
// disableSelfView: false,
// Disables ICE/UDP by filtering out local and remote UDP candidates in
// signalling.
// webrtcIceUdpDisable: false,
@@ -375,6 +378,13 @@ var config = {
// resizeDesktopForPresenter: false
// },
// Notification timeouts
// notificationTimeouts: {
// short: 2500,
// medium: 5000,
// long: 10000
// },
// // Options for the recording limit notification.
// recordingLimit: {
//
@@ -393,6 +403,9 @@ var config = {
// Disables or enables RTX (RFC 4588) (defaults to false).
// disableRtx: false,
// Moves all Jitsi Meet 'beforeunload' logic (cleanup, leaving, disconnecting, etc) to the 'unload' event.
// disableBeforeUnloadHandlers: true,
// Disables or enables TCC support in this client (default: enabled).
// enableTcc: true,
@@ -459,6 +472,12 @@ var config = {
// when the toolbar is shown on mouse movements
// disable1On1Mode: null | false | true,
// Default local name to be displayed
// defaultLocalDisplayName: 'me',
// Default remote name to be displayed
// defaultRemoteDisplayName: 'Fellow Jitster',
// Default language for the user interface.
// defaultLanguage: 'en',
@@ -480,8 +499,14 @@ var config = {
// and microsoftApiApplicationClientID
// enableCalendarIntegration: false,
// When 'true', it shows an intermediate page before joining, where the user can configure their devices.
// prejoinPageEnabled: false,
// Configs for prejoin page.
// prejoinConfig: {
// // When 'true', it shows an intermediate page before joining, where the user can configure their devices.
// // This replaces `prejoinPageEnabled`.
// enabled: true,
// // List of buttons to hide from the extra join options dropdown.
// hideExtraJoinButtons: ['no-audio', 'by-phone']
// },
// When 'true', the user cannot edit the display name.
// (Mainly useful when used in conjuction with the JWT so the JWT name becomes read only.)
@@ -740,7 +765,7 @@ var config = {
// module connects to the provided rtcstatsEndpoint and sends statistics regarding
// PeerConnection states along with getStats metrics polled at the specified
// interval.
// rtcstatsEnabled: true,
// rtcstatsEnabled: false,
// In order to enable rtcstats one needs to provide a endpoint url.
// rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/,
@@ -979,6 +1004,9 @@ var config = {
// If true, tile view will not be enabled automatically when the participants count threshold is reached.
// disableTileView: true,
// If true, the tiles will be displayed contained within the available space rather than enlarged to cover it.
// disableTileEnlargement: true,
// Controls the visibility and behavior of the top header conference info labels.
// If a label's id is not in any of the 2 arrays, it will not be visible at all on the header.
// conferenceInfo: {

View File

@@ -65,6 +65,11 @@
text-align: left;
flex: 1;
}
.moderator-settings-wrapper {
padding-top: 20px;
}
.profile-edit-field {
margin-right: 20px;
}

View File

@@ -82,6 +82,7 @@ Component "breakout.jitmeet.example.com" "muc"
"muc_meeting_id";
"muc_domain_mapper";
--"token_verification";
"muc_rate_limit";
}
admins = { "focusUser@auth.jitmeet.example.com" }
muc_room_locking = false
@@ -121,3 +122,6 @@ Component "lobby.jitmeet.example.com" "muc"
restrict_room_creation = true
muc_room_locking = false
muc_room_default_public_jids = true
modules_enabled = {
"muc_rate_limit";
}

0
fonts.html Normal file
View File

View File

@@ -9,6 +9,7 @@
<link rel="apple-touch-icon" href="images/apple-touch-icon.png">
<link rel="stylesheet" href="css/all.css">
<!--#include virtual="fonts.html"-->
<link rel="manifest" id="manifest-placeholder">
<script>

View File

@@ -27,9 +27,7 @@ var interfaceConfig = {
CLOSE_PAGE_GUEST_HINT: false, // A html text to be shown to guests on the close page, false disables it
DEFAULT_BACKGROUND: '#474747',
DEFAULT_LOCAL_DISPLAY_NAME: 'me',
DEFAULT_LOGO_URL: 'images/watermark.svg',
DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Jitster',
DEFAULT_WELCOME_PAGE_LOGO_URL: 'images/watermark.svg',
DISABLE_DOMINANT_SPEAKER_INDICATOR: false,
@@ -225,13 +223,6 @@ var interfaceConfig = {
*/
// ANDROID_APP_PACKAGE: 'org.jitsi.meet',
/**
* Override the behavior of some notifications to remain displayed until
* explicitly dismissed through a user action. The value is how long, in
* milliseconds, those notifications should remain displayed.
*/
// ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT: 15000,
// List of undocumented settings
/**
INDICATOR_FONT_SIZES
@@ -248,6 +239,12 @@ var interfaceConfig = {
// Please use disableModeratorIndicator from config.js
// DISABLE_FOCUS_INDICATOR: false,
// Please use defaultLocalDisplayName from config.js
// DEFAULT_LOCAL_DISPLAY_NAME: 'me',
// Please use defaultRemoteDisplayName from config.js
// DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Jitster',
// Moved to config.js as `toolbarConfig.initialTimeout`.
// INITIAL_TOOLBAR_TIMEOUT: 20000,

View File

@@ -61,23 +61,24 @@ target 'JitsiMeetSDK' do
pod 'react-native-keep-awake', :path => '../node_modules/react-native-keep-awake'
pod 'react-native-netinfo', :path => '../node_modules/@react-native-community/netinfo'
pod 'react-native-performance', :path => '../node_modules/react-native-performance/ios'
pod 'react-native-safe-area-context', :path => '../node_modules/react-native-safe-area-context'
pod 'react-native-slider', :path => '../node_modules/@react-native-community/slider'
pod 'react-native-splash-screen', :path => '../node_modules/react-native-splash-screen'
pod 'react-native-video', :path => '../node_modules/react-native-video/react-native-video.podspec'
pod 'react-native-webview', :path => '../node_modules/react-native-webview'
pod 'react-native-webrtc', :path => '../node_modules/react-native-webrtc'
pod 'RNCAsyncStorage', :path => '../node_modules/@react-native-async-storage/async-storage'
pod 'RNCClipboard', :path => '../node_modules/@react-native-community/clipboard'
pod 'RNCMaskedView', :path => '../node_modules/@react-native-masked-view/masked-view'
pod 'RNDefaultPreference', :path => '../node_modules/react-native-default-preference'
pod 'RNDeviceInfo', :path => '../node_modules/react-native-device-info'
pod 'RNGestureHandler', :path => '../node_modules/react-native-gesture-handler'
pod 'RNGoogleSignin', :path => '../node_modules/@react-native-community/google-signin'
pod 'RNReanimated', :path => '../node_modules/react-native-reanimated'
pod 'RNScreens', :path => '../node_modules/react-native-screens'
pod 'RNSound', :path => '../node_modules/react-native-sound'
pod 'RNSVG', :path => '../node_modules/react-native-svg'
pod 'RNWatch', :path => '../node_modules/react-native-watch-connectivity'
pod 'RNDefaultPreference', :path => '../node_modules/react-native-default-preference'
pod 'RNGestureHandler', :path => '../node_modules/react-native-gesture-handler'
pod 'RNReanimated', :path => '../node_modules/react-native-reanimated'
pod 'RNScreens', :path => '../node_modules/react-native-screens'
pod 'react-native-safe-area-context', :path => '../node_modules/react-native-safe-area-context'
pod 'RNCMaskedView', :path => '../node_modules/@react-native-masked-view/masked-view'
# Native pod dependencies
#

View File

@@ -303,7 +303,7 @@ PODS:
- react-native-video/Video (= 5.1.1)
- react-native-video/Video (5.1.1):
- React-Core
- react-native-webrtc (1.92.2):
- react-native-webrtc (1.94.1):
- React-Core
- react-native-webview (11.0.2):
- React-Core
@@ -363,6 +363,8 @@ PODS:
- ReactCommon/turbomodule/core (= 0.61.5-jitsi.2)
- RNCAsyncStorage (1.15.5):
- React-Core
- RNCClipboard (1.5.1):
- React-Core
- RNCMaskedView (0.2.6):
- React-Core
- RNDefaultPreference (1.4.2):
@@ -435,6 +437,7 @@ DEPENDENCIES:
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
- ReactCommon/turbomodule (from `../node_modules/react-native/ReactCommon`)
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
- "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)"
- "RNCMaskedView (from `../node_modules/@react-native-masked-view/masked-view`)"
- RNDefaultPreference (from `../node_modules/react-native-default-preference`)
- RNDeviceInfo (from `../node_modules/react-native-device-info`)
@@ -547,6 +550,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon"
RNCAsyncStorage:
:path: "../node_modules/@react-native-async-storage/async-storage"
RNCClipboard:
:path: "../node_modules/@react-native-community/clipboard"
RNCMaskedView:
:path: "../node_modules/@react-native-masked-view/masked-view"
RNDefaultPreference:
@@ -616,7 +621,7 @@ SPEC CHECKSUMS:
react-native-slider: e99fc201cefe81270fc9d81714a7a0f5e566b168
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
react-native-video: 0bb76b6d6b77da3009611586c7dbf817b947f30e
react-native-webrtc: 41526e4060dac373c18676f866962d4180ee47b9
react-native-webrtc: 2f20515f3ebb9dbf1f2aad638cc7573396cf948f
react-native-webview: dfd7202ff115c44d3ea401c2f36122fb3ac79f07
React-RCTActionSheet: bcbc311dc3b47bc8efb2737ff0940239a45789a9
React-RCTAnimation: 65f61080ce632f6dea23d52e354ffac9948396c6
@@ -629,6 +634,7 @@ SPEC CHECKSUMS:
React-RCTVibration: c1041024893fdfdb8371e7c720c437751b711676
ReactCommon: 18014e1d98dbeb9141e935cfe35fc93bd511ffb6
RNCAsyncStorage: 56a3355a10b5d660c48c6e37325ac85ebfd09885
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
RNCMaskedView: c298b644a10c0c142055b3ae24d83879ecb13ccd
RNDefaultPreference: 1f8133ec0bc0f9453cdada578564ba1ef551fb44
RNDeviceInfo: 87d2d175c760f6bcf58acd036f887e8b2392802c
@@ -641,6 +647,6 @@ SPEC CHECKSUMS:
RNWatch: a5320c959c75e72845c07985f3e935e58998f1d3
Yoga: 96b469c5e81ff51b917b92e8c3390642d4ded30c
PODFILE CHECKSUM: 836d4804218c0608e1326471ec83fe31cfa9c86d
PODFILE CHECKSUM: 0cfc1f35e2872ceb0a86252e14e226bd489a2602
COCOAPODS: 1.11.2

View File

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

View File

@@ -34,10 +34,10 @@
jitsiMeet.universalLinkDomains = @[@"meet.jit.si", @"alpha.jitsi.net", @"beta.meet.jit.si"];
jitsiMeet.defaultConferenceOptions = [JitsiMeetConferenceOptions fromBuilder:^(JitsiMeetConferenceOptionsBuilder *builder) {
[builder setFeatureFlag:@"welcomepage.enabled" withBoolean:YES];
[builder setFeatureFlag:@"resolution" withValue:@(360)];
[builder setFeatureFlag:@"ios.screensharing.enabled" withBoolean:YES];
builder.serverURL = [NSURL URLWithString:@"https://meet.jit.si"];
builder.welcomePageEnabled = YES;
// Apple rejected our app because they claim requiring a
// Dropbox account for recording is not acceptable.

View File

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

View File

@@ -91,10 +91,13 @@
#if 0
- (void)enterPictureInPicture:(NSDictionary *)data {
[self _onJitsiMeetViewDelegateEvent:@"ENTER_PICTURE_IN_PICTURE" withData:data];
}
#endif
- (void)readyToClose:(NSDictionary *)data {
[self _onJitsiMeetViewDelegateEvent:@"READY_TO_CLOSE" withData:data];
}
- (void)participantJoined:(NSDictionary *)data {
NSLog(@"%@%@", @"Participant joined: ", data[@"participantId"]);
}

View File

@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>21.5.0</string>
<string>21.6.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>21.5.0</string>
<string>21.6.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CLKComplicationPrincipalClass</key>

View File

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

View File

@@ -34,12 +34,6 @@
*/
@property (nonatomic, copy, nullable) NSString *token;
/**
* Color scheme override, see:
* https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/color-scheme/defaultScheme.js
*/
@property (nonatomic, copy, nullable) NSDictionary *colorScheme;
/**
* Feature flags. See: https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/flags/constants.js
*/
@@ -47,12 +41,6 @@
@property (nonatomic, readonly, nonnull) NSDictionary *config;
/**
* Set to YES to enable the welcome page. Typically SDK users won't need this enabled
* since the host application decides which meeting to join.
*/
@property (nonatomic) BOOL welcomePageEnabled;
/**
* Information about the local user. It will be used in absence of a token.
*/
@@ -82,11 +70,8 @@
@property (nonatomic, copy, nullable, readonly) NSString *room;
@property (nonatomic, copy, nullable, readonly) NSString *token;
@property (nonatomic, copy, nullable) NSDictionary *colorScheme;
@property (nonatomic, readonly, nonnull) NSDictionary *featureFlags;
@property (nonatomic, readonly) BOOL welcomePageEnabled;
@property (nonatomic, nullable) JitsiMeetUserInfo *userInfo;
+ (instancetype _Nonnull)fromBuilder:(void (^_Nonnull)(JitsiMeetConferenceOptionsBuilder *_Nonnull))initBlock;

View File

@@ -19,26 +19,17 @@
#import "JitsiMeetConferenceOptions+Private.h"
#import "JitsiMeetUserInfo+Private.h"
/**
* Backwards compatibility: turn the boolean property into a feature flag.
*/
static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
@implementation JitsiMeetConferenceOptionsBuilder {
NSMutableDictionary *_featureFlags;
NSMutableDictionary *_config;
}
@dynamic welcomePageEnabled;
- (instancetype)init {
if (self = [super init]) {
_serverURL = nil;
_room = nil;
_token = nil;
_colorScheme = nil;
_config = [[NSMutableDictionary alloc] init];
_featureFlags = [[NSMutableDictionary alloc] init];
@@ -96,19 +87,6 @@ static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
_config[config] = value;
}
#pragma mark - Dynamic properties
- (void)setWelcomePageEnabled:(BOOL)welcomePageEnabled {
[self setFeatureFlag:WelcomePageEnabledFeatureFlag
withBoolean:welcomePageEnabled];
}
- (BOOL)welcomePageEnabled {
NSNumber *n = _featureFlags[WelcomePageEnabledFeatureFlag];
return n != nil ? [n boolValue] : NO;
}
@end
@implementation JitsiMeetConferenceOptions {
@@ -116,16 +94,6 @@ static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
NSDictionary *_config;
}
@dynamic welcomePageEnabled;
#pragma mark - Dynamic properties
- (BOOL)welcomePageEnabled {
NSNumber *n = _featureFlags[WelcomePageEnabledFeatureFlag];
return n != nil ? [n boolValue] : NO;
}
#pragma mark - Internal initializer
- (instancetype)initWithBuilder:(JitsiMeetConferenceOptionsBuilder *)builder {
@@ -134,8 +102,6 @@ static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
_room = builder.room;
_token = builder.token;
_colorScheme = builder.colorScheme;
_config = builder.config;
_featureFlags = [NSDictionary dictionaryWithDictionary:builder.featureFlags];
@@ -161,10 +127,6 @@ static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
props[@"flags"] = [NSMutableDictionary dictionaryWithDictionary:_featureFlags];
if (_colorScheme != nil) {
props[@"colorScheme"] = self.colorScheme;
}
NSMutableDictionary *urlProps = [[NSMutableDictionary alloc] init];
// The room is fully qualified.

View File

@@ -23,7 +23,7 @@
*/
@property (nonatomic, copy, nullable) NSString *displayName;
/**
* User e-mail.
* User email.
*/
@property (nonatomic, copy, nullable) NSString *email;
/**

View File

@@ -111,4 +111,9 @@
*/
- (void)videoMutedChanged:(NSDictionary *)data;
/**
* Called when the SDK is ready to be closed. No meeting is happening at this point.
*/
- (void)readyToClose:(NSDictionary *)data;
@end

View File

@@ -114,6 +114,7 @@ RCT_EXPORT_METHOD(setProviderConfiguration:(NSDictionary *)dictionary) {
DDLogInfo(@"[RNCallKit][setProviderConfiguration:] dictionary = %@", dictionary);
if (![JMCallKitProxy isProviderConfigured]) {
JMCallKitProxy.enabled = true;
[self configureProviderFromDictionary:dictionary];
}

View File

@@ -1,6 +1,5 @@
/*
* Copyright @ 2019-present 8x8, Inc.
* Copyright @ 2018-2019 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.
@@ -18,7 +17,7 @@
import CallKit
import Foundation
public protocol CXProviderProtocol: class {
public protocol CXProviderProtocol: AnyObject {
var configuration: CXProviderConfiguration { get set }
func setDelegate(_ delegate: CXProviderDelegate?, queue: DispatchQueue?)
func reportNewIncomingCall(with UUID: UUID, update: CXCallUpdate, completion: @escaping (Error?) -> Void)
@@ -29,7 +28,7 @@ public protocol CXProviderProtocol: class {
func invalidate()
}
public protocol CXCallControllerProtocol: class {
public protocol CXCallControllerProtocol: AnyObject {
var calls: [CXCall] { get }
func request(_ transaction: CXTransaction, completion: @escaping (Error?) -> Swift.Void)
}
@@ -53,7 +52,9 @@ extension CXCallController: CXCallControllerProtocol {
public static var callKitProvider: CXProviderProtocol?
public static var callKitCallController: CXCallControllerProtocol?
private static var provider: CXProviderProtocol {
private static var defaultProvider: CXProvider?
private static var provider: CXProviderProtocol? {
callKitProvider ?? defaultProvider
}
@@ -64,8 +65,8 @@ extension CXCallController: CXCallControllerProtocol {
private static var providerConfiguration: CXProviderConfiguration? {
didSet {
guard let configuration = providerConfiguration else { return }
provider.configuration = configuration
provider.setDelegate(emitter, queue: nil)
provider?.configuration = configuration
provider?.setDelegate(emitter, queue: nil)
}
}
@@ -73,32 +74,27 @@ extension CXCallController: CXCallControllerProtocol {
return CXCallController()
}()
private static var defaultProvider: CXProvider = {
let configuration = CXProviderConfiguration(localizedName: "")
return CXProvider(configuration: configuration)
}()
private static let emitter: JMCallKitEmitter = {
return JMCallKitEmitter()
}()
/// Enables the proxy in between CallKit and the consumers of the SDK.
/// Defaults to enabled, set to false when you don't want to use CallKit.
@objc public static var enabled: Bool = true {
/// Defaults to disabled. Set to true when you want to use CallKit.
@objc public static var enabled: Bool = false {
didSet {
if callKitProvider == nil {
provider.invalidate()
provider?.invalidate()
}
if enabled {
guard isProviderConfigured() else { return }
let configuration = providerConfiguration ?? CXProviderConfiguration(localizedName: "")
if callKitProvider == nil {
defaultProvider = CXProvider(configuration: providerConfiguration!)
defaultProvider = CXProvider(configuration: configuration)
}
provider.setDelegate(emitter, queue: nil)
provider?.setDelegate(emitter, queue: nil)
} else {
provider.setDelegate(nil, queue: nil)
provider?.setDelegate(nil, queue: nil)
}
}
}
@@ -149,9 +145,9 @@ extension CXCallController: CXCallControllerProtocol {
let callUpdate = makeCXUpdate(handle: handle,
displayName: displayName,
hasVideo: hasVideo)
provider.reportNewIncomingCall(with: UUID,
update: callUpdate,
completion: completion)
provider?.reportNewIncomingCall(with: UUID,
update: callUpdate,
completion: completion)
}
@objc public static func reportCallUpdate(with UUID: UUID,
@@ -163,7 +159,7 @@ extension CXCallController: CXCallControllerProtocol {
let callUpdate = makeCXUpdate(handle: handle,
displayName: displayName,
hasVideo: hasVideo)
provider.reportCall(with: UUID, updated: callUpdate)
provider?.reportCall(with: UUID, updated: callUpdate)
}
@objc public static func reportCall(
@@ -171,17 +167,17 @@ extension CXCallController: CXCallControllerProtocol {
endedAt dateEnded: Date?,
reason endedReason: CXCallEndedReason) {
guard enabled else { return }
provider.reportCall(with: UUID,
endedAt: dateEnded,
reason: endedReason)
provider?.reportCall(with: UUID,
endedAt: dateEnded,
reason: endedReason)
}
@objc public static func reportOutgoingCall(
with UUID: UUID,
startedConnectingAt dateStartedConnecting: Date?) {
guard enabled else { return }
provider.reportOutgoingCall(with: UUID,
startedConnectingAt: dateStartedConnecting)
provider?.reportOutgoingCall(with: UUID,
startedConnectingAt: dateStartedConnecting)
}
@objc public static func reportOutgoingCall(
@@ -189,7 +185,7 @@ extension CXCallController: CXCallControllerProtocol {
connectedAt dateConnected: Date?) {
guard enabled else { return }
provider.reportOutgoingCall(with: UUID, connectedAt: dateConnected)
provider?.reportOutgoingCall(with: UUID, connectedAt: dateConnected)
}
@objc public static func request(

View File

@@ -20,7 +20,7 @@
"noResults": "لم يُعثَر على أي نتيجة بحث متطابقة",
"outlookEmail": "بريد مايكروسوفت",
"phoneNumbers": "أضف ارقام هواتف",
"search": "ابحث عن أشخاص",
"searching": "يبحث",
"shareInvite": "شارك دعوةً للاجتماع",
"shareLink": "شارك رابط الاجتماع لدعوة الأخرين",
"shareStream": "شارك رابط البث المباشر للاجتماع",
@@ -39,6 +39,28 @@
"audioOnly": {
"audioOnly": "معدل تبادل البيانات منخفض"
},
"blankPage": {
"meetingEnded": "انتهى الاجتماع."
},
"breakoutRooms": {
"defaultName": "غرفة الاجتماعات الفرعية رقم {{index}}",
"mainRoom": "الغرفة الرئيسية",
"actions": {
"add": "أضف غرفة جانبية",
"autoAssign": "التخصيص التلقائي للغرف الجانبية",
"close": "أغلق",
"join": "انضم",
"leaveBreakoutRoom": "اترك الغرفة الجانبية",
"more": "أكثر",
"remove": "إزالة",
"sendToBreakoutRoom": "أرسل المشارك إلى:"
},
"notifications": {
"joinedTitle": "غرف جانبية",
"joined": " الغرفة الجانبيةالانضمام إلى\"{{name}}\"",
"joinedMainRoom": "الانضمام للغرفة الرئيسية"
}
},
"calendarSync": {
"addMeetingURL": "أضف رابطًا لاجتماع",
"confirmAddLink": "هل تريد إضافة رابط جيستسي لهذا الحدث؟",
@@ -161,7 +183,7 @@
"tryAgainButton": "جرب مرة أخرى في تطبيق الحاسوب"
},
"defaultLink": "{{url}} مثلًا",
"defaultNickname": "محمد عمر مثلًا",
"defaultNickname": "محمد علي مثلًا",
"deviceError": {
"cameraError": "فشل الوصول إلى كاميرتك",
"cameraPermission": "خطأ في تحصيل إذن استخدام كاميرتك",
@@ -190,8 +212,8 @@
"cameraNotSendingData": "لا نتمكن من الوصول إلى كاميرتك. تحقَّق رجاءً إن كان أي تطبيق آخر يستعملها، أو اختر جهازًا آخر من القائمة أو جرب تحميل التطبيق مجدَّدًا.",
"cameraNotSendingDataTitle": "يصعب الوصول الوصول إلى كاميرتك",
"cameraPermissionDeniedError": "لم تُمنَح إذن استعمال الكاميرا. لا يزال بإمكانك حضور المؤتمر ولكن لن يراك الآخرون. استعمال زر الكاميرا في شريط العنوان لمحاول إصلاح المشكلة.",
"cameraUnknownError": "يصعب استعمال الكاميرا لأسباب مجهولة.",
"cameraTimeoutError": "تعذر بدء مصدر الفيديو. انتهت المهلة!",
"cameraUnknownError": "يصعب استعمال الكاميرا لأسباب مجهولة.",
"cameraUnsupportedResolutionError": "لا تدعم كاميرتك دقة الفيديو المطلوبة.",
"Cancel": "ِألغ",
"close": "أغلق",
@@ -249,34 +271,34 @@
"micNotSendingData": "اذهب إلى إعدادات حاسوبك لإلغاء كتم المجهار (المايكروفون) وضبط مستواه",
"micNotSendingDataTitle": "كتم ضبط الإعدادات لديك المجهار (المايكروفون)",
"micPermissionDeniedError": "لم تعط إذن استعمال المجهار (المايكروفون) الخاص بك. ما يزال بإمكانك الإنضمام إلى المؤتمر ولكن دون أن يسمعك الآخرون. جرب استعمال زر الكاميرا في شريط العنوان لإصلاح هذه المشكلة.",
"micTimeoutError": "Could not start audio source. Timeout occured!",
"micUnknownError": "Cannot use microphone for an unknown reason.",
"moderationAudioLabel": "Allow attendees to unmute themselves",
"moderationVideoLabel": "Allow attendees to start their video",
"micTimeoutError": "تعذر بدء مصدر الصوت. انقضت المهلة!",
"micUnknownError": "لا يمكن استخدام الميكروفون لسبب غير معروف.",
"moderationAudioLabel": "السماح للحاضرين بإعادة الصوت بأنفسهم",
"moderationVideoLabel": "السماح للحاضرين ببدء الفيديو الخاص بهم",
"muteEveryoneElseDialog": "بمجرد أن تكتمهم، لن تتمكن نم إلغاء الكتم هذا، ولكن يمكنهم إلغاء كتم أنفسهم في أي وقت.",
"muteEveryoneElseTitle": "أتريد كتم الجميع باستثناء {{whom}}?",
"muteEveryoneDialog": "أمتأكد من رغبتك بكتم الجميع؟ لن تتمكن من إلغاء الكتم ولكن يمكنهم إلغاء كتم أنفسهم في أي وقت.",
"muteEveryoneDialogModerationOn": "The participants can send a request to speak at any time.",
"muteEveryoneDialogModerationOn": "يمكن للمشاركين إرسال طلب للتحدث في أي وقت.",
"muteEveryoneTitle": "أتريد كتم الجميع؟",
"muteEveryoneElsesVideoDialog": "Once the camera is disabled, you won't be able to turn it back on, but they can turn it back on at any time.",
"muteEveryoneElsesVideoTitle": "Stop everyone's video except {{whom}}?",
"muteEveryonesVideoDialog": "The participants can turn on their video at any time.",
"muteEveryonesVideoDialogModerationOn": "The participants can send a request to turn on their video at any time.",
"muteEveryonesVideoDialogOk": "Disable",
"muteEveryonesVideoTitle": "Stop everyone's video?",
"muteEveryoneElsesVideoDialog": "بمجرد تعطيل الكاميرا ، لن تتمكن من إعادة تشغيلها ، ولكن يمكنهم إعادة تشغيلها في أي وقت.",
"muteEveryoneElsesVideoTitle": "وقف فيديو الجميع باستثناء {{whom}}?",
"muteEveryonesVideoDialog": "يمكن للمشاركين تشغيل الفيديو الخاص بهم في أي وقت.",
"muteEveryonesVideoDialogModerationOn": "يمكن للمشاركين إرسال طلب لتشغيل الفيديو الخاص بهم في أي وقت.",
"muteEveryonesVideoDialogOk": "إبطال",
"muteEveryonesVideoTitle": "وقف فيديو الجميع؟",
"muteEveryoneSelf": "اكتم نفسك أيضًا",
"muteEveryoneStartMuted": "البدء مع كتم الجميع من الآن فصاعدًا",
"muteParticipantBody": "لن تتكمن من إلغاء كتمهم، ولكن يمكنهم إلغاء كتم أنفسهم في أي وقت.",
"muteParticipantButton": "كتم",
"muteParticipantDialog": "أمتأكد من رغبتك لهذا المشارك؟ لن تتمكن من إلغاء الكتم ولكن يمكنه إلغاء كتم أنفسهم في أي وقت.",
"muteParticipantsVideoDialog": "هل أنت متأكد أنك تريد إيقاف تشغيل كاميرا هذا المشارك؟ لن تتمكن من إعادة تشغيل الكاميرا ، ولكن يمكنهم إعادة تشغيلها في أي وقت.",
"muteParticipantTitle": "أتريد كتم هذا المشارك؟",
"muteParticipantsVideoDialogModerationOn": "هل أنت متأكد أنك تريد إيقاف تشغيل كاميرا هذا المشارك؟ لن تكون قادرًا على إعادة تشغيل الكاميرا ولن يفعلوا ذلك أيضًا.",
"muteParticipantsVideoButton": "وقف الكاميرا",
"muteParticipantsVideoTitle": "تعطيل الكاميرا لهذا المشارك؟",
"muteParticipantsVideoBody": "لن تتمكن من إعادة تشغيل الكاميرا ، ولكن يمكنهم إعادة تشغيلها في أي وقت.",
"muteParticipantsVideoBodyModerationOn": "لن تكون قادرًا على إعادة تشغيل الكاميرا ولن يفعلوا ذلك أيضًا.",
"noDropboxToken": "لا يوجد رمز مميز صالح لـ Dropbox",
"Ok": "تمام",
"password": "Password",
"password": "كلمه السر",
"passwordLabel": "جعل عضو ما هذا الاجتماع مغلقًا. أدخل رجاءً $t(lockRoomPassword) للإنضمام.",
"passwordNotSupported": "ضبط اجتماع $t(lockRoomPassword) غير مدعوم.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) غير مدعوم",
@@ -318,12 +340,12 @@
"sessionRestarted": "إعادة الاتصال من الجسر",
"Share": "شارك",
"shareAudio": "استمر",
"shareAudioTitle" : "How to share audio",
"shareAudioWarningTitle": "You need to stop screen sharing before sharing audio",
"shareAudioWarningH1": "If you want to share just audio:",
"shareAudioWarningD1": "you need to stop screen sharing before sharing your audio.",
"shareAudioWarningD2": "you need to restart your screen sharing and check the \"share audio\" option.",
"shareMediaWarningGenericH2": "If you want to share your screen and audio",
"shareAudioTitle": "كيفية مشاركة الصوت",
"shareAudioWarningTitle": "تحتاج إلى إيقاف مشاركة الشاشة قبل مشاركة الصوت",
"shareAudioWarningH1": "إذا كنت تريد مشاركة الصوت فقط:",
"shareAudioWarningD1": "تحتاج إلى إيقاف مشاركة الشاشة قبل مشاركة الصوت الخاص بك.",
"shareAudioWarningD2": "تحتاج إلى إعادة تشغيل مشاركة الشاشة والتحقق من خيار مشاركة الصوت .",
"shareMediaWarningGenericH2": "إذا كنت ترغب في مشاركة شاشتك والصوت",
"shareVideoLinkError": "زودنا برابط يوتيوب صحيح",
"shareVideoTitle": "شارك فيديو",
"shareYourScreen": "شارك شاشتك",
@@ -334,7 +356,7 @@
"shareScreenWarningTitle": "تحتاج إلى إيقاف مشاركة الصوت قبل مشاركة شاشتك",
"shareScreenWarningH1": "إذا كنت تريد مشاركة شاشتك فقط:",
"shareScreenWarningD1": "تحتاج إلى إيقاف مشاركة الصوت قبل مشاركة شاشتك.",
"shareScreenWarningD2": "you need to stop audio sharing, start screen sharing and check the \"share audio\" option.",
"shareScreenWarningD2": "تحتاج إلى إيقاف مشاركة الصوت وبدء مشاركة الشاشة وتحديد خيار مشاركة الصوت .",
"sharedVideoLinkPlaceholder": "رابط اليوتيوب او رابط الفيديو المباشر",
"stopLiveStreaming": "أوقف البث الحي",
"stopRecording": "أوقف التسجيل",
@@ -357,7 +379,7 @@
"viewUpgradeOptionsTitle": "لقد اكتشفت ميزة مميزة!",
"WaitForHostMsg": "لم يبدأ المؤتمر <b>{{room}}</b> بعد. إن كنت المضيف والراعي، فنرجو تأكيد ذلك عبر الاستيثاق أو انتظر وصول المضيف رجاءً. ",
"WaitForHostMsgWOk": "لم يبدأ المؤتمر <b>{{room}}</b> بعد. إن كنت المضيف والراعي، فاضغط على «تمام» للاستيثاق أو انتظر وصول المضيف رجاءً.",
"WaitingForHost": "ننتظر وصول المضيف ...",
"WaitingForHostTitle": "في انتظار المضيف ...",
"Yes": "نعم",
"yourEntireScreen": "شاشتك كاملةً",
"remoteUserControls": "ضوابط المستخدم عن بعد لـ {{username}}",
@@ -386,15 +408,15 @@
"none": "بدون",
"uploadedImage": "تحميل الصورة {{index}}",
"deleteImage": "حذف صورة",
"image1" : "Beach",
"image2" : "جدار أبيض محايد",
"image3" : "غرفة بيضاء فارغة",
"image4" : "مصباح أرضي أسود",
"image5" : "جبل",
"image6" : "غابة",
"image7" : "شروق الشمس",
"image1": "شاطئ",
"image2": "جدار أبيض محايد",
"image3": "غرفة بيضاء فارغة",
"image4": "مصباح أرضي أسود",
"image5": "جبل",
"image6": "غابة",
"image7": "شروق الشمس",
"desktopShareError": "تعذر إنشاء مشاركة سطح المكتب",
"desktopShare":"مشاركة سطح المكتب",
"desktopShare": "مشاركة سطح المكتب",
"webAssemblyWarning": "WebAssembly غير مدعوم",
"backgroundEffectError": "فشل تطبيق تأثير الخلفية."
},
@@ -423,7 +445,7 @@
"country": "البلد",
"dialANumber": "إن أردت الإنضمام إلى الإجتماع، اتصل بأحد الأرقام التالية ثم أدخل رمز المرور",
"dialInConferenceID": "رمز المرور (PIN):",
"copyNumber":"إنسخ الرقم",
"copyNumber": "إنسخ الرقم",
"dialInNotSupported": "عذرًا، الاتصال غير مدعوم حاليًا.",
"dialInNumber": "اتصل:",
"dialInSummaryError": "خطأ في تحصيل معلومات الاتصال. جرب مرة أخرى لاحقًا.",
@@ -432,11 +454,11 @@
"inviteLiveStream": "لمشاهدة البث الحي لهذا الإجتماع، اضط على هذا الرابط: {{url}}",
"invitePhone": "للإنضمام من الهاتف، استعمل: {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "أتبحث عن رقم اتصال مختلف؟\nأنظر أرقام الوصول إلى هذا الإجتماع: {{url}}\n\n\nإن كنت أيضًا تتصل عبر غرفة اتصال (room phone)، انضم دون الاتصال بالصوت: {{silentUrl}}",
"inviteSipEndpoint": "To join using the SIP address, enter this: {{sipUri}}",
"inviteTextiOSPersonal": "{{name}} is inviting you to a meeting.",
"inviteTextiOSJoinSilent": "If you are dialing-in through a room phone, use this link to join without connecting to audio: {{silentUrl}}.",
"inviteTextiOSInviteUrl": "Click the following link to join: {{inviteUrl}}.",
"inviteTextiOSPhone": "To join via phone, use this number: {{number}},,{{conferenceID}}#. If you are looking for a different number, this is the full list: {{didUrl}}.",
"inviteSipEndpoint": "للانضمام باستخدام عنوان SIP ، أدخل هذا: {{sipUri}}",
"inviteTextiOSPersonal": "{{name}} يدعوك إلى اجتماع.",
"inviteTextiOSJoinSilent": "إذا كنت تقوم بالاتصال من خلال هاتف الغرفة ، فاستخدم هذا الارتباط للانضمام دون الاتصال بالصوت: {{silentUrl}}.",
"inviteTextiOSInviteUrl": "انقر فوق الرابط التالي للانضمام: {{inviteUrl}}.",
"inviteTextiOSPhone": "للانضمام عبر الهاتف ، استخدم هذا الرقم: {{number}},,{{conferenceID}}#. إذا كنت تبحث عن رقم مختلف ، فهذه هي القائمة الكاملة: {{didUrl}}.",
"inviteURLFirstPartGeneral": "دُعيِت للإنضمام إلى اجتماع",
"inviteURLFirstPartPersonal": "دعاك {{name}} لاجتماع.\n",
"inviteURLSecondPart": "\nانضم للاجتماع:\n{{url}}\n",
@@ -466,7 +488,7 @@
"support": "الدعم",
"supportMsg": "إن تكرَّر حصول هذا، تواصل مع"
},
"jitsiHome": "{{logo}} Logo, links to Homepage",
"jitsiHome": "{{logo}} الشعار ، رابط إلى الصفحة الرئيسية",
"keyboardShortcuts": {
"focusLocal": "ركز على الفيديو الخاص بك",
"focusRemote": "ركز على فيديو مشارك آخر",
@@ -501,6 +523,7 @@
"expandedPending": "تبدأ عملية البث الحي...",
"failedToStart": "فشلت عملية بدء البث الحي",
"getStreamKeyManually": "لم نتمكن من الوصول إلى أي بث حي. جرب جلب مفتاح بث حي خاص بك من يوتيوب.",
"inProgress": "البث المباشر غير ممكّن على {{email}}. يرجى تمكين البث المباشر أو تسجيل الدخول إلى حساب مع تمكين البث المباشر.",
"invalidStreamKey": "يحتمل كون مفتاح البث الحي غير صحيح.",
"off": "أُوقِف البث الحي",
"offBy": "أوقف {{name}} البث الحي",
@@ -508,6 +531,7 @@
"onBy": "بدأ {{name}} بثًّا حيًّا",
"pending": "بدء بثٍّ حيٍّ",
"serviceName": "خدمة البث الحي",
"sessionAlreadyActive": "هذه الجلسة قيد التسجيل أو البث المباشر.",
"signedInAs": "أنت مسجل حاليًا بصفة:",
"signIn": "سجل الدخول عبر حساب غوغل",
"signInCTA": "سجل الدخول أو أدخل مفتاح البث الحي الخاص بك من يوتيوب",
@@ -551,8 +575,10 @@
"lockRoomPasswordUppercase": "كلمة المرور",
"me": "أنا",
"notify": {
"allowAction": "Allow",
"allowedUnmute": "You can unmute your microphone, start your camera or share your screen.",
"allowAction": "يسمح",
"allowedUnmute": "يمكنك إعادة صوت الميكروفون و بدء تشغيل الكاميرا أو مشاركة شاشتك.",
"audioUnmuteBlockedTitle": "تم حظر إعادة صوت الميكروفون!",
"audioUnmuteBlockedDescription": "تم حظر عملية إلغاء كتم صوت الميكروفون مؤقتًا بسبب قيود النظام.",
"connectedOneMember": "انضم {{name}} للاجتماع",
"connectedThreePlusMembers": "انضم {{name}} وعدد {{count}} غيره إلى الاجتماع",
"connectedTwoMembers": "انضم {{first}} و {{second}} إلى الاجتماع",
@@ -564,19 +590,23 @@
"invitedThreePlusMembers": "دُعِي {{name}} وعدد {{count}} آخرين",
"invitedTwoMembers": "دُعِي {{first}} و {{second}}",
"kickParticipant": "طرد {{kicked}} المشارك {{kicker}}",
"leftOneMember": "{{name}} غادر الاجتماع",
"leftThreePlusMembers": "غادر {{name}} والعديد من الأشخاص الآخرين الاجتماع",
"leftTwoMembers": "غادر {{first}} و {{second}} الاجتماع",
"me": "أنا",
"moderator": "مُنحَت صلاحية رئيس الجلسة!",
"muted": "بدأ المحادثة مكتوب الصوت.",
"mutedTitle": "مكتوم!",
"mutedRemotelyTitle": "كتم {{participantDisplayName}} الصوت لديك!",
"mutedRemotelyDescription": "يمكنك إلغاء الكتم متى كنت جاهزًا للتحدث. اكتم الصوت بعد الانتهاء من التحدث لخفض الضجيج أثناء الاجتماع",
"videoMutedRemotelyTitle": "Your video has been turned off by {{participantDisplayName}}",
"videoMutedRemotelyDescription": "You can always turn it on again.",
"passwordRemovedRemotely": "أزال أحد المشاركين {{participantDisplayName}}",
"passwordSetRemotely": "ضبط أحد المشاركين $t(lockRoomPasswordUppercase)",
"raisedHand": "يريد {{name}} التحدث",
"screenShareNoAudio": " Share audio box was not checked in the window selection screen.",
"screenShareNoAudioTitle": "Couldn't share system audio!",
"screenShareNoAudio": " Share audio box was not checked in the window selection screen.",
"screenShareNoAudioTitle": "Couldn't share system audio!",
"raisedHands": "{{participantName}} و {{raisedHands}}المزيد من الناس",
"screenShareNoAudio": "لم يتم تحديد مربع مشاركة الصوت في شاشة تحديد النافذة.",
"screenShareNoAudioTitle": "تعذرت مشاركة صوت النظام!",
"somebody": "شخص ما",
"startSilentTitle": "انضممت دون مخرج للصوت!",
"startSilentDescription": "أنضم مجدَّدًا للاجتماع لتفعيل الصوت",
@@ -590,28 +620,31 @@
"oldElectronClientDescription1": "يبدو أنَّك تستعمل إصدارًا قديمًا من جيتسي يحوي ثغرة أمنية. تأكد رجاءً من أنَّك حدَّثته إلى ",
"oldElectronClientDescription2": "أحدث إصدار",
"oldElectronClientDescription3": " الآن!",
"moderationInEffectDescription": "Please raise hand if you want to speak.",
"moderationInEffectCSDescription": "Please raise hand if you want to share your screen.",
"moderationInEffectVideoDescription": "Please raise your hand if you want to start your camera.",
"moderationInEffectTitle": "Your microphone is muted by the moderator",
"moderationInEffectCSTitle": "Screen sharing is blocked by the moderator",
"moderationInEffectVideoTitle": "Your camera is blocked by the moderator",
"moderationRequestFromModerator": "The host would like you to unmute",
"moderationRequestFromParticipant": "Wants to speak",
"moderationStartedTitle": "Moderation started",
"moderationStoppedTitle": "Moderation stopped",
"moderationToggleDescription": "by {{participantDisplayName}}",
"raiseHandAction": "Raise hand",
"reactionSounds": "Disable sounds",
"groupTitle": "Notifications"
"moderationInEffectDescription": "من فضلك ارفع يدك إذا كنت تريد التحدث.",
"moderationInEffectCSDescription": "يرجى رفع اليد إذا كنت تريد مشاركة شاشتك.",
"moderationInEffectVideoDescription": "يرجى رفع يدك إذا كنت تريد بدء تشغيل الكاميرا.",
"moderationInEffectTitle": "تم كتم صوت الميكروفون الخاص بك بواسطة المشرف",
"moderationInEffectCSTitle": "تم حظر مشاركة الشاشة من قبل المشرف",
"moderationInEffectVideoTitle": "تم حظر الكاميرا الخاصة بك من قبل المشرف",
"moderationRequestFromModerator": "المضيف يريد منك إلغاء كتم الصوت",
"moderationRequestFromParticipant": "يريد التحدث",
"moderationStartedTitle": "بدأ الاشراف",
"moderationStoppedTitle": "توقف الاشراف",
"moderationToggleDescription": "من {{participantDisplayName}}",
"raiseHandAction": "رفع اليد",
"reactionSounds": "تعطيل الأصوات",
"reactionSoundsForAll": "تعطيل الأصوات للجميع",
"groupTitle": "إشعارات",
"videoUnmuteBlockedTitle": "تم حظر إعادة الكاميرا!",
"videoUnmuteBlockedDescription": "تم حظر عملية إلغاء كتم الكاميرا مؤقتًا بسبب قيود النظام."
},
"participantsPane": {
"close": "Close",
"header": "Participants",
"close": "غلق",
"header": "مشاركون",
"headings": {
"lobby": "Lobby ({{count}})",
"lobby": "الردهة ({{count}})",
"participantsList": "المشاركون في الاجتماع({{count}})",
"waitingLobby": "Waiting in lobby ({{count}})"
"waitingLobby": "منتظرون في الردهة ({{count}})"
},
"actions": {
"allow": "السماح للحاضرين بـ:",
@@ -620,43 +653,48 @@
"blockEveryoneMicCamera": "حظر ميكروفون وكاميرا الجميع",
"invite": "قم بدعوة شخص ما",
"askUnmute": "اطلب إعادة الصوت",
"moreModerationActions": "المزيد من خيارات الاشراف",
"moreParticipantOptions": "المزيد من خيارات المشاركين",
"mute": "كتم الصوت",
"muteAll": "كتم الكل",
"muteEveryoneElse": "كتم صوت الآخرين",
"stopEveryonesVideo": "أوقف فيديو الجميع",
"stopVideo": "أوقف الفيديو",
"unblockEveryoneMicCamera": "قم بإلغاء حظر ميكروفون وكاميرا الجميع",
"videoModeration": "ابدأ الفيديو الخاص بهم"
}
"videoModeration": "ابدأ الفيديو الخاص بهم",
"moreModerationControls": "المزيد من ضوابط الاشراف"
},
"search": "بحث"
},
"passwordSetRemotely": "ضبطها مشارك آخر",
"passwordDigitsOnly": "حتى {{number}} عدد",
"polls": {
"by": "من",
"create": {
"addOption": "Add option",
"answerPlaceholder": "Option {{index}}",
"create": "Create a poll",
"cancel": "Cancel",
"pollOption" : "Poll option {{index}}",
"pollQuestion" : "Poll Question",
"questionPlaceholder": "Ask a question",
"removeOption": "Remove option",
"send": "Send"
"addOption": "إضافة خيار",
"answerPlaceholder": "خيار {{index}}",
"create": "إنشاء استطلاع",
"cancel": "إلغاء",
"pollOption": "خيار الاستطلاع {{index}}",
"pollQuestion": "سؤال الاستطلاع",
"questionPlaceholder": "طرح سؤال",
"removeOption": "إزالة خيار",
"send": "أرسل"
},
"answer": {
"skip": "Skip",
"submit": "Submit"
"skip": "تخطى",
"submit": "يقدم"
},
"results": {
"vote": "Vote",
"changeVote": "Change vote",
"empty": "There are no polls in the meeting yet. Start a poll here!",
"hideDetailedResults": "Hide details",
"showDetailedResults": "Show details"
"vote": "تصويت",
"changeVote": "تغيير التصويت",
"empty": "لا توجد استطلاعات للرأي في الاجتماع حتى الآن. ابدأ الاستطلاع هنا!",
"hideDetailedResults": "أخفِ التفاصيل",
"showDetailedResults": "اظهر التفاصيل"
},
"notification": {
"title": "A new poll was added to this meeting",
"description": "Open polls tab to vote"
"title": "تمت إضافة اقتراع جديد إلى هذا الاجتماع",
"description": "افتح علامة تبويب الاقتراع للتصويت"
}
},
"poweredby": "مُشغَّل بوساطة",
@@ -699,7 +737,7 @@
"errorDialOutFailed": "فشلت عملية الاتصال، للأسف.",
"errorDialOutStatus": "خطأ في معرفة حالة الاتصال",
"errorMissingName": "أدخل اسمك للدخول للاجتماع",
"errorNoPermissions": "You need to enable microphone and camera access",
"errorNoPermissions": "تحتاج إلى تمكين الوصول إلى الميكروفون والكاميرا",
"errorStatusCode": "فشل الاتصال برمز خطأ: {{status}}",
"errorValidation": "فشل التحقق من الرقم",
"iWantToDialIn": "أريد الاتصال",
@@ -712,8 +750,8 @@
"or": "أو",
"premeeting": "ما قبل الاجتماع",
"showScreen": "تفعيل واجهة ما قبل الاجتماع",
"keyboardShortcuts": "تفعيل اختصارات لوحة المفاتيح",
"startWithPhone": "البدء مع جهاز الصوت من الجوال",
"keyboardShortcuts" : "تفعيل اختصارات لوحة المفاتيح",
"screenSharingError": "خطأ في مشاركة الشاشة:",
"videoOnlyError": "خطأ في الفيديو:",
"videoTrackError": "لم نتمكن من إنشاء ملف الفيديو",
@@ -751,13 +789,14 @@
"busyTitle": "جميع المسجلين مشغولون حاليًا",
"copyLink": "Copy Link",
"error": "فشل التسجيل. حاول مرة أخرى.",
"errorFetchingLink": "Error fetching recording link.",
"errorFetchingLink": "خطأ في جلب رابط التسجيل.",
"expandedOff": "أوقٍف التسجيل",
"expandedOn": "يُسجَّل الاجتماع الآن",
"expandedPending": "بدء التسجيل...",
"failedToStart": "فشل بدء التسجيل",
"fileSharingdescription": "شارك التسجيل مع المشاركين للاجتماع",
"linkGenerated": "We have generated a link to your recording.",
"inProgress": "التسجيل أو البث المباشر قيد التقدم",
"linkGenerated": "لقد أنشأنا رابطًا لتسجيلك.",
"live": "مباشر",
"loggedIn": "مُسجَّل باسم {{userName}}",
"off": "أوقِف التسجيل",
@@ -767,13 +806,14 @@
"pending": "التحضير لتسجيل الاجتماع...",
"rec": "تسجيل",
"serviceDescription": "ستحفظ خدمة التسجيل الفيديو المستجل",
"serviceDescriptionCloud": "Cloud recording",
"serviceDescriptionCloud": "تسجيل سحابي",
"serviceName": "خدمة التسجيل",
"sessionAlreadyActive": "هذه الجلسة قيد التسجيل أو البث المباشر.",
"signIn": "دخول",
"signOut": "خروج",
"unavailable": "عجبًا! {{serviceName}} غير متاحة حاليًا. نعمل على حل المشكلة. حاول مرة أخرى لاحقًا.",
"unavailableTitle": "التسجيل غير متاح",
"uploadToCloud": "Upload to the cloud"
"uploadToCloud": "تحميل إلى السحابة"
},
"sectionList": {
"pullToRefresh": "اسحب للتحديث"
@@ -817,6 +857,7 @@
"sounds": "اصوات",
"speakers": "المذياع (مكبر الصوت)",
"startAudioMuted": "بدء الجميع مكتومي الصوت",
"startReactionsMuted": "كتم رد فعل الصوت للجميع",
"startVideoMuted": "بدء الجميع دون فيديو",
"talkWhileMuted": "تحدث أثناء كتم الصوت",
"title": "الإعدادات"
@@ -849,17 +890,24 @@
},
"speaker": "المتحدث",
"speakerStats": {
"search": "Search",
"search": "بحث",
"hours": "{{count}}س",
"minutes": "{{count}}د",
"name": "الاسم",
"seconds": "{{count}}ثا",
"speakerStats": "حالة المتحدث",
"speakerTime": "وقت المتحدث"
"speakerTime": "وقت المتحدث",
"happy": "سعيد",
"neutral": "حيادي",
"sad": "حزين",
"surprised": "مندهش",
"angry": "غاضب",
"fearful": "خائف",
"disgusted": "مشمئز"
},
"startupoverlay": {
"policyText": " ",
"genericTitle": "The meeting needs to use your microphone and camera.",
"genericTitle": "يحتاج الاجتماع إلى استخدام الميكروفون والكاميرا.",
"title": "يريد {{app}} استعمال المجهار والكاميرا خاصَّتك."
},
"suspendedoverlay": {
@@ -872,10 +920,11 @@
"audioOnly": "بدل الصوت فقط",
"audioRoute": "اختر جهاز الصوت",
"boo": "Boo",
"breakoutRoom": "الانضمام / مغادرة غرفة فرعية",
"callQuality": "اضبط دقة الفيديو",
"cc": "اظهِر/اخفِ الترجمة",
"chat": "اظهِر/اخفِ نافذة الدردشة",
"clap": "Clap",
"clap": "تصفيق",
"document": "اظهِر/اخفِ الملف المشارك",
"download": "نزِّل التطبيق",
"embedMeeting": "ضمِّن الاجتماع",
@@ -886,8 +935,8 @@
"help": "مساعدة",
"invite": "ادعُ آخرين",
"kick": "اطرد مشاركًا",
"laugh": "Laugh",
"like": "Thumbs Up",
"laugh": "يضحك",
"like": "رفع الإبهام متمنيا النجاح",
"lobbyButton": "فعِّل/عطِّل وضع غرفة الانتظار",
"localRecording": "اظهِر/اخفِ التحكم بالتسجيل المحلي",
"lockRoom": "اظهِر/اخفِ كلمة مرور الاجتماع",
@@ -918,7 +967,7 @@
"show": "اظهر على المنصة",
"silence": "Silence",
"speakerStats": "اظهِر/اخفِ حالة المتحدث",
"surprised": "Surprised",
"surprised": "مندهش",
"tileView": "اظهِر/اخفِ عرض العنوان",
"toggleCamera": "بدِّل الكاميرا",
"toggleFilmstrip": "بدِّل وضع الشريط السينمائي (filmstrip)",
@@ -938,7 +987,7 @@
"boo": "Boo",
"callQuality": "اضبط دقة الفيديو",
"chat": "افتح / أغلق الشاشة",
"clap": "Clap",
"clap": "تصفيق",
"closeChat": "أغلق الدردشة",
"closeReactionsMenu": "إغلاق قائمة ردود الفعل",
"disableReactionSounds": "يمكنك تعطيل أصوات ردود الفعل لهذا الاجتماع",
@@ -955,8 +1004,10 @@
"hangup": "غادر",
"help": "مساعدة",
"invite": "ادعُ أحدًا",
"laugh": "Laugh",
"like": "Thumbs Up",
"joinBreakoutRoom": "انضم إلى غرفة الجانبية",
"laugh": "يضحك",
"leaveBreakoutRoom": "اترك إلى غرفة الجانبية",
"like": "رفع الإبهام متمنيا النجاح",
"lobbyButtonDisable": "عطِّل وضع غرفة الانتظار",
"lobbyButtonEnable": "فعِّل وضع غرفة الانتظار",
"login": "ادخل",
@@ -982,19 +1033,19 @@
"profile": "عدِّل ملفك الشخصي",
"raiseHand": "ارفع / اخفض يدك",
"raiseYourHand": "ارفع يدك",
"reactionBoo": "Send boo reaction",
"reactionClap": "Send clap reaction",
"reactionLaugh": "Send laugh reaction",
"reactionLike": "Send thumbs up reaction",
"reactionSilence": "Send silence reaction",
"reactionSurprised": "Send surprised reaction",
"reactionBoo": "أرسل رد فعل بوو",
"reactionClap": "أرسل رد فعل التصفيق",
"reactionLaugh": "أرسل رد فعل يضحك",
"reactionLike": "إرسال رد فعل ممتاز",
"reactionSilence": "أرسل رد فعل الصمت",
"reactionSurprised": "أرسل رد فعل متفاجئًا",
"security": "خيارات الحماية",
"Settings": "الإعدادات",
"shareaudio": "مشاركة الصوت",
"sharedvideo": "شارك فيديو يوتيوب",
"shareRoom": "ادعُ أحدًا",
"shortcuts": "اعرض الاختصارات",
"silence": "Silence",
"silence": "سكوت",
"speakerStats": "حالة المتحدث",
"startScreenSharing": "ابدأ بمشاركة الشاشة",
"startSubtitles": "أظهر الترجمة",
@@ -1002,7 +1053,7 @@
"stopScreenSharing": "أوقف مشاركة الشاشة",
"stopSubtitles": "أخفِ الترجمة",
"stopSharedVideo": "أوقف فيديو يوتيوب المشارك",
"surprised": "Surprised",
"surprised": "مندهش",
"talkWhileMutedPopup": "أتحاول التحدث؟ المجهار مكتوم لديك.",
"tileViewToggle": "بدِّل عنوان العرض",
"toggleCamera": "بدِّل الكاميرا",
@@ -1033,7 +1084,7 @@
"react-nativeGrantPermissions": "اختر <b><i>السماح</i></b> عندما يطلب المتصفح الأذونات.",
"safariGrantPermissions": "اختر <b><i>تمام</i></b> عندما يطلب المتصفح الأذونات."
},
"volumeSlider": "Volume slider",
"volumeSlider": "مستوى الصوت",
"videoSIPGW": {
"busy": "نعمل على تحرير الموارد. حاول مرة أخرى لاحقًا بعد بضعة دقائق.",
"busyTitle": "خدمة الغرفة مشغولة حاليًا",
@@ -1045,7 +1096,10 @@
"pending": "دعي {{displayName}} مسبقًا"
},
"videoStatus": {
"adjustFor": "ضبط ل:",
"audioOnly": "صوت",
"bestPerformance": "أفضل أداء",
"highestQuality": "اعلى جودة",
"audioOnlyExpanded": "أنت في وضع معدَّل البيانات المتبادلة المنخفض. الصوت ومشاركة الشاشة هو المتاح فقط في هذا الوضع.",
"callQuality": "جودة الفيديو",
"hd": "دقة عالية",
@@ -1056,6 +1110,7 @@
"ld": "دقة منخفضة",
"ldTooltip": "عرض فيديو بدقة منخفضة",
"lowDefinition": "دقة منخفضة",
"performanceSettings": "إعدادات الأداء",
"sd": "دقة قياسية",
"sdTooltip": "عرض فيديو بدقة قياسية",
"standardDefinition": "دقة قياسية"
@@ -1078,7 +1133,7 @@
"videomute": "أوقف المشارك الكاميرا"
},
"welcomepage": {
"addMeetingName": "Add Meeting name",
"addMeetingName": "أضف اسم الاجتماع",
"accessibilityLabel": {
"join": "انقر للمشاركة",
"roomname": "أدخل اسم الغرفة"
@@ -1095,14 +1150,14 @@
"getHelp": "أريد مساعدة",
"go": "ابدأ",
"goSmall": "ابدأ",
"headerTitle": "Jitsi Meet",
"headerSubtitle": "Secure and high quality meetings",
"headerTitle": "حِـــوار جيتسي",
"headerSubtitle": "آمــن وبنـوعيـة فـائقـة الجـودة",
"info": "معلومات",
"join": "أنشئ / انضم",
"jitsiOnMobile": "Jitsi on mobile download our apps and start a meeting from anywhere",
"mobileDownLoadLinkIos": "Download mobile app for iOS",
"mobileDownLoadLinkAndroid": "Download mobile app for Android",
"mobileDownLoadLinkFDroid": "Download mobile app for F-Droid",
"jitsiOnMobile": "جيتسي على الهاتف المحمول - حمّل تطبيقاتنا وابدأ اجتماعًا من أي مكان",
"mobileDownLoadLinkIos": "قم بتنزيل تطبيق الهاتف لنظام iOS",
"mobileDownLoadLinkAndroid": "قم بتنزيل تطبيق الهاتف لنظام أندرويد",
"mobileDownLoadLinkFDroid": "قم بتنزيل تطبيق الجوال لـ F-Droid",
"moderatedMessage": "أو a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">احجز رابط لاجتماع</a> إن كنت رئيس الجلسة الوحيد فقط.",
"privacy": "الخصوصية",
"recentList": "الجديد",
@@ -1113,28 +1168,34 @@
"roomname": "أدخل اسم الغرفة",
"roomnameHint": "أدخل اسم أو رابط الغرفة التي تريد الانضمام إليها. يمكنك إنشاء اسم جديد لترسله إلى من تريد أن تجتمع معهم.",
"sendFeedback": "أبدِ رأيك",
"startMeeting": "Start meeting",
"startMeeting": "إبدأ الحـِوار",
"terms": "الشروط",
"title": "منصة عقد مؤتمرات واجتماعات آمنة وكاملة المزايا ومجانية بالمطلق",
"logo":{
"calendar":"Calendar logo",
"microsoftLogo":"Microsoft logo",
"logoDeepLinking":"Jitsi meet logo",
"desktopPreviewThumbnail":"Desktop preview thumbnail",
"googleLogo":"Google Logo",
"policyLogo":"Policy logo"
"logo": {
"calendar": "شعار التقويم",
"microsoftLogo": "شعار مايكروسوفت",
"logoDeepLinking": "شعار جيتسي",
"desktopPreviewThumbnail": "صورة مصغرة لمعاينة سطح المكتب",
"googleLogo": "شعار كوكل",
"policyLogo": "شعار السياسة"
}
},
"lonelyMeetingExperience": {
"button": "ادعُ آخرين",
"youAreAlone": "أنت بمفردك في الاجتماع"
},
"termsView": {
"header": "مصطلحات"
},
"privacyView": {
"header": "خصوصية"
},
"helpView": {
"header": "مركز المساعدة"
},
"lobby": {
"admit": "Admit",
"admitAll": "Admit all",
"admit": "سمح بالدخول",
"admitAll": "سمح للجميع بالدخول",
"knockingParticipantList": "تنبيه قائمة المشاركين",
"allow": "اسمح",
"backToKnockModeButton": "لا يوجد كلمة مرور، اطلب الإذن بالدخول بدلًا من ذلك.",
@@ -1147,7 +1208,7 @@
"enableDialogText": "يحمي وضع الانتظار غرفة الاجتماع عبر منح رئيس الجلسة إمكانية الموافقة على انضمام المشاركين.",
"enterPasswordButton": "أدخل كلمة المرور لهذا الاجتماع",
"enterPasswordTitle": "أدخل كلمة المرور للدخول للاجتماع",
"errorMissingPassword": "Please enter the meeting password",
"errorMissingPassword": "الرجاء إدخال كلمة مرور الاجتماع",
"invalidPassword": "كلمة مرور غير صحيحة",
"joiningMessage": "ستتمكن من الانضمام للاجتماع بعد الموافقة على طلبك",
"joinWithPasswordMessage": "الرجاء الانتظار أثناء محاولة الدخول دون كلمة مرور...",
@@ -1166,7 +1227,7 @@
"passwordField": "أدخل كلمة الدخول إلى الاجتماع",
"passwordJoinButton": "انضم",
"reject": "رفض",
"rejectAll": "Reject all",
"rejectAll": "رفض الكل",
"toggleLabel": "فعِّل غرفة الانتظار"
}
}

View File

@@ -488,8 +488,8 @@
},
"profile": {
"setDisplayNameLabel": "Якое адлюстроўваецца імя",
"setEmailInput": "Калі ласка, увядзіце e-mail",
"setEmailLabel": "E-mail для Gravatar",
"setEmailInput": "Калі ласка, увядзіце email",
"setEmailLabel": "Email для Gravatar",
"title": "Профіль"
},
"raisedHand": "Хоча гаварыць",
@@ -558,7 +558,7 @@
"disableCallIntegration": "Адключыць убудаваную інтэграцыю выклікаў",
"disableP2P": "Адключыць рэжым Peer-To-Peer",
"displayName": "Якое адлюстроўваецца імя",
"email": "E-mail",
"email": "Email",
"header": "Налады",
"profileSection": "Профіль",
"serverURL": "Адрас сервера",

View File

@@ -292,6 +292,29 @@
"documentSharing": {
"title": "Document compartit"
},
"virtualBackground": {
"apply": "Aplicar",
"title": "Fons Virtuals",
"blur": "Difuminos",
"slightBlur": "Lleu Difuminos",
"removeBackground": "Elimina el Fons",
"addBackground": "Afegeix fons",
"pleaseWait": "Si us plau, espereu...",
"none": "Cap",
"uploadedImage": "Imatge carregada {{index}}",
"deleteImage": "Esborra la imatge",
"image1" : "Platja",
"image2" : "Paret blanca neutra",
"image3" : "Habitació blanca buida",
"image4" : "Llum de peu negre",
"image5" : "Muntanya",
"image6" : "Bosc ",
"image7" : "Sortida del sol",
"desktopShareError": "No s'ha pogut crear l'escriptori compartit",
"desktopShare":"Compartir escriptori",
"webAssemblyWarning": "no compatible",
"backgroundEffectError": "No s'ha pogut aplicar l'efecte de fons."
},
"feedback": {
"average": "Mitjana",
"bad": "Dolenta",
@@ -464,6 +487,32 @@
"newDeviceAudioTitle": "S'ha detectat un aparell d'àudio nou",
"newDeviceAction": "Usa"
},
"participantsPane": {
"close": "Tanca",
"header": "Participants",
"headings": {
"lobby": "Sala d'espera ({{count}})",
"participantsList": "Participants de la reunió ({{count}})",
"waitingLobby": "Esperant al vestíbul ({{count}})"
},
"actions": {
"allow": "Permetre als assistents:",
"allowVideo": "Permet el vídeo",
"audioModeration": "Deixeu de silenciar ells mateixos",
"blockEveryoneMicCamera": "Bloqueja el micròfon i la càmera de tothom",
"invite": "Convida algú",
"askUnmute": "Demana que es deixi de silenciare",
"moreModerationActions": "Més opcions de moderació",
"mute": "Silenciar",
"muteAll": "Silencia tot",
"muteEveryoneElse": "Silencia a tots els altres",
"stopEveryonesVideo": "Atura el vídeo de tothom",
"stopVideo": "Atura el vídeo",
"unblockEveryoneMicCamera": "Desbloqueja el micròfon i la càmera de tothom",
"videoModeration": "Comença el seu vídeo"
},
"search": "Cerca participants"
},
"passwordSetRemotely": "establerta per una altre participant",
"passwordDigitsOnly": "Fins a {{number}} dígits",
"poweredby": "funciona amb",
@@ -606,12 +655,17 @@
"moreOptions": "Mostra més opcions",
"mute": "Activa o desactiva el silenci de l'àudio",
"muteEveryone": "Silencia tothom",
"muteEveryoneElse": "Silencia a tots els altres participants",
"muteEveryonesVideo": "Desactiva el vídeo de tothom",
"muteEveryoneElsesVideo": "Desactiva el vídeo a tots els altres participants",
"participants": "Participants",
"pip": "Activa o desactiva el mode imatge en imatge",
"privateMessage": "Envia un missatge privat",
"profile": "Edita el perfil",
"raiseHand": "Aixeca o abaixa la mà",
"recording": "Activa o desactiva l'enregistrament",
"remoteMute": "Silencia el participant",
"remoteVideoMute": "Desactiva la càmera del participant",
"Settings": "Activa o desactiva la configuració",
"sharedvideo": "Activa o desactiva la compartició de vídeo",
"shareRoom": "Convida-hi algú",
@@ -623,9 +677,14 @@
"toggleCamera": "Activa o desactiva la càmera",
"videomute": "Activa o desactiva el vídeo",
"videoblur": "Activa o desactiva el difuminat",
"selectBackground": "Seleccioneu Fons",
"expand": "Ampliar",
"collapse": "Col·lapse",
"toggleFilmstrip": "Activa o desactiva la tira"
},
"addPeople": "Afegeix persones a la trucada",
"audioSettings": "Configuració d'àudio",
"videoSettings": "Configuració de vídeo",
"audioOnlyOff": "Desactiva el mode de poc ample de banda",
"audioOnlyOn": "Activa el mode de poc ample de banda",
"audioRoute": "Seleccioneu l'aparell de so",
@@ -734,13 +793,18 @@
"standardDefinition": "Definició estàndard"
},
"videothumbnail": {
"connectionInfo": "Informació de connexió",
"domute": "Silencia",
"domuteVideo": "Desactiva la càmera",
"domuteOthers": "Silencia a tots els altres participants",
"domuteVideoOfOthers": "Desactiva la càmera de tots els altres",
"flip": "Capgira",
"grantModerator": "Concedir drets de moderador",
"kick": "Expulsa",
"moderator": "Moderador",
"mute": "El participant és silenciat",
"muted": "Silenciat",
"videoMuted": "Càmera desactivada",
"remoteControl": "Inicia o atura el control remot",
"show": "Mostra-ho en l'escena",
"videomute": "El participant ha aturat la càmera"

View File

@@ -7,11 +7,11 @@
"copyStream": "Zkopírovat odkaz na živý přenos",
"countryNotSupported": "Toto místo zatím nepodporujeme.",
"countryReminder": "Voláte mimo USA? Nezapomeňte začít kódem své země!",
"defaultEmail": "Vás výchozí e-mail",
"defaultEmail": "Vás výchozí email",
"disabled": "Nemůžete pozvat lidi.",
"failedToAdd": "Nepodařilo se přidat účastníky",
"footerText": "Vytáčení je zakázáno.",
"googleEmail": "E-mail Google",
"googleEmail": "Email Google",
"inviteMoreHeader": "Jste v setkání sám/sama",
"inviteMoreMailSubject": "Přidejte se k setkání {{appName}}",
"inviteMorePrompt": "Pozvat další lidi",
@@ -21,7 +21,7 @@
"loadingPeople": "Hledání lidí pro pozvání",
"noResults": "Žádné odpovídající výsledky vyhledávání",
"noValidNumbers": "Zadejte telefonní číslo",
"outlookEmail": "E-mail Outlook",
"outlookEmail": "Email Outlook",
"searchNumbers": "Přidat telefonní čísla",
"searchPeople": "Hledat lidi",
"searchPeopleAndNumbers": "Hledat lidi nebo přidat jejich telefonní čísla",
@@ -30,7 +30,7 @@
"shareStream": "Sdílet odkaz na živý přenos",
"telephone": "Telefonní číslo: {{number}}",
"title": "Pozvěte lidi na toto setkání",
"yahooEmail": "E-mail Yahoo"
"yahooEmail": "Email Yahoo"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -462,7 +462,7 @@
"dialogTitle": "Mód předsálí",
"disableDialogContent": "Je zapnutý mód předsálí. Zajišťuje, aby do setkání nemohli vstoupit nežádoucí účastníci. Chcete jej vypnout?",
"disableDialogSubmit": "Vypnout",
"emailField": "Zadejte svoje e-mailovou adresu",
"emailField": "Zadejte svoje emailovou adresu",
"enableDialogPasswordField": "Nastavte heslo (volitelně)",
"enableDialogSubmit": "Zapnout",
"enableDialogText": "Mód předsálí vám umožňuje zabezpečit setkání tím, že se lidé mohou připojit až po formálním schválení moderátorem.",
@@ -637,8 +637,8 @@
},
"profile": {
"setDisplayNameLabel": "Nastavte si jméno",
"setEmailInput": "Zadejte e-mail",
"setEmailLabel": "Nastavte si e-mail vašeho Gravataru",
"setEmailInput": "Zadejte email",
"setEmailLabel": "Nastavte si email vašeho Gravataru",
"title": "Profil"
},
"raisedHand": "Chtěl(a) bych mluvit",
@@ -718,7 +718,7 @@
"disableCrashReportingWarning": "Určitě chcete vypnout hlášení o pádu? Nastavení se uplatní, až restartujete aplikaci.",
"disableP2P": "Vypnout mód Peer-To-Peer",
"displayName": "Zobrazované jméno",
"email": "E-mail",
"email": "Email",
"header": "Nastavení",
"profileSection": "Profil",
"serverURL": "URL serveru",

View File

@@ -39,6 +39,28 @@
"audioOnly": {
"audioOnly": "Geringe Bandbreite"
},
"blankPage": {
"meetingEnded": "Konferenz beendet."
},
"breakoutRooms": {
"defaultName": "Breakout-Raum #{{index}}",
"mainRoom": "Hauptraum",
"actions": {
"add": "Breakout-Raum hinzufügen",
"autoAssign": "Automatisch auf Breakout-Räume verteilen",
"close": "Schließen",
"join": "Teilnehmen",
"leaveBreakoutRoom": "Breakout-Raum verlassen",
"more": "Mehr",
"remove": "Entfernen",
"sendToBreakoutRoom": "Anwesende in Breakout-Raum verschieben:"
},
"notifications": {
"joinedTitle": "Breakout-Räume",
"joined": "Breakout-Raum \"{{name}}\" betreten",
"joinedMainRoom": "Hauptraum betreten"
}
},
"calendarSync": {
"addMeetingURL": "Konferenzlink hinzufügen",
"confirmAddLink": "Möchten Sie einen Jitsi-Link zu diesem Termin hinzufügen?",
@@ -555,6 +577,8 @@
"notify": {
"allowAction": "Erlauben",
"allowedUnmute": "Sie können die Stummschaltung aufheben, Ihre Kamera einschalten oder Ihren Bildschirm teilen.",
"audioUnmuteBlockedTitle": "Stummschaltung kann nicht aufgehoben werden!",
"audioUnmuteBlockedDescription": "Díe Stummschaltung kann aus Überlastungsschutzgründen temporär nicht aufgehoben werden.",
"connectedOneMember": "{{name}} nimmt am Meeting teil",
"connectedThreePlusMembers": "{{name}} und {{count}} andere Personen nehmen am Meeting teil",
"connectedTwoMembers": "{{first}} und {{second}} nehmen am Meeting teil",
@@ -566,6 +590,9 @@
"invitedThreePlusMembers": "{{name}} und {{count}} andere wurden eingeladen",
"invitedTwoMembers": "{{first}} und {{second}} wurden eingeladen",
"kickParticipant": "{{kicked}} wurde von {{kicker}} ausgewiesen",
"leftOneMember": "{{name}} hat die Konferenz verlassen",
"leftThreePlusMembers": "{{name}} und Weitere haben die Konferenz verlassen",
"leftTwoMembers": "{{first}} und {{second}} haben die Konferenz verlassen",
"me": "Ich",
"moderator": "Moderationsrechte vergeben!",
"muted": "Der Konferenz wurde stumm beigetreten.",
@@ -577,6 +604,7 @@
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) von einer anderen Person entfernt",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) von einer anderen Person gesetzt",
"raisedHand": "{{name}} möchte sprechen.",
"raisedHands": "{{participantName}} und {{raisedHands}} weitere möchten sprechen",
"screenShareNoAudio": "Die Option \"Audio freigeben\" wurde bei der Auswahl des Fensters nicht ausgewählt.",
"screenShareNoAudioTitle": "Share audio was not checked",
"somebody": "Jemand",
@@ -605,7 +633,10 @@
"moderationToggleDescription": "von {{participantDisplayName}}",
"raiseHandAction": "Melden",
"reactionSounds": "Interaktionstöne deaktivieren",
"groupTitle": "Benachrichtigungen"
"reactionSoundsForAll": "Interaktionstöne für alle deaktivieren",
"groupTitle": "Benachrichtigungen",
"videoUnmuteBlockedTitle": "Kamera kann nicht aktiviert werden!",
"videoUnmuteBlockedDescription": "Die Kamera kann aus Überlastungsschutzgründen temporär nicht eingeschaltet werden."
},
"participantsPane": {
"close": "Schließen",
@@ -623,6 +654,7 @@
"invite": "Person einladen",
"askUnmute": "Anfragen, Stummschaltung aufzuheben",
"moreModerationActions": "Weitere Moderationsoptionen",
"moreParticipantOptions": "Mehr Optionen für Anwesende",
"mute": "Stummschalten",
"muteAll": "Alle stummschalten",
"muteEveryoneElse": "Alle anderen stummschalten",
@@ -824,6 +856,7 @@
"sounds": "Hinweistöne",
"speakers": "Lautsprecher",
"startAudioMuted": "Alle Personen treten stummgeschaltet bei",
"startReactionsMuted": "Interaktionstöne für alle deaktivieren",
"startVideoMuted": "Alle Personen treten ohne Video bei",
"talkWhileMuted": "Wenn bei Stummschaltung gesprochen wird",
"title": "Einstellungen"
@@ -886,6 +919,7 @@
"audioOnly": "„Nur Audio“ ein-/ausschalten",
"audioRoute": "Audiogerät auswählen",
"boo": "Buhen",
"breakoutRoom": "Breakout-Räume betreten/verlassen",
"callQuality": "Qualitätseinstellungen",
"cc": "Untertitel ein-/ausschalten",
"chat": "Chatfenster öffnen / schließen",
@@ -969,7 +1003,9 @@
"hangup": "Konferenz verlassen",
"help": "Hilfe",
"invite": "Personen einladen",
"joinBreakoutRoom": "In Breakout-Raum wechseln",
"laugh": "Lachen",
"leaveBreakoutRoom": "Breakout-Raum verlassen",
"like": "Daumen hoch",
"lobbyButtonDisable": "Lobbymodus deaktivieren",
"lobbyButtonEnable": "Lobbymodus aktivieren",

View File

@@ -544,7 +544,7 @@
},
"profile": {
"setDisplayNameLabel": "Ρυθμίστε το όνομα εμφάνισής σας",
"setEmailInput": "Εισάγετε το e-mail",
"setEmailInput": "Εισάγετε το email",
"setEmailLabel": "Ρυθμίστε το gravatar email",
"title": "Προφίλ"
},
@@ -621,7 +621,7 @@
"disableCallIntegration": "Απενεργοποίηση ολοκλήρωσης εγγενούς κλήσης",
"disableP2P": "Απενεργοποίηση λειτουργίας Peer-to-Peer",
"displayName": "Εμφανιζόμενο όνομα",
"email": "E-mail",
"email": "Email",
"header": "Ρυθμίσεις",
"profileSection": "Προφίλ",
"serverURL": "Διεύθυνση URL του διακομιστή",

View File

@@ -480,8 +480,8 @@
},
"profile": {
"setDisplayNameLabel": "Set your display name",
"setEmailInput": "Enter e-mail",
"setEmailLabel": "Set your Gravatar e-mail",
"setEmailInput": "Enter email",
"setEmailLabel": "Set your Gravatar email",
"title": "Profile"
},
"recording": {

View File

@@ -373,11 +373,11 @@
"busyTitle": "Kõik ülekandjad on hetkel hõivatud",
"changeSignIn": "Vaheta kontot.",
"choose": "Vali otseülekanne",
"chooseCTA": "Vali ülekande viis. Oled sisse logitud e-mailiga {{email}}.",
"chooseCTA": "Vali ülekande viis. Oled sisse logitud emailiga {{email}}.",
"enterStreamKey": "Sisesta siia oma YouTubei ülekande võti.",
"error": "Otseülekanne ebaõnnestus. Proovi uuesti.",
"errorAPI": "YouTubei kanaliga ühendumisel tekkis viga. Palun logi uuesti sisse.",
"errorLiveStreamNotEnabled": "Otseülekanne ei ole e-mailiga {{email}} sisse lülitatud. Luba kasutajaga otseülekanded või vaheta kontot.",
"errorLiveStreamNotEnabled": "Otseülekanne ei ole emailiga {{email}} sisse lülitatud. Luba kasutajaga otseülekanded või vaheta kontot.",
"expandedOff": "Otseülekanne on peatatud",
"expandedOn": "Kõnest tehakse otseülekanne YouTubei.",
"expandedPending": "Otseülekanne algab…",
@@ -480,7 +480,7 @@
},
"profile": {
"setDisplayNameLabel": "Sisesta nimi",
"setEmailInput": "Sisesta e-mail",
"setEmailInput": "Sisesta email",
"setEmailLabel": "Sisesta Gravatar e-kirja aadress",
"title": "Profiil"
},
@@ -548,7 +548,7 @@
"disableCallIntegration": "Lülita kohaliku kõne integratsioon välja",
"disableP2P": "Lülita otseühendus välja",
"displayName": "Kasutatav nimi",
"email": "E-mail",
"email": "Email",
"header": "Seaded",
"profileSection": "Profiil",
"serverURL": "Serveri link",

View File

@@ -39,6 +39,28 @@
"audioOnly": {
"audioOnly": "Bande passante faible"
},
"blankPage": {
"meetingEnded": "Réunion terminée."
},
"breakoutRooms": {
"defaultName": "Salle annexe #{{index}}",
"mainRoom": "Salle principale",
"actions": {
"add": "Ajouter salle annexe",
"autoAssign": "Assigner automatiquement aux salles annexes",
"close": "Fermer",
"join": "Rejoindre",
"leaveBreakoutRoom": "Quitter la salle annexe",
"more": "Plus",
"remove": "Supprimer",
"sendToBreakoutRoom": "Envoyer le participant dans:"
},
"notifications": {
"joinedTitle": "Salles annexes",
"joined": "Entrée en salle annexe \"{{name}}\"",
"joinedMainRoom": "Retour à la salle principalem"
}
},
"calendarSync": {
"addMeetingURL": "Ajouter un lien de conférence",
"confirmAddLink": "Voulez-vous ajouter un lien Jitsi à cet événement ?",
@@ -268,12 +290,12 @@
"muteEveryoneStartMuted": "Tout le monde démarre avec le micro coupé",
"muteParticipantBody": "Vous ne pourrez plus réactiver son micro, mais il pourra l'activer par lui-même à tout moment.",
"muteParticipantButton": "Couper le micro",
"muteParticipantDialog": "Êtes-vous sûr(e) de vouloir couper le micro de ce participant ? Seul le participant pourra ensuite réactiver son micro à tout moment.",
"muteParticipantsVideoDialog": "Êtes-vous sûr(e) de vouloir couper la caméra de ce participant ? Seul le participant pourra ensuite réactiver sa caméra à tout moment.",
"muteParticipantTitle": "Couper le micro de ce participant ?",
"muteParticipantsVideoDialog": "Êtes-vous sûr(e) de vouloir couper la caméra de ce participant ? Seul le participant pourra ensuite réactiver son micro à tout moment.",
"muteParticipantsVideoDialogModerationOn": "Êtes-vous sûr(e) de vouloir couper la caméra de ce participant ? Ni vous ni le participant ne pourront la réactiver ensuite ?",
"muteParticipantsVideoButton": "Couper la caméra",
"muteParticipantsVideoTitle": "Couper la caméra de ce participant?",
"muteParticipantsVideoBody": "Vous ne pourrez pas rallumer la caméra, mais ils peuvent la rallumer à tout moment.",
"muteParticipantsVideoBodyModerationOn": "Ni vous ni le participant ne pourront rallumer la caméra.",
"noDropboxToken": "Pas de jeton Dropbox valide",
"Ok": "Ok",
"password": "Mot de passe",
@@ -501,6 +523,7 @@
"expandedPending": "La diffusion en direct a commencé ...",
"failedToStart": "La diffusion n'a pas réussi à démarrer",
"getStreamKeyManually": "Nous n'avons pas réussi à récupérer un flux de direct. Essayez d'obtenir votre clé de diffusion en direct sur YouTube.",
"inProgress": "Enregisrtement ou diffusion en cours",
"invalidStreamKey": "La clé de diffusion en direct n'est peut-être pas correcte.",
"off": "La diffusion en direct (streaming) a été arrêté",
"offBy": "{{name}} a arrêté la diffusion en direct",
@@ -508,6 +531,7 @@
"onBy": "{{name}} a démarré la diffusion en direct",
"pending": "Lancement du direct ...",
"serviceName": "Service de diffusion en direct",
"sessionAlreadyActive": "Cette session est déjà en cours d'enregistrement ou de diffusion.",
"signedInAs": "Vous êtes connecté en tant que :",
"signIn": "Se connecter avec Google",
"signInCTA": "Connectez vous ou saisissez votre clé de diffusion Youtube.",
@@ -553,6 +577,8 @@
"notify": {
"allowAction": "Permettre",
"allowedUnmute": "Vous pouvez réactiver votre écran, votre caméra ou partager votre écran.",
"audioUnmuteBlockedTitle": "Rétablissement du son bloqué !",
"audioUnmuteBlockedDescription": "Le rétablissement du son a été bloqué temporairement en raison de limites système.",
"connectedOneMember": "{{name}} a rejoint la réunion",
"connectedThreePlusMembers": "{{name}} et {{count}} autres personnes ont rejoint la réunion",
"connectedTwoMembers": "{{first}} et {{second}} ont rejoint la réunion",
@@ -564,6 +590,9 @@
"invitedThreePlusMembers": "{{name}} et {{count}} autres ont été invités",
"invitedTwoMembers": "{{first}} et {{second}} ont été invités",
"kickParticipant": "{{kicked}} a été expulsé par {{kicker}}",
"leftOneMember": "{{name}} a quitté la réunion",
"leftThreePlusMembers": "{{name}} et beaucoup d'autres ont quitté la réunion",
"leftTwoMembers": "{{first}} et {{second}} ont quitté la réunion",
"me": "Moi",
"moderator": "Droits modérateur accordés !",
"muted": "Vous avez commencé la conversation en muet.",
@@ -575,6 +604,7 @@
"passwordRemovedRemotely": "Le $t(lockRoomPassword) a été supprimé par un autre participant",
"passwordSetRemotely": "Un $t(lockRoomPassword) a été défini par un autre participant",
"raisedHand": "{{name}} aimerait prendre la parole.",
"raisedHands": "{{participantName}} et {{raisedHands}} autres personnes",
"screenShareNoAudio": " La case Partager l'audio n'a pas été cochée dans l'écran de sélection de la fenêtre.",
"screenShareNoAudioTitle": "La case Partager l'audio n'a pas été cochée",
"somebody": "Quelqu'un",
@@ -603,7 +633,10 @@
"moderationToggleDescription": "par {{participantDisplayName}}",
"raiseHandAction": "Lever la main",
"reactionSounds": "Bloquer les réactions sonores",
"groupTitle": "Notifications"
"reactionSoundsForAll": "Bloquer les réactions sonores pour tous",
"groupTitle": "Notifications",
"videoUnmuteBlockedTitle": "Rétablissement de la caméra bloqué !",
"videoUnmuteBlockedDescription": "Le rétablissement de la vidéo a été bloqué temporairement en raison de limites système."
},
"participantsPane": {
"close": "Fermer",
@@ -620,13 +653,16 @@
"blockEveryoneMicCamera": "Bloquer tous les micros et caméras",
"invite": "Inviter quelqu'un",
"askUnmute": "Demander de réactiver le micro",
"moreModerationActions": "Options de modération supplémentaires",
"moreParticipantOptions": "Options supplémentaires pour les participants",
"mute": "Couper le micro",
"muteAll": "Couper le micro de tout le monde",
"muteEveryoneElse": "Couper le micro de tous les autres",
"stopEveryonesVideo": "Couper toutes les caméras",
"stopVideo": "Couper la vidéo",
"unblockEveryoneMicCamera": "Débloquer tous les micros et caméras",
"videoModeration": "Démarrer leur vidéo"
"videoModeration": "Démarrer leur vidéo",
"moreModerationControls": "Options de modération supplémentaires"
},
"search": "Rechercher des participants"
},
@@ -738,7 +774,7 @@
"profile": {
"avatar": "avatar",
"setDisplayNameLabel": "Choisissez un pseudo",
"setEmailInput": "Entrez une adresse e-mail",
"setEmailInput": "Entrez une adresse email",
"setEmailLabel": "Définir votre courriel Gravatar",
"title": "Profil"
},
@@ -759,6 +795,7 @@
"expandedPending": "Démarrage de l'enregistrement ...",
"failedToStart": "L'enregistrement n'a pas réussi à démarrer",
"fileSharingdescription": "Partager l'enregistrement avec les participants de la réunion",
"inProgress": "Enregistrement ou diffusion en cours",
"linkGenerated": "Nous avons généré un lien à votre enregistrement.",
"live": "DIRECT",
"loggedIn": "Connecté en tant que {{userName}}",
@@ -771,6 +808,7 @@
"serviceDescription": "Votre enregistrement sera enregistré par le service dédié",
"serviceDescriptionCloud": "Enregistrement Cloud",
"serviceName": "Service d'enregistrement",
"sessionAlreadyActive": "Cette session est déjà en cours d'enregistrement ou de diffusion.",
"signIn": "Se connecter",
"signOut": "Se déconnecter",
"unavailable": "Oups ! Le {{serviceName}} est actuellement indisponible. Nous tentons de résoudre le problème. Veuillez réessayer plus tard.",
@@ -819,6 +857,7 @@
"sounds": "Sons",
"speakers": "Haut-parleurs",
"startAudioMuted": "Tout le monde commence en muet",
"startReactionsMuted": "Tout le monde commence avec les réactions sonores bloquées",
"startVideoMuted": "Tout le monde commence sans vidéo",
"talkWhileMuted": "vous parlez en étant muet",
"title": "Paramètres"
@@ -857,7 +896,14 @@
"name": "Nom",
"seconds": "{{count}}s",
"speakerStats": "Statistiques de l'interlocuteur",
"speakerTime": "Temps de l'interlocuteur"
"speakerTime": "Temps de l'interlocuteur",
"happy": "Content",
"neutral": "Indifférent",
"sad": "Triste",
"surprised": "Surpris",
"angry": "En colère",
"fearful": "Effrayé",
"disgusted": "Dégoûté"
},
"startupoverlay": {
"policyText": " ",
@@ -874,6 +920,7 @@
"audioOnly": "Activer / Désactiver le mode voix uniquement",
"audioRoute": "Sélectionner la source audio",
"boo": "Hou",
"breakoutRoom": "Rejoindre/quitter une salle annexe",
"callQuality": "Ajuster la qualité vidéo",
"cc": "Activer / Désactiver les sous-titres",
"chat": "Afficher / Masquer la discussion instantanée",
@@ -923,7 +970,7 @@
"surprised": "Surpris",
"tileView": "Activer / Désactiver la vue mosaïque",
"toggleCamera": "Changer de caméra",
"toggleFilmstrip": "Basculer de pellicule",
"toggleFilmstrip": "Afficher ou masquer les vignettes vidéo",
"videomute": "Activer / Couper la vidéo",
"videoblur": "Activer / désactiver le floutage",
"selectBackground": "Selectionner un arrière-plan",
@@ -957,7 +1004,9 @@
"hangup": "Quitter",
"help": "Aide",
"invite": "Inviter des participants",
"joinBreakoutRoom": "Rejoindre salle annexe",
"laugh": "Rire",
"leaveBreakoutRoom": "Quitter salle annexe",
"like": "Approuver",
"lobbyButtonDisable": "Désactiver le mode salle d'attente / contrôle des participant(e)s",
"lobbyButtonEnable": "Activer le mode salle d'attente / contrôle des participant(e)s",
@@ -1135,6 +1184,12 @@
"button": "Inviter d'autres personnes",
"youAreAlone": "Vous êtes le seul participant de la réunion"
},
"termsView": {
"header": "Conditions d'utilisation"
},
"privacyView": {
"header": "Confidentialité"
},
"helpView": {
"header": "Centre d'aide"
},

View File

@@ -479,8 +479,8 @@
},
"profile": {
"setDisplayNameLabel": "Állítsa be a megjelenő nevet",
"setEmailInput": "Adjon meg egy e-mail címet",
"setEmailLabel": "Adja meg a gravatar e-mail címet",
"setEmailInput": "Adjon meg egy email címet",
"setEmailLabel": "Adja meg a gravatar email címet",
"title": "Profil"
},
"raisedHand": "Beszélni szeretnék",
@@ -549,7 +549,7 @@
"disableCallIntegration": "A natív hívások integrációjának letiltása",
"disableP2P": "Kapcsolja ki a peer-to-peer módot",
"displayName": "Megjelenő név",
"email": "E-mail",
"email": "Email",
"header": "Beállítások",
"profileSection": "Profil",
"serverURL": "Kiszolgáló URL",

View File

@@ -487,7 +487,7 @@
},
"profile": {
"setDisplayNameLabel": "Set your display name",
"setEmailInput": "Enter e-mail",
"setEmailInput": "Enter email",
"setEmailLabel": "Set your gravatar email",
"title": "Profile"
},

View File

@@ -8,17 +8,17 @@
"contacts": "contatti",
"countryNotSupported": "Non supportiamo ancora questa destinazione.",
"countryReminder": "Stai chiamando fuori dagli Stati Uniti? Assicurati d'inserire il prefisso internazionale!",
"defaultEmail": "Tua e-mail di default",
"defaultEmail": "Tua email di default",
"disabled": "Non puoi invitare persone.",
"failedToAdd": "L'aggiunta di nuove persone è fallita",
"footerText": "La chiamata all'esterno è disabilitata.",
"googleEmail": "E-mail Google",
"googleEmail": "Email Google",
"inviteMoreHeader": "Sei l'unico presente nella riunione",
"inviteMoreMailSubject": "Unisciti alla riunione {{appName}}",
"inviteMorePrompt": "Invita altre persone",
"linkCopied": "Collegamento copiato negli appunti",
"noResults": "Nessun risultato corrispondente",
"outlookEmail": "E-mail Outlook",
"outlookEmail": "Email Outlook",
"phoneNumbers": "numeri di telefono",
"searching": "Sto cercando...",
"shareInvite": "Condividi invito alla riunione",
@@ -27,7 +27,7 @@
"sipAddresses": "indirizzi SIP",
"telephone": "Telefono: {{number}}",
"title": "Invita persone a questa riunione",
"yahooEmail": "E-mail Yahoo"
"yahooEmail": "Email Yahoo"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -736,8 +736,8 @@
"profile": {
"avatar": "avatar",
"setDisplayNameLabel": "Imposta il nome da visualizzare",
"setEmailInput": "Inserisci e-mail",
"setEmailLabel": "Imposta l'e-mail gravatar",
"setEmailInput": "Inserisci email",
"setEmailLabel": "Imposta l'email gravatar",
"title": "Profilo"
},
"raisedHand": "Vorrebbe parlare",
@@ -834,7 +834,7 @@
"disableCrashReporting": "Disattiva la diagnostica dei crash",
"disableCrashReportingWarning": "Sei sicuro di voler disattivare la diagnostica dei crash? Quest'impostazione verrà eseguita al prossimo avvio dell'app.",
"displayName": "Nome visualizzato",
"email": "e-mail",
"email": "email",
"header": "Impostazioni",
"profileSection": "Profilo",
"serverURL": "URL del server",
@@ -1141,7 +1141,7 @@
"dialogTitle": "Sala d'attesa",
"disableDialogContent": "Sala d'attesa attiva. Questa funzione ti permette di non dare accesso alla riunione a partecipanti indesiderati. Vuoi disattivarla?",
"disableDialogSubmit": "Disattiva",
"emailField": "Inserisci il tuo indirizzo e-mail",
"emailField": "Inserisci il tuo indirizzo email",
"enableDialogPasswordField": "Imposta password (opzionale)",
"enableDialogSubmit": "Attiva",
"enableDialogText": "La sala d'attesa ti permette di proteggere la riunione concedendo l'ingresso solo alle persone autorizzate da un moderatore.",

View File

@@ -7,11 +7,11 @@
"copyStream": "Link naar livestream kopiëren",
"countryNotSupported": "Deze bestemming wordt nog niet ondersteund.",
"countryReminder": "Belt u buiten de Verenigde Staten? Vergeet dan niet met de landcode te beginnen.",
"defaultEmail": "Uw Standaard E-mail",
"defaultEmail": "Uw Standaard Email",
"disabled": "U kunt geen personen uitnodigen.",
"failedToAdd": "Het toevoegen van deelnemers is mislukt",
"footerText": "Uitgaande oproepen zijn uitgeschakeld.",
"googleEmail": "Google E-mail",
"googleEmail": "Google Email",
"inviteMoreHeader": "U bent de enige in de vergadering",
"inviteMoreMailSubject": "Deelnemen aan {{appName}}-vergadering",
"inviteMorePrompt": "Nodig meer personen uit",
@@ -21,7 +21,7 @@
"loadingPeople": "Personen om uit te nodigen aan het zoeken",
"noResults": "Geen resultaten die overeenkomen met de zoekopdracht",
"noValidNumbers": "Voer een telefoonnummer in",
"outlookEmail": "Outlook E-mail",
"outlookEmail": "Outlook Email",
"searchNumbers": "Telefoonnummers toevoegen",
"searchPeople": "Personen zoeken",
"searchPeopleAndNumbers": "Personen zoeken of hun telefoonnummers toevoegen",
@@ -30,7 +30,7 @@
"shareStream": "Deel de link naar de livestream",
"telephone": "Telefoon: {{number}}",
"title": "Personen uitnodigen voor deze vergadering",
"yahooEmail": "Yahoo E-mail"
"yahooEmail": "Yahoo Email"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -586,8 +586,8 @@
},
"profile": {
"setDisplayNameLabel": "Uw weergavenaam instellen",
"setEmailInput": "Voer e-mailadres in",
"setEmailLabel": "Uw Gravatar e-mail instellen",
"setEmailInput": "Voer emailadres in",
"setEmailLabel": "Uw Gravatar email instellen",
"title": "Profiel"
},
"raisedHand": "Zou graag willen spreken",
@@ -931,7 +931,7 @@
"dialogTitle": "Lobby-modus",
"disableDialogContent": "Lobby-modus is momenteel ingeschakeld. Deze functie zorgt ervoor dat ongewenste deelnemers niet aan uw vergadering kunnen deelnemen. Wilt u het uitschakelen?",
"disableDialogSubmit": "Uitschakelen",
"emailField": "Voer uw e-mailadres in",
"emailField": "Voer uw emailadres in",
"enableDialogPasswordField": "Stel wachtwoord in (optioneel)",
"enableDialogSubmit": "Inschakelen",
"enableDialogText": "Met de lobby-modus kunt u uw vergadering beveiligen, door deelnemers alleen toe te laten na een formele goedkeuring van een moderator.",

View File

@@ -251,8 +251,6 @@
"muteEveryoneTitle": "Rendre mut tot lo monde?",
"muteParticipantBody": "Poiretz pas lo tornar activar lo microfòn, mai eles pòdon o far quand vòlon.",
"muteParticipantButton": "Copar lo son",
"muteParticipantDialog": "Volètz vertadièrament copar lo son a aqueste participant? Poiretz pas lo tornar la votz, mas eles pòdon restablir la comunicacion quand vòlgan.",
"muteParticipantTitle": "Copar lo micro als participants?",
"Ok": "D'acòrdi",
"passwordLabel": "Aquesta conferéncia es estada barrada per un participant. Mercés de dintrar lo $t(lockRoomPassword) per la rejónher.",
"passwordNotSupported": "Ajustar un $t(lockRoomPassword) a una conferéncia es pas suportat.",
@@ -331,7 +329,7 @@
"muteParticipantsVideoTitle": "Desactivar la camèra daqueste participant?",
"noDropboxToken": "Cap de geton Dropbox pas valid",
"password": "Senhal",
"sessionRestarted": "Sonada reaviada a causa dun problèma de connexion",
"sessionRestarted": "Sonada reaviada a causa dun problèma de connexion.",
"shareAudio": "Contunhar",
"shareAudioTitle": "Cossí partejar làudio",
"shareAudioWarningTitle": "Devètz arrestar lo partiment decran abans lo partiment dàudio",
@@ -361,7 +359,9 @@
"muteParticipantsVideoBody": "Poiretz pas lor activar la camèra de nòu, mas poirián se la restablir quand vòlga.",
"shareAudioWarningD2": "devètz reaviar lo partiment decran e clicar lopcion «partejar làudio».",
"shareScreenWarningD2": "devètz arrestar lo partiment àudio, aviar lo partiment decran e clicar lopcion «partejar làudio».",
"localUserControls": "Contraròtles de lutilizaire local"
"localUserControls": "Contraròtles de lutilizaire local",
"muteParticipantsVideoBodyModerationOn": "Poiretz pas li activar de nòu e el tanpauc.",
"muteParticipantsVideoDialogModerationOn": "Volètz vertadièrament copar la camèra daqueste participant? Poiretz pas li activar de nòu e el tanpauc."
},
"dialOut": {
"statusMessage": "ara es {{status}}"
@@ -495,7 +495,9 @@
"start": "Aviar una difusion en dirècte",
"streamIdHelp": "Ques aquò?",
"unavailableTitle": "Difusion en dirècte indisponibla",
"youtubeTerms": "Condicions dutilizacion de YouTube"
"youtubeTerms": "Condicions dutilizacion de YouTube",
"sessionAlreadyActive": "Aquesta session es ja en cors denregistrament o en difusion en dirèct.",
"inProgress": "Enregistrament o difusion en dirècte en cors"
},
"lobby": {
"allow": "Autorizar",
@@ -604,7 +606,7 @@
"suboptimalExperienceTitle": "Avertiment del navigador",
"unmute": "Restablir lo son",
"allowAction": "Autorizar",
"videoMutedRemotelyTitle": "{{moderator}} a copat vòstra camèra",
"videoMutedRemotelyTitle": "{{participantDisplayName}} a copat vòstra vidèo",
"moderationInEffectTitle": "Lo moderator a amudit vòstre microfòn",
"moderationInEffectVideoTitle": "Lo moderator a blocat vòstra camèra",
"videoMutedRemotelyDescription": "La podètz totjorn tornar activar.",
@@ -623,7 +625,11 @@
"allowedUnmute": "Vos podètz restablir lo son del microfòn, aviar la camèra e partejar lecran.",
"screenShareNoAudio": " La casa Partejar làudio es pas estada marcada a lecran de seleccion de la fenèstra.",
"moderationInEffectCSDescription": "Volgatz levar la man se volètz partejar vòstre ecran.",
"moderationInEffectVideoDescription": "Volgatz levar la man se volètz aviar vòstra camèra."
"moderationInEffectVideoDescription": "Volgatz levar la man se volètz aviar vòstra camèra.",
"audioUnmuteBlockedTitle": "Restabliment del son del microfòn blocat!",
"videoUnmuteBlockedTitle": "Restabliment de la camèra blocat!",
"audioUnmuteBlockedDescription": "Las operacion de restabliment del son microfòn son estadas blocadas pel moment a causa de limitas sistèma.",
"videoUnmuteBlockedDescription": "Las operacion de restabliment de la camèra son estadas blocadas pel moment a causa de limitas sistèma."
},
"passwordDigitsOnly": "Fins a {{number}} chifras",
"passwordSetRemotely": "causit per qualqu'un mai",
@@ -741,7 +747,9 @@
"uploadToCloud": "Enviar al cloud",
"limitNotificationDescriptionWeb": "A causa duna demanda fòrta vòstre enregistrament serà limitat a {{limit}} min. Per denregistraments sens limit ensajatz <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "A causa duna demanda fòrta vòstre enregistrament serà limitat a {{limit}} min. Per denregistraments sens limit ensajatz <3>{{app}}</3>.",
"errorFetchingLink": "Error en recuperant lo ligam de lenregistrament."
"errorFetchingLink": "Error en recuperant lo ligam de lenregistrament.",
"inProgress": "Enregistrament o difusion en dirècte en cors",
"sessionAlreadyActive": "Aquesta session es ja en cors denregistrament o en difusion en dirèct."
},
"sectionList": {
"pullToRefresh": "Tirar per actualizar"
@@ -823,7 +831,14 @@
"seconds": "{{count}}segondas",
"speakerStats": "Estatisticas orator",
"speakerTime": "Temps de paraula",
"search": "Recercar"
"search": "Recercar",
"neutral": "Neutre",
"sad": "Trist",
"surprised": "Surprés",
"angry": "Encolerat",
"fearful": "Pauruc",
"disgusted": "Desgostat",
"happy": "Content"
},
"startupoverlay": {
"genericTitle": "Aquesta reünion requerís l'utilizacion del microfòn e de la camèra.",
@@ -894,7 +909,8 @@
"expand": "Espandir",
"collapse": "Plegar",
"muteEveryoneElse": "Copar lo microfòn dels autres",
"reactionsMenu": "Dobrir / Tampar lo menú de reaccions"
"reactionsMenu": "Dobrir / Tampar lo menú de reaccions",
"breakoutRoom": "Rejónher/quitar la sala de reünion"
},
"addPeople": "Ajustar de monde a vòstra sonada",
"audioOnlyOff": "Desactivar lo mòde connexion febla",
@@ -975,7 +991,9 @@
"reactionLike": "Enviar una reaccion daprobacion",
"reactionSilence": "Enviar una reaccion de silenci",
"reactionSurprised": "Enviar una reaccion de suspresa",
"reactionClap": "Enviar una reaccion daplaudiment"
"reactionClap": "Enviar una reaccion daplaudiment",
"leaveBreakoutRoom": "Quitar la sala de reünion",
"joinBreakoutRoom": "Rejónher la sala de reünion"
},
"transcribing": {
"ccButtonTooltip": "Aviar / Arrestat los sostítols",
@@ -1140,7 +1158,9 @@
"stopVideo": "Arrestar la vidèo",
"unblockEveryoneMicCamera": "Desblocar lo microfòn e la camèra de tot lo monde",
"videoModeration": "Aviar lor vidèo",
"allowVideo": "Autorizar la vidèo"
"allowVideo": "Autorizar la vidèo",
"moreModerationActions": "Mai dopcions de moderacion",
"moreParticipantOptions": "Mai dopcions de participant"
},
"search": "Cercar participants"
},
@@ -1171,7 +1191,31 @@
"notification": {
"title": "Un sondatge novèl es estat apondut a la conferéncia",
"description": "Dobrissètz longlet dels sondatge per votar"
}
},
"by": "Per {{ name }}"
},
"volumeSlider": "Nivèl de volum"
"volumeSlider": "Nivèl de volum",
"breakoutRooms": {
"actions": {
"add": "Apondre una sala de reünion",
"close": "Tampar",
"join": "Rejónher",
"leaveBreakoutRoom": "Quitar la sala de reünion",
"more": "Mai",
"remove": "Levar",
"sendToBreakoutRoom": "Enviar lo participant a:",
"autoAssign": "Atribucion auto a las salas de reünion"
},
"defaultName": "Sala de reünion #{{index}}",
"mainRoom": "Sala principala"
},
"privacyView": {
"header": "Confidencialitat"
},
"termsView": {
"header": "Acòrds"
},
"blankPage": {
"meetingEnded": "Conferéncia acabada."
}
}

View File

@@ -211,7 +211,7 @@
"dismiss": "Odrzuć",
"displayNameRequired": "Cześć! Jak się nazywasz?",
"done": "Zrobione",
"e2eeDescription": "Szyfrowanie End-to-End jest aktualnie w fazie EKSPERYMENTALNEJ. Proszę mieć na uwadze fakt, że szyfrowanie end-to-end wyłączy oferowane przez serwer usługi takie jak: nagrywanie, streaming na żywo i dołączanie uczestników przez telefon. Proszę mieć również na uwadze fakt, że takie spotkanie zadziałą tylko dla uczestników korzystających z przeglądarek wspierających wstawiane strumienie.",
"e2eeDescription": "Szyfrowanie End-to-End jest aktualnie w fazie EKSPERYMENTALNEJ. Proszę mieć na uwadze fakt, że szyfrowanie end-to-end wyłączy oferowane przez serwer usługi takie jak: nagrywanie, streaming na żywo i dołączanie uczestników przez telefon. Proszę mieć również na uwadze fakt, że takie spotkanie będą dział tylko dla uczestników korzystających z przeglądarek wspierających wstawiane strumienie.",
"e2eeLabel": "Klucz E2EE",
"e2eeWarning": "UWAGA: Niektórzy uczestnicy tego spotkania nie mają włączonej obsługi szyfrowania E2EE. Jeśli włączysz tą funkcję ci uczestnicy nie będą mieli z tobą kontaktu.",
"enterDisplayName": "Wpisz tutaj swoje imię",
@@ -724,7 +724,7 @@
"profile": {
"avatar": "awatar",
"setDisplayNameLabel": "Podaj swoją wyświetlaną nazwę",
"setEmailInput": "Wprowadź adres e-mail",
"setEmailInput": "Wprowadź adres email",
"setEmailLabel": "Ustaw adres poczty elektronicznej swojego Gravatara",
"title": "Profil"
},
@@ -767,7 +767,7 @@
"pullToRefresh": "Przeciągnij, aby odświeżyć"
},
"security": {
"about": "Możesz dodać a $t(lockRoomPassword) do spotkania. Uczestnicy będą musieli wprowadzić $t(lockRoomPassword) zanim zostaną dołączeni do spotkania.",
"about": "Możesz dodać $t(lockRoomPassword) do spotkania. Uczestnicy będą musieli wprowadzić $t(lockRoomPassword) przed dołączeniem do spotkania.",
"aboutReadOnly": "Uczestnicy posiadający uprawnienia do moderacji mogą ustawić $t(lockRoomPassword) do spotkania. Uczestnicy będą musieli wprowadzić $t(lockRoomPassword) zanim zostaną dołączeni do spotkania.",
"insecureRoomNameWarning": "Nazwa pokoju nie jest bezpieczna. Niepowołaniu uczestnicy mogą dołączyć do spotkania. Proszę rozważyć ustawienie hasła spotkania używając przycisku Opcje zabezpieczeń.",
"securityOptions": "Opcje zabezpieczeń"
@@ -822,7 +822,7 @@
"disableCrashReporting": "Wyłącz raportowanie błędów",
"disableCrashReportingWarning": "Czy na pewno chcesz wyłączyć raportowanie błędów? Ustawienie zacznie funkcjonować po restarcie aplikacji.",
"displayName": "Wyświetlana nazwa",
"email": "E-mail",
"email": "Email",
"header": "Ustawienia",
"profileSection": "Profil",
"serverURL": "Adres URL serwera",
@@ -901,7 +901,7 @@
"shareaudio": "Udostępnij audio",
"sharedvideo": "Przełącz udostępnianie obrazu na YouTube",
"shareRoom": "Zaproś kogoś",
"shareYourScreen": "Przełączanie podziału ekranu",
"shareYourScreen": "Przełączanie udostępniania ekranu",
"shortcuts": "Przełączanie skrótów klawiszowych",
"show": "Pokaż na scenie",
"silence": "Cisza",

View File

@@ -8,17 +8,17 @@
"contacts": "contactos",
"countryNotSupported": "Ainda não temos suporte para este destino.",
"countryReminder": "Está a telefonar para fora dos EUA? Por favor, certifique-se de que começa com o código do país!",
"defaultEmail": "O seu e-mail predefinido",
"defaultEmail": "O seu email predefinido",
"disabled": "Não pode convidar outras pessoas.",
"failedToAdd": "Falha ao adicionar participantes",
"footerText": "A marcação está desactivada.",
"googleEmail": "E-mail do Google",
"googleEmail": "Email do Google",
"inviteMoreHeader": "Você é o único na reunião",
"inviteMoreMailSubject": "Participar na reunião {{appName}}",
"inviteMorePrompt": "Convidar mais pessoas",
"linkCopied": "Link copiado para a área de transferência",
"noResults": "Sem resultados de pesquisa correspondentes",
"outlookEmail": "E-mail do Outlook",
"outlookEmail": "Email do Outlook",
"phoneNumbers": "números de telefone",
"searching": "A pesquisar...",
"shareInvite": "Partilhar convite de reunião",
@@ -27,7 +27,7 @@
"sipAddresses": "endereços SIP",
"telephone": "Telefone: {{number}}",
"title": "Convidar pessoas para esta reunião",
"yahooEmail": "E-mail do Yahoo"
"yahooEmail": "Email do Yahoo"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -39,6 +39,28 @@
"audioOnly": {
"audioOnly": "Largura de banda baixa"
},
"blankPage": {
"meetingEnded": "A reunião terminou."
},
"breakoutRooms": {
"defaultName": "Salas simultâneas #{{index}}",
"mainRoom": "Sala principal",
"actions": {
"add": "Adicionar salas simultâneas",
"autoAssign": "Atribuição automática de salas simultâneas",
"close": "Fechar",
"join": "Entrar na sala",
"leaveBreakoutRoom": "Sair da sala",
"more": "Mais",
"remove": "Eliminar sala",
"sendToBreakoutRoom": "Enviar participante para:"
},
"notifications": {
"joinedTitle": "Salas simultâneas",
"joined": "Entrada do \"{{name}}\" na sala",
"joinedMainRoom": "Entrada na sala principal"
}
},
"calendarSync": {
"addMeetingURL": "Adicionar um link da reunião",
"confirmAddLink": "Gostaria de adicionar um link do Jitsi a esse evento?",
@@ -501,6 +523,7 @@
"expandedPending": "Iniciando a transmissão em direto...",
"failedToStart": "Falha ao iniciar a transmissão em direto",
"getStreamKeyManually": "Não conseguimos buscar nenhuma transmissão em direto. Tente obter sua chave de transmissão em direto no YouTube.",
"inProgress": "Gravação ou transmissão em direto em curso",
"invalidStreamKey": "A senha para transmissão em direto pode estar incorreta.",
"off": "Transmissão em direto encerrada",
"offBy": "{{name}} parou a transmissão em direto",
@@ -508,6 +531,7 @@
"onBy": "{{name}} iniciou a transmissão em direto",
"pending": "Iniciando Transmissão em Direto...",
"serviceName": "Serviço de Transmissão em Direto",
"sessionAlreadyActive": "Esta sessão já está a ser gravada ou transmitida em direto.",
"signedInAs": "Você está conectado como:",
"signIn": "Faça login no Google",
"signInCTA": "Faça login ou insira sua chave de transmissão em Direto do YouTube.",
@@ -553,6 +577,8 @@
"notify": {
"allowAction": "Permitir",
"allowedUnmute": "Pode ligar o seu microfone, ligar a sua câmara ou partilhar o seu ecrã.",
"audioUnmuteBlockedTitle": "Ligar microfone bloqueado!",
"audioUnmuteBlockedDescription": "A operação de ligar o microfone foi temporariamente bloqueada devido aos limites do sistema.",
"connectedOneMember": "{{name}} entrou na reunião",
"connectedThreePlusMembers": "{{name}} e muitos outros entraram na reunião",
"connectedTwoMembers": "{{first}} e {{second}} entraram na reunião",
@@ -564,6 +590,9 @@
"invitedThreePlusMembers": "{{name}} e {{count}} outros foram convidados",
"invitedTwoMembers": "{{first}} e {{second}} foram convidados",
"kickParticipant": "{{kicked}} foi expulso por {{kicker}}",
"leftOneMember": "{{name}} deixou a reunião",
"leftThreePlusMembers": "{{name}} e muitos outros deixaram a reunião",
"leftTwoMembers": "{{first}} e {{second}} deixaram a reunião",
"me": "Eu",
"moderator": "É agora um moderador",
"muted": "Você iniciou uma conversa com o microfone desativado.",
@@ -575,6 +604,7 @@
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) removido por outro participante",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) definido por outro participante",
"raisedHand": "Gostaria de falar.",
"raisedHands": "{{participantName}} e mais {{raisedHands}} pessoas",
"screenShareNoAudio": " A caixa de compartilhar áudio não foi marcada no ecrã de seleção da janela.",
"screenShareNoAudioTitle": "Não foi possível partilhar o áudio do sistema!",
"somebody": "Alguém",
@@ -603,7 +633,10 @@
"moderationToggleDescription": "pelo {{participantDisplayName}}",
"raiseHandAction": "Levantar a mão",
"reactionSounds": "Desactivar sons",
"groupTitle": "Notificações"
"reactionSoundsForAll": "Desativar sons para todos",
"groupTitle": "Notificações",
"videoUnmuteBlockedTitle": "Ligar câmara bloqueada!",
"videoUnmuteBlockedDescription": "A operação de ligar a câmara foi temporariamente bloqueada devido aos limites do sistema."
},
"participantsPane": {
"close": "Fechar",
@@ -621,13 +654,15 @@
"invite": "Convidar alguém",
"askUnmute": "Pedir para ligar o microfone",
"moreModerationActions": "Mais opções de moderação",
"moreParticipantOptions": "Mais opções de participantes",
"mute": "Silenciar",
"muteAll": "Silenciar todos",
"muteEveryoneElse": "Silenciar todos os outros",
"stopEveryonesVideo": "Desligar a câmara de todos",
"stopVideo": "Desligar a câmara",
"unblockEveryoneMicCamera": "Desbloquear o microfone e a câmara de todos",
"videoModeration": "Ligarem a câmara deles"
"videoModeration": "Ligarem a câmara deles",
"moreModerationControls": "Mais controlos de moderação"
},
"search": "Pesquisar participantes"
},
@@ -739,7 +774,7 @@
"profile": {
"avatar": "avatar",
"setDisplayNameLabel": "Definir seu nome de exibição",
"setEmailInput": "Digite e-mail",
"setEmailInput": "Digite email",
"setEmailLabel": "Definir seu email de gravatar",
"title": "Perfil"
},
@@ -760,6 +795,7 @@
"expandedPending": "Iniciando gravação...",
"failedToStart": "Falha ao iniciar a gravação",
"fileSharingdescription": "Compartilhar gravação com participantes da reunião",
"inProgress": "Gravação ou transmissão em direto em curso",
"linkGenerated": "Gerámos um link para a sua gravação.",
"live": "DIRETO",
"loggedIn": "Conectado como {{userName}}",
@@ -772,6 +808,7 @@
"serviceDescription": "Sua gravação será salva pelo serviço de gravação",
"serviceDescriptionCloud": "Gravação na nuvem",
"serviceName": "Serviço de gravação",
"sessionAlreadyActive": "Esta sessão já está a ser gravada ou transmitida em direto.",
"signIn": "Entrar",
"signOut": "Sair",
"unavailable": "Oops! O {{serviceName}} está indisponível. Estamos trabalhando para resolver o problema. Por favor, tente mais tarde.",
@@ -820,6 +857,7 @@
"sounds": "Sons",
"speakers": "Participantes",
"startAudioMuted": "Todos começam com microfone desligado",
"startReactionsMuted": "Sons de reação silenciados para todos",
"startVideoMuted": "Todos começam com câmara desligada",
"talkWhileMuted": "Se fala e está com microfone desligado",
"title": "Definições"
@@ -837,7 +875,7 @@
"disableCrashReporting": "Desativar relatório de falhas",
"disableCrashReportingWarning": "Tem a certeza de que quer desativar o relatório de falhas? A configuração será aplicada depois de reiniciar a aplicação.",
"displayName": "Nome de exibição",
"email": "E-mail",
"email": "Email",
"header": "Configurações",
"profileSection": "Perfil",
"serverURL": "URL do servidor",
@@ -858,7 +896,14 @@
"name": "Nome",
"seconds": "{{count}}s",
"speakerStats": "Estatísticas dos Participantes",
"speakerTime": "Tempo do Participante"
"speakerTime": "Tempo do Participante",
"happy": "Feliz",
"neutral": "Neutro",
"sad": "Triste",
"surprised": "Surpreendido",
"angry": "Zangado",
"fearful": "Temeroso",
"disgusted": "Desgostoso"
},
"startupoverlay": {
"policyText": " ",
@@ -875,6 +920,7 @@
"audioOnly": "Mudar para apenas áudio",
"audioRoute": "Selecionar o dispositivo de som",
"boo": "Vaia",
"breakoutRoom": "Entrar/Sair salas instantâneas",
"callQuality": "Gerir a qualidade do vídeo",
"cc": "Mudar legendas",
"chat": "Abrir / Fechar chat",
@@ -958,7 +1004,9 @@
"hangup": "Sair da reunião",
"help": "Ajuda",
"invite": "Convidar pessoas",
"joinBreakoutRoom": "Entrar na sala",
"laugh": "Risos",
"leaveBreakoutRoom": "Sair da sala",
"like": "Aprovado",
"lobbyButtonDisable": "Desativar sala de espera",
"lobbyButtonEnable": "Ativar sala de espera",
@@ -1136,6 +1184,12 @@
"button": "Convidar outros",
"youAreAlone": "É o único na reunião"
},
"termsView": {
"header": "Termos"
},
"privacyView": {
"header": "Privacidade"
},
"helpView": {
"header": "Centro de ajuda"
},
@@ -1148,7 +1202,7 @@
"dialogTitle": "Modo sala de espera",
"disableDialogContent": "O modo sala de espera está actualmente activada. Esta característica assegura que os participantes indesejados não possam juntar-se à sua reunião. Quer desativá-la?",
"disableDialogSubmit": "Desativar",
"emailField": "Introduza o seu endereço de e-mail",
"emailField": "Introduza o seu endereço de email",
"enableDialogPasswordField": "Definir senha (opcional)",
"enableDialogSubmit": "Habilitar",
"enableDialogText": "O modo sala de espera permite-lhe proteger a sua reunião apenas permitindo a entrada de pessoas após uma aprovação formal por um moderador.",

View File

@@ -12,13 +12,13 @@
"disabled": "Você não pode convidar pessoas.",
"failedToAdd": "Falha em adicionar participantes",
"footerText": "Discagem está desativada.",
"googleEmail": "E-mail Google",
"googleEmail": "Email Google",
"inviteMoreHeader": "Você é o único na reunião",
"inviteMoreMailSubject": "Entre na reunião {{appName}}",
"inviteMorePrompt": "Convide mais pessoas",
"linkCopied": "Link copiado para a área de transferência",
"noResults": "Nenhum resultado de busca correspondente",
"outlookEmail": "E-mail Outlook ",
"outlookEmail": "Email Outlook ",
"phoneNumbers": "números de telefone",
"searching": "Procurando...",
"shareInvite": "Compartilhar convite da reunião",
@@ -27,7 +27,7 @@
"sipAddresses": "endereços SIP",
"telephone": "Telefone: {{number}}",
"title": "Convide pessoas para sua reunião",
"yahooEmail": "E-mail Yahoo"
"yahooEmail": "Email Yahoo"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -757,8 +757,8 @@
"profile": {
"avatar": "avatar",
"setDisplayNameLabel": "Definir seu nome de exibição",
"setEmailInput": "Digite e-mail",
"setEmailLabel": "Definir seu e-mail de Gravatar",
"setEmailInput": "Digite email",
"setEmailLabel": "Definir seu email de Gravatar",
"title": "Perfil"
},
"raisedHand": "Gostaria de falar",
@@ -855,7 +855,7 @@
"disableCrashReportingWarning": "Tem certeza eue quer desabilitar o aviso de falha? A opção será habilitada após reiniciar o app.",
"disableP2P": "Desativar modo ponto a ponto",
"displayName": "Nome de exibição",
"email": "E-mail",
"email": "Email",
"header": "Configurações",
"profileSection": "Perfil",
"serverURL": "URL do servidor",

View File

@@ -479,8 +479,8 @@
},
"profile": {
"setDisplayNameLabel": "Introduceți numele care va fi afișat",
"setEmailInput": "Introduceți adresa de e-mail",
"setEmailLabel": "Setați adresa de e-mail gravatar",
"setEmailInput": "Introduceți adresa de email",
"setEmailLabel": "Setați adresa de email gravatar",
"title": "Profil"
},
"recording": {

View File

@@ -373,7 +373,7 @@
"genericError": "Что-то пошло не так.",
"inviteLiveStream": "Трансляция этой встречи: {{url}}",
"invitePhone": "Для того, чтобы присоединиться по телефону, нажмите {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "Ищите дпугой номер для набора?\nПосмотреть номера для набора для конференции: {{url}}\n\n\nЕсли также выполняется набор номера через телефон в комнате, подключитесь в режиме слушателя: {{silentUrl}}",
"invitePhoneAlternatives": "Ищите другой номер для набора?\nПосмотреть номера для набора для конференции: {{url}}\n\n\nЕсли также выполняется набор номера через телефон в комнате, подключитесь в режиме слушателя: {{silentUrl}}",
"inviteURLFirstPartGeneral": "Вас приглашают присоединиться к конференции.",
"inviteURLFirstPartPersonal": "{{name}} приглашает Вас присоединиться к конференции. \n",
"inviteURLSecondPart": "\nПрисоединиться к конференции:\n{{url}}\n",
@@ -614,8 +614,8 @@
},
"profile": {
"setDisplayNameLabel": "Отображаемое имя",
"setEmailInput": "Введите e-mail",
"setEmailLabel": "E-mail для Gravatar",
"setEmailInput": "Введите email",
"setEmailLabel": "Email для Gravatar",
"title": "Профиль"
},
"raisedHand": "Хочет говорить",
@@ -774,7 +774,7 @@
"videomute": "Вкл/Выкл видео"
},
"addPeople": "Добавить людей к вашему сеансу связи",
"audioOnlyOff": "Отключить режим экономии пропуской способности",
"audioOnlyOff": "Отключить режим экономии пропускной способности",
"audioOnlyOn": "Включить режим экономии пропускной способности",
"audioRoute": "Выбрать аудиоустройство",
"authenticate": "Аутентифицировать",

View File

@@ -553,7 +553,7 @@
},
"profile": {
"setDisplayNameLabel": "Nastavte si meno",
"setEmailInput": "Zadajte e-mail",
"setEmailInput": "Zadajte email",
"setEmailLabel": "Nastavte si email vašeho gravataru",
"title": "Profil"
},
@@ -634,7 +634,7 @@
"disableCrashReporting": "Vypnúť oznamovanie pádov",
"disableCrashReportingWarning": "Naozak chcete vypnúť oznamovanie pádov? Nastavenie bude aktívne po reštartovaní aplikácie.",
"displayName": "Ukázať",
"email": "E-mail",
"email": "Email",
"header": "Nastavenia",
"profileSection": "Profil",
"serverURL": "Adresa URL servera",
@@ -884,7 +884,7 @@
"dialogTitle": "Čakáreň",
"disableDialogContent": "Čakáreň je zapnutá. Táto funkcia zabezpečuje, že do konferencie nemôžu vstúpiť neželaní účastníci. Chcete ju vypnúť?",
"disableDialogSubmit": "Vypnúť",
"emailField": "Zadajte vašu e-mailovú adresu",
"emailField": "Zadajte vašu emailovú adresu",
"enableDialogPasswordField": "Nastaviť heslo (voliteľné)",
"enableDialogSubmit": "Zapnúť",
"enableDialogText": "Čakáreň umožňuje zabezpečiť konferenciu tým, že účastníci môžu do konferencie vstúpiť len po schválení moderátorom.",

View File

@@ -23,19 +23,19 @@
"copyStream": "Kopiera livestreamlänk",
"contacts": "Kontakter",
"defaultEmail": "Din mailadress",
"googleEmail": "Google e-mail",
"googleEmail": "Google email",
"inviteMoreHeader": "Du är enda deltagaren i mötet",
"inviteMoreMailSubject": "Anslut till {{appName}} möte",
"inviteMorePrompt": "Bjud in fler personer",
"linkCopied": "Länk kopierad till utklipp",
"outlookEmail": "Outlook e-mail",
"outlookEmail": "Outlook email",
"phoneNumbers": "telefonnummer",
"searching": "Söker....",
"shareInvite": "Dela mötes inbjudan",
"shareLink": "Dela mötes inbjudan för att bjuda in fler",
"shareStream": "Dela livestreamlänken",
"sipAddresses": "sip-adress",
"yahooEmail": "Yahoo e-mail"
"yahooEmail": "Yahoo email"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -1079,7 +1079,7 @@
"title": "Delade dokument"
},
"e2ee": {
"labelToolTip": "jud- och videokommunikation för detta samtal är krypterad från dator till dator"
"labelToolTip": "Ljud- och videokommunikation för detta samtal är krypterad från dator till dator"
},
"embedMeeting": {
"title": "Bädda in möte"
@@ -1165,8 +1165,8 @@
"send": "Skicka"
},
"answer": {
"skip": "Skicka",
"submit": "Skippa"
"skip": "Skippa",
"submit": "Skicka"
},
"results": {
"vote": "Rösta",

View File

@@ -598,8 +598,8 @@
},
"profile": {
"setDisplayNameLabel": "Ім'я на екрані",
"setEmailInput": "Зазначте e-mail",
"setEmailLabel": "E-mail для Gravatar",
"setEmailInput": "Зазначте email",
"setEmailLabel": "Email для Gravatar",
"title": "Профіль"
},
"raisedHand": "Бажає говорити",

View File

@@ -514,7 +514,7 @@
},
"profile": {
"setDisplayNameLabel": "Nhập tên hiển thị của bạn",
"setEmailInput": "Nhập địa chỉ e-mail",
"setEmailInput": "Nhập địa chỉ email",
"setEmailLabel": "Nhập địa chỉ Gravatar thư điện tử của bạn",
"title": "Hồ sơ"
},

View File

@@ -39,6 +39,28 @@
"audioOnly": {
"audioOnly": "低頻寬"
},
"blankPage": {
"meetingEnded": "會議已結束。"
},
"breakoutRooms": {
"defaultName": "分組討論室 #{{index}}",
"mainRoom": "主會議室",
"actions": {
"add": "新增討論室",
"autoAssign": "自動分配至討論室",
"close": "關閉",
"join": "加入",
"leaveBreakoutRoom": "離開討論室",
"more": "更多",
"remove": "移除",
"sendToBreakoutRoom": "將參與者移至:"
},
"notifications": {
"joinedTitle": "分組討論室",
"joined": "正在加入 \"{{name}}\" 分組討論室",
"joinedMainRoom": "正在加入主會議室"
}
},
"calendarSync": {
"addMeetingURL": "增加會議連結",
"confirmAddLink": "您要為此活動加入 Jitsi 連結嗎?",
@@ -70,13 +92,17 @@
"titleWithPolls": "輸入名稱來使用交談"
},
"privateNotice": "私人訊息傳送至 {{recipient}}",
"title": "對話",
"titleWithPolls": "對話",
"you": "您",
"message": "訊息",
"messageAccessibleTitle": "{{user}} 說:",
"messageAccessibleTitleMe": "您說:",
"smileysPanel": "表情符號面板"
"smileysPanel": "表情符號面板",
"tabs": {
"chat": "聊天",
"polls": "投票"
},
"title": "對話",
"titleWithPolls": "對話",
"you": "您"
},
"chromeExtensionBanner": {
"installExtensionText": "安裝適用於 Google 行事曆及 Office 365 整合的擴充功能",
@@ -209,7 +235,9 @@
"done": "完成",
"e2eeDescription": "端對端加密目前是實驗性功能。請注意:啟用端對端加密將停用伺服器端提供的服務,例如:錄影、直播、及電話參與。且會議將只適用於支援 Insertable Streams 的瀏覽器。",
"e2eeLabel": "啟用端對端加密",
"e2eeDisabledDueToMaxModeDescription": "由於會議中的人數過多,故無法啟用端對端加密。",
"e2eeWarning": "警告:看來不是每位此會議的參與者都有啟用端對端加密,如果您啟用了,他們可能無法看/聽到您。",
"e2eeWillDisableDueToMaxModeDescription": "警告:如果有更多參與者加入會議,端對端加密將被自動停用。",
"enterDisplayName": "請在此輸入您自己的名字",
"embedMeeting": "嵌入會議",
"error": "錯誤",
@@ -245,24 +273,30 @@
"micPermissionDeniedError": "您未取得權限使用麥克風。您仍然可參加會議,但是其他人無法聽到您。可以利用位址欄中的攝影裝置按鈕來修正。",
"micTimeoutError": "無法啟動音訊裝置。連線逾時!",
"micUnknownError": "不明原因造成麥克風無法使用。",
"moderationAudioLabel": "允許參與者自我解除靜音",
"moderationVideoLabel": "允許參與者開啟視訊",
"muteEveryoneElseDialog": "靜音後,你就不能再解除對方的靜音,但對方可以隨時解除自己的靜音狀態。",
"muteEveryoneElseTitle": "是否要讓除了 {{whom}} 以外的人靜音?",
"muteEveryoneDialog": "是否要靜音所有人?靜音後,你就不能再解除對方的靜音,但對方可以隨時解除自己的靜音狀態。",
"muteEveryoneDialogModerationOn": "參與者可以隨時傳送說話請求。",
"muteEveryoneTitle": "靜音所有人?",
"muteEveryoneElsesVideoDialog": "一旦停用,您就不能再重新開啟對方的攝影機,但對方隨時能重新開啟自己的攝影機。",
"muteEveryoneElsesVideoTitle": "是否要關閉除了 {{whom}} 以外的人的攝影機?",
"muteEveryonesVideoDialog": "您確定要停用所有人的攝影機嗎?停用後,您就無法再重新開啟,只有對方能自己重新開啟。",
"muteEveryonesVideoDialogModerationOn": "參與者可以隨時傳送開啟視訊請求。",
"muteEveryonesVideoDialogOk": "停用",
"muteEveryonesVideoTitle": "關閉所有人的攝影機?",
"muteEveryoneSelf": "您自己",
"muteEveryoneStartMuted": "現在所有人皆已靜音",
"muteParticipantBody": "您無法對他們解除靜音,但是他們自己隨時可以解除靜音。",
"muteParticipantButton": "靜音",
"muteParticipantDialog": "確定要將這位參與者設為靜音?您無法為他們解除,但他們可以隨時自行解除靜音。",
"muteParticipantTitle": "將這位參與者設為靜音?",
"muteParticipantsVideoDialog": "確定要將這位參與者設為靜音?您無法為他們解除,但他們可以隨時自行解除靜音。",
"muteParticipantsVideoDialogModerationOn": "您確定要關閉此參與者的視訊鏡頭嗎?您和他都無法再將視訊重新開啟。",
"muteParticipantsVideoButton": "停用攝影機",
"muteParticipantsVideoTitle": "停用此參與者的攝影機?",
"muteParticipantsVideoBody": "您無法重新開啟,只有對方能自己重新開啟。",
"muteParticipantsVideoBodyModerationOn": "您和他都無法再將視訊重新開啟。",
"noDropboxToken": "沒有有效的 Dropbox 權杖",
"Ok": "確定",
"password": "密碼",
"passwordLabel": "會議已被參與者鎖定。請輸入 $t(lockRoomPassword) 以加入。",
@@ -323,6 +357,7 @@
"shareScreenWarningH1": "如果您只要分享畫面:",
"shareScreenWarningD1": "您必須先停止分享音訊才能分享畫面。",
"shareScreenWarningD2": "您必須先停止分享音訊,啟動畫面分享,然後勾選 \"分享音訊\" 選項。",
"sharedVideoLinkPlaceholder": "YouTube 或影片連結",
"stopLiveStreaming": "停止直播串流",
"stopRecording": "停止錄影",
"stopRecordingWarning": "確定要停止錄影嗎?",
@@ -382,7 +417,8 @@
"image7" : "日出",
"desktopShareError": "無法建立桌面分享",
"desktopShare":"桌面分享",
"webAssemblyWarning": "不支援 WebAssembly"
"webAssemblyWarning": "不支援 WebAssembly",
"backgroundEffectError": "無法套用背景效果。"
},
"feedback": {
"average": "普通",
@@ -419,6 +455,10 @@
"invitePhone": "要用電話參加會議,請使用:{{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "要找另一組撥入號碼?\n請見會議撥入號碼{{url}}\n\n\n如果也要用室內電話撥打不用連接語音進行加入{{silentUrl}}",
"inviteSipEndpoint": "如果要透過 SIP 地址加入,請輸入:{{sipUri}}",
"inviteTextiOSPersonal": "{{name}} 邀請您加入會議。",
"inviteTextiOSJoinSilent": "如果您使用了市內電話撥入,請使用此連結來停用音訊:{{silentUrl}}。",
"inviteTextiOSInviteUrl": "點擊此連結以加入:{{inviteUrl}}。",
"inviteTextiOSPhone": "若要透過電話加入,請使用此號碼:{{number}},,{{conferenceID}}#。如果您需要其他號碼,點擊此連結以檢視完整列表:{{didUrl}}。",
"inviteURLFirstPartGeneral": "您受邀參加會議。",
"inviteURLFirstPartPersonal": "{{name}} 正在邀請您加入會議。\n",
"inviteURLSecondPart": "\n加入會議\n{{url}}\n",
@@ -483,6 +523,7 @@
"expandedPending": "直播串流正被啟動...",
"failedToStart": "直播串流啟動失敗",
"getStreamKeyManually": "我們無法解析任何直播串流,請從 YouTube 取得您的直播串流金鑰。",
"inProgress": "正在錄製或直播",
"invalidStreamKey": "直播串流金鑰可能不正確。",
"off": "直播串流已經停止",
"offBy": "{{name}} 停止了直播串流",
@@ -490,6 +531,7 @@
"onBy": "{{name}} 啟動了直播串流",
"pending": "啟動直播串流...",
"serviceName": "直播串流服務",
"sessionAlreadyActive": "已在錄製或直播此工作階段。",
"signedInAs": "您目前登入名稱為:",
"signIn": "使用 Google 帳戶登入",
"signInCTA": "輸入 YouTube 直播串流密鑰,或登入 YouTube 帳號。",
@@ -533,6 +575,10 @@
"lockRoomPasswordUppercase": "密碼",
"me": "我",
"notify": {
"allowAction": "允許",
"allowedUnmute": "您可以將麥克風解除靜音、開啟視訊,或是分享您的畫面。",
"audioUnmuteBlockedTitle": "麥克風解除靜音遭封鎖!",
"audioUnmuteBlockedDescription": "麥克風解除靜音操作由於系統限制而被暫時封鎖。",
"connectedOneMember": "{{name}} 加入了會議",
"connectedThreePlusMembers": "{{name}} 及 {{count}} 位人員加入了會議",
"connectedTwoMembers": "{{first}} 及 {{second}} 加入了會議",
@@ -545,6 +591,9 @@
"invitedThreePlusMembers": "{{name}} 及 {{count}} 位人員已受邀請",
"invitedTwoMembers": "{{first}} 及 {{second}} 已受邀請",
"kickParticipant": "{{kicked}} 已被 {{kicker}} 踢出會議",
"leftOneMember": "{{name}} 已離開會議",
"leftThreePlusMembers": "{{name}} 和其他人已離開會議",
"leftTwoMembers": "{{first}} 和 {{second}} 已離開會議",
"me": "自己",
"moderator": "主持人權限已經取得!",
"muted": "您已經啟動通話,處於靜音。",
@@ -583,26 +632,71 @@
"moderationStoppedTitle": "停止管理",
"moderationToggleDescription": "由 {{participantDisplayName}}",
"raiseHandAction": "舉手",
"groupTitle": "通知"
"reactionSounds": "停用音效",
"reactionSoundsForAll": "為所有人停用音效",
"groupTitle": "通知",
"videoUnmuteBlockedTitle": "視訊鏡頭解除靜音遭封鎖!",
"videoUnmuteBlockedDescription": "視訊鏡頭解除靜音操作由於系統限制而被暫時封鎖。"
},
"participantsPane": {
"close": "關閉",
"header": "參與者",
"headings": {
"lobby": "大廳 ({{count}})",
"participantsList": "會議參與者 ({{count}})"
"participantsList": "會議參與者 ({{count}})",
"waitingLobby": "於大廳等待 ({{count}})"
},
"actions": {
"allow": "允許參與者能夠:",
"allowVideo": "允許視訊",
"audioModeration": "自我解除靜音",
"blockEveryoneMicCamera": "封鎖所有人的麥克風和視訊鏡頭",
"invite": "邀請他人",
"askUnmute": "要求解除靜音",
"moreModerationActions": "更多管理選項",
"moreParticipantOptions": "更多參與者選項",
"mute": "靜音",
"muteAll": "靜音所有人",
"startModeration": "將他們解除靜音或開始視訊",
"muteEveryoneElse": "靜音其他人",
"stopEveryonesVideo": "停止所有人的視訊",
"stopVideo": "停止影片"
}
"stopVideo": "停止影片",
"unblockEveryoneMicCamera": "解除封鎖所有人的麥克風及視訊鏡頭",
"videoModeration": "開啟視訊",
"moreModerationControls": "更多管理控制項"
},
"search": "搜尋參與者"
},
"passwordSetRemotely": "由其他參與者設定",
"passwordDigitsOnly": "上限為 {{number}} 位數",
"polls": {
"by": "由 {{ name }}",
"create": {
"addOption": "新增選項",
"answerPlaceholder": "選項 {{index}}",
"create": "建立投票",
"cancel": "取消",
"pollOption" : "投票選項 {{index}}",
"pollQuestion" : "投票問題",
"questionPlaceholder": "詢問問題",
"removeOption": "移除選項",
"send": "傳送"
},
"answer": {
"skip": "跳過",
"submit": "提交"
},
"results": {
"vote": "投票",
"changeVote": "修改投票",
"empty": "目前會議中沒有任何投票。在這裡建立您的投票吧!",
"hideDetailedResults": "隱藏詳細資訊",
"showDetailedResults": "顯示詳細資訊"
},
"notification": {
"title": "此會議有一項新投票",
"description": "開啟投票分頁以參與投票"
}
},
"poweredby": "技術支援",
"prejoin": {
"audioAndVideoError": "音訊及視訊錯誤:",
@@ -643,6 +737,7 @@
"errorDialOutFailed": "因通話失敗而無法撥出。",
"errorDialOutStatus": "取得撥出狀態時發生錯誤",
"errorMissingName": "請輸入您的名字以加入會議",
"errorNoPermissions": "您必須啟用麥克風及視訊鏡頭存取權限",
"errorStatusCode": "撥出失敗,狀態代碼:{{status}}",
"errorValidation": "號碼驗證失敗",
"iWantToDialIn": "我想要撥入",
@@ -700,6 +795,7 @@
"expandedPending": "錄影正在啟動...",
"failedToStart": "錄影啟動失敗",
"fileSharingdescription": "分享錄影給會議參與者",
"inProgress": "正在錄製或直播",
"linkGenerated": "我們建立了您的錄影檔的連結。",
"live": "直播",
"loggedIn": "以 {{userName}} 登入",
@@ -712,6 +808,7 @@
"serviceDescription": "您的錄影會由錄影服務儲存",
"serviceDescriptionCloud": "雲端錄製",
"serviceName": "錄影服務",
"sessionAlreadyActive": "已在錄製或直播此工作階段。",
"signIn": "登入",
"signOut": "登出",
"unavailable": "喔哦!{{serviceName}} 目前無法使用。我們正在解決此問題,請稍後再試。",
@@ -741,6 +838,7 @@
"devices": "裝置",
"followMe": "全部人跟隨我",
"framesPerSecond": "幀數",
"incomingMessage": "新訊息",
"language": "語言",
"loggedIn": "以 {{name}} 登入",
"microphones": "麥克風",
@@ -748,13 +846,20 @@
"more": "更多",
"name": "名稱",
"noDevice": "無",
"participantJoined": "參與者已加入",
"participantLeft": "參與者已離開",
"playSounds": "播放音效",
"reactions": "會議反應",
"sameAsSystem": "系統預設 ({{label}})",
"selectAudioOutput": "音訊輸出",
"selectCamera": "攝影裝置",
"selectMic": "麥克風",
"sounds": "音效",
"speakers": "喇叭",
"startAudioMuted": "全部人啟動時處於靜音",
"startReactionsMuted": "為所有人關閉反應音效",
"startVideoMuted": "全部人啟動時處於隱藏",
"talkWhileMuted": "靜音時說話",
"title": "設定"
},
"settingsView": {
@@ -785,12 +890,20 @@
},
"speaker": "喇叭",
"speakerStats": {
"search": "搜尋",
"hours": "{{count}}時",
"minutes": "{{count}}分",
"name": "名稱",
"seconds": "{{count}}秒",
"speakerStats": "聲音輸出數據",
"speakerTime": "聲音輸出時間"
"speakerTime": "聲音輸出時間",
"happy": "開心",
"neutral": "中立",
"sad": "悲傷",
"surprised": "驚訝",
"angry": "憤怒",
"fearful": "害怕",
"disgusted": "作嘔"
},
"startupoverlay": {
"policyText": " ",
@@ -806,6 +919,7 @@
"accessibilityLabel": {
"audioOnly": "切換僅聲音",
"audioRoute": "選擇音訊裝置",
"boo": "喝倒彩",
"callQuality": "管理影像品質",
"cc": "切換字幕",
"chat": "切換聊天視窗",
@@ -870,11 +984,13 @@
"audioOnlyOn": "啟用低頻寬模式",
"audioRoute": "選擇音訊裝置",
"authenticate": "認證",
"boo": "喝倒彩",
"callQuality": "管理影像品質",
"chat": "開啟/關閉聊天欄",
"clap": "鼓掌",
"closeChat": "關閉聊天欄",
"closeReactionsMenu": "關閉反應選單",
"disableReactionSounds": "您可以停用此會議的反應音效",
"documentClose": "關閉分享檔案欄",
"documentOpen": "開啟分享檔案欄",
"download": "下載我們的應用程式",
@@ -888,7 +1004,9 @@
"hangup": "離開",
"help": "說明",
"invite": "邀請人員",
"joy": "高興",
"joinBreakoutRoom": "加入分組討論室",
"laugh": "大笑",
"leaveBreakoutRoom": "離開分組討論室",
"like": "比讚",
"lobbyButtonDisable": "停用大廳模式",
"lobbyButtonEnable": "啟用大廳模式",
@@ -910,17 +1028,16 @@
"openChat": "開啟聊天欄",
"openReactionsMenu": "開啟反應選單",
"participants": "參與者",
"party": "慶祝",
"pip": "進入子母畫面模式",
"privateMessage": "送私人訊息",
"privateMessage": "送私人訊息",
"profile": "編輯您的簡介",
"raiseHand": "舉手/取消請求發言",
"raiseYourHand": "舉手發言",
"raiseHand": "舉手/放下",
"raiseYourHand": "舉手",
"reactionBoo": "傳送喝倒彩反應",
"reactionClap": "傳送鼓掌反應",
"reactionJoy": "傳送高興反應",
"reactionLaugh": "傳送大笑反應",
"reactionLike": "傳送比讚反應",
"reactionParty": "傳送拉炮反應",
"reactionSmile": "傳送微笑反應",
"reactionSilence": "傳送靜默反應",
"reactionSurprised": "傳送驚訝反應",
"security": "安全性選項",
"Settings": "設定",
@@ -979,7 +1096,10 @@
"pending": "已向 {{displayName}} 發送邀請"
},
"videoStatus": {
"adjustFor": "調整:",
"audioOnly": "僅聲音",
"bestPerformance": "最佳效能",
"highestQuality": "最佳品質",
"audioOnlyExpanded": "您目前處於低頻寬模式。在此模式下您僅會收到語音及螢幕分享。",
"callQuality": "影像品質",
"hd": "HD",
@@ -990,6 +1110,7 @@
"ld": "LD",
"ldTooltip": "觀看低解析度影像",
"lowDefinition": "低解析度",
"performanceSettings": "效能設定",
"sd": "SD",
"sdTooltip": "觀看標準解析度影像",
"standardDefinition": "標準解析度"
@@ -1063,6 +1184,12 @@
"button": "邀請其他人",
"youAreAlone": "您是會議中的唯一一個人"
},
"termsView": {
"header": "條款"
},
"privacyView": {
"header": "隱私權"
},
"helpView": {
"header": "說明中心"
},
@@ -1081,6 +1208,7 @@
"enableDialogText": "大廳模式能夠保護您的會議,只有被管理員認可後才能加入會議。",
"enterPasswordButton": "輸入會議密碼",
"enterPasswordTitle": "輸入密碼以加入會議",
"errorMissingPassword": "請輸入會議密碼",
"invalidPassword": "密碼錯誤",
"joiningMessage": "一旦他人接受您的請求,即可加入會議",
"joinWithPasswordMessage": "正在嘗試透過密碼加入,請稍候...",
@@ -1099,6 +1227,7 @@
"passwordField": "輸入會議密碼",
"passwordJoinButton": "加入",
"reject": "拒絕",
"rejectAll": "拒絕所有人",
"toggleLabel": "啟用大廳"
}
}

View File

@@ -39,6 +39,9 @@
"audioOnly": {
"audioOnly": "Low bandwidth"
},
"blankPage": {
"meetingEnded": "Meeting ended."
},
"breakoutRooms": {
"defaultName": "Breakout room #{{index}}",
"mainRoom": "Main room",
@@ -51,6 +54,11 @@
"more": "More",
"remove": "Remove",
"sendToBreakoutRoom": "Send participant to:"
},
"notifications": {
"joinedTitle": "Breakout Rooms",
"joined": "Joining the \"{{name}}\" breakout room",
"joinedMainRoom": "Joining the main room"
}
},
"calendarSync": {
@@ -172,7 +180,8 @@
"joinInApp": "Join this meeting using the app",
"launchWebButton": "Launch in web",
"title": "Launching your meeting in {{app}}...",
"tryAgainButton": "Try again in desktop"
"tryAgainButton": "Try again in desktop",
"unsupportedBrowser": "It looks like you're using a browser we don't support."
},
"defaultLink": "e.g. {{url}}",
"defaultNickname": "ex. Jane Pink",
@@ -410,6 +419,7 @@
"desktopShareError": "Could not create desktop share",
"desktopShare":"Desktop share",
"webAssemblyWarning": "WebAssembly not supported",
"webAssemblyWarningDescription": "WebAssembly disabled or not supported by this browser",
"backgroundEffectError": "Failed to apply background effect."
},
"feedback": {
@@ -460,7 +470,7 @@
"noPassword": "None",
"noRoom": "No room was specified to dial-in into.",
"numbers": "Dial-in Numbers",
"password": "$t(lockRoomPasswordUppercase):",
"password": "$t(lockRoomPasswordUppercase): ",
"sip": "SIP address",
"title": "Share",
"tooltip": "Share link and dial-in info for this meeting",
@@ -569,6 +579,8 @@
"notify": {
"allowAction": "Allow",
"allowedUnmute": "You can unmute your microphone, start your camera or share your screen.",
"audioUnmuteBlockedTitle": "Mic unmute blocked!",
"audioUnmuteBlockedDescription": "Mic unmute operation has been temporarily blocked because of system limits.",
"connectedOneMember": "{{name}} joined the meeting",
"connectedThreePlusMembers": "{{name}} and many others joined the meeting",
"connectedTwoMembers": "{{first}} and {{second}} joined the meeting",
@@ -580,6 +592,9 @@
"invitedThreePlusMembers": "{{name}} and {{count}} others have been invited",
"invitedTwoMembers": "{{first}} and {{second}} have been invited",
"kickParticipant": "{{kicked}} was kicked by {{kicker}}",
"leftOneMember": "{{name}} left the meeting",
"leftThreePlusMembers": "{{name}} and many others left the meeting",
"leftTwoMembers": "{{first}} and {{second}} left the meeting",
"me": "Me",
"moderator": "You're now a moderator",
"muted": "You have started the conversation muted.",
@@ -591,8 +606,10 @@
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) removed by another participant",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) set by another participant",
"raisedHand": "Would like to speak.",
"raisedHands": "{{participantName}} and {{raisedHands}} more people",
"screenShareNoAudio": " Share audio box was not checked in the window selection screen.",
"screenShareNoAudioTitle": "Couldn't share system audio!",
"selfViewTitle": "You can always un-hide the self-view from settings",
"somebody": "Somebody",
"startSilentTitle": "You joined with no audio output!",
"startSilentDescription": "Rejoin the meeting to enable audio",
@@ -619,7 +636,10 @@
"moderationToggleDescription": "by {{participantDisplayName}}",
"raiseHandAction": "Raise hand",
"reactionSounds": "Disable sounds",
"groupTitle": "Notifications"
"reactionSoundsForAll": "Disable sounds for all",
"groupTitle": "Notifications",
"videoUnmuteBlockedTitle": "Camera unmute and desktop sharing blocked!",
"videoUnmuteBlockedDescription": "Camera unmute and desktop sharing operation have been temporarily blocked because of system limits."
},
"participantsPane": {
"close": "Close",
@@ -644,7 +664,8 @@
"stopEveryonesVideo": "Stop everyone's video",
"stopVideo": "Stop video",
"unblockEveryoneMicCamera": "Unblock everyone's mic and camera",
"videoModeration": "Start their video"
"videoModeration": "Start their video",
"moreModerationControls": "More moderation controls"
},
"search": "Search participants"
},
@@ -756,7 +777,7 @@
"profile": {
"avatar": "avatar",
"setDisplayNameLabel": "Set your display name",
"setEmailInput": "Enter e-mail",
"setEmailInput": "Enter email",
"setEmailLabel": "Set your gravatar email",
"title": "Profile"
},
@@ -803,8 +824,8 @@
"security": {
"about": "You can add a $t(lockRoomPassword) to your meeting. Participants will need to provide the $t(lockRoomPassword) before they are allowed to join the meeting.",
"aboutReadOnly": "Moderator participants can add a $t(lockRoomPassword) to the meeting. Participants will need to provide the $t(lockRoomPassword) before they are allowed to join the meeting.",
"insecureRoomNameWarning": "The room name is unsafe. Unwanted participants may join your conference. Consider securing your meeting using the security button.",
"securityOptions": "Security options"
"header": "Security Options",
"insecureRoomNameWarning": "The room name is unsafe. Unwanted participants may join your conference. Consider securing your meeting using the security button."
},
"settings": {
"calendar": {
@@ -839,6 +860,7 @@
"sounds": "Sounds",
"speakers": "Speakers",
"startAudioMuted": "Everyone starts muted",
"startReactionsMuted": "Mute reaction sounds for everyone",
"startVideoMuted": "Everyone starts hidden",
"talkWhileMuted": "Talk while muted",
"title": "Settings"
@@ -871,20 +893,20 @@
},
"speaker": "Speaker",
"speakerStats": {
"search": "Search",
"angry": "Angry",
"disgusted": "Disgusted",
"fearful": "Fearful",
"happy": "Happy",
"hours": "{{count}}h",
"minutes": "{{count}}m",
"name": "Name",
"seconds": "{{count}}s",
"speakerStats": "Speaker Stats",
"speakerTime": "Speaker Time",
"happy": "Happy",
"neutral": "Neutral",
"sad": "Sad",
"surprised": "Surprised",
"angry": "Angry",
"fearful": "Fearful",
"disgusted": "Disgusted"
"search": "Search",
"seconds": "{{count}}s",
"speakerTime": "Speaker Time",
"speakerStats": "Speaker Stats",
"surprised": "Surprised"
},
"startupoverlay": {
"policyText": " ",
@@ -1104,6 +1126,7 @@
"domuteVideoOfOthers": "Disable camera of everyone else",
"flip": "Flip",
"grantModerator": "Grant Moderator Rights",
"hideSelfView": "Hide self view",
"kick": "Kick out",
"moderator": "Moderator",
"mute": "Participant is muted",

View File

@@ -66,8 +66,9 @@ import { toggleLobbyMode, setKnockingParticipantApproval } from '../../react/fea
import { isForceMuted } from '../../react/features/participants-pane/functions';
import { RECORDING_TYPES } from '../../react/features/recording/constants';
import { getActiveSession } from '../../react/features/recording/functions';
import { isScreenAudioSupported } from '../../react/features/screen-share';
import { isScreenAudioSupported, isScreenVideoShared } from '../../react/features/screen-share';
import { startScreenShareFlow, startAudioScreenShareFlow } from '../../react/features/screen-share/actions';
import { toggleScreenshotCaptureSummary } from '../../react/features/screenshot-capture';
import { playSharedVideo, stopSharedVideo } from '../../react/features/shared-video/actions.any';
import { toggleTileView, setTileView } from '../../react/features/video-layout';
import { muteAllParticipants } from '../../react/features/video-menu/actions';
@@ -470,6 +471,9 @@ function initCommands() {
return;
}
if (isScreenVideoShared(APP.store.getState())) {
APP.store.dispatch(toggleScreenshotCaptureSummary(true));
}
conference.startRecording(recordingConfig);
},
@@ -498,6 +502,7 @@ function initCommands() {
const activeSession = getActiveSession(state, mode);
if (activeSession && activeSession.id) {
APP.store.dispatch(toggleScreenshotCaptureSummary(false));
conference.stopRecording(activeSession.id);
} else {
logger.error('No recording or streaming session found');
@@ -1470,12 +1475,14 @@ class API {
* available.
*
* @param {string} link - The recording download link.
* @param {number} ttl - The recording download link time to live.
* @returns {void}
*/
notifyRecordingLinkAvailable(link: string) {
notifyRecordingLinkAvailable(link: string, ttl: number) {
this._sendEvent({
name: 'recording-link-available',
link
link,
ttl
});
}

View File

@@ -10,7 +10,12 @@ import { isMobileBrowser } from '../../react/features/base/environment/utils';
import { setColorAlpha } from '../../react/features/base/util';
import { setDocumentUrl } from '../../react/features/etherpad';
import { setFilmstripVisible } from '../../react/features/filmstrip';
import { joinLeaveNotificationsDisabled, setNotificationsEnabled } from '../../react/features/notifications';
import {
joinLeaveNotificationsDisabled,
setNotificationsEnabled,
showNotification,
NOTIFICATION_TIMEOUT_TYPE
} from '../../react/features/notifications';
import {
dockToolbox,
setToolboxEnabled,
@@ -215,12 +220,10 @@ UI.updateUserStatus = (user, status) => {
const displayName = user.getDisplayName();
messageHandler.participantNotification(
displayName,
'',
'connected',
'dialOut.statusMessage',
{ status: UIUtil.escapeHtml(status) });
APP.store.dispatch(showNotification({
titleKey: `${displayName} connected`,
descriptionKey: 'dialOut.statusMessage'
}, NOTIFICATION_TIMEOUT_TYPE.SHORT));
};
/**
@@ -333,18 +336,6 @@ UI.notifyMaxUsersLimitReached = function() {
});
};
/**
* Notify user that he was automatically muted when joned the conference.
*/
UI.notifyInitiallyMuted = function() {
messageHandler.participantNotification(
null,
'notify.mutedTitle',
'connected',
'notify.muted',
null);
};
UI.handleLastNEndpoints = function(leavingIds, enteringIds) {
VideoLayout.onLastNEndpointsChanged(leavingIds, enteringIds);
};
@@ -363,15 +354,6 @@ UI.notifyTokenAuthFailed = function() {
});
};
UI.notifyFocusDisconnected = function(focus, retrySec) {
messageHandler.participantNotification(
null, 'notify.focus',
'disconnected', 'notify.focusFail',
{ component: focus,
ms: retrySec }
);
};
/**
* Update list of available physical devices.
*/

View File

@@ -1,9 +1,8 @@
/* global APP */
import {
NOTIFICATION_TIMEOUT,
NOTIFICATION_TIMEOUT_TYPE,
showErrorNotification,
showNotification,
showWarningNotification
} from '../../../react/features/notifications';
@@ -48,7 +47,7 @@ const messageHandler = {
* showErrorNotification action.
*/
showError(props) {
APP.store.dispatch(showErrorNotification(props));
APP.store.dispatch(showErrorNotification(props, NOTIFICATION_TIMEOUT_TYPE.LONG));
},
/**
@@ -58,35 +57,7 @@ const messageHandler = {
* showWarningNotification action.
*/
showWarning(props) {
APP.store.dispatch(showWarningNotification(props));
},
/**
* Displays a notification about participant action.
* @param displayName the display name of the participant that is
* associated with the notification.
* @param displayNameKey the key from the language file for the display
* name. Only used if displayName is not provided.
* @param cls css class for the notification
* @param messageKey the key from the language file for the text of the
* message.
* @param messageArguments object with the arguments for the message.
* @param optional configurations for the notification (e.g. timeout)
*/
participantNotification( // eslint-disable-line max-params
displayName,
displayNameKey,
cls,
messageKey,
messageArguments,
timeout = NOTIFICATION_TIMEOUT) {
APP.store.dispatch(showNotification({
descriptionArguments: messageArguments,
descriptionKey: messageKey,
titleKey: displayNameKey,
title: displayName
},
timeout));
APP.store.dispatch(showWarningNotification(props, NOTIFICATION_TIMEOUT_TYPE.LONG));
}
};

View File

@@ -14,7 +14,10 @@ import {
JitsiParticipantConnectionStatus
} from '../../../react/features/base/lib-jitsi-meet';
import { MEDIA_TYPE, VIDEO_TYPE } from '../../../react/features/base/media';
import { getParticipantById } from '../../../react/features/base/participants';
import {
getParticipantById,
getParticipantDisplayName
} from '../../../react/features/base/participants';
import { getTrackByMediaTypeAndParticipant } from '../../../react/features/base/tracks';
import { CHAT_SIZE } from '../../../react/features/chat';
import {
@@ -314,10 +317,12 @@ export default class LargeVideoManager {
* @private
*/
updateParticipantConnStatusIndication(id, messageKey) {
const state = APP.store.getState();
if (messageKey) {
// Get user's display name
const displayName
= APP.conference.getParticipantDisplayName(id);
= getParticipantDisplayName(state, id);
this._setRemoteConnectionMessage(
messageKey,

407
package-lock.json generated
View File

@@ -36,6 +36,7 @@
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz",
"@microsoft/microsoft-graph-client": "1.1.0",
"@react-native-async-storage/async-storage": "1.15.5",
"@react-native-community/clipboard": "1.5.1",
"@react-native-community/google-signin": "3.0.1",
"@react-native-community/netinfo": "4.1.5",
"@react-native-community/slider": "3.0.3",
@@ -55,6 +56,7 @@
"dropbox": "10.7.0",
"face-api.js": "0.22.2",
"focus-visible": "5.1.0",
"grapheme-splitter": "1.0.4",
"i18n-iso-countries": "6.8.0",
"i18next": "17.0.6",
"i18next-browser-languagedetector": "3.0.1",
@@ -64,7 +66,7 @@
"jquery-i18next": "1.2.1",
"js-md5": "0.6.1",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#bdfbb82087ce2a9336157da35e739fb4b250ed66",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#d630bc32a1262afd0432d8b8d8d0025dd5afd1e5",
"libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
"lodash": "4.17.21",
"moment": "2.29.1",
@@ -102,7 +104,7 @@
"react-native-url-polyfill": "1.2.0",
"react-native-video": "5.1.1",
"react-native-watch-connectivity": "0.4.3",
"react-native-webrtc": "1.92.2",
"react-native-webrtc": "1.94.1",
"react-native-webview": "11.0.2",
"react-native-youtube-iframe": "2.1.1",
"react-redux": "7.1.0",
@@ -3454,27 +3456,6 @@
"node-pre-gyp": "bin/node-pre-gyp"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/chownr": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
"optional": true,
"engines": {
"node": ">=10"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/fs-minipass": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
"optional": true,
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -3487,43 +3468,6 @@
"node": ">=10"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/minipass": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
"integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
"optional": true,
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/minizlib": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
"optional": true,
"dependencies": {
"minipass": "^3.0.0",
"yallist": "^4.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"optional": true,
"bin": {
"mkdirp": "bin/cmd.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": {
"version": "2.6.5",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz",
@@ -3566,23 +3510,6 @@
"node": ">=10"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/tar": {
"version": "6.1.11",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
"optional": true,
"dependencies": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"minipass": "^3.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -4171,6 +4098,15 @@
"node": ">=8"
}
},
"node_modules/@react-native-community/clipboard": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/@react-native-community/clipboard/-/clipboard-1.5.1.tgz",
"integrity": "sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA==",
"peerDependencies": {
"react": ">=16.0",
"react-native": ">=0.57.0"
}
},
"node_modules/@react-native-community/google-signin": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@react-native-community/google-signin/-/google-signin-3.0.1.tgz",
@@ -6415,6 +6351,14 @@
"node": ">=8.0"
}
},
"node_modules/chownr": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
"engines": {
"node": ">=10"
}
},
"node_modules/chrome-trace-event": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
@@ -6987,14 +6931,6 @@
"node": "4.x || >=6.0.0"
}
},
"node_modules/cross-os": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/cross-os/-/cross-os-1.4.0.tgz",
"integrity": "sha512-nuARAXqbsizhsqo3qo1bpYW2S6ohxJICjo/5Q/mq5xQ9dn1uWoRQ855DZrBAWgVfg7liPLdatnY2KMZwZYuxsQ==",
"bin": {
"cross-os": "source/index.js"
}
},
"node_modules/cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -8967,9 +8903,15 @@
}
},
"node_modules/event-target-shim": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-1.1.1.tgz",
"integrity": "sha1-qG5e5r2qFgVEddp5fM3fDFVphJE="
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz",
"integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==",
"engines": {
"node": ">=10.13.0"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
}
},
"node_modules/eventemitter3": {
"version": "3.1.2",
@@ -10011,6 +9953,17 @@
"node": ">=6 <7 || >=8"
}
},
"node_modules/fs-minipass": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/fs-monkey": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
@@ -10820,6 +10773,11 @@
"node": ">=0.4.0"
}
},
"node_modules/grapheme-splitter": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
},
"node_modules/growly": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
@@ -12561,8 +12519,8 @@
},
"node_modules/lib-jitsi-meet": {
"version": "0.0.0",
"resolved": "git+ssh://git@github.com/jitsi/lib-jitsi-meet.git#bdfbb82087ce2a9336157da35e739fb4b250ed66",
"integrity": "sha512-DqdQ/b/l7gzVplV2UkdwUDwFzST6yEj0oB+MFEIQAobhj/bIm/QjLjhPnu8EBKXFtUegma/WsX4jSBK+6U3RzQ==",
"resolved": "git+ssh://git@github.com/jitsi/lib-jitsi-meet.git#d630bc32a1262afd0432d8b8d8d0025dd5afd1e5",
"integrity": "sha512-LvIU+CghVMyI0nc+pjWH2EXgo5i7z2wgzjXhpTan0SB58nGQSa4SzWCgCRSOfeT20BwHNlejPOvNrtXe2pu98A==",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
@@ -13666,6 +13624,39 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"node_modules/minipass": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
"integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/minipass/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/minizlib": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
"dependencies": {
"minipass": "^3.0.0",
"yallist": "^4.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/minizlib/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/mixin-deep": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
@@ -16145,21 +16136,39 @@
}
},
"node_modules/react-native-webrtc": {
"version": "1.92.2",
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.92.2.tgz",
"integrity": "sha512-eq8otVRvLBD/kSM53SPymyrI7sq06/qejwhiLQKVlUsxaXTKPf3C5lktXsnw5OGZUmVk7y5rH+8ZJ3k+422t6g==",
"version": "1.94.1",
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.94.1.tgz",
"integrity": "sha512-S+qU2i0PY2QfWzh8choBlVzUF6I6DVKhrUFbGrriuffieMu+/sR40pPTNCCFEXo4USNZAAM8osBgn6E/aZsJbg==",
"hasInstallScript": true,
"dependencies": {
"base64-js": "^1.1.2",
"cross-os": "^1.3.0",
"event-target-shim": "^1.0.5",
"prop-types": "^15.5.10",
"uuid": "^3.3.2"
"base64-js": "1.5.1",
"event-target-shim": "6.0.2",
"tar": "6.1.11",
"uuid": "3.4.0"
},
"peerDependencies": {
"react-native": ">=0.60.0"
}
},
"node_modules/react-native-webrtc/node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/react-native-webrtc/node_modules/uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -18084,6 +18093,38 @@
"node": ">=6"
}
},
"node_modules/tar": {
"version": "6.1.11",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
"dependencies": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"minipass": "^3.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/tar/node_modules/mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"bin": {
"mkdirp": "bin/cmd.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/tar/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/temp": {
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
@@ -22879,21 +22920,6 @@
"tar": "^6.1.0"
},
"dependencies": {
"chownr": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
"optional": true
},
"fs-minipass": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
"optional": true,
"requires": {
"minipass": "^3.0.0"
}
},
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -22903,31 +22929,6 @@
"yallist": "^4.0.0"
}
},
"minipass": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
"integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
"optional": true,
"requires": {
"yallist": "^4.0.0"
}
},
"minizlib": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
"optional": true,
"requires": {
"minipass": "^3.0.0",
"yallist": "^4.0.0"
}
},
"mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"optional": true
},
"node-fetch": {
"version": "2.6.5",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz",
@@ -22955,20 +22956,6 @@
"lru-cache": "^6.0.0"
}
},
"tar": {
"version": "6.1.11",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
"optional": true,
"requires": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"minipass": "^3.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
}
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -23411,6 +23398,11 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-3.0.0.tgz",
"integrity": "sha512-ng6Tm537E/M42GjE4TRUxQyL8sRfClcL7bQWblOCoxPZzJ2J3bdALsjeG3vDnVCIfI/R0AeFalN9KjMt0+Z/Zg=="
},
"@react-native-community/clipboard": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/@react-native-community/clipboard/-/clipboard-1.5.1.tgz",
"integrity": "sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA=="
},
"@react-native-community/google-signin": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@react-native-community/google-signin/-/google-signin-3.0.1.tgz",
@@ -25204,6 +25196,11 @@
}
}
},
"chownr": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
},
"chrome-trace-event": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
@@ -25659,11 +25656,6 @@
}
}
},
"cross-os": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/cross-os/-/cross-os-1.4.0.tgz",
"integrity": "sha512-nuARAXqbsizhsqo3qo1bpYW2S6ohxJICjo/5Q/mq5xQ9dn1uWoRQ855DZrBAWgVfg7liPLdatnY2KMZwZYuxsQ=="
},
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -27198,9 +27190,9 @@
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
"event-target-shim": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-1.1.1.tgz",
"integrity": "sha1-qG5e5r2qFgVEddp5fM3fDFVphJE="
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz",
"integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA=="
},
"eventemitter3": {
"version": "3.1.2",
@@ -28021,6 +28013,14 @@
"universalify": "^0.1.0"
}
},
"fs-minipass": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
"requires": {
"minipass": "^3.0.0"
}
},
"fs-monkey": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
@@ -28639,6 +28639,11 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
},
"grapheme-splitter": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
},
"growly": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
@@ -29988,9 +29993,9 @@
}
},
"lib-jitsi-meet": {
"version": "git+ssh://git@github.com/jitsi/lib-jitsi-meet.git#bdfbb82087ce2a9336157da35e739fb4b250ed66",
"integrity": "sha512-DqdQ/b/l7gzVplV2UkdwUDwFzST6yEj0oB+MFEIQAobhj/bIm/QjLjhPnu8EBKXFtUegma/WsX4jSBK+6U3RzQ==",
"from": "lib-jitsi-meet@github:jitsi/lib-jitsi-meet#bdfbb82087ce2a9336157da35e739fb4b250ed66",
"version": "git+ssh://git@github.com/jitsi/lib-jitsi-meet.git#d630bc32a1262afd0432d8b8d8d0025dd5afd1e5",
"integrity": "sha512-LvIU+CghVMyI0nc+pjWH2EXgo5i7z2wgzjXhpTan0SB58nGQSa4SzWCgCRSOfeT20BwHNlejPOvNrtXe2pu98A==",
"from": "lib-jitsi-meet@github:jitsi/lib-jitsi-meet#d630bc32a1262afd0432d8b8d8d0025dd5afd1e5",
"requires": {
"@jitsi/js-utils": "2.0.0",
"@jitsi/logger": "2.0.0",
@@ -30928,6 +30933,37 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"minipass": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
"integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
"requires": {
"yallist": "^4.0.0"
},
"dependencies": {
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
}
}
},
"minizlib": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
"requires": {
"minipass": "^3.0.0",
"yallist": "^4.0.0"
},
"dependencies": {
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
}
}
},
"mixin-deep": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
@@ -32872,17 +32908,21 @@
"integrity": "sha512-iqdJ1KpZbR4XGahgVmaeibB7kDhyMT7wrylINgJaYBY38IAiI0LF32VX1umO4pko6n21YF5I/kSeNQ+OXGqqow=="
},
"react-native-webrtc": {
"version": "1.92.2",
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.92.2.tgz",
"integrity": "sha512-eq8otVRvLBD/kSM53SPymyrI7sq06/qejwhiLQKVlUsxaXTKPf3C5lktXsnw5OGZUmVk7y5rH+8ZJ3k+422t6g==",
"version": "1.94.1",
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.94.1.tgz",
"integrity": "sha512-S+qU2i0PY2QfWzh8choBlVzUF6I6DVKhrUFbGrriuffieMu+/sR40pPTNCCFEXo4USNZAAM8osBgn6E/aZsJbg==",
"requires": {
"base64-js": "^1.1.2",
"cross-os": "^1.3.0",
"event-target-shim": "^1.0.5",
"prop-types": "^15.5.10",
"uuid": "^3.3.2"
"base64-js": "1.5.1",
"event-target-shim": "6.0.2",
"tar": "6.1.11",
"uuid": "3.4.0"
},
"dependencies": {
"base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -34375,6 +34415,31 @@
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
"dev": true
},
"tar": {
"version": "6.1.11",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
"requires": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"minipass": "^3.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
},
"dependencies": {
"mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
}
}
},
"temp": {
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",

View File

@@ -41,6 +41,7 @@
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz",
"@microsoft/microsoft-graph-client": "1.1.0",
"@react-native-async-storage/async-storage": "1.15.5",
"@react-native-community/clipboard": "1.5.1",
"@react-native-community/google-signin": "3.0.1",
"@react-native-community/netinfo": "4.1.5",
"@react-native-community/slider": "3.0.3",
@@ -60,6 +61,7 @@
"dropbox": "10.7.0",
"face-api.js": "0.22.2",
"focus-visible": "5.1.0",
"grapheme-splitter": "1.0.4",
"i18n-iso-countries": "6.8.0",
"i18next": "17.0.6",
"i18next-browser-languagedetector": "3.0.1",
@@ -69,7 +71,7 @@
"jquery-i18next": "1.2.1",
"js-md5": "0.6.1",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#bdfbb82087ce2a9336157da35e739fb4b250ed66",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#d630bc32a1262afd0432d8b8d8d0025dd5afd1e5",
"libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
"lodash": "4.17.21",
"moment": "2.29.1",
@@ -107,7 +109,7 @@
"react-native-url-polyfill": "1.2.0",
"react-native-video": "5.1.1",
"react-native-watch-connectivity": "0.4.3",
"react-native-webrtc": "1.92.2",
"react-native-webrtc": "1.94.1",
"react-native-webview": "11.0.2",
"react-native-youtube-iframe": "2.1.1",
"react-redux": "7.1.0",
@@ -169,8 +171,8 @@
},
"license": "Apache-2.0",
"scripts": {
"lint": "eslint . && flow",
"lint-fix": "eslint --fix .",
"lint": "eslint --max-warnings 0 . && flow",
"lint-fix": "eslint --max-warnings 0 --fix .",
"postinstall": "patch-package && jetify",
"validate": "npm ls",
"start": "make dev",

View File

@@ -884,3 +884,18 @@ export function createScreensharingCaptureTakenEvent() {
action: 'screen.sharing.capture.taken'
};
}
/**
* Creates an event for an action on breakout rooms.
*
* @param {string} actionSubject - The subject that was acted upon.
* @returns {Object} The event in a format suitable for sending via
* sendAnalytics.
*/
export function createBreakoutRoomsEvent(actionSubject) {
return {
action: 'clicked',
actionSubject: `${actionSubject}.button`,
source: 'breakout.rooms'
};
}

View File

@@ -25,7 +25,7 @@ import {
toURLString
} from '../base/util';
import { isVpaasMeeting } from '../jaas/functions';
import { clearNotifications, showNotification } from '../notifications';
import { NOTIFICATION_TIMEOUT_TYPE, clearNotifications, showNotification } from '../notifications';
import { setFatalError } from '../overlay';
import {
@@ -328,7 +328,7 @@ export function maybeRedirectToWelcomePage(options: Object = {}) {
dispatch(showNotification({
titleArguments: { appName: getName() },
titleKey: 'dialog.thankYou'
}));
}, NOTIFICATION_TIMEOUT_TYPE.STICKY));
}
// if Welcome page is enabled redirect to welcome page after 3 sec, if

View File

@@ -3,7 +3,6 @@
import React from 'react';
import SplashScreen from 'react-native-splash-screen';
import { setColorScheme } from '../../base/color-scheme';
import { DialogContainer } from '../../base/dialog';
import { updateFlags } from '../../base/flags/actions';
import { CALL_INTEGRATION_ENABLED, SERVER_URL_CHANGE_ENABLED } from '../../base/flags/constants';
@@ -91,7 +90,6 @@ export class App extends AbstractApp {
const { dispatch, getState } = this.state.store;
// We set these early enough so then we avoid any unnecessary re-renders.
dispatch(setColorScheme(this.props.colorScheme));
dispatch(updateFlags(this.props.flags));
// Check if serverURL is configured externally and not allowed to change.

View File

@@ -8,6 +8,7 @@ import '../external-api/middleware';
import '../keyboard-shortcuts/middleware';
import '../local-recording/middleware';
import '../no-audio-signal/middleware';
import '../notifications/middleware';
import '../noise-detection/middleware';
import '../old-client-notification/middleware';
import '../power-monitor/middleware';

View File

@@ -5,7 +5,6 @@ import '../authentication/reducer';
import '../av-moderation/reducer';
import '../base/app/reducer';
import '../base/audio-only/reducer';
import '../base/color-scheme/reducer';
import '../base/conference/reducer';
import '../base/config/reducer';
import '../base/connection/reducer';
@@ -17,7 +16,6 @@ import '../base/lastn/reducer';
import '../base/lib-jitsi-meet/reducer';
import '../base/logging/reducer';
import '../base/media/reducer';
import '../base/modal/reducer';
import '../base/net-info/reducer';
import '../base/participants/reducer';
import '../base/responsive-ui/reducer';

View File

@@ -17,6 +17,7 @@ import {
import { MiddlewareRegistry, StateListenerRegistry } from '../base/redux';
import { playSound, registerSound, unregisterSound } from '../base/sounds';
import {
NOTIFICATION_TIMEOUT_TYPE,
hideNotification,
showNotification
} from '../notifications';
@@ -97,16 +98,16 @@ MiddlewareRegistry.register(({ dispatch, getState }) => next => action => {
}
dispatch(showNotification({
customActionNameKey: 'notify.raiseHandAction',
customActionHandler: () => batch(() => {
customActionNameKey: [ 'notify.raiseHandAction' ],
customActionHandler: [ () => batch(() => {
dispatch(raiseHand(true));
dispatch(hideNotification(uid));
}),
}) ],
descriptionKey,
sticky: true,
titleKey,
uid
}));
}, NOTIFICATION_TIMEOUT_TYPE.STICKY));
break;
}
@@ -220,9 +221,9 @@ StateListenerRegistry.register(
dispatch(showNotification({
titleKey: 'notify.hostAskedUnmute',
sticky: true,
customActionNameKey: 'notify.unmute',
customActionHandler: () => dispatch(muteLocal(false, MEDIA_TYPE.AUDIO))
}));
customActionNameKey: [ 'notify.unmute' ],
customActionHandler: [ () => dispatch(muteLocal(false, MEDIA_TYPE.AUDIO)) ]
}, NOTIFICATION_TIMEOUT_TYPE.STICKY));
dispatch(playSound(ASKED_TO_UNMUTE_SOUND_ID));
}
});

View File

@@ -3,6 +3,7 @@
import React from 'react';
import { Icon } from '../../../icons';
import { isGravatarURL } from '../../functions';
import AbstractStatelessAvatar, { type Props as AbstractProps } from '../AbstractStatelessAvatar';
type Props = AbstractProps & {
@@ -66,6 +67,7 @@ export default class StatelessAvatar extends AbstractStatelessAvatar<Props> {
<img
alt = 'avatar'
className = { this._getAvatarClassName() }
crossOrigin = { isGravatarURL(url) ? '' : undefined }
data-testid = { this.props.testId }
id = { this.props.id }
onError = { this.props.onAvatarLoadError }

View File

@@ -0,0 +1,6 @@
// @flow
/**
* The base URL for gravatar images.
*/
export const GRAVATAR_BASE_URL = 'https://www.gravatar.com/avatar/';

View File

@@ -1,7 +1,10 @@
// @flow
import GraphemeSplitter from 'grapheme-splitter';
import _ from 'lodash';
import { GRAVATAR_BASE_URL } from './constants';
const AVATAR_COLORS = [
'#6A50D3',
'#FF9B42',
@@ -13,6 +16,8 @@ const AVATAR_COLORS = [
'#2AA076',
'#00A8B3'
];
const wordSplitRegex = (/\s+|\.+|_+|;+|-+|,+|\|+|\/+|\\+/);
const splitter = new GraphemeSplitter();
/**
* Generates the background color of an initials based avatar.
@@ -40,6 +45,20 @@ export function getAvatarColor(initials: ?string, customAvatarBackgrounds: Array
return colorsBase[colorIndex];
}
/**
* Returns the first grapheme from a word, uppercased.
*
* @param {string} word - The string to get grapheme from.
* @returns {string}
*/
function getFirstGraphemeUpper(word) {
if (!word?.length) {
return '';
}
return splitter.splitGraphemes(word)[0].toUpperCase();
}
/**
* Generates initials for a simple string.
*
@@ -49,12 +68,17 @@ export function getAvatarColor(initials: ?string, customAvatarBackgrounds: Array
export function getInitials(s: ?string) {
// We don't want to use the domain part of an email address, if it is one
const initialsBasis = _.split(s, '@')[0];
const words = _.words(initialsBasis);
let initials = '';
const [ firstWord, secondWord ] = initialsBasis.split(wordSplitRegex);
for (const w of words) {
(initials.length < 2) && (initials += String.fromCodePoint(w.codePointAt(0)).toUpperCase());
}
return initials;
return getFirstGraphemeUpper(firstWord) + getFirstGraphemeUpper(secondWord);
}
/**
* Checks if the passed URL is pointing to the gravatar service.
*
* @param {string} url - The URL.
* @returns {void}
*/
export function isGravatarURL(url: string = '') {
return url.startsWith(GRAVATAR_BASE_URL);
}

View File

@@ -1,4 +1,5 @@
// @flow
export * from './components';
export * from './constants';
export * from './functions';

View File

@@ -23,8 +23,7 @@ class ColorSchemeRegistry {
_styleTemplates = new Map();
/**
* Clears the already scheme-ified style definitions. This is useful when
* the {@code SET_COLOR_SCHEME} action is dispatched (again).
* Clears the already scheme-ified style definitions.
*
* @returns {void}
*/
@@ -150,7 +149,7 @@ class ColorSchemeRegistry {
stateful: Object | Function,
componentName: string,
colorDefinition: string): string {
const colorScheme = toState(stateful)['features/base/color-scheme'];
const colorScheme = toState(stateful)['features/base/color-scheme'] || {};
return {
...defaultScheme._defaultTheme,

View File

@@ -1,11 +0,0 @@
// @flow
/**
* Redux action to signal a color scheme change in the app/sdk.
*
* {
* type: SET_COLOR_SCHEME
* colorScheme: Object
* }
*/
export const SET_COLOR_SCHEME = 'SET_COLOR_SCHEME';

View File

@@ -1,19 +0,0 @@
// @flow
import { SET_COLOR_SCHEME } from './actionTypes';
/**
* Dispatches a Redux action to set the color scheme of the app/sdk.
*
* @param {Object} colorScheme - The color scheme to set.
* @returns {{
* type: SET_COLOR_SCHEME,
* colorScheme: Object
* }}
*/
export function setColorScheme(colorScheme: Object): Object {
return {
type: SET_COLOR_SCHEME,
colorScheme
};
}

View File

@@ -43,9 +43,6 @@ export default {
'LargeVideo': {
background: '#040404'
},
'LoadConfigOverlay': {
background: 'rgb(249, 249, 249)'
},
'Thumbnail': {
activeParticipantHighlight: 'rgb(81, 214, 170)',
activeParticipantTint: 'rgba(49, 183, 106, 0.3)',

View File

@@ -1,6 +1,4 @@
// @flow
export * from './actions';
export * from './actionTypes';
export * from './functions';
export { default as ColorSchemeRegistry } from './ColorSchemeRegistry';

View File

@@ -1,20 +0,0 @@
// @flow
import { MiddlewareRegistry } from '../redux';
import ColorSchemeRegistry from './ColorSchemeRegistry';
import { SET_COLOR_SCHEME } from './actionTypes';
/**
* The middleware of the feature {@code base/color-scheme}.
*
* @returns {Function}
*/
MiddlewareRegistry.register((/* store */) => next => action => {
switch (action.type) {
case SET_COLOR_SCHEME:
return ColorSchemeRegistry.clear();
}
return next(action);
});

View File

@@ -1,21 +0,0 @@
// @flow
import _ from 'lodash';
import { ReducerRegistry } from '../redux';
import { SET_COLOR_SCHEME } from './actionTypes';
/**
* The reducer of the feature {@code base/color-scheme}.
*
* @returns {Function}
*/
ReducerRegistry.register('features/base/color-scheme', (state = {}, action) => {
switch (action.type) {
case SET_COLOR_SCHEME:
return _.cloneDeep(action.colorScheme) || state;
}
return state;
});

View File

@@ -172,6 +172,17 @@ export const SEND_TONES = 'SEND_TONES';
*/
export const SET_FOLLOW_ME = 'SET_FOLLOW_ME';
/**
* The type of (redux) action which updates the current known status of the
* Mute Reactions Sound feature.
*
* {
* type: SET_START_REACTIONS_MUTED,
* enabled: boolean
* }
*/
export const SET_START_REACTIONS_MUTED = 'SET_START_REACTIONS_MUTED';
/**
* The type of (redux) action which sets the password to join or lock a specific
* {@code JitsiConference}.

View File

@@ -10,7 +10,13 @@ import { endpointMessageReceived } from '../../subtitles';
import { getReplaceParticipant } from '../config/functions';
import { JITSI_CONNECTION_CONFERENCE_KEY } from '../connection';
import { JitsiConferenceEvents } from '../lib-jitsi-meet';
import { MEDIA_TYPE, setAudioMuted, setVideoMuted } from '../media';
import {
MEDIA_TYPE,
setAudioMuted,
setAudioUnmutePermissions,
setVideoMuted,
setVideoUnmutePermissions
} from '../media';
import {
dominantSpeakerChanged,
getNormalizedDisplayName,
@@ -21,7 +27,13 @@ import {
participantRoleChanged,
participantUpdated
} from '../participants';
import { getLocalTracks, replaceLocalTrack, trackAdded, trackRemoved } from '../tracks';
import {
destroyLocalTracks,
getLocalTracks,
replaceLocalTrack,
trackAdded,
trackRemoved
} from '../tracks';
import { getBackendSafeRoomName } from '../util';
import {
@@ -45,7 +57,8 @@ import {
SET_PASSWORD_FAILED,
SET_ROOM,
SET_PENDING_SUBJECT_CHANGE,
SET_START_MUTED_POLICY
SET_START_MUTED_POLICY,
SET_START_REACTIONS_MUTED
} from './actionTypes';
import {
AVATAR_URL_COMMAND,
@@ -146,6 +159,17 @@ function _addConferenceListeners(conference, dispatch, state) {
}
});
conference.on(
JitsiConferenceEvents.AUDIO_UNMUTE_PERMISSIONS_CHANGED,
disableAudioMuteChange => {
dispatch(setAudioUnmutePermissions(disableAudioMuteChange));
});
conference.on(
JitsiConferenceEvents.VIDEO_UNMUTE_PERMISSIONS_CHANGED,
disableVideoMuteChange => {
dispatch(setVideoUnmutePermissions(disableVideoMuteChange));
});
// Dispatches into features/base/tracks follow:
conference.on(
@@ -163,6 +187,8 @@ function _addConferenceListeners(conference, dispatch, state) {
}
});
conference.on(JitsiConferenceEvents.TRACK_UNMUTE_REJECTED, track => dispatch(destroyLocalTracks(track)));
// Dispatches into features/base/participants follow:
conference.on(
JitsiConferenceEvents.DISPLAY_NAME_CHANGED,
@@ -483,7 +509,7 @@ export function checkIfCanJoin() {
const { authRequired, password }
= getState()['features/base/conference'];
const replaceParticipant = getReplaceParticipant(APP.store.getState());
const replaceParticipant = getReplaceParticipant(getState());
authRequired && dispatch(_conferenceWillJoin(authRequired));
authRequired && authRequired.join(password, replaceParticipant);
@@ -640,6 +666,22 @@ export function setFollowMe(enabled: boolean) {
};
}
/**
* Enables or disables the Mute reaction sounds feature.
*
* @param {boolean} muted - Whether or not reaction sounds should be muted for all participants.
* @returns {{
* type: SET_START_REACTIONS_MUTED,
* muted: boolean
* }}
*/
export function setStartReactionsMuted(muted: boolean) {
return {
type: SET_START_REACTIONS_MUTED,
muted
};
}
/**
* Sets the password to join or lock a specific JitsiConference.
*

View File

@@ -6,7 +6,7 @@
export const AVATAR_URL_COMMAND = 'avatar-url';
/**
* The command type for updating a participant's e-mail address.
* The command type for updating a participant's email address.
*
* @type {string}
*/
@@ -27,3 +27,7 @@ export const EMAIL_COMMAND = 'email';
* from the outside is not cool but it should suffice for now.
*/
export const JITSI_CONFERENCE_URL_KEY = Symbol('url');
export const TRIGGER_READY_TO_CLOSE_REASONS = [
'The meeting has been terminated'
];

View File

@@ -386,7 +386,7 @@ function _reportError(msg, err) {
/**
* Sends a representation of the local participant such as her avatar (URL),
* e-mail address, and display name to (the remote participants of) a specific
* email address, and display name to (the remote participants of) a specific
* conference.
*
* @param {Function|Object} stateful - The redux store, state, or

View File

@@ -1,5 +1,6 @@
// @flow
import { readyToClose } from '../../../features/mobile/external-api/actions';
import {
ACTION_PINNED,
ACTION_UNPINNED,
@@ -9,7 +10,7 @@ import {
} from '../../analytics';
import { reloadNow } from '../../app/actions';
import { openDisplayNamePrompt } from '../../display-name';
import { showErrorNotification } from '../../notifications';
import { NOTIFICATION_TIMEOUT_TYPE, showErrorNotification } from '../../notifications';
import { CONNECTION_ESTABLISHED, CONNECTION_FAILED, connectionDisconnected } from '../connection';
import { validateJwt } from '../jwt';
import { JitsiConferenceErrors } from '../lib-jitsi-meet';
@@ -40,6 +41,7 @@ import {
createConference,
setSubject
} from './actions';
import { TRIGGER_READY_TO_CLOSE_REASONS } from './constants';
import {
_addLocalTracksToConference,
_removeLocalTracksFromConference,
@@ -79,7 +81,7 @@ MiddlewareRegistry.register(store => next => action => {
return _conferenceSubjectChanged(store, next, action);
case CONFERENCE_WILL_LEAVE:
_conferenceWillLeave();
_conferenceWillLeave(store);
break;
case PARTICIPANT_UPDATED:
@@ -102,7 +104,6 @@ MiddlewareRegistry.register(store => next => action => {
return next(action);
});
/**
* Makes sure to leave a failed conference in order to release any allocated
* resources like peer connections, emit participant left events, etc.
@@ -129,7 +130,15 @@ function _conferenceFailed({ dispatch, getState }, next, action) {
dispatch(showErrorNotification({
description: reason,
titleKey: 'dialog.sessTerminated'
}));
}, NOTIFICATION_TIMEOUT_TYPE.LONG));
if (TRIGGER_READY_TO_CLOSE_REASONS.includes(reason)) {
if (typeof APP === undefined) {
dispatch(readyToClose());
} else {
APP.API.notifyReadyToClose();
}
}
break;
}
@@ -138,7 +147,7 @@ function _conferenceFailed({ dispatch, getState }, next, action) {
dispatch(showErrorNotification({
description: 'Restart initiated because of a bridge failure',
titleKey: 'dialog.sessionRestarted'
}));
}, NOTIFICATION_TIMEOUT_TYPE.LONG));
}
break;
@@ -151,7 +160,7 @@ function _conferenceFailed({ dispatch, getState }, next, action) {
descriptionArguments: { msg },
descriptionKey: msg ? 'dialog.connectErrorWithMsg' : 'dialog.connectError',
titleKey: 'connection.CONNFAIL'
}));
}, NOTIFICATION_TIMEOUT_TYPE.LONG));
break;
}
@@ -168,12 +177,11 @@ function _conferenceFailed({ dispatch, getState }, next, action) {
// good to know that it happen, so log it (on the info level).
logger.info('JitsiConference.leave() rejected with:', reason);
});
} else if (typeof beforeUnloadHandler !== 'undefined') {
} else {
// FIXME: Workaround for the web version. Currently, the creation of the
// conference is handled by /conference.js and appropriate failure handlers
// are set there.
window.removeEventListener('beforeunload', beforeUnloadHandler);
beforeUnloadHandler = undefined;
_removeUnloadHandler(getState);
}
if (enableForcedReload && error?.name === JitsiConferenceErrors.CONFERENCE_RESTARTED) {
@@ -201,7 +209,7 @@ function _conferenceJoined({ dispatch, getState }, next, action) {
const result = next(action);
const { conference } = action;
const { pendingSubjectChange } = getState()['features/base/conference'];
const { requireDisplayName } = getState()['features/base/config'];
const { requireDisplayName, disableBeforeUnloadHandlers = false } = getState()['features/base/config'];
pendingSubjectChange && dispatch(setSubject(pendingSubjectChange));
@@ -213,7 +221,7 @@ function _conferenceJoined({ dispatch, getState }, next, action) {
beforeUnloadHandler = () => {
dispatch(conferenceWillLeave(conference));
};
window.addEventListener('beforeunload', beforeUnloadHandler);
window.addEventListener(disableBeforeUnloadHandlers ? 'unload' : 'beforeunload', beforeUnloadHandler);
if (requireDisplayName
&& !getLocalParticipant(getState)?.name
@@ -287,10 +295,7 @@ function _connectionFailed({ dispatch, getState }, next, action) {
const result = next(action);
if (typeof beforeUnloadHandler !== 'undefined') {
window.removeEventListener('beforeunload', beforeUnloadHandler);
beforeUnloadHandler = undefined;
}
_removeUnloadHandler(getState);
// FIXME: Workaround for the web version. Currently, the creation of the
// conference is handled by /conference.js and appropriate failure handlers
@@ -367,13 +372,11 @@ function _conferenceSubjectChanged({ dispatch, getState }, next, action) {
* store.
*
* @private
* @param {Object} store - The redux store.
* @returns {void}
*/
function _conferenceWillLeave() {
if (typeof beforeUnloadHandler !== 'undefined') {
window.removeEventListener('beforeunload', beforeUnloadHandler);
beforeUnloadHandler = undefined;
}
function _conferenceWillLeave({ getState }: { getState: Function }) {
_removeUnloadHandler(getState);
}
/**
@@ -425,6 +428,21 @@ function _pinParticipant({ getState }, next, action) {
return next(action);
}
/**
* Removes the unload handler.
*
* @param {Function} getState - The redux getState function.
* @returns {void}
*/
function _removeUnloadHandler(getState) {
if (typeof beforeUnloadHandler !== 'undefined') {
const { disableBeforeUnloadHandlers = false } = getState()['features/base/config'];
window.removeEventListener(disableBeforeUnloadHandlers ? 'unload' : 'beforeunload', beforeUnloadHandler);
beforeUnloadHandler = undefined;
}
}
/**
* Requests the specified tones to be played.
*

View File

@@ -41,6 +41,7 @@ function _toggleScreenSharing(enabled, store) {
}
} else {
dispatch(destroyLocalDesktopTrackIfExists());
setPictureInPictureDisabled(false);
}
}

View File

@@ -20,7 +20,8 @@ import {
SET_PASSWORD,
SET_PENDING_SUBJECT_CHANGE,
SET_ROOM,
SET_START_MUTED_POLICY
SET_START_MUTED_POLICY,
SET_START_REACTIONS_MUTED
} from './actionTypes';
import { isRoomValid } from './functions';
@@ -77,6 +78,9 @@ ReducerRegistry.register(
case SET_FOLLOW_ME:
return set(state, 'followMeEnabled', action.enabled);
case SET_START_REACTIONS_MUTED:
return set(state, 'startReactionsMuted', action.muted);
case SET_LOCATION_URL:
return set(state, 'room', undefined);

View File

@@ -81,6 +81,8 @@ export default [
'debug',
'debugAudioLevels',
'defaultLanguage',
'defaultLocalDisplayName',
'defaultRemoteDisplayName',
'desktopSharingFrameRate',
'desktopSharingSources',
'disable1On1Mode',
@@ -89,6 +91,7 @@ export default [
'disableAP',
'disableAddingBackgroundImages',
'disableAudioLevels',
'disableBeforeUnloadHandlers',
'disableChatSmileys',
'disableDeepLinking',
'disabledSounds',
@@ -110,6 +113,7 @@ export default [
'disableRemoteMute',
'disableResponsiveTiles',
'disableRtx',
'disableSelfView',
'disableScreensharingVirtualBackground',
'disableShortcuts',
'disableShowMoreStats',
@@ -119,6 +123,7 @@ export default [
'disableSimulcast',
'disableThirdPartyRequests',
'disableTileView',
'disableTileEnlargement',
'displayJids',
'doNotStoreRoom',
'doNotFlipLocalVideo',
@@ -172,12 +177,14 @@ export default [
'maxFullResolutionParticipants',
'mouseMoveCallbackInterval',
'notifications',
'notificationTimeouts',
'openSharedDocumentOnJoin',
'opusMaxAverageBitrate',
'p2p',
'pcStatsInterval',
'preferH264',
'preferredCodec',
'prejoinConfig',
'prejoinPageEnabled',
'requireDisplayName',
'remoteVideoMenu',
@@ -198,6 +205,7 @@ export default [
'testing',
'toolbarButtons',
'toolbarConfig',
'transcribingEnabled',
'useHostPageLocalStorage',
'useTurnUdp',
'videoQuality',

View File

@@ -26,7 +26,6 @@ export default [
'DISPLAY_WELCOME_PAGE_CONTENT',
'ENABLE_DIAL_OUT',
'ENABLE_FEEDBACK_ANIMATION',
'ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT',
'FILM_STRIP_MAX_HEIGHT',
'GENERATE_ROOMNAMES_ON_WELCOME_PAGE',
'HIDE_INVITE_MORE_HEADER',

View File

@@ -125,6 +125,12 @@ function _setConfig({ dispatch, getState }, next, action) {
}));
}
if (action.config.disableSelfView) {
dispatch(updateSettings({
disableSelfView: true
}));
}
dispatch(updateConfig(config));
// FIXME On Web we rely on the global 'config' variable which gets altered

View File

@@ -282,6 +282,13 @@ function _translateLegacyConfig(oldValue: Object) {
};
}
newValue.prejoinConfig = oldValue.prejoinConfig || {};
if (oldValue.hasOwnProperty('prejoinPageEnabled')
&& !newValue.prejoinConfig.hasOwnProperty('enabled')
) {
newValue.prejoinConfig.enabled = oldValue.prejoinPageEnabled;
}
newValue.disabledSounds = newValue.disabledSounds || [];
if (oldValue.disableJoinLeaveSounds) {
@@ -320,6 +327,24 @@ function _translateLegacyConfig(oldValue: Object) {
newValue.e2ee.e2eeLabels = oldValue.e2eeLabels;
}
if (oldValue.defaultLocalDisplayName === undefined
&& typeof interfaceConfig === 'object'
&& interfaceConfig.hasOwnProperty('DEFAULT_LOCAL_DISPLAY_NAME')) {
newValue.defaultLocalDisplayName = interfaceConfig.DEFAULT_LOCAL_DISPLAY_NAME;
}
newValue.defaultLocalDisplayName
= newValue.defaultLocalDisplayName || 'me';
if (oldValue.defaultRemoteDisplayName === undefined
&& typeof interfaceConfig === 'object'
&& interfaceConfig.hasOwnProperty('DEFAULT_REMOTE_DISPLAY_NAME')) {
newValue.defaultRemoteDisplayName = interfaceConfig.DEFAULT_REMOTE_DISPLAY_NAME;
}
newValue.defaultRemoteDisplayName
= newValue.defaultRemoteDisplayName || 'Fellow Jitster';
return newValue;
}

View File

@@ -2,7 +2,11 @@
import UIEvents from '../../../../service/UI/UIEvents';
import { processExternalDeviceRequest } from '../../device-selection';
import { showNotification, showWarningNotification } from '../../notifications';
import {
NOTIFICATION_TIMEOUT_TYPE,
showNotification,
showWarningNotification
} from '../../notifications';
import { replaceAudioTrackById, replaceVideoTrackById, setDeviceStatusWarning } from '../../prejoin/actions';
import { isPrejoinPageVisible } from '../../prejoin/functions';
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../app';
@@ -50,8 +54,6 @@ const JITSI_TRACK_ERROR_TO_MESSAGE_KEY_MAP = {
}
};
const WARNING_DISPLAY_TIMER = 4000;
/**
* A listener for device permissions changed reported from lib-jitsi-meet.
*/
@@ -134,7 +136,7 @@ MiddlewareRegistry.register(store => next => action => {
description: additionalCameraErrorMsg,
descriptionKey: cameraErrorMsg,
titleKey
}, WARNING_DISPLAY_TIMER));
}, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));
if (isPrejoinPageVisible(store.getState())) {
store.dispatch(setDeviceStatusWarning(titleKey));
@@ -163,7 +165,7 @@ MiddlewareRegistry.register(store => next => action => {
description: additionalMicErrorMsg,
descriptionKey: micErrorMsg,
titleKey
}, WARNING_DISPLAY_TIMER));
}, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));
if (isPrejoinPageVisible(store.getState())) {
store.dispatch(setDeviceStatusWarning(titleKey));
@@ -296,9 +298,9 @@ function _checkAndNotifyForNewDevice(store, newDevices, oldDevices) {
dispatch(showNotification({
description,
titleKey,
customActionNameKey: 'notify.newDeviceAction',
customActionHandler: _useDevice.bind(undefined, store, devicesArray)
}));
customActionNameKey: [ 'notify.newDeviceAction' ],
customActionHandler: [ _useDevice.bind(undefined, store, devicesArray) ]
}, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));
}
});
}

View File

@@ -94,11 +94,7 @@ export function isSupportedBrowser() {
return false;
}
// We are intentionally allow mobile browsers because:
// - the WelcomePage is mobile ready;
// - if the URL points to a conference then deep-linking will take
// care of it.
return isMobileBrowser() || JitsiMeetJS.isWebRtcSupported();
return isMobileBrowser() ? isSupportedMobileBrowser() : JitsiMeetJS.isWebRtcSupported();
}
/**
@@ -108,9 +104,8 @@ export function isSupportedBrowser() {
* @returns {boolean}
*/
export function isSupportedMobileBrowser() {
return (Platform.OS === 'android' && browser.isChromiumBased())
|| (Platform.OS === 'android' && browser.isFirefox())
|| (Platform.OS === 'ios' && browser.isWebKitBased());
return (Platform.OS === 'android' && browser.isSupportedAndroidBrowser())
|| (Platform.OS === 'ios' && browser.isSupportedIOSBrowser());
}
/**

View File

@@ -98,6 +98,12 @@ export const IOS_SCREENSHARING_ENABLED = 'ios.screensharing.enabled';
*/
export const ANDROID_SCREENSHARING_ENABLED = 'android.screensharing.enabled';
/**
* Flag indicating if speaker statistics should be enabled.
* Default: enabled (true).
*/
export const SPEAKERSTATS_ENABLED = 'speakerstats.enabled';
/**
* Flag indicating if kickout is enabled.
* Default: enabled (true).

View File

@@ -1,3 +1,14 @@
/**
* The type of (redux) action to adjust the availability of the local audio.
*
* {
* type: SET_AUDIO_AVAILABLE,
* muted: boolean
* }
*/
export const SET_AUDIO_AVAILABLE = 'SET_AUDIO_AVAILABLE';
/**
* The type of (redux) action to set the muted state of the local audio.
*
@@ -9,14 +20,14 @@
export const SET_AUDIO_MUTED = 'SET_AUDIO_MUTED';
/**
* The type of (redux) action to adjust the availability of the local audio.
* The type of (redux) action to enable/disable the audio mute icon.
*
* {
* type: SET_AUDIO_AVAILABLE,
* muted: boolean
* type: SET_AUDIO_UNMUTE_PERMISSIONS,
* blocked: boolean
* }
*/
export const SET_AUDIO_AVAILABLE = 'SET_AUDIO_AVAILABLE';
export const SET_AUDIO_UNMUTE_PERMISSIONS = 'SET_AUDIO_UNMUTE_PERMISSIONS';
/**
* The type of (redux) action to set the facing mode of the local video camera
@@ -61,6 +72,16 @@ export const SET_VIDEO_MUTED = 'SET_VIDEO_MUTED';
*/
export const STORE_VIDEO_TRANSFORM = 'STORE_VIDEO_TRANSFORM';
/**
* The type of (redux) action to enable/disable the video mute icon.
*
* {
* type: SET_VIDEO_UNMUTE_PERMISSIONS,
* blocked: boolean
* }
*/
export const SET_VIDEO_UNMUTE_PERMISSIONS = 'SET_VIDEO_UNMUTE_PERMISSIONS';
/**
* The type of (redux) action to toggle the local video camera facing mode. In
* contrast to SET_CAMERA_FACING_MODE, allows the toggling to be optimally

View File

@@ -9,9 +9,11 @@ import { isModerationNotificationDisplayed } from '../../notifications';
import {
SET_AUDIO_MUTED,
SET_AUDIO_AVAILABLE,
SET_AUDIO_UNMUTE_PERMISSIONS,
SET_CAMERA_FACING_MODE,
SET_VIDEO_AVAILABLE,
SET_VIDEO_MUTED,
SET_VIDEO_UNMUTE_PERMISSIONS,
STORE_VIDEO_TRANSFORM,
TOGGLE_CAMERA_FACING_MODE
} from './actionTypes';
@@ -59,6 +61,19 @@ export function setAudioMuted(muted: boolean, ensureTrack: boolean = false) {
};
}
/**
* Action to disable/enable the audio mute icon.
*
* @param {boolean} blocked - True if the audio mute icon needs to be disabled.
* @returns {Function}
*/
export function setAudioUnmutePermissions(blocked: boolean) {
return {
type: SET_AUDIO_UNMUTE_PERMISSIONS,
blocked
};
}
/**
* Action to set the facing mode of the local camera.
*
@@ -136,6 +151,19 @@ export function setVideoMuted(
};
}
/**
* Action to disable/enable the video mute icon.
*
* @param {boolean} blocked - True if the video mute icon needs to be disabled.
* @returns {Function}
*/
export function setVideoUnmutePermissions(blocked: boolean) {
return {
type: SET_VIDEO_UNMUTE_PERMISSIONS,
blocked
};
}
/**
* Creates an action to store the last video {@link Transform} applied to a
* stream.

View File

@@ -88,6 +88,16 @@ export function getStartWithVideoMuted(stateful: Object | Function) {
return Boolean(getPropertyValue(stateful, 'startWithVideoMuted', START_WITH_AUDIO_VIDEO_MUTED_SOURCES));
}
/**
* Determines whether video is currently muted.
*
* @param {Function|Object} stateful - The redux store, state, or {@code getState} function.
* @returns {boolean}
*/
export function isVideoMuted(stateful: Function | Object) {
return Boolean(toState(stateful)['features/base/media'].video.muted);
}
/**
* Determines whether video is currently muted by the user authority.
*

View File

@@ -8,15 +8,31 @@ import {
sendAnalytics
} from '../../analytics';
import { APP_STATE_CHANGED } from '../../mobile/background';
import {
NOTIFICATION_TIMEOUT_TYPE,
showWarningNotification
} from '../../notifications';
import { isForceMuted } from '../../participants-pane/functions';
import { isScreenMediaShared } from '../../screen-share/functions';
import { SET_AUDIO_ONLY, setAudioOnly } from '../audio-only';
import { isRoomValid, SET_ROOM } from '../conference';
import { getLocalParticipant } from '../participants';
import { MiddlewareRegistry } from '../redux';
import { getPropertyValue } from '../settings';
import { isLocalVideoTrackDesktop, setTrackMuted, TRACK_ADDED } from '../tracks';
import {
destroyLocalTracks,
isLocalTrackMuted,
isLocalVideoTrackDesktop,
setTrackMuted,
TRACK_ADDED
} from '../tracks';
import { SET_AUDIO_MUTED, SET_VIDEO_MUTED } from './actionTypes';
import {
SET_AUDIO_MUTED,
SET_AUDIO_UNMUTE_PERMISSIONS,
SET_VIDEO_MUTED,
SET_VIDEO_UNMUTE_PERMISSIONS
} from './actionTypes';
import { setAudioMuted, setCameraFacingMode, setVideoMuted } from './actions';
import {
CAMERA_FACING_MODE,
@@ -69,6 +85,21 @@ MiddlewareRegistry.register(store => next => action => {
break;
}
case SET_AUDIO_UNMUTE_PERMISSIONS: {
const { blocked } = action;
const state = store.getState();
const tracks = state['features/base/tracks'];
const isAudioMuted = isLocalTrackMuted(tracks, MEDIA_TYPE.AUDIO);
if (blocked && isAudioMuted) {
store.dispatch(showWarningNotification({
descriptionKey: 'notify.audioUnmuteBlockedDescription',
titleKey: 'notify.audioUnmuteBlockedTitle'
}, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));
}
break;
}
case SET_VIDEO_MUTED: {
const state = store.getState();
const participant = getLocalParticipant(state);
@@ -78,6 +109,22 @@ MiddlewareRegistry.register(store => next => action => {
}
break;
}
case SET_VIDEO_UNMUTE_PERMISSIONS: {
const { blocked } = action;
const state = store.getState();
const tracks = state['features/base/tracks'];
const isVideoMuted = isLocalTrackMuted(tracks, MEDIA_TYPE.VIDEO);
const isMediaShared = isScreenMediaShared(state);
if (blocked && isVideoMuted && !isMediaShared) {
store.dispatch(showWarningNotification({
descriptionKey: 'notify.videoUnmuteBlockedDescription',
titleKey: 'notify.videoUnmuteBlockedTitle'
}, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));
}
break;
}
}
return next(action);
@@ -217,6 +264,10 @@ function _setRoom({ dispatch, getState }, next, action) {
dispatch(setAudioOnly(audioOnly, false));
if (!roomIsValid) {
dispatch(destroyLocalTracks());
}
return next(action);
}

View File

@@ -7,9 +7,11 @@ import { TRACK_REMOVED } from '../tracks/actionTypes';
import {
SET_AUDIO_AVAILABLE,
SET_AUDIO_MUTED,
SET_AUDIO_UNMUTE_PERMISSIONS,
SET_CAMERA_FACING_MODE,
SET_VIDEO_AVAILABLE,
SET_VIDEO_MUTED,
SET_VIDEO_UNMUTE_PERMISSIONS,
STORE_VIDEO_TRANSFORM,
TOGGLE_CAMERA_FACING_MODE
} from './actionTypes';
@@ -33,6 +35,7 @@ import { CAMERA_FACING_MODE } from './constants';
*/
export const _AUDIO_INITIAL_MEDIA_STATE = {
available: true,
unmuteBlocked: false,
muted: false
};
@@ -59,6 +62,12 @@ function _audio(state = _AUDIO_INITIAL_MEDIA_STATE, action) {
muted: action.muted
};
case SET_AUDIO_UNMUTE_PERMISSIONS:
return {
...state,
unmuteBlocked: action.blocked
};
default:
return state;
}
@@ -83,6 +92,7 @@ function _audio(state = _AUDIO_INITIAL_MEDIA_STATE, action) {
*/
export const _VIDEO_INITIAL_MEDIA_STATE = {
available: true,
unmuteBlocked: false,
facingMode: CAMERA_FACING_MODE.USER,
muted: 0,
@@ -126,6 +136,12 @@ function _video(state = _VIDEO_INITIAL_MEDIA_STATE, action) {
muted: action.muted
};
case SET_VIDEO_UNMUTE_PERMISSIONS:
return {
...state,
unmuteBlocked: action.blocked
};
case STORE_VIDEO_TRANSFORM:
return _storeVideoTransform(state, action);

View File

@@ -1,6 +0,0 @@
// @flow
/**
* Action type to set the ID of the active modal (or undefined if needs to be hidden).
*/
export const SET_ACTIVE_MODAL_ID = 'SET_ACTIVE_MODAL_ID';

View File

@@ -1,21 +0,0 @@
// @flow
import { SET_ACTIVE_MODAL_ID } from './actionTypes';
/**
* Action to set the ID of the active modal (or undefined if needs to be hidden).
*
* @param {string} activeModalId - The new modal ID or undefined.
* @param {Object} modalProps - The props to pass to the modal.
* @returns {{
* activeModalId: string,
* type: SET_ACTIVE_MODAL_ID
* }}
*/
export function setActiveModalId(activeModalId: ?string, modalProps: Object = {}) {
return {
activeModalId,
modalProps,
type: SET_ACTIVE_MODAL_ID
};
}

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