Compare commits

...

246 Commits
1561 ... 1663

Author SHA1 Message Date
yanas
53e784094a Merge pull request #1308 from jitsi/ss_resize_remote
Fix for the size of remote desktop sharing videos
2017-02-08 15:31:06 -06:00
hristoterezov
0e92e48376 fix(ss): resize for remote videos 2017-02-08 14:58:42 -06:00
Lyubomir Marinov
4c9943ac38 Fix an image path on the mobile landing page 2017-02-08 12:41:51 -06:00
Дамян Минков
4bd0fd145d Merge pull request #1293 from jitsi/prosody_plugin_muc_all_owners
prosody plugin to make all users owners/moderators
2017-02-08 13:17:42 +02:00
Lyubomir Marinov
01ae82eb28 No Temasys alert on mobile Web 2017-02-07 21:54:08 -06:00
Lyubomir Marinov
e21eae0933 Prepare for webpack 2 2017-02-07 15:44:37 -06:00
Lyubomir Marinov
2f047c50dc Revert "No Temasys alert on mobile Web"
This reverts commit b09e86352f.
2017-02-07 15:21:34 -06:00
yanas
e397e1a80c Merge pull request #1303 from jitsi/no-temasys-alert-on-mobile
No Temasys alert on mobile (Web)
2017-02-07 15:11:09 -06:00
Lyubomir Marinov
b09e86352f No Temasys alert on mobile Web 2017-02-07 15:08:38 -06:00
Lyubomir Marinov
8687b69167 Consistency
Be consistent about formatting within 1 and the same file.
2017-02-07 08:29:40 -06:00
Lyubomir Marinov
6c5468d904 Simplify the source code
If half the file is written in ES6, it is easier to read if the rest of
the file is in ES6 as well. If ES6 is used, then const is better than
let. If source code is shorter yet as readable as the long version, then
prefer the short version.
2017-02-07 08:29:40 -06:00
Lyubomir Marinov
d6b0f8d4c5 Use functions, do not re-implement them
We have the functions reload and redirect which modify window.location.
Use them and do not directly modify window.location so that we have
fewer places of direct window.location modifications and it is easier to
refactor them.
2017-02-07 08:29:40 -06:00
Lyubomir Marinov
a8cd4ff12c 1, not 2 names for 1 and the same abstraction
window.location calls it reload so util/helpers shouldn't call it
redirect because UI/util/UIUtil has it is own redirect which is the
assign of window.location.
2017-02-07 08:29:40 -06:00
Lyubomir Marinov
8509efc8af Make the Web app aware of its context root 2017-02-07 08:27:23 -06:00
Saúl Ibarra Corretgé
23a0053dad doc: add section about embedding to the README 2017-02-06 17:41:19 -06:00
Saúl Ibarra Corretgé
5849980092 external_api: fix jsdoc 2017-02-06 17:41:19 -06:00
Saúl Ibarra Corretgé
e81fc2b254 doc: fix external API documentation
- use proper punctuation
- fix markdown syntax
- always use syntax highlighting
- document missing commands
- miscellaneous grammar fixes
2017-02-06 17:41:19 -06:00
Lyubomir Marinov
2ad869a036 Comply w/ coding style
- Use 1 name for 1 abstraction. Instead of useFullScreen and enabled use
  fullScreen.
- Comments are correct English sentences so no double spaces between
  senteces, no capitalization of the work On midsentence.
- Write as little source code as possible if readability is preserved.
- Utilize Facebook's Flow.
- The name of a private function must start with _ and the jsdoc should
  state that the function is private.
2017-02-06 15:32:03 -06:00
Saúl Ibarra Corretgé
7a8c84e990 [RN] Implement full screen mode while in a conference
The implementation varies across platforms, with the same goal: allow the app to
use the entire screen real state while in a conference.

On Android we use immersive mode, which  will hide the status and navigation bars.

https://developer.android.com/training/system-ui/immersive.html

On iOS the status bar is hidden, with a slide effect.
2017-02-06 13:51:17 -06:00
Lyubomir Marinov
0de01e93dd react-native 0.41.2 2017-02-06 12:24:38 -06:00
Lyubomir Marinov
6fa93e5b44 file-loader 0.10.0 2017-02-06 12:24:38 -06:00
Lyubomir Marinov
2144ec1e3f eslint 3.15.0 2017-02-06 12:24:38 -06:00
bgrozev
68d2f60ace Merge pull request #1276 from jitsi/respect-disable-rtx
fix: Respect the disableRtx config option.
2017-02-06 11:52:03 -06:00
George Politis
3d671ae71f docs: Documents the disableRtx config option. 2017-02-06 11:19:33 -06:00
Lyubomir Marinov
8ed47f9d99 [flow] Lint with Flow (in addition to JSHint and ESLint) 2017-02-03 16:36:14 -06:00
Lyubomir Marinov
b50f858556 [flow] Expand the coverage of flow-monitored files 2017-02-03 16:36:14 -06:00
Lyubomir Marinov
5de1a74429 [flow] Take advantage of flow-typed 2017-02-03 16:36:14 -06:00
Lyubomir Marinov
2063ad467d flow-typed 2017-02-03 16:36:14 -06:00
Lyubomir Marinov
679acbae16 Use babel-eslint in the whole project 2017-02-03 16:36:14 -06:00
Aaron van Meerten
a5b706a99e Added a prosody plugin for making all users into muc owners in prosody
Included a patch to prosody-trunk which allows owners to kick each other
2017-02-03 11:41:08 -06:00
yanas
542e61357e Adds new combined camera and mic icon 2017-02-02 17:10:02 -06:00
Lyubomir Marinov
3743602c67 [RN] Fix the parsing of the domain out of a URL 2017-02-02 13:40:49 -06:00
Lyubomir Marinov
ee651840bf Fixes related to coding style 2017-02-02 10:54:24 -06:00
damencho
0765c60d77 Moves feedback button as a component.
When callstats is not configured hide the button.
2017-02-02 10:06:17 -06:00
Lyubomir Marinov
7fa17322a1 Consistency in naming and jsdocs 2017-02-02 09:46:09 -06:00
Lyubomir Marinov
cfa3047330 [flow] Type annotations 2017-02-02 09:45:34 -06:00
Lyubomir Marinov
9e033deb7b Remove unnecessary source code 2017-02-02 09:42:14 -06:00
Lyubomir Marinov
f6c914f6f0 [flow] A minimal demonstration of flow in action 2017-02-01 13:38:37 -06:00
Lyubomir Marinov
06ff02c2a5 [flow] Ignore packages in node_modules that cause errors and we do not want to fix 2017-02-01 13:38:37 -06:00
Lyubomir Marinov
63fd263890 flow 0.36.0
The first step towards enabling Facbook's flow in the project. The flow
configuration is pristine as generated by react-native upgrade.
2017-02-01 13:38:37 -06:00
Lyubomir Marinov
94f3d4b279 [RN] Expand domains supported by Universal Links 2017-01-31 22:47:47 -06:00
Lyubomir Marinov
fdc96044ad [RN] App-specific URL scheme 2017-01-31 22:47:47 -06:00
Lyubomir Marinov
91487ffc94 Fix a case of endless recursion 2017-01-31 22:47:47 -06:00
Saúl Ibarra Corretgé
7a57dcc08a doc: add documentation on how to build the mobile apps 2017-01-31 22:32:15 -06:00
Дамян Минков
913a54713d Adds testing repo to readme. 2017-01-31 21:42:45 -06:00
damencho
39a8681e8e Improves safe checks for missing stats. 2017-01-30 17:01:25 -06:00
George Politis
a7015b0d1a fix: Respect the disableRtx config option. 2017-01-30 16:20:23 +00:00
Lyubomir Marinov
5305f23332 Consistent naming of functions
Until we make a decision on access modifier hints and adopt a respective
coding style, consistency is king.
2017-01-28 20:15:10 -06:00
Lyubomir Marinov
acbf3adab7 Simplify: Remove react/features/base/react-native 2017-01-28 20:13:54 -06:00
Lyubomir Marinov
366b2f1374 Simplify: Remove react/features/base/navigator 2017-01-28 19:56:35 -06:00
Lyubomir Marinov
2189ab7ee6 Consistent naming of react-redux's mapStateToProps
Until we make a decision on access modifier hints and adopt a respective
coding style, consistency is king.
2017-01-28 17:34:57 -06:00
Lyubomir Marinov
349c04d8d1 Consistent naming of functions
Until we make a decision on access modifier hints and adopt a respective
coding style, consistency is king.
2017-01-28 17:28:13 -06:00
Lyubomir Marinov
c7c6249ad7 [RN] Fix room name case sensitivity
It turns out that it is not enough to give lib-jitsi-meet the room name
in lower case. BOSH also needs the room name in lower case.
2017-01-28 17:26:09 -06:00
Lyubomir Marinov
5319227a8f Fix jsdocs 2017-01-28 12:11:24 -06:00
Lyubomir Marinov
3aff812ee2 Consistent naming of Component props mapped from the Redux state
Until we make a decision on access modifier hints and adopt a respective
coding style, consistency is king.
2017-01-27 21:36:20 -06:00
Lyubomir Marinov
88eabf23f4 Remove obsolete UnsupportedMobileBrowser functionality
The desired behavior of the button 'Start a conference' / 'Join the
conversation' is to launch the mobile app if installed; otherwise, do
nothing i.e. continue to display UnsupportedMobileBrowser.

Anyway, we may change our minds about allowing the user to continue in a
supported mobile browser so preserve the source code that enables that
but give it more appropriate naming.
2017-01-27 21:29:09 -06:00
Любомир Маринов
a70beaf7b6 Merge pull request #1265 from jitsi/api
api/api.html -> examples/api.html && rm doc/api
2017-01-27 20:11:23 -06:00
Lyubomir Marinov
c91bffa73c Merge branch 'saghul-android-audiomode' 2017-01-26 23:48:42 -06:00
Lyubomir Marinov
ea163dbbba Merge branch 'deduplicate-index-js' 2017-01-26 23:48:09 -06:00
Lyubomir Marinov
18bc99d6b5 Split long methods into multiple shorter ones 2017-01-26 23:35:56 -06:00
Lyubomir Marinov
bab94a207d Remove unnecessary source code 2017-01-26 21:08:50 -06:00
Lyubomir Marinov
ef39baab47 Comply w/ coding style
- Maximum of 80 characters per line.
- Group first and then sort in alphabetical order.
- Fields should begin with a lowercase letter.
2017-01-26 21:07:35 -06:00
Saúl Ibarra Corretgé
2edaaac7bf [RN] Implement AudioMode module on Android
This module chooses the most appropriate audio default based on the specified
mode.
2017-01-26 19:18:10 -06:00
Saúl Ibarra Corretgé
113e50c074 [RN] Bump Andoroid minimum and target SDK versions
Use a minimum SDK version of 19, that is Anroid 4.4 (KitKat) and a target SDK of
23, that is, Android 6.0 (Marshmallow).
2017-01-26 19:18:10 -06:00
Дамян Минков
900a675864 Merge pull request #1269 from jitsi/border-radius-fix
Fixes border radius.
2017-01-26 17:55:01 -06:00
Lyubomir Marinov
49b3b49f3e Remove duplication
The files react/index.native.js and react/index.web.js ended up having
very similar source code related to initializing the Redux store. Remove
the duplication.

Additionally, I always wanted the App React Component to be consumed
without the need to provide a Redux store to it.
2017-01-26 17:24:11 -06:00
yanas
23935d3d39 Fixes border radius. 2017-01-26 17:04:29 -06:00
Дамян Минков
3fd33d0f50 Merge pull request #1262 from jitsi/ui-fixes
Ui fixes
2017-01-26 10:15:39 -06:00
hristoterezov
8c3317b8e9 doc(iframe_api): api/api.html -> examples/api.html && rm doc/api 2017-01-26 10:02:34 -06:00
Lyubomir Marinov
99a9fc054f eslint 3.14.1 2017-01-26 09:39:47 -06:00
Lyubomir Marinov
967dcfc3d2 react-native-keep-awake 2.0.2 2017-01-26 09:39:20 -06:00
Lyubomir Marinov
0051b3b79c Clean up obsolete file references 2017-01-26 07:58:56 -06:00
Lyubomir Marinov
cbcee201f0 Comply w/ coding style 2017-01-26 07:58:46 -06:00
Ilya Daynatovich
1fa4a53a48 Remove rule 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
6a0b92638c Introduce interceptComponent function 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
2e81b8493e Introduce unsupported browser page 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
57ba702dda Clean up routing logic 2017-01-26 07:27:31 -06:00
Lyubomir Marinov
62bafcaf63 Introduce Platform in React
React Native provides a Platform abstraction which React does not
provide.
2017-01-26 07:27:31 -06:00
Lyubomir Marinov
7de5c9c1d2 Comply w/ coding style 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
8248b14555 Integrate Mobile landing in the Redux app 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
23ef0c8d9d justify text on landing page 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
58a4f59fd8 Implement Landing component 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
0c851934fb layout for mobile landing 2017-01-26 07:27:31 -06:00
Emil Ivov
8d58dbee38 Restores api.md to original location 2017-01-25 19:14:30 -06:00
yanas
cd5e84e4ef Fixes network problem message position 2017-01-25 16:54:51 -06:00
yanas
09ba14eb04 Fixes video thumbnail border and large video background color 2017-01-25 16:53:58 -06:00
Boris Grozev
b22f1965aa doc: Remove obsolete reference to browserify. 2017-01-25 15:48:32 -06:00
Samuel Liard
df6f920b44 Force jquery-ui version to fix pb with beta version we can get with npm
Use Maven in place of ant
Add --host parameter for jicofo
Add build for jitsi Meet

Revert "Force jquery-ui version to fix pb with beta version we can get with npm"

This reverts commit 35a8641e62.
2017-01-25 15:47:23 -06:00
Дамян Минков
f13b2462c8 Merge pull request #1257 from saghul/ds-options-cleanup
cleanup: Remove default Chrome extension ID
2017-01-23 17:04:59 -06:00
Paweł Domas
c0e80c14f8 Merge pull request #1192 from jitsi/remotecontrol
Implement remote control support
2017-01-23 17:00:11 -06:00
hristoterezov
2b1176df53 style(remotecontrol): getRequestedParticipant method comments 2017-01-23 16:06:51 -06:00
hristoterezov
05bfbf5620 fix(remotecontrol): Execute Reciever.enable only when the value is changed 2017-01-23 15:29:25 -06:00
hristoterezov
4af706bd83 style(keycode): Comment 2017-01-23 15:29:25 -06:00
hristoterezov
b62e4d5ee9 fix(remotecontrol): Log level 2017-01-23 15:29:25 -06:00
hristoterezov
bd98d661d3 ref(remotecontrol): Moves hangup logic to remote control module 2017-01-23 15:29:25 -06:00
hristoterezov
1f7c5529e9 fix(remotecontrol): Pin the controlled participant only on remote control permissions granted 2017-01-23 15:29:25 -06:00
hristoterezov
0453346cf4 ref(remotecontrol): Pass the largeVideoWrapper as parameter to remote control module 2017-01-23 15:29:25 -06:00
hristoterezov
15090243d0 fix(API): JS errors caused by remote control merge 2017-01-23 15:29:25 -06:00
hristoterezov
b22e3ee253 style(remotecontrol): Fix JSDoc for RemoteControlEvent 2017-01-23 15:29:25 -06:00
hristoterezov
e693554961 fix(remotecontrol): Logging 2017-01-23 15:29:25 -06:00
hristoterezov
0efca9a9a8 fix(remotecontrol): Fixing issues after peer review. 2017-01-23 15:29:25 -06:00
hristoterezov
5d22061c0a fix(remotecontrol): Handle on-stage participant changes 2017-01-23 15:29:25 -06:00
hristoterezov
84be7fd739 fix(remotecontrol): import of remote control 2017-01-23 15:29:25 -06:00
hristoterezov
5d269ad0aa fix(remotecontrol): Disable the keyboard shortcuts during remote control 2017-01-23 15:29:25 -06:00
hristoterezov
a4d5c41b3a feat(remotecontrol): UI for requesting permissions 2017-01-23 15:29:25 -06:00
hristoterezov
846fb9abb0 feat(remotecontrol): Implement requesting remote control permissions 2017-01-23 15:29:25 -06:00
hristoterezov
0f33e59e4d feat(remotecontrol): announce remotecontrol support 2017-01-23 15:29:25 -06:00
hristoterezov
896650d005 feat(remotecontrol): Implement basic remote control support 2017-01-23 15:29:25 -06:00
Saúl Ibarra Corretgé
6d6b5a7917 cleanup: Remove default Chrome extension ID
It makes for a bad first-time experience for users, since the desktop sharing
button will be visible, but it will never work.

Also get rid of the now deprecated `desktopSharingChromeMethod` option.
2017-01-23 15:21:28 -06:00
Любомир Маринов
db5010be9d Merge pull request #1261 from jitsi/clean-css-module-update
Stick to clean-css version 3.x.
2017-01-23 15:18:18 -06:00
damencho
be8860080c Fixes build.
Starting version 4.x clean-css is split into two packages and we should depend on clean-css-cli for versions 4 and above. Tested it and we have currently some problem with it like fonts and images got referenced under css folder. So sticking version to 3.x for now.
2017-01-23 14:35:26 -06:00
Lyubomir Marinov
42f124b0f6 Fix typo 2017-01-23 13:01:12 -06:00
Lyubomir Marinov
7249ababb7 Provide microphone and camera usage descriptions
iTunes Connect/TestFlight requires these now and is not satisfied with
empty values anymore.
2017-01-23 12:11:48 -06:00
Lyubomir Marinov
079be92468 Revert "[RN][iOS] Make universal builds"
This reverts commit b96ca538e4. While iPad
support is nice to have, we are not ready for a publish in App Store.
During the upload to iTunes Connect, a verification of the .ipa fails
because:

- app icons for iPad are missing:
  - 76x76 pixels in .png format for iOS versions >= 7.0,
  - 167x167 pixels in .png format for iOS versions supporting iPad Pro,
  - 152x152 pixels in .png format for iOS versions >= 7.0,
- orientations required for iPad Mutitasking are missing:
  - UIInterfaceOrientationPortraitUpsideDown.
2017-01-23 11:26:15 -06:00
Lyubomir Marinov
dda2a2feba Automatic Xcode project file fixes 2017-01-22 16:02:57 -06:00
Lyubomir Marinov
ae726cfdc0 react-native 0.40.0 2017-01-22 12:32:08 -06:00
Saúl Ibarra Corretgé
1a04e5a9af [RN] Use a translucent status bar on Android 2017-01-21 15:42:13 -06:00
Lyubomir Marinov
cac68dbaba [RN] Increment short app version from 1.1 to 1.2
Now that Apple have approved build 1.1.185 for release in the App Store,
the short app version needs to be incremented; otherwise, no new builds
can be uploaded to TestFlight and, respectively, for release in the App
Store.
2017-01-20 15:01:01 -06:00
Lyubomir Marinov
3c04634609 Simplify
Simplify the source code (with the idea that source code which does not
exist does not have to be maintained).

Additionally, apply modifications to have the source code comply with the coding
style.

Overall, prepare saghul:audio-mode for merge into jitsi:master.
2017-01-20 14:06:15 -06:00
Saúl Ibarra Corretgé
6c12681b9c [RN][iOS] Default to speaker for video conferences 2017-01-20 14:06:15 -06:00
Saúl Ibarra Corretgé
b1b5f3e6f0 Add CONFERENCE_WILL_JOIN action
It's fired before creating the conference with lib-jitsi-meet.
2017-01-20 14:06:15 -06:00
bbaldino
5baa167a08 Sdp overhaul (#1234)
* M1: device change now uses new flow.  fundamentally "works" but may be corner cases/side effects to other flows. haven't touched ffox yet

* M2: change toggle screenshare flows to use the new video replacement chain

* remove the old 'useVideoStream' and replace it with the new one

* use the new (and renamed back from the shim) 'dispose' method

* tweaks to work with the sdp overhaul changes in lib-jitsi-meet

* change the order in which we call dispose (to handle dispose being reverted back to how it is currently on master)

* move useAudioStream over to new flow

* restore useVideoStream doc

* handle rename JitsiConference::replaceStream -> JitsiConference::replaceTrack

* fix useAudioStream and useVideoStream to return a promise again
2017-01-19 12:46:10 -06:00
ibauersachs
343d17d19a Commit from translate.jitsi.org by user ibauersachs.: 99 of 298 strings translated (18 fuzzy). 2017-01-18 23:58:43 +00:00
ibauersachs
0370cc47fc Commit from translate.jitsi.org by user ibauersachs.: 140 of 298 strings translated (15 fuzzy). 2017-01-18 23:58:36 +00:00
ibauersachs
083fc955dc Commit from translate.jitsi.org by user ibauersachs.: 237 of 298 strings translated (17 fuzzy). 2017-01-18 23:58:30 +00:00
ibauersachs
a6e268f784 Commit from translate.jitsi.org by user ibauersachs.: 128 of 298 strings translated (14 fuzzy). 2017-01-18 23:58:23 +00:00
ibauersachs
7e0a9bc37c Commit from translate.jitsi.org by user ibauersachs.: 138 of 298 strings translated (14 fuzzy). 2017-01-18 23:58:16 +00:00
ibauersachs
f25bc818d7 Commit from translate.jitsi.org by user ibauersachs.: 298 of 298 strings translated (0 fuzzy). 2017-01-18 23:58:05 +00:00
ibauersachs
9beae22803 Commit from translate.jitsi.org by user ibauersachs.: 237 of 298 strings translated (17 fuzzy). 2017-01-18 23:57:58 +00:00
ibauersachs
920b0af269 Commit from translate.jitsi.org by user ibauersachs.: 298 of 298 strings translated (0 fuzzy). 2017-01-18 23:57:51 +00:00
ibauersachs
6c674bef2a Commit from translate.jitsi.org by user ibauersachs.: 129 of 298 strings translated (14 fuzzy). 2017-01-18 23:57:44 +00:00
ibauersachs
e74fbbb38b Commit from translate.jitsi.org by user ibauersachs.: 298 of 298 strings translated (0 fuzzy). 2017-01-18 23:57:29 +00:00
ibauersachs
fb3f916802 Commit from translate.jitsi.org by user ibauersachs.: 237 of 298 strings translated (17 fuzzy). 2017-01-18 23:57:21 +00:00
ibauersachs
c80d47d3dd Commit from translate.jitsi.org by user ibauersachs.: 192 of 298 strings translated (21 fuzzy). 2017-01-18 23:57:14 +00:00
ibauersachs
693ee1dcf8 Commit from translate.jitsi.org by user ibauersachs.: 237 of 298 strings translated (17 fuzzy). 2017-01-18 23:57:06 +00:00
Дамян Минков
640c0faff1 Merge pull request #1253 from jitsi/api_participant_count
Iframe API - participant count
2017-01-18 14:52:59 -06:00
hristoterezov
207ac47aa7 fix(iframe_api): s/getNumberOfParticipant/getNumberOfParticipants 2017-01-18 14:24:41 -06:00
hristoterezov
8844f83a59 feat(iframe_api): Add api.html to doc for example and testing purpose 2017-01-18 14:24:40 -06:00
hristoterezov
4a5a1cd5f4 fix(iframe_api): Remove enable/disable events 2017-01-18 14:24:21 -06:00
hristoterezov
09d63d38ab fix(iframe_api): prevents multiple execution of listeners per event 2017-01-18 13:24:30 -06:00
hristoterezov
6bf0f9b2ec feat(iframe_api): get number of participants 2017-01-18 13:20:32 -06:00
Lyubomir Marinov
f6fdd3ce70 Don't show watermarks in film strip-only mode even for guests 2017-01-17 21:54:17 -06:00
Lyubomir Marinov
d1f6679f2d [RN] Remove Crashlytics 2017-01-17 21:54:17 -06:00
Lyubomir Marinov
b8a6eb4768 Fix the checkbox to disable the Welcome page
Recently, we reimplemented the Welcome page in React. Unfortunately, we
broke the checkbox that enables/disables the Welcome page and it would
allow checking but wouldn't allow unchecking.
2017-01-17 16:20:43 -06:00
Lyubomir Marinov
6efad1348a Fix the display of watermarks in film strip-only mode
Recently, we reimplemented the watermarks in React. Unfortunately, we
didn't take into account film strip-only mode.

Additionally, we duplicated watermark-related source code on the Welcome
and Conference pages.
2017-01-17 16:20:13 -06:00
Lyubomir Marinov
eaed9db1e7 Name folders consistently 2017-01-17 08:53:23 -06:00
Lyubomir Marinov
4f8b7a934c Comply w/ coding style 2017-01-17 08:32:20 -06:00
Lyubomir Marinov
71c04936af Merge branch 'actions-rename' of https://github.com/saghul/jitsi-meet into saghul-actions-rename 2017-01-17 08:18:52 -06:00
Любомир Маринов
41da758946 Merge pull request #1242 from saghul/ipad
Enable universal builds
2017-01-16 19:56:29 -06:00
Saúl Ibarra Corretgé
acbfe5cb09 [RN] Keep device screen on while in a conference 2017-01-16 19:12:43 -06:00
Lyubomir Marinov
ba3d65c01f Fix d17cc9fa
A bug was discovered in d17cc9fa which would raise a failure to push
into the browser's history if a base href was defined. Fix the failure
by removing react-router. Anyway, the usage of react-router was
incorrect because the app must hit the server infrastructure when it
enters a room because the server will choose the very app version then.
2017-01-15 18:28:02 -06:00
Lyubomir Marinov
856732abab Preserve URLs 2017-01-15 17:46:34 -06:00
Lyubomir Marinov
5f21e4c5b6 Introduce Platform in React
React Native provides Platform.
2017-01-15 12:09:52 -06:00
Lyubomir Marinov
28b44cf67c Consistency 2017-01-15 12:09:02 -06:00
Дамян Минков
674b0e706c Merge pull request #1241 from jitsi/iframe_api_avatars
feat(iframeAPI): implement avatar change commands
2017-01-12 17:08:13 -06:00
Saúl Ibarra Corretgé
b96ca538e4 [RN][iOS] Make universal builds 2017-01-12 16:24:01 -06:00
Saúl Ibarra Corretgé
3266ace916 [RN][iOS] Set deployment target to 9.0
According to Apple iOS devices with versions < 9.0 are 6%.
https://developer.apple.com/support/app-store/
2017-01-12 16:20:03 -06:00
hristoterezov
f7ce8d028d feat(iframeAPI): implement avatar change commands 2017-01-12 15:53:17 -06:00
Дамян Минков
85e5b0fc31 Merge pull request #1240 from jitsi/ilmstriponly_ui
fix(filmstrip_only): Remove unrelated UI elements
2017-01-12 15:24:32 -06:00
hristoterezov
61f4b52a15 fix(filmstrip_only): Remove unrelated UI elements 2017-01-12 14:51:53 -06:00
Lyubomir Marinov
d17cc9fa86 Merge branch 'BeatC-BeatC-moving-conference-init-to-react-1' 2017-01-12 12:24:25 -06:00
Lyubomir Marinov
1f995cffe9 eslint 3.13.1, react 15.4.1, react-redux 5.0.2 2017-01-12 11:01:12 -06:00
Lyubomir Marinov
0936d54114 Merge branch 'master' into BeatC-BeatC-moving-conference-init-to-react-1 2017-01-12 10:37:36 -06:00
Lyubomir Marinov
0912dbf130 Remove duplication, simplify, comply with coding style 2017-01-12 10:37:01 -06:00
Дамян Минков
7dd566a591 Merge pull request #1238 from jitsi/filmstriponly_jserrors
fix(filmstrip_only): JS errors
2017-01-11 19:18:51 -06:00
hristoterezov
0f9bc766db fix(filmstrip_only): JS errors 2017-01-11 17:16:43 -06:00
Saúl Ibarra Corretgé
e71e6c5b79 Name Redux actions consistently
Redux actions which represent "commands" should be imperative, and those
representing events should use the past tense.
2017-01-11 13:11:11 -06:00
Lyubomir Marinov
4d5f82633b Merge branch 'master' into BeatC-BeatC-moving-conference-init-to-react-1 2017-01-10 13:07:19 -06:00
Lyubomir Marinov
2f01746c55 Remove duplication, simplify, comply with coding style 2017-01-10 13:06:18 -06:00
yanas
7ec5b34548 Merge pull request #1232 from jitsi/fix-adjust-layout
Fixes and adjustments of UI layout
2017-01-10 11:20:34 -06:00
yanas
1604fa6584 Fixes and adjustments of UI layout 2017-01-09 15:32:25 -06:00
Lyubomir Marinov
b67994235e Merge branch 'BeatC-moving-conference-init-to-react-1' of https://github.com/BeatC/jitsi-meet into BeatC-BeatC-moving-conference-init-to-react-1 2017-01-09 07:44:02 -06:00
Lyubomir Marinov
ee1358fae3 Merge branch 'saghul-no-welcome-autofocus' 2017-01-06 13:19:33 -06:00
Lyubomir Marinov
9fae5aa02f Merge branch 'no-welcome-autofocus' of https://github.com/saghul/jitsi-meet into saghul-no-welcome-autofocus 2017-01-06 13:19:12 -06:00
Lyubomir Marinov
a887beed3a [RN] Increment short app version from 1.0 to 1.1
Now that Apple have approved build 1.0.178 for release in the App Store,
the short app version needs to be incremented; otherwise, no new builds
can be uploaded to TestFlight and, respectively, for release in the App
Store.
2017-01-06 10:34:46 -06:00
Saúl Ibarra Corretgé
8a30d44042 [RN] Disable autofocus on the welcome screen
This prevents the keyboard from showing up right when the app opens.
2017-01-06 16:08:01 +01:00
Lyubomir Marinov
4fef8a3b79 [RN] Prevent unhandled JS errors from killing the process in Release 2017-01-05 15:06:41 -06:00
Ilya Daynatovich
ad9bdf4dd2 Fix url params stripping 2017-01-04 19:01:25 +02:00
hristoterezov
29001c3ab0 Merge pull request #1228 from jitsi/fix-menu-icon
Fix(RemoteVideo): Fixes remote video menu icon
2017-01-04 10:18:41 -06:00
yanas
a5387b054a Fix(RemoteVideo): Fixes remote video menu icon 2017-01-04 10:14:53 -06:00
Ilya Daynatovich
c2757469a5 Merge branch 'master' into BeatC-moving-conference-init-to-react-1 2017-01-04 17:53:13 +02:00
Ilya Daynatovich
ed1aa700d0 remove asterisk symbol from jsdoc 2017-01-04 17:47:27 +02:00
Ilya Daynatovich
58b5e1748f editions after rebase 2017-01-04 17:47:27 +02:00
Ilya Daynatovich
a99bbe67ab Clean up Conference component 2017-01-04 17:47:27 +02:00
Ilya Daynatovich
f53fb3d814 Introduced new actions and functions for app initialization 2017-01-04 17:46:47 +02:00
Ilya Daynatovich
e716c1738c Fix lint errs 2017-01-04 17:46:47 +02:00
Ilya Daynatovich
3190bfa058 Move redundant code from app.js 2017-01-04 17:45:52 +02:00
Ilya Daynatovich
c570b80d7b moved app initialization to react app 2017-01-04 17:45:52 +02:00
yanas
2f9887245a Merge pull request #1226 from jitsi/guests-watermark
Adds an option to show watermark only for guests.
2017-01-04 09:43:25 -06:00
damencho
6006333ccf Adds an option to show watermark only for guests. 2017-01-03 17:30:57 -06:00
Lyubomir Marinov
fd6c91715f Merge branch 'fix-mobile-toolbar-initial-timeout' 2017-01-03 15:27:22 -06:00
Lyubomir Marinov
a40b6a9df8 Merge branch 'master' into fix-mobile-toolbar-initial-timeout 2017-01-03 15:12:53 -06:00
yanas
d67b7c7f49 Fix(React/conference): Fix jsdocs 2017-01-03 15:09:52 -06:00
yanas
616ab0f635 Fix(mobile/conference): Move the initial call to the componentDidMount method 2017-01-03 15:06:47 -06:00
yanas
930e65da66 Fix(React/conference): Sets an initial toolbar view timeout 2017-01-03 14:53:52 -06:00
yanas
414a978b10 Merge pull request #1224 from jitsi/fix-close-page-redirect
Removes guest parameter when navigating to close page.
2017-01-03 14:37:54 -06:00
damencho
4ebefb17e9 Removes guest parameter when navigating to close page.
Using sessionStorage to save whether user is guest or not.
2017-01-03 14:15:32 -06:00
Дамян Минков
c46772015b Merge pull request #1217 from BeatC/fix-watermarks
Fixes issue with watermarks and interface configs.
2016-12-30 16:34:39 -06:00
Дамян Минков
677eef12dd Updates use of showJitsiWatermark. 2016-12-30 12:07:54 -06:00
hristoterezov
cd03b29ece Merge pull request #1219 from jitsi/guest-hint
Adds an option for guest only hint
2016-12-30 11:41:23 -06:00
damencho
63aa60f2d6 Adds an option for a hint message shown only to guests. 2016-12-30 10:59:21 -06:00
damencho
282defc54c Pass parameter to close page about current participant is it guest. 2016-12-30 10:58:21 -06:00
damencho
593de63d49 Adds utils to the close page and an id to the hint question div. 2016-12-30 10:19:58 -06:00
Ilya Daynatovich
5bb53ba036 Fix issue with watermarks 2016-12-30 13:34:03 +02:00
damencho
3c369a4c67 Fixes missing ssi for logging_config.js when meet served from jetty. 2016-12-29 11:18:39 -06:00
damencho
83aeb99b95 Commit from translate.jitsi.org by user damencho.: 202 of 298 strings translated (21 fuzzy). 2016-12-27 19:49:38 +00:00
ibauersachs
188d53ef94 Commit from translate.jitsi.org by user ibauersachs.: 298 of 298 strings translated (0 fuzzy). 2016-12-24 10:48:32 +00:00
ibauersachs
961cf7edbb Commit from translate.jitsi.org by user ibauersachs.: 298 of 298 strings translated (0 fuzzy). 2016-12-23 13:16:05 +00:00
damencho
2c5a5816c4 Adds some accessibilityLabels that can be used for testing. 2016-12-22 17:28:57 -06:00
yanas
96a6f2dfd6 Merge pull request #1212 from jitsi/react-native-ui-modifications-more
React native ui modifications
2016-12-22 14:41:43 -06:00
Дамян Минков
35be17cfc9 Merge pull request #1208 from jitsi/caps
Remove strophe-caps dependancy
2016-12-22 11:13:08 -05:00
yanas
8d90a7d091 Fix(react): Fixes black border on text input in welcome page 2016-12-21 18:09:30 -06:00
yanas
4a71c2655a Fix(react): Make in call buttons appear by default 2016-12-21 18:07:32 -06:00
yanas
043fd6e259 Fix(React): Modifies thumbnail icon positions and layout 2016-12-21 16:32:56 -06:00
yanas
7722e14117 Adjusts the size of secondary toolbar button 2016-12-21 15:00:24 -06:00
yanas
5e377d3694 Fix underlining on welcom text input on android 2016-12-21 15:00:24 -06:00
yanas
f512583973 fix(react-toolbars): Adjusts some styles and icons in mobile toolbars 2016-12-21 15:00:24 -06:00
yanas
5fce7f6ba2 Updates the react native font. 2016-12-21 15:00:24 -06:00
yanas
dfe1666530 feat(fonts): Adds a new icon to the font 2016-12-21 15:00:24 -06:00
hristoterezov
41f0069a22 fix(caps): remove strophe-caps dependancy 2016-12-19 14:58:18 -06:00
Lyubomir Marinov
9f332ffcec [iOS] Synthesize IPv6 addresses 2016-12-17 04:03:10 -06:00
Lyubomir Marinov
891bd7f346 react-redux 5.0.1, babel-loader 6.2.10, eslint 3.12.2, eslint-plugin-react-native 2.2.1 2016-12-15 21:01:44 -06:00
Lyubomir Marinov
4810249301 Simplify. Comply w/ coding style. 2016-12-15 21:00:06 -06:00
Ilya Daynatovich
984a6519fc Move welcome page logic from jquery to react 2016-12-15 07:55:43 -06:00
Ilya Daynatovich
986f13ef1a Made editions in PR 2016-12-15 07:54:17 -06:00
Ilya Daynatovich
83dd56d34c Move roomname generator to React 2016-12-14 23:59:02 -06:00
Paweł Domas
b646e8d213 Merge pull request #1197 from jitsi/reload_on_error
Reload when resource fails to load
2016-12-13 19:32:55 -06:00
yanas
2785e76e23 fix(index.html): minor variable optimisation 2016-12-13 18:43:45 -06:00
yanas
c5cacd7955 fix(index.html): UI adjustments 2016-12-13 18:19:49 -06:00
paweldomas
62532b5879 feat(index.html): add safeguards to the reload delay value
If the page reload value is not within specific range it will be
adjusted to a default of 10 seconds.
2016-12-13 13:57:11 -06:00
paweldomas
7e22f9c57b feat(index.html): hide the missing filename by default 2016-12-13 13:53:28 -06:00
paweldomas
d9017b2665 feat(index.html): update "failed to load the page" msg
Also adds a link to reload manually.
2016-12-13 07:33:27 -06:00
Lyubomir Marinov
4571a4c048 Simplify Redux reducer source code 2016-12-13 03:15:32 -06:00
Lyubomir Marinov
80685395ed [RN] Room lock 2016-12-13 03:15:32 -06:00
Lyubomir Marinov
38b9819b68 Fix/remove Redux state mutation 2016-12-13 03:15:32 -06:00
paweldomas
a4dcf5f8df feat(index.html): reload when resource fails to load
The page will be reloaded if any of the mandatory scripts/resources
fails to load. The reload will be delayed with exponential backoff
starting from 2 seconds. The retry attempt counter is passed as
'rCounter' query attribute.
2016-12-12 15:53:07 -06:00
Lyubomir Marinov
9a49a01713 [RN] Room lock button 2016-12-12 13:49:45 -06:00
hristoterezov
8c3fb54d3d Merge pull request #1194 from bgrozev/disable-suspend-video
config: Disable suspend video by default.
2016-12-12 13:07:00 -06:00
Boris Grozev
7707e384c5 config: Disable suspend video by default. 2016-12-12 10:37:36 -06:00
Lyubomir Marinov
a09b8ce56e React Native 0.39.2 2016-12-11 22:21:51 -06:00
Lyubomir Marinov
7ecafb1e69 [RN] Join password-protected rooms 2016-12-11 22:21:51 -06:00
Lyubomir Marinov
9f93ce86be [RN] Simplify the source code 2016-12-11 22:21:51 -06:00
Lyubomir Marinov
a5773f1d0b [RN] Links to Send feedback and Privacy (policy) 2016-12-11 22:21:51 -06:00
Lyubomir Marinov
d72813340e Fix the (visual) style of toggle camera facing mode 2016-12-11 22:21:51 -06:00
Lyubomir Marinov
daf56455a5 Use Symbol for Redux action types to prevent conflicts 2016-12-11 22:21:51 -06:00
Дамян Минков
f58d7fc3cc Adds download links to readme. 2016-12-09 17:45:02 -06:00
242 changed files with 11157 additions and 4684 deletions

View File

@@ -3,6 +3,7 @@ build/*
# Third-party source code which we (1) do not want to modify or (2) try to
# modify as little as possible.
flow-typed/*
libs/*
# ESLint will by default ignore its own configuration file. However, there does

View File

@@ -4,7 +4,10 @@ module.exports = {
'commonjs': true,
'es6': true
},
'extends': 'eslint:recommended',
'extends': [
'eslint:recommended',
'plugin:flowtype/recommended'
],
'globals': {
// The globals that (1) are accessed but not defined within many of our
// files, (2) are certainly defined, and (3) we would like to use
@@ -12,12 +15,16 @@ module.exports = {
// files.
'__filename': false
},
'parser': 'babel-eslint',
'parserOptions': {
'ecmaFeatures': {
'experimentalObjectRestSpread': true
},
'sourceType': 'module'
},
'plugins': [
'flowtype'
],
'rules': {
'new-cap': [
'error',

50
.flowconfig Normal file
View File

@@ -0,0 +1,50 @@
[ignore]
; We fork some components by platform
.*/*[.]android.js
; Ignore "BUCK" generated dirs
<PROJECT_ROOT>/\.buckd/
; Ignore unexpected extra "@providesModule"
.*/node_modules/.*/node_modules/fbjs/.*
; Ignore duplicate module providers
; For RN Apps installed via npm, "Libraries" folder is inside
; "node_modules/react-native" but in the source repo it is in the root
.*/Libraries/react-native/React.js
.*/Libraries/react-native/ReactNative.js
; Ignore packages in node_modules which we (i.e. the jitsi-meet project) have
; seen to cause errors and we have chosen not to fix.
.*/node_modules/babel-core/.*
.*/node_modules/bower/.*
.*/node_modules/jsonlint/.*
[include]
[libs]
node_modules/react-native/Libraries/react-native/react-native-interface.js
node_modules/react-native/flow
flow/
[options]
module.system=haste
experimental.strict_type_args=true
munge_underscores=true
module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
suppress_type=$FlowIssue
suppress_type=$FlowFixMe
suppress_type=$FixMe
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(3[0-7]\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(3[0-7]\\|1[0-9]\\|[1-2][0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
unsafe.enable_getters_and_setters=true
[version]
^0.37.0

1
.gitattributes vendored
View File

@@ -1,2 +1,3 @@
*.bundle.js -text -diff
*.pbxproj -text
lib-jitsi-meet.js -text -diff

20
.gitignore vendored
View File

@@ -4,7 +4,6 @@ deploy-local.sh
libs/
all.css
*css.map
unsupported_browser.css
.remote-sync.json
.sync-config.cson
@@ -36,21 +35,34 @@ DerivedData
*.xcuserstate
project.xcworkspace
# Android/IJ
# Android/IntelliJ
#
*.iml
build/
.idea
.gradle
local.properties
*.iml
# node.js
#
node_modules/
npm-debug.log
yarn-error.log
# BUCK
#
buck-out/
\.buckd/
android/app/libs
android/keystores/debug.keystore
*.keystore
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use
# fastlane to re-generate the screenshots whenever they are needed. For more
# information about the recommended setup visit:
# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
#
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots

View File

@@ -1,7 +1,12 @@
# The following do not need to be checked because they do not represent JS
# source code.
build/
debian/
libs/
node_modules/
# The following are checked by ESLint which supersedes JSHint.
flow-typed/
react/
analytics.js
webpack.config.babel.js

4
ConferenceEvents.js Normal file
View File

@@ -0,0 +1,4 @@
/**
* Notifies interested parties that hangup procedure will start.
*/
export const BEFORE_HANGUP = "conference.before_hangup";

View File

@@ -8,7 +8,6 @@ OUTPUT_DIR = .
STYLES_BUNDLE = css/all.bundle.css
STYLES_DESTINATION = css/all.css
STYLES_MAIN = css/main.scss
STYLES_UNSUPPORTED_BROWSER = css/unsupported_browser.scss
WEBPACK = ./node_modules/.bin/webpack
all: update-deps compile deploy clean
@@ -47,7 +46,6 @@ deploy-lib-jitsi-meet:
$(DEPLOY_DIR)
deploy-css:
$(NODE_SASS) css/unsupported_browser.scss css/unsupported_browser.css ; \
$(NODE_SASS) $(STYLES_MAIN) $(STYLES_BUNDLE) && \
$(CLEANCSS) $(STYLES_BUNDLE) > $(STYLES_DESTINATION) ; \
rm $(STYLES_BUNDLE)
@@ -59,6 +57,5 @@ source-package:
mkdir -p source_package/jitsi-meet/css && \
cp -r *.js *.html connection_optimization favicon.ico fonts images libs sounds LICENSE lang source_package/jitsi-meet && \
cp css/all.css source_package/jitsi-meet/css && \
cp css/unsupported_browser.css source_package/jitsi-meet/css && \
(cd source_package ; tar cjf ../jitsi-meet.tar.bz2 jitsi-meet) && \
rm -rf source_package

View File

@@ -1,5 +1,5 @@
Jitsi Meet - Secure, Simple and Scalable Video Conferences
====
# Jitsi Meet - Secure, Simple and Scalable Video Conferences
Jitsi Meet is an open-source (Apache) WebRTC JavaScript application that uses [Jitsi Videobridge](https://jitsi.org/videobridge) to provide high quality, scalable video conferences. You can see [Jitsi Meet in action](http://youtu.be/7vFUVClsNh0) here at the session #482 of the VoIP Users Conference.
You can also try it out yourself at https://meet.jit.si .
@@ -12,6 +12,13 @@ Installing Jitsi Meet is quite a simple experience. For Debian-based systems, we
For other systems, or if you wish to install all components manually, see the [detailed manual installation instructions](https://github.com/jitsi/jitsi-meet/blob/master/doc/manual-install.md).
## Download
You can download Debian/Ubuntu binaries:
* [stable](https://download.jitsi.org/stable/) ([instructions](https://jitsi.org/Main/InstallJitsiMeetDebianStableRepository))
* [testing](https://download.jitsi.org/testing/) ([instructions](https://jitsi.org/Main/InstallJitsiMeetDebianTestingRepository))
* [nightly](https://download.jitsi.org/unstable/) ([instructions](https://jitsi.org/Main/InstallJitsiMeetDebianNightlyRepository))
## Building the sources
Jitsi Meet uses [Browserify](http://browserify.org). If you want to make changes in the code you need to [install Browserify](http://browserify.org/#install). Browserify requires [nodejs](http://nodejs.org).
@@ -28,7 +35,7 @@ To build the Jitsi Meet application, just type
make
```
## Working with the library sources(lib-jitsi-meet).
## Working with the library sources (lib-jitsi-meet)
By default the library is build from its git repository sources. The default dependency path in package.json is :
```json
@@ -75,6 +82,14 @@ npm unlink lib-jitsi-meet
npm install
```
## Embedding in external applications
Jitsi Meet provides a very flexible way of embedding it in external applications by using the [Jitsi Meet API](doc/api.md).
## Mobile app
Jitsi Meet is also available as a React Native application for Android and iOS.
Instructions on how to build it can be found [here](doc/mobile.md).
## Discuss
Please use the [Jitsi dev mailing list](http://lists.jitsi.org/pipermail/dev/) to discuss feature requests before opening an issue on Github.

View File

@@ -1,15 +1,4 @@
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
}
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
import com.android.build.OutputFile
@@ -102,7 +91,7 @@ android {
minSdkVersion 16
targetSdkVersion 22
versionCode Integer.parseInt("${version}")
versionName "1.0.${version}"
versionName "1.2.${version}"
ndk {
abiFilters 'armeabi-v7a', 'x86'
}
@@ -149,18 +138,14 @@ if (project.hasProperty('JITSI_SIGNING')
apply from: project.property('JITSI_SIGNING');
}
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
compile project(':react-native-immersive')
compile project(':react-native-keep-awake')
compile project(':react-native-vector-icons')
compile project(':react-native-webrtc')
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.facebook.react:react-native:+'
compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
transitive = true
}
compile 'com.facebook.react:react-native:+' // From node_modules
}
apply from: '../../node_modules/react-native-vector-icons/fonts.gradle'
@@ -168,6 +153,6 @@ apply from: '../../node_modules/react-native-vector-icons/fonts.gradle'
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
from configurations.compile
into 'libs'
from configurations.compile
into 'libs'
}

View File

@@ -3,9 +3,12 @@
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- WebRTC -->
<!-- XXX: ACCESS_NETWORK_STATE is required by WebRTC. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
@@ -13,8 +16,8 @@
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="22" />
android:minSdkVersion="19"
android:targetSdkVersion="23" />
<application
android:allowBackup="true"
@@ -35,16 +38,21 @@
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:host="beta.hipchat.me" android:scheme="https" />
<data android:host="beta.meet.jit.si" android:scheme="https" />
<data android:host="chaos.hipchat.me" android:scheme="https" />
<data android:host="enso.me" android:scheme="https" />
<data android:host="hipchat.me" android:scheme="https" />
<data android:host="meet.jit.si" android:scheme="https" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="org.jitsi.meet" />
</intent-filter>
</activity>
<activity
android:name="com.facebook.react.devsupport.DevSettingsActivity" />
<meta-data
android:name="io.fabric.ApiKey"
android:value="a8ae24a58302ba79da1d312138e941f6b86e3242" />
</application>
</manifest>

View File

@@ -1,11 +1,8 @@
package org.jitsi.meet;
import android.os.Bundle;
import com.crashlytics.android.Crashlytics;
import com.facebook.react.ReactActivity;
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
import io.fabric.sdk.android.Fabric;
public class MainActivity extends ReactActivity {
/**
@@ -46,11 +43,4 @@ public class MainActivity extends ReactActivity {
protected String getMainComponentName() {
return "App";
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fabric.with(this, new Crashlytics());
}
}

View File

@@ -1,39 +1,63 @@
package org.jitsi.meet;
import android.app.Application;
import android.util.Log;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.oblador.vectoricons.VectorIconsPackage;
import com.oney.WebRTCModule.WebRTCModulePackage;
import com.facebook.soloader.SoLoader;
import java.util.Arrays;
import java.util.List;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
/**
* {@inheritDoc}
*/
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
/**
* {@inheritDoc}
*/
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new com.corbt.keepawake.KCKeepAwakePackage(),
new com.facebook.react.shell.MainReactPackage(),
new com.oblador.vectoricons.VectorIconsPackage(),
new com.oney.WebRTCModule.WebRTCModulePackage(),
new com.rnimmersive.RNImmersivePackage(),
new org.jitsi.meet.audiomode.AudioModePackage()
);
}
};
/**
* {@inheritDoc}
*/
@Override
protected boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
/**
* {@inheritDoc}
*/
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new VectorIconsPackage(),
new WebRTCModulePackage()
);
}
};
public void onCreate() {
super.onCreate();
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
SoLoader.init(this, /* native exopackage */ false);
if (!getReactNativeHost()
.getReactInstanceManager()
.getDevSupportManager()
.getDevSupportEnabled()) {
// TODO Auto-generated method stub
}
}
}

View File

@@ -0,0 +1,322 @@
package org.jitsi.meet.audiomode;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import java.util.HashMap;
import java.util.Map;
/**
* Module implementing a simple API to select the appropriate audio device for a
* conference call.
*
* Audio calls should use <tt>AudioModeModule.AUDIO_CALL</tt>, which uses the
* builtin earpiece, wired headset or bluetooth headset. The builtin earpiece is
* the default audio device.
*
* Video calls should should use <tt>AudioModeModule.VIDEO_CALL</tt>, which uses
* the builtin speaker, earpiece, wired headset or bluetooth headset. The
* builtin speaker is the default audio device.
*
* Before a call has started and after it has ended the
* <tt>AudioModeModule.DEFAULT</tt> mode should be used.
*/
public class AudioModeModule extends ReactContextBaseJavaModule {
/**
* Constants representing the audio mode.
* - DEFAULT: Used before and after every call. It represents the default
* audio routing scheme.
* - AUDIO_CALL: Used for audio only calls. It will use the earpiece by
* default, unless a wired or Bluetooth headset is connected.
* - VIDEO_CALL: Used for video calls. It will use the speaker by default,
* unless a wired or Bluetooth headset is connected.
*/
private static final int DEFAULT = 0;
private static final int AUDIO_CALL = 1;
private static final int VIDEO_CALL = 2;
/**
*
*/
private static final String ACTION_HEADSET_PLUG
= (Build.VERSION.SDK_INT >= 21)
? AudioManager.ACTION_HEADSET_PLUG
: Intent.ACTION_HEADSET_PLUG;
/**
* React Native module name.
*/
private static final String MODULE_NAME = "AudioMode";
/**
* Tag used when logging messages.
*/
static final String TAG = MODULE_NAME;
/**
* {@link AudioManager} instance used to interact with the Android audio
* subsystem.
*/
private final AudioManager audioManager;
/**
* {@link BluetoothHeadsetMonitor} for detecting Bluetooth device changes in
* old (< M) Android versions.
*/
private BluetoothHeadsetMonitor bluetoothHeadsetMonitor;
/**
* {@link Handler} for running all operations on the main thread.
*/
private final Handler mainThreadHandler
= new Handler(Looper.getMainLooper());
/**
* {@link Runnable} for running update operation on the main thread.
*/
private final Runnable mainThreadRunner
= new Runnable() {
@Override
public void run() {
if (mode != -1) {
updateAudioRoute(mode);
}
}
};
/**
* Audio mode currently in use.
*/
private int mode = -1;
/**
* Initializes a new module instance. There shall be a single instance of
* this module throughout the lifetime of the application.
*
* @param reactContext the {@link ReactApplicationContext} where this module
* is created.
*/
public AudioModeModule(ReactApplicationContext reactContext) {
super(reactContext);
audioManager
= (AudioManager)
reactContext.getSystemService(Context.AUDIO_SERVICE);
// Setup runtime device change detection.
setupAudioRouteChangeDetection();
}
/**
* Gets a mapping with the constants this module is exporting.
*
* @return a {@link Map} mapping the constants to be exported with their
* values.
*/
@Override
public Map<String, Object> getConstants() {
Map<String, Object> constants = new HashMap<>();
constants.put("AUDIO_CALL", AUDIO_CALL);
constants.put("DEFAULT", DEFAULT);
constants.put("VIDEO_CALL", VIDEO_CALL);
return constants;
}
/**
* Gets the name for this module, to be used in the React Native bridge.
*
* @return a string with the module name.
*/
@Override
public String getName() {
return MODULE_NAME;
}
/**
* Helper method to trigger an audio route update when devices change. It
* makes sure the operation is performed on the main thread.
*/
void onAudioDeviceChange() {
mainThreadHandler.post(mainThreadRunner);
}
/**
* Helper method to set the output route to a Bluetooth device.
*
* @param enabled true if Bluetooth should use used, false otherwise.
*/
private void setBluetoothAudioRoute(boolean enabled) {
if (enabled) {
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
} else {
audioManager.setBluetoothScoOn(false);
audioManager.stopBluetoothSco();
}
}
/**
* Public method to set the current audio mode.
*
* @param mode the desired audio mode.
* @param promise a {@link Promise} which will be resolved if the audio mode
* could be updated successfully, and it will be rejected otherwise.
*/
@ReactMethod
public void setMode(final int mode, final Promise promise) {
if (mode != DEFAULT && mode != AUDIO_CALL && mode != VIDEO_CALL) {
promise.reject("setMode", "Invalid audio mode " + mode);
return;
}
Runnable r = new Runnable() {
@Override
public void run() {
if (updateAudioRoute(mode)) {
AudioModeModule.this.mode = mode;
promise.resolve(null);
} else {
promise.reject(
"setMode",
"Failed to set the requested audio mode");
}
}
};
mainThreadHandler.post(r);
}
/**
* Setup the audio route change detection mechanism. We use the
* {@link android.media.AudioDeviceCallback} API on Android >= 23 only.
*/
private void setupAudioRouteChangeDetection() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setupAudioRouteChangeDetectionM();
} else {
setupAudioRouteChangeDetectionPreM();
}
}
/**
* Audio route change detection mechanism for Android API >= 23.
*/
@TargetApi(Build.VERSION_CODES.M)
private void setupAudioRouteChangeDetectionM() {
android.media.AudioDeviceCallback audioDeviceCallback =
new android.media.AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(
AudioDeviceInfo[] addedDevices) {
Log.d(TAG, "Audio devices added");
onAudioDeviceChange();
}
@Override
public void onAudioDevicesRemoved(
AudioDeviceInfo[] removedDevices) {
Log.d(TAG, "Audio devices removed");
onAudioDeviceChange();
}
};
audioManager.registerAudioDeviceCallback(audioDeviceCallback, null);
}
/**
* Audio route change detection mechanism for Android API < 23.
*/
private void setupAudioRouteChangeDetectionPreM() {
Context context = getReactApplicationContext();
// Detect changes in wired headset connections.
IntentFilter wiredHeadSetFilter = new IntentFilter(ACTION_HEADSET_PLUG);
BroadcastReceiver wiredHeadsetReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Wired headset added / removed");
onAudioDeviceChange();
}
};
context.registerReceiver(wiredHeadsetReceiver, wiredHeadSetFilter);
// Detect Bluetooth device changes.
bluetoothHeadsetMonitor = new BluetoothHeadsetMonitor(this, context);
}
/**
* Updates the audio route for the given mode.
*
* @param mode the audio mode to be used when computing the audio route.
* @return true if the audio route was updated successfully, false
* otherwise.
*/
private boolean updateAudioRoute(int mode) {
Log.d(TAG, "Update audio route for mode: " + mode);
if (mode == DEFAULT) {
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.abandonAudioFocus(null);
audioManager.setSpeakerphoneOn(false);
audioManager.setMicrophoneMute(true);
setBluetoothAudioRoute(false);
return true;
}
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setMicrophoneMute(false);
if (audioManager.requestAudioFocus(
null,
AudioManager.STREAM_VOICE_CALL,
AudioManager.AUDIOFOCUS_GAIN)
== AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
Log.d(TAG, "Audio focus request failed");
return false;
}
boolean useSpeaker = (mode == VIDEO_CALL);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// On Android >= M we use the AudioDeviceCallback API, so turn on
// Bluetooth SCO from the start.
if (audioManager.isBluetoothScoAvailableOffCall()) {
audioManager.startBluetoothSco();
}
} else {
// On older Android versions we must set the Bluetooth route
// manually. Also disable the speaker in that case.
setBluetoothAudioRoute(
bluetoothHeadsetMonitor.isHeadsetAvailable());
if (bluetoothHeadsetMonitor.isHeadsetAvailable()) {
useSpeaker = false;
}
}
// XXX: isWiredHeadsetOn is not deprecated when used just for knowing if
// there is a wired headset connected, regardless of audio being routed
// to it.
audioManager.setSpeakerphoneOn(
useSpeaker
&& !(audioManager.isWiredHeadsetOn()
|| audioManager.isBluetoothScoOn()));
return true;
}
}

View File

@@ -0,0 +1,48 @@
package org.jitsi.meet.audiomode;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Implements {@link ReactPackage} for {@link AudioModeModule}.
*/
public class AudioModePackage implements ReactPackage {
/**
* {@inheritDoc}
*/
@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
/**
* {@inheritDoc}
*
* @return List of native modules to be exposed by React Native.
*/
@Override
public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new AudioModeModule(reactContext));
return modules;
}
/**
* {@inheritDoc}
*/
@Override
public List<ViewManager> createViewManagers(
ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}

View File

@@ -0,0 +1,189 @@
package org.jitsi.meet.audiomode;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
/**
* Helper class to detect and handle Bluetooth device changes. It monitors
* Bluetooth headsets being connected / disconnected and notifies the module
* about device changes when this occurs.
*/
public class BluetoothHeadsetMonitor {
/**
* {@link AudioModeModule} where this monitor reports.
*/
private final AudioModeModule audioModeModule;
/**
* The {@link Context} in which {@link #audioModeModule} executes.
*/
private final Context context;
/**
* Reference to a proxy object which allows us to query connected devices.
*/
private BluetoothHeadset headset;
/**
* Flag indicating if there are any Bluetooth headset devices currently
* available.
*/
private boolean headsetAvailable = false;
/**
* {@link Handler} for running all operations on the main thread.
*/
private final Handler mainThreadHandler
= new Handler(Looper.getMainLooper());
/**
* Helper for running Bluetooth operations on the main thread.
*/
private final Runnable updateDevicesRunnable
= new Runnable() {
@Override
public void run() {
headsetAvailable
= (headset != null)
&& !headset.getConnectedDevices().isEmpty();
audioModeModule.onAudioDeviceChange();
}
};
public BluetoothHeadsetMonitor(
AudioModeModule audioModeModule,
Context context) {
this.audioModeModule = audioModeModule;
this.context = context;
AudioManager audioManager
= (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (!audioManager.isBluetoothScoAvailableOffCall()) {
Log.w(AudioModeModule.TAG, "Bluetooth SCO is not available");
return;
}
if (getBluetoothHeadsetProfileProxy()) {
registerBluetoothReceiver();
// Initial detection.
updateDevices();
}
}
private boolean getBluetoothHeadsetProfileProxy() {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter == null) {
Log.w(AudioModeModule.TAG, "Device doesn't support Bluetooth");
return false;
}
// XXX: The profile listener listens for system services of the given
// type being available to the application. That is, if our Bluetooth
// adapter has the "headset" profile.
BluetoothProfile.ServiceListener listener
= new BluetoothProfile.ServiceListener() {
@Override
public void onServiceConnected(
int profile,
BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEADSET) {
headset = (BluetoothHeadset) proxy;
updateDevices();
}
}
@Override
public void onServiceDisconnected(int profile) {
// The logic is the same as the logic of onServiceConnected.
onServiceConnected(profile, /* proxy */ null);
}
};
return
adapter.getProfileProxy(
context,
listener,
BluetoothProfile.HEADSET);
}
/**
* Returns the current headset availability.
*
* @return true if there is a Bluetooth headset connected, false otherwise.
*/
public boolean isHeadsetAvailable() {
return headsetAvailable;
}
private void onBluetoothReceiverReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
// XXX: This action will be fired when a Bluetooth headset is
// connected or disconnected to the system. This is not related to
// audio routing.
int state = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, -99);
switch (state) {
case BluetoothHeadset.STATE_CONNECTED:
case BluetoothHeadset.STATE_DISCONNECTED:
Log.d(
AudioModeModule.TAG,
"BT headset connection state changed: " + state);
updateDevices();
break;
}
} else if (action.equals(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)) {
// XXX: This action will be fired when the connection established
// with a Bluetooth headset (called a SCO connection) changes state.
// When the SCO connection is active we route audio to it.
int state
= intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -99);
switch (state) {
case AudioManager.SCO_AUDIO_STATE_CONNECTED:
case AudioManager.SCO_AUDIO_STATE_DISCONNECTED:
Log.d(
AudioModeModule.TAG,
"BT SCO connection state changed: " + state);
updateDevices();
break;
}
}
}
private void registerBluetoothReceiver() {
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
onBluetoothReceiverReceive(context, intent);
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
filter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
context.registerReceiver(receiver, filter);
}
/**
* Detects if there are new devices connected / disconnected and fires the
* {@link AudioModeModule#onAudioDeviceChange()} callback.
*/
private void updateDevices() {
mainThreadHandler.post(updateDevicesRunnable);
}
}

View File

@@ -3,6 +3,7 @@
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>

View File

@@ -1,6 +1,10 @@
rootProject.name = 'jitsi-meet-react'
include ':app'
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-vector-icons'
project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android')
include ':react-native-webrtc'

257
app.js
View File

@@ -1,6 +1,4 @@
/* global $, config, getRoomName, loggingConfig, JitsiMeetJS */
/* application specific logic */
const logger = require("jitsi-meet-logger").getLogger(__filename);
import "babel-polyfill";
import "jquery";
@@ -8,7 +6,6 @@ import "jquery-contextmenu";
import "jquery-ui";
import "strophe";
import "strophe-disco";
import "strophe-caps";
import "jQuery-Impromptu";
import "autosize";
@@ -19,101 +16,13 @@ import 'aui-experimental-css';
window.toastr = require("toastr");
const Logger = require("jitsi-meet-logger");
const LogCollector = Logger.LogCollector;
import JitsiMeetLogStorage from "./modules/util/JitsiMeetLogStorage";
import URLProcessor from "./modules/config/URLProcessor";
import { generateRoomWithoutSeparator } from './modules/util/RoomnameGenerator';
import UI from "./modules/UI/UI";
import settings from "./modules/settings/Settings";
import conference from './conference';
import ConferenceUrl from './modules/URL/ConferenceUrl';
import API from './modules/API/API';
import UIEvents from './service/UI/UIEvents';
import getTokenData from "./modules/tokendata/TokenData";
import translation from "./modules/translation/translation";
const ConferenceEvents = JitsiMeetJS.events.conference;
/**
* Tries to push history state with the following parameters:
* 'VideoChat', `Room: ${roomName}`, URL. If fail, prints the error and returns
* it.
*/
function pushHistoryState(roomName, URL) {
try {
window.history.pushState(
'VideoChat', `Room: ${roomName}`, URL
);
} catch (e) {
logger.warn("Push history state failed with parameters:",
'VideoChat', `Room: ${roomName}`, URL, e);
return e;
}
return null;
}
/**
* Replaces current history state(replaces the URL displayed by the browser).
* @param {string} newUrl the URL string which is to be displayed by the browser
* to the user.
*/
function replaceHistoryState (newUrl) {
if (window.history
&& typeof window.history.replaceState === 'function') {
window.history.replaceState({}, document.title, newUrl);
}
}
/**
* Builds and returns the room name.
*/
function buildRoomName () {
let roomName = getRoomName();
if(!roomName) {
let word = generateRoomWithoutSeparator();
roomName = word.toLowerCase();
let historyURL = window.location.href + word;
//Trying to push state with current URL + roomName
pushHistoryState(word, historyURL);
}
return roomName;
}
/**
* Adjusts the logging levels.
* @private
*/
function configureLoggingLevels () {
// NOTE The library Logger is separated from the app loggers, so the levels
// have to be set in two places
// Set default logging level
const defaultLogLevel
= loggingConfig.defaultLogLevel || JitsiMeetJS.logLevels.TRACE;
Logger.setLogLevel(defaultLogLevel);
JitsiMeetJS.setLogLevel(defaultLogLevel);
// NOTE console was used on purpose here to go around the logging
// and always print the default logging level to the console
console.info("Default logging level set to: " + defaultLogLevel);
// Set log level for each logger
if (loggingConfig) {
Object.keys(loggingConfig).forEach(function(loggerName) {
if ('defaultLogLevel' !== loggerName) {
const level = loggingConfig[loggerName];
Logger.setLogLevelById(level, loggerName);
JitsiMeetJS.setLogLevelById(level, loggerName);
}
});
}
}
import remoteControl from "./modules/remotecontrol/RemoteControl";
const APP = {
// Used by do_external_connect.js if we receive the attach data after
@@ -152,163 +61,15 @@ const APP = {
ConferenceUrl : null,
connection: null,
API,
init () {
this.initLogging();
this.keyboardshortcut =
require("./modules/keyboardshortcut/keyboardshortcut");
this.configFetch = require("./modules/config/HttpConfigFetch");
this.tokenData = getTokenData();
},
initLogging () {
// Adjust logging level
configureLoggingLevels();
// Create the LogCollector and register it as the global log transport.
// It is done early to capture as much logs as possible. Captured logs
// will be cached, before the JitsiMeetLogStorage gets ready (statistics
// module is initialized).
if (!this.logCollector && !loggingConfig.disableLogCollector) {
this.logCollector = new LogCollector(new JitsiMeetLogStorage());
Logger.addGlobalTransport(this.logCollector);
JitsiMeetJS.addGlobalLogTransport(this.logCollector);
}
}
remoteControl
};
/**
* If JWT token data it will be used for local user settings
*/
function setTokenData() {
let localUser = APP.tokenData.caller;
if(localUser) {
APP.settings.setEmail((localUser.getEmail() || "").trim(), true);
APP.settings.setAvatarUrl((localUser.getAvatarUrl() || "").trim());
APP.settings.setDisplayName((localUser.getName() || "").trim(), true);
}
}
function init() {
setTokenData();
// Initialize the conference URL handler
APP.ConferenceUrl = new ConferenceUrl(window.location);
// Clean up the URL displayed by the browser
replaceHistoryState(APP.ConferenceUrl.getInviteUrl());
// TODO The execution of the mobile app starts from react/index.native.js.
// Similarly, the execution of the Web app should start from
// react/index.web.js for the sake of consistency and ease of understanding.
// Temporarily though because we are at the beginning of introducing React
// into the Web app, allow the execution of the Web app to start from app.js
// in order to reduce the complexity of the beginning step.
require('./react');
const isUIReady = APP.UI.start();
if (isUIReady) {
APP.conference.init({roomName: buildRoomName()}).then(() => {
if (APP.logCollector) {
// Start the LogCollector's periodic "store logs" task only if
// we're in the conference and not on the welcome page. This is
// determined by the value of "isUIReady" const above.
APP.logCollector.start();
APP.logCollectorStarted = true;
// Make an attempt to flush in case a lot of logs have been
// cached, before the collector was started.
APP.logCollector.flush();
// This event listener will flush the logs, before
// the statistics module (CallStats) is stopped.
//
// NOTE The LogCollector is not stopped, because this event can
// be triggered multiple times during single conference
// (whenever statistics module is stopped). That includes
// the case when Jicofo terminates the single person left in the
// room. It will then restart the media session when someone
// eventually join the room which will start the stats again.
APP.conference.addConferenceListener(
ConferenceEvents.BEFORE_STATISTICS_DISPOSED,
() => {
if (APP.logCollector) {
APP.logCollector.flush();
}
}
);
}
APP.UI.initConference();
APP.UI.addListener(UIEvents.LANG_CHANGED, language => {
APP.translation.setLanguage(language);
APP.settings.setLanguage(language);
});
APP.keyboardshortcut.init();
}).catch(err => {
APP.UI.hideRingOverLay();
APP.API.notifyConferenceLeft(APP.conference.roomName);
logger.error(err);
});
}
}
/**
* If we have an HTTP endpoint for getting config.json configured we're going to
* read it and override properties from config.js and interfaceConfig.js.
* If there is no endpoint we'll just continue with initialization.
* Keep in mind that if the endpoint has been configured and we fail to obtain
* the config for any reason then the conference won't start and error message
* will be displayed to the user.
*/
function obtainConfigAndInit() {
let roomName = APP.conference.roomName;
if (config.configLocation) {
APP.configFetch.obtainConfig(
config.configLocation, roomName,
// Get config result callback
function(success, error) {
if (success) {
var now = APP.connectionTimes["configuration.fetched"] =
window.performance.now();
logger.log("(TIME) configuration fetched:\t", now);
init();
} else {
// Show obtain config error,
// pass the error object for report
APP.UI.messageHandler.openReportDialog(
null, "dialog.connectError", error);
}
});
} else {
require("./modules/config/BoshAddressChoice").chooseAddress(
config, roomName);
init();
}
}
$(document).ready(function () {
var now = APP.connectionTimes["document.ready"] = window.performance.now();
logger.log("(TIME) document ready:\t", now);
URLProcessor.setConfigParametersFromUrl();
APP.init();
APP.translation.init(settings.getLanguage());
APP.API.init(APP.tokenData.externalAPISettings);
obtainConfigAndInit();
});
$(window).bind('beforeunload', function () {
// Stop the LogCollector
if (APP.logCollectorStarted) {
APP.logCollector.stop();
APP.logCollectorStarted = false;
}
APP.API.dispose();
});
// TODO The execution of the mobile app starts from react/index.native.js.
// Similarly, the execution of the Web app should start from react/index.web.js
// for the sake of consistency and ease of understanding. Temporarily though
// because we are at the beginning of introducing React into the Web app, allow
// the execution of the Web app to start from app.js in order to reduce the
// complexity of the beginning step.
require('./react');
module.exports = APP;

View File

@@ -12,7 +12,7 @@
</div>
<div class="hint-msg">
<p>
<span>Did you know?</span>
<span id="hintQuestion">Did you know?</span>
<span class="hint-msg__holder" id="hintMessage"></span>
</p>
<div class="happy-software"></div>

View File

@@ -32,7 +32,7 @@ function insertTextMsg(id, msg){
var el = document.getElementById(id);
if (el)
el.innerText = msg;
el.innerHTML = msg;
}
/**
@@ -42,6 +42,17 @@ function onLoad() {
//Works only for close2.html because close.html doesn't have this element.
insertTextMsg('thanksMessage',
'Thank you for using ' + interfaceConfig.APP_NAME);
// If there is a setting show a special message only for the guests
if (interfaceConfig.CLOSE_PAGE_GUEST_HINT) {
if ( window.sessionStorage.getItem('guest') === 'true' ) {
var element = document.getElementById('hintQuestion');
element.classList.add('hide');
insertTextMsg('hintMessage', interfaceConfig.CLOSE_PAGE_GUEST_HINT);
return;
}
}
insertTextMsg('hintMessage', getHint());
}

View File

@@ -12,7 +12,7 @@
</div>
<div class="hint-msg">
<p>
<span>Did you know?</span>
<span id="hintQuestion">Did you know?</span>
<span class="hint-msg__holder" id="hintMessage"></span>
</p>
<div class="happy-software"></div>

View File

@@ -10,13 +10,16 @@ import Recorder from './modules/recorder/Recorder';
import mediaDeviceHelper from './modules/devices/mediaDeviceHelper';
import {reportError} from './modules/util/helpers';
import { reload, reportError } from './modules/util/helpers';
import UIEvents from './service/UI/UIEvents';
import UIUtil from './modules/UI/util/UIUtil';
import * as JitsiMeetConferenceEvents from './ConferenceEvents';
import analytics from './modules/analytics/analytics';
import EventEmitter from "events";
const ConnectionEvents = JitsiMeetJS.events.connection;
const ConnectionErrors = JitsiMeetJS.errors.connection;
@@ -28,6 +31,8 @@ const TrackErrors = JitsiMeetJS.errors.track;
const ConnectionQualityEvents = JitsiMeetJS.events.connectionQuality;
const eventEmitter = new EventEmitter();
let room, connection, localAudio, localVideo;
/**
@@ -195,10 +200,11 @@ function muteLocalVideo (muted) {
function maybeRedirectToWelcomePage(options) {
// if close page is enabled redirect to it, without further action
if (config.enableClosePage) {
if (options.feedbackSubmitted)
window.location.pathname = "close.html";
else
window.location.pathname = "close2.html";
// save whether current user is guest or not, before navigating
// to close page
window.sessionStorage.setItem('guest', APP.tokenData.isGuest);
assignWindowLocationPathname(
options.feedbackSubmitted ? "close.html" : "close2.html");
return;
}
@@ -211,11 +217,42 @@ function maybeRedirectToWelcomePage(options) {
if (config.enableWelcomePage) {
setTimeout(() => {
APP.settings.setWelcomePageEnabled(true);
window.location.pathname = "/";
assignWindowLocationPathname('./');
}, 3000);
}
}
/**
* Assigns a specific pathname to window.location.pathname taking into account
* the context root of the Web app.
*
* @param {string} pathname - The pathname to assign to
* window.location.pathname. If the specified pathname is relative, the context
* root of the Web app will be prepended to the specified pathname before
* assigning it to window.location.pathname.
* @return {void}
*/
function assignWindowLocationPathname(pathname) {
const windowLocation = window.location;
if (!pathname.startsWith('/')) {
// XXX To support a deployment in a sub-directory, assume that the room
// (name) is the last non-directory component of the path (name).
let contextRoot = windowLocation.pathname;
contextRoot
= contextRoot.substring(0, contextRoot.lastIndexOf('/') + 1);
// A pathname equal to ./ specifies the current directory. It will be
// fine but pointless to include it because contextRoot is the current
// directory.
pathname.startsWith('./') && (pathname = pathname.substring(2));
pathname = contextRoot + pathname;
}
windowLocation.pathname = pathname;
}
/**
* Create local tracks of specified types.
* @param {Object} options
@@ -260,22 +297,6 @@ function createLocalTracks (options, checkForPermissionPrompt) {
'failed to create local tracks', options.devices, err);
return Promise.reject(err);
});
}
/**
* Changes the email for the local user
* @param email {string} the new email
*/
function changeLocalEmail(email = '') {
email = email.trim();
if (email === APP.settings.getEmail()) {
return;
}
APP.settings.setEmail(email);
APP.UI.setUserEmail(room.myUserId(), email);
sendData(commands.EMAIL, email);
}
/**
@@ -331,7 +352,7 @@ class ConferenceConnector {
case ConferenceErrors.NOT_ALLOWED_ERROR:
{
// let's show some auth not allowed page
window.location.pathname = "authError.html";
assignWindowLocationPathname('authError.html');
}
break;
@@ -396,7 +417,7 @@ class ConferenceConnector {
APP.UI.notifyMaxUsersLimitReached();
break;
case ConferenceErrors.INCOMPATIBLE_SERVER_VERSIONS:
window.location.reload();
reload();
break;
default:
this._handleConferenceFailed(err, ...params);
@@ -498,13 +519,16 @@ export default {
}).then(([tracks, con]) => {
logger.log('initialized with %s local tracks', tracks.length);
APP.connection = connection = con;
this._bindConnectionFailedHandler(con);
this._createRoom(tracks);
this.isDesktopSharingEnabled =
JitsiMeetJS.isDesktopSharingEnabled();
APP.remoteControl.init();
this._bindConnectionFailedHandler(con);
this._createRoom(tracks);
if (UIUtil.isButtonEnabled('contacts'))
if (UIUtil.isButtonEnabled('contacts')
&& !interfaceConfig.filmStripOnly) {
APP.UI.ContactList = new ContactList(room);
}
// if user didn't give access to mic or camera or doesn't have
// them at all, we disable corresponding toolbar buttons
@@ -912,43 +936,40 @@ export default {
return options;
},
/**
* Start using provided video stream.
* Stops previous video stream.
* @param {JitsiLocalTrack} [stream] new stream to use or null
* @returns {Promise}
*/
useVideoStream (stream) {
let promise = Promise.resolve();
if (localVideo) {
// this calls room.removeTrack internally
// so we don't need to remove it manually
promise = localVideo.dispose();
}
localVideo = stream;
return promise.then(function () {
if (stream) {
return room.addTrack(stream);
}
}).then(() => {
if (stream) {
this.videoMuted = stream.isMuted();
this.isSharingScreen = stream.videoType === 'desktop';
/**
* Start using provided video stream.
* Stops previous video stream.
* @param {JitsiLocalTrack} [stream] new stream to use or null
* @returns {Promise}
*/
useVideoStream (newStream) {
return room.replaceTrack(localVideo, newStream)
.then(() => {
// We call dispose after doing the replace because
// dispose will try and do a new o/a after the
// track removes itself. Doing it after means
// the JitsiLocalTrack::conference member is already
// cleared, so it won't try and do the o/a
if (localVideo) {
localVideo.dispose();
}
localVideo = newStream;
if (newStream) {
this.videoMuted = newStream.isMuted();
this.isSharingScreen = newStream.videoType === 'desktop';
APP.UI.addLocalStream(stream);
APP.UI.addLocalStream(newStream);
stream.videoType === 'camera'
&& APP.UI.setCameraButtonEnabled(true);
} else {
this.videoMuted = false;
this.isSharingScreen = false;
}
APP.UI.setVideoMuted(this.getMyUserId(), this.videoMuted);
APP.UI.updateDesktopSharingButtons();
});
newStream.videoType === 'camera'
&& APP.UI.setCameraButtonEnabled(true);
} else {
this.videoMuted = false;
this.isSharingScreen = false;
}
APP.UI.setVideoMuted(this.getMyUserId(), this.videoMuted);
APP.UI.updateDesktopSharingButtons();
});
},
/**
@@ -957,31 +978,27 @@ export default {
* @param {JitsiLocalTrack} [stream] new stream to use or null
* @returns {Promise}
*/
useAudioStream (stream) {
let promise = Promise.resolve();
if (localAudio) {
// this calls room.removeTrack internally
// so we don't need to remove it manually
promise = localAudio.dispose();
}
localAudio = stream;
return promise.then(function () {
if (stream) {
return room.addTrack(stream);
}
}).then(() => {
if (stream) {
this.audioMuted = stream.isMuted();
APP.UI.addLocalStream(stream);
} else {
this.audioMuted = false;
}
APP.UI.setMicrophoneButtonEnabled(true);
APP.UI.setAudioMuted(this.getMyUserId(), this.audioMuted);
});
useAudioStream (newStream) {
return room.replaceTrack(localAudio, newStream)
.then(() => {
// We call dispose after doing the replace because
// dispose will try and do a new o/a after the
// track removes itself. Doing it after means
// the JitsiLocalTrack::conference member is already
// cleared, so it won't try and do the o/a
if (localAudio) {
localAudio.dispose();
}
localAudio = newStream;
if (newStream) {
this.audioMuted = newStream.isMuted();
APP.UI.addLocalStream(newStream);
} else {
this.audioMuted = false;
}
APP.UI.setMicrophoneButtonEnabled(true);
APP.UI.setAudioMuted(this.getMyUserId(), this.audioMuted);
});
},
videoSwitchInProgress: false,
@@ -999,7 +1016,7 @@ export default {
let externalInstallation = false;
if (shareScreen) {
createLocalTracks({
this.screenSharingPromise = createLocalTracks({
devices: ['desktop'],
desktopSharingExtensionExternalInstallation: {
interval: 500,
@@ -1088,7 +1105,10 @@ export default {
dialogTitleKey, dialogTxt, false);
});
} else {
createLocalTracks({ devices: ['video'] }).then(
APP.remoteControl.receiver.stop();
this.screenSharingPromise = createLocalTracks(
{ devices: ['video'] })
.then(
([stream]) => this.useVideoStream(stream)
).then(() => {
this.videoSwitchInProgress = false;
@@ -1120,6 +1140,8 @@ export default {
}
);
room.on(ConferenceEvents.PARTCIPANT_FEATURES_CHANGED,
user => APP.UI.onUserFeaturesChanged(user));
room.on(ConferenceEvents.USER_JOINED, (id, user) => {
if (user.isHidden())
return;
@@ -1255,6 +1277,57 @@ export default {
APP.API.notifyReceivedChatMessage(id, nick, text, ts);
APP.UI.addMessage(id, nick, text, ts);
});
APP.UI.addListener(UIEvents.MESSAGE_CREATED, (message) => {
APP.API.notifySendingChatMessage(message);
room.sendTextMessage(message);
});
APP.UI.addListener(UIEvents.SELECTED_ENDPOINT, (id) => {
try {
// do not try to select participant if there is none (we
// are alone in the room), otherwise an error will be
// thrown cause reporting mechanism is not available
// (datachannels currently)
if (room.getParticipants().length === 0)
return;
room.selectParticipant(id);
} catch (e) {
JitsiMeetJS.analytics.sendEvent(
'selectParticipant.failed');
reportError(e);
}
});
APP.UI.addListener(UIEvents.PINNED_ENDPOINT,
(smallVideo, isPinned) => {
let smallVideoId = smallVideo.getId();
let isLocal = APP.conference.isLocalId(smallVideoId);
let eventName
= (isPinned ? "pinned" : "unpinned") + "." +
(isLocal ? "local" : "remote");
let participantCount = room.getParticipantCount();
JitsiMeetJS.analytics.sendEvent(
eventName,
{ value: participantCount });
// FIXME why VIDEO_CONTAINER_TYPE instead of checking if
// the participant is on the large video ?
if (smallVideo.getVideoType() === VIDEO_CONTAINER_TYPE
&& !isLocal) {
// When the library starts supporting multiple pins we
// would pass the isPinned parameter together with the
// identifier, but currently we send null to indicate that
// we unpin the last pinned.
try {
room.pinParticipant(isPinned ? smallVideoId : null);
} catch (e) {
reportError(e);
}
}
});
}
room.on(ConferenceEvents.CONNECTION_INTERRUPTED, () => {
@@ -1304,11 +1377,13 @@ export default {
this.deviceChangeListener);
// stop local video
if (localVideo)
if (localVideo) {
localVideo.dispose();
}
// stop local audio
if (localAudio)
if (localAudio) {
localAudio.dispose();
}
// show overlay
APP.UI.showSuspendedOverlay();
@@ -1332,13 +1407,6 @@ export default {
APP.UI.addListener(UIEvents.AUDIO_MUTED, muteLocalAudio);
APP.UI.addListener(UIEvents.VIDEO_MUTED, muteLocalVideo);
if (!interfaceConfig.filmStripOnly) {
APP.UI.addListener(UIEvents.MESSAGE_CREATED, (message) => {
APP.API.notifySendingChatMessage(message);
room.sendTextMessage(message);
});
}
room.on(ConnectionQualityEvents.LOCAL_STATS_UPDATED,
(stats) => {
APP.UI.updateLocalStats(stats.connectionQuality, stats);
@@ -1354,7 +1422,7 @@ export default {
APP.UI.initEtherpad(value);
});
APP.UI.addListener(UIEvents.EMAIL_CHANGED, changeLocalEmail);
APP.UI.addListener(UIEvents.EMAIL_CHANGED, this.changeLocalEmail);
room.addCommandListener(this.commands.defaults.EMAIL, (data, from) => {
APP.UI.setUserEmail(from, data.value);
});
@@ -1406,7 +1474,7 @@ export default {
APP.UI.addListener(UIEvents.LOGOUT, () => {
AuthHandler.logout(room).then(url => {
if (url) {
window.location.href = url;
UIUtil.redirect(url);
} else {
this.hangup(true);
}
@@ -1461,50 +1529,6 @@ export default {
AuthHandler.authenticate(room);
});
APP.UI.addListener(UIEvents.SELECTED_ENDPOINT, (id) => {
try {
// do not try to select participant if there is none (we are
// alone in the room), otherwise an error will be thrown cause
// reporting mechanism is not available (datachannels currently)
if (room.getParticipants().length === 0)
return;
room.selectParticipant(id);
} catch (e) {
JitsiMeetJS.analytics.sendEvent('selectParticipant.failed');
reportError(e);
}
});
APP.UI.addListener(UIEvents.PINNED_ENDPOINT, (smallVideo, isPinned) => {
let smallVideoId = smallVideo.getId();
let isLocal = APP.conference.isLocalId(smallVideoId);
let eventName
= (isPinned ? "pinned" : "unpinned") + "." +
(isLocal ? "local" : "remote");
let participantCount = room.getParticipantCount();
JitsiMeetJS.analytics.sendEvent(
eventName,
{ value: participantCount });
// FIXME why VIDEO_CONTAINER_TYPE instead of checking if
// the participant is on the large video ?
if (smallVideo.getVideoType() === VIDEO_CONTAINER_TYPE
&& !isLocal) {
// When the library starts supporting multiple pins we would
// pass the isPinned parameter together with the identifier,
// but currently we send null to indicate that we unpin the
// last pinned.
try {
room.pinParticipant(isPinned ? smallVideoId : null);
} catch (e) {
reportError(e);
}
}
});
APP.UI.addListener(
UIEvents.VIDEO_DEVICE_CHANGED,
(cameraDeviceId) => {
@@ -1616,12 +1640,23 @@ export default {
},
/**
* Adds any room listener.
* @param eventName one of the ConferenceEvents
* @param callBack the function to be called when the event occurs
* @param {string} eventName one of the ConferenceEvents
* @param {Function} listener the function to be called when the event
* occurs
*/
addConferenceListener(eventName, callBack) {
room.on(eventName, callBack);
addConferenceListener(eventName, listener) {
room.on(eventName, listener);
},
/**
* Removes any room listener.
* @param {string} eventName one of the ConferenceEvents
* @param {Function} listener the listener to be removed.
*/
removeConferenceListener(eventName, listener) {
room.off(eventName, listener);
},
/**
* Inits list of current devices and event listener for device change.
* @private
@@ -1779,6 +1814,7 @@ export default {
* requested
*/
hangup (requestFeedback = false) {
eventEmitter.emit(JitsiMeetConferenceEvents.BEFORE_HANGUP);
APP.UI.hideRingOverLay();
let requestFeedbackPromise = requestFeedback
? APP.UI.requestFeedbackOnHangup()
@@ -1797,5 +1833,68 @@ export default {
APP.API.notifyReadyToClose();
maybeRedirectToWelcomePage(values[0]);
});
},
/**
* Changes the email for the local user
* @param email {string} the new email
*/
changeLocalEmail(email = '') {
email = email.trim();
if (email === APP.settings.getEmail()) {
return;
}
APP.settings.setEmail(email);
APP.UI.setUserEmail(room.myUserId(), email);
sendData(commands.EMAIL, email);
},
/**
* Changes the avatar url for the local user
* @param url {string} the new url
*/
changeLocalAvatarUrl(url = '') {
url = url.trim();
if (url === APP.settings.getAvatarUrl()) {
return;
}
APP.settings.setAvatarUrl(url);
APP.UI.setUserAvatarUrl(room.myUserId(), url);
sendData(commands.AVATAR_URL, url);
},
/**
* Sends a message via the data channel.
* @param {string} to the id of the endpoint that should receive the
* message. If "" - the message will be sent to all participants.
* @param {object} payload the payload of the message.
* @throws NetworkError or InvalidStateError or Error if the operation
* fails.
*/
sendEndpointMessage (to, payload) {
room.sendEndpointMessage(to, payload);
},
/**
* Adds new listener.
* @param {String} eventName the name of the event
* @param {Function} listener the listener.
*/
addListener (eventName, listener) {
eventEmitter.addListener(eventName, listener);
},
/**
* Removes listener.
* @param {String} eventName the name of the event that triggers the
* listener
* @param {Function} listener the listener.
*/
removeListener (eventName, listener) {
eventEmitter.removeListener(eventName, listener);
}
};

View File

@@ -20,10 +20,10 @@ var config = { // eslint-disable-line no-unused-vars
//focusUserJid: 'focus@auth.jitsi-meet.example.com', // The real JID of focus participant - can be overridden here
//defaultSipNumber: '', // Default SIP number
// Desktop sharing method. Can be set to 'ext', 'webrtc' or false to disable.
desktopSharingChromeMethod: 'ext',
// The ID of the jidesha extension for Chrome.
desktopSharingChromeExtId: 'diibjkoicjeejcmhdnailmkgecihlobk',
desktopSharingChromeExtId: null,
// Whether desktop sharing should be disabled on Chrome.
desktopSharingChromeDisabled: true,
// The media sources to use when using screen sharing with the Chrome
// extension.
desktopSharingChromeSources: ['screen', 'window', 'tab'],
@@ -76,5 +76,9 @@ var config = { // eslint-disable-line no-unused-vars
// If true - all users without token will be considered guests and all users
// with token will be considered non-guests. Only guests will be allowed to
// edit their profile.
enableUserRolesBasedOnToken: false
enableUserRolesBasedOnToken: false,
// Suspending video might cause problems with audio playback. Disabling until these are fixed.
disableSuspendVideo: true,
// disables or enables RTX (RFC 4588).
disableRtx: true
};

View File

@@ -84,7 +84,6 @@ form {
}
.leftwatermark {
display: none;
left: $defaultToolbarSize;
margin-left: 10px;
background-image: url($defaultWatermarkLink);
@@ -92,13 +91,11 @@ form {
}
.rightwatermark {
display: none;
right: 15;
background-position: center right;
}
.poweredby {
display: none;
position: absolute;
left: 25;
bottom: 7;
@@ -142,4 +139,4 @@ form {
#inviteLinkRef {
-webkit-user-select: text;
user-select: text;
}
}

View File

@@ -50,14 +50,17 @@
position:relative;
height:196px;
padding: 0;
padding-left: 17px;
/*The filmstrip should not be covered by the left toolbar*/
padding-left: $defaultToolbarSize + 5;
bottom: 0;
width:auto;
border: $thumbnailsBorder solid transparent;
z-index: 5;
transition: bottom 2s;
overflow: visible !important;
font-size: 0pt; /*!!!Removes the gap between the local video container and the remote videos.*/
/*!!!Removes the gap between the local video container and the remote
videos.*/
font-size: 0pt;
&.hidden {
bottom: -196px;
@@ -68,7 +71,7 @@
position: relative;
background-size: contain;
border: $thumbnailVideoBorder solid transparent;
border-radius:1px;
border-radius: $borderRadius;
margin: 0 $thumbnailVideoMargin;
&.videoContainerFocused, &:hover {
@@ -89,7 +92,7 @@
0 0 3px $videoThumbnailSelected !important;
}
.remotevideomenu {
.remotevideomenu > .icon-menu {
display: none;
}
@@ -102,7 +105,7 @@
box-shadow: inset 0 0 3px $videoThumbnailHovered,
0 0 3px $videoThumbnailHovered;
.remotevideomenu {
.remotevideomenu > .icon-menu {
display: inline-block;
}
}
@@ -112,10 +115,10 @@
& > video,
& > object {
cursor: hand;
border-radius:1px;
border-radius: $borderRadius;
object-fit: cover;
overflow: hidden;
}
}
}
}
}

View File

@@ -25,6 +25,9 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-mic-camera-combined:before {
content: "\e903";
}
.icon-feedback:before {
content: "\e91d";
}
@@ -34,15 +37,15 @@
.icon-avatar:before {
content: "\e901";
}
.icon-autorenew:before {
content: "\e903";
}
.icon-hangup:before {
content: "\e905";
}
.icon-chat:before {
content: "\e906";
}
.icon-download:before {
content: "\e902";
}
.icon-edit:before {
content: "\e907";
}
@@ -55,9 +58,6 @@
.icon-kick:before {
content: "\e904";
}
.icon-menu:before {
content: "\e91f";
}
.icon-menu-up:before {
content: "\e91f";
}
@@ -70,9 +70,6 @@
.icon-exit-full-screen:before {
content: "\e90c";
}
.icon-star:before {
content: "\e916";
}
.icon-star-full:before {
content: "\e90a";
}
@@ -109,6 +106,12 @@
.icon-settings:before {
content: "\e915";
}
.icon-star:before {
content: "\e916";
}
.icon-switch-camera:before {
content: "\e921";
}
.icon-share-desktop:before {
content: "\e917";
}
@@ -133,7 +136,6 @@
.icon-recEnable:before {
content: "\e614";
}
// FIXME not used anymore - consider removing in the next font update
.icon-presentation:before {
content: "\e603";
}
}

View File

@@ -1,6 +1,6 @@
.inlay {
margin-top: 14%;
@include border-radius(3px);
@include border-radius(4px);
padding: 40px 38px 44px;
color: #fff;
background: $inlayColorBg;

View File

@@ -10,7 +10,7 @@
color: $popoverFontColor;
background-color: $popoverBg;
background-clip: padding-box;
border-radius: 3px;
border-radius: $borderRadius;
/*-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);*/
/*box-shadow: 0 5px 10px rgba(0, 0, 0, 0.4);*/
white-space: normal;

View File

@@ -1,18 +1,18 @@
@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
/*!
* 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";
@@ -88,7 +88,7 @@
list-style-type: none;
background: #fff;
border: 1px solid #bebebe;
border-radius: 3px;
border-radius: $borderRadius;
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, .5);
box-shadow: 0 2px 5px rgba(0, 0, 0, .5);
}
@@ -156,8 +156,8 @@
transform: translateY(-50%);
}
/**
* Inputs
/**
* Inputs
*/
.context-menu-item.context-menu-input {
padding: 5px 10px;

View File

@@ -6,7 +6,6 @@
padding: 0;
margin: 2px 0;
bottom: 0;
width: 100px;
height: auto;
&:first-child {
@@ -66,4 +65,9 @@
span.remotevideomenu:hover ul.popupmenu, ul.popupmenu:hover {
display:block !important;
}
}
.remote-control-spinner {
top: 6px;
left: 2px;
}

View File

@@ -14,9 +14,9 @@ $defaultToolbarSize: 50px;
// Video layout.
$thumbnailToolbarHeight: 22px;
$thumbnailIndicatorBorder: 0;
$thumbnailIndicatorSize: 3em;
$thumbnailVideoMargin: 2px;
$thumbnailIndicatorBorder: 2px;
$thumbnailIndicatorSize: $thumbnailToolbarHeight;
$thumbnailVideoMargin: 5px;
$thumbnailsBorder: 2px;
$thumbnailVideoBorder: 2px;
$hideFilmstripButtonWidth: 17px;
@@ -43,14 +43,14 @@ $toolbarBadgeColor: #FFFFFF;
$toolbarToggleBackground: #12499C;
$splitterToolbarButtonMargin: 18px;
/*
/**
* Main controls
* TODO: looks like we don't use it
*/
$inputSemiBackground: rgba(132, 132, 132, .8);
$inputLightBackground: #EBEBEB;
/*
/**
* Video layout
*/
$videoThumbnailHovered: rgba(22, 94, 204, .4);
@@ -95,7 +95,7 @@ $notificationWidth: 215px;
/**
* Misc.
*/
$borderRadius: 3px;
$borderRadius: 4px;
$defaultWatermarkLink: '../images/watermark.png';
$sidebarWidth: 220px;
$popoverMenuPadding: 13px;
@@ -126,4 +126,11 @@ $defaultDarkFontColor: #000;
$inputControlEmColor: #f29424;
//buttons
$linkFontColor: #489afe;
$linkHoverFontColor: #287ade;
$linkHoverFontColor: #287ade;
/**
* Landing
*/
$primaryUnsupportedBrowserButtonBgColor: #17a0db;
$unsupportedBrowserButtonBgColor: #ff9a00;
$unsupportedBrowserTextColor: #4a4a4a;

View File

@@ -18,9 +18,10 @@
&__background {
@include topLeft();
background-color: black;
border-radius: $borderRadius;
width: 100%;
height: 100%;
background-color: black;
}
/**
@@ -106,11 +107,12 @@
}
&__hoverOverlay {
background: rgba(0,0,0,.6);
border-radius: $borderRadius;
position: relative;
width: 100%;
height: 100%;
visibility: hidden;
background: rgba(0,0,0,.6);
z-index: 2;
}
}
@@ -128,8 +130,8 @@
#localVideoWrapper>video,
#localVideoWrapper>object {
border-radius: $borderRadius !important;
cursor: hand;
border-radius:1px !important;
object-fit: cover;
}
@@ -211,6 +213,7 @@
.videocontainer .displayname {
pointer-events: none;
padding: 0 3px 0 3px;
}
.videocontainer .editdisplayname {
@@ -471,6 +474,7 @@
#localConnectionMessage {
display: none;
position: absolute;
left: 0;
width: 100%;
top:50%;
z-index: 2;

View File

@@ -50,7 +50,7 @@
float: left;
}
#domain_name
.domain-name
{
float: left;
height: 55px;
@@ -61,37 +61,51 @@
color: $defaultDarkColor;
}
#enter_room_field {
font-size: 15px;
border: none;
-webkit-appearance: none;
width: 228px;
height: 55px;
line-height: 55px;
font-weight: 500;
box-shadow: none;
float: left;
background-color: #FFFFFF;
position: relative;
z-index: 2;
}
.enter-room {
&__field {
font-size: 15px;
border: none;
-webkit-appearance: none;
width: 228px;
height: 55px;
line-height: 55px;
font-weight: 500;
box-shadow: none;
float: left;
background-color: #FFFFFF;
position: relative;
z-index: 2;
}
#enter_room_button {
width: 73px;
height: 45px;
background-color: #21B9FC;
moz-border-radius: 1px;
-webkit-border-radius: 1px;
color: #ffffff;
font-weight: 600;
border: none;
margin-top: 5px;
font-size: 19px;
padding-top: 6px;
outline: none;
float:left;
position: relative;
z-index: 2;
&__reload {
display: block;
width: 30px;
color: #acacac;
font-size: 1.9em;
line-height: 55px;
z-index: 3;
float: left;
cursor: pointer;
text-align: center;
}
&__button {
width: 73px;
height: 45px;
background-color: #21B9FC;
moz-border-radius: 1px;
-webkit-border-radius: 1px;
color: #ffffff;
font-weight: 600;
border: none;
margin-top: 5px;
font-size: 19px;
padding-top: 6px;
outline: none;
float:left;
position: relative;
z-index: 2;
}
}
#enter_room_container {
@@ -184,16 +198,3 @@
line-height: 22px;
font-weight: 200;
}
#reload_roomname
{
width: 30px;
color: #acacac;
font-size: 1.9em;
line-height: 55px;
z-index: 3;
float: left;
cursor: pointer;
text-align: center;
display: none;
}

View File

@@ -67,5 +67,7 @@
@import '404';
@import 'policy';
@import 'filmstrip';
@import 'unsupported-browser/unsupported-desktop-browser';
@import 'unsupported-browser/unsupported-mobile-browser';
/* Modules END */

View File

@@ -0,0 +1,132 @@
.supported-browser {
color: #929391;
display: inline-block;
font-size: 20px;
margin: 1em 7px;
vertical-align: middle;
width: 138px;
&__button {
background-color: #62c82a;
border: 1px solid #3c8117;
border-radius: 10px;
color: #FFFFFF;
font-size: 12px;
height: 26px;
margin: 15px auto 0px auto;
padding-top: 13px;
text-align: center;
width: 115px;
}
&__link {
color: #087dba;
text-decoration: none;
&:hover {
text-decoration: none;
}
&:active {
text-decoration: none;
}
&:focus {
text-decoration: none;
}
}
&-list
{
margin: 0 auto;
}
&__logo {
margin: 20px auto 0px auto;
&_chrome {
background-image: url('../../images/chrome.png');
height: 78px;
width: 78px;
}
&_chromium {
background-image: url('../../images/chromium.png');
height: 78px;
width: 77px;
}
&_firefox {
background-image: url('../../images/firefox.png');
height: 80px;
width: 86px;
}
&_opera {
background-image: url('../../images/opera.png');
height: 78px;
width: 73px;
}
&_ie {
background-image: url('../../images/ie.png');
height: 78px;
width: 80px;
}
&_safari {
background-image: url('../../images/safari.png');
height: 79px;
width: 78px;
}
}
&__text
{
line-height: 1.2em;
&_small {
font-size: small;
}
}
&__tile {
background-color: #e8e8e8;
border: 1px solid #cfcfcf;
border-radius: 10px;
height: 163px;
margin-top: 5px;
width: 138px;
}
}
.unsupported-desktop-browser {
display: block;
height: 565px;
margin: auto;
overflow:hidden;
position: absolute;
text-align: center;
top: 0; left: 0; bottom: 0; right: 0;
width:500px;
&__page {
display:inline-block;
font-size: 28px;
padding-top: 25px;
vertical-align:middle;
}
&__title {
margin: 0 auto;
width: 20em;
}
&-wrapper {
background: #fff;
display: block;
height: 100%;
position: absolute;
width: 100%;
}
}

View File

@@ -0,0 +1,69 @@
.unsupported-mobile-browser {
background-color: #fff;
height: 100vh;
padding: 35px 0;
width: 100vw;
&__body {
color: $unsupportedBrowserTextColor;
margin: auto;
max-width: 40em;
text-align: center;
width: 75%;
a:active {
text-decoration: none;
}
}
&__text {
font-size: 1.8em;
line-height: em(29px, 21px);
margin-bottom: 0.65em;
&_small {
font-size: 1.5em;
margin-bottom: 1em;
margin-top: em(21, 18);
strong {
font-size: em(21, 18);
}
}
}
&__logo {
height: 108px;
width: 77px;
}
&__button {
border: 0;
height: 42px;
margin: 0 auto;
max-width: 300px;
width: 98%;
@include border-radius(8px);
background-color: $unsupportedBrowserButtonBgColor;
font-size: 1.5em;
font-weight: 300;
letter-spacing: 0.5px;
text-shadow: 0px 1px 2px $unsupportedBrowserTextColor;
// Disable standard button effects.
box-shadow: none;
outline: none;
&:active {
background-color: $unsupportedBrowserButtonBgColor;
}
&_primary {
background-color: $primaryUnsupportedBrowserButtonBgColor;
&:active {
background-color: $primaryUnsupportedBrowserButtonBgColor;
}
}
}
}

View File

@@ -1,138 +0,0 @@
@import 'variables';
body {
width:100%;
height:100%;
background-color: white;
color: #424242;
font-family: $baseFontFamily;
font-size: 28px;
margin:0;
padding:0;
}
#wrap{
display: block;
position: absolute;
width:500px;
height: 565px;
overflow:hidden;
text-align: center;
margin: auto;
top: 0; left: 0; bottom: 0; right: 0;
}
.firefox{
font-size: 11pt;
color: #c8c8c8;
width: 468px;
text-align: center;
margin: 30px auto 0px auto;
padding-left: 15px;
}
#text{
display:inline-block;
font-size: 28px;
/* width: 568px; */
vertical-align:middle;
padding-top: 25px;
}
a {
color: #087dba;
text-decoration:none;
}
.browser {
width: 138px;
height: 163px;
margin-top: 5px;
background-color: #e8e8e8;
border: 1px solid #cfcfcf;
border-radius: 10px;
}
.browser_wrapper
{
width: 138px;
/* height: 188px; */
vertical-align: middle;
color: #929391;
font-size: 20px;
float: left;
margin-left: 15px;
margin-top: 5px;
}
.browser_text
{
height: 2em;
}
.supported_browsers
{
margin: 0px auto 0px auto;
/* width: 660px; */
}
.clear
{
clear: both;
}
.button
{
background-color: #62c82a;
border: 1px solid #3c8117;
border-radius: 10px;
color: #FFFFFF;
font-size: 12px;
text-align: center;
width: 115px;
height: 26px;
padding-top: 13px;
margin: 15px auto 0px auto;
}
.logo
{
margin: 20px auto 0px auto;
}
#chrome_logo
{
width: 78px;
height: 78px;
background-image: url('../images/chrome.png');
}
#chromium_logo
{
width: 77px;
height: 78px;
background-image: url('../images/chromium.png');
}
#firefox_logo
{
width: 86px;
height: 80px;
background-image: url('../images/firefox.png');
}
#opera_logo
{
width: 73px;
height: 78px;
background-image: url('../images/opera.png');
}
#safari_logo
{
width: 78px;
height: 79px;
background-image: url('../images/safari.png');
}
#ie_logo
{
width: 80px;
height: 78px;
background-image: url('../images/ie.png');
}

View File

@@ -127,6 +127,7 @@ case "$1" in
echo "org.jitsi.videobridge.rest.jetty.ResourceHandler.resourceBase=/usr/share/jitsi-meet" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.ResourceHandler.alias./config.js=/etc/jitsi/meet/$JVB_HOSTNAME-config.js" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.ResourceHandler.alias./interface_config.js=/usr/share/jitsi-meet/interface_config.js" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.ResourceHandler.alias./logging_config.js=/usr/share/jitsi-meet/logging_config.js" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.RewriteHandler.regex=^/([a-zA-Z0-9]+)$" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.RewriteHandler.replacement=/" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.SSIResourceHandler.paths=/" >> $JVB_CONFIG

View File

@@ -4,7 +4,6 @@
*.ico /usr/share/jitsi-meet/
libs /usr/share/jitsi-meet/
css/all.css /usr/share/jitsi-meet/css/
css/unsupported_browser.css /usr/share/jitsi-meet/css/
sounds /usr/share/jitsi-meet/
fonts /usr/share/jitsi-meet/
images /usr/share/jitsi-meet/

View File

@@ -1,17 +1,17 @@
Jitsi Meet API
============
# Jitsi Meet API
You can use Jitsi Meet API to embed Jitsi Meet in to your application.
You can use the Jitsi Meet API to embed Jitsi Meet in to your application.
Installation
==========
## Installation
To embed Jitsi Meet in your application you need to add the Jitsi Meet API library:
To embed Jitsi Meet in your application you need to add Jitsi Meet API library
```javascript
<script src="https://meet.jit.si/external_api.js"></script>
```
The next step for embedding Jitsi Meet is to create the Jitsi Meet API object
The next step for embedding Jitsi Meet is to create the Jitsi Meet API object:
```javascript
<script>
var domain = "meet.jit.si";
@@ -21,161 +21,174 @@ The next step for embedding Jitsi Meet is to create the Jitsi Meet API object
var api = new JitsiMeetExternalAPI(domain, room, width, height);
</script>
```
You can paste that lines in your html code where you want to be placed the Jitsi Meet conference
or you can specify the parent HTML element for the Jitsi Meet conference in the JitsiMeetExternalAPI
constructor.
You can use the above lines to indicate where exactly you want the Jitsi Meet conference to be placed in your HTML code,
or you can specify the parent HTML element for the Jitsi Meet conference in the `JitsiMeetExternalAPI`
constructor:
```javascript
var api = new JitsiMeetExternalAPI(domain, room, width, height, htmlElement);
var api = new JitsiMeetExternalAPI(domain, room, width, height, htmlElement);
```
If you don't specify room the user will enter in new conference with random room name.
You can overwrite options set in config.js and interface_config.js. For example, to enable the film-strip-only interface mode and disable simulcast, you can use:
If you don't specify the room the user will enter in new conference with a random room name.
You can overwrite options set in [config.js]() and [interface_config.js](). For example, to enable the film-strip-only interface mode and disable simulcast, you can use:
```javascript
var configOverwrite = {enableSimulcast: false};
var interfaceConfigOverwrite = {filmStripOnly: true};
var api = new JitsiMeetExternalAPI(domain, room, width, height, htmlElement, configOverwrite, interfaceConfigOverwrite);
var configOverwrite = {disableSimulcast: true};
var interfaceConfigOverwrite = {filmStripOnly: true};
var api = new JitsiMeetExternalAPI(domain, room, width, height, htmlElement, configOverwrite, interfaceConfigOverwrite);
```
Controlling embedded Jitsi Meet Conference
=========
## Controlling the embedded Jitsi Meet Conference
You can control the embedded Jitsi Meet conference using the JitsiMeetExternalAPI object.
You can control the embedded Jitsi Meet conference using the `JitsiMeetExternalAPI` object by using `executeCommand`:
You can send command to Jitsi Meet conference using ```executeCommand```.
```javascript
api.executeCommand(command, ...arguments)
```
api.executeCommand(command, arguments)
```
The ```command``` parameter is String object with the name of the command.
The ```arguments``` parameter is array with the arguments required by the command.
If no arguments are required by the command this parameter can be omitted or you can pass empty array.
Currently we support the following commands:
The `command` parameter is String object with the name of the command. The following commands are currently supported:
* **displayName** - sets the display name of the local participant. This command requires one argument -
the new display name to be set
```
* **displayName** - Sets the display name of the local participant. This command requires one argument - the new display name to be set.
```javascript
api.executeCommand('displayName', 'New Nickname');
```
* **toggleAudio** - mutes / unmutes the audio for the local participant. No arguments are required.
```
api.executeCommand('toggleAudio', [])
```
* **toggleVideo** - mutes / unmutes the video for the local participant. No arguments are required.
```
api.executeCommand('toggleVideo', [])
```
* **toggleFilmStrip** - hides / shows the film strip. No arguments are required.
```
api.executeCommand('filmStrip', [])
```
* **toggleChat** - hides / shows the chat. No arguments are required.
```
api.executeCommand('toggleChat', [])
```
* **toggleContactList** - hides / shows the contact list. No arguments are required.
```
api.executeCommand('toggleContactList', [])
* **toggleAudio** - Mutes / unmutes the audio for the local participant. No arguments are required.
```javascript
api.executeCommand('toggleAudio')
```
* **toggleShareScreen** - starts / stops the screen sharing. No arguments are required.
* **toggleVideo** - Mutes / unmutes the video for the local participant. No arguments are required.
```javascript
api.executeCommand('toggleVideo')
```
api.executeCommand('toggleShareScreen', [])
* **toggleFilmStrip** - Hides / shows the film strip. No arguments are required.
```javascript
api.executeCommand('toggleFilmStrip')
```
* **toggleChat** - Hides / shows the chat. No arguments are required.
```javascript
api.executeCommand('toggleChat')
```
* **toggleContactList** - Hides / shows the contact list. No arguments are required.
```javascript
api.executeCommand('toggleContactList')
```
* **toggleShareScreen** - Starts / stops screen sharing. No arguments are required.
```javascript
api.executeCommand('toggleShareScreen')
```
* **hangup** - Hangups the call. No arguments are required.
```
api.executeCommand('hangup', [])
```javascript
api.executeCommand('hangup')
```
You can also execute multiple commands using the method ```executeCommands```.
* **email** - Changes the local email address. This command requires one argument - the new email address to be set.
```javascript
api.executeCommand('email', 'example@example.com')
```
* **avatarUrl** - Changes the local avatar URL. This command requires one argument - the new avatar URL to be set.
```javascript
api.executeCommand('avatarUrl', 'https://avatars0.githubusercontent.com/u/3671647')
```
You can also execute multiple commands using the `executeCommands` method:
```javascript
api.executeCommands(commands)
```
The ```commands``` parameter is object with keys the names of the commands and values the arguments for the
commands.
```
The `commands` parameter is an object with the names of the commands as keys and the arguments for the commands asvalues:
```javascript
api.executeCommands({displayName: ['nickname'], toggleAudio: []});
```
You can add event listeners to the embedded Jitsi Meet using ```addEventListener``` method.
```
You can add event listeners to the embedded Jitsi Meet using the `addEventListener` method.
```javascript
api.addEventListener(event, listener)
```
The ```event``` parameter is String object with the name of the event.
The ```listener``` paramenter is Function object with one argument that will be notified when the event occurs
with data related to the event.
Currently we support the following events:
The `event` parameter is a String object with the name of the event.
The `listener` parameter is a Function object with one argument that will be notified when the event occurs with data related to the event.
* **incomingMessage** - event notifications about incoming
messages. The listener will receive object with the following structure:
```
The following events are currently supported:
* **incomingMessage** - Event notifications about incoming
messages. The listener will receive an object with the following structure:
```javascript
{
"from": from,//JID of the user that sent the message
"nick": nick,//the nickname of the user that sent the message
"message": txt//the text of the message
"from": from, // JID of the user that sent the message
"nick": nick, // the nickname of the user that sent the message
"message": txt // the text of the message
}
```
* **outgoingMessage** - event notifications about outgoing
messages. The listener will receive object with the following structure:
```
* **outgoingMessage** - Event notifications about outgoing
messages. The listener will receive an object with the following structure:
```javascript
{
"message": txt//the text of the message
"message": txt // the text of the message
}
```
* **displayNameChanged** - event notifications about display name
change. The listener will receive object with the following structure:
```
changes. The listener will receive an object with the following structure:
```javascript
{
jid: jid,//the JID of the participant that changed his display name
displayname: displayName //the new display name
"jid": jid, // the JID of the participant that changed his display name
"displayname": displayName // the new display name
}
```
* **participantJoined** - event notifications about new participant.
The listener will receive object with the following structure:
```
* **participantJoined** - event notifications about new participants who join the room. The listener will receive an object with the following structure:
```javascript
{
jid: jid //the jid of the participant
"jid": jid // the JID of the participant
}
```
* **participantLeft** - event notifications about participant that left room.
The listener will receive object with the following structure:
```
* **participantLeft** - event notifications about participants that leave the room. The listener will receive an object with the following structure:
```javascript
{
jid: jid //the jid of the participant
"jid": jid // the JID of the participant
}
```
* **videoConferenceJoined** - event notifications fired when the local user has joined the video conference.
The listener will receive object with the following structure:
```
* **videoConferenceJoined** - event notifications fired when the local user has joined the video conference. The listener will receive an object with the following structure:
```javascript
{
roomName: room //the room name of the conference
"roomName": room // the room name of the conference
}
```
* **videoConferenceLeft** - event notifications fired when the local user has left the video conference.
The listener will receive object with the following structure:
```
* **videoConferenceLeft** - event notifications fired when the local user has left the video conference. The listener will receive an object with the following structure:
```javascript
{
roomName: room //the room name of the conference
"roomName": room // the room name of the conference
}
```
* **readyToClose** - event notification fired when Jitsi Meet is ready to be closed (hangup operations are completed).
You can also add multiple event listeners by using ```addEventListeners```.
You can also add multiple event listeners by using `addEventListeners`.
This method requires one argument of type Object. The object argument must
have keys with the names of the events and values the listeners of the events.
have the names of the events as keys and the listeners of the events as values.
```
```javascript
function incomingMessageListener(object)
{
...
// ...
}
function outgoingMessageListener(object)
{
...
// ...
}
api.addEventListeners({
@@ -183,20 +196,28 @@ api.addEventListeners({
outgoingMessage: outgoingMessageListener})
```
If you want to remove a listener you can use ```removeEventListener``` method with argument the name of the event.
```
If you want to remove a listener you can use `removeEventListener` method with argument the name of the event.
```javascript
api.removeEventListener("incomingMessage");
```
If you want to remove more than one event you can use ```removeEventListeners``` method with argument
array with the names of the events.
```
If you want to remove more than one event you can use `removeEventListeners` method with an Array with the names of the events as an argument.
```javascript
api.removeEventListeners(["incomingMessage", "outgoingMessageListener"]);
```
You can remove the embedded Jitsi Meet Conference with the following code:
You can get the number of participants in the conference with the following API function:
```javascript
var numberOfParticipants = api.getNumberOfParticipants();
```
You can remove the embedded Jitsi Meet Conference with the following API function:
```javascript
api.dispose()
```
It is a good practice to remove the conference before the page is unloaded.
NOTE: It's a good practice to remove the conference before the page is unloaded.
[config.js]: https://github.com/jitsi/jitsi-meet/blob/master/config.js
[interface_config.js]: https://github.com/jitsi/jitsi-meet/blob/master/interface_config.js

22
doc/examples/api.html Normal file
View File

@@ -0,0 +1,22 @@
<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="utf-8">
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<script src="https://meet.jit.si/external_api.js"></script>
<script>
var domain = "meet.jit.si";
var room = "JitsiMeetAPIExample";
var width = 700;
var height = 180;
var htmlElement = undefined;
var configOverwrite = {};
var interfaceConfigOverwrite = {
filmStripOnly: true
};
var api = new JitsiMeetExternalAPI(domain, room, width, height,
htmlElement, configOverwrite, interfaceConfigOverwrite);
</script>
</body>
</html>

View File

@@ -131,9 +131,9 @@ Or autostart it by adding the line in `/etc/rc.local`:
## Install Jitsi Conference Focus (jicofo)
Install JDK and Ant if missing:
Install JDK and Maven if missing:
```
apt-get install default-jdk ant
apt-get install default-jdk maven
```
_NOTE: When installing on older Debian releases keep in mind that you need JDK >= 1.7._
@@ -145,12 +145,14 @@ git clone https://github.com/jitsi/jicofo.git
Build distribution package. Replace {os-name} with one of: 'lin', 'lin64', 'macosx', 'win', 'win64'.
```sh
cd jicofo
ant dist.{os-name}
mvn package -DskipTests -Dassembly.skipAssembly=false
```
Run jicofo:
```sh
cd dist/{os-name}'
./jicofo.sh --host=127.0.0.1 --domain=jitsi.example.com --secret=YOURSECRET2 --user_domain=auth.jitsi.example.com --user_name=focus --user_password=YOURSECRET3
=======
unzip target/jicofo-{os-name}-1.0-SNAPSHOT.zip
cd jicofo-{os-name}-1.0-SNAPSHOT'
./jicofo.sh --host=localhost --domain=jitsi.example.com --secret=YOURSECRET2 --user_domain=auth.jitsi.example.com --user_name=focus --user_password=YOURSECRET3
```
## Deploy Jitsi Meet
@@ -159,6 +161,8 @@ Checkout and configure Jitsi Meet:
cd /srv
git clone https://github.com/jitsi/jitsi-meet.git
mv jitsi-meet/ jitsi.example.com
npm install
make
```
Edit host names in `/srv/jitsi.example.com/config.js` (see also the example config file):
@@ -167,11 +171,11 @@ var config = {
hosts: {
domain: 'jitsi.example.com',
muc: 'conference.jitsi.example.com',
bridge: 'jitsi-videobridge.jitsi.example.com'
bridge: 'jitsi-videobridge.jitsi.example.com',
focus: 'focus.jitsi.example.com'
},
useNicks: false,
bosh: '//jitsi.example.com/http-bind', // FIXME: use xep-0156 for that
desktopSharing: 'false' // Desktop sharing method. Can be set to 'ext', 'webrtc' or false to disable.
//chromeExtensionId: 'diibjkoicjeejcmhdnailmkgecihlobk', // Id of desktop streamer Chrome extension
//minChromeExtVersion: '0.1' // Required version of Chrome extension
};

94
doc/mobile.md Normal file
View File

@@ -0,0 +1,94 @@
# Jitsi Meet mobile apps
Jitsi Meet can also be built as a standalone mobile application for
iOS and Android. It uses the [React Native]() framework.
First make sure the [React Native dependencies]() are installed.
**NOTE**: This document assumes the app is being built on a macOS system.
**NOTE**: The app must be built for an actual device since the simulators don't
work properly with the native plugins we require.
## iOS
1. Install some extra dependencies
- Install ios-deploy globally (in case you want to use the React Native CLI
to deploy the app to the device)
```bash
npm install -g ios-deploy
```
2. Build the app
There are 2 ways to build the app: using the CLI or using Xcode.
Using the CLI:
```bash
react-native run-ios --device
```
When the app is launched from the CLI the output can be checked with the
following command:
```bash
react-native log-ios
```
Using Xcode
- Open **ios/jitsi-meet-react.xcworkspace** in Xcode. Make sure it's the
workspace file!
- Select your device from the top bar and hit the "play" button.
When the app is launched from Xcode the Debug console will show the output
logs the application creates.
3. Other remarks
It's likely you'll need to change the bundle ID for deploying to a device
because the default bundle ID points to the application signed by Atlassian.
This can be changed in the "General" tab. Under "Identity" set
"Bundle Identifier" to a different value, and adjust the "Team" in the
"Signing" section to match your own.
## Android
The [React Native dependencies]() page has very detailed information on how to
setup [Android Studio]() and the required components for getting the necessary
build environment. Make sure you follow it closely.
1. Building the app
The app can be built using the CLI utility as follows:
```bash
react-native run-android
```
It will be launched on the connected Android device.
## Debugging
The official documentation on [debugging]() is quite extensive, it is the
preferred method for debugging.
**NOTE**: When using Chrome Developer Tools for debugging the JavaScript code
is being interpreted by Chrome's V8 engine, instead of JSCore which
React Native uses. It's important to keep this in mind due to potential
differences in supported JavaScript features.
[Android Studio]: https://developer.android.com/studio/index.html
[debugging]: https://facebook.github.io/react-native/docs/debugging.html
[React Native]: https://facebook.github.io/react-native/
[React Native dependencies]: https://facebook.github.io/react-native/docs/getting-started.html#installing-dependencies

6
flow-typed/npm/flow-bin_v0.x.x.js vendored Normal file
View File

@@ -0,0 +1,6 @@
// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583
// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x
declare module "flow-bin" {
declare module.exports: string;
}

89
flow-typed/npm/react-redux_v5.x.x.js vendored Normal file
View File

@@ -0,0 +1,89 @@
// flow-typed signature: 0ed284c5a2e97a9e3c0e87af3dedc09d
// flow-typed version: bdf1e66252/react-redux_v5.x.x/flow_>=v0.30.x
import type { Dispatch, Store } from 'redux'
declare module 'react-redux' {
/*
S = State
A = Action
OP = OwnProps
SP = StateProps
DP = DispatchProps
*/
declare type MapStateToProps<S, OP: Object, SP: Object> = (state: S, ownProps: OP) => SP | MapStateToProps<S, OP, SP>;
declare type MapDispatchToProps<A, OP: Object, DP: Object> = ((dispatch: Dispatch<A>, ownProps: OP) => DP) | DP;
declare type MergeProps<SP, DP: Object, OP: Object, P: Object> = (stateProps: SP, dispatchProps: DP, ownProps: OP) => P;
declare type StatelessComponent<P> = (props: P) => ?React$Element<any>;
declare class ConnectedComponent<OP, P, Def, St> extends React$Component<void, OP, void> {
static WrappedComponent: Class<React$Component<Def, P, St>>;
getWrappedInstance(): React$Component<Def, P, St>;
static defaultProps: void;
props: OP;
state: void;
}
declare type ConnectedComponentClass<OP, P, Def, St> = Class<ConnectedComponent<OP, P, Def, St>>;
declare type Connector<OP, P> = {
(component: StatelessComponent<P>): ConnectedComponentClass<OP, P, void, void>;
<Def, St>(component: Class<React$Component<Def, P, St>>): ConnectedComponentClass<OP, P, Def, St>;
};
declare class Provider<S, A> extends React$Component<void, { store: Store<S, A>, children?: any }, void> { }
declare type ConnectOptions = {
pure?: boolean,
withRef?: boolean
};
declare type Null = null | void;
declare function connect<A, OP>(
...rest: Array<void> // <= workaround for https://github.com/facebook/flow/issues/2360
): Connector<OP, $Supertype<{ dispatch: Dispatch<A> } & OP>>;
declare function connect<A, OP>(
mapStateToProps: Null,
mapDispatchToProps: Null,
mergeProps: Null,
options: ConnectOptions
): Connector<OP, $Supertype<{ dispatch: Dispatch<A> } & OP>>;
declare function connect<S, A, OP, SP>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: Null,
mergeProps: Null,
options?: ConnectOptions
): Connector<OP, $Supertype<SP & { dispatch: Dispatch<A> } & OP>>;
declare function connect<A, OP, DP>(
mapStateToProps: Null,
mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
mergeProps: Null,
options?: ConnectOptions
): Connector<OP, $Supertype<DP & OP>>;
declare function connect<S, A, OP, SP, DP>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
mergeProps: Null,
options?: ConnectOptions
): Connector<OP, $Supertype<SP & DP & OP>>;
declare function connect<S, A, OP, SP, DP, P>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
mergeProps: MergeProps<SP, DP, OP, P>,
options?: ConnectOptions
): Connector<OP, P>;
}

56
flow-typed/npm/redux_v3.x.x.js vendored Normal file
View File

@@ -0,0 +1,56 @@
// flow-typed signature: ba132c96664f1a05288f3eb2272a3c35
// flow-typed version: c4bbd91cfc/redux_v3.x.x/flow_>=v0.33.x
declare module 'redux' {
/*
S = State
A = Action
*/
declare type Dispatch<A: { type: $Subtype<string> }> = (action: A) => A;
declare type MiddlewareAPI<S, A> = {
dispatch: Dispatch<A>;
getState(): S;
};
declare type Store<S, A> = {
// rewrite MiddlewareAPI members in order to get nicer error messages (intersections produce long messages)
dispatch: Dispatch<A>;
getState(): S;
subscribe(listener: () => void): () => void;
replaceReducer(nextReducer: Reducer<S, A>): void
};
declare type Reducer<S, A> = (state: S, action: A) => S;
declare type Middleware<S, A> =
(api: MiddlewareAPI<S, A>) =>
(next: Dispatch<A>) => Dispatch<A>;
declare type StoreCreator<S, A> = {
(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<S, A>): Store<S, A>;
(reducer: Reducer<S, A>, preloadedState: S, enhancer?: StoreEnhancer<S, A>): Store<S, A>;
};
declare type StoreEnhancer<S, A> = (next: StoreCreator<S, A>) => StoreCreator<S, A>;
declare function createStore<S, A>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<S, A>): Store<S, A>;
declare function createStore<S, A>(reducer: Reducer<S, A>, preloadedState: S, enhancer?: StoreEnhancer<S, A>): Store<S, A>;
declare function applyMiddleware<S, A>(...middlewares: Array<Middleware<S, A>>): StoreEnhancer<S, A>;
declare type ActionCreator<A, B> = (...args: Array<B>) => A;
declare type ActionCreators<K, A> = { [key: K]: ActionCreator<A, any> };
declare function bindActionCreators<A, C: ActionCreator<A, any>>(actionCreator: C, dispatch: Dispatch<A>): C;
declare function bindActionCreators<A, K, C: ActionCreators<K, A>>(actionCreators: C, dispatch: Dispatch<A>): C;
declare function combineReducers<O: Object, A>(reducers: O): Reducer<$ObjMap<O, <S>(r: Reducer<S, any>) => S>, A>;
declare function compose<S, A>(...fns: Array<StoreEnhancer<S, A>>): Function;
}

Binary file not shown.

View File

@@ -14,7 +14,7 @@
<glyph unicode="&#xe900;" glyph-name="connection-lost" horiz-adv-x="1414" d="M0 299.153h196.337v-187.951h-196.337v187.951zM271.842 480.372h196.337v-369.169h-196.337v369.169zM543.656 661.562h196.337v-550.36h-196.337v550.36zM815.47 842.766v-731.564h119.56c-14.589 33.025-23.125 71.503-23.232 111.943 0.132 86.42 38.697 163.851 99.656 216.468l0.348 403.153h-196.332zM1087.292 1024v-533.672c28.874 10.572 62.222 16.73 97.009 16.825 35.717-0.129 69.823-6.614 101.322-18.371l-1.999 535.218h-196.332zM1192.868 439.852c-0.009 0-0.020 0-0.031 0-122.247 0-221.351-98.447-221.372-219.896 0-0.007 0-0.014 0-0.021 0-121.467 99.111-219.935 221.372-219.935 0.011 0 0.021 0 0.032 0 122.248 0.014 221.345 98.477 221.345 219.935 0 0.007 0 0.013 0 0.020-0.021 121.441-99.11 219.883-221.345 219.897zM1194.706 372.607c87.601-0.006 158.614-69.787 158.614-155.866 0-0.006 0-0.012 0-0.019-0.022-86.062-71.026-155.822-158.614-155.828-87.588 0.006-158.593 69.766-158.615 155.826 0 0.007 0 0.014 0 0.020 0 86.079 71.013 155.86 158.613 155.866zM1286.795 355.682l48.348-52.528-236.375-217.567-48.348 52.528 236.375 217.567z" />
<glyph unicode="&#xe901;" glyph-name="avatar" d="M512 204c106 0 200 56 256 138-2 84-172 132-256 132-86 0-254-48-256-132 56-82 150-138 256-138zM512 810c-70 0-128-58-128-128s58-128 128-128 128 58 128 128-58 128-128 128zM512 938c236 0 426-190 426-426s-190-426-426-426-426 190-426 426 190 426 426 426z" />
<glyph unicode="&#xe902;" glyph-name="download" d="M726 470h-128v170h-172v-170h-128l214-214zM826 596c110-8 198-100 198-212 0-118-96-214-214-214h-554c-142 0-256 114-256 256 0 132 100 240 228 254 54 102 160 174 284 174 156 0 284-110 314-258z" />
<glyph unicode="&#xe903;" glyph-name="autorenew" d="M800 694c34-52 54-116 54-182 0-188-154-342-342-342v-128l-170 172 170 170v-128c142 0 256 114 256 256 0 44-12 84-30 120zM512 768c-142 0-256-114-256-256 0-44 10-84 30-120l-62-62c-34 52-54 116-54 182 0 188 154 342 342 342v128l170-172-170-170v128z" />
<glyph unicode="&#xe903;" glyph-name="mic-camera-combined" d="M756.704 628.138l267.296 202.213v-635.075l-267.296 202.213v-191.923c0-12.085-11.296-21.863-25.216-21.863h-706.272c-13.92 0-25.216 9.777-25.216 21.863v612.25c0 12.085 11.296 21.863 25.216 21.863h706.272c13.92 0 25.216-9.777 25.216-21.863v-189.679zM371.338 376.228c47.817 0 86.529 40.232 86.529 89.811v184.835c0 49.651-38.713 89.883-86.529 89.883-47.788 0-86.515-40.232-86.515-89.883v-184.835c0-49.579 38.756-89.811 86.515-89.811v0zM356.754 314.070v-32.78h33.718v33.412c73.858 9.606 131.235 73.73 131.235 151.351v88.232h-30.636v-88.232c0-67.57-53.696-122.534-119.734-122.534-66.024 0-119.691 54.964-119.691 122.534v88.232h-30.636v-88.232c0-79.215 59.674-144.502 135.744-151.969v-0.014z" />
<glyph unicode="&#xe904;" glyph-name="kick" d="M512 810l284-426h-568zM214 298h596v-84h-596v84z" />
<glyph unicode="&#xe905;" glyph-name="hangup" d="M512 640c-68 0-134-10-196-30v-132c0-16-10-34-24-40-42-20-80-46-114-78-8-8-18-12-30-12s-22 4-30 12l-106 106c-8 8-12 18-12 30s4 22 12 30c130 124 306 200 500 200s370-76 500-200c8-8 12-18 12-30s-4-22-12-30l-106-106c-8-8-18-12-30-12s-22 4-30 12c-34 32-72 58-114 78-14 6-24 20-24 38v132c-62 20-128 32-196 32z" />
<glyph unicode="&#xe906;" glyph-name="chat" d="M854 342v512h-684v-598l86 86h598zM854 938c46 0 84-38 84-84v-512c0-46-38-86-84-86h-598l-170-170v768c0 46 38 84 84 84h684z" />
@@ -44,4 +44,5 @@
<glyph unicode="&#xe91e;" glyph-name="raised-hand" d="M982 790v-620c0-94-78-170-172-170h-310c-46 0-90 18-122 50l-336 342s54 52 56 52c10 8 22 12 34 12 10 0 18-2 26-6 2 0 184-104 184-104v508c0 36 28 64 64 64s64-28 64-64v-300h42v406c0 36 28 64 64 64s64-28 64-64v-406h42v364c0 36 28 64 64 64s64-28 64-64v-364h44v236c0 36 28 64 64 64s64-28 64-64z" />
<glyph unicode="&#xe91f;" glyph-name="menu-up" d="M512 682l256-256-60-60-196 196-196-196-60 60z" />
<glyph unicode="&#xe920;" glyph-name="menu-down" d="M708 658l60-60-256-256-256 256 60 60 196-196z" />
<glyph unicode="&#xe921;" glyph-name="switch-camera" d="M640 362l150 150-150 150v-108h-256v108l-150-150 150-150v108h256v-108zM854 854c46 0 84-40 84-86v-512c0-46-38-86-84-86h-684c-46 0-84 40-84 86v512c0 46 38 86 84 86h136l78 84h256l78-84h136z" />
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Binary file not shown.

View File

@@ -1,6 +1,35 @@
{
"IcoMoonType": "selection",
"icons": [
{
"icon": {
"paths": [
"M756.704 395.862l267.296-202.213v635.075l-267.296-202.213v191.923c0 12.085-11.296 21.863-25.216 21.863h-706.272c-13.92 0-25.216-9.777-25.216-21.863v-612.25c0-12.085 11.296-21.863 25.216-21.863h706.272c13.92 0 25.216 9.777 25.216 21.863v189.679zM371.338 647.772c47.817 0 86.529-40.232 86.529-89.811v-184.835c0-49.651-38.713-89.883-86.529-89.883-47.788 0-86.515 40.232-86.515 89.883v184.835c0 49.579 38.756 89.811 86.515 89.811v0zM356.754 709.93v32.78h33.718v-33.412c73.858-9.606 131.235-73.73 131.235-151.351v-88.232h-30.636v88.232c0 67.57-53.696 122.534-119.734 122.534-66.024 0-119.691-54.964-119.691-122.534v-88.232h-30.636v88.232c0 79.215 59.674 144.502 135.744 151.969v0.014z"
],
"attrs": [
{}
],
"isMulticolor": false,
"isMulticolor2": false,
"grid": 0,
"tags": [
"Combined Shape"
]
},
"attrs": [
{}
],
"properties": {
"order": 109,
"id": 0,
"name": "mic-camera-combined",
"prevSize": 32,
"code": 59651
},
"setIdx": 0,
"setId": 2,
"iconIdx": 0
},
{
"icon": {
"paths": [
@@ -26,8 +55,8 @@
"prevSize": 32,
"code": 59677
},
"setIdx": 0,
"setId": 2,
"setIdx": 1,
"setId": 1,
"iconIdx": 0
},
{
@@ -55,8 +84,8 @@
"prevSize": 32,
"code": 59676
},
"setIdx": 0,
"setId": 2,
"setIdx": 1,
"setId": 1,
"iconIdx": 1
},
{
@@ -81,35 +110,9 @@
"code": 59649,
"name": "avatar"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 12
},
{
"icon": {
"paths": [
"M800 330c34 52 54 116 54 182 0 188-154 342-342 342v128l-170-172 170-170v128c142 0 256-114 256-256 0-44-12-84-30-120zM512 256c-142 0-256 114-256 256 0 44 10 84 30 120l-62 62c-34-52-54-116-54-182 0-188 154-342 342-342v-128l170 172-170 170v-128z"
],
"isMulticolor": false,
"isMulticolor2": false,
"tags": [
"autorenew"
],
"grid": 0,
"attrs": []
},
"attrs": [],
"properties": {
"id": 68,
"order": 84,
"ligatures": "autorenew",
"prevSize": 32,
"code": 59651,
"name": "autorenew"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 69
"setIdx": 1,
"setId": 1,
"iconIdx": 2
},
{
"icon": {
@@ -133,9 +136,9 @@
"code": 59653,
"name": "hangup"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 123
"setIdx": 1,
"setId": 1,
"iconIdx": 3
},
{
"icon": {
@@ -159,9 +162,9 @@
"code": 59654,
"name": "chat"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 149
"setIdx": 1,
"setId": 1,
"iconIdx": 4
},
{
"icon": {
@@ -185,9 +188,9 @@
"code": 59650,
"name": "download"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 165
"setIdx": 1,
"setId": 1,
"iconIdx": 5
},
{
"icon": {
@@ -211,9 +214,9 @@
"code": 59655,
"name": "edit"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 186
"setIdx": 1,
"setId": 1,
"iconIdx": 6
},
{
"icon": {
@@ -237,9 +240,9 @@
"code": 59656,
"name": "share-doc"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 207
"setIdx": 1,
"setId": 1,
"iconIdx": 7
},
{
"icon": {
@@ -263,9 +266,9 @@
"code": 59657,
"name": "telephone"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 216
"setIdx": 1,
"setId": 1,
"iconIdx": 8
},
{
"icon": {
@@ -289,9 +292,9 @@
"code": 59652,
"name": "kick"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 243
"setIdx": 1,
"setId": 1,
"iconIdx": 9
},
{
"icon": {
@@ -315,9 +318,9 @@
"code": 59679,
"name": "menu-up"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 257
"setIdx": 1,
"setId": 1,
"iconIdx": 10
},
{
"icon": {
@@ -341,9 +344,9 @@
"code": 59680,
"name": "menu-down"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 258
"setIdx": 1,
"setId": 1,
"iconIdx": 11
},
{
"icon": {
@@ -367,9 +370,9 @@
"code": 59659,
"name": "full-screen"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 351
"setIdx": 1,
"setId": 1,
"iconIdx": 12
},
{
"icon": {
@@ -393,9 +396,9 @@
"code": 59660,
"name": "exit-full-screen"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 352
"setIdx": 1,
"setId": 1,
"iconIdx": 13
},
{
"icon": {
@@ -419,9 +422,9 @@
"code": 59658,
"name": "star-full"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 364
"setIdx": 1,
"setId": 1,
"iconIdx": 14
},
{
"icon": {
@@ -445,9 +448,9 @@
"code": 59661,
"name": "security"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 474
"setIdx": 1,
"setId": 1,
"iconIdx": 15
},
{
"icon": {
@@ -471,9 +474,9 @@
"code": 59662,
"name": "security-locked"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 475
"setIdx": 1,
"setId": 1,
"iconIdx": 16
},
{
"icon": {
@@ -497,9 +500,9 @@
"code": 59663,
"name": "reload"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 483
"setIdx": 1,
"setId": 1,
"iconIdx": 17
},
{
"icon": {
@@ -523,9 +526,9 @@
"code": 59664,
"name": "microphone"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 493
"setIdx": 1,
"setId": 1,
"iconIdx": 18
},
{
"icon": {
@@ -549,9 +552,9 @@
"code": 59665,
"name": "mic-empty"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 494
"setIdx": 1,
"setId": 1,
"iconIdx": 19
},
{
"icon": {
@@ -575,9 +578,9 @@
"code": 59666,
"name": "mic-disabled"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 495
"setIdx": 1,
"setId": 1,
"iconIdx": 20
},
{
"icon": {
@@ -601,9 +604,9 @@
"code": 59678,
"name": "raised-hand"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 540
"setIdx": 1,
"setId": 1,
"iconIdx": 21
},
{
"icon": {
@@ -627,9 +630,9 @@
"code": 59675,
"name": "contactList"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 550
"setIdx": 1,
"setId": 1,
"iconIdx": 22
},
{
"icon": {
@@ -653,9 +656,9 @@
"code": 59667,
"name": "link"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 560
"setIdx": 1,
"setId": 1,
"iconIdx": 23
},
{
"icon": {
@@ -679,9 +682,9 @@
"code": 59668,
"name": "shared-video"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 591
"setIdx": 1,
"setId": 1,
"iconIdx": 24
},
{
"icon": {
@@ -705,9 +708,9 @@
"code": 59669,
"name": "settings"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 666
"setIdx": 1,
"setId": 1,
"iconIdx": 25
},
{
"icon": {
@@ -731,9 +734,35 @@
"code": 59670,
"name": "star"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 718
"setIdx": 1,
"setId": 1,
"iconIdx": 26
},
{
"icon": {
"paths": [
"M640 662l150-150-150-150v108h-256v-108l-150 150 150 150v-108h256v108zM854 170c46 0 84 40 84 86v512c0 46-38 86-84 86h-684c-46 0-84-40-84-86v-512c0-46 38-86 84-86h136l78-84h256l78 84h136z"
],
"isMulticolor": false,
"isMulticolor2": false,
"tags": [
"switch_camera"
],
"grid": 0,
"attrs": []
},
"attrs": [],
"properties": {
"id": 741,
"order": 108,
"ligatures": "switch_camera",
"prevSize": 32,
"code": 59681,
"name": "switch-camera"
},
"setIdx": 1,
"setId": 1,
"iconIdx": 27
},
{
"icon": {
@@ -757,9 +786,9 @@
"code": 59671,
"name": "share-desktop"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 784
"setIdx": 1,
"setId": 1,
"iconIdx": 28
},
{
"icon": {
@@ -783,9 +812,9 @@
"code": 59672,
"name": "camera"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 799
"setIdx": 1,
"setId": 1,
"iconIdx": 29
},
{
"icon": {
@@ -809,9 +838,9 @@
"code": 59673,
"name": "camera-disabled"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 800
"setIdx": 1,
"setId": 1,
"iconIdx": 30
},
{
"icon": {
@@ -835,9 +864,9 @@
"code": 59674,
"name": "volume"
},
"setIdx": 0,
"setId": 2,
"iconIdx": 822
"setIdx": 1,
"setId": 1,
"iconIdx": 31
},
{
"icon": {
@@ -885,7 +914,7 @@
},
"setIdx": 1,
"setId": 1,
"iconIdx": 0
"iconIdx": 32
},
{
"icon": {
@@ -956,7 +985,7 @@
},
"setIdx": 1,
"setId": 1,
"iconIdx": 4
"iconIdx": 33
},
{
"icon": {
@@ -983,7 +1012,7 @@
},
"setIdx": 1,
"setId": 1,
"iconIdx": 12
"iconIdx": 34
},
{
"icon": {
@@ -1011,7 +1040,7 @@
},
"setIdx": 1,
"setId": 1,
"iconIdx": 13
"iconIdx": 35
},
{
"icon": {
@@ -1039,7 +1068,7 @@
},
"setIdx": 1,
"setId": 1,
"iconIdx": 22
"iconIdx": 36
}
],
"height": 1024,

182
images/logo-blue.svg Normal file
View File

@@ -0,0 +1,182 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 744.09448819 1052.3622047"
id="svg3526"
version="1.1"
inkscape:version="0.91 r13725"
inkscape:export-filename="/Users/ystamcheva/Dropbox/Designs/appLogo.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
sodipodi:docname="logo-blue.svg">
<defs
id="defs3528" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="817.30793"
inkscape:cy="496.00851"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1440"
inkscape:window-height="851"
inkscape:window-x="0"
inkscape:window-y="1"
inkscape:window-maximized="1" />
<metadata
id="metadata3531">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g4181">
<g
style="fill:#17a0db;fill-opacity:1"
transform="translate(43.272677,-6.8248629)"
id="g33">
<path
d="m 257.311,591.057 c 27.544,0 85.707,-16.445 124.179,-27.332 5.595,-1.575 10.81,-3.049 15.549,-4.371 0.767,-0.211 1.51,-0.403 2.213,-0.579 -2.161,-2.139 -5.755,-5.387 -11.612,-10.295 -25.628,-17.369 -49.827,-25.456 -76.146,-25.456 -5.741,0 -11.707,0.352 -18.208,1.088 -22.283,2.535 -40.848,7.845 -49.767,10.39 -4.521,1.296 -5.883,1.683 -7.292,1.683 -2.688,0 -4.997,-1.599 -5.9,-4.069 -0.904,-2.483 -0.13,-5.223 1.969,-6.981 l 0.127,-0.102 c 15.379,-12.883 44.032,-36.866 98.39,-47.582 9.428,-1.853 19.514,-2.796 29.968,-2.796 24.334,0 49.53,5.026 74.869,14.925 34.511,13.474 58.094,30.771 77.062,44.67 10.211,7.489 19.03,13.959 26.705,17.516 1.961,0.912 2.979,1.169 3.453,1.236 0.349,-0.452 1.106,-1.7 2.219,-4.974 0.298,-0.867 2.453,-10.019 -13.007,-62.071 -8.985,-30.217 -19.822,-61.077 -25.465,-74.778 -10.916,-26.509 -8.237,-45.296 -4.877,-56.284 -9.248,3.399 -18.701,8.688 -28.646,15.993 l -0.62,0.458 c -4.969,3.684 -10.031,7.853 -15.482,12.725 -32.074,28.718 -56.104,43.69 -71.455,44.504 l -0.423,0.021 -0.421,-0.036 c -13.524,-1.148 -34.019,-20.834 -42.403,-30.801 -1.743,-1.169 -3.729,-1.699 -6.35,-1.699 -2.632,0 -5.583,0.553 -8.438,1.095 -2.077,0.394 -4.218,0.795 -6.341,1.01 -6.767,0.679 -16.252,2.867 -25.406,4.974 -4.413,1.014 -8.967,2.063 -13.13,2.922 -0.079,0.013 -1.866,0.382 -5.06,1.224 -22.624,6.693 -39.673,14.372 -48.012,21.628 -0.091,0.079 -0.36,0.288 -0.789,0.603 -5.64,4.009 -19.199,15.447 -23.29,34.907 l -0.043,0.162 c -8.541,35.837 4.408,80.28 21.615,105.666 8.093,11.932 16.814,19.376 23.944,20.42 1.775,0.252 3.905,0.386 6.321,0.386 z"
id="path35"
inkscape:connector-curvature="0"
style="fill:#17a0db;fill-opacity:1" />
</g>
<g
style="fill:#17a0db;fill-opacity:1"
transform="translate(43.272677,-6.8248629)"
id="g37">
<path
d="m 383.729,400.995 c 0.549,0.108 1.191,0.162 1.9,0.162 14.785,0 47.804,-21.408 53.912,-31.205 l 0.486,-0.78 0.694,-0.611 c 2.083,-2.056 8.099,-12.885 11.019,-19.367 -31.312,-9.394 -34.767,-26.347 -37.821,-41.41 -0.355,-1.749 -0.667,-3.324 -0.946,-4.732 -0.357,-1.842 -0.731,-3.713 -1.052,-5.159 -46.646,15.471 -60.905,24.154 -68.687,30.611 -4.027,3.345 -6.398,12.858 5.215,39.189 5.932,13.422 26.386,31.591 35.28,33.302 z"
id="path39"
inkscape:connector-curvature="0"
style="fill:#17a0db;fill-opacity:1" />
</g>
<path
style="fill:#17a0db;fill-opacity:1"
inkscape:connector-curvature="0"
id="path43"
d="m 183.03568,710.19014 c -5.799,-6.834 -8.258,-15.447 -7.293,-25.624 4.105,-49.397 -1.525,-61.33 -4.132,-64.162 -0.629,-0.685 -0.969,-0.685 -1.238,-0.685 -0.101,0 -0.195,0.006 -0.296,0.016 -4.84,1.157 -37.441,23.198 -44.638,89.005 -3.471,31.758 2.611,72.542 7.794,97.348 4.165,-14.646 10.742,-30.779 23.483,-47.384 11.862,-15.444 24.801,-27.623 40.852,-38.298 -4.99,-2.075 -10.346,-5.274 -14.532,-10.216 z" />
<g
style="fill:#17a0db;fill-opacity:1"
transform="translate(43.272677,-6.8248629)"
id="g45">
<path
d="m 485.028,154.141 c -3.896,25.701 -10.239,50.115 -22.077,75.883 12.904,-14.609 20.445,-30.481 22.971,-48.296 1.051,-7.38 2.045,-14.439 -0.894,-27.587 z"
id="path47"
inkscape:connector-curvature="0"
style="fill:#17a0db;fill-opacity:1" />
</g>
<g
style="fill:#17a0db;fill-opacity:1"
transform="translate(43.272677,-6.8248629)"
id="g49">
<path
d="m 413.102,273.797 c 23.135,-20.915 37.22,-55.455 43.078,-75.971 -20.149,19.407 -44.636,29.82 -60.351,36.512 -5.412,2.308 -10.08,4.295 -12.878,5.926 -1.178,0.685 -2.367,1.374 -3.571,2.069 -9.533,5.515 -23.924,13.85 -26.022,18.987 l -0.06,0.167 -0.078,0.165 c -6.529,13.72 -10.208,34.352 -11.387,46.184 15.135,-9.242 30.738,-15.41 43.699,-20.529 12.03,-4.753 22.432,-8.863 27.57,-13.51 z"
id="path51"
inkscape:connector-curvature="0"
style="fill:#17a0db;fill-opacity:1" />
</g>
<g
style="fill:#17a0db;fill-opacity:1"
transform="translate(43.272677,-6.8248629)"
id="g53">
<path
d="m 436.439,291.877 c -0.141,0.357 -0.292,0.695 -0.455,1.017 -3.833,11.143 1.446,26.3 11.227,32.017 2.602,1.522 5.132,2.452 7.559,2.772 0.334,0.014 0.666,0.027 1.001,0.027 7.601,0 13.801,-5.56 18.4,-16.519 2.896,-8.34 3.308,-18.23 1.125,-27.158 -1.696,-6.936 -6.084,-15.215 -8.88,-19.343 -5.219,3.582 -15.533,11.462 -22.615,17.716 -4.946,4.777 -6.733,7.785 -7.362,9.471 z"
id="path55"
inkscape:connector-curvature="0"
style="fill:#17a0db;fill-opacity:1" />
</g>
<g
style="fill:#17a0db;fill-opacity:1"
transform="translate(43.272677,-6.8248629)"
id="g57">
<path
d="m 501.845,575.103 c 8.403,-2.29 15.076,-4.165 19.998,-5.623 -10.137,-7.061 -21.871,-15.846 -37.823,-28.253 -39.096,-30.404 -81.019,-45.826 -124.587,-45.826 -23.861,0 -44.647,4.592 -61.098,10.151 4.101,-0.255 8.271,-0.377 12.554,-0.377 5.088,0 10.42,0.179 15.842,0.541 16.949,1.136 60.616,8.845 100.106,55.931 7.956,9.469 16.507,17.307 40.828,17.307 8.679,0 18.796,-0.967 30.913,-2.959 0.749,-0.209 1.882,-0.518 3.267,-0.892 z"
id="path59"
inkscape:connector-curvature="0"
style="fill:#17a0db;fill-opacity:1" />
</g>
<g
style="fill:#17a0db;fill-opacity:1"
transform="translate(43.272677,-6.8248629)"
id="g61">
<path
d="m 557.268,369.949 c -7.755,-12.043 -17.498,-19.524 -25.41,-19.524 -1.464,0 -2.862,0.258 -4.154,0.765 -4.239,1.672 -10.952,21.042 -7.979,35.126 2.023,9.582 13.67,41.96 19.262,57.52 2.142,5.958 3.18,8.869 3.527,9.951 0.275,0.853 0.67,2.077 1.17,3.621 4.517,13.765 16.111,49.145 19.562,77.793 7.175,-30.554 11.239,-67.36 9.647,-111.409 -0.723,-20.199 -6.274,-39.323 -15.625,-53.843 z"
id="path63"
inkscape:connector-curvature="0"
style="fill:#17a0db;fill-opacity:1" />
</g>
<g
style="fill:#17a0db;fill-opacity:1"
transform="translate(43.272677,-6.8248629)"
id="g65">
<path
d="m 412.08,575.289 c -0.153,-0.2 -0.3,-0.397 -0.445,-0.585 -0.614,0.1 -1.616,0.319 -3.185,0.776 l -0.657,0.197 c -8.011,2.95 -22.707,7.908 -39.694,13.64 -20.387,6.87 -43.477,14.659 -62.808,21.595 -24.596,9.165 -32.572,12.781 -35.073,14.048 -0.454,1.218 -0.963,2.772 -1.53,4.486 -5.817,17.705 -19.139,58.23 -84.831,86.562 13.568,13.744 43.101,38.415 101.24,38.415 5.035,0 10.258,-0.188 15.494,-0.566 43.896,-3.121 85.158,-22.544 116.206,-54.673 28.233,-29.21 44.259,-65.641 44.507,-100.76 -6.871,-0.571 -18.519,-2.281 -29.301,-7.4 -0.125,-0.061 -12.447,-6.002 -19.923,-15.735 z"
id="path67"
inkscape:connector-curvature="0"
style="fill:#17a0db;fill-opacity:1" />
</g>
<g
style="fill:#17a0db;fill-opacity:1"
transform="translate(43.272677,-6.8248629)"
id="g69">
<path
d="m 162.104,639.109 c -0.122,10.334 -1.489,20.245 -2.82,29.907 -0.716,5.216 -1.464,10.615 -2.014,16.041 -0.746,10.914 1.612,14.717 2.659,15.829 0.571,0.629 1.513,1.346 3.536,1.346 1.558,0 3.418,-0.432 5.383,-1.251 19.507,-8.176 38.032,-22.367 46.937,-30.243 -13.668,-6.095 -34.689,-19.26 -53.681,-31.629 z"
id="path71"
inkscape:connector-curvature="0"
style="fill:#17a0db;fill-opacity:1" />
</g>
<g
style="fill:#17a0db;fill-opacity:1"
transform="translate(43.272677,-6.8248629)"
id="g73">
<path
d="m 484.26,598.224 c -0.552,7.258 -1.737,20.949 -3.631,31.378 -2.295,12.629 -6.095,23.31 -8.305,28.889 3.945,3.648 7.878,7.228 10.429,9.488 10.265,-6.718 43.961,-32.297 67.208,-90.368 -7.447,5.03 -17.906,9.456 -31.465,13.332 -13.797,3.929 -27.204,6.229 -34.236,7.281 z"
id="path75"
inkscape:connector-curvature="0"
style="fill:#17a0db;fill-opacity:1" />
</g>
<g
transform="translate(43.272677,-6.8248629)"
id="g85"
style="fill:#17a0db;fill-opacity:1">
<path
style="fill:#17a0db;fill-opacity:1"
inkscape:connector-curvature="0"
id="path87"
d="M 627.562,350.519 C 613.5,321.124 593.893,306.283 580.351,297.677 568.965,290.444 555.872,285.188 541.339,282 c -1.622,-10.158 -4.397,-20.542 -8.198,-30.646 24.507,-36.531 30.407,-77.605 17.008,-119.213 C 539.858,100.151 531.868,79.524 524.996,67.213 510.15,40.585 489.58,34.997 474.936,34.997 c -15.09,0 -29.538,6.412 -39.667,17.61 -10.37,11.462 -15.213,26.462 -13.634,42.228 1.349,13.446 -2.178,37.872 -4.519,46.594 -0.04,0.117 -4.202,11.776 -35.168,26.784 -0.746,0.268 -2.332,0.811 -4.773,1.629 -17.812,5.965 -50.913,17.062 -72.963,46.219 -16.847,20.407 -20.985,40.629 -25.766,64.036 -2.858,13.955 -5.846,32.187 -5.105,53.745 -55.35,12.291 -95.226,37.338 -118.609,74.54 -24.203,38.52 -28.402,86.272 -12.468,141.993 l 0.14,0.414 c 0.292,1.014 0.6,2.024 0.921,3.03 -2.718,-0.466 -5.465,-0.858 -8.285,-1.169 -2.469,-0.284 -5.015,-0.42 -7.54,-0.42 -27.636,0 -57.043,17.371 -78.666,46.474 -16.427,22.098 -36.156,61.131 -36.852,121.593 -0.523,44.905 4.279,86.306 14.283,123.054 7.461,27.381 15.784,44.202 18.979,50.09 l 67.793,127.079 31.06,-140.731 c 10.6,-47.935 21.066,-68.283 34.571,-81.732 31.425,18.938 68.541,28.901 107.941,28.901 43.919,0 89.715,-12.667 128.934,-35.662 25.477,-14.954 47.193,-33.324 64.629,-54.658 0.236,0 0.469,0 0.704,0 l 1.857,-0.038 c 10.782,-0.365 25.522,-5.697 40.434,-14.63 12.421,-7.433 31.147,-21.108 49.946,-44.064 18.945,-23.155 34.402,-51.324 45.926,-83.731 13.5,-37.939 21.717,-82.115 24.404,-131.272 3.253,-45.723 -2.078,-83.533 -15.881,-112.384 z m -31.124,109.427 c -2.415,44.805 -9.745,84.66 -21.764,118.441 -9.713,27.302 -22.502,50.739 -38.005,69.69 -26.696,32.611 -52.783,41.355 -55.551,41.465 l -0.22,0 c -2.528,0 -4.012,-1.032 -11.095,-5.988 -1.979,-1.379 -4.969,-3.467 -7.436,-5.075 -14.813,28.811 -39.145,53.701 -70.659,72.185 -32.098,18.824 -69.432,29.202 -105.1,29.202 -42.352,0 -79.532,-13.979 -107.842,-40.493 -38.621,24.556 -61.833,45.044 -80.652,130.273 l -3.562,16.157 -7.787,-14.59 C 84.8,867.621 78.058,854.32 71.708,830.982 62.852,798.444 58.598,761.384 59.071,720.842 c 0.944,-80.909 44.373,-121.518 68.427,-121.518 0.792,0 1.578,0.039 2.328,0.128 22.8,2.551 37.699,12.402 64.745,30.291 2.796,1.853 5.74,3.8 8.843,5.838 9.69,6.36 23.387,14.125 26.835,14.791 6.562,-0.381 12.986,-15.079 14.853,-28.713 0.114,-0.829 0.226,-1.598 0.334,-2.315 0.147,-1.612 0.227,-3.03 0.27,-4.194 -1.144,-0.399 -2.333,-0.869 -3.547,-1.403 l -0.27,-0.091 c -17.012,-5.857 -41.868,-34.625 -54.378,-76.385 -12.081,-42.21 -9.691,-77.122 7.099,-103.83 27.221,-43.328 86.307,-53.515 105.849,-56.861 6.109,-1.214 12.498,-2.351 18.999,-3.378 3.035,-0.762 5.11,-1.399 6.449,-1.978 0.58,-0.403 0.835,-0.833 0.439,-2.403 l 0.53,-0.148 -0.513,0.115 c -0.237,-1.065 -0.565,-2.311 -0.941,-3.753 -0.521,-1.997 -1.103,-4.256 -1.705,-6.936 -6.05,-27.141 -2.962,-49.884 0.863,-68.559 4.297,-21.019 6.678,-32.656 16.605,-44.279 13.152,-18.103 36.803,-26.025 50.953,-30.77 3.948,-1.322 7.359,-2.462 9.331,-3.412 43.344,-20.789 57.145,-42.646 61.091,-57.318 3.127,-11.642 8.084,-42.253 5.931,-63.63 -0.239,-2.425 0.326,-4.421 1.695,-5.935 1.215,-1.341 2.942,-2.104 4.748,-2.104 4.061,0 9.623,0 30.377,64.478 10.949,33.996 2.785,65.868 -24.244,94.74 -0.347,0.375 -0.7,0.742 -1.04,1.095 -0.738,0.76 -1.848,1.909 -1.999,2.326 0.006,0 -0.048,1.042 1.755,4.031 11.425,18.864 17.633,42.323 15.832,59.763 -0.429,4.062 -1.206,7.971 -1.879,11.411 -0.4,1.968 -0.879,4.377 -1.126,6.241 0.111,0 0.226,0 0.347,0 3.088,-0.327 7.867,-0.7 13.628,-0.7 13.556,0 32.969,2.077 48.503,11.951 9.382,5.952 21.255,15.137 29.981,33.404 10.281,21.472 14.096,51.453 11.369,89.114 z" />
</g>
</g>
<path
style="fill:#ffffff"
d=""
id="path3618"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -2,6 +2,7 @@
<head>
<meta charset="utf-8">
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!--#include virtual="base.html" -->
<script>
window.indexLoadedTime = window.performance.now();
@@ -28,9 +29,90 @@
&& criticalFiles.some(
function(file) { return fileRef.indexOf(file) !== -1 })) {
window.onload = function() {
// The whole complex part below implements page reloads with
// "exponential backoff". The retry attempt is passes as
// "rCounter" query parameter
var href = window.location.href;
var retryMatch = href.match(/.+(\?|&)rCounter=(\d+)/);
var retryCountStr = retryMatch ? retryMatch[2] : "0";
var retryCount = Number.parseInt(retryCountStr);
if (retryMatch == null) {
var separator = href.indexOf("?") === -1 ? "?" : "&";
var hashIdx = href.indexOf("#");
if (hashIdx === -1) {
href += separator + "rCounter=1";
} else {
var hashPart = href.substr(hashIdx);
href = href.substr(0, hashIdx)
+ separator + "rCounter=1" + hashPart;
}
} else {
var separator = retryMatch[1];
href = href.replace(
/(\?|&)rCounter=(\d+)/,
separator + "rCounter=" + (retryCount + 1));
}
var delay = Math.pow(2, retryCount) * 2000;
if (isNaN(delay) || delay < 2000 || delay > 60000)
delay = 10000;
var showMoreText = "show more";
var showLessText = "show less";
document.body.innerHTML
= "The application failed to load, missing file: "
+ fileRef;
= "<div style='"
+ "position: absolute;top: 50%;left: 50%;"
+ "text-align: center;"
+ "font-size: medium;"
+ "font-weight: 400;"
+ "transform: translate(-50%, -50%)'>"
+ "Uh oh! We couldn't fully download everything we needed :(" // jshint ignore:line
+ "<br/> "
+ "We will try again shortly. In the mean time, check for problems with your Internet connection!" // jshint ignore:line
+ "<br/><br/> "
+ "<div id='moreInfo' style='"
+ "display: none;'>" + "Missing " + fileRef
+ "<br/><br/></div>"
+ "<a id='showMore' style='"
+ "text-decoration: underline;"
+ "font-size:small;"
+ "cursor: pointer'>" + showMoreText + "</a>"
+ "&nbsp;&nbsp;&nbsp;"
+ "<a href='" + href + "' style='"
+ "text-decoration: underline;"
+ "font-size:small;"
+ "'>reload now</a>"
+ "</div>";
var showMoreElem = document.getElementById("showMore");
showMoreElem.addEventListener('click', function () {
var moreInfoElem
= document.getElementById("moreInfo");
if (showMoreElem.innerHTML === showMoreText) {
moreInfoElem.setAttribute(
"style",
"display: block;"
+ "color:#FF991F;"
+ "font-size:small;"
+ "user-select:text;");
showMoreElem.innerHTML = showLessText;
}
else {
moreInfoElem.setAttribute(
"style", "display: none;");
showMoreElem.innerHTML = showMoreText;
}
});
window.setTimeout(
function () { window.location.replace(href); }, delay);
};
window.removeEventListener(
'error', loadErrHandler, true /* capture phase */);

View File

@@ -11,6 +11,8 @@ var interfaceConfig = { // eslint-disable-line no-unused-vars
DEFAULT_LOCAL_DISPLAY_NAME: "me",
SHOW_JITSI_WATERMARK: true,
JITSI_WATERMARK_LINK: "https://jitsi.org",
// if watermark is disabled by default, it can be shown only for guests
SHOW_WATERMARK_FOR_GUESTS: true,
SHOW_BRAND_WATERMARK: false,
BRAND_WATERMARK_LINK: "",
SHOW_POWERED_BY: false,
@@ -53,6 +55,8 @@ var interfaceConfig = { // eslint-disable-line no-unused-vars
* Whether to only show the filmstrip (and hide the toolbar).
*/
filmStripOnly: false,
//A html text to be shown to guests on the close page, false disables it
CLOSE_PAGE_GUEST_HINT: false,
RANDOM_AVATAR_URL_PREFIX: false,
RANDOM_AVATAR_URL_SUFFIX: false,
FILM_STRIP_MAX_HEIGHT: 120,

View File

@@ -1,12 +0,0 @@
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'jitsi-meet-react' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for jitsi-meet-react
pod 'Crashlytics'
pod 'Fabric'
end

View File

@@ -1,16 +0,0 @@
PODS:
- Crashlytics (3.8.3):
- Fabric (~> 1.6.3)
- Fabric (1.6.11)
DEPENDENCIES:
- Crashlytics
- Fabric
SPEC CHECKSUMS:
Crashlytics: 2b6dbe138a42395577cfa73dfa1aa7248cadf39e
Fabric: 5911403591946b8228ab1c51d98f1d7137e863c6
PODFILE CHECKSUM: 672d557f679f28c07b3364884b4580e605000f01
COCOAPODS: 1.1.1

View File

@@ -8,11 +8,35 @@
*/
#import "AppDelegate.h"
#import <Crashlytics/Crashlytics.h>
#import <Fabric/Fabric.h>
#import "RCTBundleURLProvider.h"
#import "RCTLinkingManager.h"
#import "RCTRootView.h"
#import <React/RCTAssert.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTLinkingManager.h>
#import <React/RCTRootView.h>
/**
* A <tt>RCTFatalHandler</tt> implementation which swallows JavaScript errors.
* In the Release configuration, React Native will (intentionally) raise an
* unhandled NSException for an unhandled JavaScript error. This will
* effectively kill the application. <tt>_RCTFatal</tt> is suitable to be in
* accord with the Web i.e. not kill the application.
*/
RCTFatalHandler _RCTFatal = ^(NSError *error) {
id jsStackTrace = error.userInfo[RCTJSStackTraceKey];
@try {
NSString *name
= [NSString stringWithFormat:@"%@: %@",
RCTFatalExceptionName,
error.localizedDescription];
NSString *message
= RCTFormatError(error.localizedDescription, jsStackTrace, 75);
[NSException raise:name format:@"%@", message];
} @catch (NSException *e) {
if (!jsStackTrace) {
@throw;
}
}
};
@implementation AppDelegate
@@ -29,7 +53,15 @@ continueUserActivity:(NSUserActivity *)userActivity
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[Fabric with:@[[Crashlytics class]]];
#if !DEBUG
// In the Release configuration, React Native will (intentionally) raise an
// unhandled NSException for an unhandled JavaScript error. This will
// effectively kill the application. In accord with the Web, do not kill the
// application.
if (!RCTGetFatalHandler()) {
RCTSetFatalHandler(_RCTFatal);
}
#endif
NSURL *jsCodeLocation
= [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios"

134
ios/app/AudioMode.m Normal file
View File

@@ -0,0 +1,134 @@
#import "RCTBridgeModule.h"
#import "RCTLog.h"
#import <AVFoundation/AVFoundation.h>
@interface AudioMode : NSObject<RCTBridgeModule>
@end
@implementation AudioMode {
NSString *_category;
NSString *_mode;
}
RCT_EXPORT_MODULE();
typedef enum {
kAudioModeDefault,
kAudioModeAudioCall,
kAudioModeVideoCall
} JitsiMeetAudioMode;
- (NSDictionary *)constantsToExport {
return @{
@"AUDIO_CALL" : [NSNumber numberWithInt: kAudioModeAudioCall],
@"DEFAULT" : [NSNumber numberWithInt: kAudioModeDefault],
@"VIDEO_CALL" : [NSNumber numberWithInt: kAudioModeVideoCall]
};
};
- (instancetype)init {
self = [super init];
if (self) {
_category = nil;
_mode = nil;
}
return self;
}
- (dispatch_queue_t)methodQueue {
// Make sure all our methods run in the main thread. The route change
// notification runs there so this will make sure it will only be fired
// after our changes have been applied (when we cause them, that is).
return dispatch_get_main_queue();
}
- (void)routeChanged:(NSNotification*)notification {
NSInteger reason
= [[notification.userInfo
valueForKey:AVAudioSessionRouteChangeReasonKey]
integerValue];
switch (reason) {
case AVAudioSessionRouteChangeReasonCategoryChange:
// The category has changed. Check if it's the one we want and adjust as
// needed.
[self setCategory:_category mode:_mode error:nil];
break;
default:
// Do nothing.
break;
}
}
- (BOOL)setCategory:(NSString *)category
mode:(NSString *)mode
error:(NSError * _Nullable *)outError {
AVAudioSession *session = [AVAudioSession sharedInstance];
if (session.category != category
&& ![session setCategory:category error:outError]) {
RCTLogError(@"Failed to (re)apply specified AVAudioSession category!");
return NO;
}
if (session.mode != mode && ![session setMode:mode error:outError]) {
RCTLogError(@"Failed to (re)apply specified AVAudioSession mode!");
return NO;
}
return YES;
}
RCT_EXPORT_METHOD(setMode:(int)mode
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
NSString *avCategory;
NSString *avMode;
NSError *error;
switch (mode) {
case kAudioModeAudioCall:
avCategory = AVAudioSessionCategoryPlayAndRecord;
avMode = AVAudioSessionModeVoiceChat;
break;
case kAudioModeDefault:
avCategory = AVAudioSessionCategorySoloAmbient;
avMode = AVAudioSessionModeDefault;
break;
case kAudioModeVideoCall:
avCategory = AVAudioSessionCategoryPlayAndRecord;
avMode = AVAudioSessionModeVideoChat;
break;
default:
reject(@"setMode", @"Invalid mode", nil);
return;
}
if (![self setCategory:avCategory mode:avMode error:&error] || error) {
reject(@"setMode", error.localizedDescription, error);
return;
}
// Even though the specified category and mode were successfully set, the
// AVAudioSession is a singleton and other parts of the application such as
// WebRTC may undo the settings. Make sure that the settings are reapplied
// upon undoes.
if (!_category || !_mode) {
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(routeChanged:)
name:AVAudioSessionRouteChangeNotification
object:nil];
}
// Save the desired/specified category and mode so that they may be
// reapplied (upon undoes as described above).
_category = avCategory;
_mode = avMode;
resolve(nil);
}
@end

View File

@@ -17,25 +17,24 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<string>1.2</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLName</key>
<string>org.jitsi.meet</string>
<key>CFBundleURLSchemes</key>
<array>
<string>org.jitsi.meet</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>1</string>
<key>Fabric</key>
<dict>
<key>APIKey</key>
<string>a8ae24a58302ba79da1d312138e941f6b86e3242</string>
<key>Kits</key>
<array>
<dict>
<key>KitInfo</key>
<dict/>
<key>KitName</key>
<string>Crashlytics</string>
</dict>
</array>
</dict>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>
@@ -57,11 +56,11 @@
</dict>
</dict>
<key>NSCameraUsageDescription</key>
<string></string>
<string>Participate in conferences with video.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<key>NSMicrophoneUsageDescription</key>
<string></string>
<string>Participate in conferences with audio.</string>
<key>UIAppFonts</key>
<array>
<string>jitsi.ttf</string>

66
ios/app/POSIX.m Normal file
View File

@@ -0,0 +1,66 @@
#import "RCTBridgeModule.h"
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
@interface POSIX : NSObject<RCTBridgeModule>
@end
@implementation POSIX
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(getaddrinfo:(NSString *)hostname
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
int err;
struct addrinfo *res;
NSString *rejectCode;
if (0 == (err = getaddrinfo(hostname.UTF8String, NULL, NULL, &res))) {
int af = res->ai_family;
struct sockaddr *sa = res->ai_addr;
void *addr;
switch (af) {
case AF_INET:
addr = &(((struct sockaddr_in *) sa)->sin_addr);
break;
case AF_INET6:
addr = &(((struct sockaddr_in6 *) sa)->sin6_addr);
break;
default:
addr = NULL;
break;
}
if (addr) {
char v[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
if (inet_ntop(af, addr, v, sizeof(v))) {
resolve([NSString stringWithUTF8String:v]);
} else {
err = errno;
rejectCode = @"inet_ntop";
}
} else {
err = EAFNOSUPPORT;
rejectCode = @"EAFNOSUPPORT";
}
freeaddrinfo(res);
} else {
rejectCode = @"getaddrinfo";
}
if (0 != err) {
NSError *error
= [NSError errorWithDomain:NSPOSIXErrorDomain
code:err
userInfo:nil];
reject(rejectCode, error.localizedDescription, error);
}
}
@end

View File

@@ -5,8 +5,10 @@
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:beta.meet.jit.si</string>
<string>applinks:beta.hipchat.me</string>
<string>applinks:chaos.hipchat.me</string>
<string>applinks:enso.me</string>
<string>applinks:hipchat.me</string>
<string>applinks:meet.jit.si</string>
</array>
</dict>

View File

@@ -13,6 +13,7 @@
00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };
00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
0B42DFAE1E2FD90700111B12 /* AudioMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B42DFAD1E2FD90700111B12 /* AudioMode.m */; };
133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
@@ -23,9 +24,12 @@
146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
2602576C1D0A7703001E3363 /* jitsi.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2602576B1D0A7703001E3363 /* jitsi.ttf */; };
3847F11906B4479A9162628F /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 821D8ABD506944B4BDBB069B /* libRNVectorIcons.a */; };
5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
901FE90FA5744B5B94DCDC41 /* libKCKeepAwake.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0EA8C046B2BF46279796F07D /* libKCKeepAwake.a */; };
B30EF2311DC0ED7C00690F45 /* WebRTC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B30EF2301DC0ED7C00690F45 /* WebRTC.framework */; };
B30EF2331DC0EEA500690F45 /* WebRTC.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B30EF2301DC0ED7C00690F45 /* WebRTC.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
B3A9D0251E0481E10009343D /* POSIX.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9D0241E0481E10009343D /* POSIX.m */; };
BF9643821C34FBB300B0BBDF /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643811C34FBB300B0BBDF /* AVFoundation.framework */; };
BF9643841C34FBBB00B0BBDF /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643831C34FBBB00B0BBDF /* AudioToolbox.framework */; };
BF9643861C34FBC100B0BBDF /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643851C34FBC100B0BBDF /* CoreGraphics.framework */; };
@@ -75,6 +79,13 @@
remoteGlobalIDString = 832C81801AAF6DEF007FA2F7;
remoteInfo = RCTVibration;
};
0B8752851E26E54A004C5CAB /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 5B09C20C78C74A548AAAC1FA /* KCKeepAwake.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 134814201AA4EA6300B7C361;
remoteInfo = KCKeepAwake;
};
139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
@@ -103,6 +114,62 @@
remoteGlobalIDString = 5DBEB1501B18CEA900B34395;
remoteInfo = RNVectorIcons;
};
3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3D3C059A1DE3340900C268FA;
remoteInfo = yoga;
};
3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3D3C06751DE3340C00C268FA;
remoteInfo = "yoga-tvOS";
};
3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4;
remoteInfo = cxxreact;
};
3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;
remoteInfo = "cxxreact-tvOS";
};
3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4;
remoteInfo = jschelpers;
};
3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4;
remoteInfo = "jschelpers-tvOS";
};
5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 134814201AA4EA6300B7C361;
remoteInfo = RCTAnimation;
};
5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 2D2A28201D9B03D100D4039D;
remoteInfo = "RCTAnimation-tvOS";
};
78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
@@ -196,6 +263,8 @@
00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = "<group>"; };
00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = "<group>"; };
00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = "<group>"; };
0B42DFAD1E2FD90700111B12 /* AudioMode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AudioMode.m; path = app/AudioMode.m; sourceTree = "<group>"; };
0EA8C046B2BF46279796F07D /* libKCKeepAwake.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libKCKeepAwake.a; sourceTree = "<group>"; };
139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = "<group>"; };
139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = "<group>"; };
13B07F961A680F5B00A75B9A /* jitsi-meet-react.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "jitsi-meet-react.app"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -208,10 +277,13 @@
146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
22418656B14845609F953A42 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = "<group>"; };
2602576B1D0A7703001E3363 /* jitsi.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = jitsi.ttf; path = ../android/app/src/main/assets/fonts/jitsi.ttf; sourceTree = "<group>"; };
5B09C20C78C74A548AAAC1FA /* KCKeepAwake.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = KCKeepAwake.xcodeproj; path = "../node_modules/react-native-keep-awake/ios/KCKeepAwake.xcodeproj"; sourceTree = "<group>"; };
5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
821D8ABD506944B4BDBB069B /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = "<group>"; };
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
B30EF2301DC0ED7C00690F45 /* WebRTC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebRTC.framework; path = "../node_modules/react-native-webrtc/ios/WebRTC.framework"; sourceTree = "<group>"; };
B3A9D0241E0481E10009343D /* POSIX.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = POSIX.m; path = app/POSIX.m; sourceTree = "<group>"; };
B3B083EB1D4955FF0069CEE7 /* jitsi-meet-react.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "jitsi-meet-react.entitlements"; sourceTree = "<group>"; };
B96AF9B6FBC0453798399985 /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = "<group>"; };
BF9643811C34FBB300B0BBDF /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
@@ -245,6 +317,7 @@
BF96438E1C34FBE100B0BBDF /* VideoToolbox.framework in Frameworks */,
146834051AC3E58100842450 /* libReact.a in Frameworks */,
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */,
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,
133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,
@@ -255,6 +328,7 @@
BFC745141CB829B300673F38 /* libRCTWebRTC.a in Frameworks */,
139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
3847F11906B4479A9162628F /* libRNVectorIcons.a in Frameworks */,
901FE90FA5744B5B94DCDC41 /* libKCKeepAwake.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -303,6 +377,14 @@
name = Products;
sourceTree = "<group>";
};
0B8752821E26E54A004C5CAB /* Products */ = {
isa = PBXGroup;
children = (
0B8752861E26E54A004C5CAB /* libKCKeepAwake.a */,
);
name = Products;
sourceTree = "<group>";
};
139105B71AF99BAD00B5F7CC /* Products */ = {
isa = PBXGroup;
children = (
@@ -326,11 +408,13 @@
children = (
13B07FAF1A68108700A75B9A /* AppDelegate.h */,
13B07FB01A68108700A75B9A /* AppDelegate.m */,
0B42DFAD1E2FD90700111B12 /* AudioMode.m */,
13B07FB51A68108700A75B9A /* Images.xcassets */,
13B07FB61A68108700A75B9A /* Info.plist */,
13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
008F07F21AC5B25A0029DE68 /* main.jsbundle */,
13B07FB71A68108700A75B9A /* main.m */,
B3A9D0241E0481E10009343D /* POSIX.m */,
);
name = app;
sourceTree = "<group>";
@@ -339,7 +423,13 @@
isa = PBXGroup;
children = (
146834041AC3E56700842450 /* libReact.a */,
B3BA19EF1DC6B37B00BCD481 /* libReact-tvOS.a */,
B3BA19EF1DC6B37B00BCD481 /* libReact.a */,
3DAD3EA51DF850E9000B6D8A /* libyoga.a */,
3DAD3EA71DF850E9000B6D8A /* libyoga.a */,
3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,
3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */,
3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */,
3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */,
);
name = Products;
sourceTree = "<group>";
@@ -352,6 +442,15 @@
name = Products;
sourceTree = "<group>";
};
5E91572E1DD0AC6500FF2AA8 /* Products */ = {
isa = PBXGroup;
children = (
5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */,
5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
};
6956B374CC3C453DB7B8E82D /* Resources */ = {
isa = PBXGroup;
children = (
@@ -373,10 +472,12 @@
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
isa = PBXGroup;
children = (
5B09C20C78C74A548AAAC1FA /* KCKeepAwake.xcodeproj */,
BF96438F1C34FBEB00B0BBDF /* libc.tbd */,
BF9643911C34FBF100B0BBDF /* libsqlite3.tbd */,
BF9643931C34FBF900B0BBDF /* libstdc++.tbd */,
00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,
00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,
00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,
@@ -458,7 +559,6 @@
13B07F8E1A680F5B00A75B9A /* Resources */,
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
B30EF2341DC0EEA500690F45 /* Embed Frameworks */,
B3DBBAC41DC6A3BE001DA4DD /* ShellScript */,
B35383AD1DDA0083008F406A /* ShellScript */,
);
buildRules = (
@@ -476,7 +576,7 @@
83CBB9F71A601CBA00E9B192 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0800;
LastUpgradeCheck = 0820;
ORGANIZATIONNAME = Facebook;
TargetAttributes = {
13B07F861A680F5B00A75B9A = {
@@ -501,10 +601,18 @@
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = 0B8752821E26E54A004C5CAB /* Products */;
ProjectRef = 5B09C20C78C74A548AAAC1FA /* KCKeepAwake.xcodeproj */;
},
{
ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;
ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
},
{
ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */;
ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;
},
{
ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;
ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
@@ -593,6 +701,13 @@
remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B8752861E26E54A004C5CAB /* libKCKeepAwake.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libKCKeepAwake.a;
remoteRef = 0B8752851E26E54A004C5CAB /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@@ -621,6 +736,62 @@
remoteRef = 26D58A061D0B42EE00FC396B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libyoga.a;
remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libyoga.a;
remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libcxxreact.a;
remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libcxxreact.a;
remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libjschelpers.a;
remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libjschelpers.a;
remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRCTAnimation.a;
remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libRCTAnimation-tvOS.a";
remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@@ -677,10 +848,10 @@
remoteRef = B3BA19EA1DC6B37B00BCD481 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
B3BA19EF1DC6B37B00BCD481 /* libReact-tvOS.a */ = {
B3BA19EF1DC6B37B00BCD481 /* libReact.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libReact-tvOS.a";
path = libReact.a;
remoteRef = B3BA19EE1DC6B37B00BCD481 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
@@ -735,19 +906,6 @@
shellPath = /bin/sh;
shellScript = "APP_PATH=\"${TARGET_BUILD_DIR}/${WRAPPER_NAME}\"\n\n# This script loops through the frameworks embedded in the application and\n# removes unused architectures.\nfind \"$APP_PATH\" -name '*.framework' -type d | while read -r FRAMEWORK\ndo\nFRAMEWORK_EXECUTABLE_NAME=$(defaults read \"$FRAMEWORK/Info.plist\" CFBundleExecutable)\nFRAMEWORK_EXECUTABLE_PATH=\"$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME\"\necho \"Executable is $FRAMEWORK_EXECUTABLE_PATH\"\n\nEXTRACTED_ARCHS=()\n\nfor ARCH in $ARCHS\ndo\necho \"Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME\"\nlipo -extract \"$ARCH\" \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\"\nEXTRACTED_ARCHS+=(\"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\")\ndone\n\necho \"Merging extracted architectures: ${ARCHS}\"\nlipo -o \"$FRAMEWORK_EXECUTABLE_PATH-merged\" -create \"${EXTRACTED_ARCHS[@]}\"\nrm \"${EXTRACTED_ARCHS[@]}\"\n\necho \"Replacing original executable with thinned version\"\nrm \"$FRAMEWORK_EXECUTABLE_PATH\"\nmv \"$FRAMEWORK_EXECUTABLE_PATH-merged\" \"$FRAMEWORK_EXECUTABLE_PATH\"\n\ndone";
};
B3DBBAC41DC6A3BE001DA4DD /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Fabric/run\" a8ae24a58302ba79da1d312138e941f6b86e3242 256ed316263eb534e26a1ad5dcc42ca9c179af5937dd864c3e44cfefa2e8b54c";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -755,6 +913,8 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B3A9D0251E0481E10009343D /* POSIX.m in Sources */,
0B42DFAE1E2FD90700111B12 /* AudioMode.m in Sources */,
13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
13B07FC11A68108700A75B9A /* main.m in Sources */,
);
@@ -792,10 +952,11 @@
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS/**",
"$(SRCROOT)/../node_modules/react-native-keep-awake/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
);
INFOPLIST_FILE = app/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
@@ -827,10 +988,11 @@
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS/**",
"$(SRCROOT)/../node_modules/react-native-keep-awake/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
);
INFOPLIST_FILE = app/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
@@ -859,15 +1021,19 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
@@ -884,6 +1050,7 @@
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native-keep-awake/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
);
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
@@ -906,8 +1073,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -915,6 +1084,7 @@
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
@@ -925,6 +1095,7 @@
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native-keep-awake/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
);
IPHONEOS_DEPLOYMENT_TARGET = 8.0;

View File

@@ -1,11 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0800"
LastUpgradeVersion = "0820"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
parallelizeBuildables = "NO"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "83CBBA2D1A601D0E00E9B192"
BuildableName = "libReact.a"
BlueprintName = "React"
ReferencedContainer = "container:../node_modules/react-native/React/React.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"

View File

@@ -4,7 +4,4 @@
<FileRef
location = "group:jitsi-meet-react.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

View File

@@ -2,12 +2,14 @@
"en": "Английски",
"bg": "Български",
"de": "Немски",
"es": "",
"es": "Испански",
"fr": "Френски",
"hy": "",
"hy": "Арменски",
"it": "Италиански",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"sk": "Словашки",
"sl": "Словенски",
"sv": "Шведски",

View File

@@ -2,12 +2,14 @@
"en": "Inglés",
"bg": "Búlgaro",
"de": "Alemán",
"es": "",
"es": "Español",
"fr": "Francés",
"hy": "",
"hy": "Armenio",
"it": "Italiano",
"oc": "",
"ptBR": "",
"oc": "Occitano",
"pl": "Polaco",
"ptBR": "Portugués (Brasil)",
"ru": "Ruso",
"sk": "Eslovaco",
"sl": "Esloveno",
"sv": "Sueco",

View File

@@ -7,7 +7,9 @@
"hy": "Arménien",
"it": "Italien",
"oc": "Occitan",
"pl": "Polonais",
"ptBR": "Portugais (Brésil)",
"ru": "Russe",
"sk": "Slovaque",
"sl": "Slovène",
"sv": "Suédois",

View File

@@ -7,7 +7,9 @@
"hy": "",
"it": "Italiano",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"sk": "Slovacco",
"sl": "Sloveno",
"sv": "",

View File

@@ -7,7 +7,9 @@
"hy": "Ormiański",
"it": "Włoski",
"oc": "Prowansalski",
"pl": "Polski",
"ptBR": "portugalski (brazylijski)",
"ru": "Rosyjski",
"sk": "Słowacki",
"sl": "Słoweński",
"sv": "Szwedzki",

View File

@@ -1,15 +1,17 @@
{
"en": "",
"bg": "",
"de": "",
"es": "",
"fr": "",
"hy": "",
"it": "",
"oc": "",
"ptBR": "",
"sk": "",
"sl": "",
"sv": "",
"tr": ""
"en": "English (английский)",
"bg": "Болгарский",
"de": "Немецкий",
"es": "Испанский",
"fr": "Французский",
"hy": "Армянский",
"it": "Итальянский",
"oc": "Окситанский",
"pl": "",
"ptBR": "Португальский (Бразилия)",
"ru": "",
"sk": "Словацкий",
"sl": "Словенский",
"sv": "Шведский",
"tr": "Турецкий"
}

View File

@@ -7,7 +7,9 @@
"hy": "",
"it": "Taliančina",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"sk": "Slovenčina",
"sl": "Slovinčina",
"sv": "",

View File

@@ -7,7 +7,9 @@
"hy": "",
"it": "Italjanščina",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"sk": "",
"sl": "Slovenščina",
"sv": "",

View File

@@ -7,7 +7,9 @@
"hy": "",
"it": "Italienska",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"sk": "Slovakiska",
"sl": "Slovenska",
"sv": "",

View File

@@ -7,7 +7,9 @@
"hy": "",
"it": "",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"sk": "",
"sl": "",
"sv": "",

View File

@@ -1,17 +1,19 @@
{
"contactlist": "СПИСЪК С КОНТАКТИ",
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "Настройки на връзката",
"poweredby": "powered by",
"downloadlogs": "Изтегли логовете",
"feedback": "Кажете ни как върви",
"roomUrlDefaultMsg": "Конференцията се създава...",
"participant": "Участник",
"inviteUrlDefaultMsg": "Конференцията се създава...",
"me": "аз",
"speaker": "Говорител",
"raisedHand": "",
"defaultNickname": "Яна Розова",
"defaultLink": "например __url__",
"calling": "Обаждане към __name__ ...",
"callingName": "",
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -23,17 +25,18 @@
"nwjsGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "Клавишни комбинации:",
"raiseHand": "Вдигни ръка.",
"pushToTalk": "Push to talk.",
"toggleScreensharing": "Смяна между камера и споделен екран.",
"toggleFilmstrip": "Показване/скриване на лентата с видеата.",
"toggleShortcuts": "Показване/скриване на това меню.",
"focusLocal": "Фокусиране върху нашето видео.",
"focusRemote": "Фокусиране върху видео на участник.",
"toggleChat": "Отваряне/скриване на чат панела.",
"mute": "Спиране/пускане на микрофона.",
"videoMute": "Спиране/пускане на нашето видео."
"keyboardShortcuts": "",
"raiseHand": "",
"pushToTalk": "",
"toggleScreensharing": "",
"toggleFilmstrip": "",
"toggleShortcuts": "",
"focusLocal": "",
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
},
"welcomepage": {
"go": "Влез",
@@ -72,33 +75,45 @@
"content": "Научете повече за своите потребители като интегрирате лесно Piwik, Google Analytics и други статистики за изполването."
}
},
"startupoverlay": {
"policyText": "",
"title": ""
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"mute": "Включи / Изключи микрофона",
"videomute": "Включи / Изключи камерата",
"videomute": "",
"authenticate": "Идентификация",
"lock": "Заключи / отключи стаята",
"invite": "Покани други",
"chat": "Отвори / затвори чат",
"etherpad": "Покажи споделения документ",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "Сподели YouTube видео",
"sharescreen": "Сподели екрана",
"fullscreen": "Влез / Излез от Пълен екран",
"sharescreen": "",
"fullscreen": "",
"sip": "Обади се на SIP номер",
"Settings": "Настройки",
"hangup": "Затвори",
"hangup": "",
"login": "Влез",
"logout": "Изход",
"dialpad": "Цифров панел",
"dialpad": "",
"sharedVideoMutedPopup": "Споделеното видео е заглуено,<br/>, за да можете да говорите.",
"micMutedPopup": "Микрофонът е заглушен, за да<br/>не пречи на YouTube видеото.",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "Не се говори по време на филм!",
"cameraDisabled": "Не е налична камера",
"micDisabled": "Не е наличен микрофон"
"micDisabled": "Не е наличен микрофон",
"filmstrip": "",
"profile": "",
"raiseHand": ""
},
"bottomtoolbar": {
"chat": "Отвори / затвори чат",
"filmstrip": "Покажи / скрий лентата с видеа",
"contactlist": "Отвори / затвори контакт листа"
"filmstrip": "",
"contactlist": ""
},
"chat": {
"nickname": {
@@ -108,23 +123,33 @@
"messagebox": "Въведете текст..."
},
"settings": {
"title": "НАСТРОЙКИ",
"title": "Настройки",
"update": "Актуализиране",
"name": "Име",
"startAudioMuted": "Започни без аудио",
"startVideoMuted": "Започни без видео",
"selectCamera": "Избери камера",
"selectMic": "Избери микрофон",
"selectAudioOutput": "Избери аудио изход",
"followMe": "Включи \"следвай ме\"",
"startAudioMuted": "",
"startVideoMuted": "",
"selectCamera": "",
"selectMic": "",
"selectAudioOutput": "",
"followMe": "",
"noDevice": "Няма",
"noPermission": "Не е разрешен достъп до устройството",
"avatarUrl": "Адрес на аватар"
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
},
"profile": {
"title": "",
"setDisplayNameLabel": "",
"setEmailLabel": "",
"setEmailInput": ""
},
"videothumbnail": {
"editnickname": "Натиснете за да<br/>промените името",
"moderator": "Създателя на<br/>конференцията",
"videomute": "Учасника е спрял<br/>камерата си.",
"videomute": "",
"mute": "Учасника е с изключен микрофон",
"kick": "Изгони",
"muted": "Изключен микрофон",
@@ -132,6 +157,7 @@
"flip": "Огледално"
},
"connectionindicator": {
"header": "",
"bitrate": "Дебит:",
"packetloss": "Загуба на пакети:",
"resolution": "Резолюция:",
@@ -165,34 +191,49 @@
"raisedHand": ""
},
"dialog": {
"add": "",
"kickMessage": "Бяхте изгонен от срещата!",
"popupError": "Навигаторът ви блокира попъите. Молим ви да премахнете забраната и да опитате отново.",
"passwordErrorTitle": "",
"passwordError": "Стаята е защитена с парола. Само собственикът може да я променя или премахва.",
"passwordError2": "Стаята ви не е защитена с парола. Собственикът би могъл да добави парола.",
"connectError": "Опа! Нещо се обърка и не успяхме да се свържем с конференцията.",
"connectErrorWithMsg": "Опа! Нещо се обърка и не успяхме да се свържем с конференцията: __msg__",
"incorrectPassword": "",
"connecting": "Свързване",
"copy": "",
"error": "Грешка",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Възникна грешка при опит да бъде намерено разширението за споделяне на екран.",
"failtoinstall": "Неуспешна инсталация на разширението за споделяне на екрана.",
"failedpermissions": "Неуспешен опит за получаване на права за използване на микрофон и/или камера.",
"bridgeUnavailable": "Jitsi Videobridge не е наличен. Моля опитайте пак!",
"jicofoUnavailable": "Jitsi Videobridge не е наличен. Моля опитайте пак!",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "Конференцията е пълна. Моля, опитайте по-късно!",
"lockTitle": "Неуспешно заключване",
"lockMessage": "Неуспешно заключване на конференцията.",
"warning": "Внимание",
"passwordNotSupported": "В момента не поддържаме стаи с пароли.",
"sorry": "Съжаляваме",
"internalError": "Вътрешна грешка [setRemoteDescription]",
"internalErrorTitle": "",
"internalError": "",
"unableToSwitch": "Неуспешен опит за смяна на видеото.",
"SLDFailure": "Опа! Нещо се обърка и не успяхме да спрем микрофона! (SLD Failure)",
"SRDFailure": "Опа! Нещо се обърка и не успяхме да спрем камерата! (SRD Failure)",
"oops": "Опа!",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "Възникна грешка",
"passwordRequired": "Изисква се парола",
"Ok": "ОК",
"done": "",
"Remove": "DELETE DELETE DELETE DELETE DELETE DELETE DELETE DELETE DELETE DELETE ",
"removePassword": "",
"shareVideoTitle": "Сподели видео",
"shareVideoLinkError": "Моля въведете правилен Prezi линк.",
"removeSharedVideoTitle": "Край на споделянето на видео",
@@ -202,6 +243,7 @@
"WaitForHostMsg": "<b>__room__ </b> още не е започнал. Ако вие сте домакина моля идентифицирайте се. В противен случай ще изчакаме домакина.",
"IamHost": "Аз съм домакина",
"Cancel": "Отказ",
"Submit": "",
"retry": "Повторен опит",
"logoutTitle": "Изход",
"logoutQuestion": "Сигурни ли сте, че искате да излезете и да прекъснете конференцията?",
@@ -216,26 +258,29 @@
"sipMsg": "Въведете SIP номер",
"passwordCheck": "Сигурни ли сте, че искате да махнете паролата?",
"passwordMsg": "Въведете парола, за да заключите стаята",
"Invite": "Покани",
"shareLink": "Сподели този линк с всеки, който искаш да поканиш",
"shareLink": "",
"settings1": "Конфигурирай конференцията",
"settings2": "Участниците се присъединиха с изключен микрофон.",
"settings3": "Изисквай имена<br/><br/>Въведете парола за да заключите стаята:",
"yourPassword": "вашата парола",
"yourPassword": "",
"Back": "Назад",
"serviceUnavailable": "Услугата не е налична",
"gracefulShutdown": "Услугата временно не е достъпна поради профилактика. Моля опитайте по-късно.",
"Yes": "Да",
"reservationError": "Грешка в системата за резервации",
"reservationErrorMsg": "Грешка номер: __code__, съобщение: __msg__",
"password": "парола",
"password": "",
"userPassword": "потребителска парола",
"token": "код за достъп",
"tokenAuthFailed": "Неуспешна XMPP автентикация: невалиден тоукън",
"displayNameRequired": "Въведете името си:",
"tokenAuthFailedTitle": "",
"tokenAuthFailed": "",
"displayNameRequired": "",
"enterDisplayName": "Въведете името си:",
"extensionRequired": "Изисква се разширение: ",
"firefoxExtensionPrompt": "За да споделите екрана си, трябва да инсталирате Firefox разширение. <a href='__url__'>свалете го тук</a> и пробвайте пак!",
"feedbackQuestion": "Как мина разговора?",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "Благодарим, че използвахте __appName__!",
"sorryFeedback": "Много съжаляваме! Бихте ли ни казали повече?",
"liveStreaming": "Пряко предаване",
@@ -246,6 +291,7 @@
"stopLiveStreaming": "Край на прякото предаване",
"stopRecording": "Край на записа",
"doNotShowWarningAgain": "Занапред не ме предупреждавай пак",
"doNotShowMessageAgain": "",
"permissionDenied": "Достъпът е отказан",
"screenSharingPermissionDeniedError": "Не сте дали права за споделяне на екран",
"micErrorPresent": "Грешка при достъп до микрофона",
@@ -253,12 +299,20 @@
"cameraUnsupportedResolutionError": "Камерата ви не поддържа тази резолюция",
"cameraUnknownError": "Невъзможен достъп до камерата по неясна причина.",
"cameraPermissionDeniedError": "",
"cameraNotFoundError": "Указаната камера не е намерена.",
"cameraNotFoundError": "",
"cameraConstraintFailedError": "Камерата ви не задоволява зададените условия.",
"micUnknownError": "Не възможен достъп до микрофона по неясна причина.",
"micPermissionDeniedError": "",
"micNotFoundError": "Микрофонът не задоволява зададените условия.",
"micConstraintFailedError": "Микрофонът не задоволява зададените условия."
"micNotFoundError": "",
"micConstraintFailedError": "Микрофонът не задоволява зададените условия.",
"micNotSendingData": "",
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Изключи микрофона"
},
"email": {
"sharedKey": [
@@ -302,7 +356,7 @@
"on": "Запис",
"off": "Записът спрян",
"failedToStart": "Неуспешен опит за записване",
"buttonTooltip": "Пускане / спиране на запис",
"buttonTooltip": "",
"error": "Грешка при опит за запис. Моля опитайте отново.",
"unavailable": "Записите са временно невъзможни. Моля опитайте по-късно."
},
@@ -312,7 +366,7 @@
"off": "Край на прякото предаване",
"unavailable": "Услугата за пряко предаване е временно недостъпна. Опитайте по-късно.",
"failedToStart": "Неуспешен опит за пряко предаване",
"buttonTooltip": "Начало / край на пряко предаване",
"buttonTooltip": "",
"streamIdRequired": "Моля попълнете името на потока, за да можем да започнем прякото предаване.",
"error": "Неуспешно пряко предаване. Опитайте пак.",
"busy": "Всички записвачки са временно заети. Опитайте отново по-късно."

View File

@@ -1,9 +1,13 @@
{
"contactlist": "Im Gespräch",
"contactlist": "Teilnehmer (__pcount__)",
"addParticipants": "Link teilen",
"roomLocked": "Teilnehmer müssen ein Passwort eingeben",
"roomUnlocked": "Jeder mit Zugriff auf den Link kann beitreten",
"passwordSetRemotely": "von einem anderen Teilnehmer gesetzt",
"connectionsettings": "Verbindungseinstellungen",
"poweredby": "Betrieben von",
"feedback": "Wir freuen uns auf Ihr Feedback!",
"roomUrlDefaultMsg": "Die Konferenz wird erstellt...",
"inviteUrlDefaultMsg": "Die Konferenz wird erstellt...",
"me": "ich",
"speaker": "Sprecher",
"raisedHand": "Möchte sprechen",
@@ -21,17 +25,18 @@
"nwjsGrantPermissions": "Bitte Berechtigungen zur Verwendung der Kamera und des Mikrofons erteilen"
},
"keyboardShortcuts": {
"keyboardShortcuts": "Tastaturkürzel:",
"raiseHand": "Heben Sie Ihre Hand.",
"pushToTalk": "Drücken um zu sprechen.",
"toggleScreensharing": "Zwischen Kamera und Bildschirmfreigabe wechseln.",
"toggleFilmstrip": "Videos anzeigen oder verbergen.",
"toggleShortcuts": "Hilfe-Menu anzeigen oder verdecken.",
"focusLocal": "Lokales Video fokussieren.",
"focusRemote": "Andere Videos fokussieren.",
"toggleChat": "Chat öffnen oder schliessen.",
"mute": "Stummschaltung aktivieren oder deaktivieren.",
"videoMute": "Eigenes Video starten oder stoppen."
"keyboardShortcuts": "Tastenkürzel",
"raiseHand": "Hand erheben",
"pushToTalk": "Drücken um zu sprechen",
"toggleScreensharing": "Zwischen Kamera und Bildschirmfreigabe wechseln",
"toggleFilmstrip": "Videos anzeigen oder verbergen",
"toggleShortcuts": "Hilfe-Menu anzeigen oder verdecken",
"focusLocal": "Lokales Video fokussieren",
"focusRemote": "Auf das Video eines anderen Teilnehmers fokussieren",
"toggleChat": "Chat öffnen oder schliessen",
"mute": "Stummschaltung aktivieren oder deaktivieren",
"fullScreen": "Vollbildmodus aktivieren / deaktivieren",
"videoMute": "Kamera starten oder stoppen"
},
"welcomepage": {
"go": "Los",
@@ -70,35 +75,45 @@
"content": "Die Verwendung kann durch die Integration mit Piwik, Google Analytics und anderen Überwachungs- und Statistikprogrammen protokolliert werden."
}
},
"startupoverlay": {
"policyText": "&nbsp;",
"title": "__app__ benötigt Kamera und Mikrofon."
},
"suspendedoverlay": {
"title": "Die Konferenz wurde unterbrochen weil der Computer den Standbymodus aktivierte.",
"rejoinKeyTitle": "Erneut teilnehmen"
},
"toolbar": {
"mute": "Stummschaltung aktivieren / deaktivieren",
"videomute": "Kamera starten / stoppen",
"authenticate": "Anmelden",
"lock": "Konferenz schützen / Schutz aufheben",
"invite": "Andere einladen",
"invite": "Link teilen",
"chat": "Chat öffnen / schliessen",
"etherpad": "Dokument teilen",
"etherpad": "Geteiltes Dokument öffnen / schliessen",
"sharedvideo": "YouTube-Video teilen",
"sharescreen": "Bildschirm freigeben",
"sharescreen": "Bildschirmfreigabe starten / stoppen",
"fullscreen": "Vollbildmodus aktivieren / deaktivieren",
"sip": "SIP Nummer anrufen",
"Settings": "Einstellungen",
"hangup": "Konferenz verlassen",
"hangup": "Verlassen",
"login": "Anmelden",
"logout": "Abmelden",
"dialpad": "Tastenblock anzeigen",
"dialpad": "Wähltastatur öffnen / schliessen",
"sharedVideoMutedPopup": "Das geteilte Video wurde stumm geschaltet damit mit <br/>den anderen Teilnehmern gesprochen werden kann.",
"micMutedPopup": "Ihr Mikrofon wurde stumm geschaltet damit das<br/>geteilte Video genossen werden kann.",
"talkWhileMutedPopup": "Versuchen sie zu sprechen? Ihr Mikrofon ist stummgeschaltet.",
"unableToUnmutePopup": "Die Stummschaltung kann nicht aufgehoben werden während das geteilte Video abgespielt wird.",
"cameraDisabled": "Keine Kamera verfügbar",
"micDisabled": "Kein Mikrofon verfügbar",
"filmstrip": "Videos anzeigen / verbergen",
"raiseHand": "Hand erheben um zu sprechen"
"profile": "Profil bearbeiten",
"raiseHand": "Hand erheben"
},
"bottomtoolbar": {
"chat": "Chat öffnen / schliessen",
"filmstrip": "Videos anzeigen / verbergen",
"contactlist": "Kontaktliste öffnen / schliessen"
"contactlist": "Teilnehmer anzeigen und einladen"
},
"chat": {
"nickname": {
@@ -126,9 +141,10 @@
"setPasswordLabel": "Konferenz mit einem Passwort schützen."
},
"profile": {
"title": "PROFIL",
"title": "Profil",
"setDisplayNameLabel": "Anzeigename festlegen",
"setEmailLabel": "E-Mail Adresse für Gravatar"
"setEmailLabel": "E-Mail Adresse für Gravatar",
"setEmailInput": "E-Mail eingeben"
},
"videothumbnail": {
"editnickname": "Klicken, um den Anzeigenamen zu bearbeiten",
@@ -141,6 +157,7 @@
"flip": "Spiegeln"
},
"connectionindicator": {
"header": "Verbindungsdaten",
"bitrate": "Bitrate:",
"packetloss": "Paketverlust:",
"resolution": "Auflösung:",
@@ -174,20 +191,30 @@
"raisedHand": "Möchte sprechen."
},
"dialog": {
"add": "Hinzufügen",
"kickMessage": "Oh! Sie wurden aus der Konferenz ausgeschlossen.",
"popupError": "Ihr Browser blockiert Popup-Fenster von dieser Webseite. Bitte erlauben Sie dieser Seite Popups in den Sicherheitseinstellungen Ihres Browsers und versuchen Sie es erneut.",
"passwordErrorTitle": "Passwort-Fehler",
"passwordError": "Diese Konferenz ist mit einem Paswort geschützt. Nur der Besitzer der Konferenz kann ein Passwort vergeben.",
"passwordError2": "Diese Konferenzt ist nicht mit einem Passwort geschützt. Nur der Besitzer der Konferenz kann ein Passwort vergeben.",
"connectError": "Oh! Es hat etwas nicht geklappt und der Konferenz konnte nicht beigetreten werden.",
"connectErrorWithMsg": "Oh! Es hat etwas nicht geklappt und der Konferenz konnte nicht beigetreten werden: __msg__",
"incorrectPassword": "Das Passwort ist ungültig",
"connecting": "Verbindung wird hergestellt",
"copy": "Kopieren",
"error": "Fehler",
"roomLocked": "Diese Konferenz ist gesperrt. Neue Teilnehmer müssen über den Link beitreten das Passwort eingeben",
"addPassword": "Passwort hinzufügen",
"createPassword": "Passwort erstellen",
"detectext": "Fehler bei der Erkennung der Bildschirmfreigabeerweiterung.",
"failtoinstall": "Die Bildschirmfreigabeerweiterung konnte nicht installiert werden.",
"failedpermissions": "Die Zugriffsberechtigungen auf das Mikrofon und/oder die Kamera konnten nicht eingeholt werden.",
"bridgeUnavailable": "Die Jitsi Videobridge ist momentan nicht erreichbar. Bitte versuchen Sie es später noch einmal.",
"jicofoUnavailable": "Jicofo ist momentan nicht erreichbar. Bitte versuchen Sie es später noch einmal.",
"conferenceReloadTitle": "Leider ist etwas schiefgegangen",
"conferenceReloadMsg": "Wir versuchen das zu beheben",
"conferenceDisconnectTitle": "Sie wurden getrennt. Prüfen Sie Ihre Netzwerkverbindung.",
"conferenceDisconnectMsg": "Verbinde erneut in...",
"reconnectNow": "Jetzt erneut verbinden",
"conferenceReloadTimeLeft": "__seconds__ sek.",
"maxUsersLimitReached": "Die maximale Teilnehmerzahl dieser Konferenz ist erreicht. Die Konferenz ist voll. Bitte versuchen Sie es später noch einmal.",
"lockTitle": "Sperren fehlgeschlagen",
"lockMessage": "Die Konferenz konnte nicht gesperrt werden.",
@@ -199,10 +226,14 @@
"SLDFailure": "Oh! Die Stummschaltung konnte nicht aktiviert werden. (SLD Fehler)",
"SRDFailure": "Oh! Das Video konnte nicht gestoppt werden. (SRD Fehler)",
"oops": "Oh!",
"currentPassword": "Das aktuelle Passwort ist",
"passwordLabel": "Passwort",
"defaultError": "Es ist ein Fehler aufgetreten",
"passwordRequired": "Passwort erforderlich",
"Ok": "OK",
"done": "Fertig",
"Remove": "Entfernen",
"removePassword": "Passwort entfernen",
"shareVideoTitle": "Video teilen",
"shareVideoLinkError": "Bitte einen gültigen YouTube-Link angeben.",
"removeSharedVideoTitle": "Freigegebenes Video entfernen",
@@ -212,6 +243,7 @@
"WaitForHostMsg": "Die Konferenz <b>__room__</b> hat noch nicht begonnen. Wenn Sie der Organisator sind, melden Sie sich bitte an. Anderenfalls warten Sie bitte, bis der Organisator beigetreten ist.",
"IamHost": "Ich bin der Organisator",
"Cancel": "Abbrechen",
"Submit": "OK",
"retry": "Wiederholen",
"logoutTitle": "Abmelden",
"logoutQuestion": "Sind Sie sicher, dass Sie sich abmelden und die Konferenz verlassen möchten?",
@@ -226,7 +258,7 @@
"sipMsg": "Geben Sie eine SIP Nummer ein",
"passwordCheck": "Sind Sie sicher, dass Sie das Passwort entfernen möchten?",
"passwordMsg": "Passwort setzen um die Konferenz zu schützen",
"shareLink": "Diesen Link kopieren und teilen",
"shareLink": "Link zu dieser Konferenz teilen",
"settings1": "Konferenz einrichten",
"settings2": "Teilnehmer treten stummgeschaltet bei",
"settings3": "Name erforderlich<br/><br/>Setzen Sie ein Passwort, um die Konferenz zu schützen:",
@@ -242,7 +274,8 @@
"token": "Token",
"tokenAuthFailedTitle": "Authentifizierungsfehler",
"tokenAuthFailed": "Sie sind nicht berechtigt dieser Konferenz beizutreten.",
"displayNameRequired": "Geben Sie Ihren Anzeigenamen ein",
"displayNameRequired": "Anzeigename ist erforderlich",
"enterDisplayName": "Geben Sie Ihren Anzeigenamen ein",
"extensionRequired": "Erweiterung erforderlich:",
"firefoxExtensionPrompt": "Um die Bildschirmfreigabe nutzen zu können, muss eine Firefox-Erweiterung installiert werden. Bitte versuchen Sie es erneut nachdem die <a href='__url__'>Erweiterung installiert</a> wurde.",
"rateExperience": "Bitte bewerten Sie diese Konferenz.",
@@ -258,6 +291,7 @@
"stopLiveStreaming": "Live-Streaming stoppen",
"stopRecording": "Aufnahme stoppen",
"doNotShowWarningAgain": "Diesen Hinweis nicht mehr anzeigen",
"doNotShowMessageAgain": "Diesen Hinweis nicht mehr anzeigen",
"permissionDenied": "Zugriff verweigert",
"screenSharingPermissionDeniedError": "Sie haben die Berechtigung für die Bildschirmfreigabe nicht erteilt.",
"micErrorPresent": "Fehler beim Verbinden zum Mikrofon.",
@@ -275,7 +309,10 @@
"cameraNotSendingData": "Die Kamera kann nicht verwendet werden. Bitte wählen Sie eine andere Kamera in den Einstellungen oder laden Sie die Konferenz neu.",
"goToStore": "Zum Store",
"externalInstallationTitle": "Erweiterung erforderlich",
"externalInstallationMsg": "Die Bildschirmfreigabeerweiterung muss installiert werden."
"externalInstallationMsg": "Die Bildschirmfreigabeerweiterung muss installiert werden.",
"muteParticipantTitle": "Teilnehmer stummschalten?",
"muteParticipantBody": "Sie können die Stummschaltung anderer Teilnehmer nicht aufheben, aber ein Teilnehmer kann seine eigene Stummschaltung jederzeit beenden.",
"muteParticipantButton": "Stummschalten"
},
"\u0005dialog": {},
"email": {

View File

@@ -1,59 +1,62 @@
{
"contactlist": "LISTA DE CONTACTOS",
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "Ajustes de la conexión",
"poweredby": "impulsado por",
"downloadlogs": "Descargar logs",
"poweredby": "potenciado por",
"feedback": "Danos tu opinión",
"roomUrlDefaultMsg": "Tu conferencia está siendo creada...",
"participant": "Participante",
"inviteUrlDefaultMsg": "Tu conferencia está siendo creada...",
"me": "yo",
"speaker": "Orador",
"raisedHand": "",
"raisedHand": "Desea hablar",
"defaultNickname": "ej. Juana Rosas",
"defaultLink": "ej. __url__",
"calling": "Llamando __nombre__ ...",
"callingName": "__name__",
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
"androidGrantPermissions": "",
"firefoxGrantPermissions": "",
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": ""
"react-nativeGrantPermissions": "Por favor, conceda permisos para utilizar su cámara y micrófono presionando el botón <b><i> Permitir </i></b>",
"chromeGrantPermissions": "Por favor, conceda permisos para utilizar su cámara y micrófono presionando el botón <b><i> Permitir </i></b>",
"androidGrantPermissions": "Por favor, conceda permisos para utilizar su cámara y micrófono presionando el botón <b><i> Permitir </i></b>",
"firefoxGrantPermissions": "Por favor, conceda permisos para utilizar su cámara y micrófono presionando el botón <b><i>Compartir Dispositivo seleccionado</i></b>",
"operaGrantPermissions": "Por favor, conceda permisos para utilizar su cámara y micrófono presionando el botón <b><i> Permitir </i></b>",
"iexplorerGrantPermissions": "Por favor, conceda permisos para utilizar su cámara y micrófono presionando el botón <b><i>OK</i></b>",
"safariGrantPermissions": "Por favor, conceda permisos para utilizar su cámara y micrófono presionando el botón <b><i>OK</i></b>",
"nwjsGrantPermissions": "Por favor, conceda permisos para utilizar su cámara y micrófono"
},
"keyboardShortcuts": {
"keyboardShortcuts": "Atajos de teclado:",
"raiseHand": "Levantar la mano.",
"pushToTalk": "Presione para hablar.",
"toggleScreensharing": "Cambiar entre cámara y compartir pantalla.",
"toggleFilmstrip": "Mostrar u ocultar película.",
"toggleShortcuts": "Muestra u oculta este menú de ayuda.",
"focusLocal": "Enfocar el video local.",
"focusRemote": "Enfocarse en uno de los videos remotos.",
"toggleChat": "Abrir o cerrar panel de charlas.",
"mute": "Activar o desactivar micrófono.",
"videoMute": "Detener o iniciar el video local."
"keyboardShortcuts": "",
"raiseHand": "",
"pushToTalk": "",
"toggleScreensharing": "",
"toggleFilmstrip": "",
"toggleShortcuts": "",
"focusLocal": "",
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
},
"welcomepage": {
"go": "IR",
"roomname": "Introduzca un nombre de sala:",
"roomname": "Introduzca un nombre de sala",
"disable": "No mostrar esta página otra vez",
"feature1": {
"title": "Sencillo de usar",
"content": "No se requiere descargar nada. __app__ funciona directamente con tu navegador. Solo comparte el URL de tu conferencia con otros para comenzar."
"content": "No se requiere descargar nada. __app__ funciona directamente con su navegador. Solo comparta el URL de su conferencia con otros para comenzar."
},
"feature2": {
"title": "Bajo Ancho de Banda",
"content": "Las Videoconferencias con múltiples participantes funcionan con tan solo 128 Kbps. Conferencias para compartir pantalla y audio son posibles con mucho menos."
"title": "Bajo consumo de Ancho de Banda",
"content": "Las Videoconferencias con múltiples participantes funcionan con tan solo 128 Kbps. Conferencias para compartir pantalla y solo audio son posibles con mucho menos."
},
"feature3": {
"title": "Código abierto",
"content": "__app__ está licenciado bajo la licencia Apache. Eres libre de descargar, usar, modificar, y compartirlo conforme a esta licencia libre."
"content": "__app__ está licenciado bajo la Licencia Apache. Eres libre de descargar, usar, modificar, y compartirlo de acuerdo a esta licencia."
},
"feature4": {
"title": "Usuarios ilimitados",
"content": "No hay restricciones artificiales en el número de usuarios o participantes de la conferencia. La capacidad del servidor y ancho de banda son los únicos factores limitantes."
"content": "No hay restricciones artificiales en el número de usuarios o participantes de la conferencia. La capacidad del servidor y del ancho de banda son los únicos factores limitantes."
},
"feature5": {
"title": "Compartir pantalla",
@@ -72,59 +75,81 @@
"content": "Aprenda de sus usuarios a través de una fácil integración con Piwik, Google Analytics, y otros sistemas de seguimiento y análisis de uso."
}
},
"startupoverlay": {
"policyText": "",
"title": ""
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"mute": "Activar / Desactivar Silencio",
"videomute": "Iniciar / detener cámara",
"videomute": "",
"authenticate": "Autenticar",
"lock": "Bloquear / desbloquear sala",
"invite": "Invitar a otros",
"chat": "Abrir / cerrar chat",
"etherpad": "Compartir documento",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "Compartir un vídeo de YouTube",
"sharescreen": "Compartir pantalla",
"fullscreen": "Entrar / Salir de Pantalla completa",
"sharescreen": "",
"fullscreen": "",
"sip": "Llamar a un número SIP",
"Settings": "Ajustes",
"hangup": "Colgar",
"hangup": "",
"login": "Inicio de sesión",
"logout": "Cerrar sesión",
"dialpad": "Mostrar teclado de llamada",
"dialpad": "",
"sharedVideoMutedPopup": "Su vídeo compartido ha sido silenciado<br/>para que pueda hablar con otros participantes.",
"micMutedPopup": "Su micrófono ha sido silenciado para que<br/>pueda disfrutar completamente de compartir su vídeo.",
"micMutedPopup": "Su micrófono ha sido silenciado para que<br/>pueda disfrutar completamente de su vídeo compartido.",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "No puede silenciar su micrófono mientras el vídeo compartido está activo.",
"cameraDisabled": "Cámara no disponible",
"micDisabled": "Micrófono no disponible"
"micDisabled": "Micrófono no disponible",
"filmstrip": "",
"profile": "",
"raiseHand": ""
},
"bottomtoolbar": {
"chat": "Abrir / cerrar chat",
"filmstrip": "Mostrar / ocultar film",
"contactlist": "Abrir / cerrar lista de contactos"
"chat": "Abrir / cerrar sala de charlas",
"filmstrip": "Mostrar / ocultar videos",
"contactlist": ""
},
"chat": {
"nickname": {
"title": "Indique un nombre en la caja inferior",
"popover": "Seleccione un nombre"
"title": "Introduzca un apodo en la caja inferior",
"popover": "Seleccione un apodo"
},
"messagebox": "Introduzca texto..."
},
"settings": {
"title": "CONFIGURAR",
"title": "Ajustes",
"update": "Actualizar",
"name": "Nombre",
"startAudioMuted": "Iniciar sin audio",
"startVideoMuted": "Iniciar sin vídeo",
"selectCamera": "Seleccionar cámara",
"selectMic": "Seleccionar micrófono",
"selectAudioOutput": "Selecciona salida de audio",
"followMe": "Habilitar sígueme",
"startAudioMuted": "Todos inician en silencio",
"startVideoMuted": "Todos inician ocultos",
"selectCamera": "Cámara",
"selectMic": "Micrófono",
"selectAudioOutput": "Salida de audio",
"followMe": "Todos me siguen",
"noDevice": "Ninguno",
"noPermission": "Permiso para usar el dispositivo no permitido",
"avatarUrl": "URL del Avatar"
"cameraAndMic": "Cámara y micrófono",
"moderator": "MODERADOR",
"password": "ESTABLECER CONTRASEÑA",
"audioVideo": "AUDIO Y VIDEO",
"setPasswordLabel": "Bloquear su cuarto con contraseña"
},
"profile": {
"title": "",
"setDisplayNameLabel": "Establecer nombre a mostrar",
"setEmailLabel": "Establecer su gravatar",
"setEmailInput": ""
},
"videothumbnail": {
"editnickname": "Click para editar tu <br/>nombre",
"editnickname": "Presione para editar tu <br/>nombre",
"moderator": "El propietario de<br/>esta conferencia",
"videomute": "Participante ha<br/>detenido la cámara.",
"videomute": "Participante a<br/>detenido la cámara",
"mute": "Participante está silenciado",
"kick": "Expulsar",
"muted": "Silenciado",
@@ -132,6 +157,7 @@
"flip": "Voltear"
},
"connectionindicator": {
"header": "",
"bitrate": "Tasa de bits:",
"packetloss": "Pérdida de paquetes:",
"resolution": "Resolución:",
@@ -148,63 +174,79 @@
"remoteaddress_plural": "Direcciones remotas:",
"transport": "Transporte:",
"bandwidth": "Ancho de banda estimado:",
"na": "Volver aquí para ver información de la conexión, una vez que se inicia la conferencia"
"na": "Una vez que se inicia la conferencia, volver aquí para ver información de la conexión"
},
"notify": {
"disconnected": "desconectado",
"moderator": Otorgados derechos de moderador! ",
"moderator": Se otorgaron privilegios de moderador!",
"connected": "conectado",
"somebody": "Alguien",
"me": "Yo",
"focus": "Foco de conferencia",
"focus": "Enfocar conferencia",
"focusFail": "__component__ no disponible - reintentar en __ms__ seg",
"grantedTo": Derechos de moderador otorgados a __to__!",
"grantedToUnknown": Derechos de moderador otorgados a $t(somebody)!",
"grantedTo": Se otorgaron privilegios de moderador a __to__!",
"grantedToUnknown": Se otorgaron privilegios de moderador a $t(somebody)!",
"muted": "Has iniciado la conversación silenciado.",
"mutedTitle": "¡Estás silenciado!",
"raisedHand": ""
"raisedHand": "Desearía hablar."
},
"dialog": {
"kickMessage": "¡Auch! ¡Haz sido expulsado de la reunión!",
"add": "",
"kickMessage": "¡Ouch! ¡Has sido expulsado de la reunión!",
"popupError": "Su navegador está bloqueando las ventanas emergentes de este sitio. Por favor, activa las ventanas emergentes en la configuración de seguridad del navegador y vuelva a intentarlo.",
"passwordErrorTitle": "",
"passwordError": "Esta conversación está protegida con una contraseña. Sólo el propietario de la conferencia puede establecer una contraseña.",
"passwordError2": "Esta conversación no está protegida con una contraseña. Sólo el propietario de la conferencia puede establecer una contraseña.",
"connectError": Uups! Algo salió mal y no pudimos conectarnos a la conferencia.",
"connectErrorWithMsg": Uups! Algo salió mal y no pudimos conectarnos a la conferencia: __msg__",
"connectError": Oops! Algo salio mal y no fue posible conectarnos a la conferencia.",
"connectErrorWithMsg": Oops! Algo salio mal y no fue posible conectarnos a la conferencia: __msg__",
"incorrectPassword": "",
"connecting": "Conectando",
"copy": "Copiar",
"error": "Error",
"detectext": "Error al tratar de detectar la extensión de compartir escritorio.",
"failtoinstall": "Fallo al instalar la extensión de compartir escritorio",
"failedpermissions": "Fallo al obtener permisos para utilizar el micrófono y/o cámara de tu equipo.",
"bridgeUnavailable": "Videobridge Jitsi no está actualmente disponible. ¡Por favor inténtelo más tarde!",
"jicofoUnavailable": "Jicofo no está disponible actualmente. ¡Por favor inténtelo más tarde!",
"maxUsersLimitReached": "El número máximo de participantes en la conferencia ha sido alcanzado. La conferencia está llena. ¡Por favor intente nuevamente más tarde!",
"lockTitle": "El número máximo de participantes en la conferencia ha sido alcanzado. La conferencia está llena. ¡Por favor intente nuevamente más tarde!",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Error al tratar de detectar la extensión para compartir escritorio.",
"failtoinstall": "Falla al instalar la extensión para compartir escritorio",
"failedpermissions": "Falla al obtener permisos para utilizar el micrófono y/o cámara de su equipo.",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "La conferencia está llena. El número máximo de participantes de la conferencia se ha alcanzado. ¡Por favor intente más tarde!",
"lockTitle": "El bloqueo falló",
"lockMessage": "No se pudo bloquear la conferencia.",
"warning": "Advertencia",
"passwordNotSupported": "No se soportan contraseñas para la sala. ",
"sorry": "¡Perdón!",
"internalError": "Error interno de la aplicación [setRemoteDescription]",
"unableToSwitch": "No se puede activar transmisión de video",
"SLDFailure": Ups! Algo salió mal y no se logró silenciar! (Falla de SLD)",
"SRDFailure": Ups! ¡Algo salió mal y no se logró detener el video! (Falla SRD)",
"oops": Ups!",
"warning": "Aviso",
"passwordNotSupported": "No se soportan contraseñas para la sala.",
"internalErrorTitle": "Error interno",
"internalError": "¡Uups! Ocurrió algo incorrecto. Ocurrió el siguiente error: [setRemoteDescription]",
"unableToSwitch": "No se puede cambiar secuencia de video.",
"SLDFailure": Oops! Algo salio mal y no se logró silenciar! (Falla de SLD)",
"SRDFailure": Oops! ¡Algo salio mal y no se logró detener el video! (Falla de SRD)",
"oops": Oops!",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "Hubo algún tipo de error",
"passwordRequired": "Se necesita contraseña",
"passwordRequired": "Se requiere una contraseña",
"Ok": "Aceptar",
"done": "",
"Remove": "Eliminar",
"removePassword": "",
"shareVideoTitle": "Compartir un vídeo",
"shareVideoLinkError": "Por favor introduzca un enlace correcto de Youtube.",
"removeSharedVideoTitle": "Eliminar video compartido",
"removeSharedVideoMsg": "¿Estas seguro que deseas eliminar tu vídeo compartido?",
"alreadySharedVideoMsg": "Otro participante esta ahora mismo compartiendo el vídeo. Esta conferencia permite sólo compartir un único vídeo a la vez.",
"WaitingForHost": "Esperando al anfitrión...",
"removeSharedVideoMsg": "¿Está seguro que desea eliminar su vídeo compartido?",
"alreadySharedVideoMsg": "Otro participante está compartiendo el vídeo en este momento. Esta conferencia permite sólo compartir un vídeo a la vez.",
"WaitingForHost": "Esperando al anfitrión ...",
"WaitForHostMsg": "La conferencia <b>__room__ </b> aún no inicia. Si usted es el anfitrión, por favor autentíquese. De lo contrario, por favor espere a que el anfitrión llegue.",
"IamHost": "Yo soy el anfitrión",
"Cancel": "Cancelar",
"Submit": "",
"retry": "Reintentar",
"logoutTitle": "Cerrar sesión",
"logoutQuestion": "¿Está seguro que quiere salir y detener la conferencia?",
"logoutQuestion": "¿Está seguro que desea salir y detener la conferencia?",
"sessTerminated": "Sesión finalizada",
"hungUp": "Colgaste",
"joinAgain": "Unirse de nuevo",
@@ -214,30 +256,33 @@
"recordingToken": "Introduzca el token de grabación",
"Dial": "Marcar",
"sipMsg": "Introduzca número SIP",
"passwordCheck": "¿Realmente quieres eliminar tu contraseña?",
"passwordMsg": "Indica una contraseña para bloquear tu sala",
"Invite": "Invitar",
"shareLink": "Comparte este enlace con las personas que deseas invitar",
"passwordCheck": "¿Realmente desea eliminar su contraseña?",
"passwordMsg": "Indique una contraseña para bloquear su sala",
"shareLink": "",
"settings1": "Configure su conferencia",
"settings2": "Los participantes se unieron silenciados",
"settings3": "Solicita nombres <br/> <br/>Establecer una contraseña para bloquear la sala:",
"yourPassword": "tu contraseña",
"Back": "Atrás",
"settings3": "Solicitar apodos<br/><br/>Establecer una contraseña para bloquear la sala:",
"yourPassword": "Introducir la nueva contraseña",
"Back": "Anterior",
"serviceUnavailable": "Servicio no disponible",
"gracefulShutdown": "Nuestro servicio está detenido por mantenimiento. Por favor, inténtelo de nuevo más tarde.",
"gracefulShutdown": "Nuestro servicio se encuentra en mantenimiento. Por favor, intente más tarde.",
"Yes": "Sí",
"reservationError": "Error de sistema de reservación",
"reservationError": "Error del sistema de reservación",
"reservationErrorMsg": "Código de error: __code__, message: __msg__",
"password": "contraseña",
"userPassword": "contraseña de usuario",
"password": "Introducir contraseña",
"userPassword": "contraseña del usuario",
"token": "token",
"tokenAuthFailed": "Error al autenticar con el servidor XMPP: token inválido",
"displayNameRequired": "Por favor escriba su nombre",
"extensionRequired": "Extensión requerida",
"firefoxExtensionPrompt": "Es necesario instalar una extensión para Firefox con el fin de utilizar la pantalla compartida. Por favor, inténtelo de nuevo después de que lo obtenga de aquí <a href='__url__'> </a>!",
"feedbackQuestion": "¿Como fue su llamada?",
"thankYou": "Gracias por usar __appName__!",
"sorryFeedback": " Sentimos escuchar eso. ¿Quieres decirnos algo más?",
"tokenAuthFailedTitle": "Problema de autenticación",
"tokenAuthFailed": "Lo siento, usted no tiene permiso para unirse a este llamada.",
"displayNameRequired": "",
"enterDisplayName": "Por favor escriba su nombre",
"extensionRequired": "Extensión requerida:",
"firefoxExtensionPrompt": "Necesita instalar una extensión para Firefox para poder utilizar la pantalla compartida. Por favor intente de nuevo, después de <a href='__url__'>obtenerla de aquí</a>!",
"rateExperience": "Por favor, califique la experiencia de su reunión.",
"feedbackHelp": "Su retroalimentación nos ayuda a mejorar nuestra experiencia de video.",
"feedbackQuestion": "¡Comente sobre su llamada!",
"thankYou": "¡Gracias por usar __appName__!",
"sorryFeedback": "Lamentamos escuchar eso. ¿Quiere decirnos algo más?",
"liveStreaming": "Emisión en Directo",
"streamKey": "Nombre/clave de emisión",
"startLiveStreaming": "Comenzar streaming en tiempo real",
@@ -246,52 +291,61 @@
"stopLiveStreaming": "Parar retransmisión en directo",
"stopRecording": "Parar grabación",
"doNotShowWarningAgain": "No volver a mostrar esta advertencia",
"doNotShowMessageAgain": "",
"permissionDenied": "Permiso Denegado",
"screenSharingPermissionDeniedError": "No ha otorgado permiso para compartir su pantalla.",
"micErrorPresent": "Hubo un error conectando su micrófono.",
"cameraErrorPresent": "Hubo un error conectando su cámara.",
"cameraUnsupportedResolutionError": "Su cámara no soporta la resolución de video.",
"cameraUnknownError": "No se puede usar su cámara por motivos desconocidos.",
"cameraPermissionDeniedError": "",
"cameraPermissionDeniedError": "No ha otorgado permisos para usar su cámara. Puede unirse a la conferencia, pero no lo podrán ver. Utilice el botón en la barra de dirección para solucionar esto.",
"cameraNotFoundError": "No se encontró la cámara.",
"cameraConstraintFailedError": "Su cámara no cumple los requerimientos.",
"micUnknownError": "No se puede usar su micrófono por motivos desconocidos.",
"micPermissionDeniedError": "",
"micPermissionDeniedError": "No ha otorgado permisos para usar su micrófono. Puede unirse a la conferencia, pero no lo podrán escuchar. Utilice el botón en la barra de dirección para solucionar esto.",
"micNotFoundError": "No se encontró el micrófono.",
"micConstraintFailedError": "Su micrófono no cumple los requerimientos."
"micConstraintFailedError": "Su micrófono no cumple los requerimientos.",
"micNotSendingData": "No fué posible acceder a su micrófono. Por favor, seleccione otro dispositivo del menú de configuración o intente reiniciando la aplicación.",
"cameraNotSendingData": "No fué posible acceder a su cámara. Por favor, revise si otra aplicación está usando el dispositivo, seleccione otro dispositivo del menú de configuración o intente reiniciando la aplicación.",
"goToStore": "Ir al webstore",
"externalInstallationTitle": "Extensión requerida",
"externalInstallationMsg": "Necesita instalar nuestra extensión para compartir escritorio.",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Silenciar"
},
"email": {
"sharedKey": [
"Esta conferencia está protegida con contraseña. Utiliza el siguiente pin cuando te unas: ",
"Esta conferencia está protegida con contraseña. Utiliza el siguiente pin cuando te unas:",
"",
"",
"__sharedKey__",
"",
""
],
"subject": "Invitación a a __appName__ (__conferenceName__)",
"subject": "Invitación a __appName__ (__conferenceName__)",
"body": [
"Ey allí, quiero invitarte a una a conferencia __appName__ que acabo de crear.",
"Hola, quiero invitarte a una a conferencia __appName__ que acabo de crear.",
"",
"",
"Por favor pica en la liga siguiente para unirte a la conferencia.",
"Por favor presiona el siguiente enlace para unirte a la conferencia.",
"",
"",
"__roomUrl__",
"",
"",
"__sharedKeyText__",
"Nota que __appName__ es soportada solo por __supportedBrowsers__, por lo que debes usar uno de esos navegadores.",
" Nota que __appName__ es soportada solo por __supportedBrowsers__, por lo que debes usar uno de esos navegadores.",
"",
"",
"Talk to you in a sec!"
"¡Hablamos en un segundo!"
],
"and": "y"
},
"connection": {
"ERROR": "Error",
"CONNECTING": "Conectando",
"RECONNECTING": "Ocurrió un problema en la red. Reconectando ...",
"RECONNECTING": "Ocurrió un problema en la red. Reconectando...",
"CONNFAIL": "Conexión fallida",
"AUTHENTICATING": "Autenticando",
"AUTHFAIL": "Falló la autenticación",
@@ -303,20 +357,20 @@
"recording": {
"pending": "La grabación esta esperando la entrada de un participante...",
"on": "Grabando",
"off": "Grabación parada",
"off": "Grabación detenida",
"failedToStart": "No se pudo iniciar la grabación",
"buttonTooltip": "Iniciar / parar grabación",
"buttonTooltip": "",
"error": "Falla de grabación. Vuelva a intentarlo.",
"unavailable": "El servicio de grabación no está disponible. Inténtelo más tarde."
},
"liveStreaming": {
"pending": "Iniciando Emisión en Directo",
"pending": "Iniciando Emisión en Directo...",
"on": "Emisión en Directo",
"off": "Emisión en Directo Detenida",
"unavailable": "El servicio de emisión en directo no está disponible actualmente. Por favor inténtelo de nuevo más tarde.",
"failedToStart": "La emisión en Directo falló al iniciar",
"buttonTooltip": "Iniciar / parar emisión en directo",
"streamIdRequired": "Por favor introduzca el id de emisión para poder lanzar la emisión en directo",
"buttonTooltip": "",
"streamIdRequired": "Por favor introduzca el identificador de emisión para poder iniciar la emisión en directo",
"error": "Falló el video en vivo. Por favor, vuelva a intentarlo.",
"busy": "Todos los grabadores están ocupados. Por favor intente más tarde."
}

View File

@@ -1,17 +1,19 @@
{
"contactlist": "Liste de contacts",
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "Paramètres de connexion",
"poweredby": "Produit par",
"downloadlogs": "Téléchargement des logs",
"feedback": "Donnez-nous votre avis",
"roomUrlDefaultMsg": "Votre conférence est en cours de création...",
"participant": "Participant",
"inviteUrlDefaultMsg": "Votre conférence est en cours de création...",
"me": "moi",
"speaker": "Haut-parleur",
"raisedHand": "Aimerais prendre la parole",
"defaultNickname": "ex. Jean Dupont",
"defaultLink": "ex. __url__",
"calling": "Appel __nom__ ...",
"callingName": "__name__",
"userMedia": {
"react-nativeGrantPermissions": "Merci d'autoriser le partage de votre camera et microphone en appuyant sur le bouton <b><i>Autoriser</i></b>",
"chromeGrantPermissions": "Merci d'autoriser le partage de votre camera et microphone en appuyant sur le bouton <b><i>Autoriser</i></b>",
@@ -23,17 +25,18 @@
"nwjsGrantPermissions": "Merci d'autoriser le partage de votre camera et microphone"
},
"keyboardShortcuts": {
"keyboardShortcuts": "Raccourcis clavier :",
"raiseHand": "Demander la parole.",
"pushToTalk": "Appuyer pour parler.",
"toggleScreensharing": "Basculer entre la caméra et le partage d'écran.",
"toggleFilmstrip": "Afficher ou masquer les vidéos miniatures.",
"toggleShortcuts": "Afficher ou masquer ce menu d'aide.",
"focusLocal": "Focus sur la vidéo locale.",
"focusRemote": "Focus sur l'une des vidéos distantes.",
"toggleChat": "Ouvrir ou fermer le panneau de conversation.",
"mute": "Activer ou désactiver le microphone.",
"videoMute": "Arrêter ou démarrer la vidéo locale."
"keyboardShortcuts": "",
"raiseHand": "",
"pushToTalk": "",
"toggleScreensharing": "",
"toggleFilmstrip": "",
"toggleShortcuts": "",
"focusLocal": "",
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
},
"welcomepage": {
"go": "Créer",
@@ -72,33 +75,45 @@
"content": "Apprenez plus au sujet de vos utilisateurs avec une intégration facile de Piwik, Google Analytics et d'autres systèmes de statistiques et supervision d'utilisation."
}
},
"startupoverlay": {
"policyText": "",
"title": ""
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"mute": "Muet / Actif",
"videomute": "Démarrer / Arrêter la caméra",
"videomute": "",
"authenticate": "Authentifiez-vous",
"lock": "Verrouiller / déverrouiller la salle",
"invite": "Inviter des participants",
"chat": "Ouvrir / fermer le chat",
"etherpad": "Document partagé",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "Partager une vidéo Youtube",
"sharescreen": "Partager mon écran",
"fullscreen": "Activer / Désactiver le plein écran",
"sharescreen": "",
"fullscreen": "",
"sip": "Appeler un numéro SIP",
"Settings": "Paramètres",
"hangup": "Raccrocher",
"hangup": "",
"login": "Connexion",
"logout": "Déconnexion",
"dialpad": "Afficher le clavier de numérotation",
"dialpad": "",
"sharedVideoMutedPopup": "Votre vidéo a été mise en muet<br/>pour que vous puissiez parler aux autres participants.",
"micMutedPopup": "Votre microphone a été désactivé afin que vous<br/>puissiez profiter pleinement de votre vidéo partagée.",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "Vous ne pouvez pas réactiver votre microphone pendant que la vidéo partagée est activée.",
"cameraDisabled": "La camera n'est pas disponible",
"micDisabled": "Le microphone n'est pas disponible"
"micDisabled": "Le microphone n'est pas disponible",
"filmstrip": "",
"profile": "",
"raiseHand": ""
},
"bottomtoolbar": {
"chat": "Ouvrir / fermer le chat",
"filmstrip": "Montrer / cacher ma vidéo miniature",
"contactlist": "Ouvrir / fermer ma liste de contacts"
"filmstrip": "Afficher / cacher les vidéos",
"contactlist": ""
},
"chat": {
"nickname": {
@@ -108,23 +123,33 @@
"messagebox": "Saisissez votre texte..."
},
"settings": {
"title": "PARAMÈTRES",
"title": "Paramètres",
"update": "Mise à jour",
"name": "Nom",
"startAudioMuted": "Démarrer sans son",
"startVideoMuted": "Démarrer sans vidéo",
"selectCamera": "Sélectionnez une caméra",
"selectMic": "Sélectionnez un microphone",
"selectAudioOutput": "Sélectionner la sortie audio",
"followMe": "Activer \"me suivre\"",
"startAudioMuted": "Tout le monde commence en muet",
"startVideoMuted": "Tout le monde commence masqué",
"selectCamera": "Caméra",
"selectMic": "Microphone",
"selectAudioOutput": "Sortie audio",
"followMe": "Tout le monde me suit",
"noDevice": "Aucun",
"noPermission": "L'autorisation d'utiliser l'appareil n'a pas été accordé",
"avatarUrl": "URL de l'avatar"
"cameraAndMic": "Caméra et microphone",
"moderator": "MODÉRATEUR",
"password": "DÉFINIR UN MOT DE PASSE",
"audioVideo": "AUDIO ET VIDÉO",
"setPasswordLabel": "Verrouiller votre salle avec un mot de passe."
},
"profile": {
"title": "",
"setDisplayNameLabel": "Choisissez un pseudo",
"setEmailLabel": "Définir votre courriel Gravatar",
"setEmailInput": ""
},
"videothumbnail": {
"editnickname": "Cliquez pour modifier<br/>votre nom",
"moderator": "Le propriétaire de<br/>cette conférence",
"videomute": "Un participant a<br/>arrêté sa caméra.",
"videomute": "Un participant a<br/>arrêté sa caméra",
"mute": "Un participant a coupé son micro",
"kick": "Exclure",
"muted": "Muet",
@@ -132,6 +157,7 @@
"flip": "Retourner"
},
"connectionindicator": {
"header": "",
"bitrate": "Débit :",
"packetloss": "Perte de paquets :",
"resolution": "Résolution :",
@@ -165,34 +191,49 @@
"raisedHand": "Aimerais prendre la parole."
},
"dialog": {
"add": "",
"kickMessage": "Oups! Vous avez été renvoyé de la réunion !",
"popupError": "Votre navigateur bloque les fenêtres popup de ce site. Merci d'activer les popups dans les paramètres de sécurité de votre navigateur et d'essayer à nouveau.",
"passwordErrorTitle": "",
"passwordError": "Cette conversation est actuellement protégée par un mot de passe. Seul le propriétaire de la conférence peut définir un mot de passe.",
"passwordError2": "Cette conversation n'est actuellement pas protégé par un mot de passe. Seul le propriétaire de la conférence peut définir un mot de passe.",
"connectError": "Oups! Un problème est survenu et la connexion à la conférence est impossible.",
"connectErrorWithMsg": "Oups! Un problème est survenu et la connexion à la conférence est impossible: __msg__",
"incorrectPassword": "",
"connecting": "Connexion en cours",
"copy": "Copier",
"error": "Erreur",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Une erreur est survenue pendant la détection de l'extension de partage d'écran.",
"failtoinstall": "Échec de l'installation de l'extension de partage d'écran",
"failedpermissions": "Échec d'obtention des permissions pour utiliser le micro et/ou la caméra.",
"bridgeUnavailable": "Le pont de visioconférence Jitsi est indisponible pour le moment. Réessayez plus tard !",
"jicofoUnavailable": "Le pont de visioconférence Jitsi est indisponible pour le moment. Réessayez plus tard !",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "La limite pour le nombre maximum de participants à la conférence a été atteinte. La conférence est pleine. Veuillez réessayer plus tard !",
"lockTitle": "Échec du verrouillage",
"lockMessage": "Impossible de verrouiller la conférence.",
"warning": "Avertissement",
"passwordNotSupported": "Les mots de passe de conférence ne sont pas supportés.",
"sorry": "Désolé",
"internalError": "Une erreur interne de l'application est survenue [setRemoteDescription]",
"internalErrorTitle": "Erreur interne",
"internalError": "Oups ! Quelque chose s'est mal passé. L'erreur suivante est apparue : [setRemoteDescription]",
"unableToSwitch": "Impossible de changer le flux vidéo.",
"SLDFailure": "Oups! Un problème est survenu et le micro n'a pas été coupé! (Échec SLD)",
"SRDFailure": "Oups! Un problème est survenu et la caméra n'a pas été coupée! (Échec SRD)",
"oops": "Oups !",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "Une erreur est survenue",
"passwordRequired": "Mot de passe requis",
"Ok": "Ok",
"done": "",
"Remove": "Supprimer",
"removePassword": "",
"shareVideoTitle": "Partager une vidéo",
"shareVideoLinkError": "Fournissez s'il vous plaît un lien Youtube fonctionnel.",
"removeSharedVideoTitle": "Supprimer la vidéo partagée",
@@ -202,6 +243,7 @@
"WaitForHostMsg": "La conférence <b>__room__</b> n'a pas encore commencé. Si vous êtes l'hôte, merci de vous authentifier. Sinon, merci d'attendre que l'hôte arrive.",
"IamHost": "Je suis lhôte",
"Cancel": "Annuler",
"Submit": "",
"retry": "Réessayer",
"logoutTitle": "Déconnexion",
"logoutQuestion": "Voulez-vous vraiment vous déconnecter et arrêter la conférence ?",
@@ -216,26 +258,29 @@
"sipMsg": "Saisissez un numéro SIP",
"passwordCheck": "Voulez-vous vraiment supprimer votre mot de passe ?",
"passwordMsg": "Saisissez un mot de passe pour verrouiller la conférence",
"Invite": "Inviter",
"shareLink": "Partagez ce lien avec toutes les personnes que vous voulez inviter",
"shareLink": "",
"settings1": "Configurez votre conférence",
"settings2": "Les participants rejoignent la conférence en étant muets",
"settings3": "Pseudonymes requis<br/><br/>Saisissez un mot de passe pour verrouiller la conférence :",
"yourPassword": "votre mot de passe",
"yourPassword": "Saisissez un nouveau mot de passe",
"Back": "Retour",
"serviceUnavailable": "Service indisponible",
"gracefulShutdown": "Le service est actuellement en maintenance. Réessayez plus tard.",
"Yes": "Oui",
"reservationError": "Erreur du système de réservation",
"reservationErrorMsg": "Code d'erreur: __code__, message: __msg__",
"password": "mot de passe",
"password": "Saisir le mot de passe",
"userPassword": "mot de passe utilisateur",
"token": "jeton",
"tokenAuthFailed": "Échec de l'authentification avec le serveur XMPP : jeton non valide",
"displayNameRequired": "Veuillez saisir votre nom",
"tokenAuthFailedTitle": "Échec de l'authentification",
"tokenAuthFailed": "Désolé, vous n'êtes pas autorisé à rejoindre cette conversation.",
"displayNameRequired": "",
"enterDisplayName": "Veuillez saisir votre nom",
"extensionRequired": "Extension requise :",
"firefoxExtensionPrompt": "Vous devez installer une extension Firefox pour utiliser le partage d'écran. Merci d'essayer de nouveau après l'installation <a href='__url__'>depuis ce lien</a> !",
"feedbackQuestion": "Comment était votre conférence ?",
"rateExperience": "Veuillez évaluer votre réunion.",
"feedbackHelp": "Vos retours nous permettrons d'améliorer notre expérience vidéo.",
"feedbackQuestion": "Informez-nous à propos de votre appel !",
"thankYou": "Merci d'avoir utilisé __appName__ !",
"sorryFeedback": "Nous sommes désolés d'apprendre cela. Voulez-vous nous en dire plus ?",
"liveStreaming": "Direct",
@@ -246,6 +291,7 @@
"stopLiveStreaming": "Arrêter le direct",
"stopRecording": "Arrêter l'enregistrement",
"doNotShowWarningAgain": "Ne plus afficher cet avertissement",
"doNotShowMessageAgain": "",
"permissionDenied": "Permission refusée",
"screenSharingPermissionDeniedError": "Vous n'avez pas autorisé le partage de votre écran.",
"micErrorPresent": "Une erreur est survenue lors de la connexion à votre microphone.",
@@ -253,12 +299,20 @@
"cameraUnsupportedResolutionError": "Votre appareil ne prend pas en charge la résolution vidéo requise.",
"cameraUnknownError": "Vous ne pouvez pas utiliser la caméra pour une raison inconnue.",
"cameraPermissionDeniedError": "Vous n'avez pas autorisé l'utilisation de votre caméra. Vous pouvez toujours participer à la conférence, mais les autres ne vont pas vous voir. Utilisez le bouton de la caméra dans la barre d'adresse pour résoudre ce problème.",
"cameraNotFoundError": "La caméra demandée n'a pas été trouvée.",
"cameraNotFoundError": "La caméra n'a pas été trouvée",
"cameraConstraintFailedError": "Votre caméra ne satisfait pas certaines des contraintes nécessaires.",
"micUnknownError": "Vous ne pouvez pas utiliser le microphone pour une raison inconnue.",
"micPermissionDeniedError": "Vous n'avez pas autorisé l'utilisation de votre microphone. Vous pouvez toujours participer à la conférence, mais les autres ne vont pas vous entendre. Utilisez le bouton du microphone dans la barre d'adresse pour résoudre ce problème.",
"micNotFoundError": "Le microphone demandé n'a pas été trouvé.",
"micConstraintFailedError": "Votre microphone ne satisfait pas certaines des contraintes nécessaires."
"micNotFoundError": "Le microphone n'a pas été détecté.",
"micConstraintFailedError": "Votre microphone ne satisfait pas certaines des contraintes nécessaires.",
"micNotSendingData": "Nous ne pouvons pas accéder à votre microphone. Veuillez sélectionner un autre périphérique dans le menu des paramètres ou essayez de redémarrer l'application.",
"cameraNotSendingData": "Nous ne pouvons pas accéder à votre caméra. Vérifiez si une autre application utilise ce périphérique, sélectionnez un autre périphérique dans le menu des paramètres ou essayez de redémarrer l'application.",
"goToStore": "Aller sur le webstore",
"externalInstallationTitle": "Extension requise : ",
"externalInstallationMsg": "Vous devez installer notre extension de partage de bureau.",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Couper le son"
},
"email": {
"sharedKey": [
@@ -305,7 +359,7 @@
"on": "Enregistrement",
"off": "Enregistrement arrêter",
"failedToStart": "L'enregistrement n'as pas réussi à démarrer",
"buttonTooltip": "Démarrer / arrêter l'enregistrement",
"buttonTooltip": "",
"error": "Échec de l'enregistrement. Veuillez réessayer.",
"unavailable": "Le service d'enregistrement est actuellement indisponible. Veuillez réessayer plus tard."
},
@@ -315,7 +369,7 @@
"off": "Le direct a été arrêter",
"unavailable": "Le direct est temporairement indisponible. Veuillez réessayer plus tard.",
"failedToStart": "Le direct n'as pas réussi à démarrer",
"buttonTooltip": "Démarrer / arrêter le direct",
"buttonTooltip": "",
"streamIdRequired": "Merci de renseigner le stream id pour lancer le direct.",
"error": "La retransmission en direct a échoué. Veuillez réessayer.",
"busy": "Tous les enregistreurs sont actuellement occupés. Veuillez réessayer plus tard."

View File

@@ -1,9 +1,13 @@
{
"contactlist": "Զանգ",
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "Միացման կարգավորումներ",
"poweredby": "Հիմնված է",
"feedback": "Հայտնեք ձեր կարծիքը",
"roomUrlDefaultMsg": "Ձեր կոնֆերանսը այժմ ստեղծվում է...",
"inviteUrlDefaultMsg": "Ձեր կոնֆերանսը այժմ ստեղծվում է...",
"me": "ես",
"speaker": "Հռետոր",
"raisedHand": "Ցանկանում է խոսել",
@@ -11,27 +15,28 @@
"defaultLink": "օրինակ՝ __url__",
"callingName": "__անուն__",
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
"androidGrantPermissions": "",
"react-nativeGrantPermissions": "Խնդրում ենք տրամադրել տեսախցիկը և խոսափողը օգտագործելու թույլտվություններ <b> <i>ընդունել</ i> </ b> կոճակը",
"chromeGrantPermissions": "Խնդրում ենք տրամադրել տեսախցիկը և խոսափողը օգտագործելու թույլտվություններ <b> <i>ընդունել</ i> </ b> կոճակը",
"androidGrantPermissions": "Խնդրում ենք տրամադրել տեսախցիկը և խոսափողը օգտագործելու թույլտվություններ <b> <i>ընդունել</ i> </ b> կոճակը",
"firefoxGrantPermissions": "Խնդրում ենք տրամադրել տեսախցիկը և խոսափողը օգտագործելու թույլտվություններ <b> <i> տարածել նշված սարքը </ i> </ b> կոճակը",
"operaGrantPermissions": "Խնդրում ենք տրամադրել տեսախցիկը և խոսափողը օգտագործելու թույլտվություններ <b> <i>ընդունել</ i> </ b> կոճակը",
"iexplorerGrantPermissions": "",
"iexplorerGrantPermissions": "Խնդրում ենք տրամադրել տեսախցիկը և խոսափողը օգտագործելու թույլտվություններ <b> <i>Այո</ i> </ b> կոճակը",
"safariGrantPermissions": "Խնդրում ենք տրամադրել տեսախցիկը և խոսափողը օգտագործելու թույլտվություններ <b> <i>Այո</ i> </ b> կոճակը",
"nwjsGrantPermissions": "Խնդրում ենք տրամադրել տեսախցիկը և խոսափողը օգտագործելու թույլտվություններ"
},
"keyboardShortcuts": {
"keyboardShortcuts": "Ստեղնաշարի դյուրանցումներ (shortcuts)",
"raiseHand": "Բարձրացրեք Ձեր ձեռքը",
"pushToTalk": "Սեղմեք խոսելու համար",
"toggleScreensharing": "Անցնել ֆոտոխցիկի և էկրանի փոխանակման միջև",
"toggleFilmstrip": "Ցույց տալ կամ թաքցնել տեսանյութերը",
"toggleShortcuts": "Ցույց տալ կամ թաքցնել այս օգնության մենյուն",
"focusLocal": "Կենտրոնանալ տեղական տեսանյութի վրա",
"focusRemote": "Կենտրոնանալ տեղական տեսանյութի վրա",
"toggleChat": "Բացել կամ փակել չատի պանելը",
"mute": "Անջատել կամ միացնել խոսափողը",
"videoMute": "Կանգնեցնել կամ սկսել տեղական տեսանյութը"
"keyboardShortcuts": "",
"raiseHand": "",
"pushToTalk": "",
"toggleScreensharing": "",
"toggleFilmstrip": "",
"toggleShortcuts": "",
"focusLocal": "",
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
},
"welcomepage": {
"go": "ՄՈՒՏՔ",
@@ -70,35 +75,45 @@
"content": "Օգտագործման վիճակագրություն կարելի է ստանալ հեշտ ինտեգրվող Piwik, Google Analytics կամ այլ մոնիտորինգի համակարգերի միջոցով:"
}
},
"startupoverlay": {
"policyText": "",
"title": ""
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"mute": "Ձայնը Միացնել/Անջատել ",
"videomute": "Տեսախցիկը Միացնել/Անջատել ",
"videomute": "",
"authenticate": "Վավերացում",
"lock": "Փակել/բացել սենյակը",
"invite": "Հրավիրել ուրիշներին",
"chat": "Բացել/փակել չատը",
"etherpad": "Համատեղ փաստաթուղթ",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "Կիսվել YouTube-ի նյութով",
"sharescreen": "Ցուցադրել էկրանը",
"fullscreen": "Ամբողջ Էկրանի ռեժիմը միացնել/անջատել",
"sharescreen": "",
"fullscreen": "",
"sip": "Զանգել SIP համարով",
"Settings": "Կարգավորումներ",
"hangup": "Անջատել",
"hangup": "",
"login": "Մուտք",
"logout": "Ելք",
"dialpad": "Ցույց տալ թվաշարը",
"dialpad": "",
"sharedVideoMutedPopup": "Ձեր ցուցադրված տեսանյութի ձայնը անջատված է, այնպես որ <br />, կարող եք խոսել մյուս մասնակիցների հետ:",
"micMutedPopup": "Ձեր խոսափողը անջատված է՝<br/> կարող եք լիովին վայելել ձեր ցուցադրված տեսանյութը:",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "Դուք չեք կարող միացնել ձայնը, քանի դեռ միանցված է ցուցադրվող տեսանյութը:",
"cameraDisabled": "Տեսախցիկը հասանելի չէ",
"micDisabled": "Խոսափողը հասանելի չէ",
"filmstrip": "",
"raiseHand": "Բարձրացրեք ձեռքը խոսելու համար"
"profile": "",
"raiseHand": ""
},
"bottomtoolbar": {
"chat": "Բացել/փակել չատը",
"filmstrip": "Ցույց տալ/թաքցնել տեսանյութները",
"contactlist": "Բացել/փակել կոնտակտների ցուցակը"
"contactlist": ""
},
"chat": {
"nickname": {
@@ -126,9 +141,10 @@
"setPasswordLabel": "Փակել սենյակը գաղտնաբառով"
},
"profile": {
"title": "Էջ",
"title": "",
"setDisplayNameLabel": "Դնել Ձեր երևացող անունը",
"setEmailLabel": "Սահմանեք Ձեր gravatar էլ.փոստը"
"setEmailLabel": "Սահմանեք Ձեր gravatar էլ.փոստը",
"setEmailInput": ""
},
"videothumbnail": {
"editnickname": "Սեղմեք Ձեր անունը <br/>փոխելու համար",
@@ -141,6 +157,7 @@
"flip": "Շրջել"
},
"connectionindicator": {
"header": "",
"bitrate": "Բիթրեյթ",
"packetloss": "Փաթեթների կորուստ՝",
"resolution": "Որակ՝",
@@ -170,20 +187,30 @@
"raisedHand": "Ցանկանում է խոսել"
},
"dialog": {
"add": "",
"kickMessage": "Վա՜յ: Ձեզ դուրս հանեցին հանդիպումից:",
"popupError": "Ձեր բրաուզերը արգելափակել է թռուցիկ(popup) պատուհանները այս կայքում: Խնդրում ենք միացրեք թռուցիկները Ձեր բրաուզերի անվտանգության կարգավորումներում և կրկին փորձեք:",
"passwordErrorTitle": "",
"passwordError": "Այս խոսակցությունը այս պահին պաշտպանված է գաղտնաբառով:Միայն կոնֆերանսի սեփականատերը կարող է սահմանել գաղտնաբառ:",
"passwordError2": "Այս խոսակցությունը այս պահին պաշտպանված չէ գաղտնաբառով:Միայն կոնֆերանսի սեփականատերը կարող է սահմանել գաղտնաբառ:",
"connectError": "Ու՜պս! Ինչոր բան այն չէ և մենք չկարողացանք միանալ կոնֆերանսին:",
"connectErrorWithMsg": "Ու՜պս! Ինչոր բան այն չէ և մենք չկարողացանք միանալ կոնֆերանսին: __msg__",
"incorrectPassword": "",
"connecting": "Միանում է...",
"copy": "Պատճենել",
"error": "Սխալ",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Սխալ, երբ փորձում է հայտնաբերել էկրանի ցուցադրման ընդլայնումը:",
"failtoinstall": "Չհաջողվեց տեղադրել էկրանի ցուցադրման ընդլայնումը",
"failedpermissions": "Չհաջողվեց ստանալ թույլտվություն օգտագործելու տեղի խոսափողը և/ կամ տեսախցիկը:",
"bridgeUnavailable": "Jitsi Videobridge-ը ներկայումս անհասանելի է: Խնդրում ենք փորձեք մի փոքր ուշ!",
"jicofoUnavailable": "Jicofo ներկայումս անհասանելի է: Խնդրում ենք փորձեք ավելի ուշ:",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "Մասնակիցների առավելագույն թիվը արդեն լրացել է: Մասնակիցները արդեն հավաքվել են: Խնդրում ենք փորձեք ավելի ուշ:",
"lockTitle": "Փակումը ձախողվեց",
"lockMessage": "Ձախողվեց արգելափակել կոնֆերանսը:",
@@ -195,10 +222,14 @@
"SLDFailure": "Ու՜պս: Ինչ-որ բան գնաց սխալ, և մենք չկարողացանք անջատել ձայնը (SLD Failure)",
"SRDFailure": "Ու՜պս: Ինչ-որ բան գնաց սխալ, և մենք չկարողացանք անջատել տեսահոսքը (SRD Failure)",
"oops": "Ու՜պս:",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "Առկա էր որոշակի սխալ",
"passwordRequired": "Պահանջվում է գաղտնաբառ",
"Ok": "Ok",
"done": "",
"Remove": "Հեռացնել",
"removePassword": "",
"shareVideoTitle": "Տարածել տեսանյութը",
"shareVideoLinkError": "Խնդրում ենք ներկայացնել ճիշտ Youtube հղում:",
"removeSharedVideoTitle": "Հեռացնել տարածված տեսանյութը",
@@ -208,6 +239,7 @@
"WaitForHostMsg": "Կոնֆերանսը <b> __ root__ </ b> դեռ չի սկսվել. Եթե դուք են հյուրընկալող եք ապա խնդրում ենք հաստատել իսկությունը: Հակառակ դեպքում, խնդրում ենք սպասել հյուրընկալող կժամանի.",
"IamHost": "Ես եմ ընդունողը",
"Cancel": "Չեղարկել",
"Submit": "",
"retry": "Կրկին փորձել",
"logoutTitle": "Ելք",
"logoutQuestion": "Համոզված եք, որ ցանկանում եք դուրս գալ, եւ դադարեցնել կոնֆերանսը:",
@@ -222,7 +254,7 @@
"sipMsg": "Նշեք SIP համարը",
"passwordCheck": "Դուք վստա՞հ էք որ ցանկանում էք ջնջել Ձեր գաղտնաբառը։",
"passwordMsg": "Սահմանել գաղտնաբառ ձեր սենյակը կողպելու համար",
"shareLink": "Պատճենել և կիսվել այս հղումով",
"shareLink": "",
"settings1": "Կարգավորել Ձեր կոնֆերանսը",
"settings2": "Մասնակիցները միացան անջատվախ ձայնով",
"settings3": "Պահանջվում է մականունը<br/><br/>Դրեք գաղտնաբառ Ձեր սենյակը արգելափակելու համար",
@@ -238,7 +270,8 @@
"token": "սիմվոլ",
"tokenAuthFailedTitle": "Վավերացումը չի ստացվել",
"tokenAuthFailed": "Ներողություն,Դուք ընդունված չեք այս զանգին միանալու համար",
"displayNameRequired": "Խնդրում ենք մուտքագրել Ձեր ցուցադրման անունը",
"displayNameRequired": "",
"enterDisplayName": "Խնդրում ենք մուտքագրել Ձեր ցուցադրման անունը",
"extensionRequired": "Ընդլայնում է պահանջվում:",
"firefoxExtensionPrompt": "Դուք պետք է տեղադրեք Firefox ընդլայնում, որպեսզի օգտագործել էկրանի փոխանակման ռեժիմը: Խնդրում ենք փորձեք կրկին՝ այն <a href='__url__'> այստեղից ձեռք բերելուց հետո</a>:",
"rateExperience": "Խնդրում ենք ներկայացրեք Ձեր հանդիպման փորձը",
@@ -254,6 +287,7 @@
"stopLiveStreaming": "Կանգնացնել ուղիղ հեռարձակումը:",
"stopRecording": "Կանգնացնել ձայնագրումը",
"doNotShowWarningAgain": "Այլևս ցույց չտալ այս նախազգուշական էջը",
"doNotShowMessageAgain": "",
"permissionDenied": "Թույլատվությունը արգելված է",
"screenSharingPermissionDeniedError": "Դուք չունեք թույլտվություն կիսվել Ձեր էկրանով",
"micErrorPresent": "Տեղի է ունեցել սխալ Ձեր խոսափողին միանալիս",
@@ -271,7 +305,10 @@
"cameraNotSendingData": "Մենք չեն կարողանում միանալ Ձեր տեսախցիկին: Խնդրում ենք ստուգեք թե արդյոք մեկ ուրիշ սարք չի օգտագործում այն կամ ընտրեք մեկ այլ սարք կարգավորումների ցանկից կամ փորձեք վերսկսել ծրագիրը:",
"goToStore": "Գնալ դեպի վեբ խանութ",
"externalInstallationTitle": "Ընդլայնում է պահանջվում:",
"externalInstallationMsg": "Չհաջողվեց տեղադրել էկրանի ցուցադրման ընդլայնումը"
"externalInstallationMsg": "Չհաջողվեց տեղադրել էկրանի ցուցադրման ընդլայնումը",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Անջատել ձայնը"
},
"email": {
"sharedKey": [
@@ -314,7 +351,7 @@
"on": "Գրանցում",
"off": "Ձայնագրությունը կանգնացված է",
"failedToStart": "Ձայնագրությունը ստացվեց սկսել",
"buttonTooltip": "Սկսել / կանգնացնել ձայնագրությունը",
"buttonTooltip": "",
"error": "Ձայնագրությյունը չստացվեց: Փորձեք կրկին",
"unavailable": "Ձայնագրության ծառայությունը ներկայումս անհասանելի է: Խնդրում եմ փորձեք մի փոքր ուշ:"
},
@@ -324,7 +361,7 @@
"off": "Ուղիղ Հեռարձակումը կանգնեցված է",
"unavailable": "Ուղիղ հեռարձակման ծառայությունը ներկայումս հասանելի չէ: Խնդրում եք փորձեք ավելի ուշ:",
"failedToStart": "Ուղիղ հեռարձակումը չստացվեց սկսել",
"buttonTooltip": "Սկսել / կանգնեցնել ուղիղ հեռարձակումը",
"buttonTooltip": "",
"streamIdRequired": "Խնդրում ենք լրացնել հոսքի ID-ն, որպեսզի կսկսի հեռարձակումը:",
"error": "Ուղիղ հեռարձակումը չստացվեց: Փորձեք կրկին",
"busy": "Բոլոր ձայնագրիչները ներկայումս զբաղված են: Խնդրում ենք փորձեք մի փոքր ուշ:"

View File

@@ -1,17 +1,19 @@
{
"contactlist": "LISTA CONTATTI",
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "Impostazioni Connessione",
"poweredby": "powered by",
"downloadlogs": "Scarica logs",
"feedback": "",
"roomUrlDefaultMsg": "La tua conferenza sta per essere creata...",
"participant": "Partecipante",
"inviteUrlDefaultMsg": "La tua conferenza sta per essere creata...",
"me": "io",
"speaker": "Relatore",
"raisedHand": "",
"defaultNickname": "",
"defaultLink": "es. __url__",
"calling": "",
"callingName": "",
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -33,6 +35,7 @@
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
},
"welcomepage": {
@@ -72,33 +75,45 @@
"content": "Impara come i tuoi utenti lo utilizzano con la facile integrazione con PiWik, Google Analytics, e altri sistemi di statistica e monitor dell'utilizzo."
}
},
"startupoverlay": {
"policyText": "",
"title": ""
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"mute": "Microfono Attiva / Disattiva",
"videomute": "Abilita / Disabilita video",
"videomute": "",
"authenticate": "Autenticazione",
"lock": "Blocca / Sblocca Stanza",
"invite": "Invita altri",
"chat": "Apri / Chiudi chat",
"etherpad": "Documento condiviso",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "",
"sharescreen": "Condividi schermo",
"fullscreen": "Entra / Esci da schermo intero",
"sharescreen": "",
"fullscreen": "",
"sip": "Chiama numero SIP",
"Settings": "Impostazioni",
"hangup": "Termina",
"hangup": "",
"login": "Login",
"logout": "Logout",
"dialpad": "Mostra il tastierino",
"dialpad": "",
"sharedVideoMutedPopup": "",
"micMutedPopup": "",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "",
"cameraDisabled": "",
"micDisabled": ""
"micDisabled": "",
"filmstrip": "",
"profile": "",
"raiseHand": ""
},
"bottomtoolbar": {
"chat": "Apri / Chiudi chat",
"filmstrip": "Mostra / Nascondi miniature",
"contactlist": "Apri / Chiudi la lista contatti"
"filmstrip": "",
"contactlist": ""
},
"chat": {
"nickname": {
@@ -108,7 +123,7 @@
"messagebox": "Inserisci testo..."
},
"settings": {
"title": "IMPOSTAZIONI",
"title": "Impostazioni",
"update": "Aggiorna",
"name": "Nome",
"startAudioMuted": "",
@@ -119,12 +134,22 @@
"followMe": "",
"noDevice": "",
"noPermission": "",
"avatarUrl": ""
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
},
"profile": {
"title": "",
"setDisplayNameLabel": "",
"setEmailLabel": "",
"setEmailInput": ""
},
"videothumbnail": {
"editnickname": "Clicca per modificare il tuo<br/>nome visualizzato",
"moderator": "Il proprietario<br/>della conferenza",
"videomute": "Il partecipante ha<br/>fermato il video.",
"videomute": "",
"mute": "Il partecipante è in muto",
"kick": "Espelli",
"muted": "Audio disattivato",
@@ -132,6 +157,7 @@
"flip": ""
},
"connectionindicator": {
"header": "",
"bitrate": "Bitrate:",
"packetloss": "Perdita pacchetti:",
"resolution": "Risoluzione:",
@@ -165,43 +191,59 @@
"raisedHand": ""
},
"dialog": {
"add": "",
"kickMessage": "Accidenti! Sei stato espulso dalla conferenza !",
"popupError": "",
"passwordErrorTitle": "",
"passwordError": "",
"passwordError2": "",
"connectError": "Oops! Qualcosa è andato storto e non ti puoi collegare alla conferenza.",
"connectErrorWithMsg": "Oops! Qualcosa è andato storto e non ti puoi collegare alla conferenza: __msg__",
"incorrectPassword": "",
"connecting": "Connessione",
"copy": "",
"error": "Errore",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Errore durante il rilevamento dell'estensione per il desktopsharing.",
"failtoinstall": "Impossibile installare l'estensione per il desktop sharing",
"failedpermissions": "Impossibile ottenere i permessi per usare il microfono e/o il video locale.",
"bridgeUnavailable": "Il Videobridge non è al momento disponibile. Si prega di riprovare più tardi!",
"jicofoUnavailable": "",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "",
"lockTitle": "Blocco fallito",
"lockMessage": "",
"lockMessage": "Impossibile bloccare la conferenza.",
"warning": "Attenzione",
"passwordNotSupported": "Le password sulla stanza non sono al momento supportate.",
"sorry": "Spiacente",
"internalError": "Errore interno dell'applicazione [setRemoteDescription]",
"internalErrorTitle": "",
"internalError": "",
"unableToSwitch": "Impossibile cambiare lo stream video.",
"SLDFailure": "Oops! Qualcosa è andato storto e non è possibile silenziare il microfono! (Errore SLD)",
"SRDFailure": "Oops! Qualcosa è andato storto e non è possibile fermare il video! (Errore SRD)",
"oops": "Oops!",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "C'è stato qualche tipo di errore",
"passwordRequired": "Richiesta password ",
"Ok": "Ok",
"done": "",
"Remove": "Rimuovi",
"removePassword": "",
"shareVideoTitle": "",
"shareVideoLinkError": "",
"shareVideoLinkError": "Fornire un link Prezi esatto.",
"removeSharedVideoTitle": "",
"removeSharedVideoMsg": "",
"removeSharedVideoMsg": "Sei sicuro di voler rimuovere il tuo Prezi?",
"alreadySharedVideoMsg": "",
"WaitingForHost": "In attesa dell'organizzatore ...",
"WaitForHostMsg": "La conferenza <b>__room__ </b> non è ancora iniziata. Se sei l'organizzatore sei pregato di autenticarti, altrimenti ti preghiamo di attendere l'arrivo dell'organizzatore.",
"IamHost": "Sono l'organizzatore",
"Cancel": "Annulla",
"Submit": "",
"retry": "Riprova",
"logoutTitle": "Logout",
"logoutQuestion": "Vuoi disconnetterti e interrompere la conferenza ?",
@@ -216,25 +258,28 @@
"sipMsg": "Inserire numero SIP",
"passwordCheck": "Confermi la rimozione della password?",
"passwordMsg": "Imposta una password per bloccare la stanza",
"Invite": "Invita",
"shareLink": "Condividi questo link con tutte le persone che vuoi invitare",
"shareLink": "",
"settings1": "Configura la tua conferenza",
"settings2": "Partecipanti connessi in muto",
"settings3": "Richiedi nicknames<br/><br/>Imposta una password per bloccare la tua stanza:",
"yourPassword": "la tua password",
"yourPassword": "",
"Back": "Indietro",
"serviceUnavailable": "Servizio non disponibile",
"gracefulShutdown": "Il nostro servizio è al momento spento per manutenzione. Si prega di riprovare più tardi.",
"Yes": "Sì",
"reservationError": "Errore di sistema in prenotazione",
"reservationErrorMsg": "Codice di errore: __code__, messaggio: __msg__",
"password": "password",
"password": "",
"userPassword": "password utente",
"token": "token",
"tokenAuthFailedTitle": "",
"tokenAuthFailed": "",
"displayNameRequired": "",
"enterDisplayName": "Per favore, inserisci il tuo nome utente:",
"extensionRequired": "",
"firefoxExtensionPrompt": "",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "",
"sorryFeedback": "",
@@ -246,6 +291,7 @@
"stopLiveStreaming": "",
"stopRecording": "",
"doNotShowWarningAgain": "",
"doNotShowMessageAgain": "",
"permissionDenied": "",
"screenSharingPermissionDeniedError": "",
"micErrorPresent": "",
@@ -258,8 +304,17 @@
"micUnknownError": "",
"micPermissionDeniedError": "",
"micNotFoundError": "",
"micConstraintFailedError": ""
"micConstraintFailedError": "",
"micNotSendingData": "",
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Disattiva audio"
},
"\u0005dialog": {},
"email": {
"sharedKey": "",
"subject": "Invito su __appName__ (__conferenceName__)",

View File

@@ -1,9 +1,13 @@
{
"contactlist": "Al telefòn",
"contactlist": "Participants (__pcount__)",
"addParticipants": "Partejatz lo ligam",
"roomLocked": "Los qu'apèlan devon picar un senhal",
"roomUnlocked": "Qual que siá amb lo ligam pòt participar",
"passwordSetRemotely": "causit per qualqu'un mai",
"connectionsettings": "Paramètres de connexion",
"poweredby": "Produit per",
"feedback": "Donatz-nos vòstre vejaire",
"roomUrlDefaultMsg": "Vòstra conferéncia es en cors de creacion...",
"inviteUrlDefaultMsg": "Vòstra conferéncia es en cors de creacion...",
"me": "ieu",
"speaker": "Nautparlaire",
"raisedHand": "Volriatz charrar",
@@ -22,16 +26,17 @@
},
"keyboardShortcuts": {
"keyboardShortcuts": "Acorchis de clavièr",
"raiseHand": "Demandar a parlar.",
"raiseHand": "Demandar o pas la paraula",
"pushToTalk": "Butar per parlar",
"toggleScreensharing": "Caplevar entre camerà e partatge d'ecran",
"toggleFilmstrip": "Mostrar o escondre la vidèo",
"toggleShortcuts": "Afichar o amagar aiceste menú d'ajuda",
"focusLocal": "Focus sus la vidèo locala.",
"focusRemote": "Focus sus una de las vidèas aluènhadas.",
"toggleChat": "Dubrir o tampar lo panèl de conversacion.",
"mute": "Activar o desactivar lo microfòn.",
"videoMute": "Arrestar o lançar la vidèo locala."
"focusLocal": "Centrar sus vòstra vidèo",
"focusRemote": "Centrar sus la vidèo de qualqu'un mai",
"toggleChat": "Dubrir o tampar lo panèl de conversacion",
"mute": "Activar o desactivar lo microfòn",
"fullScreen": "Activar / Desactivar l'ecran complet",
"videoMute": "Aviar o arrestar vòstra camerà"
},
"welcomepage": {
"go": "Crear",
@@ -70,35 +75,45 @@
"content": "Aprenètz mai a prepaus de vòstres utilizaires amb una integracion aisida de Piwik, Google Analytics e d'autres sistèmas d'estatisticas e supervision d'utilizacion."
}
},
"startupoverlay": {
"policyText": "&nbsp;",
"title": "__app__ a besonh d'utilizar vòstre microfòn e camerà."
},
"suspendedoverlay": {
"title": "Vòstra conferéncia vidèo es estada arrestada perque vòstre ordinador se botèt en velha.",
"rejoinKeyTitle": "Tornar participar"
},
"toolbar": {
"mute": "Mut / Actiu",
"videomute": "Aviar / Arrestar la camèra",
"videomute": "Aviar / Arrestar la camerà",
"authenticate": "Autentificatz-vos",
"lock": "Verrolhar / desverrolhar la sala",
"invite": "Convidar de participants",
"chat": "Dobrir / tampar lo chat",
"etherpad": "Document partejat",
"invite": "Partejatz lo ligam",
"chat": "Dobrir / tampar la conversacion",
"etherpad": "Dobrir / Tampar los documents partejats",
"sharedvideo": "Partejar una vidèo Youtube",
"sharescreen": "Partejar mon ecran",
"fullscreen": "Activar / Désactivar l'ecran complet",
"sharescreen": "Aviar / Arrestar lo partatge d'ecran",
"fullscreen": "Activar / Desactivar l'ecran complet",
"sip": "Sonar un numèro SIP",
"Settings": "Paramètres",
"hangup": "Tornar penjar",
"hangup": "Quitar",
"login": "Connexion",
"logout": "Desconnexion",
"dialpad": "Afichar lo clavièr de numerotacion",
"dialpad": "Dubrir / Tampar lo clavièr",
"sharedVideoMutedPopup": "Vòstra vidèo es estada mesa en mut<br/>per que poscatz parlar als autres participants.",
"micMutedPopup": "Vòstre microfòn es estat desactivat per fin que <br/>poscatz profeitar plenament de vòstra vidèo partejada.",
"talkWhileMutedPopup": "Ensajatz de parlar ? Vòstre microfòn es copat.",
"unableToUnmutePopup": "Podètz pas reactivar vòstre microfòn pendent que la vidèo partejada es activada.",
"cameraDisabled": "La camerà es pas disponibla",
"micDisabled": "Lo microfòn es pas disponible",
"filmstrip": "",
"raiseHand": "Demandar la paraula"
"filmstrip": "Mostrar / escondre vidèos",
"profile": "Modificar vòstre perfil",
"raiseHand": "Demandar / Demandar pas mai la paraula"
},
"bottomtoolbar": {
"chat": "Dobrir / tampar lo chat",
"filmstrip": "Mostrar / escondre vidèos",
"contactlist": "Dobrir / tampar ma lista de contactes"
"contactlist": "Veire e convidar de participants"
},
"chat": {
"nickname": {
@@ -126,9 +141,10 @@
"setPasswordLabel": "Verrolhar vòstra sala amb un senhal"
},
"profile": {
"title": "PERFIL",
"title": "Perfil",
"setDisplayNameLabel": "Causissètz vòstra nom",
"setEmailLabel": "Definir vòstre corrièl per gravatar"
"setEmailLabel": "Definir vòstre corrièl per gravatar",
"setEmailInput": "Picatz lo corrièl"
},
"videothumbnail": {
"editnickname": "Clicatz per modificar<br/>vòstre nom",
@@ -141,6 +157,7 @@
"flip": "Revirar"
},
"connectionindicator": {
"header": "Donadas de connexion",
"bitrate": "Debit :",
"packetloss": "Pèrda de paquets :",
"resolution": "Resolucion :",
@@ -174,20 +191,30 @@
"raisedHand": "Volriá parlar."
},
"dialog": {
"add": "Apondre",
"kickMessage": "Ops! Sètz estat bandit de la reünion !",
"popupError": "Vòstre navigador blòca las fenèstras popup d'aqueste site. Mercé d'activar las popups dins los paramètres de seguretat de vòstre navigador e d'ensajar tornamai.",
"passwordErrorTitle": "Error de senhal",
"passwordError": "Aquesta conversacion es actualament protegida per un senhal. Sol lo proprietari de la conferéncia pòt definir un senhal.",
"passwordError2": "Actualament, aquesta conversacion es pas protegida per un senhal. Sol lo proprietari de la conferéncia pòt definir un senhal.",
"connectError": "Ops! Quicòm a trucat e la connexion a la conferéncia es impossibla.",
"connectErrorWithMsg": "Ops! Quicòm a trucat e la connexion a la conferéncia es impossibla: __msg__",
"incorrectPassword": "Lo senhal es incorrècte",
"connecting": "Connexion en cors",
"copy": "Copiar",
"error": "Error",
"roomLocked": "Aquesta conversacion es verrolhada. Lo nòu-venguts devon aver lo ligam e lo senhal per participar.",
"addPassword": "Apondre un senhal",
"createPassword": "Crear un senhal",
"detectext": "Una error s'es produita pendent la deteccion de l'extension de partiment d'ecran.",
"failtoinstall": "Fracàs de l'installacion de l'extension de partiment d'ecran",
"failedpermissions": "Fracàs d'obtencion de las permissions per utilizar lo micro e/o la camèra.",
"bridgeUnavailable": "Lo pont de visioconferéncia Jitsi es indisponible pel moment. Ensajatz tornamai pus tard !",
"jicofoUnavailable": "Lo pont de visioconferéncia Jitsi es indisponible pel moment. Ensajatz tornamai pus tard !",
"conferenceReloadTitle": "Malurosament, quicòm truquèt",
"conferenceReloadMsg": "Sèm a trobar una solucion per aquò",
"conferenceDisconnectTitle": "Sètz estat desconnectat. Vos cal benlèu verificar vòstra connexion.",
"conferenceDisconnectMsg": "Se tòrna connectar dins...",
"reconnectNow": "Es a se tornar connectar ara",
"conferenceReloadTimeLeft": "__seconds__ segondas.",
"maxUsersLimitReached": "Lo limit pel nombre maximum de participants a la conferéncia es estat atent. La conferéncia es plena. Ensajatz tornamai pus tard !",
"lockTitle": "Fracàs del verrolhatge",
"lockMessage": "Impossible de verrolhar la conferéncia.",
@@ -199,10 +226,14 @@
"SLDFailure": "Ops! Quicòm a trucat e lo micro es pas estat copat! (Fracàs SLD)",
"SRDFailure": "Ops! Quicòm a trucat e la camèra es pas estada copada! (Fracàs SRD)",
"oops": "Ops !",
"currentPassword": "L'actual senhal es",
"passwordLabel": "Senhal",
"defaultError": "Una error s'es produita",
"passwordRequired": "Senhal requesit",
"Ok": "D'acòrdi",
"done": "Acabat",
"Remove": "Suprimir",
"removePassword": "Levar lo senhal",
"shareVideoTitle": "Partejar una vidèo",
"shareVideoLinkError": "Se vos plai, provesissètz un ligam Youtube foncional.",
"removeSharedVideoTitle": "Suprimir la vidèo partejada",
@@ -212,6 +243,7 @@
"WaitForHostMsg": "La conferéncia <b> __ room__ </b> es pas encara començat. Se sètz l'òste, mercé de vos autentificar. Siquenon, mercé d'esperar que l'òste arribe.",
"IamHost": "Soi lòste",
"Cancel": "Anullar",
"Submit": "Validar",
"retry": "Ensajar tornamai",
"logoutTitle": "Desconnexion",
"logoutQuestion": "Sètz segur que vos volètz desconnectar e arrestar la conferéncia ?",
@@ -226,7 +258,7 @@
"sipMsg": "Sasissètz un numèro SIP",
"passwordCheck": "Sètz segur que volètz suprimir vòstre senhal ?",
"passwordMsg": "Sasissètz un senhal per verrolhar la conferéncia",
"shareLink": "Copiatz e partejatz aqueste ligam",
"shareLink": "Partejatz lo ligam de la conversacion",
"settings1": "Configuratz vòstra conferéncia",
"settings2": "Los participants rejonhon la conferéncia en essent muts",
"settings3": "Escaisses requesits<br/><br/>Sasissètz un senhal per verrolhar la conferéncia :",
@@ -242,7 +274,8 @@
"token": "geton",
"tokenAuthFailedTitle": "Fracàs de l'autentificacion",
"tokenAuthFailed": "O planhèm, sètz pas autorizat a rejónher l'apèl.",
"displayNameRequired": "Sasissètz vòstre nom",
"displayNameRequired": "Un nom d'afichatge es necessari",
"enterDisplayName": "Sasissètz vòstre nom",
"extensionRequired": "Extension requesida :",
"firefoxExtensionPrompt": "Vos cal installar una extension Firefox per utilizar lo partiment d'ecran. Mercé ensajar tornamai aprèp l'installacion <a href='__url__'>dempuèi aqueste ligam</a> !",
"rateExperience": "Mercés de donar una nota à vòstra experiéncia.",
@@ -258,6 +291,7 @@
"stopLiveStreaming": "Arrestar lo dirècte",
"stopRecording": "Arrestar l'enregistrament",
"doNotShowWarningAgain": "Afichar pas mai aqueste avertiment",
"doNotShowMessageAgain": "Afichar pas mai aqueste messatge",
"permissionDenied": "Permission Refusada",
"screenSharingPermissionDeniedError": "Vos cal autorizar lo partatge de vòstre ecran.",
"micErrorPresent": "I a agut una error pendent la connexion al microfòn.",
@@ -273,9 +307,12 @@
"micConstraintFailedError": "Vòstre microfòn satisfà pas totas las constrentas necessàrias.",
"micNotSendingData": "Podèm pas aver l'accès a vòstre microfòn. Mercés de ne causir un autre dins lo menú de paramètres o ensajatz de tornar dubrir l'aplicacion.",
"cameraNotSendingData": "Podèm pas aver l'accès a vòstra camèra. Mercés de verificar se una autra aplicacion es pas a l'utilizar, causissètz una autra camèra dins lo menú de paramètres o ensajatz de tornar dubrir l'aplicacion.",
"goToStore": "Anatz sul webstore",
"goToStore": "Anar sul webstore",
"externalInstallationTitle": "Extension requesida :",
"externalInstallationMsg": "Avètz d'installar nòstra extension de partiment d'ecran."
"externalInstallationMsg": "Avètz d'installar nòstra extension de partiment d'ecran.",
"muteParticipantTitle": "Copar lo micro als participants ?",
"muteParticipantBody": "Poiretz pas lo tornar activar lo microfòn, mai eles pòdon o far quand vòlon.",
"muteParticipantButton": "Copar lo son"
},
"email": {
"sharedKey": [

View File

@@ -1,9 +1,13 @@
{
"contactlist": "w trakcie rozmowy",
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "ustawienia połączenia",
"poweredby": "Uruchomiono",
"feedback": "jaka jest twoja opinia ?",
"roomUrlDefaultMsg": "otwarto twoją konferencję",
"inviteUrlDefaultMsg": "otwarto twoją konferencję",
"me": "to ja",
"speaker": "głośnik",
"raisedHand": "Chcesz się odezwać ?",
@@ -11,27 +15,28 @@
"defaultLink": "np. _url_",
"callingName": "_nazwa_",
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
"androidGrantPermissions": "",
"react-nativeGrantPermissions": "wyraź zgodę na użycie kamery i mikrofonu naciskając <b><i>Allow</i></b> przycisk",
"chromeGrantPermissions": "wyraź zgodę na użycie kamery i mikrofonu naciskając <b><i>Allow</i></b> przycisk",
"androidGrantPermissions": "wyraź zgodę na użycie kamery i mikrofonu naciskając <b><i>Allow</i></b> przycisk",
"firefoxGrantPermissions": "wyraź zgodę na użycie kamery i mikrofonu naciskając <b><i>Share Selected Device</i></b> przycisk",
"operaGrantPermissions": "wyraź zgodę na użycie kamery i mikrofonu naciskając <b><i>Allow</i></b> przycisk",
"iexplorerGrantPermissions": "",
"iexplorerGrantPermissions": "wyraź zgodę na użycie kamery i mikrofonu naciskając <b><i>OK</i></b> przycisk",
"safariGrantPermissions": "wyraź zgodę na użycie kamery i mikrofonu naciskając <b><i>OK</i></b> przycisk",
"nwjsGrantPermissions": "wyraź zgodę na użycie kamery i mikrofonu"
},
"keyboardShortcuts": {
"keyboardShortcuts": "Skróty klawiaturowe:",
"raiseHand": "Unieś rękę.",
"pushToTalk": "naciśnij i mów",
"toggleScreensharing": "Przełączanie pomiędzy kamerą i wspóldzieleniem ekranu",
"toggleFilmstrip": "Pokaż lub ukryj klipy wideo",
"toggleShortcuts": "Pokaż lub ukryj pasek pomocy.",
"focusLocal": "Przełącz na lokalne wideo.",
"focusRemote": "Przełącz na któreś ze zdalnych wideo.",
"toggleChat": "Otwórz lub zamknij panel czat.",
"mute": "Wyłącz lub włącz mikrofon.",
"videoMute": "Start lub stop lokalne wideo."
"keyboardShortcuts": "",
"raiseHand": "",
"pushToTalk": "",
"toggleScreensharing": "",
"toggleFilmstrip": "",
"toggleShortcuts": "",
"focusLocal": "",
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
},
"welcomepage": {
"go": "IDŹ",
@@ -70,35 +75,45 @@
"content": "Analizuj uczestników konferencji z łatwościa integrując dane z Piwik i Google Analitics i innymi systemami monitorującymi."
}
},
"startupoverlay": {
"policyText": "",
"title": ""
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"mute": "Wycisz / Pogłośnij",
"videomute": "Kamera start / stop ",
"videomute": "",
"authenticate": "Uwierzytelnianie",
"lock": "Zamknij / Otwórz salę",
"invite": "Zaproś innych",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "Udostępniaj dokument",
"etherpad": "",
"sharedvideo": "Udostępniaj wideo w Youtube",
"sharescreen": "Udostępnij ekran",
"fullscreen": "Otwórz / Zamknij pełny ekran",
"sharescreen": "",
"fullscreen": "",
"sip": "Wykręć numer SIP",
"Settings": "",
"hangup": "Rozłącz",
"Settings": "Ustawienia",
"hangup": "",
"login": "Zaloguj",
"logout": "",
"dialpad": "Wyświetl panel wybierania",
"logout": "Wyloguj",
"dialpad": "",
"sharedVideoMutedPopup": "Współdzielone wideo zostało wyciszone i <br/> możesz zacząć rozmawiać z innymi.",
"micMutedPopup": "Mikrofon został wyłączony i <br/> możesz spokojnie konsumować współdzielone wideo",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "Nie możesz pogłośnić audio podczas współużytkowania wideo",
"cameraDisabled": "Kamera nie jest dostępna",
"micDisabled": "Mikrofon nie jest dostępny",
"filmstrip": "",
"raiseHand": "Podnieś rękę chcąc zabrać głos"
"profile": "",
"raiseHand": ""
},
"bottomtoolbar": {
"chat": "Otwórz / Zamknij Czat",
"filmstrip": "Pokaż / Ukryj klipy wideo",
"contactlist": "Otwórz / Zamknij spis kontaktów"
"contactlist": ""
},
"chat": {
"nickname": {
@@ -126,21 +141,23 @@
"setPasswordLabel": "Zamknij salę konferencyjną z hasłem"
},
"profile": {
"title": "PROFIL",
"title": "",
"setDisplayNameLabel": "Podaj swoją wyświetlaną nazwę",
"setEmailLabel": "Ustaw email swojego gravatara"
"setEmailLabel": "Ustaw email swojego gravatara",
"setEmailInput": ""
},
"videothumbnail": {
"editnickname": "Kliknij <br/>celem edycji swojej nazwy",
"moderator": "Gospodarz <br/>tej konferencji",
"videomute": "Uczestnik <br/>wyłączyl kamerę",
"mute": "Uczestnik ma wyciszone audio",
"kick": "Kick out",
"kick": "Spadaj!",
"muted": "Wyciszony",
"domute": "Wyciszenie",
"flip": "Odwrócenie"
},
"connectionindicator": {
"header": "",
"bitrate": "Szybkość transmisji:",
"packetloss": "Strata pakietów:",
"resolution": "Rozdzielczość:",
@@ -178,20 +195,30 @@
"raisedHand": "Możesz mówić."
},
"dialog": {
"add": "",
"kickMessage": "Ocho! Zostałeś wyproszony z konferencji!",
"popupError": "Twoja przeglądarka blokuje wyskakujące okienka z tej witryny. Proszę, zmień w ustawieniach przeglądarki.",
"passwordErrorTitle": "",
"passwordError": "Ta konwersacja aktualnie jest zabezpieczona hasłem. Tylko gospodarz konferencji może zakładać hasło.",
"passwordError2": "Ta rozmowa nie jest zabezpieczona hasłem. Tylko gospodarz konferencji może ustanowić hasło zabezpieczające.",
"connectError": "Ocho! Cos poszło nie tak, nie można podłaczyć się do tej konferencji.",
"connectErrorWithMsg": "Ocho! Coś poszło nie tak i nie można podłączyć się do tej konferencji:_msg_",
"connecting": "",
"incorrectPassword": "",
"connecting": "Nawiązywanie połączenia",
"copy": "Kopiuj",
"error": "",
"error": "Błąd",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Błąd podczas rozpoznania rozszerzenia wspóldzielenia ekranu.",
"failtoinstall": "Instalacja współdzielenia ekranu nie powiodła się.",
"failedpermissions": "Brak akceptacji dla użycia kamery i mikrofonu",
"bridgeUnavailable": "Jitsi Videobridge aktualnie jest niedostępne. Proszę, spróbuj później!",
"jicofoUnavailable": "Jicofo jest aktualnie niedostępne. Proszę, spróbuj później!",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "Osiągnięto max liczbę uczestników konferencji. Proszę spróbuj później! ",
"lockTitle": "Nie powiodło się zabezpieczenie konferencji",
"lockMessage": "Zabezpieczenie konferencji nie powiodło się.",
@@ -203,10 +230,14 @@
"SLDFailure": "Ocho! Coś poszło nie tak i nie można wyciszyć! (SLD Failure)",
"SRDFailure": "Ocho! Coś poszło nie tak i nie można zatrzymać wideo! (SRD Failure)",
"oops": "Ups",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "Wystąpił jakiś błąd",
"passwordRequired": "Wymagane hasło",
"Ok": "Ok",
"done": "",
"Remove": "Usuń",
"removePassword": "",
"shareVideoTitle": "Współdziel wideo",
"shareVideoLinkError": "Podaj proszę prawidłowy link youtube.",
"removeSharedVideoTitle": "Usuń wideo współdzielone",
@@ -216,6 +247,7 @@
"WaitForHostMsg": "Konferencja <b>_room_</b> jeszcze nie wystartowała. Jeśli jesteś gospodarzem podaj dane autentykacji. Jeśli nie czekaj na gospodarza.",
"IamHost": "Jestem gospodarzem",
"Cancel": "Anuluj",
"Submit": "",
"retry": "Ponów",
"logoutTitle": "Wyloguj",
"logoutQuestion": "Na pewno chcesz się wylogować i zakończyć konferencję?",
@@ -224,13 +256,13 @@
"joinAgain": "Ponownie przystąp",
"Share": "Współdziel",
"Save": "Zapisz",
"recording": "",
"recording": "Nagrywanie",
"recordingToken": "Proszę podać token nagrywania",
"Dial": "Dzwoń",
"sipMsg": "Podaj numer SIP",
"passwordCheck": "Czy na pewno chcesz usunąć swoje hasło ?",
"passwordMsg": "Podaj hasło aby zabezpieczyć salę konferencyjną",
"shareLink": "Skopiuj i udostępnij ten link",
"shareLink": "",
"settings1": "Skonfiguruj swoją konferencję",
"settings2": "Wyciszenie współuczestników",
"settings3": "Wymagane nicki <br/><br/>Wprowadź hasło dla zabezpieczenia sali konferencyjnej:",
@@ -246,7 +278,8 @@
"token": "token",
"tokenAuthFailedTitle": "Problem uwierzytelnienia",
"tokenAuthFailed": "Przepraszam, ale nie jesteś upoważniony do uczestnictwa w tym połączeniu",
"displayNameRequired": "Wprowadź swoją nazwę użytkownika",
"displayNameRequired": "",
"enterDisplayName": "Wprowadź swoją nazwę użytkownika",
"extensionRequired": "Wymagane jest rozszerzenie:",
"firefoxExtensionPrompt": "Potrzebujesz zainstalować rozszerzenie firefox aby móc współdzielić ekran. Spróbuj ponownie później <a href='__url__'>weź z</a>!",
"rateExperience": "Oceń proszę swoje doświadczenia z konferencji.",
@@ -254,7 +287,7 @@
"feedbackQuestion": "Powiedz nam o twoim połączeniu!",
"thankYou": "Dziękujemy Ci za używanie _appName_!",
"sorryFeedback": "Przykro nam to słyszeć. Czy możesz powiedzieć więcej na ten temat?",
"liveStreaming": "",
"liveStreaming": "Strumień live",
"streamKey": "Nazwa strumienia/klucz",
"startLiveStreaming": "Uruchom strumień live",
"stopStreamingWarning": "Czy jesteś pewny, że chcesz zatrzymać ten strumień live?",
@@ -262,6 +295,7 @@
"stopLiveStreaming": "Zatrzymaj transmisję live",
"stopRecording": "Zatrzymaj nagrywanie",
"doNotShowWarningAgain": "Nie pokazuj tego ostrzeżenia ponownie",
"doNotShowMessageAgain": "",
"permissionDenied": "Brak uprawnień",
"screenSharingPermissionDeniedError": "Nie posiadasz uprawnień do współdzielenia ekranu.",
"micErrorPresent": "Wystąpił błąd w dostępie do mikrofonu.",
@@ -279,7 +313,10 @@
"cameraNotSendingData": "Nie możemy mieć dostępu do twojej kamery. Sprawdź czy inna aplikacja nie używa twojej kamery, wybierz inne urządzenie lub ponownie uruchom aplikację.",
"goToStore": "Idź do sklepu",
"externalInstallationTitle": "Wymagane rozszerzenie",
"externalInstallationMsg": "Zainstaluj rozszerzenie naszego współdzielenia ekranu."
"externalInstallationMsg": "Zainstaluj rozszerzenie naszego współdzielenia ekranu.",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Wyciszenie"
},
"email": {
"sharedKey": [
@@ -326,7 +363,7 @@
"on": "Nagrywanie",
"off": "Nagrywanie zatrzymane",
"failedToStart": "Nagrywanie nie jest możliwe",
"buttonTooltip": "Nagrywanie start / stop",
"buttonTooltip": "",
"error": "Nagranie się nie powiodło. Proszę, spróbuj ponownie.",
"unavailable": "Serwis nagrywania jest aktualnie niedostępny. Proszę, spróbować później."
},
@@ -336,7 +373,7 @@
"off": "Strumieniowanie live zastopowane",
"unavailable": "Strumieniowanie live aktualnie jest niedostepne. Proszę spróbować później.",
"failedToStart": "Strumieniowanie live nie powiodło się",
"buttonTooltip": "Strumieniowanie live start / stop",
"buttonTooltip": "",
"streamIdRequired": "Proszę podaj id strumieniowania aby uruchomić live.",
"error": "Strumieniowanie live nie powiodło się. Spróbuj później.",
"busy": "Wszystkie nagrywarki są zajęte. Proszę, sprawdź ponownie później."

View File

@@ -1,9 +1,13 @@
{
"contactlist": "Na chamada",
"contactlist": "Participantes (__pcount__)",
"addParticipants": "Compartilhar o link",
"roomLocked": "Visitantes precisam digitar uma senha",
"roomUnlocked": "Qualquer um com o link pode entrar",
"passwordSetRemotely": "Definido por outro participante",
"connectionsettings": "Configurações de conexão",
"poweredby": "distribuído por",
"feedback": "Dê seus comentários",
"roomUrlDefaultMsg": "Sua conferência está sendo criado...",
"inviteUrlDefaultMsg": "Sua conferência está sendo criado...",
"me": "eu",
"speaker": "Orador",
"raisedHand": "Gostaria de falar",
@@ -21,17 +25,18 @@
"nwjsGrantPermissions": "Dê as permissões para usar sua câmera e microfone"
},
"keyboardShortcuts": {
"keyboardShortcuts": "Atalhos de teclado:",
"raiseHand": "Erguer sua mão.",
"pushToTalk": "Pressione para falar.",
"toggleScreensharing": "Trocar entre câmera e compartilhamento de tela.",
"toggleFilmstrip": "Mostrar ou ocultar os vídeos.",
"toggleShortcuts": "Mostrar ou ocultar este menu de ajuda.",
"focusLocal": "Foco no vídeo local.",
"focusRemote": "Foco em um dos vídeos remotos.",
"toggleChat": "Abrir ou fechar o painel de bate-papo.",
"mute": "Deixar mudo ou não o microfone.",
"videoMute": "Parar ou iniciar o vídeo local."
"keyboardShortcuts": "Atalhos de teclado",
"raiseHand": "Erga ou baixe sua mão",
"pushToTalk": "Pressione para falar",
"toggleScreensharing": "Trocar entre câmera e compartilhamento de tela",
"toggleFilmstrip": "Mostrar ou ocultar a barra lateral",
"toggleShortcuts": "Mostrar ou ocultar este menu de ajuda",
"focusLocal": "Foco em seu vídeo",
"focusRemote": "Foco no vídeo de outro visitante",
"toggleChat": "Abrir ou fechar o painel de bate-papo",
"mute": "Deixar mudo ou não o microfone",
"fullScreen": "Entrar ou sair da tela cheia",
"videoMute": "Iniciar ou parar sua câmera"
},
"welcomepage": {
"go": "IR",
@@ -70,35 +75,45 @@
"content": "Aprenda sobre seus usuários através de integração fácil com o Piwik, Google Analytics, e outros sistemas de monitoramento e estatísticas."
}
},
"startupoverlay": {
"policyText": "&nbsp;",
"title": "O __app__ precisa usar seu microfone e câmera."
},
"suspendedoverlay": {
"title": "Sua chamada de vídeo foi interrompida, porque seu computador foi dormir.",
"rejoinKeyTitle": "Reentrar"
},
"toolbar": {
"mute": "Mudo / Não mudo",
"videomute": "Iniciar / parar a câmera",
"videomute": "Iniciar ou parar a câmera",
"authenticate": "Autenticar",
"lock": "Travar / destravar a sala",
"invite": "Convidar outros",
"chat": "Abrir / fechar bate-papo",
"etherpad": "Documento compartilhado",
"lock": "Travar ou destravar a sala",
"invite": "Compartilhar o link",
"chat": "Abrir ou fechar o bate-papo",
"etherpad": "Abrir ou fechar o documento compartilhado",
"sharedvideo": "Compartilhar um vídeo do YouTube",
"sharescreen": "Compartilhar tela",
"fullscreen": "Entrar / Sair de Tela Cheia",
"sharescreen": "Iniciar ou parar o compartilhamento de tela",
"fullscreen": "Entrar ou sair da tela cheia",
"sip": "Chamar número SIP",
"Settings": "Configurações",
"hangup": "Desligar",
"hangup": "Sair",
"login": "Iniciar sessão",
"logout": "Encerrar sessão",
"dialpad": "Mostrar teclas de discagem",
"dialpad": "Abrir ou fechar teclado de discagem",
"sharedVideoMutedPopup": "Seu vídeo compartilhado está mudo assim<br/>você pode falar com os outros participantes.",
"micMutedPopup": "Seu microfone está mudo assim que você<br/>pode curtir plenamente seu vídeo compartilhado.",
"talkWhileMutedPopup": "Tentando falar? Você está em mudo.",
"unableToUnmutePopup": "Você não pode sair do mudo enquanto seu vídeo compartilhado está ativo.",
"cameraDisabled": "A câmera não está disponível",
"micDisabled": "O microfone não está disponível",
"filmstrip": "",
"raiseHand": "Levantar a mão para falar"
"filmstrip": "Mostrar / ocultar vídeos",
"profile": "Editar seu perfil",
"raiseHand": "Erguer o baixar sua mão"
},
"bottomtoolbar": {
"chat": "Abrir / fechar bate-papo",
"filmstrip": "Mostrar/ocultar vídeos",
"contactlist": "Abrir / fechar a lista de contatos"
"contactlist": "Ver e convidar participantes"
},
"chat": {
"nickname": {
@@ -126,9 +141,10 @@
"setPasswordLabel": "Trancar sua sala com uma senha."
},
"profile": {
"title": "PERFIL",
"title": "Perfil",
"setDisplayNameLabel": "Definir seu nome de exibição",
"setEmailLabel": "Definir seu email de gravatar"
"setEmailLabel": "Definir seu email de gravatar",
"setEmailInput": "Digite e-mail"
},
"videothumbnail": {
"editnickname": "Clique para editar o seu <br/>nome de exibição",
@@ -141,6 +157,7 @@
"flip": "Inverter"
},
"connectionindicator": {
"header": "Dados da conexão",
"bitrate": "Taxa de bits:",
"packetloss": "Perda de pacote:",
"resolution": "Resolução:",
@@ -174,20 +191,30 @@
"raisedHand": "Gostaria de falar."
},
"dialog": {
"add": "Adicionar",
"kickMessage": "Ouch! Você o chutou para fora da reunião!",
"popupError": "Seu navegador está bloqueando janelas popup deste site. Por favor, habilite popups nas configurações de segurança do seu navegador e tente novamente.",
"passwordErrorTitle": "Erro na senha",
"passwordError": "Esta conversa está protegida atualmente por uma senha. Somente o dono da conferência pode definir a senha.",
"passwordError2": "Esta reunião não está protegida por senha atualmente. Somente o dono da conferência pode definir a senha.",
"connectError": "Oops! Alguma coisa está errada e nós não pudemos conectar à conferência.",
"connectErrorWithMsg": "Oops! Alguma coisa está errada e não podemos conectar à conferência: __msg__",
"incorrectPassword": "A senha está incorreta",
"connecting": "Conectando",
"copy": "Copiar",
"error": "Erro",
"roomLocked": "Esta chamada está fechada. Novos visitantes precisam ter o link e digitar a senha para entrar",
"addPassword": "Adicionar uma senha",
"createPassword": "Criar uma senha",
"detectext": "Erro enquanto tenta detectar a extensão de compartilhamento de tela.",
"failtoinstall": "Falhou a instalação da extensão de compartilhamento de tela",
"failedpermissions": "Falha ao obter permissões para usar o microfone e/ou câmera local.",
"bridgeUnavailable": "Jitsi Videobridge está atualmente indisponível. Por favor, tente mais tarde!",
"jicofoUnavailable": "Jicofo está atualmente indisponível. Por favor, tente mais tarde!",
"conferenceReloadTitle": "Infelizmente, algo deu errado",
"conferenceReloadMsg": "Estamos tentando concertar isso",
"conferenceDisconnectTitle": "Você foi desconectado. Verifique sua conexão de rede.",
"conferenceDisconnectMsg": "Reconectando em...",
"reconnectNow": "Reconecte agora",
"conferenceReloadTimeLeft": "__seconds__ s.",
"maxUsersLimitReached": "O limite para o número máximo de participantes na conferência foi atingida. A conferência está cheia. Por favor, tente mais tarde!",
"lockTitle": "Bloqueio falhou",
"lockMessage": "Falha ao travar a conferência.",
@@ -199,10 +226,14 @@
"SLDFailure": "Oops! Alguma coisa está errada e nós falhamos em silenciar! (Falha do SLD)",
"SRDFailure": "Oops! Alguma coisa está errada e nós falhamos em parar o vídeo! (Falha do SRD)",
"oops": "Oops!",
"currentPassword": "A senha atual é",
"passwordLabel": "Senha",
"defaultError": "Aqui teve algum tipo de erro",
"passwordRequired": "Senha requerida",
"Ok": "Ok",
"done": "Feito",
"Remove": "Remover",
"removePassword": "Remover senha",
"shareVideoTitle": "Compartilhar um vídeo",
"shareVideoLinkError": "Por favor, forneça um link do youtube correto.",
"removeSharedVideoTitle": "Remover vídeo compartilhado",
@@ -212,12 +243,13 @@
"WaitForHostMsg": "A conferência <b>__room__</b> não foi iniciada. Se você é o hospedeiro, então autentique-se. Caso contrário, aguarde o hospedeiro chegar.",
"IamHost": "Eu sou o hospedeiro",
"Cancel": "Cancelar",
"Submit": "Enviar",
"retry": "Tentar novamente",
"logoutTitle": "Encerrar sessão",
"logoutQuestion": "Está certo em encerrar a sessão e terminar a conferência?",
"sessTerminated": "Sessão Terminada",
"hungUp": "Você desconectou",
"joinAgain": "Conectar novamente",
"joinAgain": "Entrar novamente",
"Share": "Compartilhar",
"Save": "Salvar",
"recording": "Gravando",
@@ -226,7 +258,7 @@
"sipMsg": "Digite o número SIP",
"passwordCheck": "Você tem certeza que deseja remover sua senha?",
"passwordMsg": "Definir uma senha para trancar sua sala",
"shareLink": "Copiar e compartilhar este link",
"shareLink": "Compartilhar o link para a chamada",
"settings1": "Configure sua conferência",
"settings2": "Participantes entram mudos",
"settings3": "Requer apelidos<br/><br/>Defina uma senha para trancar sua sala:",
@@ -242,7 +274,8 @@
"token": "token",
"tokenAuthFailedTitle": "Problema na autenticação",
"tokenAuthFailed": "Desculpe, você não está autorizado a entrar nesta chamada.",
"displayNameRequired": "Digite seu nome de exibição",
"displayNameRequired": "Mostrar o nome é requerido",
"enterDisplayName": "Digite seu nome de exibição",
"extensionRequired": "Extensão requerida:",
"firefoxExtensionPrompt": "Você precisa instalar uma extensão do Firefox para compartilhar a tela. Tente novamente depois que você <a href='__url__'>pegá-lo aqui</a>!",
"rateExperience": "Por favor, avalie sua experiência na reunião.",
@@ -258,6 +291,7 @@
"stopLiveStreaming": "Parar o live streaming",
"stopRecording": "Parar a gravação",
"doNotShowWarningAgain": "Não exibir este aviso novamente",
"doNotShowMessageAgain": "Não mostre esta mensagem novamente",
"permissionDenied": "Permissão Negada",
"screenSharingPermissionDeniedError": "Você não tem permissão concedida para compartilhar sua tela.",
"micErrorPresent": "Ocorreu um erro conectando seu microfone.",
@@ -275,7 +309,10 @@
"cameraNotSendingData": "Sua câmera está inacessível. Verifique se outra aplicação está usando este dispositivo, selecione outro dispositivo do menu de configurações ou tente reiniciar a aplicação.",
"goToStore": "Vá para a loja virtual",
"externalInstallationTitle": "Extensão requerida",
"externalInstallationMsg": "Você precisa instalar nossa extensão de compartilhamento de tela."
"externalInstallationMsg": "Você precisa instalar nossa extensão de compartilhamento de tela.",
"muteParticipantTitle": "Deixar mudo este participante?",
"muteParticipantBody": "Você não está habilitado para tirar o mudo deles, mas eles podem tirar o mudo deles mesmos a qualquer tempo.",
"muteParticipantButton": "Mudo"
},
"email": {
"sharedKey": [
@@ -290,14 +327,18 @@
"body": [
"Olá, gostaria de convidá-lo para uma conferência do __appName__ na qual eu estou participando.",
"",
"Por favor clique no endereço a seguir para participar:",
"",
"Por favor clique no link a seguir para entrar na conferência.",
"",
"",
"__roomUrl__",
"",
"__sharedKeyText__",
" Note que o __appName__ atualmente só funciona nos navegadores __supportedBrowsers__, assim é preciso abrir o link com um deles para poder participar.",
"",
"Aguardo sua presença!"
"__sharedKeyText__",
" Note que o __appName__ atualmente só funciona nos navegadores __supportedBrowsers__, assim é necessário usar um destes navegadores.",
"",
"",
"Falo com com você em um segundo!"
],
"and": "e"
},

View File

@@ -1,26 +1,28 @@
{
"contactlist": "",
"connectionsettings": "",
"poweredby": "",
"downloadlogs": "",
"feedback": "",
"roomUrlDefaultMsg": "",
"participant": "",
"me": "",
"speaker": "",
"raisedHand": "",
"defaultNickname": "",
"defaultLink": "",
"calling": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "Настройки подключения",
"poweredby": "работает на",
"feedback": "Оставьте нам свой отзыв",
"inviteUrlDefaultMsg": "Ваша конференция создается в данный момент...",
"me": "Я",
"speaker": "Говорящий",
"raisedHand": "Хочет говорить",
"defaultNickname": "напр. Яна Цветочкина",
"defaultLink": "напр. __url__",
"callingName": "",
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
"androidGrantPermissions": "",
"firefoxGrantPermissions": "",
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": ""
"react-nativeGrantPermissions": "Пожалуйста, дайте разрешение на доступ к камере и микрофону нажатием на кнопку <b><i>Разрешить</i></b>",
"chromeGrantPermissions": "Пожалуйста, дайте разрешение на доступ к камере и микрофону нажатием на кнопку <b><i>Разрешить</i></b>",
"androidGrantPermissions": "Пожалуйста, дайте разрешение на доступ к камере и микрофону нажатием на кнопку <b><i>Разрешить</i></b>",
"firefoxGrantPermissions": "Пожалуйста дайте разрешение на доступ к камере и микрофону нажатием на кнопку <b><i>Разрешить доступ к выбранному устройству</i></b>",
"operaGrantPermissions": "Пожалуйста, дайте разрешение на доступ к камере и микрофону нажатием на кнопку <b><i>Разрешить</i></b>",
"iexplorerGrantPermissions": "Пожалуйста дайте разрешение на доступ к камере и микрофону нажатием на кнопку <b><i>ОК</i></b>",
"safariGrantPermissions": "Пожалуйста дайте разрешение на доступ к камере и микрофону нажатием на кнопку <b><i>ОК</i></b>",
"nwjsGrantPermissions": "Пожалуйста дайте разрешение на доступ к камере и микрофону"
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
@@ -33,269 +35,347 @@
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
},
"welcomepage": {
"go": "",
"roomname": "",
"disable": "",
"go": "Вперед!",
"roomname": "Введите название комнаты",
"disable": "Не показывать эту страницу снова",
"feature1": {
"title": "",
"content": ""
"title": "Простой в использовании",
"content": "Нет нужды что-либо скачивать. __app__ работает прямо из вашего браузера. Просто отправьте URL ссылку на вашу конференцию другим, чтобы начать общение."
},
"feature2": {
"title": "",
"content": ""
"title": "Низкие требования к ширине канала",
"content": "Многопользовательским видеоконференциям достаточно скорости передачи данных в 128 Кбит/с. Демонстрация экрана или аудиоконференции требуют и того меньше."
},
"feature3": {
"title": "",
"content": ""
"title": "Открытый исходный код",
"content": "__app__ лицензирован под Apache License. Вы можете свободно скачивать, использовать, изменять это ПО в соответствии с условиями лицензии."
},
"feature4": {
"title": "",
"content": ""
"title": "Неограниченное количество пользовательниц",
"content": "Нет никаких искусственных ограничений по количеству пользовательниц или участников конференций. Вас отграничивают только мощность сервера и качество соединения."
},
"feature5": {
"title": "",
"content": ""
"title": "Общий доступ к экрану",
"content": "С лёгкостью можно пользоваться экраном совместно. __app__ идеально для онлайн презентаций, лекций и сеансов техподдержки."
},
"feature6": {
"title": "",
"content": ""
"title": "Защищённые комнаты",
"content": "Нужно больше приватности? __app__ конференц-комнаты могут быть защищены паролем, чтобы исключить незваных гостей или заминки."
},
"feature7": {
"title": "",
"content": ""
"title": "Поделиться заметками",
"content": "__app__ включает Etherpad, текстовый редактор для совместной работы над текстом в реальном времени, который замечательно подходит, чтобы вести протоколы или совместно писать статьи."
},
"feature8": {
"title": "",
"content": ""
"title": "Статистика использования",
"content": "Узнайте больше о пользователях с помощью интеграции с Piwik, Google Analytics и другими системами мониторига и сбора статистики."
}
},
"startupoverlay": {
"policyText": "",
"title": ""
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"mute": "",
"mute": "Вкл. / Выкл. звук",
"videomute": "",
"authenticate": "",
"authenticate": "Аутентифицировать",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "",
"sharedvideo": "Поделиться YouTube видео",
"sharescreen": "",
"fullscreen": "",
"sip": "",
"Settings": "",
"sip": "Набрать SIP номер",
"Settings": "Настройки",
"hangup": "",
"login": "",
"logout": "",
"login": "Войти",
"logout": "Завершить сеанс",
"dialpad": "",
"sharedVideoMutedPopup": "",
"micMutedPopup": "",
"unableToUnmutePopup": "",
"cameraDisabled": "",
"micDisabled": ""
"sharedVideoMutedPopup": "У видео, которым Вы поделились, отключён звук, чтобы вы могли говорить с остальными.",
"micMutedPopup": "Ваш микрофон отключён, чтобы вы могли сосредоточиться на видео, которым поделились.",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "Вы не можете включить звук, потому что включено видео.",
"cameraDisabled": "Камера недоступна",
"micDisabled": "Микрофон недоступен",
"filmstrip": "",
"profile": "",
"raiseHand": ""
},
"bottomtoolbar": {
"chat": "",
"chat": "Открыть / Закрыть чат",
"filmstrip": "",
"contactlist": ""
},
"chat": {
"nickname": {
"title": "",
"popover": ""
"title": "Введите имя в поле ниже",
"popover": "Выберите имя"
},
"messagebox": ""
"messagebox": "Введите текст.."
},
"settings": {
"title": "",
"update": "",
"name": "",
"title": "Настройки",
"update": "Обновить",
"name": "Имя",
"startAudioMuted": "",
"startVideoMuted": "",
"selectCamera": "",
"selectMic": "",
"selectAudioOutput": "",
"followMe": "",
"noDevice": "",
"noPermission": "",
"avatarUrl": ""
"noDevice": "Нет",
"noPermission": "Нет прав пользоваться устройством",
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
},
"profile": {
"title": "",
"setDisplayNameLabel": "",
"setEmailLabel": "",
"setEmailInput": ""
},
"videothumbnail": {
"editnickname": "",
"moderator": "",
"editnickname": "Нажми, чтобы<br/>поменять имя экрана",
"moderator": "Хозяйка конференции.",
"videomute": "",
"mute": "",
"kick": "",
"muted": "",
"domute": "",
"flip": ""
"mute": "Без звука",
"kick": "Прогнать",
"muted": "Звук выключен",
"domute": "Выключить звук",
"flip": "Отразить"
},
"connectionindicator": {
"bitrate": "",
"packetloss": "",
"resolution": "",
"less": "",
"more": "",
"address": "",
"remoteport": "",
"header": "",
"bitrate": "Битрейт",
"packetloss": "Потеря пакетов:",
"resolution": "Разрешение:",
"less": "Свернуть",
"more": "Показать больше",
"address": "Адрес:",
"remoteport": "Удалённый порт:",
"remoteport_plural_2": "",
"localport": "",
"localport_plural_2": "",
"localaddress": "",
"localaddress_plural_2": "",
"remoteaddress": "",
"remoteport_plural_5": "",
"localport": "Локальный порт:",
"localport_plural_2": "Локальные порты:",
"localport_plural_5": "",
"localaddress": "Локальный адрес:",
"localaddress_plural_2": "Локальные адреса:",
"localaddress_plural_5": "",
"remoteaddress": "Удалённый адрес:",
"remoteaddress_plural_2": "",
"transport": "",
"bandwidth": "",
"na": ""
"remoteaddress_plural_5": "",
"transport": "Метод отправки:",
"bandwidth": "Средняя скорость соединения:",
"na": "Вернитесь сюда за информацией о соединении, когда конференция начнётся"
},
"notify": {
"disconnected": "",
"moderator": "",
"connected": "",
"somebody": "",
"me": "",
"focus": "",
"focusFail": "",
"grantedTo": "",
"grantedToUnknown": "",
"muted": "",
"mutedTitle": "",
"raisedHand": ""
"disconnected": "соединение разорвано",
"moderator": "Получены права для модерации!",
"connected": "подключено",
"somebody": "Кто-то",
"me": "Я",
"focus": "Фокусировка конференции",
"focusFail": "__component__ недоступен - повторите через __ms__ секунд",
"grantedTo": "Теперь модерирует __to__!",
"grantedToUnknown": "Права модератора теперь у $t(somebody)!",
"muted": "Вы начали конференцию без звука.",
"mutedTitle": "Вы без звука!",
"raisedHand": "Хочу высказаться."
},
"dialog": {
"kickMessage": "",
"popupError": "",
"passwordError": "",
"passwordError2": "",
"connectError": "",
"connectErrorWithMsg": "",
"connecting": "",
"error": "",
"detectext": "",
"failtoinstall": "",
"failedpermissions": "",
"bridgeUnavailable": "",
"jicofoUnavailable": "",
"maxUsersLimitReached": "",
"lockTitle": "",
"lockMessage": "",
"warning": "",
"passwordNotSupported": "",
"sorry": "",
"add": "",
"kickMessage": "Фигасе! Вас прогнали со встречи!",
"popupError": "Ваш браузер блокирует всплывающие окна на этом сайте. Пожалуйста разрешите всплывающие окна в настройках безопасности и попробуйте снова.",
"passwordErrorTitle": "",
"passwordError": "Этот разговор сейчас защищён паролем. Только хозяйка конференции может устанавливать пароль.",
"passwordError2": "Эта конференция защищена паролем. Только хозяйка конференции может устанавливать пароль.",
"connectError": "Ёпрст! Что-то пошло не так и мы не можем связаться с конференцией.",
"connectErrorWithMsg": "Ёпрст! Что-то пошло не так и мы не можем связаться с конференцией: __msg__",
"incorrectPassword": "",
"connecting": "Идёт подключение",
"copy": "",
"error": "Ошибка",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Ошибка при попытке определить расширение для совместного использования экрана.",
"failtoinstall": "Невозможно установить расширение для совместного использования рабочего стола",
"failedpermissions": "Невозможно получить права на использование локального микрофона и/или камеры.",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "Достигнут максимум количества участников конференции. Конференция заполнена. Пожалуйста попробуйте позже!",
"lockTitle": "Блокировка не удалась",
"lockMessage": "Не удалось запереть конференцию",
"warning": "Внимание",
"passwordNotSupported": "Пароли для комнат сейчас не поддерживаются.",
"internalErrorTitle": "",
"internalError": "",
"unableToSwitch": "",
"SLDFailure": "",
"SRDFailure": "",
"oops": "",
"defaultError": "",
"passwordRequired": "",
"Ok": "",
"Remove": "",
"shareVideoTitle": "",
"shareVideoLinkError": "",
"removeSharedVideoTitle": "",
"removeSharedVideoMsg": "",
"alreadySharedVideoMsg": "",
"WaitingForHost": "",
"WaitForHostMsg": "",
"IamHost": "",
"Cancel": "",
"retry": "",
"logoutTitle": "",
"logoutQuestion": "",
"sessTerminated": "",
"hungUp": "",
"joinAgain": "",
"Share": "",
"Save": "",
"recording": "",
"recordingToken": "",
"Dial": "",
"sipMsg": "",
"passwordCheck": "",
"passwordMsg": "",
"Invite": "",
"unableToSwitch": "Невозможно сменить видео трансляцию.",
"SLDFailure": "Ёпрст! Что-то пошло не так и мы не можем отключить звук! (ошибка SLD)",
"SRDFailure": "Ёпрст! Что-то пошло не так и мы не можем остановить видео! (ошибка SRD)",
"oops": "Ёпрст!",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "Какая-то ошибка",
"passwordRequired": "Требуется пароль",
"Ok": "Ok",
"done": "",
"Remove": "Удалить",
"removePassword": "",
"shareVideoTitle": "Поделиться видео",
"shareVideoLinkError": "Пожалуйста введите корректную youtube ссылку.",
"removeSharedVideoTitle": "Удалить общее видео",
"removeSharedVideoMsg": "Вы уверрены, что хотите удалить ваше расшаренное видео?",
"alreadySharedVideoMsg": "Другая участница сейчас делится видео. В этой конференции можно делиться только одним видео одновременно.",
"WaitingForHost": "Ожидание хоста...",
"WaitForHostMsg": "Конференция <b>__room__ </b> ещё не началась. Если вы её хост - аутентифицируйтесь. Или сидите ждите хоста.",
"IamHost": "Я хост",
"Cancel": "Отменить",
"Submit": "",
"retry": "Повторить",
"logoutTitle": "Завершить сеанс",
"logoutQuestion": "Вы уверены, что хотите выйти и остановить конференцию?",
"sessTerminated": "Сеанс закрыт",
"hungUp": "Вы повесили трубку",
"joinAgain": "Войдите заново",
"Share": "Поделиться",
"Save": "Сохранить",
"recording": "Запись",
"recordingToken": "Введите токен для записи",
"Dial": "Дозвон",
"sipMsg": "Введите SIP-номер",
"passwordCheck": "Вы уверены, что хотите удалить ваш пароль?",
"passwordMsg": "Введите пароль для вашей комнаты",
"shareLink": "",
"settings1": "",
"settings2": "",
"settings3": "",
"settings1": "Настройка Вашей конференции",
"settings2": "Участница подключилась без звука",
"settings3": "Нужны имена<br/><br/>Установите пароль, чтобы запереть Вашу комнату:",
"yourPassword": "",
"Back": "",
"serviceUnavailable": "",
"gracefulShutdown": "",
"Yes": "",
"reservationError": "",
"reservationErrorMsg": "",
"Back": "Назад",
"serviceUnavailable": "Служба недоступна",
"gracefulShutdown": "Сервис закрыт на переучёт. Пожалуйста попробуйте позже.",
"Yes": "Да",
"reservationError": "Ошибка системы резервации",
"reservationErrorMsg": "Код ошибки: __code__, сообщение: __msg__",
"password": "",
"userPassword": "",
"token": "",
"userPassword": "пароль пользователя",
"token": "токен",
"tokenAuthFailedTitle": "",
"tokenAuthFailed": "",
"displayNameRequired": "",
"extensionRequired": "",
"firefoxExtensionPrompt": "",
"enterDisplayName": "Пожалуйста, введите Ваше имя экрана",
"extensionRequired": "Требуется расширение:",
"firefoxExtensionPrompt": "Нужно установить расширение Firefox, чтобы совместно пользоваться экраном. Попробуйте позже, скачав его <a href='__url__'>отсюда</a>!",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "",
"sorryFeedback": "",
"liveStreaming": "",
"streamKey": "",
"startLiveStreaming": "",
"stopStreamingWarning": "",
"stopRecordingWarning": "",
"stopLiveStreaming": "",
"stopRecording": "",
"doNotShowWarningAgain": "",
"permissionDenied": "",
"screenSharingPermissionDeniedError": "",
"micErrorPresent": "",
"cameraErrorPresent": "",
"cameraUnsupportedResolutionError": "",
"cameraUnknownError": "",
"cameraPermissionDeniedError": "",
"thankYou": "Спасибо за использование __appName__!",
"sorryFeedback": "Мы удручены услышанным. Может расскажете поподробнее?",
"liveStreaming": "Трансляция",
"streamKey": "Имя/ключ трансляции",
"startLiveStreaming": "Начать трансляцию",
"stopStreamingWarning": "Вы уверены, что хотите остановить трансляцию?",
"stopRecordingWarning": "Вы уверены, что хотите остановить запись?",
"stopLiveStreaming": "Остановить трансляцию",
"stopRecording": "Остановить запись",
"doNotShowWarningAgain": "Больше не показывать это предупреждение",
"doNotShowMessageAgain": "",
"permissionDenied": "Доступ запрещён",
"screenSharingPermissionDeniedError": "У Вас нет прав совместно использовать Ваш экран",
"micErrorPresent": "Произошла ошибка при подключении к Вашему микрофону",
"cameraErrorPresent": "Произошла ошибка при подключении к Вашей камере",
"cameraUnsupportedResolutionError": "Ваша камера не поддерживает необходимое разрешение.",
"cameraUnknownError": "Не могу использовать камеру по неизвестной причине.",
"cameraPermissionDeniedError": "У вас нет прав на использование камеры. Вы можете участвовать в конференции, но другие не будут Вас видеть. Используйте значок с камерой в строке адреса, чтобы устранить проблему.",
"cameraNotFoundError": "",
"cameraConstraintFailedError": "",
"micUnknownError": "",
"micPermissionDeniedError": "",
"cameraConstraintFailedError": "Ваша камера не отвечает некоторым требованиям.",
"micUnknownError": "Не могу пользоваться микрофоном по непонятным причинам.",
"micPermissionDeniedError": "Вы не дали прав на использование микрофона. Вы все-равно можете присоединиться к конференции, но никто не будет Вас слышать. Используйте иконку с камерой в адресной строке браузера, чтобы исправить это.",
"micNotFoundError": "",
"micConstraintFailedError": ""
"micConstraintFailedError": "Ваш микрофон не отвечает некоторым необходимым требованиям.",
"micNotSendingData": "",
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Выключить звук"
},
"email": {
"sharedKey": "",
"subject": "",
"body": "",
"and": ""
"sharedKey": [
"Эта конференция защищена паролем. Пожалуйста, используйте это пин для входа:",
"",
"",
"__sharedKey__",
"",
""
],
"subject": "Приглашение для __appName__ (__conferenceName__)",
"body": [
"Привет! я бы хотел пригласить тебя на __appName__ конференцию, которую мы как раз начали.",
"",
"",
"Пожелуста, следуй по ссылке, чтобы подключиться к конференции.",
"",
"",
"__roomUrl__",
"",
"",
"__sharedKeyText__",
"Имей в виду, что __appName__ сейчас поддерживается только __supportedBrowsers__, так что полюзуйся одним из этих браузеров.",
"",
"",
"Услышимся через секунду!"
],
"and": "и"
},
"connection": {
"ERROR": "",
"CONNECTING": "",
"RECONNECTING": "",
"CONNFAIL": "",
"AUTHENTICATING": "",
"AUTHFAIL": "",
"CONNECTED": "",
"DISCONNECTED": "",
"DISCONNECTING": "",
"ATTACHED": ""
"ERROR": "Ошибка",
"CONNECTING": "Идёт подключение",
"RECONNECTING": "Проблема с сетью. Переподключение...",
"CONNFAIL": "Сбой подключения",
"AUTHENTICATING": "Аутентификация",
"AUTHFAIL": "Ошибка аутентификации",
"CONNECTED": "Подключено",
"DISCONNECTED": "Отключено",
"DISCONNECTING": "Отключение",
"ATTACHED": "Прикреплено"
},
"recording": {
"pending": "",
"on": "",
"off": "",
"failedToStart": "",
"pending": "Записываем ожидаем подключение участницы...",
"on": "Запись",
"off": "Запись остановлена",
"failedToStart": "Ошибка при начале записи",
"buttonTooltip": "",
"error": "",
"unavailable": ""
"error": "Ошибка записи. Попробуйте позже.",
"unavailable": "Сервис записи сейчас недоступен. Попробуйте позже."
},
"liveStreaming": {
"pending": "",
"on": "",
"off": "",
"unavailable": "",
"failedToStart": "",
"pending": "Начинаю трансляцию...",
"on": "Трансляция",
"off": "Трансляция остановлена",
"unavailable": "Служба трансляций сейчас недоступна. Попробуйте позже.",
"failedToStart": "Трансляция видео не может быть начата",
"buttonTooltip": "",
"streamIdRequired": "",
"error": "",
"busy": ""
"streamIdRequired": "Пожалуйста введите идентификатор трансляции, чтобы запустить её.",
"error": "Не удалось начать трансляцию. Попробуйте снова.",
"busy": "Все рекордеры сейчас заняты. Попробуйте позже."
}
}

View File

@@ -1,17 +1,19 @@
{
"contactlist": "ZOZNAM KONTAKTOV",
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "Nastavenie spojenia",
"poweredby": "založené na",
"downloadlogs": "Stiahnúť logy",
"feedback": "",
"roomUrlDefaultMsg": "Vaša konferencia bola práve vytvorená...",
"participant": "Účastník",
"inviteUrlDefaultMsg": "Vaša konferencia bola práve vytvorená...",
"me": "ja",
"speaker": "Rečník",
"raisedHand": "",
"defaultNickname": "",
"defaultLink": "napr. __url__",
"calling": "",
"callingName": "",
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -33,6 +35,7 @@
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
},
"welcomepage": {
@@ -72,33 +75,45 @@
"content": "Zistite o Vašich uživateľoch viac ľahko cez integráciu s Piwik, Google Analytics a inych monitorovacích a štatistických nástrojov."
}
},
"startupoverlay": {
"policyText": "",
"title": ""
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"mute": "Vypnúť / Zapnúť mikrofón",
"videomute": "Vypnúť / Zapnúť kameru",
"videomute": "",
"authenticate": "Overiť",
"lock": "Zamknúť / Odomknúť miestnosť",
"invite": "Pozvať ďalšich",
"chat": "Otvoriť / zatvoriť chat",
"etherpad": "Zdieľať dokument",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "",
"sharescreen": "Zdieľať prac. plochu",
"fullscreen": "Zapnúť / Vypnúť plnú obrazovku",
"sharescreen": "",
"fullscreen": "",
"sip": "Zavolať SIP číslo",
"Settings": "Nastavenia",
"hangup": "Zložiť",
"hangup": "",
"login": "Prihlásiť",
"logout": "Odhlásiť",
"dialpad": "Zobraziť číselník",
"dialpad": "",
"sharedVideoMutedPopup": "",
"micMutedPopup": "",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "",
"cameraDisabled": "",
"micDisabled": ""
"micDisabled": "",
"filmstrip": "",
"profile": "",
"raiseHand": ""
},
"bottomtoolbar": {
"chat": "Otvoriť / zatvoriť chat",
"filmstrip": "Zobraziť / skryť účastníkov",
"contactlist": "Otvoriť / zatvoriť zoznam kontaktov"
"filmstrip": "",
"contactlist": ""
},
"chat": {
"nickname": {
@@ -108,7 +123,7 @@
"messagebox": "Napíšte text..."
},
"settings": {
"title": "NASTAVENIA",
"title": "Nastavenia",
"update": "Nastaviť",
"name": "Meno",
"startAudioMuted": "",
@@ -119,12 +134,22 @@
"followMe": "",
"noDevice": "",
"noPermission": "",
"avatarUrl": ""
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
},
"profile": {
"title": "",
"setDisplayNameLabel": "",
"setEmailLabel": "",
"setEmailInput": ""
},
"videothumbnail": {
"editnickname": "Kliknite pre zmenu<br/>Vášho mena",
"moderator": "Majiteľ tejto<br/>konferencie",
"videomute": "Učastník s<br/>vypnutou kamerou",
"videomute": "",
"mute": "Učastník s<br/>vypnutým mikrofónom",
"kick": "Vyhodiť",
"muted": "Vypnutý mikrofón",
@@ -132,6 +157,7 @@
"flip": ""
},
"connectionindicator": {
"header": "",
"bitrate": "Prenos. rýchlosť",
"packetloss": "Strata packetov:",
"resolution": "Rozlíšenie:",
@@ -169,34 +195,49 @@
"raisedHand": ""
},
"dialog": {
"add": "",
"kickMessage": "Boli ste vyhodený z konferencie!",
"popupError": "Váš prehliadač blokuje vyskakovacie okná pre túto stránku. Prosím, povoľte si vyskakovacie okná a skúste to znova.",
"passwordErrorTitle": "",
"passwordError": "Táto diskusia je momentálne zabezpečená heslom. Iba majiteľ tejto konferencie može nastaviť heslo.",
"passwordError2": "Táto diskusia nie je momentálne zabezpečená heslom. Iba majiteľ tejto konferencie može nastaviť heslo.",
"connectError": "Oops! Niečo je zle a nemožem sa pripojiť do konferencie.",
"connectErrorWithMsg": "Oops! Niečo je zle a nemožem sa pripojiť do konferencie. Správa: __msg__",
"incorrectPassword": "",
"connecting": "Pripájam",
"copy": "",
"error": "Chyba",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Chyba pri pokuse najsť rozšírenie pre zdieľanie prac. plochy",
"failtoinstall": "Zlyhanie pri inštalácií rozšírenia pre zdieľanie prac. plochy",
"failedpermissions": "Zlyhanie pri pokuse získať prístup k lokálnemu mikrofonu alebo kamere.",
"bridgeUnavailable": "Jitsi Videobridge je momentálne nedostupné. Prosím, skúste neskor!",
"jicofoUnavailable": "",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "",
"lockTitle": "Zabezpečenie zlyhalo",
"lockMessage": "Zlyhanie pri pokuse o zabezpečenie konferencie.",
"warning": "Upozornenie",
"passwordNotSupported": "Heslá pre miestnosti nie sú momentálne podporované.",
"sorry": "Prepáčte",
"internalError": "Vnútorná aplikačná chyba [setRemoteDescription]",
"internalErrorTitle": "",
"internalError": "",
"unableToSwitch": "Nie je možne prepnúť video stream.",
"SLDFailure": "Oops! Niečo sa stalo a nie je možne vypnúť mikrofón! (Chyba SLD)",
"SRDFailure": "Oops! Niečo sa stalo a nie je možne vypnúť kameru! (Chyba SLD)",
"oops": "Oops!",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "Nastala neznáma chyba",
"passwordRequired": "Je potrebné heslo",
"Ok": "Ok",
"done": "",
"Remove": "Odstrániť",
"removePassword": "",
"shareVideoTitle": "",
"shareVideoLinkError": "",
"removeSharedVideoTitle": "",
@@ -206,6 +247,7 @@
"WaitForHostMsg": "Konferencia <b>__room__ </b> ešte nezačala. Ak ste hostiteľ Vy, overte sa. Inak čakajte kým sa prihlási hostiteľ.",
"IamHost": "Ja som hostiteľ",
"Cancel": "Zrušiť",
"Submit": "",
"retry": "Skúsiť znova",
"logoutTitle": "Odhlásiť",
"logoutQuestion": "Ste si istý, že sa chcete odhlásiť a skončit konferenciu?",
@@ -220,25 +262,28 @@
"sipMsg": "Vložte SIP číslo",
"passwordCheck": "Ste si istý, že chcete odstrániť heslo?",
"passwordMsg": "Zadajte heslo pre zabezpečenie miestnosti",
"Invite": "Pozvať",
"shareLink": "Zdieľajte tento odkaz s každým koho chcete pozvať",
"shareLink": "",
"settings1": "Nastavte Vašu konferenciu",
"settings2": "Učastníkov pripájať stíšených",
"settings3": "Vyžaduj meno<br/><br/>Zadaj heslo pre zabezpečenie miestnosti:",
"yourPassword": "Vaše heslo",
"yourPassword": "",
"Back": "Späť",
"serviceUnavailable": "Služba nedostupná",
"gracefulShutdown": "Naša služba je momentálne vypnutá pre údržbu. Skúste to neskor.",
"Yes": "Áno",
"reservationError": "Systemová chyba rezervácie",
"reservationErrorMsg": "Chyba: __code__, správa: __msg__",
"password": "heslo",
"password": "",
"userPassword": "uživateľské heslo",
"token": "token",
"tokenAuthFailedTitle": "",
"tokenAuthFailed": "",
"displayNameRequired": "",
"enterDisplayName": "",
"extensionRequired": "Potrebné rozšírenie:",
"firefoxExtensionPrompt": "Potrebujete nainštalovať rozšírenie do Firefoxu pre možnosť zdieľať prac. plochu. Prosím, skúste znovu po nainštalovaní z: <a href='__url__'>",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "",
"sorryFeedback": "",
@@ -250,6 +295,7 @@
"stopLiveStreaming": "",
"stopRecording": "",
"doNotShowWarningAgain": "",
"doNotShowMessageAgain": "",
"permissionDenied": "",
"screenSharingPermissionDeniedError": "",
"micErrorPresent": "",
@@ -262,7 +308,15 @@
"micUnknownError": "",
"micPermissionDeniedError": "",
"micNotFoundError": "",
"micConstraintFailedError": ""
"micConstraintFailedError": "",
"micNotSendingData": "",
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Vypnút mikrofón"
},
"email": {
"sharedKey": [

View File

@@ -1,17 +1,19 @@
{
"contactlist": "STIKI",
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "Nastavitve povezave",
"poweredby": "poganja",
"downloadlogs": "Shrani zapis",
"feedback": "",
"roomUrlDefaultMsg": "Ustvarjanje vaše konference ...",
"participant": "Udeleženec",
"inviteUrlDefaultMsg": "Ustvarjanje vaše konference ...",
"me": "jaz",
"speaker": "Govornik",
"raisedHand": "",
"defaultNickname": "",
"defaultLink": "npr. __url__",
"calling": "",
"callingName": "",
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -33,6 +35,7 @@
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
},
"welcomepage": {
@@ -72,33 +75,45 @@
"content": "Spoznajte svoje uporabnike z enostavno integracijo v Piwik, Google Analytics ter druge sisteme za nadzor uporabe in statistiko."
}
},
"startupoverlay": {
"policyText": "",
"title": ""
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"mute": "Utišaj / Povrni glasnost",
"videomute": "Zaženi / Ustavi kamero",
"videomute": "",
"authenticate": "Overi",
"lock": "Zakleni / Odkleni sobo",
"invite": "Povabite ostale",
"chat": "Odpri / zapri klepetalnico",
"etherpad": "Dokument v skupni rabi",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "",
"sharescreen": "Zaslon v souporabi",
"fullscreen": "Vklopi / Izklopi celozaslonski način",
"sharescreen": "",
"fullscreen": "",
"sip": "Pokliči številko SIP",
"Settings": "Nastavitve",
"hangup": "Odloži",
"hangup": "",
"login": "Prijava",
"logout": "Odjava",
"dialpad": "Pokaži številčnico",
"dialpad": "",
"sharedVideoMutedPopup": "",
"micMutedPopup": "",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "",
"cameraDisabled": "",
"micDisabled": ""
"micDisabled": "",
"filmstrip": "",
"profile": "",
"raiseHand": ""
},
"bottomtoolbar": {
"chat": "Odpri / zapri klepetalnico",
"filmstrip": "Pokaži / Skrij filmski trak",
"contactlist": "Odpri / Zapri stike"
"filmstrip": "",
"contactlist": ""
},
"chat": {
"nickname": {
@@ -108,7 +123,7 @@
"messagebox": "Vnesite besedilo ..."
},
"settings": {
"title": "NASTAVITVE",
"title": "Nastavitve",
"update": "Posodobi",
"name": "Ime",
"startAudioMuted": "",
@@ -119,12 +134,22 @@
"followMe": "",
"noDevice": "",
"noPermission": "",
"avatarUrl": ""
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
},
"profile": {
"title": "",
"setDisplayNameLabel": "",
"setEmailLabel": "",
"setEmailInput": ""
},
"videothumbnail": {
"editnickname": "Kliknite, da spremenite<br/>svoje ime",
"moderator": "Lastnik<br/>konference",
"videomute": "Udeleženec je<br/>izključil kamero.",
"videomute": "",
"mute": "Udeleženec je utišan",
"kick": "Izženi",
"muted": "Utišan",
@@ -132,6 +157,7 @@
"flip": ""
},
"connectionindicator": {
"header": "",
"bitrate": "Bitna hitrost:",
"packetloss": "Izgubljeni paketi:",
"resolution": "Ločljivost:",
@@ -173,34 +199,49 @@
"raisedHand": ""
},
"dialog": {
"add": "",
"kickMessage": "Ojej! Izgnali so vas iz srečanja!",
"popupError": "",
"passwordErrorTitle": "",
"passwordError": "",
"passwordError2": "",
"connectError": "Ups! Nekaj je narobe in se ni bilo mogoče povezati s konferenco.",
"connectErrorWithMsg": "Ups! Nekaj je narobe in se ni bilo mogoče povezati s konferenco: __msg__",
"incorrectPassword": "",
"connecting": "Povezovanje",
"copy": "",
"error": "Napaka",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Napaka pri zaznavanju razširitve za skupno uporabo namizja.",
"failtoinstall": "Razširitve za skupno uporabo namizja ni bilo mogoče namestiti",
"failedpermissions": "Ni bilo mogoče pridobiti dovoljenja za uporabo lokalnega mikrofona ali kamere.",
"bridgeUnavailable": "Jitsi Videobridge trenutno ni na razpolago. Prosim poskusite kasneje!",
"jicofoUnavailable": "",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "",
"lockTitle": "Zaklepanje ni uspelo",
"lockMessage": "",
"warning": "Opozorilo",
"passwordNotSupported": "Trenutno ni mogoče zakleniti sobe z geslom.",
"sorry": "Oprostite",
"internalError": "Notranja napaka [setRemoteDescription]",
"internalErrorTitle": "",
"internalError": "",
"unableToSwitch": "Ni mogoče preklopiti video pretoka.",
"SLDFailure": "Ups! Nekaj je narobe in zvoka se ne da utišati! (Napaka SLD)",
"SRDFailure": "Ups! Nekaj je narobe in slike ni mogoče ustaviti! (Napaka SRD)",
"oops": "Ups!",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "Prišlo je do neke napake",
"passwordRequired": "Potrebno je geslo",
"Ok": "V redu",
"done": "",
"Remove": "Odstrani",
"removePassword": "",
"shareVideoTitle": "",
"shareVideoLinkError": "",
"removeSharedVideoTitle": "",
@@ -210,6 +251,7 @@
"WaitForHostMsg": "Ta konferenca <b>__room__ </b> se še ni začela. V primeru, da ste vi gostitelj se prosim overite. Drugače počakajte prosim na prihod gostitelja.",
"IamHost": "Jaz sem gostitelj",
"Cancel": "Prekliči",
"Submit": "",
"retry": "Poskusi ponovno",
"logoutTitle": "Odjava",
"logoutQuestion": "Ali se res želite odjaviti in prekiniti konferenco?",
@@ -224,25 +266,28 @@
"sipMsg": "Vnesite številko SIP",
"passwordCheck": "Ali res želite odstraniti geslo?",
"passwordMsg": "Nastavite geslo za zaklepanje sobe",
"Invite": "Povabi",
"shareLink": "To povezavo pošljite vsem, ki jih želite povabiti",
"shareLink": "",
"settings1": "Nastavite svojo konferenco",
"settings2": "Utišaj udeležence ob pristopu",
"settings3": "Zahtevaj vzdevke<br/><br/>Nastavi geslo za zaklep sobe:",
"yourPassword": "vaše geslo",
"yourPassword": "",
"Back": "Nazaj",
"serviceUnavailable": "Storitev ni na voljo",
"gracefulShutdown": "Storitev trenutno ni na voljo zaradi vzdrževanja. Poskusite ponovno kasneje.",
"Yes": "Da",
"reservationError": "Napaka v sistemu rezervacije",
"reservationErrorMsg": "Koda napake: __code__, sporočilo: __msg__",
"password": "geslo",
"password": "",
"userPassword": "uporabniško geslo",
"token": "žeton",
"tokenAuthFailedTitle": "",
"tokenAuthFailed": "",
"displayNameRequired": "",
"enterDisplayName": "",
"extensionRequired": "",
"firefoxExtensionPrompt": "",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "",
"sorryFeedback": "",
@@ -254,6 +299,7 @@
"stopLiveStreaming": "",
"stopRecording": "",
"doNotShowWarningAgain": "",
"doNotShowMessageAgain": "",
"permissionDenied": "",
"screenSharingPermissionDeniedError": "",
"micErrorPresent": "",
@@ -266,7 +312,15 @@
"micUnknownError": "",
"micPermissionDeniedError": "",
"micNotFoundError": "",
"micConstraintFailedError": ""
"micConstraintFailedError": "",
"micNotSendingData": "",
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Utišaj"
},
"email": {
"sharedKey": "",

View File

@@ -1,17 +1,19 @@
{
"contactlist": "KONTAKTLISTA",
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "Anslutningsinställningar",
"poweredby": "drivs av",
"downloadlogs": "Hämta loggar",
"feedback": "Ge oss din feedback",
"roomUrlDefaultMsg": "Din konferens håller på att skapas...",
"participant": "Deltagare",
"inviteUrlDefaultMsg": "Din konferens håller på att skapas...",
"me": "jag",
"speaker": "Talare",
"raisedHand": "",
"defaultNickname": "",
"defaultLink": "t ex. __url__",
"calling": "",
"callingName": "",
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -33,6 +35,7 @@
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
},
"welcomepage": {
@@ -72,33 +75,45 @@
"content": "Studera användningsmönster genom enkel integration med Piwik, Google Analytics och andra monitorerings- och statistiksystem."
}
},
"startupoverlay": {
"policyText": "",
"title": ""
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"mute": "Slå av/på ljud",
"videomute": "Starta / stoppa kamera",
"videomute": "",
"authenticate": "Autentisera",
"lock": "Lås / lås upp rum",
"invite": "Bjud in andra",
"chat": "Öppna / stäng chat",
"etherpad": "Delat dokument",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "",
"sharescreen": "Dela skärm",
"fullscreen": "Aktivera / avaktivera helskärm",
"sharescreen": "",
"fullscreen": "",
"sip": "Ring SIP-nummer",
"Settings": "Inställningar",
"hangup": "Lägg på",
"hangup": "",
"login": "Logga in",
"logout": "Logga ut",
"dialpad": "Visa knappsats",
"dialpad": "",
"sharedVideoMutedPopup": "",
"micMutedPopup": "",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "",
"cameraDisabled": "",
"micDisabled": ""
"micDisabled": "",
"filmstrip": "",
"profile": "",
"raiseHand": ""
},
"bottomtoolbar": {
"chat": "Öppna / stäng chat",
"filmstrip": "Visa / dölj filmremsa",
"contactlist": "Öppna / stäng kontaktlista"
"filmstrip": "",
"contactlist": ""
},
"chat": {
"nickname": {
@@ -108,7 +123,7 @@
"messagebox": "Skriv text..."
},
"settings": {
"title": "INSTÄLLNINGAR",
"title": "Inställningar",
"update": "Uppdatera",
"name": "Namn",
"startAudioMuted": "",
@@ -119,12 +134,22 @@
"followMe": "",
"noDevice": "",
"noPermission": "",
"avatarUrl": ""
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
},
"profile": {
"title": "",
"setDisplayNameLabel": "",
"setEmailLabel": "",
"setEmailInput": ""
},
"videothumbnail": {
"editnickname": "Klicka här för att <br/>redigera namn",
"moderator": "Ägaren av den<br/>här konferensen",
"videomute": "Deltagaren har<br/>stoppat kameran.",
"videomute": "",
"mute": "Deltagaren har avstängd mikrofon",
"kick": "Sparka ut",
"muted": "Tystad",
@@ -132,6 +157,7 @@
"flip": ""
},
"connectionindicator": {
"header": "",
"bitrate": "Bithastighet:",
"packetloss": "Paketförluster:",
"resolution": "Upplösning:",
@@ -165,34 +191,49 @@
"raisedHand": ""
},
"dialog": {
"add": "",
"kickMessage": "Aj! Du har sparkats ur mötet!",
"popupError": "Din webbläsare blockerar popup-fönster från den här webbplatsen. Vänligen aktivera popups i din webbläsares säkerhetsinställningar och försök igen.",
"passwordErrorTitle": "",
"passwordError": "Den här konversationen är för närvarande skyddad av lösenord. Bara ägaren till konferensen kan sätta ett lösenord.",
"passwordError2": "Den här konversationen är för närvarande inte skyddad av ett lösenord. Bara ägaren till konferensen kan sätta ett lösenord.",
"connectError": "Ojdå! Något gick fel och vi kunde inte ansluta till konferensen.",
"connectErrorWithMsg": "Ojdå! Något gick fel och vi kunde inte ansluta till konferensen: __msg__",
"incorrectPassword": "",
"connecting": "Ansluter",
"copy": "",
"error": "Fel",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Fel när skrivbordsdelnings-tillägget försökte hittas.",
"failtoinstall": "Misslyckades att installera skrivbordsdelnings-tillägget",
"failedpermissions": "Misslyckades med att få tillåtelse att använda lokal mikrofon och/eller kamera.",
"bridgeUnavailable": "Jitsi Videobridge är för tillfället inte tillgänglig. Vänligen försök senare!",
"jicofoUnavailable": "",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "",
"lockTitle": "Låsning misslyckades",
"lockMessage": "Misslyckades att låsa konferensen.",
"warning": "Varning",
"passwordNotSupported": "Rumslösenord stöds inte för tillfället.",
"sorry": "Tyvärr",
"internalError": "Internt applikationsfel [setRemoteDescription]",
"internalErrorTitle": "",
"internalError": "",
"unableToSwitch": "Kunde inte byta videoström.",
"SLDFailure": "Ojdå! Något gick fel och vi kunde inte stänga av mikrofonen! (SLD Failure)",
"SRDFailure": "Ojdå! Något gick fel och vi kunde inte stänga av videokameran! (SRD Failure)",
"oops": "Ojdå!",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "Det uppstod någon typ av fel",
"passwordRequired": "Lösenord krävs",
"Ok": "Ok",
"done": "",
"Remove": "Ta bort",
"removePassword": "",
"shareVideoTitle": "",
"shareVideoLinkError": "",
"removeSharedVideoTitle": "",
@@ -202,6 +243,7 @@
"WaitForHostMsg": "Konferensen <b>__room__</b> har inte startat än. Om du är värd för konferensen, vänligen logga in. Annars, vänta kvar på att konferensvärden kommer.",
"IamHost": "Jag är värd",
"Cancel": "Avbryt",
"Submit": "",
"retry": "Försök igen",
"logoutTitle": "Logga ut",
"logoutQuestion": "Är du säker på att du vill logga ut och stoppa konferensen?",
@@ -216,26 +258,29 @@
"sipMsg": "Skriv in SIP-nummer",
"passwordCheck": "Är du säker på att du vill ta bort ditt lösenord?",
"passwordMsg": "Sätt ett lösenord för att låsa ditt rum",
"Invite": "Bjud in",
"shareLink": "Dela den här länken med alla du vill bjuda in",
"shareLink": "",
"settings1": "Anpassa din konferens",
"settings2": "Deltagare går med med mikrofonen avstängd",
"settings3": "Kräver användarnamn<br/><br/>Sätt ett lösenord för att låsa ditt rum:",
"yourPassword": "ditt lösenord",
"yourPassword": "",
"Back": "Tillbaka",
"serviceUnavailable": "Tjänsten otillgänglig",
"gracefulShutdown": "Vår tjänst är för tillfället nedstängd för underhåll. Vänligen försök senare.",
"Yes": "Ja",
"reservationError": "Fel i reservationssystemet",
"reservationErrorMsg": "Felkod: __code__, meddelande: __msg__",
"password": "lösenord",
"password": "",
"userPassword": "användarlösenord",
"token": "token",
"tokenAuthFailed": "Misslyckades att autentisera mot XMPP-server: ogiltig token",
"tokenAuthFailedTitle": "",
"tokenAuthFailed": "",
"displayNameRequired": "",
"enterDisplayName": "",
"extensionRequired": "Tillägg krävs:",
"firefoxExtensionPrompt": "Du behöver installera ett Firefox-tillägg för att kunna använda skärmdelning. Vänligen försök igen efter att du <a href='__url__'>hämtat det här</a>!",
"feedbackQuestion": "Hur upplevde du samtalet?",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "Tack för att du använder __appName__!",
"sorryFeedback": "Tråkigt att du känner så. Vill du berätta mer?",
"liveStreaming": "",
@@ -246,6 +291,7 @@
"stopLiveStreaming": "",
"stopRecording": "",
"doNotShowWarningAgain": "",
"doNotShowMessageAgain": "",
"permissionDenied": "",
"screenSharingPermissionDeniedError": "",
"micErrorPresent": "",
@@ -258,7 +304,15 @@
"micUnknownError": "",
"micPermissionDeniedError": "",
"micNotFoundError": "",
"micConstraintFailedError": ""
"micConstraintFailedError": "",
"micNotSendingData": "",
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Tysta"
},
"\u0005dialog": {},
"email": {

View File

@@ -1,17 +1,19 @@
{
"contactlist": "KİŞİ LİSTESİ",
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "Bağlantı Ayarları",
"poweredby": "Gücünün kaynağı",
"downloadlogs": "Günlükleri indir",
"feedback": "",
"roomUrlDefaultMsg": "",
"participant": "",
"inviteUrlDefaultMsg": "",
"me": "",
"speaker": "",
"raisedHand": "",
"defaultNickname": "",
"defaultLink": "",
"calling": "",
"callingName": "",
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -33,6 +35,7 @@
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
},
"welcomepage": {
@@ -72,33 +75,45 @@
"content": "Piwik, Google Analytics ve diğer kullanım izleme ve istatistik sistemleri ile kolay tümleştirmeyle kullanıcılar hakkında bilgi edinin."
}
},
"startupoverlay": {
"policyText": "",
"title": ""
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"mute": "Sessiz / Sesli",
"videomute": "Kamera başlat / durdur",
"videomute": "",
"authenticate": "Kimlik doğrula",
"lock": "Odayı kilitle / kilit aç",
"invite": "Arkadaşlarını davet et",
"chat": "Sohbeti aç / kapa",
"etherpad": "Paylaşımlı belge",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "",
"sharescreen": "Ekran paylaş",
"fullscreen": "Tam Ekrana Gir / Çık",
"sharescreen": "",
"fullscreen": "",
"sip": "SIP numara ara",
"Settings": "Ayarlar",
"hangup": "Kapat",
"hangup": "",
"login": "Oturum aç",
"logout": "Oturum kapat",
"dialpad": "",
"sharedVideoMutedPopup": "",
"micMutedPopup": "",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "",
"cameraDisabled": "",
"micDisabled": ""
"micDisabled": "",
"filmstrip": "",
"profile": "",
"raiseHand": ""
},
"bottomtoolbar": {
"chat": "Sohbeti aç / kapa",
"filmstrip": "Film şeridini göster / gizle",
"contactlist": "Kişi listesi aç / kapa"
"filmstrip": "",
"contactlist": ""
},
"chat": {
"nickname": {
@@ -108,7 +123,7 @@
"messagebox": "Metin girin..."
},
"settings": {
"title": "AYARLAR",
"title": "Ayarlar",
"update": "Güncelle",
"name": "Ad",
"startAudioMuted": "",
@@ -119,12 +134,22 @@
"followMe": "",
"noDevice": "",
"noPermission": "",
"avatarUrl": ""
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
},
"profile": {
"title": "",
"setDisplayNameLabel": "",
"setEmailLabel": "",
"setEmailInput": ""
},
"videothumbnail": {
"editnickname": "Görünür adınızı değiştirmek<br/>için tıkla",
"moderator": "Bu görüşmenin<br/>sahibi",
"videomute": "Katılımcı<br/>kamera durdurdu.",
"videomute": "",
"mute": "Katılımcı sessiz",
"kick": "Kovuldu",
"muted": "Sessiz",
@@ -132,6 +157,7 @@
"flip": ""
},
"connectionindicator": {
"header": "",
"bitrate": "Bit hızı:",
"packetloss": "Paket kaybı:",
"resolution": "Çözünürlük:",
@@ -161,34 +187,49 @@
"raisedHand": ""
},
"dialog": {
"add": "",
"kickMessage": "Ahhh! Görüşmeden, kavuldun!",
"popupError": "",
"passwordErrorTitle": "",
"passwordError": "",
"passwordError2": "",
"connectError": "Amanin boo! Birşeyler ters gitti ve görüşmeye bağlanamadık.",
"connectErrorWithMsg": "Amanin boo! Birşeyler ters gitti ve görüşmeye bağlanamadık.",
"incorrectPassword": "",
"connecting": "",
"copy": "",
"error": "Hata",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Ekran paylaşımı eklentisi tespit edilirken hata.",
"failtoinstall": "Masaüstü paylaşım eklentisi yüklenemedi",
"failedpermissions": "Yerel mikrofon ve/veya kamerayı kullanmak için izinler alınamadı.",
"bridgeUnavailable": "Jitsi Videobridge şu anda kullanılamıyor. Daha sonra tekrar deneyiniz!",
"jicofoUnavailable": "",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "",
"lockTitle": "Kilitlenemedi",
"lockMessage": "Görüşme kilitlenemedi.",
"warning": "Uyarı",
"passwordNotSupported": "Oda parolaları şu anda desteklenmemekte.",
"sorry": "Üzgünüz",
"internalError": "İç uygulama hatası [setRemoteDescription]",
"internalErrorTitle": "",
"internalError": "",
"unableToSwitch": "Video akışıılamıyor.",
"SLDFailure": "Amanin boo! Birşeyler ters gitti ve sessize alamadık! (SLD Başarısız)",
"SRDFailure": "Amanin boo! Birşeyler ters gitti ve videoyu durduramadık! (SRD Başarısız)",
"oops": "Amanin boo!",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "Bir tür hata var",
"passwordRequired": "Parola gerekli",
"Ok": "Tamam",
"done": "",
"Remove": "Kaldır",
"removePassword": "",
"shareVideoTitle": "",
"shareVideoLinkError": "",
"removeSharedVideoTitle": "",
@@ -198,6 +239,7 @@
"WaitForHostMsg": "",
"IamHost": "",
"Cancel": "İptal",
"Submit": "",
"retry": "",
"logoutTitle": "Oturum kapat",
"logoutQuestion": "Oturumu ve görüşmeyi sonlandırmak istediğinizden emin misiniz?",
@@ -212,12 +254,11 @@
"sipMsg": "SIP numarası gir",
"passwordCheck": "Parolanızı kaldırmak istediğinizden emin misiniz?",
"passwordMsg": "Odanızı kilitlemek için bir parola koyun",
"Invite": "Davet et",
"shareLink": "Davet etmek istediğiniz herkesle bu bağlantıyı paylaşın",
"shareLink": "",
"settings1": "Görüşmenizi yapılandır",
"settings2": "Katılımcılar sessiz katılsın",
"settings3": "Takma adlar gerekli<br/><br/>Odanızı kitlemek için bir parola ayarlayın:",
"yourPassword": "parolanız",
"yourPassword": "",
"Back": "Geri",
"serviceUnavailable": "Hizmet kullanım dışı",
"gracefulShutdown": "Hizmetimiz bakıp için durduruldu. Daha sonra tekrar deneyiniz.",
@@ -227,10 +268,14 @@
"password": "",
"userPassword": "parolanız",
"token": "",
"tokenAuthFailedTitle": "",
"tokenAuthFailed": "",
"displayNameRequired": "",
"enterDisplayName": "",
"extensionRequired": "",
"firefoxExtensionPrompt": "",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "",
"sorryFeedback": "",
@@ -242,6 +287,7 @@
"stopLiveStreaming": "",
"stopRecording": "",
"doNotShowWarningAgain": "",
"doNotShowMessageAgain": "",
"permissionDenied": "",
"screenSharingPermissionDeniedError": "",
"micErrorPresent": "",
@@ -254,7 +300,15 @@
"micUnknownError": "",
"micPermissionDeniedError": "",
"micNotFoundError": "",
"micConstraintFailedError": ""
"micConstraintFailedError": "",
"micNotSendingData": "",
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Sustur"
},
"\u0005dialog": {},
"email": {

View File

@@ -156,8 +156,8 @@
"kick": "Kick out",
"muted": "Muted",
"domute": "Mute",
"flip": "Flip"
"flip": "Flip",
"remoteControl": "Remote control"
},
"connectionindicator":
{
@@ -316,7 +316,12 @@
"externalInstallationMsg": "You need to install our desktop sharing extension.",
"muteParticipantTitle": "Mute this participant?",
"muteParticipantBody": "You won't be able to unmute them, but they can unmute themselves at any time.",
"muteParticipantButton": "Mute"
"muteParticipantButton": "Mute",
"remoteControlTitle": "Remote Control",
"remoteControlDeniedMessage": "__user__ rejected your remote control request!",
"remoteControlAllowedMessage": "__user__ accepted your remote control request!",
"remoteControlErrorMessage": "An error occurred while trying to request remote control permissions from __user__!",
"remoteControlStopMessage": "The remote control session ended!"
},
"email":
{

View File

@@ -1,5 +1,4 @@
/* global APP, getConfigParamsFromUrl */
const logger = require("jitsi-meet-logger").getLogger(__filename);
/**
* Implements API class that communicates with external api class
@@ -54,38 +53,17 @@ function initCommands() {
"toggle-contact-list": APP.UI.toggleContactList,
"toggle-share-screen":
APP.conference.toggleScreenSharing.bind(APP.conference),
"video-hangup": () => APP.conference.hangup()
"video-hangup": () => APP.conference.hangup(),
"email": APP.conference.changeLocalEmail,
"avatar-url": APP.conference.changeLocalAvatarUrl,
"remote-control-event": event =>
APP.remoteControl.onRemoteControlAPIEvent(event)
};
Object.keys(commands).forEach(function (key) {
postis.listen(key, commands[key]);
postis.listen(key, args => commands[key](...args));
});
}
/**
* Maps the supported events and their status
* (true it the event is enabled and false if it is disabled)
* @type {{
* incoming-message: boolean,
* outgoing-message: boolean,
* display-name-change: boolean,
* participant-left: boolean,
* participant-joined: boolean,
* video-conference-left: boolean,
* video-conference-joined: boolean
* }}
*/
const events = {
"incoming-message": false,
"outgoing-message":false,
"display-name-change": false,
"participant-joined": false,
"participant-left": false,
"video-conference-joined": false,
"video-conference-left": false,
"video-ready-to-close": false
};
/**
* Sends message to the external application.
* @param message {object}
@@ -93,27 +71,19 @@ const events = {
* @param params {object} the object that will be sent as JSON string
*/
function sendMessage(message) {
if(enabled)
if(enabled) {
postis.send(message);
}
}
/**
* Check whether the API should be enabled or not.
* @returns {boolean}
*/
function isEnabled () {
function shouldBeEnabled () {
return (typeof jitsi_meet_external_api_id === "number");
}
/**
* Checks whether the event is enabled ot not.
* @param name the name of the event.
* @returns {*}
*/
function isEventEnabled (name) {
return events[name];
}
/**
* Sends event object to the external application that has been subscribed
* for that event.
@@ -121,29 +91,18 @@ function isEventEnabled (name) {
* @param object data associated with the event
*/
function triggerEvent (name, object) {
if(isEventEnabled(name))
if(enabled) {
sendMessage({method: name, params: object});
}
/**
* Handles system messages. (for example: enable/disable events)
* @param message {object} the message
*/
function onSystemMessage(message) {
switch (message.type) {
case "eventStatus":
if(!message.name || !message.value) {
logger.warn("Unknown system message format", message);
break;
}
events[message.name] = message.value;
break;
default:
logger.warn("Unknown system message type", message);
}
}
export default {
class API {
/**
* Constructs new instance
* @constructor
*/
constructor() { }
/**
* Initializes the APIConnector. Setups message event listeners that will
* receive information from external applications that embed Jitsi Meet.
@@ -151,17 +110,23 @@ export default {
* is initialized.
* @param options {object}
* @param forceEnable {boolean} if true the module will be enabled.
* @param enabledEvents {array} array of events that should be enabled.
*/
init (options = {}) {
if(!isEnabled() && !options.forceEnable)
if(!shouldBeEnabled() && !options.forceEnable)
return;
enabled = true;
if(options.enabledEvents)
options.enabledEvents.forEach(function (eventName) {
events[eventName] = true;
});
if(!postis) {
this._initPostis();
}
}
/**
* initializes postis library.
* @private
*/
_initPostis() {
let postisOptions = {
window: target
};
@@ -169,9 +134,8 @@ export default {
postisOptions.scope
= "jitsi_meet_external_api_" + jitsi_meet_external_api_id;
postis = postisInit(postisOptions);
postis.listen("jitsiSystemMessage", onSystemMessage);
initCommands();
},
}
/**
* Notify external application (if API is enabled) that message was sent.
@@ -179,7 +143,7 @@ export default {
*/
notifySendingChatMessage (body) {
triggerEvent("outgoing-message", {"message": body});
},
}
/**
* Notify external application (if API is enabled) that
@@ -198,7 +162,7 @@ export default {
"incoming-message",
{"from": id, "nick": nick, "message": body, "stamp": ts}
);
},
}
/**
* Notify external application (if API is enabled) that
@@ -207,7 +171,7 @@ export default {
*/
notifyUserJoined (id) {
triggerEvent("participant-joined", {id});
},
}
/**
* Notify external application (if API is enabled) that
@@ -216,7 +180,7 @@ export default {
*/
notifyUserLeft (id) {
triggerEvent("participant-left", {id});
},
}
/**
* Notify external application (if API is enabled) that
@@ -226,7 +190,7 @@ export default {
*/
notifyDisplayNameChanged (id, displayName) {
triggerEvent("display-name-change", {id, displayname: displayName});
},
}
/**
* Notify external application (if API is enabled) that
@@ -236,7 +200,7 @@ export default {
*/
notifyConferenceJoined (room) {
triggerEvent("video-conference-joined", {roomName: room});
},
}
/**
* Notify external application (if API is enabled) that
@@ -246,7 +210,7 @@ export default {
*/
notifyConferenceLeft (room) {
triggerEvent("video-conference-left", {roomName: room});
},
}
/**
* Notify external application (if API is enabled) that
@@ -254,13 +218,23 @@ export default {
*/
notifyReadyToClose () {
triggerEvent("video-ready-to-close", {});
},
}
/**
* Sends remote control event.
* @param {RemoteControlEvent} event the remote control event.
*/
sendRemoteControlEvent(event) {
sendMessage({method: "remote-control-event", params: event});
}
/**
* Removes the listeners.
*/
dispose: function () {
dispose () {
if(enabled)
postis.destroy();
}
};
}
export default new API();

View File

@@ -36,7 +36,9 @@ var commands = {
"toggleChat": "toggle-chat",
"toggleContactList": "toggle-contact-list",
"toggleShareScreen": "toggle-share-screen",
"hangup": "video-hangup"
"hangup": "video-hangup",
"email": "email",
"avatarUrl": "avatar-url"
};
/**
@@ -67,20 +69,15 @@ function sendMessage(postis, object) {
}
/**
* Sends message for event enable/disable status change.
* @param postis {Postis object} the postis instance that is going to be used.
* @param event {string} the name of the event
* @param status {boolean} true - enabled; false - disabled;
* Adds given number to the numberOfParticipants property of given APIInstance.
* @param {JitsiMeetExternalAPI} APIInstance the instance of the
* JitsiMeetExternalAPI
* @param {int} number - the number of participants to be added to
* numberOfParticipants property (this parameter can be negative number if the
* numberOfParticipants should be decreased).
*/
function changeEventStatus(postis, event, status) {
if(!(event in events)) {
logger.error("Not supported event name.");
return;
}
sendMessage(postis, {
method: "jitsiSystemMessage",
params: {type: "eventStatus", name: events[event], value: status}
});
function changeParticipantNumber(APIInstance, number) {
APIInstance.numberOfParticipants += number;
}
/**
@@ -91,8 +88,10 @@ function changeEventStatus(postis, event, status) {
* @param width width of the iframe
* @param height height of the iframe
* @param parent_node the node that will contain the iframe
* @param filmStripOnly if the value is true only the small videos will be
* visible.
* @param configOverwrite object containing configuration options defined in
* config.js to be overridden.
* @param interfaceConfigOverwrite object containing configuration options
* defined in interface_config.js to be overridden.
* @param noSsl if the value is true https won't be used
* @constructor
*/
@@ -159,6 +158,12 @@ function JitsiMeetExternalAPI(domain, room_name, width, height, parentNode,
this.eventHandlers = {};
// Map<{string} event_name, {boolean} postis_listener_added>
this.postisListeners = {};
this.numberOfParticipants = 1;
this._setupListeners();
id++;
}
@@ -174,15 +179,13 @@ function JitsiMeetExternalAPI(domain, room_name, width, height, parentNode,
* @param name the name of the command
* @param arguments array of arguments
*/
JitsiMeetExternalAPI.prototype.executeCommand = function(name, argumentsList) {
JitsiMeetExternalAPI.prototype.executeCommand
= function(name, ...argumentsList) {
if(!(name in commands)) {
logger.error("Not supported command name.");
return;
}
var argumentsArray = argumentsList;
if (!argumentsArray)
argumentsArray = [];
sendMessage(this.postis, {method: commands[name], params: argumentsArray});
sendMessage(this.postis, {method: commands[name], params: argumentsList});
};
/**
@@ -313,14 +316,15 @@ JitsiMeetExternalAPI.prototype.addEventListener = function(event, listener) {
}
// We cannot remove listeners from postis that's why we are handling the
// callback that way.
if(!(event in this.eventHandlers))
if(!this.postisListeners[event]) {
this.postis.listen(events[event], function(data) {
if((event in this.eventHandlers) &&
typeof this.eventHandlers[event] === "function")
this.eventHandlers[event].call(null, data);
}.bind(this));
this.postisListeners[event] = true;
}
this.eventHandlers[event] = listener;
changeEventStatus(this.postis, event, true);
};
/**
@@ -334,7 +338,6 @@ JitsiMeetExternalAPI.prototype.removeEventListener = function(event) {
return;
}
delete this.eventHandlers[event];
changeEventStatus(this.postis, event, false);
};
/**
@@ -346,6 +349,25 @@ JitsiMeetExternalAPI.prototype.removeEventListeners = function(events) {
this.removeEventListener(events[i]);
};
/**
* Returns the number of participants in the conference.
* NOTE: the local participant is included.
* @returns {int} the number of participants in the conference.
*/
JitsiMeetExternalAPI.prototype.getNumberOfParticipants = function() {
return this.numberOfParticipants;
};
/**
* Setups listeners that are used internally for JitsiMeetExternalAPI.
*/
JitsiMeetExternalAPI.prototype._setupListeners = function() {
this.postis.listen("participant-joined",
changeParticipantNumber.bind(null, this, 1));
this.postis.listen("participant-left",
changeParticipantNumber.bind(null, this, -1));
};
/**
* Removes the listeners and removes the Jitsi Meet frame.
*/

View File

@@ -1,4 +1,5 @@
/* global APP, JitsiMeetJS, $, config, interfaceConfig, toastr */
const logger = require("jitsi-meet-logger").getLogger(__filename);
var UI = {};
@@ -25,7 +26,7 @@ import SettingsMenu from "./side_pannels/settings/SettingsMenu";
import Profile from "./side_pannels/profile/Profile";
import Settings from "./../settings/Settings";
import RingOverlay from "./ring_overlay/RingOverlay";
import { randomInt } from "../util/RandomUtil";
import { randomInt } from "../../react/features/base/util/randomUtil";
import UIErrors from './UIErrors';
import { debounce } from "../util/helpers";
@@ -396,20 +397,6 @@ UI.getSharedVideoManager = function () {
*/
UI.start = function () {
document.title = interfaceConfig.APP_NAME;
var setupWelcomePage = null;
if(config.enableWelcomePage && window.location.pathname == "/" &&
Settings.isWelcomePageEnabled()) {
$("#videoconference_page").hide();
if (!setupWelcomePage)
setupWelcomePage = require("./welcome_page/WelcomePage");
setupWelcomePage();
// Return false to indicate that the UI hasn't been fully started and
// conference ready. We're still waiting for input from the user.
return false;
}
$("#welcome_page").hide();
// Set the defaults for prompt dialogs.
$.prompt.setDefaults({persistent: false});
@@ -1454,4 +1441,11 @@ UI.hideUserMediaPermissionsGuidanceOverlay = function () {
GumPermissionsOverlay.hide();
};
/**
* Handles user's features changes.
*/
UI.onUserFeaturesChanged = function (user) {
VideoLayout.onUserFeaturesChanged(user);
};
module.exports = UI;

View File

@@ -54,7 +54,7 @@ const IndicatorFontSizes = {
/**
* Returns the available video width.
*/
getAvailableVideoWidth: function () {
getAvailableVideoWidth() {
return window.innerWidth;
},
@@ -70,7 +70,7 @@ const IndicatorFontSizes = {
*
* @param el the element
*/
getTextWidth: function (el) {
getTextWidth(el) {
return (el.clientWidth + 1);
},
@@ -79,7 +79,7 @@ const IndicatorFontSizes = {
*
* @param el the element
*/
getTextHeight: function (el) {
getTextHeight(el) {
return (el.clientHeight + 1);
},
@@ -88,14 +88,14 @@ const IndicatorFontSizes = {
*
* @param id the identifier of the audio element.
*/
playSoundNotification: function (id) {
playSoundNotification(id) {
document.getElementById(id).play();
},
/**
* Escapes the given text.
*/
escapeHtml: function (unsafeText) {
escapeHtml(unsafeText) {
return $('<div/>').text(unsafeText).html();
},
@@ -105,11 +105,11 @@ const IndicatorFontSizes = {
* @param {string} safe string which contains escaped html
* @returns {string} unescaped html string.
*/
unescapeHtml: function (safe) {
unescapeHtml(safe) {
return $('<div />').html(safe).text();
},
imageToGrayScale: function (canvas) {
imageToGrayScale(canvas) {
var context = canvas.getContext('2d');
var imgData = context.getImageData(0, 0, canvas.width, canvas.height);
var pixels = imgData.data;
@@ -156,7 +156,7 @@ const IndicatorFontSizes = {
* @param key the tooltip data-i18n key
* @param position the position of the tooltip in relation to the element
*/
setTooltip: function (element, key, position) {
setTooltip(element, key, position) {
if (element !== null) {
element.setAttribute('data-tooltip', TOOLTIP_POSITIONS[position]);
element.setAttribute('data-i18n', '[content]' + key);
@@ -170,7 +170,7 @@ const IndicatorFontSizes = {
*
* @param element the element to remove the tooltip from
*/
removeTooltip: function (element) {
removeTooltip(element) {
element.removeAttribute('data-tooltip', '');
element.removeAttribute('data-i18n','');
element.removeAttribute('content','');
@@ -183,7 +183,7 @@ const IndicatorFontSizes = {
* @returns {string|*}
* @private
*/
_getTooltipText: function (element) {
_getTooltipText(element) {
let title = element.getAttribute('content');
let shortcut = element.getAttribute('shortcut');
if(shortcut) {
@@ -198,7 +198,7 @@ const IndicatorFontSizes = {
* @param container the container to which new child element will be added
* @param newChild the new element that will be inserted into the container
*/
prependChild: function (container, newChild) {
prependChild(container, newChild) {
var firstChild = container.childNodes[0];
if (firstChild) {
container.insertBefore(newChild, firstChild);
@@ -214,7 +214,7 @@ const IndicatorFontSizes = {
* @returns {boolean} {true} to indicate that the given toolbar button
* is enabled, {false} - otherwise
*/
isButtonEnabled: function (name) {
isButtonEnabled(name) {
return interfaceConfig.TOOLBAR_BUTTONS.indexOf(name) !== -1
|| interfaceConfig.MAIN_TOOLBAR_BUTTONS.indexOf(name) !== -1;
},
@@ -226,7 +226,7 @@ const IndicatorFontSizes = {
* @returns {boolean} {true} to indicate that the given setting section
* is enabled, {false} - otherwise
*/
isSettingEnabled: function (name) {
isSettingEnabled(name) {
return interfaceConfig.SETTINGS_SECTIONS.indexOf(name) !== -1;
},
@@ -235,7 +235,7 @@ const IndicatorFontSizes = {
*
* @returns {boolean}
*/
isAuthenticationEnabled: function() {
isAuthenticationEnabled() {
return interfaceConfig.AUTHENTICATION_ENABLE;
},
@@ -303,7 +303,7 @@ const IndicatorFontSizes = {
}
},
hideDisabledButtons: function (mappings) {
hideDisabledButtons(mappings) {
var selector = Object.keys(mappings)
.map(function (buttonName) {
return UIUtil.isButtonEnabled(buttonName)
@@ -313,7 +313,7 @@ const IndicatorFontSizes = {
$(selector).hide();
},
redirect (url) {
redirect(url) {
window.location.href = url;
},
@@ -368,7 +368,7 @@ const IndicatorFontSizes = {
* @param {Object} attrs object with properties
* @returns {String} string of html element attributes
*/
attrsToString: function (attrs) {
attrsToString(attrs) {
return Object.keys(attrs).map(
key => ` ${key}="${attrs[key]}"`
).join(' ');

View File

@@ -64,7 +64,7 @@ ConnectionIndicator.getStringFromArray = function (array) {
ConnectionIndicator.prototype.generateText = function () {
var downloadBitrate, uploadBitrate, packetLoss, i;
if(this.bitrate === null) {
if(!this.bitrate) {
downloadBitrate = "N/A";
uploadBitrate = "N/A";
}
@@ -75,7 +75,7 @@ ConnectionIndicator.prototype.generateText = function () {
this.bitrate.upload? this.bitrate.upload + " Kbps" : "N/A";
}
if(this.packetLoss === null) {
if(!this.packetLoss) {
packetLoss = "N/A";
} else {
@@ -132,7 +132,7 @@ ConnectionIndicator.prototype.generateText = function () {
if (this.showMoreValue) {
var downloadBandwidth, uploadBandwidth, transport;
if (this.bandwidth === null) {
if (!this.bandwidth) {
downloadBandwidth = "N/A";
uploadBandwidth = "N/A";
} else {
@@ -341,7 +341,7 @@ ConnectionIndicator.prototype.updateConnectionStatusIndicator
*/
ConnectionIndicator.prototype.updateConnectionQuality =
function (percent, object) {
if (percent === null) {
if (!percent) {
this.connectionIndicatorContainer.style.display = "none";
this.popover.forceHide();
return;

View File

@@ -42,13 +42,14 @@ const FilmStrip = {
let container = document.createElement('div');
let isVisible = this.isFilmStripVisible();
container.className = 'filmstrip__toolbar';
container.innerHTML = `
<button id="hideVideoToolbar">
<i class="icon-menu-${isVisible ? 'down' : 'up'}">
</i>
</button>
`;
if(!interfaceConfig.filmStripOnly) {
container.innerHTML = `
<button id="hideVideoToolbar">
<i class="icon-menu-${isVisible ? 'down' : 'up'}">
</i>
</button>
`;
}
return container;
},
@@ -94,8 +95,10 @@ const FilmStrip = {
*/
showMenuDownIcon() {
let icon = this.toggleFilmStripIcon;
icon.classList.add(this.iconMenuDownClassName);
icon.classList.remove(this.iconMenuUpClassName);
if(icon) {
icon.classList.add(this.iconMenuDownClassName);
icon.classList.remove(this.iconMenuUpClassName);
}
},
/**
@@ -103,8 +106,10 @@ const FilmStrip = {
*/
showMenuUpIcon() {
let icon = this.toggleFilmStripIcon;
icon.classList.add(this.iconMenuUpClassName);
icon.classList.remove(this.iconMenuDownClassName);
if(icon) {
icon.classList.add(this.iconMenuUpClassName);
icon.classList.remove(this.iconMenuDownClassName);
}
},
/**

View File

@@ -1,8 +1,9 @@
/* global $, APP, interfaceConfig */
/* global $, APP */
const logger = require("jitsi-meet-logger").getLogger(__filename);
import Avatar from "../avatar/Avatar";
import {createDeferred} from '../../util/helpers';
import UIEvents from "../../../service/UI/UIEvents";
import UIUtil from "../util/UIUtil";
import {VideoContainer, VIDEO_CONTAINER_TYPE} from "./VideoContainer";
@@ -19,8 +20,11 @@ export default class LargeVideoManager {
* @type {Object.<string, LargeContainer>}
*/
this.containers = {};
this.eventEmitter = emitter;
this.state = VIDEO_CONTAINER_TYPE;
// FIXME: We are passing resizeContainer as parameter which is calling
// Container.resize. Probably there's better way to implement this.
this.videoContainer = new VideoContainer(
() => this.resizeContainer(VIDEO_CONTAINER_TYPE), emitter);
this.addContainer(VIDEO_CONTAINER_TYPE, this.videoContainer);
@@ -37,35 +41,6 @@ export default class LargeVideoManager {
display: 'inline-block'
});
if (interfaceConfig.SHOW_JITSI_WATERMARK) {
let leftWatermarkDiv
= this.$container.find("div.watermark.leftwatermark");
leftWatermarkDiv.css({display: 'block'});
UIUtil.setLinkHref(
leftWatermarkDiv.parent(),
interfaceConfig.JITSI_WATERMARK_LINK);
}
if (interfaceConfig.SHOW_BRAND_WATERMARK) {
let rightWatermarkDiv
= this.$container.find("div.watermark.rightwatermark");
rightWatermarkDiv.css({
display: 'block',
backgroundImage: 'url(images/rightwatermark.png)'
});
UIUtil.setLinkHref(
rightWatermarkDiv.parent(),
interfaceConfig.BRAND_WATERMARK_LINK);
}
if (interfaceConfig.SHOW_POWERED_BY) {
this.$container.children("a.poweredby").css({display: 'block'});
}
this.$container.hover(
e => this.onHoverIn(e),
e => this.onHoverOut(e)
@@ -193,6 +168,7 @@ export default class LargeVideoManager {
// after everything is done check again if there are any pending
// new streams.
this.updateInProcess = false;
this.eventEmitter.emit(UIEvents.LARGE_VIDEO_ID_CHANGED, this.id);
this.scheduleLargeVideoUpdate();
});
}

View File

@@ -29,6 +29,7 @@ function RemoteVideo(user, VideoLayout, emitter) {
this.videoSpanId = `participant_${this.id}`;
SmallVideo.call(this, VideoLayout);
this.hasRemoteVideoMenu = false;
this._supportsRemoteControl = false;
this.addRemoteVideoContainer();
this.connectionIndicator = new ConnectionIndicator(this, this.id);
this.setDisplayName();
@@ -64,7 +65,7 @@ RemoteVideo.prototype.addRemoteVideoContainer = function() {
this.initBrowserSpecificProperties();
if (APP.conference.isModerator) {
if (APP.conference.isModerator || this._supportsRemoteControl) {
this.addRemoteVideoMenu();
}
@@ -106,14 +107,6 @@ RemoteVideo.prototype._initPopupMenu = function (popupMenuElement) {
// call the original show, passing its actual this
origShowFunc.call(this.popover);
}.bind(this);
// override popover hide method so we can cleanup click handlers
let origHideFunc = this.popover.forceHide;
this.popover.forceHide = function () {
$(document).off("click", '#mutelink_' + this.id);
$(document).off("click", '#ejectlink_' + this.id);
origHideFunc.call(this.popover);
}.bind(this);
};
/**
@@ -139,38 +132,68 @@ RemoteVideo.prototype._generatePopupContent = function () {
let popupmenuElement = document.createElement('ul');
popupmenuElement.className = 'popupmenu';
popupmenuElement.id = `remote_popupmenu_${this.id}`;
let menuItems = [];
let muteTranslationKey;
let muteClassName;
if (this.isAudioMuted) {
muteTranslationKey = 'videothumbnail.muted';
muteClassName = 'mutelink disabled';
} else {
muteTranslationKey = 'videothumbnail.domute';
muteClassName = 'mutelink';
if(APP.conference.isModerator) {
let muteTranslationKey;
let muteClassName;
if (this.isAudioMuted) {
muteTranslationKey = 'videothumbnail.muted';
muteClassName = 'mutelink disabled';
} else {
muteTranslationKey = 'videothumbnail.domute';
muteClassName = 'mutelink';
}
let muteHandler = this._muteHandler.bind(this);
let kickHandler = this._kickHandler.bind(this);
menuItems = [
{
id: 'mutelink_' + this.id,
handler: muteHandler,
icon: 'icon-mic-disabled',
className: muteClassName,
data: {
i18n: muteTranslationKey
}
}, {
id: 'ejectlink_' + this.id,
handler: kickHandler,
icon: 'icon-kick',
data: {
i18n: 'videothumbnail.kick'
}
}
];
}
let muteHandler = this._muteHandler.bind(this);
let kickHandler = this._kickHandler.bind(this);
let menuItems = [
{
id: 'mutelink_' + this.id,
handler: muteHandler,
icon: 'icon-mic-disabled',
className: muteClassName,
data: {
i18n: muteTranslationKey
}
}, {
id: 'ejectlink_' + this.id,
handler: kickHandler,
icon: 'icon-kick',
data: {
i18n: 'videothumbnail.kick'
}
if(this._supportsRemoteControl) {
let icon, handler, className;
if(APP.remoteControl.controller.getRequestedParticipant()
=== this.id) {
handler = () => {};
className = "requestRemoteControlLink disabled";
icon = "remote-control-spinner fa fa-spinner fa-spin";
} else if(!APP.remoteControl.controller.isStarted()) {
handler = this._requestRemoteControlPermissions.bind(this);
icon = "fa fa-play";
className = "requestRemoteControlLink";
} else {
handler = this._stopRemoteControl.bind(this);
icon = "fa fa-stop";
className = "requestRemoteControlLink";
}
];
menuItems.push({
id: 'remoteControl_' + this.id,
handler,
icon,
className,
data: {
i18n: 'videothumbnail.remoteControl'
}
});
}
menuItems.forEach(el => {
let menuItem = this._generatePopupMenuItem(el);
@@ -182,6 +205,76 @@ RemoteVideo.prototype._generatePopupContent = function () {
return popupmenuElement;
};
/**
* Sets the remote control supported value and initializes or updates the menu
* depending on the remote control is supported or not.
* @param {boolean} isSupported
*/
RemoteVideo.prototype.setRemoteControlSupport = function(isSupported = false) {
if(this._supportsRemoteControl === isSupported) {
return;
}
this._supportsRemoteControl = isSupported;
if(!isSupported) {
return;
}
if(!this.hasRemoteVideoMenu) {
//create menu
this.addRemoteVideoMenu();
} else {
//update the content
this.updateRemoteVideoMenu(this.isAudioMuted, true);
}
};
/**
* Requests permissions for remote control session.
*/
RemoteVideo.prototype._requestRemoteControlPermissions = function () {
APP.remoteControl.controller.requestPermissions(
this.id, this.VideoLayout.getLargeVideoWrapper()).then(result => {
if(result === null) {
return;
}
this.updateRemoteVideoMenu(this.isAudioMuted, true);
APP.UI.messageHandler.openMessageDialog(
"dialog.remoteControlTitle",
(result === false) ? "dialog.remoteControlDeniedMessage"
: "dialog.remoteControlAllowedMessage",
{user: this.user.getDisplayName()
|| interfaceConfig.DEFAULT_REMOTE_DISPLAY_NAME}
);
if(result === true) {//the remote control permissions has been granted
// pin the controlled participant
let pinnedId = this.VideoLayout.getPinnedId();
if(pinnedId !== this.id) {
this.VideoLayout.handleVideoThumbClicked(this.id);
}
}
}, error => {
logger.error(error);
this.updateRemoteVideoMenu(this.isAudioMuted, true);
APP.UI.messageHandler.openMessageDialog(
"dialog.remoteControlTitle",
"dialog.remoteControlErrorMessage",
{user: this.user.getDisplayName()
|| interfaceConfig.DEFAULT_REMOTE_DISPLAY_NAME}
);
});
this.updateRemoteVideoMenu(this.isAudioMuted, true);
};
/**
* Stops remote control session.
*/
RemoteVideo.prototype._stopRemoteControl = function () {
// send message about stopping
APP.remoteControl.controller.stop();
this.updateRemoteVideoMenu(this.isAudioMuted, true);
};
RemoteVideo.prototype._muteHandler = function () {
if (this.isAudioMuted)
return;
@@ -244,8 +337,7 @@ RemoteVideo.prototype._generatePopupMenuItem = function (opts = {}) {
linkItem.appendChild(textContent);
linkItem.id = id;
// Delegate event to the document.
$(document).on("click", `#${id}`, handler);
linkItem.onclick = handler;
menuItem.appendChild(linkItem);
return menuItem;
@@ -302,26 +394,23 @@ RemoteVideo.prototype._figureOutMutedWhileDisconnected
* @param id the id indicating the video for which we're adding a menu.
* @param parentElement the parent element where this menu will be added
*/
if (!interfaceConfig.filmStripOnly) {
RemoteVideo.prototype.addRemoteVideoMenu = function () {
RemoteVideo.prototype.addRemoteVideoMenu = function () {
if (interfaceConfig.filmStripOnly) {
return;
}
var spanElement = document.createElement('span');
spanElement.className = 'remotevideomenu';
var spanElement = document.createElement('span');
spanElement.className = 'remotevideomenu';
this.container.appendChild(spanElement);
this.container.appendChild(spanElement);
var menuElement = document.createElement('i');
menuElement.className = 'icon-menu-up';
menuElement.title = 'Remote user controls';
spanElement.appendChild(menuElement);
var menuElement = document.createElement('i');
menuElement.className = 'icon-menu';
menuElement.title = 'Remote user controls';
spanElement.appendChild(menuElement);
this._initPopupMenu(this._generatePopupContent());
this.hasRemoteVideoMenu = true;
};
} else {
RemoteVideo.prototype.addRemoteVideoMenu = function() {};
}
this._initPopupMenu(this._generatePopupContent());
this.hasRemoteVideoMenu = true;
};
/**
* Removes the remote stream element corresponding to the given stream and

View File

@@ -164,12 +164,20 @@ export class VideoContainer extends LargeContainer {
return getStreamOwnerId(this.stream);
}
constructor (onPlay, emitter) {
/**
* Creates new VideoContainer instance.
* @param resizeContainer {Function} function that takes care of the size
* of the video container.
* @param emitter {EventEmitter} the event emitter that will be used by
* this instance.
*/
constructor (resizeContainer, emitter) {
super();
this.stream = null;
this.videoType = null;
this.localFlipX = true;
this.emitter = emitter;
this.resizeContainer = resizeContainer;
this.isVisible = false;
@@ -199,8 +207,8 @@ export class VideoContainer extends LargeContainer {
this.avatarHeight = $("#dominantSpeakerAvatar").height();
var onPlayCallback = function (event) {
if (typeof onPlay === 'function') {
onPlay(event);
if (typeof resizeContainer === 'function') {
resizeContainer(event);
}
this.wasVideoRendered = true;
}.bind(this);
@@ -336,8 +344,14 @@ export class VideoContainer extends LargeContainer {
* @param {string} videoType video type
*/
setStream (stream, videoType) {
if (this.stream === stream) {
// Handles the use case for the remote participants when the
// videoType is received with delay after turning on/off the
// desktop sharing.
if(this.videoType !== videoType) {
this.videoType = videoType;
this.resizeContainer();
}
return;
} else {
// The stream has changed, so the image will be lost on detach
@@ -361,6 +375,9 @@ export class VideoContainer extends LargeContainer {
this.$video.css({
transform: flipX ? 'scaleX(-1)' : 'none'
});
// Reset the large video background depending on the stream.
this.setLargeVideoBackground(this.avatarDisplayed);
}
/**
@@ -395,8 +412,7 @@ export class VideoContainer extends LargeContainer {
// default background set.
// In order to fix this code we need to introduce video background or
// find a workaround for the video flickering.
$("#largeVideoContainer").css("background",
(show) ? interfaceConfig.DEFAULT_BACKGROUND : "#000");
this.setLargeVideoBackground(show);
this.$avatar.css("visibility", show ? "visible" : "hidden");
this.avatarDisplayed = show;
@@ -465,4 +481,19 @@ export class VideoContainer extends LargeContainer {
stayOnStage () {
return false;
}
/**
* Sets the large video container background depending on the container
* type and the parameter indicating if an avatar is currently shown on
* large.
*
* @param {boolean} isAvatar - Indicates if the avatar is currently shown
* on the large video.
* @returns {void}
*/
setLargeVideoBackground (isAvatar) {
$("#largeVideoContainer").css("background",
(this.videoType === VIDEO_CONTAINER_TYPE && !isAvatar)
? "#000" : interfaceConfig.DEFAULT_BACKGROUND);
}
}

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