Compare commits

..

354 Commits

Author SHA1 Message Date
titus.moldovan
d5916cdb3a e2ee stuff 2022-06-23 15:18:13 +03:00
tmoldovan8x8
9a99c517ab fix(rn, pip) enables PiP on conference mounted 2022-06-23 14:42:41 +03:00
Robert Pintilii
40a6240444 feat(local-recording) Update config (#11731)
Enable feature by default
2022-06-23 14:03:21 +03:00
tmoldovan8x8
4d6ca4383f fix(android) calls startForeground in onCreate
Call startForeground in onCreate to avoid android.app.RemoteServiceException thrown by the system.
2022-06-23 09:41:32 +02:00
Robert Pintilii
ddce2e6bec feat(breakout-rooms) add context menu to participants in other rooms 2022-06-23 09:40:11 +02:00
Robert Pintilii
7dca91a50a fix(local-recording) Add notification config and style fixes (#11728)
Add analytics
2022-06-22 12:52:22 +03:00
Saúl Ibarra Corretgé
31348179d4 fix(auth) simplify auth-and-upgrade procedure
It's not necessary to perform a full join, sending a conference IQ is
enough.
2022-06-21 19:20:09 +02:00
Calinteodor
e77679d025 feat(dynamic-branding): SVG branding image needs to cover the entire screen (#11724)
* feat(dynamic-branding) scale SVG branding image to cover entire screen
2022-06-21 17:51:25 +03:00
Titus Moldovan
44a9363f5b feat(mobile, external_api) exposes setClosedCaptionsEnabled 2022-06-21 16:18:31 +02:00
Calinteodor
bb76090bce feat(lobby/prejoin): updates
* feat(base/modal) added keyboard dismiss functionality

* feat(lobby) updated ui and start knocking if name is set

* feat(prejoin) updated ui and hide input if name is not required

* feat(prejoin) updated join button styles

* feat(prejoin) removed extra empty space

* feat(prejoin) updated disable join condition

* feat(base/modal) moved keaboard dismiss functionality

* feat(conference) updated auto knock condition

* feat(prejoin) updated button styles and disabling condition

* feat(lobby) updated styles

* feat(lobby/prejoin) updated styles for buttons and inputs

* feat(lobby/prejoin) updated contentContainer styles

* feat(lobby/prejoin) created shouldEnableAutoKnock helper
2022-06-21 16:16:38 +02:00
Robert Pintilii
d0790736db feat(external-api) Add participants pane toggled event (#11718) 2022-06-21 16:23:33 +03:00
Jaya Allamsetty
0308ba71b1 fix(audio-only) Do not unmute camera when SS is in progress.
If the audio-only mode is automatically disabled when user starts a screenshare while in audio-only mode, do not unmute the camera track.
2022-06-21 07:48:02 -04:00
Jaya Allamsetty
f7d1a5ec80 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1455.0.0+f3a2f61e...v1457.0.0+ad75454f
2022-06-21 07:24:38 -04:00
Saúl Ibarra Corretgé
d61fe58fcf fix(rn,styles) cleanup unused styles 2022-06-21 11:48:07 +02:00
Titus Moldovan
b428ce2dcd fix(pip) make PiP disabled by default
This reverts commit c84c3c61e2c24014b43023316627f7747bbca7a6.
2022-06-21 10:36:21 +03:00
Titus Moldovan
d1c9720033 fix(rn) add backhandler on Prejoin screen 2022-06-21 10:36:21 +03:00
Andrei Gavrilescu
c29e8bbdd1 feat(analytics): obfuscate room name (#11587)
* obfuscate room name

* fixed js-sha version

* add comma

* check for room change
2022-06-21 09:53:07 +03:00
Horatiu Muresan
3fb3be9727 feat(invite) Consider SHARING_FEATURES on the email invites (#11711) 2022-06-20 23:18:06 +03:00
Saúl Ibarra Corretgé
517ec29d85 fix(rn,dialogs) fix displaying dialogs on top of modal screens
Render them together with bottom sheets in a FullWindowOverlay.
2022-06-20 18:37:28 +03:00
Saúl Ibarra Corretgé
6ad279f029 fix(rn, bottomsheet) fix not rendering above presentation sheets
Move all sheets to render in a new container which uses FullWindowOverlay, which allows rendering above presentation controllers on iOS.
2022-06-20 16:53:19 +02:00
José Luís Andrade
0e98f90205 fix(lang) update Portuguese translation 2022-06-18 23:26:06 +02:00
Saúl Ibarra Corretgé
2c5b132483 fix(util) fix parsing strings in parseURLParams
After https://github.com/jitsi/jitsi-meet/pull/11607 we might call it
with a string. Be nice and accept that in addition to URL objects.
2022-06-18 23:17:55 +02:00
Calinteodor
4d8f29d4fe feat(rn,dynamic-brandind) added background image url to prejoin and lobby 2022-06-18 21:59:10 +02:00
Ali Alhaidary
22be96d838 fix(lang) update Arabic translation 2022-06-18 20:54:51 +02:00
Дамян Минков
ccc1157df5 fix: Fixes navigating back to welcome page after clicking cancel on login window.
It was handling just conference_failed with password required, but not connection failed with password required.
2022-06-17 15:19:06 +03:00
Дамян Минков
f613126776 fix: Hides pre join screen in few login window cases.
In Firefox pre-join was grabbing the focus and yuo cannot type username and password after clicking I'm the host button.
2022-06-17 15:19:06 +03:00
Robert Pintilii
38b21e986d fix(pinning) Fix pinning (#11693)
Hide Pin to Stage button while screensharing
Fix pin indicator while screensharing
2022-06-17 15:15:14 +03:00
Horatiu Muresan
38abca8a65 fix(carmode) Force potrait mode, add connection indicator 2022-06-17 12:54:51 +02:00
Дамян Минков
f3c6b54ffa fix: When adding a room param to urls check for previous params. (#11607)
* fix: When adding a room param to urls check for previous params.

* squash: Uses URL object to modify the url.

* squash: Use common connection options from base/connection.

Normalizes bosh url and for web.

* squash: Adds release param to external api and handles it.

* feat: Adds release handling for mobile(links in welcome page).

* squash: Fixes comments.
2022-06-16 15:27:41 +03:00
Gabriel Borlea
7dd85bb6ad fix(face-landmarks): work only when one face is detected (#11661)
* fix(face-landmarks): work only when one face is detected

* fix: remove redundant check for detection

* fix(face-landmarks): re-center and stop when more faces detected

* fix: remove faceCount checking when sending message from worker

* fix: add again the faceCount

* fix: add comment

* code review
2022-06-16 14:50:31 +03:00
Gabriel Borlea
624f88e069 add(face-landmarks): flag for rtc stats (#11682)
* add(face-landmarks): flag for rtc stats

* fix: check is faceLandmarks is defined
2022-06-16 14:13:36 +03:00
Calinteodor
fbf693b2dc feat(mobile/navigation) updated screens that have footer
* feat(mobile/navigation) updated screens that have footer

* feat(chat/native) reverted style change

* feat(chat/native) reverted changes and added input vertical padding

* feat(base/modal) replaced headerHeight with top safe area inset

* feat(carmode/native) removed unused import and fixed linter

* feat(chat/polls/native) reverted style changes

* feat(base/modal) added isModalPresentation default prop

* feat(base/modal) made isModalPresentation optional

* feat(base/modal) headerHeight based on top notch devices

* feat(polls) updated styles

* feat(base/modal) updated comment
2022-06-16 11:49:53 +02:00
Calinteodor
dbf7bf4750 feat(prejoin) native prejoin screen and other navigation updates
* feat(prejoin) created native Prejoin screen

* feat(prejoin) fixed useState callback and updates warnings

* feat(prejoin) created styles file

* feat(prejoin) moved nav from middleware to appNavigate, created native DeviceStatus

* feat(prejoin) updated styles

* feat(prejoin) review remarks pt. 1

* feat(prejoin) removed unused styles

* feat(prejoin) review remarks pt. 2

* feat(prejoin) comment fix

* feat(prejoin) added header title

* feat(prejoin) review remarks

* feat(lobby) updated styles

* feat(prejoin) updated lobby screen header button functionality

* feat(prejoin) review remarks pt 3

* feat(welcome) removed VideoSwitch component

* feat(mobile/navigation) fixed linter

* feat(welcome) moved isWelcomePageEnabled to functions.ts

* feat(mobile/navigation) screen options and order updates

* feat(app) review remark

* feat(welcome) added translation for screen header title and fixed build

* feat(mobile/navigation) added screen title translation and created screen option

* feat(mobile/navigation) fixed screenOptions import

* feat(mobile/navigation) added DialInSummary title translation, fixed animation and close button

* feat(welcome) fixed build

* feat(welcome) removed extra check

* feat(prejoin) review remarks pt 4

* feat(prejoin) added Join in low bandwidth mode btn

* feat(welcome) changed welcome screen header title

* fixup lobby close
2022-06-16 11:49:07 +02:00
Titus Moldovan
d31eb3b248 fix(android) parse initial isAudioMuted when starting JitsiMeetOngoingConferenceService 2022-06-16 11:54:25 +03:00
Titus Moldovan
9b75fc98c1 feat(rn) send isAudioMuted on conferenceEvent 2022-06-16 11:54:25 +03:00
hmuresan
1ee9f6a7e5 feat(extension-banner) Show edge extension when edge browser detected 2022-06-16 11:43:03 +03:00
Robert Pintilii
06d0cbd418 fix(local-recording) Don't use setCaptureHandle when in iframe (#11687) 2022-06-16 10:43:58 +03:00
Nils Ohlmeier
066dd71afb feat(RTC): report conference start timestamp through rtcstats (#11646) 2022-06-15 15:22:15 -07:00
Hristo Terezov
d573bd41b4 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1454.0.0+fd668c9d...v1455.0.0+f3a2f61e
2022-06-15 16:25:02 -05:00
Robert Pintilii
d06d190229 fix(keyboard-shortcut) Fix error on number keypress (#11680)
Fix error when pressing a number bigger than the number of participants
Fix local recording issue
2022-06-15 14:04:06 +03:00
Shahab
d3b650c741 refactor(prejoin) use jss instead of sass in DialOutDialog (#11361)
* refactor(premeeting): use jss instead of sass in DialOutDialog

* refactor(prejoin): move remaining prejoin-dialog styles to commonStyless
2022-06-15 10:34:09 +03:00
Saúl Ibarra Corretgé
4a04b8b5ee fix(rn,dynamic-branding) filter out gradients 2022-06-14 15:39:14 +02:00
Saúl Ibarra Corretgé
6718ba7423 feat(rn,dynamic-branding) add support for didPageUrl and inviteDomain 2022-06-14 15:39:14 +02:00
robertpin
e662433c2a Add audio constraints 2022-06-14 15:11:00 +02:00
robertpin
08bb957672 fix(local-recording) Add framerate 2022-06-14 15:11:00 +02:00
Saúl Ibarra Corretgé
78d8176cc8 fix(rn,bottom-sheet) fix styling after refactor
I somehow missed all other usages of the ColorSchemeRegistry.
2022-06-14 13:38:45 +02:00
robertpin
59ee984e09 fix(tile-view, rn) Fix landscape mode tile view 2022-06-14 13:38:24 +02:00
Robert Pintilii
f6fab051ce chore(deps) lib-jitsi-meet@latest (#11671)
https://github.com/jitsi/lib-jitsi-meet/compare/v1450.0.0+462996fc...v1454.0.0+fd668c9d
2022-06-14 11:01:04 +03:00
Saúl Ibarra Corretgé
f0ff6a9f1c fix(video-layout) fix usage of disableTileView
The documented behavior is that it would disable auto-switching to it,
but users would still be available to toggle it.

This change restores that behavior. If the user has selected a layout
that will be preferred before cheching for this setting.

Ref: https://community.jitsi.org/t/how-to-disable-titleview/115093
2022-06-13 14:35:30 +02:00
Calin Chitu
dfa761b963 feat(mobile/navigation): added screen orientation based on Platform 2022-06-10 17:55:56 +02:00
Saúl Ibarra Corretgé
ad8cdcd81b fix(rn,bottom-sheet) fix scroll
In the past we used a PanResponder to detect user gestures in the sheet
to show a reduced version or a full-height version of it, and also to
close it.

There is an obvious conflic between the gestures and scrolling, which
didn't work all that great, but we could live with it.

After reactions were introduced we no longer rendered the 2 different
heights, so that functionaligy stopped being used but the PanResponder
still remained there.

This commit removes it completely and sets a max height of 75% on any
BottomSheet, so any tap outside will close it.
2022-06-10 17:54:58 +02:00
Calin Chitu
98ef0e74d6 feat(welcome/native): updated settings name placeholder example text 2022-06-10 17:59:50 +03:00
Saúl Ibarra Corretgé
746fde7c10 fix(local-recordings) fix for browsers not supporting MediaRecorder 2022-06-10 16:15:03 +02:00
Calin Chitu
bedddd4760 fix(lobby/native) removed nav button overwrite 2022-06-10 16:07:56 +03:00
Calin Chitu
7ea78e9845 fix(lobby/native) style updates and local video fix 2022-06-10 16:07:56 +03:00
Gabriel Borlea
9383942cb9 fix(face-landmarks): filter face detections based on detection score (#11658)
* fix(face-landmarks): filter face detections based on detection score

* fix: add blank line and semi column
2022-06-10 15:19:18 +03:00
Avram Tudor
2f1fe637ca fix(prejoin) fix avatar centering (#11655) 2022-06-10 09:16:23 +03:00
abora8x8
15d453de1d Fix: Speaker stats are not delivered for the breakout rooms (#11644)
* Send speaker stats for brk room

* Fix comments component loaded
2022-06-09 13:15:04 -05:00
Calin Chitu
a272995b8c feat(navigation) style updates 2022-06-09 17:54:49 +03:00
Jaya Allamsetty
10b800e57f chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1448.0.0+3df2abec...v1450.0.0+462996fc
2022-06-09 10:42:14 -04:00
chipechop
ca77563bf1 Update main-it.json
added car mode and polished many words
2022-06-09 09:22:44 -05:00
Calin Chitu
44ff1aac11 feat(mobile/navigation) - updated shared doc animation 2022-06-09 15:14:54 +02:00
Calin Chitu
79e648867d feat(mobile/navigation) - removed stack dependency and updated animation options 2022-06-09 15:14:54 +02:00
Calin Chitu
fc725c07e9 feat(mobile/navigation) - updated to native stack navigators 2022-06-09 15:14:54 +02:00
Horatiu Muresan
d49c86bd5f feat(deployment-urls): Whitelist deploymentUrls; remove JaaS restriction 2022-06-09 16:00:41 +03:00
Hristo Terezov
aee94ad6fb fix(presenter): Broken stop SS + presenter.
Fixes an issue - not able to stop the screen sharing in presenter
mode from the screen sharing button.
2022-06-08 12:28:57 -05:00
Gabriel Borlea
38011e537a add(face-landmarks): max faces detected config and default value (#11625)
* fix(face-landmarks): set max detected faces up to 4

* add(face-landmarks): config for max faces detected

* fix(config.js): default value for capture interval face-landmarks

* add missing coma
2022-06-08 12:28:41 -05:00
Werner Fleischer
13194ddfba fix(lang): logout question asks to stop the conference
A minor wording change to prevent confusion: On logout one is asked
whether to stop the conference but the conference is only left by the
participant.
2022-06-08 12:28:13 -05:00
Alex Bumbu
7895abb9ea fix(ios, pip) make initialPositionInSuperView property public 2022-06-08 13:38:20 +02:00
Avram Tudor
9060bebca9 fix(prejoin) fix styling of avatar (#11629) 2022-06-08 13:19:08 +03:00
Robert Pintilii
38724458e3 ref(reactions) Re-write using TypeScript (#11603) 2022-06-08 10:44:47 +03:00
Дамян Минков
1bce1524db feat: Fix display name in prejoin stealing focus.
When there is a password and lobby enabled, participants cannot enter password as the display name is stealing the focus.
When there is just password set the same field steals the focus from the password prompt.
2022-06-07 15:53:36 -05:00
Werner Fleischer
def3c76e10 fix(rn, chat): localize the chat button label 2022-06-07 17:14:22 +02:00
Ali Alhaidary
5be770cad1 fix(lang) update Arabic translation 2022-06-07 12:15:53 +02:00
Andrei Gavrilescu
dd867b2a92 bump rtcstats to 9.2.0 2022-06-07 12:15:19 +02:00
Jaya Allamsetty
958ffb3076 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1439.0.0+42f5b4bf...v1448.0.0+3df2abec
2022-06-06 12:38:47 -04:00
Дамян Минков
bab3c4abc4 feat: Fix luajwtjitsi deependencies.
As luajwtjitsi is in jitsi-meet-prosody move its dependencies.
2022-06-06 10:37:49 -05:00
Robert Pintilii
1f342b79a8 fix(local-recording) Fix native (#11622) 2022-06-06 15:25:36 +03:00
Saúl Ibarra Corretgé
3af782f894 chore(rn,versions) bump sdk and app versions 2022-06-03 14:04:06 +02:00
Robert Pintilii
e27069447b feat(local-video-recording) Allow users to record the meeting locally (#11338) 2022-06-03 14:45:27 +03:00
Saúl Ibarra Corretgé
7ac573d628 fix(android) fix incorrect colors on MIUI devices
They "force" a dark mode but we already have a dark palette, so avoid
the system overriding the base colors.

Fixes: https://github.com/jitsi/jitsi-meet/issues/9981
Fixes: https://github.com/jitsi/jitsi-meet/issues/8781
2022-06-03 13:03:53 +02:00
Saúl Ibarra Corretgé
b3db9ce6cf feat(build) make sure we error out if patch-package fails
Ref: https://github.com/jitsi/jitsi-meet/issues/11611
2022-06-03 10:48:21 +02:00
Jaya Allamsetty
1397b9ac80 fix(multi-stream) RN Add listeners for track streaming status updates on large-video.
* fix(multi-stream) RN Add listeners for track streaming status updates on large-video.
Fixes an issue where video on large-video is not being rendered when there is no filmstrip, i.e., there is only 1 remote participant in the call with source-name signaling enabled. Also do not show the screensharing indicator on the camera thumbnail when a virtual SS tile is created for the local screenshare.

* squash: add a comment
2022-06-01 16:13:27 -04:00
Robert Pintilii
de294cae92 fix(giphy-integration) Fix input issues (#11601)
Fix auto focus on menu open
Fix unable to use space in input
2022-05-31 11:58:25 +03:00
José Luís Andrade
5cef3dc1ba fix(lang) update Portuguese translation 2022-05-30 21:23:08 +02:00
Saúl Ibarra Corretgé
1dce802031 fix(prejoin,config) move hidePrejoinDisplayName to the prejoin section 2022-05-30 16:19:27 +02:00
Gabriel Borlea
11d61d6d7d fix(face-landmarks): human helper tensor disposal and async functions (#11596)
* fix(face-landmarks): human helper tensor disposal and async functions

* fix(face-landmarks): rename functions in interface
2022-05-30 16:04:20 +03:00
Saúl Ibarra Corretgé
b5f3cd14c2 fix(ios) fix not using the loudspeaker by default
Fixes: https://github.com/jitsi/jitsi-meet/issues/11563
2022-05-30 14:04:05 +02:00
Calin Chitu
f87ce0defe fix(recording/native) Button import missing 2022-05-30 10:28:19 +03:00
Joan Montané
201ff8f1da fix(lang) update Catalan translation 2022-05-30 08:55:34 +02:00
Avram Tudor
0c44b9a478 feat(prejoin) allow disabling prejoin display name editing (#11575) 2022-05-26 15:38:38 +03:00
Robert Pintilii
9dba1d30b0 fix(raise-hand) Fix multiple raise hand from notification (#11586)
Only dispatch raise hand if hand was not already raised
2022-05-26 14:36:12 +03:00
Jaya Allamsetty
ad70f12cb4 fix(filmstrip) Add handlers for track streaming status on RN. (#11584)
* fix(filmstrip) Add handlers for track streaming status on RN.
This is needed for switching between video and avatar when the track's streaming status changes in source-name signaling mode.

* squash: Add comment.
2022-05-24 21:37:08 -04:00
Hristo Terezov
6ea7ab2b46 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1438.0.0+b9aa0e59...v1439.0.0+42f5b4bf
2022-05-24 17:10:40 -04:00
Hristo Terezov
0ef71f4368 fix(deviceSelection):prejoin-update current device 2022-05-24 15:53:12 -05:00
Hristo Terezov
ae565aaac6 fix(device-selection): Handle properly on prejoin
The device selection initialization on the prejoin use case was handled
like the welcome page. This was introducing issues with selecting the
stored devices and not the ones used, enabling the device selection when
it will fail and others.
2022-05-24 15:53:12 -05:00
Hristo Terezov
7e942173aa fix(device-selection): disable preview for ios 2022-05-24 12:23:48 -05:00
Дамян Минков
e1b87c48bc chore(deps) lib-jitsi-meet Updates backend release num to analytics. (#11574)
https://github.com/jitsi/lib-jitsi-meet/compare/v1437.0.0+966fcd93...v1438.0.0+b9aa0e59
2022-05-23 15:21:54 -05:00
Hristo Terezov
8cd259c43f fix(device-selection):iOS Safari disable previews
On iOS Safari when the tracks for the previews are created the old ones
are auto destroyed which leads many issues like stop sending media while
the devie selectioin is displayed, error messages, etc.
2022-05-23 22:19:50 +03:00
Saúl Ibarra Corretgé
d2d2507e86 fix(app) fix broken import
Introduced in d9eedb0dad
2022-05-23 17:14:54 +02:00
Calinteodor
f3f9cd3d05 feat(dynamic-branding) add initial mobile SDK customization
* feat(dynamic-branding) sdk customization

* feat(dynamic-branding) unsetDynamicBranding when we disconnect

* feat(dynamic-branding) added branding colors to conference

* feat(dynamic-branding) extracted logger to its own file

* feat(dynamic-branding) reverted style change

* feat(dynamic-branding) unset branding if connection failed

* feat(dynamic-branding) removed index.js, updated imports, added ImageBackground component

* feat(dynamic-branding) created logger feature object

* feat(dynamic-branding) moved brandingStyles to mapStateToProps, used SvGUri

* feat(dynamic-branding) created BrandingImageBackground component, fixed styles

* feat(dynamic-branding) moved BrandingImageBackground to dynamic-branding feature

* feat(dynamic-branding) fixed linter

* feat(dynamic-branding) added style comment
2022-05-23 17:02:14 +02:00
Avram Tudor
543f273792 feat(undock) expose buttons for docking / undocking iframe (#11560) 2022-05-23 15:42:25 +03:00
Saúl Ibarra Corretgé
d9eedb0dad fix(recent-list) do not store room when inside an iframe
Due to local storage limitations we might end up making the URL huge
when we save the state there. Avoid the issue at the root by never
storing URLs in that case.

Closes: https://github.com/jitsi/jitsi-meet/issues/11567
2022-05-23 14:26:49 +02:00
Alex Bumbu
7f2fec756d fix(ios) fix PiP resizing and positioning
Co-authored-by: Tobias Marschall <tobias.marschall@online.de>
2022-05-23 14:06:36 +02:00
Robert Pintilii
607021a890 fix(self-view) Add Show self view button in overflow menu (#11568) 2022-05-23 11:29:52 +03:00
Saúl Ibarra Corretgé
b4febf728d feat(toolbox) drop MuteEveryoneButton and MuteEveryonesVideoButton
The functionality is still accessible in the participants pane, with all
moderation controls.
2022-05-20 21:43:05 +02:00
Robert Pintilii
769f0a8452 feat: Add name overwrite API (#11543) 2022-05-20 13:45:09 +03:00
Jaya Allamsetty
f5004a2a0c ref(multi-stream) Use helper function to get the video track. 2022-05-19 17:05:36 -04:00
Jaya Allamsetty
a707022d0b fix(multi-stream): Add a virtual SS tile on RN.
Add a second virtual SS tile on RN when a remote participant that has multi-stream mode enabled starts a screenshare.
2022-05-19 17:05:36 -04:00
Jaya Allamsetty
43b0118ff8 fix(mutli-stream): Use the default display name if none is available.
This fixes an issue where the virual SS tile is not created if the user sharing the screen doesn't have a display name set.
2022-05-19 17:05:36 -04:00
Jaya Allamsetty
97ca3fb622 fix(multi-stream): fix virtual screenshare participant's thumbnail.
Add a screenshare status indicator at the bottom.
Fix the font and size of the resolution/fps stats so that it matches with that of the other thumbnails.
2022-05-19 17:05:36 -04:00
Saúl Ibarra Corretgé
ffa55cca1e fix(av-moderation,breakout-rooms) disable controls on breakout rooms
AV moderation does not work on brerakout rooms.

Since some of the options in the "breakoutRooms" config section no
longer apply, I moved the relevant ones to a new "participantsPane"
section.
2022-05-19 13:47:49 +02:00
Saúl Ibarra Corretgé
0098091a37 fix(participants-pane,video-menu) fix incorrect selector usage 2022-05-19 13:47:49 +02:00
Saúl Ibarra Corretgé
6c1cb5d4be fix(av-moderation) mark as unsupported while in a breakout room 2022-05-19 13:47:49 +02:00
Gabriel Borlea
8240c3703e ref(face-landmarks): move human logic into separate class 2022-05-19 11:36:27 +02:00
Дамян Минков
35572700bf Enables sending release number from backend. (#11552)
* chore(deps) lib-jitsi-meet@latest

https://github.com/jitsi/lib-jitsi-meet/compare/v1436.0.0+d5c46952...v1437.0.0+966fcd93

* squash: Enables sending release number from backend.
2022-05-18 13:04:49 -05:00
Jaya Allamsetty
5df774c569 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1435.0.0+66080c68...v1436.0.0+d5c46952
2022-05-18 13:05:04 -04:00
Gabriel Borlea
8a503e7b40 fix(face-landmarks): dispose tensors to avoid memory leaks
Also send only expressions with score grater than 50%.
2022-05-18 13:41:51 +02:00
Calin Chitu
4f49cde73e feat(react) removed unused native components 2022-05-18 14:09:00 +03:00
Gabriel Borlea
ea5ce3f72f ref(rtc-stats) update faceLandmarks naming 2022-05-17 13:57:18 +02:00
Horatiu Muresan
5152638529 fix(native-notifications) Show notifications on max 2 lines 2022-05-16 17:26:15 +03:00
George Politis
e4b50ba419 send video type to rtcstats (#11426) 2022-05-16 15:56:37 +02:00
Saúl Ibarra Corretgé
05127467c2 feat(notifications) add ability to disable specific notifications
This works together with the broader "notifications" config option. One
might choose to leave the existing option unespecified *thus allowing
all notifications) and then use this new one to be explicit about which
ones to disable.
2022-05-16 13:24:59 +02:00
Horatiu Muresan
420c7c87e3 fix(filmstrip) Do not render filmstrip on prejoin/lobby 2022-05-16 12:30:14 +03:00
Hristo Terezov
c23d38807a fix(tile-view): scrollbar size.
The scrollbar size was changing while scrolling.
2022-05-13 18:27:34 +03:00
Calin Chitu
fb6f38800b fix(chat/native) we need to dispatch close and open chat 2022-05-13 18:07:26 +03:00
Saúl Ibarra Corretgé
4fb698ea04 chore(deps) react-native-webrtc@1.100.1 2022-05-13 14:26:04 +02:00
Calin Chitu
ebe81e2835 feat(mobile/navigation) changed navigation container background color 2022-05-12 16:42:04 +02:00
Gabriel Borlea
c4106b8d89 fix(face-landmarks) set explicit model paths 2022-05-12 13:30:47 +02:00
Jaya Allamsetty
4a350df695 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1431.0.0+742232c9...v1435.0.0+66080c68
2022-05-11 10:30:30 -04:00
Nils Ohlmeier
0638d9d303 feat: enable audio settings menu for Firefox (#11522) 2022-05-11 09:51:00 -04:00
Calinteodor
0fe7383154 fix(chat/native) private message replies (#11521)
Fixes issue #11516
2022-05-10 18:28:23 +03:00
Calin Chitu
9d7b6cafc5 fix(video-menu/native) wrong import path 2022-05-10 15:07:22 +03:00
Hristo Terezov
39d30ea0b4 fix(stage-filmstrip): resize. 2022-05-09 18:17:53 -05:00
Дамян Минков
1400b6ff0a feat: Moves luajwtjitsi in jitsi-meet. (#11501)
* feat: Moves luajwtjitsi in jitsi-meet.

* squash: Fix luajwtjitsi name to include lib.
2022-05-09 09:15:12 -05:00
pangrr
3fc3a217eb fix(stats) split stats for camera and screenshare in multi-stream mode (#11475)
* no ssrc when sourceNameSignalingEnabled
* conditionally use source name for stats
* update doc
* always subscribe to participant id
2022-05-09 09:42:45 -04:00
Andrei Gavrilescu
6068a30488 fix(audio-share): mix newly created audio track with screen audio (#11325)
* mix newly created audio track with screen audio

* check both screen sharing flows
2022-05-09 12:37:50 +03:00
Mihaela Dumitru
36578696bb feat(config) add gravatar config object (#11509) 2022-05-09 08:36:39 +03:00
Ali Alhaidary
64d44f0ac2 fix(lang) update Arabic translation 2022-05-07 13:28:59 +02:00
Ali Alhaidary
5f2147f40f fix(lang) update main.json Syntax Correction (#11511) 2022-05-07 12:34:18 +02:00
Hristo Terezov
084f911699 fix(stage-tile-view): crash when pinning 2022-05-06 16:59:39 -05:00
Saúl Ibarra Corretgé
01bd18b86a fix(notifications) remove unused isDismissAllowed prop 2022-05-06 16:49:08 +02:00
Saúl Ibarra Corretgé
e6ce5fd75f fix(rn,navigation) wait until the root navigator is initialized
There is a race condition in the root navigatior's initialization.

It's possible that it's initialized a touch too late and SDK users who
try to navigate to a conference end up stuck in the connecting screen
because the navigator is null.

This PR waits for it to be initilized by very unorthodox means, it's a
horrible hack which we need to undo, but for that we need to break
appart the inheritance relationship between App.{web,native},
AbstractApp and BaseApp because it's very inflexible.

The flags are now initialized very early so the naviggator sees if the
welcome page is enabled or not.
2022-05-06 15:05:37 +02:00
Gabriel Borlea
0c021868b5 feat(face-landmarks): integrate human library
It replaces face-api.

* feat(face-landmarks): integrate human library

* feat(face-landmarks): rewrite worker in typescript

* fix(face-landmarks): allow worker bundle size up to 2 mib

* fix: remove unwanted comment

* code review
2022-05-06 14:41:08 +02:00
Hristo Terezov
adef5095da feat(RN-filmtrip) stop reordering small meetings 2022-05-06 12:18:57 +02:00
Horatiu Muresan
61abf0d882 feat(carmode) Add carmode screen
- opens as a modal
- lastn is 0, mutes local video while open
- long press to talk
- and more
2022-05-06 13:14:10 +03:00
Saúl Ibarra Corretgé
e628d99544 fix(av-moderation) use a consistent UID for ask to unmute notifications
This way only one will be shown at a time.
2022-05-06 10:36:53 +02:00
Hristo Terezov
f34dde3376 feat(tile-view): expand tiles from last row.
If we have enough space on the last row we expand the width of the tiles
up to 16:9 ratio.
2022-05-05 08:55:02 -05:00
Ianc Oana Emilia
94e39e19b2 Update prosody config for JaaS customers 2022-05-05 07:45:08 -05:00
Saúl Ibarra Corretgé
d1ac4ea637 fix(rn,reactions) don't show raise hand button in menu if disabled 2022-05-05 13:49:36 +02:00
Saúl Ibarra Corretgé
0b57bcb20b feat(load-test) split to a separate repository
It now lives here https://github.com/jitsi/jitsi-meet-load-test
2022-05-05 13:48:58 +02:00
Saúl Ibarra Corretgé
a7abe84479 fix(ios) download WebRTC with bitcode when making an SDK release 2022-05-05 12:25:28 +02:00
Robert Pintilii
bb0d3b4c66 fix: Stage filmstrip (#11495) 2022-05-05 12:20:20 +03:00
Jonathan Lennox
5b86182f94 feat(load-test) make it possible to start multiple load-test clients from the same tab
* Refactor load-test into an object.

* Convert to class syntax.

* Bind member function callbacks.

* More binding and thisage.

* More thisage.

* More tweaks

* Rename numParticipants as remoteParticipants.

* Change back.

* Fix userLeft.

* Add members for event listeners, to be able to remove them.

* Add numClients parameter that allows multiple clients to be started.

* Clear clients array on unload.

* Add latency between starting clients.
2022-05-05 09:12:18 +02:00
Дамян Минков
3ab47ff96c fix: Updates cloud-api.swagger phoneNumberList endpoint. 2022-05-04 11:26:33 -05:00
Дамян Минков
e1706e7868 feat: Adds a prosody config for JaaS customers, disabled by default. 2022-05-04 11:26:33 -05:00
Дамян Минков
8434dda6e5 fix: Updates cloud-api.swagger phoneNumberList endpoint. 2022-05-04 11:26:33 -05:00
Jaya Allamsetty
346aadc23d fix(participant-pane) Do not show virtual SS as a separate participant. 2022-05-04 10:41:31 -04:00
pangrr
b872ea855e fix(large-video) Fix an infinite loop with source name signaling enabled (#11486)
* fix large video updating loop when kicked out

* fix linter issue
2022-05-03 17:33:38 -04:00
Saúl Ibarra Corretgé
e94607ae4b fix(recording) use generic icon for cloud recording 2022-05-03 17:12:18 +02:00
Jaya Allamsetty
2a535bd50e chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1430.0.0+ccf9ebed...v1431.0.0+742232c9
2022-05-03 11:00:35 -04:00
William Liang
f2c3740108 fix(screenshare) use selector for getting screenshare owner display name (#11478) 2022-05-03 10:25:19 -04:00
Saúl Ibarra Corretgé
42632bd5fd feat(welcome) update background
Use something less dull.

Original: https://unsplash.com/photos/Q1p7bh3SHj8
2022-05-03 16:22:11 +02:00
Saúl Ibarra Corretgé
0d0edc05e7 fix(ios) build SDK releases with bitcode
Also, stop bundling WebRTC, it's now a dependency in CocoaPods.
2022-05-03 15:45:38 +02:00
DanielHabenicht
1f9a0e91d2 Update cloud-api.swagger (#11481)
* Update cloud-api.swagger

Update to match with the current implementation

* Update cloud-api.swagger
2022-05-03 08:43:55 -05:00
Saúl Ibarra Corretgé
fe7327cd21 fix(rn,dialin-summary) simplify navigation
Only havee the screen in the hierarchy if we have a welcome page, since
it's the only way to access it.

Use goBack() from the navigator directly and avoid duplicating all props
to the screen.
2022-05-03 15:16:29 +02:00
Saúl Ibarra Corretgé
9dd44fc48e feat(local-recordings) drop old "local recordings" implementation
It's about to become very confusing, since we are going to add actual
local recordings with video.

This feature was never fully finalizeed since it required manual
processing of the files, as they were not uploaded anywhere.

In addition, unless one opens the local audio device without any audio
processing first, any tracks opened later will have audio proceessing
turned on, something not desirable for the scenario this feature was
designed for in the first place: podcasts.

This feature will likely come back as a JaaS demo / MVP where the local
recording is made outside of the Jitsi Meet iframe.
2022-05-03 14:40:12 +02:00
Saúl Ibarra Corretgé
de7c9bd001 fix(rn,screen-sharing) don't disable button when in audio-only mode
Just like the web.
2022-05-03 14:02:50 +02:00
Jaya Allamsetty
fd62ca6c67 fix(audio-only) Do not create a new track for audio-only changes.
Now that screenshare is permitted when a user is in audio-only mode, do not create a new video track if it doesn't exist when audio-only mode is automatically disabled. New tracks should only be prompted by user action such a camera unmute or start screenshare. Fixes https://github.com/jitsi/jitsi-meet/issues/11460.
2022-05-03 07:32:49 -04:00
Jairo Llopis
8e67c8e74f fix(lang) update Spanish translation 2022-05-03 10:33:04 +02:00
Jaya Allamsetty
f266418a3f chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1429.0.0+7251f3aa...v1430.0.0+ccf9ebed
2022-05-02 12:29:35 -04:00
Saúl Ibarra Corretgé
1c79e6baa3 fix(rn,lobby) use a header for the main lobby screen
It allows us to place the Cancel button there, and declutter the UI of
buttons.
2022-05-02 16:29:40 +02:00
Saúl Ibarra Corretgé
d78e8fba25 fix(rn,lobby) match button style 2022-05-02 16:29:40 +02:00
Saúl Ibarra Corretgé
721f4dc3d3 feat(rn,ui) use dark gray for screen headers
Skip the welcome page for now, until we can remove the audio / video
toggle.
2022-05-02 16:01:40 +02:00
Saúl Ibarra Corretgé
625206db20 fix(rn,speakerstats) fix not rendering stats 2022-05-02 16:01:13 +02:00
José Luís Andrade
3f7eef5d13 Update Portuguese translation 2022-05-01 09:17:23 -05:00
Дамян Минков
7cd5708ea7 fix: Fixes loading recommendedBrowsers page. (#11465)
* fix: Fixes loading recommendedBrowsers page.

Fixes loading the page and its resources when using html base (cdn).
2022-04-29 12:02:05 -05:00
Jaya Allamsetty
e3f3c00c06 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1428.0.0+eda20c2a...v1429.0.0+7251f3aa
2022-04-29 11:12:07 -04:00
William Liang
d3fe246f61 refactor(multi-stream) refactor virtual screenshare creation and support plan-b clients (#11445)
* fix(multi-stream) update selector to find ss track by videoType or mediaType

* ref(multi-stream) move fake ss creation logic and support video type changed

* refactor(multi-stream) decouple sending and receiving multiple screenshare streams

* fix(multi-stream) fix receiver constraints with signaling and without multi-stream

* fix(mutli-stream) ensure plan b original SS thumbnail displays avatar

* fix(multi-stream) show fake SS for plan b sender

* refactor(multi-stream) poc for moving SS creation to state listener

* remove reference to fake SS creation

* fix lint errors

* rename to virtual screenshare participants

* fix minor bugs

* rename participant subscriber to specify web support only
2022-04-29 10:32:16 -04:00
Saúl Ibarra Corretgé
b9c4d28dac fix(auth) fix WaitForOwnerDialog not vanishing
Since all the auth logic is not ported to React on the web,
`_isWaitingForOwner` will always return `false` because the
`waitForOwner()` action is not (yet) used there.

THis fix always tries to hide the dialog no matter what, which is not a
Bad Thing to do anyway.

There is a related bug remaining, however: if one pressed "I am the
host" and then cancel, it doesn't goo back to the previous dialog, but
it completely kils the meeting. This is a compromise we'll have to live
with for a bit longer.

Fixes: https://github.com/jitsi/jitsi-meet/issues/11413
Fixes: https://github.com/jitsi/jitsi-meet/issues/11432
2022-04-29 14:58:22 +02:00
Saúl Ibarra Corretgé
6802a03b7f fix(ios) sync Podfile.lock 2022-04-29 12:01:34 +02:00
Saúl Ibarra Corretgé
0b642fd225 fix(giphy,privacy) remove custom dynamic fonts 2022-04-29 11:58:32 +02:00
Saúl Ibarra Corretgé
27e2ee07a8 fix(giphy,privacy) disable pingback 2022-04-29 11:58:32 +02:00
Mihaela Dumitru
02aca27c46 feat(external-api) add breakout room configs to hide auto assign and footer menu buttons (#11443)
* hideAutoAssignButton
* hideFooterMenu
* hideModeratorSettingsTab
* hideMoreActionsButton
* hideMuteAllButton
2022-04-29 12:30:49 +03:00
Saúl Ibarra Corretgé
9f3965800c feat(deps,rn) update React Native to version 0.68.1 2022-04-29 10:54:16 +02:00
Saúl Ibarra Corretgé
0ad6bd4d83 fix(dialog) remove obsolete prop no longer used in web 2022-04-29 10:40:21 +02:00
Saúl Ibarra Corretgé
8e65fab544 fix(virtual-background) don't treat timeout as fatal failure
If downloading the model tiemouts, it may succeed in the (near) future,
don't just give up.
2022-04-29 10:07:26 +02:00
pangrr
f62cb7a0c7 Fix(multi-stream) fix an issue where avatar shows up occasionally.
* fix occasional unexpected avatar

* fix ss stats popover not shown

* fix linter issue
2022-04-28 18:25:45 -04:00
Дамян Минков
96ee61ec07 fix: Fixes breaks apache2. 2022-04-28 14:06:18 -05:00
Jaya Allamsetty
6be9f02111 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1425.0.0+6b629a19...v1428.0.0+eda20c2a
2022-04-28 14:47:29 -04:00
Saúl Ibarra Corretgé
fa48223aac fix(config) add a link to config options docs 2022-04-28 17:19:31 +02:00
Дамян Минков
132b44a8b6 feat: Drops nginx dependency for turnserver config.
We used to multiplex the ports in nginx, but we dropped that at some point, so now coturn is on its own listening and nginx dependency is no longer needed. Our turnserver config can be used with nginx | apache2.
2022-04-28 06:12:13 -05:00
Mihaela Dumitru
72111114b6 fix(breakout-rooms) reset rooms when conference is left or failed (#11447) 2022-04-28 11:34:23 +03:00
Hristo Terezov
550c730ed4 fix(tile-view):Recalculate on window height change 2022-04-28 08:35:39 +02:00
Nicolas
2ac2138982 fix(lang) update Russian translation 2022-04-27 14:01:55 +02:00
Robert Pintilii
a84d7c17fa fix(avatar) Center phone icon in participants pane avatars (#11440) 2022-04-27 10:53:58 +03:00
bgrozev
586ad30ed4 feat(config) add testing.setScreenSharingResolutionConstraints to config.js 2022-04-27 09:25:48 +02:00
Jaya Allamsetty
f1c5f314e5 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1422.0.0+cf22aa36...v1425.0.0+6b629a19
2022-04-26 18:19:13 -04:00
bgrozev
64d7305598 chore(deps) lib-jitsi-meet@latest (#11437)
https://github.com/jitsi/lib-jitsi-meet/compare/v1422.0.0+cf22aa36...v1423.0.0+6870779a
2022-04-26 15:52:30 -05:00
pangrr
c03d86e0e3 fix: disabled connectStatusIndicatorIcon cause video not displayed (#11377)
* add and remove JitsiTrackEvents.TRACK_STREAMING_STATUS_CHANGED listener in middlewares

* add/remove listeners in components that use track streaming status

* remove track streaming status handler from ConnectionIndicatorIcon and ConnectionIndicatorContent

* check video track change before hanlding track streaming status
2022-04-26 15:33:50 -05:00
Дамян Минков
0ae2693116 fix: Fixes let's encrypt for latest ubuntu versions. (#11434)
* fix: Fixes let's encrypt for latest ubuntu versions.

* squash: Simplifies the logic.
2022-04-26 13:48:25 -05:00
Horatiu Muresan
20f6ba1736 fix(premeeting) Detach premeeting toolbar buttons visibility
- if hiddenPremeetingButtons is undefined, toolbarButtons overwrite decides what buttons to show
- if hiddenPremeetingButtons is empty array, all buttons are show on premeeting screen regardless of toolbarButtons
- if hiddenPremeetingButtons hides some buttons, only those buttons will be hidden regardless of toolbarButtons overwrite
2022-04-26 15:33:09 +03:00
Horatiu Muresan
eb64ea6aba fix(always-on-top) Fix audio mute button disabled status 2022-04-26 15:32:18 +03:00
Calin Chitu
3e004811e0 feat(lobby/native) LobbyScreen and LobbyChatScreen 2022-04-26 14:55:15 +03:00
Дамян Минков
037b9202a6 fix: Fixes Let's Encrypt script. (#11430)
* fix: Fixes Let's Encrypt script.

It fails when certbot is not installed and exits with an error without installing anything.

* squash: Fixes certbot command after install.
2022-04-26 06:32:08 -05:00
dependabot[bot]
8b8a42e0d1 chore(deps): bump async from 2.6.3 to 2.6.4
Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4.
- [Release notes](https://github.com/caolan/async/releases)
- [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md)
- [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4)

---
updated-dependencies:
- dependency-name: async
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-26 12:29:56 +02:00
Jaya Allamsetty
4315e19780 fix(device-selection) Enable device selection on mobile Safari. (#11427)
* fix(device-selection) Enable device selection on mobile Safari.
With https://bugs.webkit.org/show_bug.cgi?id=179363 being fixed, we should now be able to switch between devices in call. Also, before the webkit fix, we were able to continue to use the old track when a new track was created for preview in device settings before joining the call. This doesn't work anymore after the fix. Therefore, always replace the track in redux even if the selected device hasn't changed. Depends on https://github.com/jitsi/lib-jitsi-meet/pull/1993.

* chore(deps): update lib-jitsi-meet@latest.
2022-04-25 15:01:10 -04:00
Saúl Ibarra Corretgé
4d2bd932a7 fix(lastN) fix last N getting stuck on 1
If last N goes down to 1 it will be stuck there since it's > 0 and will
be our `lastNSelected`. When limits are applied we'll take the minimum,
so it will end up being 1.

Once can end up in last N being 1 by several means, the more obvious one
by entering Picture-in-Picture mode on mobile.

Fix it by not using the previous last N value for the current
calculation, at all.

Fixes: https://github.com/jitsi/jitsi-meet/issues/10257
Closes: https://github.com/jitsi/jitsi-meet/pull/10491
2022-04-25 17:44:54 +02:00
SiderealArt
6e1f56fad1 fix(lang) update Traditional Chinese translation 2022-04-25 14:18:13 +02:00
Ali Alhaidary
7d2f62a614 fix(lang) update Arabic translation 2022-04-25 11:52:39 +02:00
Robert Pintilii
97b958e9ea Fix import and naming 2022-04-21 09:01:51 -05:00
Robert Pintilii
b00fc92ee6 Native fix 2022-04-21 09:01:51 -05:00
Robert Pintilii
f9d1003527 Fixes 2022-04-21 09:01:51 -05:00
robertpin
0abefa87aa ref(stage-filmstrip) Refactor as new layout
Fixes screensharing selection issues. Now when there’s a screen share we just use the old VERTICAL_FILMSTRIP_VIEW layout
Add THUMBAIL_TYPE to determine how to display thumbnails
2022-04-21 09:01:51 -05:00
Gabriel Borlea
dde8c586da feat(external-api): add toggle subtitles command (#10070)
* feat(external-api): add toggle subtitles command

* feat(external-api): add set subtitles command
2022-04-20 11:43:18 +03:00
Seda Çağlar
aa944e76ad fix(lang) update Turkish translation 2022-04-19 17:33:24 -05:00
Hristo Terezov
4153097cc9 fix(prejoin):Disable device selection on iosSafari
It seems that showing the device selection dialog on ios Safari will
leads to not working audio. This is temporary fix until we find out
better solution.
2022-04-19 15:32:45 -05:00
Hristo Terezov
2a5be074d0 fix(video-layout): functions imports. 2022-04-19 15:15:44 -05:00
Saúl Ibarra Corretgé
2e0ae75774 fix(debian) make sure we install the latest version of luajwtjitsi
Also on update, since we might start depending on a more recent version.
2022-04-19 14:59:51 +02:00
Saúl Ibarra Corretgé
a8017149a0 fix(debian) update Prosody related dependencies 2022-04-19 14:59:51 +02:00
Jaya Allamsetty
e99fc4394d chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1418.0.0+da6d04c2...v1419.0.0+607646a1
2022-04-19 08:30:19 -04:00
philip-cc
46dd88c91b feat(jwt) refactor token authentication plugin to use new luajwtjitsi version 2022-04-19 13:06:20 +02:00
Horatiu Muresan
dbc8f21b01 fix(hangup-button) Add to notify toolbar button clicked 2022-04-19 13:26:07 +03:00
William Liang
5ebe308953 fix(multi-stream) add screenshare display name to i18n 2022-04-18 17:37:22 -05:00
Jaya Allamsetty
7420113079 fix(multi-stream) Do not show join notifications for SS tiles. 2022-04-18 13:19:17 -04:00
Hristo Terezov
221ecac12d feat(tile-vew): Calculate maxColumns dynamically 2022-04-18 11:19:58 -05:00
Jaya Allamsetty
744607a5cc fix(stageFilmstrip) Disable stage filmstrip by default. 2022-04-18 09:57:25 -05:00
Horatiu Muresan
8f641b7bb1 fix(start-silent) Disable AOT mic and unmute notif when start silent 2022-04-18 17:17:51 +03:00
chipechop
045bd44407 fix(lang) update Italian translation 2022-04-18 10:55:05 +02:00
Jaya Allamsetty
13cfc3ba66 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1415.0.0+fa916d41...v1418.0.0+da6d04c2
2022-04-15 10:56:26 -04:00
Дамян Минков
bbfe7b4f32 fix: Skips clearing tracks on conference failed.
In case of conference failed as max number of occupants reached, we should skip clearing the local tracks to keep state of pre-join screen. Otherwise, on join we will join muted even though on prejoin screen it was unmuted on the initial attempt.
2022-04-15 08:48:26 -05:00
William Liang
4a375aa2a4 fix(multi-stream) update screenshare display name (#11376) 2022-04-14 13:07:17 -04:00
Robert Pintilii
a6ad592d25 feat(reactions) Open reactions menu on hover instead of click (#11364)
Fixed issue on DialogPortal where the content would flash to the initial position then move to the correct position
2022-04-13 16:18:54 +03:00
Saúl Ibarra Corretgé
00bb013373 misc(rn,app) log navigation target 2022-04-12 17:12:05 +02:00
Calinteodor
95baf34ba6 feat(participants-pane/native) adjusted styles for when local p is not a moderator (#11349)
* feat(participants-pane/native) adjusted styles for when local p is not a moderator
2022-04-12 14:45:27 +03:00
Saúl Ibarra Corretgé
64385d48e9 fix(security) hide button if the enabled flag is set to false 2022-04-12 12:26:35 +02:00
Saúl Ibarra Corretgé
5d8c87eb76 fix(rn,config) fix loading config due to broken import 2022-04-12 10:53:47 +02:00
Robert Pintilii
8bf42e79a0 fix(stage-filmstrip) Fix issues (#11360)
Fix dominant speaker not removed on leave
Fix video not shown in vertical filmstrip when a remote screensharing was on
Refactor pin/ unpin. Add click to unpin
Remove from stage on unpin, except dominant (just change pin state)
Fix local shows video on both stage and vertical filmstrip
Don't reorder on stage base on queue (sort all by id)
2022-04-12 09:57:01 +03:00
Дамян Минков
930852cd88 fix: Adds testId for context menu items and ids to some components.
Needed to revive the lobby tests.
2022-04-11 13:21:48 -05:00
Дамян Минков
fcc8e98aad Revert "fix(avatar): add ZWNJ between initials of letter avatars"
This reverts commit 6085220bfc.
2022-04-11 11:17:49 -05:00
Jaya Allamsetty
c633929c58 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1413.0.0+474b2ec7...v1415.0.0+fa916d41
2022-04-11 11:33:16 -04:00
Shahab
6085220bfc fix(avatar): add ZWNJ between initials of letter avatars 2022-04-11 14:11:58 +02:00
Saúl Ibarra Corretgé
ed6759c6cf chore(rn,deps) react-native-default-preference@1.4.4
Upstream made a release in npm, we no longer need to link to a commit.
2022-04-11 12:18:59 +02:00
Gabriel Borlea
0259d1c260 feat(rtc-stats) add timestamp to face landmarks when sending to rtc stats 2022-04-11 11:26:31 +02:00
Christoph Settgast
537d3ae53a fix(lang) update German translation
Signed-off-by: Christoph Settgast <csett86@web.de>
2022-04-11 11:20:03 +02:00
dependabot[bot]
bf463e37ca chore(deps): bump moment from 2.29.1 to 2.29.2
Bumps [moment](https://github.com/moment/moment) from 2.29.1 to 2.29.2.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.1...2.29.2)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-09 09:41:40 +02:00
William Liang
c246174555 fix(multi-stream) use highest video quality for screenshare 2022-04-08 15:18:32 -04:00
William Liang
0cf1b7e3d9 fix(multi-stream) fix screenshare auto pin bug 2022-04-08 12:57:39 -04:00
Saúl Ibarra Corretgé
41d8b9fbeb fix(ios) fix not marking speaker as a selected device 2022-04-08 17:29:53 +02:00
Saúl Ibarra Corretgé
cc5f65f58f fix(ios) avoid reapplying config when audio category doesn't change 2022-04-08 17:29:53 +02:00
Saúl Ibarra Corretgé
3097ac8cc4 fix(ios) fix not showing the CarPlay audio interface 2022-04-08 17:29:53 +02:00
Jaya Allamsetty
d78b591e68 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1412.0.0+832d7d35...v1413.0.0+474b2ec7
2022-04-08 11:12:14 -04:00
Calinteodor
7c523f3250 language(typescript) actionTypes.js -> actionTypes.ts (#10940)
* language(typescript) first ts component, added ts configurations, actionTypes.js are now ts files
2022-04-08 15:24:58 +03:00
Saúl Ibarra Corretgé
23b91c0336 fix(android) fix crash when starting foreground service
If we attempt to start it while in the background we'll get a crash. A
more elegant fix would be to wait until the app transitions to the
foreground to start it, but the crash is hurting us now.
2022-04-08 14:04:21 +02:00
Avram Tudor
ceb8d3348d feat(face-landmarks) add API event for providing face landmark data (#11347) 2022-04-08 10:12:38 +03:00
William Liang
ae6454c59c fix(multi-stream) only create local ss particpant with multi-stream enabled 2022-04-07 12:17:56 -04:00
Saúl Ibarra Corretgé
57672ebea8 fix(ios,broadcast-extension) remove unused import
It creates a compilation warning because it forces linking with the SDK.
2022-04-07 16:50:58 +02:00
Calinteodor
41c068feaf feat(chat/web) fixed 2 byte char duplication (#11332)
* feat(chat/web) fixed for 2 byte char duplication on Chat
2022-04-07 17:03:07 +03:00
Gabriel Borlea
856ef757d4 fix(face-landmarks): get face models from node_modules instead of having resoruces folder (#11326) 2022-04-07 13:46:04 +03:00
Avram Tudor
9bcc5896ba chore(deps) lib-jitsi-meet@latest (#11336)
https://github.com/jitsi/lib-jitsi-meet/compare/v1411.0.0+6d8060a4...v1412.0.0+832d7d35
2022-04-07 13:27:15 +03:00
Gabriel Borlea
1fbbe7bc46 fix(speaker-stats): get realtime local face expressions (#11334)
* fix(speaker-stats): get realtime local face expressions

* code review
2022-04-07 13:02:43 +03:00
Saúl Ibarra Corretgé
6342e6b51a chore(ios) sync Podfile.lock 2022-04-07 11:48:22 +02:00
Calin Chitu
ec78cf2784 feat(conference/native) - hide label in one to one meeting 2022-04-07 10:43:37 +02:00
Saúl Ibarra Corretgé
bdd8400057 fix(rn) remove no longer needed hack
RN no longer logs pprops in release builds.
2022-04-07 10:35:51 +02:00
Saúl Ibarra Corretgé
23f40db889 feat(rn,deps) update React Native to 0.67 2022-04-07 10:35:51 +02:00
Saúl Ibarra Corretgé
94ba69dd74 chore(deps) react-native-reanimated@1.13.4
Necessary for the RN update.
2022-04-07 10:35:51 +02:00
Saúl Ibarra Corretgé
a451923ec9 fix(rn,polyfills) remove no longer needed polyfill 2022-04-07 10:35:51 +02:00
Robert Pintilii
c05a983c98 feat(stage-filmstrip) Added user configurable max (#11324)
The user can set the max number of participants that can be displayed on stage
Send the number on follow me to all participants
2022-04-07 11:31:53 +03:00
Дамян Минков
6687c3f4ab fix: Adds undefined check to avoid error.
Was breaking DisableSelfViewTest.
2022-04-06 12:30:05 -05:00
Avram Tudor
42703fed47 ref(face-landmarks) refactor namings (#11307)
* ref(face-landmarks) refactor namings

* code review
2022-04-06 12:10:31 +03:00
Дамян Минков
a99532b0d8 fix: leaking listeners while waiting on auth dialog (#11288)
* fix: Drop duplicate call of wait for owner.

* fix: Fixes leaking listeners while waiting for host to join.

While waiting for the host to join on the dialog we attempt to join over and over again till we are admitted to enter the meeting. While doing that authRequired flag is on, and we were adding listeners on and on.

* feat: Introduces conference join in progress action.

This event is coming from lib-jitsi-meet and is fired when we receive the first presence of series when joining. It is always fired before joined event.

* fix: Moves testing middleware to use CONFERENCE_JOIN_IN_PROGRESS.

* fix: Moves follow-me middleware to use CONFERENCE_JOIN_IN_PROGRESS.

* fix: Moves some polls logic to middleware and use CONFERENCE_JOIN_IN_PROGRESS.

* fix: Moves reactions middleware to use CONFERENCE_JOIN_IN_PROGRESS.

* fix: Moves recordings middleware to use CONFERENCE_JOIN_IN_PROGRESS.

* fix: Moves shared-video middleware to use CONFERENCE_JOIN_IN_PROGRESS.

* fix: Moves videosipgw middleware to use CONFERENCE_JOIN_IN_PROGRESS.

* squash: Fix comments.

* fix: Fixes join in progress on web.

* fix: Moves variable extraction inside handlers.

* fix: Moves variable extraction inside handlers again.

* fix: Moves etherpad middleware to use CONFERENCE_JOIN_IN_PROGRESS.
2022-04-05 21:13:39 -05:00
José Luís Andrade
33db511d93 fix(lang) update Portuguese Translation 2022-04-05 23:56:07 +02:00
William Liang
eb716af29b fix(multi-stream) support screenshare tile in stage filmstrip 2022-04-05 17:09:08 -04:00
Nicolas
92121803a1 fix(lang) update Russian translation 2022-04-05 16:10:34 +02:00
Robert Pintilii
d7c8164b74 fix(follow-me) Make follow me work with stage filmstrip (#11306)
On follow me enabled all participants will see the participants pinned by the moderator
Fix pinned indicator to work when stage filmstrip is disabled
Fix add participant on dominant speaker change: if the participant was already pinned keep it as pinned
Don’t add local participant on stage (on automatic selection)
2022-04-05 16:00:32 +03:00
Robert Pintilii
ed9b85f287 ref(overflow-menu) Use ContextMenu component (#11282)
refactor overflow menu to use ContextMenu component
refactor toolboxItem to use ContextMenuItem when needed
2022-04-05 15:19:03 +03:00
Saúl Ibarra Corretgé
14597e835b chore(deps) npm audit fix 2022-04-05 14:14:42 +02:00
Jaya Allamsetty
9325de8cbc chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1410.0.0+3b38ab37...v1411.0.0+6d8060a4
2022-04-04 21:10:58 -04:00
Jaya Allamsetty
b7c2ccd814 fix(conference) Do not add audio track from screenshare to redux.
In audio-only screenshare mode when there is no local audio track from mic present, do not add the audio track from screenshare to redux. Adding the track to redux will sync the track mute state to that of /base/media and show that the mic is unmuted even when that is not the case. Fixes https://github.com/jitsi/jitsi-meet/issues/10706.
2022-04-04 17:34:55 -04:00
Jaya Allamsetty
0713240c3d feat(multi-stream) Whitelist config flags for multi-stream. 2022-04-04 14:58:50 -04:00
William Liang
70090fd716 feat(multi-stream) Add fake participant tile for screen share.
prioritize participants with screen shares
support local screen share track
auto pin screen share
support screen share for large video
ensure fake screen share participants are sorted
fix local screen share in vertical filmstrip
fix local screen share in tile mode
use FakeScreenShareParticipant component for screen share thumbnails
ensure changes are behind feature flag and update jsdocs
fix bug where local screen share was not rendering
update receiver constraints to include SS source names
remove fake ss participant creation on track update
fix: handle screenshare muted change and track removal
refactor: update key values for sortedFakeScreenShareParticipants
address PR comments
refactor getter for screenshare tracks
rename state to sortedRemoteFakeScreenShareParticipants
2022-04-04 14:57:58 -04:00
Saúl Ibarra Corretgé
14d200a0cf chore(deps) update react-native-webrtc to 1.100.0 2022-04-04 16:50:07 +02:00
Saúl Ibarra Corretgé
5b07b6dc42 chore(rn,versions) bump app and sdk versions 2022-04-04 16:42:44 +02:00
Avram Tudor
2c165d4313 feat(face-landmarks) merge face expressions and face centering (#11283)
* feat(face-landmarks) merge face expressions and face centering

* code review

* code review

* code review
2022-04-04 16:09:14 +03:00
Robert Pintilii
4b84f71021 fix(filmstrip) Fix resizing on chat toggle (#11305)
Fix pinned indicator to be displayed only for pinned participants
2022-04-04 15:39:32 +03:00
Calin Chitu
d415d02f35 feat(participants-pane/native) adjusted styles for participants container 2022-04-04 14:10:12 +03:00
Robert Pintilii
c2399deb55 ref(AOT) Change buttons to not use abstract classes (#11302)
This reduces the bundle size by about 100KB
It also decouples the AOT buttons from the classes that are used to implement other features
2022-04-04 13:38:49 +03:00
Avram Tudor
3443d256f2 fix(highlights) allow highlighting moments if recording is running (#11301) 2022-04-04 12:08:11 +03:00
Ali Alhaidary
db16250e6e fix(lang) updated Arabic translation 2022-04-03 11:23:21 +02:00
gpatel-fr
2039b61a3f fix(lang): update french translation 2022-04-01 16:27:03 -05:00
Jaya Allamsetty
c94726be81 feat(multi-stream) Update config.js. 2022-04-01 13:25:22 -04:00
Calin Chitu
03286eb07e feat(polls/web) fixed issue with duplicating value to next input on keypress 2022-04-01 17:07:18 +03:00
George Politis
84ac6298eb Pushes e2e pings to rtcstats (#11270)
* Pushes e2e pings to rtcstats

* linter fixes

* linter fixes

* Re-use existing event instead of introducing a new one.

* Don't update the connection info popup stats when the e2e rtt changes.

* Bumps ljm version to the latest

* e2e pings should work on mobile

* tweak the e2eRttChanged action properties

* fixes comments
2022-04-01 13:50:52 +01:00
Gabriel Borlea
1e58a7cbec Fixes for highlights mobile (#11209) 2022-04-01 12:58:03 +02:00
Jaya Allamsetty
6e0f53293e fix(large-video) Show the pinned participant on large-video when stage filmstrip is disabled.
Fixes an issue where a non-screenshare participant cannot be pinned on stage with filmstrip on stage feature disabled.
2022-03-31 16:10:59 -04:00
tmoldovan8x8
6a1067733a feat(android) use JitsiMeetView instead of JitsiMeetFragment 2022-03-31 17:47:40 +03:00
Saúl Ibarra Corretgé
cb2b2436eb chore(deps) lib-jitsi-meet@latest (#11284)
https://github.com/jitsi/lib-jitsi-meet/compare/v1408.0.0+7e997fb7...v1409.0.0+88378583
2022-03-31 17:09:52 +03:00
Mihaela Dumitru
e062c394e8 fix(salesforce) use salesforce only in the main room (#11245) 2022-03-31 16:11:44 +03:00
Saúl Ibarra Corretgé
d2c4e81e25 fix(ci) make the "dirty git tree" CI failure clearer
Print the git diff output in the step which fails.
2022-03-31 08:00:50 -05:00
Robert Pintilii
ec0e824a43 feat(rn, thumbnail) Updated indicators on native (#11280)
Remove tint for participant in large view
Change pinned indicator from border to icon
On stage view move screen sharing indicator from top to bottom
On stage view show pinned indicator instead of moderator indicator
2022-03-31 14:39:49 +03:00
Robert Pintilii
343a1b87e2 fix(thumbnails) Fix recalculate tile dimensions on client resize (#11267)
Recalculate after new dimensions are in the store
Fixes issue where on participant pane toggle the tiles would not recalculate correctly
2022-03-31 12:13:33 +03:00
dependabot[bot]
1618093f30 chore(deps): bump minimist from 1.2.5 to 1.2.6
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-31 09:31:25 +02:00
dependabot[bot]
0b8bd9da94 chore(deps): bump ansi-regex from 3.0.0 to 3.0.1 in /resources/load-test
Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 3.0.0 to 3.0.1.
- [Release notes](https://github.com/chalk/ansi-regex/releases)
- [Commits](https://github.com/chalk/ansi-regex/compare/v3.0.0...v3.0.1)

---
updated-dependencies:
- dependency-name: ansi-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-31 09:31:02 +02:00
dependabot[bot]
549423da69 chore(deps): bump ansi-regex from 4.1.0 to 4.1.1
Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/chalk/ansi-regex/releases)
- [Commits](https://github.com/chalk/ansi-regex/compare/v4.1.0...v4.1.1)

---
updated-dependencies:
- dependency-name: ansi-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-31 09:30:49 +02:00
dependabot[bot]
c2c4325ff7 chore(deps): bump plist from 3.0.4 to 3.0.5
Bumps [plist](https://github.com/TooTallNate/node-plist) from 3.0.4 to 3.0.5.
- [Release notes](https://github.com/TooTallNate/node-plist/releases)
- [Changelog](https://github.com/TooTallNate/plist.js/blob/master/History.md)
- [Commits](https://github.com/TooTallNate/node-plist/commits)

---
updated-dependencies:
- dependency-name: plist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-31 09:30:35 +02:00
William Lohan
515bb31b95 fix(ios) cycle in dependancies with Xcode 13.3
Fixes: https://github.com/jitsi/jitsi-meet/issues/11188
2022-03-31 09:11:56 +02:00
Saúl Ibarra Corretgé
781bb5bd18 feat(ios) enable Dropbox recording 2022-03-30 19:55:22 +02:00
José Luís Andrade
dc8925cbf4 Update Portuguese translation 2022-03-30 10:10:21 -05:00
Jaya Allamsetty
c69eccb690 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1406.0.0+dcd5f13b...v1408.0.0+7e997fb7
2022-03-30 11:05:54 -04:00
Robert Pintilii
00092d5139 fix(notifications) Change moderation notifications to medium (#11262) 2022-03-30 17:24:50 +03:00
Robert Pintilii
1355876f83 feat(gif, rn) Added GIPHY integration on native (#11236)
Update Android build to support gif
Use GIF format instead of animated webp
Show GIFs in chat messages
Display GIF over tile
Add Giphy button in reactions menu
Added Giphy dialog
Fix isGifMessage to also allow upper case
2022-03-30 16:54:03 +03:00
Robert Pintilii
1a3432d580 fix(gif) Keep showing GIF on hover (#11266) 2022-03-30 16:08:19 +03:00
Robert Pintilii
270070716b fix(context-menu) Don't overwrite hidden prop (#11265)
Fixes issue where the menu would disappear on dominant speaker change
2022-03-30 14:50:41 +03:00
dependabot[bot]
1b1d976791 chore(deps): bump node-forge from 1.2.1 to 1.3.0
Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.2.1 to 1.3.0.
- [Release notes](https://github.com/digitalbazaar/forge/releases)
- [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md)
- [Commits](https://github.com/digitalbazaar/forge/compare/v1.2.1...v1.3.0)

---
updated-dependencies:
- dependency-name: node-forge
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-29 21:57:20 +02:00
sadeghpro
5f858a1c2c Add missing key to Persian lang file 2022-03-29 13:05:58 -05:00
Дамян Минков
be1828d9e9 feat: Updates external-services.lua to latest.
changeset ede9682c2022
https://hg.prosody.im/prosody-modules/file/ede9682c2022/mod_external_services/mod_external_services.lua
2022-03-29 12:29:48 -05:00
Jaya Allamsetty
3a36945c3c Revert "fix(screenshare) Add and then mute the camera track after SS stops instead of not adding the track."
This workaround is not needed anymore since P2P is disabled between plan-b and unified-plan clients.
Fixes https://github.com/jitsi/jitsi-meet/issues/11131

This reverts commit c30038236a.
2022-03-29 11:10:04 -04:00
Horatiu Muresan
00d68f08ab fix(background-alpha) Fix setting background opacity 2022-03-29 17:27:32 +03:00
Saúl Ibarra Corretgé
23c7ac4da4 fix(video-layout) fix incorrect import of isStageFilmstripEnabled 2022-03-29 15:20:08 +02:00
Saúl Ibarra Corretgé
f503bd7352 fix(rn,lobby) fix lobby not showing up on subsequent tries
We need to make sure to hide it explicitly so the Redux state is in sync
with reality.
2022-03-29 15:12:09 +02:00
robertpin
ab91f79448 fix(settings-dialog) Add back CSS classes used by tests 2022-03-29 14:33:41 +02:00
Saúl Ibarra Corretgé
26b3eb34f0 fix(android,back-button) rework back button handling on Android
We used to have a registry which registered a single handlerwith RN.
THis was registered really early in the app.

When React Navigation was introduced we ddidn't realize it interacts
with the back button. In a stack nagigator it will navigate to the
previous screen. This meant our back button handling was broken.

This commit removes our previous registry and uses the RN back button
handler directly in the 2 components that use it: the conference and
bottom sheets.

Since these handlers are registered after navigation, our handlers are
going to run first so we cna implement the behavior we need, namely to
dismiss an open botom sheet or set the conference in PiP mode.
2022-03-29 14:33:25 +02:00
Calin Chitu
ef125968ce feat(participants/native) - fix joining breakout room 2022-03-29 14:57:23 +03:00
Robert Pintilii
45e8140209 fix(rn) Fix native after stage filmstrip merge (#11247) 2022-03-29 13:42:01 +03:00
Shahab
d2f70b0006 refactor(connection-stats): use jss instead of sass in ConnectionStatsTable (#11156) 2022-03-29 12:23:40 +03:00
Shahab
70efa31c16 refactor(virtual-background): use jss instead of sass (#11152) 2022-03-29 12:07:55 +03:00
Shahab
3eafaeeedd refactor: move chat component outside of videoconference_page (#11138) 2022-03-29 12:01:48 +03:00
Shahab
9278414821 refactor(dialog): use jss instead of sass for mute-dialog style (#11154) 2022-03-29 11:59:53 +03:00
Shahab
17faefd757 refactor(settings): use jss instead of css (#11149) 2022-03-29 11:50:32 +03:00
Robert Pintilii
c4db12cbd6 feat(stage) Add stage filmstrip (multiple participants on stage) (#11145)
See multiple participants on stage
Pin and unpin to stage
Automatic selection of participants to be displayed on the stage filmstrip based on dominant speaker changes
Make Filmstrip a reusable component. Used by MainFilmstrip (old functionality) and the new StageFilmstrip
Rename DominantSpeakerName to StageParticipantNameLabel
Active border now showed only for the dominant speaker (no longer for the pinned participant)
Hide video from the vertical filmstrip for the participants on stage
Update video constraints
Updated pinned indicator
2022-03-29 11:45:09 +03:00
Дамян Минков
4db7312d53 feat: Adds a hint for cors headers in default prosody config. 2022-03-28 11:16:58 -05:00
Saúl Ibarra Corretgé
66153087e1 fix(redux) fix not working with Redux Devtools 2022-03-28 16:31:12 +02:00
Saúl Ibarra Corretgé
b7c68d09e7 fix(debian) support installing the prosody-0.12 upstream package 2022-03-28 08:47:34 -05:00
Avram Tudor
7e5ffdb390 fix(face-centering) fix face centering on browsers with no offscreencanvas support (#11234) 2022-03-28 14:13:00 +03:00
gpatel-fr
9ea2b5836a fix(lang): update french translation 2022-03-27 21:15:40 +02:00
Jaya Allamsetty
7208e781b3 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1403.0.0+665ab174...v1406.0.0+dcd5f13b
2022-03-25 15:42:54 -04:00
Saúl Ibarra Corretgé
dc96324d3b fix(rn,recording) fix recording dialog state not updating 2022-03-25 17:22:32 +01:00
Aditya Gupta
0b93569df2 Increase the visibility of 404 error message (#11108)
Changed the font-size and color of the h2 element of the 404 error page so that it can look more vibrant and stand out.
2022-03-25 13:45:40 +02:00
Avram Tudor
c731e2f8cb fix(highlight) set highlight button visibility based on record button… (#11215)
* fix(highlight) set highlight button visibility based on record button props

* code review

* code review

* code review

* code review
2022-03-25 13:44:05 +02:00
Avram Tudor
b1e3f2b50d fix(highlight) implement custom notification for highlight start recording (#11217) 2022-03-25 13:43:51 +02:00
Gabriel Borlea
7751060b63 fix(facial-expressions): base url for models (#11218) 2022-03-25 13:43:32 +02:00
JohnProv
25f53503e8 fix(lang) update Dutch translation 2022-03-25 11:11:34 +01:00
Calin Chitu
8d737adc65 feat(participants/native) - updated container styles 2022-03-25 11:46:04 +02:00
Calinteodor
3fcfb64338 fix(rn,recording) fix start button not being enabled 2022-03-25 10:31:37 +01:00
Shawn
f8628dfeef feat(reservations) add integration with mod_muc_max_occupants 2022-03-24 08:38:34 -05:00
Christoph Settgast
39793110b6 conf(nginx) add keepalive via upstream groups
Incorporate https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/
into the example nginx config
2022-03-24 13:20:50 +01:00
Saúl Ibarra Corretgé
e5e7aa87d3 fix(overlay) fix not showing the correct gUM helper text 2022-03-24 13:19:43 +01:00
Tudor D. Pop
18fa56ff1b fix(lobby) display the entire message in the reject notification 2022-03-24 12:15:30 +01:00
Calin Chitu
ccf7939316 fix(mobile/navigation) - fixed bottom color glitch 2022-03-23 16:37:24 +02:00
Jaya Allamsetty
a518498bff chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1402.0.0+66ff07ce...v1403.0.0+665ab174
2022-03-23 09:57:41 -04:00
Robert Pintilii
9a78011daf feat(external-api) Add grantModerator command (#11199) 2022-03-23 11:31:44 +02:00
Jaya Allamsetty
35d0fefa1e chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1401.0.0+584a8680...v1402.0.0+66ff07ce
2022-03-22 17:35:27 -04:00
bgrozev
b6792d9287 Update config.js with new e2eping properties. (#11195) 2022-03-22 14:12:29 -05:00
Robert Pintilii
cfb480932a fix(chat) Fix iOS web chat (#11193)
Fixes: on iOS web the chat input would move from the bottom when the keyboard was open
2022-03-22 14:56:18 +02:00
670 changed files with 17737 additions and 29727 deletions

View File

@@ -3,12 +3,10 @@ build/*
# Third-party source code which we (1) do not want to modify or (2) try to
# modify as little as possible.
flow-typed/*
libs/*
resources/*
react/features/stream-effects/virtual-background/vendor/*
load-test/*
react/features/facial-recognition/resources/*
react/features/face-landmarks/resources/*
# ESLint will by default ignore its own configuration file. However, there does
# not seem to be a reason why we will want to risk being inconsistent with our
@@ -16,4 +14,4 @@ react/features/facial-recognition/resources/*
!.eslintrc.js
# Not worth it.
actionTypes.js
actionTypes.ts

View File

@@ -16,10 +16,8 @@ jobs:
run: git status
- name: Normalize lang files to ensure sorted
run: npm run lang-sort
- name: Check git diff
run: git diff
- name: Check if the git repository is clean
run: exit $( git status --porcelain --untracked-files=no | head -255 | wc -l )
run: $(exit $(git status --porcelain --untracked-files=no | head -255 | wc -l)) || (echo "Dirty git tree"; git diff; exit 1)
- run: npm run lint
- run: for file in lang/*.json; do npx --yes jsonlint -q $file || exit 1; done
- run: make

View File

@@ -3,8 +3,8 @@ We would love to have your help. Before you start working however, please read
and follow this short guide.
# Reporting Issues
Provide as much information as possible. Mention the version of Jitsi Meet,
Jicofo and JVB you are using, and explain (as detailed as you can) how the
Provide as much information as possible. Mention the version of Jitsi Meet,
Jicofo and JVB you are using, and explain (as detailed as you can) how the
problem can be reproduced.
# Code contributions
@@ -130,7 +130,7 @@ When adding a new feature, this would be the usual layout.
```
react/features/sample/
├── actionTypes.js
├── actionTypes.ts
├── actions.js
├── components
│   ├── AnotherComponent.js

View File

@@ -2,13 +2,12 @@ BUILD_DIR = build
CLEANCSS = ./node_modules/.bin/cleancss
DEPLOY_DIR = libs
LIBJITSIMEET_DIR = node_modules/lib-jitsi-meet
LIBFLAC_DIR = node_modules/libflacjs/dist/min
OLM_DIR = node_modules/@matrix-org/olm
TF_WASM_DIR = node_modules/@tensorflow/tfjs-backend-wasm/dist/
RNNOISE_WASM_DIR = node_modules/rnnoise-wasm/dist
TFLITE_WASM = react/features/stream-effects/virtual-background/vendor/tflite
MEET_MODELS_DIR = react/features/stream-effects/virtual-background/vendor/models
FACIAL_MODELS_DIR = react/features/facial-recognition/resources
FACE_MODELS_DIR = node_modules/@vladmandic/human-models/models
NODE_SASS = ./node_modules/.bin/sass
NPM = npm
OUTPUT_DIR = .
@@ -20,17 +19,14 @@ WEBPACK_DEV_SERVER = ./node_modules/.bin/webpack serve --mode development
all: compile deploy clean
compile: compile-load-test
compile:
$(WEBPACK)
compile-load-test:
${NPM} install --prefix resources/load-test && ${NPM} run build --prefix resources/load-test
clean:
rm -fr $(BUILD_DIR)
.NOTPARALLEL:
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm deploy-tf-wasm deploy-css deploy-local deploy-facial-expressions
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-olm deploy-tf-wasm deploy-css deploy-local deploy-face-landmarks
deploy-init:
rm -fr $(DEPLOY_DIR)
@@ -44,8 +40,6 @@ deploy-appbundle:
$(BUILD_DIR)/do_external_connect.min.js.map \
$(BUILD_DIR)/external_api.min.js \
$(BUILD_DIR)/external_api.min.js.map \
$(BUILD_DIR)/flacEncodeWorker.min.js \
$(BUILD_DIR)/flacEncodeWorker.min.js.map \
$(BUILD_DIR)/dial_in_info_bundle.min.js \
$(BUILD_DIR)/dial_in_info_bundle.min.js.map \
$(BUILD_DIR)/alwaysontop.min.js \
@@ -53,10 +47,8 @@ deploy-appbundle:
$(OUTPUT_DIR)/analytics-ga.js \
$(BUILD_DIR)/analytics-ga.min.js \
$(BUILD_DIR)/analytics-ga.min.js.map \
$(BUILD_DIR)/face-centering-worker.min.js \
$(BUILD_DIR)/face-centering-worker.min.js.map \
$(BUILD_DIR)/facial-expressions-worker.min.js \
$(BUILD_DIR)/facial-expressions-worker.min.js.map \
$(BUILD_DIR)/face-landmarks-worker.min.js \
$(BUILD_DIR)/face-landmarks-worker.min.js.map \
$(DEPLOY_DIR)
cp \
$(BUILD_DIR)/close3.min.js \
@@ -72,12 +64,6 @@ deploy-lib-jitsi-meet:
$(LIBJITSIMEET_DIR)/modules/browser/capabilities.json \
$(DEPLOY_DIR)
deploy-libflac:
cp \
$(LIBFLAC_DIR)/libflac4-1.3.2.min.js \
$(LIBFLAC_DIR)/libflac4-1.3.2.min.js.mem \
$(DEPLOY_DIR)
deploy-olm:
cp \
$(OLM_DIR)/olm.wasm \
@@ -103,9 +89,12 @@ deploy-meet-models:
$(MEET_MODELS_DIR)/*.tflite \
$(DEPLOY_DIR)
deploy-facial-expressions:
deploy-face-landmarks:
cp \
$(FACIAL_MODELS_DIR)/* \
$(FACE_MODELS_DIR)/blazeface-front.bin \
$(FACE_MODELS_DIR)/blazeface-front.json \
$(FACE_MODELS_DIR)/emotion.bin \
$(FACE_MODELS_DIR)/emotion.json \
$(DEPLOY_DIR)
deploy-css:
@@ -117,7 +106,7 @@ deploy-local:
([ ! -x deploy-local.sh ] || ./deploy-local.sh)
.NOTPARALLEL:
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm deploy-tf-wasm deploy-facial-expressions
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-olm deploy-tf-wasm deploy-face-landmarks
$(WEBPACK_DEV_SERVER)
source-package:

View File

@@ -76,13 +76,7 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// https://github.com/facebook/react-native/issues/31572
// We can update past 1.4.0 on RN 0.68
implementation ('androidx.appcompat:appcompat:1.3.1') {
version {
strictly '1.3.1'
}
}
implementation 'androidx.appcompat:appcompat:1.4.1'
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'

View File

@@ -14,7 +14,7 @@
android:name="android.content.APP_RESTRICTIONS"
android:resource="@xml/app_restrictions" />
<activity
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTask"

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
android:insetTop="@dimen/abc_edit_text_inset_top_material"
android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">
<selector>
<!--
This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I).
The item below with state_pressed="false" and state_focused="false" causes a NullPointerException.
NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)'
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
For more info, see https://bit.ly/3CdLStv (react-native/pull/29452) and https://bit.ly/3nxOMoR.
-->
<item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
<item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
</selector>
</inset>

View File

@@ -1,7 +1,7 @@
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
<item name="android:forceDarkAllowed">false</item>
<item name="android:navigationBarColor">@color/colorPrimaryDark</item>
<item name="android:windowDisablePreview">true</item>
</style>

View File

@@ -1,4 +1,5 @@
import groovy.json.JsonSlurper
import org.apache.tools.ant.taskdefs.condition.Os
import org.gradle.util.VersionNumber
// Top-level build file where you can add configuration options common to all
@@ -10,19 +11,30 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
classpath 'com.android.tools.build:gradle:7.0.4'
classpath 'com.google.gms:google-services:4.3.10'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1'
}
}
ext {
buildToolsVersion = "30.0.3"
buildToolsVersion = "31.0.0"
compileSdkVersion = 31
minSdkVersion = 23
targetSdkVersion = 31
supportLibVersion = "28.0.0"
ndkVersion = "21.4.7075529"
if (System.properties['os.arch'] == "aarch64") {
// For M1 Users we need to use the NDK 24 which added support for aarch64
ndkVersion = "24.0.8215888"
} else if (Os.isFamily(Os.FAMILY_WINDOWS)) {
// For Android Users, we need to use NDK 23, otherwise the build will
// fail due to paths longer than the OS limit
ndkVersion = "23.1.7779620"
} else {
// Otherwise we default to the side-by-side NDK version from AGP.
ndkVersion = "21.4.7075529"
}
// The Maven artifact groupdId of the third-party react-native modules which
// Jitsi Meet SDK for Android depends on and which are not available in

View File

@@ -9,7 +9,7 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# Default value: -Xmx1024m -XX:MaxPermSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
@@ -26,5 +26,5 @@ android.useAndroidX=true
android.enableJetifier=true
android.bundle.enableUncompressedNativeLibs=false
appVersion=22.1.1
sdkVersion=5.0.2
appVersion=22.3.0
sdkVersion=5.2.0

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

269
android/gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/usr/bin/env sh
#!/bin/sh
#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,67 +17,101 @@
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum
warn () {
echo "$*"
}
} >&2
die () {
echo
echo "$*"
echo
exit 1
}
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -106,80 +140,95 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

View File

@@ -34,15 +34,8 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// https://github.com/facebook/react-native/issues/31572
// We can update past 1.4.0 on RN 0.68
implementation ('androidx.appcompat:appcompat:1.3.1') {
version {
strictly '1.3.1'
}
}
implementation 'androidx.fragment:fragment:1.4.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'androidx.fragment:fragment:1.4.1'
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
@@ -51,6 +44,7 @@ dependencies {
//noinspection GradleDynamicVersion
implementation 'org.webkit:android-jsc:+'
implementation 'com.facebook.fresco:animated-gif:2.5.0'
implementation 'com.dropbox.core:dropbox-core-sdk:4.0.1'
implementation 'com.jakewharton.timber:timber:4.7.1'
implementation 'com.squareup.duktape:duktape-android:1.3.0'
@@ -80,6 +74,7 @@ dependencies {
implementation project(':react-native-default-preference')
implementation project(':react-native-gesture-handler')
implementation project(':react-native-get-random-values')
implementation project(':react-native-giphy')
implementation project(':react-native-immersive')
implementation project(':react-native-keep-awake')
implementation project(':react-native-masked-view_masked-view')

View File

@@ -3,6 +3,6 @@
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application android:usesCleartextTraffic="true">
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false"/>
</application>
</manifest>

View File

@@ -30,7 +30,7 @@
android:supportsRtl="true">
<activity
android:name=".JitsiMeetActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"

View File

@@ -20,6 +20,7 @@ package org.jitsi.meet.sdk;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -93,7 +94,7 @@ public abstract class BaseReactView<ListenerT>
* inspired by postis which we use on Web for the similar purposes of the
* iframe-based external API.
*/
protected final String externalAPIScope;
protected String externalAPIScope;
/**
* The listener (e.g. {@link JitsiMeetViewListener}) instance for reporting
@@ -109,16 +110,17 @@ public abstract class BaseReactView<ListenerT>
public BaseReactView(@NonNull Context context) {
super(context);
initialize((Activity)context);
}
setBackgroundColor(BACKGROUND_COLOR);
public BaseReactView(Context context, AttributeSet attrs) {
super(context, attrs);
initialize((Activity)context);
}
ReactInstanceManagerHolder.initReactInstanceManager((Activity)context);
// Hook this BaseReactView into ExternalAPI.
externalAPIScope = UUID.randomUUID().toString();
synchronized (views) {
views.add(this);
}
public BaseReactView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initialize((Activity)context);
}
/**
@@ -223,4 +225,16 @@ public abstract class BaseReactView<ListenerT>
public void setListener(ListenerT listener) {
this.listener = listener;
}
private void initialize(Activity activity) {
setBackgroundColor(BACKGROUND_COLOR);
ReactInstanceManagerHolder.initReactInstanceManager(activity);
// Hook this BaseReactView into ExternalAPI.
externalAPIScope = UUID.randomUUID().toString();
synchronized (views) {
views.add(this);
}
}
}

View File

@@ -76,7 +76,8 @@ public class BroadcastAction {
OPEN_CHAT("org.jitsi.meet.OPEN_CHAT"),
CLOSE_CHAT("org.jitsi.meet.CLOSE_CHAT"),
SEND_CHAT_MESSAGE("org.jitsi.meet.SEND_CHAT_MESSAGE"),
SET_VIDEO_MUTED("org.jitsi.meet.SET_VIDEO_MUTED");
SET_VIDEO_MUTED("org.jitsi.meet.SET_VIDEO_MUTED"),
SET_CLOSED_CAPTIONS_ENABLED("org.jitsi.meet.SET_CLOSED_CAPTIONS_ENABLED");
private final String action;

View File

@@ -48,4 +48,10 @@ public class BroadcastIntentHelper {
intent.putExtra("muted", muted);
return intent;
}
public static Intent buildSetClosedCaptionsEnabledIntent(boolean enabled) {
Intent intent = new Intent(BroadcastAction.Type.SET_CLOSED_CAPTIONS_ENABLED.getAction());
intent.putExtra("enabled", enabled);
return intent;
}
}

View File

@@ -95,6 +95,7 @@ class ExternalAPIModule extends ReactContextBaseJavaModule {
constants.put("CLOSE_CHAT", BroadcastAction.Type.CLOSE_CHAT.getAction());
constants.put("SEND_CHAT_MESSAGE", BroadcastAction.Type.SEND_CHAT_MESSAGE.getAction());
constants.put("SET_VIDEO_MUTED", BroadcastAction.Type.SET_VIDEO_MUTED.getAction());
constants.put("SET_CLOSED_CAPTIONS_ENABLED", BroadcastAction.Type.SET_CLOSED_CAPTIONS_ENABLED.getAction());
return constants;
}

View File

@@ -16,6 +16,7 @@
package org.jitsi.meet.sdk;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -32,11 +33,16 @@ import com.facebook.react.modules.core.PermissionListener;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.util.HashMap;
import android.app.Activity;
/**
* A base activity for SDK users to embed. It uses {@link JitsiMeetFragment} to do the heavy
* lifting and wires the remaining Activity lifecycle methods so it works out of the box.
* A base activity for SDK users to embed. It contains all the required wiring
* between the {@code JitsiMeetView} and the Activity lifecycle methods.
*
* In this activity we use a single {@code JitsiMeetView} instance. This
* instance gives us access to a view which displays the welcome page and the
* conference itself. All lifecycle methods associated with this Activity are
* hooked to the React Native subsystem via proxy calls through the
* {@code JitsiMeetActivityDelegate} static methods.
*/
public class JitsiMeetActivity extends AppCompatActivity
implements JitsiMeetActivityInterface {
@@ -52,6 +58,12 @@ public class JitsiMeetActivity extends AppCompatActivity
onBroadcastReceived(intent);
}
};
/**
* Instance of the {@link JitsiMeetView} which this activity will display.
*/
private JitsiMeetView jitsiView;
// Helpers for starting the activity
//
@@ -79,6 +91,7 @@ public class JitsiMeetActivity extends AppCompatActivity
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jitsi_meet);
this.jitsiView = findViewById(R.id.jitsiView);
registerForBroadcastMessages();
@@ -87,6 +100,18 @@ public class JitsiMeetActivity extends AppCompatActivity
}
}
@Override
public void onResume() {
super.onResume();
JitsiMeetActivityDelegate.onHostResume(this);
}
@Override
public void onStop() {
JitsiMeetActivityDelegate.onHostPause(this);
super.onStop();
}
@Override
public void onDestroy() {
// Here we are trying to handle the following corner case: an application using the SDK
@@ -97,6 +122,9 @@ public class JitsiMeetActivity extends AppCompatActivity
// be operational so the external API won't be able to notify the native side that the
// conference terminated. Thus, try our best to clean up.
leave();
this.jitsiView = null;
if (AudioModeModule.useConnectionService()) {
ConnectionService.abortConnections();
}
@@ -104,6 +132,8 @@ public class JitsiMeetActivity extends AppCompatActivity
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);
JitsiMeetActivityDelegate.onHostDestroy(this);
super.onDestroy();
}
@@ -118,9 +148,7 @@ public class JitsiMeetActivity extends AppCompatActivity
//
protected JitsiMeetView getJitsiView() {
JitsiMeetFragment fragment
= (JitsiMeetFragment) getSupportFragmentManager().findFragmentById(R.id.jitsiFragment);
return fragment != null ? fragment.getJitsiView() : null;
return jitsiView;
}
public void join(@Nullable String url) {
@@ -132,20 +160,16 @@ public class JitsiMeetActivity extends AppCompatActivity
}
public void join(JitsiMeetConferenceOptions options) {
JitsiMeetView view = getJitsiView();
if (view != null) {
view.join(options);
if (this.jitsiView != null) {
this.jitsiView .join(options);
} else {
JitsiMeetLogger.w("Cannot join, view is null");
}
}
public void leave() {
JitsiMeetView view = getJitsiView();
if (view != null) {
view.leave();
if (this.jitsiView != null) {
this.jitsiView .leave();
} else {
JitsiMeetLogger.w("Cannot leave, view is null");
}
@@ -189,7 +213,7 @@ public class JitsiMeetActivity extends AppCompatActivity
protected void onConferenceJoined(HashMap<String, Object> extraData) {
JitsiMeetLogger.i("Conference joined: " + extraData);
// Launch the service for the ongoing notification.
JitsiMeetOngoingConferenceService.launch(this);
JitsiMeetOngoingConferenceService.launch(this, extraData);
}
protected void onConferenceTerminated(HashMap<String, Object> extraData) {
@@ -252,10 +276,8 @@ public class JitsiMeetActivity extends AppCompatActivity
@Override
protected void onUserLeaveHint() {
JitsiMeetView view = getJitsiView();
if (view != null) {
view.enterPictureInPicture();
if (this.jitsiView != null) {
this.jitsiView .enterPictureInPicture();
}
}

View File

@@ -17,7 +17,6 @@
package org.jitsi.meet.sdk;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -37,7 +36,10 @@ import android.view.ViewGroup;
* conference itself. All lifecycle methods associated with this Fragment are
* hooked to the React Native subsystem via proxy calls through the
* {@code JitsiMeetActivityDelegate} static methods.
*
* @deprecated use {@link JitsiMeetActivity} or directly {@link JitsiMeetView}
*/
@Deprecated
public class JitsiMeetFragment extends Fragment {
/**

View File

@@ -17,18 +17,22 @@
package org.jitsi.meet.sdk;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.util.HashMap;
/**
* This class implements an Android {@link Service}, a foreground one specifically, and it's
* responsible for presenting an ongoing notification when a conference is in progress.
@@ -39,23 +43,38 @@ import org.jitsi.meet.sdk.log.JitsiMeetLogger;
public class JitsiMeetOngoingConferenceService extends Service
implements OngoingConferenceTracker.OngoingConferenceListener {
private static final String TAG = JitsiMeetOngoingConferenceService.class.getSimpleName();
private static final String EXTRA_DATA_KEY = "extraDataKey";
private static final String EXTRA_DATA_BUNDLE_KEY = "extraDataBundleKey";
private static final String IS_AUDIO_MUTED_KEY = "isAudioMuted";
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver();
private boolean isAudioMuted;
static void launch(Context context) {
static void launch(Context context, HashMap<String, Object> extraData) {
OngoingNotification.createOngoingConferenceNotificationChannel();
Intent intent = new Intent(context, JitsiMeetOngoingConferenceService.class);
intent.setAction(Action.START.getName());
Bundle extraDataBundle = new Bundle();
extraDataBundle.putSerializable(EXTRA_DATA_KEY, extraData);
intent.putExtra(EXTRA_DATA_BUNDLE_KEY, extraDataBundle);
ComponentName componentName;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
componentName = context.startForegroundService(intent);
} else {
componentName = context.startService(intent);
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
componentName = context.startForegroundService(intent);
} else {
componentName = context.startService(intent);
}
} catch (RuntimeException e) {
// Avoid crashing due to ForegroundServiceStartNotAllowedException (API level 31).
// See: https://developer.android.com/guide/components/foreground-services#background-start-restrictions
JitsiMeetLogger.w(TAG + " Ongoing conference service not started", e);
return;
}
if (componentName == null) {
JitsiMeetLogger.w(TAG + " Ongoing conference service not started");
}
@@ -70,6 +89,15 @@ public class JitsiMeetOngoingConferenceService extends Service
public void onCreate() {
super.onCreate();
Notification notification = OngoingNotification.buildOngoingConferenceNotification(isAudioMuted);
if (notification == null) {
stopSelf();
JitsiMeetLogger.w(TAG + " Couldn't start service, notification is null");
} else {
startForeground(OngoingNotification.NOTIFICATION_ID, notification);
JitsiMeetLogger.i(TAG + " Service started");
}
OngoingConferenceTracker.getInstance().addListener(this);
IntentFilter intentFilter = new IntentFilter();
@@ -92,37 +120,45 @@ public class JitsiMeetOngoingConferenceService extends Service
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Boolean isAudioMuted = tryParseIsAudioMuted(intent);
if (isAudioMuted != null) {
this.isAudioMuted = Boolean.parseBoolean(intent.getStringExtra("muted"));
Notification notification = OngoingNotification.buildOngoingConferenceNotification(isAudioMuted);
if (notification == null) {
stopSelf();
JitsiMeetLogger.w(TAG + " Couldn't start service, notification is null");
} else {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(OngoingNotification.NOTIFICATION_ID, notification);
}
}
final String actionName = intent.getAction();
final Action action = Action.fromName(actionName);
switch (action) {
case UNMUTE:
case MUTE:
Intent muteBroadcastIntent = BroadcastIntentHelper.buildSetAudioMutedIntent(action == Action.MUTE);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(muteBroadcastIntent);
break;
case START:
Notification notification = OngoingNotification.buildOngoingConferenceNotification(isAudioMuted);
if (notification == null) {
// When starting the service, there is no action passed in the intent
if (action != null) {
switch (action) {
case UNMUTE:
case MUTE:
Intent muteBroadcastIntent = BroadcastIntentHelper.buildSetAudioMutedIntent(action == Action.MUTE);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(muteBroadcastIntent);
break;
case HANGUP:
JitsiMeetLogger.i(TAG + " Hangup requested");
Intent hangupBroadcastIntent = BroadcastIntentHelper.buildHangUpIntent();
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(hangupBroadcastIntent);
stopSelf();
JitsiMeetLogger.w(TAG + " Couldn't start service, notification is null");
} else {
startForeground(OngoingNotification.NOTIFICATION_ID, notification);
JitsiMeetLogger.i(TAG + " Service started");
}
break;
case HANGUP:
JitsiMeetLogger.i(TAG + " Hangup requested");
Intent hangupBroadcastIntent = BroadcastIntentHelper.buildHangUpIntent();
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(hangupBroadcastIntent);
stopSelf();
break;
default:
JitsiMeetLogger.w(TAG + " Unknown action received: " + action);
stopSelf();
break;
break;
default:
JitsiMeetLogger.w(TAG + " Unknown action received: " + action);
break;
}
}
return START_NOT_STICKY;
@@ -138,7 +174,6 @@ public class JitsiMeetOngoingConferenceService extends Service
}
public enum Action {
START(TAG + ":START"),
HANGUP(TAG + ":HANGUP"),
MUTE(TAG + ":MUTE"),
UNMUTE(TAG + ":UNMUTE");
@@ -163,6 +198,15 @@ public class JitsiMeetOngoingConferenceService extends Service
}
}
private Boolean tryParseIsAudioMuted(Intent intent) {
try {
HashMap<String, Object> extraData = (HashMap<String, Object>) intent.getBundleExtra(EXTRA_DATA_BUNDLE_KEY).getSerializable(EXTRA_DATA_KEY);
return Boolean.parseBoolean((String) extraData.get(IS_AUDIO_MUTED_KEY));
} catch (Exception ignored) {
}
return null;
}
private class BroadcastReceiver extends android.content.BroadcastReceiver {
@Override
@@ -171,10 +215,12 @@ public class JitsiMeetOngoingConferenceService extends Service
Notification notification = OngoingNotification.buildOngoingConferenceNotification(isAudioMuted);
if (notification == null) {
stopSelf();
JitsiMeetLogger.w(TAG + " Couldn't start service, notification is null");
JitsiMeetLogger.w(TAG + " Couldn't update service, notification is null");
} else {
startForeground(OngoingNotification.NOTIFICATION_ID, notification);
JitsiMeetLogger.i(TAG + " Service started");
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(OngoingNotification.NOTIFICATION_ID, notification);
JitsiMeetLogger.i(TAG + " audio muted changed");
}
}
}

View File

@@ -18,17 +18,19 @@ package org.jitsi.meet.sdk;
import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReadableMap;
import com.oney.WebRTCModule.WebRTCModule;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.lang.reflect.Method;
import java.util.Map;
public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
implements OngoingConferenceTracker.OngoingConferenceListener {
@@ -95,14 +97,17 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
public JitsiMeetView(@NonNull Context context) {
super(context);
initialize(context);
}
// Check if the parent Activity implements JitsiMeetActivityInterface,
// otherwise things may go wrong.
if (!(context instanceof JitsiMeetActivityInterface)) {
throw new RuntimeException("Enclosing Activity must implement JitsiMeetActivityInterface");
}
public JitsiMeetView(Context context, AttributeSet attrs) {
super(context, attrs);
initialize(context);
}
OngoingConferenceTracker.getInstance().addListener(this);
public JitsiMeetView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initialize(context);
}
@Override
@@ -121,18 +126,14 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
* page.
*/
public void enterPictureInPicture() {
PictureInPictureModule pipModule
= ReactInstanceManagerHolder.getNativeModule(
PictureInPictureModule.class);
if (pipModule != null
&& pipModule.isPictureInPictureSupported()
&& !JitsiMeetActivityDelegate.arePermissionsBeingRequested()
&& this.url != null) {
try {
pipModule.enterPictureInPicture();
} catch (RuntimeException re) {
JitsiMeetLogger.e(re, "Failed to enter PiP mode");
}
try {
WebRTCModule pipModule
= ReactInstanceManagerHolder.getNativeModule(
WebRTCModule.class);
pipModule.addDecryptors();
}
catch (Exception e) {
int a = 1;
}
}
@@ -207,4 +208,14 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
dispose();
super.onDetachedFromWindow();
}
private void initialize(@NonNull Context context) {
// Check if the parent Activity implements JitsiMeetActivityInterface,
// otherwise things may go wrong.
if (!(context instanceof JitsiMeetActivityInterface)) {
throw new RuntimeException("Enclosing Activity must implement JitsiMeetActivityInterface");
}
OngoingConferenceTracker.getInstance().addListener(this);
}
}

View File

@@ -28,6 +28,7 @@ import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.module.annotations.ReactModule;
import com.oney.WebRTCModule.WebRTCModule;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
@@ -43,7 +44,7 @@ class PictureInPictureModule extends ReactContextBaseJavaModule {
private static final String TAG = NAME;
private static boolean isSupported;
private boolean isDisabled;
private boolean isEnabled;
public PictureInPictureModule(ReactApplicationContext reactContext) {
super(reactContext);
@@ -84,34 +85,10 @@ class PictureInPictureModule extends ReactContextBaseJavaModule {
*/
@TargetApi(Build.VERSION_CODES.O)
public void enterPictureInPicture() {
if (isDisabled) {
return;
}
if (!isSupported) {
throw new IllegalStateException("Picture-in-Picture not supported");
}
Activity currentActivity = getCurrentActivity();
if (currentActivity == null) {
throw new IllegalStateException("No current Activity!");
}
JitsiMeetLogger.i(TAG + " Entering Picture-in-Picture");
PictureInPictureParams.Builder builder
= new PictureInPictureParams.Builder()
.setAspectRatio(new Rational(1, 1));
// https://developer.android.com/reference/android/app/Activity.html#enterPictureInPictureMode(android.app.PictureInPictureParams)
//
// The system may disallow entering picture-in-picture in various cases,
// including when the activity is not visible, if the screen is locked
// or if the user has an activity pinned.
if (!currentActivity.enterPictureInPictureMode(builder.build())) {
throw new RuntimeException("Failed to enter Picture-in-Picture");
}
WebRTCModule pipModule
= ReactInstanceManagerHolder.getNativeModule(
WebRTCModule.class);
pipModule.addDecryptors();
}
/**
@@ -123,17 +100,15 @@ class PictureInPictureModule extends ReactContextBaseJavaModule {
*/
@ReactMethod
public void enterPictureInPicture(Promise promise) {
try {
enterPictureInPicture();
promise.resolve(null);
} catch (RuntimeException re) {
promise.reject(re);
}
WebRTCModule pipModule
= ReactInstanceManagerHolder.getNativeModule(
WebRTCModule.class);
pipModule.addDecryptors();
}
@ReactMethod
public void setPictureInPictureDisabled(Boolean disabled) {
this.isDisabled = disabled;
public void setPictureInPictureEnabled(Boolean enabled) {
this.isEnabled = enabled;
}
public boolean isPictureInPictureSupported() {

View File

@@ -35,6 +35,8 @@ import com.oney.WebRTCModule.RTCVideoViewManager;
import com.oney.WebRTCModule.WebRTCModule;
import org.devio.rn.splashscreen.SplashScreenModule;
import org.webrtc.Loggable;
import org.webrtc.Logging;
import org.webrtc.SoftwareVideoDecoderFactory;
import org.webrtc.SoftwareVideoEncoderFactory;
import org.webrtc.audio.AudioDeviceModule;
@@ -57,6 +59,13 @@ class ReactInstanceManagerHolder {
*/
private static ReactInstanceManager reactInstanceManager;
private static Loggable webrtcLogger = new Loggable() {
@Override
public void onLogMessage(String message, Logging.Severity severity, String tag) {
Log.d(tag,message);
}
};
private static List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> nativeModules
= new ArrayList<>(Arrays.<NativeModule>asList(
@@ -88,6 +97,8 @@ class ReactInstanceManagerHolder {
options.setVideoDecoderFactory(new SoftwareVideoDecoderFactory());
options.setVideoEncoderFactory(new SoftwareVideoEncoderFactory());
options.setInjectableLogger(webrtcLogger);
options.setLoggingSeverity(Logging.Severity.LS_VERBOSE);
nativeModules.add(new WebRTCModule(reactContext, options));
@@ -110,6 +121,7 @@ class ReactInstanceManagerHolder {
new com.corbt.keepawake.KCKeepAwakePackage(),
new com.facebook.react.shell.MainReactPackage(),
new com.reactnativecommunity.clipboard.ClipboardPackage(),
new com.giphyreactnativesdk.GiphyReactNativeSdkPackage(),
new com.reactnativecommunity.netinfo.NetInfoPackage(),
new com.reactnativepagerview.PagerViewPackage(),
new com.oblador.performance.PerformancePackage(),

View File

@@ -1,12 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/jitsi_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".JitsiMeetActivity">
<fragment
<org.jitsi.meet.sdk.JitsiMeetView
android:id="@+id/jitsiView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="org.jitsi.meet.sdk.JitsiMeetFragment"
android:id="@+id/jitsiFragment"/>
android:layout_height="match_parent" />
</FrameLayout>

View File

@@ -1,6 +1,8 @@
rootProject.name = 'jitsi-meet'
include ':app', ':sdk'
includeBuild('../node_modules/react-native-gradle-plugin')
include ':react-native-amplitude'
project(':react-native-amplitude').projectDir = new File(rootProject.projectDir, '../node_modules/@amplitude/react-native//android')
include ':react-native-async-storage'
@@ -21,6 +23,8 @@ include ':react-native-gesture-handler'
project(':react-native-gesture-handler').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-gesture-handler/android')
include ':react-native-get-random-values'
project(':react-native-get-random-values').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-get-random-values/android')
include ':react-native-giphy'
project(':react-native-giphy').projectDir = new File(rootProject.projectDir, '../node_modules/@giphy/react-native-sdk/android')
include ':react-native-google-signin'
project(':react-native-google-signin').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-google-signin/google-signin/android')
include ':react-native-immersive'

View File

@@ -37,6 +37,7 @@ import {
commonUserLeftHandling,
conferenceFailed,
conferenceJoined,
conferenceJoinInProgress,
conferenceLeft,
conferenceSubjectChanged,
conferenceTimestampChanged,
@@ -44,6 +45,7 @@ import {
conferenceWillJoin,
conferenceWillLeave,
dataChannelOpened,
e2eRttChanged,
getConferenceOptions,
kickedOut,
lockStateChanged,
@@ -52,7 +54,10 @@ import {
sendLocalParticipant,
nonParticipantMessageReceived
} from './react/features/base/conference';
import { getReplaceParticipant, getMultipleVideoSupportFeatureFlag } from './react/features/base/config/functions';
import {
getReplaceParticipant,
getMultipleVideoSendingSupportFeatureFlag
} from './react/features/base/config/functions';
import {
checkAndNotifyForNewDevice,
getAvailableDevices,
@@ -64,16 +69,17 @@ import {
} from './react/features/base/devices';
import {
browser,
isFatalJitsiConnectionError,
JitsiConferenceErrors,
JitsiConferenceEvents,
JitsiConnectionErrors,
JitsiConnectionEvents,
JitsiE2ePingEvents,
JitsiMediaDevicesEvents,
JitsiParticipantConnectionStatus,
JitsiTrackErrors,
JitsiTrackEvents
} from './react/features/base/lib-jitsi-meet';
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
import {
getStartWithAudioMuted,
getStartWithVideoMuted,
@@ -90,6 +96,7 @@ import {
dominantSpeakerChanged,
getLocalParticipant,
getNormalizedDisplayName,
getVirtualScreenshareParticipantByOwnerId,
localParticipantAudioLevelChanged,
localParticipantConnectionStatusChanged,
localParticipantRoleChanged,
@@ -99,6 +106,7 @@ import {
participantPresenceChanged,
participantRoleChanged,
participantUpdated,
screenshareParticipantDisplayNameChanged,
updateRemoteParticipantFeatures
} from './react/features/base/participants';
import {
@@ -140,8 +148,7 @@ import {
initPrejoin,
isPrejoinPageVisible,
makePrecallTest,
setJoiningInProgress,
setPrejoinPageVisibility
setJoiningInProgress
} from './react/features/prejoin';
import { disableReceiver, stopReceiver } from './react/features/remote-control';
import { setScreenAudioShareState, isScreenAudioShared } from './react/features/screen-share/';
@@ -916,6 +923,35 @@ export default {
: isVideoMutedByUser(APP.store);
},
/**
* Verify if there is an ongoing system audio sharing session and apply to the provided track
* as a AudioMixer effect.
*
* @param {*} localAudioTrack - track to which system audio track will be applied as an effect, most likely
* microphone local audio track.
*/
async _maybeApplyAudioMixerEffect(localAudioTrack) {
// At the time of writing this comment there were two separate flows for toggling screen-sharing
// and system audio sharing, the first is the legacy method using the functionality from conference.js
// the second is used when both sendMultipleVideoStreams and sourceNameSignaling flags are set to true.
// The second flow uses functionality from base/conference/middleware.web.js.
// We check if system audio sharing was done using the first flow by verifying this._desktopAudioStream and
// for the second by checking 'features/screen-share' state.
const { desktopAudioTrack } = APP.store.getState()['features/screen-share'];
const currentDesktopAudioTrack = this._desktopAudioStream || desktopAudioTrack;
// If system audio is already being sent, mix it with the provided audio track.
if (currentDesktopAudioTrack) {
// In case system audio sharing was done in the absence of an initial mic audio track, there is no
// AudioMixerEffect so we have to remove system audio track from the room before setting it as an effect.
await room.replaceTrack(currentDesktopAudioTrack, null);
this._mixerEffect = new AudioMixerEffect(currentDesktopAudioTrack);
logger.debug('Mixing new audio track with existing screen audio track.');
await localAudioTrack.setEffect(this._mixerEffect);
}
},
/**
* Simulates toolbar button click for audio mute. Used by shortcuts and API.
* @param {boolean} mute true for mute and false for unmute.
@@ -969,7 +1005,11 @@ export default {
// Rollback the audio muted status by using null track
return null;
})
.then(audioTrack => this.useAudioStream(audioTrack));
.then(async audioTrack => {
await this._maybeApplyAudioMixerEffect(audioTrack);
this.useAudioStream(audioTrack);
});
} else {
muteLocalAudio(mute);
}
@@ -1464,7 +1504,7 @@ export default {
// In the multi-stream mode, add the track to the conference if there is no existing track, replace it
// otherwise.
if (getMultipleVideoSupportFeatureFlag(state)) {
if (getMultipleVideoSendingSupportFeatureFlag(state)) {
const trackAction = oldTrack
? replaceLocalTrack(oldTrack, newTrack, room)
: addLocalTrack(newTrack);
@@ -1610,12 +1650,26 @@ export default {
let promise = _prevMutePresenterVideo = _prevMutePresenterVideo.then(() => {
// mute the presenter track if it exists.
if (this.localPresenterVideo) {
APP.store.dispatch(setVideoMuted(true, MEDIA_TYPE.PRESENTER));
return (
this.localPresenterVideo.dispose().then(() => {
APP.store.dispatch(trackRemoved(this.localPresenterVideo));
this.localPresenterVideo = null;
})
.then(() => {
return this.localPresenterVideo.dispose().then(() => {
APP.store.dispatch(trackRemoved(this.localPresenterVideo));
this.localPresenterVideo = null;
});
// This is needed only for setting the correct muted state in features/base/media.
// NOTE: It is important to be executed after we have disposed and removed the presenter track.
// This way all the side effects won't be executed and we won't start additional O/A cycle for
// replacing the track with video with the one without video. This O/A cycle is not needed since
// we are trying to destroy all tracks. Also due to the current async nature of muting the
// presenter, the final removal of the screen sharing track (see the code at the end of the
// function) can be executed between the removal of the stream with video and adding the
// original screen sharing stream to the peer connection. This will lead to a failure to remove
// the screen sharing track, compromising the screen sharing state in jitsi-meet and the user
// won't be able to turn off the screen sharing.
APP.store.dispatch(setVideoMuted(true, MEDIA_TYPE.PRESENTER));
})
);
}
});
@@ -1631,35 +1685,39 @@ export default {
// In case there was no local audio when screen sharing was started the fact that we set the audio stream to
// null will take care of the desktop audio stream cleanup.
} else if (this._desktopAudioStream) {
await this.useAudioStream(null);
await room.replaceTrack(this._desktopAudioStream, null);
this._desktopAudioStream.dispose();
this._desktopAudioStream = undefined;
}
APP.store.dispatch(setScreenAudioShareState(false));
promise = promise.then(() => createLocalTracksF({ devices: [ 'video' ] }))
.then(([ stream ]) => {
logger.debug(`_turnScreenSharingOff using ${stream} for useVideoStream`);
if (didHaveVideo && !ignoreDidHaveVideo) {
promise = promise.then(() => createLocalTracksF({ devices: [ 'video' ] }))
.then(([ stream ]) => {
logger.debug(`_turnScreenSharingOff using ${stream} for useVideoStream`);
return this.useVideoStream(stream);
})
.catch(error => {
logger.error('failed to switch back to local video', error);
return this.useVideoStream(stream);
})
.catch(error => {
logger.error('failed to switch back to local video', error);
return this.useVideoStream(null).then(() =>
return this.useVideoStream(null).then(() =>
// Still fail with the original err
Promise.reject(error)
);
// Still fail with the original err
Promise.reject(error)
);
});
} else {
promise = promise.then(() => {
logger.debug('_turnScreenSharingOff using null for useVideoStream');
return this.useVideoStream(null);
});
}
return promise.then(
() => {
// Mute the video if camera video needs to be ignored or if video was muted before switching to screen
// share.
if (ignoreDidHaveVideo || !didHaveVideo) {
APP.store.dispatch(setVideoMuted(true, MEDIA_TYPE.VIDEO));
}
this.videoSwitchInProgress = false;
sendAnalytics(createScreenSharingEvent('stopped',
duration === 0 ? null : duration));
@@ -1701,12 +1759,12 @@ export default {
return Promise.reject('Cannot toggle screen sharing: not supported.');
}
if (this.isAudioOnly()) {
APP.store.dispatch(setAudioOnly(false));
}
if (toggle) {
try {
await this._switchToScreenSharing(options);
if (this.isAudioOnly()) {
APP.store.dispatch(setAudioOnly(false));
}
return;
} catch (err) {
@@ -1971,9 +2029,9 @@ export default {
} else {
// If no local stream is present ( i.e. no input audio devices) we use the screen share audio
// stream as we would use a regular stream.
logger.debug(`_switchToScreenSharing is using ${this._desktopAudioStream} for useAudioStream`);
await this.useAudioStream(this._desktopAudioStream);
logger.debug(`_switchToScreenSharing is using ${this._desktopAudioStream} for replacing it as`
+ ' the only audio track on the conference');
await room.replaceTrack(null, this._desktopAudioStream);
}
APP.store.dispatch(setScreenAudioShareState(true));
}
@@ -2062,9 +2120,9 @@ export default {
room.on(JitsiConferenceEvents.CONFERENCE_JOINED, () => {
this._onConferenceJoined();
});
room.on(JitsiConferenceEvents.CONFERENCE_JOIN_IN_PROGRESS, () => {
APP.store.dispatch(setPrejoinPageVisibility(false));
});
room.on(
JitsiConferenceEvents.CONFERENCE_JOIN_IN_PROGRESS,
() => APP.store.dispatch(conferenceJoinInProgress(room)));
room.on(
JitsiConferenceEvents.CONFERENCE_LEFT,
@@ -2252,6 +2310,15 @@ export default {
id,
name: formattedDisplayName
}));
const virtualScreenshareParticipantId = getVirtualScreenshareParticipantByOwnerId(state, id)?.id;
if (virtualScreenshareParticipantId) {
APP.store.dispatch(
screenshareParticipantDisplayNameChanged(virtualScreenshareParticipantId, formattedDisplayName)
);
}
APP.API.notifyDisplayNameChanged(id, {
displayName: formattedDisplayName,
formattedDisplayName:
@@ -2340,6 +2407,10 @@ export default {
APP.store.dispatch(setVideoUnmutePermissions(disableVideoMuteChange));
});
room.on(
JitsiE2ePingEvents.E2E_RTT_CHANGED,
(...args) => APP.store.dispatch(e2eRttChanged(...args)));
APP.UI.addListener(UIEvents.AUDIO_MUTED, muted => {
this.muteAudio(muted);
});
@@ -2548,13 +2619,7 @@ export default {
return stream;
})
.then(async stream => {
// In case screen sharing audio is also shared we mix it with new input stream. The old _mixerEffect
// will be cleaned up when the existing track is replaced.
if (this._mixerEffect) {
this._mixerEffect = new AudioMixerEffect(this._desktopAudioStream);
await stream.setEffect(this._mixerEffect);
}
await this._maybeApplyAudioMixerEffect(stream);
return this.useAudioStream(stream);
})
@@ -2588,12 +2653,9 @@ export default {
// muteVideo logic in such case.
const tracks = APP.store.getState()['features/base/tracks'];
const isTrackInRedux
= Boolean(
tracks.find(
track => track.jitsiTrack
&& track.jitsiTrack.getType() === 'video'));
= Boolean(tracks.find(track => track.jitsiTrack && track.jitsiTrack.getType() === MEDIA_TYPE.VIDEO));
if (!isTrackInRedux) {
if (isTrackInRedux && !this.isSharingScreen) {
this.muteVideo(audioOnly);
}
@@ -3106,15 +3168,6 @@ export default {
room.sendEndpointMessage(to, payload);
},
/**
* Sends a facial expression as a string and its duration as a number
* @param {object} payload - Object containing the {string} facialExpression
* and {number} duration
*/
sendFacialExpression(payload) {
room.sendFacialExpression(payload);
},
/**
* Adds new listener.
* @param {String} eventName the name of the event

153
config.js
View File

@@ -1,6 +1,11 @@
/* eslint-disable no-unused-vars, no-var */
/*
* NOTE: If you add a new option please remember to document it here:
* https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-configuration
*/
var config = {
// Connection
//
@@ -69,6 +74,11 @@ var config = {
// or disabled for the screenshare.
// capScreenshareBitrate: 1 // 0 to disable - deprecated.
// Whether to use fake constraints (height: 99999, width: 99999) when calling getDisplayMedia on
// Chromium based browsers. This is intended as a workaround for
// https://bugs.chromium.org/p/chromium/issues/detail?id=1056311
// setScreenSharingResolutionConstraints: true
// Enable callstats only for a percentage of users.
// This takes a value between 0 and 100 which determines the probability for
// the callstats to be enabled.
@@ -79,6 +89,10 @@ var config = {
flags: {
// Enables source names in the signaling.
// sourceNameSignaling: false,
// Enables sending multiple video streams, i.e., camera and desktop tracks can be shared in the conference
// separately as two different streams instead of one composite stream.
// sendMultipleVideoStreams: false
},
// Disables moderator indicators.
@@ -281,6 +295,14 @@ var config = {
// Whether to enable live streaming or not.
// liveStreamingEnabled: false,
// Local recording configuration.
// localRecording: {
// // Whether to disable local recording or not.
// disable: false,
// // Whether to notify all participants when a participant is recording locally.
// notifyAllParticipants: false
// },
// Transcription (in interface_config,
// subtitles and buttons can be configured)
// transcribingEnabled: false,
@@ -545,6 +567,10 @@ var config = {
// // When 'true', it shows an intermediate page before joining, where the user can configure their devices.
// // This replaces `prejoinPageEnabled`.
// enabled: true,
// // Hides the participant name editing field in the prejoin screen.
// // If requireDisplayName is also set as true, a name should still be provided through
// // either the jwt or the userInfo from the iframe api init object in order for this to have an effect.
// hideDisplayName: false,
// // List of buttons to hide from the extra join options dropdown.
// hideExtraJoinButtons: ['no-audio', 'by-phone']
// },
@@ -572,8 +598,17 @@ var config = {
// Array with avatar URL prefixes that need to use CORS.
// corsAvatarURLs: [ 'https://www.gravatar.com/avatar/' ],
// Base URL for a Gravatar-compatible service. Defaults to libravatar.
// gravatarBaseURL: 'https://seccdn.libravatar.org/avatar/',
// Base URL for a Gravatar-compatible service. Defaults to Gravatar.
// DEPRECATED! Use `gravatar.baseUrl` instead.
// gravatarBaseURL: 'https://www.gravatar.com/avatar/',
// Setup for Gravatar-compatible services.
// gravatar: {
// // Defaults to Gravatar.
// baseUrl: 'https://www.gravatar.com/avatar/',
// // True if Gravatar should be disabled.
// disabled: false
// },
// App name to be displayed in the invitation email subject, as an alternative to
// interfaceConfig.APP_NAME.
@@ -595,6 +630,7 @@ var config = {
// 'chat',
// 'closedcaptions',
// 'desktop',
// 'dock-iframe'
// 'download',
// 'embedmeeting',
// 'etherpad',
@@ -608,8 +644,6 @@ var config = {
// 'linktosalesforce',
// 'livestreaming',
// 'microphone',
// 'mute-everyone',
// 'mute-video-everyone',
// 'participants-pane',
// 'profile',
// 'raisehand',
@@ -623,6 +657,7 @@ var config = {
// 'stats',
// 'tileview',
// 'toggle-camera',
// 'undock-iframe',
// 'videoquality',
// '__end'
// ],
@@ -748,21 +783,24 @@ var config = {
// Enables sending participants' emails (if available) to callstats and other analytics
// enableEmailInStats: false,
// Enables detecting faces of participants and get their expression and send it to other participants
// enableFacialRecognition: true,
// faceLandmarks: {
// // Enables sharing your face coordinates. Used for centering faces within a video.
// enableFaceCentering: false,
// Enables displaying facial expressions in speaker stats
// enableDisplayFacialExpressions: true,
// // Enables detecting face expressions and sharing data with other participants
// enableFaceExpressionsDetection: false,
// faceCoordinatesSharing: {
// // Enables sharing your face cordinates. Used for centering faces within a video.
// enabled: false,
// // Enables displaying face expressions in speaker stats
// enableDisplayFaceExpressions: false,
// // Minimum required face movement percentage threshold for sending new face coordinates data.
// threshold: 10,
// // Enable rtc stats for face landmarks
// enableRTCStats: false,
// // Miliseconds for processing a new image capture in order to detect face coordinates if they exist.
// captureInterval: 100
// // Minimum required face movement percentage threshold for sending new face centering coordinates data.
// faceCenteringThreshold: 10,
// // Milliseconds for processing a new image capture in order to detect face coordinates if they exist.
// captureInterval: 1000
// },
// Controls the percentage of automatic feedback shown to participants when callstats is enabled.
@@ -842,6 +880,10 @@ var config = {
// The Amplitude APP Key:
// amplitudeAPPKey: '<APP_KEY>'
// Obfuscates room name sent to analytics (amplitude, rtcstats)
// Default value is false.
// obfuscateRoomName: false,
// Configuration for the rtcstats server:
// By enabling rtcstats server every time a conference is joined the rtcstats
// module connects to the provided rtcstatsEndpoint and sends statistics regarding
@@ -916,33 +958,22 @@ var config = {
// chromeExtensionBanner: {
// // The chrome extension to be installed address
// url: 'https://chrome.google.com/webstore/detail/jitsi-meetings/kglhbbefdnlheedjiejgomgmfplipfeb',
// edgeUrl: 'https://microsoftedge.microsoft.com/addons/detail/jitsi-meetings/eeecajlpbgjppibfledfihobcabccihn',
// // Extensions info which allows checking if they are installed or not
// chromeExtensionsInfo: [
// {
// id: 'kglhbbefdnlheedjiejgomgmfplipfeb',
// path: 'jitsi-logo-48x48.png'
// },
// // Edge extension info
// {
// id: 'eeecajlpbgjppibfledfihobcabccihn',
// path: 'jitsi-logo-48x48.png'
// }
// ]
// },
// Local Recording
//
// localRecording: {
// Enables local recording.
// Additionally, 'localrecording' (all lowercase) needs to be added to
// the `toolbarButtons`-array for the Local Recording button to show up
// on the toolbar.
//
// enabled: true,
//
// The recording format, can be one of 'ogg', 'flac' or 'wav'.
// format: 'flac'
//
// },
// e2ee: {
// labels,
// externallyManagedKey: false
@@ -950,14 +981,18 @@ var config = {
// Options related to end-to-end (participant to participant) ping.
// e2eping: {
// // The interval in milliseconds at which pings will be sent.
// // Defaults to 10000, set to <= 0 to disable.
// pingInterval: 10000,
// // Whether ene-to-end pings should be enabled.
// enabled: false,
//
// // The interval in milliseconds at which analytics events
// // with the measured RTT will be sent. Defaults to 60000, set
// // to <= 0 to disable.
// analyticsInterval: 60000,
// // The number of responses to wait for.
// numRequests: 5,
//
// // The max conference size in which e2e pings will be sent.
// maxConferenceSize: 200,
//
// // The maximum number of e2e ping messages per second for the whole conference to aim for.
// // This is used to contol the pacing of messages in order to reduce the load on the backend.
// maxMessagesPerSecond: 250
// },
// If set, will attempt to use the provided video input device label when
@@ -984,7 +1019,8 @@ var config = {
// Disables all invite functions from the app (share, invite, dial out...etc)
// disableInviteFunctions: true,
// Disables storing the room name to the recents list
// Disables storing the room name to the recents list. When in an iframe this is ignored and
// the room is never stored in the recents list.
// doNotStoreRoom: true,
// Deployment specific URLs.
@@ -1081,10 +1117,22 @@ var config = {
*/
// dynamicBrandingUrl: '',
// Options related to the participants pane.
// participantsPane: {
// // Hides the moderator settings tab.
// hideModeratorSettingsTab: false,
// // Hides the more actions button.
// hideMoreActionsButton: false,
// // Hides the mute all button.
// hideMuteAllButton: false
// },
// Options related to the breakout rooms feature.
// breakoutRooms: {
// // Hides the add breakout room button. This replaces `hideAddRoomButton`.
// hideAddRoomButton: false,
// // Hides the auto assign participants button.
// hideAutoAssignButton: false,
// // Hides the join breakout room button.
// hideJoinRoomButton: false
// },
@@ -1115,7 +1163,7 @@ var config = {
// If a label's id is not in any of the 2 arrays, it will not be visible at all on the header.
// conferenceInfo: {
// // those labels will not be hidden in tandem with the toolbox.
// alwaysVisible: ['recording', 'local-recording', 'raised-hands-count'],
// alwaysVisible: ['recording', 'raised-hands-count'],
// // those labels will be auto-hidden in tandem with the toolbox buttons.
// autoHide: [
// 'subject',
@@ -1159,14 +1207,24 @@ var config = {
// will open an etherpad document.
// etherpad_base: 'https://your-etherpad-installati.on/p/',
// To enable information about dial-in access to meetings you need to provide
// dialInNumbersUrl and dialInConfCodeUrl.
// dialInNumbersUrl returns a json array of numbers that can be used for dial-in.
// {"countryCode":"US","tollFree":false,"formattedNumber":"+1 123-456-7890"}
// dialInConfCodeUrl is the conference mapper converting a meeting id to a PIN used for dial-in
// or the other way around (more info in resources/cloud-api.swagger)
//
// For JaaS customers the default values are:
// dialInNumbersUrl: 'https://conference-mapper.jitsi.net/v1/access/dids',
// dialInConfCodeUrl: 'https://conference-mapper.jitsi.net/v1/access',
//
// List of undocumented settings used in jitsi-meet
/**
_immediateReloadThreshold
debug
debugAudioLevels
deploymentInfo
dialInConfCodeUrl
dialInNumbersUrl
dialOutAuthUrl
dialOutCodesUrl
disableRemoteControl
@@ -1251,7 +1309,6 @@ var config = {
// 'liveStreaming.unavailableTitle', // shown when livestreaming service is not reachable
// 'lobby.joinRejectedMessage', // shown when while in a lobby, user's request to join is rejected
// 'lobby.notificationTitle', // shown when lobby is toggled and when join requests are allowed / denied
// 'localRecording.localRecording', // shown when a local recording is started
// 'notify.chatMessages', // shown when receiving chat messages while the chat window is closed
// 'notify.disconnected', // shown when a participant has left
// 'notify.connectedOneMember', // show when a participant joined
@@ -1297,6 +1354,9 @@ var config = {
// 'transcribing.failedToStart' // shown when transcribing fails to start
// ],
// List of notifications to be disabled. Works in tandem with the above setting.
// disabledNotifications: [],
// Prevent the filmstrip from autohiding when screen width is under a certain threshold
// disableFilmstripAutohiding: false,
@@ -1304,6 +1364,10 @@ var config = {
// // Disables user resizable filmstrip. Also, allows configuration of the filmstrip
// // (width, tiles aspect ratios) through the interfaceConfig options.
// disableResizable: false,
// // Disables the stage filmstrip
// // (displaying multiple participants on stage besides the vertical filmstrip)
// disableStageFilmstrip: false
// },
// Tile view related config options.
@@ -1313,7 +1377,6 @@ var config = {
// numberOfVisibleTiles: 25
// },
// Specifies whether the chat emoticons are disabled or not
// disableChatSmileys: false,

View File

@@ -8,18 +8,22 @@ import { LoginDialog } from './react/features/authentication/components';
import { isTokenAuthEnabled } from './react/features/authentication/functions';
import {
connectionEstablished,
connectionFailed
connectionFailed,
constructOptions
} from './react/features/base/connection/actions';
import { openDialog } from './react/features/base/dialog/actions';
import { setJWT } from './react/features/base/jwt';
import {
isFatalJitsiConnectionError,
JitsiConnectionErrors,
JitsiConnectionEvents
} from './react/features/base/lib-jitsi-meet';
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
import { getCustomerDetails } from './react/features/jaas/actions.any';
import { isVpaasMeeting, getJaasJWT } from './react/features/jaas/functions';
import { setPrejoinDisplayNameRequired } from './react/features/prejoin/actions';
import {
setPrejoinDisplayNameRequired,
setPrejoinPageVisibility
} from './react/features/prejoin/actions';
const logger = Logger.getLogger(__filename);
/**
@@ -81,12 +85,10 @@ function checkForAttachParametersAndConnect(id, password, connection) {
* Try to open connection using provided credentials.
* @param {string} [id]
* @param {string} [password]
* @param {string} [roomName]
* @returns {Promise<JitsiConnection>} connection if
* everything is ok, else error.
*/
export async function connect(id, password, roomName) {
const connectionConfig = Object.assign({}, config);
export async function connect(id, password) {
const state = APP.store.getState();
let { jwt } = state['features/base/jwt'];
const { iAmRecorder, iAmSipGateway } = state['features/base/config'];
@@ -100,19 +102,7 @@ export async function connect(id, password, roomName) {
}
}
// Use Websocket URL for the web app if configured. Note that there is no 'isWeb' check, because there's assumption
// that this code executes only on web browsers/electron. This needs to be changed when mobile and web are unified.
let serviceUrl = connectionConfig.websocket || connectionConfig.bosh;
serviceUrl += `?room=${roomName}`;
connectionConfig.serviceUrl = serviceUrl;
if (connectionConfig.websocketKeepAliveUrl) {
connectionConfig.websocketKeepAliveUrl += `?room=${roomName}`;
}
const connection = new JitsiMeetJS.JitsiConnection(null, jwt, connectionConfig);
const connection = new JitsiMeetJS.JitsiConnection(null, jwt, constructOptions(state));
if (config.iAmRecorder) {
connection.addFeature(DISCO_JIBRI_FEATURE);
@@ -257,6 +247,7 @@ function requestAuth(roomName) {
resolve(connection);
};
APP.store.dispatch(setPrejoinPageVisibility(false));
APP.store.dispatch(
openDialog(LoginDialog, { onSuccess,
roomName })

View File

@@ -4,11 +4,12 @@
text-align: center;
h2 {
font-size: 36px;
font-size: 48px;
color : #f2f2f2;
}
&__message {
font-size: 24px;
margin-top: 20px;
}
}
}

View File

@@ -28,7 +28,7 @@
/**
* Keep overflow menu within screen vertical bounds and make it scrollable.
*/
.toolbox-button-wth-dialog > div:nth-child(2) {
.toolbox-button-wth-dialog > div:nth-child(2) {
background: $menuBG;
max-height: calc(100vh - #{$newToolbarSizeWithPadding} - 46px);
margin-bottom: 4px;
@@ -36,19 +36,22 @@
overflow-y: auto;
}
/**
* Remove background color and box-shadow for the context menu container.
*/
.toolbox-button-wth-dialog.context-menu > div:nth-child(2) {
background: transparent;
box-shadow: none;
overflow-y: initial;
}
.audio-preview > div:nth-child(2),
.video-preview > div:nth-child(2),
.reactions-menu-popup > div:nth-child(2) {
.video-preview > div:nth-child(2) {
margin-bottom: 4px;
outline: none;
padding: 0;
}
.reactions-menu-popup > div:nth-child(2) {
margin-bottom: 6px;
box-shadow: none;
}
/**
* The following selectors keep the chat modal full-size anywhere between 100px
* and 580px for desktop or 680px for mobile.

View File

@@ -43,18 +43,6 @@ body {
outline: none;
}
/**
* AtlasKit sets a default margin on the rendered modals, so
* when the shift-right class is set when the chat opens, we
* pad the modal container in order for the modals to be centered
* while also taking the chat size into consideration.
*/
@media (min-width: 581px) {
.shift-right .atlaskit-portal > div:not(.Tooltip) {
padding-left: $sidebarWidth;
}
}
.jitsi-icon {
&-default svg {
fill: white;

View File

@@ -1,15 +1,20 @@
#sideToolbarContainer {
background-color: $chatBackgroundColor;
box-sizing: border-box;
color: #FFF;
height: 100%;
position: absolute;
top: 0;
flex-shrink: 0;
overflow: hidden;
position: relative;
transition: width .16s ease-in-out;
width: $sidebarWidth;
z-index: $sideToolbarContainerZ;
@media (max-width: 580px) {
width: 100%;
height: 100vh;
height: -webkit-fill-available;
left: 0;
position: fixed;
right: 0;
top: 0;
width: auto;
}
}

View File

@@ -1,50 +0,0 @@
%connection-info {
font-size: 12px;
font-weight: 400;
td {
padding: 2px 0;
}
}
.connection-info
{
@extend %connection-info;
> table {
white-space: nowrap;
@extend %connection-info;
}
td:nth-child(n-1) {
padding-left: 5px;
}
&__icon {
margin-right: 2px;
}
&__download
{
@extend .connection-info__icon;
}
&__status
{
font-weight: bold;
}
&__upload
{
@extend .connection-info__icon;
}
&__mobile {
margin: 15px;
}
.connection-actions {
margin: 10px auto;
text-align: center;
}
}

View File

@@ -193,3 +193,17 @@
@mixin transparentBg($color, $alpha) {
background-color: rgba(red($color), green($color), blue($color), $alpha);
}
/**
* Change the direction of the current element to LTR, but do not change the direction
* of its children; Keep them RTL.
*/
@mixin ltr {
body[dir=rtl] & {
direction: ltr;
& > * {
direction: rtl;
}
}
}

View File

@@ -6,10 +6,6 @@
transition: width .16s ease-in-out;
width: 315px;
z-index: $zindex0;
&--closed {
width: 0;
}
}
.participants_pane-content {
@@ -34,11 +30,6 @@
right: 0;
top: 0;
width: auto;
&--closed {
display: none;
width: auto;
}
}
.participants_pane-content {

View File

@@ -104,6 +104,10 @@
}
}
.reactions-menu-container {
padding-bottom: 6px;
}
.reactions-animations-container {
position: absolute;
width: 20%;
@@ -112,8 +116,7 @@
height: 0;
}
.reactions-menu-popup-container,
.reactions-menu-popup {
.reactions-menu-popup-container {
display: inline-block;
position: relative;
}

View File

@@ -23,7 +23,26 @@
.recording-header-line {
border-top: 1px solid #5e6d7a;
padding-top: 32px;
padding-top: 16px;
margin-top: 16px;
}
.local-recording-warning {
margin-top: 8px;
display: block;
font-size: 14px;
line-height: 20px;
padding: 8px 16px;
&.text {
color: #fff;
background-color: #3D3D3D;
}
&.notification {
color: #040404;
background-color: #F8AE1A;
}
}
.recording-switch-disabled {
@@ -40,7 +59,7 @@
border-radius: 4px;
height: 40px;
justify-content: center;
width: 56px;
width: 42px;
}
.cloud-content-recording-icon-container {
@@ -52,7 +71,7 @@
}
.jitsi-recording-header {
margin-bottom: 32px;
margin-bottom: 16px;
}
.jitsi-content-recording-icon-container-with-switch {

View File

@@ -60,3 +60,15 @@
}
}
}
.settings-button-small-icon-container {
position: absolute;
right: -4px;
top: -3px;
& .settings-button-small-icon {
position: relative;
top: 0;
right: 0;
}
}

View File

@@ -88,10 +88,6 @@
max-width: calc(100% - 24px);
}
.shift-right .details-container {
margin-left: calc(#{$sidebarWidth} / 2);
}
@keyframes hideSubject {
0% {
max-width: 100%;

View File

@@ -39,13 +39,6 @@
&.no-buttons {
display: none;
}
@media (min-width: 581px) {
&.shift-right {
margin-left: $sidebarWidth;
width: calc(100% - #{$sidebarWidth});
}
}
}
.toolbox-content {
@@ -99,6 +92,10 @@
max-width: 100%;
pointer-events: all;
border-radius: 6px;
.toolbox-content-items {
@include ltr;
}
}
.toolbox-content-wrapper::after {
@@ -183,6 +180,7 @@
}
.toolbox-content-items {
@include ltr;
border-radius: 0;
display: flex;
justify-content: space-evenly;

View File

@@ -6,6 +6,7 @@
}
#layout_wrapper {
@include ltr;
display: flex;
height: 100%;
}
@@ -44,15 +45,6 @@
position: relative;
text-align: center;
overflow: 'hidden';
@media (min-width: 581px) {
&.shift-right {
&#largeVideoContainer {
margin-left: $sidebarWidth;
width: calc(100% - #{$sidebarWidth});
}
}
}
}
#localVideoWrapper {

View File

@@ -48,7 +48,8 @@
/**
* The local video identifier.
*/
&#filmstripLocalVideo {
&#filmstripLocalVideo,
&#filmstripLocalScreenShare {
align-self: flex-end;
display: block;
margin-bottom: 8px;

View File

@@ -5,8 +5,6 @@
.remote-videos {
align-items: center;
box-sizing: border-box;
display: flex;
flex-direction: column;
overscroll-behavior: contain;
}
@@ -41,17 +39,6 @@
top: 0;
width: 100%;
@media (min-width: 581px) {
&.shift-right {
margin-left: $sidebarWidth;
width: calc(100% - #{$sidebarWidth});
.remote-videos {
width: calc(100vw - #{$sidebarWidth});
}
}
}
&.collapse {
#remoteVideos {
height: calc(100% - #{$newToolbarSizeMobile}) !important;

View File

@@ -2,7 +2,8 @@
* Various overrides outside of the filmstrip to style the app to support a
* tiled thumbnail experience.
*/
.tile-view {
.tile-view,
.stage-filmstrip {
/**
* Let the avatar grow with the tile.
*/
@@ -15,9 +16,9 @@
* Hide various features that should not be displayed while in tile view.
*/
#dominantSpeaker,
#filmstripLocalVideoThumbnail,
#largeVideoElementsContainer,
#sharedVideo {
#sharedVideo,
.stage-participant-label {
display: none;
}

View File

@@ -1,156 +1,177 @@
.vertical-filmstrip .filmstrip {
&.hide-videos {
.vertical-filmstrip, .stage-filmstrip {
span:not(.tile-view) .filmstrip {
&.hide-videos {
.remote-videos {
& > div {
opacity: 0;
pointer-events: none;
}
}
}
/*
* Firefox sets flex items to min-height: auto and min-width: auto,
* preventing flex children from shrinking like they do on other browsers.
* Setting min-height and min-width 0 is a workaround for the issue so
* Firefox behaves like other browsers.
* https://bugzilla.mozilla.org/show_bug.cgi?id=1043520
*/
@mixin minHWAutoFix() {
min-height: 0;
min-width: 0;
}
@extend %align-right;
align-items: flex-end;
bottom: 0;
box-sizing: border-box;
display: flex;
flex-direction: column-reverse;
height: 100%;
width: 100%;
padding: 0;
/**
* fixed positioning is necessary for remote menus and tooltips to pop
* out of the scrolling filmstrip. AtlasKit dialogs and tooltips use
* a library called popper which will position its elements fixed if
* any parent is also fixed.
*/
position: fixed;
top: 0;
right: 0;
z-index: $filmstripVideosZ;
&.no-vertical-padding {
padding: 0;
}
/**
* Hide videos by making them slight to the right.
*/
.filmstrip__videos {
@extend %align-right;
bottom: 0;
padding: 0;
position:relative;
right: 0;
width: auto;
/**
* An id selector is used to match id specificity with existing
* filmstrip styles.
*/
&#remoteVideos {
border: $thumbnailsBorder solid transparent;
padding-left: 0;
border-left: 0;
width: 100%;
height: 100%;
justify-content: center;
}
}
/**
* Re-styles the local Video to better fit vertical filmstrip layout.
*/
#filmstripLocalVideo {
align-self: initial;
margin-bottom: 5px;
display: flex;
flex-direction: column-reverse;
height: auto;
justify-content: flex-start;
width: 100%;
#filmstripLocalVideoThumbnail {
width: calc(100% - 15px);
.videocontainer {
height: 0px;
width: 100%;
}
}
}
#filmstripLocalScreenShare {
align-self: initial;
margin-bottom: 5px;
display: flex;
flex-direction: column-reverse;
height: auto;
justify-content: flex-start;
width: 100%;
#filmstripLocalScreenShareThumbnail {
width: calc(100% - 15px);
.videocontainer {
height: 0px;
width: 100%;
}
}
}
/**
* Remove unnecssary padding that is normally used to prevent horizontal
* filmstrip from overlapping the left edge of the screen.
*/
#filmstripLocalVideo,
#filmstripLocalScreenShare,
.remote-videos {
padding: 0;
}
#remoteVideos {
@include minHWAutoFix();
flex-direction: column;
flex-grow: 1;
}
.resizable-filmstrip #remoteVideos .videocontainer {
border-left: 0;
margin: 0;
}
&.reduce-height {
height: calc(100% - calc(#{$newToolbarSizeWithPadding} + #{$scrollHeight}));
}
.filmstrip__videos.vertical-view-grid#remoteVideos {
align-items: 'center';
border: 0px;
padding-right: 7px;
&.has-scroll {
padding-right: 0px;
}
.remote-videos > div {
left: 0px; // fixes an issue on FF - the div is aligned to the right by default for some reason
}
.videocontainer {
border: 0px;
margin: 2px;
}
}
.remote-videos {
display: flex;
overscroll-behavior: contain;
&.height-transition {
transition: height .3s ease-in;
}
& > div {
opacity: 0;
pointer-events: none;
position: absolute;
transition: opacity 1s;
}
&.is-not-overflowing > div {
bottom: 0px;
}
}
}
/*
* Firefox sets flex items to min-height: auto and min-width: auto,
* preventing flex children from shrinking like they do on other browsers.
* Setting min-height and min-width 0 is a workaround for the issue so
* Firefox behaves like other browsers.
* https://bugzilla.mozilla.org/show_bug.cgi?id=1043520
*/
@mixin minHWAutoFix() {
min-height: 0;
min-width: 0;
}
@extend %align-right;
align-items: flex-end;
bottom: 0;
box-sizing: border-box;
display: flex;
flex-direction: column-reverse;
height: 100%;
width: 100%;
padding: 0;
/**
* fixed positioning is necessary for remote menus and tooltips to pop
* out of the scrolling filmstrip. AtlasKit dialogs and tooltips use
* a library called popper which will position its elements fixed if
* any parent is also fixed.
*/
position: fixed;
top: 0;
right: 0;
z-index: $filmstripVideosZ;
&.no-vertical-padding {
padding: 0;
}
/**
* Hide videos by making them slight to the right.
*/
.filmstrip__videos {
@extend %align-right;
bottom: 0;
padding: 0;
position:relative;
right: 0;
width: auto;
/**
* An id selector is used to match id specificity with existing
* filmstrip styles.
*/
&#remoteVideos {
border: $thumbnailsBorder solid transparent;
padding-left: 0;
border-left: 0;
width: 100%;
height: 100%;
justify-content: center;
}
}
/**
* Re-styles the local Video to better fit vertical filmstrip layout.
*/
#filmstripLocalVideo {
align-self: initial;
margin-bottom: 5px;
display: flex;
flex-direction: column-reverse;
height: auto;
justify-content: flex-start;
width: 100%;
#filmstripLocalVideoThumbnail {
width: calc(100% - 15px);
.videocontainer {
height: 0px;
width: 100%;
}
}
}
/**
* Remove unnecssary padding that is normally used to prevent horizontal
* filmstrip from overlapping the left edge of the screen.
*/
#filmstripLocalVideo,
.remote-videos {
padding: 0;
}
#remoteVideos {
@include minHWAutoFix();
flex-direction: column;
flex-grow: 1;
}
.resizable-filmstrip #remoteVideos .videocontainer {
border-left: 0;
margin: 0;
}
&.reduce-height {
height: calc(100% - calc(#{$newToolbarSizeWithPadding} + #{$scrollHeight}));
}
.filmstrip__videos.vertical-view-grid#remoteVideos {
align-items: 'center';
border: 0px;
padding-right: 7px;
&.has-scroll {
padding-right: 0px;
}
.remote-videos > div {
left: 0px; // fixes an issue on FF - the div is aligned to the right by default for some reason
}
.videocontainer {
border: 0px;
margin: 2px;
}
}
.remote-videos {
display: flex;
overscroll-behavior: contain;
&.height-transition {
transition: height .3s ease-in;
}
& > div {
position: absolute;
transition: opacity 1s;
}
&.is-not-overflowing > div {
bottom: 0px;
}
}
}

View File

@@ -3,14 +3,17 @@
* clashing with the filmstrip.
*/
.vertical-filmstrip #etherpad,
.vertical-filmstrip #sharedvideo {
.stage-filmstrip #etherpad,
.vertical-filmstrip #sharedvideo,
.stage-filmstrip #sharedvideo {
text-align: left;
}
/**
* Overrides for small videos in vertical filmstrip mode.
*/
.vertical-filmstrip .filmstrip__videos .videocontainer {
.vertical-filmstrip .filmstrip__videos .videocontainer,
.stage-filmstrip .filmstrip__videos .videocontainer {
.self-view-mobile-portrait video {
object-fit: contain;
}
@@ -27,7 +30,8 @@
* The class opening is for when the filmstrip is transitioning from hidden
* to visible.
*/
.vertical-filmstrip .large-video-labels {
.vertical-filmstrip .large-video-labels,
.stage-filmstrip .large-video-labels {
&.with-filmstrip {
right: 150px;
}
@@ -47,6 +51,7 @@
* Overrides for self view when in portrait mode on mobile.
* This is done in order to keep the aspect ratio.
*/
.vertical-filmstrip .self-view-mobile-portrait #localVideo_container {
.vertical-filmstrip .self-view-mobile-portrait #localVideo_container,
.stage-filmstrip .self-view-mobile-portrait #localVideo_container {
object-fit: contain;
}

View File

@@ -38,11 +38,8 @@ $flagsImagePath: "../images/";
@import 'modals/embed-meeting/embed-meeting';
@import 'modals/feedback/feedback';
@import 'modals/invite/info';
@import 'modals/settings/settings';
@import 'modals/screen-share/share-audio';
@import 'modals/screen-share/share-screen-warning';
@import 'modals/virtual-background/virtual-background';
@import 'modals/local-recording/local-recording';
@import 'videolayout_default';
@import 'notice';
@import 'subject';
@@ -61,7 +58,6 @@ $flagsImagePath: "../images/";
@import 'components/button-control';
@import 'components/input-control';
@import 'components/input-slider';
@import "connection-info";
@import '404';
@import 'policy';
@import 'popover';
@@ -89,7 +85,6 @@ $flagsImagePath: "../images/";
@import 'country-picker';
@import 'modals/invite/invite_more';
@import 'modals/security/security';
@import 'modals/mute/mute-dialog';
@import 'e2ee';
@import 'responsive';
@import 'drawer';

View File

@@ -1,92 +0,0 @@
.localrec-participant-stats {
list-style: none;
padding: 0;
width: 100%;
font-weight: 500;
.localrec-participant-stats-item__status-dot {
position: relative;
display: block;
width: 9px;
height: 9px;
border-radius: 50%;
margin: 0 auto;
&.status-on {
background: green;
}
&.status-off {
background: gray;
}
&.status-unknown {
background: darkgoldenrod;
}
&.status-error {
background: darkred;
}
}
.localrec-participant-stats-item__status,
.localrec-participant-stats-item__name,
.localrec-participant-stats-item__sessionid {
display: inline-block;
margin: 5px 0;
vertical-align: middle;
}
.localrec-participant-stats-item__status {
width: 5%;
}
.localrec-participant-stats-item__name {
width: 40%;
}
.localrec-participant-stats-item__sessionid {
width: 55%;
}
.localrec-participant-stats-item__name,
.localrec-participant-stats-item__sessionid {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.localrec-control-info-label {
font-weight: bold;
}
.localrec-control-info-label:after {
content: ' ';
}
.localrec-control-action-link {
display: inline-block;
line-height: 1.5em;
a {
cursor: pointer;
vertical-align: middle;
}
}
.localrec-control-action-link:before {
color: $linkFontColor;
content: '\2022';
font-size: 1.5em;
padding: 0 10px;
vertical-align: middle;
}
.localrec-control-action-link:first-child:before {
content: '';
padding: 0;
}
.localrec-control-action-links {
font-weight: bold;
margin-top: 10px;
white-space: nowrap;
}

View File

@@ -1,19 +0,0 @@
.mute-dialog {
.separator-line {
margin: 24px 0 24px -20px;
padding: 0 20px;
width: 100%;
height: 1px;
background: #5E6D7A;
}
.control-row {
display: flex;
justify-content: space-between;
margin-top: 15px;
label {
font-size: 14px;
}
}
}

View File

@@ -1,102 +0,0 @@
.settings-pane {
display: flex;
width: 100%;
&.profile-pane {
flex-direction: column;
}
.auth-name {
margin-bottom: 4px;
}
.calendar-tab,
.device-selection {
margin-top: 20px;
}
.mock-atlaskit-label {
color: #b8c7e0;
font-size: 12px;
font-weight: 600;
line-height: 1.33;
padding: 20px 0px 4px 0px;
}
input[type="checkbox"]:checked + svg {
--checkbox-background-color: #6492e7;
--checkbox-border-color: #6492e7;
}
input[type="checkbox"] + svg + span {
color: #b8c7e0;
}
input[type="checkbox"] + svg + span {
color: #9FB0CC;
}
.calendar-tab,
.more-tab,
.box {
display: flex;
justify-content: space-between;
width: 100%;
}
.profile-edit {
display: flex;
width: 100%;
}
.profile-edit-field {
flex: .5;
}
.settings-sub-pane {
flex: 1;
}
.settings-sub-pane .right {
flex: 1;
}
.settings-sub-pane .left {
flex: 1;
}
.settings-sub-pane-element {
text-align: left;
flex: 1;
}
.moderator-settings-wrapper {
padding-top: 20px;
}
.profile-edit-field {
margin-right: 20px;
}
.calendar-tab {
align-items: center;
flex-direction: column;
font-size: 14px;
min-height: 100px;
text-align: center;
}
.calendar-tab-sign-in {
margin-top: 20px;
}
.sign-out-cta {
margin-bottom: 20px;
}
@media only screen and (max-width: $smallScreen) {
.device-selection {
display: flex;
flex-direction: column;
}
.more-tab {
flex-direction: column;
}
}
}

View File

@@ -1,207 +0,0 @@
.virtual-background-dialog {
margin-left: -10px;
position: relative;
max-height: 300px;
color: white;
display: inline-grid;
grid-template-columns: auto auto auto auto auto;
column-gap: 9px;
cursor: pointer;
.desktop-share:hover,
.thumbnail:hover,
.blur:hover,
.slight-blur:hover,
.virtual-background-none:hover {
opacity: 0.5;
border: 2px solid #99bbf3;
@media (max-width: 632px) {
height: 60px;
width: 60px;
}
}
.background-option {
margin-top: 8px;
border-radius: 6px;
height: 60px;
width: 107px;
text-align: center;
justify-content: center;
font-weight: bold;
box-sizing: border-box;
display: flex;
align-items: center;
}
.thumbnail {
object-fit: cover;
}
.thumbnail:hover ~ .delete-image-icon {
display: block;
}
.thumbnail-selected {
object-fit: cover;
border: 2px solid #246fe5;
}
.blur {
box-shadow: inset 0 0 12px #000000;
background: #7e8287;
padding: 0 10px;
}
.blur-selected {
box-shadow: inset 0 0 12px #000000;
background: #7e8287;
border: 2px solid #246fe5;
padding: 0 10px;
}
.slight-blur {
box-shadow: inset 0 0 12px #000000;
background: #a4a4a4;
padding: 0 10px;
}
.slight-blur-selected {
box-shadow: inset 0 0 12px #000000;
background: #a4a4a4;
border: 2px solid #246fe5;
padding: 0 10px;
}
.virtual-background-none {
background: #525252;
padding: 0 10px;
}
.none-selected {
background: #525252;
border: 2px solid #246fe5;
padding: 0 10px;
}
.desktop-share {
background: #525252;
}
.desktop-share-selected {
background: #525252;
border: 2px solid #246fe5;
padding: 0 10px;
}
@media (max-width: 632px) {
font-size: 1.5vw;
.desktop-share,
.virtual-background-none,
.thumbnail,
.blur,
.slight-blur {
height: 60px;
width: 60px;
}
.desktop-share-selected,
.thumbnail-selected,
.none-selected,
.blur-selected,
.slight-blur-selected {
height: 60px;
width: 60px;
}
}
@media (max-width: 360px) {
grid-template-columns: auto auto auto;
}
}
.modal-dialog-form .virtual-background-loading {
overflow: hidden;
position: fixed;
left: 50%;
margin-top: 10px;
transform: translateX(-50%);
}
.modal-dialog-form .video-preview {
height: 250px;
}
.file-upload-btn {
display: none;
}
.file-upload-label {
font-size: 14px;
font-weight: 600;
line-height: 20px;
margin-left: -10px;
margin-top: 16px;
margin-bottom: 8px;
color: #669aec;
display: inline-flex;
cursor: pointer;
}
.delete-image-icon {
background: #3d3d3d;
position: absolute;
display: none;
left: 96;
bottom: 51;
@media (max-width: 632px) {
left: 51px;
}
}
.delete-image-icon:hover {
display: block;
}
.thumbnail-container {
position: relative;
&:focus-within {
.thumbnail ~ .delete-image-icon {
display: block;
}
}
}
.add-background {
margin-right: 8px;
}
.apply-background-btn {
margin-top: 16px;
float: right;
}
.video-background-preview-entry {
margin-left: -10px;
height: 250px;
width: 570px;
margin-bottom: 8px;
z-index: 2;
@media (max-width: 632px) {
max-width: 336;
}
}
.virtual-background-preview-video {
margin-left: -10;
border-radius: 6px;
height: 100%;
object-fit: cover;
width: 100%;
}
.video-preview-loader {
border-radius: 6px;
background-color: transparent;
height: 250px;
margin-bottom: 8px;
width: 572px;
position: fixed;
z-index: 2;
@media (min-width: 432px) and (max-width: 632px) {
width: 340px;
}
}
.video-preview-loader svg {
position: absolute;
top: 40%;
left: 45%;
}
.dialog-margin-top{
margin-top: 44px;
}

View File

@@ -1,5 +1,4 @@
@import 'lobby';
@import 'premeeting-screens';
@import 'prejoin';
@import 'prejoin-dialog';
@import 'prejoin-third-party';

View File

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

View File

@@ -3,6 +3,25 @@
width: 100%;
}
&-avatar {
margin: 8px auto 16px;
&-name {
color: white;
font-size: 16px;
font-weight: 600;
line-height: 26px;
margin-bottom: 32px;
text-align: center;
}
&-container {
align-items: center;
display: flex;
flex-direction: column;
}
}
&-error {
background-color: #E04757;
border-radius: 6px;

View File

@@ -137,6 +137,7 @@
}
.toolbox-content-items {
@include ltr;
background: transparent;
box-shadow: none;
display: flex;

7
debian/control vendored
View File

@@ -33,7 +33,7 @@ Description: Configuration for web serving of Jitsi Meet
Package: jitsi-meet-prosody
Architecture: all
Depends: openssl, prosody (>= 0.11.0) | prosody-trunk | prosody-0.11, lua-sec
Depends: openssl, prosody (>= 0.11.0) | prosody-trunk | prosody-0.12 | prosody-0.11, lua-sec, lua-basexx, lua-luaossl, lua-cjson
Replaces: jitsi-meet-tokens
Description: Prosody configuration for Jitsi Meet
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
@@ -47,12 +47,11 @@ Description: Prosody configuration for Jitsi Meet
Package: jitsi-meet-tokens
Architecture: all
Depends: ${misc:Depends}, prosody-trunk (>= 1nightly747) | prosody-0.11 | prosody (>= 0.11.2), libssl1.0-dev | libssl-dev, luarocks, jitsi-meet-prosody, git
Depends: ${misc:Depends}, prosody-trunk | prosody-0.11 | prosody-0.12 | prosody (>= 0.11.2), jitsi-meet-prosody
Description: Prosody token authentication plugin for Jitsi Meet
Package: jitsi-meet-turnserver
Architecture: all
Breaks: apache2
Pre-Depends: jitsi-meet-web-config
Depends: ${misc:Depends}, nginx (>= 1.13.10) | nginx-full (>= 1.13.10) | nginx-extras (>= 1.13.10), jitsi-meet-prosody, coturn, dnsutils
Depends: ${misc:Depends}, jitsi-meet-prosody, coturn, dnsutils
Description: Configures coturn to be used with Jitsi Meet

View File

@@ -60,16 +60,6 @@ case "$1" in
sed -i 's/ --modules_enabled = { "token_verification" }/ modules_enabled = { "token_verification" }/g' $PROSODY_HOST_CONFIG
sed -i '/^\s*--\s*"token_verification"/ s/--\s*//' $PROSODY_HOST_CONFIG
# Install luajwt
if ! luarocks install luajwtjitsi 2.0-0; then
echo "Failed to install luajwtjitsi - try installing it manually"
fi
# Install basexx
if ! luarocks install basexx; then
echo "Failed to install basexx - try installing it manually"
fi
PR10_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-0.10' 2>/dev/null | awk '{print $3}' || true)"
PRTRUNK_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-trunk' 2>/dev/null | awk '{print $3}' || true)"
PR_VER_INSTALLED=$(dpkg-query -f='${Version}\n' --show prosody 2>/dev/null || true)

View File

@@ -33,7 +33,6 @@ case "$1" in
JVB_HOSTNAME=$(echo "$RET" | xargs echo -n)
TURN_CONFIG="/etc/turnserver.conf"
NGINX_CONFIG="/etc/nginx/sites-available/$JVB_HOSTNAME.conf"
JITSI_MEET_CONFIG="/etc/jitsi/meet/$JVB_HOSTNAME-config.js"
# if there was a turn config backup it so we can configure
@@ -51,19 +50,6 @@ case "$1" in
fi
fi
# this detect only old installations with no nginx
db_get jitsi-meet/jvb-serve || true
if [ ! -f $NGINX_CONFIG -o "$RET" = "true" ] ; then
# nothing to do
echo "------------------------------------------------"
echo ""
echo "turnserver not configured"
echo ""
echo "------------------------------------------------"
db_stop
exit 0
fi
if [[ -f $TURN_CONFIG ]] ; then
echo "------------------------------------------------"
echo ""
@@ -117,7 +103,7 @@ denied-peer-ip=240.0.0.0-255.255.255.255" >> $TURN_CONFIG
sed -i "s/jitsi-meet.example.com/$JVB_HOSTNAME/g" $TURN_CONFIG
sed -i "s/__turnSecret__/$TURN_SECRET/g" $TURN_CONFIG
# SSL for nginx
# SSL settings
db_get jitsi-meet/cert-choice
CERT_CHOICE="$RET"

View File

@@ -23,26 +23,12 @@ set -e
case "$1" in
remove)
if [ -x "/etc/init.d/nginx" ]; then
invoke-rc.d nginx reload || true
fi
if [ -x "/etc/init.d/apache2" ]; then
invoke-rc.d apache2 reload || true
fi
;;
purge)
rm -rf /etc/turnserver.conf
if [ -x "/etc/init.d/nginx" ]; then
invoke-rc.d nginx reload || true
fi
if [ -x "/etc/init.d/apache2" ]; then
invoke-rc.d apache2 reload || true
fi
# Clear the debconf variable
db_purge
;;
upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
;;
*)

View File

@@ -14,5 +14,3 @@ resources/robots.txt /usr/share/jitsi-meet/
resources/*.sh /usr/share/jitsi-meet/scripts/
pwa-worker.js /usr/share/jitsi-meet/
manifest.json /usr/share/jitsi-meet/
resources/load-test/*.html /usr/share/jitsi-meet/load-test/
resources/load-test/libs /usr/share/jitsi-meet/load-test/

View File

@@ -14,6 +14,16 @@ cross_domain_bosh = false;
consider_bosh_secure = true;
-- https_ports = { }; -- Remove this line to prevent listening on port 5284
-- by default prosody 0.12 sends cors headers, if you want to disable it uncomment the following (the config is available on 0.12.1)
--http_cors_override = {
-- bosh = {
-- enabled = false;
-- };
-- websocket = {
-- enabled = false;
-- };
--}
-- https://ssl-config.mozilla.org/#server=haproxy&version=2.1&config=intermediate&openssl=1.1.0g&guideline=5.4
ssl = {
protocol = "tlsv1_2+";
@@ -127,3 +137,18 @@ Component "lobby.jitmeet.example.com" "muc"
"muc_rate_limit";
"polls";
}
-- Enables dial-in for Jitsi meet components customers
-- Note: make sure you have the following packages installed: lua-basexx, liblua5.3-dev, libssl-dev, luarocks
-- and execute $ sudo luarocks install luajwtjitsi 3.0-0
VirtualHost "jigasi.meet.jitsi"
enabled = false -- Jitsi meet components customers remove this line
modules_enabled = {
"ping";
"bosh";
}
authentication = "token"
app_id = "jitsi";
asap_key_server = "https://jaas-public-keys.jitsi.net/jitsi-components/prod-8x8"
asap_accepted_issuers = { "jaas-components" }
asap_accepted_audiences = { "jigasi.jitmeet.example.com" }

View File

@@ -4,6 +4,16 @@ types {
# nginx's default mime.types doesn't include a mapping for wasm
application/wasm wasm;
}
upstream prosody {
zone upstreams 64K;
server 127.0.0.1:5280;
keepalive 2;
}
upstream jvb1 {
zone upstreams 64K;
server 127.0.0.1:9090;
keepalive 2;
}
server {
listen 80;
listen [::]:80;
@@ -77,14 +87,16 @@ server {
# BOSH
location = /http-bind {
proxy_pass http://127.0.0.1:5280/http-bind?prefix=$prefix&$args;
proxy_pass http://prosody/http-bind?prefix=$prefix&$args;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header Connection "";
}
# xmpp websockets
location = /xmpp-websocket {
proxy_pass http://127.0.0.1:5280/xmpp-websocket?prefix=$prefix&$args;
proxy_pass http://prosody/xmpp-websocket?prefix=$prefix&$args;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
@@ -94,7 +106,7 @@ server {
# colibri (JVB) websockets for jvb1
location ~ ^/colibri-ws/default-id/(.*) {
proxy_pass http://127.0.0.1:9090/colibri-ws/default-id/$1$is_args$args;
proxy_pass http://jvb1/colibri-ws/default-id/$1$is_args$args;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 KiB

After

Width:  |  Height:  |  Size: 713 KiB

View File

@@ -54,7 +54,7 @@
// redirected to a page that is known to have no newer js syntax.
if (window.navigator.userAgent.match(/(MSIE|Trident)/)) {
var roomName = encodeURIComponent(window.location.pathname);
window.location.href = "static/recommendedBrowsers.html" + "?room=" + roomName;
window.location.pathname = 'static/recommendedBrowsers.html';
}
window.indexLoadedTime = window.performance.now();

View File

@@ -23,7 +23,10 @@ target 'JitsiMeetSDK' do
config = use_native_modules!
use_react_native!(
:path => config["reactNativePath"],
:hermes_enabled => false
:hermes_enabled => false,
:fabric_enabled => false,
# An absolute path to your application root.
:app_path => "#{Pod::Config.instance.installation_root}/.."
)
# Native pod dependencies
@@ -35,6 +38,7 @@ end
post_install do |installer|
react_native_post_install(installer)
__apply_Xcode_12_5_M1_post_install_workaround(installer)
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'YES'
@@ -42,7 +46,4 @@ post_install do |installer|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
end
end
# https://github.com/facebook/react-native/blob/d7f748a944a9a9324e485ccbe214098e6c8645fc/scripts/react_native_pods.rb#L630
time_header = "#{Pod::Config.instance.installation_root.to_s}/Pods/RCT-Folly/folly/portability/Time.h"
`sed -i -e $'s/ && (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0)//' #{time_header}`
end

View File

@@ -13,14 +13,14 @@ PODS:
- CocoaLumberjack/Core (= 3.7.2)
- CocoaLumberjack/Core (3.7.2)
- DoubleConversion (1.1.6)
- FBLazyVector (0.66.4)
- FBReactNativeSpec (0.66.4):
- FBLazyVector (0.68.1)
- FBReactNativeSpec (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.66.4)
- RCTTypeSafety (= 0.66.4)
- React-Core (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- RCTRequired (= 0.68.1)
- RCTTypeSafety (= 0.68.1)
- React-Core (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- Firebase/Analytics (6.33.0):
- Firebase/Core
- Firebase/Core (6.33.0):
@@ -66,6 +66,11 @@ PODS:
- GoogleUtilities/UserDefaults (~> 6.7)
- PromisesObjC (~> 1.2)
- fmt (6.2.1)
- Giphy (2.1.20):
- libwebp
- giphy-react-native-sdk (1.7.0):
- Giphy (= 2.1.20)
- React-Core
- glog (0.3.5)
- GoogleAppMeasurement (6.8.3):
- GoogleUtilities/AppDelegateSwizzler (~> 6.7)
@@ -102,6 +107,15 @@ PODS:
- AppAuth/Core (~> 1.4)
- GTMSessionFetcher/Core (~> 1.5)
- GTMSessionFetcher/Core (1.7.0)
- libwebp (1.2.1):
- libwebp/demux (= 1.2.1)
- libwebp/mux (= 1.2.1)
- libwebp/webp (= 1.2.1)
- libwebp/demux (1.2.1):
- libwebp/webp
- libwebp/mux (1.2.1):
- libwebp/demux
- libwebp/webp (1.2.1)
- nanopb (1.30906.0):
- nanopb/decode (= 1.30906.0)
- nanopb/encode (= 1.30906.0)
@@ -120,192 +134,201 @@ PODS:
- DoubleConversion
- fmt (~> 6.2.1)
- glog
- RCTRequired (0.66.4)
- RCTTypeSafety (0.66.4):
- FBLazyVector (= 0.66.4)
- RCTRequired (0.68.1)
- RCTTypeSafety (0.68.1):
- FBLazyVector (= 0.68.1)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.66.4)
- React-Core (= 0.66.4)
- React (0.66.4):
- React-Core (= 0.66.4)
- React-Core/DevSupport (= 0.66.4)
- React-Core/RCTWebSocket (= 0.66.4)
- React-RCTActionSheet (= 0.66.4)
- React-RCTAnimation (= 0.66.4)
- React-RCTBlob (= 0.66.4)
- React-RCTImage (= 0.66.4)
- React-RCTLinking (= 0.66.4)
- React-RCTNetwork (= 0.66.4)
- React-RCTSettings (= 0.66.4)
- React-RCTText (= 0.66.4)
- React-RCTVibration (= 0.66.4)
- React-callinvoker (0.66.4)
- React-Core (0.66.4):
- RCTRequired (= 0.68.1)
- React-Core (= 0.68.1)
- React (0.68.1):
- React-Core (= 0.68.1)
- React-Core/DevSupport (= 0.68.1)
- React-Core/RCTWebSocket (= 0.68.1)
- React-RCTActionSheet (= 0.68.1)
- React-RCTAnimation (= 0.68.1)
- React-RCTBlob (= 0.68.1)
- React-RCTImage (= 0.68.1)
- React-RCTLinking (= 0.68.1)
- React-RCTNetwork (= 0.68.1)
- React-RCTSettings (= 0.68.1)
- React-RCTText (= 0.68.1)
- React-RCTVibration (= 0.68.1)
- React-callinvoker (0.68.1)
- React-Codegen (0.68.1):
- FBReactNativeSpec (= 0.68.1)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.68.1)
- RCTTypeSafety (= 0.68.1)
- React-Core (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-Core (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.66.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-Core/Default (= 0.68.1)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/CoreModulesHeaders (0.66.4):
- React-Core/CoreModulesHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/Default (0.66.4):
- React-Core/Default (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/DevSupport (0.66.4):
- React-Core/DevSupport (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.66.4)
- React-Core/RCTWebSocket (= 0.66.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-jsinspector (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-Core/Default (= 0.68.1)
- React-Core/RCTWebSocket (= 0.68.1)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-jsinspector (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/RCTActionSheetHeaders (0.66.4):
- React-Core/RCTActionSheetHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/RCTAnimationHeaders (0.66.4):
- React-Core/RCTAnimationHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/RCTBlobHeaders (0.66.4):
- React-Core/RCTBlobHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/RCTImageHeaders (0.66.4):
- React-Core/RCTImageHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/RCTLinkingHeaders (0.66.4):
- React-Core/RCTLinkingHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/RCTNetworkHeaders (0.66.4):
- React-Core/RCTNetworkHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/RCTSettingsHeaders (0.66.4):
- React-Core/RCTSettingsHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/RCTTextHeaders (0.66.4):
- React-Core/RCTTextHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/RCTVibrationHeaders (0.66.4):
- React-Core/RCTVibrationHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-Core/RCTWebSocket (0.66.4):
- React-Core/RCTWebSocket (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.66.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsiexecutor (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-Core/Default (= 0.68.1)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- Yoga
- React-CoreModules (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- React-CoreModules (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.66.4)
- React-Core/CoreModulesHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- React-RCTImage (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-cxxreact (0.66.4):
- RCTTypeSafety (= 0.68.1)
- React-Codegen (= 0.68.1)
- React-Core/CoreModulesHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- React-RCTImage (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-cxxreact (0.68.1):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.66.4)
- React-jsi (= 0.66.4)
- React-jsinspector (= 0.66.4)
- React-logger (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-runtimeexecutor (= 0.66.4)
- React-jsi (0.66.4):
- React-callinvoker (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsinspector (= 0.68.1)
- React-logger (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-runtimeexecutor (= 0.68.1)
- React-jsi (0.68.1):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsi/Default (= 0.66.4)
- React-jsi/Default (0.66.4):
- React-jsi/Default (= 0.68.1)
- React-jsi/Default (0.68.1):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsiexecutor (0.66.4):
- React-jsiexecutor (0.68.1):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-jsinspector (0.66.4)
- React-logger (0.66.4):
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-jsinspector (0.68.1)
- React-logger (0.68.1):
- glog
- react-native-background-timer (2.4.1):
- React-Core
@@ -330,75 +353,75 @@ PODS:
- react-native-video/Video (= 5.2.0)
- react-native-video/Video (5.2.0):
- React-Core
- react-native-webrtc (1.94.2):
- react-native-webrtc (1.100.1):
- React-Core
- react-native-webview (11.15.1):
- React-Core
- React-perflogger (0.66.4)
- React-RCTActionSheet (0.66.4):
- React-Core/RCTActionSheetHeaders (= 0.66.4)
- React-RCTAnimation (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- React-perflogger (0.68.1)
- React-RCTActionSheet (0.68.1):
- React-Core/RCTActionSheetHeaders (= 0.68.1)
- React-RCTAnimation (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.66.4)
- React-Core/RCTAnimationHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTBlob (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- RCTTypeSafety (= 0.68.1)
- React-Codegen (= 0.68.1)
- React-Core/RCTAnimationHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTBlob (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/RCTBlobHeaders (= 0.66.4)
- React-Core/RCTWebSocket (= 0.66.4)
- React-jsi (= 0.66.4)
- React-RCTNetwork (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTImage (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- React-Codegen (= 0.68.1)
- React-Core/RCTBlobHeaders (= 0.68.1)
- React-Core/RCTWebSocket (= 0.68.1)
- React-jsi (= 0.68.1)
- React-RCTNetwork (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTImage (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.66.4)
- React-Core/RCTImageHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- React-RCTNetwork (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTLinking (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- React-Core/RCTLinkingHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTNetwork (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- RCTTypeSafety (= 0.68.1)
- React-Codegen (= 0.68.1)
- React-Core/RCTImageHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- React-RCTNetwork (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTLinking (0.68.1):
- React-Codegen (= 0.68.1)
- React-Core/RCTLinkingHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTNetwork (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.66.4)
- React-Core/RCTNetworkHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTSettings (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- RCTTypeSafety (= 0.68.1)
- React-Codegen (= 0.68.1)
- React-Core/RCTNetworkHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTSettings (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.66.4)
- React-Core/RCTSettingsHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-RCTText (0.66.4):
- React-Core/RCTTextHeaders (= 0.66.4)
- React-RCTVibration (0.66.4):
- FBReactNativeSpec (= 0.66.4)
- RCTTypeSafety (= 0.68.1)
- React-Codegen (= 0.68.1)
- React-Core/RCTSettingsHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTText (0.68.1):
- React-Core/RCTTextHeaders (= 0.68.1)
- React-RCTVibration (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/RCTVibrationHeaders (= 0.66.4)
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (= 0.66.4)
- React-runtimeexecutor (0.66.4):
- React-jsi (= 0.66.4)
- ReactCommon/turbomodule/core (0.66.4):
- React-Codegen (= 0.68.1)
- React-Core/RCTVibrationHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-runtimeexecutor (0.68.1):
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (0.68.1):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.66.4)
- React-Core (= 0.66.4)
- React-cxxreact (= 0.66.4)
- React-jsi (= 0.66.4)
- React-logger (= 0.66.4)
- React-perflogger (= 0.66.4)
- React-callinvoker (= 0.68.1)
- React-Core (= 0.68.1)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-logger (= 0.68.1)
- React-perflogger (= 0.68.1)
- RNCalendarEvents (2.2.0):
- React
- RNCAsyncStorage (1.15.14):
@@ -407,7 +430,7 @@ PODS:
- React-Core
- RNCMaskedView (0.2.6):
- React-Core
- RNDefaultPreference (1.4.3):
- RNDefaultPreference (1.4.4):
- React-Core
- RNDeviceInfo (8.4.8):
- React-Core
@@ -416,7 +439,7 @@ PODS:
- RNGoogleSignin (7.0.4):
- GoogleSignIn (~> 6.0.0)
- React-Core
- RNReanimated (1.13.3):
- RNReanimated (1.13.4):
- React-Core
- RNScreens (3.10.1):
- React-Core
@@ -442,6 +465,7 @@ DEPENDENCIES:
- Firebase/Analytics (~> 6.33.0)
- Firebase/Crashlytics (~> 6.33.0)
- Firebase/DynamicLinks (~> 6.33.0)
- "giphy-react-native-sdk (from `../node_modules/@giphy/react-native-sdk`)"
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
- ObjectiveDropboxOfficial (= 6.2.3)
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
@@ -449,6 +473,7 @@ DEPENDENCIES:
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
- React (from `../node_modules/react-native/`)
- React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
- React-Codegen (from `build/generated/ios`)
- React-Core (from `../node_modules/react-native/`)
- React-Core/DevSupport (from `../node_modules/react-native/`)
- React-Core/RCTWebSocket (from `../node_modules/react-native/`)
@@ -510,12 +535,14 @@ SPEC REPOS:
- FirebaseDynamicLinks
- FirebaseInstallations
- fmt
- Giphy
- GoogleAppMeasurement
- GoogleDataTransport
- GoogleSignIn
- GoogleUtilities
- GTMAppAuth
- GTMSessionFetcher
- libwebp
- nanopb
- ObjectiveDropboxOfficial
- PromisesObjC
@@ -531,6 +558,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/Libraries/FBLazyVector"
FBReactNativeSpec:
:path: "../node_modules/react-native/React/FBReactNativeSpec"
giphy-react-native-sdk:
:path: "../node_modules/@giphy/react-native-sdk"
glog:
:podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
RCT-Folly:
@@ -543,6 +572,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/"
React-callinvoker:
:path: "../node_modules/react-native/ReactCommon/callinvoker"
React-Codegen:
:path: build/generated/ios
React-Core:
:path: "../node_modules/react-native/"
React-CoreModules:
@@ -641,8 +672,8 @@ SPEC CHECKSUMS:
boost: a7c83b31436843459a1961bfd74b96033dc77234
CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
FBLazyVector: e5569e42a1c79ca00521846c223173a57aca1fe1
FBReactNativeSpec: fe08c1cd7e2e205718d77ad14b34957cce949b58
FBLazyVector: 2c76493a346ef8cacf1f442926a39f805fffec1f
FBReactNativeSpec: 371350f24afa87b6aba606972ec959dcd4a95c9a
Firebase: 8db6f2d1b2c5e2984efba4949a145875a8f65fe5
FirebaseAnalytics: 5dd088bd2e67bb9d13dbf792d1164ceaf3052193
FirebaseCore: d889d9e12535b7f36ac8bfbf1713a0836a3012cd
@@ -651,28 +682,32 @@ SPEC CHECKSUMS:
FirebaseDynamicLinks: 6eac37d86910382eafb6315d952cc44c9e176094
FirebaseInstallations: 466c7b4d1f58fe16707693091da253726a731ed2
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
glog: 5337263514dd6f09803962437687240c5dc39aa4
Giphy: b6d5087521d251bb8c99cdc0eb07bbdf86d142d5
giphy-react-native-sdk: 7abccf2b52123a0f30ce99da895ab6288023680c
glog: 476ee3e89abb49e07f822b48323c51c57124b572
GoogleAppMeasurement: 966e88df9d19c15715137bb2ddaf52373f111436
GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833
GoogleSignIn: fd381840dbe7c1137aa6dc30849a5c3e070c034a
GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3
GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89
GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc
ObjectiveDropboxOfficial: fe206ce8c0bc49976c249d472db7fdbc53ebbd53
PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
RCT-Folly: a21c126816d8025b547704b777a2ba552f3d9fa9
RCTRequired: 4bf86c70714490bca4bf2696148638284622644b
RCTTypeSafety: c475a7059eb77935fa53d2c17db299893f057d5d
React: f64af14e3f2c50f6f2c91a5fd250e4ff1b3c3459
React-callinvoker: b74e4ae80287780dcdf0cab262bcb581eeef56e7
React-Core: 3eb7432bad96ff1d25aebc1defbae013fee2fd0e
React-CoreModules: ad9e1fd5650e16666c57a08328df86fd7e480cb9
React-cxxreact: 02633ff398cf7e91a2c1e12590d323c4a4b8668a
React-jsi: 805c41a927d6499fb811772acb971467d9204633
React-jsiexecutor: 94ce921e1d8ce7023366873ec371f3441383b396
React-jsinspector: d0374f7509d407d2264168b6d0fad0b54e300b85
React-logger: 933f80c97c633ee8965d609876848148e3fef438
RCT-Folly: 4d8508a426467c48885f1151029bc15fa5d7b3b8
RCTRequired: 00581111c53531e39e3c6346ef0d2c0cf52a5a37
RCTTypeSafety: 07e03ee7800e7dd65cba8e52ad0c2edb06c96604
React: e61f4bf3c573d0c61c56b53dc3eb1d9daf0768a0
React-callinvoker: 047d47230bb6fd66827f8cb0bea4e944ffd1309b
React-Codegen: bb0403cde7374af091530e84e492589485aab480
React-Core: a4a3a8e10d004b08e013c3d0438259dd89a3894c
React-CoreModules: bb9f8bc36f1ae6d780b856927fa9d4aa01ccccc0
React-cxxreact: 7dd472aefb8629d6080cbb859240bafccd902704
React-jsi: b25808afe821b607d51c779bdd1717be8393b7ec
React-jsiexecutor: 4a4bae5671b064a2248a690cf75957669489d08c
React-jsinspector: 218a2503198ff28a085f8e16622a8d8f507c8019
React-logger: f79dd3cc0f9b44f5611c6c7862badd891a862cf8
react-native-background-timer: 17ea5e06803401a379ebf1f20505b793ac44d0fe
react-native-get-random-values: 30b3f74ca34e30e2e480de48e4add2706a40ac8f
react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774
@@ -683,35 +718,35 @@ SPEC CHECKSUMS:
react-native-slider: 6e9b86e76cce4b9e35b3403193a6432ed07e0c81
react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
react-native-video: a4c2635d0802f983594b7057e1bce8f442f0ad28
react-native-webrtc: 1856ac061df94b1bd6037f1f3b56d1b8bc2b50e7
react-native-webrtc: 206a0ac12a5633d2ec4605174d7c9f12f0d674b2
react-native-webview: ea4899a1056c782afa96dd082179a66cbebf5504
React-perflogger: 93075d8931c32cd1fce8a98c15d2d5ccc4d891bd
React-RCTActionSheet: 7d3041e6761b4f3044a37079ddcb156575fb6d89
React-RCTAnimation: 743e88b55ac62511ae5c2e22803d4f503f2a3a13
React-RCTBlob: bee3a2f98fa7fc25c957c8643494244f74bea0a0
React-RCTImage: 19fc9e29b06cc38611c553494f8d3040bf78c24e
React-RCTLinking: dc799503979c8c711126d66328e7ce8f25c2848f
React-RCTNetwork: 417e4e34cf3c19eaa5fd4e9eb20180d662a799ce
React-RCTSettings: 4df89417265af26501a7e0e9192a34d3d9848dff
React-RCTText: f8a21c3499ab322326290fa9b701ae29aa093aa5
React-RCTVibration: e3ffca672dd3772536cb844274094b0e2c31b187
React-runtimeexecutor: dec32ee6f2e2a26e13e58152271535fadff5455a
ReactCommon: 57b69f6383eafcbd7da625bfa6003810332313c4
React-perflogger: 30ab8d6db10e175626069e742eead3ebe8f24fd5
React-RCTActionSheet: 4b45da334a175b24dabe75f856b98fed3dfd6201
React-RCTAnimation: d6237386cb04500889877845b3e9e9291146bc2e
React-RCTBlob: bc9e2cd738c43bd2948e862e371402ef9584730a
React-RCTImage: 9f8cac465c6e5837007f59ade2a0a741016dd6a3
React-RCTLinking: 5073abb7d30cc0824b2172bd4582fc15bfc40510
React-RCTNetwork: 28ff94aa7d8fc117fc800b87dd80869a00d2bef3
React-RCTSettings: f27aa036f7270fe6ca43f8cdd1819e821fa429a0
React-RCTText: 7cb6f86fa7bc86f22f16333ad243b158e63b2a68
React-RCTVibration: 9e344c840176b0af9c84d5019eb4fed8b3c105a1
React-runtimeexecutor: 7285b499d0339104b2813a1f58ad1ada4adbd6c0
ReactCommon: bf2888a826ceedf54b99ad1b6182d1bc4a8a3984
RNCalendarEvents: 7e65eb4a94f53c1744d1e275f7fafcfaa619f7a3
RNCAsyncStorage: ea6b5c280997b2b32a587793163b1f10e580c4f7
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
RNCMaskedView: c298b644a10c0c142055b3ae24d83879ecb13ccd
RNDefaultPreference: 326860d42a681bfd7338c8f6d061cf58745bd860
RNDefaultPreference: 08bdb06cfa9188d5da97d4642dac745218d7fb31
RNDeviceInfo: 0400a6d0c94186d1120c3cbd97b23abc022187a9
RNGestureHandler: e5c7cab5f214503dcefd6b2b0cefb050e1f51c4a
RNGoogleSignin: c4381751eefd73c552b923ba347a9bfc6f18771c
RNReanimated: 514a11da3a2bcc6c3dfd9de32b38e2b9bf101926
RNReanimated: c1b56d030d1616239861534d9adb531f8cffab68
RNScreens: 522705f2e5c9d27efb17f24aceb2bf8335bc7b8e
RNSound: 27e8268bdb0a1f191f219a33267f7e0445e8d62f
RNSVG: ce9d996113475209013317e48b05c21ee988d42e
RNWatch: 99637948ec9b5c9ec5a41920642594ad5ba07e80
Yoga: e7dc4e71caba6472ff48ad7d234389b91dadc280
Yoga: 17cd9a50243093b547c1e539c749928dd68152da
PODFILE CHECKSUM: 7fafb3480e45473da539aa09d06374868b021f90
PODFILE CHECKSUM: bef1335067eaa4e8c558b1248f8ab3948de855bc
COCOAPODS: 1.11.2
COCOAPODS: 1.11.3

View File

@@ -38,6 +38,8 @@
DEA9F28A258A6EA800D4CD74 /* JitsiMeetSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DEA9F288258A6EA800D4CD74 /* JitsiMeetSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
E588011722789D43008B0561 /* JitsiMeetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = E58801132278944E008B0561 /* JitsiMeetContext.swift */; };
E5C97B63227A1EB400199214 /* JitsiMeetCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5C97B62227A1EB400199214 /* JitsiMeetCommands.swift */; };
FD572B9827EDF32300A800FB /* GiphyUISDK.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */; };
FD572B9927EDF32300A800FB /* GiphyUISDK.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -72,6 +74,7 @@
dstSubfolderSpec = 10;
files = (
DEA9F28A258A6EA800D4CD74 /* JitsiMeetSDK.framework in Embed Frameworks */,
FD572B9927EDF32300A800FB /* GiphyUISDK.xcframework in Embed Frameworks */,
DE05038A256E904600DEE3A5 /* WebRTC.xcframework in Embed Frameworks */,
);
name = "Embed Frameworks";
@@ -158,6 +161,7 @@
DEFDBBDB25656E3B00344B23 /* WebRTC.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WebRTC.xcframework; path = "../../node_modules/react-native-webrtc/ios/WebRTC.xcframework"; sourceTree = "<group>"; };
E58801132278944E008B0561 /* JitsiMeetContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JitsiMeetContext.swift; sourceTree = "<group>"; };
E5C97B62227A1EB400199214 /* JitsiMeetCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JitsiMeetCommands.swift; sourceTree = "<group>"; };
FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = GiphyUISDK.xcframework; path = ../Pods/Giphy/GiphySDK/GiphyUISDK.xcframework; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -174,6 +178,7 @@
files = (
DE050389256E904600DEE3A5 /* WebRTC.xcframework in Frameworks */,
DEA9F289258A6EA800D4CD74 /* JitsiMeetSDK.framework in Frameworks */,
FD572B9827EDF32300A800FB /* GiphyUISDK.xcframework in Frameworks */,
2681BB562C7A0B42CFBA6719 /* libPods-JitsiMeet.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -199,6 +204,7 @@
0B26BE711EC5BC4D00EEFB41 /* Frameworks */ = {
isa = PBXGroup;
children = (
FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */,
DEA9F288258A6EA800D4CD74 /* JitsiMeetSDK.framework */,
DE050388256E904600DEE3A5 /* WebRTC.xcframework */,
0B26BE6D1EC5BC3C00EEFB41 /* JitsiMeet.framework */,

View File

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

View File

@@ -15,7 +15,6 @@
*/
import ReplayKit
import JitsiMeetSDK
private enum Constants {
// the App Group ID value that the app and the broadcast extension targets are setup with. It differs for each app.

View File

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

View File

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

View File

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

View File

@@ -12,6 +12,8 @@ DO_GIT_TAG=${GIT_TAG:-0}
echo "Releasing Jitsi Meet SDK ${SDK_VERSION}"
${THIS_DIR}/../../node_modules/react-native-webrtc/tools/downloadBitcode.sh
pushd ${RELEASE_REPO}
# Generate podspec file
@@ -35,7 +37,7 @@ xcodebuild archive \
-sdk iphonesimulator \
-destination='generic/platform=iOS Simulator' \
-archivePath ios/sdk/out/ios-simulator \
ENABLE_BITCODE=NO \
ENABLE_BITCODE=YES \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild archive \
@@ -45,7 +47,7 @@ xcodebuild archive \
-sdk iphoneos \
-destination='generic/platform=iOS' \
-archivePath ios/sdk/out/ios-device \
ENABLE_BITCODE=NO \
ENABLE_BITCODE=YES \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild -create-xcframework \
@@ -61,7 +63,6 @@ pushd ${RELEASE_REPO}
# Put the new files in the repo
cp -a ${PROJECT_REPO}/ios/sdk/out/JitsiMeetSDK.xcframework Frameworks/
cp -a ${PROJECT_REPO}/node_modules/react-native-webrtc/apple/WebRTC.xcframework Frameworks/
# Add all files to git
if [[ $DO_GIT_TAG == 1 ]]; then

View File

@@ -303,9 +303,9 @@
buildConfigurationList = 0BD906ED1EC0C00300C8C18E /* Build configuration list for PBXNativeTarget "JitsiMeetSDK" */;
buildPhases = (
26796D8589142D80C8AFDA51 /* [CP] Check Pods Manifest.lock */,
0BD906E21EC0C00300C8C18E /* Headers */,
0BD906E01EC0C00300C8C18E /* Sources */,
0BD906E11EC0C00300C8C18E /* Frameworks */,
0BD906E21EC0C00300C8C18E /* Headers */,
0BD906E31EC0C00300C8C18E /* Resources */,
DE17D0D426E0B86300F77E2E /* Copy sounds */,
0BCA49651EC4B77500B793EE /* Package React bundle */,

View File

@@ -35,9 +35,10 @@ typedef enum {
static NSString * const kDevicesChanged = @"org.jitsi.meet:features/audio-mode#devices-update";
// Device types (must match JS and Java)
static NSString * const kDeviceTypeHeadphones = @"HEADPHONES";
static NSString * const kDeviceTypeBluetooth = @"BLUETOOTH";
static NSString * const kDeviceTypeCar = @"CAR";
static NSString * const kDeviceTypeEarpiece = @"EARPIECE";
static NSString * const kDeviceTypeHeadphones = @"HEADPHONES";
static NSString * const kDeviceTypeSpeaker = @"SPEAKER";
static NSString * const kDeviceTypeUnknown = @"UNKNOWN";
@@ -190,7 +191,7 @@ RCT_EXPORT_METHOD(setAudioDevice:(NSString *)device
// The speaker is special, so test for it first.
if ([device isEqualToString:kDeviceTypeSpeaker]) {
forceSpeaker = NO;
forceSpeaker = YES;
success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
} else {
// Here we use AVAudioSession because RTCAudioSession doesn't expose availableInputs.
@@ -247,6 +248,8 @@ RCT_EXPORT_METHOD(updateDeviceList) {
- (void)audioSessionDidChangeRoute:(RTCAudioSession *)session
reason:(AVAudioSessionRouteChangeReason)reason
previousRoute:(AVAudioSessionRouteDescription *)previousRoute {
DDLogInfo(@"[AudioMode] Route changed, reason: %lu", (unsigned long)reason);
// Update JS about the changes.
[self notifyDevicesChanged];
@@ -259,8 +262,10 @@ RCT_EXPORT_METHOD(updateDeviceList) {
self->forceEarpiece = NO;
break;
case AVAudioSessionRouteChangeReasonCategoryChange:
// The category has changed. Check if it's the one we want and adjust as
// needed.
// The category has changed, re-apply our config.
// NB: It's tempting to doa category check here and skip the processing,
// but that won't work. If the config changes but the category remains
// the same we'll still find ourselves here.
break;
default:
return;
@@ -274,7 +279,6 @@ RCT_EXPORT_METHOD(updateDeviceList) {
RTCAudioSessionConfiguration *config = [self configForMode:self->activeMode];
[self setConfig:config error:nil];
if (self->forceSpeaker && !self->isSpeakerOn) {
RTCAudioSession *session = JitsiAudioSession.rtcAudioSession;
[session lockForConfiguration];
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
[session unlockForConfiguration];
@@ -320,6 +324,8 @@ RCT_EXPORT_METHOD(updateDeviceList) {
|| [portType isEqualToString:AVAudioSessionPortBluetoothLE]
|| [portType isEqualToString:AVAudioSessionPortBluetoothA2DP]) {
return kDeviceTypeBluetooth;
} else if ([portType isEqualToString:AVAudioSessionPortCarAudio]) {
return kDeviceTypeCar;
} else {
return kDeviceTypeUnknown;
}
@@ -355,7 +361,7 @@ RCT_EXPORT_METHOD(updateDeviceList) {
break;
}
}
for (AVAudioSessionPortDescription *portDesc in session.availableInputs) {
// Skip "Phone" if headphones are present.
if (headphonesAvailable && [portDesc.portType isEqualToString:AVAudioSessionPortBuiltInMic]) {

View File

@@ -27,5 +27,6 @@
- (void)closeChat;
- (void)sendChatMessage:(NSString*)message :(NSString*)to ;
- (void)sendSetVideoMuted:(BOOL)muted;
- (void)sendSetClosedCaptionsEnabled:(BOOL)enabled;
@end

View File

@@ -27,6 +27,7 @@ static NSString * const openChatAction = @"org.jitsi.meet.OPEN_CHAT";
static NSString * const closeChatAction = @"org.jitsi.meet.CLOSE_CHAT";
static NSString * const sendChatMessageAction = @"org.jitsi.meet.SEND_CHAT_MESSAGE";
static NSString * const setVideoMutedAction = @"org.jitsi.meet.SET_VIDEO_MUTED";
static NSString * const setClosedCaptionsEnabledAction = @"org.jitsi.meet.SET_CLOSED_CAPTIONS_ENABLED";
@implementation ExternalAPI
@@ -49,7 +50,8 @@ RCT_EXPORT_MODULE();
@"OPEN_CHAT": openChatAction,
@"CLOSE_CHAT": closeChatAction,
@"SEND_CHAT_MESSAGE": sendChatMessageAction,
@"SET_VIDEO_MUTED" : setVideoMutedAction
@"SET_VIDEO_MUTED" : setVideoMutedAction,
@"SET_CLOSED_CAPTIONS_ENABLED": setClosedCaptionsEnabledAction
};
};
@@ -73,7 +75,8 @@ RCT_EXPORT_MODULE();
openChatAction,
closeChatAction,
sendChatMessageAction,
setVideoMutedAction
setVideoMutedAction,
setClosedCaptionsEnabledAction
];
}
@@ -205,5 +208,10 @@ RCT_EXPORT_METHOD(sendEvent:(NSString *)name
[self sendEventWithName:setVideoMutedAction body:data];
}
- (void)sendSetClosedCaptionsEnabled:(BOOL)enabled {
NSDictionary *data = @{ @"enabled": [NSNumber numberWithBool:enabled]};
[self sendEventWithName:setClosedCaptionsEnabledAction body:data];
}
@end

View File

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

View File

@@ -45,5 +45,6 @@
- (void)closeChat;
- (void)sendChatMessage:(NSString * _Nonnull)message :(NSString * _Nullable)to;
- (void)setVideoMuted:(BOOL)muted;
- (void)setClosedCaptionsEnabled:(BOOL)enabled;
@end

View File

@@ -160,6 +160,11 @@ static void initializeViewsMap() {
[externalAPI sendSetVideoMuted:muted];
}
- (void)setClosedCaptionsEnabled:(BOOL)enabled {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendSetClosedCaptionsEnabled:enabled];
}
#pragma mark Private methods
/**

View File

@@ -17,14 +17,14 @@
import UIKit
final class DragGestureController {
var insets: UIEdgeInsets = UIEdgeInsets.zero
var currentPosition: PiPViewCoordinator.Position? = nil
private var frameBeforeDragging: CGRect = CGRect.zero
private weak var view: UIView?
private lazy var panGesture: UIPanGestureRecognizer = {
return UIPanGestureRecognizer(target: self,
action: #selector(handlePan(gesture:)))
UIPanGestureRecognizer(target: self,
action: #selector(handlePan(gesture:)))
}()
func startDragListener(inView view: UIView) {
@@ -40,7 +40,7 @@ final class DragGestureController {
}
@objc private func handlePan(gesture: UIPanGestureRecognizer) {
guard let view = self.view else { return }
guard let view = view else { return }
let translation = gesture.translation(in: view.superview)
let velocity = gesture.velocity(in: view.superview)
@@ -65,7 +65,7 @@ final class DragGestureController {
let velocityMagnitude = magnitude(vector: velocity)
let animationDuration = 0.5
let initialSpringVelocity =
velocityMagnitude / distanceMagnitude / CGFloat(animationDuration)
velocityMagnitude / distanceMagnitude / CGFloat(animationDuration)
frame.origin = CGPoint(x: finalPos.x, y: finalPos.y)
@@ -75,8 +75,7 @@ final class DragGestureController {
initialSpringVelocity: initialSpringVelocity,
options: .curveLinear,
animations: {
view.frame = frame
}, completion: nil)
view.frame = frame })
default:
break
@@ -85,9 +84,11 @@ final class DragGestureController {
private func calculateFinalPosition() -> CGPoint {
guard
let view = self.view,
let view = view,
let bounds = view.superview?.frame
else { return CGPoint.zero }
else {
return CGPoint.zero
}
let currentSize = view.frame.size
let adjustedBounds = bounds.inset(by: insets)
@@ -109,19 +110,26 @@ final class DragGestureController {
goUp = location.y < bounds.midY
}
let finalPosX: CGFloat =
goLeft
? adjustedBounds.origin.x
: bounds.size.width - insets.right - currentSize.width
let finalPosY: CGFloat =
goUp
? adjustedBounds.origin.y
: bounds.size.height - insets.bottom - currentSize.height
if (goLeft && goUp) {
currentPosition = .upperLeftCorner
}
return CGPoint(x: finalPosX, y: finalPosY)
if (!goLeft && goUp) {
currentPosition = .upperRightCorner
}
if (!goLeft && !goUp) {
currentPosition = .lowerRightCorner
}
if (goLeft && !goUp) {
currentPosition = .lowerLeftCorner
}
return currentPosition!.getOriginIn(bounds: adjustedBounds, size: currentSize)
}
private func magnitude(vector: CGPoint) -> CGFloat {
return sqrt(pow(vector.x, 2) + pow(vector.y, 2))
sqrt(pow(vector.x, 2) + pow(vector.y, 2))
}
}

View File

@@ -19,16 +19,23 @@ import UIKit
public typealias AnimationCompletion = (Bool) -> Void
public protocol PiPViewCoordinatorDelegate: class {
func exitPictureInPicture()
}
/// Coordinates the view state of a specified view to allow
/// to be presented in full screen or in a custom Picture in Picture mode.
/// This object will also provide the drag and tap interactions of the view
/// when is presented in Picure in Picture mode.
/// when is presented in Picture in Picture mode.
public class PiPViewCoordinator {
public enum Position {
case lowerRightCorner
case upperRightCorner
case lowerLeftCorner
case upperLeftCorner
}
/// Limits the boundaries of view position on screen when minimized
public var dragBoundInsets: UIEdgeInsets = UIEdgeInsets(top: 25,
left: 5,
@@ -39,23 +46,15 @@ public class PiPViewCoordinator {
}
}
public enum Position {
case lowerRightCorner
case upperRightCorner
case lowerLeftCorner
case upperLeftCorner
}
public var initialPositionInSuperview = Position.lowerRightCorner
public let initialPositionInSuperView: Position = .lowerRightCorner
// Unused. Remove on the next major release.
@available(*, deprecated, message: "The PiP window size is now fixed to 150px.")
public var c: CGFloat = 0.0
public weak var delegate: PiPViewCoordinatorDelegate?
private(set) var isInPiP: Bool = false // true if view is in PiP mode
private(set) var view: UIView
private var currentBounds: CGRect = CGRect.zero
@@ -66,6 +65,13 @@ public class PiPViewCoordinator {
public init(withView view: UIView) {
self.view = view
// Required because otherwise the view will not rotate correctly.
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// Otherwise the enter/exit pip animation looks odd
// when pip window is bottom left, top left or top right,
// because the jitsi view content does not animate, but jumps to the new size immediately.
view.clipsToBounds = true
}
/// Configure the view to be always on top of all the contents
@@ -74,7 +80,9 @@ public class PiPViewCoordinator {
public func configureAsStickyView(withParentView parentView: UIView? = nil) {
guard
let parentView = parentView ?? UIApplication.shared.keyWindow
else { return }
else {
return
}
parentView.addSubview(view)
currentBounds = parentView.bounds
@@ -109,6 +117,9 @@ public class PiPViewCoordinator {
/// around screen, and add a button of top of the view to be able to exit mode
public func enterPictureInPicture() {
isInPiP = true
// Resizing is done by hand when in pip.
view.autoresizingMask = []
animateViewChange()
dragController.startDragListener(inView: view)
dragController.insets = dragBoundInsets
@@ -125,6 +136,9 @@ public class PiPViewCoordinator {
/// exit pip button, and disable the drag gesture
@objc public func exitPictureInPicture() {
isInPiP = false
// Enable autoresizing again, which got disabled for pip.
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
animateViewChange()
dragController.stopDragListener()
@@ -136,7 +150,7 @@ public class PiPViewCoordinator {
let exitSelector = #selector(toggleExitPiP)
tapGestureRecognizer?.removeTarget(self, action: exitSelector)
tapGestureRecognizer = nil
delegate?.exitPictureInPicture()
}
@@ -144,6 +158,12 @@ public class PiPViewCoordinator {
/// screen size changes
public func resetBounds(bounds: CGRect) {
currentBounds = bounds
// Is required because otherwise the pip window is buggy when rotating the device.
// When not in pip then autoresize will do the job.
if (isInPiP) {
view.frame = changeViewRect()
}
}
/// Stop the dragging gesture of the root view
@@ -169,7 +189,6 @@ public class PiPViewCoordinator {
}
// MARK: - Interactions
@objc private func toggleExitPiP() {
if exitPiPButton == nil {
// show button
@@ -186,44 +205,28 @@ public class PiPViewCoordinator {
}
}
// MARK: - Size calculation
private func animateViewChange() {
func animateViewChange() {
UIView.animate(withDuration: 0.25) {
self.view.frame = self.changeViewRect()
self.view.setNeedsLayout()
}
}
private func changeViewRect() -> CGRect {
let bounds = currentBounds
guard isInPiP else {
if !isInPiP {
return bounds
}
// resize to suggested ratio and position to the bottom right
let adjustedBounds = bounds.inset(by: dragBoundInsets)
let size = CGSize(width: 150, height: 150)
let origin = initialPositionFor(pipSize: size, bounds: adjustedBounds)
let origin = (dragController.currentPosition ?? initialPositionInSuperView).getOriginIn(bounds: adjustedBounds, size: size)
return CGRect(x: origin.x, y: origin.y, width: size.width, height: size.height)
}
private func initialPositionFor(pipSize size: CGSize, bounds: CGRect) -> CGPoint {
switch initialPositionInSuperview {
case .lowerLeftCorner:
return CGPoint(x: bounds.minX, y: bounds.maxY - size.height)
case .lowerRightCorner:
return CGPoint(x: bounds.maxX - size.width, y: bounds.maxY - size.height)
case .upperLeftCorner:
return CGPoint(x: bounds.minX, y: bounds.minY)
case .upperRightCorner:
return CGPoint(x: bounds.maxX - size.width, y: bounds.minY)
}
}
// MARK: - Animation helpers
private func animateTransition(animations: @escaping () -> Void,
completion: AnimationCompletion?) {
UIView.animate(withDuration: 0.1,
@@ -234,3 +237,19 @@ public class PiPViewCoordinator {
}
}
// MARK: -
extension PiPViewCoordinator.Position {
func getOriginIn(bounds: CGRect, size: CGSize) -> CGPoint {
switch self {
case .lowerLeftCorner:
return CGPoint(x: bounds.minX, y: bounds.maxY - size.height)
case .lowerRightCorner:
return CGPoint(x: bounds.maxX - size.width, y: bounds.maxY - size.height)
case .upperLeftCorner:
return CGPoint(x: bounds.minX, y: bounds.minY)
case .upperRightCorner:
return CGPoint(x: bounds.maxX - size.width, y: bounds.minY)
}
}
}

View File

@@ -31,6 +31,7 @@
},
"audioDevices": {
"bluetooth": "بلوتوث",
"car": "مسجل السيارة",
"headphones": "سماعات رأس",
"none": "لا يوجد أي أجهزة صوت",
"phone": "هاتف",
@@ -39,9 +40,6 @@
"audioOnly": {
"audioOnly": "معدل تبادل البيانات منخفض"
},
"blankPage": {
"meetingEnded": "انتهى المُلتقى."
},
"breakoutRooms": {
"actions": {
"add": "أضف غرفة جانبية",
@@ -79,6 +77,17 @@
"refresh": "حدِّث الرزنامة",
"today": "اليوم"
},
"carmode": {
"actions": {
"leaveMeeting": "اترك الاجتماع",
"selectSoundDevice": "حدد جهاز الصوت"
},
"labels": {
"buttonLabel": "وضع السيارة",
"title": "وضع القيادة الآمنة",
"videoStopped": "تم إيقاف الفيديو الخاص بك"
}
},
"chat": {
"enter": "أدخل الغرفة",
"error": "خطأ: لم تُرسَل رسالتك. السبب: {{error}}",
@@ -107,6 +116,7 @@
},
"chromeExtensionBanner": {
"buttonText": "نزِّل إضافة متصفح كروم",
"buttonTextEdge": "قم بتثبيت ملحق Edge",
"close": "إغلق",
"dontShowAgain": "لا ترني هذه مرة أخرى",
"installExtensionText": "نزِّل الإضافة للدمج مع رزنامة غوغل ورزنامة أوفيس 365"
@@ -198,6 +208,9 @@
"selectADevice": "اختر جهازًا",
"testAudio": "اختبر الصوت"
},
"dialIn": {
"screenTitle": "ملخص الطلب"
},
"dialOut": {
"statusMessage": "{{status}} الآن"
},
@@ -559,6 +572,7 @@
"errorMissingPassword": "الرجاء إدخال كلمة مرور المُلتقى",
"invalidPassword": "كلمة مرور غير صحيحة",
"joinRejectedMessage": "رفض رئيس الجلسة منحك الإذن بالدخول إلى المُلتقى",
"joinRejectedTitle": "تم رفض طلب الانضمام.",
"joinTitle": "انضم للمُلتقى",
"joinWithPasswordMessage": "الرجاء الانتظار أثناء محاولة الدخول دون كلمة مرور...",
"joiningMessage": "ستتمكن من الانضمام للمُلتقى بعد الموافقة على طلبك",
@@ -631,6 +645,7 @@
"displayNotifications": "عرض الإخطارات لـ",
"focus": "التركيز على المؤتمر",
"focusFail": "إنَّ {{component}} غير متاح. ستعاد المحاولة مرة أخرى خلال {{ms}} ثانية.",
"gifsMenu": "GIPHY",
"groupTitle": "إشعارات",
"hostAskedUnmute": "The moderator would like you to speak",
"invitedOneMember": "دُعِي {{name}}",
@@ -646,6 +661,8 @@
"linkToSalesforceKey": "ربط هذا المُلتقى",
"linkToSalesforceProgress": "جارٍ ربط الاجتماع بـ Salesforce ...",
"linkToSalesforceSuccess": "تم ربط الاجتماع بـ Salesforce",
"localRecordingStarted": "بدأ {{name}} تسجيلًا محليًا.",
"localRecordingStopped": "أوقف {{name}} التسجيل المحلي.",
"me": "أنا",
"moderationInEffectCSDescription": "يرجى رفع اليد إذا كنت تريد مشاركة شاشتك.",
"moderationInEffectCSTitle": "تم حظر مشاركة الشاشة من قبل المشرف",
@@ -724,6 +741,7 @@
},
"passwordDigitsOnly": "حتى {{number}} عدد",
"passwordSetRemotely": "ضبطها مشارك آخر",
"pinnedParticipant": "تم تثبيت المشارك",
"polls": {
"answer": {
"skip": "تخطى",
@@ -800,6 +818,7 @@
"initiated": "بدأ الاتصال",
"joinAudioByPhone": "انضم مع صوت من الجوال",
"joinMeeting": "انضم للمُلتقى",
"joinMeetingInLowBandwidthMode": "الانضمام في وضع النطاق الترددي المنخفض",
"joinWithoutAudio": "انضم دون صوت",
"keyboardShortcuts": "تفعيل اختصارات لوحة المفاتيح",
"linkCopied": "نُسِخ الرابط",
@@ -865,6 +884,7 @@
"expandedPending": "بدء التسجيل...",
"failedToStart": "فشل بدء التسجيل",
"fileSharingdescription": "شارك التسجيل مع المشاركين للمُلتقى",
"highlight": "تسليط الضوء",
"highlightMoment": "لحظة تسليط الضوء",
"highlightMomentDisabled": "يمكنك تمييز اللحظات التي يبدأ فيها التسجيل",
"highlightMomentSuccess": "تم تمييز اللحظة",
@@ -874,6 +894,7 @@
"limitNotificationDescriptionWeb": "نظرًا للضغط الكبير، سيقيَّد التسجيل إلى {{limit}} د، ولكن إن أردت التسجيل لمدة مفتوحة، جرِّب <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"linkGenerated": "لقد أنشأنا رابطًا لتسجيلك.",
"live": "مباشر",
"localRecordingWarning": "تأكد من تحديد علامة التبويب الحالية لاستخدام الفيديو والصوت الصحيحين. التسجيل محدود حاليًا بـ 1 كيغابايت ، أي حوالي 100 دقيقة.",
"loggedIn": "مُسجَّل باسم {{userName}}",
"off": "أوقِف التسجيل",
"offBy": "أوقَف {{name}} التسجيل",
@@ -881,6 +902,7 @@
"onBy": "بدأ {{name}} التسجيل",
"pending": "التحضير لتسجيل المُلتقى...",
"rec": "تسجيل",
"saveLocalRecording": "حفظ ملف التسجيل محليا",
"serviceDescription": "ستحفظ خدمة التسجيل الفيديو المستجل",
"serviceDescriptionCloud": "تسجيل سحابي",
"serviceDescriptionCloudInfo": "يتم مسح المُلتقيات المسجلة تلقائيًا بعد 24 ساعة من وقت التسجيل.",
@@ -888,10 +910,12 @@
"sessionAlreadyActive": "هذه الجلسة قيد التسجيل أو البث المباشر.",
"signIn": "دخول",
"signOut": "خروج",
"surfaceError": "الرجاء تحديد علامة التبويب الحالية.",
"unavailable": "عجبًا! {{serviceName}} غير متاحة حاليًا. نعمل على حل المشكلة. حاول مرة أخرى لاحقًا.",
"unavailableTitle": "التسجيل غير متاح",
"uploadToCloud": "تحميل إلى السحابة"
},
"screenshareDisplayName": "شاشة {{name}}",
"sectionList": {
"pullToRefresh": "اسحب للتحديث"
},
@@ -918,6 +942,7 @@
"incomingMessage": "رسالة واردة",
"language": "اللغة",
"loggedIn": "الدخول باسم {{name}}",
"maxStageParticipants": "الحد الأقصى لعدد المشاركين الذين يمكن تثبيتهم في المرحلة الرئيسية",
"microphones": "المجهار (المايكروفون)",
"moderator": "رئيس الجلسة",
"more": "المزيد",
@@ -928,6 +953,7 @@
"playSounds": "تشغيل الصوت عند:",
"reactions": "ردود فعل المُلتقى",
"sameAsSystem": "مثل النظام ({{label}})",
"screenTitle": "إعدادات",
"selectAudioOutput": "خرج الصوت",
"selectCamera": "الكاميرا",
"selectMic": "المجهار (المايكروفون)",
@@ -953,6 +979,7 @@
"disableCrashReportingWarning": "أمتأكد من تعطيل تقارير الأعطال التقنية؟ ستسري الإعدادات الجديدة بعد إعادة تشغيل التطبيق",
"disableP2P": "تعطيل وضع واحد شخص-لشخص",
"displayName": "عرض الاسم",
"displayNamePlaceholderText": "على سبيل المثال: علي الحيدري",
"email": "البريد الإلكتروني",
"header": "الإعدادات",
"profileSection": "الملف الشخصي",
@@ -1006,10 +1033,12 @@
"boo": "Boo",
"breakoutRoom": "الانضمام / مغادرة غرفة فرعية",
"callQuality": "اضبط دقة الفيديو",
"carmode": "وضع السيارة",
"cc": "اظهِر/اخفِ الترجمة",
"chat": "اظهِر/اخفِ نافذة الدردشة",
"clap": "تصفيق",
"collapse": "قلّص",
"dock": "إرساء في النافذة الرئيسية",
"document": "اظهِر/اخفِ الملف المشارك",
"download": "نزِّل التطبيق",
"embedMeeting": "ضمِّن المُلتقى",
@@ -1060,6 +1089,7 @@
"tileView": "اظهِر/اخفِ عرض العنوان",
"toggleCamera": "بدِّل الكاميرا",
"toggleFilmstrip": "بدِّل وضع الشريط السينمائي (filmstrip)",
"undock": "فك في نافذة منفصلة",
"videoblur": "استعمل/اخرج من وضع تغبيش خلفية الفيديو",
"videomute": "بدِّل وضع اخفاء الفيديو"
},
@@ -1076,6 +1106,7 @@
"closeChat": "أغلق الدردشة",
"closeReactionsMenu": "إغلاق قائمة ردود الفعل",
"disableReactionSounds": "يمكنك تعطيل أصوات ردود الفعل لهذا المُلتقى",
"dock": "إرساء في النافذة الرئيسية",
"documentClose": "أغلق الملف المشارك",
"documentOpen": "افتح الملف المشارك",
"download": "نزِّل التطبيق",
@@ -1144,6 +1175,7 @@
"talkWhileMutedPopup": "أتحاول التحدث؟ المجهار مكتوم لديك.",
"tileViewToggle": "بدِّل عنوان العرض",
"toggleCamera": "بدِّل الكاميرا",
"undock": "فك في نافذة منفصلة",
"videoSettings": "اعدادات الفيديو",
"videomute": "استعمل / أوقف الكاميرا"
},
@@ -1214,10 +1246,12 @@
"moderator": "رئيس الجلسة",
"mute": "المشارك مكتوم الصوت",
"muted": "مكتوم",
"pinToStage": "تثبيت في المرحلة",
"remoteControl": "بدء / إيقاف التحكم البعيد",
"screenSharing": "المشارك يشارك شاشته",
"show": "أظهر على المنصة",
"showSelfView": "إظهار الواجهة الذاتية",
"unpinFromStage": "فك",
"videoMuted": "الكاميرا معطلة",
"videomute": "أوقف المشارك الكاميرا"
},

View File

@@ -31,6 +31,7 @@
},
"audioDevices": {
"bluetooth": "Bluetooth",
"car": "Àudio del cotxe",
"headphones": "Auriculars",
"none": "No hi ha disponible cap aparell d'àudio",
"phone": "Telèfon",
@@ -39,9 +40,6 @@
"audioOnly": {
"audioOnly": "Poca amplada de banda"
},
"blankPage": {
"meetingEnded": "La reunió ha acabat"
},
"breakoutRooms": {
"actions": {
"add": "Afegeix una sala de descans",
@@ -79,10 +77,22 @@
"refresh": "Actualitza l'agenda",
"today": "Avui"
},
"carmode": {
"actions": {
"leaveMeeting": "Abandona la reunió",
"selectSoundDevice": "Seleccioneu l'aparell d'àudio"
},
"labels": {
"buttonLabel": "Mode cotxe",
"title": "Mode conducció segura",
"videoStopped": "El vídeo està aturat"
}
},
"chat": {
"enter": "Entra a la sala",
"error": "Error: no s'ha enviat el missatge. Raó: {{error}}",
"fieldPlaceHolder": "Escriviu aquí el missatge",
"lobbyChatMessageTo": "Envia un missatge en la sala d'espera a {{recipient}}",
"message": "Missatge",
"messageAccessibleTitle": "{{user}} diu:",
"messageAccessibleTitleMe": "jo dic:",
@@ -208,13 +218,15 @@
"Remove": "Elimina",
"Share": "Comparteix",
"Submit": "Tramet",
"WaitForHostMsg": "La conferència encara no ha començat. Si en sou l'amfitrió autentiqueu-vos. Altrament, espereu que arribi l'amfitrió.",
"WaitForHostMsg": "La conferència encara no ha començat. Si en sou l'amfitrió, autentiqueu-vos. Altrament, espereu que arribi l'amfitrió.",
"WaitingForHostTitle": "S'està esperant l'amfitrió...",
"Yes": "Sí",
"accessibilityLabel": {
"liveStreaming": "Transmissió en directe"
},
"add": "Afegeix",
"addMeetingNote": "Afegiu una nota sobre aquesta reunió",
"addOptionalNote": "Afegeix una nota (opcional):",
"allow": "Permet",
"alreadySharedVideoMsg": "Un altre participant està compartint un vídeo. Aquesta conferència només permet compartir un vídeo a la vegada.",
"alreadySharedVideoTitle": "Només es permet un vídeo compartit a la vegada",
@@ -266,6 +278,8 @@
"kickParticipantDialog": "Esteu segur que voleu expulsar aquest participant?",
"kickParticipantTitle": "Voleu expulsar aquest participant?",
"kickTitle": "Ep! {{participantDisplayName}} us ha expulsat de la reunió",
"linkMeeting": "Enllaça la reunió",
"linkMeetingTitle": "Enllaça la reunió a Salesforce",
"liveStreaming": "Transmissió en directe",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "No és possible mentre l'enregistrament estigui actiu",
"liveStreamingDisabledTooltip": "No es pot iniciar la transmissió en directe.",
@@ -320,6 +334,7 @@
"popupError": "El vostre navegador bloca les finestres emergents d'aquest lloc. Habiliteu les finestres emergents a la configuració de seguretat del navegador i torneu-ho a intentar.",
"popupErrorTitle": "Finestres emergents blocades",
"readMore": "més",
"recentlyUsedObjects": "Els objectes que heu usat recentment",
"recording": "Enregistrament",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "No és possible mentre hi ha una transmissió en directe activa",
"recordingDisabledTooltip": "No es pot enregistrar.",
@@ -342,6 +357,12 @@
"screenSharingFailed": "Ep! Alguna cosa ha anat malament, no hem pogut iniciar la compartició de pantalla!",
"screenSharingFailedTitle": "La compartició de pantalla ha fallat!",
"screenSharingPermissionDeniedError": "Ep! Alguna cosa ha anat malament amb els permisos de compartició de pantalla. Torna a carregar-la i prova-ho una altra vegada.",
"searchInSalesforce": "Cerca a Salesforce",
"searchResults": "Resultats de la cerca({{count}})",
"searchResultsDetailsError": "Alguna cosa ha anat malament en recuperar les dades del propietari.",
"searchResultsError": "Alguna cosa ha anat malament en recuperar les dades.",
"searchResultsNotFound": "No s'ha trobat cap resultat.",
"searchResultsTryAgain": "Proveu usant paraules clau alternatives.",
"sendPrivateMessage": "Fa poc que heu rebut un missatge privat. Voleu respondre'l de forma privada, o voleu enviar el missatge al grup?",
"sendPrivateMessageCancel": "Envia'l al grup",
"sendPrivateMessageOk": "Envia'l en privat",
@@ -351,20 +372,22 @@
"sessionRestarted": "La trucada s'ha reiniciat a causa d'un problema de connexió.",
"shareAudio": "Continua",
"shareAudioTitle": "Com compartir l'àudio",
"shareAudioWarningD1": "heu d'aturar la compartició de pantalla abans de compartir l'àudio.",
"shareAudioWarningD2": "heu de reiniciar la compartició de pantalla i marcar l'opció «Comparteix l'àudio».",
"shareAudioWarningD1": "cal que atureu la compartició de pantalla abans de compartir l'àudio.",
"shareAudioWarningD2": "cal que reinicieu la compartició de pantalla i marqueu l'opció «Comparteix l'àudio».",
"shareAudioWarningH1": "Si voleu compartir només l'àudio:",
"shareAudioWarningTitle": "Heu d'aturar la compartició de pantalla abans de compartir l'àudio",
"shareAudioWarningTitle": "Cal que atureu la compartició de pantalla abans de compartir l'àudio",
"shareMediaWarningGenericH2": "Si voleu compartir la pantalla i l'àudio",
"shareScreenWarningD1": "heu d'aturar l'ús compartit d'àudio abans de compartir la pantalla.",
"shareScreenWarningD2": "heu d'aturar l'ús compartit d'àudio, iniciar l'ús compartit de la pantalla i marcar l'opció «Comparteix l'àudio».",
"shareScreenWarningH1": "Si només voleu compartir la pantalla:",
"shareScreenWarningTitle": "Heu d'aturar l'ús compartit d'àudio abans de compartir la pantalla",
"shareScreenWarningTitle": "Cal que atureu l'ús compartit d'àudio abans de compartir la pantalla",
"shareVideoLinkError": "Proporcioneu un enllaç de vídeo correcte.",
"shareVideoTitle": "Comparteix el vídeo",
"shareYourScreen": "Comparteix la pantalla",
"shareYourScreenDisabled": "S'ha inhabilitat la compartició de pantalla.",
"sharedVideoDialogError": "Error: URL no vàlid",
"sharedVideoLinkPlaceholder": "Enllaç de YouTube o enllaç directe del vídeo",
"start": "Inicia",
"startLiveStreaming": "Inicia la transmissió en directe",
"startRecording": "Inicia l'enregistrament",
"startRemoteControlErrorMessage": "S'ha produït un error en intentar iniciar la sessió de control remot!",
@@ -407,6 +430,10 @@
"veryBad": "Molt dolenta",
"veryGood": "Molt bona"
},
"giphy": {
"noResults": "No s'ha trobat cap resultat :(",
"search": "Cerca a GIPHY"
},
"helpView": {
"header": "Centre d'ajuda"
},
@@ -473,6 +500,7 @@
"focusLocal": "Focus al vostre vídeo",
"focusRemote": "Focus en el vídeo d'una altra persona",
"fullScreen": "Entra o surt de la pantalla completa",
"giphyMenu": "Mostra o amaga el menú GIPHY",
"keyboardShortcuts": "Dreceres de teclat",
"localRecording": "Mostra o amaga els controls d'enregistrament local",
"mute": "Silencia o activa el so",
@@ -527,6 +555,7 @@
"admitAll": "Admet tothom",
"allow": "Permet",
"backToKnockModeButton": "Demaneu per a unir-vos",
"chat": "Xat",
"dialogTitle": "Mode de sala d'espera",
"disableDialogContent": "El mode de sala d'espera es troba activat. Aquesta funcionalitat evita que els participants no desitjats puguin unir-se a la reunió. Voleu desactivar-ho?",
"disableDialogSubmit": "Desactiva",
@@ -539,6 +568,7 @@
"errorMissingPassword": "Introduïu la contrasenya de la reunió",
"invalidPassword": "La contrasenya no és vàlida",
"joinRejectedMessage": "La vostra sol·licitud ha estat rebutjada per un moderador.",
"joinRejectedTitle": "S'ha rebutjat la petició d'unir-s'hi.",
"joinTitle": "Entra a la reunió",
"joinWithPasswordMessage": "S'està intentant unir-s'hi amb contrasenya, espereu...",
"joiningMessage": "Us unireu a la reunió de seguida que algú accepti la sol·licitud",
@@ -547,6 +577,8 @@
"knockButton": "Demana d'unir-se",
"knockTitle": "Algú vol unir-se a la reunió",
"knockingParticipantList": "Llista de participants que piquen per a entrar",
"lobbyChatStartedNotification": "{{moderator}} ha començat un xat en la sala d'espera amb {{attendee}}",
"lobbyChatStartedTitle": "{{moderator}} ha començat un xat en la sala d'espera amb vós.",
"nameField": "Introduïu el vostre nom",
"notificationLobbyAccessDenied": "{{originParticipantName}} ha rebutjat l'entrada de {{targetParticipantName}}",
"notificationLobbyAccessGranted": "{{originParticipantName}} ha acceptat l'entrada de {{targetParticipantName}}",
@@ -609,6 +641,7 @@
"displayNotifications": "Mostra les notificacions sobre",
"focus": "Focus de la conferència",
"focusFail": "{{component}} no és disponible, torneu a intentar en {{ms}} segons",
"gifsMenu": "GIPHY",
"groupTitle": "Notificacions",
"hostAskedUnmute": "El moderador vol que parleu",
"invitedOneMember": "S'ha convidat {{name}}",
@@ -618,6 +651,12 @@
"leftOneMember": "{{name}} ha sortit de la reunió",
"leftThreePlusMembers": "{{name}} i molts d'altres han sortit de la reunió",
"leftTwoMembers": "{{first}} i {{second}} han sortit de la reunió",
"linkToSalesforce": "Enllaç a Salesforce",
"linkToSalesforceDescription": "Podeu enllaçar el resum de la reunió a un objecte Salesforce.",
"linkToSalesforceError": "No s'ha pogut enllaçar la reunió a Salesforce",
"linkToSalesforceKey": "Enllaça aquesta reunió",
"linkToSalesforceProgress": "S'està enllaçant la reunió a Salesforce...",
"linkToSalesforceSuccess": "La reunió s'ha enllaçat a Salesforce",
"me": "Jo",
"moderationInEffectCSDescription": "Aixequeu la mà si voleu compartir la pantalla.",
"moderationInEffectCSTitle": "El moderador ha blocat la compartició de pantalla",
@@ -641,6 +680,8 @@
"oldElectronClientDescription1": "Sembla que useu una versió antiga del client Jitsi Meet, que té vulnerabilitats de seguretat conegudes. Assegureu-vos d'actualitzar-lo",
"oldElectronClientDescription2": "última construcció",
"oldElectronClientDescription3": "ara!",
"participantWantsToJoin": "Vol unir-se a la reunió",
"participantsWantToJoin": "Volen unir-se a la reunió",
"passwordRemovedRemotely": "Un altre participant ha eliminat $t(lockRoomPasswordUppercase)",
"passwordSetRemotely": "Un altre participant ha establert la $t(lockRoomPassword)",
"raiseHandAction": "Aixeca la mà",
@@ -648,7 +689,7 @@
"raisedHands": "{{participantName}} i {{raisedHands}} persones més",
"reactionSounds": "Desactiva el so",
"reactionSoundsForAll": "Desactiva el so per a tothom",
"screenShareNoAudio": "La casella Comparteix l'àudio no s'ha marcat a la pantalla de selecció de la finestra.",
"screenShareNoAudio": "No s'ha marcat la compartició d'àudio en la pantalla de selecció de la finestra.",
"screenShareNoAudioTitle": "No s'ha pogut compartir l'àudio del sistema!",
"selfViewTitle": "Sempre podeu activar la vista pròpia des de la configuració",
"somebody": "Algú",
@@ -660,7 +701,9 @@
"videoMutedRemotelyDescription": "Sempre la podeu activar de nou.",
"videoMutedRemotelyTitle": "{{participantDisplayName}} us ha apagat el vídeo",
"videoUnmuteBlockedDescription": "L'activació de la càmera i la compartició d'escriptori s'han blocat temporalment per limitacions del sistema.",
"videoUnmuteBlockedTitle": "L'activació de la càmera i la compartició d'escriptori estan blocades!"
"videoUnmuteBlockedTitle": "L'activació de la càmera i la compartició d'escriptori estan blocades!",
"viewLobby": "Mostra la sala d'espera",
"waitingParticipants": "{{waitingParticipants}} persones"
},
"participantsPane": {
"actions": {
@@ -692,6 +735,7 @@
},
"passwordDigitsOnly": "Fins a {{number}} dígits",
"passwordSetRemotely": "Establerta per un altre participant",
"pinnedParticipant": "El participant està fixat",
"polls": {
"answer": {
"skip": "Omet",
@@ -748,7 +792,7 @@
"veryPoorConnection": "És esperable que la qualitat de la trucada sigui realment terrible.",
"videoFreezing": "És esperable que el vídeo es congeli, passi a negre i aparegui pixelat.",
"videoHighQuality": "És esperable que el vídeo tingui una bona qualitat.",
"videoLowQuality": "És esperable que el vídeo sigui de poca qualitat en termes de marcs per segon i resolució.",
"videoLowQuality": "És esperable que el vídeo sigui de poca qualitat en termes de fotogrames per segon i resolució.",
"videoTearing": "És esperable que el vídeo aparegui pixelat o amb defectes visuals."
},
"copyAndShare": "Copia i comparteix l'enllaç de la reunió",
@@ -807,6 +851,18 @@
},
"raisedHand": "Vull parlar",
"raisedHandsLabel": "Nombre de mans aixecades",
"record": {
"already": {
"linked": "La reunió ja està enllaçada amb aquest objecte de Salesforce."
},
"type": {
"account": "Compte",
"contact": "Contacte",
"lead": "Principal",
"opportunity": "Oportunitat",
"owner": "Propietari"
}
},
"recording": {
"authDropboxText": "Puja a Dropbox",
"availableSpace": "Espai disponible: {{spaceLeft}} MB (aproximadament {{duration}} minuts d'enregistrament)",
@@ -820,7 +876,12 @@
"expandedOn": "S'està enregistrant la reunió.",
"expandedPending": "S'ha iniciat l'enregistrament...",
"failedToStart": "No s'ha pogut iniciar l'enregistrament",
"fileSharingdescription": "Comparteix l'enregistrament amb els participants de la reunió",
"fileSharingdescription": "Compartiu l'enllaç de l'enregistrament de la reunió amb els participants",
"highlight": "Destaca",
"highlightMoment": "Destaca el moment",
"highlightMomentDisabled": "Podeu destacar moment en iniciar-se l'enregistrament",
"highlightMomentSuccess": "Moment destacat",
"highlightMomentSucessDescription": "S'ha afegit el moment destacat al resum de la reunió.",
"inProgress": "L'enregistrament o la transmissió en directe és en progrés",
"limitNotificationDescriptionNative": "A causa de la gran demanda, el vostre enregistrament es limitarà a {{limit}} min. Per a enregistraments il·limitats, proveu <3>{{app}}</3>.",
"limitNotificationDescriptionWeb": "A causa de la gran demanda, l'enregistrament es limitarà a {{limit}} min. Per a enregistraments il·limitats, proveu <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
@@ -835,6 +896,7 @@
"rec": "ENREG",
"serviceDescription": "El servei d'enregistrament desarà el vostre enregistrament",
"serviceDescriptionCloud": "Enregistrament al núvol",
"serviceDescriptionCloudInfo": "Les reunions enregistrades s'esborren automàticament 24 hores després de l'enregistrament.",
"serviceName": "Servei d'enregistrament",
"sessionAlreadyActive": "Aquesta sessió ja s'està enregistrant o emetent en directe.",
"signIn": "Inicia la sessió",
@@ -843,6 +905,7 @@
"unavailableTitle": "L'enregistrament no és disponible",
"uploadToCloud": "Puja al núvol"
},
"screenshareDisplayName": "Pantalla de: {{name}}",
"sectionList": {
"pullToRefresh": "Estireu per a actualitzar"
},
@@ -862,13 +925,14 @@
},
"desktopShareFramerate": "Velocitat de fotogrames en la compartició d'escriptori",
"desktopShareHighFpsWarning": "Una velocitat de fotogrames més alta per a compartir escriptori pot afectar l'amplada de banda. Heu de reiniciar la compartició de pantalla perquè la nova configuració tingui efecte.",
"desktopShareWarning": "Heu de reiniciar la compartició de pantalla perquè la nova configuració tingui efecte.",
"desktopShareWarning": "Cal que reinicieu la compartició de pantalla perquè la nova configuració tingui efecte.",
"devices": "Aparells",
"followMe": "Tothom que em segueix",
"framesPerSecond": "marcs per segon",
"framesPerSecond": "fotogrames per segon",
"incomingMessage": "Missatge entrant",
"language": "Llengua",
"loggedIn": "Sessió iniciada com a {{name}}",
"maxStageParticipants": "El nombre màxim de participants que es poden fixar en la escena principal",
"microphones": "Micròfons",
"moderator": "Moderador",
"more": "Més",
@@ -921,6 +985,7 @@
"speakerStats": {
"angry": "Enuig",
"disgusted": "Disgust",
"displayEmotions": "Mostra les emocions",
"fearful": "Temor",
"happy": "Felicitat",
"hours": "{{count}}h",
@@ -955,16 +1020,19 @@
"boo": "Esbroncada",
"breakoutRoom": "Entra o surt de la sala de descans",
"callQuality": "Gestiona la qualitat de la trucada",
"carmode": "Mode cotxe",
"cc": "Activa o desactiva els subtítols",
"chat": "Obre o tanca el xat",
"clap": "Picament de mans",
"collapse": "Col·lapsa",
"dock": "Acobla a la finestra principal",
"document": "Activa o desactiva el document compartit",
"download": "Baixeu les nostres aplicacions",
"embedMeeting": "Insereix la reunió",
"expand": "Expandeix",
"feedback": "Deixa comentaris",
"fullScreen": "Activa o desactiva la pantalla completa",
"giphy": "Mostra o amaga el menú GIPHY",
"grantModerator": "Concedir drets de moderador",
"hangup": "Surt de la reunió",
"help": "Ajuda",
@@ -972,6 +1040,7 @@
"kick": "Expulsa el participant",
"laugh": "Riure",
"like": "Polzes amunt",
"linkToSalesforce": "Enllaç a Salesforce",
"lobbyButton": "Activa o desactiva la sala d'espera",
"localRecording": "Activa o desactiva els controls d'enregistrament local",
"lockRoom": "Activa o desactiva la contrasenya de la reunió",
@@ -994,10 +1063,11 @@
"remoteVideoMute": "Desactiva la càmera del participant",
"security": "Opcions de seguretat",
"selectBackground": "Trieu un fons",
"selfView": "Mostra o amaga la visualització d'un mateix",
"shareRoom": "Convida-hi algú",
"shareYourScreen": "Inicia o atura la compartició de pantalla",
"shareaudio": "Comparteix l'àudio",
"sharedvideo": "Activa o desactiva la compartició de vídeo",
"sharedvideo": "Mostra o amaga la compartició de vídeo",
"shortcuts": "Activa o desactiva les dreceres",
"show": "Mostra-ho en l'escena",
"silence": "Silenci",
@@ -1006,6 +1076,7 @@
"tileView": "Activa o desactiva el mode mosaic",
"toggleCamera": "Activa o desactiva la càmera",
"toggleFilmstrip": "Mostra o amaga la cinta",
"undock": "Desacobla en una finestra separada",
"videoblur": "Activa o desactiva el desenfocament del vídeo",
"videomute": "Activa o desactiva la càmera"
},
@@ -1022,6 +1093,7 @@
"closeChat": "Tanca el xat",
"closeReactionsMenu": "Tanca el menú de reaccions",
"disableReactionSounds": "Podeu desactivar els sons de reacció per a aquesta reunió",
"dock": "Acobla en la finestra principal",
"documentClose": "Tanca el document compartit",
"documentOpen": "Obre el document compartit",
"download": "Baixeu les nostres aplicacions",
@@ -1032,6 +1104,7 @@
"exitFullScreen": "Surt de la pantalla completa",
"exitTileView": "Surt del mode mosaic",
"feedback": "Deixa comentaris",
"giphy": "Mostra o amaga el menú GIPHY",
"hangup": "Surt la reunió",
"help": "Ajuda",
"invite": "Convida-hi persones",
@@ -1039,6 +1112,7 @@
"laugh": "Riure",
"leaveBreakoutRoom": "Surt de la sala de descans",
"like": "Polzes amunt",
"linkToSalesforce": "Enllaç a Salesforce",
"lobbyButtonDisable": "Desactiva el mode de sala d'espera",
"lobbyButtonEnable": "Activa el mode de sala d'espera",
"login": "Inicia sessió",
@@ -1088,6 +1162,7 @@
"talkWhileMutedPopup": "Intenteu parlar? Esteu silenciat.",
"tileViewToggle": "Activa o desactiva el mode mosaic",
"toggleCamera": "Activa o desactiva la càmera",
"undock": "Desacobla en una finestra principal",
"videoSettings": "Paràmetres de vídeo",
"videomute": "Inicia o atura la càmera"
},
@@ -1158,8 +1233,12 @@
"moderator": "Moderador",
"mute": "El participant està silenciat",
"muted": "Silenciat",
"pinToStage": "Fixa a l'escena",
"remoteControl": "Inicia o atura el control remot",
"screenSharing": "El participant està compartint la pantalla",
"show": "Mostra-ho en l'escena",
"showSelfView": "Mostra la visualització d'un mateix",
"unpinFromStage": "Deixa de fixar",
"videoMuted": "La càmera està desactivada",
"videomute": "El participant ha aturat la càmera"
},

View File

@@ -31,6 +31,7 @@
},
"audioDevices": {
"bluetooth": "Bluetooth",
"car": "Auto",
"headphones": "Kopfhörer",
"none": "Keine Audiogeräte verfügbar",
"phone": "Hörer",
@@ -216,6 +217,8 @@
"liveStreaming": "Livestream"
},
"add": "Hinzufügen",
"addMeetingNote": "Notiz zu dieser Konferenz hinzufügen",
"addOptionalNote": "Notiz hinzufügen (optional):",
"allow": "Erlauben",
"alreadySharedVideoMsg": "Eine andere Person gibt bereits ein Video weiter. Bei dieser Konferenz ist jeweils nur ein geteiltes Video möglich.",
"alreadySharedVideoTitle": "Nur ein geteiltes Video gleichzeitig",
@@ -267,6 +270,8 @@
"kickParticipantDialog": "Wollen Sie diese Person wirklich entfernen?",
"kickParticipantTitle": "Person entfernen?",
"kickTitle": "Autsch! {{participantDisplayName}} hat Sie aus dem Meeting geworfen",
"linkMeeting": "Konferenz verlinken",
"linkMeetingTitle": "Konferenz mit Salesforce verlinken",
"liveStreaming": "Livestreaming",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Während einer Aufnahme nicht möglich",
"liveStreamingDisabledTooltip": "Starten des Livestreams deaktiviert.",
@@ -303,11 +308,11 @@
"muteEveryonesVideoTitle": "Die Kamera von allen anderen ausschalten?",
"muteParticipantBody": "Sie können die Stummschaltung anderer Personen nicht aufheben, aber eine Person kann ihre eigene Stummschaltung jederzeit beenden.",
"muteParticipantButton": "Stummschalten",
"muteParticipantDialog": "Wollen Sie diese Person wirklich stummschalten? Sie können die Stummschaltung nicht wieder aufheben, die Person kann dies aber jederzeit selbst tun.",
"muteParticipantTitle": "Person stummschalten?",
"muteParticipantsVideoBody": "Sie können die Kamera nicht wieder aktivieren, die Teilnehmer können dies aber jederzeit wieder ändern.",
"muteParticipantsVideoBodyModerationOn": "Sie können die Kamera nicht wieder aktivieren und die Person selbst auch nicht.",
"muteParticipantsVideoButton": "Kamera ausschalten",
"muteParticipantsVideoDialog": "Wollen Sie die Kamera dieser Person wirklich deaktivieren? Sie können die Kamera nicht wieder aktivieren, die Person kann dies aber jederzeit selbst tun.",
"muteParticipantsVideoDialogModerationOn": "Wollen Sie die Kamera dieser Person wirklich deaktivieren? Sie können die Kamea nicht wieder aktivieren und die Person selbst auch nicht.",
"muteParticipantsVideoTitle": "Die Kamera von dieser Person ausschalten?",
"noDropboxToken": "Kein gültiges Dropbox-Token",
"password": "Passwort",
@@ -321,6 +326,7 @@
"popupError": "Ihr Browser blockiert Pop-ups von dieser Website. Bitte aktivieren Sie Pop-ups in den Sicherheitseinstellungen des Browsers und versuchen Sie es erneut.",
"popupErrorTitle": "Pop-up blockiert",
"readMore": "mehr",
"recentlyUsedObjects": "Ihre zuletzt verwendeten Objekte",
"recording": "Aufnahme",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Während eines Livestreams nicht möglich",
"recordingDisabledTooltip": "Start der Aufzeichnung deaktiviert.",
@@ -343,6 +349,12 @@
"screenSharingFailed": "Ups! Beim Teilen des Bildschirms ist etwas schiefgegangen!",
"screenSharingFailedTitle": "Bildschirmfreigabe fehlgeschlagen!",
"screenSharingPermissionDeniedError": "Ups! Etwas stimmt nicht mit Ihren Berechtigungen zur Bildschirmfreigabe. Bitte neu laden und erneut versuchen.",
"searchInSalesforce": "In Salesforce suchen",
"searchResults": "Suchergebnisse({{count}})",
"searchResultsDetailsError": "Beim Abrufen der Daten des Besitzers ist ein Fehler aufgetreten.",
"searchResultsError": "Beim Abrufen der Daten ist ein Fehler aufgetreten.",
"searchResultsNotFound": "Keine Suchergebnisse.",
"searchResultsTryAgain": "Versuchen Sie es mit anderen Stichwörtern.",
"sendPrivateMessage": "Sie haben kürzlich eine private Nachricht erhalten. Hatten Sie die Absicht, darauf privat zu antworten, oder wollen Sie Ihre Nachricht an die Gruppe senden?",
"sendPrivateMessageCancel": "An die Gruppe senden",
"sendPrivateMessageOk": "Privat antworten",
@@ -410,6 +422,10 @@
"veryBad": "Sehr schlecht",
"veryGood": "Sehr gut"
},
"giphy": {
"noResults": "Keine Ergebnisse :(",
"search": "GIPHY durchsuchen"
},
"helpView": {
"header": "Hilfecenter"
},
@@ -476,6 +492,7 @@
"focusLocal": "Lokales Video fokussieren",
"focusRemote": "Auf das Video einer anderen Person fokussieren",
"fullScreen": "Vollbildmodus aktivieren oder deaktivieren",
"giphyMenu": "GIPHY ein- oder ausblenden",
"keyboardShortcuts": "Tastenkürzel",
"localRecording": "Lokale Aufzeichnungssteuerelemente ein- oder ausblenden",
"mute": "Stummschaltung aktivieren oder deaktivieren",
@@ -543,6 +560,7 @@
"errorMissingPassword": "Bitte das Konferenzpasswort eingeben",
"invalidPassword": "Ungültiges Passwort",
"joinRejectedMessage": "Ihre Beitrittsanfrage wurde von der Moderation abgelehnt.",
"joinRejectedTitle": "Beitrittsanfrage abgelehnt.",
"joinTitle": "Konferenz beitreten",
"joinWithPasswordMessage": "Beitrittsversuch mit Passwort, bitte warten …",
"joiningMessage": "Sie treten der Konferenz bei, sobald jemand Ihre Anfrage annimmt.",
@@ -615,6 +633,7 @@
"displayNotifications": "Benachrichtigungen anzeigen für",
"focus": "Konferenzleitung",
"focusFail": "{{component}} ist im Moment nicht verfügbar wiederholen in {{ms}} Sekunden",
"gifsMenu": "GIPHY",
"groupTitle": "Benachrichtigungen",
"hostAskedUnmute": "Die Moderation bittet Sie, das Mikrofon zu aktivieren",
"invitedOneMember": "{{name}} wurde eingeladen",
@@ -624,6 +643,12 @@
"leftOneMember": "{{name}} hat die Konferenz verlassen",
"leftThreePlusMembers": "{{name}} und Weitere haben die Konferenz verlassen",
"leftTwoMembers": "{{first}} und {{second}} haben die Konferenz verlassen",
"linkToSalesforce": "Mit Salesforce verlinken",
"linkToSalesforceDescription": "Sie können die Zusammenfassung der Konferenz mit einem Objekt bei Salesforce verlinken.",
"linkToSalesforceError": "Konferenz konnte nicht mit Salesforce verlinkt werden",
"linkToSalesforceKey": "Konferenz verlinken",
"linkToSalesforceProgress": "Konferenz wird mit Salesforce verlinkt...",
"linkToSalesforceSuccess": "Die Konferenz wurde mit Salesforce verlinkt",
"me": "Ich",
"moderationInEffectCSDescription": "Bitte melden um ein Video zu teilen",
"moderationInEffectCSTitle": "Die Videofreigabe ist von der Moderation gesperrt",
@@ -702,6 +727,7 @@
},
"passwordDigitsOnly": "Bis zu {{number}} Ziffern",
"passwordSetRemotely": "von einer anderen Person gesetzt",
"pinnedParticipant": "Die Person ist angeheftet",
"polls": {
"answer": {
"skip": "Überspringen",
@@ -817,6 +843,18 @@
},
"raisedHand": "Ich möchte sprechen",
"raisedHandsLabel": "Anzahl gehobener Hände",
"record": {
"already": {
"linked": "Diese Konferenz ist bereits mit einem Objekt bei Salesforce verlinkt."
},
"type": {
"account": "Account",
"contact": "Contact",
"lead": "Lead",
"opportunity": "Opportunity",
"owner": "Owner"
}
},
"recording": {
"authDropboxText": "In Dropbox hochladen",
"availableSpace": "Verfügbarer Speicherplatz: {{spaceLeft}} MB (ca. {{duration}} Minuten Aufzeichnung)",
@@ -831,6 +869,11 @@
"expandedPending": "Aufzeichnung wird gestartet…",
"failedToStart": "Die Aufnahme konnte nicht gestartet werden",
"fileSharingdescription": "Aufzeichnung mit den Personen der Konferenz teilen",
"highlight": "Highlight",
"highlightMoment": "Moment als Highlight festhalten",
"highlightMomentDisabled": "Sie können Momente als Highlights festhalten, sobald die Aufnahme startet",
"highlightMomentSuccess": "Highlight festgehalten",
"highlightMomentSucessDescription": "Ihr festgehaltener Moment wird zur Zusammenfassung des Meeting hinzugefügt.",
"inProgress": "Aufzeichnung gestartet",
"limitNotificationDescriptionNative": "Wegen hoher Nachfrage ist Ihre Aufnahme auf {{limit}} Min. begrenzt. Für unlimitierte Aufnahmen nutzen Sie bitte <3>{{app}}</3>.",
"limitNotificationDescriptionWeb": "Wegen hoher Nachfrage ist Ihre Aufnahme auf {{limit}} Min. begrenzt. Für unlimitierte Aufnahmen nutzen Sie bitte <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
@@ -845,6 +888,7 @@
"rec": "AUFZ",
"serviceDescription": "Ihre Aufzeichnung wird vom Aufzeichnungsdienst gespeichert",
"serviceDescriptionCloud": "Cloud-Aufzeichnung",
"serviceDescriptionCloudInfo": "Aufzeichnungen werden 24 Stunden nach Aufzeichnungsende automatisch gelöscht.",
"serviceName": "Aufnahmedienst",
"sessionAlreadyActive": "Diese Konferenz wird bereits aufgezeichnet.",
"signIn": "Anmelden",
@@ -879,6 +923,7 @@
"incomingMessage": "Eingehende Nachricht",
"language": "Sprache",
"loggedIn": "Als {{name}} angemeldet",
"maxStageParticipants": "Maximale Anzahl an Personen, die zur Hauptansicht angeheftet werden können",
"microphones": "Mikrofon",
"moderator": "Moderation",
"more": "Mehr",
@@ -977,6 +1022,7 @@
"expand": "Ausklappen",
"feedback": "Feedback hinterlassen",
"fullScreen": "Vollbildmodus ein-/ausschalten",
"giphy": "GIPHY ein-/ausschalten",
"grantModerator": "Moderationsrechte vergeben",
"hangup": "Konferenz verlassen",
"help": "Hilfe",
@@ -984,6 +1030,7 @@
"kick": "Person entfernen",
"laugh": "Lachen",
"like": "Daumen nach oben",
"linkToSalesforce": "Mit Salesforce verlinken",
"lobbyButton": "Lobbymodus ein-/ausschalten",
"localRecording": "Lokale Aufzeichnungssteuerelemente ein-/ausschalten",
"lockRoom": "Konferenzpasswort ein-/ausschalten",
@@ -993,8 +1040,8 @@
"mute": "Mikrofon aktivieren / deaktivieren",
"muteEveryone": "Alle stummschalten",
"muteEveryoneElse": "Alle anderen stummschalten",
"muteEveryoneElsesVideo": "Alle anderen Kameras ausschalten",
"muteEveryonesVideo": "Alle Kameras ausschalten",
"muteEveryoneElsesVideoStream": "Alle anderen Kameras ausschalten",
"muteEveryonesVideoStream": "Alle Kameras ausschalten",
"participants": "Anwesende",
"pip": "Bild-in-Bild-Modus ein-/ausschalten",
"privateMessage": "Private Nachricht senden",
@@ -1045,6 +1092,7 @@
"exitFullScreen": "Vollbildmodus verlassen",
"exitTileView": "Kachelansicht ausschalten",
"feedback": "Feedback hinterlassen",
"giphy": "GIPHY ein-/ausschalten",
"hangup": "Konferenz verlassen",
"help": "Hilfe",
"invite": "Personen einladen",
@@ -1052,6 +1100,7 @@
"laugh": "Lachen",
"leaveBreakoutRoom": "Breakout-Raum verlassen",
"like": "Daumen hoch",
"linkToSalesforce": "Mit Salesforce verknüpfen",
"lobbyButtonDisable": "Lobbymodus deaktivieren",
"lobbyButtonEnable": "Lobbymodus aktivieren",
"login": "Anmelden",
@@ -1171,10 +1220,12 @@
"moderator": "Moderation",
"mute": "Person ist stumm geschaltet",
"muted": "Stummgeschaltet",
"pinToStage": "Anheften",
"remoteControl": "Fernsteuerung",
"screenSharing": "Person teilt den Bildschirm",
"show": "Im Vordergrund anzeigen",
"showSelfView": "Eigene Ansicht anzeigen",
"unpinFromStage": "Lösen",
"videoMuted": "Kamera ausgeschaltet",
"videomute": "Person hat die Kamera angehalten"
},

View File

@@ -935,7 +935,7 @@
"security": "Opciones de seguridad",
"selectBackground": "Seleccione el fondo",
"shareRoom": "Invitar a alguien",
"shareYourScreen": "Alternar pantalla compartida",
"shareYourScreen": "Comenzar / detener compartir pantalla",
"shareaudio": "Compartir audio",
"sharedvideo": "Alternar vídeo compartido",
"shortcuts": "Alternar accesos directos",

View File

@@ -39,9 +39,6 @@
"audioOnly": {
"audioOnly": "پهنای باند پایین"
},
"blankPage": {
"meetingEnded": "جلسه تمام شد"
},
"breakoutRooms": {
"actions": {
"add": "یک گروه کوچک اضافه کنید",
@@ -83,6 +80,7 @@
"enter": "وارد اتاق شوید",
"error": "پیام شما ارسال نشد: {{error}}",
"fieldPlaceHolder": "پیام خود را بنویسید",
"lobbyChatMessageTo": "پیام چت لابی به {{recipient}}",
"message": "پیام",
"messageAccessibleTitle": "{{user}} می‌گوید:",
"messageAccessibleTitleMe": "من میگویم:",
@@ -215,6 +213,8 @@
"liveStreaming": "پخش زنده"
},
"add": "افزودن",
"addMeetingNote": "یک یادداشت برای این جلسه وارد کنید",
"addOptionalNote": "افزودن یادداشت (اختیاری):",
"allow": "اجازه دادن",
"alreadySharedVideoMsg": "یکی دیگر از شرکت‌کنندگان ویدیویی را به اشتراک گذاشته است؛ در این کنفرانس فقط یک ویدیو را می‌توان به صورت همزمان به اشتراک گذاشت",
"alreadySharedVideoTitle": "فقط یک ویدیو را می‌توان به صورت همزمان به اشتراک گذاشت",
@@ -266,6 +266,8 @@
"kickParticipantDialog": "آیا می‌خواهید این شرکت کننده را بیرون کنید؟",
"kickParticipantTitle": "این شرکت کننده را بیرون می‌کنید؟",
"kickTitle": "{{participantDisplayName}} شما را از جلسه بیرون کرد",
"linkMeeting": "لینک جلسه",
"linkMeetingTitle": "لینک جلسه به نیروی فروش",
"liveStreaming": "پخش زنده",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "هنگامی که ضبط جلسه فعال است، نمی‌توان پخش زنده انجام داد",
"liveStreamingDisabledTooltip": "پخش زنده غیرفعال شده است",
@@ -320,6 +322,7 @@
"popupError": "مرورگر شما پنجره‌های بازشونده را در این سایت مسدود کرده است؛ در تنظیمات امنیتی مرورگر خود، پنجره‌های بازشونده را برای این سایت فعال کرده و دوباره امتحان کنید",
"popupErrorTitle": "پنجره‌های بازشونده مسدود شده است",
"readMore": "بیشتر",
"recentlyUsedObjects": "اشیایی که اخیراً استفاده کرده اید",
"recording": "در حال ضبط",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "هنگامی که پخش زنده در جریان است نمی‌توان جلسه را ضبط کرد",
"recordingDisabledTooltip": "ضبط جلسه غیر فعال شده است",
@@ -342,6 +345,12 @@
"screenSharingFailed": "متاسفانه مشکلی پیش آمده است و امکان به اشتراک گذاری صفحه نمایش وجود ندارد",
"screenSharingFailedTitle": "به اشتراک گذاری صفحه نمایش با خطا مواجه شد",
"screenSharingPermissionDeniedError": "در دسترسی به مجوز به اشتراک گذاری صفحه نمایش مشکلی پیش آمده است، لطفا صفحه را مجددا بارگیری نمایید",
"searchInSalesforce": "جستجو در salesforce",
"searchResults": "نتایج جستجو({{count}})",
"searchResultsDetailsError": "هنگام بازیابی اطلاعات مالک مشکلی پیش آمد.",
"searchResultsError": "هنگام بازیابی داده ها مشکلی پیش آمد.",
"searchResultsNotFound": "هیچ نتیجه ای برای این جستجو یافت نشد.",
"searchResultsTryAgain": "سعی کنید از کلمات کلیدی جایگزین استفاده کنید.",
"sendPrivateMessage": "شما یک پیام خصوصی دریافت کرده‌اید، می‌خواهید پاسخ آن را به صورت خصوصی برای فرستنده ارسال کنید یا در گروه به أن پاسخ دهید؟",
"sendPrivateMessageCancel": "ارسال به گروه",
"sendPrivateMessageOk": "ارسال به صورت خصوصی",
@@ -364,7 +373,9 @@
"shareVideoTitle": "به اشتراک گذاری ویدیو",
"shareYourScreen": "به اشتراک گذاری صفحه",
"shareYourScreenDisabled": "به اشتراک گذاری صفحه غیرفعال شده است",
"sharedVideoDialogError": "خطا: لینک نا معتبر است",
"sharedVideoLinkPlaceholder": "لینک یوتیوب یا لینک مستقیم ویدیو",
"start": "شروع ",
"startLiveStreaming": "پخش زنده",
"startRecording": "ضبط جلسه",
"startRemoteControlErrorMessage": "در کنترل از راه دور خطایی روی داده است!",
@@ -407,6 +418,10 @@
"veryBad": "خیلی بد",
"veryGood": "خیلی خوب"
},
"giphy": {
"noResults": "نتیجه ای یافت نشد :(",
"search": "جستجو GIPHY"
},
"helpView": {
"header": "مرکز راهنما"
},
@@ -473,6 +488,7 @@
"focusLocal": "تمرکز روی ویدیوی شما",
"focusRemote": "انتخاب تصویر مخاطب",
"fullScreen": "شروع یا پایان نمای تمام صفحه",
"giphyMenu": "منوی GIPHY را تغییر دهید",
"keyboardShortcuts": "کلیدهای میانبر",
"localRecording": "نمایش یا مخفی کردن کنترل ضبط شخصی‌",
"mute": "قطع و وصل میکروفن",
@@ -526,7 +542,8 @@
"admit": "پذیرفتن",
"admitAll": "پذیرفتن همه",
"allow": "اجازه دادن",
"backToKnockModeButton": "بدون رمز عبور، برای پیوستن درخواست دهید",
"backToKnockModeButton": رای پیوستن بدون رمز عبور درخواست دهید",
"chat": "چت",
"dialogTitle": "حالت لابی",
"disableDialogContent": "حالت لابی فعال شد، با این قابلیت مطمعن خواهید بود که افراد ناشناس به جلسه‌ی شما وارد نخواهند شد؛ آیا می‌خواهید این حالت را غیرفعال کنید؟",
"disableDialogSubmit": "غیرفعال کردن",
@@ -547,6 +564,8 @@
"knockButton": "درخواست پیوستن",
"knockTitle": "یک نفر می‌خواهد به جلسه بپیوندد",
"knockingParticipantList": "Knocking لیست شرکت‌کنندگان",
"lobbyChatStartedNotification": "{{moderator}} شروع به یک چت لابی با {{attendee}} .کرد",
"lobbyChatStartedTitle": "{{moderator}} شروع به یک چت لابی با شما کرد.",
"nameField": "نام خود را وارد کنید",
"notificationLobbyAccessDenied": "درخواست پیوستن {{targetParticipantName}} توسط {{originParticipantName}} رد شد",
"notificationLobbyAccessGranted": "درخواست پیوستن {{targetParticipantName}} توسط {{originParticipantName}} تایید شد",
@@ -618,6 +637,12 @@
"leftOneMember": "{{name}} از جلسه خارج شد",
"leftThreePlusMembers": "{{name}} و بسیاری دیگر جلسه را خارج شدند",
"leftTwoMembers": "{{first}} و {{second}} جلسه را خارج شدند",
"linkToSalesforce": "لینک به salesforce",
"linkToSalesforceDescription": "شما میتوانید خلاصه جلسه را به یک Salesforce لینک کنید.",
"linkToSalesforceError": "خطا در لینک کردن جلسه به Salesforce",
"linkToSalesforceKey": "این جلسه را لینک کن",
"linkToSalesforceProgress": "در حال لینک کردن جلسه به Salesforce...",
"linkToSalesforceSuccess": "جلسه به Salesforce لینک شد.",
"me": "من",
"moderationInEffectCSDescription": "لطفاً اگر می خواهید صفحه خود را به اشتراک بگذارید، دست را بالا ببرید.",
"moderationInEffectCSTitle": "اشتراک‌گذاری صفحه توسط مدیر مسدود شده است ",
@@ -641,6 +666,8 @@
"oldElectronClientDescription1": "به نظر می‌رسد شما از نسخه قدیمی استفاده می‌کنید که برخی آسیب‌پذیری امنیتی روی آن وجود دارد؛ لطفا از آخرین نسخه‌ی برنامه استفاده کنید",
"oldElectronClientDescription2": "آخرین نسخه",
"oldElectronClientDescription3": " الان!",
"participantWantsToJoin": "می خواهد به جلسه بپیوندد",
"participantsWantToJoin": "می خواهید به جلسه بپیوندید",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) توسط شرکت‌کننده‌ی دیگری حذف شد",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) توسط شرکت‌کننده دیگری تنظیم شد",
"raiseHandAction": "دست را بلند کن",
@@ -660,7 +687,9 @@
"videoMutedRemotelyDescription": "همیشه می توانید دوباره آن را روشن کنید.",
"videoMutedRemotelyTitle": "ویدیوی شما توسط {{participantDisplayName}} غیرفعال شده است",
"videoUnmuteBlockedDescription": "به دلیل محدودیت های سیستم، روشن کردن روشن کردن دوربین و اشتراک‌گذاری دسکتاپ به طور موقت مسدود شده است.",
"videoUnmuteBlockedTitle": "روشن کردن دوربین و اشتراک‌گذاری دسکتاپ مسدود شده است!"
"videoUnmuteBlockedTitle": "روشن کردن دوربین و اشتراک‌گذاری دسکتاپ مسدود شده است!",
"viewLobby": "مشاهده لابی",
"waitingParticipants": "{{waitingParticipants}} نفر"
},
"participantsPane": {
"actions": {
@@ -684,9 +713,9 @@
"close": "بستن",
"header": "شركت كنندگان",
"headings": {
"lobby": "سالن انتظار",
"lobby": "لابی",
"participantsList": "شرکت کنندگان در جلسه ({{count}})",
"waitingLobby": "در سالن انتظار ({{count}})"
"waitingLobby": "در لابی ({{count}})"
},
"search": "جستجوی شرکت کنندگان"
},
@@ -807,6 +836,18 @@
},
"raisedHand": "می‌خواهم صحبت کنم",
"raisedHandsLabel": "تعداد دست های بلند شده",
"record": {
"already": {
"linked": "رکورد قبلاً به این جلسه لینک شده است."
},
"type": {
"account": "اکانت",
"contact": "مخاطب",
"lead": "رهبر",
"opportunity": "فرصت",
"owner": "مالک"
}
},
"recording": {
"authDropboxText": "آپلود کردن در دراپ‌باکس",
"availableSpace": "فضای خالی: {{spaceLeft}} مگابایت (مناسب برای تقریبا {{duration}} دقیقه ضبط جلسه)",
@@ -821,6 +862,11 @@
"expandedPending": "ضبط آغاز شد...",
"failedToStart": "ضبط جلسه با خطا مواجه شد",
"fileSharingdescription": "به اشتراک گذاری ضبط جلسه با شرکت‌کنندگان",
"highlight": "هایلایت",
"highlightMoment": "هایلایت لحظه",
"highlightMomentDisabled": "شما میتوانید لحظه را هایلایت کنید وقتی ضبط کردن شروع شود.",
"highlightMomentSuccess": "لحظه هایلایت شد",
"highlightMomentSucessDescription": "لحظه های هایلایت شده شما به خلاصه جلسه اضافه میشود.",
"inProgress": "ضبط در یا پخش زنده حال انجام است",
"limitNotificationDescriptionNative": "با توجه به تعداد درخواست‌های بالا، ضبط جلسه به {{limit}} دقیقه محدود شده است؛ برای ضبط نامحدود <3>{{app}}</3> را ببینید",
"limitNotificationDescriptionWeb": "با توجه به تعداد درخواست‌های بالا، ضبط جلسه به {{limit}} دقیقه محدود شده است؛ برای ضبط نامحدود <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a> را ببینید",
@@ -835,6 +881,7 @@
"rec": "ضبط",
"serviceDescription": "ضبط جلسه توسط سرویس ضبط ذخیره خواهد شد",
"serviceDescriptionCloud": "ضبط ابری",
"serviceDescriptionCloudInfo": "جلسات ضبط شده بصورت اتوماتیک بعد از ۲۴ ساعت حذف خواهند شد.",
"serviceName": "سرویس ضبط",
"sessionAlreadyActive": "این جلسه قبلاً در حال ضبط یا پخش زنده است.",
"signIn": "ورود",
@@ -921,6 +968,7 @@
"speakerStats": {
"angry": "عصبانی",
"disgusted": "منزجر کرده ",
"displayEmotions": "نمایش احساسات",
"fearful": "ترسناک",
"happy": "خوشحال",
"hours": "{{count}} ساعت",
@@ -966,6 +1014,7 @@
"expand": "باز کردن",
"feedback": "ثبت بازخورد",
"fullScreen": "تغییر نمای تمام صفحه",
"giphy": "تغییر منوی GIPHY",
"grantModerator": "اعطای دسترسی مدیر",
"hangup": "قطع کردن تماس",
"help": "راهنما",
@@ -973,6 +1022,7 @@
"kick": "بیرون کردن",
"laugh": "خنده",
"like": "دوست داشتن ",
"linkToSalesforce": "لینک به Salesforce",
"lobbyButton": "فعال/غیرفعال کردن حالت لابی",
"localRecording": "تغییر تنظیمات کنترل ضبط",
"lockRoom": "تعویض رمز عبور جلسه",
@@ -995,6 +1045,7 @@
"remoteVideoMute": "دوربینی شرکت کننده را غیرفعال کردن",
"security": "گزینه‌های امنیتی",
"selectBackground": "انتخاب پس زمینه",
"selfView": "تغییر مشاهده خود",
"shareRoom": "دعوت دیگران",
"shareYourScreen": "تغییر اشتراک گذاری صفحه",
"shareaudio": "صدا را به اشتراک بگذارید",
@@ -1033,6 +1084,7 @@
"exitFullScreen": "اتمام نمای تمام صفحه",
"exitTileView": "خروج از نمای کاشی",
"feedback": "ثبت بازخورد",
"giphy": "تغییر منوی GIPHY",
"hangup": "ترک کردن جلسه",
"help": "راهنما",
"invite": "دعوت کردن",
@@ -1040,6 +1092,7 @@
"laugh": "خنده",
"leaveBreakoutRoom": "گروهی کوچک ترک کنید",
"like": "دوست داشتن ",
"linkToSalesforce": "لینک به Salesforce",
"lobbyButtonDisable": "غیرفعال کردن حالت لابی",
"lobbyButtonEnable": "فعال کردن حالت لابی",
"login": "ورود",
@@ -1160,7 +1213,9 @@
"mute": "شرکت کننده بیصدا است",
"muted": "بیصدا",
"remoteControl": "شروع/توقف کنترل از دور",
"screenSharing": "شرکت کننده صفحه خود را به اشتراک می گذارد",
"show": "نمایش روی صحنه",
"showSelfView": "نمایش خود",
"videoMuted": "دوربین غیرفعال است",
"videomute": "شرکت کننده دوربین را متوقف کرده است"
},

View File

@@ -39,9 +39,6 @@
"audioOnly": {
"audioOnly": "Bande passante faible"
},
"blankPage": {
"meetingEnded": "Réunion terminée."
},
"breakoutRooms": {
"actions": {
"add": "Ajouter salle annexe",
@@ -559,6 +556,7 @@
"errorMissingPassword": "Veuillez saisir le mot de passe de la réunion",
"invalidPassword": "Mot de passe invalide",
"joinRejectedMessage": "Votre requête pour rejoindre une réunion a été refusée par un modérateur.",
"joinRejectedTitle": "Demande d'accès rejetée.",
"joinTitle": "Rejoindre une réunion",
"joinWithPasswordMessage": "Tentative de rejoindre avec mot de passe, patientez s'il vous plait ...",
"joiningMessage": "Vous allez rejoindre une réunion dès que quelqu'un aura accepté votre demande",
@@ -631,6 +629,7 @@
"displayNotifications": "Afficher les notifications pour",
"focus": "Focus de conférence",
"focusFail": "{{component}} n'est pas disponible - réessayez dans {{ms}} sec",
"gifsMenu": "GIPHY",
"groupTitle": "Notifications",
"hostAskedUnmute": "Le modérateur souhaite vous donner la parole",
"invitedOneMember": "{{name}} a été invité(e)",
@@ -724,6 +723,7 @@
},
"passwordDigitsOnly": "Jusqu'à {{number}} chiffres",
"passwordSetRemotely": "défini par un autre participant",
"pinnedParticipant": "Participant toujours affiché",
"polls": {
"answer": {
"skip": "Passer",
@@ -865,6 +865,11 @@
"expandedPending": "Démarrage de l'enregistrement ...",
"failedToStart": "L'enregistrement n'a pas réussi à démarrer",
"fileSharingdescription": "Partager l'enregistrement avec les participants de la réunion",
"highlight": "Souligner",
"highlightMoment": "Souligner un moment",
"highlightMomentDisabled": "Vous ne pouvez souligner des moments que pendant une réunion",
"highlightMomentSuccess": "Moment souligné",
"highlightMomentSucessDescription": "Votre moment souligné sera ajouté au résumé de la réunion.",
"inProgress": "Enregistrement ou diffusion en cours",
"limitNotificationDescriptionNative": "En raison d'une forte demande, votre enregistrement sera limité à {{limit}} min. Pour des enregistrements illimités, essayez <3> {{app}} </3>.",
"limitNotificationDescriptionWeb": "En raison d'une forte demande, votre enregistrement sera limité à {{limit}} min. Pour des enregistrements illimités, essayez <a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>.",
@@ -1208,12 +1213,14 @@
"hideSelfView": "Cacher l'affichage de votre propre vidéo",
"kick": "Exclure",
"moderator": "Modérateur",
"mute": "Un participant a coupé son micro",
"mute": "Le participant a coupé son micro",
"muted": "Muet",
"pinToStage": "Garder affiché",
"remoteControl": "Démarrer / Arrêter le contrôle à distance",
"screenSharing": "Cette personne partage son écran",
"show": "Afficher en premier plan",
"showSelfView": "Montrer votre propre vidéo",
"unpinFromStage": "Ne plus garder affiché",
"videoMuted": "Caméra coupée",
"videomute": "Le participant a arrêté la caméra"
},

View File

@@ -9,13 +9,13 @@
"countryNotSupported": "Non supportiamo ancora questa destinazione.",
"countryReminder": "Stai chiamando fuori dagli Stati Uniti? Assicurati d'inserire il prefisso internazionale!",
"defaultEmail": "Tua email di default",
"disabled": "Non puoi invitare persone.",
"failedToAdd": "L'aggiunta di nuove persone è fallita",
"disabled": "Non puoi invitare partecipanti.",
"failedToAdd": "L'aggiunta di nuovi partecipanti è fallita",
"footerText": "La chiamata all'esterno è disabilitata.",
"googleEmail": "Email Google",
"inviteMoreHeader": "Sei l'unico presente nella riunione",
"inviteMoreMailSubject": "Unisciti alla riunione {{appName}}",
"inviteMorePrompt": "Invita altre persone",
"inviteMorePrompt": "Invita altri partecipanti",
"linkCopied": "Collegamento copiato negli appunti",
"noResults": "Nessun risultato corrispondente",
"outlookEmail": "Email Outlook",
@@ -26,11 +26,12 @@
"shareStream": "Condividi il collegamento alla diretta",
"sipAddresses": "indirizzi SIP",
"telephone": "Telefono: {{number}}",
"title": "Invita persone a questa riunione",
"title": "Invita partecipanti a questa riunione",
"yahooEmail": "Email Yahoo"
},
"audioDevices": {
"bluetooth": "Bluetooth",
"car": "Vivavoce Auto",
"headphones": "Cuffie",
"none": "Nessun dispositivo audio esistente",
"phone": "Telefono",
@@ -39,6 +40,25 @@
"audioOnly": {
"audioOnly": "Utilizzo di minore banda"
},
"breakoutRooms": {
"actions": {
"add": "Crea sottogruppo",
"autoAssign": "Assegna automaticamente a sottogruppi",
"close": "Chiudi",
"join": "Entra",
"leaveBreakoutRoom": "Esci",
"more": "Mostra di più",
"remove": "Elimina",
"sendToBreakoutRoom": "Invia partecipante a:"
},
"defaultName": "Sottogruppo {{index}}",
"mainRoom": "Riunione principale",
"notifications": {
"joined": "Entrato nel sottogruppo \"{{name}}\"",
"joinedMainRoom": "Entrato nella riunione principale",
"joinedTitle": "Sottogruppo"
}
},
"calendarSync": {
"addMeetingURL": "Aggiungi un collegamento alla riunione",
"confirmAddLink": "Vuoi aggiungere un collegamento Jitsi a questo evento?",
@@ -57,14 +77,26 @@
"refresh": "Aggiorna calendario",
"today": "Oggi"
},
"carmode": {
"actions": {
"leaveMeeting": " Lascia riunione",
"selectSoundDevice": "Scegli audio"
},
"labels": {
"buttonLabel": "Modalità in auto",
"title": "Modalità guida sicura",
"videoStopped": "Il tuo video è fermo"
}
},
"chat": {
"enter": "Entra nella conversazione",
"error": "Errore: il tuo messaggio non è stato inviato. Motivo: {{error}}",
"fieldPlaceHolder": "Scrivi qui il tuo messaggio",
"lobbyChatMessageTo": "Messaggio a {{recipient}} in sala d'attesa",
"message": "Messaggio",
"messageAccessibleTitle": "{{user}} dice:",
"messageAccessibleTitleMe": "io dico:",
"messageTo": "Messaggio privato per {{recipient}}",
"messageTo": "Messaggio privato a {{recipient}}",
"messagebox": "Digitare un messaggio",
"nickname": {
"popover": "Scegli un nickname",
@@ -72,15 +104,15 @@
"titleWithPolls": "Inserire un nickname per utilizzare la conversazione"
},
"noMessagesMessage": "Non ci sono ancora messaggi nella riunione. Comincia una conversazione, qui!",
"privateNotice": "Messaggio privato per {{recipient}}",
"privateNotice": "Messaggio privato a {{recipient}}",
"smileysPanel": "Pannello emoji",
"tabs": {
"chat": "Chat",
"chat": "Conversazione",
"polls": "Sondaggi"
},
"title": "Conversazione",
"titleWithPolls": "Conversazione",
"you": "tu"
"you": "te"
},
"chromeExtensionBanner": {
"buttonText": "Installa l'estensione Chrome",
@@ -158,7 +190,8 @@
"joinInApp": "Entra in riunione usando l'app",
"launchWebButton": "Avvia sul web",
"title": "Sto avviando la riunione su {{app}}...",
"tryAgainButton": "Prova di nuovo sul desktop"
"tryAgainButton": "Prova di nuovo sul desktop",
"unsupportedBrowser": "Sembra tu stia usando un browser che non supportiamo."
},
"defaultLink": "es. {{url}}",
"defaultNickname": "es. Anna Rossi",
@@ -186,12 +219,14 @@
"Share": "Condividi",
"Submit": "Invia",
"WaitForHostMsg": "La riunione non è ancora cominciata. Se sei l'organizzatore, per favore autenticati. Altrimenti, aspetta l'arrivo dell'organizzatore.",
"WaitingForHost": "In attesa dell'organizzatore...",
"WaitingForHostTitle": "In attesa dell'organizzatore...",
"Yes": "Sì",
"accessibilityLabel": {
"liveStreaming": "Diretta streaming"
},
"add": "Aggiungi",
"addMeetingNote": "Aggiungi una a questa riunione",
"addOptionalNote": "Aggiungi una nota (facoltativo):",
"allow": "Consenti",
"alreadySharedVideoMsg": "Un altro utente sta condividendo un video. Questa riunione permette di condividere un solo video alla volta.",
"alreadySharedVideoTitle": "È permesso un solo video alla volta",
@@ -243,6 +278,8 @@
"kickParticipantDialog": "Sei sicuro di voler escludere questo partecipante?",
"kickParticipantTitle": "Escludi questo partecipante?",
"kickTitle": "Escluso dalla riunione",
"linkMeeting": "Link meeting",
"linkMeetingTitle": "Link meeting to Salesforce",
"liveStreaming": "Diretta",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Impossibile durante la registrazione.",
"liveStreamingDisabledTooltip": "Trasmissioni in diretta disabilitate.",
@@ -262,9 +299,9 @@
"micPermissionDeniedError": "Non hai concesso il permesso di usare il microfono. Puoi comunque partecipare alla riunione ma gli altri non potranno sentirti. Usa il bottone a forma di telecamera nella barra degli indirizzi per cambiare impostazioni.",
"micTimeoutError": "Impossibile avviare la fonte audio. Tempo di attesa scaduto.",
"micUnknownError": "Impossibile usare il microfono per un motivo sconosciuto.",
"moderationAudioLabel": "Permetti ai partecipenti di accendere il microfono",
"moderationVideoLabel": "Permetti ai partecipanti di arrivare la videocamera",
"muteEveryoneDialog": "Sei sicuro di voler spegnere il microfono a tutti? Non potrai riattivarli, ma loro potranno farlo in qualsiasi momento.",
"moderationAudioLabel": "Permetti ai partecipenti di riaccendere il microfono",
"moderationVideoLabel": "Permetti ai partecipanti di riattivare la videocamera",
"muteEveryoneDialog": "I partecipanti possono riaccenderli in quasiasi momento.",
"muteEveryoneDialogModerationOn": "I partecipanti possono fare richiesta di parlare in ogni momento.",
"muteEveryoneElseDialog": "Una volta spenti i microfoni non potrai riattivarli, ma loro potranno farlo in qualsiasi momento.",
"muteEveryoneElseTitle": "Spengo il microfono a tutti, eccetto a {{whom}}?",
@@ -278,12 +315,12 @@
"muteEveryonesVideoDialogOk": "Spegni",
"muteEveryonesVideoTitle": "Vuoi spegnere le videocamere di tutti?",
"muteParticipantBody": "Non sarai in grado di riattivare il loro microfono, ma loro potranno riattivarlo in qualsiasi momento.",
"muteParticipantButton": "Spegni microfono",
"muteParticipantDialog": "Sei sicuro di voler spegnere il microfono di questo partecipante? Lui potrà riattivarlo in ogni momento.",
"muteParticipantTitle": "Spengo il microfono a questo partecipante?",
"muteParticipantButton": "Spegni audio",
"muteParticipantsVideoBody": "Una volta spenta la videocamera non potrai riaccenderla, ma lui potrà riattivarla in qualsiasi momento.",
"muteParticipantsVideoButton": "Spegni videocamera",
"muteParticipantsVideoBodyModerationOn": "Non potrai riaccendere le videocamere, né potranno loro.",
"muteParticipantsVideoButton": "Spegni video",
"muteParticipantsVideoDialog": "Sei sicuro di voler spegnere la videocamera di questo partecipante? Lui potrà riattivarla in ogni momento.",
"muteParticipantsVideoDialogModerationOn": "Are you sure you want to turn off this participant's camera? You won't be able to turn the camera back on and neither will they.",
"muteParticipantsVideoTitle": "Vuoi spegnere la videocamera di questo partecipante?",
"noDropboxToken": "Token Dropbox non valido",
"password": "Password",
@@ -297,6 +334,7 @@
"popupError": "Il tuo browser sta bloccando i pop-up da questo sito. Per favore abilita i pop-up dalle impostazioni di sicurezza del browser e riprova.",
"popupErrorTitle": "Pop-up bloccato",
"readMore": "continua",
"recentlyUsedObjects": "Gli oggetti che hai usato di recente",
"recording": "Registrazione",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Impossibile durante una diretta.",
"recordingDisabledTooltip": "Registrazione disabilitata.",
@@ -319,6 +357,12 @@
"screenSharingFailed": "Ops! Non è stato possibile avviare la condivisione dello schermo!",
"screenSharingFailedTitle": "Condivisione dello schermo fallita!",
"screenSharingPermissionDeniedError": "Qualcosa non funziona nei permessi di condivisione dello schermo. Ricarica e riprova.",
"searchInSalesforce": "Cerca in Salesforce",
"searchResults": "Risultati ricerca({{count}})",
"searchResultsDetailsError": "Qualcosa non ha funzionato nella ricezione dei dati del proprietario.",
"searchResultsError": "Qualcosa non ha funzionato nella ricezione dei dati.",
"searchResultsNotFound": "Nessun risultato.",
"searchResultsTryAgain": "Prova altre parole di ricerca.",
"sendPrivateMessage": "Hai ricevuto un messaggio privato poco fa. Vorresti rispondergli privatamente o vuoi mandare la risposta al gruppo?",
"sendPrivateMessageCancel": "Invia al gruppo",
"sendPrivateMessageOk": "Invia privatamente",
@@ -341,8 +385,10 @@
"shareVideoTitle": "Condividi un video",
"shareYourScreen": "Condividi schermo",
"shareYourScreenDisabled": "Condivisione schermo disabilitata.",
"sharedVideoDialogError": "Errore: URL non valido",
"sharedVideoLinkPlaceholder": "Link YouTube o link video diretto",
"startLiveStreaming": "Inizia una diretta",
"start": "Avvia ",
"startLiveStreaming": "Avvia diretta",
"startRecording": "Inizia a registrare",
"startRemoteControlErrorMessage": "Si è verificato un errore nel tentativo di avviare la sessione di controllo remoto!",
"stopLiveStreaming": "Ferma la diretta streaming",
@@ -384,6 +430,10 @@
"veryBad": "Pessima",
"veryGood": "Ottima"
},
"giphy": {
"noResults": "Trovato niente :(",
"search": "Cerca in GIPHY"
},
"helpView": {
"header": "Aiuto"
},
@@ -424,10 +474,10 @@
"moreNumbers": "Più numeri",
"noNumbers": "Nessun numero da chiamare.",
"noPassword": "Nessuna",
"noRoom": "Non è stata specificata nessuna stanza da chiamare.",
"noRoom": "Non è stata specificata nessuna riunione da chiamare.",
"numbers": "Numeri da chiamare",
"password": "$t(lockRoomPasswordUppercase):",
"sip": "SIP address",
"sip": "Indirizzo SIP",
"title": "Condividi",
"tooltip": "Invia il collegamento e i numeri telefonici di questa riunione"
},
@@ -450,6 +500,7 @@
"focusLocal": "Sposta il focus sul tuo video",
"focusRemote": "Sposta il focus sul video di un altro partecipante",
"fullScreen": "Attiva o disattiva schermo intero",
"giphyMenu": "Mostra menù GIPHY",
"keyboardShortcuts": "Scorciatoie da tastiera",
"localRecording": "Mostra o nascondi i controlli per la registrazione",
"mute": "Attiva o disattiva il microfono",
@@ -479,6 +530,7 @@
"failedToStart": "Avvio trasmissione in diretta fallito",
"getStreamKeyManually": "Non siamo stati in grado di trovare nessuna trasmissione dal vivo. Prova ad ottenere una chiave stream da Youtube",
"googlePrivacyPolicy": "Norme sulla riservatezza di Google",
"inProgress": "Diretta o registrazione in corso",
"invalidStreamKey": "La chiave per le dirette potrebbe non essere corretta.",
"limitNotificationDescriptionNative": "La tua diretta sarà limitata a {{limit}} minuti. Per dirette illimitate, prova {{app}}.",
"limitNotificationDescriptionWeb": "Data l'alta domanda la tua diretta sarà limitata a {{limit}} minuti. Per dirette illimitate, prova <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
@@ -488,6 +540,7 @@
"onBy": "{{name}} ha iniziato la diretta",
"pending": "Avvio diretta...",
"serviceName": "Servizio dirette",
"sessionAlreadyActive": "Questa sessione è in già in fase di registrazione o trasmessione in diretta.",
"signIn": "Collegati con Google",
"signInCTA": "Collegati o inserisci la tua chiave YouTube per la trasmissione in diretta.",
"signOut": "Scollegati",
@@ -502,6 +555,7 @@
"admitAll": "Ammetti tutti",
"allow": "Autorizza",
"backToKnockModeButton": "Nessuna password, richiedi l'accesso",
"chat": "Conversazione",
"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",
@@ -514,6 +568,7 @@
"errorMissingPassword": "Per favore, mettere la password della riunione",
"invalidPassword": "Password errata",
"joinRejectedMessage": "La tua richiesta d'accesso è stata respinta da un moderatore.",
"joinRejectedTitle": "Richiesta d'ingresso respinta.",
"joinTitle": "Entra nella riunione",
"joinWithPasswordMessage": "Ho inviato la password per entrare, attendi...",
"joiningMessage": "Entrerai nella riunione non appena qualcuno approva la tua richiesta",
@@ -522,6 +577,8 @@
"knockButton": "Chiedi d'entrare",
"knockTitle": "Qualcuno vuole entrare nella riunione",
"knockingParticipantList": "Lista dei partecipanti in attesa",
"lobbyChatStartedNotification": "{{moderator}} sta parlando con {{attendee}} in sala d'attesa",
"lobbyChatStartedTitle": "{{moderator}} sta parlando con te in sala d'attesa.",
"nameField": "Scrivi il tuo nome",
"notificationLobbyAccessDenied": "{{targetParticipantName}} è stato respinto da {{originParticipantName}}",
"notificationLobbyAccessGranted": "{{targetParticipantName}} è stato autorizzato ad entrare da {{originParticipantName}}",
@@ -572,20 +629,36 @@
"me": "io",
"notify": {
"OldElectronAPPTitle": "Falla di sicurezza!",
"allowAction": "Permetti",
"allowAction": "Autorizza",
"allowedUnmute": "Puoi accendere il microfono, avviare la videocamera, o condividere il tuo schermo.",
"connectedOneMember": "{{name}} si è connesso",
"connectedThreePlusMembers": "{{name}} e altri {{count}} si sono connessi",
"connectedTwoMembers": "{{first}} e {{second}} si sono connessi",
"audioUnmuteBlockedDescription": "Lo sblocco dei microfoni è stato temporaneamente bloccato per limiti del sistema.",
"audioUnmuteBlockedTitle": "Riattivazione dei microfoni bloccata!",
"chatMessages": "Messaggi delle conversazioni",
"connectedOneMember": "{{name}} è entrato in riunione",
"connectedThreePlusMembers": "{{name}} e altri {{count}} sono entrati in riunione",
"connectedTwoMembers": "{{first}} e {{second}} sono entrati in riunione",
"disconnected": "disconnesso",
"displayNotifications": "Mostra le notifiche per",
"focus": "Focus su riunione",
"focusFail": "{{component}} non disponibile - riprova in {{ms}} sec",
"grantedTo": "Permessi di moderatore accordati a {{to}}!",
"focusFail": "{{component}} non disponibile - riprovo tra {{ms}} sec",
"gifsMenu": "GIPHY",
"groupTitle": "Notifiche",
"hostAskedUnmute": "Il moderatore ti dice di accendere il microfono",
"invitedOneMember": "{{displayName}} è stato invitato",
"invitedThreePlusMembers": "Hai invitato {{name}} e altri {{count}}",
"invitedTwoMembers": "Hai invitato {{first}} e {{second}}",
"kickParticipant": "{{kicked}} è stato espulso da {{kicker}}",
"leftOneMember": "{{name}} ha lasciato la riunione",
"leftThreePlusMembers": "{{name}} e molti altri hanno lasciato la riunione",
"leftTwoMembers": "{{first}} e {{second}} hanno lasciato la riunione",
"linkToSalesforce": "Collega a Salesforce",
"linkToSalesforceDescription": "Puoi collegare il sommario della riunione ad un oggetto Salesforce.",
"linkToSalesforceError": "Failed to link meeting to Salesforce",
"linkToSalesforceKey": "Link this meeting",
"linkToSalesforceProgress": "Linking meeting to Salesforce...",
"linkToSalesforceSuccess": "The meeting was linked to Salesforce",
"localRecordingStarted": "{{name}} ha cominciato a registrare.",
"localRecordingStopped": "{{name}} ha smesso di registrare.",
"me": "Io",
"moderationInEffectCSDescription": "Alza la mano, se vuoi condividere lo schermo, per favore.",
"moderationInEffectCSTitle": "La condivisione schermo è stata bloccata dal moderatore",
@@ -599,23 +672,28 @@
"moderationStoppedTitle": "Moderazione interrotta",
"moderationToggleDescription": "da {{participantDisplayName}}",
"moderator": "Impostati i permessi di moderatore!",
"muted": "Hai iniziato la conversazione con l'audio disattivato.",
"muted": "Hai iniziato la conversazione con audio disattivato.",
"mutedRemotelyDescription": "Puoi sempre attivare il microfono, quando vuoi parlare. Spegni il microfono quando hai finito, per non introdurre rumori di fondo nella riunione.",
"mutedRemotelyTitle": "Ti è stato disattivato l'audio da {{participantDisplayName}}!",
"mutedTitle": "Hai l'audio disattivato!",
"mutedTitle": "Hai audio disattivato!",
"newDeviceAction": "OK, usala",
"newDeviceAudioTitle": "Trovata nuova origine audio",
"newDeviceCameraTitle": "Trovata nuova videocamera",
"oldElectronClientDescription1": "Sembri stare usando una versione obsoleta del client Jitsi Meet che ha dei problemi di sicurezza noti. Assicurati di aggiornarla presso il nostro ",
"oldElectronClientDescription2": "ultima build",
"oldElectronClientDescription3": " ora!",
"participantWantsToJoin": "Vuole unirsi alla riunione",
"participantsWantToJoin": "Vogliono unirsi alla riunione",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) è stata tolta da un altro partecipante",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) è stata messa da un altro partecipante",
"raiseHandAction": "Alza la mano",
"raisedHand": "{{name}} vorrebbe intervenire.",
"raisedHand": "Vorrebbe intervenire.",
"raisedHands": "{{participantName}} e {{raisedHands}} altre persone",
"reactionSounds": "Disattiva suoni",
"screenShareNoAudio": " L'opzione di condivisione audio non era selezionata nella schermata di selezione della finestra da condividere.",
"reactionSoundsForAll": "Disattiva suoni a tutti",
"screenShareNoAudio": "L'opzione di condivisione audio non era selezionata nella schermata di selezione della finestra da condividere.",
"screenShareNoAudioTitle": "Condividi audio non è stato selezionato",
"selfViewTitle": "Puoi sempre ripristinare la tua immagine nelle impostazioni",
"somebody": "Qualcuno",
"startSilentDescription": "Entra di nuovo nella riunione, per attivare l'audio",
"startSilentTitle": "Sei entrato nella riunione senza aver scelto un dispositivo audio per sentire!",
@@ -623,39 +701,49 @@
"suboptimalExperienceTitle": "Avviso sul browser",
"unmute": "Accendi microfono",
"videoMutedRemotelyDescription": "Puoi riaccenderla in qualsiasi momento.",
"videoMutedRemotelyTitle": "La videocamera ti è stata spenta da {{participantDisplayName}}!"
"videoMutedRemotelyTitle": "La videocamera ti è stata spenta da {{participantDisplayName}}!",
"videoUnmuteBlockedDescription": "Riattivazione video e condivisione schermo sono state momentaneamente bloccate per limiti di sistema.",
"videoUnmuteBlockedTitle": "Riattivazione video e condivisione schermo bloccate!",
"viewLobby": "Vedi sala d'attesa",
"waitingParticipants": "{{waitingParticipants}} persone"
},
"participantsPane": {
"actions": {
"allow": "Permetti ai partecipanti di:",
"allowVideo": "Autorizza video",
"askUnmute": "Chiedi di attivare audio",
"audioModeration": "Possono attivare audio",
"askUnmute": "Chiedi di accendere microfono",
"audioModeration": "Riattivare audio",
"blockEveryoneMicCamera": "Blocca audio e video a tutti",
"invite": "Invita persone",
"invite": "Invita partecipanti",
"moreModerationActions": "Altre opzioni di moderazione",
"moreModerationControls": "Altri controlli di moderazione",
"moreParticipantOptions": "Altre opzioni partecipanti",
"mute": "Silenzia",
"muteAll": "Silenzia tutti",
"muteEveryoneElse": "Silenzia tutti gli altri",
"stopEveryonesVideo": "Ferma il video di tutti",
"stopVideo": "Ferma il video",
"unblockEveryoneMicCamera": "Sblocca audio e video a tutti",
"videoModeration": "Avvia il loro video"
"videoModeration": "Riavviare videocamera"
},
"close": "Chiudi",
"header": "Partecipanti",
"header": "Partecipanti e sala d'attesa",
"headings": {
"lobby": "Sala d'attesa ({{count}})",
"participantsList": "Partecipanti alla riunione ({{count}})",
"waitingLobby": "In attesa ({{count}})"
}
},
"search": "Cerca partecipanti"
},
"passwordDigitsOnly": "Fino a {{number}} cifre",
"passwordSetRemotely": "definita da altro utente",
"pinnedParticipant": "Il partecipante è in evidenza",
"polls": {
"answer": {
"skip": "Salta",
"submit": "Invia"
},
"by": "Da {{ name }}",
"create": {
"addOption": "Aggiungi risposta",
"answerPlaceholder": "Risposta {{index}}",
@@ -731,9 +819,9 @@
"linkCopied": "Collegamento copiato negli appunti",
"lookGood": "Sembra che il tuo microfono funzioni correttamente",
"or": "o",
"premeeting": "Attesa riunione",
"premeeting": "Pre-riunione",
"screenSharingError": "Errore di condivisione dello schermo:",
"showScreen": "Avvia la schermata d'attesa della riunione",
"showScreen": "Attiva schermata pre-riunione",
"startWithPhone": "Avvia usando il telefono, per parlare",
"videoOnlyError": "Errore video:",
"videoTrackError": "Impossibile creare la traccia video.",
@@ -753,6 +841,9 @@
"rejected": "Rifiutato",
"ringing": "Sta suonando..."
},
"privacyView": {
"header": "Privacy"
},
"profile": {
"avatar": "avatar",
"setDisplayNameLabel": "Imposta il nome da visualizzare",
@@ -761,6 +852,19 @@
"title": "Profilo"
},
"raisedHand": "Vorrebbe parlare",
"raisedHandsLabel": "Numero di mani alzate",
"record": {
"already": {
"linked": "La riunione è già collegata a questo oggetto Salesforce."
},
"type": {
"account": "Account",
"contact": "Contact",
"lead": "Lead",
"opportunity": "Opportunity",
"owner": "Owner"
}
},
"recording": {
"authDropboxText": "Carica su Dropbox",
"availableSpace": "Spazio disponibile: {{spaceLeft}} MB (rimangono approssimativamente {{duration}} minuti di registrazione)",
@@ -775,10 +879,17 @@
"expandedPending": "La registrazione è in fase di avvio...",
"failedToStart": "Non è stato possibile avviare la registrazione",
"fileSharingdescription": "Condividi la registrazione con i partecipanti alla riunione",
"highlight": "Evidenzia",
"highlightMoment": "Evidenzia momento",
"highlightMomentDisabled": "Puoi evidenziare dei momenti quando parte la registrazione",
"highlightMomentSuccess": "Momento evidenziato",
"highlightMomentSucessDescription": "Il tuo momento evidenziato sarà aggiunto al riepilogo della riunione.",
"inProgress": "Registrazione o diretta in corso",
"limitNotificationDescriptionNative": "La tua registrazione sarà limitata a {{limit}} minuti. Per registrazioni illimitate, prova <3>{{app}}</3>.",
"limitNotificationDescriptionWeb": "Data l'alta domanda la tua registrazione sarà limitata a {{limit}} minuti. Per registrazioni illimitate, prova <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"linkGenerated": "Abbiamo generato un collegamento alla tua registrazione.",
"live": "DIRETTA",
"localRecordingWarning": "Assicurati di aver selezionato la scheda corrente, per regitrare gli audio e video corretti. La registrazione è limitata ad 1GB, cioè circa 100 minuti.",
"loggedIn": "Accesso effettuato come {{userName}}",
"off": "Registrazione interrotta",
"offBy": "{{name}} ha interrotto la registrazione",
@@ -786,27 +897,32 @@
"onBy": "Registrazione iniziata da {{name}}",
"pending": "In preparazione alla registrazione della riunione",
"rec": "REC",
"saveLocalRecording": "Salva localmente il file della registrazione",
"serviceDescription": "La tua registrazione verrà salvata dal servizio di registrazione che hai scelto",
"serviceDescriptionCloud": "Registrazione in rete",
"serviceDescriptionCloudInfo": "Le riunioni registrate vengono automaticamente cancellate 24 ore dopo la registrazione.",
"serviceName": "Servizio di registrazione",
"sessionAlreadyActive": "Questa sessione è già in corso di registrazione o trasmissione in diretta.",
"signIn": "Entra",
"signOut": "Esci",
"surfaceError": "Selezionare la scheda corrente, per favore.",
"unavailable": "Ops! Il {{serviceName}} non è al momento disponibile. Stiamo lavorando per risolvere il problema. Riprova più tardi.",
"unavailableTitle": "Registrazione non disponibile",
"uploadToCloud": "Carica in cloud"
},
"screenshareDisplayName": "Schermo di {{name}}",
"sectionList": {
"pullToRefresh": "Trascina per aggiornare"
},
"security": {
"about": "Puoi aggiungere una $t(lockRoomPassword) alla riunione. I partecipanti dovranno fornire la $t(lockRoomPassword) per essere autorizzati a partecipare alla riunione.",
"about": "Puoi aggiungere una $t(lockRoomPassword) alla riunione. I partecipanti dovranno fornire la $t(lockRoomPassword) per essere autorizzati a partecipare alla riunione.",
"aboutReadOnly": "I moderatori della riunione possono aggiungere $t(lockRoomPassword). I partecipanti dovranno fornire la $t(lockRoomPassword) per essere autorizzati a partecipare alla riunione.",
"insecureRoomNameWarning": "Il nome della riunione non è sicuro. Dei partecipanti indesiderati potrebbero unirsi alla riunione. Puoi proteggere l'accesso alla riunione col bottone sicurezza.",
"securityOptions": "Impostazioni di sicurezza"
},
"settings": {
"calendar": {
"about": "Lintegrazione del calendario con {{appName}} è usata per accedere in sicurezza al proprio calendario per poter leggere i prossimi appuntamenti ",
"about": "Lintegrazione del calendario con {{appName}} è usata per accedere in sicurezza al proprio calendario e poter leggere i prossimi appuntamenti ",
"disconnect": "Disconnetti",
"microsoftSignIn": "Connettiti con un account Microsoft",
"signedIn": "Sto accedendo agli eventi del calendario per {{email}}. Fai click su «Disconnetti» per interrompere laccesso agli eventi del calendario.",
@@ -821,23 +937,26 @@
"incomingMessage": "Messaggio in arrivo",
"language": "Lingua",
"loggedIn": "Connesso come {{name}}",
"maxStageParticipants": "Numero massimo di partecipanti che possono essere aggiunti come oratori",
"microphones": "Microfoni",
"moderator": "Moderatore",
"more": "Altro",
"more": "Mostra di più",
"name": "Nome",
"noDevice": "Nessuno",
"participantJoined": "Partecipante Entrato",
"participantLeft": "Partecipante Uscito",
"playSounds": "Suoni attivati",
"reactions": "Reazioni riunione",
"sameAsSystem": "Come nel sistema ({{label}})",
"sameAsSystem": "Stesso del computer ({{label}})",
"selectAudioOutput": "Uscita audio",
"selectCamera": "Videocamera",
"selectMic": "Microfono",
"selfView": "Tua immagine",
"sounds": "Suoni",
"speakers": "Altoparlanti",
"startAudioMuted": "Tutti cominciano a microfono spento",
"startVideoMuted": "Tutti cominciano a video disattivato",
"startReactionsMuted": "Spegni i suoni delle reazioni a tutti",
"startVideoMuted": "Tutti cominciano a videocamera disattivata",
"talkWhileMuted": "Parla senza microfono",
"title": "Impostazioni"
},
@@ -859,8 +978,8 @@
"profileSection": "Profilo",
"serverURL": "URL del server",
"showAdvanced": "Impostazioni avanzate",
"startWithAudioMuted": "Inizia con l'audio disattivato",
"startWithVideoMuted": "Avvia con il video disattivato",
"startWithAudioMuted": "Inizia con audio disattivato",
"startWithVideoMuted": "Inizia con video disattivato",
"version": "Versione"
},
"share": {
@@ -869,13 +988,21 @@
},
"speaker": "Relatore",
"speakerStats": {
"angry": "Arrabbiato",
"disgusted": "Disgustato",
"displayEmotions": "Mostra Emozioni",
"fearful": "Spaventato",
"happy": "Contento",
"hours": "{{count}}h",
"minutes": "{{count}}m",
"name": "Nome",
"neutral": "Neutro",
"sad": "Triste",
"search": "Cerca",
"seconds": "{{count}}s",
"speakerStats": "Statistiche",
"speakerTime": "Tempo"
"speakerTime": "Tempo",
"surprised": "Sorpreso"
},
"startupoverlay": {
"genericTitle": "Per la riunione devono essere usati il tuo microfono e la tua videocamera.",
@@ -887,69 +1014,79 @@
"text": "Premi il pulsante <i>Ricollegati</i> per ricollegarti.",
"title": "La video chiamata si è interrotta perché il computer è stato sospeso."
},
"termsView": {
"header": "Termini"
},
"toolbar": {
"Settings": "Impostazioni",
"accessibilityLabel": {
"Settings": "Attiva/disattiva impostazioni",
"Settings": "Attiva/Disattiva impostazioni",
"audioOnly": "Spegni/Accendi audio",
"audioRoute": "Scegli l'uscita audio",
"boo": "Boo",
"breakoutRoom": "Entra/Lascia sottogruppo",
"callQuality": "Imposta qualità della chiamata",
"carmode": "Modalità in auto",
"cc": "Avvia/Ferma sottotitoli",
"chat": "Entra/Esci da conversazione",
"clap": "Applaudi",
"collapse": "Riduci",
"dock": "Aggancia alla finestra principale",
"document": "Apri/Chiudi documenti condivisi",
"download": "Scarica le nostre app",
"embedMeeting": "Incorpora riunione altrove",
"expand": "Espandi",
"feedback": "Lascia un feedback",
"fullScreen": "Apri/Chiudi schermo intero",
"giphy": "Menù GIPHY",
"grantModerator": "Autorizza moderatore",
"hangup": "Lascia la riunione",
"help": "Aiuto",
"invite": "Invita persone",
"invite": "Invita partecipanti",
"kick": "Espelli partecipante",
"laugh": "Ridi",
"like": "Mi piace",
"lobbyButton": "Attiva/disattiva sala d'attesa",
"localRecording": "Abilita/disattiva controlli di registrazione locale",
"linkToSalesforce": "Collega a Salesforce",
"lobbyButton": "Attiva/Disattiva sala d'attesa",
"localRecording": "Abilita/Disattiva controlli di registrazione locale",
"lockRoom": "Attiva o disattiva password",
"moreActions": "Attiva o disattiva menu avanzato",
"moreActionsMenu": "Menu avanzato",
"moreOptions": "Più opzioni",
"mute": "Attiva/disattiva audio",
"moreOptions": "Altre opzioni",
"mute": "Attiva/Disattiva audio",
"muteEveryone": "Spegni i microfoni a tutti",
"muteEveryoneElse": "Spegni i microfoni di tutti gli altri",
"muteEveryoneElsesVideo": "Spegni le videocamere di tutti gli altri",
"muteEveryonesVideo": "Spegni le videocamere a tutti",
"participants": "Partecipanti",
"pip": "Attiva/disattiva immagine nellimmagine",
"pip": "Attiva/Disattiva immagine nellimmagine",
"privateMessage": "Invia messaggio privato",
"profile": "Modifica profilo",
"raiseHand": "Alza/Abbassa la mano",
"reactionsMenu": "Apri/chiudi menù delle reaction",
"recording": "Avvia/ferma registrazione",
"reactionsMenu": "Apri/Chiudi menù delle reaction",
"recording": "Avvia/Ferma registrazione",
"remoteMute": "Spegni microfono al partecipante",
"remoteVideoMute": "Spegni videocamera del partecipante",
"security": "Impostazioni di sicurezza",
"selectBackground": "Scegli sfondo",
"selfView": "Mostra tua immagine",
"shareRoom": "Invita qualcuno",
"shareYourScreen": "Attiva/disattiva condivisione schermo",
"shareYourScreen": "Attiva/Disattiva condivisione schermo",
"shareaudio": "Condividi audio",
"sharedvideo": "Attiva/disattiva condivisione",
"shortcuts": "Attiva/disattiva scorciatoie",
"sharedvideo": "Attiva/Disattiva condivisione",
"shortcuts": "Attiva/Disattiva scorciatoie",
"show": "Mostra in primo piano",
"silence": "Silenzio",
"speakerStats": "Attiva/disattiva statistiche relatore",
"speakerStats": "Attiva/Disattiva statistiche relatore",
"surprised": "Sorpreso",
"tileView": "Vedi tutti i partecipanti insieme, o uno solo",
"tileView": "Vedi tutti i partecipanti, o uno solo",
"toggleCamera": "Cambia videocamera",
"toggleFilmstrip": "Attiva/disattiva pellicola",
"toggleFilmstrip": "Attiva/Disattiva pellicola",
"undock": "Sgancia in una finestra separata",
"videoblur": "Sfoca video",
"videomute": "Attiva/disattiva videocamera"
"videomute": "Attiva/Disattiva videocamera"
},
"addPeople": "Aggiungi persone alla chiamata",
"addPeople": "Aggiungi partecipanti alla chiamata",
"audioOnlyOff": "Disabilita modalità per banda limitata",
"audioOnlyOn": "Abilita modalità per banda limitata",
"audioRoute": "Scegli l'uscita audio",
@@ -957,34 +1094,39 @@
"authenticate": "Autenticazione",
"boo": "Boo",
"callQuality": "Imposta qualità video",
"chat": "Apri / Chiudi conversazione",
"chat": "Apri/Chiudi conversazione",
"clap": "Applaudi",
"closeChat": "Chiudi conversazione",
"closeReactionsMenu": "Chiudi il menù reazioni",
"disableReactionSounds": "Puoi disattivare i suoni delle reaction, in questa riunione",
"dock": "Aggancia nella finestra principale",
"documentClose": "Chiudi documento condiviso",
"documentOpen": "Apri documento condiviso",
"download": "Scarica le nostre app",
"e2ee": "Crittografia punto-punto",
"embedMeeting": "Incorpora riunione altrove",
"enterFullScreen": "Visualizza a schermo intero",
"enterFullScreen": "Schermo intero",
"enterTileView": "Vedi tutti i partecipanti",
"exitFullScreen": "Esci da schermo intero",
"exitTileView": "Vedi una persona sola",
"feedback": "Lascia un feedback",
"giphy": "Menù GIPHY",
"hangup": "Butta giù",
"help": "Aiuto",
"invite": "Invita persone",
"invite": "Invita partecipanti",
"joinBreakoutRoom": "Entra in sottogruppo",
"laugh": "Ridi",
"leaveBreakoutRoom": "Lascia breakout room",
"like": "Mi piace",
"linkToSalesforce": "Collega a Salesforce",
"lobbyButtonDisable": "Disabilita sala d'attesa",
"lobbyButtonEnable": "Abilita sala d'attesa",
"login": "Accedi",
"logout": "Scollegati",
"lowerYourHand": "Abbassa la mano",
"moreActions": "Più azioni",
"moreOptions": "Più opzioni",
"mute": "Attiva / Disattiva microfono",
"moreActions": "Altre azioni",
"moreOptions": "Altre opzioni",
"mute": "Attiva/Disattiva microfono",
"muteEveryone": "Spegni audio a tutti",
"muteEveryonesVideo": "Spegni videocamera di tutti",
"noAudioSignalDesc": "Se non l'hai disabilitato intenzionalmente nelle impostazioni, prova a cambiare dispositivo di input.",
@@ -1000,7 +1142,7 @@
"pip": "Abilita visualizzazione immagine nell'immagine",
"privateMessage": "invia un messaggio privato",
"profile": "Modifica profilo",
"raiseHand": "Alza / Abbassa la mano",
"raiseHand": "Alza/Abbassa la mano",
"raiseYourHand": "Alza la mano",
"reactionBoo": "Invia boo",
"reactionClap": "Invia applauso",
@@ -1018,6 +1160,7 @@
"speakerStats": "Statistiche",
"startScreenSharing": "Inizia la condivisione dello schermo",
"startSubtitles": "Avvia sottotitoli",
"stopAudioSharing": "Ferma condivisione audio",
"stopScreenSharing": "Ferma la condivisione dello schermo",
"stopSharedVideo": "Ferma video",
"stopSubtitles": "Ferma sottotitoli",
@@ -1025,11 +1168,12 @@
"talkWhileMutedPopup": "Stai provando a parlare? Il microfono è disattivato.",
"tileViewToggle": "Vedi tutti i partecipanti insieme, o uno solo",
"toggleCamera": "Cambia videocamera",
"undock": "Sgancia in una finestra separata",
"videoSettings": "Impostazioni video",
"videomute": "Attiva / Disattiva videocamera"
"videomute": "Attiva/Disattiva videocamera"
},
"transcribing": {
"ccButtonTooltip": "Inizia / Ferma i sottotitoli",
"ccButtonTooltip": "Inizia/Ferma i sottotitoli",
"error": "Trascrizione fallita. Prova di nuovo.",
"expandedLabel": "La trascrizione della riunione è attiva",
"failedToStart": "C'è stato un errore nell'avvio del servizio di trascrizione.",
@@ -1054,26 +1198,30 @@
},
"videoSIPGW": {
"busy": "Stiamo lavorando per liberare le risorse. Riprova tra qualche minuto.",
"busyTitle": "Il servizio Stanza al momento è occupato",
"busyTitle": "Il servizio Riunione al momento è occupato",
"errorAlreadyInvited": "{{displayName}} già invitato",
"errorInvite": "Riunione non ancora stabilita. Riprova più tardi.",
"errorInviteFailed": "Stiamo lavorando per risolvere il problema. Riprova più tardi.",
"errorInviteFailedTitle": "Invito a {{displayName}} fallito",
"errorInviteTitle": "Errore nell'invito alla stanza",
"errorInviteTitle": "Errore nell'invito alla riunione",
"pending": "{{displayName}} è stato invitato"
},
"videoStatus": {
"adjustFor": "Adjust for:",
"audioOnly": "AUD",
"audioOnlyExpanded": "Hai attivato la modalità con banda limitata. Questa modalità permette di risparmiare banda, ma non vedrai gli altri partecipanti.",
"audioOnlyExpanded": "Hai attivato la modalità per banda limitata. Questa modalità permette di risparmiare banda, ma non vedrai gli altri partecipanti.",
"bestPerformance": "Massime prestazioni",
"callQuality": "Qualità video",
"hd": "HD",
"hdTooltip": "Stai vedendo in alta definizione",
"highDefinition": "Alta definizione",
"highestQuality": "Massima definizione",
"labelTooiltipNoVideo": "Nessun video",
"labelTooltipAudioOnly": "Hai attivato la modalità con banda limitata",
"labelTooltipAudioOnly": "Hai attivato la modalità per banda limitata",
"ld": "LD",
"ldTooltip": "Stai vedendo a bassa definizione",
"lowDefinition": "Bassa definizione",
"performanceSettings": "Impostazione prestazioni",
"sd": "SD",
"sdTooltip": "Stai vedendo a definizione standard",
"standardDefinition": "Definizione standard"
@@ -1086,12 +1234,17 @@
"domuteVideoOfOthers": "Disattiva video di tutti gli altri",
"flip": "Rifletti",
"grantModerator": "Autorizza moderatore",
"hideSelfView": "Nascondi tua immagine",
"kick": "Espelli",
"moderator": "Moderatore",
"mute": "Il partecipante ha il microfono spento",
"muted": "Audio disattivato",
"remoteControl": "Avvia/ferma il controllo remoto",
"show": "Mostra in primo piano",
"pinToStage": "Aggiungi agli oratori",
"remoteControl": "Avvia/Ferma il controllo remoto",
"screenSharing": "Il partecipante sta condividendo lo schermo",
"show": "Mostra tra gli oratori",
"showSelfView": "Mostra tua immagine",
"unpinFromStage": "Togli",
"videoMuted": "Video disattivato",
"videomute": "Il partecipante ha la videocamera spenta"
},
@@ -1106,7 +1259,7 @@
"image1": "Spiaggia",
"image2": "Parete neutra bianca",
"image3": "Stanza bianca vuota",
"image4": "Lampanda da pavimento nera",
"image4": "Lampada da pavimento nera",
"image5": "Montagna",
"image6": "Foresta",
"image7": "Alba",
@@ -1116,13 +1269,14 @@
"slightBlur": "Sfuoca leggermente",
"title": "Sfondi",
"uploadedImage": "Carica immagine {{index}}",
"webAssemblyWarning": "Il WebAssembly not è supportato"
"webAssemblyWarning": "Il WebAssembly non è supportato",
"webAssemblyWarningDescription": "Il WebAssembly è disabilitato o non è supportato da questo browser"
},
"volumeSlider": "Sbarra volume",
"welcomepage": {
"accessibilityLabel": {
"join": "Tocca per accedere",
"roomname": "Inserisci nome stanza"
"roomname": "Inserisci nome riunione"
},
"addMeetingName": "Aggiungi Nome riunione",
"appDescription": "Avvia una videochiamata con tutto il team. Invita tutti quelli che conosci. {{app}} è una soluzione per effettuare videoconferenze totalmente crittografata, 100% open source, che puoi usare sempre, ogni giorno, gratuitamente senza bisogno di un account.",
@@ -1141,7 +1295,7 @@
"headerTitle": "Jitsi Meet",
"info": "Informazioni chiamata",
"jitsiOnMobile": "Jitsi su mobile scarica le nostre app e dai inizio ad una riunione dovunque tu sia",
"join": "CREA / UNISCITI",
"join": "CREA/UNISCITI",
"logo": {
"calendar": "Logo calendario",
"desktopPreviewThumbnail": "Icona anteprima desktop",
@@ -1157,11 +1311,11 @@
"privacy": "Riservatezza",
"recentList": "Recenti",
"recentListDelete": "Cancella",
"recentListEmpty": "La tua lista è vuota. Conversa con qualcuno del tuo team e lo vedrai apparire nella lista delle riunioni recenti.",
"recentListEmpty": "La lista delle riunioni recenti è vuota. Partecipa almeno ad una riunione e potrai riavviarla in seguito.",
"reducedUIText": "Benvenuto in {{app}}!",
"roomNameAllowedChars": "Il nome della riunione non deve contenere questi caratteri: ?, &, :, ', \", %, #.",
"roomname": "Inserisci il nome della stanza",
"roomnameHint": "Inserisci il nome o l'URL della stanza alla quale vuoi accedere. Puoi anche inventarti un nome, assicurati solo che le persone che vuoi contattare lo conoscano, così che possano inserire lo stesso nome.",
"roomname": "Inserisci il nome della riunione",
"roomnameHint": "Inserisci il nome o l'URL della alla quale vuoi accedere. Puoi anche inventarti un nome, assicurati solo che le persone che vuoi contattare lo conoscano, così che possano inserire lo stesso nome.",
"sendFeedback": "Invia feedback",
"startMeeting": "Inizia riunione",
"terms": "Termini di utilizzo",

View File

@@ -497,6 +497,7 @@
"errorMissingPassword": "Voer alstublieft het wachtwoord van de vergadering in",
"invalidPassword": "Ongeldig wachtwoord",
"joinRejectedMessage": "Uw verzoek tot deelname is afgewezen door een moderator.",
"joinRejectedTitle": "Verzoek tot deelname afgewezen",
"joinTitle": "Deelnemen aan vergadering",
"joinWithPasswordMessage": "Poging tot deelname met wachtwoord, even geduld a.u.b...",
"joiningMessage": "U neemt deel aan de vergadering zodra iemand uw verzoek accepteert",
@@ -889,6 +890,7 @@
"mute": "Audio dempen in- of uitschakelen",
"muteEveryone": "Iedereen dempen",
"muteEveryoneElse": "Alle anderen dempen",
"participants": "Deelnemers",
"pip": "Picture-in-Picture-modus in- of uitschakelen",
"privateMessage": "Verstuur privébericht",
"profile": "Uw profiel bewerken",
@@ -954,6 +956,8 @@
"noisyAudioInputDesc": "Het klinkt alsof uw microfoon ruis veroorzaakt. Overweeg te dempen of van apparaat te wisselen.",
"noisyAudioInputTitle": "Uw microfoon lijkt ruis te veroorzaken!",
"openChat": "Chat openen",
"openReactionsMenu": "Reactiemenu openen",
"participants": "Deelnemers",
"pip": "Picture-in-Picture-modus activeren",
"privateMessage": "Verstuur privébericht",
"profile": "Uw profiel bewerken",
@@ -1051,6 +1055,7 @@
},
"virtualBackground": {
"addBackground": "Achtergrond toevoegen",
"apply": "Toepassen",
"blur": "Vervagen",
"none": "Geen",
"pleaseWait": "Even geduld a.u.b...",

View File

@@ -31,6 +31,7 @@
},
"audioDevices": {
"bluetooth": "Bluetooth",
"car": "Sistema áudio do automóvel",
"headphones": "Auscultadores",
"none": "Sem dispositivos de áudio disponíveis",
"phone": "Telemóvel",
@@ -39,9 +40,6 @@
"audioOnly": {
"audioOnly": "Largura de banda baixa"
},
"blankPage": {
"meetingEnded": "A reunião terminou."
},
"breakoutRooms": {
"actions": {
"add": "Adicionar salas simultâneas",
@@ -79,6 +77,17 @@
"refresh": "Atualizar calendário",
"today": "Hoje"
},
"carmode": {
"actions": {
"leaveMeeting": " Deixar a reunião",
"selectSoundDevice": "Seleccionar dispositivo de som"
},
"labels": {
"buttonLabel": "Modo carro",
"title": "Modo de condução segura",
"videoStopped": "O seu vídeo está parado"
}
},
"chat": {
"enter": "Entrar na sala",
"error": "Erro: a sua mensagem não foi enviada. Motivo: {{error}}",
@@ -107,6 +116,7 @@
},
"chromeExtensionBanner": {
"buttonText": "Instalar extensão do Chrome",
"buttonTextEdge": "Instalar extensão do Edge",
"close": "Fechar",
"dontShowAgain": "Não me mostre isto outra vez",
"installExtensionText": "Instalar a extensão para a integração Google Calendar e Office 365"
@@ -185,7 +195,7 @@
"unsupportedBrowser": "Parece que está a usar um browser que não suportamos."
},
"defaultLink": "ex.: {{url}}",
"defaultNickname": "ex.: João Pedro",
"defaultNickname": "ex.: João Dias",
"deviceError": {
"cameraError": "Falha ao aceder à sua câmara",
"cameraPermission": "Erro ao obter permissão para a câmara",
@@ -198,6 +208,9 @@
"selectADevice": "Selecione um dispositivo",
"testAudio": "Tocar um som de teste"
},
"dialIn": {
"screenTitle": "Resumo da marcação"
},
"dialOut": {
"statusMessage": "está agora {{status}}"
},
@@ -279,7 +292,7 @@
"lockRoom": "Adicionar reunião $t(lockRoomPassword)",
"lockTitle": "Bloqueio falhado",
"login": "Entrar",
"logoutQuestion": "Tem a certeza de que quer terminar a sessão e interromper a conferência?",
"logoutQuestion": "Tem a certeza de que quer terminar a sessão e sair da conferência?",
"logoutTitle": "Sair",
"maxUsersLimitReached": "O limite para o número máximo de participantes foi atingido. A conferência está cheia. Por favor contacte o proprietário da reunião ou tente novamente mais tarde!",
"maxUsersLimitReachedTitle": "Limite máximo de participantes atingido",
@@ -348,7 +361,7 @@
"screenSharingFailed": "Oops! Algo correu mal, não fomos capazes de começar a partilhar o ecrã!",
"screenSharingFailedTitle": "A partilha de ecrã falhou!",
"screenSharingPermissionDeniedError": "Oops! Alguma coisa correu mal com as vossas permissões de partilha de ecrã. Por favor, volte a carregar e tente novamente.",
"searchInSalesforce": "Pesquisar na Força de Vendas",
"searchInSalesforce": "Pesquisar na Salesforce",
"searchResults": "Resultados da pesquisa({{count}})",
"searchResultsDetailsError": "Algo correu mal enquanto se recuperava os dados do proprietário.",
"searchResultsError": "Alguma coisa correu mal durante a recuperação de dados.",
@@ -423,7 +436,7 @@
},
"giphy": {
"noResults": "Não foram encontrados resultados :(",
"search": "Procurar GIPHY"
"search": "Procurar no GIPHY"
},
"helpView": {
"header": "Centro de ajuda"
@@ -491,7 +504,7 @@
"focusLocal": "Focar no seu vídeo",
"focusRemote": "Focar no vídeo de outro participante",
"fullScreen": "Entrar ou sair do ecrã completo",
"giphyMenu": "Alternar o menu GIPHY",
"giphyMenu": "Ativar/Desativar o menu GIPHY",
"keyboardShortcuts": "Atalhos de teclado",
"localRecording": "Mostrar ou ocultar controlos de gravação local",
"mute": "Ligar ou desligar o seu microfone",
@@ -559,6 +572,7 @@
"errorMissingPassword": "Por favor introduza a senha da reunião",
"invalidPassword": "Senha inválida",
"joinRejectedMessage": "O seu pedido de adesão foi rejeitado por um moderador.",
"joinRejectedTitle": "Pedido de adesão rejeitado.",
"joinTitle": "Junte-se à reunião",
"joinWithPasswordMessage": "Tentando aderir com senha, por favor aguarde...",
"joiningMessage": "Participará na reunião assim que alguém aceitar o seu pedido",
@@ -567,8 +581,8 @@
"knockButton": "Pedir para participar",
"knockTitle": "Alguém quer juntar-se à reunião",
"knockingParticipantList": "Lista de participantes a expulsar",
"lobbyChatStartedNotification": "{{moderator}} iniciou uma conversa na sala de espera com {{attendee}}",
"lobbyChatStartedTitle": "{{moderator}} iniciou uma conversa na sala de espera consigo.",
"lobbyChatStartedNotification": "{{moderator}} iniciou com {{attendee}} uma conversa na sala de espera",
"lobbyChatStartedTitle": "{{moderator}} iniciou consigo uma conversa na sala de espera.",
"nameField": "Introduza o seu nome",
"notificationLobbyAccessDenied": "{{targetParticipantName}} foi recusada a adesão por {{originParticipantName}}",
"notificationLobbyAccessGranted": "{{targetParticipantName}} foi autorizado a aderir por {{originParticipantName}}",
@@ -631,6 +645,7 @@
"displayNotifications": "Mostrar notificações para",
"focus": "Foco da conferência",
"focusFail": "{{component}} não disponĩvel - tente em {{ms}} seg.",
"gifsMenu": "GIPHY",
"groupTitle": "Notificações",
"hostAskedUnmute": "O moderador gostaria que você falasse",
"invitedOneMember": "{{displayName}} foi convidado",
@@ -640,12 +655,14 @@
"leftOneMember": "{{name}} deixou a reunião",
"leftThreePlusMembers": "{{name}} e muitos outros deixaram a reunião",
"leftTwoMembers": "{{first}} e {{second}} deixaram a reunião",
"linkToSalesforce": "Link para a Força de Vendas",
"linkToSalesforceDescription": "Pode ligar o resumo da reunião a um objecto da Força de Vendas.",
"linkToSalesforceError": "Falha na ligação da reunião à Força de Vendas",
"linkToSalesforce": "Link para a Salesforce",
"linkToSalesforceDescription": "Pode ligar o resumo da reunião a um objecto da Salesforce.",
"linkToSalesforceError": "Falha na ligação da reunião à Salesforce",
"linkToSalesforceKey": "Ligar esta reunião",
"linkToSalesforceProgress": "A ligar a reunião à Força de Vendas...",
"linkToSalesforceSuccess": "A reunião foi ligada à Força de Vendas",
"linkToSalesforceProgress": "A ligar a reunião à Salesforce...",
"linkToSalesforceSuccess": "A reunião foi ligada à Salesforce",
"localRecordingStarted": "{{name}} iniciou uma gravação local.",
"localRecordingStopped": "{{name}} parou uma gravação local.",
"me": "Eu",
"moderationInEffectCSDescription": "Por favor, levantem a mão se quiserem partilhar o vosso ecrã.",
"moderationInEffectCSTitle": "A partilha de ecrã é bloqueada pelo moderador",
@@ -724,6 +741,7 @@
},
"passwordDigitsOnly": "Até {{number}} dígitos",
"passwordSetRemotely": "Definido por outro participante",
"pinnedParticipant": "O participante está afixado",
"polls": {
"answer": {
"skip": "Ignorar",
@@ -800,6 +818,7 @@
"initiated": "Chamada iniciada",
"joinAudioByPhone": "Entrar com o áudio do telefone",
"joinMeeting": "Entrar na reunião",
"joinMeetingInLowBandwidthMode": "Entrar em modo de baixa largura de banda",
"joinWithoutAudio": "Entrar sem áudio",
"keyboardShortcuts": "Ativar os atalhos de teclado",
"linkCopied": "Link copiado para a área de transferência",
@@ -841,7 +860,7 @@
"raisedHandsLabel": "Número de mãos levantadas",
"record": {
"already": {
"linked": "O registo já está ligado a esta sessão."
"linked": "A reunião já está ligada a este objecto da Força de vendas."
},
"type": {
"account": "Conta",
@@ -865,11 +884,17 @@
"expandedPending": "Iniciando gravação...",
"failedToStart": "Falha ao iniciar a gravação",
"fileSharingdescription": "Partilhar o link da gravação com os participantes da reunião",
"highlight": "Destaque",
"highlightMoment": "Momento de destaque",
"highlightMomentDisabled": "É possível destacar momentos quando a gravação começa",
"highlightMomentSuccess": "Momento destacado",
"highlightMomentSucessDescription": "O seu momento destacado será acrescentado ao resumo da reunião.",
"inProgress": "Gravação ou transmissão em direto em curso",
"limitNotificationDescriptionNative": "Due to high demand your recording will be limited to {{limit}} min. Para gravações ilimitadas tente <3>{{app}}</3>.",
"limitNotificationDescriptionWeb": "Devido à grande procura, a sua gravação será limitada a {{limit}} min. For unlimited recordings try <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"linkGenerated": "Gerámos um link para a sua gravação.",
"live": "DIRETO",
"localRecordingWarning": "Certifique-se de seleccionar o separador actual a fim de utilizar o vídeo e áudio correctos. A gravação está actualmente limitada a 1 GB, o que é cerca de 100 minutos.",
"loggedIn": "Conectado como {{userName}}",
"off": "Gravação parada",
"offBy": "{{name}} parou a gravação",
@@ -877,6 +902,7 @@
"onBy": "{{name}} iniciou a gravação",
"pending": "Preparando para gravar a reunião...",
"rec": "REC",
"saveLocalRecording": "Guardar ficheiro de gravação localmente",
"serviceDescription": "Sua gravação será salva pelo serviço de gravação",
"serviceDescriptionCloud": "Gravação na nuvem",
"serviceDescriptionCloudInfo": "As reuniões gravadas são automaticamente apagadas 24h após a hora de gravação.",
@@ -884,10 +910,12 @@
"sessionAlreadyActive": "Esta sessão já está a ser gravada ou transmitida em direto.",
"signIn": "Entrar",
"signOut": "Sair",
"surfaceError": "Por favor, seleccione o separador actual.",
"unavailable": "Oops! O {{serviceName}} está indisponível. Estamos trabalhando para resolver o problema. Por favor, tente mais tarde.",
"unavailableTitle": "Gravação indisponível",
"uploadToCloud": "Enviar para a nuvem"
},
"screenshareDisplayName": "Ecrã de {{name}}",
"sectionList": {
"pullToRefresh": "Puxe para atualizar"
},
@@ -914,6 +942,7 @@
"incomingMessage": "Receber uma mensagem",
"language": "Idioma",
"loggedIn": "Sessão iniciada como {{name}}",
"maxStageParticipants": "Número máximo de participantes que podem ser afixados",
"microphones": "Microfones",
"moderator": "Moderador",
"more": "Mais",
@@ -924,6 +953,7 @@
"playSounds": "Reproduzir som quando",
"reactions": "Expressarem uma reação",
"sameAsSystem": "O mesmo que o sistema ({{label}})",
"screenTitle": "Definições",
"selectAudioOutput": "Saída de áudio",
"selectCamera": "Câmara",
"selectMic": "Microfone",
@@ -949,6 +979,7 @@
"disableCrashReportingWarning": "Tem a certeza de que quer desativar o relatório de falhas? A configuração será aplicada depois de reiniciar a aplicação.",
"disableP2P": "Desactivar o modo Peer-To-Peer",
"displayName": "Nome de exibição",
"displayNamePlaceholderText": "Ex: João Dias",
"email": "Email",
"header": "Configurações",
"profileSection": "Perfil",
@@ -1002,17 +1033,19 @@
"boo": "Vaia",
"breakoutRoom": "Entrar/Sair salas instantâneas",
"callQuality": "Gerir a qualidade do vídeo",
"carmode": "Modo carro",
"cc": "Mudar legendas",
"chat": "Abrir / Fechar chat",
"clap": "Aplausos",
"collapse": "Colapsar",
"dock": "Encaixar na janela principal",
"document": "Mudar para documento partilhado",
"download": "Descarregar as nossas aplicações",
"embedMeeting": "Reunião incorporada",
"expand": "Expandir",
"feedback": "Deixar comentários",
"fullScreen": "Mudar para ecrã completo",
"giphy": "Alternar o menu GIPHY",
"giphy": "Ativar/Desativar o menu GIPHY",
"grantModerator": "Conceder direitos de moderador",
"hangup": "Sair da reunião",
"help": "Ajuda",
@@ -1020,7 +1053,7 @@
"kick": "Remover participante",
"laugh": "Risos",
"like": "Aprovado",
"linkToSalesforce": "Link para a Força de Vendas",
"linkToSalesforce": "Link para a Salesforce",
"lobbyButton": "Ativar/desativar sala de espera",
"localRecording": "Mudar os controlos locais de gravação",
"lockRoom": "Mudar palavra-chave de reunião",
@@ -1056,6 +1089,7 @@
"tileView": "Mudar a vista em quadrícula",
"toggleCamera": "Mudar a câmara",
"toggleFilmstrip": "Mudar a película de filme",
"undock": "Soltar numa janela separada",
"videoblur": "Mudar o desfoque de vídeo",
"videomute": "Iniciar / Parar câmara"
},
@@ -1072,6 +1106,7 @@
"closeChat": "Fechar chat",
"closeReactionsMenu": "Fechar menu de reações",
"disableReactionSounds": "Pode desactivar os sons de reacção para esta reunião",
"dock": "Encaixar na janela principal",
"documentClose": "Fechar documento partilhado",
"documentOpen": "Abrir documento partilhado",
"download": "Descarregar as nossas aplicações",
@@ -1082,7 +1117,7 @@
"exitFullScreen": "Sair de ecrã completo",
"exitTileView": "Sair de quadrícula",
"feedback": "Deixar comentários",
"giphy": "Alternar o menu GIPHY",
"giphy": "Ativar/Desativar o menu GIPHY",
"hangup": "Sair da reunião",
"help": "Ajuda",
"invite": "Convidar pessoas",
@@ -1090,7 +1125,7 @@
"laugh": "Risos",
"leaveBreakoutRoom": "Sair da sala",
"like": "Aprovado",
"linkToSalesforce": "Link para a Força de Vendas",
"linkToSalesforce": "Link para a Salesforce",
"lobbyButtonDisable": "Desativar sala de espera",
"lobbyButtonEnable": "Ativar sala de espera",
"login": "Iniciar sessão",
@@ -1140,6 +1175,7 @@
"talkWhileMutedPopup": "Está a tentar falar? Está com o microfone desativado.",
"tileViewToggle": "Mudar para vista em quadrícula",
"toggleCamera": "Mudar a câmara",
"undock": "Soltar numa janela separada",
"videoSettings": "Definições de vídeo",
"videomute": "Iniciar / Parar câmara"
},
@@ -1210,10 +1246,12 @@
"moderator": "Moderador",
"mute": "Participante está sem som",
"muted": "Sem som",
"pinToStage": "Afixar",
"remoteControl": "Iniciar / Parar controlo remoto",
"screenSharing": "Participante está a partilhar o seu ecrã",
"show": "Mostrar no palco",
"showSelfView": "Mostrar autovisualização",
"unpinFromStage": "Desafixar",
"videoMuted": "Câmara desativada",
"videomute": "Participante parou a câmara"
},

View File

@@ -2,6 +2,7 @@
"addPeople": {
"add": "Пригласить",
"addContacts": "Пригласите других людей",
"contacts": "контакты",
"copyInvite": "Скопировать приглашение на встречу",
"copyLink": "Скопировать ссылку на встречу",
"copyStream": "Скопировать ссылку на прямую трансляцию",
@@ -16,18 +17,14 @@
"inviteMoreMailSubject": "Присоединиться к встрече {{appName}} ",
"inviteMorePrompt": "Пригласить других людей",
"linkCopied": "Ссылка скопирована в буфер обмена",
"loading": "Поиск людей и номеров телефонов",
"loadingNumber": "Проверка номера телефона",
"loadingPeople": "Поиск людей для приглашения",
"noResults": "Поиск не дал результата",
"noValidNumbers": "Пожалуйста, введите номер телефона",
"outlookEmail": "Электронная почта Outlook",
"searchNumbers": "Добавить номера телефонов",
"searchPeople": "Поиск людей",
"searchPeopleAndNumbers": "Поиск людей или добавление их телефонов",
"phoneNumbers": "телефонные номера",
"searching": "Поиск...",
"shareInvite": "Поделиться приглашением на встречу",
"shareLink": "Поделиться ссылкой на встречу чтобы пригласить других",
"shareStream": "Поделиться ссылкой на прямую трансляцию",
"sipAddresses": "sip-адреса",
"telephone": "Номер: {{number}}",
"title": "Пригласить людей на эту встречу",
"yahooEmail": "Электронная почта Yahoo"
@@ -42,9 +39,28 @@
"audioOnly": {
"audioOnly": "Только звук"
},
"breakoutRooms": {
"actions": {
"add": "Добавить комнату отдыха",
"autoAssign": "Auto assign to breakout roomsAuto assign to breakout rooms",
"close": "Закрыть",
"join": "Присоединиться",
"leaveBreakoutRoom": "Покинуть комнату отдыха",
"more": "Больше",
"remove": "Удалить",
"sendToBreakoutRoom": "Отправить участника к:"
},
"defaultName": "Комната отдыха #{{index}}",
"mainRoom": "Главная комната",
"notifications": {
"joined": "Подключение к \"{{name}}\" комнате отдыха",
"joinedMainRoom": "Соединение с главной комнатой",
"joinedTitle": "Комнаты отдыха"
}
},
"calendarSync": {
"addMeetingURL": "Добавить ссылку конференции",
"confirmAddLink": "Вы хотите добавить ссылку Jitsi к этому календарному событию?",
"confirmAddLink": "Вы хотите добавить ссылку {{app}} к этому календарному событию?",
"error": {
"appConfiguration": "Неправильно настроена интеграция календаря.",
"generic": "Произошла ошибка. Проверьте настройки календаря или попробуйте обновить его.",
@@ -61,8 +77,13 @@
"today": "Сегодня"
},
"chat": {
"enter": "Войди в комнату",
"error": "Ошибка: Ваше сообщение не было отправлено. Причина: {{error}}",
"fieldPlaceHolder": "Введите здесь ваше сообщение",
"lobbyChatMessageTo": "Сообщение пользователю {{recipient}}",
"message": "Сообщение",
"messageAccessibleTitle": "{{user}} говорит:",
"messageAccessibleTitleMe": "я говорю:",
"messageTo": "Личное сообщение пользователю {{recipient}}",
"messagebox": "Введите сообщение",
"nickname": {
@@ -72,12 +93,18 @@
},
"noMessagesMessage": "В конференции пока нет никаких сообщений. Начните разговор!",
"privateNotice": "Личное сообщение пользователю {{recipient}}",
"smileysPanel": "Emoji панель",
"tabs": {
"chat": "Чат",
"polls": "Опросы"
},
"title": "Чат",
"titleWithPolls": "Чат",
"you": "вы"
},
"chromeExtensionBanner": {
"buttonText": "Установить расширение Chrome",
"close": "Закрыть",
"dontShowAgain": "Не показывай мне это снова",
"installExtensionText": "Установите расширение для интеграции с Google Календарь и Office 365"
},
@@ -97,8 +124,7 @@
"FETCH_SESSION_ID": "Получение идентификатора сеанса…",
"GET_SESSION_ID_ERROR": "Ошибка получения идентификатора сеанса: {{code}}",
"GOT_SESSION_ID": "Получение идентификатора сеанса… Готово",
"LOW_BANDWIDTH": "Видео для {{displayName}} приостановлено из-за низкой пропускной способности",
"RECONNECTING": "Проблема с сетью. Переподключение..."
"LOW_BANDWIDTH": "Видео для {{displayName}} приостановлено из-за низкой пропускной способности"
},
"connectionindicator": {
"address": "Адрес:",
@@ -111,12 +137,10 @@
"e2e_rtt": "E2E RTT:",
"framerate": "Частота кадров:",
"less": "Краткая информация",
"localaddress_0": "Локальный адрес:",
"localaddress_1": "Локальных адреса:",
"localaddress_2": "Локальных адресов:",
"localport_0": "Локальный порт:",
"localport_1": "Локальных порта:",
"localport_2": "Локальных портов:",
"localaddress": "Локальный адрес:",
"localaddress_plural": "Локальные адреса:",
"localport": "Локальный порт:",
"localport_plural": "Локальные порты:",
"maxEnabledResolution": "Максимальное разрешение",
"more": "Подробная информация",
"packetloss": "Потери пакетов:",
@@ -128,18 +152,15 @@
"nonoptimal": "не оптимально",
"poor": "плохо"
},
"remoteaddress_0": "Удаленный адрес:",
"remoteaddress_1": "Удаленных адреса:",
"remoteaddress_2": "Удаленных адресов:",
"remoteport_0": "Удаленный порт:",
"remoteport_1": "Удаленных порта:",
"remoteport_2": "Удаленных портов:",
"remoteaddress": "Удаленный адрес:",
"remoteaddress_plural": "Удаленные адреса:",
"remoteport": "Удаленный порт:",
"remoteport_plural": "Удаленные порты:",
"resolution": "Разрешение:",
"savelogs": "Сохранить логи",
"status": "Связь:",
"transport_0": "Метод отправки:",
"transport_1": "Метода отправки:",
"transport_2": "Методов отправки:",
"transport": "Транспорт:",
"transport_plural": "Транспорты:",
"video_ssrc": "Видео SSRC:"
},
"dateUtils": {
@@ -156,9 +177,9 @@
"ifHaveApp": "Если у Вас уже есть приложение:",
"joinInApp": "Присоединиться к этой встрече с помощью приложения",
"launchWebButton": "Запустить в браузере",
"openApp": "Перейти к приложению",
"title": "Запуск вашей встречи в {{app}}...",
"tryAgainButton": "Повторите в настольном приложении"
"tryAgainButton": "Повторите в настольном приложении",
"unsupportedBrowser": "Вы используете браузер, который мы не поддерживаем."
},
"defaultLink": "напр. {{url}}",
"defaultNickname": "напр. Яна Цветкова",
@@ -186,21 +207,25 @@
"Share": "Поделиться",
"Submit": "ОК",
"WaitForHostMsg": "Конференция еще не началась. Если вы организатор, пожалуйста, авторизируйтесь. В противном случае дождитесь организатора.",
"WaitingForHost": "Ждем организатора...",
"WaitingForHostTitle": "Ждем организатора...",
"Yes": "Да",
"accessibilityLabel": {
"liveStreaming": "Трансляция"
},
"add": "Добавить",
"addMeetingNote": "Добавить записку об этом митиге",
"addOptionalNote": "Добавить записку (необязательно):",
"allow": "Разрешить",
"alreadySharedVideoMsg": "Другой участник уже поделился ссылкой на видео. Данная конференция позволяет одновременно делиться только одним видео.",
"alreadySharedVideoTitle": "Допускается показ только одного видео",
"applicationWindow": "Окно приложения",
"authenticationRequired": "Требуется авторизация",
"cameraConstraintFailedError": "Камера не отвечает определенным требованиям.",
"cameraNotFoundError": "Камера не обнаружена.",
"cameraNotSendingData": "Ошибка доступа к камере. Пожалуйста, проверьте, не использует ли камеру какая-нибудь другая программа. Вы можете также выбрать другое устройство из меню настроек или попробовать перезапустить приложение.",
"cameraNotSendingDataTitle": "Нет доступа к камере",
"cameraPermissionDeniedError": "Нет доступа к камере. Вы можете участвовать во встрече, но другие не будут вас видеть. Используйте значок камеры в адресной строке браузера, чтобы устранить проблему.",
"cameraTimeoutError": "Не удалось запустить источник видео. Произошел тайм-аут!Не удалось запустить источник видео. Произошел тайм-аут!",
"cameraUnknownError": "Неизвестная ошибка использования камеры.",
"cameraUnsupportedResolutionError": "Ваша камера не поддерживает необходимое разрешение видео.",
"close": "Закрыть",
@@ -221,23 +246,19 @@
"displayNameRequired": "Привет! Как тебя зовут?",
"done": "Готово",
"e2eeDescription": "Сквозное шифрование в настоящее время является ЭКСПЕРИМЕНТАЛЬНЫМ. Имейте в виду, что включение сквозного шифрования эффективно отключит сервисы, предоставляемые на стороне сервера, такие как: запись, потоковое вещание и участие по телефону. Также имейте в виду, что собрание будет работать только для людей, присоединяющихся из браузеров с поддержкой вставляемых потоков.",
"e2eeDisabledDueToMaxModeDescription": "Невозможно включить сквозное шифрование из-за большого количества участников конференции.",
"e2eeLabel": "E2EE ключ",
"e2eeNoKey": "Отсутствует",
"e2eeSet": "Установить",
"e2eeToggleSet": "Установить ключ",
"e2eeWarning": "ПРЕДУПРЕЖДЕНИЕ. Похоже, что не все участники этой встречи поддерживают сквозное шифрование. Если вы включите его, они не смогут вас ни видеть, ни слышать.",
"e2eeWillDisableDueToMaxModeDescription": "ВНИМАНИЕ: Сквозное шифрование будет автоматически отключено, если к конференции присоединится больше участников.",
"embedMeeting": "Встроить встречу",
"enterDisplayName": "Пожалуйста, введите свое имя",
"error": "Ошибка",
"externalInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.",
"externalInstallationTitle": "Требуется расширение",
"goToStore": "Перейти к интернет-магазину",
"gracefulShutdown": "Технические работы. Пожалуйста, попробуйте позже.",
"grantModeratorDialog": "Вы уверены, что хотите сделать этого участника модератором?",
"grantModeratorTitle": "Сделать модератором",
"hideShareAudioHelper": "Больше не показывать это диалоговое окно",
"incorrectPassword": "Ошибка имени пользователя или пароля",
"incorrectRoomLockPassword": "Неверный пароль",
"inlineInstallExtension": "Установить",
"inlineInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.",
"internalError": "Что-то пошло не так. Ошибка: {{error}}",
"internalErrorTitle": "Внутренняя ошибка",
"kickMessage": "Вы можете связаться с {{participantDisplayName}} для получения более подробной информации.",
@@ -245,13 +266,16 @@
"kickParticipantDialog": "Вы уверены, что хотите отключить этого участника?",
"kickParticipantTitle": "Отключить этого участника?",
"kickTitle": "{{participantDisplayName}} отключил вас от конференции.",
"linkMeeting": "Связать встречу",
"linkMeetingTitle": "Связать встречу с Salesforce",
"liveStreaming": "Трансляция",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Невозможно пока активна запись",
"liveStreamingDisabledForGuestTooltip": "Гости не могут начать трансляцию",
"liveStreamingDisabledTooltip": "Возможность трансляции отключена",
"localUserControls": "Локальные пользовательские элементы управления",
"lockMessage": "Не удалось запереть конференцию",
"lockRoom": "Добавить конференцию $t(lockRoomPasswordUppercase)",
"lockTitle": "Блокировка не удалась",
"login": "Войти",
"logoutQuestion": "Уверены, что хотите выйти и остановить встречу?",
"logoutTitle": "Завершить сеанс",
"maxUsersLimitReached": "Достигнут лимит на максимальное количество участников. Конференция переполнена. Пожалуйста, свяжитесь с организатором конференции или повторите попытку позже!",
@@ -261,27 +285,46 @@
"micNotSendingData": "Перейдите в настройки компьютера, чтобы включить микрофон и настроить уровень чувствительности.",
"micNotSendingDataTitle": "Ваш микрофон отключен системными настройками",
"micPermissionDeniedError": "Нет доступа к микрофону. Вы можете участвовать во встрече, но другие не будут вас слышать. Используйте значок камеры в адресной строке браузера, чтобы устранить проблему.",
"micTimeoutError": "Не удалось запустить источник звука. Произошел тайм-аут!",
"micUnknownError": "Неизвестная ошибка использования микрофона.",
"moderationAudioLabel": "Разрешить участникам самостоятельно включать звук",
"moderationVideoLabel": "Разрешить участникам запускать свое видео",
"muteEveryoneDialog": "Вы уверены, что хотите отключить микрофоны у всех? Вы не сможете включить их, но они могут включить себя в любой момент.",
"muteEveryoneDialogModerationOn": "Участники могут отправить запрос на выступление в любое время.",
"muteEveryoneElseDialog": "После отключения микрофонов у участников вы не сможете включить их, но они могут включить себя в любой момент.",
"muteEveryoneElseTitle": "Заглушить всех, за исключением {{whom}}?",
"muteEveryoneElsesVideoDialog": "Как только камера будет отключена, вы не сможете снова включить ее, но они могут включить ее снова в любое время.",
"muteEveryoneElsesVideoTitle": "Остановить видео для всех, кроме {{кого}}?",
"muteEveryoneSelf": "себя",
"muteEveryoneStartMuted": "Теперь у всех микрофоны выключены",
"muteEveryoneTitle": "Заглушить всех?",
"muteEveryonesVideoDialog": "Участники могут включить свое видео в любое время.",
"muteEveryonesVideoDialogModerationOn": "Участники могут отправить запрос на включение своего видео в любое время.",
"muteEveryonesVideoDialogOk": "Отключить",
"muteEveryonesVideoTitle": "Остановить всеобщее видео?",
"muteParticipantBody": "Вы не можете включить им микрофон, но они могут сделать это сами в любое время.",
"muteParticipantButton": "Заглушить",
"muteParticipantDialog": "Вы уверены, что хотите отключить микрофон у данного пользователя? Вы не сможете отменить это действие, однако он сможет сам снова включить микрофон в любое время.",
"muteParticipantTitle": "Заглушить этого участника?",
"muteParticipantsVideoBody": "Вы не сможете снова включить камеру, но они могут включить ее снова в любое время.",
"muteParticipantsVideoBodyModerationOn": "Вы не сможете снова включить камеру, и они тоже.",
"muteParticipantsVideoButton": "Остановить видео",
"muteParticipantsVideoDialog": "Вы уверены, что хотите выключить камеру этого участника? Вы не сможете снова включить камеру, но они могут включить ее снова в любое время.",
"muteParticipantsVideoDialogModerationOn": "Вы уверены, что хотите выключить камеру этого участника? Вы не сможете снова включить камеру, и они тоже.",
"muteParticipantsVideoTitle": "Отключить камеру этого участника?",
"noDropboxToken": "Нет действительного токена Dropbox",
"password": "Пароль",
"passwordLabel": "Встреча была защищена участником. Пожалуйста, введите $t(lockRoomPasswordUppercase) чтобы присоединиться.",
"passwordNotSupported": "Установка $t(lockRoomPassword) для конференции не поддерживается.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) не поддерживается",
"passwordRequired": "Требуется $t(lockRoomPasswordUppercase)",
"permissionCameraRequiredError": "Для участия в конференциях с видео требуется разрешение камеры. Пожалуйста, предоставьте его в настройках",
"permissionErrorTitle": "Требуется разрешение",
"permissionMicRequiredError": "Для участия в конференциях со звуком требуется разрешение на использование микрофона. Пожалуйста, предоставьте его в настройках",
"popupError": "Ваш браузер блокирует всплывающие окна этого сайта. Пожалуйста, разрешите всплывающие окна в настройках безопасности браузера и попробуйте снова.",
"popupErrorTitle": "Заблокировано всплывающее окно",
"readMore": "больше",
"recentlyUsedObjects": "Ваши недавно использованные объекты",
"recording": "Запись",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Невозможно пока активно потоковое вещание",
"recordingDisabledForGuestTooltip": "Гости не могут записывать",
"recordingDisabledTooltip": "Невозможно начать запись",
"rejoinNow": "Подключиться снова",
"remoteControlAllowedMessage": "{{user}} принял ваш запрос на удаленное управление!",
@@ -291,6 +334,7 @@
"remoteControlShareScreenWarning": "Если нажмете \"Разрешить\", то поделитесь своим экраном!",
"remoteControlStopMessage": "Сессия удаленного управления завершена!",
"remoteControlTitle": "Удаленное управление рабочим столом",
"remoteUserControls": "Удаленное управление пользователями {{username}}",
"removePassword": "Убрать $t(lockRoomPassword)",
"removeSharedVideoMsg": "Уверены, что хотите убрать видео, которым поделились?",
"removeSharedVideoTitle": "Убрать видео",
@@ -300,22 +344,38 @@
"screenSharingAudio": "Поделиться аудио",
"screenSharingFailed": "Ой! Кажется что-то пошло не так, мы не можем начать показ экрана!",
"screenSharingFailedTitle": "Сбой показа экрана!",
"screenSharingFailedToInstall": "Ошибка установки расширения для показа экрана.",
"screenSharingFailedToInstallTitle": "Расширение для показа экрана не установлено",
"screenSharingFirefoxPermissionDeniedError": "Что-то пошло не так, когда мы пытались поделиться вашим экраном. Пожалуйста, убедитесь, что вы дали нам разрешение на это. ",
"screenSharingFirefoxPermissionDeniedTitle": "Ошибка показа экрана!",
"screenSharingPermissionDeniedError": "Ошибка доступа к вашему расширению для показа экрана. Пожалуйста, перезапустите браузер и попробуйте снова.",
"searchInSalesforce": "Искать в Salesforce",
"searchResults": "Результаты поиска({{count}})",
"searchResultsDetailsError": "Что-то пошло не так при получении данных владельца.",
"searchResultsError": "Что-то пошло не так при получении данных.",
"searchResultsNotFound": "Ничего не найдено.",
"searchResultsTryAgain": "Попробуйте использовать другие ключевые слова.",
"sendPrivateMessage": "Вы недавно получили личное сообщение. Вы хотели ответить на него, или отправить свое сообщение группе?",
"sendPrivateMessageCancel": "Отправить в общий чат",
"sendPrivateMessageOk": "Отправить приватное сообщение",
"sendPrivateMessageTitle": "Отправить личное сообщение?",
"serviceUnavailable": "Служба недоступна",
"sessTerminated": "Связь прервана",
"sessionRestarted": "Вызов перезапущен из-за проблемы с подключением.",
"shareAudio": "Продолжить",
"shareAudioTitle": "Как поделиться аудио",
"shareAudioWarningD1": "вам нужно остановить совместное использование экрана, прежде чем делиться своим аудио.",
"shareAudioWarningD2": "вам нужно перезапустить совместное использование экрана и установить флажок «поделиться аудио».",
"shareAudioWarningH1": "Если вы хотите поделиться только аудио:",
"shareAudioWarningTitle": "Вам нужно остановить совместное использование экрана, прежде чем делиться звуком",
"shareMediaWarningGenericH2": "Если вы хотите поделиться своим экраном и звуком",
"shareScreenWarningD1": "вам нужно остановить совместное использование звука, прежде чем делиться своим экраном.",
"shareScreenWarningD2": "вам нужно остановить совместное использование аудио, начать совместное использование экрана и установить флажок «поделиться аудио».",
"shareScreenWarningH1": "Если вы хотите поделиться только своим экраном:",
"shareScreenWarningTitle": "Вам нужно остановить совместное использование звука, прежде чем делиться своим экраном.",
"shareVideoLinkError": "Пожалуйста, укажите корректную ссылку.",
"shareVideoTitle": "Поделиться видео",
"shareYourScreen": "Показать экран",
"shareYourScreenDisabled": "Демонстрация экрана отключена",
"shareYourScreenDisabledForGuest": "Гости не могут демонстрировать экран",
"sharedVideoDialogError": "Ошибка: Невалидный URL",
"sharedVideoLinkPlaceholder": "Ссылка на YouTube или прямая ссылка на видео",
"start": "Начать",
"startLiveStreaming": "Начать трансляцию",
"startRecording": "Начать запись",
"startRemoteControlErrorMessage": "Ошибка начала сессии удаленного управления!",
@@ -330,7 +390,13 @@
"tokenAuthFailedTitle": "Ошибка аутентификации",
"transcribing": "Расшифровка",
"unlockRoom": "Убрать $t(lockRoomPassword)",
"user": "Пользователь",
"userIdentifier": "Идентификатор пользователя",
"userPassword": "пароль пользователя",
"videoLink": "Ссылка на видео",
"viewUpgradeOptions": "Посмотреть варианты обновления",
"viewUpgradeOptionsContent": "Чтобы получить неограниченный доступ к премиум-функциям, таким как запись, транскрипция, RTMP Streaming и т. д., вам необходимо обновить свой план.",
"viewUpgradeOptionsTitle": "Вы обнаружили премиальную функцию!",
"yourEntireScreen": "Весь экран"
},
"documentSharing": {
@@ -348,9 +414,14 @@
"detailsLabel": "Расскажите подробнее.",
"good": "Хорошо",
"rateExperience": "Оценка качества связи",
"star": "Звезда",
"veryBad": "Очень плохо",
"veryGood": "Очень хорошо"
},
"giphy": {
"noResults": "Результатов поиска не найдено :(",
"search": "Поиск GIPHY"
},
"helpView": {
"header": "Справка"
},
@@ -358,7 +429,7 @@
"answer": "Ответ",
"audioCallTitle": "Входящий звонок",
"decline": "Отклонить",
"productLabel": "из Jitsi Meet",
"productLabel": "из {{app}}",
"videoCallTitle": "Входящий видеозвонок"
},
"info": {
@@ -366,6 +437,7 @@
"addPassword": "Установить $t(lockRoomPassword)",
"cancelPassword": "Отменить $t(lockRoomPassword)",
"conferenceURL": "Ссылка:",
"copyNumber": "Копировать номер",
"country": "Страна",
"dialANumber": "Чтобы присоединиться к конференции, наберите один из этих номеров и введите пин-код",
"dialInConferenceID": "ПИН:",
@@ -377,6 +449,11 @@
"inviteLiveStream": "Трансляция этой встречи: {{url}}",
"invitePhone": "Для того, чтобы присоединиться по телефону, нажмите {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "Ищите другой номер для набора?\nПосмотреть номера для набора для конференции: {{url}}\n\n\nЕсли также выполняется набор номера через телефон в комнате, подключитесь в режиме слушателя: {{silentUrl}}",
"inviteSipEndpoint": "Чтобы присоединиться с помощью SIP-адреса, введите следующее: {{sipUri}}",
"inviteTextiOSInviteUrl": "Нажмите на следующую ссылку, чтобы присоединиться: {{inviteUrl}}.",
"inviteTextiOSJoinSilent": "Если вы звоните через телефон в комнате, используйте эту ссылку, чтобы присоединиться без подключения к аудио: {{silentUrl}}.",
"inviteTextiOSPersonal": "{{name}} приглашает вас на встречу.",
"inviteTextiOSPhone": "Чтобы присоединиться по телефону, используйте этот номер: {{number}},,{{conferenceID}}#. Если вы ищете другой номер, это полный список: {{didUrl}}.",
"inviteURLFirstPartGeneral": "Вас приглашают присоединиться к конференции.",
"inviteURLFirstPartPersonal": "{{name}} приглашает Вас присоединиться к конференции. \n",
"inviteURLSecondPart": "\nПрисоединиться к конференции:\n{{url}}\n",
@@ -388,6 +465,7 @@
"noRoom": "Для набора номера не было указано ни одной комнаты.",
"numbers": "Номера для набора",
"password": "$t(lockRoomPasswordUppercase):",
"sip": "SIP адрес",
"title": "Поделиться",
"tooltip": "Поделитесь ссылкой и номером для подключения к этой конференции"
},
@@ -405,10 +483,12 @@
"searchPlaceholder": "Участник или номер телефона",
"send": "Отправить"
},
"jitsiHome": "{{logo}} Логотип, ссылки на главную страницу",
"keyboardShortcuts": {
"focusLocal": "Фокус на ваше видео",
"focusRemote": "Фокус на видео другого участника",
"fullScreen": "Вкл/выкл полноэкранный режим",
"giphyMenu": "Показать GIPHY меню",
"keyboardShortcuts": "Комбинации клавиш",
"localRecording": "Отобразить или скрыть элементы управления локальной записи",
"mute": "Микрофон (вкл./выкл.)",
@@ -417,10 +497,10 @@
"showSpeakerStats": "Показать статистику выступающего",
"toggleChat": "Чат (открыть/закрыть)",
"toggleFilmstrip": "Показать/Скрыть краткое описание",
"toggleParticipantsPane": "Показать или скрыть панель участников",
"toggleScreensharing": "Переключиться между камерой и показом экрана",
"toggleShortcuts": "Скрыть/Показать клавиша быстрого доступа",
"videoMute": "Камера (вкл./выкл.)",
"videoQuality": "Качество связи"
"videoMute": "Камера (вкл./выкл.)"
},
"liveStreaming": {
"busy": "Освобождаем новые ресурсы для трансляции. Пожалуйста, попробуйте снова через несколько минут.",
@@ -438,6 +518,7 @@
"failedToStart": "Ошибка трансляции видео",
"getStreamKeyManually": "Прямые трансляций не найдены. Попробуйте получить ключ прямой трансляции от YouTube.",
"googlePrivacyPolicy": "Политика конфиденциальности Google",
"inProgress": "Идет запись или прямая трансляция",
"invalidStreamKey": "Похоже ключ прямой трансляции неверен.",
"limitNotificationDescriptionNative": "Ваша трансляция будет ограничена {{limit}} мин. Для неограниченного просмотра попробуйте {{app}}.",
"limitNotificationDescriptionWeb": "Из-за высокой нагрузки ваша потоковая передача будет ограничена {{limit}} мин. Для неограниченной потоковой передачи попробуйте <a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>.",
@@ -447,6 +528,7 @@
"onBy": "{{name}} начал прямую трансляцию",
"pending": "Начинаем трансляцию...",
"serviceName": "Служба трансляции",
"sessionAlreadyActive": "Этот сеанс уже записывается или транслируется в прямом эфире.",
"signIn": "Войти через Google",
"signInCTA": "Войдите или введите свой ключ трансляции YouTube.",
"signOut": "Выход",
@@ -457,7 +539,12 @@
"youtubeTerms": "Условия использования YouTube"
},
"lobby": {
"admit": "Признать",
"admitAll": "Признать все",
"allow": "Разрешить",
"backToKnockModeButton": "Попросить присоединиться",
"chat": "Чат",
"dialogTitle": "Режим лобби",
"disableDialogContent": "В настоящее время включен режим лобби. Эта функция гарантирует, что нежелательные участники не смогут присоединиться к вашей встрече. Вы хотите его отключить?",
"disableDialogSubmit": "Отключить",
"emailField": "Введите ваш адрес электронной почты",
@@ -466,8 +553,10 @@
"enableDialogText": "Режим лобби позволяет защитить вашу встречу, позволяя людям входить только после официального одобрения модератором.",
"enterPasswordButton": "Введите пароль встречи",
"enterPasswordTitle": "Введите пароль чтобы присоединиться к встрече",
"errorMissingPassword": "Пожалуйста, введите пароль встречи",
"invalidPassword": "Неверный пароль",
"joinRejectedMessage": "Ваш запрос на присоединение был отклонен модератором.",
"joinRejectedTitle": "Заявка на присоедиение отклонена.",
"joinTitle": "Присоединиться к встрече",
"joinWithPasswordMessage": "Пытаюсь присоединиться с паролем, подождите...",
"joiningMessage": "Вы присоединитесь к встрече, как только кто-то примет ваш запрос",
@@ -476,6 +565,8 @@
"knockButton": "Попросить присоединиться",
"knockTitle": "Кто-то хочет присоединиться к встрече",
"knockingParticipantList": "Список ожидающих участников",
"lobbyChatStartedNotification": "{{moderator}} начал лобби чат с {{attendee}}",
"lobbyChatStartedTitle": "{{moderator}} начал лобби чат с вами.",
"nameField": "Введите ваше имя",
"notificationLobbyAccessDenied": "{{originParticipantName}} запретил присоединиться {{targetParticipantName}}",
"notificationLobbyAccessGranted": "{{originParticipantName}} разрешил присоединиться {{targetParticipantName}} ",
@@ -521,26 +612,51 @@
"lockRoomPasswordUppercase": "Пароль",
"lonelyMeetingExperience": {
"button": "Пригласить",
"getHelp": "Получить помощь",
"title": "Защищенная, полнофункциональная и совершенно бесплатная система видеоконференций",
"youAreAlone": "Вы один в видеоконференции"
},
"me": "я",
"notify": {
"OldElectronAPPTitle": "Уязвимость в системе безопасности!",
"allowAction": "Разрешить",
"allowedUnmute": "Вы можете включить микрофон, включить камеру или поделиться своим экраном.",
"audioUnmuteBlockedDescription": "Операция включения микрофона была временно заблокирована из-за системных ограничений.",
"audioUnmuteBlockedTitle": "Включение микрофона заблокировано!",
"chatMessages": "Сообщения чата",
"connectedOneMember": "{{name}} присоединился к конференции",
"connectedThreePlusMembers": "{{name}} и {{count}} других пользователей присоединились к конференции",
"connectedTwoMembers": "{{first}} и {{second}} присоединились к конференции",
"disconnected": "соединение разорвано",
"displayNotifications": "Отображение уведомлений для",
"focus": "Фокус встречи",
"focusFail": "{{component}} недоступен, повторите через {{ms}} с",
"grantedTo": "{{to}} получил права модератора!",
"gifsMenu": "GIPHY",
"groupTitle": "Уведомления",
"hostAskedUnmute": "Модератор хочет, чтобы вы высказалисьМодератор хочет, чтобы вы высказались",
"invitedOneMember": "{{name}} был приглашен",
"invitedThreePlusMembers": "Приглашены {{name}} и {{count}} других пользователей(ля)",
"invitedTwoMembers": "{{first}} и {{second}} присоединились к конференции",
"kickParticipant": "{{kicker}} отключил {{kicked}}",
"leftOneMember": "{{name}} покинул собрание",
"leftThreePlusMembers": "{{name}} и многие другие покинули встречу",
"leftTwoMembers": "{{first}} и {{second}} покинули встречу",
"linkToSalesforce": "Ссылка на Salesforce",
"linkToSalesforceDescription": "Вы можете отправить ссылку на сводку митинга Salesforce объекту.",
"linkToSalesforceError": "Ошибка отправки ссылки на митинг для Salesforce",
"linkToSalesforceKey": "Отправить сслку а эот митинг",
"linkToSalesforceProgress": "Отправка ссылки на митинг для Salesforce...",
"linkToSalesforceSuccess": "Ссылка на этот митинг была отправлена Salesforce",
"me": "Я",
"moderationInEffectCSDescription": "Пожалуйста, поднимите руку, если вы хотите поделиться своим экраном.",
"moderationInEffectCSTitle": "Демонстрация экрана заблокирована модератором",
"moderationInEffectDescription": "Пожалуйста, поднимите руку, если хотите высказаться.",
"moderationInEffectTitle": "Ваш микрофон отключен модератором",
"moderationInEffectVideoDescription": "Пожалуйста, поднимите руку, если хотите включить камеру.",
"moderationInEffectVideoTitle": "Ваша камера заблокирована модератором",
"moderationRequestFromModerator": "Хозяин хочет, чтобы вы включили звук",
"moderationRequestFromParticipant": "Хочет говорить",
"moderationStartedTitle": "Началась модерация",
"moderationStoppedTitle": "Модерация остановлена",
"moderationToggleDescription": "от {{participantDisplayName}}",
"moderator": "Получены права модератора!",
"muted": "Вы начали разговор без звука.",
"mutedRemotelyDescription": "Вы всегда можете включить микрофон, когда будете готовы говорить. Отключите его, когда закончите, чтобы не транслировать шумы в конференцию.",
@@ -549,18 +665,33 @@
"newDeviceAction": "Использовать",
"newDeviceAudioTitle": "Обнаружено новое аудиоустройство",
"newDeviceCameraTitle": "Обнаружена новая камера",
"oldElectronClientDescription1": "Похоже, вы используете старую версию клиента Jitsi Meet, которая имеет известные уязвимости в системе безопасности. Убедитесь, что вы обновили до нашей ",
"oldElectronClientDescription1": "Похоже, вы используете старую версию клиента {{app}}, которая имеет известные уязвимости в системе безопасности. Убедитесь, что вы обновили до нашей ",
"oldElectronClientDescription2": "последней версии",
"oldElectronClientDescription3": " сейчас!",
"participantWantsToJoin": "Хочет присоединиться к митингу",
"participantsWantToJoin": "Хотят присоединиться к митингу",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) удален другим участником.",
"passwordSetRemotely": "Другой участник установил $t(lockRoomPasswordUppercase)",
"raiseHandAction": "Поднять руку",
"raisedHand": "{{name}} хотел бы выступить.",
"raisedHands": "{{Имя участника}} и еще {{подняли руки}} человек",
"reactionSounds": "Отключить звуки",
"reactionSoundsForAll": "Отключить звуки для всех",
"screenShareNoAudio": "Флажок «Поделиться аудио» не был отмечен на экране выбора окна.",
"screenShareNoAudioTitle": "Не удалось поделиться системным звуком!",
"selfViewTitle": "Вы всегда можете скрыть собственное изображение в настройках.",
"somebody": "Кто-то",
"startSilentDescription": "Перезайдите в конференцию, чтобы включить звук",
"startSilentTitle": "У вас отсутствует звук!",
"suboptimalBrowserWarning": "К сожалению, ваш браузер не полностью поддерживает данную систему вэбконференций. Мы работаем над проблемой, однако, пока рекомендуем вам воспользоваться <a href='{{recommendedBrowserPageLink}}' target='_blank'> следующими браузерами</a>.",
"suboptimalExperienceTitle": "Предупреждение браузера",
"unmute": "Включить микрофон"
"unmute": "Включить микрофон",
"videoMutedRemotelyDescription": "Вы всегда можете включить его снова.",
"videoMutedRemotelyTitle": "Ваше видео было отключено {{participantDisplayName}}",
"videoUnmuteBlockedDescription": "Включение звука камеры и совместное использование рабочего стола временно заблокированы из-за системных ограничений.",
"videoUnmuteBlockedTitle": "Включение камеры и общий доступ к рабочему столу заблокированы!",
"viewLobby": "Смотреть лобби",
"waitingParticipants": "{{waitingParticipants}} люди"
},
"participantsPane": {
"actions": {
@@ -570,6 +701,9 @@
"audioModeration": "Разрешить выключить микрофон",
"blockEveryoneMicCamera": "Заблокировать у всех микрофон и камеру",
"invite": "Пригласить",
"moreModerationActions": "Дополнительные параметры модерации",
"moreModerationControls": "Дополнительные элементы управления модерацией",
"moreParticipantOptions": "Дополнительные параметры участников",
"mute": "Выключить звук",
"muteAll": "Выключить звук у всех",
"muteEveryoneElse": "Выключить микрофон у остальных",
@@ -584,13 +718,45 @@
"lobby": "Лобби ({{count}})",
"participantsList": "Список участников ({{count}})",
"waitingLobby": "Ожидают в лобби ({{count}})"
}
},
"search": "Поиск участников"
},
"passwordDigitsOnly": "До {{number}} цифр",
"passwordSetRemotely": "установлен другим участником",
"pinnedParticipant": "Участник запинен",
"polls": {
"answer": {
"skip": "Пропустить",
"submit": "Подтвердить"
},
"by": "По {{ name }}",
"create": {
"addOption": "Добавить вариант",
"answerPlaceholder": "Вариант {{index}}",
"cancel": "Отмена",
"create": "Создать опрос",
"pollOption": "Вариант опроса {{index}}",
"pollQuestion": "Вопрос опроса",
"questionPlaceholder": "Задайте вопрос",
"removeOption": "Удалить вариант",
"send": "Отправлять"
},
"notification": {
"description": "Откройте вкладку опросов, чтобы проголосовать",
"title": "К этой встрече добавлен новый опрос"
},
"results": {
"changeVote": "Изменить голос",
"empty": "На собрании еще нет опросов. Начать опрос здесь!",
"hideDetailedResults": "Скрыть детали",
"showDetailedResults": "Показать детали",
"vote": "Голосование"
}
},
"poweredby": "работает на",
"prejoin": {
"audioAndVideoError": "Ошибка звука и видео:",
"audioDeviceProblem": "Проблема с вашим аудиоустройством",
"audioOnlyError": "Ошибка звука:",
"audioTrackError": "Не удалось создать аудио дорожку.",
"callMe": "Позвоните мне",
@@ -598,6 +764,25 @@
"calling": "Вызываем",
"configuringDevices": "Настраиваются устройства...",
"connectedWithAudioQ": "Вы подключили звук?",
"connection": {
"good": "Ваше интернет-соединение выглядит хорошо!",
"nonOptimal": "Ваше интернет-соединение не оптимально",
"poor": "У вас плохое интернет-соединение"
},
"connectionDetails": {
"audioClipping": "Мы ожидаем, что ваш звук будет обрезан.",
"audioHighQuality": "Мы ожидаем, что ваш звук будет отличного качества.",
"audioLowNoVideo": "Мы ожидаем, что у вас будет низкое качество звука и отсутствие видео.",
"goodQuality": "Потрясающий! Качество вашего мультимедиа будет отличным.",
"noMediaConnectivity": "Мы не смогли найти способ установить медиа-соединение для этого теста. Обычно это вызвано брандмауэром или NAT.",
"noVideo": "Мы ожидаем, что ваше видео будет ужасным.",
"undetectable": "Если вы все еще не можете совершать звонки в браузере, мы рекомендуем вам убедиться, что ваши динамики, микрофон и камера правильно настроены, что вы предоставили своему браузеру права на использование микрофона и камеры и что версия вашего браузера является актуальной. Если у вас все еще возникают проблемы с вызовом, вам следует обратиться к разработчику веб-приложения.",
"veryPoorConnection": "Мы ожидаем, что качество вашего звонка будет действительно ужасным.",
"videoFreezing": "Мы ожидаем, что ваше видео зависнет, станет черным и пиксельным.",
"videoHighQuality": "Мы ожидаем, что ваше видео будет хорошего качества.",
"videoLowQuality": "Мы ожидаем, что ваше видео будет иметь низкое качество с точки зрения частоты кадров и разрешения.",
"videoTearing": "Мы ожидаем, что ваше видео будет пиксельным или содержать визуальные артефакты."
},
"copyAndShare": "Скопировать и поделиться ссылкой на встречу",
"dialInMeeting": "Дозвониться до встречи",
"dialInPin": "Дозвониться до встречи и ввести ПИН код:",
@@ -607,6 +792,8 @@
"errorDialOutDisconnected": "Не удалось дозвониться. Отключено",
"errorDialOutFailed": "Не удалось дозвониться. Сбой вызова",
"errorDialOutStatus": "Ошибка получения статуса вызова",
"errorMissingName": "Пожалуйста, введите свое имя, чтобы присоединиться к встрече",
"errorNoPermissions": "Вам необходимо включить доступ к микрофону и камере",
"errorStatusCode": "Ошибка вызова, код статуса: {{status}}",
"errorValidation": "Проверка номера не удалась",
"iWantToDialIn": "Я хочу дозвониться",
@@ -614,6 +801,7 @@
"joinAudioByPhone": "Подключиться с телефонной связью",
"joinMeeting": "Присоединиться ко встрече",
"joinWithoutAudio": "Присоединиться без звука",
"keyboardShortcuts": "Включить сочетания клавиш",
"linkCopied": "Ссылка скопирована в буфер обмена",
"lookGood": "Кажется ваш микрофон работает правильно",
"or": "или",
@@ -639,27 +827,53 @@
"rejected": "Отклонен",
"ringing": "Звоню. . ."
},
"privacyView": {
"header": "Конфиденциальность"
},
"profile": {
"avatar": "аватар",
"setDisplayNameLabel": "Отображаемое имя",
"setEmailInput": "Введите email",
"setEmailLabel": "Email для Gravatar",
"title": "Профиль"
},
"raisedHand": "Хочет говорить",
"raisedHandsLabel": "Количество поднятых рук",
"record": {
"already": {
"linked": "Ссылка на митинг уже оправлена Salesforce объекту."
},
"type": {
"account": "Аккаунт",
"contact": "Сонтакт",
"lead": "Вести",
"opportunity": "Возможность",
"owner": "Владелец"
}
},
"recording": {
"authDropboxText": "Загрузить в Dropbox",
"availableSpace": "Доступно места: {{spaceLeft}} MB (примерно {{duration}} минут записи)",
"beta": "БЕТА",
"busy": "Мы стараемся обеспечить больше ресурсов для записи. Пожалуйста, попробуйте через несколько минут.",
"busyTitle": "Все записывающие устройства заняты",
"copyLink": "Копировать ссылку",
"error": "Ошибка записи. Пожалуйста, попробуйте позже.",
"errorFetchingLink": "Ошибка получения ссылки на запись.",
"expandedOff": "Запись остановлена",
"expandedOn": "Данная конференция записывается.",
"expandedPending": "Начинаем запись конференции...",
"failedToStart": "Ошибка начала записи",
"fileSharingdescription": "Поделиться записью с участниками конференции",
"highlight": "Основное",
"highlightMoment": "Основной момент",
"highlightMomentDisabled": "Вы можее обозначить важные моменты когда начнётся запись",
"highlightMomentSuccess": "Моменты выделены",
"highlightMomentSucessDescription": "Ваши выделенные моменты будут добавлены в итоги митинга.",
"inProgress": "Идет запись или прямая трансляция",
"limitNotificationDescriptionNative": "Из-за высокой нагрузки ваша запись будет ограничена {{limit}} мин. Для неограниченного количества записей попробуйте <3> {{app}} </3>.",
"limitNotificationDescriptionWeb": "Из-за высокой нагрузки ваша запись будет ограничена {{limit}} мин. Для неограниченного количества записей попробуйте <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"linkGenerated": "Мы создали ссылку на вашу запись.",
"live": "В ЭФИРЕ",
"loggedIn": "Вошел как {{userName}}",
"off": "Запись остановлена",
@@ -669,11 +883,15 @@
"pending": "Подготовка записи конференции. . .",
"rec": "ИДЕТ ЗАПИСЬ",
"serviceDescription": "Ваша запись будет сохранена соответствующей службой",
"serviceDescriptionCloud": "Облачная запись",
"serviceDescriptionCloudInfo": "Сохранённые записи автоматически удаляются спуся 24 часа со старта.",
"serviceName": "Служба записи",
"sessionAlreadyActive": "Этот сеанс уже записывается или транслируется в прямом эфире.",
"signIn": "Вход",
"signOut": "Выход",
"unavailable": "Служба {{serviceName}} сейчас недоступна. Мы работаем над исправлением этой ошибки. Пожалуйста, попробуйте позже.",
"unavailableTitle": "Запись невозможна"
"unavailableTitle": "Запись невозможна",
"uploadToCloud": "Загрузить в облако"
},
"sectionList": {
"pullToRefresh": "Потяните для обновления"
@@ -681,8 +899,8 @@
"security": {
"about": "Вы можете добавить к собранию $t(lockRoomPassword). Участникам необходимо будет предоставить $t(lockRoomPassword), прежде чем им будет разрешено присоединиться к собранию.",
"aboutReadOnly": "Участники-модераторы могут добавить к собранию $t(lockRoomPassword). Участникам необходимо будет предоставить $t(lockRoomPassword), прежде чем им будет разрешено присоединиться к собранию.",
"insecureRoomNameWarning": "Имя комнаты небезопасно. Нежелательные участники могут присоединиться к вашей конференции. Подумайте о том, чтобы защитить вашу встречу используя настройки безопасности.",
"securityOptions": "Настройки безопасности"
"header": "",
"insecureRoomNameWarning": "Имя комнаты небезопасно. Нежелательные участники могут присоединиться к вашей конференции. Подумайте о том, чтобы защитить вашу встречу используя настройки безопасности."
},
"settings": {
"calendar": {
@@ -692,8 +910,13 @@
"signedIn": "Доступ к событиям календаря включен для email - адреса {{email}}. Нажмите кнопку Отключить для отключения доступа к событиям календаря.",
"title": "Календарь"
},
"desktopShareFramerate": "Частота кадров при совместном использовании рабочего стола",
"desktopShareHighFpsWarning": "Более высокая частота кадров для общего доступа к рабочему столу может повлиять на пропускную способность. Вам необходимо перезапустить демонстрацию экрана, чтобы новые настройки вступили в силу.",
"desktopShareWarning": "Вам необходимо перезапустить демонстрацию экрана, чтобы новые настройки вступили в силу.",
"devices": "Устройства",
"followMe": "Все следуют за мной",
"framesPerSecond": "кадров в секунду",
"incomingMessage": "Входящее сообщение",
"language": "Язык",
"loggedIn": "Вошел как {{name}}",
"microphones": "Микрофоны",
@@ -701,16 +924,26 @@
"more": "Больше опций",
"name": "Имя",
"noDevice": "нет",
"participantJoined": "Участник присоединился",
"participantLeft": "Участник вышел",
"playSounds": "Включить звук",
"reactions": "Реакции на встречи",
"sameAsSystem": "То же, что и система ({{label}})",
"selectAudioOutput": "Звуковой выход",
"selectCamera": "Камера",
"selectMic": "Микрофон",
"selfView": "Самостоятельный просмотр",
"sounds": "Звуки",
"speakers": "Динамики",
"startAudioMuted": "Все начинают с выключенным звуком",
"startReactionsMuted": "Отключение звука реакции для всех",
"startVideoMuted": "Все начинают в скрытом режиме",
"talkWhileMuted": "Говорите без звука",
"title": "Настройки"
},
"settingsView": {
"advanced": "Дополнительные",
"alertCancel": "Отмена",
"alertOk": "OK",
"alertTitle": "Внимание",
"alertURLText": "Ошибка адреса сервера",
@@ -736,14 +969,24 @@
},
"speaker": "Спикер",
"speakerStats": {
"angry": "Злой",
"disgusted": "Отвращение",
"displayEmotions": "Показать эмоции",
"fearful": "Страшный",
"happy": "Счастье",
"hours": "{{count}}ч",
"minutes": "{{count}}м",
"name": "Имя",
"neutral": "Нейтральный",
"sad": "Грусный",
"search": "Поиск",
"seconds": "{{count}}с",
"speakerStats": "Статистика выступлений",
"speakerTime": "Время выступлений"
"speakerTime": "Время выступлений",
"surprised": "Удивлен"
},
"startupoverlay": {
"genericTitle": "На совещании необходимо использовать микрофон и камеру.",
"policyText": " ",
"title": "{{app}} требуется доступ к микрофону и камере."
},
@@ -752,26 +995,37 @@
"text": "Для восстановления связи нажмите кнопку <i>Подключиться снова</i>.",
"title": "Видеосвязь прервана. Причина: этот компьютер перешел в режим сна."
},
"termsView": {
"header": "Условия"
},
"toolbar": {
"Settings": "Настройки",
"accessibilityLabel": {
"Settings": "Вкл/Выкл меню настроек",
"audioOnly": "Вкл/Выкл только звук",
"audioRoute": "Выбрать аудиоустройство",
"boo": "Бу",
"breakoutRoom": "Присоединиться/выйти из комнаты обсуждения",
"callQuality": "Качество связи",
"cc": "Вкл/Выкл субтитры",
"chat": "Показать/скрыть окно чата",
"clap": "Хлопок",
"collapse": "Крах",
"document": "Закрыть общий документ",
"download": "Скачать приложение",
"e2ee": "Сквозное шифрование",
"embedMeeting": "Встроить встречу",
"expand": "Расширять",
"feedback": "Оставить отзыв",
"fullScreen": "Полноэкранный/оконный режим",
"giphy": "Показать GIPHY меню",
"grantModerator": "Сделать модератором",
"hangup": "Завершить звонок",
"help": "Справка",
"invite": "Пригласить",
"kick": "Отключить участника",
"laugh": "Смех",
"like": "Пальцы вверх",
"linkToSalesforce": "Ссылка на Salesforce",
"lobbyButton": "Вкл/Выкл режим лобби",
"localRecording": "Вкл/Выкл кнопки записи",
"lockRoom": "Установить пароль",
@@ -780,20 +1034,30 @@
"moreOptions": "Меню доп. настроек",
"mute": "Вкл/Выкл звук",
"muteEveryone": "Выкл. микрофон у всех",
"muteEveryoneElse": "Заглушить всех остальных",
"muteEveryoneElsesVideoStream": "Остановить чужое видео",
"muteEveryonesVideoStream": "Остановить видео для всех",
"participants": "Участники",
"pip": "Вкл/Выкл режим Картинка-в-картинке",
"privateMessage": "Отправить личное сообщение",
"profile": "Редактировать профиль",
"raiseHand": "Поднять руку",
"reactionsMenu": "Открыть/закрыть меню реакций",
"recording": "Вкл/Выкл запись",
"remoteMute": "Отключить участнику микрофон",
"remoteVideoMute": "Отключить камеру участника",
"security": "Настройки безопасности",
"selectBackground": "Выберите фон",
"selfView": "Самостоятельный просмотр",
"shareRoom": "Отправить приглашение",
"shareYourScreen": "Вкл/Выкл демонстрацию экрана",
"shareaudio": "Поделиться аудио",
"sharedvideo": "Вкл/Выкл Youtube - трансляцию",
"shortcuts": "Вкл/Выкл значки",
"show": "Показать крупным планом",
"silence": "Тишина",
"speakerStats": "Вкл/Выкл статистику",
"surprised": "Удивлен",
"tileView": "Вкл/Выкл плитку",
"toggleCamera": "Переключить камеру",
"toggleFilmstrip": "Включить диафильм",
@@ -812,6 +1076,7 @@
"clap": "Аплодисменты",
"closeChat": "Закрыть чат",
"closeReactionsMenu": "Закрыть меню реакций",
"disableReactionSounds": "",
"documentClose": "Закрыть общий документ",
"documentOpen": "Открыть общий документ",
"download": "Скачать приложение",
@@ -822,11 +1087,15 @@
"exitFullScreen": "Полный экран",
"exitTileView": "Крупный план",
"feedback": "Оставить отзыв",
"giphy": "Показать GIPHY меню",
"hangup": "Выход",
"help": "Справка",
"invite": "Пригласить",
"joinBreakoutRoom": "Присоединяйтесь к комнате обсуждения",
"laugh": "Смеяться",
"leaveBreakoutRoom": "Выйти из комнаты отдыха",
"like": "Мне нравится",
"linkToSalesforce": "Ссылка на Salesforce",
"lobbyButtonDisable": "Отключить режим лобби",
"lobbyButtonEnable": "Включить режим лобби",
"login": "Войти",
@@ -852,6 +1121,12 @@
"profile": "Редактировать профиль",
"raiseHand": "Хочу говорить",
"raiseYourHand": "Поднять руку",
"reactionBoo": "Отправить бу реакцию",
"reactionClap": "Отправить реакцию аплодисментов",
"reactionLaugh": "Отправить реакцию смеха",
"reactionLike": "Отправить реакцию \"палец вверх\"",
"reactionSilence": "Отправить реакцию тишины",
"reactionSurprised": "Отправить удивленную реакцию",
"security": "Настройки безопасности",
"selectBackground": "Выбрать фоновое изображение",
"shareRoom": "Отправить приглашение",
@@ -862,11 +1137,10 @@
"speakerStats": "Статистика",
"startScreenSharing": "Начать трансляцию с экрана",
"startSubtitles": "Включить субтитры",
"startvideoblur": "Размыть фон на видео",
"stopAudioSharing": "Остановить обмен аудио",
"stopScreenSharing": "Остановить трансляцию с экрана",
"stopSharedVideo": "Остановить видео на YouTube",
"stopSubtitles": "Отключить субтитры",
"stopvideoblur": "Отключить размытие фона",
"surprised": "Удивиться",
"talkWhileMutedPopup": "Пытаетесь говорить? У вас отключен звук.",
"tileViewToggle": "Вкл/выкл плитку",
@@ -883,7 +1157,8 @@
"off": "Расшифровка остановлена",
"pending": "Подготовка расшифровки конференции...",
"start": "Вкл/Выкл показ субтитров",
"stop": "Вкл/Выкл показ субтитров"
"stop": "Вкл/Выкл показ субтитров",
"tr": "TR"
},
"userMedia": {
"androidGrantPermissions": "Выберите <b><i>Разрешить</i></b>, когда браузер спросит о разрешениях.",
@@ -908,19 +1183,21 @@
"pending": "{{displayName}} был приглашен"
},
"videoStatus": {
"adjustFor": "Отрегулируйте для:",
"audioOnly": "Только звук",
"audioOnlyExpanded": "Активен режим экономии пропускной способности. В этом режиме доступны только звук и трансляция с экрана",
"bestPerformance": "Лучшее представление",
"callQuality": "Качество видео",
"hd": "HD",
"hdTooltip": "Видео высокого качества",
"highDefinition": "Высокое качество",
"highestQuality": "Высшее качество",
"labelTooiltipNoVideo": "Нет видео",
"labelTooltipAudioOnly": "Включен режим экономии пропускной способности",
"ld": "LD",
"ldTooltip": "Видео низкого качества",
"lowDefinition": "Низкое качество",
"onlyAudioAvailable": "Только звук",
"onlyAudioSupported": "В этом браузере разрешен только звук.",
"performanceSettings": "Параметры производительности",
"sd": "SD",
"sdTooltip": "Видео стандартного качества",
"standardDefinition": "Стандартное качество (SD)"
@@ -933,20 +1210,51 @@
"domuteVideoOfOthers": "Выключить видео остальным",
"flip": "Отразить",
"grantModerator": "Сделать модератором",
"hideSelfView": "Скрыть собственное представление",
"kick": "Отключить",
"moderator": "Модератор",
"mute": "Без звука",
"muted": "Звук выключен",
"pinToStage": "Прикрепить к сцене",
"remoteControl": "Начать / Остановить дистанционный контроль",
"screenSharing": "Участник показывает свой экран",
"show": "Показать крупным планом",
"showSelfView": "Показать своё представление",
"unpinFromStage": "Отпинить",
"videoMuted": "Камера выключена",
"videomute": "Участник выключил камеру"
},
"virtualBackground": {
"addBackground": "Добавить фон",
"apply": "Применять",
"backgroundEffectError": "Не удалось применить фоновый эффект.",
"blur": "Размытие",
"deleteImage": "Удалить изображение",
"desktopShare": "Общий доступ к рабочему столу",
"desktopShareError": "Не удалось создать общий доступ к рабочему столу",
"image1": "пляж",
"image2": "Белая нейтральная стена",
"image3": "Белая пустая комната",
"image4": "Черный торшер",
"image5": "Гора",
"image6": "Лес",
"image7": "Восход",
"none": "Нет",
"pleaseWait": "Пожалуйста подождите...",
"removeBackground": "Убрать фон",
"slightBlur": "Легкое размытие",
"title": "Виртуальные фоны",
"uploadedImage": "Загруженное изображение {{index}}",
"webAssemblyWarning": "WebAssembly не поддерживается",
"webAssemblyWarningDescription": "WebAssembly отключен или не поддерживается этим браузером"
},
"volumeSlider": "Ползунок громкости",
"welcomepage": {
"accessibilityLabel": {
"join": "Нажмите чтобы присоединиться",
"roomname": "Укажите название комнаты"
},
"addMeetingName": "Добавить название встречи",
"appDescription": "Попробуйте видеочат со всей командой. Приглашайте знакомых! {{app}} — полностью зашифрованное решение для видеоконференций с открытым исходным кодом. Пользуйтесь каждый день, бесплатно и без регистрации.",
"audioVideoSwitch": {
"audio": "Звук",
@@ -960,9 +1268,21 @@
"go": "ОК",
"goSmall": "ОК",
"headerSubtitle": "Защищенная высококачественная видеосвязь",
"headerTitle": "Сервер видеоконференцсвязи Jitsi Meet",
"headerTitle": "Сервер видеоконференцсвязи {{app}}",
"info": "Инфо",
"jitsiOnMobile": "{{app}} для мобильных устройств — загрузите наши приложения и начните встречу из любого места",
"join": "СОЗДАТЬ / ПРИСОЕДИНИТЬСЯ",
"logo": {
"calendar": "Calendar логотип",
"desktopPreviewThumbnail": "Миниатюра предварительного просмотра на рабочем столе",
"googleLogo": "Google логотип",
"logoDeepLinking": "Логотип Navek",
"microsoftLogo": "Логотип Майкрософт",
"policyLogo": "Логотип политики"
},
"mobileDownLoadLinkAndroid": "Скачать мобильное приложение для Android",
"mobileDownLoadLinkFDroid": "Скачать мобильное приложение для F-Droid",
"mobileDownLoadLinkIos": "Скачать мобильное приложение для iOS",
"moderatedMessage": "Или заранее <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">зарезервируйте URL-адрес встречи</a>, где вы будете единственным модератором.",
"privacy": "Приватность",
"recentList": "Недавние",

View File

@@ -602,10 +602,12 @@
"OldElectronAPPTitle": "Güvenlik açığı!",
"allowAction": "İzin ver",
"allowedUnmute": "Mikrofonunuzu sessizden çıkarabilir, kameranızı başlatabilir veya ekranınızı paylaşabilirsiniz.",
"chatMessages": "Sohbet mesajları",
"connectedOneMember": "{{name}} toplantıya katıldı",
"connectedThreePlusMembers": "{{name}} ve {{count}} kişi daha toplantıya katıldı",
"connectedTwoMembers": "{{first}} ve {{second}} toplantıya katıldı",
"disconnected": "bağlantı kesildi",
"displayNotifications": "Bildirimleri görüntüle",
"focus": "Toplantı odağı",
"focusFail": "{{component}} uygun değil - {{ms}} saniye içinde tekrar deneyin",
"grantedTo": "{{to}} kişisine yönetici hakları verildi!",
@@ -662,6 +664,9 @@
"audioModeration": "Seslerini aç",
"blockEveryoneMicCamera": "Herkesin mikrofonunu ve kamerasını blokla",
"invite": "Birini davet et",
"moreModerationActions": "Daha fazla denetleme seçeneği",
"moreModerationControls": "Daha fazla denetleme kontrolü",
"moreParticipantOptions": "Daha fazla katılımcı seçeneği",
"mute": "Sustur",
"muteAll": "Herkesi sustur",
"muteEveryoneElse": "Diğer herkesi sessize al",
@@ -676,7 +681,8 @@
"lobby": "Lobi ({{count}})",
"participantsList": "Toplantı Katılımcıları ({{count}})",
"waitingLobby": "Lobide bekleyen ({{count}})"
}
},
"search": "Katılımcıları ara"
},
"passwordDigitsOnly": "{{number}} rakama kadar",
"passwordSetRemotely": "başka katılımcı tarafından ayarlandı",
@@ -850,6 +856,7 @@
"incomingMessage": "Gelen mesaj",
"language": "Dil",
"loggedIn": "{{name}} olarak giriş yapıldı",
"maxStageParticipants": "Ana ekrana sabitlenecek maksimum katılımcı sayısı",
"microphones": "Mikrofonlar",
"moderator": "Yönetici",
"more": "Daha fazla",
@@ -1109,6 +1116,7 @@
"lowDefinition": "Düşük çözünürlük",
"onlyAudioAvailable": "Yalnızca ses kullanılabilir",
"onlyAudioSupported": "Bu tarayıcıda yalnızca sesi destekliyoruz.",
"performanceSettings": "Performans ayarları",
"sd": "SD",
"sdTooltip": "Standart çözünürlüklü video görüntüleme",
"standardDefinition": "Standart çözünürlük"

View File

@@ -31,6 +31,7 @@
},
"audioDevices": {
"bluetooth": "藍牙",
"car": "汽車音響",
"headphones": "耳機",
"none": "沒有可用的音效裝置",
"phone": "電話",
@@ -39,9 +40,6 @@
"audioOnly": {
"audioOnly": "低頻寬"
},
"blankPage": {
"meetingEnded": "會議已結束。"
},
"breakoutRooms": {
"actions": {
"add": "新增討論室",
@@ -83,6 +81,7 @@
"enter": "加入聊天室",
"error": "錯誤:您的訊息未被傳送。原因:{{error}}",
"fieldPlaceHolder": "在此輸入您的訊息",
"lobbyChatMessageTo": "Lobby chat message to {{recipient}}",
"message": "訊息",
"messageAccessibleTitle": "{{user}} 說:",
"messageAccessibleTitleMe": "您說:",
@@ -130,11 +129,11 @@
},
"connectionindicator": {
"address": "位址:",
"audio_ssrc": "Audio SSRC",
"audio_ssrc": "音訊 SSRC",
"bandwidth": "估計頻寬:",
"bitrate": "位元率:",
"bridgeCount": "伺服器數量:",
"codecs": "Codecs (A/V)",
"codecs": "編碼 (A/V)",
"connectedTo": "已連接至:",
"e2e_rtt": "E2E RTT",
"framerate": "影格率:",
@@ -163,7 +162,7 @@
"status": "連接:",
"transport": "傳輸:",
"transport_plural": "傳輸:",
"video_ssrc": "Video SSRC"
"video_ssrc": "視訊 SSRC"
},
"dateUtils": {
"earlier": "稍早",
@@ -180,7 +179,8 @@
"joinInApp": "使用 App 加入會議",
"launchWebButton": "在瀏覽器開啟",
"title": "正在 {{app}} 發起您的會議...",
"tryAgainButton": "在桌面上再試一次"
"tryAgainButton": "在桌面上再試一次",
"unsupportedBrowser": "您似乎正在使用我們不支援的瀏覽器。"
},
"defaultLink": "例如 {{url}}",
"defaultNickname": "例如 春嬌 志明",
@@ -207,15 +207,17 @@
"Remove": "移除",
"Share": "分享",
"Submit": "提交",
"WaitForHostMsg": "此會議 尚未啟動。如果您是會議主人,請進行認證;否則,請等待會議主人到達。",
"WaitForHostMsg": "此會議尚未開始。如果您是主人,請進行認證;否則,請等待主人到達。",
"WaitingForHost": "等侯主辦人...",
"Yes": "是的",
"accessibilityLabel": {
"liveStreaming": "直播串流"
},
"add": "新增",
"addMeetingNote": "新增此會議的備註",
"addOptionalNote": "新增備註 (選填)",
"allow": "允許",
"alreadySharedVideoMsg": "另一位參與者已經進行分享影像了。此會議同個時間只能允許一人分享影像畫面。",
"alreadySharedVideoMsg": "另一位參與者已經正在分享影像了。此會議同時僅允許一人分享影像畫面。",
"alreadySharedVideoTitle": "一次只允許一位影像分享",
"applicationWindow": "應用程式視窗",
"authenticationRequired": "需要驗證",
@@ -265,11 +267,13 @@
"kickParticipantDialog": "您確定要將這位參與者踢出會議嗎?",
"kickParticipantTitle": "踢出這位參與者?",
"kickTitle": "噢!{{participantDisplayName}} 已將您踢出會議",
"linkMeeting": "連結會議",
"linkMeetingTitle": "將會議連結至 Salesforce",
"liveStreaming": "直播串流中",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "正在錄影,無法使用",
"liveStreamingDisabledTooltip": "啟動直播串流已停用。",
"localUserControls": "本機使用者控制",
"lockMessage": "鎖定會議失敗。",
"lockMessage": "無法鎖定會議。",
"lockRoom": "增加會議 $t(lockRoomPasswordUppercase)",
"lockTitle": "鎖定失敗",
"login": "登入",
@@ -319,6 +323,7 @@
"popupError": "您的瀏覽器在此網站上阻擋彈出視窗。請在瀏覽器的安全設定中啟用並再試一次。",
"popupErrorTitle": "彈出視窗遭到阻擋",
"readMore": "更多",
"recentlyUsedObjects": "您近期使用過的物件",
"recording": "錄影中",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "正在直播時無法使用",
"recordingDisabledTooltip": "啟動錄影已停用。",
@@ -335,19 +340,25 @@
"removeSharedVideoMsg": "您確定要移除自己分享的影像嗎?",
"removeSharedVideoTitle": "移除分享的影像",
"reservationError": "預約系統錯誤",
"reservationErrorMsg": "錯誤碼: {{code}} 訊息: {{msg}}",
"reservationErrorMsg": "錯誤碼:{{code}} 訊息:{{msg}}",
"retry": "重試",
"screenSharingAudio": "分享音訊",
"screenSharingFailed": "噢喔!發生錯誤,我們無法啟動螢幕分享!",
"screenSharingFailedTitle": "螢幕分享失敗!",
"screenSharingPermissionDeniedError": "噢喔!您的影像分享權限發生問題。請重新載入,再試一次。",
"sendPrivateMessage": "您最近有收到私人訊息。您要進行私人回覆,或是要將自己的訊息發佈至群組?",
"searchInSalesforce": "在 Salesforce 中搜尋",
"searchResults": "搜尋結果 ({{count}})",
"searchResultsDetailsError": "取得擁有者資料時發生錯誤。",
"searchResultsError": "取得資料時發生錯誤。",
"searchResultsNotFound": "找不到任何結果。",
"searchResultsTryAgain": "請嘗試使用其他關鍵字。",
"sendPrivateMessage": "您最近有收到私人訊息。您要進行私人回覆,還是要將自己的訊息發佈至群組?",
"sendPrivateMessageCancel": "發佈至群組",
"sendPrivateMessageOk": "私人回覆",
"sendPrivateMessageTitle": "私人傳訊",
"sendPrivateMessageTitle": "私人回覆",
"serviceUnavailable": "服務無法使用",
"sessTerminated": "通話已經終止",
"sessionRestarted": "通話被橋接器重新啟動",
"sessionRestarted": "通話因連線問題重新啟動",
"shareAudio": "繼續",
"shareAudioTitle": "如何分享音訊",
"shareAudioWarningD1": "您必須先停止分享畫面才能分享音訊。",
@@ -359,11 +370,13 @@
"shareScreenWarningD2": "您必須先停止分享音訊,啟動畫面分享,然後勾選 \"分享音訊\" 選項。",
"shareScreenWarningH1": "如果您只要分享畫面:",
"shareScreenWarningTitle": "您必須先停止分享音訊才能分享畫面",
"shareVideoLinkError": "請提供正確的 YouTube 連結。",
"shareVideoLinkError": "請提供正確的影片網址。",
"shareVideoTitle": "分享影像",
"shareYourScreen": "分享自己的螢幕",
"shareYourScreenDisabled": "螢幕分享已停用。",
"sharedVideoLinkPlaceholder": "YouTube 或影片連結",
"sharedVideoDialogError": "錯誤:網址無效",
"sharedVideoLinkPlaceholder": "YouTube 或影片網址",
"start": "開始 ",
"startLiveStreaming": "啟動直播串流",
"startRecording": "啟動錄影作業",
"startRemoteControlErrorMessage": "嘗試啟動遠端控制階段時發生錯誤!",
@@ -388,7 +401,7 @@
"yourEntireScreen": "您的畫面"
},
"documentSharing": {
"title": "分享的文件"
"title": "分享的檔案"
},
"e2ee": {
"labelToolTip": "此通話的音訊及視訊皆已使用端對端加密"
@@ -406,6 +419,10 @@
"veryBad": "極差",
"veryGood": "極好"
},
"giphy": {
"noResults": "找不到任何結果 :(",
"search": "搜尋 GIPHY"
},
"helpView": {
"header": "說明中心"
},
@@ -423,8 +440,8 @@
"conferenceURL": "連結:",
"copyNumber": "複製號碼",
"country": "國家",
"dialANumber": "要參加您的會議,撥打以下其中一支號碼,然後輸入 PIN 碼。",
"dialInConferenceID": "PIN 碼:",
"dialANumber": "要參加您的會議,撥打以下其中一支號碼,然後輸入 PIN 碼。",
"dialInConferenceID": "PIN 碼:",
"dialInNotSupported": "抱歉,目前不支援電話撥入。",
"dialInNumber": "撥入:",
"dialInSummaryError": "目前解析撥入資訊錯誤。請稍後再試一次。",
@@ -472,6 +489,7 @@
"focusLocal": "聚焦於自己的影像",
"focusRemote": "聚焦於另一人的影像",
"fullScreen": "觀看或離開全螢幕",
"giphyMenu": "切換 GIPHY 選單",
"keyboardShortcuts": "快捷鍵",
"localRecording": "顯示或隱藏本機端錄影操控",
"mute": "靜音或解除靜音",
@@ -525,7 +543,8 @@
"admit": "准許",
"admitAll": "准許所有人",
"allow": "允許",
"backToKnockModeButton": "沒有密碼,請要求加入",
"backToKnockModeButton": "求加入",
"chat": "聊天",
"dialogTitle": "大廳模式",
"disableDialogContent": "已開啟大廳模式。此功能能夠確保閒雜人等無法加入您的會議。您確定要停用嗎?",
"disableDialogSubmit": "停用",
@@ -538,6 +557,7 @@
"errorMissingPassword": "請輸入會議密碼",
"invalidPassword": "密碼錯誤",
"joinRejectedMessage": "您的加入請求遭到管理員拒絕。",
"joinRejectedTitle": "加入請求遭拒。",
"joinTitle": "加入會議",
"joinWithPasswordMessage": "正在嘗試透過密碼加入,請稍候...",
"joiningMessage": "一旦他人接受您的請求,即可加入會議",
@@ -546,6 +566,8 @@
"knockButton": "請求加入",
"knockTitle": "有人想要加入會議",
"knockingParticipantList": "要求加入的參與者名單",
"lobbyChatStartedNotification": "{{moderator}} 與 {{attendee}} 開始了大廳聊天",
"lobbyChatStartedTitle": "{{moderator}} 與您開始了大廳聊天。",
"nameField": "輸入您的名字",
"notificationLobbyAccessDenied": "{{originParticipantName}} 拒絕了 {{targetParticipantName}} 的加入請求",
"notificationLobbyAccessGranted": "{{originParticipantName}} 同意了 {{targetParticipantName}} 的加入請求",
@@ -600,13 +622,15 @@
"allowedUnmute": "您可以將麥克風解除靜音、開啟視訊,或是分享您的畫面。",
"audioUnmuteBlockedDescription": "麥克風解除靜音操作由於系統限制而被暫時封鎖。",
"audioUnmuteBlockedTitle": "麥克風解除靜音遭封鎖!",
"chatMessages": "聊天訊息",
"connectedOneMember": "{{name}} 加入了會議",
"connectedThreePlusMembers": "{{name}} 及 {{count}} 位人員加入了會議",
"connectedTwoMembers": "{{first}} 及 {{second}} 加入了會議",
"disconnected": "已經中斷連接",
"displayNotifications": "顯示通知",
"focus": "會議焦點",
"focusFail": "{{component}} 無法使用 - 請在 {{ms}} 秒後重試",
"grantedTo": "主持人權限已授予 {{to}}",
"gifsMenu": "GIPHY",
"groupTitle": "通知",
"hostAskedUnmute": "主持人希望您能解除靜音",
"invitedOneMember": "{{name}} 已受邀請",
@@ -616,6 +640,12 @@
"leftOneMember": "{{name}} 已離開會議",
"leftThreePlusMembers": "{{name}} 和其他人已離開會議",
"leftTwoMembers": "{{first}} 和 {{second}} 已離開會議",
"linkToSalesforce": "連結至 Salesforce",
"linkToSalesforceDescription": "您可以將會議摘要連結至 Salesforce 物件。",
"linkToSalesforceError": "無法將會議連結至 Salesforce",
"linkToSalesforceKey": "連結此會議",
"linkToSalesforceProgress": "正在將會議連結至 Salesforce...",
"linkToSalesforceSuccess": "會議已連結至 Salesforce",
"me": "自己",
"moderationInEffectCSDescription": "若要分享視訊,請舉手",
"moderationInEffectCSTitle": "內容分享已被管理員停用",
@@ -639,14 +669,18 @@
"oldElectronClientDescription1": "您似乎正在使用 Jitsi Meet 客戶端的舊版本,其有已知的安全漏洞。請更新到",
"oldElectronClientDescription2": "最新版本",
"oldElectronClientDescription3": "",
"participantWantsToJoin": "想要加入會議",
"participantsWantToJoin": "想要加入會議",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) 已被其他參與者移除",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) 已被其他參與者設定",
"raiseHandAction": "舉手",
"raisedHand": "{{name}} 想要發言。",
"raisedHands": "{{participantName}} 和其他 {{raisedHands}} 人",
"reactionSounds": "停用音效",
"reactionSoundsForAll": "為所有人停用音效",
"screenShareNoAudio": "您未在選擇視窗時勾選分享音訊",
"screenShareNoAudioTitle": "未勾選分享音訊",
"selfViewTitle": "您隨時可以在設定中取消隱藏自己的畫面",
"somebody": "某人",
"startSilentDescription": "重新加入會議以啟用語音",
"startSilentTitle": "您加入了會議而無聲音輸出!",
@@ -656,7 +690,9 @@
"videoMutedRemotelyDescription": "您隨時可以再次啟用。",
"videoMutedRemotelyTitle": "您的攝影機已被 {{participantDisplayName}} 停用!",
"videoUnmuteBlockedDescription": "視訊鏡頭解除靜音操作由於系統限制而被暫時封鎖。",
"videoUnmuteBlockedTitle": "視訊鏡頭解除靜音遭封鎖!"
"videoUnmuteBlockedTitle": "視訊鏡頭解除靜音遭封鎖!",
"viewLobby": "檢視大廳",
"waitingParticipants": "{{waitingParticipants}} 人"
},
"participantsPane": {
"actions": {
@@ -688,6 +724,7 @@
},
"passwordDigitsOnly": "上限為 {{number}} 位數",
"passwordSetRemotely": "由其他參與者設定",
"pinnedParticipant": "參與者被釘選",
"polls": {
"answer": {
"skip": "跳過",
@@ -801,7 +838,20 @@
"setEmailLabel": "設定您的 Gravatar 電子信箱",
"title": "簡介"
},
"raisedHand": "請求發言",
"raisedHand": "想要發言",
"raisedHandsLabel": "舉手人數",
"record": {
"already": {
"linked": "會議已連結至此 Salesforce 物件。"
},
"type": {
"account": "帳號",
"contact": "聯絡",
"lead": "淺在客戶",
"opportunity": "機會",
"owner": "擁有者"
}
},
"recording": {
"authDropboxText": "上傳至 Dropbox",
"availableSpace": "可用空間:{{spaceLeft}} MB (錄影時間大約 {{duration}} 分鐘)",
@@ -816,6 +866,11 @@
"expandedPending": "錄影正在啟動...",
"failedToStart": "錄影啟動失敗",
"fileSharingdescription": "分享錄影給會議參與者",
"highlight": "精選",
"highlightMoment": "精選時刻",
"highlightMomentDisabled": "您可以在錄製開始後精選時刻",
"highlightMomentSuccess": "已精選的時刻",
"highlightMomentSucessDescription": "您的精選時刻將新增至會議摘要。",
"inProgress": "正在錄製或直播",
"limitNotificationDescriptionNative": "由於目前流量過大,您的錄影時間被限制在 {{limit}} 分鐘。若要無限制的錄影,請試試 <3>{{app}}</3>。",
"limitNotificationDescriptionWeb": "由於目前流量過大,您的錄影時間被限制在 {{limit}} 分鐘。若要無限制的錄影,請試試 <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>。",
@@ -830,6 +885,7 @@
"rec": "錄影",
"serviceDescription": "您的錄影會由錄影服務儲存",
"serviceDescriptionCloud": "雲端錄製",
"serviceDescriptionCloudInfo": "已錄製的會議將在 24 小時後自動清除。",
"serviceName": "錄影服務",
"sessionAlreadyActive": "已在錄製或直播此工作階段。",
"signIn": "登入",
@@ -838,8 +894,9 @@
"unavailableTitle": "錄影無法使用",
"uploadToCloud": "上傳至雲端"
},
"screenshareDisplayName": "{{name}} 的畫面",
"sectionList": {
"pullToRefresh": "下以重新整理"
"pullToRefresh": "下以重新整理"
},
"security": {
"about": "您可以新增 $t(lockRoomPassword) 至您的會議。參與者在加入會議前必須先輸入 $t(lockRoomPassword)。",
@@ -864,6 +921,7 @@
"incomingMessage": "新訊息",
"language": "語言",
"loggedIn": "以 {{name}} 登入",
"maxStageParticipants": "能夠被釘選至主舞台的參與者最大人數",
"microphones": "麥克風",
"moderator": "主持人",
"more": "更多",
@@ -877,6 +935,7 @@
"selectAudioOutput": "音訊輸出",
"selectCamera": "攝影裝置",
"selectMic": "麥克風",
"selfView": "自我檢視",
"sounds": "音效",
"speakers": "喇叭",
"startAudioMuted": "全部人啟動時處於靜音",
@@ -915,6 +974,7 @@
"speakerStats": {
"angry": "憤怒",
"disgusted": "作嘔",
"displayEmotions": "顯示表情",
"fearful": "害怕",
"happy": "開心",
"hours": "{{count}}時",
@@ -948,6 +1008,7 @@
"audioOnly": "切換僅聲音",
"audioRoute": "選擇音訊裝置",
"boo": "喝倒彩",
"breakoutRoom": "加入/離開分組討論室",
"callQuality": "管理影像品質",
"cc": "切換字幕",
"chat": "切換聊天視窗",
@@ -965,7 +1026,9 @@
"invite": "邀請人員",
"joy": "笑到流淚",
"kick": "踢出參與者",
"laugh": "大笑",
"like": "比讚",
"linkToSalesforce": "連結至 Salesforce",
"lobbyButton": "啟用/停用大廳模式",
"localRecording": "切換本地端錄影控制",
"lockRoom": "切換會議密碼",
@@ -1027,6 +1090,7 @@
"exitFullScreen": "離開全螢幕",
"exitTileView": "跳出格狀檢視",
"feedback": "回饋",
"giphy": "切換 GIPHY 選單",
"hangup": "離開",
"help": "說明",
"invite": "邀請人員",
@@ -1034,6 +1098,7 @@
"laugh": "大笑",
"leaveBreakoutRoom": "離開分組討論室",
"like": "比讚",
"linkToSalesforce": "連結至 Salesforce",
"lobbyButtonDisable": "停用大廳模式",
"lobbyButtonEnable": "啟用大廳模式",
"login": "登入",
@@ -1148,13 +1213,18 @@
"domuteVideoOfOthers": "停用其他人的攝影機",
"flip": "翻轉",
"grantModerator": "授予管理員",
"hideSelfView": "隱藏自我檢視",
"kick": "踢出",
"moderator": "主持人",
"mute": "參與者處於靜音",
"muted": "處於靜音",
"pinToStage": "釘選至舞台",
"remoteControl": "開始/停止遠端控制",
"screenSharing": "參與者正在分享他們的畫面",
"show": "顯示在台上",
"videoMuted": "已停用攝影機",
"showSelfView": "顯示自我檢視",
"unpinFromStage": "取消釘選",
"videoMuted": "已停用攝影裝置",
"videomute": "參與者已經停止攝影裝置"
},
"virtualBackground": {
@@ -1178,7 +1248,8 @@
"slightBlur": "稍微模糊",
"title": "虛擬背景",
"uploadedImage": "上傳圖片 {{index}}",
"webAssemblyWarning": "不支援 WebAssembly"
"webAssemblyWarning": "不支援 WebAssembly",
"webAssemblyWarningDescription": "WebAssembly 遭停用或不被此連覽器支援"
},
"volumeSlider": "音量滑條",
"welcomepage": {

View File

@@ -31,6 +31,7 @@
},
"audioDevices": {
"bluetooth": "Bluetooth",
"car": "Car Audio",
"headphones": "Headphones",
"none": "No audio devices available",
"phone": "Phone",
@@ -76,6 +77,17 @@
"refresh": "Refresh calendar",
"today": "Today"
},
"carmode": {
"actions": {
"leaveMeeting": " Leave meeting",
"selectSoundDevice": "Select sound device"
},
"labels": {
"buttonLabel": "Car mode",
"title": "Safe driving mode",
"videoStopped": "Your video is stopped"
}
},
"chat": {
"enter": "Enter room",
"error": "Error: your message was not sent. Reason: {{error}}",
@@ -104,6 +116,7 @@
},
"chromeExtensionBanner": {
"buttonText": "Install Chrome Extension",
"buttonTextEdge": "Install Edge Extension",
"close": "Close",
"dontShowAgain": "Dont show me this again",
"installExtensionText": "Install the extension for Google Calendar and Office 365 integration"
@@ -195,6 +208,9 @@
"selectADevice": "Select a device",
"testAudio": "Play a test sound"
},
"dialIn": {
"screenTitle": "Dial-in summary"
},
"dialOut": {
"statusMessage": "is now {{status}}"
},
@@ -276,7 +292,7 @@
"lockRoom": "Add meeting $t(lockRoomPassword)",
"lockTitle": "Lock failed",
"login": "Login",
"logoutQuestion": "Are you sure you want to logout and stop the conference?",
"logoutQuestion": "Are you sure you want to logout and leave the conference?",
"logoutTitle": "Logout",
"maxUsersLimitReached": "The limit for maximum number of participants has been reached. The conference is full. Please contact the meeting owner or try again later!",
"maxUsersLimitReachedTitle": "Maximum participants limit reached",
@@ -556,6 +572,7 @@
"errorMissingPassword": "Please enter the meeting password",
"invalidPassword": "Invalid password",
"joinRejectedMessage": "Your join request was rejected by a moderator.",
"joinRejectedTitle": "Join request rejected.",
"joinTitle": "Join Meeting",
"joinWithPasswordMessage": "Trying to join with password, please wait...",
"joiningMessage": "You'll join the meeting as soon as someone accepts your request",
@@ -628,6 +645,7 @@
"displayNotifications": "Display notifications for",
"focus": "Conference focus",
"focusFail": "{{component}} not available - retry in {{ms}} sec",
"gifsMenu": "GIPHY",
"groupTitle": "Notifications",
"hostAskedUnmute": "The moderator would like you to speak",
"invitedOneMember": "{{name}} has been invited",
@@ -643,6 +661,8 @@
"linkToSalesforceKey": "Link this meeting",
"linkToSalesforceProgress": "Linking meeting to Salesforce...",
"linkToSalesforceSuccess": "The meeting was linked to Salesforce",
"localRecordingStarted": "{{name}} has started a local recording.",
"localRecordingStopped": "{{name}} has stopped a local recording.",
"me": "Me",
"moderationInEffectCSDescription": "Please raise hand if you want to share your screen.",
"moderationInEffectCSTitle": "Screen sharing is blocked by the moderator",
@@ -721,6 +741,7 @@
},
"passwordDigitsOnly": "Up to {{number}} digits",
"passwordSetRemotely": "Set by another participant",
"pinnedParticipant": "The participant is pinned",
"polls": {
"answer": {
"skip": "Skip",
@@ -797,6 +818,7 @@
"initiated": "Call initiated",
"joinAudioByPhone": "Join with phone audio",
"joinMeeting": "Join meeting",
"joinMeetingInLowBandwidthMode": "Join in low bandwidth mode",
"joinWithoutAudio": "Join without audio",
"keyboardShortcuts": "Enable Keyboard shortcuts",
"linkCopied": "Link copied to clipboard",
@@ -838,7 +860,7 @@
"raisedHandsLabel": "Number of raised hands",
"record": {
"already": {
"linked": "Record is already linked to this session."
"linked": "The meeting is already linked to this Salesforce object."
},
"type": {
"account": "Account",
@@ -872,6 +894,8 @@
"limitNotificationDescriptionWeb": "Due to high demand your recording will be limited to {{limit}} min. For unlimited recordings try <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"linkGenerated": "We have generated a link to your recording.",
"live": "LIVE",
"localRecordingNoNotificationWarning": "The recording will not be announced to other participants. You will need to let them know that the meeting is recorded.",
"localRecordingWarning": "Make sure you select the current tab in order to use the right video and audio. The recording is currently limited to 1GB, which is around 100 minutes.",
"loggedIn": "Logged in as {{userName}}",
"off": "Recording stopped",
"offBy": "{{name}} stopped the recording",
@@ -879,6 +903,7 @@
"onBy": "{{name}} started the recording",
"pending": "Preparing to record the meeting...",
"rec": "REC",
"saveLocalRecording": "Save recording file locally",
"serviceDescription": "Your recording will be saved by the recording service",
"serviceDescriptionCloud": "Cloud recording",
"serviceDescriptionCloudInfo": "Recorded meetings are automatically cleared 24h after their recording time.",
@@ -886,10 +911,12 @@
"sessionAlreadyActive": "This session is already being recorded or live streamed.",
"signIn": "Sign in",
"signOut": "Sign out",
"surfaceError": "Please select the current tab.",
"unavailable": "Oops! The {{serviceName}} is currently unavailable. We're working on resolving the issue. Please try again later.",
"unavailableTitle": "Recording unavailable",
"uploadToCloud": "Upload to the cloud"
},
"screenshareDisplayName": "{{name}}'s screen",
"sectionList": {
"pullToRefresh": "Pull to refresh"
},
@@ -916,6 +943,7 @@
"incomingMessage": "Incoming message",
"language": "Language",
"loggedIn": "Logged in as {{name}}",
"maxStageParticipants": "Maximum number of participants who can be pinned to the main stage",
"microphones": "Microphones",
"moderator": "Moderator",
"more": "More",
@@ -926,6 +954,7 @@
"playSounds": "Play sound on",
"reactions": "Meeting reactions",
"sameAsSystem": "Same as system ({{label}})",
"screenTitle": "Settings",
"selectAudioOutput": "Audio output",
"selectCamera": "Camera",
"selectMic": "Microphone",
@@ -951,6 +980,7 @@
"disableCrashReportingWarning": "Are you sure you want to disable crash reporting? The setting will be applied after you restart the app.",
"disableP2P": "Disable Peer-To-Peer mode",
"displayName": "Display name",
"displayNamePlaceholderText": "Eg: John Doe",
"email": "Email",
"header": "Settings",
"profileSection": "Profile",
@@ -1004,10 +1034,12 @@
"boo": "Boo",
"breakoutRoom": "Join/leave breakout room",
"callQuality": "Manage video quality",
"carmode": "Car Mode",
"cc": "Toggle subtitles",
"chat": "Open / Close chat",
"clap": "Clap",
"collapse": "Collapse",
"dock": "Dock in main window",
"document": "Toggle shared document",
"download": "Download our apps",
"embedMeeting": "Embed meeting",
@@ -1058,6 +1090,7 @@
"tileView": "Toggle tile view",
"toggleCamera": "Toggle camera",
"toggleFilmstrip": "Toggle filmstrip",
"undock": "Undock into separate window",
"videoblur": "Toggle video blur",
"videomute": "Start / Stop camera"
},
@@ -1074,6 +1107,7 @@
"closeChat": "Close chat",
"closeReactionsMenu": "Close reactions menu",
"disableReactionSounds": "You can disable reaction sounds for this meeting",
"dock": "Dock in main window",
"documentClose": "Close shared document",
"documentOpen": "Open shared document",
"download": "Download our apps",
@@ -1142,6 +1176,7 @@
"talkWhileMutedPopup": "Trying to speak? You are muted.",
"tileViewToggle": "Toggle tile view",
"toggleCamera": "Toggle camera",
"undock": "Undock into separate window",
"videoSettings": "Video settings",
"videomute": "Start / Stop camera"
},
@@ -1212,10 +1247,12 @@
"moderator": "Moderator",
"mute": "Participant is muted",
"muted": "Muted",
"pinToStage": "Pin to stage",
"remoteControl": "Start / Stop remote control",
"screenSharing": "Participant is sharing their screen",
"show": "Show on stage",
"showSelfView": "Show self view",
"unpinFromStage": "Unpin",
"videoMuted": "Camera disabled",
"videomute": "Participant has stopped the camera"
},

View File

@@ -39,7 +39,9 @@ import {
raiseHand,
isParticipantModerator,
isLocalParticipantModerator,
hasRaisedHand
hasRaisedHand,
grantModerator,
overwriteParticipantsNames
} from '../../react/features/base/participants';
import { updateSettings } from '../../react/features/base/settings';
import { isToggleCameraEnabled, toggleCamera } from '../../react/features/base/tracks';
@@ -86,6 +88,8 @@ import { toggleScreenshotCaptureSummary } from '../../react/features/screenshot-
import { isScreenshotCaptureEnabled } from '../../react/features/screenshot-capture/functions';
import { playSharedVideo, stopSharedVideo } from '../../react/features/shared-video/actions.any';
import { extractYoutubeIdOrURL } from '../../react/features/shared-video/functions';
import { toggleRequestingSubtitles, setRequestingSubtitles } from '../../react/features/subtitles/actions';
import { isAudioMuteButtonDisabled } from '../../react/features/toolbox/functions';
import { toggleTileView, setTileView } from '../../react/features/video-layout';
import { muteAllParticipants } from '../../react/features/video-menu/actions';
import { setVideoQuality } from '../../react/features/video-quality';
@@ -164,6 +168,14 @@ function initCommands() {
}
APP.store.dispatch(autoAssignToBreakoutRooms());
},
'grant-moderator': participantId => {
if (!isLocalParticipantModerator(APP.store.getState())) {
logger.error('Missing moderator rights to grant moderator right to another participant');
return;
}
APP.store.dispatch(grantModerator(participantId));
},
'display-name': displayName => {
sendAnalytics(createApiEvent('display.name.changed'));
APP.conference.changeLocalDisplayName(displayName);
@@ -362,6 +374,12 @@ function initCommands() {
sendAnalytics(createApiEvent('screen.sharing.toggled'));
toggleScreenSharing(options.enable);
},
'toggle-subtitles': () => {
APP.store.dispatch(toggleRequestingSubtitles());
},
'set-subtitles': enabled => {
APP.store.dispatch(setRequestingSubtitles(enabled));
},
'toggle-tile-view': () => {
sendAnalytics(createApiEvent('tile-view.toggled'));
@@ -411,6 +429,11 @@ function initCommands() {
logger.error('Failed sending endpoint text message', err);
}
},
'overwrite-names': participantList => {
logger.debug('Overwrite names command received');
APP.store.dispatch(overwriteParticipantsNames(participantList));
},
'toggle-e2ee': enabled => {
logger.debug('Toggle E2EE key command received');
APP.store.dispatch(toggleE2EE(enabled));
@@ -684,6 +707,9 @@ function initCommands() {
case 'is-audio-muted':
callback(APP.conference.isLocalAudioMuted());
break;
case 'is-audio-disabled':
callback(isAudioMuteButtonDisabled(APP.store.getState()));
break;
case 'is-moderation-on': {
const { mediaType } = request;
const type = mediaType || MEDIA_TYPE.AUDIO;
@@ -716,6 +742,9 @@ function initCommands() {
case 'is-sharing-screen':
callback(Boolean(APP.conference.isSharingScreen));
break;
case 'is-start-silent':
callback(Boolean(APP.store.getState()['features/base/config'].startSilent));
break;
case 'get-content-sharing-participants': {
const tracks = getState()['features/base/tracks'];
const sharingParticipantIds = tracks.filter(tr => tr.videoType === 'desktop').map(t => t.participantId);
@@ -1132,6 +1161,21 @@ class API {
});
}
/**
* Notify external application (if API is enabled) that some face landmark data is available.
*
* @param {Object | undefined} faceBox - Detected face(s) bounding box (left, right, width).
* @param {string} faceExpression - Detected face expression.
* @returns {void}
*/
notifyFaceLandmarkDetected(faceBox: Object, faceExpression: string) {
this._sendEvent({
name: 'face-landmark-detected',
faceBox,
faceExpression
});
}
/**
* Notify external application (if API is enabled) that the list of sharing participants changed.
*
@@ -1417,6 +1461,22 @@ class API {
});
}
/**
* Notify external application (if API is enabled) that the iframe
* docked state has been changed. The responsibility for implementing
* the dock / undock functionality lies with the external application.
*
* @param {boolean} docked - Whether or not the iframe has been set to
* be docked or undocked.
* @returns {void}
*/
notifyIframeDockStateChanged(docked: boolean) {
this._sendEvent({
name: 'iframe-dock-state-changed',
docked
});
}
/**
* Notify external application of a participant, remote or local, being
* removed from the conference by another participant.
@@ -1622,6 +1682,32 @@ class API {
});
}
/**
* Notify external application that the breakout rooms changed.
*
* @param {Array} rooms - Array of breakout rooms.
* @returns {void}
*/
notifyBreakoutRoomsUpdated(rooms) {
this._sendEvent({
name: 'breakout-rooms-updated',
rooms
});
}
/**
* Notify the external application that the state of the participants pane changed.
*
* @param {boolean} open - Wether the panel is open or not.
* @returns {void}
*/
notifyParticipantsPaneToggled(open) {
this._sendEvent({
name: 'participants-pane-toggled',
open
});
}
/**
* Disposes the allocated resources.
*

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