Compare commits

...

377 Commits

Author SHA1 Message Date
Saúl Ibarra Corretgé
1433a1ee5d feat(rn,filmstrip) add 1on1 mode
When there are only 2 participants in a call, don't show the remote thumbnail,
unless the `disable1On1Mode` config option is set or the local participant pin
themselves.
2021-08-06 13:31:00 +02:00
dependabot[bot]
834ee22bc3 chore(deps): bump browserslist in /resources/load-test
Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.7.3 to 4.16.6.
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.7.3...4.16.6)

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-06 10:02:48 +02:00
Pierre
d6b5687828 fix(misc) fix typeof comparison to undefined 2021-08-06 09:51:54 +02:00
Jaya Allamsetty
6b496d4def chore(deps) lib-jitsi-meet@latest
* fix(ConnectionQuality): Do not show red/yellow GSM bars on join. When the user first unmutes their video, the connection quality is shown as poor until the local stats are available. Calculate the connection quality only after the stats are available, i.e., assume 100% until pcStatsInterval has elapsed.
* feat(non-participant-messages) Add a new JitiConferenceEvent for messages ignored by ENDPOINT_MESSAGE_RECEIVED
* fix(precall) respect custom callstats script url for precall test

9e632a77c5...6a3df11ffa
2021-08-05 17:07:43 -04:00
Jaya Allamsetty
22cc56ce8d chore(deps) lib-jitsi-meet@latest
* feat(BridgeChannel): Signal a new videoType for high fps screenshare. This lets the bridge adjust the bitrate allocation for this source so that layers with higher fps are prioritized over layers with higher resolution. As a result, endpoints with restricted downlink will receive a high fps low resolution share as opposed to a high resolution low fps screenshare.
* fix(log) lower severity of overly verbose logs (2)

fa834c2923...9e632a77c5
2021-08-05 14:16:52 -04:00
Saúl Ibarra Corretgé
0419c5a15b fix(rn,video-quality) fix not selecting any endpoint on mobile
The concept of "visible participants" is not yet implemented.
2021-08-05 17:28:33 +02:00
hmuresan
dda1f3c5ba fix(recording-label) fix recording label behavior 2021-08-05 17:56:12 +03:00
hmuresan
6f41ef75d7 fix(notifications) Fix hiding audio/video lost notification 2021-08-05 16:36:13 +03:00
Saúl Ibarra Corretgé
46cbc0ff49 chore(rn,versions) set mobile app and SDK versions 2021-08-05 13:43:29 +02:00
Saúl Ibarra Corretgé
53a695da90 fix(twa) update masked icon
Contrary to what I thought the expected icon is an icon that can be masked, not
the mask itself.
2021-08-05 13:42:58 +02:00
Calin Chitu
8bbee7d1dc feat(toolbox) updated menu items order, dividers for mobile 2021-08-05 11:56:44 +02:00
Дамян Минков
72d4aa7dd5 fix: Fix av moderation enable-disable sequence.
When you enable and then disable av-moderation just the audio moderation is disabled and video moderation disabling is not signalled to moderated clients.
2021-08-04 19:41:37 +03:00
Saúl Ibarra Corretgé
8161309e28 deps(rn) update WebRTC to M92 2021-08-04 15:42:37 +02:00
Saúl Ibarra Corretgé
465e7f1458 fix(conference) unify conference options
Some options were missing on the mobile side, notably calltsts
enableDisplayNameInStats and enableEmailInStats. Now the same logic will be used
in web and mobile.
2021-08-04 15:32:03 +02:00
Calinteodor
4e43a31ec9 fix(rn,bottom-sheet) fixed surface color
Also fix properly showing the remote menu.
2021-08-04 15:11:32 +02:00
Christoph Settgast
70c5ea04b1 fix(lang) update German translation
Signed-off-by: Christoph Settgast <csett86@web.de>
2021-08-04 11:00:34 +02:00
Calinteodor
ca25be7314 fix(config) comment out enabledReactions 2021-08-04 10:58:07 +02:00
Calinteodor
3c2ad24652 fix(shared-video,video-menu) add ability to stop shared video from video menu
Specifically, in the bottom sheet (on mobile) and participants pane.
2021-08-04 10:51:05 +02:00
Avram Tudor
e421a119e1 feat(share-video) Allow sharing direct video links (mp4 etc) on mobile (#9511)
* feat(share-video) Allow sharing direct video links (mp4 etc) on mobile

* fix linting

* code review
2021-08-02 15:55:52 +03:00
Hristo Terezov
619acaca24 fix(Filmstrip): Send only visible endpoints to jvb 2021-07-30 11:44:16 -05:00
Calin Chitu
bc9f5773fb feat(participants-pane) changed to standard header 2021-07-30 16:07:48 +02:00
Andrei Gavrilescu
d0be8dcf9d fix(external-api): persist audio output device 2021-07-30 14:51:47 +03:00
Alex Bumbu
af9958ad66 feat(ios) support for destroying & reinitializing the react native bridge 2021-07-30 11:53:30 +02:00
Calinteodor
efc5c9dabe feat(participants-pane) hide admit all if less than 2 participants
- Fixed admitMultiple action for mobile
- Added token color for button
- Hide Admit all button if less than 2 knocking participants
2021-07-30 11:48:06 +02:00
Calinteodor
d22fc88ae3 feat(participants-pane) context menu ui fixes
- Fixed background color for all participants context menus
- Removed connection status from ReactVideoMenu and added it for local participants
- Removed AVModeration comments on mobile
- Show on stage option visible only when participants pane is closed
2021-07-30 11:46:49 +02:00
Mihai-Andrei Uscat
9ee75038b6 fix(Toolbar): Fix toolbar not hiding on mobile 2021-07-30 11:37:45 +03:00
Saúl Ibarra Corretgé
09af88088d fix(logging) reduce overly vebose logging
It huurts performance on mobile. It can still be enabled by setting the level to
debug / trace.
2021-07-28 23:27:54 +02:00
Saúl Ibarra Corretgé
2e539ba010 chore(deps) lib-jitsi-meet@latest
* fix(log) lower severity of overly verbose logs
* e2ee: remove legacy apis (#1653)

b815157a22...fa834c2923
2021-07-28 23:14:08 +02:00
José Luís Andrade
87b3ec2cc0 fix(lang) update portuguese translaation 2021-07-28 22:22:10 +02:00
Pawel Domas
907b51925d fix(prejoin): disposed track was added to the conference
It is not 100% clear to me when it happens, but I think it could happen
in some race condition where a track is unmuted when it's being disposed
or something around those lines.

The fact is that any muted tracks are disposed by replaceLocalTrack(track.jitsiTrack, null) and they should not be used anymore.

Supposedly fixes a crash:

Failed to add local track to conference Track has been already disposed
2021-07-28 09:00:54 -05:00
Saúl Ibarra Corretgé
643340c4a6 fix(deps,rn) bump @react-native-async-storage/async-storage
In version 1.15 the storage backend was rewritten, which hopefully allows us to
fix this crash on Android:

Caused by java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/user/0/org.jitsi.meet/databases/RKStorage
       at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
       at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1160)
       at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1036)
       at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1204)
       at com.reactnativecommunity.asyncstorage.AsyncStorageModule$1.doInBackgroundGuarded(AsyncStorageModule.java:159)
       at com.reactnativecommunity.asyncstorage.AsyncStorageModule$1.doInBackgroundGuarded(AsyncStorageModule.java:146)
       at com.facebook.react.bridge.GuardedAsyncTask.doInBackground(GuardedAsyncTask.java:35)
       at com.facebook.react.bridge.GuardedAsyncTask.doInBackground(GuardedAsyncTask.java:19)
       at android.os.AsyncTask$2.call(AsyncTask.java:305)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at com.reactnativecommunity.asyncstorage.AsyncStorageModule$SerialExecutor$1.run(AsyncStorageModule.java:63)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at java.lang.Thread.run(Thread.java:760)
2021-07-28 15:26:00 +02:00
Calinteodor
d6c821d524 feat(participants-pane) updates
- Fixed react native community slider to work on both android and ios
- Removed InviteButton from native menus
- Fixed buttons spacing in native OverflowMenu
- Participant context menu details are shown only for remote participants
2021-07-27 16:08:33 +02:00
Saúl Ibarra Corretgé
eb16f93153 fix(rn,polyfills) remove no longer needed hack
With react-native-webrtc 1.89.2 the remote SDP is properly updated before
onaddstream is fired so it's no longer needed.

Also, for readability, IPv6 address synthesis has been moved to a standalone
utils file.
2021-07-26 16:16:27 +02:00
Saúl Ibarra Corretgé
47576aebba chore(deps) react-native-webrtc@1.89.2
THe new version fixed a longstanding problem with RN not updating the JS side
SDP representation properly. This will allow us to remove a hack we currently
have to sidestep this.
2021-07-26 16:16:27 +02:00
Saúl Ibarra Corretgé
bac0a55421 fix(config) add missing buttons to default constants
- Remove button list from interface_config.js since it has been deprecated for a
  while
- Alphabetically sort buttons in config.js and constants.js to make it easier to
  add / remove items
- Add missing invite and toggle-camera buttons to default constants
- Remove no longer existing "fodeviceselection" button

Fixes: https://github.com/jitsi/jitsi-meet/issues/9605
2021-07-26 15:33:38 +02:00
hmuresan
1c8103c444 fix(dropbox-recording) Prevent start recording when no dropbox token 2021-07-26 16:20:05 +03:00
Mihai-Andrei Uscat
4e83e93eb6 fix(virtual-background): Refactor CSS to accommodate smaller screens 2021-07-26 11:57:39 +03:00
Calin Chitu
0f8fa4f059 feat(participants-pane) removed getIsParticipantAudioMuted 2021-07-22 12:54:16 -05:00
Hristo Terezov
becaf0806a fix(ShareDesktopButton): typo. 2021-07-22 11:32:44 -05:00
hmuresan
5b77d722d7 fix(toolbox) add back toggle camera button 2021-07-22 16:20:45 +03:00
hmuresan
f4cde2192e fix(toolbar-buttons) Attempt fix Meet in integration 2021-07-22 16:18:56 +03:00
Hristo Terezov
e91df47d1b fix(ShareDesktopButton): getParticipants reference 2021-07-22 07:37:50 -05:00
robertpin
2d04f3852c fix(reactions) Moved reactions behind feature flag 2021-07-22 13:17:42 +03:00
Mihai-Andrei Uscat
2209394d09 feat(Filmstrip): Collapse filmstrip to avoid toolbar overlap on mobile 2021-07-22 09:37:44 +03:00
Jaya Allamsetty
1e76dc0aa2 chore(deps) lib-jitsi-meet@latest
* feat(JingleSessionPC): Enable unfied plan by default for chrome p2p.
* fix(JingleSessionPC): Fix startMuted cases for p2p unified plan. Chrome doesn't create a decoder for ssrc in the remote description when there is no local source and the endpoint is offerer. Initiating a renegotiation with the endpoint as a responder fixes this issue. Add a workaround until Chrome fixes this bug.
* fix: Missed SSRCs in Unified Plan with several "ssrc-group:FID" groups. (#1658)

e6648fac96...b815157a22
2021-07-21 16:47:12 -04:00
George Politis
75edfc1fab fix: Normalize the tenant part of the URL. (#9577)
This PR normalises the tenant part of the URL. For example, the following URL

    https://jitsi-meet.example.com/something@example.com/something@example.com

is converted to

    https://jitsi-meet.example.com/somethingexample.com/somethingexample.com

whereas before it was converted to

    https://jitsi-meet.example.com/something@example.com/somethingexample.com

i.e. the tenant part was not normalised
2021-07-21 18:48:08 +01:00
Calin Chitu
8c20dd8e47 feat(native-participants-pane) removed everyonemoderator from footer context menu 2021-07-21 12:32:10 -05:00
Calin Chitu
fefe451180 feat(native-participants-pane) updated slider volume private prop 2021-07-21 12:32:10 -05:00
Calin Chitu
b268e01a42 feat(native-participants-pane) rebase, resolved conflicts pt. 2 2021-07-21 12:32:10 -05:00
Calin Chitu
d62e378528 feat(native-participants-pane) rebase, resolved conflicts pt. 1 2021-07-21 12:32:10 -05:00
Calin Chitu
e8ad2365b6 feat(native-participants-pane) rebase and Podfile.lock file updates 2021-07-21 12:32:10 -05:00
Calin Chitu
b7389e1c31 feat(native-participants-pane) implemented review remarks pt.4 2021-07-21 12:32:10 -05:00
Calin Chitu
eeddf6b350 feat(native-participants-pane) fixed lint errors 2021-07-21 12:32:10 -05:00
Calin Chitu
665b7730ee feat(native-participants-pane) implemented review remarks pt. 3 2021-07-21 12:32:10 -05:00
Calin Chitu
7854437e31 feat(native-participants-pane) slider ui fixes 2021-07-21 12:32:10 -05:00
Calin Chitu
600af62945 feat(native-participants-pane) updated podfile 2021-07-21 12:32:10 -05:00
Calin Chitu
88ddb8d9b4 feat(native-participants-pane) volume level state fix 2021-07-21 12:32:10 -05:00
Calin Chitu
5182a720f9 feat(native-participants-pane) volume slider refactoring 2021-07-21 12:32:10 -05:00
Calin Chitu
415562c315 feat(native-participants-pane) updated translations and added throttle for slider 2021-07-21 12:32:10 -05:00
Calin Chitu
53d0a892b5 feat(native-participants-pane) review remarks pt 2 volume slider 2021-07-21 12:32:10 -05:00
Calin Chitu
9b220f3870 feat(native-participants-pane) fixed comment typos and reworks on volume slider 2021-07-21 12:32:10 -05:00
Calin Chitu
c6e50ad439 feat(native-participants-pane) implemented review remarks pt. 1 2021-07-21 12:32:10 -05:00
Calin Chitu
36cb896680 feat(native-participants-pane) resolved rebase conflicts and updated import paths 2021-07-21 12:32:10 -05:00
Calin Chitu
249515ac60 feat(native-participants-pane) removed console.log 2021-07-21 12:32:10 -05:00
Calin Chitu
80b49266ab feat(native-participants-pane) removed unused prop and added onPress condition 2021-07-21 12:32:10 -05:00
Calin Chitu
1afae50923 feat(native-participants-pane) dialog for blocking audio/video 2021-07-21 12:32:10 -05:00
Calin Chitu
b332fb474b feat(native-participants-pane) Updated comments 2021-07-21 12:32:10 -05:00
Calin Chitu
a12ad99ecf feat(native-participants-pane) participants pane open/close fixed 2021-07-21 12:32:10 -05:00
Calin Chitu
400f47963d feat(native-participants-pane) open/close pane native actions 2021-07-21 12:32:10 -05:00
Calin Chitu
65fbc6f256 feat(native-participants-pane) fixed slider error on android 2021-07-21 12:32:10 -05:00
Calin Chitu
e7a324185f feat(native-participants-pane) fixed lint errors 2021-07-21 12:32:10 -05:00
Calin Chitu
14a5c45fa3 feat(native-participants-pane) removed mock data 2021-07-21 12:32:10 -05:00
Calin Chitu
05e6dde341 feat(native-participants-pane) ui fixes 2021-07-21 12:32:10 -05:00
Calin Chitu
e13473d42f feat(native-participants-pane) fixed lint error 2021-07-21 12:32:10 -05:00
Calin Chitu
4b72fefd7e feat(native-participants-pane) created admitAll action 2021-07-21 12:32:10 -05:00
Calin Chitu
ba9398a1e2 feat(native-participants-pane) fixed slider and hid dialog when chat is open 2021-07-21 12:32:10 -05:00
Calin Chitu
8d4cf7165e feat(native-participants-pane) added action dialogs for context menu participant details and native community slider 2021-07-21 12:32:10 -05:00
Calin Chitu
0b3991d9e1 feat(native-participants-pane) context menu for meeting participant 2021-07-21 12:32:10 -05:00
Calin Chitu
47be509d17 feat(native-participants-pane) fixed import order lint error 2021-07-21 12:32:10 -05:00
Calin Chitu
ba64d3e0c8 feat(native-participants-pane) context menu for more btn and reject lobby participant 2021-07-21 12:32:10 -05:00
Calin Chitu
cd05c34d19 feat(native-participants-pane) rendered participant name 2021-07-21 12:32:10 -05:00
Calin Chitu
24550777c6 feat(native-participants-pane) simplified props for hiding header with navigation 2021-07-21 12:32:10 -05:00
Calin Chitu
ee101f8947 feat(native-participants-pane) fixed mute all content styles and added doInvitePeople action 2021-07-21 12:32:10 -05:00
Calin Chitu
8ca85f9e1c feat(native-participants-pane) token updates and added mute all event 2021-07-21 12:32:10 -05:00
Calin Chitu
34ccd56691 feat(native-participants-pane) updated styles for meeting participant list 2021-07-21 12:32:10 -05:00
Calin Chitu
f49c05c666 feat(native-participants-pane) created meeting participant list 2021-07-21 12:32:10 -05:00
Calin Chitu
e7280e5040 feat(native-participants-pane) ui fixes 2021-07-21 12:32:10 -05:00
Calin Chitu
eb1add681f feat(native-participants-pane) admit/reject all buttons 2021-07-21 12:32:10 -05:00
Calin Chitu
8419dc725c feat(native-participants-pane) ui updates for participant item 2021-07-21 12:32:10 -05:00
Calin Chitu
f984faef3f feat(native-participants-pane) first lobbyparticipantlist steps 2021-07-21 12:32:10 -05:00
Calin Chitu
0c76d7532c feat(native-participants-pane) fixed lint errors 2021-07-21 12:32:10 -05:00
Calin Chitu
cb0b68f840 feat(native-participants-pane) removed button component, fixed icons inside paper button component and reverted actions.js files 2021-07-21 12:32:10 -05:00
Calin Chitu
08a4da22f3 feat(native-participants-pane) reverted podfile changes 2021-07-21 12:32:10 -05:00
Calin Chitu
bdd6638067 feat(native-participants-pane) fixed lint errors 2021-07-21 12:32:10 -05:00
Calin Chitu
8b44e06f2c feat(native-participants-pane) separated native actions from web actions and created any actions for the common ones 2021-07-21 12:32:10 -05:00
Calin Chitu
79edc1b358 feat(native-participants-pane) updated styles for button component and participant item related components 2021-07-21 12:32:10 -05:00
Calin Chitu
6597bfc2aa feat(native-participants-pane) added showHeaderWithNavigation prop to JitsiModal and created close button 2021-07-21 12:32:10 -05:00
Calin Chitu
e0a2320d75 feat(native-participants-panel) renamed ParticipantsPanel to ParticipantsPane and created modal 2021-07-21 12:32:10 -05:00
Calin Chitu
81e9fca03b feat(native-participants-panel) created participants panel overflowmenu button 2021-07-21 12:32:10 -05:00
robertpin
76f8302aeb fix(recording-label) Make REC label visible at all times (#9578) 2021-07-21 11:46:49 +03:00
Mihai-Andrei Uscat
7263829763 feat(DominantSpeakerName): Implement 2021-07-21 09:05:47 +03:00
Mihai-Andrei Uscat
b7ab3ea052 fix(Thumbnail, Drawer): Remove hover state; Prevent outside propagation 2021-07-21 09:05:47 +03:00
robertpin
c657f360e1 Fix recording for public access (#9584) 2021-07-21 08:52:04 +03:00
José Luís Andrade
ae5edf5a62 Update toolbarButtons list
Add 'participants-pane' option
2021-07-20 16:57:12 -04:00
hmuresan
2bac757ca6 feat(branding): Add custom avatar backgrounds 2021-07-20 18:56:06 +03:00
robertpin
c10805f81b feat(sound-settings) Added ability to control sounds 2021-07-20 14:56:57 +03:00
robertpin
251eec19cd fix(reactions) Batch events before sending 2021-07-20 14:31:49 +03:00
robertpin
4276f82c03 feat(billing-counter) Removed iframe billing-counter callbacks (#9537)
* Removed iframe billing-counter callbacks

* Moved remaining items to jaas

* Fixed import path

* Removed billingCounter condition

* Use getvpaasTenant in middleware

* Removed billingId

* Path fix

* Removed jwt from isVpaasMeeting

* Fix isVpaas
2021-07-20 11:58:42 +03:00
Jaya Allamsetty
4c3aae1e28 chore(deps) lib-jitsi-meet@latest
* fix(TPC): Fix the screenshare issue when user starts video muted on chrome. Munge 3 ssrcs in the SDP for chrome in unified plan always for the simulcast case.

053a26604d...e6648fac96
2021-07-19 12:17:20 -04:00
Tudor-Ovidiu Avram
12be14bd4b fix(jaas) do not deeplink jaas users on default 8x8 app scheme 2021-07-16 17:05:21 +03:00
Tudor-Ovidiu Avram
420a7d8110 fix(jaas) fix vpaas condition 2021-07-16 15:49:57 +03:00
hmuresan
17f77a4246 fix(support-url): Hide contact support button when SUPPORT_URL is empty
- fix issue on error notification on invite contacts
2021-07-16 14:53:26 +03:00
hmuresan
6f9944a2d0 fix(iOS-mailto): Send no new line invite on default email
- addresses this issue: https://developer.apple.com/forums/thread/681023
2021-07-16 13:27:29 +03:00
Avram Tudor
73328810e4 fix(jaas) hide chrome banner regardless of jwt (#9565) 2021-07-16 13:17:28 +03:00
tudordan7
bb8c30a6c9 fix(virtual-background): Add logs on virtual background actions. 2021-07-16 10:31:35 +03:00
Hristo Terezov
c5438ecd0c fix(AOT): participant selection. 2021-07-15 18:03:17 -05:00
Jaya Allamsetty
e22a25b216 chore(deps) lib-jitsi-meet@latest
* fix(JingleSessionPC): Disable unified-plan for p2p chrome. Do not enable unified plan for p2p chrome by default until StartMutedTest is fixed. Fix media direction for case when there are no local and remote sources, should be set to 'inactive' in that case.

3a313a244d...053a26604d
2021-07-15 18:03:24 -04:00
Дамян Минков
4075e5deb7 fix: Fix speakerstats reports. 2021-07-15 17:03:05 +03:00
robertpin
ea0d953d1c feat(reactions-webhook) Added reactions backend call for webhook (#9534)
* Added backend call for reactions webhook

* Updated webhook url

* Fixed linting error

* Code review fixes

* Fixed linting errors
2021-07-15 15:23:48 +03:00
hmuresan
b3e03fe50c fix(aot): Remove dependency to translate from StatelessAvatar.js
- translate uses interfaceConfig object which does not exist in AOT context
2021-07-15 14:57:33 +03:00
Mircea Sotan
8f81a75a61 fix(android): Fix install error on application compiled against Android S - Targeting S+ (version 10000 and above) requires that an explicit value for android:exported be defined when intent filters are present 2021-07-15 14:48:46 +03:00
Tudor-Ovidiu Avram
0ab905bf75 code review 2021-07-15 14:44:28 +03:00
Tudor-Ovidiu Avram
5a3607f63f fix*(jaas) redirect to plan limit page on connection failed 2021-07-15 14:44:28 +03:00
Дамян Минков
d57e202d19 chore(deps) lib-jitsi-meet@latest
* fix(codec-selection): Fix VP9 codec switching issue in Chrome unified-plan. Munge only the m-line that corresponds to the source that the browser will be sending. Do not select VP9 on Firefox. Detect support for RTCRtpTransceiver#setCodecPreferences correctly.

89a7e2d9cd...3a313a244d
2021-07-15 13:12:53 +03:00
robertpin
1223c63f69 fix(reactions) Updated list of reactions & disabled incoming message sound (#9550)
* Changed reactions

* Disable incoming message sound on reactions
2021-07-15 10:26:27 +03:00
tmoldovan8x8
25b4887f74 chore(rn): set mobile SDK versions 3.7.0 2021-07-15 09:36:41 +03:00
Avram Tudor
e8ee65db82 fix(jaas) always hide chrome banner (#9546) 2021-07-14 16:16:21 +03:00
Дамян Минков
9956ca6551 chore(deps) lib-jitsi-meet@latest
* fix(RTC): In unified-plan mode, disable the low resolution streams for low fps SS. In unified plan impl, it is not possible to enable/disable simulcast during the call since the same sender is re-used for all local video tracks. Therefore, disable the low resolution simulcast streams for low fps screensharing so that the bridge forwards only the highest resolution stream which is important for low fps screensharing.

f974007ca6...89a7e2d9cd
2021-07-14 16:11:46 +03:00
Calin Chitu
03a96d0be2 fix(css) moved to the left moderation text 2021-07-14 11:47:46 +03:00
Дамян Минков
3fa7c01f19 chore(deps) lib-jitsi-meet@latest
* fix(JingleSessionPC): Do not check if the ssrc already exists in the RD when adding a ssrc-group from source-add.
* feat: Switch to unified plan on chrome by default unless explicitly disabled.
* fix(VADAudioAnalyser): NPE error evaluating this._vadEmitter.on (#1652)
* Small fix in tokens doc.

b43a9fa0ee...f974007ca6
2021-07-14 11:47:37 +03:00
Avram Tudor
5cba6c7bc7 fix(jaas) fix jaas customer details endpoint (#9542) 2021-07-14 11:26:04 +03:00
tudordan7
52ee9b5151 fix(virtual-background): Prevent memory leak when desktop share as a virtual background is applied. 2021-07-13 17:30:29 +03:00
SiderealArt
d5f379a97c Update Traditional Chinese translation 2021-07-13 15:58:51 +03:00
SiderealArt
84cdd31731 Update Traditional Chinese translation 2021-07-13 12:54:52 +03:00
MaikHannemann
b7eba915af Added missing german translation 2021-07-13 12:54:38 +03:00
José Luís Andrade
7d0722c031 Update of the translation to portuguese language 2021-07-13 12:54:27 +03:00
robertpin
7d3953de51 Fixed (#9533) 2021-07-13 11:55:07 +03:00
robertpin
601ee219e7 feat(reactions) Added Reactions (#9465)
* Created desktop reactions menu

Moved raise hand functionality to reactions menu

* Added reactions to chat

* Added animations

* Added reactions to the web mobile version

Redesigned the overflow menu. Added the reactions menu and reactions animations

* Make toolbar visible on animation start

* Bug fix

* Cleanup

* Fixed overflow menu desktop

* Revert mobile menu changes

* Removed unused CSS

* Fixed iOS safari issue

* Fixed overflow issue on mobile

* Added keyboard shortcuts for reactions

* Disabled double tap zoom on reaction buttons

* Refactored actions

* Updated option symbol for keyboard shortcuts

* Actions refactor

* Refactor

* Fixed linting errors

* Updated BottomSheet

* Added reactions on native

* Code cleanup

* Code review refactor

* Color fix

* Hide reactions on one participant

* Removed console log

* Lang fix

* Update schortcuts
2021-07-13 09:50:08 +03:00
tudordan7
8db3a341b3 fix(virtual-background): Set x scale to default value on desktop share as a virtual background deactivation. 2021-07-12 15:32:58 +03:00
Tudor D. Pop
8d562b9d59 fix(share-youtube-video): Validate youtube url. 2021-07-09 10:16:35 -04:00
damencho
80e2c05219 fix(av-moderation): Fixes sending wrong whitelist in json. 2021-07-09 15:41:08 +03:00
Hristo Terezov
0bdc7d42c5 feat: Participants optimisations (#9515)
* fix(participants): Change from array to Map

* fix(unload): optimise

* feat: Introduces new states for e2ee feature.

Stores everyoneSupportsE2EE and everyoneEnabledE2EE to minimize looping through participants list.

squash: Uses participants map and go over the elements only once.

* feat: Optimizes isEveryoneModerator to do less frequent checks in all participants.

* fix: Drops deep equal from participants pane and uses the map.

* fix(SharedVideo): isVideoPlaying

* fix(participants): Optimise isEveryoneModerator

* fix(e2e): Optimise everyoneEnabledE2EE

* fix: JS errors.

* ref(participants): remove getParticipants

* fix(participants): Prepare for PR.

* fix: Changes participants pane to be component.

The functional component was always rendered:
`prev props: {} !== {} :next props`.

* feat: Optimization to skip participants list on pane closed.

* fix: The participants list shows and the local participant.

* fix: Fix wrong action name for av-moderation.

* fix: Minimizes the number of render calls of av moderation notification.

* fix: Fix iterating over remote participants.

* fix: Fixes lint error.

* fix: Reflects participant updates for av-moderation.

* fix(ParticipantPane): to work with IDs.

* fix(av-moderation): on PARTCIPANT_UPDATE

* fix(ParticipantPane): close delay.

* fix: address code review comments

* fix(API): mute-everyone

* fix: bugs

* fix(Thumbnail): on mobile.

* fix(ParticipantPane): Close context menu on click.

* fix: Handles few error when local participant is undefined.

* feat: Hides AV moderation if not supported.

* fix: Show mute all video.

* fix: Fixes updating participant for av moderation.

Co-authored-by: damencho <damencho@jitsi.org>
2021-07-09 15:36:19 +03:00
Tudor D. Pop
d87a40e77e fix(virtual-background): Style adjustments on virtual background dial… (#9484)
* fix(virtual-background): Style adjustments on virtual background dialog on small screens.

* fix(virtual-background): Style adjustments on virtual background dialog on small screens.

Co-authored-by: tudordan7 <tudor.pop@decagon.tech>
2021-07-09 10:26:55 +03:00
robertpin
bad58f6508 feat(JaaS-JWT) Get JWT for JaaS (#9512)
* Added get JWT for JaaS

* Code review fix
2021-07-09 09:30:49 +03:00
Hristo Terezov
dc60418613 fix(settings): imports that break mobile. 2021-07-09 06:56:14 +03:00
hmuresan
f2f545a57f fix(connection-indicator) Fix detecting local/remote participant 2021-07-08 20:28:39 +03:00
Tudor D. Pop
d72b27d46d fix(virtual-background): Fix mirror behavior for remote participants. 2021-07-08 13:20:12 -04:00
Hristo Terezov
e1fef8d848 fix(tile-view): when iAmRecorder=true. 2021-07-08 09:06:53 -05:00
Mihai-Andrei Uscat
33f1199fc8 fix(Filmstrip): Fix scrollbars around filmstrip (#9519) 2021-07-08 16:43:15 +03:00
Avram Tudor
62c78950cd feat(toolbox) allow any toolbox button to be displayed in main toolbar (#9488)
* feat(toolbox) allow any toolbox button to be displayed as main

fixes the previous behaviour where only a certain set of buttons were whitelisted for being displayed in the main toolbar

* code review

* code review - fix avatar icon position
2021-07-08 16:42:07 +03:00
Jaya Allamsetty
074a783bd9 feat: Enable unified plan support for p2p chrome calls. 2021-07-07 14:55:07 -04:00
Andrei Gavrilescu
da7358d564 feat(audio-screen-share): improved ux flow (#9411)
* add button state / helper dialog

* new audio screen share flow

* change error message

* address a couple of merge conflicts

* fix lint

* address code review

* address code review

* restrict audio screen share on mobile browsers
2021-07-07 11:07:30 +03:00
robertpin
58ef72dce5 fix(feedback-dialog) Removed mouseover on mobile 2021-07-07 10:32:59 +03:00
Jaya Allamsetty
7f44442b21 chore(deps) lib-jitsi-meet@latest
* fix(TPC): Do not remove ssrcs from remote desc for p2p. In unified plan, re-use of m-line (i.e., adding an SSRC, removing it and then adding it back) causes the browser to not render the media on Chrome and Safari. The WebRTC spec is not clear as to how browsers have to behave, this doesn't cause any issues on Firefox. As a workaround, only change the media direction and leave the ssrc in the remote desc. This automatically triggers a 'removetrack' event on the associated MediaStream and the track can be removed from the UI.
* Drops old prosody versions from the tokens instructions

0cdfb79c2e...b43a9fa0ee
2021-07-06 14:27:09 -04:00
hmuresan
b995221a2b feat(thumbnails) Add changes to mobile context menu
- long touch on thumbnail opens context menu
- hide context menu icon
- add button for connection info to context menu
2021-07-06 16:46:53 +03:00
Avram Tudor
0507f8c2f9 feat(api) expose follow me method (#9486) 2021-07-06 14:37:31 +03:00
Felix Wolfsteller
df1561c198 fix(config) document useRoomAsSharedDocumentName 2021-07-05 09:38:51 +02:00
Calin Chitu
ae9bea1a0c fix(av-moderation) added optional chaining for moderation enabling 2021-07-01 16:41:37 +03:00
robertpin
2174368d23 Exposed preferredCodec 2021-06-30 15:55:49 +03:00
Avram Tudor
abc984f83b fix(css) fix various layout issues on small screen sizes (#9464) 2021-06-30 12:01:47 +03:00
Jaya Allamsetty
d9bfeecb5b chore(deps) lib-jitsi-meet@latest
* fix(VAD): Do not enable VAD on Chrome on iOS.

229015a6f3...0cdfb79c2e
2021-06-29 10:14:52 -04:00
robertpin
24503c3bd3 feat(config) Added option to remove Show More link from GSM popover
* Whitelisted enableSaveLogs

* Added config option to hide Show More on GSM popover

* Updated config option
2021-06-29 16:42:23 +03:00
Victor de Francisco
d4c7fc8a72 Include support for translated string resources at device permission dialog because it contains hardcoded english strings. 2021-06-29 15:58:14 +03:00
Mohd Bilal
5fcd5ff17b added more translations 2021-06-29 11:04:41 +03:00
AndreRochaV
62bb259182 Changes to the Brazilian Portuguese translation
Adding some more interface translation from main.json, specifically, the participants button, participants pane and virtual background selection dialog window
2021-06-29 11:04:33 +03:00
José Luís Andrade
027e1ba978 lang: Update of the translation to portuguese language (#9432)
* Update main-pt.json

Update of the translation to portuguese language - "dialog": { ... }

* Update main-pt.json

Update "videoLink" translation

* Update main-pt.json

Added more translation: "toolbar": {...}
2021-06-29 11:04:22 +03:00
Besnik Bleta
a866be787f Update for sq translation (#9449)
* Adding sq translation

* Adding sq to languages.json

* Updating sq translation

* Fixing missing commas and updating string changes

* Fixing unclosed quotes
2021-06-28 16:22:36 +03:00
Mejans
0381f714fc Update Occitan locale (#9453)
* Update languages-oc.json

* Update main-oc.json
2021-06-28 16:22:14 +03:00
Longhao.Chen
5d6e88b53a Update main-zhCN.json 2021-06-28 16:22:03 +03:00
Jaya Allamsetty
a8044c43e2 chore(deps) lib-jitsi-meet@latest
* squash: Set capScreenShareBitrate flag every time a new pc is created.
* feat(RTC): Add the ability to change desktop share fps. Provide a method for changing the capture fps for desktop tracks during the call. These changes to the lib are needed for making it configurable from the UI.

46ec23fcdc...229015a6f3
2021-06-28 08:56:12 -04:00
Andrei Gavrilescu
13f9299921 fix(external-api): update settings on api device change 2021-06-28 14:51:40 +03:00
Tudor-Ovidiu Avram
c356c2360c fix(build) split jaas actions 2021-06-28 14:18:16 +03:00
Avram Tudor
01867ed343 fix(build) add missing file for native builds (#9461) 2021-06-28 12:56:34 +03:00
Jaya Allamsetty
765fbe5e1d feat: Change the screenshare capture fps from UI. (#9438)
* feat: Change the screenshare capture fps from UI.
Add the ability to change the capture frame rate for screenshare from the UI. The fps becomes effective only on screen shares that are started after the setting is changed.

* squash: add missing JSDOCs and translations for frames-per-second.
2021-06-28 10:48:16 +03:00
Avram Tudor
ea56010e09 feat(jaas) display messages about features that are disabled for jaas… (#9448)
* feat(jaas) display messages about features that are disabled for jaas users

* code review
2021-06-25 16:28:54 +03:00
hmuresan
38b14c5d62 chore(replace-participant) Send readyToClose event when a replaced participant is kicked
- the embedding app can decide to dispose the iframe in this case
2021-06-25 14:42:26 +03:00
Tudor D. Pop
74d65ff596 fix(virtual-background): Fix resize action and prevent mirror behavio… (#9441)
* fix(virtual-background): Fix resize action and prevent mirror behaviour on desktop share as a virtual background.
Co-authored-by: tudordan7 <tudor.pop@decagon.tech>
2021-06-24 11:21:34 -04:00
hmuresan
1d45edbb27 feat(external-api): Add send chat message command 2021-06-24 13:15:53 +03:00
Calin Chitu
7945f14cee fix(chat) removed unread msgs counter on chat open 2021-06-24 13:15:01 +03:00
lala
35c7f156db fix(i18n): LocaleDetector should consider the language tag 2021-06-24 12:41:17 +03:00
Vlad Piersec
f82d46337b (fix): Do not allow external css customization for static prejoin
This prevents CSS spoofing.
2021-06-24 10:21:08 +03:00
Hristo Terezov
07a69ba040 fix(pagination): keys 2021-06-23 16:57:26 -05:00
Hristo Terezov
2d319d18c3 feat: request video only for visible thumbnails. 2021-06-23 16:57:26 -05:00
Hristo Terezov
16cfda3c7a feat(Filmstrip): Pagination. 2021-06-23 16:57:26 -05:00
Дамян Минков
64ae9c7953 feat: UI part for A/V moderation. (#9195)
* feat: Initial UI part for A/V moderation.

Based on https://github.com/jitsi/jitsi-meet/pull/7779

Co-authored-by: Gabriel Imre <gabriel.lucaci@8x8.com>

* feat: Hides context menu in p2p or only moderators in the meeting.

* feat: Show notifications on enable/disable.

* feat(moderation): Add buttons to participant list & notifications

* fix(moderation): Fix raised hand participant leaving

* feat(moderation): Add support for video moderation

* feat(moderation): Add mute all video to context menu

* feat(moderation): Redo participants list 'More menu'

* fix: Fixes clearing av_moderation table.

* fix: Start moderation context menu

* fix(moderation): Show notification if unapproved participant tries to start CS

Co-authored-by: Gabriel Imre <gabriel.lucaci@8x8.com>
Co-authored-by: Vlad Piersec <vlad.piersec@8x8.com>
2021-06-23 14:23:44 +03:00
Vlad Piersec
3e8f725c62 fix(vpaas): Don't show recording link to initiator if saving on dropbox 2021-06-23 14:20:27 +03:00
Calinteodor
2a9b3dc1b2 fix(keyboardshortcut) spacebar release mutes participant (#9434)
* fix(keyboardshortcut) spacebar release mutes participant

* fix(keyboardshortcut) removed extra check
2021-06-23 11:53:23 +03:00
Calinteodor
487da8f231 fix(lobby) disable invite from lobby screen fix #9209 (#9417)
* fix(lobby) disable invite from lobby screen fix #9209

* fix(lobby) destructered props fix #9209

* fix(lobby) changed const name fix #9209

* fix(lobby) added empty line fix #9209
2021-06-22 20:07:57 +03:00
hmuresan
804d14e112 feat(did-page) Handle SIP number on did info page 2021-06-22 17:25:34 +03:00
damencho
53cea31bb8 fix: Clear prosody utils and removes a debug statement. 2021-06-22 09:44:26 +03:00
damencho
e6cdeb31ff feat: Optimizes speaker stats to skip occupants with 0 talk time.
Skips adding focus user and skips sending an empty message.
Keep sending participant info for those left the room, to keep existing behaviour.
2021-06-22 09:44:26 +03:00
damencho
60db81f31c chore: Updates mod_smacks.lua version to latest.
https://hg.prosody.im/prosody-modules/rev/f6f28ceff53a
2021-06-22 09:44:26 +03:00
Jaya Allamsetty
0e6addbfad chore(deps) lib-jitsi-meet@latest
* fix(RTC): Do not overwrite other constraints when resolution option is used. When the resolution option was being used, all the other constraints like frameRate and facing mode were being overwritten.

24627e1b95...46ec23fcdc
2021-06-21 12:16:05 -04:00
Hristo Terezov
0a37ef7d46 fix(VirtualBackgroundDialog): SS on electron. 2021-06-21 17:12:51 +03:00
José Luís Andrade
f2361f91df lang: Update of the translation to portuguese language (#9392)
* Update main-pt.json

Update of the translation to portuguese language of Portugal

* Update main-pt.json

I added a comma
2021-06-21 15:42:56 +03:00
vp8x8
3d83847e4b feat(vpaas, recording): Show recording link to recording initiator (#9362)
* feat(vpaas, recording): Show recording link to recording initiator

This applies only for jaas users for now but is easily extensible.
Changed the recording sharing icon according to ui design.

* fix(vpaas, recording): Guard for deployment info
2021-06-21 11:36:18 +03:00
SiderealArt
993b6ba4f2 Update main-zhTW.json 2021-06-21 11:36:08 +03:00
Mikel Larreategi
22c640347a complete EU translation 2021-06-21 11:35:59 +03:00
Hamza KHAIT
db5ccc943c Updating French Translation 2021-06-21 11:35:39 +03:00
Zanderlan
04a5e26096 i18n: ptBR: new translation 2021-06-21 11:35:26 +03:00
Jaya Allamsetty
e10e9a5fec chore(deps) lib-jitsi-meet@latest
* fix: Send videoType bridge message for mute/unmute on FF. (#1642)

d5e60583b8...24627e1b95
2021-06-18 12:07:07 -04:00
Tudor D. Pop
dc776d209c fix(virtual-background): Prevent virtual background selection if it h… (#9414)
Co-authored-by: tudordan7 <tudor.pop@decagon.tech>
2021-06-18 10:18:05 -04:00
Tudor D. Pop
2ed2a8d41f fix(wasm-support): WebAssembly browser support. (#9410)
* fix(wasm-support): WebAssembly browser support.

* fix(wasm-support): WebAssembly browser support.

Co-authored-by: tudordan7 <tudor.pop@decagon.tech>
2021-06-17 09:03:39 -05:00
damencho
be73ed9d19 fix: Checks all parts while parsing config params. 2021-06-16 14:15:44 -05:00
Calinteodor
f991a93afd fix(toolbox) Copying with Ctrl+C toggles the chat. Fixes #9380 2021-06-16 11:36:36 -05:00
tmoldovan8x8
0bd45a75d2 feat(replace-participant): Add replaceParticipant feature-flag 2021-06-16 14:08:18 +03:00
Jaya Allamsetty
f560eecfa9 chore(deps) lib-jitsi-meet@latest
* fix(TPC): Filter ssrcs differently while extracting the SSRC map from SDP. Use 'msid' for plan-b clients and 'cname' for unified-plan clients.

fad985e95a...d5e60583b8
2021-06-15 12:41:10 -04:00
Avram Tudor
34bc3c9533 Merge pull request #9395 from jitsi/tavram/invert-flag
fix(api) invert filmstrip autohide flag
2021-06-15 16:25:48 +03:00
Tudor-Ovidiu Avram
2eedc2945d fix(api) invert filmstrip autohide flag 2021-06-15 16:09:01 +03:00
hmuresan
342dd4ceca feat(replace-participant): Replace participant with same jwt in the conf
- update lib-jitsi-meet to version with support for replacing participant
2021-06-15 14:24:12 +03:00
Calinteodor
60188794b5 fix(authentication) language display problem resolved #9385 (#9390) 2021-06-14 08:03:27 -05:00
hmuresan
cafefecea5 feat(external_api) Expose command for toggling background dlg 2021-06-14 14:33:34 +03:00
Avram Tudor
9d22da823e Merge pull request #9368 from jitsi/tavram/mousemove
feat(api) expose event for mouse movements inside the iframe
2021-06-14 11:22:22 +03:00
Tudor-Ovidiu Avram
b2985934f7 fix(share-video) fix backwards compatibility issue 2021-06-11 08:37:01 -05:00
tmoldovan8x8
51a996d0e0 fix(rn): adds check for blur function on currentTarget 2021-06-11 13:53:10 +03:00
Jaya Allamsetty
2549f83313 chore(deps) lib-jitsi-meet@latest
* fix(TPC): fix local resolution/fps stats. Browsers do not generate a 'msid' attribute for ssrcs in unified plan mode, use mediaType as a key for the TrackSSRCInfo map.
* fix(recording): Send participant id when recording starts/stops (#1632)

8057f12a39...2259d44185
2021-06-10 17:42:33 -04:00
Tudor-Ovidiu Avram
6b095b9794 feat(api) allow always hiding remote videos for 1-1 calls 2021-06-10 13:43:23 -05:00
SiderealArt
d4b6ac6c3a Update languages-zhTW.json 2021-06-10 13:35:28 -05:00
SiderealArt
e6b5deade2 Fix Thailand to Thai 2021-06-10 13:35:16 -05:00
Tudor-Ovidiu Avram
7f04767566 feat(api) expose event for mouse movements inside the iframe 2021-06-10 17:45:28 +03:00
Steffen Kolmer
e9675453e1 feat: Make Jitsi WCAG 2.1 compliant (#8921)
* Make Jitsi WCAG 2.1 compliant

* Fixed password form keypress handling

* Added keypress handler to name form

* Removed unneccessary dom query

* Fixed mouse hove style

* Removed obsolete css rules

* accessibilty background feature

* Merge remote-tracking branch 'upstream/master' into nic/fix/merge-conflicts

* fix error

* add german translation

* Fixed merge issue

* Add id prop back to device selection

* Fixed lockfile

Co-authored-by: AHMAD KADRI <52747422+ahmadkadri@users.noreply.github.com>
2021-06-10 07:48:44 -05:00
Avram Tudor
76f1fe8457 Merge pull request #9374 from jitsi/tavram/config-autohide-filmstrip
feat(api) allow filmstrip autohide to be configurable
2021-06-10 12:44:37 +03:00
Tudor-Ovidiu Avram
a1e8f36f4f feat(api) allow filmstrip autohide to be configurable 2021-06-10 12:12:01 +03:00
Avram Tudor
1d4e40b49f Merge pull request #9371 from alexbumbu/fix_deeplinking
fix(vpaas) enable deeplinking
2021-06-10 11:33:55 +03:00
Jaya Allamsetty
440e7844c8 chore(deps) lib-jitsi-meet@latest
* fix(connectivity): Fix video freezes on Safari when ep goes out of last-n.

a1b870c616...8057f12a39
2021-06-09 18:32:55 -04:00
alittriutari
a3a9eab57a Update main-ja.json 2021-06-09 12:54:07 -05:00
Alex Bumbu
e2a4d0d42d fix(vpaas) enable deeplinking 2021-06-09 17:46:56 +03:00
Vlad Piersec
913d7e89dd feat(participants-pane): Add 'admit all' knocking participants button 2021-06-09 16:28:31 +03:00
Vlad Piersec
db9b8784ac fix(participants-pane): Don't show 'grant moderator' action if already moderator 2021-06-09 15:09:05 +03:00
Mihai-Andrei Uscat
a564ce581d fix(DeviceSelection): Remove video from mobile Safari 2021-06-09 09:22:16 +03:00
Jaya Allamsetty
3917c5b283 chore(deps) lib-jitsi-meet@latest
* Don't accept p2p call on FF/Safari.

d9d9b7fc31...a1b870c616
2021-06-08 17:07:42 -04:00
Jaya Allamsetty
ccdab94ee8 chore(deps) lib-jitsi-meet@latest
* fix(RTC): Adjust the media direction for p2p conn. For p2p connections, the media direction needs to be adjusted after every source-add/source-remove is processed based on the availability of local sources.
* fix(RTC): Use a enum for media direction.

5738c80baf...d9d9b7fc31
2021-06-08 14:52:07 -04:00
damencho
4fc9aed708 fix: Fixes playing muted youtube video.
If we mute a video in Youtube it is stored in the current browser session and if someone shares a video it will start muted and we don't have the control to unmute it.
2021-06-07 11:56:46 -05:00
damencho
5f657a7d6c fix: Fixes selecting screen share when shared video stopped. 2021-06-07 11:56:46 -05:00
damencho
37e7919fd1 fix: Fixes import warnings. 2021-06-07 11:56:46 -05:00
damencho
4ace04e63c fix: Stops auto pinning if shared video is playing. 2021-06-07 11:56:46 -05:00
titus.moldovan
cb2891ead3 feat(e2ee): shows E2EESection only when user is moderator 2021-06-07 16:28:57 +03:00
titus.moldovan
093d8f830a feat(e2ee): broadcast e2ee disabled 2021-06-07 16:28:57 +03:00
Jaya Allamsetty
2ca4dd3755 chore(deps) lib-jitsi-meet@latest
* fix(JingleSessionPC): Disable unified-plan for p2p. Disable cross browser p2p using unified plan until all the issues are fixed.

0993c8e93d...5738c80baf
2021-06-04 13:55:41 -05:00
damencho
52279d0a2a chore(deps) lib-jitsi-meet@latest
* fix(moderation): Unmuting after av moderation and no track.

ab12f212d5...0993c8e93d
2021-06-04 12:12:44 -05:00
damencho
65642d20e4 chore(deps) lib-jitsi-meet@latest
* fix(moderation): Fixes detecting av moderation approved.

a2560f9519...ab12f212d5
2021-06-03 18:21:20 -05:00
HippyJim
8dbb392d85 CLOSE_CHAT action calls notifyChatUpdated with the isOpen flag set to false, previously was always true even when closing 2021-06-03 12:29:02 -05:00
Christoph Settgast
1b200abaa7 fix(participants) do not preload gravatars if config is empty
Previously gravatars (external resources) were preloaded even if
disableThirdPartyRequests was set to true in the config, as the
config may be empty at the time of preloading.

Closes: #5670
Signed-off-by: Christoph Settgast <csett86@web.de>
2021-06-02 15:24:33 -05:00
damencho
06ce24527e fix: Escapes some keys when parsing input. 2021-06-02 15:24:13 -05:00
VolodyaKalashnikov
e05d53e71a main-uk.json Update
Added more support of Ukrainian language
2021-06-02 13:41:05 -05:00
damencho
acdde6f1f5 fix: Skips check on domain verification disabled. Fixes #9313. 2021-06-02 11:50:26 -05:00
Aaron van Meerten
81c4e9a7fd fix: prosody: token alg is checked before public key is used 2021-06-02 11:50:16 -05:00
kychen
fb144a55a3 i18n: zhTW: new translation (#9293)
* i18n: zhTW: new translation

* Fixed the proper semantic of toolbar.hangup

* i18n: zhTW: new translation

* Fixed the proper semantic of speaker related strings

* i18n: zhTW: new translation

* Added startupoverlay.genericTitle
2021-06-02 11:50:04 -05:00
Pierre Ozoux
de2cdb1d6c Fixes typo. (#9315) 2021-06-02 11:49:55 -05:00
Shawn Chin
0d7ec9552b Hide invite button in participant panel if disabled in config (#9287)
* Hide invite button in participant panel if disabled in config

* match code style, fix lint errors
2021-06-02 11:49:44 -05:00
damencho
e5a3f8505e chore(deps) lib-jitsi-meet@latest
* fix(Sdp): Fix maxaveragebitrate typo

3fb44f7695...a2560f9519
2021-06-02 10:30:29 -05:00
Vlad Piersec
fdbf526b60 fix(video-filmstrip): Place filmstrip videos over toolbar 2021-06-02 06:54:29 -05:00
hmuresan
bb5f589fa1 fix(feedback): don't wait for feedback submission on leave meeting 2021-06-02 06:53:59 -05:00
tudordan7
839f632af6 fix(virtual-background): Responsive virtual background preview. 2021-06-02 06:51:44 -05:00
damencho
737d542ca8 fix: Fixes av moderation logic when granting moderator. 2021-06-02 09:38:25 +03:00
Jaya Allamsetty
eff1d13d21 fix(config): Add config for enabling unified-plan support on chromium. 2021-06-01 14:30:49 -04:00
Jaya Allamsetty
870d847f5f chore(deps) lib-jitsi-meet@latest
* fix(LocalSdpMunger): Fix unit test.
* fix(CodecSelection): Call RTCRtpTransceiver#setCodecPreferences before renegotiation. Call RTCRtpTransceiver#setCodecPreferences with the preferrred codec order before every createOffer/createAnswer. This ensures that the codec preference is enforced even when there is no local description available yet while the preferred codec is being set immediately after media session creation.
* fix(JingleSessionPC): Add a workaround for chrome issue. The 'signalingstatechange' event for 'stable' is fired after the 'iceconnectionstatechange' event for 'completed' is fired on chrome in Unified plan. This prevents the client from switching the media connection to the p2p connection once the ice connection for p2p gets established.
* fix(Logging): Log enhancements. Add a preifx to logs for idenitifying the type of TPC/jingleSessionPC.
* feat(TPC): Enable unified-plan support for Chromium based browsers. This can be controlled through the config.js  option 'enableUnifiedOnChrome'.
* fix(TPC): Do not configure encodings on Safari until reneg. Avoid configuring the encodings on Chromium/Safari until simulcast is configured for the newly added track using SDP munging which happens during the renegotiation.
* fix(TPC): Do not configure encodings on chromium immediately after replace track. Avoid configuring the encodings on chromium immediately after replace track since the encoding params are read-only until the renegotation is done.
* fix: send json message (#1180)

be3e2a69f2...3fb44f7695
2021-06-01 13:54:50 -04:00
tmoldovan8x8
f84f7332b9 chore(rn,versions): set mobile SDK versions 2021-05-31 11:20:14 +03:00
Andrei Bora
27481f0270 Allow both regex and normal check for the room name 2021-05-27 13:37:24 -05:00
Alex Bumbu
724391648e fix(ScreenShare): remove listener for native events when app unmounts 2021-05-27 16:53:20 +03:00
Julian1203
9a8b5551be Update main-de.json
Small improvements
2021-05-26 17:12:18 -05:00
Jaya Allamsetty
b39e5968bf chore(deps) lib-jitsi-meet@latest
* fix(SDP): Add missing msid for p2p sources.
* fix(TPC): Don't convert plan-b<->unified-plan SDPs for p2p.
* squash: Implement review comments.
* fix(JingleSessionPC): Do not try to re-use inactive mid for new remote ssrcs. The direction was marked as 'inactive' only on Firefox as Safari had audio issues when an inactive mid is re-used. Chrome (in unified-plan) needs the direction of the mid in remote desc to be set to 'inactive' for a 'removetrack' to be fired on the associated media stream whenever a remote source is removed.
* fix(SDP): Drop SSRCs whenever the transceiver direction is 'inactive' or 'recvonly'. This is needed only for JVB connections. Add unit tests for LocalSdpMunger.
* fix: Ignore startAudioMuted/startVideoMuted for p2p. The tracks will not be added when the call switches from jvb to p2p for an endpoint that joins muted by focus.
* fix(RTC): Do not suppress the source updates on Firefox. If the msid attribute is missing, then remove the ssrc from the transformed description so that a source-remove is signaled to Jicofo. This happens when the direction of the transceiver (or m-line) is set to 'inactive' or 'recvonly' on Firefox. Not signaling these source updates creates issues with remote track handling on the other endpoints in the call.
* fix(RTC): Set transceiver direction after RTCRtpSender#replaceTrack. This fixes the issue where TRACK_REMOVED event is not fired when a remote track is removed from the peerconnection. Fixes https://github.com/jitsi/lib-jitsi-meet/issues/1612 and https://github.com/jitsi/jitsi-meet/issues/8482.

60c5667957...be3e2a69f2
2021-05-26 16:51:18 -04:00
tudordan7
c0917f87ae feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
06c527b6fe feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
7f020a1107 feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
748a84eeef feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
f5dd848daf feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
4872ce83ba feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
99f61ca2cd feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
dffe2316d4 feat(virtual-background): Desktop share as virtual background wip 2021-05-26 12:36:29 -04:00
tudordan7
72cd3d70e1 feat(virtual-background): Desktop share as virtual background wip 2021-05-26 12:36:29 -04:00
tudordan7
04a464dfee feat(virtual-background): Desktop share as virtual background wip 2021-05-26 12:36:29 -04:00
tudordan7
be0632783d feat(virtual-background): Desktop share as virtual background wip 2021-05-26 12:36:29 -04:00
damencho
15c08f90c4 feat: Adds new module to unlimit jicofo and jvb connections.
In case limited those connection will be whitelisted and unlimited. Updates existing configurations to make sure prosody update will not break it by limiting too much.

Uses 28c16c93d79a version of the module: https://modules.prosody.im/mod_limits_exception.html
Will be available in prosody 0.12.
2021-05-26 11:17:25 -05:00
Calinteodor
c4677be87a fix(authentication): removed cancel event from overlay effect (#9274)
* fix(authentication) resolved #9263 issue

* fix(authentication) hide dialog close icon

* fix(authentication) fixed lint error about missing prop
2021-05-26 11:15:35 -05:00
Jaya Allamsetty
2fdf1a9165 chore(deps) lib-jitsi-meet@latest
* fix(caps): Disable TCC on Firefox. There is a known issue with Firefox where the BWE gets halved on every renegotiation causing the low upload bitrates from the Firefox clients.
* fix: Drops unused config, fixes jitsi/lib-jitsi-meet#1620.
* fix(e2ee): destroys olm session on disabling e2ee

f95a455c08...60c5667957
2021-05-26 11:32:48 -04:00
tmoldovan8x8
06110d1dfb task(rn): hide screen share button when audioOnly mode 2021-05-26 11:43:24 +03:00
Hristo Terezov
8d25950d98 fix(AudioTrack): _play promise chain 2021-05-25 20:11:15 -05:00
hmuresan
aea09a8da3 Send feedback metadata to JaaS feedback endpoint 2021-05-25 20:37:56 +03:00
Mihai-Andrei Uscat
01a127b557 fix(SharedVideo): Ensure shared video takes filmstrip into account 2021-05-25 12:55:57 +03:00
Hristo Terezov
574994607c feat(AudioTrack): retries for play() 2021-05-24 17:16:04 -05:00
damencho
689bb3f226 Updates prosody config for main muc component. 2021-05-24 15:13:53 -05:00
Avram Tudor
598d014960 Merge pull request #9022 from jitsi/tavram/share-video
feat(share-video) Add capability for sharing any direct link video
2021-05-24 12:46:07 +03:00
Vlad Piersec
d99bf9797d fix(vpaas): Avoid url blipping on invite dialog 2021-05-24 11:12:06 +03:00
Avram Tudor
4138e1ac53 Merge pull request #9251 from jitsi/tavram/remove-sip-invite
fix(sip) remove sip text from invite
2021-05-24 09:21:19 +03:00
damencho
0ee13b1fd8 fix: Drops unused config, fixes jitsi/lib-jitsi-meet#1620. 2021-05-22 12:45:36 -05:00
tudordan7
6ca61e03fd fix(virtual-background): Fix delete virtual background icon position. 2021-05-21 06:26:38 -05:00
Tudor-Ovidiu Avram
2f9fb64332 fix(sip) remove sip text from invite
this will be added in a subsequent commit to the dial in page
2021-05-21 13:04:26 +03:00
Tudor-Ovidiu Avram
3ebfb1de70 code review 2021-05-21 12:55:45 +03:00
Tudor D. Pop
d7a6a48acd fix(virtual-background): Responsive virtual background dialog
Fixes: https://github.com/jitsi/jitsi-meet/issues/9202
2021-05-20 17:12:39 +02:00
Saúl Ibarra Corretgé
496e47af20 chore(deps) uppdate amplitude-js
Fixes: https://github.com/jitsi/jitsi-meet/issues/8380
2021-05-20 17:11:45 +02:00
cagriertek1
d077021031 fix(lang) Update Turkish Translation
"mute Everyone" means "Herkesi sustur" in Turkish language.
2021-05-20 06:39:23 -05:00
Tudor-Ovidiu Avram
4e4ff0f60f feat(share-video) Add capability for sharing any direct link video 2021-05-20 13:00:54 +03:00
scott boone
9657bd9b6d removed a typo (#9244) 2021-05-19 16:02:59 -05:00
Scott Boone
e6242f5bc7 lowercase to fix tokens with uppercase letters (e.g., slack JWTs) 2021-05-19 15:52:04 -05:00
damencho
1f41ddd228 fix: Drops extra message sent on leave. 2021-05-19 10:11:14 -05:00
Saúl Ibarra Corretgé
eb3295cedd fix(ci) fix checking if the git repository is clean 2021-05-19 11:53:47 +02:00
Saúl Ibarra Corretgé
0e7a992b43 chore(deps) sync package-lock.json 2021-05-19 11:53:47 +02:00
Pawel Domas
6f5e0b0321 feat: more user friendly default device label
Also fixes an issue where starting Chrome 90 air pods
no longer have the "Default -" prefix and the default
entry looks like a buggy duplicated one.
2021-05-18 09:28:47 -05:00
Mihai-Andrei Uscat
e33674fb2e fix(FocusLock): Stop stealing focus when embedded 2021-05-18 09:04:42 +03:00
Vlad Piersec
3f7073c589 fix(participants): Knocking participant name in participants list
Fixes https://github.com/jitsi/jitsi-meet/issues/9211
2021-05-17 15:41:34 +03:00
Christoph Settgast
2a37f7caa8 fix(lang) update German translation for participants pane 2021-05-17 07:57:10 +02:00
Christoph Settgast
106ce79375 fix(participants-pane) enable translation of invite button
Copy over existing "invite" translations where the participants
pane is already translated.

Signed-off-by: Christoph Settgast <csett86@web.de>
2021-05-16 13:29:11 -05:00
Cross
b944088d99 Update README.md
Just a couple grammatical changes to the readme.
2021-05-16 07:34:14 -05:00
cagriertek1
b19bd38379 Update main-tr.json
"Kamerayı aç / kapat" means "Turn On / Off Camera" and it is not true case.

"Toggle camera" means "Kamerayı değiştir" in Turkish.
2021-05-16 07:33:41 -05:00
Felix Wolfsteller
1699216c99 fix(config) remove reference to interface_config.js 2021-05-15 11:15:02 +02:00
Jaya Allamsetty
e78ad54809 chore(deps) lib-jitsi-meet@latest
* fix(RTC): Disable simulcast for SS when using H.264. Fixes https://github.com/jitsi/docker-jitsi-meet/issues/1048

9eb4af1e80...f95a455c08
2021-05-14 17:28:48 -04:00
Calinteodor
9b5eae7a60 feat(rn, security) added flag for controlling security options button visibility 2021-05-14 15:01:43 +02:00
Avram Tudor
7db9fc94e2 Merge pull request #9204 from jitsi/tavram/sip-fixes
fix(sip) allow sip invites to contain phone numbers
2021-05-14 14:33:14 +03:00
Gabriel Imre
db5d6a56b8 fix(participants-pane): Use selector for displaying chat context item 2021-05-14 12:21:14 +03:00
Tudor-Ovidiu Avram
f7ddcbbbf3 fix(sip) allow sip invites to contain phone numbers
display sip address in invites
hide lobby password for sip users
tidy up invite placeholders
2021-05-14 11:54:54 +03:00
Shawn Chin
cff4ed83f6 Reservations prosody plugin (#8386)
* Added mod_reservations prosody plugin

* Removed comments re mutex

* Add support for HTTP retries and expose config to tweak retry behaviour

* Removed TODO comment. Feature implemented

* Added multi-tenant support

* renamed config var and default to always including tenant name in name field

* Simplified handling of multi-tenant

* Fixed bug with DELETE not called on reservation expiry

* fix: Fixes destroying room.

Co-authored-by: damencho <damencho@jitsi.org>
2021-05-13 22:20:21 -05:00
damencho
a39f2aebd9 fix: Fixes handling tenant in util and lobby. 2021-05-13 13:52:45 -05:00
Jaya Allamsetty
2bce5acad3 chore(deps) lib-jitsi-meet@latest
* fix(TPC): Return default codec if the local sdp is not available. Get the correct media type when generating the source identifier.

88560a8a5e...9eb4af1e80
2021-05-13 13:57:06 -04:00
damencho
7396db71fd feat: jitsi_session: extracts URL parameters from BOSH or WS into session
Co-authored-by: Saúl Ibarra Corretgé <saghul@jitsi.org>
2021-05-13 06:29:42 -05:00
Mihai-Andrei Uscat
f7b73c0d09 feat(AddPeopleDialog): Add config option to overwrite invite subject app name 2021-05-13 12:33:05 +03:00
Дамян Минков
5c08b1ec5b feat: A/V moderation (prosody module) (#9106)
* feat(prosody-modules): Moves a function for getting room to util.

* feat: Audio/Video moderation.

* squash: Fix docs.

* squash: Changes a field name in the message for adding jid to whitelist.

* squash: Moves to boolean from boolean string.

* squash: Only moderators get whitelist on join.

* squash: Check whether in room and moderator.

* squash: Send to participants only message about approval.

Skips sending the whole list.

* feat: Separates enable/disable by media type.

Adds actor to the messages to inform who enabled it.

* squash: Fixes reporting disable of the feature.

* squash: Fixes init of av_moderation_actors.

* squash: Fixes av_moderation_actor jid to be room jid.

* squash: Fixes comments.

* squash: Fixes warning about shadowing definition.

* squash: Updates ljm.

* fix: Fixes auto-granting from jicofo.

* squash: Further simplify...
2021-05-12 16:36:02 -05:00
Jaya Allamsetty
6d15bcc719 chore(deps) lib-jitsi-meet@latest
* fix(JingleSession): Move the ssrc identifier generation to LocalSdpMunger.
* fix(logger): Logging enhancements. Get rid of noisy logs related to SDP transformations which are redundant. Fix formatting and add missing information.

7cbd9c8f2a...923aa449c4
2021-05-12 10:19:19 -04:00
Saúl Ibarra Corretgé
47c9e14155 fix(toolbox) fix displaying mute everyone buttons for non-moderators 2021-05-12 08:29:00 -05:00
otho
fe22e33343 doc(config) document "inviteDomain" in dynamicBrandingUrl 2021-05-12 11:38:16 +02:00
Tudor D. Pop
dcc659215e fix(virtual-background) fix track leak in preview 2021-05-12 11:36:49 +02:00
Tudor D. Pop
5e4753888e feat(virtual-background): Add placeholder on virtual background preview 2021-05-11 16:25:49 +02:00
Avram Tudor
6e91665987 Merge pull request #9184 from jitsi/tavram/invite-types
fix(invite) fix notifications for phone invites
2021-05-11 16:23:20 +03:00
hmuresan
a1a5d1e7f8 fix(deploymentUrls): Disable help and download apps buttons for JaaS 2021-05-11 13:54:41 +03:00
Tudor-Ovidiu Avram
9a8961b90c fix(invite) fix notifications for phone invites 2021-05-11 11:51:02 +03:00
Calinteodor
07eb19b98a feat(rn,ui) introduce react-native-paper 2021-05-11 10:01:45 +02:00
Gabriel Imre
d69d4dd91a fix(participants-pane): Use selector for displaying names 2021-05-11 09:10:17 +03:00
Jaya Allamsetty
91197bc69f fix(quality-control): Send the new receiver constraints on state changes.
The client now listens for changes to lastN, selectedEndpoints and maxReceiverVideoQuality in redux to trigger sending  bridge message in the new format. This fixes an issue where the stage view <-> tile view changes prompt two receiver constraints messages to be sent, first with the maxHeight update and then with the selected endpoints update.
2021-05-10 16:06:19 -04:00
Jaya Allamsetty
913cf259cf chore(deps) lib-jitsi-meet@latest
* fix(quality-control): Propagate the height constraints to p2p session. If the application is using the new receiver constraints, propagate the height constraint to the p2p session as well.
* build(deps): bump lodash from 4.17.19 to 4.17.21
* chore(deps): bump hosted-git-info from 2.8.8 to 2.8.9

74a90f7035...7cbd9c8f2a
2021-05-10 16:04:59 -04:00
dependabot[bot]
096e1e0dc6 chore(deps-dev): bump lodash in /resources/load-test
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-09 08:15:19 +02:00
dependabot[bot]
022f5865e5 chore(deps): bump hosted-git-info from 2.5.0 to 2.8.9
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.5.0 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.5.0...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-09 08:10:02 +02:00
Jaya Allamsetty
cc3377c0da chore(deps) lib-jitsi-meet@latest
* fix(quality-control): fix constraints sent on channel initialization. Do not send old format constraints if no constraints are set before the channel is initialized.
* chore(deps) run npm audit fix
* chore(deps) update webrtc-adater@8.0.0

86c7a35817...74a90f7035
2021-05-08 13:49:29 -04:00
dependabot[bot]
c2d7e19a1d chore(deps): bump hosted-git-info in /resources/load-test
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-08 15:45:40 +02:00
dependabot[bot]
a32adec667 chore(deps): bump ssri from 6.0.1 to 6.0.2 in /resources/load-test
Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/npm/ssri/releases)
- [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md)
- [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-08 00:28:06 +02:00
dependabot[bot]
ce70b005b1 chore(deps): bump url-parse from 1.4.7 to 1.5.1
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.4.7 to 1.5.1.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.4.7...1.5.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-08 00:27:19 +02:00
dependabot[bot]
a07fceb8fd chore(deps): bump ua-parser-js from 0.7.17 to 0.7.28
Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 0.7.17 to 0.7.28.
- [Release notes](https://github.com/faisalman/ua-parser-js/releases)
- [Commits](https://github.com/faisalman/ua-parser-js/compare/0.7.17...0.7.28)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-08 00:26:26 +02:00
Vlad Piersec
9fd8491d04 fix(RN, Toolbox): Show full participant thumbnails in tile view 2021-05-08 00:25:40 +02:00
వీవెన్
98078f9160 More Telugu (te) translations. 2021-05-07 15:15:58 -04:00
Calinteodor
450c961e68 Update contributing file
Added Avoiding bundle bloat section
2021-05-07 17:23:01 +02:00
Saúl Ibarra Corretgé
ea8ed8aa84 fix(dev) make sure each bundle analysis report gets its own file 2021-05-07 15:37:41 +02:00
Saúl Ibarra Corretgé
a5ddc896e2 fix(dev) disable performance hints when doing bundle analysis 2021-05-07 15:37:41 +02:00
Vlad Piersec
2c24dc3d27 fix(premeeting): "Don't show screen" button hover state 2021-05-07 14:26:23 +03:00
Gabriel Imre
edff9bef53 fix(participants-pane): Resize video layout when closing or opening 2021-05-07 10:51:21 +03:00
Hristo Terezov
dec90bdeb8 fix(Thumbnail): Display mode typo. 2021-05-06 15:27:27 -05:00
Tudor D. Pop
f38bf7b14c fix(dialogs-style): Remove box shadow from header and footer 2021-05-06 18:38:08 +02:00
Avram Tudor
c851136f8e Merge pull request #9110 from jitsi/tavram/fix-case-sensitive-replcement
fix(sip-invite) fix baseurl case sensitive replacement
2021-05-06 11:24:17 +03:00
Saúl Ibarra Corretgé
89abaa83aa fix(premeeting) drop gradient
It looks particularly odd, specially when any virtual background is activated.
2021-05-06 09:55:53 +02:00
Tudor D. Pop
9ef984ca3d feat(virtual-background) add virtual background preview
Also enable background selection while muted.
2021-05-06 08:54:23 +02:00
Jaya Allamsetty
2f51d9fd3e chore(deps) lib-jitsi-meet@latest
* fix(JingleSession): Add a unique identifier for source on Firefox.
* fix: Drops unused nick from messages. Fixes #1592

5629ba5d99...86c7a35817
2021-05-05 17:06:37 -04:00
damencho
ceca00b573 fix: Fixes welcome page add calendar link. Fixes #9132 2021-05-05 14:05:50 -05:00
Jaya Allamsetty
1c6677f523 squash: use oldScreenSharesOrder for checking. 2021-05-05 15:05:10 -04:00
Jaya Allamsetty
035d026e90 fix(video-layout): Fix video-layout when a SS participant leaves.
Unpin the screenshare when the screensharing participant leaves. Switch to tile view if no other participant was pinned before screenshare was auto-pinned, pin the previously pinned participant otherwise.
2021-05-05 15:05:10 -04:00
hmuresan
a582f1c191 fix(jwt-validation): validate kid value only for JaaS
- add some missing meet features
2021-05-05 13:03:39 +03:00
Vlad Piersec
79939f108c fix(rn, Labels): Place picture-in-picture button on the left 2021-05-05 09:16:48 +03:00
Jaya Allamsetty
e765253204 chore(deps) lib-jitsi-meet@latest
* fix(RTC): Fix screenshare with audio on Electron.

e362c89eb6...5629ba5d99
2021-05-04 21:44:41 -05:00
Paweł Domas
a605403029 fix(Video.js): prevent DOMException: The play() request was interrupted by a new load request 2021-05-04 17:18:34 -05:00
Ilko
6aae1c024d Added lobby translations for bulgarian language (#9128)
* Added lobby component translations for bg language

* Update translation of shared youtube video button and label

* Translate security litterals in bg. Update lobby translations
2021-05-04 14:32:39 -05:00
Jaya Allamsetty
2b7a256aa6 chore(deps) lib-jitsi-meet@latest
* Add dependency for promise.allSettled. Older chrome versions like M72 do not support Promise.allSettled.
* fix(conference): Enable p2p for unified plan clients.
* fix(TPC): Use addTrack instead of addStream in Unified-plan impl.
* Add missing spaces in debug logs.

ad5692d6aa...e362c89eb6
2021-05-04 13:47:20 -04:00
hmuresan
b998d80ee3 fix (external-api): fix notify video mute changed when presenting
- small refactor to trigger `notifyVideoMutedStatusChanged` correctly when participant is presenting
2021-05-04 18:23:32 +03:00
Vlad Piersec
428c3cef38 fix(Labels): Recording label background color 2021-05-04 16:02:00 +03:00
Besnik Bleta
32a9c94dee Adding sq translation (#9091)
* Adding sq translation

* Adding sq to languages.json
2021-04-30 17:27:13 -05:00
Yagiz ISIK
42f07624b4 Updated Turkish Localizations
Added translations for mute everyone's microphone and camera.
2021-04-30 17:11:48 -05:00
Saúl Ibarra Corretgé
153f991097 chore(deps) lib-jitsi-meet@latest
* fix(RTC) drop the "old gUM" flow

7667117117...ad5692d6aa
2021-04-30 12:38:10 -04:00
Christoph Wiechert
79497cecba Add: remoteVideoMenu.disableGrantModerator option (#7534)
* Add: remoteVideoMenu.disableGrantModerator option

* Add disableGrantModerator to native side

* Update RemoteVideoMenu.js

* Update RemoteVideoMenuTriggerButton.js

Co-authored-by: ouya99 <alexander@andlabs.eu>
2021-04-30 11:22:36 -05:00
Saúl Ibarra Corretgé
f44faa8d81 deps(rn) updatereact-native-webrtc
Includes a MST.getSettings implementation, necessary for dropping "old
getUserMedia flow".
2021-04-30 12:02:50 -04:00
Jaya Allamsetty
7ef22603fc chore(deps) lib-jitsi-meet@latest
* fix(SDP): Move all SDP related files to a different dir. SDP utility classes are spread across RTC and XMPP directories now, moving these class files to a 'sdp' directory.
* fix(stats): Return promise for getStats. Switch to returning a Promise for getStats. Reset frame rate stat to 0 when video is suspended as a result of endpoint falling out of last-n.
* Fix: sysMessageHandler not deleted (#1590)
* task(e2ee): switch back to GCM

463e213b3f...7667117117
2021-04-30 10:51:31 -04:00
Philipp Fruck
f030706a94 fix(external_api) fixed misspelled api command 2021-04-30 15:36:32 +02:00
Hamza KHAIT
6eac19a058 fix(lang) update French translation 2021-04-29 16:55:31 +02:00
Saúl Ibarra Corretgé
8cffa5553d chore(rn,versions) set mobile app and SDK versions 2021-04-29 16:56:14 +03:00
Saúl Ibarra Corretgé
0fcdb6f248 fix(patch) remove unneeded hunks from RN patch 2021-04-29 13:39:27 +02:00
Saúl Ibarra Corretgé
399fac78f5 fix(ios) fix building with Xcode 12.5 2021-04-29 13:24:00 +02:00
Tudor-Ovidiu Avram
3339a1d19f fix(sip-invite) fix baseurl case sensitive replacement 2021-04-29 13:50:29 +03:00
Vlad Piersec
8bd874ca70 feat(themes): Add style tokens and web theme 2021-04-29 13:19:53 +03:00
Saúl Ibarra Corretgé
8477ae8daa feat(ios) add ability to set CallKit options for incoming calls
The implemented options are the call handle and UUID.
2021-04-29 12:10:43 +02:00
Saúl Ibarra Corretgé
b83bc50c03 chore(deps) drop jQuery impromptu
It's no longer used.
2021-04-29 11:02:09 +02:00
Alex Bumbu
9bffe149d3 feat(iOS): screensharing extension swift implementation 2021-04-29 10:44:40 +02:00
Jaya Allamsetty
1898e4a768 feat(last-n): Implement startLastN and make last-n configurable through UI. (#9093) 2021-04-28 19:00:20 -04:00
641 changed files with 30451 additions and 11292 deletions

View File

@@ -12,6 +12,7 @@ jobs:
with:
node-version: '12.x'
- run: npm install
- run: git status -s --untracked-files=no
- name: Check if the git repository is clean
run: exit $( git status --porcelain --untracked-files=no | head -255 | wc -l )
- run: npm run lint
- run: make

View File

@@ -152,3 +152,20 @@ this model but new features should follow this new layout.
When working on an old feature, adding the necessary changes to migrate to the new
model is encouraged.
### Avoiding bundle bloat
When adding a new feature it's possible that it triggers a build failure due to the increased bundle size. We have safeguards inplace to avoid bundles growing disproportionatelly. While there are legit reasons for increasing the limits, please analyze the bundle first to make sure no unintended dependencies have been included, causing the increase in size.
First, make a production build with bundle-analysis enabled:
```
npx webpack -p --analyze-bundle
```
Then open the interactive bundle analyzer tool:
```
npx webpack-bundle-analyzer build/app-stats.json
```

View File

@@ -2,9 +2,9 @@
Jitsi Meet is an open-source (Apache) WebRTC JavaScript application that uses [Jitsi Videobridge](https://jitsi.org/videobridge) to provide high quality, [secure](https://jitsi.org/security) and scalable video conferences. Jitsi Meet in action can be seen at [here at the session #482 of the VoIP Users Conference](http://youtu.be/7vFUVClsNh0).
The Jitsi Meet client runs in your browser, without installing anything else on your computer. You can try it out at https://meet.jit.si.
The Jitsi Meet client runs in your browser, without installing anything on your computer. You can try it out at https://meet.jit.si.
Jitsi Meet allows very efficient collaboration. Users can stream their desktop or only some windows. It also supports shared document editing with Etherpad.
Jitsi Meet allows for very efficient collaboration. Users can stream their desktop or only some windows. It also supports shared document editing with Etherpad.
**NOTE:** If you are looking for Jitsi as a Service (JaaS) please start [here](https://jaas.8x8.vc).

View File

@@ -25,5 +25,5 @@ android.enableDexingArtifactTransform.desugaring=false
android.useAndroidX=true
android.enableJetifier=true
appVersion=21.1.0
sdkVersion=3.4.0
appVersion=21.3.0
sdkVersion=3.8.0

View File

@@ -70,11 +70,13 @@ dependencies {
implementation project(':react-native-default-preference')
implementation project(':react-native-immersive')
implementation project(':react-native-keep-awake')
implementation project(':react-native-slider')
implementation project(':react-native-sound')
implementation project(':react-native-splash-screen')
implementation project(':react-native-svg')
implementation project(':react-native-video')
implementation project(':react-native-webrtc')
implementation project(':react-native-webview')
implementation project(':react-native-splash-screen')
testImplementation 'junit:junit:4.12'
}

View File

@@ -40,7 +40,8 @@
<service
android:name=".ConnectionService"
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
android:exported="true">
<intent-filter>
<action android:name="android.telecom.ConnectionService" />
</intent-filter>

View File

@@ -47,7 +47,7 @@ class LocaleDetector extends ReactContextBaseJavaModule {
public Map<String, Object> getConstants() {
Context context = getReactApplicationContext();
HashMap<String,Object> constants = new HashMap<>();
constants.put("locale", context.getResources().getConfiguration().locale.toString());
constants.put("locale", context.getResources().getConfiguration().locale.toLanguageTag());
return constants;
}
@@ -55,4 +55,4 @@ class LocaleDetector extends ReactContextBaseJavaModule {
public String getName() {
return "LocaleDetector";
}
}
}

View File

@@ -187,9 +187,11 @@ class ReactInstanceManagerHolder {
new com.ocetnik.timer.BackgroundTimerPackage(),
new com.reactnativecommunity.asyncstorage.AsyncStoragePackage(),
new com.reactnativecommunity.netinfo.NetInfoPackage(),
new com.reactnativecommunity.slider.ReactSliderPackage(),
new com.reactnativecommunity.webview.RNCWebViewPackage(),
new com.rnimmersive.RNImmersivePackage(),
new com.zmxv.RNSound.RNSoundPackage(),
new com.brentvatne.react.ReactVideoPackage(),
new ReactPackageAdapter() {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {

View File

@@ -19,13 +19,17 @@ include ':react-native-immersive'
project(':react-native-immersive').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-immersive/android')
include ':react-native-keep-awake'
project(':react-native-keep-awake').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-keep-awake/android')
include ':react-native-slider'
project(':react-native-slider').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/slider/android')
include ':react-native-sound'
project(':react-native-sound').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-sound/android')
include ':react-native-splash-screen'
project(':react-native-splash-screen').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-splash-screen/android')
include ':react-native-svg'
project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android')
include ':react-native-video'
project(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android')
include ':react-native-webrtc'
project(':react-native-webrtc').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webrtc/android')
include ':react-native-webview'
project(':react-native-webview').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webview/android')
project(':react-native-webview').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webview/android')

1
app.js
View File

@@ -1,7 +1,6 @@
/* application specific logic */
import 'jquery';
import 'jQuery-Impromptu';
import 'olm';

9
babel.config.js Normal file
View File

@@ -0,0 +1,9 @@
module.exports = {
presets: [ 'module:metro-react-native-babel-preset' ],
env: {
production: {
plugins: [ 'react-native-paper/babel' ]
}
},
plugins: [ 'optional-require' ]
};

View File

@@ -39,12 +39,14 @@ import {
conferenceWillJoin,
conferenceWillLeave,
dataChannelOpened,
getConferenceOptions,
kickedOut,
lockStateChanged,
onStartMutedPolicyChanged,
p2pStatusChanged,
sendLocalParticipant
} from './react/features/base/conference';
import { getReplaceParticipant } from './react/features/base/config/functions';
import {
checkAndNotifyForNewDevice,
getAvailableDevices,
@@ -110,7 +112,6 @@ import {
trackRemoved
} from './react/features/base/tracks';
import { downloadJSON } from './react/features/base/util/downloadJSON';
import { getConferenceOptions } from './react/features/conference/functions';
import { showDesktopPicker } from './react/features/desktop-picker';
import { appendSuffix } from './react/features/display-name';
import {
@@ -129,9 +130,9 @@ import {
import { disableReceiver, stopReceiver } from './react/features/remote-control';
import { setScreenAudioShareState, isScreenAudioShared } from './react/features/screen-share/';
import { toggleScreenshotCaptureEffect } from './react/features/screenshot-capture';
import { setSharedVideoStatus } from './react/features/shared-video/actions';
import { AudioMixerEffect } from './react/features/stream-effects/audio-mixer/AudioMixerEffect';
import { createPresenterEffect } from './react/features/stream-effects/presenter';
import { createRnnoiseProcessor } from './react/features/stream-effects/rnnoise';
import { endpointMessageReceived } from './react/features/subtitles';
import UIEvents from './service/UI/UIEvents';
@@ -177,8 +178,7 @@ const commands = {
AVATAR_URL: AVATAR_URL_COMMAND,
CUSTOM_ROLE: 'custom-role',
EMAIL: EMAIL_COMMAND,
ETHERPAD: 'etherpad',
SHARED_VIDEO: 'shared-video'
ETHERPAD: 'etherpad'
};
/**
@@ -306,10 +306,13 @@ class ConferenceConnector {
// not enough rights to create conference
case JitsiConferenceErrors.AUTHENTICATION_REQUIRED: {
const replaceParticipant = getReplaceParticipant(APP.store.getState());
// Schedule reconnect to check if someone else created the room.
this.reconnectTimeout = setTimeout(() => {
APP.store.dispatch(conferenceWillJoin(room));
room.join();
room.join(null, replaceParticipant);
}, 5000);
const { password }
@@ -395,8 +398,10 @@ class ConferenceConnector {
*
*/
connect() {
const replaceParticipant = getReplaceParticipant(APP.store.getState());
// the local storage overrides here and in connection.js can be used by jibri
room.join(jitsiLocalStorage.getItem('xmpp_conference_password_override'));
room.join(jitsiLocalStorage.getItem('xmpp_conference_password_override'), replaceParticipant);
}
}
@@ -739,7 +744,7 @@ export default {
}
if (!tracks.find(t => t.isVideoTrack())) {
this.setVideoMuteStatus(true);
this.setVideoMuteStatus();
}
if (config.iAmRecorder) {
@@ -993,7 +998,7 @@ export default {
// This will only modify base/media.video.muted which is then synced
// up with the track at the end of local tracks initialization.
muteLocalVideo(mute);
this.setVideoMuteStatus(mute);
this.setVideoMuteStatus();
return;
} else if (this.isLocalVideoMuted() === mute) {
@@ -1087,17 +1092,6 @@ export default {
return room && room.isCallstatsEnabled();
},
/**
* Sends the given feedback through CallStats if enabled.
*
* @param overallFeedback an integer between 1 and 5 indicating the
* user feedback
* @param detailedFeedback detailed feedback from the user. Not yet used
*/
sendFeedback(overallFeedback, detailedFeedback) {
return room.sendFeedback(overallFeedback, detailedFeedback);
},
/**
* Get speaker stats that track total dominant speaker time.
*
@@ -1364,7 +1358,11 @@ export default {
},
_getConferenceOptions() {
return getConferenceOptions(APP.store.getState());
const options = getConferenceOptions(APP.store.getState());
options.createVADProcessor = createRnnoiseProcessor;
return options;
},
/**
@@ -1402,7 +1400,7 @@ export default {
.then(() => {
this.localVideo = newTrack;
this._setSharingScreen(newTrack);
this.setVideoMuteStatus(this.isLocalVideoMuted());
this.setVideoMuteStatus();
})
.then(resolve)
.catch(error => {
@@ -1821,7 +1819,7 @@ export default {
try {
await this.localVideo.setEffect(effect);
APP.store.dispatch(setVideoMuted(mute, MEDIA_TYPE.PRESENTER));
this.setVideoMuteStatus(mute);
this.setVideoMuteStatus();
} catch (err) {
logger.error('Failed to apply the Presenter effect', err);
}
@@ -1874,7 +1872,6 @@ export default {
await this.useVideoStream(desktopVideoStream);
}
if (this._desktopAudioStream) {
// If there is a localAudio stream, mix in the desktop audio stream captured by the screen sharing
// api.
@@ -1985,7 +1982,12 @@ export default {
room.on(
JitsiConferenceEvents.CONFERENCE_UNIQUE_ID_SET,
(...args) => APP.store.dispatch(conferenceUniqueIdSet(room, ...args)));
(...args) => {
// Preserve the sessionId so that the value is accessible even after room
// is disconnected.
room.sessionId = room.getMeetingUniqueId();
APP.store.dispatch(conferenceUniqueIdSet(room, ...args));
});
room.on(
JitsiConferenceEvents.AUTH_STATUS_CHANGED,
@@ -2017,8 +2019,6 @@ export default {
}
logger.log(`USER ${id} LEFT:`, user);
APP.UI.onSharedVideoStop(id);
});
room.on(JitsiConferenceEvents.USER_STATUS_CHANGED, (id, status) => {
@@ -2177,7 +2177,24 @@ export default {
JitsiConferenceEvents.LOCK_STATE_CHANGED,
(...args) => APP.store.dispatch(lockStateChanged(room, ...args)));
room.on(JitsiConferenceEvents.KICKED, participant => {
room.on(JitsiConferenceEvents.KICKED, (participant, reason, isReplaced) => {
if (isReplaced) {
// this event triggers when the local participant is kicked, `participant`
// is the kicker. In replace participant case, kicker is undefined,
// as the server initiated it. We mark in store the local participant
// as being replaced based on jwt.
const localParticipant = getLocalParticipant(APP.store.getState());
APP.store.dispatch(participantUpdated({
conference: room,
id: localParticipant.id,
isReplaced
}));
// we send readyToClose when kicked participant is replace so that
// embedding app can choose to dispose the iframe API on the handler.
APP.API.notifyReadyToClose();
}
APP.store.dispatch(kickedOut(room, participant));
});
@@ -2303,7 +2320,7 @@ export default {
return this._createPresenterStreamEffect(height, cameraDeviceId)
.then(effect => this.localVideo.setEffect(effect))
.then(() => {
this.setVideoMuteStatus(false);
this.setVideoMuteStatus();
logger.log('Switched local video device while screen sharing and the video is unmuted');
this._updateVideoDeviceId();
})
@@ -2450,63 +2467,10 @@ export default {
});
APP.UI.addListener(
UIEvents.TOGGLE_SCREENSHARING, audioOnly => {
this.toggleScreenSharing(undefined, { audioOnly });
UIEvents.TOGGLE_SCREENSHARING, ({ enabled, audioOnly }) => {
this.toggleScreenSharing(enabled, { audioOnly });
}
);
/* eslint-disable max-params */
APP.UI.addListener(
UIEvents.UPDATE_SHARED_VIDEO,
(url, state, time, isMuted, volume) => {
/* eslint-enable max-params */
// send start and stop commands once, and remove any updates
// that had left
if (state === 'stop'
|| state === 'start'
|| state === 'playing') {
const localParticipant = getLocalParticipant(APP.store.getState());
room.removeCommand(this.commands.defaults.SHARED_VIDEO);
room.sendCommandOnce(this.commands.defaults.SHARED_VIDEO, {
value: url,
attributes: {
state,
time,
muted: isMuted,
volume,
from: localParticipant.id
}
});
} else {
// in case of paused, in order to allow late users to join
// paused
room.removeCommand(this.commands.defaults.SHARED_VIDEO);
room.sendCommand(this.commands.defaults.SHARED_VIDEO, {
value: url,
attributes: {
state,
time,
muted: isMuted,
volume
}
});
}
APP.store.dispatch(setSharedVideoStatus(state));
});
room.addCommandListener(
this.commands.defaults.SHARED_VIDEO,
({ value, attributes }, id) => {
if (attributes.state === 'stop') {
APP.UI.onSharedVideoStop(id, attributes);
} else if (attributes.state === 'start') {
APP.UI.onSharedVideoStart(id, value, attributes);
} else if (attributes.state === 'playing'
|| attributes.state === 'pause') {
APP.UI.onSharedVideoUpdate(id, value, attributes);
}
});
},
/**
@@ -2860,14 +2824,11 @@ export default {
requestFeedbackPromise = Promise.resolve(true);
}
// All promises are returning Promise.resolve to make Promise.all to
// be resolved when both Promises are finished. Otherwise Promise.all
// will reject on first rejected Promise and we can redirect the page
// before all operations are done.
Promise.all([
requestFeedbackPromise,
this.leaveRoomAndDisconnect()
]).then(values => {
])
.then(values => {
this._room = undefined;
room = undefined;
@@ -3105,12 +3066,9 @@ export default {
/**
* Sets the video muted status.
*
* @param {boolean} muted - New muted status.
*/
setVideoMuteStatus(muted) {
setVideoMuteStatus() {
APP.UI.setVideoMuted(this.getMyUserId());
APP.API.notifyVideoMutedStatusChanged(muted);
},
/**

103
config.js
View File

@@ -70,6 +70,9 @@ var config = {
// callStatsThreshold: 5 // enable callstats for 5% of the users.
},
// Enables reactions feature.
// enableReactions: false,
// Disables ICE/UDP by filtering out local and remote UDP candidates in
// signalling.
// webrtcIceUdpDisable: false,
@@ -82,6 +85,9 @@ var config = {
// Media
//
// Enable unified plan implementation support on Chromium based browsers.
// enableUnifiedOnChrome: false,
// Audio
// Disable measuring of audio levels.
@@ -98,6 +104,10 @@ var config = {
// about the call.
// enableSaveLogs: false,
// Enabling this will hide the "Show More" link in the GSM popover that can be
// used to display more statistics about the connection (IP, Port, protocol, etc).
// disableShowMoreStats: true,
// Enabling this will run the lib-jitsi-meet noise detection module which will
// notify the user if there is noise, other than voice, coming from the current
// selected microphone. The purpose it to let the user know that the input could
@@ -228,6 +238,11 @@ var config = {
// Default value for the channel "last N" attribute. -1 for unlimited.
channelLastN: -1,
// Provides a way for the lastN value to be controlled through the UI.
// When startLastN is present, conference starts with a last-n value of startLastN and channelLastN
// value will be used when the quality level is selected using "Manage Video Quality" slider.
// startLastN: 1,
// Provides a way to use different "last N" values based on the number of participants in the conference.
// The keys in an Object represent number of participants and the values are "last N" to be used when number of
// participants gets to or above the number.
@@ -384,7 +399,9 @@ var config = {
// enableClosePage: false,
// Disable hiding of remote thumbnails when in a 1-on-1 conference call.
// disable1On1Mode: false,
// Setting this to null, will also disable showing the remote videos
// when the toolbar is shown on mouse movements
// disable1On1Mode: null | false | true,
// Default language for the user interface.
// defaultLanguage: 'en',
@@ -429,6 +446,10 @@ var config = {
// Base URL for a Gravatar-compatible service. Defaults to libravatar.
// gravatarBaseURL: 'https://seccdn.libravatar.org/avatar/',
// App name to be displayed in the invitation email subject, as an alternative to
// interfaceConfig.APP_NAME.
// inviteAppName: null,
// Moved from interfaceConfig(TOOLBAR_BUTTONS).
// The name of the toolbar buttons to display in the toolbar, including the
// "More actions" menu. If present, the button will display. Exceptions are
@@ -441,11 +462,38 @@ var config = {
// - 'desktop' controls the "Share your screen" button
// - if `toolbarButtons` is undefined, we fallback to enabling all buttons on the UI
// toolbarButtons: [
// 'microphone', 'camera', 'closedcaptions', 'desktop', 'embedmeeting', 'fullscreen',
// 'fodeviceselection', 'hangup', 'profile', 'chat', 'recording',
// 'livestreaming', 'etherpad', 'sharedvideo', 'shareaudio', 'settings', 'raisehand',
// 'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts',
// 'tileview', 'select-background', 'download', 'help', 'mute-everyone', 'mute-video-everyone', 'security'
// 'camera',
// 'chat',
// 'closedcaptions',
// 'desktop',
// 'download',
// 'embedmeeting',
// 'etherpad',
// 'feedback',
// 'filmstrip',
// 'fullscreen',
// 'hangup',
// 'help',
// 'invite',
// 'livestreaming',
// 'microphone',
// 'mute-everyone',
// 'mute-video-everyone',
// 'participants-pane',
// 'profile',
// 'raisehand',
// 'recording',
// 'security',
// 'select-background',
// 'settings',
// 'shareaudio',
// 'sharedvideo',
// 'shortcuts',
// 'stats',
// 'tileview',
// 'toggle-camera',
// 'videoquality',
// '__end'
// ],
// Stats
@@ -496,6 +544,9 @@ var config = {
// connection.
enabled: true,
// Enable unified plan implementation support on Chromium for p2p connection.
// enableUnifiedOnChrome: false,
// Sets the ICE transport policy for the p2p connection. At the time
// of this writing the list of possible values are 'all' and 'relay',
// but that is subject to change in the future. The enum is defined in
@@ -582,6 +633,9 @@ var config = {
// conference (if set to true, these sounds will not be played).
// disableJoinLeaveSounds: false,
// Disables the sounds that play when a chat message is received.
// disableIncomingMessageSound: false,
// Information for the chrome extension banner
// chromeExtensionBanner: {
// // The chrome extension to be installed address
@@ -602,8 +656,8 @@ var config = {
// localRecording: {
// Enables local recording.
// Additionally, 'localrecording' (all lowercase) needs to be added to
// TOOLBAR_BUTTONS in interface_config.js for the Local Recording
// button to show up on the toolbar.
// the `toolbarButtons`-array for the Local Recording button to show up
// on the toolbar.
//
// enabled: true,
//
@@ -666,7 +720,9 @@ var config = {
// Options related to the remote participant menu.
// remoteVideoMenu: {
// // If set to true the 'Kick out' button will be disabled.
// disableKick: true
// disableKick: true,
// // If set to true the 'Grant moderator' button will be disabled.
// disableGrantModerator: true
// },
// If set to true all muting operations of remote participants will be disabled.
@@ -678,8 +734,11 @@ var config = {
/**
External API url used to receive branding specific information.
If there is no url set or there are missing fields, the defaults are applied.
The config file should be in JSON.
None of the fields are mandatory and the response must have the shape:
{
// The domain url to apply (will replace the domain in the sharing conference link/embed section)
inviteDomain: 'example-company.org,
// The hex value for the colour used as background
backgroundColor: '#fff',
// The url for the image used as background
@@ -706,6 +765,9 @@ var config = {
// Hides the conference subject
// hideConferenceSubject: true,
// Hides the recording label
// hideRecordingLabel: false,
// Hides the conference timer.
// hideConferenceTimer: true,
@@ -720,6 +782,18 @@ var config = {
// is not persisting the local storage inside the iframe.
// useHostPageLocalStorage: true,
// etherpad ("shared document") integration.
//
// If set, add a "Open shared document" link to the bottom right menu that
// will open an etherpad document.
// etherpad_base: 'https://your-etherpad-installati.on/p/',
// If etherpad_base is set, and useRoomAsSharedDocumentName is set to true,
// open a pad with the name of the room (lowercased) instead of a pad with a
// random UUID.
// useRoomAsSharedDocumentName: true,
// List of undocumented settings used in jitsi-meet
/**
_immediateReloadThreshold
@@ -732,7 +806,6 @@ var config = {
dialOutCodesUrl
disableRemoteControl
displayJids
etherpad_base
externalConnectUrl
firefox_fake_device
googleApiApplicationClientID
@@ -775,6 +848,11 @@ var config = {
websocketKeepAliveUrl
*/
/**
* Default interval (milliseconds) for triggering mouseMoved iframe API event
*/
mouseMoveCallbackInterval: 1000,
/**
Use this array to configure which notifications will be shown to the user
The items correspond to the title or description key of that notification
@@ -834,7 +912,10 @@ var config = {
// 'toolbar.noisyAudioInputTitle', // shown when noise is detected for the current microphone
// 'toolbar.talkWhileMutedPopup', // shown when user tries to speak while muted
// 'transcribing.failedToStart' // shown when transcribing fails to start
// ]
// ],
// Prevent the filmstrip from autohiding when screen width is under a certain threshold
// disableFilmstripAutohiding: false,
// Allow all above example options to include a trailing comma and
// prevent fear when commenting out the last value.

View File

@@ -11,11 +11,13 @@ import {
connectionFailed
} 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 { isVpaasMeeting, getJaasJWT } from './react/features/jaas/functions';
import { setPrejoinDisplayNameRequired } from './react/features/prejoin/actions';
const logger = Logger.getLogger(__filename);
@@ -82,9 +84,16 @@ function checkForAttachParametersAndConnect(id, password, connection) {
* @returns {Promise<JitsiConnection>} connection if
* everything is ok, else error.
*/
export function connect(id, password, roomName) {
export async function connect(id, password, roomName) {
const connectionConfig = Object.assign({}, config);
const { jwt } = APP.store.getState()['features/base/jwt'];
const state = APP.store.getState();
let { jwt } = state['features/base/jwt'];
const { iAmRecorder, iAmSipGateway } = state['features/base/config'];
if (!iAmRecorder && !iAmSipGateway && !jwt && isVpaasMeeting(state)) {
jwt = await getJaasJWT(state);
APP.store.dispatch(setJWT(jwt));
}
// 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.

View File

@@ -32,12 +32,25 @@
.dropdown-menu div[style*="transform"] {
outline: 1px solid #455166;
}
.dropdown-menu button:not(:active):not(:hover) > span {
color: #B8C7E0;
}
/**
* Override @atlaskit/tab styling when in a modal because the
* tab text color clash with the modal backgrounds.
*/
div[role="tablist"] > div:not([data-selected]):not(:hover),
label > div > span {
color: #B8C7E0 !important;
}
}
/**
* Override @atlaskit/modal-dialog header styling
*/
.atlaskit-portal [role="dialog"] header {
box-shadow: none;
.jitsi-icon {
cursor: pointer;
}
@@ -47,6 +60,13 @@
}
}
/**
* Override @atlaskit/modal-dialog footer styling.
*/
.atlaskit-portal [role="dialog"] footer {
box-shadow: none;
}
/**
* Make header close button more easily tappable on mobile.
*/
@@ -80,12 +100,18 @@
}
.audio-preview > div:nth-child(2),
.video-preview > div:nth-child(2) {
.video-preview > div:nth-child(2),
.reactions-menu-popup > 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

@@ -9,6 +9,11 @@
max-height: 456px;
overflow: auto;
width: 300px;
&-ul {
margin:0;
padding:0;
list-style-type: none;
}
}
&-header {
@@ -64,7 +69,13 @@
&-speaker {
position: relative;
&:hover {
&-ul {
margin:0;
padding:0;
list-style-type: none;
}
&:hover, &:focus-within, &:focus {
.audio-preview-entry {
background: #36383C;
margin-left: 0;
@@ -81,7 +92,7 @@
}
.audio-preview-entry-text {
max-width: 196px;
max-width: 178px;
}
}
@@ -90,7 +101,7 @@
}
.audio-preview-entry-text {
max-width: 256px;
max-width: 238px;
}
}
@@ -150,8 +161,9 @@
color: #1C2025;
cursor: pointer;
font-weight: 600;
font-size: 0.8rem;
line-height: 24px;
padding: 2px 16px;
padding: 2px 8px;
position: absolute;
right: 16px;
top: 5px;
@@ -162,4 +174,10 @@
right: 16px;
top: 14px;
}
// Override @atlaskit/InlineDialog container which is made with styled components
& > div:nth-child(2) {
outline: none;
padding: 0;
}
}

View File

@@ -219,8 +219,9 @@ abbr {
}
a {
color: #3572b0;
color: #44A5FF;
text-decoration: none;
font-weight: bold;
}
a:focus,
a:hover,

View File

@@ -1,7 +1,7 @@
.avatar {
background-color: #AAA;
border-radius: 50%;
color: rgba(255, 255, 255, 0.6);
color: rgba(255, 255, 255, 1);
font-weight: 100;
object-fit: cover;
@@ -25,10 +25,6 @@
width: 100%;
}
.defaultAvatar {
opacity: 0.6
}
.avatar-badge {
position: relative;

View File

@@ -99,18 +99,19 @@
div {
svg {
cursor: pointer;
fill: white
fill: white;
}
}
}
.chat-header {
height: 70px;
position: relative;
width: 100%;
z-index: 1;
display: flex;
justify-content: flex-end;
justify-content: space-between;
padding: 16px;
align-items: center;
box-sizing: border-box;
@@ -132,6 +133,7 @@
.send-button {
background: #1B67EC;
cursor: pointer;
margin-left: 0.3rem;
@media (hover: hover) and (pointer: fine) {
&:hover {
@@ -188,8 +190,9 @@
display: flex;
align-items: center;
justify-content: center;
height: 40px;
width: 40px;
height: 38px;
width: 38px;
margin: 2px;
border-radius: 3px;
}
@@ -226,6 +229,11 @@
border: 0px none;
box-shadow: none;
}
#usermsg:focus,
#usermsg:active {
border-bottom: 1px solid white;
padding-bottom: 8px;
}
#nickname {
text-align: center;
@@ -234,6 +242,16 @@
margin: auto 0;
padding: 0 16px;
#nickname-title {
margin-bottom: 5px;
display: block;
}
label[for="nickinput"] {
> div > span {
color: #B8C7E0;
}
}
input {
height: 40px;
}
@@ -254,7 +272,7 @@
cursor: pointer;
&.disabled {
color: #757575;
color: #AFB6BC;
background: #11336E;
pointer-events: none;
}
@@ -301,6 +319,19 @@
}
}
.sr-only {
border: 0 !important;
clip: rect(1px, 1px, 1px, 1px) !important;
clip-path: inset(50%) !important;
height: 1px !important;
margin: -1px !important;
overflow: hidden !important;
padding: 0 !important;
position: absolute !important;
width: 1px !important;
white-space: nowrap !important;
}
.chatmessage {
background-color: $chatRemoteMessageBackgroundColor;
border-radius: 0px 6px 6px 6px;
@@ -350,10 +381,6 @@
color: #757575;
}
.smiley {
font-size: 14pt;
}
#smileys {
font-size: 20pt;
margin: auto;
@@ -382,7 +409,7 @@
box-sizing: border-box;
background-color: rgba(0, 0, 0, .6) !important;
height: auto;
max-height: 0;
display: none;
overflow: hidden;
position: absolute;
width: calc(#{$sidebarWidth} - 32px);
@@ -398,6 +425,7 @@
transition: max-height 0.3s;
&.show-smileys {
display: flex;
max-height: 500%;
}
@@ -413,7 +441,7 @@
.smileyContainer {
width: 40px;
height: 36px;
height: 40px;
display: inline-block;
text-align: center;
}
@@ -509,7 +537,7 @@
&-header {
display: flex;
justify-content: flex-end;
justify-content: space-between;
align-items: center;
margin: 16px;
width: calc(100% - 32px);

View File

@@ -45,6 +45,10 @@
@extend .connection-info__icon;
}
&__mobile {
margin: 15px;
}
.connection-actions {
margin: 10px auto;
text-align: center;

View File

@@ -11,6 +11,8 @@
line-height: 13px;
margin: 0 auto;
width: 320px;
@include adjust-for-max-width(320px, 8px);
}
&-header {

View File

@@ -4,17 +4,28 @@
right: 0;
bottom: 0;
z-index: $drawerZ;
border-radius: 16px 16px 0 0;
}
.drawer-portal::after {
content: '';
background-color: $participantsPaneBgColor;
margin-bottom: env(safe-area-inset-bottom, 0);
}
.drawer-menu-container {
height: 100vh;
display: flex;
align-items: flex-end;
}
.drawer-menu {
max-height: 50vh;
max-height: calc(80vh - 64px);
background: #242528;
border-radius: 16px 16px 0 0;
overflow-y: auto;
&.expanded {
max-height: 80vh;
}
overflow-y: hidden;
margin-bottom: env(safe-area-inset-bottom, 0);
width: 100%;
.drawer-toggle {
display: flex;
@@ -42,6 +53,8 @@
font-size: 1.2em;
list-style-type: none;
padding: 0;
height: calc(80vh - 144px - 64px);
overflow-y: auto;
.overflow-menu-item {
box-sizing: border-box;

View File

@@ -8,7 +8,10 @@
.read-more {
cursor: pointer;
opacity: .7;
opacity: .9;
color: #fff;
font-size: 0.8rem;
font-weight: bold;
}
}

View File

@@ -1,129 +0,0 @@
/*
------------------------------
Impromptu
------------------------------
*/
.jqifade{
position: absolute;
background-color: #000;
}
div.jqi{
width: 400px;
position: absolute;
color: #3a3a3a;
background-color: #ffffff;
font-size: 11px;
text-align: left;
border: solid 1px #eeeeee;
border-radius: 6px;
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
padding: 7px;
}
div.jqi .jqicontainer{
}
div.jqi .jqiclose{
position: absolute;
top: 4px; right: -2px;
width: 18px;
cursor: default;
color: #bbbbbb;
font-weight: bold;
}
div.jqi .jqistate{
background-color: #fff;
}
div.jqi .jqititle{
padding: 5px 10px;
font-size: 16px;
line-height: 20px;
border-bottom: solid 1px #eeeeee;
}
div.jqi .jqimessage{
padding: 10px;
line-height: 20px;
color: #444444;
}
div.jqi .jqibuttons{
text-align: right;
margin: 0 -7px -7px -7px;
border-top: solid 1px #e4e4e4;
background-color: #f4f4f4;
border-radius: 0 0 6px 6px;
-moz-border-radius: 0 0 6px 6px;
-webkit-border-radius: 0 0 6px 6px;
}
div.jqi .jqibuttons button{
margin: 0;
padding: 5px 20px;
background-color: transparent !important;
font-weight: normal;
border: none;
border-left: solid 1px #e4e4e4;
color: #777;
font-weight: bold;
font-size: 12px;
}
div.jqi .jqibuttons button.jqidefaultbutton{
color: #489afe;
}
div.jqi .jqibuttons button:disabled {
color: #b6b6b6 !important;
}
div.jqi .jqibuttons button:hover,
div.jqi .jqibuttons button:focus{
color: #287ade;
outline: none;
}
.jqiwarning .jqi .jqibuttons{
background-color: #b95656;
}
/* sub states */
div.jqi .jqiparentstate::after{
background-color: #777;
opacity: 0.6;
filter: alpha(opacity=60);
content: '';
position: absolute;
top:0;left:0;bottom:0;right:0;
border-radius: 6px;
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
}
div.jqi .jqisubstate{
position: absolute;
top:0;
left: 20%;
width: 60%;
padding: 7px;
border: solid 1px #eeeeee;
border-top: none;
border-radius: 0 0 6px 6px;
-moz-border-radius: 0 0 6px 6px;
-webkit-border-radius: 0 0 6px 6px;
}
div.jqi .jqisubstate .jqibuttons button{
padding: 10px 18px;
}
/* arrows for tooltips/tours */
.jqi .jqiarrow{ position: absolute; height: 0; width:0; line-height: 0; font-size: 0; border: solid 10px transparent;}
.jqi .jqiarrowtl{ left: 10px; top: -20px; border-bottom-color: #ffffff; }
.jqi .jqiarrowtc{ left: 50%; top: -20px; border-bottom-color: #ffffff; margin-left: -10px; }
.jqi .jqiarrowtr{ right: 10px; top: -20px; border-bottom-color: #ffffff; }
.jqi .jqiarrowbl{ left: 10px; bottom: -20px; border-top-color: #ffffff; }
.jqi .jqiarrowbc{ left: 50%; bottom: -20px; border-top-color: #ffffff; margin-left: -10px; }
.jqi .jqiarrowbr{ right: 10px; bottom: -20px; border-top-color: #ffffff; }
.jqi .jqiarrowlt{ left: -20px; top: 10px; border-right-color: #ffffff; }
.jqi .jqiarrowlm{ left: -20px; top: 50%; border-right-color: #ffffff; margin-top: -10px; }
.jqi .jqiarrowlb{ left: -20px; bottom: 10px; border-right-color: #ffffff; }
.jqi .jqiarrowrt{ right: -20px; top: 10px; border-left-color: #ffffff; }
.jqi .jqiarrowrm{ right: -20px; top: 50%; border-left-color: #ffffff; margin-top: -10px; }
.jqi .jqiarrowrb{ right: -20px; bottom: 10px; border-left-color: #ffffff; }

View File

@@ -1,206 +0,0 @@
@charset "UTF-8";
/*!
* jQuery contextMenu - Plugin for simple contextMenu handling
*
* Version: v2.1.1
*
* Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF)
* Web: http://swisnl.github.io/jQuery-contextMenu/
*
* Copyright (c) 2011-2016 SWIS BV and contributors
*
* Licensed under
* MIT License http://www.opensource.org/licenses/mit-license
*
* Date: 2016-02-28T09:53:18.890Z
*/
@font-face {
font-family: "context-menu-icons";
font-style: normal;
font-weight: normal;
src: url("font/context-menu-icons.eot?2qmzf");
src: url("font/context-menu-icons.eot?2qmzf#iefix") format("embedded-opentype"), url("font/context-menu-icons.woff2?2qmzf") format("woff2"), url("font/context-menu-icons.woff?2qmzf") format("woff"), url("font/context-menu-icons.ttf?2qmzf") format("truetype");
}
.context-menu-icon:before {
position: absolute;
top: 50%;
left: 0;
width: 28px;
font-family: "context-menu-icons";
font-size: 16px;
font-style: normal;
font-weight: normal;
line-height: 1;
color: #2980b9;
text-align: center;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.context-menu-icon-add:before {
content: "";
}
.context-menu-icon-copy:before {
content: "";
}
.context-menu-icon-cut:before {
content: "";
}
.context-menu-icon-delete:before {
content: "";
}
.context-menu-icon-edit:before {
content: "";
}
.context-menu-icon-paste:before {
content: "";
}
.context-menu-icon-quit:before {
content: "";
}
.context-menu-icon.context-menu-hover:before {
color: #fff;
}
.context-menu-list {
position: absolute;
display: inline-block;
min-width: 180px;
max-width: 360px;
padding: 4px 0;
margin: 5px;
font-family: inherit;
font-size: inherit;
list-style-type: none;
background: #fff;
border: 1px solid #bebebe;
border-radius: $borderRadius;
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, .5);
box-shadow: 0 2px 5px rgba(0, 0, 0, .5);
}
.context-menu-item {
position: relative;
padding: 3px 28px;
color: #2f2f2f;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-color: #fff;
}
.context-menu-separator {
padding: 0;
margin: 5px 0;
border-bottom: 1px solid #e6e6e6;
}
.context-menu-item > label > input,
.context-menu-item > label > textarea {
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
}
.context-menu-item.context-menu-hover {
color: #fff;
cursor: pointer;
background-color: #2980b9;
}
.context-menu-item.context-menu-disabled {
color: #626262;
background-color: #fff;
}
.context-menu-item.context-menu-disabled {
color: #626262;
}
.context-menu-input.context-menu-hover,
.context-menu-item.context-menu-disabled.context-menu-hover {
cursor: default;
background-color: #eee;
}
.context-menu-submenu:after {
position: absolute;
top: 50%;
right: 8px;
z-index: $zindex1;
width: 0;
height: 0;
content: '';
border-color: transparent transparent transparent #2f2f2f;
border-style: solid;
border-width: 4px 0 4px 4px;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
}
/**
* Inputs
*/
.context-menu-item.context-menu-input {
padding: 5px 10px;
}
/* vertically align inside labels */
.context-menu-input > label > * {
vertical-align: top;
}
/* position checkboxes and radios as icons */
.context-menu-input > label > input[type="checkbox"],
.context-menu-input > label > input[type="radio"] {
position: relative;
top: 3px;
}
.context-menu-input > label,
.context-menu-input > label > input[type="text"],
.context-menu-input > label > textarea,
.context-menu-input > label > select {
display: block;
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.context-menu-input > label > textarea {
height: 100px;
}
.context-menu-item > .context-menu-list {
top: 5px;
/* re-positioned by js */
right: -5px;
display: none;
}
.context-menu-item.context-menu-visible > .context-menu-list {
display: block;
}
.context-menu-accesskey {
text-decoration: underline;
}

View File

@@ -38,17 +38,17 @@
}
}
#knocking-participant-list {
#notification-participant-list {
background-color: $newToolbarBackgroundColor;
border: 1px solid rgba(255, 255, 255, .4);
border-radius: 8px;
display: flex;
flex-direction: column;
left: 0;
margin: 20px;
max-height: 600px;
overflow: hidden;
overflow-y: auto;
position: fixed;
top: 20;
transition: top 1s ease;
top: 30px;
z-index: $toolbarZ + 1;
&.toolbox-visible {
@@ -94,8 +94,6 @@
.knocking-participants-container {
list-style-type: none;
max-height: 600px;
overflow-y: scroll;
padding: 0 15px 15px 15px;
}

View File

@@ -125,7 +125,8 @@
cursor: pointer;
}
&.with-click-handler:hover {
&.with-click-handler:hover,
&.with-click-handler:focus {
background-color: #c7ddff;
}
@@ -158,7 +159,7 @@
}
}
.item:hover {
.item:hover, .item:focus, .item:focus-within {
.delete-meeting {
display: block;
}

View File

@@ -206,3 +206,13 @@
bottom: 0;
width: 35%;
}
/**
* Resizes elements width to fill the whole screen width with some margin
*/
@mixin adjust-for-max-width($width, $margin) {
@media (max-width: $width) {
margin: 0 $margin;
width: $width - 2 * $margin;
}
}

View File

@@ -3,6 +3,15 @@
&-input-area {
margin: 0 auto;
text-align: center;
&-label {
display: block;
margin-bottom: 5px;
color: #ffffff;
font-weight: 300;
font-size: 15px;
line-height: 24px;
}
}
&-title {
@@ -74,10 +83,10 @@
z-index: 1;
&--warning {
background: rgba(241, 173, 51, 0.7)
background: rgba(241, 173, 51, 1);
}
&--ok {
background: rgba(49, 183, 106, 0.7);
background: rgba(49, 183, 106, 1);
}
}
@@ -92,6 +101,8 @@
&-error-desc {
margin-right: 4px;
color: #fff;
font-weight: bold;
}
.settings-button-container {
@@ -102,6 +113,8 @@
&-dropdown-btns {
width: 320px;
padding: 8px 0;
@include adjust-for-max-width(320px, 8px);
}
&-dropdown-btn {
@@ -129,6 +142,8 @@
}
&-dropdown-container {
margin-top: 16px;
& > div:nth-child(2) {
background: #fff;
padding: 0;

View File

@@ -1,8 +1,7 @@
/**
* Shared style for full screen local track based dialogs/modals.
*/
.premeeting-screen,
.preview-overlay {
.premeeting-screen {
position: absolute;
left: 0;
right: 0;
@@ -31,16 +30,18 @@
.action-btn {
border-radius: 3px;
box-sizing: border-box;
color: #fff;
cursor: pointer;
display: inline-block;
font-size: 15px;
line-height: 24px;
margin-top: 16px;
padding: 7px 16px;
position: relative;
text-align: center;
width: 286px;
width: 320px;
@include adjust-for-max-width(320px, 8px);
&.primary {
background: #0376DA;
@@ -93,11 +94,6 @@
}
}
.preview-overlay {
background-image: linear-gradient(transparent, black);
z-index: $toolbarZ + 1;
}
.content {
align-items: center;
display: flex;
@@ -119,7 +115,7 @@
cursor: pointer;
color: #fff;
display: flex;
flex-direction: row;
flex-direction: column;
font-size: 15px;
font-weight: 300;
justify-content: center;
@@ -145,6 +141,9 @@
margin-left: 10px;
}
}
.copy-button{
width: 298px;
}
.copy-meeting-text {
width: 266px;
@@ -178,12 +177,14 @@
text-align: center;
width: 320px;
@include adjust-for-max-width(320px, 8px);
&.error {
box-shadow: 0px 0px 4px 3px rgba(225, 45, 45, 0.4);
}
&.focused {
box-shadow: 0px 0px 4px 3px #0376DA;
box-shadow: 0px 0px 1px 1.5px black, 0px 0px 1.3px 4px white;
}
}
}
@@ -249,16 +250,23 @@
transition: background 0.16s ease-out;
width: 320px;
@include adjust-for-max-width(320px, 8px);
@include flex-centered();
svg {
fill: transparent;
}
label {
cursor: pointer;
}
&:hover {
background: rgba(255, 255, 255, 0.1);
@include icon-container(#A4B8D1, #1C2025);
.toggle-button-icon-container {
display: none;
}
}
&-container {
@@ -276,5 +284,15 @@
&--toggled {
@include icon-container(white, #1C2025);
&:hover {
.toggle-button-icon-container {
display: block;
}
}
.toggle-button-icon-container {
display: block;
}
}
}

189
css/_reactions-menu.scss Normal file
View File

@@ -0,0 +1,189 @@
@use 'sass:math';
.reactions-menu {
width: 280px;
background: #292929;
box-shadow: 0px 3px 16px rgba(0, 0, 0, 0.6), 0px 0px 4px 1px rgba(0, 0, 0, 0.25);
border-radius: 3px;
padding: 16px;
&.overflow {
width: auto;
padding-bottom: max(env(safe-area-inset-bottom, 0), 16px);
background-color: #141414;
box-shadow: none;
border-radius: 0;
position: relative;
.toolbox-icon {
width: 48px;
height: 48px;
span.emoji {
width: 48px;
height: 48px;
}
}
.reactions-row {
display: flex;
flex-direction: row;
justify-content: space-around;
.toolbox-button {
margin-right: 0;
}
}
}
.toolbox-icon {
width: 40px;
height: 40px;
border-radius: 6px;
span.emoji {
width: 40px;
height: 40px;
font-size: 22px;
display: flex;
align-items: center;
justify-content: center;
}
}
.reactions-row {
.toolbox-button {
margin-right: 8px;
touch-action: manipulation;
}
.toolbox-button:last-of-type {
margin-right: 0;
}
}
.raise-hand-row {
margin-top: 16px;
.toolbox-button {
width: 100%;
}
.toolbox-icon {
width: 100%;
flex-direction: row;
align-items: center;
span.text {
font-style: normal;
font-weight: 600;
font-size: 14px;
line-height: 24px;
margin-left: 8px;
}
}
}
}
.reactions-animations-container {
position: absolute;
width: 20%;
bottom: 0;
left: 40%;
height: 0;
}
.reactions-menu-popup-container,
.reactions-menu-popup {
display: inline-block;
position: relative;
}
$reactionCount: 20;
@function random($min, $max) {
@return math.random() * ($max - $min) + $min;
}
.reaction-emoji {
position: absolute;
font-size: 24px;
line-height: 32px;
width: 32px;
height: 32px;
top: 0;
left: 20px;
opacity: 0;
z-index: 1;
&.reaction-0 {
animation: flowToRight 5s forwards ease-in-out;
}
@for $i from 1 through $reactionCount {
&.reaction-#{$i} {
animation: animation-#{$i} 5s forwards ease-in-out;
top: #{random(-40, 10)}px;
left: #{random(0, 30)}px;
}
}
}
@keyframes flowToRight {
0% {
transform: translate(0px, 0px) scale(0.6);
opacity: 1;
}
70% {
transform: translate(40px, -70vh) scale(1.5);
opacity: 1;
}
75% {
transform: translate(40px, -70vh) scale(1.5);
opacity: 1;
}
100% {
transform: translate(140px, -50vh) scale(1);
opacity: 0;
}
}
@mixin animation-list {
@for $i from 1 through $reactionCount {
$topX: random(-100, 100);
$topY: random(65, 75);
$bottomX: random(150, 200);
$bottomY: random(40, 50);
@if $topX < 0 {
$bottomX: -$bottomX;
}
@keyframes animation-#{$i} {
0% {
transform: translate(0, 0) scale(0.6);
opacity: 1;
}
70% {
transform: translate(#{$topX}px, -#{$topY}vh) scale(1.5);
opacity: 1;
}
75% {
transform: translate(#{$topX}px, -#{$topY}vh) scale(1.5);
opacity: 1;
}
100% {
transform: translate(#{$bottomX}px, -#{$bottomY}vh) scale(1);
opacity: 0;
}
}
}
}
@include animation-list;

View File

@@ -105,6 +105,7 @@
.helper-link {
cursor: pointer;
font-weight: bold;
display: inline-block;
flex-shrink: 0;
margin-left: auto;

View File

@@ -9,8 +9,31 @@
z-index: $zindex3;
&.visible {
top: 0px;
top: 0;
}
&.recording {
top: 0;
.subject-details-container {
opacity: 0;
transition: opacity .3s ease-in;
}
.subject-info-container .show-always {
transition: margin-left .3s ease-in;
}
&.visible {
.subject-details-container {
opacity: 1;
}
}
}
}
.subject-details-container {
display: flex;
}
.subject-info-container {

View File

@@ -54,6 +54,7 @@
margin-bottom: 16px;
position: relative;
z-index: $toolbarZ;
pointer-events: none;
.button-group-center,
.button-group-left,
@@ -103,15 +104,24 @@
flex-direction: column;
margin: 0 auto;
max-width: 100%;
pointer-events: all;
border-radius: 6px;
}
.toolbox-content-wrapper::after {
content: '';
background: $newToolbarBackgroundColor;
padding-bottom: env(safe-area-inset-bottom, 0);
}
.toolbox-content-items {
background: $newToolbarBackgroundColor;
box-shadow: 0px 2px 8px 4px rgba(0, 0, 0, 0.25), 0px 0px 0px 1px rgba(0, 0, 0, 0.15);
border-radius: 6px;
margin: 0 auto;
padding: 6px;
text-align: center;
pointer-events: all;
box-shadow: 0px 2px 8px 4px rgba(0, 0, 0, 0.25), 0px 0px 0px 1px rgba(0, 0, 0, 0.15);
>div {
margin-left: 8px;
@@ -275,6 +285,10 @@
}
}
.profile-button-avatar {
align-items: center;
}
/**
* START of fade in animation for main toolbar
*/

View File

@@ -16,8 +16,8 @@
z-index: $subtitlesZ;
&.lifted {
// Lift subtitle above toolbar+invite box.
bottom: $newToolbarSize + 112px + 40px;
// Lift subtitle above toolbar+dominant speaker box.
bottom: $newToolbarSize + 36px + 40px;
}
span {

View File

@@ -46,6 +46,7 @@ $menuBG:#242528;
$newToolbarFontSize: 24px;
$newToolbarHangupFontSize: 32px;
$newToolbarSize: 48px;
$newToolbarSizeMobile: 60px;
$newToolbarSizeWithPadding: calc(#{$newToolbarSize} + 24px);
$toolbarTitleFontSize: 19px;
$overflowMenuItemColor: #fff;
@@ -115,7 +116,6 @@ $zindex2: 2;
$zindex3: 3;
$toolbarBackgroundZ: 4;
$labelsZ: 5;
$filmstripVideosZ: 6;
$subtitlesZ: 7;
$popoverZ: 8;
$zindex10: 10;
@@ -130,6 +130,9 @@ $dropdownMaskZ: 900;
$dropdownZ: 901;
$centeredVideoLabelZ: 1010;
$overlayZ: 1016;
// Place filmstrip videos over toolbar in order
// to make connection info visible.
$filmstripVideosZ: $toolbarZ + 1;
/**

View File

@@ -79,4 +79,8 @@
white-space: nowrap;
}
}
// Override @atlaskit/InlineDialog container which is made with styled components
& > div:nth-child(2) {
padding: 0;
}
}

View File

@@ -240,6 +240,15 @@
object-fit: cover;
}
#sharedVideo video {
width: 100%;
height: 100%;
}
#sharedVideo.disable-pointer {
pointer-events: none;
}
#sharedVideo,
#etherpad,
#localVideoWrapper video,
@@ -419,7 +428,7 @@
right: 0;
z-index: $zindex2;
width: 18px;
height: 13px;
height: 18px;
color: #FFF;
font-size: 10pt;
margin-right: $remoteVideoMenuIconMargin;

View File

@@ -122,11 +122,11 @@ body.welcome-page {
#moderated-meetings {
max-width: calc(100% - 40px);
padding: 16px 0 39px 0;
margin: $welcomePageEnterRoomMargin;
width: $welcomePageEnterRoomWidth;
p {
color: $welcomePageDescriptionColor;
float: left;
text-align: $welcomePageHeaderTextAlign;
a {

View File

@@ -3,7 +3,7 @@
justify-content: space-between;
align-items: center;
padding: 8px 8px 8px 16px;
margin-top: 8px;
margin-top: 5px;
width: calc(100% - 24px);
height: 24px;

View File

@@ -9,10 +9,10 @@ input[type=range]{
}
/**
* Disable the default focus styles for webkit range inputs (sliders).
* Show focus for keyboard accessibility.
*/
input[type=range]:focus {
outline: none;
outline: 1px solid white !important;
}
/**

View File

@@ -16,7 +16,6 @@
padding: 0;
margin: 0;
border: none;
outline: none;
-webkit-appearance: none;

View File

@@ -33,18 +33,18 @@
}
&__videos {
@extend %align-right;
position:relative;
padding: 0;
/* The filmstrip should not be covered by the left toolbar. */
bottom: 0;
width:auto;
overflow: visible !important;
&#remoteVideos {
border: $thumbnailsBorder solid transparent;
transition: bottom 2s;
flex-grow: 1;
display: flex;
flex-direction: row-reverse;
@include minHWAutoFix()
}
@@ -60,41 +60,25 @@
&.hidden {
bottom: calc(-196px - #{$newToolbarSizeWithPadding});
}
.remote-videos-container {
display: flex;
}
}
.remote-videos-container {
transition: opacity 1s;
.remote-videos {
& > div {
transition: opacity 1s;
position: absolute;
}
&.is-not-overflowing > div {
right: 2px;
}
}
&.hide-videos {
.remote-videos-container {
opacity: 0;
pointer-events: none;
}
}
#filmstripRemoteVideos {
@include minHWAutoFix();
display: flex;
flex: 1;
width: auto;
justify-content: flex-end;
flex-direction: row;
#filmstripRemoteVideosContainer {
flex-direction: row-reverse;
/**
* Add padding as a hack for Firefox not to show scrollbars when
* unnecessary.
*/
padding: 1px 0;
overflow-y: hidden;
overflow-x: scroll;
.remote-videos {
& > div {
opacity: 0;
pointer-events: none;
}
}
}
@@ -103,25 +87,3 @@
}
}
/**
* Workarounds for Edge and Firefox not handling scrolling properly with
* flex-direction: row-reverse.
*/
@mixin undoRowReverseVideos() {
.horizontal-filmstrip {
#remoteVideos #filmstripRemoteVideos #filmstripRemoteVideosContainer {
flex-direction: row;
}
}
}
/** Firefox detection hack **/
@-moz-document url-prefix() {
@include undoRowReverseVideos();
}
/** Edge detection hack **/
@supports (-ms-ime-align:auto) {
@include undoRowReverseVideos();
}

View File

@@ -7,16 +7,14 @@
* see.
*/
.active-speaker {
box-shadow: 0 0 5px 3px $videoThumbnailSelected
box-shadow: 0px 0px 1px 1.5px black, 0px 0px 1.3px 4px $videoThumbnailSelected;
}
#filmstripRemoteVideos {
.remote-videos {
align-items: center;
box-sizing: border-box;
display: flex;
flex-direction: column;
height: 100%;
width: 100%;
}
.filmstrip__videos .videocontainer {
@@ -34,6 +32,10 @@
*/
height: 100% !important;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
transition: margin-bottom .3s ease-in;
}
.filmstrip {
@@ -50,6 +52,22 @@
&.shift-right {
margin-left: $sidebarWidth;
width: calc(100% - #{$sidebarWidth});
.remote-videos {
width: calc(100vw - #{$sidebarWidth});
}
}
}
&.collapse {
#remoteVideos {
height: calc(100% - #{$newToolbarSizeMobile}) !important;
margin-bottom: $newToolbarSizeMobile;
}
.remote-videos {
// !important is needed here as overflow is set via element.style in a FixedSizeGrid.
overflow: hidden auto !important;
}
}
}
@@ -62,63 +80,49 @@
display: block;
}
#filmstripRemoteVideos {
.remote-videos {
box-sizing: border-box;
/**
* Allow vertical scrolling of the thumbnails.
*/
overflow-x: hidden;
overflow-y: auto;
}
/**
* The size of the thumbnails should be set with javascript, based on
* desired column count and window width. The rows are created using flex
* and allowing the thumbnails to wrap.
*/
#filmstripRemoteVideosContainer {
align-content: center;
align-items: center;
box-sizing: border-box;
display: flex;
flex-wrap: wrap;
flex-shrink: 0;
margin-top: auto;
margin-bottom: auto;
justify-content: center;
.videocontainer {
border: 0;
* The size of the thumbnails should be set with javascript, based on
* desired column count and window width. The rows are created using flex
* and allowing the thumbnails to wrap.
*/
& > div {
align-content: center;
align-items: center;
box-sizing: border-box;
display: block;
margin: 2px;
}
display: flex;
margin-top: auto;
margin-bottom: auto;
justify-content: center;
position: absolute;
video {
object-fit: contain;
}
.videocontainer {
border: 0;
box-sizing: border-box;
display: block;
margin: 2px;
}
/**
* Max-width corresponding to the ASPECT_RATIO_BREAKPOINT from features/filmstrip/constants.
*/
@media only screen and (max-width: 500px) {
video {
object-fit: cover;
object-fit: contain;
}
/**
* Max-width corresponding to the ASPECT_RATIO_BREAKPOINT from features/filmstrip/constants.
*/
@media only screen and (max-width: 500px) {
video {
object-fit: cover;
}
}
}
}
.has-overflow#filmstripRemoteVideosContainer {
align-content: baseline;
}
.has-overflow .videocontainer {
align-self: baseline;
}
}
.shift-right #filmstripRemoteVideosContainer {
.shift-right .remote-videos > div {
/**
* Max-width corresponding to the ASPECT_RATIO_BREAKPOINT from features/filmstrip/constants,
* from which we subtract the chat size.
@@ -129,3 +133,7 @@
}
}
}
.indicator-icon-container {
display: inline-block;
}

View File

@@ -1,8 +1,10 @@
.vertical-filmstrip .filmstrip {
&.hide-videos {
.remote-videos-container {
opacity: 0;
pointer-events: none;
.remote-videos {
& > div {
opacity: 0;
pointer-events: none;
}
}
}
@@ -26,7 +28,7 @@
flex-direction: column-reverse;
height: 100%;
width: 100%;
padding: ($desktopAppDragBarHeight - 5px) 5px 10px;
padding: ($desktopAppDragBarHeight - 5px) 5px calc(env(safe-area-inset-bottom, 0) + 10px);
/**
* fixed positioning is necessary for remote menus and tooltips to pop
* out of the scrolling filmstrip. AtlasKit dialogs and tooltips use
@@ -39,10 +41,6 @@
right: 0;
z-index: $filmstripVideosZ;
&.reduce-height {
height: calc(100% - #{$newToolbarSizeWithPadding});
}
/**
* Hide videos by making them slight to the right.
*/
@@ -98,33 +96,10 @@
* filmstrip from overlapping the left edge of the screen.
*/
#filmstripLocalVideo,
#filmstripRemoteVideos {
.remote-videos {
padding: 0;
}
#filmstripRemoteVideos {
@include minHWAutoFix();
display: flex;
flex: 1;
flex-direction: column-reverse;
height: auto;
overflow-x: hidden;
overflow-y: scroll;
#filmstripRemoteVideosContainer {
@include minHWAutoFix();
flex-direction: column-reverse;
overflow: visible;
width: calc(100% - 8px); // 8px for margin + border of the thumbnails
.videocontainer {
height: 0px;
width: 100%;
}
}
}
#remoteVideos {
@include minHWAutoFix();
@@ -132,56 +107,21 @@
flex-grow: 1;
}
.remote-videos-container {
&.reduce-height {
height: calc(100% - calc(#{$newToolbarSizeWithPadding} + #{$scrollHeight}));
}
.remote-videos {
display: flex;
transition: opacity 1s;
}
transition: height .3s ease-in;
.hide-scrollbar#filmstripRemoteVideos {
margin-right: 7px; // Scrollbar size
&::-webkit-scrollbar {
display: none;
& > div {
position: absolute;
transition: opacity 1s;
}
&.is-not-overflowing > div {
bottom: 0px;
}
}
}
/**
* Workarounds for Edge and Firefox not handling scrolling properly with
* flex-direction: column-reverse. The remove videos in filmstrip should
* start scrolling from the bottom of the filmstrip, but in those browsers the
* scrolling won't happen. Per W3C spec, scrolling should happen from the
* bottom. As such, use css hacks to get around the css issue, with the intent
* being to remove the hacks as the spec is supported.
*/
@mixin undoColumnReverseVideos() {
.vertical-filmstrip {
#remoteVideos #filmstripRemoteVideos #filmstripRemoteVideosContainer {
flex-direction: column;
}
}
}
/**
* FF does not include the scroll width when calculating the size of the content. That's why we need to include
* ourselves the width of the scroll so that the remote videos are aligned with the local one.
*/
@mixin filmstripSizeWithoutScroll {
.vertical-filmstrip {
#remoteVideos #filmstripRemoteVideos {
#filmstripRemoteVideosContainer {
width: calc(100% - 15px) // 8 px - margins + border of the thumbnails; 7px - for the scroll
}
}
}
}
/** Firefox detection hack **/
@-moz-document url-prefix() {
@include undoColumnReverseVideos();
@include filmstripSizeWithoutScroll();
}
/** Edge detection hack **/
@supports (-ms-ime-align:auto) {
@include undoColumnReverseVideos();
}

View File

@@ -81,7 +81,7 @@
.local-video-menu-trigger,
.remote-video-menu-trigger {
margin-bottom: 7px;
margin-bottom: 3px;
margin-left: $remoteVideoMenuIconMargin;
}
}

View File

@@ -41,6 +41,8 @@ $flagsImagePath: "../images/";
@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/speaker_stats/speaker_stats';
@import 'modals/video-quality/video-quality';
@import 'modals/virtual-background/virtual-background';
@@ -57,7 +59,6 @@ $flagsImagePath: "../images/";
@import 'welcome_page_content';
@import 'welcome_page_settings_toolbar';
@import 'toolbars';
@import 'jquery.contextMenu';
@import 'keyboard-shortcuts';
@import 'redirect_page';
@import 'components/form-control';
@@ -105,5 +106,7 @@ $flagsImagePath: "../images/";
@import 'connection-status';
@import 'drawer';
@import 'participants-pane';
@import 'reactions-menu';
@import 'plan-limit';
/* Modules END */

View File

@@ -103,7 +103,7 @@
font-size: 14px;
a {
color: #2684FF;
color: #6FB1EA;
cursor: pointer;
text-decoration: none;
}
@@ -119,7 +119,7 @@
height: 8px;
.audio-input-preview-level {
background: #4C9AFF;
background: #75B1FF;
border-radius: 5px;
height: 100%;
-webkit-transition: width .1s ease-in-out;
@@ -129,3 +129,20 @@
}
}
}
.device-selection.video-hidden {
display: flex;
flex-direction: column;
width: 100%;
.column-selectors {
width: 100%;
margin-left: 0;
}
.column-video {
order: 1;
width: 100%;
margin-top: 8px;
}
}

View File

@@ -94,5 +94,9 @@
};
}
.star-btn:focus,
.star-btn:active {
outline: 1px solid #B8C7E0;
}
}
}

View File

@@ -30,20 +30,26 @@
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-right: 5px;
}
.info-password-none,
.info-password-remote {
opacity: 0.5;
color: #fff;
}
.info-password-input {
width: 100%;
background-color: transparent;
border: none;
background-color: #0E1624;
border-radius: 3px;
border: 2px solid #202B3D;
color: inherit;
padding-left: 0;
}
.info-password-input:focus ,
.info-password-input:active {
border: 2px solid #B8C7E0;
}
.info-password-local {
user-select: text;

View File

@@ -130,6 +130,7 @@
display: inline-block;
vertical-align: middle;
cursor: pointer;
height: 24px;
}
}
@@ -141,7 +142,7 @@
& > a {
display: inline-block;
height: 24px;
width: 48px;
min-width: 48px;
border-radius: 3px;
text-align: center;
text-decoration: none;

View File

@@ -0,0 +1,22 @@
.share-audio-dialog {
.share-audio-animation {
width: 100%;
height: 90%;
object-fit: contain;
}
input[type="checkbox"] + svg + span {
color: #9FB0CC;
}
.separator-line {
margin: 24px 0 24px -20px;
padding: 0 20px;
width: 100%;
height: 1px;
background: #5E6D7A;
&:last-child {
display: none;
}
}
}

View File

@@ -0,0 +1,23 @@
.share-screen-warn-dialog {
font-size: 14px;
.separator-line {
margin: 24px 0 24px -20px;
padding: 0 20px;
width: 100%;
height: 1px;
background: #5E6D7A;
&:last-child {
display: none;
}
}
.header {
font-weight: 600;
}
.description {
margin-top: 16px;
}
}

View File

@@ -16,12 +16,19 @@
}
.mock-atlaskit-label {
color: #56637A;
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;
@@ -29,6 +36,12 @@
.calendar-tab,
.more-tab,
.box {
display: flex;
justify-content: space-between;
width: 100%;
}
.profile-edit {
display: flex;
width: 100%;
@@ -38,18 +51,24 @@
flex: 1;
}
.settings-sub-pane {
flex-grow: 1;
flex: 1;
}
.settings-sub-pane .right {
flex: 1;
}
.settings-sub-pane .left {
flex: 1;
}
.settings-sub-pane-element {
text-align: left;
flex: 1;
}
.profile-edit-field {
margin-right: 20px;
}
.language-settings {
max-width: 50%;
width: 35%;
}
.calendar-tab {
align-items: center;
flex-direction: column;
@@ -65,4 +84,14 @@
.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

@@ -86,6 +86,7 @@
.video-quality-dialog-label-container.active {
color: $videoQualityActive;
font-weight: bold;
&::before {
background: $videoQualityActive;

View File

@@ -1,133 +1,133 @@
.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: 8px;
column-gap: 9px;
cursor: pointer;
.thumbnail:hover, .blur:hover, .slight-blur:hover, .virtual-background-none:hover{
height: 56px;
width: 103px;
opacity: .5;
.desktop-share:hover,
.thumbnail:hover,
.blur:hover,
.slight-blur:hover,
.virtual-background-none:hover {
opacity: 0.5;
border: 2px solid #99bbf3;
@media (min-width: 432px) and (max-width: 632px) {
height: 56px;
width: 56px;
@media (max-width: 632px) {
height: 60px;
width: 60px;
}
}
.thumbnail {
.background-option {
margin-top: 8px;
border-radius: 6px;
object-fit: cover;
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 {
margin-top: 8px;
border-radius: 6px;
object-fit: cover;
height: 60px;
width: 107px;
border: 2px solid #246FE5;
border: 2px solid #246fe5;
}
.blur{
.blur {
box-shadow: inset 0 0 12px #000000;
margin-top: 8px;
background: #7E8287;
font-weight: bold;
height: 60px;
width: 107px;
border-radius: 6px;
text-align: center;
vertical-align: middle;
line-height: 60px;
background: #7e8287;
padding: 0 10px;
}
.blur-selected {
box-shadow: inset 0 0 12px #000000;
margin-top: 8px;
background: #7E8287;
font-weight: bold;
height: 60px;
width: 107px;
border-radius: 6px;
border: 2px solid #246FE5;
text-align: center;
vertical-align: middle;
line-height: 60px;
background: #7e8287;
border: 2px solid #246fe5;
padding: 0 10px;
}
.slight-blur{
.slight-blur {
box-shadow: inset 0 0 12px #000000;
margin-top: 8px;
background: #A4A4A4;
font-weight: bold;
height: 60px;
width: 107px;
border-radius: 6px;
text-align: center;
vertical-align: middle;
line-height: 60px;
background: #a4a4a4;
padding: 0 10px;
}
.slight-blur-selected{
.slight-blur-selected {
box-shadow: inset 0 0 12px #000000;
margin-top: 8px;
background: #A4A4A4;
font-weight: bold;
height: 60px;
width: 107px;
border-radius: 6px;
border: 2px solid #246FE5;
text-align: center;
vertical-align: middle;
line-height: 60px;
background: #a4a4a4;
border: 2px solid #246fe5;
padding: 0 10px;
}
.virtual-background-none {
margin-top: 8px;
background: #525252;
font-weight: bold;
height: 60px;
width: 107px;
border-radius: 6px;
text-align: center;
vertical-align: middle;
line-height: 60px;
padding: 0 10px;
}
.none-selected {
margin-top: 8px;
background: #525252;
font-weight: bold;
height: 60px;
width: 107px;
border-radius: 6px;
border: 2px solid #246FE5;
text-align: center;
vertical-align: middle;
line-height: 60px;
border: 2px solid #246fe5;
padding: 0 10px;
}
@media (min-width: 432px) and (max-width: 632px) {
.desktop-share {
background: #525252;
}
.desktop-share-selected {
background: #525252;
border: 2px solid #246fe5;
padding: 0 10px;
}
@media (max-width: 632px) {
font-size: 1.5vw;
.virtual-background-none, .thumbnail, .thumbnail-selected, .none-selected, .blur, .blur-selected, .slight-blur, .slight-blur-selected{
.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{
.file-upload-label {
font-size: 14px;
font-weight: 600;
line-height: 20px;
margin-left: -10px;
margin-top: 16px;
margin-bottom: 8px;
color: #669AEC;
color: #669aec;
display: inline-flex;
cursor: pointer;
}
@@ -138,22 +138,66 @@
display: none;
left: 96;
bottom: 51;
@media (min-width: 432px) and (max-width: 632px) {
left: 51px
@media (max-width: 632px) {
left: 51px;
}
}
.delete-image-icon:hover {
display: block;
}
.thumbnail-container {
position: relative;
&:focus-within {
.thumbnail ~ .delete-image-icon {
display: block;
}
}
}
.loading-content-text{
margin-right: 15px;
}
.add-background{
.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%;
}

View File

@@ -107,4 +107,4 @@ $selectActiveItemBg: darken($controlBackground, 20%);
/**
* TODO: Replace by themed component.
*/
$videoQualityActive: #4C9AFF;
$videoQualityActive: #57A0ff;

View File

@@ -125,11 +125,11 @@ case "$1" in
# Check whether prosody config has the internal muc, if not add it,
# as we are migrating configs
if [ -f $PROSODY_HOST_CONFIG ] && ! grep -q "internal.auth.$JVB_HOSTNAME" $PROSODY_HOST_CONFIG; then
echo -e "\nComponent \"internal.auth.$JVB_HOSTNAME\" \"muc\"" >> $PROSODY_HOST_CONFIG
if [ -f $PROSODY_HOST_CONFIG ] && ! grep -q "internal.$JICOFO_AUTH_DOMAIN" $PROSODY_HOST_CONFIG; then
echo -e "\nComponent \"internal.$JICOFO_AUTH_DOMAIN\" \"muc\"" >> $PROSODY_HOST_CONFIG
echo -e " storage = \"memory\"" >> $PROSODY_HOST_CONFIG
echo -e " modules_enabled = { \"ping\"; }" >> $PROSODY_HOST_CONFIG
echo -e " admins = { \"$JICOFO_AUTH_USER@auth.$JVB_HOSTNAME\", \"jvb@auth.$JVB_HOSTNAME\" }" >> $PROSODY_HOST_CONFIG
echo -e " admins = { \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\", \"jvb@$JICOFO_AUTH_DOMAIN\" }" >> $PROSODY_HOST_CONFIG
fi
# Convert the old focus component config to the new one.
@@ -140,7 +140,7 @@ case "$1" in
# Component "focus.jitmeet.example.com" "client_proxy"
# target_address = "focus@auth.jitmeet.example.com"
if grep -q "Component \"focus.$JVB_HOSTNAME\"" $PROSODY_HOST_CONFIG && ! grep "Component \"focus.$JVB_HOSTNAME\" \"client_proxy\"" $PROSODY_HOST_CONFIG ;then
sed -i "s/Component \"focus.$JVB_HOSTNAME\"/Component \"focus.$JVB_HOSTNAME\" \"client_proxy\"\n target_address = \"$JICOFO_AUTH_USER@auth.$JVB_HOSTNAME\"/g" $PROSODY_HOST_CONFIG
sed -i "s/Component \"focus.$JVB_HOSTNAME\"/Component \"focus.$JVB_HOSTNAME\" \"client_proxy\"\n target_address = \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\"/g" $PROSODY_HOST_CONFIG
PROSODY_CONFIG_PRESENT="false"
fi
@@ -151,8 +151,21 @@ case "$1" in
PROSODY_CONFIG_PRESENT="false"
fi
# Updates main muc component
MAIN_MUC_PATTERN="Component \"conference.$JVB_HOSTNAME\" \"muc\""
if ! grep -A 2 -- "${MAIN_MUC_PATTERN}" $PROSODY_HOST_CONFIG | grep -q "restrict_room_creation" ;then
sed -i "s/${MAIN_MUC_PATTERN}/${MAIN_MUC_PATTERN}\n restrict_room_creation = true/g" $PROSODY_HOST_CONFIG
PROSODY_CONFIG_PRESENT="false"
fi
if ! grep -q -- 'unlimited_jids' $PROSODY_HOST_CONFIG ;then
sed -i "1s/^/unlimited_jids = { \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\", \"jvb@$JICOFO_AUTH_DOMAIN\" }\n/" $PROSODY_HOST_CONFIG
sed -i "s/VirtualHost \"$JICOFO_AUTH_DOMAIN\"/VirtualHost \"$JICOFO_AUTH_DOMAIN\"\n modules_enabled = { \"limits_exception\"; }/g" $PROSODY_HOST_CONFIG
PROSODY_CONFIG_PRESENT="false"
fi
# Make sure the focus@auth user's roster includes the proxy component (this is idempotent)
prosodyctl mod_roster_command subscribe focus.$JVB_HOSTNAME $JICOFO_AUTH_USER@auth.$JVB_HOSTNAME
prosodyctl mod_roster_command subscribe focus.$JVB_HOSTNAME $JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN
if [ ! -f /var/lib/prosody/$JVB_HOSTNAME.crt ]; then
# prosodyctl takes care for the permissions

View File

@@ -20,6 +20,11 @@ ssl = {
ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
}
unlimited_jids = {
"focusUser@auth.jitmeet.example.com",
"jvb@auth.jitmeet.example.com"
}
VirtualHost "jitmeet.example.com"
-- enabled = false -- Remove this line to enable this host
authentication = "anonymous"
@@ -35,6 +40,7 @@ VirtualHost "jitmeet.example.com"
key = "/etc/prosody/certs/jitmeet.example.com.key";
certificate = "/etc/prosody/certs/jitmeet.example.com.crt";
}
av_moderation_component = "avmoderation.jitmeet.example.com"
speakerstats_component = "speakerstats.jitmeet.example.com"
conference_duration_component = "conferenceduration.jitmeet.example.com"
-- we need bosh
@@ -46,6 +52,7 @@ VirtualHost "jitmeet.example.com"
"external_services";
"conference_duration";
"muc_lobby_rooms";
"av_moderation";
}
c2s_require_encryption = false
lobby_muc = "lobby.jitmeet.example.com"
@@ -53,6 +60,7 @@ VirtualHost "jitmeet.example.com"
-- muc_lobby_whitelist = { "recorder.jitmeet.example.com" } -- Here we can whitelist jibri to enter lobby enabled rooms
Component "conference.jitmeet.example.com" "muc"
restrict_room_creation = true
storage = "memory"
modules_enabled = {
"muc_meeting_id";
@@ -74,6 +82,9 @@ Component "internal.auth.jitmeet.example.com" "muc"
muc_room_default_public_jids = true
VirtualHost "auth.jitmeet.example.com"
modules_enabled = {
"limits_exception";
}
authentication = "internal_hashed"
-- Proxy to jicofo's user JID, so that it doesn't have to register as a component.
@@ -86,6 +97,9 @@ Component "speakerstats.jitmeet.example.com" "speakerstats_component"
Component "conferenceduration.jitmeet.example.com" "conference_duration_component"
muc_component = "conference.jitmeet.example.com"
Component "avmoderation.jitmeet.example.com" "av_moderation_component"
muc_component = "conference.jitmeet.example.com"
Component "lobby.jitmeet.example.com" "muc"
storage = "memory"
restrict_room_creation = true

View File

@@ -35,6 +35,7 @@ server {
ssl_session_tickets off;
add_header Strict-Transport-Security "max-age=63072000" always;
set $prefix "";
ssl_certificate /etc/jitsi/meet/jitsi-meet.example.com.crt;
ssl_certificate_key /etc/jitsi/meet/jitsi-meet.example.com.key;
@@ -76,7 +77,7 @@ server {
# BOSH
location = /http-bind {
proxy_pass http://localhost:5280/http-bind;
proxy_pass http://127.0.0.1:5280/http-bind?prefix=$prefix&$args;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
}
@@ -125,13 +126,6 @@ server {
alias /etc/jitsi/meet/jitsi-meet.example.com-config.js;
}
# Anything that didn't match above, and isn't a real file, assume it's a room name and redirect to /
location ~ ^/([^/?&:'"]+)/(.*)$ {
set $subdomain "$1.";
set $subdir "$1/";
rewrite ^/([^/?&:'"]+)/(.*)$ /$2;
}
# BOSH for subdomains
location ~ ^/([^/?&:'"]+)/http-bind {
set $subdomain "$1.";
@@ -149,4 +143,11 @@ server {
rewrite ^/(.*)$ /xmpp-websocket;
}
# Anything that didn't match above, and isn't a real file, assume it's a room name and redirect to /
location ~ ^/([^/?&:'"]+)/(.*)$ {
set $subdomain "$1.";
set $subdir "$1/";
rewrite ^/([^/?&:'"]+)/(.*)$ /$2;
}
}

BIN
images/icon-cloud.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 B

BIN
images/share-audio.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

View File

@@ -186,10 +186,10 @@
<!--#include virtual="static/settingsToolbarAdditionalContent.html" -->
</head>
<body>
<noscript>
<noscript aria-hidden="true">
<div>JavaScript is disabled. </br>For this site to work you have to enable JavaScript.</div>
</noscript>
<!--#include virtual="body.html" -->
<div id="react"></div>
<div id="react" role="main"></div>
</body>
</html>

View File

@@ -174,7 +174,7 @@ var interfaceConfig = {
RECENT_LIST_ENABLED: true,
REMOTE_THUMBNAIL_RATIO: 1, // 1:1
SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile', 'calendar' ],
SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile', 'calendar', 'sounds' ],
/**
* Specify which sharing features should be displayed. If the value is not set
@@ -208,13 +208,7 @@ var interfaceConfig = {
* DEPRECATED!
* This config was moved to config.js as `toolbarButtons`.
*/
// TOOLBAR_BUTTONS: [
// 'microphone', 'camera', 'closedcaptions', 'desktop', 'embedmeeting', 'fullscreen',
// 'fodeviceselection', 'hangup', 'profile', 'chat', 'recording',
// 'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand',
// 'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts',
// 'tileview', 'select-background', 'download', 'help', 'mute-everyone', 'mute-video-everyone', 'security'
// ],
// TOOLBAR_BUTTONS: [],
TOOLBAR_TIMEOUT: 4000,

View File

@@ -58,7 +58,9 @@ target 'JitsiMeetSDK' do
pod 'react-native-calendar-events', :path => '../node_modules/react-native-calendar-events'
pod 'react-native-keep-awake', :path => '../node_modules/react-native-keep-awake'
pod 'react-native-netinfo', :path => '../node_modules/@react-native-community/netinfo'
pod 'react-native-slider', :path => '../node_modules/@react-native-community/slider'
pod 'react-native-splash-screen', :path => '../node_modules/react-native-splash-screen'
pod 'react-native-video', :path => '../node_modules/react-native-video/react-native-video.podspec'
pod 'react-native-webview', :path => '../node_modules/react-native-webview'
pod 'react-native-webrtc', :path => '../node_modules/react-native-webrtc'
pod 'RNCAsyncStorage', :path => '../node_modules/@react-native-async-storage/async-storage'

View File

@@ -1,9 +1,9 @@
PODS:
- AppAuth (1.2.0):
- AppAuth/Core (= 1.2.0)
- AppAuth/ExternalUserAgent (= 1.2.0)
- AppAuth/Core (1.2.0)
- AppAuth/ExternalUserAgent (1.2.0)
- AppAuth (1.4.0):
- AppAuth/Core (= 1.4.0)
- AppAuth/ExternalUserAgent (= 1.4.0)
- AppAuth/Core (1.4.0)
- AppAuth/ExternalUserAgent (1.4.0)
- boost-for-react-native (1.63.0)
- CocoaLumberjack (3.5.3):
- CocoaLumberjack/Core (= 3.5.3)
@@ -48,7 +48,7 @@ PODS:
- GoogleUtilities/Environment (~> 6.7)
- GoogleUtilities/Logger (~> 6.7)
- nanopb (~> 1.30906.0)
- FirebaseCrashlytics (4.6.1):
- FirebaseCrashlytics (4.6.2):
- FirebaseCore (~> 6.10)
- FirebaseInstallations (~> 1.6)
- GoogleDataTransport (~> 7.2)
@@ -77,9 +77,9 @@ PODS:
- GoogleUtilities/Network (~> 6.7)
- "GoogleUtilities/NSData+zlib (~> 6.7)"
- nanopb (~> 1.30906.0)
- GoogleDataTransport (7.4.0):
- GoogleDataTransport (7.5.1):
- nanopb (~> 1.30906.0)
- GoogleSignIn (5.0.1):
- GoogleSignIn (5.0.2):
- AppAuth (~> 1.2)
- GTMAppAuth (~> 1.0)
- GTMSessionFetcher/Core (~> 1.1)
@@ -102,21 +102,17 @@ PODS:
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (6.7.2):
- GoogleUtilities/Logger
- GTMAppAuth (1.0.0):
- AppAuth/Core (~> 1.0)
- GTMSessionFetcher (~> 1.1)
- GTMSessionFetcher (1.2.2):
- GTMSessionFetcher/Full (= 1.2.2)
- GTMSessionFetcher/Core (1.2.2)
- GTMSessionFetcher/Full (1.2.2):
- GTMSessionFetcher/Core (= 1.2.2)
- GTMAppAuth (1.2.2):
- AppAuth/Core (~> 1.4)
- GTMSessionFetcher/Core (~> 1.5)
- GTMSessionFetcher/Core (1.6.1)
- nanopb (1.30906.0):
- nanopb/decode (= 1.30906.0)
- nanopb/encode (= 1.30906.0)
- nanopb/decode (1.30906.0)
- nanopb/encode (1.30906.0)
- ObjectiveDropboxOfficial (3.9.4)
- PromisesObjC (1.2.10)
- PromisesObjC (1.2.12)
- RCTRequired (0.61.5-jitsi.2)
- RCTTypeSafety (0.61.5-jitsi.2):
- FBLazyVector (= 0.61.5-jitsi.2)
@@ -288,9 +284,16 @@ PODS:
- React
- react-native-netinfo (4.1.5):
- React
- react-native-slider (3.0.3):
- React
- react-native-splash-screen (3.2.0):
- React
- react-native-webrtc (1.89.1):
- react-native-video (5.1.1):
- React-Core
- react-native-video/Video (= 5.1.1)
- react-native-video/Video (5.1.1):
- React-Core
- react-native-webrtc (1.92.0):
- React-Core
- react-native-webview (11.0.2):
- React-Core
@@ -348,8 +351,8 @@ PODS:
- React-jsi (= 0.61.5-jitsi.2)
- ReactCommon/jscallinvoker (= 0.61.5-jitsi.2)
- ReactCommon/turbomodule/core (= 0.61.5-jitsi.2)
- RNCAsyncStorage (1.13.2):
- React
- RNCAsyncStorage (1.15.5):
- React-Core
- RNDefaultPreference (1.4.2):
- React
- RNDeviceInfo (8.0.0):
@@ -394,7 +397,9 @@ DEPENDENCIES:
- react-native-calendar-events (from `../node_modules/react-native-calendar-events`)
- react-native-keep-awake (from `../node_modules/react-native-keep-awake`)
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
- "react-native-slider (from `../node_modules/@react-native-community/slider`)"
- react-native-splash-screen (from `../node_modules/react-native-splash-screen`)
- react-native-video (from `../node_modules/react-native-video/react-native-video.podspec`)
- react-native-webrtc (from `../node_modules/react-native-webrtc`)
- react-native-webview (from `../node_modules/react-native-webview`)
- React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
@@ -475,8 +480,12 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-keep-awake"
react-native-netinfo:
:path: "../node_modules/@react-native-community/netinfo"
react-native-slider:
:path: "../node_modules/@react-native-community/slider"
react-native-splash-screen:
:path: "../node_modules/react-native-splash-screen"
react-native-video:
:path: "../node_modules/react-native-video/react-native-video.podspec"
react-native-webrtc:
:path: "../node_modules/react-native-webrtc"
react-native-webview:
@@ -519,7 +528,7 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/yoga"
SPEC CHECKSUMS:
AppAuth: bce82c76043657c99d91e7882e8a9e1a93650cd4
AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
CocoaLumberjack: 2f44e60eb91c176d471fdba43b9e3eae6a721947
DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2
@@ -529,20 +538,20 @@ SPEC CHECKSUMS:
FirebaseAnalytics: 5dd088bd2e67bb9d13dbf792d1164ceaf3052193
FirebaseCore: d889d9e12535b7f36ac8bfbf1713a0836a3012cd
FirebaseCoreDiagnostics: 770ac5958e1372ce67959ae4b4f31d8e127c3ac1
FirebaseCrashlytics: 5777d3462fb8c3ab9e80a2473bd7d667a2e8411c
FirebaseCrashlytics: 1a747c9cc084a24dc6d9511c991db1cd078154eb
FirebaseDynamicLinks: 6eac37d86910382eafb6315d952cc44c9e176094
FirebaseInstallations: 466c7b4d1f58fe16707693091da253726a731ed2
Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51
glog: 1f3da668190260b06b429bb211bfbee5cd790c28
GoogleAppMeasurement: 966e88df9d19c15715137bb2ddaf52373f111436
GoogleDataTransport: b7f406340a291370045a270c599e53c6fa6ec20f
GoogleSignIn: 3a51b9bb8e48b635fd7f4272cee06ca260345b86
GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833
GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213
GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3
GTMAppAuth: 4deac854479704f348309e7b66189e604cf5e01e
GTMSessionFetcher: 61bb0f61a4cb560030f1222021178008a5727a23
GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89
GTMSessionFetcher: 36689134877faeb055b27dfa4ccc9ceaa42e029e
nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc
ObjectiveDropboxOfficial: a5afefc83f6467c42c45f2253f583f2ad1ffc701
PromisesObjC: b14b1c6b68e306650688599de8a45e49fae81151
PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
RCTRequired: a686731276578c125dff205f08b6ec9cee6ede32
RCTTypeSafety: 88e5500e801c00d16a3d1895e3470d13beed6584
React: 8b2bcf6a93846e47a7a365a54ec6edeb78b37701
@@ -556,8 +565,10 @@ SPEC CHECKSUMS:
react-native-calendar-events: 1442fad71a00388f933cfa25512588fec300fcf8
react-native-keep-awake: eba3137546b10003361b37c761f6c429b59814ae
react-native-netinfo: 8d8db463bcc5db66a8ac5c48a7d86beb3b92f61a
react-native-slider: b733e17fdd31186707146debf1f04b5d94aa1a93
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
react-native-webrtc: ccb0c21eb4fb04326648fbdb4a5d49977e2cf274
react-native-video: 1574074179ecaf6a9dd067116c8f31bf9fec15c8
react-native-webrtc: bbb644859dcc37ccb7edaec860ca62ed47bf996c
react-native-webview: b2542d6fd424bcc3e3b2ec5f854f0abb4ec86c87
React-RCTActionSheet: bcbc311dc3b47bc8efb2737ff0940239a45789a9
React-RCTAnimation: 65f61080ce632f6dea23d52e354ffac9948396c6
@@ -569,7 +580,7 @@ SPEC CHECKSUMS:
React-RCTText: 4f1b99f228278d2a5e9008eced8dc9c974c4a270
React-RCTVibration: c1041024893fdfdb8371e7c720c437751b711676
ReactCommon: 18014e1d98dbeb9141e935cfe35fc93bd511ffb6
RNCAsyncStorage: bc2f81cc1df90c267ce9ed30bb2dbc93b945a8ee
RNCAsyncStorage: 8324611026e8dc3706f829953aa6e3899f581589
RNDefaultPreference: 56a405ce61033ac77b95004dccd7ac54c2eb50d1
RNDeviceInfo: 72ded653ce636b3f03571e90bed99309a714944e
RNGoogleSignin: 39336070b35fc4cea6a98cf111e00480317be0ae
@@ -578,6 +589,6 @@ SPEC CHECKSUMS:
RNWatch: a5320c959c75e72845c07985f3e935e58998f1d3
Yoga: 96b469c5e81ff51b917b92e8c3390642d4ded30c
PODFILE CHECKSUM: d059cebf82da14a53940a16c24c3330752d4b0c8
PODFILE CHECKSUM: f4db44d934caeae7212dbaa33abe62ed164363e8
COCOAPODS: 1.10.1

View File

@@ -23,12 +23,13 @@
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
4E51B75E25E4115F0038575A /* DarwinNotificationCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E51B75D25E4115F0038575A /* DarwinNotificationCenter.m */; };
4EC49BB725BEDAC100E76218 /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EC49B8625BED71300E76218 /* ReplayKit.framework */; };
4EC49BBB25BEDAC100E76218 /* SampleHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EC49BBA25BEDAC100E76218 /* SampleHandler.m */; };
4EC49BBF25BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 4EC49BB625BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
4EC49BCB25BEDB6400E76218 /* SocketConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EC49BCA25BEDB6400E76218 /* SocketConnection.m */; };
4EC49BD125BF19CF00E76218 /* SampleUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EC49BD025BF19CF00E76218 /* SampleUploader.m */; };
4E90F9402632D1AB001102D4 /* Atomic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E90F93F2632D1AB001102D4 /* Atomic.swift */; };
4EB06024260E026600F524C5 /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EC49B8625BED71300E76218 /* ReplayKit.framework */; };
4EB06027260E026600F524C5 /* SampleHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB06026260E026600F524C5 /* SampleHandler.swift */; };
4EB0602B260E026600F524C5 /* JitsiMeetBroadcastExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 4EB06023260E026600F524C5 /* JitsiMeetBroadcastExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
4EB0603C260E09D000F524C5 /* SocketConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB06039260E09D000F524C5 /* SocketConnection.swift */; };
4EB0603D260E09D000F524C5 /* DarwinNotificationCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB0603A260E09D000F524C5 /* DarwinNotificationCenter.swift */; };
4EB0603E260E09D000F524C5 /* SampleUploader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB0603B260E09D000F524C5 /* SampleUploader.swift */; };
55BEDABDA92D47D399A70A5E /* libPods-JitsiMeet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D878B07B3FBD6E305EAA6B27 /* libPods-JitsiMeet.a */; };
DE050389256E904600DEE3A5 /* WebRTC.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE050388256E904600DEE3A5 /* WebRTC.xcframework */; };
DE05038A256E904600DEE3A5 /* WebRTC.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DE050388256E904600DEE3A5 /* WebRTC.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@@ -54,11 +55,11 @@
remoteGlobalIDString = 0BEA5C241F7B8F73000D0AB4;
remoteInfo = JitsiMeetCompanion;
};
4EC49BBD25BEDAC100E76218 /* PBXContainerItemProxy */ = {
4EB06029260E026600F524C5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 4EC49BB525BEDAC100E76218;
remoteGlobalIDString = 4EB06022260E026600F524C5;
remoteInfo = "JitsiMeetBroadcast Extension";
};
/* End PBXContainerItemProxy section */
@@ -104,7 +105,7 @@
dstPath = "";
dstSubfolderSpec = 13;
files = (
4EC49BBF25BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex in Embed App Extensions */,
4EB0602B260E026600F524C5 /* JitsiMeetBroadcastExtension.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
@@ -139,19 +140,18 @@
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
4670A512A688E2DC34528282 /* Pods-jitsi-meet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-jitsi-meet.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-jitsi-meet/Pods-jitsi-meet.debug.xcconfig"; sourceTree = "<group>"; };
4E51B75C25E4115F0038575A /* DarwinNotificationCenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DarwinNotificationCenter.h; sourceTree = "<group>"; };
4E51B75D25E4115F0038575A /* DarwinNotificationCenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DarwinNotificationCenter.m; sourceTree = "<group>"; };
4E90F93F2632D1AB001102D4 /* Atomic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Atomic.swift; sourceTree = "<group>"; };
4EB06023260E026600F524C5 /* JitsiMeetBroadcastExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = JitsiMeetBroadcastExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
4EB06026260E026600F524C5 /* SampleHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleHandler.swift; sourceTree = "<group>"; };
4EB06028260E026600F524C5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4EB06032260E08CC00F524C5 /* extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = extension.entitlements; sourceTree = "<group>"; };
4EB06039260E09D000F524C5 /* SocketConnection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketConnection.swift; sourceTree = "<group>"; };
4EB0603A260E09D000F524C5 /* DarwinNotificationCenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DarwinNotificationCenter.swift; sourceTree = "<group>"; };
4EB0603B260E09D000F524C5 /* SampleUploader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SampleUploader.swift; sourceTree = "<group>"; };
4EC49B8625BED71300E76218 /* ReplayKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReplayKit.framework; path = System/Library/Frameworks/ReplayKit.framework; sourceTree = SDKROOT; };
4EC49BB625BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "JitsiMeetBroadcast Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
4EC49BB925BEDAC100E76218 /* SampleHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SampleHandler.h; sourceTree = "<group>"; };
4EC49BBA25BEDAC100E76218 /* SampleHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SampleHandler.m; sourceTree = "<group>"; };
4EC49BBC25BEDAC100E76218 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4EC49BC925BEDB6400E76218 /* SocketConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SocketConnection.h; sourceTree = "<group>"; };
4EC49BCA25BEDB6400E76218 /* SocketConnection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SocketConnection.m; sourceTree = "<group>"; };
4EC49BCF25BF19CF00E76218 /* SampleUploader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SampleUploader.h; sourceTree = "<group>"; };
4EC49BD025BF19CF00E76218 /* SampleUploader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SampleUploader.m; sourceTree = "<group>"; };
4EC49BDB25BF280A00E76218 /* extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = extension.entitlements; sourceTree = "<group>"; };
5FEF9D87A4D2A38AD7193308 /* Pods-JitsiMeet-JitsiMeetBroadcastExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet-JitsiMeetBroadcastExtension.release.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeet-JitsiMeetBroadcastExtension/Pods-JitsiMeet-JitsiMeetBroadcastExtension.release.xcconfig"; sourceTree = "<group>"; };
609CB2080B75F75A89923F3D /* Pods-JitsiMeet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeet/Pods-JitsiMeet.debug.xcconfig"; sourceTree = "<group>"; };
A7B2827E068A0E05260054AC /* Pods-JitsiMeet-JitsiMeetBroadcastExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet-JitsiMeetBroadcastExtension.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeet-JitsiMeetBroadcastExtension/Pods-JitsiMeet-JitsiMeetBroadcastExtension.debug.xcconfig"; sourceTree = "<group>"; };
B3B083EB1D4955FF0069CEE7 /* app.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = app.entitlements; sourceTree = "<group>"; };
D878B07B3FBD6E305EAA6B27 /* libPods-JitsiMeet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JitsiMeet.a"; sourceTree = BUILT_PRODUCTS_DIR; };
DE050388256E904600DEE3A5 /* WebRTC.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WebRTC.xcframework; path = "../../node_modules/react-native-webrtc/apple/WebRTC.xcframework"; sourceTree = "<group>"; };
@@ -189,11 +189,11 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
4EC49BB325BEDAC100E76218 /* Frameworks */ = {
4EB06020260E026600F524C5 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4EC49BB725BEDAC100E76218 /* ReplayKit.framework in Frameworks */,
4EB06024260E026600F524C5 /* ReplayKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -261,23 +261,22 @@
path = src;
sourceTree = "<group>";
};
4EC49BB825BEDAC100E76218 /* JitsiMeetBroadcast Extension */ = {
4EB06025260E026600F524C5 /* JitsiMeetBroadcast Extension */ = {
isa = PBXGroup;
children = (
4EC49BDB25BF280A00E76218 /* extension.entitlements */,
4EC49BB925BEDAC100E76218 /* SampleHandler.h */,
4EC49BBA25BEDAC100E76218 /* SampleHandler.m */,
4EC49BC925BEDB6400E76218 /* SocketConnection.h */,
4EC49BCA25BEDB6400E76218 /* SocketConnection.m */,
4EC49BCF25BF19CF00E76218 /* SampleUploader.h */,
4EC49BD025BF19CF00E76218 /* SampleUploader.m */,
4EC49BBC25BEDAC100E76218 /* Info.plist */,
4E51B75C25E4115F0038575A /* DarwinNotificationCenter.h */,
4E51B75D25E4115F0038575A /* DarwinNotificationCenter.m */,
4EB06032260E08CC00F524C5 /* extension.entitlements */,
4EB06026260E026600F524C5 /* SampleHandler.swift */,
4EB0603B260E09D000F524C5 /* SampleUploader.swift */,
4EB06039260E09D000F524C5 /* SocketConnection.swift */,
4EB0603A260E09D000F524C5 /* DarwinNotificationCenter.swift */,
4E90F93F2632D1AB001102D4 /* Atomic.swift */,
4EB06028260E026600F524C5 /* Info.plist */,
);
indentWidth = 4;
name = "JitsiMeetBroadcast Extension";
path = "broadcast-extension";
sourceTree = "<group>";
tabWidth = 4;
};
5E96ADD5E49F3B3822EF9A52 /* Pods */ = {
isa = PBXGroup;
@@ -286,6 +285,8 @@
09AA3B93E4CC62D84B424690 /* Pods-jitsi-meet.release.xcconfig */,
609CB2080B75F75A89923F3D /* Pods-JitsiMeet.debug.xcconfig */,
FC040BBED70876444D89E91C /* Pods-JitsiMeet.release.xcconfig */,
A7B2827E068A0E05260054AC /* Pods-JitsiMeet-JitsiMeetBroadcastExtension.debug.xcconfig */,
5FEF9D87A4D2A38AD7193308 /* Pods-JitsiMeet-JitsiMeetBroadcastExtension.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
@@ -299,8 +300,8 @@
13B07FAE1A68108700A75B9A /* src */,
5E96ADD5E49F3B3822EF9A52 /* Pods */,
0BEA5C261F7B8F73000D0AB4 /* Watch app */,
4EC49BB825BEDAC100E76218 /* JitsiMeetBroadcast Extension */,
0BEA5C351F7B8F73000D0AB4 /* WatchKit extension */,
4EB06025260E026600F524C5 /* JitsiMeetBroadcast Extension */,
);
indentWidth = 2;
sourceTree = "<group>";
@@ -312,7 +313,7 @@
13B07F961A680F5B00A75B9A /* jitsi-meet.app */,
0BEA5C251F7B8F73000D0AB4 /* JitsiMeetCompanion.app */,
0BEA5C311F7B8F73000D0AB4 /* JitsiMeetCompanion Extension.appex */,
4EC49BB625BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex */,
4EB06023260E026600F524C5 /* JitsiMeetBroadcastExtension.appex */,
);
name = Products;
sourceTree = "<group>";
@@ -376,28 +377,28 @@
);
dependencies = (
0BEA5C401F7B8F73000D0AB4 /* PBXTargetDependency */,
4EC49BBE25BEDAC100E76218 /* PBXTargetDependency */,
4EB0602A260E026600F524C5 /* PBXTargetDependency */,
);
name = JitsiMeet;
productName = "Jitsi Meet";
productReference = 13B07F961A680F5B00A75B9A /* jitsi-meet.app */;
productType = "com.apple.product-type.application";
};
4EC49BB525BEDAC100E76218 /* JitsiMeetBroadcast Extension */ = {
4EB06022260E026600F524C5 /* JitsiMeetBroadcastExtension */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4EC49BC025BEDAC100E76218 /* Build configuration list for PBXNativeTarget "JitsiMeetBroadcast Extension" */;
buildConfigurationList = 4EB0602C260E026700F524C5 /* Build configuration list for PBXNativeTarget "JitsiMeetBroadcastExtension" */;
buildPhases = (
4EC49BB225BEDAC100E76218 /* Sources */,
4EC49BB325BEDAC100E76218 /* Frameworks */,
4EC49BB425BEDAC100E76218 /* Resources */,
4EB0601F260E026600F524C5 /* Sources */,
4EB06020260E026600F524C5 /* Frameworks */,
4EB06021260E026600F524C5 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "JitsiMeetBroadcast Extension";
name = JitsiMeetBroadcastExtension;
productName = "JitsiMeetBroadcast Extension";
productReference = 4EC49BB625BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex */;
productReference = 4EB06023260E026600F524C5 /* JitsiMeetBroadcastExtension.appex */;
productType = "com.apple.product-type.app-extension";
};
/* End PBXNativeTarget section */
@@ -406,6 +407,7 @@
83CBB9F71A601CBA00E9B192 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1240;
LastUpgradeCheck = 1020;
ORGANIZATIONNAME = Facebook;
TargetAttributes = {
@@ -429,8 +431,8 @@
};
};
};
4EC49BB525BEDAC100E76218 = {
CreatedOnToolsVersion = 12.2;
4EB06022260E026600F524C5 = {
CreatedOnToolsVersion = 12.4;
};
};
};
@@ -450,7 +452,7 @@
13B07F861A680F5B00A75B9A /* JitsiMeet */,
0BEA5C241F7B8F73000D0AB4 /* JitsiMeetCompanion */,
0BEA5C301F7B8F73000D0AB4 /* JitsiMeetCompanion Extension */,
4EC49BB525BEDAC100E76218 /* JitsiMeetBroadcast Extension */,
4EB06022260E026600F524C5 /* JitsiMeetBroadcastExtension */,
);
};
/* End PBXProject section */
@@ -483,7 +485,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
4EC49BB425BEDAC100E76218 /* Resources */ = {
4EB06021260E026600F524C5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -625,14 +627,15 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
4EC49BB225BEDAC100E76218 /* Sources */ = {
4EB0601F260E026600F524C5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4EC49BCB25BEDB6400E76218 /* SocketConnection.m in Sources */,
4EC49BBB25BEDAC100E76218 /* SampleHandler.m in Sources */,
4E51B75E25E4115F0038575A /* DarwinNotificationCenter.m in Sources */,
4EC49BD125BF19CF00E76218 /* SampleUploader.m in Sources */,
4EB0603C260E09D000F524C5 /* SocketConnection.swift in Sources */,
4EB0603E260E09D000F524C5 /* SampleUploader.swift in Sources */,
4EB0603D260E09D000F524C5 /* DarwinNotificationCenter.swift in Sources */,
4EB06027260E026600F524C5 /* SampleHandler.swift in Sources */,
4E90F9402632D1AB001102D4 /* Atomic.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -649,10 +652,10 @@
target = 0BEA5C241F7B8F73000D0AB4 /* JitsiMeetCompanion */;
targetProxy = 0BEA5C3F1F7B8F73000D0AB4 /* PBXContainerItemProxy */;
};
4EC49BBE25BEDAC100E76218 /* PBXTargetDependency */ = {
4EB0602A260E026600F524C5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 4EC49BB525BEDAC100E76218 /* JitsiMeetBroadcast Extension */;
targetProxy = 4EC49BBD25BEDAC100E76218 /* PBXContainerItemProxy */;
target = 4EB06022260E026600F524C5 /* JitsiMeetBroadcastExtension */;
targetProxy = 4EB06029260E026600F524C5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
@@ -879,7 +882,7 @@
};
name = Release;
};
4EC49BC125BEDAC100E76218 /* Debug */ = {
4EB0602D260E026700F524C5 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
@@ -890,13 +893,13 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = "broadcast-extension/extension.entitlements";
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = FC967L3QRG;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = "broadcast-extension/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -907,11 +910,14 @@
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet.broadcast.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
4EC49BC225BEDAC100E76218 /* Release */ = {
4EB0602E260E026700F524C5 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
@@ -922,14 +928,14 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = "broadcast-extension/extension.entitlements";
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = FC967L3QRG;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = "broadcast-extension/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -939,6 +945,8 @@
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet.broadcast.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
@@ -1087,11 +1095,11 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4EC49BC025BEDAC100E76218 /* Build configuration list for PBXNativeTarget "JitsiMeetBroadcast Extension" */ = {
4EB0602C260E026700F524C5 /* Build configuration list for PBXNativeTarget "JitsiMeetBroadcastExtension" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4EC49BC125BEDAC100E76218 /* Debug */,
4EC49BC225BEDAC100E76218 /* Release */,
4EB0602D260E026700F524C5 /* Debug */,
4EB0602E260E026700F524C5 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;

View File

@@ -0,0 +1,30 @@
import Foundation
@propertyWrapper
struct Atomic<Value> {
private var value: Value
private let lock = NSLock()
init(wrappedValue value: Value) {
self.value = value
}
var wrappedValue: Value {
get { return load() }
set { store(newValue: newValue) }
}
func load() -> Value {
lock.lock()
defer { lock.unlock() }
return value
}
mutating func store(newValue: Value) {
lock.lock()
defer { lock.unlock() }
value = newValue
}
}

View File

@@ -1,31 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
extern NSNotificationName const kBroadcastStartedNotification;
extern NSNotificationName const kBroadcastStoppedNotification;
@interface DarwinNotificationCenter: NSObject
+ (instancetype)sharedInstance;
- (void)postNotificationWithName:(NSNotificationName)name;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,50 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import "DarwinNotificationCenter.h"
NSNotificationName const kBroadcastStartedNotification = @"iOS_BroadcastStarted";
NSNotificationName const kBroadcastStoppedNotification = @"iOS_BroadcastStopped";
@implementation DarwinNotificationCenter {
CFNotificationCenterRef _notificationCenter;
}
+ (instancetype)sharedInstance {
static DarwinNotificationCenter *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (instancetype)init {
self = [super init];
if (self) {
_notificationCenter = CFNotificationCenterGetDarwinNotifyCenter();
}
return self;
}
- (void)postNotificationWithName:(NSString*)name {
CFNotificationCenterPostNotification(_notificationCenter, (__bridge CFStringRef)name, NULL, NULL, true);
}
@end

View File

@@ -0,0 +1,37 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Foundation
enum DarwinNotification: String {
case broadcastStarted = "iOS_BroadcastStarted"
case broadcastStopped = "iOS_BroadcastStopped"
}
class DarwinNotificationCenter {
static var shared = DarwinNotificationCenter()
private var notificationCenter: CFNotificationCenter
init() {
notificationCenter = CFNotificationCenterGetDarwinNotifyCenter()
}
func postNotification(_ name: DarwinNotification) {
CFNotificationCenterPostNotification(notificationCenter, CFNotificationName(rawValue: name.rawValue as CFString), nil, nil, true)
}
}

View File

@@ -5,7 +5,7 @@
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>JitsiMeet Broadcast Extension</string>
<string>Jitsi Meet Broadcast Extension</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>21.1.0</string>
<string>21.3.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>
@@ -25,7 +25,7 @@
<key>NSExtensionPointIdentifier</key>
<string>com.apple.broadcast-services-upload</string>
<key>NSExtensionPrincipalClass</key>
<string>SampleHandler</string>
<string>$(PRODUCT_MODULE_NAME).SampleHandler</string>
<key>RPBroadcastProcessMode</key>
<string>RPBroadcastProcessModeSampleBuffer</string>
</dict>

View File

@@ -1,21 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <ReplayKit/ReplayKit.h>
@interface SampleHandler : RPBroadcastSampleHandler
@end

View File

@@ -1,123 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import "SampleHandler.h"
#import "SocketConnection.h"
#import "SampleUploader.h"
#import "DarwinNotificationCenter.h"
@interface SampleHandler ()
@property (nonatomic, retain) SocketConnection *clientConnection;
@property (nonatomic, retain) SampleUploader *uploader;
@end
@implementation SampleHandler
- (instancetype)init {
self = [super init];
if (self) {
self.clientConnection = [[SocketConnection alloc] initWithFilePath:self.socketFilePath];
[self setupConnection];
self.uploader = [[SampleUploader alloc] initWithConnection:self.clientConnection];
}
return self;
}
- (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *> *)setupInfo {
// User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
NSLog(@"broadcast started");
[[DarwinNotificationCenter sharedInstance] postNotificationWithName:kBroadcastStartedNotification];
[self openConnection];
}
- (void)broadcastPaused {
// User has requested to pause the broadcast. Samples will stop being delivered.
}
- (void)broadcastResumed {
// User has requested to resume the broadcast. Samples delivery will resume.
}
- (void)broadcastFinished {
// User has requested to finish the broadcast.
[[DarwinNotificationCenter sharedInstance] postNotificationWithName:kBroadcastStoppedNotification];
[self.clientConnection close];
}
- (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {
static NSUInteger frameCount = 0;
switch (sampleBufferType) {
case RPSampleBufferTypeVideo:
// adjust frame rate by using every third frame
if (++frameCount%3 == 0 && self.uploader.isReady) {
[self.uploader sendSample:sampleBuffer];
}
break;
default:
break;
}
}
// MARK: Private Methods
- (NSString *)socketFilePath {
// the appGroupIdentifier must match the value provided in the app's info.plist for the RTCAppGroupIdentifier key
NSString *appGroupIdentifier = @"group.org.jitsi.meet.appgroup";
NSURL *sharedContainer = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupIdentifier];
NSString *socketFilePath = [[sharedContainer URLByAppendingPathComponent:@"rtc_SSFD"] path];
return socketFilePath;
}
- (void)setupConnection {
__weak __typeof(self) weakSelf = self;
self.clientConnection.didClose = ^(NSError *error) {
NSLog(@"client connection did close: %@", error);
if (error) {
[weakSelf finishBroadcastWithError:error];
}
else {
NSInteger JMScreenSharingStopped = 10001;
NSError *customError = [NSError errorWithDomain:RPRecordingErrorDomain
code:JMScreenSharingStopped
userInfo:@{NSLocalizedDescriptionKey: @"Screen sharing stopped"}];
[weakSelf finishBroadcastWithError:customError];
}
};
}
- (void)openConnection {
dispatch_queue_t queue = dispatch_queue_create("org.jitsi.meet.broadcast.connectTimer", 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), 0.1 * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
BOOL success = [self.clientConnection open];
if (success) {
dispatch_source_cancel(timer);
}
});
dispatch_resume(timer);
}
@end

View File

@@ -0,0 +1,117 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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.
static let appGroupIdentifier = "group.org.jitsi.meet.appgroup"
}
class SampleHandler: RPBroadcastSampleHandler {
private var clientConnection: SocketConnection?
private var uploader: SampleUploader?
private var frameCount: Int = 0
var socketFilePath: String {
let sharedContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: Constants.appGroupIdentifier)
return sharedContainer?.appendingPathComponent("rtc_SSFD").path ?? ""
}
override init() {
super.init()
if let connection = SocketConnection(filePath: socketFilePath) {
clientConnection = connection
setupConnection()
uploader = SampleUploader(connection: connection)
}
}
override func broadcastStarted(withSetupInfo setupInfo: [String: NSObject]?) {
// User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
print("broadcast started")
frameCount = 0
DarwinNotificationCenter.shared.postNotification(.broadcastStarted)
openConnection()
}
override func broadcastPaused() {
// User has requested to pause the broadcast. Samples will stop being delivered.
}
override func broadcastResumed() {
// User has requested to resume the broadcast. Samples delivery will resume.
}
override func broadcastFinished() {
// User has requested to finish the broadcast.
DarwinNotificationCenter.shared.postNotification(.broadcastStopped)
clientConnection?.close()
}
override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
switch sampleBufferType {
case RPSampleBufferType.video:
// very simple mechanism for adjusting frame rate by using every third frame
frameCount += 1
if frameCount % 3 == 0 {
uploader?.send(sample: sampleBuffer)
}
default:
break
}
}
}
private extension SampleHandler {
func setupConnection() {
clientConnection?.didClose = { [weak self] error in
print("client connection did close \(String(describing: error))")
if let error = error {
self?.finishBroadcastWithError(error)
} else {
// the displayed failure message is more user friendly when using NSError instead of Error
let JMScreenSharingStopped = 10001
let customError = NSError(domain: RPRecordingErrorDomain, code: JMScreenSharingStopped, userInfo: [NSLocalizedDescriptionKey: "Screen sharing stopped"])
self?.finishBroadcastWithError(customError)
}
}
}
func openConnection() {
let queue = DispatchQueue(label: "broadcast.connectTimer")
let timer = DispatchSource.makeTimerSource(queue: queue)
timer.schedule(deadline: .now(), repeating: .milliseconds(100), leeway: .milliseconds(500))
timer.setEventHandler { [weak self] in
guard self?.clientConnection?.open() == true else {
return
}
timer.cancel()
}
timer.resume()
}
}

View File

@@ -1,33 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <Foundation/Foundation.h>
#import <ReplayKit/ReplayKit.h>
NS_ASSUME_NONNULL_BEGIN
@class SocketConnection;
@interface SampleUploader : NSObject
@property (nonatomic, assign, readonly) BOOL isReady;
- (instancetype)initWithConnection:(SocketConnection *)connection;
- (void)sendSample:(CMSampleBufferRef)sampleBuffer;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,157 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <MessageUI/MessageUI.h>
#import <ReplayKit/ReplayKit.h>
#import "SampleUploader.h"
#import "SocketConnection.h"
static const NSInteger kBufferMaxLenght = 10 * 1024;
@interface SampleUploader ()
@property (nonatomic, assign) BOOL isReady;
@property (nonatomic, strong) dispatch_queue_t serialQueue;
@property (nonatomic, strong) SocketConnection *connection;
@property (nonatomic, strong) CIContext *imageContext;
@property (nonatomic, strong) NSData *dataToSend;
@property (nonatomic, assign) NSUInteger byteIndex;
@end
@implementation SampleUploader
- (instancetype)initWithConnection:(SocketConnection *)connection {
self = [super init];
if (self) {
self.serialQueue = dispatch_queue_create("org.jitsi.meet.broadcast.sampleUploader", DISPATCH_QUEUE_SERIAL);
self.connection = connection;
[self setupConnection];
self.imageContext = [[CIContext alloc] initWithOptions:nil];
self.isReady = false;
}
return self;
}
- (void)sendSample:(CMSampleBufferRef)sampleBuffer {
self.isReady = false;
self.dataToSend = [self prepareSample:sampleBuffer];
self.byteIndex = 0;
dispatch_async(self.serialQueue, ^{
[self sendData];
});
}
// MARK: Private Methods
- (void)setupConnection {
__weak __typeof(self) weakSelf = self;
self.connection.didOpen = ^{
weakSelf.isReady = true;
};
self.connection.streamHasSpaceAvailable = ^{
dispatch_async(weakSelf.serialQueue, ^{
weakSelf.isReady = ![weakSelf sendData];
});
};
}
/**
This function downscales and converts to jpeg the provided sample buffer, then wraps the resulted image data into a CFHTTPMessageRef. Returns the serialized CFHTTPMessageRef.
*/
- (NSData *)prepareSample:(CMSampleBufferRef)sampleBuffer {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer, kCVPixelBufferLock_ReadOnly);
CGFloat scaleFactor = 2;
size_t width = CVPixelBufferGetWidth(imageBuffer)/scaleFactor;
size_t height = CVPixelBufferGetHeight(imageBuffer)/scaleFactor;
CGImagePropertyOrientation orientation = ((__bridge NSNumber*)CMGetAttachment(sampleBuffer, (__bridge CFStringRef)RPVideoSampleOrientationKey , NULL)).unsignedIntValue;
CGAffineTransform scaleTransform = CGAffineTransformMakeScale(1/scaleFactor, 1/scaleFactor);
NSData *bufferData = [self jpegDataFromPixelBuffer:imageBuffer withScaling:scaleTransform];
CVPixelBufferUnlockBaseAddress(imageBuffer, kCVPixelBufferLock_ReadOnly);
if (bufferData) {
CFHTTPMessageRef httpResponse = CFHTTPMessageCreateResponse(kCFAllocatorDefault, 200, NULL, kCFHTTPVersion1_1);
CFHTTPMessageSetHeaderFieldValue(httpResponse, (__bridge CFStringRef)@"Content-Length", (__bridge CFStringRef)[NSString stringWithFormat:@"%ld", bufferData.length]);
CFHTTPMessageSetHeaderFieldValue(httpResponse, (__bridge CFStringRef)@"Buffer-Width", (__bridge CFStringRef)[NSString stringWithFormat:@"%ld", width]);
CFHTTPMessageSetHeaderFieldValue(httpResponse, (__bridge CFStringRef)@"Buffer-Height", (__bridge CFStringRef)[NSString stringWithFormat:@"%ld", height]);
CFHTTPMessageSetHeaderFieldValue(httpResponse, (__bridge CFStringRef)@"Buffer-Orientation", (__bridge CFStringRef)[NSString stringWithFormat:@"%u", orientation]);
CFHTTPMessageSetBody(httpResponse, (__bridge CFDataRef)bufferData);
CFDataRef serializedMessage = CFHTTPMessageCopySerializedMessage(httpResponse);
CFRelease(httpResponse);
return CFBridgingRelease(serializedMessage);
}
return nil;
}
- (BOOL)sendData {
if (!self.dataToSend) {
NSLog(@"no data to send");
return false;
}
NSUInteger bytesLeft = self.dataToSend.length - self.byteIndex;
NSInteger length = bytesLeft > kBufferMaxLenght ? kBufferMaxLenght : bytesLeft;
uint8_t buffer[length];
[self.dataToSend getBytes:&buffer range:NSMakeRange(self.byteIndex, length)];
length = [self.connection writeBufferToStream:buffer maxLength:length];
if (length > 0) {
self.byteIndex += length;
bytesLeft -= length;
if (bytesLeft == 0) {
NSLog(@"video sample processed successfully");
self.dataToSend = nil;
self.byteIndex = 0;
}
}
else {
NSLog(@"writeBufferToStream failure");
}
return true;
}
- (NSData *)jpegDataFromPixelBuffer:(CVPixelBufferRef)pixelBuffer withScaling:(CGAffineTransform)scaleTransform {
CIImage *image = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer];
image = [image imageByApplyingTransform:scaleTransform];
NSDictionary *options = @{(NSString *)kCGImageDestinationLossyCompressionQuality: [NSNumber numberWithFloat:1.0]};
NSData *imageData = [self.imageContext JPEGRepresentationOfImage:image
colorSpace:image.colorSpace
options:options];
return imageData;
}
@end

View File

@@ -0,0 +1,154 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Foundation
import ReplayKit
private enum Constants {
static let bufferMaxLength = 10240
}
class SampleUploader {
private static var imageContext = CIContext(options: nil)
@Atomic private var isReady: Bool = false
private var connection: SocketConnection
private var dataToSend: Data?
private var byteIndex = 0
private let serialQueue: DispatchQueue
init(connection: SocketConnection) {
self.connection = connection
self.serialQueue = DispatchQueue(label: "org.jitsi.meet.broadcast.sampleUploader")
setupConnection()
}
@discardableResult func send(sample buffer: CMSampleBuffer) -> Bool {
guard isReady == true else {
return false
}
isReady = false
dataToSend = prepare(sample: buffer)
byteIndex = 0
serialQueue.async { [weak self] in
self?.sendDataChunk()
}
return true
}
}
private extension SampleUploader {
func setupConnection() {
connection.didOpen = { [weak self] in
self?.isReady = true
}
connection.streamHasSpaceAvailable = { [weak self] in
self?.serialQueue.async {
self?.isReady = !(self?.sendDataChunk() ?? true)
}
}
}
@discardableResult func sendDataChunk() -> Bool {
guard let dataToSend = dataToSend else {
return false
}
var bytesLeft = dataToSend.count - byteIndex
var length = bytesLeft > Constants.bufferMaxLength ? Constants.bufferMaxLength : bytesLeft
length = dataToSend[byteIndex..<(byteIndex + length)].withUnsafeBytes {
guard let ptr = $0.bindMemory(to: UInt8.self).baseAddress else {
return 0
}
return connection.writeToStream(buffer: ptr, maxLength: length)
}
if length > 0 {
byteIndex += length
bytesLeft -= length
if bytesLeft == 0 {
self.dataToSend = nil
byteIndex = 0
}
} else {
print("writeBufferToStream failure")
}
return true
}
func prepare(sample buffer: CMSampleBuffer) -> Data? {
guard let imageBuffer = CMSampleBufferGetImageBuffer(buffer) else {
print("image buffer not available")
return nil
}
CVPixelBufferLockBaseAddress(imageBuffer, .readOnly)
let scaleFactor = 2.0
let width = CVPixelBufferGetWidth(imageBuffer)/Int(scaleFactor)
let height = CVPixelBufferGetHeight(imageBuffer)/Int(scaleFactor)
let orientation = CMGetAttachment(buffer, key: RPVideoSampleOrientationKey as CFString, attachmentModeOut: nil)?.uintValue ?? 0
let scaleTransform = CGAffineTransform(scaleX: CGFloat(1.0/scaleFactor), y: CGFloat(1.0/scaleFactor))
let bufferData = self.jpegData(from: imageBuffer, scale: scaleTransform)
CVPixelBufferUnlockBaseAddress(imageBuffer, .readOnly)
guard let messageData = bufferData else {
print("corrupted image buffer")
return nil
}
let httpResponse = CFHTTPMessageCreateResponse(nil, 200, nil, kCFHTTPVersion1_1).takeRetainedValue()
CFHTTPMessageSetHeaderFieldValue(httpResponse, "Content-Length" as CFString, String(messageData.count) as CFString)
CFHTTPMessageSetHeaderFieldValue(httpResponse, "Buffer-Width" as CFString, String(width) as CFString)
CFHTTPMessageSetHeaderFieldValue(httpResponse, "Buffer-Height" as CFString, String(height) as CFString)
CFHTTPMessageSetHeaderFieldValue(httpResponse, "Buffer-Orientation" as CFString, String(orientation) as CFString)
CFHTTPMessageSetBody(httpResponse, messageData as CFData)
let serializedMessage = CFHTTPMessageCopySerializedMessage(httpResponse)?.takeRetainedValue() as Data?
return serializedMessage
}
func jpegData(from buffer: CVPixelBuffer, scale scaleTransform: CGAffineTransform) -> Data? {
var image = CIImage(cvPixelBuffer: buffer)
image = image.transformed(by: scaleTransform)
guard let colorSpace = image.colorSpace else {
return nil
}
let options: [CIImageRepresentationOption: Float] = [kCGImageDestinationLossyCompressionQuality as CIImageRepresentationOption: 1.0]
let imageData = SampleUploader.imageContext.jpegRepresentation(of: image, colorSpace: colorSpace, options: options)
return imageData
}
}

View File

@@ -1,34 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface SocketConnection : NSObject
@property (nonatomic, copy, nullable) void (^didOpen)(void);
@property (nonatomic, copy, nullable) void (^didClose)(NSError*);
@property (nonatomic, copy, nullable) void (^streamHasSpaceAvailable)(void);
- (instancetype)initWithFilePath:(nonnull NSString *)filePath;
- (BOOL)open;
- (void)close;
- (NSInteger)writeBufferToStream:(const uint8_t*)buffer maxLength:(NSInteger)length;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,189 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sys/socket.h>
#include <sys/un.h>
#import "SocketConnection.h"
@interface SocketConnection () <NSStreamDelegate>
@property (nonatomic, copy) NSString *filePath;
@property (nonatomic, strong) NSInputStream *inputStream;
@property (nonatomic, strong) NSOutputStream *outputStream;
@property (nonatomic, strong) NSThread *networkThread;
@end
@implementation SocketConnection {
int _socket;
struct sockaddr_un _socketAddr;
}
- (instancetype)initWithFilePath:(NSString *)path {
self = [super init];
if (self) {
self.filePath = path;
[self setupSocketWithFilePath:path];
[self setupNetworkThread];
}
return self;
}
- (BOOL)open {
NSLog(@"Open socket connection");
if (![[NSFileManager defaultManager] fileExistsAtPath:self.filePath]) {
NSLog(@"failure: socket file missing");
return false;
}
int status = connect(_socket, (struct sockaddr *)&_socketAddr, sizeof(_socketAddr));
if (status < 0) {
NSLog(@"failure: socket connect (%d)", status);
return false;
}
[self.networkThread start];
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocket(kCFAllocatorDefault, _socket, &readStream, &writeStream);
self.inputStream = (__bridge_transfer NSInputStream *)readStream;
self.inputStream.delegate = self;
[self.inputStream setProperty:@"kCFBooleanTrue" forKey:@"kCFStreamPropertyShouldCloseNativeSocket"];
self.outputStream = (__bridge_transfer NSOutputStream *)writeStream;
self.outputStream.delegate = self;
[self.outputStream setProperty:@"kCFBooleanTrue" forKey:@"kCFStreamPropertyShouldCloseNativeSocket"];
[self performSelector:@selector(scheduleStreams) onThread:self.networkThread withObject:nil waitUntilDone:true];
[self.inputStream open];
[self.outputStream open];
NSLog(@"read stream status: %ld", CFReadStreamGetStatus(readStream));
NSLog(@"write stream status: %ld", CFWriteStreamGetStatus(writeStream));
return true;
}
- (void)close {
[self performSelector:@selector(unscheduleStreams) onThread:self.networkThread withObject:nil waitUntilDone:true];
self.inputStream.delegate = nil;
self.outputStream.delegate = nil;
[self.inputStream close];
[self.outputStream close];
[self.networkThread cancel];
}
- (NSInteger)writeBufferToStream:(const uint8_t*)buffer maxLength:(NSInteger)length {
return [self.outputStream write:buffer maxLength:length];
}
// MARK: Private Methods
- (BOOL)isOpen {
return self.inputStream.streamStatus == NSStreamStatusOpen && self.outputStream.streamStatus == NSStreamStatusOpen;
}
- (void)setupSocketWithFilePath:(NSString*)path {
_socket = socket(AF_UNIX, SOCK_STREAM, 0);
memset(&_socketAddr, 0, sizeof(_socketAddr));
_socketAddr.sun_family = AF_UNIX;
strncpy(_socketAddr.sun_path, path.UTF8String, sizeof(_socketAddr.sun_path) - 1);
}
- (void)setupNetworkThread {
self.networkThread = [[NSThread alloc] initWithBlock:^{
do {
@autoreleasepool {
[[NSRunLoop currentRunLoop] run];
}
} while (![NSThread currentThread].isCancelled);
}];
self.networkThread.qualityOfService = NSQualityOfServiceUserInitiated;
}
- (void)scheduleStreams {
[self.inputStream scheduleInRunLoop:NSRunLoop.currentRunLoop forMode:NSRunLoopCommonModes];
[self.outputStream scheduleInRunLoop:NSRunLoop.currentRunLoop forMode:NSRunLoopCommonModes];
}
- (void)unscheduleStreams {
[self.inputStream removeFromRunLoop:NSRunLoop.currentRunLoop forMode:NSRunLoopCommonModes];
[self.outputStream removeFromRunLoop:NSRunLoop.currentRunLoop forMode:NSRunLoopCommonModes];
}
- (void)notifyDidClose:(NSError *)error {
if (self.didClose) {
self.didClose(error);
}
}
@end
#pragma mark - NSStreamDelegate
@implementation SocketConnection (NSStreamDelegate)
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
switch (eventCode) {
case NSStreamEventOpenCompleted:
NSLog(@"client stream open completed");
if (aStream == self.outputStream && self.didOpen) {
self.didOpen();
}
break;
case NSStreamEventHasBytesAvailable:
if (aStream == self.inputStream) {
uint8_t buffer;
NSInteger numberOfBytesRead = [(NSInputStream *)aStream read:&buffer maxLength:sizeof(buffer)];
if (!numberOfBytesRead && aStream.streamStatus == NSStreamStatusAtEnd) {
NSLog(@"server socket closed");
[self close];
[self notifyDidClose:nil];
}
}
break;
case NSStreamEventHasSpaceAvailable:
if (aStream == self.outputStream && self.streamHasSpaceAvailable) {
NSLog(@"client stream has space available");
self.streamHasSpaceAvailable();
}
break;
case NSStreamEventErrorOccurred:
NSLog(@"client stream error occurred: %@", aStream.streamError);
[self close];
[self notifyDidClose:aStream.streamError];
break;
default:
break;
}
}
@end

View File

@@ -0,0 +1,205 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Foundation
class SocketConnection: NSObject {
var didOpen: (() -> Void)?
var didClose: ((Error?) -> Void)?
var streamHasSpaceAvailable: (() -> Void)?
private let filePath: String
private var socketHandle: Int32 = -1
private var address: sockaddr_un?
private var inputStream: InputStream?
private var outputStream: OutputStream?
private var networkQueue: DispatchQueue?
private var shouldKeepRunning = false
init?(filePath path: String) {
filePath = path
socketHandle = Darwin.socket(AF_UNIX, SOCK_STREAM, 0)
guard socketHandle != -1 else {
print("failure: create socket")
return nil
}
}
func open() -> Bool {
print("open socket connection")
guard FileManager.default.fileExists(atPath: filePath) else {
print("failure: socket file missing")
return false
}
guard setupAddress() == true else {
return false
}
guard connectSocket() == true else {
return false
}
setupStreams()
inputStream?.open()
outputStream?.open()
return true
}
func close() {
unscheduleStreams()
inputStream?.delegate = nil
outputStream?.delegate = nil
inputStream?.close()
outputStream?.close()
inputStream = nil
outputStream = nil
}
func writeToStream(buffer: UnsafePointer<UInt8>, maxLength length: Int) -> Int {
return outputStream?.write(buffer, maxLength: length) ?? 0
}
}
extension SocketConnection: StreamDelegate {
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
switch eventCode {
case .openCompleted:
print("client stream open completed")
if aStream == outputStream {
didOpen?()
}
case .hasBytesAvailable:
if aStream == inputStream {
var buffer: UInt8 = 0
let numberOfBytesRead = inputStream?.read(&buffer, maxLength: 1)
if numberOfBytesRead == 0 && aStream.streamStatus == .atEnd {
print("server socket closed")
close()
notifyDidClose(error: nil)
}
}
case .hasSpaceAvailable:
if aStream == outputStream {
streamHasSpaceAvailable?()
}
case .errorOccurred:
print("client stream error occured: \(String(describing: aStream.streamError))")
close()
notifyDidClose(error: aStream.streamError)
default:
break
}
}
}
private extension SocketConnection {
func setupAddress() -> Bool {
var addr = sockaddr_un()
guard filePath.count < MemoryLayout.size(ofValue: addr.sun_path) else {
print("failure: fd path is too long")
return false
}
_ = withUnsafeMutablePointer(to: &addr.sun_path.0) { ptr in
filePath.withCString {
strncpy(ptr, $0, filePath.count)
}
}
address = addr
return true
}
func connectSocket() -> Bool {
guard var addr = address else {
return false
}
let status = withUnsafePointer(to: &addr) { ptr in
ptr.withMemoryRebound(to: sockaddr.self, capacity: 1) {
Darwin.connect(socketHandle, $0, socklen_t(MemoryLayout<sockaddr_un>.size))
}
}
guard status == noErr else {
print("failure: \(status)")
return false
}
return true
}
func setupStreams() {
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocket(kCFAllocatorDefault, socketHandle, &readStream, &writeStream)
inputStream = readStream?.takeRetainedValue()
inputStream?.delegate = self
inputStream?.setProperty(kCFBooleanTrue, forKey: Stream.PropertyKey(kCFStreamPropertyShouldCloseNativeSocket as String))
outputStream = writeStream?.takeRetainedValue()
outputStream?.delegate = self
outputStream?.setProperty(kCFBooleanTrue, forKey: Stream.PropertyKey(kCFStreamPropertyShouldCloseNativeSocket as String))
scheduleStreams()
}
func scheduleStreams() {
shouldKeepRunning = true
networkQueue = DispatchQueue.global(qos: .userInitiated)
networkQueue?.async { [weak self] in
self?.inputStream?.schedule(in: .current, forMode: .common)
self?.outputStream?.schedule(in: .current, forMode: .common)
var isRunning = false
repeat {
isRunning = self?.shouldKeepRunning ?? false && RunLoop.current.run(mode: .default, before: .distantFuture)
} while (isRunning)
}
}
func unscheduleStreams() {
networkQueue?.sync { [weak self] in
self?.inputStream?.remove(from: .current, forMode: .common)
self?.outputStream?.remove(from: .current, forMode: .common)
}
shouldKeepRunning = false
}
func notifyDidClose(error: Error?) {
if didClose != nil {
didClose?(error)
}
}
}

View File

@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>21.1.0</string>
<string>21.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>21.1.0</string>
<string>21.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>21.1.0</string>
<string>21.3.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CLKComplicationPrincipalClass</key>

View File

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

View File

@@ -59,6 +59,16 @@
#pragma mark - Utility methods
/**
* Once the react native bridge is destroyed you are responsible for reinstantiating it back. Use this method to do so.
*/
- (void)instantiateReactNativeBridge;
/**
* Helper method to destroy the react native bridge, cleaning up resources in the process. Once the react native bridge is destroyed you are responsible for reinstantiating it back using `instantiateReactNativeBridge` method.
*/
- (void)destroyReactNativeBridge;
- (JitsiMeetConferenceOptions *_Nonnull)getInitialConferenceOptions;
- (BOOL)isCrashReportingDisabled;

View File

@@ -28,7 +28,6 @@
#import <RNGoogleSignin/RNGoogleSignin.h>
#import <WebRTC/RTCLogging.h>
@implementation JitsiMeet {
RCTBridgeWrapper *_bridgeWrapper;
NSDictionary *_launchOptions;
@@ -50,7 +49,7 @@
- (instancetype)init {
if (self = [super init]) {
// Initialize the on and only bridge for interfacing with React Native.
// Initialize the one and only bridge for interfacing with React Native.
_bridgeWrapper = [[RCTBridgeWrapper alloc] init];
// Initialize the listener for handling start/stop screensharing notifications.
@@ -119,6 +118,18 @@
#pragma mark - Utility methods
- (void)instantiateReactNativeBridge {
if (_bridgeWrapper != nil) {
return;
};
_bridgeWrapper = [[RCTBridgeWrapper alloc] init];
}
- (void)destroyReactNativeBridge {
_bridgeWrapper = nil;
}
- (JitsiMeetConferenceOptions *)getInitialConferenceOptions {
if (_launchOptions[UIApplicationLaunchOptionsURLKey]) {
NSURL *url = _launchOptions[UIApplicationLaunchOptionsURLKey];

View File

@@ -71,6 +71,16 @@
- (void)setFeatureFlag:(NSString *_Nonnull)flag withBoolean:(BOOL)value;
- (void)setFeatureFlag:(NSString *_Nonnull)flag withValue:(id _Nonnull)value;
/**
* CallKit call handle, to be used when implementing incoming calls.
*/
@property (nonatomic, copy, nullable) NSString *callHandle;
/**
* CallKit call UUID, to be used when implementing incoming calls.
*/
@property (nonatomic, copy, nullable) NSUUID *callUUID;
@end
@interface JitsiMeetConferenceOptions : NSObject
@@ -92,6 +102,9 @@
@property (nonatomic, nullable) JitsiMeetUserInfo *userInfo;
@property (nonatomic, copy, nullable, readonly) NSString *callHandle;
@property (nonatomic, copy, nullable, readonly) NSUUID *callUUID;
+ (instancetype _Nonnull)fromBuilder:(void (^_Nonnull)(JitsiMeetConferenceOptionsBuilder *_Nonnull))initBlock;
- (instancetype _Nonnull)init NS_UNAVAILABLE;

View File

@@ -52,6 +52,9 @@ static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
_videoMuted = nil;
_userInfo = nil;
_callHandle = nil;
_callUUID = nil;
}
return self;
@@ -168,6 +171,9 @@ static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
_featureFlags = [NSDictionary dictionaryWithDictionary:builder.featureFlags];
_userInfo = builder.userInfo;
_callHandle = builder.callHandle;
_callUUID = builder.callUUID;
}
return self;
@@ -205,6 +211,12 @@ static NSString *const WelcomePageEnabledFeatureFlag = @"welcomepage.enabled";
if (_subject != nil) {
config[@"subject"] = self.subject;
}
if (_callHandle != nil) {
config[@"callHandle"] = self.callHandle;
}
if (_callUUID != nil) {
config[@"callUUID"] = [self.callUUID UUIDString];
}
NSMutableDictionary *urlProps = [[NSMutableDictionary alloc] init];

View File

@@ -18,6 +18,7 @@
"fr": "Francés",
"frCA": "Francés (Canadian)",
"he": "Ebrèu",
"hi": "Indi",
"mr":"Marathi",
"hr": "Croat",
"hu": "Ongrés",
@@ -42,7 +43,9 @@
"sk": "Eslovac",
"sl": "Eslovèn",
"sr": "Sèrbe",
"sq": "Albanés",
"sv": "Suedés",
"te": "Telugu",
"th": "Tai",
"tr": "Turc",
"uk": "Ucraïnian",

55
lang/languages-sq.json Normal file
View File

@@ -0,0 +1,55 @@
{
"en": "Anglisht",
"af": "Afrikaans",
"ar": "Arabisht",
"bg": "Bullgarisht",
"ca": "Katalanisht",
"cs": "Çekisht",
"da": "Danisht",
"de": "Gjermanisht",
"el": "Greqisht",
"enGB": "Anglisht (Mbretëria e Bashkuar)",
"eo": "Esperanto",
"es": "Spanjisht",
"esUS": "Spanjisht (Amerikë Latine)",
"et": "Estonisht",
"eu": "Baskisht",
"fi": "Finlandisht",
"fr": "Frëngjisht",
"frCA": "Frëngjisht (Kebek)",
"he": "Hebraisht",
"hi": "Hindi",
"mr":"Maratisht",
"hr": "Kroatisht",
"hu": "Hungarisht",
"hy": "Armenisht",
"id": "Indonezisht",
"it": "Italisht",
"ja": "Japonisht",
"kab": "Kabilisht",
"ko": "Koreançe",
"lt": "Lituanisht",
"ml": "Malajalamisht",
"lv": "Letonisht",
"nl": "Holandisht",
"oc": "Oçitanisht",
"fa": "Persisht",
"pl": "Polonisht",
"pt": "Portugalisht",
"ptBR": "Portugalisht (Brazil)",
"ru": "Rusisht",
"ro": "Rumanisht",
"sc": "Sardenjisht",
"sk": "Sllovakisht",
"sl": "Sllovenisht",
"sr": "Serbisht",
"sq": "Shqip",
"sv": "Suedisht",
"te": "Telugu",
"th": "Tajlandisht",
"tr": "Turqisht",
"uk": "Ukrainisht",
"vi": "Vietnamisht",
"zhCN": "Kinezçe (Kinë)",
"zhTW": "Kinezçe (Tajvan)"
}

View File

@@ -1,34 +1,55 @@
{
"en": "英",
"en": "英",
"af": "南非荷蘭文",
"ar": "阿拉伯文",
"bg": "保加利亞文",
"ca": "卡達隆尼亞文",
"cs": "捷克文",
"da": "丹麥文",
"de": "德文",
"el": "希臘文",
"enGB": "英文 (英國)",
"eo": "世界語",
"es": "西班牙文",
"esUS": "西班牙文 (拉丁美洲)",
"et": "愛沙尼亞文",
"eu": "巴斯克語",
"fi": "芬蘭文",
"fr": "法文",
"frCA": "法文 (加拿大)",
"he": "希伯來語",
"hi": "印地語",
"mr":"馬拉提語",
"hr": "克羅埃西亞文",
"hu": "匈牙利文",
"hy": "亞美尼亞文",
"id": "印尼語",
"it": "義大利文",
"ja": "日語",
"kab": "卡拜爾語",
"ko": "韓文",
"lt": "立陶宛語",
"ml": "馬拉雅拉姆語",
"lv": "拉脫維亞語",
"nl": "荷蘭文",
"oc": "奧西坦文",
"fa": "波斯語",
"pl": "波蘭文",
"pt": "葡萄牙語",
"ptBR": "葡萄牙文 (巴西)",
"ru": "俄文",
"ro": "羅馬尼亞語",
"sc": "薩丁尼亞語",
"sk": "斯洛伐克語",
"sl": "斯洛維尼亞語",
"sr": "塞爾維亞語",
"sq": "阿羅馬尼亞語",
"sv": "瑞典文",
"te": "泰盧固語",
"th": "泰語",
"tr": "土耳其文",
"uk": "烏克蘭語",
"vi": "越南文",
"zhCN": "中文 (中国,简体)",
"zhTW": "中文 (台灣,正體)",
"et": "愛沙尼亞文",
"da": "丹麥文"
"zhTW": "中文 (台灣,正體)"
}

View File

@@ -43,9 +43,10 @@
"sk": "Slovak",
"sl": "Slovenian",
"sr": "Serbian",
"sq": "Albanian",
"sv": "Swedish",
"te": "Telugu",
"th": "Thailand",
"th": "Thai",
"tr": "Turkish",
"uk": "Ukrainian",
"vi": "Vietnamese",

View File

@@ -71,6 +71,11 @@
"title": "Текстови съобщения",
"you": "вие"
},
"chromeExtensionBanner": {
"dontShowAgain": "Не показвай повече",
"buttonText": "Инсталирайте разширението за Chrome",
"installExtensionText": "Инсталирайте разширенията за Google Calendar и Office 365"
},
"connectingOverlay": {
"joiningRoom": "Свързване с вашата среща..."
},
@@ -153,7 +158,8 @@
"accessibilityLabel": {
"liveStreaming": "Излъчване на живо"
},
"allow": "Разрешаване",
"add": "Добави",
"allow": "Разреши",
"alreadySharedVideoMsg": "Друг участник вече е споделил видео. Тази среща позволява само едно споделено видео.",
"alreadySharedVideoTitle": "Разрешено е споделянето само на едно видео в даден момент",
"applicationWindow": "Прозорец на програмата",
@@ -216,6 +222,12 @@
"micNotSendingDataTitle": "Микрофонът Ви е спрян от системните настройки",
"micPermissionDeniedError": "Не сте дали разрешение за използване на микрофона. Ще можете да се присъедините в срещата, но другите няма да Ви чуват. Използвайте бутона с микрофон в адресната лента, за да оправите това.",
"micUnknownError": "Невъзможен достъп до микрофона по неясна причина.",
"muteEveryoneDialog": "Сигурни ли сте, че искате да заглушите всички? Няма да можете да пуснете звука им отново, но участниците ще могат да направят това сами.",
"muteEveryoneElseDialog": "След като заглушите някого, няма да можете да пуснете обратно звука му, но участникът ще може да направи това сам.",
"muteEveryoneElseTitle": "Заглушете всички, освен {{whom}}?",
"muteEveryoneSelf": "себе си",
"muteEveryoneStartMuted": "Всички да влизат без звук",
"muteEveryoneTitle": "Заглуши всички?",
"muteParticipantBody": "Вие няма да можете да спрете заглушаването на участника, но той ще може да го направи по всяко време.",
"muteParticipantButton": "Изключи микрофона",
"muteParticipantDialog": "Сигурни ли сте, че искате да заглушите този участник? Няма да можете да пуснете обратно звука му, но участникът ще може да направи това сам.",
@@ -278,18 +290,13 @@
"transcribing": "Транскрипция",
"unlockRoom": "Премахване $t(lockRoomPassword) от срещата",
"userPassword": "потребителска парола",
"videoLink": "Линк към видео",
"WaitForHostMsg": "Конференцията <b>{{room}}</b> все още не е започнала. Ако сте домакинът, тогава се идентифицирайте. В противен случай изчакайте докато домакинът пристигне.",
"WaitForHostMsgWOk": "Конференцията <b>{{room}}</b> все още не е започнала. Ако сте домакинът, тогава натиснете бутона, за да се идентифицирате. В противен случай изчакайте докато домакинът пристигне.",
"WaitingForHost": "Чакаме домакина...",
"Yes": "Да",
"yourEntireScreen": "Целият екран",
"screenSharingAudio": "Сподели и звука",
"muteEveryoneStartMuted": "Всички да влизат без звук",
"muteEveryoneSelf": "себе си",
"muteEveryoneTitle": "Заглуши всички?",
"muteEveryoneDialog": "Сигурни ли сте, че искате да заглушите всички? Няма да можете да пуснете звука им отново, но участниците ще могат да направят това сами.",
"muteEveryoneElseTitle": "Заглушете всички, освен {{whom}}?",
"muteEveryoneElseDialog": "След като заглушите някого, няма да можете да пуснете обратно звука му, но участникът ще може да направи това сам."
"screenSharingAudio": "Сподели и звука"
},
"dialOut": {
"statusMessage": "в момента е {{status}}"
@@ -523,6 +530,12 @@
"sectionList": {
"pullToRefresh": "Издърпай, за да се обнови"
},
"security": {
"about": "Може да добавите парола към вашите срещи. Участниците ще трябва да въведат паролата преди да бъдат допуснати до срещата.",
"aboutReadOnly": "Модераторите могат да добавят парола към срещата. Участниците ще трябва да въведат паролата преди да бъдат допуснати до срещата.",
"insecureRoomNameWarning": "Вашата среща не е обезопасена и нежелани участници могат да се включат. Можете да подсигурите срещата с помощта на бутона сигурност.",
"securityOptions": "Сигурност"
},
"settings": {
"calendar": {
"about": "Календарната интеграция на {{appName}} сигурно достъпва Вашия календар, за да покаже настъпващите събития.",
@@ -582,7 +595,8 @@
},
"startupoverlay": {
"policyText": " ",
"title": "„{{app}}“ се нуждае от достъп до микрофона и камерата."
"genericTitle": "Срещата се нуждае от достъп до микрофона и камерата Ви.",
"title": "„{{app}}“ се нуждае от достъп до микрофона и камерата Ви."
},
"suspendedoverlay": {
"rejoinKeyTitle": "Повторно присъединяване",
@@ -616,7 +630,7 @@
"recording": "Пускане/спиране на запис",
"remoteMute": "Заглуши участник",
"Settings": "Промяна на настройки",
"sharedvideo": "Споделяне на YouTube видео",
"sharedvideo": "Пускане/спиране на споделеното YouTube видео",
"shareRoom": "Добавете някого",
"shareYourScreen": "Споделяне на екрана",
"shortcuts": "Бързи клавиши",
@@ -664,7 +678,7 @@
"raiseHand": "Вдигане/сваляне на ръка",
"raiseYourHand": "Поискай думата",
"Settings": "Настройки",
"sharedvideo": "Пускане/спиране на споделянето на екрана",
"sharedvideo": "Споделяне на YouTube видео",
"shareRoom": "Добавете някого",
"shortcuts": "Виж бързите клавиши",
"speakerStats": "Статистика за говорителите",
@@ -781,16 +795,45 @@
"title": "Сигурна, с много възможности, и напълно безплатна платформа за видео конференции",
"getHelp": "Търсене на помощ"
},
"helpView": {
"header": "Място за помощ"
},
"lonelyMeetingExperience": {
"youAreAlone": "Вие сте сами в срещата",
"button": "Поканете участници"
},
"chromeExtensionBanner": {
"dontShowAgain": "Не показвай повече",
"buttonText": "Инсталирайте разширението за Chrome",
"installExtensionText": "Инсталирайте разширенията за Google Calendar и Office 365"
"helpView": {
"header": "Място за помощ"
},
"lobby": {
"admit": "Допусни",
"knockingParticipantList": "Списък с чакащи участници",
"allow": "Разреши",
"backToKnockModeButton": "Заявка за включване без парола",
"dialogTitle": "Режим лоби",
"disableDialogContent": "Режим Лоби е включен. Този решим защитава срещите Ви от случайни посетители. Искате ли да го изключите?",
"disableDialogSubmit": "Изключи",
"emailField": "Въведи имейл адрес",
"enableDialogPasswordField": "Задай парола (не е задължително)",
"enableDialogSubmit": "Включи",
"enableDialogText": "Режимът Лоби защитава срещите Ви от случайни посетители, чрез изрично одобрение на участниците от модератор.",
"enterPasswordButton": "Въведи парола за срещата",
"enterPasswordTitle": "Въведи парола за влезеш в срещата",
"invalidPassword": "Невалидна парола",
"joiningMessage": "Ще влезете в срещата, когато някой ви приеме",
"joinWithPasswordMessage": "Опит за включване с парола, моля изчакайте...",
"joinRejectedMessage": "Вашето желание за включване беше отхвърлено от модератор.",
"joinTitle": "Включи се в срещата",
"joiningTitle": "Изчаква одобрение...",
"joiningWithPasswordTitle": "Включване с парола...",
"knockButton": "Поискай достъп",
"knockTitle": "Някой желае да се включи в срещата",
"nameField": "Въведи име",
"notificationLobbyAccessDenied": "{{targetParticipantName}} не беше допуснат от {{originParticipantName}}",
"notificationLobbyAccessGranted": "{{targetParticipantName}} беше допуснат от {{originParticipantName}}",
"notificationLobbyDisabled": "Лобито беше изключено от {{originParticipantName}}",
"notificationLobbyEnabled": "Лобито беше включено от {{originParticipantName}}",
"notificationTitle": "Лоби",
"passwordField": "Въведи парола за срещата",
"passwordJoinButton": "Влез",
"reject": "Откажи",
"toggleLabel": "Включи лоби"
}
}

View File

@@ -5,6 +5,7 @@
"copyInvite": "Sitzungseinladung kopieren",
"copyLink": "Konferenzlink kopieren",
"copyStream": "Livestreaminglink kopieren",
"contacts": "Kontakte",
"countryNotSupported": "Wir unterstützen dieses Land noch nicht.",
"countryReminder": "Telefonnummer nicht in den USA? Bitte sicherstellen, dass die Telefonnummer mit dem Ländercode beginnt.",
"defaultEmail": "Ihre Standard-E-Mail",
@@ -16,19 +17,14 @@
"inviteMoreMailSubject": "An {{appName}} Meeting teilnehmen",
"inviteMorePrompt": "Mehr Leute einladen",
"linkCopied": "Link in die Zwischenablage kopiert",
"loading": "Suche nach Personen und Telefonnummern",
"loadingNumber": "Telefonnummer wird überprüft",
"loadingPeople": "Suche nach einzuladenden Personen",
"noResults": "Keine passenden Ergebnisse",
"noValidNumbers": "Telefonnummer eingeben",
"outlookEmail": "Outlook-E-Mail",
"searchNumbers": "Telefonnummern hinzufügen",
"searchPeople": "Nach Personen suchen",
"searchPeopleAndNumbers": "Nach Personen suchen oder deren Telefonnummern hinzufügen",
"phoneNumbers": "Telefonnummern",
"searching": "Suche...",
"shareInvite": "Einladung zur Versammlung teilen",
"shareLink": "Teilen Sie den Konferenzlink, um andere einzuladen",
"shareStream": "Den Livestreaminglink freigeben",
"sip": "SIP: {{address}}",
"sipAddresses": "SIP-Adressen",
"telephone": "Telefon: {{number}}",
"title": "Personen zu dieser Konferenz einladen",
"yahooEmail": "Yahoo-E-Mail"
@@ -74,12 +70,17 @@
},
"privateNotice": "Private Nachricht an {{recipient}}",
"title": "Chatten",
"you": "Sie"
"you": "Sie",
"message": "Nachricht",
"messageAccessibleTitle": "{{user}} sagt:",
"messageAccessibleTitleMe": "Ich sage:",
"smileysPanel": "Emoji-Auswahl"
},
"chromeExtensionBanner": {
"installExtensionText": "Installieren Sie die Erweiterung für die Integration von Google Calendar und Office 365",
"buttonText": "Chrome-Erweiterung installieren",
"dontShowAgain": "Hinweis nicht mehr anzeigen"
"dontShowAgain": "Hinweis nicht mehr anzeigen",
"close": "Schließen"
},
"connectingOverlay": {
"joiningRoom": "Eine Verbindung zu Ihrem Meeting wird hergestellt…"
@@ -208,10 +209,13 @@
"e2eeLabel": "Ende-zu-Ende-Verschlüsselung aktivieren",
"e2eeWarning": "WARNUNG: Nicht alle Personen dieser Konferenz scheinen Ende-zu-Ende-Verschlüsselung zu unterstützen. Wenn Sie diese aktivieren, können die entsprechenden Personen nichts mehr sehen oder hören.",
"enterDisplayName": "Bitte geben Sie hier Ihren Namen ein",
"enterDisplayNameToJoin" : "Benutzername für Konferenz eingeben" ,
"embedMeeting": "Besprechung einbetten",
"error": "Fehler",
"gracefulShutdown": "Der Dienst steht momentan wegen Wartungsarbeiten nicht zur Verfügung. Bitte versuchen Sie es später noch einmal.",
"grantModeratorDialog": "Möchten Sie wirklich Moderationsrechte an diese Person vergeben?",
"grantModeratorTitle": "Moderationsrechte vergeben",
"hideShareAudioHelper": "Diese Meldung nicht mehr anzeigen",
"IamHost": "Ich leite das Meeting",
"incorrectRoomLockPassword": "Falsches Passwort",
"incorrectPassword": "Name oder Passwort ungültig",
@@ -254,21 +258,26 @@
"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.",
"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.",
"muteParticipantTitle": "Person stummschalten?",
"muteParticipantsVideoButton": "Kamera ausschalten",
"muteParticipantsVideoTitle": "Die Kamera von dieser Person ausschalten?",
"muteParticipantsVideoBody": "Sie können die Kamera nicht wieder aktivieren, die Teilnehmer können dies aber jederzeit wieder ändern.",
"noDropboxToken": "Kein gültiges Dropbox-Token",
"Ok": "OK",
"password": "Passwort",
"passwordLabel": "Dieses Meeting wurde gesichert. Bitte geben Sie das $t(lockRoomPasswordUppercase) ein, um dem Meeting beizutreten.",
"passwordNotSupported": "Das Festlegen eines Konferenzpassworts wird nicht unterstützt.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) nicht unterstützt",
"passwordRequired": "$t(lockRoomPasswordUppercase) erforderlich",
"permissionErrorTitle": "Berechtigung benötigt",
"permissionCameraRequiredError": "Der Zugriff auf die Kamera wird benötigt, um in Videokonferenzen teilzunehmen. Bitte in den Einstellungen zulassen",
"permissionMicRequiredError": "Der Zugriff auf das Mikrofon wird benötigt, um an Konferenzen mit Ton teilzunehmen. Bitte in den Einstellungen zulassen",
"popupError": "Ihr Browser blockiert Pop-ups von dieser Website. Bitte aktivieren Sie Pop-ups in den Sicherheitseinstellungen des Browsers und versuchen Sie es erneut.",
"popupErrorTitle": "Pop-up blockiert",
"readMore": "mehr",
"recording": "Aufnahme",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Während eines Livestreams nicht möglich",
"recordingDisabledForGuestTooltip": "Gäste können keine Aufzeichnungen starten.",
"recordingDisabledTooltip": "Start der Aufzeichnung deaktiviert.",
"rejoinNow": "Jetzt erneut beitreten",
"remoteControlAllowedMessage": "{{user}} hat die Anfrage zur Fernsteuerung angenommen!",
@@ -295,14 +304,26 @@
"sendPrivateMessageTitle": "Privat antworten?",
"serviceUnavailable": "Dienst nicht verfügbar",
"sessTerminated": "Konferenz beendet",
"sessionRestarted": "Konferenz neugestartet",
"Share": "Teilen",
"shareAudio": "Fortfahren",
"shareAudioTitle" : "Wie kann Audio geteilt werden",
"shareAudioWarningTitle": "Sie müssen die Bildschirmfreigabe ausschalten, bevor Sie Audio teilen können",
"shareAudioWarningH1": "Wenn Sie Ihr Audio teilen wollen:",
"shareAudioWarningD1": "müssen Sie Ihre Bildschirmfreigabe stoppen, bevor Sie Audio teilen können.",
"shareAudioWarningD2": "müssen Sie Ihre Bildschirmfreigabe neustarten und die Option \"Audio freigeben\" auswählen.",
"shareMediaWarningGenericH2": "Wenn Sie Ihren Bildschirm und Audio teilen wollen",
"shareVideoLinkError": "Bitte einen gültigen YouTube-Link angeben.",
"shareVideoTitle": "Video teilen",
"shareYourScreen": "Bildschirm freigeben",
"shareYourScreen": "Bildschirmfreigabe ein-/ausschalten",
"shareYourScreenDisabled": "Bildschirmfreigabe deaktiviert.",
"startLiveStreaming": "Livestream starten",
"startRecording": "Aufnahme starten",
"startRemoteControlErrorMessage": "Beim Versuch, die Fernsteuerung zu starten, ist ein Fehler aufgetreten!",
"shareScreenWarningTitle": "Sie müssen die Audiofreigabe beenden, bevor Sie den Bildschirm freigeben können",
"shareScreenWarningH1": "Wenn Sie Ihren Bildschirm freigeben wollen:",
"shareScreenWarningD1": "müssen Sie Ihre Audiofreigabe stoppen, bevor Sie ihren Bildschirm freigeben.",
"shareScreenWarningD2": "müssen Sie Ihre Audiofreigabe stoppen und dann die Bildschirmfreigabe mit der Option \"Audio freigeben\" starten.",
"stopLiveStreaming": "Livestream stoppen",
"stopRecording": "Aufnahme stoppen",
"stopRecordingWarning": "Sind Sie sicher, dass Sie die Aufnahme stoppen möchten?",
@@ -318,12 +339,17 @@
"user": "Anmeldename",
"userIdentifier": "Benutzername",
"userPassword": "Passwort",
"videoLink": "Video link",
"videoLink": "Video-Link",
"viewUpgradeOptions": "Upgradeoptionen anzeigen",
"viewUpgradeOptionsContent": "Sie müssen Ihren Tarif erweitern, um Premium-Features wie Aufnahme, Transkription, RTMP-Streaming und mehr zu nutzen.",
"viewUpgradeOptionsTitle": "Sie haben ein Premium-Feature entdeckt!",
"WaitForHostMsg": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Falls Sie die Konferenz leiten, authentifizieren Sie sich bitte. Warten Sie andernfalls, bis die Konferenz gestartet wird.",
"WaitForHostMsgWOk": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Falls Sie die Konferenz leiten, authentifizieren Sie sich bitte. Warten Sie andernfalls, bis die Konferenz gestartet wird.",
"WaitingForHostTitle": "Warten auf den Beginn der Konferenz …",
"Yes": "Ja",
"yourEntireScreen": "Ganzer Bildschirm"
"yourEntireScreen": "Ganzer Bildschirm",
"remoteUserControls": "Remote Benutzersteuerung von {{username}}",
"localUserControls": "Lokale Benutzersteuerung"
},
"dialOut": {
"statusMessage": "ist jetzt {{status}}"
@@ -338,13 +364,26 @@
"title": "Diese Konferenz einbetten"
},
"virtualBackground": {
"apply": "Anwenden",
"title": "Hintergründe",
"blur": "Hintergrund unscharf",
"slightBlur": "Hintergrund leicht unscharf",
"removeBackground": "Hintergrund entfernen",
"uploadImage": "Bild hochladen",
"addBackground": "Hintergrund hinzufügen",
"pleaseWait": "Bitte warten...",
"none": "keiner"
"none": "keiner",
"uploadedImage": "Hochgeladenes Bild {{index}}",
"deleteImage": "Bild löschen",
"image1" : "Strand",
"image2" : "Weiße neutrale Wand",
"image3" : "Weißer leerer Raum",
"image4" : "Schwarze Stehlampe",
"image5" : "Berg",
"image6" : "Wald",
"image7" : "Sonnenaufgang",
"desktopShareError": "Desktop konnte nicht freigegeben werden",
"desktopShare": "Desktopfreigabe",
"webAssemblyWarning": "WebAssembly wird nicht unterstützt"
},
"feedback": {
"average": "Durchschnittlich",
@@ -353,7 +392,8 @@
"good": "Gut",
"rateExperience": "Bitte bewerten Sie diese Konferenz",
"veryBad": "Sehr schlecht",
"veryGood": "Sehr gut"
"veryGood": "Sehr gut",
"star": "Sterne"
},
"incomingCall": {
"answer": "Antworten",
@@ -370,6 +410,7 @@
"country": "Land",
"dialANumber": "Um am Meeting teilzunehmen, müssen Sie eine dieser Nummern wählen und dann die PIN eingeben.",
"dialInConferenceID": "PIN:",
"copyNumber":"Nummer kopieren",
"dialInNotSupported": "Entschuldigung, leider wird das Einwählen derzeit nicht unterstützt.",
"dialInNumber": "Einwählen:",
"dialInSummaryError": "Fehler beim Abrufen der Einwahlinformationen. Versuchen Sie es später erneut.",
@@ -378,6 +419,11 @@
"inviteLiveStream": "Klicken Sie auf {{url}}, um den Livestream dieser Konferenz zu öffnen",
"invitePhone": "Wenn Sie stattdessen per Telefon beitreten möchten, wählen sie: {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "Suchen Sie nach einer anderen Einwahlnummer ?\nEinwahlnummern der Konferenz anzeigen: {{url}}\n\n\nWenn Sie sich auch über ein Raumtelefon einwählen, nehmen Sie teil, ohne sich mit dem Ton zu verbinden: {{silentUrl}}",
"inviteSipEndpoint": "Um mit SIP teilzunehmen, folgende Adresse nutzen: {{sipUri}}",
"inviteTextiOSPersonal": "{{name}} lädt Sie zu einem Meeting ein.",
"inviteTextiOSJoinSilent": "Wenn Sie über ein Konferenztelefon teilnehmen, können Sie diesen Link nutzen um ohne Ton an der Konferenz teilzunehmen: {{silentUrl}}.",
"inviteTextiOSInviteUrl": "Am Meeting teilnehmen: {{inviteUrl}}.",
"inviteTextiOSPhone": "Nutzen Sie folgende Nummer um via Telefon teilzunehmen: {{number}},,{{conferenceID}}#. Wenn Sie nach einer anderen Einwahlnummer suchen, finden Sie die vollständige Liste hier: {{didUrl}}.",
"inviteURLFirstPartGeneral": "Sie wurden zur Teilnahme an einem Meeting eingeladen.",
"inviteURLFirstPartPersonal": "{{name}} lädt Sie zu einem Meeting ein.\n",
"inviteURLSecondPart": "\nAm Meeting teilnehmen:\n{{url}}\n",
@@ -388,6 +434,7 @@
"noRoom": "Keine Konferenz für die Einwahlinformationen angegeben.",
"numbers": "Einwahlnummern",
"password": "$t(lockRoomPasswordUppercase):",
"sip": "SIP-Adresse",
"title": "Teilen",
"tooltip": "Freigabe-Link und Einwahlinformationen für dieses Meeting",
"label": "Einwahlinformationen"
@@ -406,6 +453,7 @@
"support": "Support",
"supportMsg": "Wenn der Fehler erneut auftritt, bitte kontaktieren Sie"
},
"jitsiHome": "{{logo}} Logo, verlinkt zur Homepage",
"keyboardShortcuts": {
"focusLocal": "Lokales Video fokussieren",
"focusRemote": "Auf das Video einer anderen Person fokussieren",
@@ -418,6 +466,7 @@
"showSpeakerStats": "Sprechstatistik anzeigen",
"toggleChat": "Chat öffnen oder schließen",
"toggleFilmstrip": "Video-Miniaturansichten ein- oder ausblenden",
"toggleParticipantsPane": "Liste der Anwesenden ein- und ausblenden",
"toggleScreensharing": "Zwischen Kamera und Bildschirmfreigabe wechseln",
"toggleShortcuts": "Tastenkombinationen ein- oder ausblenden",
"videoMute": "Kamera starten oder stoppen"
@@ -496,6 +545,7 @@
"focus": "Konferenzleitung",
"focusFail": "{{component}} ist im Moment nicht verfügbar wiederholen in {{ms}} Sekunden",
"grantedTo": "Moderationsrechte an {{to}} vergeben!",
"hostAskedUnmute": "Die Moderation bittet Sie, das Mikrofon zu aktivieren",
"invitedOneMember": "{{name}} wurde eingeladen",
"invitedThreePlusMembers": "{{name}} und {{count}} andere wurden eingeladen",
"invitedTwoMembers": "{{first}} und {{second}} wurden eingeladen",
@@ -511,7 +561,7 @@
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) von einer anderen Person entfernt",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) von einer anderen Person gesetzt",
"raisedHand": "{{name}} möchte sprechen.",
"screenShareNoAudio": " Share audio box was not checked in the window selection screen.",
"screenShareNoAudio": "Die Option \"Audio freigeben\" wurde bei der Auswahl des Fensters nicht ausgewählt.",
"screenShareNoAudioTitle": "Share audio was not checked",
"somebody": "Jemand",
"startSilentTitle": "Sie sind ohne Audioausgabe beigetreten!",
@@ -525,7 +575,42 @@
"OldElectronAPPTitle": "Sicherheitslücke!",
"oldElectronClientDescription1": "Sie scheinen eine alte Version des Jitsi-Meet-Clients zu nutzen. Diese hat bekannte Schwachstellen. Bitte aktualisieren Sie auf unsere ",
"oldElectronClientDescription2": "aktuelle Version",
"oldElectronClientDescription3": "!"
"oldElectronClientDescription3": "!",
"moderationInEffectDescription": "Bitte melden um zu sprechen",
"moderationInEffectCSDescription": "Bitte melden um ein Video zu teilen",
"moderationInEffectVideoDescription": "Bitte melden um die Kamera zu starten",
"moderationInEffectTitle": "Das Mikrofon ist von der Moderation gesperrt",
"moderationInEffectCSTitle": "Die Videofreigabe ist von der Moderation gesperrt",
"moderationInEffectVideoTitle": "Die Kamera ist von der Moderation gesperrt",
"moderationRequestFromModerator": "Die Moderation bittet Sie, das Mikrofon zu aktivieren",
"moderationRequestFromParticipant": "möchte sprechen",
"moderationStartedTitle": "Moderation gestartet",
"moderationStoppedTitle": "Moderation gestoppt",
"moderationToggleDescription": "von {{participantDisplayName}}",
"raiseHandAction": "Melden",
"groupTitle": "Benachrichtigungen"
},
"participantsPane": {
"close": "Schließen",
"header": "Anwesende",
"headings": {
"lobby": "Lobby ({{count}})",
"participantsList": "Anwesende ({{count}})",
"waitingLobby": "In der Lobby ({{count}})"
},
"actions": {
"allow": "Anwesenden erlauben:",
"blockEveryoneMicCamera": "Kamera und Mikrofon von allen sperren",
"invite": "Person einladen",
"askUnmute": "Anfragen, Stummschaltung aufzuheben",
"mute": "Stummschalten",
"muteAll": "Alle stummschalten",
"muteEveryoneElse": "Alle anderen stummschalten",
"startModeration": "Stummschaltung aufheben oder Kamera aktivieren",
"stopEveryonesVideo": "Alle Kameras ausschalten",
"stopVideo": "Kamera ausschalten",
"unblockEveryoneMicCamera": "Kamera und Mikrofon von allen entsperren"
}
},
"passwordSetRemotely": "von einer anderen Person gesetzt",
"passwordDigitsOnly": "Bis zu {{number}} Ziffern",
@@ -581,6 +666,7 @@
"or": "oder",
"premeeting": "Vorschau",
"showScreen": "Konferenzvorschau aktivieren",
"keyboardShortcuts" : "Tastaturkurzbefehle aktivieren",
"startWithPhone": "Mit Telefonaudio starten",
"screenSharingError": "Fehler bei Bildschirmfreigabe:",
"videoOnlyError": "Videofehler:",
@@ -602,6 +688,7 @@
"ringing": "Es klingelt …"
},
"profile": {
"avatar": "Benutzerbild",
"setDisplayNameLabel": "Anzeigename festlegen",
"setEmailInput": "E-Mail eingeben",
"setEmailLabel": "E-Mail-Adresse für Gravatar",
@@ -616,12 +703,15 @@
"beta": "BETA",
"busy": "Es werden Ressourcen für eine Aufnahme bereitgestellt. Bitte in ein paar Minuten erneut versuchen.",
"busyTitle": "Alle Aufnahme-Instanzen sind in Gebrauch",
"copyLink": "Link kopieren",
"error": "Die Aufzeichnung ist fehlgeschlagen. Bitte versuchen Sie es erneut.",
"errorFetchingLink": "Der Link zur Aufzeichnung konnte nicht geladen werden.",
"expandedOff": "Aufzeichnung wurde gestoppt",
"expandedOn": "Das Meeting wird momentan aufgezeichnet.",
"expandedPending": "Aufzeichnung wird gestartet…",
"failedToStart": "Die Aufnahme konnte nicht gestartet werden",
"fileSharingdescription": "Aufzeichnung mit den Personen der Konferenz teilen",
"linkGenerated": "Link zur Aufzeichnung wurde generiert.",
"live": "LIVE",
"loggedIn": "Als {{userName}} angemeldet",
"off": "Aufnahme gestoppt",
@@ -636,7 +726,8 @@
"signIn": "Anmelden",
"signOut": "Abmelden",
"unavailable": "Oh! Der {{serviceName}} ist aktuell nicht verfügbar. Wir arbeiten an der Behebung des Problems. Bitte versuchen Sie es später noch einmal.",
"unavailableTitle": "Aufnahme nicht verfügbar"
"unavailableTitle": "Aufnahme nicht verfügbar",
"uploadToCloud": "In die Cloud hochladen"
},
"sectionList": {
"pullToRefresh": "Ziehen, um zu aktualisieren"
@@ -655,8 +746,13 @@
"signedIn": "Momentan wird auf Kalendertermine von {{email}} zugegriffen. Klicken Sie auf die folgende Schaltfläche „Trennen“, um den Zugriff auf die Kalendertermine zu stoppen.",
"title": "Kalender"
},
"desktopShareFramerate": "Framerate für Bildschirmfreigabe",
"desktopShareWarning": "Sie müssen die Bildschirmfreigabe neustarten, damit die Einstellung übernommen wird.",
"desktopShareHighFpsWarning": "Eine höhere Framerate könnte sich auf Ihre Datenrate auswirken. Sie müssen die Bildschirmfreigabe neustarten, damit die Einstellung übernommen wird.",
"devices": "Geräte",
"followMe": "Follow-me für alle Personen",
"framesPerSecond": "FPS",
"incomingMessage": "Eingehende Nachricht",
"language": "Sprache",
"loggedIn": "Als {{name}} angemeldet",
"microphones": "Mikrofon",
@@ -664,12 +760,18 @@
"more": "Mehr",
"name": "Name",
"noDevice": "Kein",
"participantJoined": "Neue Person nimmt teil",
"participantLeft": "Person verlässt die Konferenz",
"playSounds": "Hinweistöne aktiviert",
"sameAsSystem": "Wie System ({{label}})",
"selectAudioOutput": "Audioausgabe",
"selectCamera": "Kamera",
"selectMic": "Mikrofon",
"sounds": "Hinweistöne",
"speakers": "Lautsprecher",
"startAudioMuted": "Alle Personen treten stumm geschaltet bei",
"startAudioMuted": "Alle Personen treten stummgeschaltet bei",
"startVideoMuted": "Alle Personen treten ohne Video bei",
"talkWhileMuted": "Wenn bei Stummschaltung gesprochen wird",
"title": "Einstellungen"
},
"settingsView": {
@@ -700,8 +802,8 @@
},
"speaker": "Sprecher/-in",
"speakerStats": {
"hours": "{{count}} Std.",
"minutes": "{{count}} Min.",
"hours": "{{count}} Std. ",
"minutes": "{{count}} Min. ",
"name": "Name",
"seconds": "{{count}} Sek.",
"speakerStats": "Sprechstatistik",
@@ -721,34 +823,41 @@
"accessibilityLabel": {
"audioOnly": "„Nur Audio“ ein-/ausschalten",
"audioRoute": "Audiogerät auswählen",
"boo": "Buhen",
"callQuality": "Qualitätseinstellungen",
"cc": "Untertitel ein-/ausschalten",
"chat": "Chatfenster ein-/ausblenden",
"chat": "Chatfenster öffnen / schließen",
"clap": "Klatschen",
"document": "Geteiltes Dokument schließen",
"download": "Unsere Apps herunterladen",
"embedMeeting": "Konferenz einbetten",
"feedback": "Feedback hinterlassen",
"fullScreen": "Vollbildmodus ein-/ausschalten",
"grantModerator": "Moderationsrechte vergeben",
"hangup": "Anruf beenden",
"hangup": "Konferenz verlassen",
"help": "Hilfe",
"invite": "Person einladen",
"kick": "Person entfernen",
"laugh": "Lachen",
"like": "Daumen nach oben",
"lobbyButton": "Lobbymodus ein-/ausschalten",
"localRecording": "Lokale Aufzeichnungssteuerelemente ein-/ausschalten",
"lockRoom": "Konferenzpasswort ein-/ausschalten",
"moreActions": "Menü „Weitere Aktionen“ ein-/ausschalten",
"moreActionsMenu": "Menü „Weitere Aktionen“",
"moreActions": "Menü „Weitere Einstellungen“ ein-/ausschalten",
"moreActionsMenu": "Menü „Weitere Einstellungen“",
"moreOptions": "Menü „Weitere Optionen“",
"mute": "„Audio stummschalten“ ein-/ausschalten",
"mute": "Mikrofon aktivieren / deaktivieren",
"muteEveryone": "Alle stummschalten",
"muteEveryoneElse": "Alle anderen stummschalten",
"muteEveryonesVideo": "Alle Kameras ausschalten",
"muteEveryoneElsesVideo": "Alle anderen Kameras ausschalten",
"participants": "Anwesende",
"party": "Konfetti",
"pip": "Bild-in-Bild-Modus ein-/ausschalten",
"privateMessage": "Private Nachricht senden",
"profile": "Profil bearbeiten",
"raiseHand": "„Melden“ ein-/ausschalten",
"raiseHand": "Hand erheben / senken",
"reactionsMenu": "Interaktionsmenü öffnen / schließen",
"recording": "Aufzeichnung ein-/ausschalten",
"remoteMute": "Personen stummschalten",
"remoteVideoMute": "Kamera von dieser Person ausschalten",
@@ -761,21 +870,29 @@
"shortcuts": "Tastenkombinationen ein-/ausblenden",
"show": "Im Vordergrund anzeigen",
"speakerStats": "Sprechstatistik ein-/ausblenden",
"surprised": "Überrascht",
"tileView": "Kachelansicht ein-/ausschalten",
"toggleCamera": "Kamera wechseln",
"toggleFilmstrip": "Miniaturansichten ein-/ausschalten",
"videomute": "„Video stummschalten“ ein-/ausschalten",
"selectBackground": "Hintergrund auswählen"
"videoblur": "Unscharfer Hintergrund ein-/ausschalten",
"selectBackground": "Hintergrund auswählen",
"expand": "Ausklappen",
"collapse": "Einklappen"
},
"addPeople": "Personen zur Konferenz hinzufügen",
"audioSettings": "Ton-Einstellungen",
"videoSettings": "Kameraeinstellungen",
"audioOnlyOff": "Modus „Nur Audio“ deaktivieren",
"audioOnlyOn": "Modus „Nur Audio“ aktivieren",
"audioRoute": "Audiogerät auswählen",
"authenticate": "Anmelden",
"boo": "Buhen",
"callQuality": "Qualitätseinstellungen",
"chat": "Chat öffnen / schließen",
"clap": "Klatschen",
"closeChat": "Chat schließen",
"closeReactionsMenu": "Interationsmenü schließen",
"documentClose": "Geteiltes Dokument schließen",
"documentOpen": "Geteiltes Dokument öffnen",
"download": "Unsere Apps herunterladen",
@@ -786,9 +903,11 @@
"exitFullScreen": "Vollbildmodus verlassen",
"exitTileView": "Kachelansicht ausschalten",
"feedback": "Feedback hinterlassen",
"hangup": "Verlassen",
"hangup": "Konferenz verlassen",
"help": "Hilfe",
"invite": "Personen einladen",
"laugh": "Lachen",
"like": "Daumen hoch",
"lobbyButtonDisable": "Lobbymodus deaktivieren",
"lobbyButtonEnable": "Lobbymodus aktivieren",
"login": "Anmelden",
@@ -796,7 +915,7 @@
"lowerYourHand": "Hand senken",
"moreActions": "Weitere Einstellungen",
"moreOptions": "Weitere Optionen",
"mute": "Stummschaltung aktivieren / deaktivieren",
"mute": "Mikrofon aktivieren / deaktivieren",
"muteEveryone": "Alle stummschalten",
"muteEveryonesVideo": "Alle Kameras ausschalten",
"noAudioSignalTitle": "Es kommt kein Input von Ihrem Mikrofon!",
@@ -807,11 +926,20 @@
"noisyAudioInputTitle": "Ihr Mikrofon scheint lärmintensiv zu sein!",
"noisyAudioInputDesc": "Es klingt, als ob Ihr Mikrofon Störgeräusche verursacht. Bitte überlegen Sie, ob Sie das Gerät stummschalten oder austauschen wollen.",
"openChat": "Chat öffnen",
"openReactionsMenu": "Interationsmenü öffnen",
"participants": "Anwesende",
"party": "Konfetti",
"pip": "Bild-in-Bild-Modus einschalten",
"privateMessage": "Private Nachricht senden",
"profile": "Profil bearbeiten",
"raiseHand": "Hand erheben",
"raiseHand": "Hand erheben / senken",
"raiseYourHand": "Melden",
"reactionBoo": "Buhen senden",
"reactionClap": "Klatschen senden",
"reactionLaugh": "Lachen senden",
"reactionLike": "Daumen hoch senden",
"reactionParty": "Konfetti senden",
"reactionSurprised": "Überrascht senden",
"security": "Sicherheitsoptionen",
"Settings": "Einstellungen",
"shareaudio": "Audio teilen",
@@ -821,14 +949,15 @@
"speakerStats": "Sprechstatistik",
"startScreenSharing": "Bildschirmfreigabe starten",
"startSubtitles": "Untertitel einschalten",
"stopAudioSharing": "Audiofreigabe stoppen",
"stopScreenSharing": "Bildschirmfreigabe stoppen",
"stopSubtitles": "Untertitel ausschalten",
"stopSharedVideo": "YouTube-Video stoppen",
"surprised": "Überrascht",
"talkWhileMutedPopup": "Versuchen Sie zu sprechen? Ihr Mikrofon ist stummgeschaltet.",
"tileViewToggle": "Kachelansicht ein-/ausschalten",
"toggleCamera": "Kamera wechseln",
"videomute": "Kamera starten / stoppen",
"videoSettings": "Video-Einstellungen",
"selectBackground": "Hintergrund auswählen"
},
"transcribing": {
@@ -855,6 +984,7 @@
"react-nativeGrantPermissions": "Wählen Sie <b><i>Erlauben</i></b>, wenn der Browser um Berechtigungen bittet.",
"safariGrantPermissions": "Wählen Sie <b><i>OK</i></b>, wenn der Browser um Berechtigungen bittet."
},
"volumeSlider": "Lautstärkeregler",
"videoSIPGW": {
"busy": "Es stehen keine freien Ressourcen zur Verfügung. Bitte versuchen Sie es später noch einmal.",
"busyTitle": "Keine freien Ressourcen",
@@ -899,6 +1029,7 @@
"videomute": "Person hat die Kamera angehalten"
},
"welcomepage": {
"addMeetingName": "Besprechungsnamen hinzufügen",
"accessibilityLabel": {
"join": "Zum Teilnehmen tippen",
"roomname": "Konferenzname eingeben"
@@ -919,7 +1050,10 @@
"headerSubtitle": "Sichere und hochqualitative Meetings",
"info": "Einwahlinformationen",
"join": "ERSTELLEN / BEITRETEN",
"jitsiOnMobile": "Jitsi on mobile Download unsere Apps und starte ein Meeting von überall",
"jitsiOnMobile": "Jitsi unterwegs einfach unsere Apps herunterladen und Meetings von überall starten",
"mobileDownLoadLinkIos": "iOS App Download",
"mobileDownLoadLinkAndroid": "Android App Download",
"mobileDownLoadLinkFDroid": "F-Droid App Download",
"moderatedMessage": "Oder <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">reservieren Sie sich eine Konferenz-URL</a>, die nur Sie moderieren.",
"privacy": "Datenschutz",
"recentList": "Verlauf",
@@ -932,7 +1066,15 @@
"sendFeedback": "Feedback senden",
"startMeeting": "Meeting starten",
"terms": "AGB",
"title": "Sichere, voll funktionale und komplett kostenlose Videokonferenzen"
"title": "Sichere, voll funktionale und komplett kostenlose Videokonferenzen",
"logo":{
"calendar":"Kalender Logo",
"microsoftLogo":"Microsoft Logo",
"logoDeepLinking":"Jitsi Meet Logo",
"desktopPreviewThumbnail":"Desktop-Vorschau Thumbnail",
"googleLogo":"Google Logo",
"policyLogo":"Richtlinienlogo"
}
},
"lonelyMeetingExperience": {
"button": "Andere einladen",
@@ -942,6 +1084,8 @@
"header": "Hilfecenter"
},
"lobby": {
"admit": "Zulassen",
"admitAll": "Alle zulassen",
"knockingParticipantList": "Liste anklopfender Personen",
"allow": "Annehmen",
"backToKnockModeButton": "Kein Passwort, stattdessen Beitritt anfragen",
@@ -972,6 +1116,7 @@
"passwordField": "Konferenzpasswort eingeben",
"passwordJoinButton": "Beitreten",
"reject": "Ablehnen",
"rejectAll": "Alle ablehnen",
"toggleLabel": "Lobby aktivieren"
}
}

View File

@@ -257,6 +257,9 @@
"passwordNotSupported": "No se soporta $t(lockRoomPassword) en la reunión",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) no es compatible",
"passwordRequired": "$t(lockRoomPasswordUppercase) necesario",
"permissionErrorTitle": "Permiso necesario",
"permissionCameraRequiredError": "El permiso de cámara es necesario para participar en conferencias con vídeo. Por favor, permítelo en Ajustes",
"permissionMicRequiredError": "El permiso de micrófono es necesario para participar en conferencias con sonido. Por favor, permítelo en Ajustes",
"popupError": "Su navegador está bloqueando las ventanas emergentes de este sitio. Habilite las ventanas emergentes en la configuración de seguridad de su navegador y vuelva a intentarlo.",
"popupErrorTitle": "Ventana emergente bloqueada",
"readMore": "mas",

View File

@@ -1,21 +1,33 @@
{
"addPeople": {
"add": "Gonbidatu",
"addContacts": "Gonbidatu zure kontaktuak",
"copyInvite": "Kopiatu bilerarako gonbidapena",
"copyLink": "Kopiatu bileraren esteka",
"copyStream": "Kopiatu zuzenekoaren esteka",
"contacts": "kontaktuak",
"countryNotSupported": "Oraindik ez dugu helmuga hau onartzen.",
"countryReminder": "Atzerritik deitzen? Ziurtatu herrialde-kodearekin hasten zarela!",
"defaultEmail": "Zure defektuzko eposta",
"disabled": "Ezin duzu jendea gonbidatu.",
"failedToAdd": "Parte-hartzaileak gehitzeak huts egin du",
"footerText": "Markatzea desgaituta dago.",
"loading": "Jendea eta telefono zenbakiak bilatzen",
"loadingNumber": "Telefono zenbakia balioztatzen",
"loadingPeople": "Gonbidatzeko jendea bilatzen",
"googleEmail": "Google Email",
"inviteMoreHeader": "Bilerako partaide bakarra zara",
"inviteMoreMailSubject": "Sartu {{appName}} bileran",
"inviteMorePrompt": "Gonbidatu jende gehiago",
"linkCopied": "Esteka ondo kopiatu da arbelera",
"noResults": "Ez dago bat datorren bilaketa-emaitzarik",
"noValidNumbers": "Sartu telefono zenbakia",
"searchNumbers": "Gehitu telefono zenbakiak",
"searchPeople": "Bilatu jendea",
"searchPeopleAndNumbers": "Bilatu jendea edo gehitu beren telefono zenbakiak",
"outlookEmail": "Outlook Email",
"phoneNumbers": "telefono zenbakiak",
"searching": "Bilatzen...",
"shareInvite": "Partekatu bilerarako gonbidapena",
"shareLink": "Partekatu bileraren esteka beste partaide batzuk gonbidatzeko",
"shareStream": "Partekatu zuzenekoaren esteka",
"sipAddresses": "sip helbideak",
"telephone": "Telefonoa: {{number}}",
"title": "Gonbidatu jendea bilera honetara"
"title": "Gonbidatu jendea bilera honetara",
"yahooEmail": "Yahoo Email"
},
"audioDevices": {
"bluetooth": "Bluetooth",
@@ -24,9 +36,7 @@
"speaker": "Bozgorailua",
"none": "Ez dago audio-gailurik erabilgarri"
},
"audioOnly": {
"audioOnly": "Banda-zabalera txikia"
},
"audioOnly": { "audioOnly": "Banda-zabalera txikia" },
"calendarSync": {
"addMeetingURL": "Bileraren esteka gehitu",
"confirmAddLink": "Jitsi esteka gertaera honetara gehitu nahi duzu?",
@@ -46,6 +56,7 @@
"today": "Gaur"
},
"chat": {
"enter": "Sartu bilera gelan",
"error": "Errorea: zure mezua ez da bidali. Arrazoia: {{error}}",
"fieldPlaceHolder": "Idatzi mezua hemen",
"messagebox": "Idatzi mezua",
@@ -57,16 +68,19 @@
},
"privateNotice": "Mezu pribatua {{recipient}}(e)ri",
"title": "Txata",
"you": "zu"
"you": "zu",
"message": "Mezua",
"messageAccessibleTitle": "{{user}} partaideak zera dio:",
"messageAccessibleTitleMe": "nik zera diot:",
"smileysPanel": "Emoji panela"
},
"chromeExtensionBanner": {
"installExtensionText": "Instalatu luzapena Google Calendar eta Office 365rako integraziorako",
"buttonText": "Instalatu Chrome luzapena",
"dontShowAgain": "Ez erakutsi hau berriro"
},
"connectingOverlay": {
"joiningRoom": "Zure bilerara konektatzen…"
"dontShowAgain": "Ez erakutsi hau berriro",
"close": "Itxi"
},
"connectingOverlay": { "joiningRoom": "Zure bilerara konektatzen\u2026" },
"connection": {
"ATTACHED": "Atxikituta",
"AUTHENTICATING": "Autentifikatzea",
@@ -77,16 +91,18 @@
"DISCONNECTED": "Deskonektatuta",
"DISCONNECTING": "Deskonektatzen",
"ERROR": "Errorea",
"FETCH_SESSION_ID": "Saioaren ID-a eskuratzen",
"FETCH_SESSION_ID": "Saioaren ID-a eskuratzen\u2026",
"GET_SESSION_ID_ERROR": "Eskuratu saioaren ID errorea: {{code}}",
"GOT_SESSION_ID": "Saioaren ID-a eskuratzea Eginda",
"GOT_SESSION_ID": "Saioaren ID-a eskuratzea\u2026 Eginda",
"LOW_BANDWIDTH": "{{displayName}}rako bideoa desaktibatu egin da banda-zabalera aurrezteko"
},
"connectionindicator": {
"address": "Helbidea:",
"audio_ssrc": "Audio SSRC:",
"bandwidth": "Banda-zabalera estimatua:",
"bitrate": "Bit-emaria:",
"bridgeCount": "Zerbitzari kopurua: ",
"codecs": "Kodekak (A/B): ",
"connectedTo": "Konektatua hona:",
"e2e_rtt": "E2E RTT:",
"framerate": "Marko-abiadura:",
@@ -95,6 +111,7 @@
"localaddress_plural": "Helbide lokalak:",
"localport": "Ataka lokala:",
"localport_plural": "Ataka lokalak:",
"maxEnabledResolution": "send max",
"more": "Erakutsi gehiago",
"packetloss": "Pakete-galera:",
"quality": {
@@ -109,9 +126,12 @@
"remoteport": "Urruneko ataka:",
"remoteport_plural": "Urruneko atakak:",
"resolution": "Ebazpena:",
"savelogs": "Gorde logak",
"participant_id": "Partehartzailearen ida:",
"status": "Konexioa:",
"transport": "Garraioa:",
"transport_plural": "Garraioak:"
"transport_plural": "Garraioak:",
"video_ssrc": "Video SSRC:"
},
"dateUtils": {
"earlier": "Lehenago",
@@ -123,9 +143,11 @@
"description": "Ez da ezer gertatu? Bilera {{app}} mahaigaineko aplikazioan abiarazten saiatu gara. Saiatu berriro edo abiarazi {{app}} web aplikazioan.",
"descriptionWithoutWeb": "Ez da ezer gertatu? Bilera {{app}} mahaigaineko aplikazioan abiarazten saiatu gara.",
"downloadApp": "Aplikazioa deskargatu",
"ifDoNotHaveApp": "Oraindik ere aplikazioa ez baduzu:",
"ifHaveApp": "Aplikazioa instalatuta baduzu:",
"joinInApp": "Sartu bilerara aplikazioa erabiliz",
"launchWebButton": "Abiarazi webean",
"openApp": "Aplikaziora joan",
"title": "Zure bilera {{app}}(e)n abiarazten…",
"title": "Zure bilera {{app}}(e)n abiarazten\u2026",
"tryAgainButton": "Saiatu berriro mahaigainean"
},
"defaultLink": "Adib.: {{url}}",
@@ -143,26 +165,27 @@
"testAudio": "Erreproduzitu proba-soinua"
},
"dialog": {
"accessibilityLabel": {
"liveStreaming": "Zuzeneko Erreprodukzioa"
},
"accessibilityLabel": { "liveStreaming": "Zuzeneko Erreprodukzioa" },
"add": "Add",
"allow": "Baimendu",
"alreadySharedVideoMsg": "Beste parte-hartzaile batek jada bideo bat partekatzen ari da. Konferentzia honek aldi berean bideo bakarra partekatzen uzten du.",
"alreadySharedVideoTitle": "Aldi berean bideo bakarra partekatzea onartuta dago",
"applicationWindow": "Aplikazio-leihoa",
"authenticationRequired": "Login egin behar duzu",
"Back": "Atzera",
"cameraConstraintFailedError": "Zure kamerak ez ditu eskakizun batzuk betetzen.",
"cameraNotFoundError": "Kamera ez da aurkitu.",
"cameraNotSendingData": "Ezin gara zure kamerara sartu. Egiaztatu beste aplikazio bat gailu hori erabiltzen ari den, hautatu beste gailu bat konfigurazio-menuan edo saiatu aplikazioa berriro kargatzen.",
"cameraNotSendingDataTitle": "Kamerara sartzeko ezgai",
"cameraPermissionDeniedError": "Ez duzu baimenik eman zure kamera erabiltzeko. Hitzaldiarekin bat egin dezakezu, baina ezingo duzu ikusi. Erabili helbide-barran dagoen kamera botoia hau konpontzeko.",
"cameraTimeoutError": "Ezin izan da bideo iturburua abiarazi. Denbora-muga gainditu da!",
"cameraUnknownError": "Ezin da kamera erabili arrazoi ezezaguna dela eta.",
"cameraUnsupportedResolutionError": "Zure kamerak ez du bideoaren bereizmena onartzen.",
"Cancel": "Utzi",
"close": "Itxi",
"conferenceDisconnectMsg": "Zure sare-konexioa egiaztatu dezakezu. Berriro konektatzen {{seconds}} segundotan",
"conferenceDisconnectTitle": "Deskonektatu zara.",
"conferenceReloadMsg": "Hau konpontzen saiatzen ari gara. Berriro konektatzen {{seconds}} segundotan..",
"conferenceDisconnectMsg": "Zure sare-konexioa egiaztatu dezakezu. Berriro konektatzen {{seconds}} segundotan\u2026",
"conferenceDisconnectTitle": "Deskonektatu egin zara.",
"conferenceReloadMsg": "Hau konpontzen saiatzen ari gara. Berriro konektatzen {{seconds}} segundotan..\u2026",
"conferenceReloadTitle": "Tamalez, arazoren bat izan da.",
"confirm": "Berretsi",
"confirmNo": "Ez",
@@ -171,36 +194,39 @@
"connectErrorWithMsg": "Hara! Arazoren bat egon da eta ezin izan dugu konferentziara konektatu: {{msg}}",
"connecting": "Konektatzen",
"contactSupport": "Laguntza-zerbitzua",
"copied": "Kopiatuta",
"copy": "Kopiatu",
"dismiss": "Baztertu",
"displayNameRequired": "Kaixo! Zein da zure izena?",
"done": "Eginda",
"e2eeWarning": "",
"e2eeDescription": "Puntutik punturako zifratzea PROBATAKOA da. Kontuan hartu puntutik punturako zifratzea aktibatze baduzu, zerbitzariak eskaintzen dituen beste aukera batzuk desaktibatu egingo direla, adibidez grabazioa, zuzeneko emanaldia eta telefono bidezko partehartzea. Kontuan hartu bileran nabigatzaile jakin batzuk erabiltzen dituzten erabiltzaileek hartu ahal izango dutela parte.",
"e2eeLabel": "Aktibatu puntutik punturako zifratzea",
"e2eeWarning": "OHARRA: bileraren partaide guztiek ezin dute puntutik punturako zifratzea erabili. Aukera hau aktibatzen baduzu, batzuk ezingo zaituzte ikusi eta entzun.",
"enterDisplayName": "Sartu zure izena hemen",
"enterDisplayNameToJoin": "Mesedez idatzi zure izena bileran sartzeko",
"embedMeeting": "Kapsulatu bilera",
"error": "Errorea",
"externalInstallationMsg": "Mahaigaineko partekatze-luzapena instalatu behar duzu.",
"externalInstallationTitle": "Derrigorrezko luzapena",
"goToStore": "Joan web dendara",
"gracefulShutdown": "Zerbitzua ez dago erabilgarri mantentze-lanak direla eta. Saiatu berriro beranduago.",
"grantModeratorDialog": "Ziur zaude partaide hau moderatzaile bihurtu nahi duzula?",
"grantModeratorTitle": "Bihurtu moderatzaile",
"IamHost": "Ostalaria naiz",
"incorrectRoomLockPassword": "Pasahitza baliogabea",
"incorrectPassword": "Erabiltzaile-izena edo pasahitza baliogabea",
"inlineInstallationMsg": "Mahaigaineko partekatze-luzapena instalatu behar duzu.",
"inlineInstallExtension": "Instalatu orain",
"internalError": "Hara! Arazoren bat egon da. Errore hau gertatu da: {{error}}",
"internalErrorTitle": "Barne-errorea",
"kickMessage": "{{participantDisplayName}} kontaktatu dezakezu xehetasun gehiagorentzat.",
"kickMessage": "{{participantDisplayName}} kontaktatu dezakezu xehetasun gehiago lortzeko.",
"kickParticipantButton": "Bota",
"kickParticipantDialog": "Ziur parte-hartzaile hau bota nahi duzula?",
"kickParticipantTitle": "Bota parte-hartzaile hau?",
"kickTitle": "Ai! {{participantDisplayName}} bileratik bota zaitu",
"kickTitle": "Ai! {{participantDisplayName}} parte-hartzaileak bileratik bota zaitu",
"liveStreaming": "Zuzeneko erreprodukzioa",
"liveStreamingDisabledForGuestTooltip": "Gonbidatuek ezin dute zuzeneko erreprodukzioa hasi.",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Ezin da egin grabazioa martxan dagoen artean",
"liveStreamingDisabledTooltip": "Hasi zuzeneko erreprodukzioa desgaituta.",
"lockMessage": "Konferentzia blokeatzeak huts egin du.",
"lockRoom": "Gehitu bilerako $t(lockRoomPasswordUppercase)",
"lockTitle": "Blokeoak huts egin du",
"logoutQuestion": "Ziur saioa itxi eta konferentzia gelditu nahi duzula?",
"login": "Login",
"logoutTitle": "Saioa itxi",
"maxUsersLimitReached": "Parte-hartzaileen gehieneko kopurua bete da. Hitzaldia beteta dago. Mesedez, jarri harremanetan antolatzailearekin edo saiatu geroago!",
"maxUsersLimitReachedTitle": "Parte-hartzaileen gehieneko mugara iritsi da",
@@ -209,26 +235,37 @@
"micNotSendingData": "Joan zure ordenagailuaren ezarpenetara mikrofonoa aktibatzeko eta haren maila doitzeko",
"micNotSendingDataTitle": "Zure mikrofonoa isilduta dago zure sistemaren ezarpenetan",
"micPermissionDeniedError": "Ez duzu baimenik eman zure mikrofonoa erabiltzeko. Hitzaldiarekin bat egin dezakezu, baina ezingo duzu entzun. Erabili kameraren botoia helbide-barran hori konpontzeko.",
"micTimeoutError": "Ezin da audio iturburua abiarazi. Denbora-muga gainditu da!",
"micUnknownError": "Ezin da mikrofonoa erabili, arrazoi ezezagunak direla eta.",
"muteEveryoneElseDialog": "Mututu ondoren, ezin izango dituzu desmututu, baina beraien burua desmutututzeko aukera izango dute.",
"muteEveryoneElseTitle": "Isilarazi guztiak {{whom}} izan ezik?",
"muteEveryoneDialog": "Ziur denak mututu nahi dituzula? Ezin izango dituzu zuk desmututu, baina beraien burua desmutututzeko aukera izango dute.",
"muteEveryoneTitle": "Isilarazi guztiak?",
"muteEveryoneElsesVideoDialog": "Kamara desaktibatzen duzunean ezingo duzu berriz aktibatu, baina besteek aktibatu egin ahal izango dute.",
"muteEveryoneElsesVideoTitle": "Guztien kamera itzali {{whom}} parte-hartzailearena izan ezik?",
"muteEveryonesVideoDialog": "Ziur zaude guztien kamera itzali nahi duzula? Ezingo duzu berriz aktibatu baina besteek aktibatu egin ahal izango dute.",
"muteEveryonesVideoDialogOk": "Desaktibatu",
"muteEveryonesVideoTitle": "Guztien kamera desaktibatu?",
"muteEveryoneSelf": "zure burua",
"muteEveryoneStartMuted": "Denak mutututa hasiko dira hemendik aurrera",
"muteParticipantBody": "Ezin izango dituzu zuk desmututu, baina beraien burua desmutututzeko aukera izango dute.",
"muteParticipantButton": "Isilarazi",
"muteParticipantDialog": "Ziur parte-hartzaile hau mututu nahi duzula? Ezin izango duzu zuk desmututu, baina bereburua desmutututzeko aukera izango du.",
"muteParticipantTitle": "Isilarazi parte-hartzaile hau?",
"muteParticipantsVideoButton": "Itzali kamera",
"muteParticipantsVideoTitle": "Parte-hartzaile honen kamera itzali?",
"muteParticipantsVideoBody": "Ezingo duzu berriz aktibatu baina berak edonoiz aktibatu egin ahal izango du.",
"Ok": "Ados",
"password": "Pasahitza",
"passwordLabel": "Bilera parte-hartzaile batek blokeatu du. Sartu $t(lockRoomPassword) batzeko.",
"passwordNotSupported": "$t(lockRoomPassword) bilera ezartzea ez da onartzen.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) ezin da erabili",
"passwordRequired": "$t(lockRoomPasswordUppercase) beharrezkoa da",
"popupError": "Zure nabigatzaileak gune honetako pop-up leihoak blokeatzen ditu. Aktibatu pop-upak arakatzailearen segurtasun-ezarpenetan eta saiatu berriro.",
"popupErrorTitle": "Laster-leihoa blokeatuta",
"readMore": "more",
"recording": "Grabatzen",
"recordingDisabledForGuestTooltip": "Gonbidatuek ezin dute grabaketarik hasi.",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Ezin da egin zuzeneko emanaldia aktibo dagoen artean",
"recordingDisabledTooltip": "Hasi grabatzen desgaituta.",
"rejoinNow": "Berriro batu",
"remoteControlAllowedMessage": "{{user}} erabiltzaileak zure urruneko-kontrol eskaera onartu egin du!",
@@ -246,10 +283,8 @@
"reservationErrorMsg": "Kode-errorea: {{code}}, mezua: {{msg}}",
"retry": "Saiatu berriro",
"screenSharingAudio": "Partekatu audioa",
"screenSharingFailedToInstall": "Hara! Zure pantaila-partekatze luzapena instalatzeak huts egin du.",
"screenSharingFailedToInstallTitle": "Pantaila-partekatze luzapena instalatzeak huts egin du",
"screenSharingFirefoxPermissionDeniedError": "Arazoren bat egon da zure pantaila partekatzen saiatu garenean. Ziurtatu horretarako baimena eman diguzula. ",
"screenSharingFirefoxPermissionDeniedTitle": "Hara! Ezin izan dugu pantaila-partekatzea hasi!",
"screenSharingFailed": "Atx! Erroreren bat gertatu da eta ezin izan dugu zure pantaila partekatzen hasi!",
"screenSharingFailedTitle": "Pantaila partekatzeak huts egin du!",
"screenSharingPermissionDeniedError": "Hara! Arazoren bat egon da pantaila-partekatze luzapenaren baimenekin. Kargatu eta saiatu berriro.",
"sendPrivateMessage": "Mezu pribatua berriki jaso duzu. Pribatuki erantzun nahi duzu ala zure mezua taldera bidali nahi duzu?",
"sendPrivateMessageCancel": "Bidali taldera",
@@ -257,12 +292,12 @@
"sendPrivateMessageTitle": "Bidali pribatuki?",
"serviceUnavailable": "Zerbitzua ez erabilgarria",
"sessTerminated": "Deia amaituta",
"sessionRestarted": "Deia zubiak berrabiarazi du",
"Share": "Partekatu",
"shareVideoLinkError": "Eman YouTube esteka zuzena.",
"shareVideoTitle": "Partekatu bideoa",
"shareYourScreen": "Partekatu zure pantaila",
"shareYourScreenDisabled": "Pantaila-partekatzea desgaituta.",
"shareYourScreenDisabledForGuest": "Gonbidatuek ezin dute pantaila partekatu.",
"startLiveStreaming": "Hasi zuzeneko erreprodukzioa",
"startRecording": "Hasi grabatzen",
"startRemoteControlErrorMessage": "Errorea gertatu da urruneko-kontrol saioa hasten saiatzerakoan!",
@@ -273,26 +308,50 @@
"streamKey": "Zuzeneko erreprodukzioaren giltza",
"Submit": "Bidali",
"thankYou": "Eskerrik asko {{appName}} erabiltzeagatik!",
"token": "token",
"token": "tokena",
"tokenAuthFailed": "Ez duzu dei honetara elkartzeko baimenik.",
"tokenAuthFailedTitle": "Autentifikazioak huts egin du",
"transcribing": "Transkripzioa",
"unlockRoom": "Kendu bileraren $t(lockRoomPassword)",
"userPassword": "erabiltzailearen pasahitza",
"user": "User",
"userIdentifier": "Erabiltzaile-izena",
"userPassword": "Erabiltzailearen pasahitza",
"videoLink": "Bideoaren estaka link",
"WaitForHostMsg": "<b>{{room}}</b> konferentzia oraindik ez da hasi. Ostalaria bazara, autentifikatu. Bestela, itxaron ostalaria iritsi arte.",
"WaitForHostMsgWOk": "<b>{{room}}</b> konferentzia oraindik ez da hasi. Ostalaria bazara, sakatu Ados autentifikatu ahal izateko. Bestela, itxaron ostalaria iritsi arte.",
"WaitingForHost": "Ostalariaren zain",
"WaitingForHostTitle": "Antolatzailearen zain...",
"Yes": "Bai",
"yourEntireScreen": "Zure pantaila osoa"
},
"dialOut": {
"statusMessage": "{{status}} dago"
},
"documentSharing": {
"title": "Partekatutako dokumentua"
"yourEntireScreen": "Zure pantaila osoa",
"remoteUserControls": "{{username}} parte-hartzailearen urruneko kontrolak",
"localUserControls": "Erabiltzaile lokalaren kontrolak"
},
"dialOut": { "statusMessage": "{{status}} dago" },
"documentSharing": { "title": "Partekatutako dokumentua" },
"e2ee": {
"labelToolTip": ""
"labelToolTip": "Bilera honetako audio eta bideoa puntutik puntura zifratuta daude."
},
"embedMeeting": { "title": "Bilera hau txertatu" },
"virtualBackground": {
"apply": "Aplikatu",
"title": "Atzeko plano birtualak",
"blur": "Lausotu",
"slightBlur": "Lausotze arina",
"removeBackground": "Kendu atzeko planoa",
"addBackground": "Gehitu atzeko planoa",
"pleaseWait": "Itxaron mesedez...",
"none": "Bat ere ez",
"uploadedImage": "Kargatutako irudia {{index}}",
"deleteImage": "Ezabatu irudia",
"image1": "Hondartza",
"image2": "Horma zuria",
"image3": "Gela huts zuria",
"image4": "Lurreko lanpara beltza",
"image5": "Mendia",
"image6": "Basoa",
"image7": "Egunsentia",
"desktopShareError": "Ezin izan da mahaigaina partekatu",
"desktopShare": "Mahaigaina partekatu",
"webAssemblyWarning": "Ezin da WebAssembly erabili"
},
"feedback": {
"average": "Normala",
@@ -301,7 +360,8 @@
"good": "Ona",
"rateExperience": "Puntuatu zure bileraren esperientzia",
"veryBad": "Oso Txarra",
"veryGood": "Oso ona"
"veryGood": "Oso ona",
"star": "Star"
},
"incomingCall": {
"answer": "Erantzun",
@@ -318,6 +378,7 @@
"country": "Herrialdea",
"dialANumber": "Bilerara batzeko, deitu zenbaki hauetakoren batera eta sartu pin-a.",
"dialInConferenceID": "PIN:",
"copyNumber": "Kopiatu zenbakia",
"dialInNotSupported": "Markatzea ez da onartzen.",
"dialInNumber": "Markatzea:",
"dialInSummaryError": "Huts egin du markatze-informazioa eskuratzeko. Saiatu berriro geroago.",
@@ -326,6 +387,7 @@
"inviteLiveStream": "Bilera honen zuzeneko erreprodukzioa ikusteko, egin klik esteka honetan: {{url}}",
"invitePhone": "Telefonoz sartzeko, markatu : {{number}},,{{conferenceID}}#\n",
"invitePhoneAlternatives": "Markatze-zenbaki ezberdin baten bila zabiltza?\nIkusi bileraren markatze-zenbakiak: {{url}}\n\n\nGela-telefono baten bidez markatzen ari bazara, batu audioa konektatu gabe: {{silentUrl}}",
"inviteSipEndpoint": "SIP helbidea erabiliz sartzeko erabili hau: {{sipUri}}",
"inviteURLFirstPartGeneral": "Bilera batera batzeko gonbidapena luzatu zaizu.",
"inviteURLFirstPartPersonal": "{{name}} erabiltzaileak bilera batera gonbidatu zaitu.\n",
"inviteURLSecondPart": "\nBilerara sartu:\n{{url}}\n",
@@ -354,6 +416,7 @@
"support": "Laguntza",
"supportMsg": "Hau gertatzen jarraituz gero, jarri gurekin harremanetan"
},
"jitsiHome": "{{logo}} Logoa portadara estekatuta dago",
"keyboardShortcuts": {
"focusLocal": "Arreta jarri zure bideoan",
"focusRemote": "Arreta jarri beste pertsona baten bideoan",
@@ -366,12 +429,14 @@
"showSpeakerStats": "Erakutsi iragarleen estatistikak",
"toggleChat": "Ireki edo itxi txata",
"toggleFilmstrip": "Erakutsi edo ezkutatu bideoaren miniaturak",
"toggleParticipantsPane": "Erakutsi edo ezkutatu parte-hartzaileen panela",
"toggleScreensharing": "Kamera eta pantailaren partekatzea aldatu",
"toggleShortcuts": "Erakutsi edo ezkutatu teklatu lasterbideak",
"videoMute": "Abiarazi edo gelditu zure kamera",
"videoQuality": "Kudeatu deiaren kalitatea"
"videoMute": "Abiarazi edo gelditu zure kamera"
},
"liveStreaming": {
"limitNotificationDescriptionWeb": "Zuzeneko emanaldien arrakasta dela eta {{limit}} minutura mugatuta daude. Mugarik gabekoa nahi baduzu probatu <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Zure emanaldia {{limit}} minutura mugatuta dago. Mugarik gabekoa nahi baduzu probatu {{app}}.",
"busy": "Transmisio baliabideak libratzen ari gara. Saiatu berriro minutu batzuk barru.",
"busyTitle": "Zuzeneko emanaldia egin dezaketen guztiak okupatuta daude",
"changeSignIn": "Aldatu kontua.",
@@ -382,16 +447,16 @@
"errorAPI": "Errorea gertatu da zure YouTube igorpenetan sartzerakoan. Saiatu berriro saioa hasten.",
"errorLiveStreamNotEnabled": "{{email}} e-postan ez dago zuzeneko transmisioa gaituta. Gaitu zuzeneko transmisioa edo hasi saioa zuzeneko transmisioa gaituta duen kontu batean.",
"expandedOff": "Zuzeneko transmisioa gelditu da",
"expandedOn": "",
"expandedPending": "Zuzeneko transmisioa abian da",
"expandedOn": "Bideodeia YouTuben emititzen ari da",
"expandedPending": "Zuzeneko transmisioa abian da\u2026",
"failedToStart": "Zuzeneko transmisioak ezin izan du hasi",
"getStreamKeyManually": "",
"getStreamKeyManually": "Ezin izan dugu zure transmisio-gakoa bilatu. Lortu ezazu YouTuberen webgunetik.",
"invalidStreamKey": "Zuzeneko transmisioaren gakoa okerra izan daiteke.",
"off": "Zuzeneko transmisioa gelditu da",
"offBy": "{{name}} erabiltzaileak zuzeneko emanaldia gelditu du",
"on": "Zuzeneko transmisioa",
"onBy": "{{name}} erabiltzaileak zuzeneko emanaldia hasi du",
"pending": "Zuzeneko transmisioa abian",
"pending": "Zuzeneko transmisioa abian\u2026",
"serviceName": "Zuzeneko transmisioa zerbitzua",
"signedInAs": "Honela hasi duzu saioa:",
"signIn": "Hasi saioa Google-ekin",
@@ -400,7 +465,7 @@
"start": "Hasi zuzeneko transmisioa",
"streamIdHelp": "Zer da hau?",
"unavailableTitle": "Zuzeneko transmisioa ez dago erabilgarri",
"youtubeTerms": "",
"youtubeTerms": "YouTuberen erabilpen baldintzak",
"googlePrivacyPolicy": "Google-en pribatutasun-politika"
},
"localRecording": {
@@ -442,7 +507,7 @@
"disconnected": "deskonektatuta",
"focus": "Konferentzia fokuratu",
"focusFail": "{{component}} ez dago eskuragarri - saiatu berriro {{ms}} segundo barru",
"grantedTo": "{{to}}(e)ri moderatzaile eskubideak eman zaizkio!",
"grantedTo": "{{to}} parte-hartzaileari moderatzaile eskubideak eman zaizkio!",
"invitedOneMember": "{{name}} gonbidatu da",
"invitedThreePlusMembers": "{{name}} eta beste {{count}} gonbidatu dira",
"invitedTwoMembers": "{{first}} eta {{second}} jada gonbidatu dira",
@@ -453,9 +518,13 @@
"mutedTitle": "Mutututa zaude!",
"mutedRemotelyTitle": "{{participantDisplayName}}(e)k mututu zaitu!",
"mutedRemotelyDescription": "Hitz egiteko prest zaudenean mikrofonoa piztu dezakezu. Amaitzean berriz ere isilarazi ezazu bilerako zarata ekiditeko.",
"videoMutedRemotelyTitle": "Your camera has been disabled by {{participantDisplayName}}!",
"videoMutedRemotelyDescription": "You can always turn it on again.",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) beste erabiltzaile batek kendu du",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) beste erabiltzaile batek ezarri du",
"raisedHand": "{{name}} erabiltzaileak hitz egin nahi du.",
"screenShareNoAudio": " Share audio box was not checked in the window selection screen.",
"screenShareNoAudioTitle": "Share audio was not checked",
"somebody": "Norbait",
"startSilentTitle": "Audio irteerarik gabe batu zara!",
"startSilentDescription": "Batu berriro audioa gaitzeko",
@@ -465,56 +534,101 @@
"newDeviceCameraTitle": "Kamera berria hauteman da",
"newDeviceAudioTitle": "Audio-gailu berria hauteman da",
"newDeviceAction": "Erabilera",
"OldElectronAPPTitle": "",
"oldElectronClientDescription1": "",
"oldElectronClientDescription2": "",
"oldElectronClientDescription3": ""
"OldElectronAPPTitle": "Zaharkitutako aplikazioa",
"oldElectronClientDescription1": "Segurtasun arazoak dituen Jitsi Meet aplikazioa erabiltzen arai zara. Eguneratu ezazu",
"oldElectronClientDescription2": "bertsio berriagora",
"oldElectronClientDescription3": "ORAIN!",
"groupTitle": "Jakinarazpenak"
},
"participantsPane": {
"close": "Itxi",
"headings": {
"lobby": "Itxaron-gela ({{count}})",
"participantsList": "Bilerako parte-hartzaileak ({{count}})"
},
"actions": {
"invite": "Gonbidatu norbait",
"muteAll": "Ixilarazi guztiak",
"stopVideo": "Gelditu bideoa"
}
},
"passwordSetRemotely": "beste parte-hartzaile batek ezarrita",
"passwordDigitsOnly": "{{number}} digitu arte",
"poweredby": "garatzailea:",
"prejoin": {
"audioAndVideoError": "",
"audioOnlyError": "",
"audioTrackError": "",
"callMe": "",
"callMeAtNumber": "",
"configuringDevices": "",
"connectedWithAudioQ": "",
"copyAndShare": "",
"dialInMeeting": "",
"dialInPin": "",
"dialing": "",
"iWantToDialIn": "",
"joinAudioByPhone": "",
"joinMeeting": "",
"joinWithoutAudio": "",
"initiated": "",
"linkCopied": "",
"lookGood": "",
"or": "",
"calling": "",
"startWithPhone": "",
"screenSharingError": "",
"videoOnlyError": "",
"videoTrackError": "",
"viewAllNumbers": ""
"audioAndVideoError": "Errorea audio eta bideoan:",
"audioDeviceProblem": "Arazo bat dago zure audio gailuarekin",
"audioOnlyError": "Errorea audioan:",
"audioTrackError": "Ezin izan da audio pista sortu.",
"calling": "Deitzen",
"callMe": "Deitu nazazu",
"callMeAtNumber": "Deitu nazazu zenbaki honetara:",
"configuringDevices": "Gailuak konfiguratzen...",
"connectedWithAudioQ": "Audioarekin konektatuta zaude?",
"connection": {
"good": "Zure internet konexioa ondo dabil!",
"nonOptimal": "Zure internet konexioa ez da onena",
"poor": "Zure internet konexioa kaxkarra da"
},
"connectionDetails": {
"audioClipping": "Zure audioa ez da guztiz ondo entzungo.",
"audioHighQuality": "Zure audioak kalitate bikaina izango du.",
"audioLowNoVideo": "Zura audioa kaxkarra izango da eta ez da bideorik egongo.",
"goodQuality": "Izugarria! Zure deiaren kalitatea ona izango da.",
"noMediaConnectivity": "Ezin izan dugu proba hau egiteko inora konektatu. Hau firewall edo suebaki bat dagoelako eta NATagatik gertatu ohi da.",
"noVideo": "Zure bideoa oso txarra izango da.",
"undetectable": "Oraindik ere ezin baduzu nabigatzailean dieirk egin, ziurtatu zure bozgorailu, mikrofono eta kamera piztuta daudela eta ondo dabiltzala eta nabigatzaileari berauek erabiltzeko baimena eman diozula.",
"veryPoorConnection": "Zure deiaren kalitatea oso txarra izango da.",
"videoFreezing": "Zure bideoa gelditu, belztu eta pixelatu egingo da.",
"videoHighQuality": "Zure bideoak kalitate ona izango du.",
"videoLowQuality": "Zure bideoak kalitate txikia izango du.",
"videoTearing": "Zure bideoa pixelatuta agertuko da eta ez da ondo ikusiko."
},
"copyAndShare": "Kopiatu eta partekatu bileraren esteka",
"dialInMeeting": "Telefono dei bat eginez sartu",
"dialInPin": "Deitu bilerara eta idatzi kode hau:",
"dialing": "Deitzen",
"doNotShow": "Ez erakutsi pantaila hau berriz",
"errorDialOut": "Ezin izan da deitu",
"errorDialOutDisconnected": "Ezin izan da deitu. Konexioa eten egin da",
"errorDialOutFailed": "Ezin izan da deitu. Deiak huts egin du",
"errorDialOutStatus": "Ezin izan da deiaren egoera lortu",
"errorMissingName": "Idatzi zure izena bileran sartzeko",
"errorStatusCode": "Errorea deitzean, kodea: {{status}}",
"errorValidation": "Zenbakiaren balidazioak huts egin du",
"iWantToDialIn": "Telefonoz sartu nahi dut",
"joinAudioByPhone": "Telefono deiaren audioarekin sartu",
"joinMeeting": "Bilerara sartu",
"joinWithoutAudio": "Audio gabe sartu",
"initiated": "Deia hasi da",
"linkCopied": "Lotura ondo kopiatu da",
"lookGood": "Zure mikrofonoa ondo dabil",
"or": "edo",
"premeeting": "Aurre-bilera",
"showScreen": "Aktibatu bileraren aurreko pantaila",
"keyboardShortcuts": "Aktibatu teklatuaren laster-teklak",
"startWithPhone": "Telefono diearen audioarekin hasi",
"screenSharingError": "Errorea pantaila partekatzean:",
"videoOnlyError": "Errorea bideoan:",
"videoTrackError": "Ezin izan da bideo pista sortu.",
"viewAllNumbers": "zenbaki guztiak ikusi"
},
"presenceStatus": {
"busy": "Okupatuta",
"calling": "Deitzen",
"calling": "Deitzen\u2026",
"connected": "Konektatuta",
"connecting": "Konektatzen",
"connecting2": "",
"connecting": "Konektatzen\u2026",
"connecting2": "Konektatzen*\u2026",
"disconnected": "Deskonektatuta",
"expired": "Iraungita",
"ignored": "Ezikusia",
"initializingCall": "Deia hasieratzen",
"initializingCall": "Deia hasieratzen\u2026",
"invited": "Gonbidatua",
"rejected": "Baztertuta",
"ringing": "Deitzen"
"ringing": "Deitzen\u2026"
},
"profile": {
"avatar": "iruditxoa",
"setDisplayNameLabel": "Ezarri zure bistaratze-izena",
"setEmailInput": "Sartu e-posta",
"setEmailLabel": "Ezarri zure gravatar e-posta",
@@ -522,6 +636,8 @@
},
"raisedHand": "Hitz egin nahiko luke",
"recording": {
"limitNotificationDescriptionWeb": "Zure grabazioa {{limit}} minutura mugatuta dago. Mugarik gabeko grabazioak izateko probatu <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"limitNotificationDescriptionNative": "Zure grabazioa {{limit}} minutura mugatuta dago. Mugarik gabeko grabazioak izateko probatu <3>{{app}}</3>.",
"authDropboxText": "Kargatu Dropbox-era",
"availableSpace": "Leku erabilgarria: {{spaceLeft}} MB (gutxi gorabehera {{duration}} grabazio minutuak)",
"beta": "BETA",
@@ -530,7 +646,7 @@
"error": "Grabazioak huts egin du. Saiatu berriro.",
"expandedOff": "Grabazioa gelditu da",
"expandedOn": "Bilera grabatzen ari da.",
"expandedPending": "Grabaketa abian da",
"expandedPending": "Grabaketa abian da\u2026",
"failedToStart": "Grabazioa hasteak huts egin du",
"fileSharingdescription": "Partekatu grabazioa bileraren parte-hartzaileekin",
"live": "ZUZENEAN",
@@ -539,17 +655,22 @@
"offBy": "{{name}} erabiltzaileak grabazioa gelditu du",
"on": "Grabaketa",
"onBy": "{{name}} erabiltzaileak grabazioa hasi du",
"pending": "Bilera grabatzeko prestatzen",
"pending": "Bilera grabatzeko prestatzen\u2026",
"rec": "GRB",
"serviceDescription": "Zure grabazioa grabazio-zerbitzuan gordeko da",
"serviceDescriptionCloud": "Lainoko grabazioa",
"serviceName": "Grabazio-zerbitzua",
"signIn": "Sartu",
"signOut": "Itxi saioa",
"unavailable": "",
"unavailable": "Atx! {{serviceName}} ez dago eskuragarri. Arazoa konpontzeko lanean gabiltza. Saiatu berriz beranduago.",
"unavailableTitle": "Grabazioa ez dago eskuragarri"
},
"sectionList": {
"pullToRefresh": "Eguneratu"
"sectionList": { "pullToRefresh": "Eguneratu" },
"security": {
"about": "Zure bilerari $t(lockRoomPassword) gehitu diezaiokezu. Parte-hartzaileek $t(lockRoomPassword) idatzi beharko dute bilerara sartu aurretik.",
"aboutReadOnly": "Moderatzaileak $t(lockRoomPassword) gehitu diezaiokete bilerari. Parte-hartzaileek $t(lockRoomPassword) idatzi beharko dute bilerara sartu aurretik.",
"insecureRoomNameWarning": "Bileraren izena ez da segurua. Nahi ez duzun parte-hartzaileak agertu daitezke. Baloratu segurtasuna botoia erabiliz bilerari segurtasuna gehitzea.",
"securityOptions": "Segurtasun aukerak"
},
"settings": {
"calendar": {
@@ -568,6 +689,7 @@
"more": "Gehiago",
"name": "Izena",
"noDevice": "Bat ere ez",
"sameAsSystem": "Same as system ({{label}})",
"selectAudioOutput": "Audio irteera",
"selectCamera": "Kamera",
"selectMic": "Mikrofonoa",
@@ -579,15 +701,15 @@
"settingsView": {
"advanced": "Aurreratua",
"alertOk": "Ados",
"alertCancel": "",
"alertCancel": "Utzi",
"alertTitle": "Abisua",
"alertURLText": "Zerbitzariaren URLa baliogabea da",
"buildInfoSection": "Konpilazioaren informazioa",
"conferenceSection": "",
"conferenceSection": "Konferentzia",
"disableCallIntegration": "Desgaitu jatorrizko deien integrazioa",
"disableP2P": "Desgaitu puntuz puntuko modua",
"disableCrashReporting": "",
"disableCrashReportingWarning": "",
"disableCrashReporting": "Desgaitu huts egiteen inguruko informazioa bidaltzea",
"disableCrashReportingWarning": "Ziur zaude ez duzula huts egiteen inguruko informazioa bidaltzerik? Aukera aplikazioa berrabiaraztean aktibatuko da.",
"displayName": "Bistaratzeko izena",
"email": "Posta elektronikoa",
"header": "Ezarpenak",
@@ -613,6 +735,7 @@
},
"startupoverlay": {
"policyText": " ",
"genericTitle": "Bilerak zure mikrofonoa eta kamera erabili behar ditu.",
"title": "{{app}} aplikazioak zure mikrofonoa eta kamara erabili behar ditu."
},
"suspendedoverlay": {
@@ -629,27 +752,36 @@
"chat": "Txandakatu txat leihoa",
"document": "Txandakatu partekatutako dokumentua",
"download": "Gure aplikazioak deskargatu",
"e2ee": "",
"embedMeeting": "Embed meeting",
"feedback": "Utzi iruzkin bat",
"fullScreen": "",
"fullScreen": "Aldatu pantaila osora",
"grantModerator": "Bihurtu moderatzaile",
"hangup": "Deia bota",
"help": "Laguntza",
"invite": "Jendea gonbidatu",
"kick": "Kanporatu parte-hartzailea",
"lobbyButton": "Aktibatu/desaktibatu itxaron-gela",
"localRecording": "Tokiko grabazio kontrolak kontrolatu",
"lockRoom": "Aldatu bileraren pasahitza",
"moreActions": "Txandakatu ekintza gehiago menua",
"moreActionsMenu": "Ekintza gehiago menua",
"moreOptions": "",
"moreOptions": "Erakutsi aukera gehiagu",
"mute": "Isildu",
"muteEveryone": "Partehartzaile guztiak isildu",
"muteEveryoneElse": "Ixildu beste guztiak",
"muteEveryonesVideo": "Itzali guztien kamera",
"muteEveryoneElsesVideo": "Itzali beste guztien kamera",
"participants": "Parte-hartzaileak",
"pip": "Txandakatu irudiaren irudian",
"privateMessage": "Mezu pribatua bidali",
"profile": "Editatu zure profila",
"raiseHand": "",
"raiseHand": "Jaso edo jaitsi eskua",
"recording": "Grabaketa aktibatu",
"remoteMute": "Mututu parte-hartzailea",
"remoteVideoMute": "Desaktibatu parte-hartzaile baten kamera",
"security": "Segurtasun aukerak",
"Settings": "Txandakatu ezarpenak",
"shareaudio": "Partekatu audioa",
"sharedvideo": "Txandakatu YouTube bideoa partekatzen",
"shareRoom": "norbait gonbidatu",
"shareYourScreen": "Txandakatu pantaila partekatzea",
@@ -660,9 +792,14 @@
"toggleCamera": "Txandakatu kamera",
"toggleFilmstrip": "Txandakatu film-zerrenda",
"videomute": "Txandakatu mutututako bideoa",
"videoblur": "Txandakatu bideoaren lausotzea"
"videoblur": "Txandakatu bideoaren lausotzea",
"selectBackground": "Aukeratu atzeko-planoa",
"expand": "Zabaldu",
"collapse": "Batu"
},
"addPeople": "Gehitu jendea zure deira",
"audioSettings": "Audio ezarpenak",
"videoSettings": "Video ezarpenak",
"audioOnlyOff": "Gaitu audioa soilik modua",
"audioOnlyOn": "Gaitu audioa soilik modua",
"audioRoute": "Aukeratu soinu gailua",
@@ -673,7 +810,8 @@
"documentClose": "Dokumentu partekatu itxi",
"documentOpen": "Ireki partekatutako dokumentua",
"download": "Deskargatu gure aplikazioa",
"e2ee": "",
"e2ee": "Puntutik punturako zifratzea",
"embedMeeting": "Txertatu bilera",
"enterFullScreen": "Ikusi pantaila osoa",
"enterTileView": "Sartu mosaiko ikuspegian",
"exitFullScreen": "Irten pantaila osora",
@@ -682,6 +820,8 @@
"hangup": "Irten",
"help": "Laguntza",
"invite": "Jendea gonbidatu",
"lobbyButtonDisable": "Desaktibatu itxaron-gela modua",
"lobbyButtonEnable": "Aktibatu itxaron-gela modua",
"login": "Saioa hasi",
"logout": "Itxi saioa",
"lowerYourHand": "Jaitsi eskua",
@@ -689,20 +829,24 @@
"moreOptions": "Aukera gehiago",
"mute": "Isiltasuna aktibatu / desaktibatu",
"muteEveryone": "Partehartzaile guztiak isildu",
"muteEveryonesVideo": "Desaktibatu guztien kamera",
"noAudioSignalTitle": "Mikrofonotik ez dago sarrerarik!",
"noAudioSignalDesc": "Sistema edo gailuaren ezarpenetatik islatu ez baduzu, kontuan hartu gailua aldatzea.",
"noAudioSignalDescSuggestion": "Sistema edo gailuaren ezarpenetatik islatu ez baduzu, kontuan hartu hurrengo gailua erabiltzea:",
"noAudioSignalDialInDesc": "",
"noAudioSignalDialInLinkDesc": "",
"noAudioSignalDialInDesc": "Gainera, hau erabiliz deitu dezakezu:",
"noAudioSignalDialInLinkDesc": "Deitzeko telefonoak",
"noisyAudioInputTitle": "ingurune zaratatsua",
"noisyAudioInputDesc": "ingurune zaratatsua",
"openChat": "Ireki txata",
"participants": "Parte-hartzaileak",
"pip": "Irudi-irudian sartu",
"privateMessage": "Bidali mezu pribatua",
"profile": "Editatu zure profila",
"raiseHand": "Altxa / jaitsi eskua",
"raiseYourHand": "Altxatu eskua",
"raiseHand": "Jaso / jaitsi eskua",
"raiseYourHand": "Jaso eskua",
"security": "Segurtasun aukerak",
"Settings": "Ezarpenak",
"shareaudio": "Partekatu audioa",
"sharedvideo": "Partekatu YouTube bideoa",
"shareRoom": "Gonbidatu norbait",
"shortcuts": "Ikusi lasterbideak",
@@ -716,8 +860,7 @@
"tileViewToggle": "Txandakatu fitxa ikuspegia",
"toggleCamera": "Txandakatu kamera",
"videomute": "Hasi / gelditu kamera",
"startvideoblur": "Bideo lausoa hasi",
"stopvideoblur": "Bideo lausoa gelditu"
"selectBackground": "Aukeratu atzeko planoa"
},
"transcribing": {
"ccButtonTooltip": "Hasi / Gelditu Azpitituluak",
@@ -743,6 +886,7 @@
"react-nativeGrantPermissions": "Hautatu <b><i>Baimendu</i></b> zure nabigatzaileak baimenak eskatzen dituenean.",
"safariGrantPermissions": "Hautatu <b><i>Ados</i></b> zure nabigatzaileak baimenak eskatzen dituenean."
},
"volumeSlider": "Bolumena",
"videoSIPGW": {
"busy": "Baliabideak askatzeko lanetan gabiltza. Mesedez, saiatu berriro minutu batzuk barru.",
"busyTitle": "Gela zerbitzua lanpetuta dago une honetan",
@@ -765,60 +909,110 @@
"ld": "LD",
"ldTooltip": "Bideoa behe-definizioan ikusten",
"lowDefinition": "Behe-definizioa",
"onlyAudioAvailable": "Soilik audioa dago erabilgarri",
"onlyAudioSupported": "Arakatzaile honetan soilik onartzen dugu audioa.",
"sd": "SD",
"sdTooltip": "Definizio estandarrean bideoa ikusten",
"standardDefinition": "Definizio estandarra"
},
"videothumbnail": {
"connectionInfo": "Konexioaren informazioa",
"domute": "Mututu",
"domuteVideo": "Desaktibatu kamera",
"domuteOthers": "Mututu beste guztiak",
"domuteVideoOfOthers": "Desaktibatu beste guztien kamera",
"flip": "Irauli",
"grantModerator": "Bihurtu moderatzaile",
"kick": "Bota",
"moderator": "Moderatzailea",
"mute": "Parte-hartzailea mutututa dago",
"muted": "Mutututa",
"videoMuted": "Kamera desaktibatuta",
"remoteControl": "Hasi / Gelditu urruneko kontrola",
"show": "Erakutsi",
"videomute": "Parte-hartzaileak kamera geldiarazi du."
},
"welcomepage": {
"addMeetingName": "Gehitu bileraren izena",
"accessibilityLabel": {
"join": "Klik batzeko",
"roomname": "Sartu gelaren izena"
},
"appDescription": "",
"audioVideoSwitch": {
"audio": "Ahotsa",
"video": "Bideoa"
},
"appDescription": "Zure lantalde guztiarentzat bideodeiak. {{app}} aplikazio zifratu eta segurua da, eta gainera %100 software librea, doakoa, denbora mugarik gabe eta konturik sortu gabe erabiltzekoa.",
"audioVideoSwitch": { "audio": "Ahotsa", "video": "Bideoa" },
"calendar": "Egutegia",
"connectCalendarButton": "Konektatu zure egutegia",
"connectCalendarText": "Konektatu egutegia zure bilera guztiak {{app}}en ikusteko. Gainera, gehitu {{provider}} bilerak zure egutegian eta hasi klik bakar batekin.",
"enterRoomTitle": "Hasi bilera berria",
"getHelp": "Lortu laguntza",
"roomNameAllowedChars": "Bileraren izenak ez du honelako karaktererik eduki behar: ?, &,:, ', \",%, #.",
"go": "JOAN",
"goSmall": "JOAN",
"join": "SORTU / SARTU",
"headerTitle": "Jitsi Meet",
"headerSubtitle": "Secure and high quality meetings",
"info": "Informazioa",
"join": "SORTU / SARTU",
"jitsiOnMobile": "Jitsi eramangarrian \u2013 deskargatu gure aplikazioak eta hasi bilerak edonondik",
"mobileDownLoadLinkIos": "Deskargatu iOS aplikazioa",
"mobileDownLoadLinkAndroid": "Deskargatu Android aplikazioa",
"mobileDownLoadLinkFDroid": "Deskargatu aplikazioa F-Droid-etik",
"moderatedMessage": "Edu <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">gorde bilera helbide bat</a> eta zeu izango zara moderatzailea.",
"privacy": "Pribatutasuna",
"recentList": "Azkenak",
"recentListDelete": "Ezabatu",
"recentListEmpty": "Azkenak zerrenda hutsik dago. Txateatu zure taldearekin eta azken bilera guztiak hemen aurkituko dituzu.",
"reducedUIText": "Ongi etorri {{app}}era!",
"roomNameAllowedChars": "Bileraren izenak ez du honelako karaktererik eduki behar: ?, &,:, ', \",%, #.",
"roomname": "Sartu gelaren izena",
"roomnameHint": "Sartu batu nahi duzun gelaren izena edo URLa. Izen bat sor dezakezu eta bilerara sartuko diren pertsonei esaiezu, izen bera sartu dezaten.",
"sendFeedback": "Bidali iritzia",
"startMeeting": "Hasi bilera",
"terms": "Baldintzak",
"title": ""
"title": "Bideo-dei seguruak, hainbat aukerarekin eta guztiz doan.",
"logo": {
"calendar": "Egutegiaren logoa",
"microsoftLogo": "Microsoften logo",
"logoDeepLinking": "Jitsi meeten logo",
"desktopPreviewThumbnail": "Aurrebistaren iruditxoa",
"googleLogo": "Googleren logoa",
"policyLogo": "Politikaren logoa"
}
},
"lonelyMeetingExperience": {
"button": "Gonbidatu beste batzuk",
"youAreAlone": "Bileran dagoen bakarra zara"
},
"helpView": {
"header": "Laguntza gunea"
"helpView": { "header": "Laguntza gunea" },
"lobby": {
"admit": "Onartu",
"admitAll": "Onartu guztiak",
"knockingParticipantList": "Zain dauden parte-hartzaileak",
"allow": "Baimendu",
"backToKnockModeButton": "Ez du pasahitza erabili, baina sartzea eskatu du",
"dialogTitle": "Itxaron-gela modua",
"disableDialogContent": "Itxaron-gela modua aktibatuta dago. Horrela zuk nahi ez duzun erabiltzaileak sartzea eragotzi dezakezu. Desaktibatu egin nahi duzu?",
"disableDialogSubmit": "Desaktibatu",
"emailField": "Idatzi zure eposta",
"enableDialogPasswordField": "Ezarri pasahitza (hautazkoa)",
"enableDialogSubmit": "Aktibatu",
"enableDialogText": "Itxaron-gela moduak zure bilera babesten laguntzen du, horrela moderatzaile batek onartu beharko ditu bileran sartuko diren erabiltzaileak.",
"enterPasswordButton": "Idatzi bileraren pasahitza",
"enterPasswordTitle": "Idatzi pasahitza bileran sartzeko",
"invalidPassword": "Pasahitza ez da zuzena",
"joiningMessage": "Norbaitek zure eskaera sartu bezain laster sartuko zara bileran",
"joinWithPasswordMessage": "Pasahitz gabe sartzen saiatzen, itxaron mesedez...",
"joinRejectedMessage": "Sartzeko eskaera ukatu egin du moderatzaile batek",
"joinTitle": "Sartu bileran",
"joiningTitle": "Sartzeko eskatzen...",
"joiningWithPasswordTitle": "Pasahitzarekin sartzen...",
"knockButton": "Eskatu sartzea",
"knockTitle": "Norbaitek bileran sartu nahi du",
"nameField": "Idatzi zure izena",
"notificationLobbyAccessDenied": "{{targetParticipantName}} parte-hartzaileara sarbidea ukatu dio {{originParticipantName}} parte-hartzaileak",
"notificationLobbyAccessGranted": "{{targetParticipantName}} parte-hartzailea onartu du {{originParticipantName}} parte-hartzaileak",
"notificationLobbyDisabled": "{{originParticipantName}} parte-hartzaileak itxaron-gela desaktibatu egin du",
"notificationLobbyEnabled": "{{originParticipantName}} parte-hartzaileak itxaron-gela aktibatu egin du",
"notificationTitle": "Itxaron-gela",
"passwordField": "Idatzi bileraren pasahitza",
"passwordJoinButton": "Sartu",
"reject": "Baztertu",
"toggleLabel": "Itxaron-gela aktibatu"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -535,6 +535,7 @@
"participantsList": "({{count}}) partecipanti"
},
"actions": {
"invite": "Invita persone",
"muteAll": "Silenzia tutti",
"stopVideo": "Ferma il video"
}

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