Compare commits

...

214 Commits
2175 ... 2300

Author SHA1 Message Date
Lyubo Marinov
6a1eff917c Adds os and version to react-native userAgent. 2017-09-20 10:05:07 -05:00
damencho
6d62e91ff1 Adds os and version to react-native userAgent. 2017-09-20 09:08:21 -05:00
Lyubo Marinov
241dc3b147 [RN] Support XMPP authentication 2017-09-19 23:04:45 -05:00
paweldomas
141acea194 [RN] Support XMPP authentication 2017-09-19 14:38:45 -05:00
paweldomas
80329e8ffe [RN] CONFERENCE_FAILED error message in redux
In order to support XMPP authentication, we'll need the message
accompanying the error and carried by lib-jitsi-meet's
CONFERENCE_FAILED in the redux store. We already carry the message in
the redux action and we've got the error in the redux store.
2017-09-19 14:37:09 -05:00
paweldomas
9621ba03f3 feat(overlay): Clear redux state on CONNECTION_WILL_CONNECT 2017-09-19 14:36:31 -05:00
virtuacoplenny
04a1da2cea Merge pull request #1995 from jitsi/fix-local-thumbnail
fix(Filmstrip.js): Make sure the local thumbnail is there
2017-09-19 12:24:26 -07:00
virtuacoplenny
bd24135d76 Merge pull request #1990 from jitsi/fix-chat-disabled
fix(conference.js): Add message listeners only when chat is enabled
2017-09-18 19:58:09 -07:00
yanas
0c08f96755 fix(Filmstrip.js):Make sure the local thumbnail is there before getting the height 2017-09-18 17:26:24 -05:00
yanas
984085ac54 fix(conference.js): Add message listeners only when chat is enabled 2017-09-18 16:29:03 -05:00
Lyubo Marinov
9c47a7e972 Add Dialog utilities
In order to accommodate the requirements of the work on supporting XMPP
authentication on mobile/react-native, make dealing with Dialog a
little more generic and a little easier.
2017-09-18 16:00:00 -05:00
Leonard Kim
088fe87e31 fix(dominant-speaker): update dominant speaker in redux
Without dominant speaker in redux, the wrong user will be
selected after an unpin event.
2017-09-18 15:00:00 -05:00
Leonard Kim
f3783efc48 squash: remove unused prop, update comment 2017-09-18 13:22:15 -05:00
Leonard Kim
1e84f993b4 fix(device-selection): use non-connect video preview
Filmstrip only mode displays a device selection dialog that
does not have access to the redux/connect. However, the current
VideoTrack extends from AbstractVideoTrack, which assumes a
redux connection. The fix is to move video display logic into
a separate component and have device selection use that, while
the existing VideoTrack remains connected to redux but
uses the new video display component.
2017-09-18 13:22:15 -05:00
Lyubo Marinov
03b4a32dd7 Coding style 2017-09-18 11:21:45 -05:00
paweldomas
70fc727b92 [RN] Prevent a possible TypeError 2017-09-18 09:48:53 -05:00
Lyubo Marinov
d0476991a6 [RN] Support children in Dialog 2017-09-18 02:12:27 -05:00
Lyubo Marinov
2496b3ec02 [Android] Don't require camera, autofocus
Don't require autofocus because that prevents the app from appearing in
Google Play Store for some devices.

Don't require camera for the same reason but also because camera/video
is not a mandatory feature of the app, it's merely likely very
desirable.
2017-09-14 12:16:46 -05:00
Lyubo Marinov
bf915fe886 Coding style, formatting 2017-09-14 12:14:54 -05:00
Saúl Ibarra Corretgé
46ccefdfe9 feat(external_api): set permissions for cross-origin iframe
In Chrome M63 a warning is shown, permissions won't be automatically allowed
afterwards. Reference:
https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-permissions-in-cross-origin-iframes

Setting this early makes us future proof, while working with current versions
too: Chrome < 63 gives an error because it doesn't understand the option and
Firefox seems to ignore it, so both continue to work as before.
2017-09-13 15:38:30 -05:00
Lyubo Marinov
f86f21beb2 [Android] Fix VerifyError on Android 4
The class ReflectiveOperationException used in ExternalAPIModule was
introduced in API level 19.
2017-09-13 14:32:32 -05:00
Saúl Ibarra Corretgé
fe8f383a41 [Android] Update gradle plugin version for Android Studio 3 beta 5 2017-09-13 14:35:21 +02:00
Lyubo Marinov
72c9933e73 [RN] SDK building, installing, and publishing
Based on work authored by Shuai Li <sli@atlassian.com>, Daniel Ornelas
<dornelas@atlassian.com>, and Lyubo Marinov <lmarinov@atlassian.com>.
2017-09-11 20:12:56 -05:00
Leonard Kim
4b2795502c fix(contact-list): call getAvatarURL directly
Instead of going through the Avatar object, call the getAvatarURL
directly so that the code flows consistently use the participant
representation within redux.
2017-09-11 11:33:22 -05:00
Leonard Kim
082fe711f2 fix(contact-list): enable avatars by default 2017-09-11 11:33:22 -05:00
Saúl Ibarra Corretgé
ba49c7955a [Android] Fix gradle and plugin versions with Android Studio 3.0 Beta 4 2017-09-08 10:47:08 +02:00
Lyubo Marinov
354fa36f44 Update npm dependencies/package versions 2017-09-07 20:11:45 -05:00
Lyubo Marinov
2a75d67be9 Webpack with scope hoisting 2017-09-07 20:06:34 -05:00
Lyubo Marinov
5e6cea63fb [RN] Polyfill sessionStorage via Storage 2017-09-07 12:49:35 -05:00
Lyubo Marinov
0d3927fed1 Coding style 2017-09-07 12:49:35 -05:00
Lyubo Marinov
9049f52402 [RN] Allow share-room ToolbarButton to not be rendered 2017-09-07 12:49:35 -05:00
Lyubo Marinov
c2ae7999ef Coding style
In certain scenarios we do need to import files instead of features but
even then it is our coding style to not write the file extension.
2017-09-07 12:49:35 -05:00
Leonard Kim
5a50932174 fix(contact-list): fix typo in empty file name 2017-09-07 10:54:22 -05:00
Lyubo Marinov
53e1160a1c [webpack-dev-server] Serve more local resources/files 2017-09-07 09:34:53 -05:00
Lyubo Marinov
15ab7a292c Reduce the dependencies of the Web ExternalAPI
We broke external_api.min.js by importing react/features/util which
imported react/features/base/lib-jitsi-meet.

1. To reduce the risks of such a breakage until we add
   external_api.min.js to the torture tests, import as little as
   possible in modules/API/external/external_api.js.
2. Use the global JitsiMeetJS on Web in react/features/base/util.
2017-09-06 23:20:04 -05:00
Lyubo Marinov
fce0e4c22c [RN] Report loadConfigError with locationURL to the SDK consumers 2017-09-06 20:34:46 -05:00
Lyubo Marinov
4dc78ce458 [RN] Increase the coverage of JitsiMeetViewListener
JitsiMeetViewListener is an integral part of the public API of Jitsi
Meet SDK for Android. Utilize it in the Debug configuration of the Jitsi
Meet app for Android in order to increase (1) awareness of API breakages
and (2) API coverage.

The same goes for JitsiMeetViewDelegate in Jitsi Meet SDK and app for
iOS.
2017-09-06 16:31:15 -05:00
Lyubo Marinov
67edaac1c9 [RN] Coding style 2017-09-06 16:31:15 -05:00
Lyubo Marinov
e830b80b6b [RN] Fix documentation 2017-09-06 16:31:15 -05:00
Saúl Ibarra Corretgé
284e4e543e [RN] Detect errors when loading the configuration
The error is stored in the redux store in base/config so other components can
consult it. It is also broadcasted as a new event in the external API for the
SDK.
2017-09-06 16:31:14 -05:00
Lyubo Marinov
1d8ee9d32f [RN] Reduce maintenance
JitsiMeetViewListener currently has methods of one and the same pattern
so adding new methods i.e. events i.e. redux action types is a question
of repetition in the Java source code. Speed up the support of new
events by trying to deal with them in a generic way.

The same goes for JitsiMeetViewDelegate.
2017-09-06 15:57:00 -05:00
Lyubo Marinov
6982506acc [RN] Remove duplication 2017-09-06 14:48:53 -05:00
Lyubo Marinov
d818436645 [RN] Fix import breakage caused by Web 2017-09-06 14:39:34 -05:00
Leonard Kim
31729d7949 feat(contact-list): convert to react
- Remove references to the model ContactList.
- Replace ContactListView with an empty element for attaching
  the React Component ContactListPanel, which has the same
  features as the old ContactListView.
- Create new selector for getting non-fake participants for
  ContactListPanel's props.
- Create a ParticipantCounter component to place in the contact
  list button. Previously ContactListView updated that but now
  it's a react component hooked into the participant state.
- Remove pub/sub that was used only by ContactListView.
2017-09-06 12:11:33 -05:00
Lyubo Marinov
ed53f54628 [RN] Fix the visibility of the local video on the WelcomePage 2017-09-06 08:22:39 -05:00
Saúl Ibarra Corretgé
9833965a27 [RN] Extract a function 2017-09-05 22:49:22 -05:00
Lyubo Marinov
8cdd73b987 [RN] Reverts to own properties for Storage 2017-09-05 18:55:54 -05:00
Lyubo Marinov
a7ee632f43 [RN] LocalVideoTrackUnderlay
Implement a React Component which displays children as an overlay of
local video. The WelcomePage implemented such a component inside of it
among other WelcomePage-specific logic so I split
LocalVideoTrackUnderlay out of it. The new Component is used on the
BlankPage which may be displayed in the future not only when the
WelcomePage is disabled but also when there are long running network
requests, for example.
2017-09-05 17:45:20 -05:00
Lyubo Marinov
b304ad5808 [RN] Weaken the coupling between WelcomePage and AbstractWelcomePage 2017-09-05 16:27:12 -05:00
Lyubo Marinov
86e4876df2 Coding style 2017-09-05 15:56:59 -05:00
Saúl Ibarra Corretgé
034518a6a0 [RN] Cache configurations in localStorage
This only helps iff there is a short transient network error which prevents the
configuration from being loaded. In such case, use the cached version in
localStorage, which may not match the shard, but it's (probably!) better than
nothing.

In case there is no Internet connectivity, an error will be produced as soon as
the XMPP connection is attempted anyway.
2017-09-05 14:58:26 -05:00
Lyubo Marinov
bf523711df [RN] Prepare to polyfill sessionStorage 2017-09-05 13:56:33 -05:00
Saúl Ibarra Corretgé
bfeaf329e1 [RN] Add polyfill for localStorage
It's built on top of React Native's AsyncStorage. They have differing APIs, so
we implement a synchronous API on top of an asynchronous one. This is done by
being optimistic and hoping that operations will happen asynchronously. If one
such operation fails, the error is ignored and life goes on, since operations
are performed in the in-memory cache first.

Note to reviewers: LocalStorage.js lacks Flow annotations because indexable
class declarations are not yet supported:
https://github.com/facebook/flow/issues/1323 and yours truly couldn't find a way
to make the required syntax work without making it unnecessarily complex.
2017-09-05 10:42:42 -05:00
Saúl Ibarra Corretgé
0e234bfd82 doc: mention "npm install" is required on mobile
Specially prior to pod install.
2017-09-05 11:00:40 +02:00
Saúl Ibarra Corretgé
8fc095039e analytics: lower log severity when we fail to create a handler
It'snot the end of the world, we can move on.
2017-09-05 10:48:57 +02:00
Saúl Ibarra Corretgé
eca04de348 Simplified code 2017-09-04 11:35:09 +02:00
Saúl Ibarra Corretgé
18d1572dab [RN] Load config.js only when the room is known
This patch loads the config later than we used to, that is, only once we
know the room the user is about to join.

Due to architectural limitations in lib-jitsi-meet, it needs to be
initialized with a configuration in order to properly function. This is
unfortunate because we need to create a video track in the welcome page,
but don't know the room (hence no config) yet. In order to circumvent
this problem an empty configuration is used, which is later swapped with
the appropriate one, once loaded.

Some interesting side-effects of this change are a perceived speed
increase when the app starts or a conference is hangup. They are both
due to the fact that no config needs to be fetched from a remote server
in those cases.
2017-09-02 13:26:07 -05:00
Lyubo Marinov
45a1ae26ca [RN] Prepare to display BlankPage more
For example, while config.js and other files are being loaded before the
navigation to Conference is feasible.
2017-09-02 13:26:06 -05:00
Lyubo Marinov
6545a7a1bb Remove duplication 2017-09-01 23:55:25 -05:00
Lyubo Marinov
ec9c05e401 [RN] Load config.js with ?room=
In order to load the configuration from the shard that will actually
host the conference, it's imperative that we add the room= query
parameter:

https://meet.jit.si/config.js?room=example

This implies a departure from our current model, where the config is
discarded if the domain for the next conference is different, but kept
otherwise.
2017-09-01 23:55:25 -05:00
virtuacoplenny
bf03e73876 feat(filmstrip): show thumbnails with toolbar and on hover (#1944)
* feat(filmstrip): show thumbnails with toolbar and on hover

* squash: reduce verbosity of logic for when to display

* squash: remove check for fake participant

Before fake participant (youtube video) would make the filmstrip
always displayed. However, youtube videos already dock the
toolbar, so filmstrip will remain displayed, so the check is
redundant.

* squash: change mouse hover listener targets
2017-09-01 16:40:05 -05:00
Дамян Минков
6682543691 Moves analytics loading to react. (#1945)
* feat(analytics): move to React

The analytics handlers have been moved to JitsiMeetGlobalNS, so now they are
stored in `window.JitsiMeetJS.app.analyticsHandlers`.

The analytics handlers are re-downloaded and re-initialized on every
lib-jitsi-meet initialization, which happens every time the config is changed
(moving between deployments in the mobile app).

* Adds legacy support for old analytics location.
2017-09-01 14:14:03 -05:00
Lyubo Marinov
8d81f1d69f Update npm dependencies/package versions 2017-08-31 20:08:12 -05:00
Lyubo Marinov
8436f23e05 Comments 2017-08-31 19:31:46 -05:00
Leonard Kim
2ae354530e fix(contact-list): remove parens from member count string 2017-08-31 16:21:31 -05:00
Leonard Kim
4938d1b6de fix(contact-list): update avatar sizing
With interfaceConfig.SHOW_CONTACTLIST_AVATARS, the avatars in the
contact list are too big and will overlap each other. Constrain
the avatar sizes and make each contact a little taller to better
space each out.
2017-08-31 16:21:31 -05:00
hristoterezov
cd3dad956b fix(peopleSearch): queryTypes are defined in config.js 2017-08-31 15:04:29 -05:00
Saúl Ibarra Corretgé
328da08b3a [RN] Remove obsolete comment
We have already made the implicit decision not to pursue what the
comment describes. If we ever revisit it, it probably won't be handled
where the comment is anyway.
2017-08-31 11:50:18 -05:00
virtuacoplenny
a94e38e890 Merge pull request #1951 from jitsi/watermark-config
Make watermark size configurable
2017-08-30 13:01:37 -07:00
yanas
b9f2ab7692 Make watermark size configurable 2017-08-30 14:01:41 -05:00
Leonard Kim
05f8c69fe6 ref(toolbar): add wrapper around buttons for torture tests
The torture tests were looking for the anchor tag within each
button. However, that anchor could get blown away from a react
re-render. So instead, expose a way for the torture tests
to find the root node of the button.
2017-08-30 11:31:15 -05:00
Leonard Kim
7063f144ef feat(tooltips): add for video quality label and feedback button 2017-08-30 11:10:28 -05:00
Leonard Kim
af92ba5e86 fix(toolbar): push buttons further from top of side toolbar 2017-08-30 11:10:28 -05:00
Leonard Kim
5e4f921e1b ref(video-quality-label): do not show quality dialog 2017-08-30 11:10:28 -05:00
Leonard Kim
126f8e6d88 ref(strings): change user-facing references of "participant" to "member" 2017-08-30 11:10:28 -05:00
Lyubo Marinov
7f8e8177d0 [RN] Refactor "Keep track of ongoing network requests" and "Show a progress indicator in the BlankPage"
I'm not saying that the two commits in question were wrong or worse than
what I'm offering. Anyway, I think what I'm offering brings:

* Compliance with expectations i.e. the middleware doesn't compute the
next state from the current state, the reducer does;

* Clarity and/or simplicity i.e. there's no global variable (reqIndex),
there's no need for the term "index" (a.k.a "reqIndex") in the redux
store.

* By renaming net-interceptor to network-activity feels like it's
preparing the feature to implement a NetworkActivityIndicator React
Component which will take on more of the knowledge about the specifics
of what is the network activity redux state exactly, is it maintained by
interception or some other mechanism, and abstracts it in the feature
itself allowing outsiders to merely render a React Component.
2017-08-29 18:54:04 -05:00
Saúl Ibarra Corretgé
e33030582f [RN] Show a progress indicator in the BlankPage
It will only be shown when there are ongoing network requests.
2017-08-29 18:54:04 -05:00
Saúl Ibarra Corretgé
d669a6c73c [RN] Keep track of ongoing network requests
Works only for XHR requests, which is the only network request mobile performs
(WebRTC traffic aside). The fetch API is implemented on top of XHR, so that's
covered too.

Requests are kept in the redux store until they complete, at which point they
are removed.
2017-08-29 18:54:04 -05:00
Saúl Ibarra Corretgé
8eebfcad72 [RN] Add support for callstats on mobile
The global.performance.now polyfill is removed since it's polyfilled by
react-native-callstats.
2017-08-29 18:47:35 -05:00
virtuacoplenny
ef1b8fdb77 ref(1-on-1): move remote video visibility to a selector (#1922)
* ref(1-on-1): move remote visibility to a selector

Derive whether or not remote videos should display using a selector
to look across different states. A selector was chosen over using
memoized selectors (reselect) or subscribers as a first step
approach, avoiding additional mutations caused by a subscriber
updating the filmstrip state and avoiding additional api overhead
introduced by reselect.

* rename selector
2017-08-29 10:08:16 -05:00
Saúl Ibarra Corretgé
c0f648b1ab [RN] Remove no longer needed fetch API fallback 2017-08-29 10:30:09 +01:00
Saúl Ibarra Corretgé
531b638a8a [RN] Switch default avatars to meeples 2017-08-29 09:27:28 +01:00
Saúl Ibarra Corretgé
4e3d033ff2 deps: use latest jsSHA
callstats no longer depends on it and it doesn't break when we use the latest.
2017-08-28 18:52:51 -05:00
virtuacoplenny
77e8c75795 Merge pull request #1939 from bbaldino/edge_fixes
few tweaks to fix some exceptions in edge
2017-08-28 15:56:04 -07:00
Saúl Ibarra Corretgé
9559df1b13 Merge pull request #1940 from jitsi/fix_aot
fix(external_api): isAudioMuted and isVideoMuted
2017-08-29 00:26:21 +02:00
hristoterezov
f93c1b5748 fix(external_api): isAudioMuted and isVideoMuted 2017-08-28 16:56:27 -05:00
bbaldino
f616b0b71b few tweaks to fix some exceptions in edge 2017-08-28 21:52:52 +00:00
hristoterezov
70422f4a47 fix(alwaysontop): change the size of the toolbar 2017-08-28 14:52:31 -05:00
virtuacoplenny
735a596afe ref(recording): convert recording label to react (#1915)
* ref(recording): convert recording label to react

- Create a RecordingLabel component for displaying the current
  recording state, as reflected in the redux store. This is
  needed for 1-on-1 mode to be completely in redux.
- Update the store with the recording state so RecordingLabel
  can update itself.
- Remove previous logic for updating the non-react label, which
  includes event emitting for filmstrip visibility changes,
  as RecordingLabel is hooked into redux updates.

* ref(recording): use status and type constants from lib

* make label really dumb, move logic back to Recording
2017-08-25 11:45:30 -05:00
Saúl Ibarra Corretgé
e04129bf4d Merge pull request #1916 from virtuacoplenny/lenny/no-custom-debounce
ref(toolbar): replace custom debounce with lodash throttle
2017-08-25 15:31:16 +02:00
Leonard Kim
85f0ad2791 feat(popover): create a wrapper around InlineDialog 2017-08-24 22:00:14 -05:00
Leonard Kim
c54879d605 fix(video-quality-label): push around z-indexes for firefox 2017-08-24 22:00:14 -05:00
Leonard Kim
fdee6dc360 fix(inline-dialog): reimplement popover display on mouse move
Create empty elements within InlineDialog content that can be
used to bridge mouse movement from the InlineDialog trigger to
the InlineDialog content. The empty elements are positioned
absolute so they can break out of the InlineDialog container
and not affect popper's position calculations.
2017-08-24 22:00:14 -05:00
Saúl Ibarra Corretgé
5f55b3198c [Android] Update gradle plugin version for Android Studio 3 beta 2 2017-08-24 15:04:31 +02:00
Дамян Минков
5b6d7a3040 Skips creating duplicate poltergeists for the same user. (#1925) 2017-08-23 16:14:44 -05:00
virtuacoplenny
1ca485f1a8 Merge pull request #1924 from jitsi/status-message-clear
Skips showing empty statuses. Updates poltergeist to report connected.
2017-08-23 14:12:02 -07:00
damencho
6e37fe175d Skips showing empty statuses. Updates poltergeist to report connected. 2017-08-23 14:10:10 -05:00
Lyubo Marinov
24db52ef0f [RN] Remove denied permission alert from WelcomePage 2017-08-22 16:38:14 -05:00
Lyubo Marinov
0b8c12de0e Simplify route navigation
I see it as the first step in simplifying the route navigate of the
JavaScript app by removing BlankWelcomePage from _getRouteToRender. From
a faraway point of view, the app is at the route at which it is not in a
conference. Historically, the route was known as the Welcome page. But
mobile complicated the route by saying that actually it may not want to
see the room name input and join button.

Additionally, I renamed BlankWelcomePage to BlankPage because I don't
think of it as a WelcomePage alternative but rather as a more generic
BlankPage which may be utilized elsewhere in the future.

I plan for the next steps to:
* Merge Entryway, _interceptComponent, and _getRouteToRender in one
React Component rendered by AbstractApp so that the whole logic is in
one file;
* Get rid of RouteRegistry and routes.
2017-08-22 16:38:14 -05:00
Lyubo Marinov
cb5b93fb6e Switch to prop-types 2017-08-22 16:38:14 -05:00
Lyubo Marinov
7114614697 Remove obsolete workaround 2017-08-22 16:38:14 -05:00
Aaron van Meerten
45b8693a3e Merge pull request #1921 from jitsi/rayo_filter_subdomains_support
Adds multidomain support to rayo filter module.
2017-08-22 15:22:08 -05:00
damencho
360283aa34 Adds multidomain support to rayo filter module. 2017-08-22 15:00:40 -05:00
ibauersachs
fb556edb9d Commit from translate.jitsi.org by user ibauersachs.: 339 of 379 strings translated (1 fuzzy). 2017-08-22 19:40:36 +00:00
ibauersachs
28e5230472 Commit from translate.jitsi.org by user ibauersachs.: 117 of 379 strings translated (19 fuzzy). 2017-08-22 19:40:30 +00:00
ibauersachs
73ea42f49f Commit from translate.jitsi.org by user ibauersachs.: 297 of 379 strings translated (7 fuzzy). 2017-08-22 19:40:24 +00:00
ibauersachs
255ddbd344 Commit from translate.jitsi.org by user ibauersachs.: 307 of 379 strings translated (6 fuzzy). 2017-08-22 19:40:18 +00:00
ibauersachs
df1b2c41cf Commit from translate.jitsi.org by user ibauersachs.: 126 of 379 strings translated (15 fuzzy). 2017-08-22 19:40:11 +00:00
ibauersachs
8752cc40e2 Commit from translate.jitsi.org by user ibauersachs.: 136 of 379 strings translated (15 fuzzy). 2017-08-22 19:40:05 +00:00
ibauersachs
e42d209401 Commit from translate.jitsi.org by user ibauersachs.: 285 of 379 strings translated (7 fuzzy). 2017-08-22 19:39:59 +00:00
ibauersachs
cd31aad2fd Commit from translate.jitsi.org by user ibauersachs.: 339 of 379 strings translated (1 fuzzy). 2017-08-22 19:39:53 +00:00
ibauersachs
81d7a3147b Commit from translate.jitsi.org by user ibauersachs.: 230 of 379 strings translated (20 fuzzy). 2017-08-22 19:39:47 +00:00
ibauersachs
ac909dce4c Commit from translate.jitsi.org by user ibauersachs.: 378 of 379 strings translated (0 fuzzy). 2017-08-22 19:39:39 +00:00
ibauersachs
6a040d2e67 Commit from translate.jitsi.org by user ibauersachs.: 0 of 379 strings translated (0 fuzzy). 2017-08-22 19:39:33 +00:00
ibauersachs
3ab9765e6b Commit from translate.jitsi.org by user ibauersachs.: 137 of 379 strings translated (16 fuzzy). 2017-08-22 19:39:27 +00:00
ibauersachs
1025ce75bd Commit from translate.jitsi.org by user ibauersachs.: 348 of 379 strings translated (1 fuzzy). 2017-08-22 19:39:20 +00:00
ibauersachs
2e0faa8715 Commit from translate.jitsi.org by user ibauersachs.: 296 of 379 strings translated (7 fuzzy). 2017-08-22 19:39:14 +00:00
ibauersachs
0f6541c07b Commit from translate.jitsi.org by user ibauersachs.: 2 of 379 strings translated (1 fuzzy). 2017-08-22 19:39:07 +00:00
ibauersachs
7466a03a7d Commit from translate.jitsi.org by user ibauersachs.: 347 of 379 strings translated (1 fuzzy). 2017-08-22 19:39:00 +00:00
ibauersachs
e781f4f02d Commit from translate.jitsi.org by user ibauersachs.: 194 of 379 strings translated (24 fuzzy). 2017-08-22 19:38:52 +00:00
ibauersachs
08d9f28cc4 Commit from translate.jitsi.org by user ibauersachs.: 297 of 379 strings translated (7 fuzzy). 2017-08-22 19:38:43 +00:00
ibauersachs
a5b94e5534 Commit from translate.jitsi.org by user ibauersachs.: 378 of 379 strings translated (0 fuzzy). 2017-08-22 19:37:18 +00:00
Leonard Kim
7cea557416 ref(shared-video): move SharedVideoThumb to own file 2017-08-22 10:27:34 -05:00
Leonard Kim
52ee8fd473 ref(small-video): remove some global jquery dom querying
Create a reference to the jquery element instead of querying for
it globally. This is to better encapsulate the small video
component.
2017-08-22 10:27:34 -05:00
Leonard Kim
670d575bcb ref(remote-video): set inner html instead of creating elements
This better mimics declarative jsx.
2017-08-22 10:27:34 -05:00
Leonard Kim
16fbf90a00 ref(local-audio): remove rendering of local audio
The local audio stream is attached to an audio element that is
always muted. As such, local audio is not being rendered and
the attaching may just not be needed at all.
2017-08-22 10:27:34 -05:00
Leonard Kim
ec22329408 ref(local-video): generate html instead of hardcoding in filmstrip
This would better mimic React behavior where each component has
its own markup, instead of relying on markup existing elsewhere.
2017-08-22 10:27:34 -05:00
Saúl Ibarra Corretgé
26f0f7f89c [RN] Alert the user when they need to manually grant a permission 2017-08-22 07:28:19 -05:00
Saúl Ibarra Corretgé
9bca0e3b3d [RN] Create tracks right when they are required
When do we need tracks?

- Welcome page (only the video track)
- Conference (depends if starting with audio / video muted is requested)

When do we need to destroy the tracks?

- When we are not in a conference and there is no welcome page

In order to accommodate all the above use cases, a new component is introduced:
BlankWelcomePage. Its purpose is to take the place of the welcome page when it
is disabled. When this component is mounted local tracks are destroyed.

Analogously, a video track is created when the (real) welcome page is created,
and all the desired tracks are created then the Conference component is created.
What are desired tracks? These are the tracks we'd like to use for the
conference that is about to happen. By default both audio and video are desired.
It's possible, however, the user requested to start the call with no
video/audio, in which case it's muted in base/media and a track is not created.

The first time the app starts (with the welcome page) it will request permission
for video only, since there is no need for audio in the welcome page. Later,
when a conference is joined permission for audio will be requested when an audio
track is to be created. The audio track is not destroyed when the conference
ends. Yours truly thinks this is not needed since it's a stopped track which is
not using system resources.
2017-08-22 07:28:19 -05:00
Saúl Ibarra Corretgé
3102ea6818 [RN] Try to create local tracks when unmuting, if track is missing
This is only desired when the unmuting action took place due to a manual user
intervention or the audio-only mode being disengaged.
2017-08-22 07:28:19 -05:00
Leonard Kim
ec7c10c99b ref(toolbar): replace custom debounce with lodash throttle
The current custom debounce function sets a timeout and ensures
additional calls are not executed while the timeout is pending.
Regulating the call of a function while also ensuring it gets
called at a certain time is a throttle.
2017-08-21 17:20:52 -07:00
Leonard Kim
28b4595561 ref(tooltips): remove old tooltips 2017-08-21 15:16:09 -05:00
Leonard Kim
e3361e2f3b feat(tooltips): convert popup tooltips to InlineDialog 2017-08-21 15:16:09 -05:00
Leonard Kim
c3a4a38414 feat(toolbar): use AtlasKit tooltip 2017-08-21 15:16:09 -05:00
Leonard Kim
38e2443ab7 feat(small-video): use AtlasKit tooltip 2017-08-21 15:16:09 -05:00
Lyubo Marinov
2356238887 [Android] Reduce boilerplate/duplication 2017-08-21 13:58:13 -05:00
Saúl Ibarra Corretgé
c42f1704ff [RN] Rename createInitialLocalTracks to createLocalTracks
The name better suits its purpose, since it can be called at any time.
2017-08-21 08:15:55 -05:00
Leonard Kim
5358f022ff fix(config): override config values instead of merging
Iterate over objects and copy over primitives and arrays
instead of using _.merge, as merge will not replace a config
entry completely. For arrays in a target object, the arrays
will have its indices replaced. This means if a source array
is empty, the target array will be left alone. Similarly,
if the target array is longer than a source array, there
will be indices not touched in the target array.
2017-08-21 07:07:18 -05:00
hristoterezov
5ef914602f fix(remotecontrol): Handle screen sharing cancel 2017-08-21 10:41:24 +01:00
Lyubo Marinov
2818520c8f [RN] Make react-native-img-cache optional at bundle time 2017-08-18 14:54:25 -05:00
Lyubo Marinov
131e5af01e [RN] Fix a strange import of a feature by itself 2017-08-18 14:52:41 -05:00
Lyubo Marinov
90e7804834 Coding style 2017-08-18 14:47:15 -05:00
Lyubo Marinov
c0de88ba8c [RN] Remove unnecessary import 2017-08-18 14:45:00 -05:00
Paweł Domas
99ce46cfa8 feat(conference, toolbox, API) get rid of {audio,video}Muted' flags
* ref: video muted state

Get rid of 'videoMuted' flag in conference.js

* ref: audio muted state

Get rid of 'audioMuted' flag in conference.js

* fix(conference.js|API): early audio/video muted updates

* ref(conference.js): rename isVideoMuted

Rename isVideoMuted to isLocalVideoMuted to be consistent with
isLocalAudioMuted.

* doc|style(conference.js): comments and space after if

* ref: move 'setTrackMuted' to functions

* fix(tracks/middleware): no-lonely-if

* ref(features/toolbox): get rid of last argument

* ref(defaultToolbarButtons): rename var
2017-08-18 13:30:30 +02:00
George Politis
e0e3e873b8 Update turn.md 2017-08-18 13:21:02 +02:00
George Politis
e4f959e400 Create turn.md 2017-08-18 13:18:28 +02:00
Leonard Kim
27deb97c5c ref(filmstrip): hook filmstrip to redux for 1-on-1 mode
- Remove non-redux paths for hiding and showing remote videos.
- Hook web filmstrip to redux to know when to hide remote videos.
  This works, even though VideoLayout is handling RemoteVideo
  appending, because react is only monitoring filmstrip's declared
  JSX which does not change except for attributes (css classes).
2017-08-17 17:27:30 -05:00
Leonard Kim
20379da236 ref(css): remove unused popover.scss 2017-08-17 17:22:38 -05:00
hristoterezov
378a8d014e feat(remotecontrol): Prevent multiple remote control sessions (#1875) 2017-08-17 09:43:22 -07:00
Lyubo Marinov
31dd3da2b6 Remove obsolete file 2017-08-16 17:07:38 -05:00
Lyubo Marinov
ba61876b13 Log an error using less scary words 2017-08-16 16:38:07 -05:00
Lyubo Marinov
f54e87d975 Coding style 2017-08-16 16:36:46 -05:00
Lyubo Marinov
c1fbbc4571 Reduce duplication 2017-08-16 16:28:39 -05:00
yanas
3d397a28e6 Updates default avatar image 2017-08-16 14:42:41 -05:00
Lyubo Marinov
6003b560ae [RN] Fix opening the same URL multiple times
Deep/universal linking now utilizes loadURL (when possible). But loadURL
is imperative in the native source code while its JavaScript counterpart
i.e. React App Component prop url is declarative. So there's the
following bug: open a URL, leave the conference (by tapping the hangup
button, for example), and then opening the same URL actually leaves you
on the Welcome page (if enabled; otherwise, a black screen).

The implementation has a flow though: opening the same URL twice in a
row without an intervening leave will leave the first opening and join
the new opening. Which can be improved by not leaving and joining if the
conference is joined, joining, an not leaving. But that can be done
separately as an improvement independent of the current implementation
details.
2017-08-15 17:32:37 -05:00
Lyubo Marinov
207393d98e [RN] Coding style 2017-08-15 17:32:37 -05:00
Lyubo Marinov
571958cf26 Start the switch to prop-types
As https://facebook.github.io/react/docs/typechecking-with-proptypes.html
says, React.PropTypes have moved into the npm package prop-types since
React v15.5. I've already failed to update certain devDependencies
because they mandate the use of prop-types so I'd rather we (gradually
at least) move to prop-types rather than face a lot of work later on.
2017-08-15 17:32:37 -05:00
Lyubo Marinov
4a39a630a4 Update npm dependencies 2017-08-15 17:32:37 -05:00
virtuacoplenny
3e3577766d fix(quality-slider): prevent resizing by making p2p warning hidden (#1890)
* fix(quality-slider): prevent resizing by making p2p warning hidden

Instead of removing and appending the p2p warning, make it always
appended but toggle visibility so it always takes up space. This
should prevent resizing when the warning appears. Margin and
padding were adjusted to account for the empty space displayed
by a hidden p2p warning.

* let vertical size change
2017-08-15 15:22:32 -05:00
Leonard Kim
5e4d3de8fd fix(filmstrip): re-adjust z-indexes for tooltip display 2017-08-15 14:36:53 -05:00
virtuacoplenny
1b7973a28e ref(invite): use AtlasKit for invite modal buttons and inputs (#1868)
* ref(invite): use AtlasKit for invite modal buttons and inputs

- Convert button to AK Button.
- Convert inputs to AK FieldText.

* remove noop, replace with custom empty func
2017-08-15 14:30:57 -05:00
Leonard Kim
830ec3d097 fix(video-quality): change click handler location on label
This will prevent the quality dialog from closing when changing
desired quality level.
2017-08-14 15:13:29 -05:00
Leonard Kim
995a25ee15 fix(video-quality-label): adjust z-indexing clashes with filmstrip
With AtlasKit InlineDialog, the filmstrip z-index in vertical
filmstrip mode was adjusted as it had to be set to fixed position
for the dialogs to automagically be position fixed. This left
behind a regression where the filmstrip z-index was the same as
the video quality label, but came later in the dom, so the label
was not clickable. This commit modifies the z-index of the
vertical filmstrip to account for clicking of the video quality
label.
2017-08-14 15:12:06 -05:00
virtuacoplenny
725d39ddcd feat(jitsipopover): convert to InlineDialog (#1804)
* feat(small-video): use InlineDialog for stats and remote menu

- Remove JitsiPopover and use InlineDialog instead.
- Bring the remote menu icon into react.
- Make vertical filmstrip position:fixed so popper (AtlasKit
  dependency) sets InlineDialogs and eventually tooltips to
  position:fixed.

* ref(remote-menu): hook KickButton to redux

* ref(remote-menu): hook MuteButton to redux

* modify padding, toggle dialogs

* pixel push margins to align dialogs, adjust padding of dialogs

* add comment about margin for dialog, add file I forgot

* modify indicator markup so the icon can be moved down while trigger stays at top of toolbar
2017-08-14 10:02:58 -05:00
Aaron van Meerten
cd910e3074 docs: document the services which jitsi meet can consume
* new documentation for the services which jitsi meet can consume for conference mapping to dial-in numbers

* attempted markdown link for swagger file from documentation file
2017-08-14 16:20:20 +02:00
Saúl Ibarra Corretgé
2e3a5b1c35 [RN] Fix jsdocs 2017-08-14 12:23:46 +02:00
hristoterezov
1b0bffe251 fix(remotecontrol): Stop scroll events during the remote controll session 2017-08-14 09:13:38 +01:00
hristoterezov
1782030936 feat(alwaysontop): Toolbar. 2017-08-11 17:07:24 -07:00
hristoterezov
382b328262 fix(postmessagebackend): JS error when response is sent. 2017-08-11 17:07:24 -07:00
hristoterezov
b81dc4e59b ref(toolbar): Implement stateless toolbar 2017-08-11 17:07:24 -07:00
hristoterezov
53f675fbe0 ref(ToolbarButton): Remove unnecessary check. 2017-08-11 17:07:24 -07:00
hristoterezov
f18b42b286 fix(ToolbarButton): Don't register shortcut if APP is not defined. 2017-08-11 17:07:24 -07:00
hristoterezov
91e75bf7b9 ref(UIUtil): Move all tooltip functions into another file 2017-08-11 17:07:24 -07:00
hristoterezov
fe59084979 ref(isButtonEnable): UIUtil -> toolbox 2017-08-11 17:07:24 -07:00
hristoterezov
025f7204d5 ref(ToolbarButton): Remove dispatch 2017-08-11 17:07:24 -07:00
hristoterezov
da9e3fb63e feat(external_api): Return external resources for the always on top. 2017-08-11 17:07:24 -07:00
Leonard Kim
d7bccd0c93 ref(pinning): remove pinnedId state from VideoLayout
Instead have VideoLayout reach into redux.
2017-08-11 10:43:35 +01:00
Leonard Kim
f1f46e0af5 feat(pinning): move web pinning logic into redux
- Re-use the native redux pinning implementation for web
- Remove pinning logic from conference.js
- To the native pinning add a check for sharedVideo so
  youtube videos do not send a pin event
- Add shared videos as a participant to enable pinning and
  so they can eventually get added to the filmstrip
- Emit UIEvents.PINNED_ENDPOINT from middleware
2017-08-11 10:43:35 +01:00
Saúl Ibarra Corretgé
19d9b3f023 feat(config): reorganize and thoroughly document config.js
- Document each option.
- Group options semantically.
- Remove no longer existing options.
- Add some missing options.
- Fix punctuation here and there.

NOTE: This is a first step towards a full configuration overhaul, once it
materializes each of the "semantic sections" will be a JS object.
2017-08-10 07:44:53 -05:00
virtuacoplenny
d8cd3e75b4 feat(quality-slider): initial implementation (#1817)
* feat(quality-slider): initial implementation

- Add new menu button with an Inline Dialog slider for
  selecting received video quality.
- Place P2P status in redux store for the Inline Dialog
  to display a warning about not respecting video quality
  selection.
- Respond to data channel open events by setting receive
  video quality. This is for lonely call cases where a
  setting is set before the data channel is open.
- Remove dropdown menu from video status label and clean
  up related js and css.

* first pass at addressing feedback

- Move VideoStatusLabel to video-quality directory.
- Rename VideoStatusLabel to VideoQualityLabel.
- Open VideoQualitydialog from VideoQualityLabel.
- New CSS for making VideoQualityLabel display properly.
- Do not render VideoQualityLabel in filmstrip only instead of hiding with css.
- Remove tooltip from VideoQualityLabel.
- Show LD, SD, HD labels in VideoQualityLabel.
- Remove action SET_LARGE_VIDEO_HD_STATUS from conference.
- Create new action UPDATE_KNOWN_LARGE_VIDEO_RESOLUTION in large-video.
- Move VideoQualityButton into video-quality directory.
- General renaming (medium -> standard, menu -> dialog).
- Render P2P message between title and slider.
- Add padding to slider for displacement caused by P2P message's new placement.
- Fix display issue with VideoQualityButton displaying out of line in the
  primary toolbar.

* second pass at addressing feedback

- Fix p2p inline message color
- Force labels to break on words
- Resolve rebase issues, including only dispatching quality
  update on change. Before there was double calling of dispatch
  produced by an IE11 workaround. This breaks now when setting
  audio only mode to true twice.
- Rename some instances of quality to definition

* rename to data channel opened

* do not show p2p in audio only

* stop toggle audio only icon automatically

* remove fixme about toolbar button

* find closest resolution for label

* toggle dialog on button click

* redo last commit for both button and label
2017-08-09 14:40:03 -05:00
damencho
c1fb1a7def Installs required basexx when token package is installed. Fixes #1870.
Adds some debug messages when token verification fails for some reason.
2017-08-08 23:13:25 +03:00
Saúl Ibarra Corretgé
ca80839094 [Android] Fix gradle and plugin versions with Android Studio 3.0 Canary 9 2017-08-08 14:48:43 -05:00
Paweł Domas
194b3ac9d3 [RN] Add local tracks before joining the conference
* ref(base/conference): add tracks before join

Sometimes it will be suboptimal to add local tracks to the conference,
after the room has been joined. It may slow down the session initiation
process by having to send unnecessary 'source-add' notifications.

* squash: fix typos/comments
2017-08-08 09:27:44 -05:00
hristoterezov
cfe7e30550 fix(SS): Add toggle parameter 2017-08-08 14:18:45 +01:00
virtuacoplenny
ff442853a2 feat(feedback): convert to react and redux (#1833)
* feat(feedback): convert to react and redux

- For styles, remove "aui-dialog2" nesting so existing styles
  can be reused.
- Remove Feedback.js and replace with calls to redux for state
  storing and accessing.
- Add dispatching to FeedbackButton instead of relying on jquery
  clicking handling so the button can be hooked into redux.

* address feedback

* remove calling to not show feedback for recorder and filmstrip
2017-08-07 11:20:44 -05:00
Lyubo Marinov
85a168d51b [RN] base/media is intent, base/tracks is reality 2017-08-04 16:07:48 -05:00
Saúl Ibarra Corretgé
d600504d85 [RN] Refactor video muting
Simplify the code by using a bitfied instead of a couple of boolean flags. This
allows us to mute the video from multiple places and only make the unmute
effective once they have all unmuted.

Alas, this cannot be applied to the web without a massive refactor, because it
uses the track muted state as the source of truth instead of the media state.
2017-08-04 16:07:48 -05:00
Leonard Kim
bd4766648a fix(filmstip-only): apply background color to toolbar 2017-08-04 13:55:42 -05:00
Saúl Ibarra Corretgé
d200abb8db [RN] Polyfill window.location.search
Currently lib-jitsi-meet looks there in case the `anonymousdomain` config option
was specified.

While this commit alone doesn't add support for authenticated deployments, it
avoids a failure if `anonymousdomain` was set, regardless of authentication being
turned on or not.

Fixes: https://github.com/jitsi/jitsi-meet/issues/1858
2017-08-04 11:35:03 -05:00
Leonard Kim
002e48b886 feat(display-name): convert prompt to react
Create a new component that uses Dialog. Reuse existing actions
for updating a participant's display name.
2017-08-04 10:21:18 -05:00
Saúl Ibarra Corretgé
1c1604bee7 [Android] Don't mute the microphone under any circumstance
It's a global action, and if we do that other applications won't be able to use
it. I experienced this with the system camera. We do, however, make sure to
enable it when we need to.

Note that enabling it doesn't mean we are *using* it. It just means we *can*,
and that we will get actual audio when we do.
2017-08-03 13:45:41 -05:00
Saúl Ibarra Corretgé
99fd325a51 [Android] Fix gradle warning
This setting is no longer used.
2017-08-03 13:45:41 -05:00
Saúl Ibarra Corretgé
4f6ec920cd [Android] Set targetApiVersion to 25
We keep being compatible with versions all the way down to 16 for now, but this
will disable internal compatibility shims when running on 25.
2017-08-03 13:45:41 -05:00
Saúl Ibarra Corretgé
0d33844d51 [Android] Use an appropriate Android support library version
It must match the compileSdkVersion major number.
2017-08-03 13:45:41 -05:00
Lyubo Marinov
0836f2cefd [RN] Prefetch remote avatar images 2/2 2017-08-03 13:45:41 -05:00
Lyubo Marinov
97832e0eef [RN] Prefetch remote avatar images 1/2 2017-08-03 13:45:41 -05:00
Lyubo Marinov
00e058d392 [RN] Cache avatars and provide a default in case load fails (2)
Refactors the previous "[RN] Cache avatars and provide a default in
case load fails" for the purposes of simplification but also modifies
its functionality at the same time. For example:

- Always displays the default avatar immediately which may be seen if
  the remote avatar needs to be downloaded.
- Does not use random colors.
- Uses a default avatar image which is not transparent and ugly but at
  least it's the same image that's used on Web. I've started talks to
  have images/avatar2.png replaced with a transparent and beautiful
  so that will land later on and we'll see the automagic colors in all
  their glory then.
2017-08-03 13:45:41 -05:00
Lyubo Marinov
504646fff0 Coding style 2017-08-03 13:45:41 -05:00
Saúl Ibarra Corretgé
122ebe48c7 [RN] Cache avatars and provide a default in case load fails
Avatars are cached to the filesystem and loaded from there when requested again.
The cache is cleaned after a conference ends and on application startup
(defensive move).

In addition, implement a fully local avatar system, which is used as a fallback
when loading a remote avatar fails. It can also be forced using a prop.

The fully local avatars use a user icon as a mask and apply a background color
qhich is picked by hashing the URI passed to the avatar. If no URI is passed a
random color is chosen.

A grace period of 1 second is also implemented so a default local avatar will be
rendered if an Avatar component is mounted but has no URI. If a URI is specified
later on, it will be loaded and displayed. In case loading the remote avatar
fails, the locally generated one will be used.
2017-08-03 13:45:41 -05:00
Дамян Минков
fe8ac0fff9 Merge pull request #1852 from virtuacoplenny/lenny/device-error-notifications
feat(device-errors): move device error dialogs to notifications
2017-08-02 14:55:18 -05:00
Leonard Kim
cd66a7fcb7 ref(notifications): bring hiding of notifications into redux 2017-08-02 11:19:38 -07:00
Leonard Kim
74ddae4a6a feat(device-errors): move device error dialogs to notifications
- Create a notification component for displaying a toggle.
- Create an action for showing the component if allowed by
  the local storage setting and for saving the setting to
  local storage.
- Remove all notifications having a timeout by default so the
  device error notification must be dismissed manually.
- Split the camera and mic error dialog into two separate
  notifications.
2017-08-01 16:33:00 -07:00
Lyubo Marinov
1ad8436cb5 [Android] Use loadURL in the app 2017-08-01 12:07:22 -05:00
Lyubo Marinov
6b2a93909b [iOS] Use loadURL in the app 2017-08-01 06:31:03 -05:00
Lyubo Marinov
c259551d9a [RN] Handle multiple schemes/protocol in URLs 2017-08-01 06:31:03 -05:00
Lyubo Marinov
377be4272a [RN] Fix the conference URL delivered to JitsiMeetView's listeners 2017-08-01 06:31:03 -05:00
Lyubo Marinov
737419dbe8 Do not require domain in SDK and ExternalAPI 2017-08-01 06:31:03 -05:00
Lyubo Marinov
1748049322 [RN] Remove unncessary characters from the invite URL 2017-08-01 06:31:03 -05:00
Lyubo Marinov
caea02a322 [RN] Mitigate 'Not joining a new URL while in a conference' 2017-08-01 06:31:03 -05:00
bgrozev
d778b716be Merge pull request #1850 from jitsi/iframe_api_doc
doc(iframe_api): Fix the names of the properties in the options object.
2017-08-01 00:51:44 -05:00
hristoterezov
4dcbe5c6a0 doc(iframe_api): Fix the names of the properties in the options object. 2017-08-01 08:48:50 +03:00
virtuacoplenny
c04ef05058 feat(presence): display status in thumbnail and large video (#1828)
* feat(presence): display status in thumbnail and large video

- Create a React Component for displaying presence. It currently
  connects to the store for participant updates but in the future
  should not be as smart once more reactification occurs.
- Modify filmstrip css so the presence status displays horizontal
  center and below the avatar.
- Modify videolayout css so the presence status displays horizontal
  centered and with a rounded background.
- Dispatch presence updates so the participant state can be update.
- Update message position on large video update to ensure message
  positioning is correct.

* squash: do not show presence message if connection message is displayed
2017-07-31 18:33:22 -05:00
Дамян Минков
82117a0aef Handles disabled dial-out codes. (#1847)
Hides the UI component showing dialout codes and uses the dial input without validating it.

Skips printing error when dial-in numbers is not configured.
2017-07-31 12:44:50 -07:00
Leonard Kim
9c6afc2062 fix(dial-out): appease FieldText warning for onChange prop 2017-07-31 13:21:49 -05:00
356 changed files with 15012 additions and 7024 deletions

View File

@@ -99,8 +99,8 @@ see our [guidelines for contributing](CONTRIBUTING.md).
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).
Jitsi Meet is also available as a React Native app for Android and iOS.
Instructions on how to build it can be found [here](doc/mobile.md).
## Acknowledgements

View File

@@ -27,7 +27,13 @@
action + '.' + data.browserName, label, value);
};
if(typeof ctx.analyticsHandlers === "undefined")
ctx.analyticsHandlers = [];
ctx.analyticsHandlers.push(Analytics);
if (typeof ctx.JitsiMeetJS === "undefined")
ctx.JitsiMeetJS = {};
if (typeof ctx.JitsiMeetJS.app === "undefined")
ctx.JitsiMeetJS.app = {};
if (typeof ctx.JitsiMeetJS.app.analyticsHandlers === "undefined")
ctx.JitsiMeetJS.app.analyticsHandlers = [];
ctx.JitsiMeetJS.app.analyticsHandlers.push(Analytics);
}(window));

View File

@@ -1,9 +1,26 @@
# Jitsi Meet SDK for Android
This directory contains the source code of the Jitsi Meet app and the Jitsi Meet
SDK for Android.
## Build
## Jitsi Meet SDK
1. Install all required [dependencies](https://github.com/jitsi/jitsi-meet/blob/master/doc/mobile.md).
2. ```bash
cd android/
./gradlew :sdk:assembleRelease
```
3. ```bash
./gradlew :sdk:publish
cd ../
```
## Install
Add the Maven repository
`https://github.com/jitsi/jitsi-maven-repository/raw/master/releases` and the
dependency `org.jitsi.react:jitsi-meet-sdk:1.9.0` into your `build.gradle`.
## API
Jitsi Meet SDK is an Android library which embodies the whole Jitsi Meet
experience and makes it reusable by third-party apps.
@@ -215,29 +232,37 @@ boilerplate.
Called when a joining a conference was unsuccessful or when there was an error
while in a conference.
The `data` HashMap contains an "error" key describing the error and a "url"
key with the conference URL.
The `data` `Map` contains an "error" key describing the error and a "url" key
with the conference URL.
#### onConferenceJoined
Called when a conference was joined.
The `data` HashMap contains a "url" key with the conference URL.
The `data` `Map` contains a "url" key with the conference URL.
#### onConferenceLeft
Called when a conference was left.
The `data` HashMap contains a "url" key with the conference URL.
The `data` `Map` contains a "url" key with the conference URL.
#### onConferenceWillJoin
Called before a conference is joined.
The `data` HashMap contains a "url" key with the conference URL.
The `data` `Map` contains a "url" key with the conference URL.
#### onConferenceWillLeave
Called before a conference is left.
The `data` HashMap contains a "url" key with the conference URL.
The `data` `Map` contains a "url" key with the conference URL.
#### onLoadConfigError
Called when loading the main configuration file from the Jitsi Meet deployment
fails.
The `data` `Map` contains an "error" key with the error and a "url" key with the
conference URL which necessitated the loading of the configuration file.

View File

@@ -7,7 +7,7 @@ android {
defaultConfig {
applicationId 'org.jitsi.meet'
versionCode Integer.parseInt("${version}")
versionName "1.4.${version}"
versionName "1.9.${version}"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion

View File

@@ -1,15 +1,17 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.jitsi.meet">
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="org.jitsi.meet">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:launchMode="singleTask"
android:name=".MainActivity"
android:windowSoftInputMode="adjustResize">
android:theme="@style/AppTheme">
<activity
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:label="@string/app_name"
android:launchMode="singleTask"
android:name=".MainActivity"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

View File

@@ -17,8 +17,13 @@
package org.jitsi.meet;
import android.os.Bundle;
import android.util.Log;
import org.jitsi.meet.sdk.JitsiMeetActivity;
import org.jitsi.meet.sdk.JitsiMeetView;
import org.jitsi.meet.sdk.JitsiMeetViewListener;
import java.util.Map;
/**
* The one and only {@link Activity} that the Jitsi Meet app needs. The
@@ -33,6 +38,80 @@ import org.jitsi.meet.sdk.JitsiMeetActivity;
* {@code react-native run-android}.
*/
public class MainActivity extends JitsiMeetActivity {
/**
* {@inheritDoc}
*/
protected JitsiMeetView initializeView() {
JitsiMeetView view = super.initializeView();
// XXX In order to increase (1) awareness of API breakages and (2) API
// coverage, utilize JitsiMeetViewListener in the Debug configuration of
// the app.
if (BuildConfig.DEBUG && view != null) {
view.setListener(new JitsiMeetViewListener() {
private void on(String name, Map<String, Object> data) {
// Log with the tag "ReactNative" in order to have the log
// visible in react-native log-android as well.
Log.d(
"ReactNative",
JitsiMeetViewListener.class.getSimpleName() + " "
+ name + " "
+ data);
}
/**
* {@inheritDoc}
*/
@Override
public void onConferenceFailed(Map<String, Object> data) {
on("CONFERENCE_FAILED", data);
}
/**
* {@inheritDoc}
*/
@Override
public void onConferenceJoined(Map<String, Object> data) {
on("CONFERENCE_JOINED", data);
}
/**
* {@inheritDoc}
*/
@Override
public void onConferenceLeft(Map<String, Object> data) {
on("CONFERENCE_LEFT", data);
}
/**
* {@inheritDoc}
*/
@Override
public void onConferenceWillJoin(Map<String, Object> data) {
on("CONFERENCE_WILL_JOIN", data);
}
/**
* {@inheritDoc}
*/
@Override
public void onConferenceWillLeave(Map<String, Object> data) {
on("CONFERENCE_WILL_LEAVE", data);
}
/**
* {@inheritDoc}
*/
@Override
public void onLoadConfigError(Map<String, Object> data) {
on("LOAD_CONFIG_ERROR", data);
}
});
}
return view;
}
/**
* {@inheritDoc}
*/

View File

@@ -7,7 +7,7 @@ buildscript {
maven { url 'https://maven.google.com' }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-alpha8'
classpath 'com.android.tools.build:gradle:3.0.0-beta5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files.
@@ -18,10 +18,111 @@ allprojects {
repositories {
mavenLocal()
jcenter()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is
// installed from npm.
url "$rootDir/../node_modules/react-native/android"
maven { url "https://maven.google.com" } // Required for appcompat.
// React Native (JS, Obj-C sources, Android binaries) is installed from
// npm.
maven { url "$rootDir/../node_modules/react-native/android" }
}
// Third-party react-native modules which Jitsi Meet SDK for Android depends
// on and which are not available in third-party Maven repositories need to
// be deployed in a Maven repository of ours.
//
if (project.name.startsWith('react-native-')) {
apply plugin: 'maven-publish'
publishing {
publications {}
repositories {
maven { url "file:${rootProject.projectDir}/../../../jitsi/jitsi-maven-repository/releases" }
}
}
}
afterEvaluate { project ->
if (project.name.startsWith('react-native-')) {
def npmManifest = project.file('../package.json')
def json = new groovy.json.JsonSlurper().parseText(npmManifest.text)
// React Native modules have an npm peer dependency on react-native,
// they do not have an npm dependency on it. Further below though we
// choose a react-native version (range) when we represent them as
// Maven artifacts. Effectively, we are forking the projects by not
// complying with the full range of their npm peer dependency and,
// consequently, we should qualify their version.
def versionQualifier = '-jitsi-1'
if ('react-native-webrtc'.equals(project.name))
versionQualifier = '-jitsi-1'
project.version = "${json.version}${versionQualifier}"
project.android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
}
}
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.source
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
failOnError false
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.source
}
publishing.publications {
aarArchive(MavenPublication) {
groupId rootProject.ext.moduleGroupId
artifactId project.name
version project.version
artifact("${project.buildDir}/outputs/aar/${project.name}-release.aar") {
extension "aar"
}
artifact(androidSourcesJar)
artifact(androidJavadocsJar)
pom.withXml {
def pomXml = asNode()
pomXml.appendNode('name', project.name)
pomXml.appendNode('description', json.description)
pomXml.appendNode('url', json.homepage)
if (json.license) {
def license = pomXml.appendNode('licenses').appendNode('license')
license.appendNode('name', json.license)
license.appendNode('distribution', 'repo')
}
def dependencies = pomXml.appendNode('dependencies')
configurations.getByName('releaseCompileClasspath').getResolvedConfiguration().getFirstLevelModuleDependencies().each {
def artifactId = it.moduleName
def version = it.moduleVersion
// React Native signals breaking changes by
// increasing the minor version number. So the
// (third-party) React Native modules we utilize can
// depend not on a specific react-native release but
// a wider range.
if (artifactId.equals('react-native')) {
def versionNumber = VersionNumber.parse(version)
version = "${versionNumber.major}.${versionNumber.minor}"
}
def dependency = dependencies.appendNode('dependency')
dependency.appendNode('groupId', it.moduleGroup)
dependency.appendNode('artifactId', artifactId)
dependency.appendNode('version', version)
}
}
}
}
}
}
}
@@ -30,7 +131,13 @@ ext {
compileSdkVersion = 25
buildToolsVersion = "25.0.3"
minSdkVersion = 16
targetSdkVersion = 23
targetSdkVersion = 25
// The Maven artifact groupdId of the third-party react-native modules which
// Jitsi Meet SDK for Android depends on and which are not available in
// third-party Maven repositories so we have to deploy to a Maven repository
// of ours.
moduleGroupId = 'com.facebook.react'
}
// Force the version of the Android build tools we have chosen on all

View File

@@ -1,6 +1,6 @@
#Mon Jul 17 18:25:08 CEST 2017
#Fri Sep 08 10:42:14 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-milestone-1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

View File

@@ -1,4 +1,5 @@
apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
@@ -7,7 +8,6 @@ android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
publishNonDefault true
}
buildTypes {
@@ -22,10 +22,11 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:appcompat-v7:25.4.0'
compile 'com.facebook.react:react-native:+'
compile project(':react-native-background-timer')
compile project(':react-native-fetch-blob')
compile project(':react-native-immersive')
compile project(':react-native-keep-awake')
compile project(':react-native-vector-icons')
@@ -53,7 +54,6 @@ gradle.projectsEvaluated {
def currentFontTask = tasks.create(
name: "copy${buildNameCapitalized}Fonts",
type: Copy) {
from("${projectDir}/../../fonts/jitsi.ttf")
from("${projectDir}/../../node_modules/react-native-vector-icons/Fonts/")
into("${bundlePath}/assets/fonts")
@@ -82,7 +82,6 @@ gradle.projectsEvaluated {
def currentBundleTask = tasks.create(
name: bundleJsAndAssetsTaskName,
type: Exec) {
// Set up inputs and outputs so gradle can cache the result.
def reactRoot = file("${projectDir}/../../")
inputs.files fileTree(dir: reactRoot, excludes: ['android/**', 'ios/**'])
@@ -119,3 +118,46 @@ gradle.projectsEvaluated {
runBefore("process${buildNameCapitalized}Resources", currentBundleTask)
}
}
publishing {
publications {
aarArchive(MavenPublication) {
groupId 'org.jitsi.react'
artifactId 'jitsi-meet-sdk'
version '1.9.0'
artifact("${project.buildDir}/outputs/aar/${project.name}-release.aar") {
extension "aar"
}
pom.withXml {
def pomXml = asNode()
pomXml.appendNode('name', 'jitsi-meet-sdk')
pomXml.appendNode('description', 'Jitsi Meet SDK for Android')
def dependencies = pomXml.appendNode('dependencies')
configurations.getByName('releaseCompileClasspath').getResolvedConfiguration().getFirstLevelModuleDependencies().each {
// The (third-party) React Native modules that we depend on
// are in source code form and do not have groupId. That is
// why we have a dedicated groupId for them. But the other
// dependencies come through Maven and, consequently, have
// groupId.
def groupId = it.moduleGroup
def artifactId = it.moduleName
if (artifactId.startsWith('react-native-')
&& groupId.equals('jitsi-meet')) {
groupId = rootProject.ext.moduleGroupId
}
def dependency = dependencies.appendNode('dependency')
dependency.appendNode('groupId', groupId)
dependency.appendNode('artifactId', artifactId)
dependency.appendNode('version', it.moduleVersion)
}
}
}
}
repositories {
maven { url "file:${rootProject.projectDir}/../../../jitsi/jitsi-maven-repository/releases" }
}
}

View File

@@ -1,24 +1,29 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.jitsi.meet.sdk">
<!-- 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"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="org.jitsi.meet.sdk">
<!-- 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" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus"/>
<!-- Tell the system this app requires OpenGL ES 2.0. -->
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<application android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true">
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true">
<activity
android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
</manifest>

View File

@@ -0,0 +1,44 @@
/**
* Adapted from
* {@link https://github.com/Aleksandern/react-native-android-settings-library}.
*/
package org.jitsi.meet.sdk;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
class AndroidSettingsModule extends ReactContextBaseJavaModule {
/**
* React Native module name.
*/
private static final String MODULE_NAME = "AndroidSettings";
public AndroidSettingsModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return MODULE_NAME;
}
@ReactMethod
public void open() {
Context context = getReactApplicationContext();
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(
Uri.fromParts("package", context.getPackageName(), null));
context.startActivity(intent);
}
}

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.jitsi.meet.sdk.audiomode;
package org.jitsi.meet.sdk;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
@@ -51,7 +51,7 @@ import java.util.Map;
* Before a call has started and after it has ended the
* <tt>AudioModeModule.DEFAULT</tt> mode should be used.
*/
public class AudioModeModule extends ReactContextBaseJavaModule {
class AudioModeModule extends ReactContextBaseJavaModule {
/**
* Constants representing the audio mode.
* - DEFAULT: Used before and after every call. It represents the default
@@ -300,7 +300,6 @@ public class AudioModeModule extends ReactContextBaseJavaModule {
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.abandonAudioFocus(null);
audioManager.setSpeakerphoneOn(false);
audioManager.setMicrophoneMute(true);
setBluetoothAudioRoute(false);
return true;

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.jitsi.meet.sdk.audiomode;
package org.jitsi.meet.sdk;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothHeadset;
@@ -33,7 +33,7 @@ import android.util.Log;
* Bluetooth headsets being connected / disconnected and notifies the module
* about device changes when this occurs.
*/
public class BluetoothHeadsetMonitor {
class BluetoothHeadsetMonitor {
/**
* {@link AudioModeModule} where this monitor reports.
*/

View File

@@ -0,0 +1,177 @@
/*
* Copyright @ 2017-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableMapKeySetIterator;
import org.jitsi.meet.sdk.JitsiMeetView;
import org.jitsi.meet.sdk.JitsiMeetViewListener;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Pattern;
/**
* Module implementing a simple API to enable a proximity sensor-controlled
* wake lock. When the lock is held, if the proximity sensor detects a nearby
* object it will dim the screen and disable touch controls. The functionality
* is used with the conference audio-only mode.
*/
class ExternalAPIModule extends ReactContextBaseJavaModule {
/**
* The {@code Method}s of {@code JitsiMeetViewListener} by event name i.e.
* redux action types.
*/
private static final Map<String, Method> JITSI_MEET_VIEW_LISTENER_METHODS
= new HashMap<>();
/**
* The name of this module to be used in the React Native bridge.
*/
private static final String MODULE_NAME = "ExternalAPI";
static {
// Figure out the mapping between the JitsiMeetViewListener methods
// and the events i.e. redux action types.
Pattern onPattern = Pattern.compile("^on[A-Z]+");
Pattern camelcasePattern = Pattern.compile("([a-z0-9]+)([A-Z0-9]+)");
for (Method method : JitsiMeetViewListener.class.getDeclaredMethods()) {
// * The method must be public (because it is declared by an
// interface).
// * The method must be/return void.
if (!Modifier.isPublic(method.getModifiers())
|| !Void.TYPE.equals(method.getReturnType())) {
continue;
}
// * The method name must start with "on" followed by a
// capital/uppercase letter (in agreement with the camelcase
// coding style customary to Java in general and the projects of
// the Jitsi community in particular).
String name = method.getName();
if (!onPattern.matcher(name).find()) {
continue;
}
// * The method must accept/have exactly 1 parameter of a type
// assignable from HashMap.
Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length != 1
|| !parameterTypes[0].isAssignableFrom(HashMap.class)) {
continue;
}
// Convert the method name to an event name.
name
= camelcasePattern.matcher(name.substring(2))
.replaceAll("$1_$2")
.toUpperCase(Locale.ROOT);
JITSI_MEET_VIEW_LISTENER_METHODS.put(name, method);
}
}
/**
* 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 ExternalAPIModule(ReactApplicationContext reactContext) {
super(reactContext);
}
/**
* Gets the name of this module to be used in the React Native bridge.
*
* @return The name of this module to be used in the React Native bridge.
*/
@Override
public String getName() {
return MODULE_NAME;
}
/**
* Dispatches an event that occurred on JavaScript to the view's listener.
*
* @param name The name of the event.
* @param data The details/specifics of the event to send determined
* by/associated with the specified {@code name}.
* @param scope
*/
@ReactMethod
public void sendEvent(String name, ReadableMap data, String scope) {
// The JavaScript App needs to provide uniquely identifying information
// to the native ExternalAPI module so that the latter may match the
// former to the native JitsiMeetView which hosts it.
JitsiMeetView view = JitsiMeetView.findViewByExternalAPIScope(scope);
if (view == null) {
return;
}
JitsiMeetViewListener listener = view.getListener();
if (listener == null) {
return;
}
Method method = JITSI_MEET_VIEW_LISTENER_METHODS.get(name);
if (method != null) {
try {
method.invoke(listener, toHashMap(data));
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
/**
* Initializes a new {@code HashMap} instance with the key-value
* associations of a specific {@code ReadableMap}.
*
* @param readableMap the {@code ReadableMap} specifying the key-value
* associations with which the new {@code HashMap} instance is to be
* initialized.
* @return a new {@code HashMap} instance initialized with the key-value
* associations of the specified {@code readableMap}.
*/
private HashMap<String, Object> toHashMap(ReadableMap readableMap) {
HashMap<String, Object> hashMap = new HashMap<>();
for (ReadableMapKeySetIterator i = readableMap.keySetIterator();
i.hasNextKey();) {
String key = i.nextKey();
hashMap.put(key, readableMap.getString(key));
}
return hashMap;
}
}

View File

@@ -76,8 +76,22 @@ public class JitsiMeetActivity extends AppCompatActivity {
* Initializes the {@link #view} of this {@code JitsiMeetActivity} with a
* new {@link JitsiMeetView} instance.
*/
private void initializeView() {
view = new JitsiMeetView(this);
private void initializeContentView() {
JitsiMeetView view = initializeView();
if (view != null) {
this.view = view;
setContentView(this.view);
}
}
/**
* Initializes a new {@link JitsiMeetView} instance.
*
* @return a new {@code JitsiMeetView} instance.
*/
protected JitsiMeetView initializeView() {
JitsiMeetView view = new JitsiMeetView(this);
// In order to have the desired effect
// JitsiMeetView#setWelcomePageEnabled(boolean) must be invoked before
@@ -85,7 +99,7 @@ public class JitsiMeetActivity extends AppCompatActivity {
view.setWelcomePageEnabled(welcomePageEnabled);
view.loadURL(null);
setContentView(view);
return view;
}
/**
@@ -109,7 +123,7 @@ public class JitsiMeetActivity extends AppCompatActivity {
if (requestCode == OVERLAY_PERMISSION_REQUEST_CODE
&& canRequestOverlayPermission()) {
if (Settings.canDrawOverlays(this)) {
initializeView();
initializeContentView();
}
}
}
@@ -144,7 +158,7 @@ public class JitsiMeetActivity extends AppCompatActivity {
return;
}
initializeView();
initializeContentView();
}
/**

View File

@@ -20,6 +20,7 @@ import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
@@ -27,10 +28,14 @@ import android.widget.FrameLayout;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactRootView;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.common.LifecycleState;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.WeakHashMap;
@@ -51,11 +56,23 @@ public class JitsiMeetView extends FrameLayout {
private static final Set<JitsiMeetView> views
= Collections.newSetFromMap(new WeakHashMap<JitsiMeetView, Boolean>());
private static List<NativeModule> createNativeModules(
ReactApplicationContext reactContext) {
return Arrays.<NativeModule>asList(
new AndroidSettingsModule(reactContext),
new AudioModeModule(reactContext),
new ExternalAPIModule(reactContext),
new ProximityModule(reactContext)
);
}
public static JitsiMeetView findViewByExternalAPIScope(
String externalAPIScope) {
for (JitsiMeetView view : views) {
if (view.externalAPIScope.equals(externalAPIScope)) {
return view;
synchronized (views) {
for (JitsiMeetView view : views) {
if (view.externalAPIScope.equals(externalAPIScope)) {
return view;
}
}
}
@@ -81,16 +98,44 @@ public class JitsiMeetView extends FrameLayout {
.addPackage(new com.oblador.vectoricons.VectorIconsPackage())
.addPackage(new com.ocetnik.timer.BackgroundTimerPackage())
.addPackage(new com.oney.WebRTCModule.WebRTCModulePackage())
.addPackage(new com.RNFetchBlob.RNFetchBlobPackage())
.addPackage(new com.rnimmersive.RNImmersivePackage())
.addPackage(new org.jitsi.meet.sdk.audiomode.AudioModePackage())
.addPackage(
new org.jitsi.meet.sdk.externalapi.ExternalAPIPackage())
.addPackage(new org.jitsi.meet.sdk.proximity.ProximityPackage())
.addPackage(new ReactPackageAdapter() {
@Override
public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext) {
return JitsiMeetView.createNativeModules(reactContext);
}
})
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
}
/**
* Loads a specific URL {@code String} in all existing
* {@code JitsiMeetView}s.
*
* @param urlString - The URL {@code String} to load in all existing
* {@code JitsiMeetView}s.
* @return If the specified {@code urlString} was submitted for loading in
* at least one {@code JitsiMeetView}, then {@code true}; otherwise,
* {@code false}.
*/
private static boolean loadURLStringInViews(String urlString) {
synchronized (views) {
if (!views.isEmpty()) {
for (JitsiMeetView view : views) {
view.loadURLString(urlString);
}
return true;
}
}
return false;
}
/**
* Activity lifecycle method which should be called from
* <tt>Activity.onBackPressed</tt> so we can do the required internal
@@ -156,6 +201,19 @@ public class JitsiMeetView extends FrameLayout {
* @param intent - <tt>Intent</tt> instance which was received.
*/
public static void onNewIntent(Intent intent) {
// XXX At least twice we received bug reports about malfunctioning
// loadURL in the Jitsi Meet SDK while the Jitsi Meet app seemed to
// functioning as expected in our testing. But that was to be expected
// because the app does not exercise loadURL. In order to increase the
// test coverage of loadURL, channel deep linking through loadURL.
Uri uri;
if (Intent.ACTION_VIEW.equals(intent.getAction())
&& (uri = intent.getData()) != null
&& loadURLStringInViews(uri.toString())) {
return;
}
if (reactInstanceManager != null) {
reactInstanceManager.onNewIntent(intent);
}
@@ -196,15 +254,17 @@ public class JitsiMeetView extends FrameLayout {
// Hook this JitsiMeetView into ExternalAPI.
externalAPIScope = UUID.randomUUID().toString();
views.add(this);
synchronized (views) {
views.add(this);
}
}
/**
* Releases the React resources (specifically the {@link ReactRootView})
* associated with this view.
*
* This method MUST be called when the Activity holding this view is destroyed, typically in the
* {@code onDestroy} method.
* This method MUST be called when the Activity holding this view is
* destroyed, typically in the {@code onDestroy} method.
*/
public void dispose() {
if (reactRootView != null) {

View File

@@ -57,4 +57,11 @@ public abstract class JitsiMeetViewAdapter implements JitsiMeetViewListener {
@Override
public void onConferenceWillLeave(Map<String, Object> data) {
}
/**
* {@inheritDoc}
*/
@Override
public void onLoadConfigError(Map<String, Object> data) {
}
}

View File

@@ -58,4 +58,14 @@ public interface JitsiMeetViewListener {
* @param data - Map with a "url" key with the conference URL.
*/
void onConferenceWillLeave(Map<String, Object> data);
/**
* Called when loading the main configuration file from the Jitsi Meet
* deployment fails.
*
* @param data - Map with an "error" key with the error and a "url" key with
* the conference URL which necessitated the loading of the configuration
* file.
*/
void onLoadConfigError(Map<String, Object> data);
}

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.jitsi.meet.sdk.proximity;
package org.jitsi.meet.sdk;
import android.content.Context;
import android.os.PowerManager;
@@ -31,7 +31,7 @@ import com.facebook.react.bridge.UiThreadUtil;
* object it will dim the screen and disable touch controls. The functionality
* is used with the conference audio-only mode.
*/
public class ProximityModule extends ReactContextBaseJavaModule {
class ProximityModule extends ReactContextBaseJavaModule {
/**
* React Native module name.
*/

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.jitsi.meet.sdk.audiomode;
package org.jitsi.meet.sdk;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
@@ -22,14 +22,10 @@ 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 {
public class ReactPackageAdapter implements ReactPackage {
/**
* {@inheritDoc}
*/
@@ -40,17 +36,11 @@ public class AudioModePackage implements ReactPackage {
/**
* {@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;
return Collections.emptyList();
}
/**

View File

@@ -1,119 +0,0 @@
/*
* Copyright @ 2017-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk.externalapi;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import org.jitsi.meet.sdk.JitsiMeetView;
import org.jitsi.meet.sdk.JitsiMeetViewListener;
import java.util.HashMap;
/**
* Module implementing a simple API to enable a proximity sensor-controlled
* wake lock. When the lock is held, if the proximity sensor detects a nearby
* object it will dim the screen and disable touch controls. The functionality
* is used with the conference audio-only mode.
*/
public class ExternalAPIModule extends ReactContextBaseJavaModule {
/**
* React Native module name.
*/
private static final String MODULE_NAME = "ExternalAPI";
/**
* 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 ExternalAPIModule(ReactApplicationContext reactContext) {
super(reactContext);
}
/**
* Gets the name of this module to be used in the React Native bridge.
*
* @return The name of this module to be used in the React Native bridge.
*/
@Override
public String getName() {
return MODULE_NAME;
}
/**
* Dispatches an event that occurred on JavaScript to the view's listener.
*
* @param name The name of the event.
* @param data The details/specifics of the event to send determined
* by/associated with the specified {@code name}.
* @param scope
*/
@ReactMethod
public void sendEvent(String name, ReadableMap data, String scope) {
// The JavaScript App needs to provide uniquely identifying information
// to the native ExternalAPI module so that the latter may match the
// former to the native JitsiMeetView which hosts it.
JitsiMeetView view = JitsiMeetView.findViewByExternalAPIScope(scope);
if (view == null) {
return;
}
JitsiMeetViewListener listener = view.getListener();
if (listener == null) {
return;
}
// TODO Converting a ReadableMap to a HashMap is not supported until
// React Native 0.46.
HashMap<String, Object> dataMap = new HashMap<>();
switch (name) {
case "CONFERENCE_FAILED":
dataMap.put("error", data.getString("error"));
dataMap.put("url", data.getString("url"));
listener.onConferenceFailed(dataMap);
break;
case "CONFERENCE_JOINED":
dataMap.put("url", data.getString("url"));
listener.onConferenceJoined(dataMap);
break;
case "CONFERENCE_LEFT":
dataMap.put("url", data.getString("url"));
listener.onConferenceLeft(dataMap);
break;
case "CONFERENCE_WILL_JOIN":
dataMap.put("url", data.getString("url"));
listener.onConferenceWillJoin(dataMap);
break;
case "CONFERENCE_WILL_LEAVE":
dataMap.put("url", data.getString("url"));
listener.onConferenceWillLeave(dataMap);
break;
}
}
}

View File

@@ -1,64 +0,0 @@
/*
* Copyright @ 2017-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk.externalapi;
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 ExternalAPIModule}.
*/
public class ExternalAPIPackage 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 ExternalAPIModule(reactContext));
return modules;
}
/**
* {@inheritDoc}
*/
@Override
public List<ViewManager> createViewManagers(
ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}

View File

@@ -1,64 +0,0 @@
/*
* Copyright @ 2017-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk.proximity;
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 ProximityModule}.
*/
public class ProximityPackage 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 ProximityModule(reactContext));
return modules;
}
/**
* {@inheritDoc}
*/
@Override
public List<ViewManager> createViewManagers(
ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}

View File

@@ -3,6 +3,8 @@ rootProject.name = 'jitsi-meet'
include ':app', ':sdk'
include ':react-native-background-timer'
project(':react-native-background-timer').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-background-timer/android')
include ':react-native-fetch-blob'
project(':react-native-fetch-blob').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fetch-blob/android')
include ':react-native-immersive'
project(':react-native-immersive').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-immersive/android')
include ':react-native-keep-awake'

File diff suppressed because it is too large Load Diff

286
config.js
View File

@@ -1,133 +1,275 @@
/* jshint maxlen:false */
var config = { // eslint-disable-line no-unused-vars
// configLocation: './config.json', // see ./modules/HttpConfigFetch.js
// Configuration
//
// Alternative location for the configuration.
//configLocation: './config.json',
// Custom function which given the URL path should return a room name.
//getroomnode: function (path) { return 'someprefixpossiblybasedonpath'; },
// Connection
//
hosts: {
// XMPP domain.
domain: 'jitsi-meet.example.com',
// XMPP MUC domain. FIXME: use XEP-0030 to discover it.
muc: 'conference.jitsi-meet.example.com',
// When using authentication, domain for guest users.
//anonymousdomain: 'guest.example.com',
//authdomain: 'jitsi-meet.example.com', // defaults to <domain>
muc: 'conference.jitsi-meet.example.com', // FIXME: use XEP-0030
// Domain for authenticated users. Defaults to <domain>.
//authdomain: 'jitsi-meet.example.com',
// Jirecon recording component domain.
//jirecon: 'jirecon.jitsi-meet.example.com',
// Call control component (Jigasi).
//call_control: 'callcontrol.jitsi-meet.example.com',
//focus: 'focus.jitsi-meet.example.com', // defaults to 'focus.jitsi-meet.example.com'
// Focus component domain. Defaults to focus.<domain>.
//focus: 'focus.jitsi-meet.example.com',
},
// BOSH URL. FIXME: use XEP-0156 to discover it.
bosh: '//jitsi-meet.example.com/http-bind',
// The name of client node advertised in XEP-0115 'c' stanza
clientNode: 'http://jitsi.org/jitsimeet',
// The real JID of focus participant - can be overridden here
//focusUserJid: 'focus@auth.jitsi-meet.example.com',
// Testing / experimental features.
//
testing: {
/**
* Enables experimental simulcast support on Firefox.
*/
// Enables experimental simulcast support on Firefox.
enableFirefoxSimulcast: false,
/**
* P2P test mode disables automatic switching to P2P when there are 2
* participants in the conference.
*/
// P2P test mode disables automatic switching to P2P when there are 2
// participants in the conference.
p2pTestMode: false,
},
// getroomnode: function (path) { return 'someprefixpossiblybasedonpath'; },
// useStunTurn: true, // use XEP-0215 to fetch STUN and TURN server
// useIPv6: true, // ipv6 support. use at your own risk
useNicks: false,
bosh: '//jitsi-meet.example.com/http-bind', // FIXME: use xep-0156 for that
clientNode: 'http://jitsi.org/jitsimeet', // The name of client node advertised in XEP-0115 'c' stanza
//focusUserJid: 'focus@auth.jitsi-meet.example.com', // The real JID of focus participant - can be overridden here
//defaultSipNumber: '', // Default SIP number
/**
* Disables desktop sharing functionality.
*/
disableDesktopSharing: false,
// Disables ICE/UDP by filtering out local and remote UDP candidates in
// signalling.
//webrtcIceUdpDisable: false,
// Disables ICE/TCP by filtering out local and remote TCP candidates in
// signalling.
//webrtcIceTcpDisable: false,
// Media
//
// Audio
// Disable measuring of audio levels.
//disableAudioLevels: false,
// Start the conference in audio only mode (no video is being received nor
// sent).
//startAudioOnly: false,
// Every participant after the Nth will start audio muted.
//startAudioMuted: 10,
// Start calls with audio muted. Unlike the option above, this one is only
// applied locally. FIXME: having these 2 options is confusing.
//startWithAudioMuted: false,
// Video
// Sets the preferred resolution (height) for local video. Defaults to 720.
//resolution: 720,
// Enable / disable simulcast support.
//disableSimulcast: false,
// Suspend sending video if bandwidth estimation is too low. This may cause
// problems with audio playback. Disabled until these are fixed.
disableSuspendVideo: true,
// Every participant after the Nth will start video muted.
//startVideoMuted: 10,
// Start calls with video muted. Unlike the option above, this one is only
// applied locally. FIXME: having these 2 options is confusing.
//startWithVideoMuted: false,
// If set to true, prefer to use the H.264 video codec (if supported).
// Note that it's not recommended to do this because simulcast is not
// supported when using H.264. For 1-to-1 calls this setting is enabled by
// default and can be toggled in the p2p section.
//preferH264: true,
// Desktop sharing
// Enable / disable desktop sharing
//disableDesktopSharing: false,
// The ID of the jidesha extension for Chrome.
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'],
// Required version of Chrome extension
desktopSharingChromeMinExtVersion: '0.1',
// The ID of the jidesha extension for Firefox. If null, we assume that no
// extension is required.
desktopSharingFirefoxExtId: null,
// Whether desktop sharing should be disabled on Firefox.
desktopSharingFirefoxDisabled: false,
// The maximum version of Firefox which requires a jidesha extension.
// Example: if set to 41, we will require the extension for Firefox versions
// up to and including 41. On Firefox 42 and higher, we will run without the
// extension.
// If set to -1, an extension will be required for all versions of Firefox.
desktopSharingFirefoxMaxVersionExtRequired: 51,
// The URL to the Firefox extension for desktop sharing.
desktopSharingFirefoxExtensionURL: null,
// Disables ICE/UDP by filtering out local and remote UDP candidates in signalling.
webrtcIceUdpDisable: false,
// Disables ICE/TCP by filtering out local and remote TCP candidates in signalling.
webrtcIceTcpDisable: false,
// Try to start calls with screen-sharing instead of camera video.
//startScreenSharing: false,
openSctp: true, // Toggle to enable/disable SCTP channels
// Recording
// Whether to enable recording or not.
//enableRecording: false,
// Type for recording: one of jibri or jirecon.
//recordingType: 'jibri',
// Misc
// Default value for the channel "last N" attribute. -1 for unlimited.
channelLastN: -1,
// Disables or enables RTX (RFC 4588) (defaults to false).
//disableRtx: false,
// Use XEP-0215 to fetch STUN and TURN servers.
//useStunTurn: true,
// Enable IPv6 support.
//useIPv6: true,
// Enables / disables a data communication channel with the Videobridge.
// Values can be 'datachannel', 'websocket', true (treat it as
// 'datachannel'), undefined (treat it as 'datachannel') and false (don't
// open any channel).
//openBridgeChannel: true,
// UI
//
// Use display name as XMPP nickname.
//useNicks: false,
// Require users to always specify a display name.
//requireDisplayName: true,
// Whether to use a welcome page or not. In case it's false a random room
// will be joined when no room is specified.
enableWelcomePage: true,
// Enabling the close page will ignore the welcome page redirection when
// a call is hangup.
//enableClosePage: false,
// Disable hiding of remote thumbnails when in a 1-on-1 conference call.
disable1On1Mode: false,
disableStats: false,
disableAudioLevels: false,
channelLastN: -1, // The default value of the channel attribute last-n.
enableRecording: false,
enableWelcomePage: true,
//enableClosePage: false, // enabling the close page will ignore the welcome
// page redirection when call is hangup
disableSimulcast: false,
// requireDisplayName: true, // Forces the participants that doesn't have display name to enter it when they enter the room.
startAudioOnly: false, // Will start the conference in the audio only mode (no video is being received nor sent)
startScreenSharing: false, // Will try to start with screensharing instead of camera
// startAudioMuted: 10, // every participant after the Nth will start audio muted
// startVideoMuted: 10, // every participant after the Nth will start video muted
startWithAudioMuted: false, // will start with the microphone muted
startWithVideoMuted: false, // will start with the camera turned off
// defaultLanguage: "en",
// To enable sending statistics to callstats.io you should provide Applicaiton ID and Secret.
// callStatsID: "", // Application ID for callstats.io API
// callStatsSecret: "", // Secret for callstats.io API
/*noticeMessage: 'Service update is scheduled for 16th March 2015. ' +
'During that time service will not be available. ' +
'Apologise for inconvenience.',*/
disableThirdPartyRequests: false,
// The minumum value a video's height (or width, whichever is smaller) needs
//disable1On1Mode: false,
// The minimum value a video's height (or width, whichever is smaller) needs
// to be in order to be considered high-definition.
minHDHeight: 540,
// If true - all users without token will be considered guests and all users
// Default language for the user interface.
//defaultLanguage: 'en',
// If true all users without a 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,
// Suspending video might cause problems with audio playback. Disabling until these are fixed.
disableSuspendVideo: true,
// disables or enables RTX (RFC 4588) (defaults to false).
disableRtx: false,
// Sets the preferred resolution (height) for local video. Defaults to 720.
resolution: 720,
// Message to show the users. Example: 'The service will be down for
// maintenance at 01:00 AM GMT,
//noticeMessage: '',
// Stats
//
// Whether to enable stats collection or not.
//disableStats: false,
// To enable sending statistics to callstats.io you must provide the
// Application ID and Secret.
//callStatsID: '',
//callStatsSecret: '',
// Privacy
//
// If third party requests are disabled, no other server will be contacted.
// This means avatars will be locally generated and callstats integration
// will not function.
//disableThirdPartyRequests: false,
// Peer-To-Peer mode: used (if enabled) when there are just 2 participants.
//
p2p: {
// Enables peer to peer mode. When enabled system will try to establish
// direct connection given that there are exactly 2 participants in
// the room. If that succeeds the conference will stop sending data
// through the JVB and use the peer to peer connection instead. When 3rd
// participant joins the conference will be moved back to the JVB
// Enables peer to peer mode. When enabled the system will try to
// establish a direct connection when there are exactly 2 participants
// in the room. If that succeeds the conference will stop sending data
// through the JVB and use the peer to peer connection instead. When a
// 3rd participant joins the conference will be moved back to the JVB
// connection.
enabled: true,
// Use XEP-0215 to fetch STUN and TURN servers.
//useStunTurn: true,
// The STUN servers that will be used in the peer to peer connections
// useStunTurn: true, // use XEP-0215 to fetch STUN and TURN server
stunServers: [
{ urls: "stun:stun.l.google.com:19302" },
{ urls: "stun:stun1.l.google.com:19302" },
{ urls: "stun:stun2.l.google.com:19302" }
],
// If set to true, it will prefer to use H.264 for P2P calls (if H.264
// is supported).
preferH264: true
// How long we're going to wait, before going back to P2P after
// the 3rd participant has left the conference (to filter out page reload)
// How long we're going to wait, before going back to P2P after the 3rd
// participant has left the conference (to filter out page reload).
//backToP2PDelay: 5
},
// Information about the jitsi-meet instance we are connecting to, including the
// user region as seen by the server.
// Information about the jitsi-meet instance we are connecting to, including
// the user region as seen by the server.
//
deploymentInfo: {
//shard: "shard1",
//region: "europe",

View File

@@ -80,8 +80,8 @@ form {
display: block;
position: absolute;
top: 15;
width: 186px;
height: 74px;
width: $watermarkWidth;
height: $watermarkHeight;
background-size: contain;
background-repeat: no-repeat;
z-index: $zindex2;
@@ -119,21 +119,6 @@ form {
font-size: 12px;
}
/**
* Tooltips
**/
.tipsy {
z-index: $tooltipsZ;
&-inner {
background-color: $tooltipBg;
max-width: 350px;
}
&-arrow {
border-color: $tooltipBg;
}
}
/**
* Dialogs fade
*/

View File

@@ -1,8 +1,7 @@
%connection-info {
text-align: left;
font-size: 12px;
font-weight: 400;
color: $popoverFontColor;
color: $modalTextColor;
td {
padding: 2px 0;
@@ -11,11 +10,14 @@
.connection-info
{
float: left;
padding: 5px;
padding-left: 0;
@extend %connection-info;
/**
* Apply negative margin to reduce the appearance of padding in AtlasKit
* InlineDialog.
*/
margin: -15px;
> table {
white-space: nowrap;
@extend %connection-info;
@@ -40,4 +42,11 @@
@extend .connection-info__icon;
color: $uploadConnectionIconColor;
}
.showmore {
display: block;
margin: 10px auto;
text-align: center;
width: 90px;
}
}

View File

@@ -1,7 +1,19 @@
#contacts_container {
cursor: default;
> ul#contacts {
/**
* Override generic side toolbar styles to compensate for AtlasKit Button
* being used instead of custom button styling.
*/
.sideToolbarBlock {
.contact-list-panel-invite-button {
font-size: $modalButtonFontSize;
justify-content: center;
margin: 9px 0;
}
}
#contacts {
font-size: 12px;
bottom: 0px;
margin: 0;
@@ -21,30 +33,33 @@
}
#contacts {
>li {
display: block;
.contact-list-item {
align-items: center;
border-radius: 3px;
color: $baseLight;
display: flex;
font-size: 14px;
height: 36px;
list-style-type: none;
padding: 0 10%;
text-align: left;
white-space: nowrap;
color: $baseLight;
font-size: 16px;
padding: 0 10%;
height: 27px;
&:hover,
&:active {
background: $toolbarSelectBackground;
}
> p {
display: inline-block;
vertical-align: middle;
margin: 0px;
width: 100%;
line-height: 1.5em;
text-overflow: ellipsis;
.contact-list-item-name {
overflow: hidden;
text-overflow: ellipsis;
}
.avatar {
cursor: pointer;
height: 24px;
margin: 0 8px 0 4px;
width: 24px;
}
}
}
@@ -58,4 +73,4 @@
border-radius: 20px;
max-height: 30px;
max-width: 30px;
}
}

View File

@@ -11,13 +11,13 @@
right: 0;
padding: 10px 5px;
@extend %align-right;
z-index: $filmstripVideosZ;
&__toolbar {
@include flex();
flex-direction: column-reverse;
flex-wrap: nowrap;
position: relative;
z-index: $zindex1; // Set z-index to make element visible.
width: $filmstripToggleButtonWidth;
button {
@@ -53,7 +53,6 @@
/* The filmstrip should not be covered by the left toolbar. */
bottom: 0;
width:auto;
z-index: $filmstripVideosZ;
transition: bottom 2s;
overflow: visible !important;
/*!!! Removes the gap between the local video container and the remote
@@ -103,6 +102,24 @@
display: none;
}
.presence-label {
color: $participantNameColor;
font-size: 12px;
font-weight: 100;
left: 0;
margin: 0 auto;
overflow: hidden;
pointer-events: none;
position: absolute;
right: 0;
text-align: center;
text-overflow: ellipsis;
top: calc(50% + 30px);
white-space: nowrap;
width: 100%;
z-index: $zindex3;
}
/**
* Hovered video thumbnail.
*/
@@ -139,8 +156,10 @@
.remote-videos-container {
transition: opacity 1s;
}
&.hide-videos {
&.hide-videos {
.remote-videos-container {
opacity: 0;
pointer-events: none;
}

View File

@@ -1,92 +0,0 @@
.jitsipopover {
position: absolute;
top: 0;
left: 0;
z-index: $jitsipopoverZ;
display: table;
visibility: hidden;
max-width: 300px;
min-width: 100px;
text-align: left;
color: $popoverFontColor;
background-color: $popoverBg;
background-clip: padding-box;
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;
margin-top: -$popoverMenuPadding;
&__menu-padding,
&__menu-padding-top {
position: absolute;
width: 100px;
}
/**
* Invisible padding is added to the bottom of the popover to extend its
* height so it does not close when moving the mouse from the trigger
* element towards the popover itself.
*/
&__menu-padding {
bottom: -$popoverMenuPadding;
height: $popoverMenuPadding;
}
/**
* Invisible padding is added to the top of the popover to extend its height
* so it does not close automatically when its height is shrunk from showing
* less video statistics.
*/
&__menu-padding-top {
height: 20px;
top: -20px;
}
&__showmore {
display: block;
text-align: center;
width: 90px;
margin: 10px auto;
}
> .arrow {
position: absolute;
display: block;
left: 50%;
bottom: -5px;
margin-left: -5px;
width: 0;
height: 0;
border-color: transparent;
border-top-color: $popoverBg;
border-style: solid;
border-width: 5px;
border-bottom-width: 0;
}
/**
* Override default "top" styles to support popovers appearing from the
* left of the popover trigger element.
*/
&.left {
margin-left: -$popoverMenuPadding;
margin-top: 0;
.arrow {
border-color: transparent transparent transparent $popoverBg;
border-width: 5px 0px 5px 5px;
margin-left: 0;
margin-top: -5px;
}
.jitsipopover {
&__menu-padding {
bottom: 0;
height: 100%;
width: $popoverMenuPadding;
}
}
}
}

View File

@@ -1,124 +1,33 @@
.popover {
position: absolute;
top: 0;
left: 0;
z-index: $popoverZ;
display: none;
max-width: 300px;
min-width: 100px;
padding: 1px;
text-align: left;
color: #333333;
background-color: #ffffff;
background-clip: padding-box;
border: 1px solid #cccccc;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 6px;
-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;
/**
* Mousemove padding styles are used to add invisible elements to the popover
* to allow mouse movement from the popover trigger to the popover itself
* without triggering a mouseleave event.
*/
.popover-mousemove-padding-bottom {
bottom: -15px;
height: 20px;
position: absolute;
right: 0;
width: 100%;
}
.popover.top {
margin-top: -10px;
.popover-mousemove-padding-right {
height: 100%;
position: absolute;
right: -20;
top: 0;
width: 40px;
}
.popover.right {
margin-left: 10px;
}
.popover.bottom {
margin-top: 10px;
}
.popover.left {
margin-left: -10px;
}
.popover-title {
margin: 0;
padding: 8px 14px;
font-size: 11pt;
font-weight: normal;
line-height: 18px;
background-color: #f7f7f7;
border-bottom: 1px solid #ebebeb;
border-radius: 5px 5px 0 0;
}
.popover-content {
padding: 9px 14px;
font-size: 10pt;
white-space:pre-wrap;
text-align: center;
}
.popover > .arrow,
.popover > .arrow:after {
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.popover > .arrow {
border-width: 11px;
}
.popover > .arrow:after {
border-width: 10px;
content: "";
}
.popover.top > .arrow {
left: 50%;
margin-left: -11px;
border-bottom-width: 0;
border-top-color: #999999;
border-top-color: rgba(0, 0, 0, 0.25);
bottom: -11px;
}
.popover.top > .arrow:after {
content: " ";
bottom: 1px;
margin-left: -10px;
border-bottom-width: 0;
border-top-color: #ffffff;
}
.popover.right > .arrow {
top: 50%;
left: -11px;
margin-top: -11px;
border-left-width: 0;
border-right-color: #999999;
border-right-color: rgba(0, 0, 0, 0.25);
}
.popover.right > .arrow:after {
content: " ";
left: 1px;
bottom: -10px;
border-left-width: 0;
border-right-color: #ffffff;
}
.popover.bottom > .arrow {
left: 50%;
margin-left: -11px;
border-top-width: 0;
border-bottom-color: #999999;
border-bottom-color: rgba(0, 0, 0, 0.25);
top: -11px;
}
.popover.bottom > .arrow:after {
content: " ";
top: 1px;
margin-left: -10px;
border-top-width: 0;
border-bottom-color: #ffffff;
}
.popover.left > .arrow {
top: 50%;
right: -11px;
margin-top: -11px;
border-right-width: 0;
border-left-color: #999999;
border-left-color: rgba(0, 0, 0, 0.25);
}
.popover.left > .arrow:after {
content: " ";
right: 1px;
border-right-width: 0;
border-left-color: #ffffff;
bottom: -10px;
/**
* An invisible element is added to the top of the popover to ensure the mouse
* stays over the popover when the popover's height is shrunk, which would then
* normally leave the mouse outside of the popover itself and cause a mouseleave
* event.
*/
.popover-mouse-padding-top {
height: 30px;
position: absolute;
right: 0;
top: -25px;
width: 100%;
}

View File

@@ -3,37 +3,31 @@
**/
.popupmenu {
text-align: left;
padding: 0;
margin: 2px 0;
bottom: 0;
height: auto;
&:first-child {
margin-top: 2px;
}
white-space: nowrap;
&__item {
list-style-type: none;
text-align: left;
height: 35px;
&:hover {
background-color: $popupMenuSelectedItemBackground;
background-color: rgba(9, 30, 66, 0.04);
}
}
// Link Appearance
&__link,
&__contents {
color: $modalTextColor;
display: block;
box-sizing: border-box;
text-decoration: none;
color: #fff;
padding: 5px;
height: 100%;
font-size: 9pt;
width: 100%;
cursor: hand;
cursor: pointer;
padding: 0 5px;
&.disabled {
color: gray !important;
@@ -46,6 +40,12 @@
vertical-align: middle;
}
&__link {
i {
cursor: pointer;
}
}
&__contents {
display: flex;
@@ -73,7 +73,6 @@
display: inline-block;
min-width: 20px;
height: 100%;
text-align: center;
> * {
@include absoluteAligning();
@@ -85,6 +84,15 @@
}
}
/**
* Override reset css styling modifying all lists and set negative margin to
* reduce the visibility of padding on AtlasKit
* InlineDialogs.
*/
ul.popupmenu {
margin: -15px;
}
span.remotevideomenu:hover ul.popupmenu, ul.popupmenu:hover {
display:block !important;
}

View File

@@ -1,4 +1,3 @@
.recordingSpinner {
display: none;
vertical-align: top;
}
}

View File

@@ -42,6 +42,29 @@
position: relative;
z-index: $toolbarZ;
/**
* Ensure nested elements that don't have a button class, maybe because they
* are wrapped in a React Element, still display in a line.
*/
> div {
display: inline-block;
}
/**
* Always on top overrides.
*/
&.always-on-top {
/**
* Toolbar button styles for always on top.
*/
> .button {
font-size: $alwaysOnTopToolbarFontSize;
height: $alwaysOnTopToolbarSize;
line-height: $alwaysOnTopToolbarSize;
width: $alwaysOnTopToolbarSize;
}
}
/**
* Toolbar button styles.
*/
@@ -94,10 +117,6 @@
&.icon-microphone {
@extend .icon-mic-disabled;
}
&.icon-visibility {
@extend .icon-visibility-off;
}
}
&.unclickable {
@@ -124,13 +143,18 @@
border-radius: 3px;
opacity: 0;
&.always-on-top {
height: $alwaysOnTopToolbarSize;
top: 10px;
}
@include transform(translateX(-50%));
.button:first-child {
> div:first-child .button {
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}
.button:last-child {
> div:last-child .button {
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
@@ -158,7 +182,7 @@
height: 100%;
justify-content: flex-start;
left: 0;
padding-top: 10px;
padding-top: 24px;
top: 0;
transform: translateX(-100%);
width: $defaultToolbarSize;
@@ -190,6 +214,7 @@
* Styles the toolbar in filmstrip-only mode.
*/
&_filmstrip-only {
background-color: $toolbarBackground;
border-radius: 3px;
display: inline-block;
height: auto;

View File

@@ -28,11 +28,12 @@ $defaultColor: #F1F1F1;
$defaultSideBarFontColor: #44A5FF;
$defaultSemiDarkColor: #ACACAC;
$defaultDarkColor: #2b3d5c;
$tooltipBg: rgba(0,0,0, 0.7);
/**
* Toolbar
*/
$alwaysOnTopToolbarFontSize: 1em;
$alwaysOnTopToolbarSize: 30px;
$defaultToolbarSize: 50px;
$defaultFilmStripOnlyToolbarSize: 37px;
$secToolbarFontSize: 1.9em;
@@ -107,12 +108,11 @@ $reloadZ: 20;
$poweredByZ: 100;
$ringingZ: 300;
$sideToolbarContainerZ: 300;
$toolbarZ: 400;
$toolbarZ: 350;
$tooltipsZ: 401;
$dropdownMaskZ: 900;
$dropdownZ: 901;
$centeredVideoLabelZ: 1010;
$jitsipopoverZ: 1012;
$popoverZ: 1015;
$overlayZ: 1016;
@@ -145,3 +145,9 @@ $unsupportedBrowserTitleColor: #fff;
$unsupportedBrowserTitleFontSize: 24px;
$unsupportedDesktopBrowserTextColor: rgba(255, 255, 255, 0.7);
$unsupportedDesktopBrowserTextFontSize: 21px;
/**
* The size of the default watermark.
*/
$watermarkWidth: 186px;
$watermarkHeight: 74px;

View File

@@ -8,6 +8,25 @@
display: flex;
flex-direction: column-reverse;
height: 100%;
/**
* fixed positioning is necessary for remote menus and tooltips to pop
* out of the scrolling filmstrip. AtlasKit dialogs and tooltips use
* a library called popper which will position its elements fixed if
* any parent is also fixed.
*/
position: fixed;
/**
* z-index adjusting is needed because the video state indicator has to
* display over the filmstrip when no videos are displayed but still be
* clickable but its inline dialogs must display over the video state
* indicator when videos are displayed.
*/
z-index: #{$tooltipsZ + 1};
&.hide-videos {
z-index: #{$tooltipsZ - 1};
}
/**
* Hide videos by making them slight to the right.
@@ -20,6 +39,15 @@
bottom: auto;
right: -196px;
}
/**
* Remove horizontal filmstrip padding used to prevent videos from
* overlapping the left-side toolbar. An id selector is used to
* match id specificity with filmstrip styles.
*/
&#remoteVideos {
padding-left: 0;
}
}
#filmstripLocalVideo {
@@ -60,13 +88,16 @@
* Move the remote video menu trigger to the bottom left of the
* video thumbnail.
*/
.remotevideomenu {
.remotevideomenu,
.remote-video-menu-trigger {
bottom: 0;
left: 0;
top: auto;
right: auto;
}
.remote-video-menu-trigger {
margin-bottom: 7px;
transform: translate3d(0,0,0);
}
#remoteVideos {
@@ -75,18 +106,13 @@
}
.videocontainer {
&__toolbar,
&__toptoolbar {
transform: translate3d(0,0,0);
}
/**
* Move status icons to the bottom right of the thumbnail.
*/
&__toolbar {
text-align: right;
.toolbar-icon {
.right {
float: none;
margin: auto;
}
@@ -159,4 +185,36 @@
transition-delay: 0.1s;
}
}
/**
* Apply hardware acceleration to prevent flickering on scroll. The
* selectors are specific to icon wrappers to prevent fixed position dialogs
* and tooltips from getting a new location context due to translate3d.
*/
.connection-indicator,
.remote-video-menu-trigger,
.indicator-icon-container {
transform: translate3d(0, 0, 0);
}
.indicator-container {
float: none;
}
/**
* FIXME: disable pointer to allow any elements moved below to still be
* clickable. The real fix would to make sure those moved elements are
* actually part of the toolbar instead of positioning being faked.
*/
.videocontainer__toolbar {
pointer-events: none;
> div {
pointer-events: none;
}
.toolbar-icon {
pointer-events: all;
}
}
}

View File

@@ -41,44 +41,85 @@
&__toptoolbar {
position: absolute;
left: 0;
z-index: $zindex3;
pointer-events: none;
z-index: $zindex10;
width: 100%;
box-sizing: border-box; // Includes the padding in the 100% width.
/**
* FIXME (lenny): Disabling pointer-events is a pretty big sin that
* sidesteps the problems. There are z-index wars occurring within
* videocontainer and AtlasKit Tooltips rely on their parent z-indexe
* being higher than whatever they need to appear over. So set a higher
* z-index for the tooltip containers but make any empty space not block
* mouse overs for various mouseover triggers.
*/
pointer-events: none;
* {
pointer-events: auto;
}
.indicator-container {
display: inline-block;
float: left;
pointer-events: all;
}
}
&__toolbar {
bottom: 0;
padding: 0 5px 0 5px;
height: $thumbnailToolbarHeight;
padding: 0 5px 0 5px;
}
&__toptoolbar {
$toolbarPadding: 5px;
$toolbarIconMargin: 5px;
top: 0;
padding: $toolbarPadding;
padding-bottom: 0;
/**
* Override text-align center as icons need to be left justified.
*/
text-align: left;
.connection-indicator,
span.indicator {
margin-right: em(5, 8);
/**
* Intentionally use margin on the icon itself as AtlasKit InlineDialog
* positioning depends on the trigger (indicator icon).
*/
.indicator {
margin-top: $toolbarIconMargin;
}
span.indicator {
display: none;
.indicator-container:nth-child(1) .indicator {
margin-left: $toolbarIconMargin;
}
&:last-child {
margin-right: 0;
.connection-indicator,
div.indicator-container,
{
margin-right: 4px;
}
div.indicator:last-child {
margin-right: 0;
}
.indicator-container {
display: inline-block;
vertical-align: top;
.popover-trigger {
display: inline-block;
}
}
.connection-indicator,
span.indicator {
.indicator {
position: relative;
font-size: 8px;
text-align: center;
line-height: $thumbnailIndicatorSize;
padding: 0;
float: left;
@include circle($thumbnailIndicatorSize);
box-sizing: border-box;
z-index: $zindex3;
@@ -124,6 +165,7 @@
.icon-connection,
.icon-connection-lost {
cursor: pointer;
font-size: 1em;
}
}
@@ -283,7 +325,6 @@
padding: 0;
border: 0;
margin: 0px 5px 0px 0px;
float: left;
}
/**
@@ -296,9 +337,17 @@
/**
* Toolbar icons positioned on the right.
*/
.toolbar-icon.right {
float: right;
margin: 0px 0px 0px 5px;
.moderator-icon {
display: inline-block;
&.right {
float: right;
margin: 0px 0px 0px 5px;
}
.toolbar-icon {
margin: 0;
}
}
.raisehandindicator {
@@ -309,14 +358,14 @@
background: $connectionIndicatorBg;
}
.remote-video-menu-trigger,
.remotevideomenu
{
display: inline-block;
position: absolute;
top: 0px;
right: 0;
margin-top: 7px;
z-index: $zindex3;
z-index: $zindex2;
width: 18px;
height: 13px;
color: #FFF;
@@ -326,6 +375,9 @@
cursor: hand;
}
}
.remote-video-menu-trigger {
margin-top: 7px;
}
/**
* Audio indicator on video thumbnails.
@@ -487,8 +539,8 @@
filter: grayscale(100%);
}
#remotePresenceMessage,
#remoteConnectionMessage {
display: none;
position: absolute;
width: auto;
z-index: $zindex2;
@@ -496,6 +548,11 @@
font-size: 14px;
text-align: center;
color: #FFF;
left: 50%;
transform: translate(-50%, 0);
}
#remotePresenceMessage .presence-label,
#remoteConnectionMessage {
opacity: .80;
text-shadow: 0px 0px 1px rgba(0,0,0,0.3),
0px 1px 1px rgba(0,0,0,0.3),
@@ -508,6 +565,10 @@
padding-left: 10px;
padding-right: 10px;
}
#remotePresenceMessage .no-presence,
#remoteConnectionMessage {
display: none;
}
#localConnectionMessage {
display: none;
@@ -526,111 +587,3 @@
1px 0px 1px rgba(0,0,0,0.3),
0px 0px 1px rgba(0,0,0,0.3);
}
.filmstrip-only {
#videoResolutionLabel {
display: none;
}
}
.video-state-indicator {
background: $videoStateIndicatorBackground;
color: $videoStateIndicatorColor;
cursor: pointer;
font-size: 13px;
height: 40px;
line-height: 20px;
text-align: center;
min-width: 40px;
padding: 10px 5px;
border-radius: 50%;
position: absolute;
box-sizing: border-box;
i {
cursor: pointer;
}
}
#videoResolutionLabel,
.centeredVideoLabel.moveToCorner {
z-index: $tooltipsZ;
}
.centeredVideoLabel {
bottom: 45%;
border-radius: 2px;
display: none;
-webkit-transition: all 2s 2s linear;
transition: all 2s 2s linear;
z-index: $centeredVideoLabelZ;
&.moveToCorner {
bottom: auto;
}
}
.moveToCorner {
position: absolute;
top: 30px;
right: 30px;
}
.moveToCorner + .moveToCorner {
right: 80px;
}
.video-state-indicator-menu {
display: none;
padding: 10px;
position: absolute;
right: -10px;
top: 20px;
.video-state-indicator-menu-options {
background: $popoverBg;
border-radius: 3px;
color: $popoverFontColor;
margin-top: 20px;
padding: 5px 0;
position: relative;
div {
cursor: pointer;
padding: 10px;
padding-right: 30px;
text-align: left;
white-space: nowrap;
&.active {
background: $toolbarToggleBackground;
}
&:hover:not(.active) {
background: $popupMenuSelectedItemBackground;
}
i {
margin-right: 5px;
vertical-align: middle;
}
}
}
.video-state-indicator-menu-options::after {
content: " ";
border-color: transparent transparent $popoverBg transparent;
border-style: solid;
border-width: 5px;
position: absolute;
right: 15px;
top: -10px;
}
}
.video-state-indicator:hover,
.video-state-indicator *:hover {
background: $toolbarSelectBackground;
.video-state-indicator-menu {
display: block;
}
}

View File

@@ -43,13 +43,12 @@
@import 'modals/dialog';
@import 'modals/feedback/feedback';
@import 'modals/speaker_stats/speaker_stats';
@import 'modals/video-quality/video-quality';
@import 'videolayout_default';
@import 'notice';
@import 'popup_menu';
@import 'recording';
@import 'login_menu';
@import 'popover';
@import 'jitsi_popover';
@import 'contact_list';
@import 'chat';
@import 'ringing/ringing';
@@ -70,6 +69,7 @@
@import 'aui-components/dropdown';
@import '404';
@import 'policy';
@import 'popover';
@import 'filmstrip';
@import 'unsupported-browser/main';
@import 'modals/invite/add-people';

View File

@@ -45,83 +45,59 @@
animation-timing-function: ease-in-out
}
.feedback.aui-dialog2{
.aui-dialog2{
&-header {
background-color: $feedbackContentBg;
border-bottom-color: transparent;
padding-top: 30px;
h2 {
color: $feedbackTextColor;
text-align: center;
}
}
.feedback-dialog {
.details {
margin-top: 20px;
padding-left: 60px;
padding-right: 60px;
&-content {
background-color: $feedbackContentBg;
text-align: center;
padding: 10px 40px 20px 40px;
.input-control {
background-color: $feedbackInputBg;
color: $feedbackInputTextColor;
&::-webkit-input-placeholder {
color: $feedbackInputPlaceholderColor;
}
&::-moz-placeholder { /* Firefox 19+ */
color: $feedbackInputPlaceholderColor;
}
&:-ms-input-placeholder {
color: $feedbackInputPlaceholderColor;
}
}
.rating {
line-height: 1.2;
text-align: center;
margin-top: 10px;
.star-label {
height: 16px;
font-size: 14px;
color: $rateStarLabelColor;
}
.star-btn {
display: inline-block;
color: $rateStarDefault;
font-size: $rateStarSize;
position: relative;
cursor: pointer;
outline: none;
text-decoration: none;
@include transition(all .2s ease);
&.starHover,
&.active,
&:hover {
color: $rateStarActivity;
};
}
}
.details {
padding-left: 60px;
padding-right: 60px;
margin-top: 20px;
textarea {
min-height: 100px;
}
}
}
&-footer {
background-color: $feedbackContentBg;
border-top-color: transparent;
.button-control {
color: $feedbackCancelFontColor;
}
textarea {
min-height: 100px;
}
}
}
.input-control {
background-color: $feedbackInputBg;
color: $feedbackInputTextColor;
&::-webkit-input-placeholder {
color: $feedbackInputPlaceholderColor;
}
&::-moz-placeholder { /* Firefox 19+ */
color: $feedbackInputPlaceholderColor;
}
&:-ms-input-placeholder {
color: $feedbackInputPlaceholderColor;
}
}
.rating {
line-height: 1.2;
margin-top: 10px;
text-align: center;
.star-label {
color: $rateStarLabelColor;
font-size: 14px;
height: 16px;
}
.star-btn {
color: $rateStarDefault;
cursor: pointer;
display: inline-block;
font-size: $rateStarSize;
outline: none;
position: relative;
text-decoration: none;
@include transition(all .2s ease);
&.active,
&:hover,
&.starHover {
color: $rateStarActivity;
};
}
}
}

View File

@@ -32,7 +32,7 @@
.dial-in-numbers-trigger-icon {
position: absolute;
right: 0;
right: 10px;
top: 4px;
}
}
@@ -47,6 +47,22 @@
.form-control {
padding: 0;
&__container {
/**
* Ensure contents display in a line and vertically centered.
*/
align-items: center;
button {
font-size: $modalButtonFontSize;
}
}
&__input-container {
flex: 1;
margin-right: 10px;
}
}
.inviteLink {

View File

@@ -0,0 +1,176 @@
.video-quality-dialog {
color: $modalTextColor;
.hide-warning {
height: 0;
visibility: hidden;
}
.video-quality-dialog-title {
margin-bottom: 10px;
}
.video-quality-dialog-contents {
align-items: center;
color: $modalTextColor;
display: flex;
flex-direction: column;
padding: 10px;
min-width: 250px;
.video-quality-dialog-slider-container {
width: 100%;
text-align: center;
}
.video-quality-dialog-slider {
width: calc(100% - 5px);
@mixin sliderTrackStyles() {
height: 15px;
border-radius: 10px;
background: black;
}
&::-ms-track {
@include sliderTrackStyles();
}
&::-moz-range-track {
@include sliderTrackStyles();
}
&::-webkit-slider-runnable-track {
@include sliderTrackStyles();
}
@mixin sliderThumbStyles() {
top: 50%;
border: none;
position: relative;
opacity: 0;
}
&::-ms-thumb {
@include sliderThumbStyles();
}
&::-moz-range-thumb {
@include sliderThumbStyles();
}
&::-webkit-slider-thumb {
@include sliderThumbStyles();
}
}
.video-quality-dialog-labels {
box-sizing: border-box;
display: flex;
margin-top: 5px;
position: relative;
width: 90%;
}
.video-quality-dialog-label-container {
position: absolute;
text-align: center;
transform: translate(-50%, 0%);
&::before {
background: rgb(140, 156, 189);
content: '';
border-radius: 50%;
left: 0;
height: 6px;
margin: 0 auto;
pointer-events: none;
position: absolute;
right: 0;
top: -16px;
width: 6px;
}
}
.video-quality-dialog-label-container.active {
color: $toolbarToggleBackground;
&::before {
background: $toolbarToggleBackground;
height: 12px;
top: -19px;
width: 12px;
}
}
.video-quality-dialog-label-container:first-child {
position: relative;
}
.video-quality-dialog-label {
display: table-caption;
word-spacing: unset;
}
}
}
.video-state-indicator {
background: $videoStateIndicatorBackground;
color: $videoStateIndicatorColor;
cursor: default;
font-size: 13px;
height: 40px;
line-height: 20px;
text-align: left;
min-width: 40px;
border-radius: 50%;
position: absolute;
box-sizing: border-box;
i {
cursor: pointer;
}
/**
* Give the label padding so it has more volume and can be easily clicked.
*/
.video-quality-label-status {
padding: 10px 5px;
text-align: center;
}
}
.centeredVideoLabel.moveToCorner {
z-index: $tooltipsZ;
}
#videoResolutionLabel {
z-index: #{$tooltipsZ + 1};
}
.centeredVideoLabel {
bottom: 45%;
border-radius: 2px;
display: none;
padding: 10px;
transform: translate(-50%, 0);
z-index: $centeredVideoLabelZ;
&.moveToCorner {
bottom: auto;
transform: none;
-webkit-transition: all 2s 2s linear;
transition: all 2s 2s linear;
}
}
.moveToCorner {
position: absolute;
top: 30px;
right: 30px;
}
.moveToCorner + .moveToCorner {
right: 80px;
}

View File

@@ -64,6 +64,11 @@ case "$1" in
echo "Failed to install luajwtjitsi - try installing it manually"
fi
# Install basexx
if ! luarocks install basexx; then
echo "Failed to install basexx - try installing it manually"
fi
if [ -x "/etc/init.d/prosody" ]; then
invoke-rc.d prosody restart
fi

View File

@@ -19,24 +19,24 @@ Its constructor gets a number of options:
* **domain**: domain used to build the conference URL, "meet.jit.si" for
example.
* **options**: object with properties - the optional arguments:
* **room**: (optional) name of the room to join.
* **roomName**: (optional) name of the room to join.
* **width**: (optional) width for the iframe which will be created. If a number is specified it's treated as pixel units. If a string is specified the format is number followed by 'px', 'em', 'pt' or '%'.
* **height**: (optional) height for the iframe which will be created. If a number is specified it's treated as pixel units. If a string is specified the format is number followed by 'px', 'em', 'pt' or '%'.
* **htmlElement**: (optional) HTL DOM Element where the iframe will be added as a child.
* **configOverwite**: (optional) JS object with overrides for options defined in [config.js].
* **parentNode**: (optional) HTML DOM Element where the iframe will be added as a child.
* **configOverwrite**: (optional) JS object with overrides for options defined in [config.js].
* **interfaceConfigOverwrite**: (optional) JS object with overrides for options defined in [interface_config.js].
* **noSsl**: (optional, defaults to true) Boolean indicating if the server should be contacted using HTTP or HTTPS.
* **noSSL**: (optional, defaults to true) Boolean indicating if the server should be contacted using HTTP or HTTPS.
* **jwt**: (optional) [JWT](https://jwt.io/) token.
Example:
```javascript
var domain = "meet.jit.si";
var options = {
domain: "meet.jit.si",
room: "JitsiMeetAPIExample",
roomName: "JitsiMeetAPIExample",
width: 700,
height: 700,
htmlElement: document.querySelector('#meet')
parentNode: document.querySelector('#meet')
}
var api = new JitsiMeetExternalAPI(domain, options);
```
@@ -141,6 +141,20 @@ The `listener` parameter is a Function object with one argument that will be not
The following events are currently supported:
* **audioAvailabilityChanged** - event notifications about audio availability status changes. The listener will receive an object with the following structure:
```javascript
{
"available": available // new available status - boolean
}
```
* **audioMuteStatusChanged** - event notifications about audio mute status changes. The listener will receive an object with the following structure:
```javascript
{
"muted": muted // new muted status - boolean
}
```
* **incomingMessage** - Event notifications about incoming
messages. The listener will receive an object with the following structure:
```javascript
@@ -196,6 +210,20 @@ changes. The listener will receive an object with the following structure:
}
```
* **videoAvailabilityChanged** - event notifications about video availability status changes. The listener will receive an object with the following structure:
```javascript
{
"available": available // new available status - boolean
}
```
* **videoMuteStatusChanged** - event notifications about video mute status changes. The listener will receive an object with the following structure:
```javascript
{
"muted": muted // new muted status - boolean
}
```
* **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`.
@@ -241,6 +269,34 @@ You can get the iframe HTML element where Jitsi Meet is loaded with the followin
var iframe = api.getIFrame();
```
You can check whether the audio is muted with the following API function:
```javascript
isAudioMuted().then(function(muted) {
...
});
```
You can check whether the video is muted with the following API function:
```javascript
isVideoMuted().then(function(muted) {
...
});
```
You can check whether the audio is available with the following API function:
```javascript
isAudioAvailable().then(function(available) {
...
});
```
You can check whether the video is available with the following API function:
```javascript
isVideoAvailable().then(function(available) {
...
});
```
You can remove the embedded Jitsi Meet Conference with the following API function:
```javascript
api.dispose()

5
doc/cloud-api.md Normal file
View File

@@ -0,0 +1,5 @@
# Jitsi Meet Cloud API
The Jitsi Meet Cloud API is a specification for services which can support the integration of Jitsi Meet into other applications, for mapping conferences for dial-in support, and for supporting directory search and user invitations to conferences.
The swagger for these services is provided in [cloud-api.swagger](cloud-api.swagger) in this same repository and directory.

147
doc/cloud-api.swagger Normal file
View File

@@ -0,0 +1,147 @@
swagger: "2.0"
info:
description: "Documents the REST calls used by Jitsi Meet to integrate with other services"
version: "1.0.0"
title: "Swagger Video"
termsOfService: "https://jitsi.org/CloudAPITOS/"
contact:
email: "team@jitsi.org"
host: "jitsi-api.jitsi.org"
basePath: "/"
tags:
- name: "conferenceMapper"
description: "Conference to ID Mapper"
externalDocs:
description: "Conference API Details"
url: "https://jitsi.org/CloudAPI"
- name: "phoneNumberList"
description: "List of dial-in numbers"
schemes:
- "https"
paths:
/conferenceMapper:
get:
tags:
- "conferenceMapper"
summary: "Create or retrieve conference ID mapping"
description: "When called with a conference, creates a new ID and both stores and returns the result. When called with an ID, returns the mapping if previously created."
operationId: "GETconferenceMapper"
consumes:
- "application/json"
produces:
- "application/json"
parameters:
- in: "query"
name: "conference"
type: "string"
format: "JID"
description: "Full JID (room@conference.server.domain) for the conference to create or return existing conference mapping. Used preferentially over all other input parameters (search by conference)"
- in: "query"
name: "id"
type: "number"
description: "ID to search for existing conference mapping. Only used when provided alone (search by ID)"
responses:
200:
description: "mapping search performed"
schema:
$ref: "#/definitions/ConferenceMapperDetails"
405:
description: "Invalid input"
post:
tags:
- "conferenceMapper"
summary: "Create or retrieve conference ID mapping"
description: "When called with a conference, creates a new ID and both stores and returns the result. When called with an ID, returns the mapping if previously created."
operationId: "POSTconferenceMapper"
consumes:
- "application/json"
produces:
- "application/json"
parameters:
- in: "body"
name: "body"
description: "Conference Mapper Request"
required: true
schema:
$ref: "#/definitions/ConferenceMapperRequest"
responses:
200:
description: "mapping search performed"
schema:
$ref: "#/definitions/ConferenceMapperDetails"
405:
description: "Invalid input"
/phoneNumberList:
get:
tags:
- "phoneNumberList"
summary: "Returns a list phone numbers by country"
description: "Used to populate the Share The Link section of jitsi-meet"
operationId: "phoneNumberList"
produces:
- "application/json"
responses:
200:
description: "successful operation"
schema:
$ref: "#/definitions/PhoneNumberList"
securityDefinitions:
token:
type: "apiKey"
name: "token"
in: "query"
Bearer:
type: "apiKey"
name: "Authorization"
in: "header"
definitions:
ConferenceMapperRequest:
description: "Request to create or find a conference mapping"
type: "object"
properties:
id:
type: "number"
description: "ID to search for existing conference mapping. Only used when provided alone (search by ID)"
conference:
type: "string"
format: "JID"
description: "Full JID (room@conference.server.domain) for the conference to create or return existing conference mapping. Used preferentially over all other input parameters (search by conference)"
room:
type: "string"
description: "Room part of the conference. Required if 'conference' is not provided. Used to generate a 'conference' value (search by conference)"
domain:
type: "string"
description: "Domain part of the conference. Used if 'conference' is not provided. Defaults to domain of the API endpoint. Used to generate a 'conference' value (search by conference)"
ConferenceMapperDetails:
description: "Conference mapping between conference JID and numeric ID"
type: "object"
properties:
id:
type: "number"
description: "Unique ID mapped to conference"
conference:
type: "string"
format: "JID"
description: "Full JID for the conference OR boolean false if no conference was found (search by ID)"
PhoneNumberList:
type: "object"
properties:
numbersEnabled:
type: "boolean"
description: "Control flag for Jitsi Meet user interface. Must be set to true for Jitsi Meet to display phone-in UI elements"
numbers:
type: "object"
description: "Keys are Country Names, each value is an array of phone numbers"
additionalProperties:
type: "array"
items:
type: "string"
format: "phone"
externalDocs:
description: "Find out more about the Jitsi Cloud API"
url: "https://jitsi.org/CloudAPI"

View File

@@ -7,16 +7,17 @@
<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);
var options = {
roomName: "JitsiMeetAPIExample",
width: 700,
height: 180,
parent: undefined,
configOverwrite: {},
interfaceConfigOverwrite: {
filmStripOnly: true
}
}
var api = new JitsiMeetExternalAPI(domain, options);
</script>
</body>
</html>

View File

@@ -1,14 +1,11 @@
# Jitsi Meet mobile apps
# Jitsi Meet apps for Android and iOS
Jitsi Meet can also be built as a standalone mobile application for
iOS and Android. It uses the [React Native] framework.
Jitsi Meet can also be built as a standalone app for Android or iOS. 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.
**NOTE**: This document assumes the app is being built on a macOS system.
**NOTE**: Node 6.X and npm 3.X are recommended for building.
@@ -26,6 +23,12 @@ work properly with the native plugins we require.
You may need to add ```--unsafe-perm=true``` if you are running on [Mac OS 10.11 or greater](https://github.com/phonegap/ios-deploy#os-x-1011-el-capitan-or-greater).
- Install main dependencies:
```bash
npm install
```
- Install the required pods (CocoaPods must be installled first, it can
be done with Homebrew: `brew install cocoapods`)
@@ -89,17 +92,15 @@ build environment. Make sure you follow it closely.
It will be launched on the connected Android device.
## Debugging
The official documentation on [debugging] is quite extensive, it is the
The official documentation on [debugging] is quite extensive and specifies 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.
**NOTE**: When using Chrome Developer Tools for debugging the JavaScript source
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

15
doc/turn.md Normal file
View File

@@ -0,0 +1,15 @@
One-to-one calls should avoid going throught the JVB for optimal performance and for optimal resource usage. This is why we've added the peer-to-peer mode where the two participants connect directly to each other. Unfortunately, a direct connection is not always possible between the participants. In those cases you can use a TURN server to relay the traffic (n.b. the JVB does much more than just relay the traffic, so this is not the same as using the JVB to "relay" the traffic).
This document describes how to enable TURN server support in one-to-one calls in Jitsi Meet. Even tho it gives some hints how to configure [prosody](prosody.im) and [coTURN](https://github.com/coturn/coturn), it assumes a properly configured TURN server and a proprely configured XMPP server.
One way to configure TURN support in meet with a static configuration. You can simply fill out the `p2p.stunServers` option with appropriate values, e.g.:
[
{ urls: 'turn:turn.example.com1', credential: 'user', password: 'pass' },
]
This technique doesn't require any special configuration on the XMPP server, but it exposes the credentials to your TURN server and other people can use your bandwidth freely, so while it's simple to implement, it's not recommended.
This [draft](https://tools.ietf.org/html/draft-uberti-behave-turn-rest-00) escribes a proposed standard REST API for obtaining access to TURN services via ephemeral (i.e. time-limited) credentials. These credentials are vended by a web service over HTTP, and then supplied to and checked by a TURN server using the standard TURN protocol. The usage of ephemeral credentials ensures that access to the TURN server can be controlled even if the credentials can be discovered by the user.
Jitsi Meet can fetch the TURN credentials from the XMPP server via [XEP-0215](https://xmpp.org/extensions/xep-0215.html). You can enable this functionality by setting `p2p.useStunTurn: true` in config.js. By properly configuring a common shared secret on your TURN server and your XMPP server, the XMPP server can deliver appropriate credentials and TURN urls to Jitsi Meet. coTURN natively supports shared secret authentication (--use-auth-secret-) and in prosody, you can use the [mod_turncredentials](https://modules.prosody.im/mod_turncredentials.html) module.

BIN
images/avatar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -35,7 +35,7 @@ var interfaceConfig = { // eslint-disable-line no-unused-vars
//main toolbar
'microphone', 'camera', 'desktop', 'invite', 'fullscreen', 'fodeviceselection', 'hangup', // jshint ignore:line
//extended toolbar
'profile', 'addtocall', 'contacts', 'chat', 'recording', 'etherpad', 'sharedvideo', 'dialout', 'settings', 'raisehand', 'filmstrip'], // jshint ignore:line
'profile', 'addtocall', 'contacts', 'chat', 'recording', 'etherpad', 'sharedvideo', 'dialout', 'settings', 'raisehand', 'videoquality', 'filmstrip'], // jshint ignore:line
/**
* Main Toolbar Buttons
* All of them should be in TOOLBAR_BUTTONS
@@ -47,7 +47,7 @@ var interfaceConfig = { // eslint-disable-line no-unused-vars
// screen, 'width' would fit the original video width to the width of the
// screen respecting ratio.
VIDEO_LAYOUT_FIT: 'both',
SHOW_CONTACTLIST_AVATARS: false,
SHOW_CONTACTLIST_AVATARS: true,
/**
* Whether to only show the filmstrip (and hide the toolbar).
*/

View File

@@ -17,8 +17,12 @@ target 'JitsiMeet' do
]
pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
pod 'react-native-background-timer', :path => '../node_modules/react-native-background-timer'
pod 'react-native-keep-awake', :path => '../node_modules/react-native-keep-awake'
pod 'react-native-background-timer',
:path => '../node_modules/react-native-background-timer'
pod 'react-native-fetch-blob',
:path => '../node_modules/react-native-fetch-blob'
pod 'react-native-keep-awake',
:path => '../node_modules/react-native-keep-awake'
pod 'react-native-webrtc', :path => '../node_modules/react-native-webrtc'
pod 'RNVectorIcons', :path => '../node_modules/react-native-vector-icons'
end

View File

@@ -1,9 +1,19 @@
# Jitsi Meet SDK for iOS
This directory contains the source code of the Jitsi Meet app and the Jitsi Meet
SDK for iOS.
## Build
## Jitsi Meet SDK
1. Install all required [dependencies](https://github.com/jitsi/jitsi-meet/blob/master/doc/mobile.md).
2. `xcodebuild -workspace ios/jitsi-meet.xcworkspace -scheme JitsiMeet -destination='generic/platform=iOS' -configuration Release archive`
## Install
After successfully building Jitsi Meet SDK for iOS, copy
`ios/sdk/JitsiMeet.framework` (if the path points to a symbolic link, follow the
symbolic link) and
`node_modules/react-native-webrtc/ios/WebRTC.framework` into your project.
## API
JitsiMeet is an iOS framework which embodies the whole Jitsi Meet experience and
makes it reusable by third-party apps.
@@ -150,3 +160,12 @@ The `data` dictionary contains a "url" key with the conference URL.
Called before a conference is left.
The `data` dictionary contains a "url" key with the conference URL.
#### loadConfigError
Called when loading the main configuration file from the Jitsi Meet deployment
fails.
The `data` dictionary contains an "error" key with the error and a "url" key
with the conference URL which necessitated the loading of the configuration
file.

View File

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

View File

@@ -40,4 +40,38 @@
[view loadURL:nil];
}
#if DEBUG
void _onJitsiMeetViewDelegateEvent(NSString *name, NSDictionary *data) {
NSLog(
@"[%s:%d] JitsiMeetViewDelegate %@ %@",
__FILE__, __LINE__, name, data);
}
- (void)conferenceFailed:(NSDictionary *)data {
_onJitsiMeetViewDelegateEvent(@"CONFERENCE_FAILED", data);
}
- (void)conferenceJoined:(NSDictionary *)data {
_onJitsiMeetViewDelegateEvent(@"CONFERENCE_JOINED", data);
}
- (void)conferenceLeft:(NSDictionary *)data {
_onJitsiMeetViewDelegateEvent(@"CONFERENCE_LEFT", data);
}
- (void)conferenceWillJoin:(NSDictionary *)data {
_onJitsiMeetViewDelegateEvent(@"CONFERENCE_WILL_JOIN", data);
}
- (void)conferenceWillLeave:(NSDictionary *)data {
_onJitsiMeetViewDelegateEvent(@"CONFERENCE_WILL_LEAVE", data);
}
- (void)loadConfigError:(NSDictionary *)data {
_onJitsiMeetViewDelegateEvent(@"LOAD_CONFIG_ERROR", data);
}
#endif
@end

View File

@@ -81,7 +81,7 @@
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Run Script"
scriptText = "exec &gt; /tmp/${PROJECT_NAME}_archive.log 2&gt;&amp;1&#10;&#10;UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal&#10;&#10;if [ &quot;true&quot; == ${ALREADYINVOKED:-false} ]&#10;then&#10;echo &quot;RECURSION: Detected, stopping&quot;&#10;else&#10;export ALREADYINVOKED=&quot;true&quot;&#10;&#10;# make sure the output directory exists&#10;mkdir -p &quot;${UNIVERSAL_OUTPUTFOLDER}&quot;&#10;&#10;echo &quot;Building for iPhoneSimulator&quot;&#10;xcodebuild -workspace &quot;${WORKSPACE_PATH}&quot; -scheme &quot;${TARGET_NAME}&quot; -configuration ${CONFIGURATION} -sdk iphonesimulator -destination &apos;platform=iOS Simulator,name=iPhone 6&apos; ONLY_ACTIVE_ARCH=NO ARCHS=&apos;i386 x86_64&apos; BUILD_DIR=&quot;${BUILD_DIR}&quot; BUILD_ROOT=&quot;${BUILD_ROOT}&quot; ENABLE_BITCODE=YES OTHER_CFLAGS=&quot;-fembed-bitcode&quot; BITCODE_GENERATION_MODE=bitcode clean build&#10;&#10;# Step 1. Copy the framework structure (from iphoneos build) to the universal folder&#10;echo &quot;Copying to output folder&quot;&#10;cp -R &quot;${ARCHIVE_PRODUCTS_PATH}${INSTALL_PATH}/${FULL_PRODUCT_NAME}&quot; &quot;${UNIVERSAL_OUTPUTFOLDER}/&quot;&#10;&#10;# Step 2. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory&#10;SIMULATOR_SWIFT_MODULES_DIR=&quot;${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/Modules/${TARGET_NAME}.swiftmodule/.&quot;&#10;if [ -d &quot;${SIMULATOR_SWIFT_MODULES_DIR}&quot; ]; then&#10;cp -R &quot;${SIMULATOR_SWIFT_MODULES_DIR}&quot; &quot;${UNIVERSAL_OUTPUTFOLDER}/${TARGET_NAME}.framework/Modules/${TARGET_NAME}.swiftmodule&quot;&#10;fi&#10;&#10;# Step 3. Create universal binary file using lipo and place the combined executable in the copied framework directory&#10;echo &quot;Combining executables&quot;&#10;lipo -create -output &quot;${UNIVERSAL_OUTPUTFOLDER}/${EXECUTABLE_PATH}&quot; &quot;${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${EXECUTABLE_PATH}&quot; &quot;${ARCHIVE_PRODUCTS_PATH}${INSTALL_PATH}/${EXECUTABLE_PATH}&quot;&#10;&#10;# Step 4. Create universal binaries for embedded frameworks&#10;#for SUB_FRAMEWORK in $( ls &quot;${UNIVERSAL_OUTPUTFOLDER}/${TARGET_NAME}.framework/Frameworks&quot; ); do&#10;#BINARY_NAME=&quot;${SUB_FRAMEWORK%.*}&quot;&#10;#lipo -create -output &quot;${UNIVERSAL_OUTPUTFOLDER}/${TARGET_NAME}.framework/Frameworks/${SUB_FRAMEWORK}/${BINARY_NAME}&quot; &quot;${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${SUB_FRAMEWORK}/${BINARY_NAME}&quot; &quot;${ARCHIVE_PRODUCTS_PATH}${INSTALL_PATH}/${TARGET_NAME}.framework/Frameworks/${SUB_FRAMEWORK}/${BINARY_NAME}&quot;&#10;#done&#10;&#10;# Step 5. Convenience step to copy the framework to the project&apos;s directory&#10;echo &quot;Copying to project dir&quot;&#10;yes | cp -Rf &quot;${UNIVERSAL_OUTPUTFOLDER}/${FULL_PRODUCT_NAME}&quot; &quot;${PROJECT_DIR}&quot;&#10;&#10;open &quot;${PROJECT_DIR}&quot;&#10;&#10;fi">
scriptText = "exec &gt; /tmp/${PROJECT_NAME}_archive.log 2&gt;&amp;1&#10;&#10;UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal&#10;&#10;if [ &quot;true&quot; == ${ALREADYINVOKED:-false} ]&#10;then&#10;echo &quot;RECURSION: Detected, stopping&quot;&#10;else&#10;export ALREADYINVOKED=&quot;true&quot;&#10;&#10;# make sure the output directory exists&#10;mkdir -p &quot;${UNIVERSAL_OUTPUTFOLDER}&quot;&#10;&#10;echo &quot;Building for iPhoneSimulator&quot;&#10;xcodebuild -workspace &quot;${WORKSPACE_PATH}&quot; -scheme &quot;${TARGET_NAME}&quot; -configuration ${CONFIGURATION} -sdk iphonesimulator -destination &apos;platform=iOS Simulator,name=iPhone 6&apos; ONLY_ACTIVE_ARCH=NO ARCHS=&apos;i386 x86_64&apos; BUILD_DIR=&quot;${BUILD_DIR}&quot; BUILD_ROOT=&quot;${BUILD_ROOT}&quot; ENABLE_BITCODE=YES OTHER_CFLAGS=&quot;-fembed-bitcode&quot; BITCODE_GENERATION_MODE=bitcode clean build&#10;&#10;# Step 1. Copy the framework structure (from iphoneos build) to the universal folder&#10;echo &quot;Copying to output folder&quot;&#10;cp -R &quot;${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FULL_PRODUCT_NAME}&quot; &quot;${UNIVERSAL_OUTPUTFOLDER}/&quot;&#10;&#10;# Step 2. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory&#10;SIMULATOR_SWIFT_MODULES_DIR=&quot;${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/Modules/${TARGET_NAME}.swiftmodule/.&quot;&#10;if [ -d &quot;${SIMULATOR_SWIFT_MODULES_DIR}&quot; ]; then&#10;cp -R &quot;${SIMULATOR_SWIFT_MODULES_DIR}&quot; &quot;${UNIVERSAL_OUTPUTFOLDER}/${TARGET_NAME}.framework/Modules/${TARGET_NAME}.swiftmodule&quot;&#10;fi&#10;&#10;# Step 3. Create universal binary file using lipo and place the combined executable in the copied framework directory&#10;echo &quot;Combining executables&quot;&#10;lipo -create -output &quot;${UNIVERSAL_OUTPUTFOLDER}/${EXECUTABLE_PATH}&quot; &quot;${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${EXECUTABLE_PATH}&quot; &quot;${BUILD_DIR}/${CONFIGURATION}-iphoneos/${EXECUTABLE_PATH}&quot;&#10;&#10;# Step 4. Create universal binaries for embedded frameworks&#10;#for SUB_FRAMEWORK in $( ls &quot;${UNIVERSAL_OUTPUTFOLDER}/${TARGET_NAME}.framework/Frameworks&quot; ); do&#10;#BINARY_NAME=&quot;${SUB_FRAMEWORK%.*}&quot;&#10;#lipo -create -output &quot;${UNIVERSAL_OUTPUTFOLDER}/${TARGET_NAME}.framework/Frameworks/${SUB_FRAMEWORK}/${BINARY_NAME}&quot; &quot;${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${SUB_FRAMEWORK}/${BINARY_NAME}&quot; &quot;${ARCHIVE_PRODUCTS_PATH}${INSTALL_PATH}/${TARGET_NAME}.framework/Frameworks/${SUB_FRAMEWORK}/${BINARY_NAME}&quot;&#10;#done&#10;&#10;# Step 5. Convenience step to copy the framework to the project&apos;s directory&#10;echo &quot;Copying to project dir&quot;&#10;yes | cp -Rf &quot;${UNIVERSAL_OUTPUTFOLDER}/${FULL_PRODUCT_NAME}&quot; &quot;${PROJECT_DIR}&quot;&#10;&#10;fi">
<EnvironmentBuildable>
<BuildableReference
BuildableIdentifier = "primary"

View File

@@ -52,26 +52,33 @@ RCT_EXPORT_METHOD(sendEvent:(NSString *)name
return;
}
if ([name isEqualToString:@"CONFERENCE_FAILED"]
&& [delegate respondsToSelector:@selector(conferenceFailed:)]) {
[delegate conferenceFailed:data];
SEL sel = NSSelectorFromString([self methodNameFromEventName:name]);
} else if ([name isEqualToString:@"CONFERENCE_JOINED"]
&& [delegate respondsToSelector:@selector(conferenceJoined:)]) {
[delegate conferenceJoined:data];
} else if ([name isEqualToString:@"CONFERENCE_LEFT"]
&& [delegate respondsToSelector:@selector(conferenceLeft:)]) {
[delegate conferenceLeft:data];
} else if ([name isEqualToString:@"CONFERENCE_WILL_JOIN"]
&& [delegate respondsToSelector:@selector(conferenceWillJoin:)]) {
[delegate conferenceWillJoin:data];
} else if ([name isEqualToString:@"CONFERENCE_WILL_LEAVE"]
&& [delegate respondsToSelector:@selector(conferenceWillLeave:)]) {
[delegate conferenceWillLeave:data];
if (sel && [delegate respondsToSelector:sel]) {
[delegate performSelector:sel withObject:data];
}
}
/**
* Converts a specific event name i.e. redux action type description to a
* method name.
*
* @param eventName The event name to convert to a method name.
* @return A method name constructed from the specified {@code eventName}.
*/
- (NSString *)methodNameFromEventName:(NSString *)eventName {
NSMutableString *methodName
= [NSMutableString stringWithCapacity:eventName.length];
for (NSString *c in [eventName componentsSeparatedByString:@"_"]) {
if (c.length) {
[methodName appendString:
methodName.length ? c.capitalizedString : c.lowercaseString];
}
}
[methodName appendString:@":"];
return methodName;
}
@end

View File

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

View File

@@ -15,6 +15,7 @@
*/
#import <CoreText/CoreText.h>
#include <mach/mach_time.h>
#import <React/RCTAssert.h>
#import <React/RCTLinkingManager.h>
@@ -83,10 +84,10 @@ void loadCustomFonts(Class clazz) {
*/
void registerFatalErrorHandler() {
#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.
// 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);
}
@@ -139,6 +140,17 @@ static NSMapTable<NSString *, JitsiMeetView *> *views;
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler
{
// XXX At least twice we received bug reports about malfunctioning loadURL
// in the Jitsi Meet SDK while the Jitsi Meet app seemed to functioning as
// expected in our testing. But that was to be expected because the app does
// not exercise loadURL. In order to increase the test coverage of loadURL,
// channel Universal linking through loadURL.
if ([userActivity.activityType
isEqualToString:NSUserActivityTypeBrowsingWeb]
&& [JitsiMeetView loadURLInViews:userActivity.webpageURL]) {
return YES;
}
return [RCTLinkingManager application:application
continueUserActivity:userActivity
restorationHandler:restorationHandler];
@@ -148,6 +160,15 @@ static NSMapTable<NSString *, JitsiMeetView *> *views;
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
// XXX At least twice we received bug reports about malfunctioning loadURL
// in the Jitsi Meet SDK while the Jitsi Meet app seemed to functioning as
// expected in our testing. But that was to be expected because the app does
// not exercise loadURL. In order to increase the test coverage of loadURL,
// channel Universal linking through loadURL.
if ([JitsiMeetView loadURLInViews:url]) {
return YES;
}
return [RCTLinkingManager application:application
openURL:url
sourceApplication:sourceApplication
@@ -210,28 +231,39 @@ static NSMapTable<NSString *, JitsiMeetView *> *views;
- (void)loadURLObject:(NSDictionary *)urlObject {
NSMutableDictionary *props = [[NSMutableDictionary alloc] init];
[props setObject:externalAPIScope forKey:@"externalAPIScope"];
[props setObject:@(self.welcomePageEnabled) forKey:@"welcomePageEnabled"];
props[@"externalAPIScope"] = externalAPIScope;
props[@"welcomePageEnabled"] = @(self.welcomePageEnabled);
// XXX url must not be set when nil, so it appears as undefined in JS and we
// check the launch parameters.
// XXX If urlObject is nil, then it must appear as undefined in the
// JavaScript source code so that we check the launchOptions there.
if (urlObject) {
[props setObject:urlObject forKey:@"url"];
props[@"url"] = urlObject;
}
if (rootView == nil) {
// XXX The method loadURLObject: is supposed to be imperative i.e. a second
// invocation with one and the same URL is expected to join the respective
// conference again if the first invocation was followed by leaving the
// conference. However, React and, respectively,
// appProperties/initialProperties are declarative expressions i.e. one and
// the same URL will not trigger componentWillReceiveProps in the JavaScript
// source code. The workaround implemented bellow introduces imperativeness
// in React Component props by defining a unique value per loadURLObject:
// invocation.
props[@"timestamp"] = @(mach_absolute_time());
if (rootView) {
// Update props with the new URL.
rootView.appProperties = props;
} else {
rootView
= [[RCTRootView alloc] initWithBridge:bridgeWrapper.bridge
moduleName:@"App"
initialProperties:props];
rootView.backgroundColor = self.backgroundColor;
// Add React's root view as a subview which completely covers this one.
// Add rootView as a subview which completely covers this one.
[rootView setFrame:[self bounds]];
[self addSubview:rootView];
} else {
// Update props with the new URL.
rootView.appProperties = props;
}
}
@@ -249,6 +281,32 @@ static NSMapTable<NSString *, JitsiMeetView *> *views;
#pragma mark Private methods
/**
* Loads a specific {@link NSURL} in all existing {@code JitsiMeetView}s.
*
* @param url - The {@code NSURL} to load in all existing
* {@code JitsiMeetView}s.
* @return {@code YES} if the specified {@code url} was submitted for loading in
* at least one {@code JitsiMeetView}; otherwise, {@code NO}.
*/
+ (BOOL)loadURLInViews:(NSURL *)url {
BOOL handled = NO;
if (views) {
for (NSString *externalAPIScope in views) {
JitsiMeetView *view
= [JitsiMeetView viewForExternalAPIScope:externalAPIScope];
if (view) {
[view loadURL:url];
handled = YES;
}
}
}
return handled;
}
+ (instancetype)viewForExternalAPIScope:(NSString *)externalAPIScope {
return [views objectForKey:externalAPIScope];
}
@@ -283,9 +341,9 @@ static NSMapTable<NSString *, JitsiMeetView *> *views;
[views setObject:self forKey:externalAPIScope];
}
// Set a background color which is in accord with the JavaScript and
// Android parts of the application and causes less perceived visual
// flicker than the default background color.
// Set a background color which is in accord with the JavaScript and Android
// parts of the application and causes less perceived visual flicker than
// the default background color.
self.backgroundColor
= [UIColor colorWithRed:.07f green:.07f blue:.07f alpha:1];
}

View File

@@ -25,7 +25,7 @@
* The {@code data} dictionary contains an "error" key describing the error and
* a {@code url} key with the conference URL.
*/
- (void) conferenceFailed:(NSDictionary *)data;
- (void)conferenceFailed:(NSDictionary *)data;
/**
* Called when a conference was joined.
@@ -33,7 +33,7 @@
* The {@code data} dictionary contains a {@code url} key with the conference
* URL.
*/
- (void) conferenceJoined:(NSDictionary *)data;
- (void)conferenceJoined:(NSDictionary *)data;
/**
* Called when a conference was left.
@@ -41,7 +41,7 @@
* The {@code data} dictionary contains a {@code url} key with the conference
* URL.
*/
- (void) conferenceLeft:(NSDictionary *)data;
- (void)conferenceLeft:(NSDictionary *)data;
/**
* Called before a conference is joined.
@@ -49,7 +49,7 @@
* The {@code data} dictionary contains a {@code url} key with the conference
* URL.
*/
- (void) conferenceWillJoin:(NSDictionary *)data;
- (void)conferenceWillJoin:(NSDictionary *)data;
/**
* Called before a conference is left.
@@ -57,6 +57,16 @@
* The {@code data} dictionary contains a {@code url} key with the conference
* URL.
*/
- (void) conferenceWillLeave:(NSDictionary *)data;
- (void)conferenceWillLeave:(NSDictionary *)data;
/**
* Called when loading the main configuration file from the Jitsi Meet
* deployment file.
*
* The {@code data} dictionary contains an {@code error} key with the error and
* a {@code url} key with the conference URL which necessitated the loading of
* the configuration file.
*/
- (void)loadConfigError:(NSDictionary *)data;
@end

View File

@@ -6,12 +6,15 @@
"fr": "Френски",
"hy": "Арменски",
"it": "Италиански",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"oc": "Окситански",
"pl": "Полски",
"ptBR": "Португалски (Бразилия)",
"ru": "Руски",
"sk": "Словашки",
"sl": "Словенски",
"sv": "Шведски",
"tr": "Турски"
"tr": "Турски",
"zhCN": "Китайски (Китай)",
"nb": "Норвежки букмол",
"eo": "Есперанто"
}

View File

@@ -1,6 +1,6 @@
{
"en": "",
"bg": "",
"en": "Angličtina",
"bg": "Bulharština",
"de": "",
"es": "",
"fr": "",

View File

@@ -1,19 +1,20 @@
{
"en": "",
"bg": "",
"de": "",
"es": "",
"fr": "",
"hy": "",
"it": "",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"sk": "",
"sl": "",
"sv": "",
"tr": "",
"zhCN": "",
"nb": ""
"en": "Angla",
"bg": "Bulgara",
"de": "Germana",
"es": "Hispana",
"fr": "Franca",
"hy": "Armena",
"it": "Itala",
"oc": "Okcitana",
"pl": "Pola",
"ptBR": "Portugala (Brazilo)",
"ru": "Rusa",
"sk": "Slovaka",
"sl": "Slovena",
"sv": "Sveda",
"tr": "Turka",
"zhCN": "Ĉina (Ĉinujo)",
"nb": "Norvega (Bokmål)",
"eo": "Esperanto"
}

View File

@@ -13,5 +13,8 @@
"sk": "Eslovaco",
"sl": "Esloveno",
"sv": "Sueco",
"tr": "Turco"
"tr": "Turco",
"zhCN": "Chino (China)",
"nb": "Noruego (bokmal)",
"eo": "Esperanto"
}

View File

@@ -13,5 +13,8 @@
"sk": "Սլովակերեն",
"sl": "Սլովեներեն ",
"sv": "Շվեդերեն ",
"tr": "Թուրքերեն"
"tr": "Թուրքերեն",
"zhCN": "Չիներեն",
"nb": "Նորվեգերեն",
"eo": "Էսպերանտո"
}

View File

@@ -2,16 +2,19 @@
"en": "Inglese",
"bg": "Bulgaro",
"de": "Tedesco",
"es": "",
"es": "Spagnolo",
"fr": "Francese",
"hy": "",
"hy": "Armeno",
"it": "Italiano",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"oc": "Occitano",
"pl": "Polacco",
"ptBR": "Portoghese (Brasile)",
"ru": "Russo",
"sk": "Slovacco",
"sl": "Sloveno",
"sv": "",
"tr": "Turco"
"sv": "Svedese",
"tr": "Turco",
"zhCN": "Cinese (Cina)",
"nb": "",
"eo": ""
}

View File

@@ -14,5 +14,7 @@
"sl": "",
"sv": "",
"tr": "",
"zhCN": ""
"zhCN": "",
"nb": "",
"eo": ""
}

View File

@@ -15,5 +15,6 @@
"sv": "Suedés",
"tr": "Turc",
"zhCN": "Chinés (China)",
"nb": "Norvegian Bokmål"
"nb": "Norvegian Bokmål",
"eo": "Esperanto"
}

View File

@@ -6,12 +6,15 @@
"fr": "Francuski",
"hy": "Ormiański",
"it": "Włoski",
"oc": "Prowansalski",
"oc": "Okcytański",
"pl": "Polski",
"ptBR": "portugalski (brazylijski)",
"ru": "Rosyjski",
"sk": "Słowacki",
"sl": "Słoweński",
"sv": "Szwedzki",
"tr": "Turecki"
"tr": "Turecki",
"zhCN": "chiński (Chiny)",
"nb": "norweski bokmal",
"eo": "Esperanto"
}

View File

@@ -15,5 +15,6 @@
"sv": "Sueco",
"tr": "Turco",
"zhCN": "Chinês (China)",
"nb": "Bokmal norueguês"
"nb": "Bokmal norueguês",
"eo": "Esperanto"
}

View File

@@ -14,5 +14,7 @@
"sl": "Словенский",
"sv": "Шведский",
"tr": "Турецкий",
"zhCN": "Китайский (Китай)"
"zhCN": "Китайский (Китай)",
"nb": "",
"eo": ""
}

View File

@@ -13,5 +13,8 @@
"sk": "Slovenčina",
"sl": "Slovinčina",
"sv": "",
"tr": "Turečtina"
"tr": "Turečtina",
"zhCN": "",
"nb": "",
"eo": ""
}

View File

@@ -13,5 +13,8 @@
"sk": "",
"sl": "Slovenščina",
"sv": "",
"tr": "Turščina"
"tr": "Turščina",
"zhCN": "",
"nb": "",
"eo": ""
}

View File

@@ -2,16 +2,19 @@
"en": "Engelska",
"bg": "Bulgariska",
"de": "Tyska",
"es": "",
"es": "Spanska",
"fr": "Franska",
"hy": "",
"hy": "Armeniska",
"it": "Italienska",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"oc": "Occitanska",
"pl": "Polska",
"ptBR": "Portugisiska (Brasilien)",
"ru": "Ryska",
"sk": "Slovakiska",
"sl": "Slovenska",
"sv": "",
"tr": "Turkiska"
"sv": "Svenska",
"tr": "Turkiska",
"zhCN": "Kinesiska (Kina)",
"nb": "Norska (Bokmål)",
"eo": "Esperanto"
}

View File

@@ -2,16 +2,19 @@
"en": "İngilizce",
"bg": "Bulgarca",
"de": "Almanca",
"es": "",
"fr": "",
"hy": "",
"it": "",
"oc": "",
"pl": "",
"ptBR": "",
"ru": "",
"sk": "",
"sl": "",
"sv": "",
"tr": ""
"es": "İspanyolca",
"fr": "Fransızca",
"hy": "Ermenice",
"it": "İtalyanca",
"oc": "Oksitan dili",
"pl": "Lehçe",
"ptBR": "Portekizce (Brezilya)",
"ru": "Rusça",
"sk": "Slovakça",
"sl": "Slovence",
"sv": "Isveççe",
"tr": "Türkçe",
"zhCN": "Çince (Tayvan)",
"nb": "Norveççe Bokmal",
"eo": "Esperanto"
}

View File

@@ -15,6 +15,6 @@
"sv": "瑞典语",
"tr": "土耳其语",
"zhCN": "中文(中国)",
"nb": "",
"eo": ""
"nb": "挪威布克摩尔语",
"eo": "世界语"
}

View File

@@ -1,12 +1,19 @@
{
"contactlist": "",
"contactlist": "Участници (__pcount__)",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "Настройки на връзката",
"poweredby": "powered by",
"feedback": "Кажете ни как върви",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Конференцията се създава...",
"me": "аз",
"speaker": "Говорител",
@@ -14,6 +21,10 @@
"defaultNickname": "Яна Розова",
"defaultLink": "например __url__",
"callingName": "",
"audioOnly": {
"audioOnly": "",
"featureToggleDisabled": ""
},
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -22,58 +33,66 @@
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": ""
"nwjsGrantPermissions": "",
"edgeGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
"keyboardShortcuts": "Клавишни комбинации:",
"raiseHand": "",
"pushToTalk": "",
"toggleScreensharing": "",
"pushToTalk": "Push to talk.",
"toggleScreensharing": "Смяна между камера и споделен екран.",
"toggleFilmstrip": "",
"toggleShortcuts": "",
"toggleShortcuts": "Показване/скриване на това меню.",
"focusLocal": "",
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
"toggleChat": "Отваряне/скриване на чат панела.",
"mute": "Спиране/пускане на микрофона.",
"fullScreen": "Влез / Излез от Пълен екран",
"videoMute": "",
"showSpeakerStats": ""
},
"\u0005keyboardShortcuts": {},
"welcomepage": {
"go": "Влез",
"roomname": "Въведете име на стаята",
"disable": "Не показвай повече тази страница",
"feature1": {
"title": "Лесен за употреба",
"content": "Не е необходимо да сваляте нищо. _app_ работи директно във вашия браузър. Просто споделете адреса на вашата конференция с другите за да започнете."
"content": "Не е необходимо да сваляте нищо. __app__ работи директно във вашия браузър. Просто споделете адреса на вашата конференция с другите за да започнете.",
"title": "Лесен за употреба"
},
"feature2": {
"title": "Нисък дебит",
"content": "Видео конференциите могат да работят с по-малко от 128Kbps, а аудио конференциите и конференциите с споделен екран дори с по-малко."
"content": "Видео конференциите могат да работят с по-малко от 128Kbps, а аудио конференциите и конференциите с споделен екран дори с по-малко.",
"title": "Нисък дебит"
},
"feature3": {
"title": "Отворен код",
"content": "__app__ се разпространява под лицензе Apache. Свободни сте да го сваляте ползвате, променяте и споделяте спрямо правилата на лиценза."
"content": "__app__ се разпространява под лицензе Apache. Свободни сте да го сваляте ползвате, променяте и споделяте спрямо правилата на лиценза.",
"title": "Отворен код"
},
"feature4": {
"title": "Неограничен брой потребители",
"content": "Няма изкуствени ограничения за броя на потребителите или участниците в конференция. Единствените ограничения са мощността на вашия сървър и качеството на интернет връзката му."
"content": "Няма изкуствени ограничения за броя на потребителите или участниците в конференция. Единствените ограничения са мощността на вашия сървър и качеството на интернет връзката му.",
"title": "Неограничен брой потребители"
},
"feature5": {
"title": "Споделяне на екрана",
"content": "Лесно е да споделите екрана си с другите. __app__ е идеален за онлайн презентации, лекции и техническа подръжка."
"content": "Лесно е да споделите екрана си с другите. __app__ е идеален за онлайн презентации, лекции и техническа подръжка.",
"title": "Споделяне на екрана"
},
"feature6": {
"title": "Сигурни стаи",
"content": "Нуждаете се от уединение? _app__ конферентните стай могат да бъдат защитени от парола за да се препазите от нежелани гости или прекъсвания."
"content": "Нуждаете се от уединение? __app__ конферентните стай могат да бъдат защитени от парола за да се препазите от нежелани гости или прекъсвания.",
"title": "Сигурни стаи"
},
"feature7": {
"title": "Споделени бележки",
"content": "__app__ използва Etherpad, с който можете да редактирате текст в реално време заедно."
"content": "__app__ използва Etherpad, с който можете да редактирате текст в реално време заедно.",
"title": "Споделени бележки"
},
"feature8": {
"title": "Статистики за използване",
"content": "Научете повече за своите потребители като интегрирате лесно Piwik, Google Analytics и други статистики за изполването."
}
"content": "Научете повече за своите потребители като интегрирате лесно Piwik, Google Analytics и други статистики за изполването.",
"title": "Статистики за използване"
},
"go": "Влез",
"join": "",
"privacy": "",
"roomname": "Въведете име на стаята",
"roomnamePlaceHolder": "",
"sendFeedback": "",
"terms": ""
},
"startupoverlay": {
"policyText": "",
@@ -81,19 +100,22 @@
},
"suspendedoverlay": {
"title": "",
"text": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "Включи / Изключи микрофона",
"videomute": "",
"videomute": "Включи / Изключи камерата",
"authenticate": "Идентификация",
"lock": "",
"lock": "Заключи / отключи стаята",
"invite": "",
"chat": "",
"chat": "Отвори / затвори чат",
"etherpad": "",
"sharedvideo": "Сподели YouTube видео",
"sharescreen": "",
"fullscreen": "",
"fullscreen": "Влез / Излез от Пълен екран",
"sip": "Обади се на SIP номер",
"Settings": "Настройки",
"hangup": "",
@@ -110,6 +132,14 @@
"profile": "",
"raiseHand": ""
},
"\u0005toolbar": {},
"unsupportedBrowser": {
"appInstalled": "",
"appNotInstalled": "",
"downloadApp": "",
"joinConversation": "",
"startConference": ""
},
"bottomtoolbar": {
"chat": "Отвори / затвори чат",
"filmstrip": "",
@@ -133,12 +163,10 @@
"selectAudioOutput": "",
"followMe": "",
"noDevice": "Няма",
"noPermission": "Не е разрешен достъп до устройството",
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
"audioVideo": ""
},
"profile": {
"title": "",
@@ -149,18 +177,21 @@
"videothumbnail": {
"editnickname": "Натиснете за да<br/>промените името",
"moderator": "Създателя на<br/>конференцията",
"videomute": "",
"videomute": "Учасника е спрял<br/>камерата си.",
"mute": "Учасника е с изключен микрофон",
"kick": "Изгони",
"muted": "Изключен микрофон",
"domute": "Изключи микрофона",
"flip": "Огледално"
"flip": "Огледално",
"remoteControl": ""
},
"\u0005videothumbnail": {},
"connectionindicator": {
"header": "",
"bitrate": "Дебит:",
"packetloss": "Загуба на пакети:",
"resolution": "Резолюция:",
"framerate": "",
"less": "Скрий",
"more": "Покажи",
"address": "Адрес:",
@@ -174,7 +205,8 @@
"remoteaddress_plural": "Отдалечени адреси:",
"transport": "Транспорт:",
"bandwidth": "Оценка макс. дебит:",
"na": "Върнете се тук за информацията относно вашата връзка, когато започне конференцията"
"na": "Върнете се тук за информацията относно вашата връзка, когато започне конференцията",
"turn": ""
},
"notify": {
"disconnected": "връзката е прекъсната",
@@ -190,8 +222,10 @@
"mutedTitle": "Звукът ви е спрян!",
"raisedHand": ""
},
"\u0005notify": {},
"dialog": {
"add": "",
"allow": "",
"kickMessage": "Бяхте изгонен от срещата!",
"popupError": "Навигаторът ви блокира попъите. Молим ви да премахнете забраната и да опитате отново.",
"passwordErrorTitle": "",
@@ -203,8 +237,6 @@
"connecting": "Свързване",
"copy": "",
"error": "Грешка",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Възникна грешка при опит да бъде намерено разширението за споделяне на екран.",
"failtoinstall": "Неуспешна инсталация на разширението за споделяне на екрана.",
@@ -213,8 +245,7 @@
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"rejoinNow": "",
"maxUsersLimitReached": "Конференцията е пълна. Моля, опитайте по-късно!",
"lockTitle": "Неуспешно заключване",
"lockMessage": "Неуспешно заключване на конференцията.",
@@ -231,7 +262,7 @@
"defaultError": "Възникна грешка",
"passwordRequired": "Изисква се парола",
"Ok": "ОК",
"done": "",
"done": "Няма",
"Remove": "DELETE DELETE DELETE DELETE DELETE DELETE DELETE DELETE DELETE DELETE ",
"removePassword": "",
"shareVideoTitle": "Сподели видео",
@@ -254,31 +285,28 @@
"Save": "Запазване",
"recording": "Запис",
"recordingToken": "Въведете код за достъп за запис на конференцията",
"Dial": "Набиране",
"sipMsg": "Въведете SIP номер",
"passwordCheck": "Сигурни ли сте, че искате да махнете паролата?",
"passwordMsg": "Въведете парола, за да заключите стаята",
"shareLink": "",
"settings1": "Конфигурирай конференцията",
"settings2": "Участниците се присъединиха с изключен микрофон.",
"settings3": "Изисквай имена<br/><br/>Въведете парола за да заключите стаята:",
"yourPassword": "",
"yourPassword": "потребителска парола",
"Back": "Назад",
"serviceUnavailable": "Услугата не е налична",
"gracefulShutdown": "Услугата временно не е достъпна поради профилактика. Моля опитайте по-късно.",
"Yes": "Да",
"reservationError": "Грешка в системата за резервации",
"reservationErrorMsg": "Грешка номер: __code__, съобщение: __msg__",
"password": "",
"password": "потребителска парола",
"userPassword": "потребителска парола",
"token": "код за достъп",
"tokenAuthFailedTitle": "",
"tokenAuthFailedTitle": "Неуспешна идентификация",
"tokenAuthFailed": "",
"displayNameRequired": "",
"enterDisplayName": "Въведете името си:",
"extensionRequired": "Изисква се разширение: ",
"firefoxExtensionPrompt": "За да споделите екрана си, трябва да инсталирате Firefox разширение. <a href='__url__'>свалете го тук</a> и пробвайте пак!",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "Благодарим, че използвахте __appName__!",
@@ -291,7 +319,7 @@
"stopLiveStreaming": "Край на прякото предаване",
"stopRecording": "Край на записа",
"doNotShowWarningAgain": "Занапред не ме предупреждавай пак",
"doNotShowMessageAgain": "",
"doNotShowMessageAgain": "Не показвай повече тази страница",
"permissionDenied": "Достъпът е отказан",
"screenSharingPermissionDeniedError": "Не сте дали права за споделяне на екран",
"micErrorPresent": "Грешка при достъп до микрофона",
@@ -308,12 +336,27 @@
"micNotSendingData": "",
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"externalInstallationTitle": "Изисква се разширение: ",
"externalInstallationMsg": "Неуспешна инсталация на разширението за споделяне на екрана.",
"inlineInstallationMsg": "Неуспешна инсталация на разширението за споделяне на екрана.",
"inlineInstallExtension": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Изключи микрофона"
"muteParticipantButton": "Изключи микрофона",
"remoteControlTitle": "",
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "",
"remoteControlAllowedMessage": "",
"remoteControlErrorMessage": "",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"\u0005dialog": {},
"email": {
"sharedKey": [
"Стаята е защитена с парола. Моля използвайте следния пин при влизане:",
@@ -356,19 +399,87 @@
"on": "Запис",
"off": "Записът спрян",
"failedToStart": "Неуспешен опит за записване",
"buttonTooltip": "",
"buttonTooltip": "Пускане / спиране на запис",
"error": "Грешка при опит за запис. Моля опитайте отново.",
"unavailable": "Записите са временно невъзможни. Моля опитайте по-късно."
},
"\u0005recording": {},
"liveStreaming": {
"pending": "Започва пряко предаване...",
"on": "Пряко предаване",
"off": "Край на прякото предаване",
"unavailable": "Услугата за пряко предаване е временно недостъпна. Опитайте по-късно.",
"failedToStart": "Неуспешен опит за пряко предаване",
"buttonTooltip": "",
"buttonTooltip": "Начало / край на пряко предаване",
"streamIdRequired": "Моля попълнете името на потока, за да можем да започнем прякото предаване.",
"streamIdHelp": "",
"error": "Неуспешно пряко предаване. Опитайте пак.",
"busy": "Всички записвачки са временно заети. Опитайте отново по-късно."
},
"\u0005liveStreaming": {},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "Име",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Набиране",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -1,12 +1,19 @@
{
"contactlist": "",
"contactlist": "Účastníci (__pcount__)",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "",
"poweredby": "",
"feedback": "",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "",
"me": "",
"speaker": "",
@@ -16,8 +23,7 @@
"callingName": "",
"audioOnly": {
"audioOnly": "",
"featureToggleDisabled": "",
"howToDisable": ""
"featureToggleDisabled": ""
},
"userMedia": {
"react-nativeGrantPermissions": "",
@@ -97,6 +103,7 @@
"rejoinKeyTitle": ""
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "",
"videomute": "",
@@ -187,16 +194,22 @@
"address": "",
"remoteport": "",
"remoteport_plural_2": "",
"remoteport_plural_5": "",
"localport": "",
"localport_plural_2": "",
"localport_plural_5": "",
"localaddress": "",
"localaddress_plural_2": "",
"localaddress_plural_5": "",
"remoteaddress": "",
"remoteaddress_plural_2": "",
"remoteaddress_plural_5": "",
"transport": "",
"transport_plural_2": "",
"transport_plural_5": "",
"bandwidth": "",
"na": ""
"na": "",
"turn": ""
},
"notify": {
"disconnected": "",
@@ -274,8 +287,6 @@
"Save": "",
"recording": "",
"recordingToken": "",
"Dial": "",
"sipMsg": "",
"passwordCheck": "",
"passwordMsg": "",
"shareLink": "",
@@ -298,7 +309,6 @@
"enterDisplayName": "",
"extensionRequired": "",
"firefoxExtensionPrompt": "",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "",
@@ -330,6 +340,8 @@
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"inlineInstallationMsg": "",
"inlineInstallExtension": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "",
@@ -339,6 +351,7 @@
"remoteControlDeniedMessage": "",
"remoteControlAllowedMessage": "",
"remoteControlErrorMessage": "",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "",
"close": "",
"shareYourScreen": "",
@@ -401,15 +414,52 @@
},
"invite": {
"addPassword": "",
"dialInNumbers": "",
"errorFetchingNumbers": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"loadingNumbers": "",
"invitedYouTo": "",
"locked": "",
"noNumbers": "",
"numbersDisabled": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -6,7 +6,14 @@
"passwordSetRemotely": "von einem anderen Teilnehmer gesetzt",
"connectionsettings": "Verbindungseinstellungen",
"poweredby": "Betrieben von",
"feedback": "Wir freuen uns auf Ihr Feedback!",
"feedback": {
"average": "Durschnittlich",
"bad": "Schlecht",
"good": "Gut",
"rateExperience": "Bitte bewerten Sie diese Konferenz.",
"veryBad": "Sehr schlecht",
"veryGood": "Sehr gut"
},
"inviteUrlDefaultMsg": "Die Konferenz wird erstellt...",
"me": "ich",
"speaker": "Sprecher",
@@ -19,12 +26,12 @@
"featureToggleDisabled": "Umschalten zwischen __feature__ ist im Audio-Modus deaktiviert"
},
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
"androidGrantPermissions": "",
"react-nativeGrantPermissions": "Wählen Sie <b><i>Erlauben</i></b> wenn der Browser um Berechtigungen bittet.",
"chromeGrantPermissions": "Wählen Sie <b><i>Erlauben</i></b> wenn der Browser um Berechtigungen bittet.",
"androidGrantPermissions": "Wählen Sie <b><i>Erlauben</i></b> wenn der Browser um Berechtigungen bittet.",
"firefoxGrantPermissions": "Wählen Sie <b><i>Markiertes Gerät teilen</i></b> wenn der Browser um Berechtigungen bittet.",
"operaGrantPermissions": "Wählen Sie <b><i>Erlauben</i></b> wenn der Browser um Berechtigungen bittet.",
"iexplorerGrantPermissions": "",
"iexplorerGrantPermissions": "Wählen Sie <b><i>OK</i></b> wenn der Browser um Berechtigungen bittet.",
"safariGrantPermissions": "Wählen Sie <b><i>OK</i></b> wenn der Browser um Berechtigungen bittet.",
"nwjsGrantPermissions": "Bitte Berechtigungen zur Verwendung der Kamera und des Mikrofons erteilen",
"edgeGrantPermissions": "Wählen Sie <b><i>Ja</i></b> wenn der Browser um Berechtigungen bittet."
@@ -91,11 +98,12 @@
"title": "__app__ benötigt Kamera und Mikrofon."
},
"suspendedoverlay": {
"title": "Die Konferenz wurde unterbrochen weil der Computer den Standbymodus aktivierte.",
"text": "Klicken Sie auf die <i>Erneut teilnehmen</i> Schaltfläche um die Verbindung wieder herzustellen.",
"title": "Die Konferenz wurde unterbrochen weil der Standbymodus aktiviert wurde.",
"text": "<i>Erneut teilnehmen</i> Schaltfläche betätigen um erneut zu verbinden.",
"rejoinKeyTitle": "Erneut teilnehmen"
},
"toolbar": {
"addPeople": "",
"audioonly": "Nur-Audio-Modus aktivieren/deaktivieren (spart Bandbreite)",
"mute": "Stummschaltung aktivieren / deaktivieren",
"videomute": "Kamera starten / stoppen",
@@ -194,7 +202,8 @@
"remoteaddress_plural": "Entfernte Adressen:",
"transport": "Protokoll:",
"bandwidth": "Geschätzte Bandbreite:",
"na": "Verbindungsdaten erneut anzeigen wenn die Konferenz begonnen hat"
"na": "Verbindungsdaten erneut anzeigen wenn die Konferenz begonnen hat",
"turn": " (TURN)"
},
"notify": {
"disconnected": "getrennt",
@@ -294,7 +303,6 @@
"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.",
"feedbackHelp": "Ihr Feedback hilft uns die Qualität der Konferenzen zu verbessern.",
"feedbackQuestion": "Anmerkungen zur Konferenz.",
"thankYou": "Danke für die Verwendung von __appName__!",
@@ -326,6 +334,8 @@
"goToStore": "Zum Store",
"externalInstallationTitle": "Erweiterung erforderlich",
"externalInstallationMsg": "Die Bildschirmfreigabeerweiterung muss installiert werden.",
"inlineInstallationMsg": "Die Bildschirmfreigabeerweiterung muss installiert werden.",
"inlineInstallExtension": "Jetzt installieren",
"muteParticipantTitle": "Teilnehmer stummschalten?",
"muteParticipantBody": "Sie können die Stummschaltung anderer Teilnehmer nicht aufheben, aber ein Teilnehmer kann seine eigene Stummschaltung jederzeit beenden.",
"muteParticipantButton": "Stummschalten",
@@ -335,6 +345,7 @@
"remoteControlDeniedMessage": "__user__ hat die Anfrage zur Fernsteuerung verweigert.",
"remoteControlAllowedMessage": "__user__ hat die Anfrage zur Fernsteuerung angenommen.",
"remoteControlErrorMessage": "Beim Anfordern der Fernsteuerungsberechtigung von __user__ ist ein Fehler aufgetreten.",
"startRemoteControlErrorMessage": "Beim Versuch die Fernsteuerung zu starten ist ein Fehler aufgetreten.",
"remoteControlStopMessage": "Die Fernsteuerung wurde beendet.",
"close": "Schliessen",
"shareYourScreen": "Bildschirm freigeben",
@@ -434,10 +445,18 @@
"unlocked": "Die Konferenz ist nicht geschützt. Jeder mit dem Link kann der Konferenz beitreten."
},
"videoStatus": {
"callQuality": "Konferenzqualität",
"changeVideoTip": "Die Videoqualität kann über die linke Werkzeugleiste geändert werden.",
"hd": "HD",
"hdVideo": "HD video",
"highDefinition": "Hohe Auflösung",
"ld": "LD",
"lowDefinition": "Niedrige Auflösung",
"p2pEnabled": "Ende-zu-Ende aktiviert",
"p2pVideoQualityDescription": "Im Ende-zu-Ende Modus kann die Konferenzqualität nur zwischen hoch und nur-Audio gewählt werden. Andere Einstellungen werden nicht beachtet.",
"recHighDefinitionOnly": "Hohe Qualität wird bevorzugt.",
"sd": "SD",
"sdVideo": "SD video"
"standardDefinition": "Standardauflösung",
"qualityButtonTip": "Empfangene Videoqualität ändern"
},
"dialOut": {
"dial": "Wählen",
@@ -445,5 +464,22 @@
"statusMessage": "ist jetzt __status__",
"enterPhone": "Telefonnummer eingeben",
"phoneNotAllowed": "Diese Telefonnummer wird leider noch nicht unterstützt!"
},
"addPeople": {
"add": "Hinzufügen",
"noResults": "Keine passenden Ergebnisse",
"searchPlaceholder": "Nach Teilnehmern und Konferenzen suchen",
"title": "Teilnehmer zur Konferenz hinzufügen",
"failedToAdd": "Fehler beim Hinzufügen von Teilnehmern"
},
"inlineDialogFailure": {
"msg": "Es ist ein Fehler aufgetreten.",
"retry": "Erneut versuchen",
"support": "Support",
"supportMsg": "Wenn der Fehler erneut auftritt, bitte kontaktieren sie"
},
"deviceError": {
"cameraPermission": "Fehler beim Bezug der Kamera-Zugriffsberechtigungen",
"microphonePermission": "Fehler beim Bezug der Mikrofon-Zugriffsberechtigungen"
}
}

View File

@@ -1,19 +1,30 @@
{
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"connectionsettings": "",
"poweredby": "",
"feedback": "",
"inviteUrlDefaultMsg": "",
"me": "",
"speaker": "",
"raisedHand": "",
"defaultNickname": "",
"defaultLink": "",
"callingName": "",
"contactlist": "Partoprenantoj (__pcount__)",
"addParticipants": "Kunhavi la ligilon",
"roomLocked": "Vokantoj devas enigi pasvorton",
"roomUnlocked": "Iu ajn povas aliĝi per la ligilo",
"passwordSetRemotely": "agordita de alia partoprenanto",
"connectionsettings": "Konektaj Agordoj",
"poweredby": "povigita de",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "Bonvolu priskribi vian sperton.",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Via kunveno nun estas kreata...",
"me": "mi",
"speaker": "Parolanto",
"raisedHand": "Volas paroli",
"defaultNickname": "ekz. Joĉjo Verda",
"defaultLink": "ek. __url__",
"callingName": "__name__",
"audioOnly": {
"audioOnly": "",
"featureToggleDisabled": ""
},
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -22,353 +33,449 @@
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": ""
"nwjsGrantPermissions": "Bonvolu doni la permeson uzi viajn kameraon kaj mikrofonon",
"edgeGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
"raiseHand": "",
"pushToTalk": "",
"toggleScreensharing": "",
"toggleFilmstrip": "",
"toggleShortcuts": "",
"focusLocal": "",
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
"keyboardShortcuts": "Fulmoklavoj",
"raiseHand": "Levi aŭ mallevi manon",
"pushToTalk": "Premi por paroli",
"toggleScreensharing": "Komuti inter kameraa kaj ekrana vidado",
"toggleFilmstrip": "Montri aŭ kaŝi la videojn",
"toggleShortcuts": "Montri aŭ kaŝi ĉi tiun helpan menuon",
"focusLocal": "Atenti vian videon",
"focusRemote": "Atenti videon de alia vokanto",
"toggleChat": "Malfermi aŭ fermi la babilon",
"mute": "Silentigi aŭ malsilentigi vian mikrofonon",
"fullScreen": "Ŝalti aŭ malŝalti tutekranan reĝimon",
"videoMute": "Ŝalti aŭ malŝalti vian kameraon",
"showSpeakerStats": ""
},
"welcomepage": {
"disable": "",
"disable": "Ne montri ĉi tiun paĝon denove",
"feature1": {
"content": "",
"title": ""
"content": "Sen elŝutoj. __app__ funkcias tuj en via foliumilo. Simple kunhavu vian kunvenan ligilon kun aliaj por komenci.",
"title": "Facile uzebla"
},
"feature2": {
"content": "",
"title": ""
"content": "Multopaj kunvenoj povas funkcii kun nur 128 kbit/s. Ekranvidado kaj nur sonaj kunvenoj povas funkcii kun eĉ malpli.",
"title": "Malgranda kapacito"
},
"feature3": {
"content": "",
"title": ""
"content": "__app__ estas sub la permesilo Apache. Vi rajtas ĝin elŝuti, uzi, ŝanĝi kaj kunhavi, kiel diras la permesilo.",
"title": "Malfermkoda"
},
"feature4": {
"content": "",
"title": ""
"content": "Ne ekzistas artefaritaj limoj por nombro da partoprenantoj. Servila povo kaj reta bitrapido estas la nuraj limoj.",
"title": "Senlime da uzantoj"
},
"feature5": {
"content": "",
"title": ""
"content": "Estas facile kunhavi vian ekranon kun aliaj. __app__ taŭgas por enretaj prezentaĵoj, lecionoj kaj teĥnika subteno.",
"title": "Ekranvidado"
},
"feature6": {
"content": "",
"title": ""
"content": "Ĉu vi bezonas privatecon? Kunvenajn ĉambrojn de __app__ eblas sekurigi per pasvorto, por forteni nevolatajn gastojn kaj interrompojn.",
"title": "Sekuraj ĉambroj"
},
"feature7": {
"content": "",
"title": ""
"content": "__app__ enhavas Etherpad, realtempan kunlaboran redaktilon de teksto, kiu tre taŭgas por skribi notojn, afiŝojn kaj plu.",
"title": "Komunaj notoj"
},
"feature8": {
"content": "",
"title": ""
"content": "Lernu pri viaj uzantoj per facila integro kun Piwik, Google Analizo, kaj aliaj sistemoj observaj kaj statistikaj pri uzado.",
"title": "Uzada statistiko"
},
"go": "",
"join": "",
"privacy": "",
"roomname": "",
"roomnamePlaceHolder": "",
"sendFeedback": "",
"go": "IRI",
"join": "ALIĜI",
"privacy": "Privateco",
"roomname": "Enigu nomon de ĉambro",
"roomnamePlaceHolder": "nomo de ĉambro",
"sendFeedback": "Sendi rimarkojn",
"terms": ""
},
"startupoverlay": {
"policyText": "",
"title": ""
"title": "__app__ bezonas viajn mikrofonon kaj kameraon."
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
"text": "",
"rejoinKeyTitle": "Realiĝi"
},
"toolbar": {
"mute": "",
"videomute": "",
"authenticate": "",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "",
"sharescreen": "",
"fullscreen": "",
"sip": "",
"Settings": "",
"hangup": "",
"login": "",
"logout": "",
"dialpad": "",
"sharedVideoMutedPopup": "",
"micMutedPopup": "",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "",
"cameraDisabled": "",
"micDisabled": "",
"filmstrip": "",
"profile": "",
"raiseHand": ""
"addPeople": "",
"audioonly": "",
"mute": "Siletnigi / Malsilentigi",
"videomute": "Ŝalti / Malŝalti kameraon",
"authenticate": "Aŭtentigi",
"lock": "Ŝlosi / Malŝlosi ĉambron",
"invite": "Kunhavi la ligilon",
"chat": "Malfermi / Fermi babilon",
"etherpad": "Malfermi / Fermi komunan dokumenton",
"sharedvideo": "Kunhavi videon de YouTube",
"sharescreen": "Ŝalti / Malŝalti ekranvidadon",
"fullscreen": "Ŝalti / Malŝalti tutekranan reĝimon",
"sip": "Voki SIP numeron",
"Settings": "Agordoj",
"hangup": "Foriri",
"login": "Saluti",
"logout": "Adiaŭi",
"dialpad": "Malfermi / Fermi numerumilon",
"sharedVideoMutedPopup": "Via kunhavita video estas silentigita por<br/>ke vi povu paroli kun aliaj partoprenantoj.",
"micMutedPopup": "Via mikrofono estas silentigita por ke vi<br/>plene ĝuu la kunhavitan videon.",
"talkWhileMutedPopup": "Ĉu vi klopodas paroli? Vi estas silentigita.",
"unableToUnmutePopup": "Vi ne povas malsilentiĝi dum la video",
"cameraDisabled": "Kamerao ne disponeblas.",
"micDisabled": "Mikrofono ne estas disponebla",
"filmstrip": "Montri / Kaŝi videojn",
"profile": "Redakti vian profilon",
"raiseHand": "Levi / Mallevi vian manon"
},
"unsupportedBrowser": {
"appInstalled": "",
"appNotInstalled": "",
"downloadApp": "",
"joinConversation": "",
"startConference": ""
"appInstalled": "aŭ se vi jam havas ĝin<br /><strong>tiam</strong>",
"appNotInstalled": "Vi bezonas <strong>__app__</strong> por aliĝi al la interparolo per via portebla aparato",
"downloadApp": "Elŝuti la Aplikaĵon",
"joinConversation": "Aliĝi al la konversacio",
"startConference": "Komenci kunvenon"
},
"bottomtoolbar": {
"chat": "",
"filmstrip": "",
"contactlist": ""
"chat": "Malfermi / fermi babilon",
"filmstrip": "Montri / kaŝi videojn",
"contactlist": "Montri kaj inviti partoprenantojn"
},
"chat": {
"nickname": {
"title": "",
"popover": ""
"title": "Enigu kaŝnomon en la tekstujon sube",
"popover": "Elektu kaŝnomon"
},
"messagebox": ""
"messagebox": "Enigu tekston..."
},
"settings": {
"title": "",
"update": "",
"name": "",
"startAudioMuted": "",
"startVideoMuted": "",
"selectCamera": "",
"selectMic": "",
"selectAudioOutput": "",
"followMe": "",
"noDevice": "",
"noPermission": "",
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
"title": "Agordoj",
"update": "Ĝisdatigi",
"name": "Nomo",
"startAudioMuted": "Ĉiuj komenciĝas silentaj",
"startVideoMuted": "Ĉiuj komenciĝas kaŝitaj",
"selectCamera": "Kamerao",
"selectMic": "Mikrofono",
"selectAudioOutput": "Sona eligo",
"followMe": "Ĉiuj sekvas min",
"noDevice": "Neniu",
"cameraAndMic": "Kamerao kaj mikrofono",
"moderator": "KUNVENESTRO",
"password": "AGORDI PASVORTON",
"audioVideo": "SONO KAJ VIDO"
},
"profile": {
"title": "",
"setDisplayNameLabel": "",
"setEmailLabel": "",
"setEmailInput": ""
"title": "Profilo",
"setDisplayNameLabel": "Agordi vian videblan nomon",
"setEmailLabel": "Retpoŝtadreso ligita al Gravatar",
"setEmailInput": "Enigu retpoŝtadreson"
},
"videothumbnail": {
"editnickname": "",
"moderator": "",
"videomute": "",
"mute": "",
"kick": "",
"muted": "",
"domute": "",
"flip": "",
"remoteControl": ""
"editnickname": "Alklaku por redakti vian<br/> videblan nomon",
"moderator": "La posedanto de<br/>ĉi tiu kunveno",
"videomute": "Partoprenanto<br/>malŝaltis la kameraon",
"mute": "Partoprenanto silentigita",
"kick": "Forpeli",
"muted": "Silentigita",
"domute": "Silentigi",
"flip": "Renversi",
"remoteControl": "Defora rego"
},
"connectionindicator": {
"header": "",
"bitrate": "",
"packetloss": "",
"resolution": "",
"less": "",
"more": "",
"address": "",
"remoteport": "",
"remoteport_plural": "",
"localport": "",
"localport_plural": "",
"localaddress": "",
"localaddress_plural": "",
"remoteaddress": "",
"remoteaddress_plural": "",
"transport": "",
"bandwidth": "",
"na": ""
"header": "Konektaj datumoj",
"bitrate": "Bitrapido:",
"packetloss": "Paketperdo:",
"resolution": "Distingivo:",
"framerate": "",
"less": "Montri malpli",
"more": "Motri pli",
"address": "Adreso:",
"remoteport": "Fora pordo:",
"remoteport_plural": "Foraj pordoj:",
"localport": "Loka pordo:",
"localport_plural": "Lokaj pordoj:",
"localaddress": "Loka adreso:",
"localaddress_plural": "Lokaj adresoj:",
"remoteaddress": "Fora adreso:",
"remoteaddress_plural": "Foraj adresoj:",
"transport": "Transporto:",
"bandwidth": "Antaŭkalkulita kapacito:",
"na": "Revenu ĉi tien por konektaj informoj post la komenco de la kunveno",
"turn": ""
},
"notify": {
"disconnected": "",
"moderator": "",
"connected": "",
"somebody": "",
"me": "",
"focus": "",
"focusFail": "",
"grantedTo": "",
"disconnected": "malkonektita",
"moderator": "Kunvenestraj rajtoj donitaj!",
"connected": "konektita",
"somebody": "Iu",
"me": "Mi",
"focus": "Kunvena atento",
"focusFail": "__component__ ne atingelbas - reprovo post __ms__ sekundoj",
"grantedTo": "Kunvenestraj rajtoj donitaj al __to__!",
"grantedToUnknown": "",
"muted": "",
"mutedTitle": "",
"raisedHand": ""
"muted": "Vi komencis la interparolon silente.",
"mutedTitle": "Vi estas silentigita!",
"raisedHand": "Volas paroli."
},
"dialog": {
"add": "",
"kickMessage": "",
"popupError": "",
"passwordErrorTitle": "",
"passwordError": "",
"passwordError2": "",
"connectError": "",
"connectErrorWithMsg": "",
"incorrectPassword": "",
"connecting": "",
"copy": "",
"error": "",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "",
"failtoinstall": "",
"failedpermissions": "",
"add": "Aldoni",
"allow": "",
"kickMessage": "Oj! Vi estas forpelita de la kunveno!",
"popupError": "Via foliumilo baras ŝprucfenestrojn de ĉi tiu retejo. Bonvolu permesi ilin en la agordoj pri sekureco de via foliumilo kaj poste reprovi.",
"passwordErrorTitle": "Pasvorta Eraro",
"passwordError": "Ĉi tiu kunveno estas protektata per pasvorto. Nur la kunvenestro povas agordi pasvorton.",
"passwordError2": "Ĉi tiu kunveno ne estas protektata per pasvorto. Nur la kunvenestro povas agordi pasvorton.",
"connectError": "Oj! Io misokazis kaj ni ne povis vin konekti al la kunveno.",
"connectErrorWithMsg": "Oj! Io misokazis kaj ni ne povis vin konekti al la kunveno: __msg__",
"incorrectPassword": "Malĝusta pasvorto",
"connecting": "Konektanta",
"copy": "Kopii",
"error": "Eraro",
"createPassword": "Krei pasvorton",
"detectext": "Eraro serĉante la ekranvidadan kromprogramon.",
"failtoinstall": "Malsukcesis instalo de ekranvidada kromprogramo",
"failedpermissions": "Malsukcesis ekhavi permesojn por uzi la lokajn mikrofonon kaj/aŭ kameraon.",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "",
"lockTitle": "",
"lockMessage": "",
"warning": "",
"passwordNotSupported": "",
"internalErrorTitle": "",
"internalError": "",
"unableToSwitch": "",
"SLDFailure": "",
"SRDFailure": "",
"oops": "",
"currentPassword": "",
"passwordLabel": "",
"defaultError": "",
"passwordRequired": "",
"Ok": "",
"done": "",
"Remove": "",
"removePassword": "",
"shareVideoTitle": "",
"shareVideoLinkError": "",
"removeSharedVideoTitle": "",
"removeSharedVideoMsg": "",
"alreadySharedVideoMsg": "",
"WaitingForHost": "",
"WaitForHostMsg": "",
"IamHost": "",
"Cancel": "",
"Submit": "",
"retry": "",
"logoutTitle": "",
"logoutQuestion": "",
"sessTerminated": "",
"hungUp": "",
"joinAgain": "",
"Share": "",
"Save": "",
"recording": "",
"recordingToken": "",
"Dial": "",
"sipMsg": "",
"passwordCheck": "",
"passwordMsg": "",
"shareLink": "",
"settings1": "",
"settings2": "",
"settings3": "",
"yourPassword": "",
"Back": "",
"serviceUnavailable": "",
"gracefulShutdown": "",
"Yes": "",
"reservationError": "",
"reservationErrorMsg": "",
"password": "",
"userPassword": "",
"token": "",
"tokenAuthFailedTitle": "",
"tokenAuthFailed": "",
"displayNameRequired": "",
"enterDisplayName": "",
"extensionRequired": "",
"firefoxExtensionPrompt": "",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "",
"sorryFeedback": "",
"liveStreaming": "",
"streamKey": "",
"startLiveStreaming": "",
"stopStreamingWarning": "",
"stopRecordingWarning": "",
"stopLiveStreaming": "",
"stopRecording": "",
"doNotShowWarningAgain": "",
"doNotShowMessageAgain": "",
"permissionDenied": "",
"screenSharingPermissionDeniedError": "",
"micErrorPresent": "",
"cameraErrorPresent": "",
"cameraUnsupportedResolutionError": "",
"cameraUnknownError": "",
"cameraPermissionDeniedError": "",
"cameraNotFoundError": "",
"rejoinNow": "",
"maxUsersLimitReached": "La nombro da partoprenantoj jam atingis la maksimuman limon. La kunveno estas plena. Bonvolu provi poste!",
"lockTitle": "Ŝloso malsukcesis",
"lockMessage": "Ŝloso de la kunveno malsukcesis.",
"warning": "Averto",
"passwordNotSupported": "Ĉambraj pasvortoj ne estas subtenataj nun.",
"internalErrorTitle": "Interna eraro",
"internalError": "Oj! Io misokazis. Jen la eraro: [setRemoteDescription]",
"unableToSwitch": "Ne eblas ŝanĝi video-fluon.",
"SLDFailure": "Oj! Io misokazis kaj ni ne povis silentigi! (SLD Failure)",
"SRDFailure": "Oj! Io misokazis kaj ni ne povis kaŝi videon! (SRD Failure)",
"oops": "Oj!",
"currentPassword": "La nuna pasvorto estas",
"passwordLabel": "Pasvorto",
"defaultError": "Ia eraro okazis",
"passwordRequired": "Pasvorto necesas",
"Ok": "Bone",
"done": "Finita",
"Remove": "Forigi",
"removePassword": "Forigi pasvorton",
"shareVideoTitle": "Kunhavi videon",
"shareVideoLinkError": "Bonvolu doni ĝustan ligilon de YouTube",
"removeSharedVideoTitle": "Forigi kunhavatan videon",
"removeSharedVideoMsg": "Ĉu vi vere volas forigi vian kunhavatan videon?",
"alreadySharedVideoMsg": "Alia partoprenanto jam kunhavas videon. Ĉi tiu kunveno permesas kunhavi nur unu videon samtempe.",
"WaitingForHost": "Atendanta la gastigan komputilon ...",
"WaitForHostMsg": "La kunveno <b>__room__ </b> ankoraŭ ne komenciĝis. Se vi estas la kunvenestro, bonvolu aŭtentiĝi. Alie, bonvolu atendi la kunvenestron.",
"IamHost": "Mi estas la gastiganto",
"Cancel": "Rezigni",
"Submit": "Sendi",
"retry": "Reprovi",
"logoutTitle": "Adiaŭi",
"logoutQuestion": "Ĉu vi certe volas adiaŭi kaj fini la kunvenon?",
"sessTerminated": "Seanco Finita",
"hungUp": "Vi finis la vokon",
"joinAgain": "Realiĝi",
"Share": "Kunhavi",
"Save": "Konservi",
"recording": "Registranta",
"recordingToken": "Enigu registran ĵetonon",
"passwordCheck": "Ĉu vi certe volas forigi vian pasvorton?",
"passwordMsg": "Agordi pasvorton por ŝlosi vian ĉambron",
"shareLink": "Kunhavi ligilon al la voko",
"settings1": "Agordu vian kunvenon",
"settings2": "Partoprenantoj aliĝas silentaj",
"settings3": "Postuli kaŝnomojn<br/><br/>Agordi pasvorton por ŝlosi la ĉambron:",
"yourPassword": "Enigu novan pasvorton",
"Back": "Reen",
"serviceUnavailable": "Servo ne disponeblas",
"gracefulShutdown": "Nia servo nun estas eksterreta pro prizorgado. Bonvolu reprovi poste.",
"Yes": "Jes",
"reservationError": "Rezerva sistema eraro",
"reservationErrorMsg": "Kodo de eraro: __code__, mesaĝo: __msg__",
"password": "Enigu pasvorton",
"userPassword": "uzantopasvorto",
"token": "ĵetono",
"tokenAuthFailedTitle": "Aŭtentiga problemo",
"tokenAuthFailed": "Pardonu, vi ne rajtas aliĝi al ĉi tiu voko.",
"displayNameRequired": "Videbla nomo estas bezonata",
"enterDisplayName": "Bonvolu enigi vian videblan nomon",
"extensionRequired": "Kromprogramo bezonata:",
"firefoxExtensionPrompt": "Vi devas instali kromprogramon al Firefox por uzi ekranvidadon. Bonvolu reprovi preninte ĝin <a href='__url__'>de ĉi tie</a>!",
"feedbackHelp": "Viaj rimarkoj helpos al ni plibonigi la programaron.",
"feedbackQuestion": "Diru al ni pri via voko!",
"thankYou": "Dankon ĉar vi uzas __appName__!",
"sorryFeedback": "Ni bedaŭras pro tio. Ĉu vi volas diri pli al ni?",
"liveStreaming": "Tuja Elsendfluo",
"streamKey": "Elsendflua nomo/ŝlosilo",
"startLiveStreaming": "Komenci tujan elsendfluon.",
"stopStreamingWarning": "Ĉu vi certe volas fini la tujan elsendfluon?",
"stopRecordingWarning": "Ĉu vi certe volas fini la registradon?",
"stopLiveStreaming": "Fini tujan elsendfluon",
"stopRecording": "Fini registradon",
"doNotShowWarningAgain": "Ne montri ĉi tiun averton denove",
"doNotShowMessageAgain": "Ne montri ĉi tiun mesaĝon denove",
"permissionDenied": "Malpermesita",
"screenSharingPermissionDeniedError": "Vi ne donis la permeson vidigi vian ekranon.",
"micErrorPresent": "Okazis eraro konektante al via mikrofono.",
"cameraErrorPresent": "Okazis eraro konektante al via kamerao.",
"cameraUnsupportedResolutionError": "Via kamerao ne subtenas la bezonatan distingivon.",
"cameraUnknownError": "Ne eblas uzi la kameraon, pro kialo nekonata.",
"cameraPermissionDeniedError": "Vi ne permesis uzi vian kameraon. Vi povas aliĝi al la kunveno, sed aliaj ne povos vin vidi. Vi povas tion ŝanĝi per la kameraa butono en la adresbreto.",
"cameraNotFoundError": "Kamerao ne trovita.",
"cameraConstraintFailedError": "",
"micUnknownError": "",
"micPermissionDeniedError": "",
"micNotFoundError": "",
"micUnknownError": "Ne eblas uzi mikrofonon pro kialo nekonata.",
"micPermissionDeniedError": "Vi ne permesis uzi vian mikrofonon. Vi povas aliĝi al la kunveno, sed aliaj ne povos vin aŭdi. Vi povas tion ŝanĝi per la kameraa butono en la adresbreto.",
"micNotFoundError": "Mikrofono ne trovita.",
"micConstraintFailedError": "",
"micNotSendingData": "",
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "",
"micNotSendingData": "Ne eblas aliri vian mikrofonon. Bonvolu elekti alian aparaton de la agorda menuo aŭ relanĉi la aplikaĵon.",
"cameraNotSendingData": "Ne eblas aliri vian kameraon. Bonvolu kontroli, ĉu alia aplikaĵo ĝin uzas, aŭ elekti alian aparaton de la agorda menuo, aŭ relanĉi la aplikaĵon.",
"goToStore": "Iri al la retvendejo",
"externalInstallationTitle": "Kromprogramo bezonata",
"externalInstallationMsg": "Vi devas instali nian ekranvidadan kromprogramon.",
"inlineInstallationMsg": "Vi devas instali nian ekranvidadan kromprogramon.",
"inlineInstallExtension": "",
"muteParticipantTitle": "Ĉu silentigi ĉi tiun partoprenanton?",
"muteParticipantBody": "Vi ne povos ĝin malsilentigi, sed ĝi povas sin malsilentigi kiam ajn.",
"muteParticipantButton": "Silentigi",
"remoteControlTitle": "",
"remoteControlDeniedMessage": "",
"remoteControlAllowedMessage": "",
"remoteControlErrorMessage": "",
"remoteControlStopMessage": ""
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "__user__ rifuzis vian teleregan peton!",
"remoteControlAllowedMessage": "__user__ akceptis vian teleregan peton!",
"remoteControlErrorMessage": "Eraro petante teleregajn permesojn de __user__!",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "Telerega seanco finita!",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"email": {
"sharedKey": "",
"subject": "",
"body": "",
"and": ""
"sharedKey": [
"Ĉi tiu kunveno estas pasvorte protektita. Bonvolu uzi la jenan PINon aliĝante:",
"",
"",
"__sharedKey__",
"",
""
],
"subject": "Invito al __appName__ (__conferenceName__)",
"body": [
"Saluton! Mi volas vin inviti al __appName__ kunveno, kiun mi ĵus komencis.",
"",
"",
"Bonvolu alklaki al la jena ligilo por aliĝi al la kunveno.",
"",
"",
"__roomUrl__",
"",
"",
"__sharedKeyText__",
"Sciu, ke __appName__ nur funkcias bone kun __supportedBrowsers__, do vi bezonos unu el tiuj foliumiloj.",
"",
"",
"Ĝis la kunveno!"
],
"and": "kaj"
},
"connection": {
"ERROR": "",
"CONNECTING": "",
"RECONNECTING": "",
"CONNFAIL": "",
"AUTHENTICATING": "",
"AUTHFAIL": "",
"CONNECTED": "",
"DISCONNECTED": "",
"DISCONNECTING": "",
"ATTACHED": ""
"ERROR": "Eraro",
"CONNECTING": "Konektanta",
"RECONNECTING": "Reta eraro okazis. Rekonektanta...",
"CONNFAIL": "Konekto malsukcesis",
"AUTHENTICATING": "Aŭtentiganta",
"AUTHFAIL": "Aŭtentigo malsukcesis",
"CONNECTED": "Konektita",
"DISCONNECTED": "Malkonektita",
"DISCONNECTING": "Malkonektanta",
"ATTACHED": "Kunligita"
},
"recording": {
"pending": "",
"on": "",
"off": "",
"failedToStart": "",
"buttonTooltip": "",
"error": "",
"unavailable": ""
"pending": "Registrado atendas aliĝontan partoprenanton...",
"on": "Registranta",
"off": "Registrado finita",
"failedToStart": "Registrado malsukcesis komenci",
"buttonTooltip": "Komenci / Fini registradon",
"error": "Registrado malsukcesis. Bonvolu provi denove.",
"unavailable": "La registra servo nun estas neatingebla. Bonvolu reprovi poste."
},
"liveStreaming": {
"pending": "",
"on": "",
"off": "",
"unavailable": "",
"failedToStart": "",
"buttonTooltip": "",
"streamIdRequired": "",
"streamIdHelp": "",
"error": "",
"busy": ""
"pending": "Komencanta Tujan Elsendfluon...",
"on": "Tuja Elsendfluo",
"off": "Tuja Elsendfluo Finita",
"unavailable": "La tuja elsendflua servo nun estas neatingebla. Bonvolu reprovi poste.",
"failedToStart": "Tuja elsendfluo malsukcesis komenci",
"buttonTooltip": "Komenci / Fini tujan elsendfluon",
"streamIdRequired": "Bonvolu enigi la elsendfluan identigaĵon por komenci la tujan elsendfluon.",
"streamIdHelp": "Kie mi trovou ĉi tion?",
"error": "Tuja elsendfluo malsukcesis. Bonvolu provi denove.",
"busy": "Ĉiuj registriloj jam okupiĝas. Bonvolu reprovi poste."
},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "Nomo",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Numerumi",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "Aldoni",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -1,12 +1,19 @@
{
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"contactlist": "Participantes (__pcount__)",
"addParticipants": "Compartir el enlace",
"roomLocked": "Quienes llaman deben introducir una contraseña",
"roomUnlocked": "Cualquiera con el enlace puede unirse",
"passwordSetRemotely": "definido por otro participante",
"connectionsettings": "Ajustes de la conexión",
"poweredby": "potenciado por",
"feedback": "Danos tu opinión",
"poweredby": "proporcionado por",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "Por favor, califique la experiencia de su reunión.",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Tu conferencia está siendo creada...",
"me": "yo",
"speaker": "Orador",
@@ -14,106 +21,127 @@
"defaultNickname": "ej. Juana Rosas",
"defaultLink": "ej. __url__",
"callingName": "__name__",
"audioOnly": {
"audioOnly": "Solo audio",
"featureToggleDisabled": "El cambio de estado de __feature__ se encuentra desactivado mientras está el modo de solo audio"
},
"userMedia": {
"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"
"react-nativeGrantPermissions": "Seleccione <b><i>Permitir</i></b> cuando su navegador pida permisos.",
"chromeGrantPermissions": "Seleccione <b><i>Permitir</i></b> cuando su navegador pida permisos.",
"androidGrantPermissions": "Seleccione <b><i>Permitir</i></b> cuando su navegador pida permisos.",
"firefoxGrantPermissions": "Seleccione <b><i>Compartir Dispositivo Seleccionado</i></b> cuando su navegador pida permisos.",
"operaGrantPermissions": "Seleccione <b><i>Permitir</i></b> cuando su navegador pida permisos.",
"iexplorerGrantPermissions": "Seleccione <b><i>OK</i></b> cuando su navegador pida permisos.",
"safariGrantPermissions": "Seleccione <b><i>OK</i></b> cuando su navegador pida permisos.",
"nwjsGrantPermissions": "Por favor, conceda permisos para utilizar su cámara y micrófono",
"edgeGrantPermissions": "Seleccione <b><i>Sí</i></b> cuando su navegador pida permisos."
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
"raiseHand": "",
"pushToTalk": "",
"toggleScreensharing": "",
"toggleFilmstrip": "",
"toggleShortcuts": "",
"focusLocal": "",
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
"keyboardShortcuts": "Atajos de teclado",
"raiseHand": "Levantar o bajar la mano",
"pushToTalk": "Presione para hablar",
"toggleScreensharing": "Cambiar entre cámara y compartir pantalla",
"toggleFilmstrip": "Mostrar u ocultar videos",
"toggleShortcuts": "Muestra u oculta este menú de ayuda",
"focusLocal": "Centrarse en tu video",
"focusRemote": "Centrarse en el video de otro participante",
"toggleChat": "Abrir o cerrar panel de chat",
"mute": "Activar o desactivar micrófono",
"fullScreen": "Entrar / Salir de Pantalla completa",
"videoMute": "Activar o desactivar tu cámara",
"showSpeakerStats": "Mostrar estadísticas del locutor"
},
"welcomepage": {
"go": "IR",
"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 su navegador. Solo comparta el URL de su conferencia con otros para comenzar."
"content": "No se requiere ninguna descarga. __app__ funciona directamente con su navegador. Sólo comparta la URL de su conferencia con otros para comenzar.",
"title": "Sencillo de usar"
},
"feature2": {
"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."
"content": "Las Videoconferencias con múltiples participantes funcionan con tan solo 128 Kbps. Conferencias para compartir pantalla y sólo audio son posibles con mucho menos.",
"title": "Bajo consumo de Ancho de Banda"
},
"feature3": {
"title": "Código abierto",
"content": "__app__ está licenciado bajo la Licencia Apache. Eres libre de descargar, usar, modificar, y compartirlo de acuerdo a esta licencia."
"content": "__app__ está licenciado bajo la Licencia Apache. Eres libre de descargar, usar, modificar y compartirlo de acuerdo a esta licencia.",
"title": "Código abierto"
},
"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 del 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.",
"title": "Usuarios ilimitados"
},
"feature5": {
"title": "Compartir pantalla",
"content": "Es fácil compartir su pantalla con otros. __app__ es ideal para presentaciones en línea, conferencias y sesiones de soporte técnico."
"content": "Es fácil compartir su pantalla con otros. __app__ es ideal para presentaciones en línea, conferencias y sesiones de soporte técnico.",
"title": "Compartir pantalla"
},
"feature6": {
"title": "Salas seguras",
"content": "¿Necesita un poco de privacidad? Las salas de conferencias __app__ se pueden asegurar con una contraseña con el fin de excluir a los invitados no deseados y evitar interrupciones."
"content": "¿Necesita un poco de privacidad? Las salas de conferencias __app__ se pueden asegurar con una contraseña con el fin de excluir a los invitados no deseados y evitar interrupciones.",
"title": "Salas seguras"
},
"feature7": {
"title": "Notas compartidas",
"content": "__app__ incluye Etherpad, un editor de texto colaborativo, en tiempo real, que es genial para minutas de reuniones, redactar artículos, y más."
"content": "__app__ incluye Etherpad, un editor de texto colaborativo, en tiempo real, que es genial para minutas de reuniones, redactar artículos, y más.",
"title": "Notas compartidas"
},
"feature8": {
"title": "Estadísticas de uso",
"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."
}
"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.",
"title": "Estadísticas de uso"
},
"go": "IR",
"join": "UNIRSE",
"privacy": "Privacidad",
"roomname": "Introduzca un nombre de sala",
"roomnamePlaceHolder": "Nombre de la sala",
"sendFeedback": "Enviar comentarios",
"terms": "Términos"
},
"startupoverlay": {
"policyText": "",
"title": ""
"title": "__app__ requiere usar tu micrófono y cámara."
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
"text": "",
"rejoinKeyTitle": "Volver"
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "Activar / Desactivar Silencio",
"videomute": "",
"videomute": "Iniciar / detener cámara",
"authenticate": "Autenticar",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"lock": "Bloquear / desbloquear sala",
"invite": "Compartir el enlace",
"chat": "Abrir / cerrar sala de charla",
"etherpad": "Abrir / Cerrar documento compartido",
"sharedvideo": "Compartir un vídeo de YouTube",
"sharescreen": "",
"fullscreen": "",
"sharescreen": "Iniciar / Detener pantalla compartida",
"fullscreen": "Entrar / Salir de Pantalla completa",
"sip": "Llamar a un número SIP",
"Settings": "Ajustes",
"hangup": "",
"hangup": "Salir",
"login": "Inicio de sesión",
"logout": "Cerrar sesión",
"dialpad": "",
"sharedVideoMutedPopup": "Su vídeo compartido ha sido silenciado<br/>para que pueda hablar con otros participantes.",
"dialpad": "Abrir / Cerrar teclado de marcación.",
"sharedVideoMutedPopup": "Se ha silenciado tu video compartido <br/>para poder hablar con los otros participantes.",
"micMutedPopup": "Su micrófono ha sido silenciado para que<br/>pueda disfrutar completamente de su vídeo compartido.",
"talkWhileMutedPopup": "",
"talkWhileMutedPopup": "Tratas de hablar? Estás silenciado.",
"unableToUnmutePopup": "No puede silenciar su micrófono mientras el vídeo compartido está activo.",
"cameraDisabled": "Cámara no disponible",
"micDisabled": "Micrófono no disponible",
"filmstrip": "",
"profile": "",
"raiseHand": ""
"filmstrip": "Mostrar / Ocultar videos",
"profile": "Editar tu perfil",
"raiseHand": "Levantar / Bajar tu mano"
},
"unsupportedBrowser": {
"appInstalled": "o si ya la tiene<br /> <strong>entonces</strong>",
"appNotInstalled": "Necesita <strong>__app__</strong> para unirse a la conversación en su móvil",
"downloadApp": "Descargar la App",
"joinConversation": "Unirse a la conversación",
"startConference": "Iniciar una conferencia"
},
"bottomtoolbar": {
"chat": "Abrir / cerrar sala de charlas",
"filmstrip": "Mostrar / ocultar videos",
"contactlist": ""
"contactlist": "Ver e invitar participantes"
},
"chat": {
"nickname": {
@@ -133,18 +161,16 @@
"selectAudioOutput": "Salida de audio",
"followMe": "Todos me siguen",
"noDevice": "Ninguno",
"noPermission": "Permiso para usar el dispositivo no permitido",
"cameraAndMic": "Cámara y micrófono",
"moderator": "MODERADOR",
"password": "ESTABLECER CONTRASEÑA",
"audioVideo": "AUDIO Y VIDEO",
"setPasswordLabel": "Bloquear su cuarto con contraseña"
"audioVideo": "AUDIO Y VIDEO"
},
"profile": {
"title": "",
"title": "Perfil",
"setDisplayNameLabel": "Establecer nombre a mostrar",
"setEmailLabel": "Establecer su gravatar",
"setEmailInput": ""
"setEmailInput": "Introducir e-mail"
},
"videothumbnail": {
"editnickname": "Presione para editar tu <br/>nombre",
@@ -154,13 +180,15 @@
"kick": "Expulsar",
"muted": "Silenciado",
"domute": "Silenciar",
"flip": "Voltear"
"flip": "Voltear",
"remoteControl": "Control remoto"
},
"connectionindicator": {
"header": "",
"header": "Conexión de datos",
"bitrate": "Tasa de bits:",
"packetloss": "Pérdida de paquetes:",
"resolution": "Resolución:",
"framerate": "",
"less": "Mostrar menos",
"more": "Ver más",
"address": "Dirección:",
@@ -174,7 +202,8 @@
"remoteaddress_plural": "Direcciones remotas:",
"transport": "Transporte:",
"bandwidth": "Ancho de banda estimado:",
"na": "Una vez que se inicia la conferencia, volver aquí para ver información de la conexión"
"na": "Una vez que se inicia la conferencia, volver aquí para ver información de la conexión",
"turn": ""
},
"notify": {
"disconnected": "desconectado",
@@ -190,31 +219,30 @@
"mutedTitle": "¡Estás silenciado!",
"raisedHand": "Desearía hablar."
},
"\u0005notify": {},
"dialog": {
"add": "",
"add": "Añadir",
"allow": "Permitir",
"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": "",
"passwordErrorTitle": "Error de contraseña",
"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": "¡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": "",
"incorrectPassword": "La contraseña es incorrecta",
"connecting": "Conectando",
"copy": "Copiar",
"error": "Error",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"createPassword": "Crear una contraseña",
"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": "",
"conferenceReloadTitle": "Desafortunadamente, algo salió mal.",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectTitle": "Ha sido desconectado.",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"rejoinNow": "",
"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.",
@@ -226,14 +254,14 @@
"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": "",
"currentPassword": "La contraseña actual es ",
"passwordLabel": "Contraseña",
"defaultError": "Hubo algún tipo de error",
"passwordRequired": "Se requiere una contraseña",
"Ok": "Aceptar",
"done": "",
"done": "Ninguno",
"Remove": "Eliminar",
"removePassword": "",
"removePassword": "Eliminar contraseña",
"shareVideoTitle": "Compartir un vídeo",
"shareVideoLinkError": "Por favor introduzca un enlace correcto de Youtube.",
"removeSharedVideoTitle": "Eliminar video compartido",
@@ -243,7 +271,7 @@
"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": "",
"Submit": "Enviar",
"retry": "Reintentar",
"logoutTitle": "Cerrar sesión",
"logoutQuestion": "¿Está seguro que desea salir y detener la conferencia?",
@@ -254,11 +282,9 @@
"Save": "Guardar",
"recording": "Grabando",
"recordingToken": "Introduzca el token de grabación",
"Dial": "Marcar",
"sipMsg": "Introduzca número SIP",
"passwordCheck": "¿Realmente desea eliminar su contraseña?",
"passwordMsg": "Indique una contraseña para bloquear su sala",
"shareLink": "",
"shareLink": "Compartir el enlace a la llamada",
"settings1": "Configure su conferencia",
"settings2": "Los participantes se unieron silenciados",
"settings3": "Solicitar apodos<br/><br/>Establecer una contraseña para bloquear la sala:",
@@ -274,11 +300,10 @@
"token": "token",
"tokenAuthFailedTitle": "Problema de autenticación",
"tokenAuthFailed": "Lo siento, usted no tiene permiso para unirse a este llamada.",
"displayNameRequired": "",
"displayNameRequired": "Se requiere un nombre a mostrar",
"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__!",
@@ -291,7 +316,7 @@
"stopLiveStreaming": "Parar retransmisión en directo",
"stopRecording": "Parar grabación",
"doNotShowWarningAgain": "No volver a mostrar esta advertencia",
"doNotShowMessageAgain": "",
"doNotShowMessageAgain": "No mostrar este mensaje de nuevo",
"permissionDenied": "Permiso Denegado",
"screenSharingPermissionDeniedError": "No ha otorgado permiso para compartir su pantalla.",
"micErrorPresent": "Hubo un error conectando su micrófono.",
@@ -310,10 +335,25 @@
"goToStore": "Ir al webstore",
"externalInstallationTitle": "Extensión requerida",
"externalInstallationMsg": "Necesita instalar nuestra extensión para compartir escritorio.",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Silenciar"
"inlineInstallationMsg": "Necesita instalar nuestra extensión para compartir escritorio.",
"inlineInstallExtension": "",
"muteParticipantTitle": "¿Silenciar a este participante?",
"muteParticipantBody": "No podrás activarles el sonido, pero ellos pueden activar su sonido en cualquier momento.",
"muteParticipantButton": "Silenciar",
"remoteControlTitle": "",
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "__user__ ha rechazado tu solicitud de control remoto!",
"remoteControlAllowedMessage": "__user__ ha aceptado tu solicitud de control remoto!",
"remoteControlErrorMessage": "Ha ocurrido un error tratando de solicitar permiso de control remoto de __user__!",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "La sesión de control remoto ha finalizado!",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"\u0005dialog": {},
"email": {
"sharedKey": [
"Esta conferencia está protegida con contraseña. Utiliza el siguiente pin cuando te unas:",
@@ -359,7 +399,7 @@
"on": "Grabando",
"off": "Grabación detenida",
"failedToStart": "No se pudo iniciar la grabación",
"buttonTooltip": "",
"buttonTooltip": "Iniciar / parar grabación",
"error": "Falla de grabación. Vuelva a intentarlo.",
"unavailable": "El servicio de grabación no está disponible. Inténtelo más tarde."
},
@@ -369,9 +409,76 @@
"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": "",
"buttonTooltip": "Iniciar / detener emisión en directo",
"streamIdRequired": "Por favor introduzca el identificador de emisión para poder iniciar la emisión en directo",
"streamIdHelp": "Donde encuentro esto?",
"error": "Falló el video en vivo. Por favor, vuelva a intentarlo.",
"busy": "Todos los grabadores están ocupados. Por favor intente más tarde."
},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "Nombre",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "Añadir una contraseña",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "Añadir una contraseña",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"\u0005invite": {},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Marcar",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "Añadir",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -3,32 +3,38 @@
"addParticipants": "Partager le lien",
"roomLocked": "Les appelants doivent saisir un mot de passe",
"roomUnlocked": "N'importe qui avec le lien peut rejoindre",
"passwordSetRemotely": "défini par un quelqu'un d'autre",
"passwordSetRemotely": "défini par un autre participant",
"connectionsettings": "Paramètres de connexion",
"poweredby": "Produit par",
"feedback": "Donnez-nous votre avis",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "Veuillez évaluer votre réunion.",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Votre conférence est en cours de création...",
"me": "moi",
"speaker": "Haut-parleur",
"raisedHand": "Aimerais prendre la parole",
"raisedHand": "Aimerait prendre la parole",
"defaultNickname": "ex. Jean Dupont",
"defaultLink": "ex. __url__",
"callingName": "__name__",
"audioOnly": {
"audioOnly": "Audio seulement",
"featureToggleDisabled": "Le basculement de __feature__ est désactivé en mode audio uniquement",
"howToDisable": "Le mode audio uniquement est actuellement activé. Cliquez sur le bouton audio uniquement dans la barre d'outils pour désactiver la fonction."
"audioOnly": "Audio uniquement",
"featureToggleDisabled": "Le basculement de __feature__ est désactivé en mode audio uniquement"
},
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
"androidGrantPermissions": "",
"firefoxGrantPermissions": "Sélectionnez<b><i>Partager le périphérique sélectionné</i></b>lorsque votre navigateur demande des autorisations.",
"operaGrantPermissions": "Sélectionner <b><i>Autoriser</i></b> Lorsque votre navigateur demande des autorisations.",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "Sélectionner <b><i>OK</i></b> quand le navigateur demande les permissions.",
"react-nativeGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande des autorisations.",
"chromeGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande des autorisations.",
"androidGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande des autorisations.",
"firefoxGrantPermissions": "Sélectionnez <b><i>Partager le périphérique sélectionné</i></b> lorsque votre navigateur demande des autorisations.",
"operaGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande des autorisations.",
"iexplorerGrantPermissions": "Sélectionnez <b><i>OK</i></b> quand le navigateur demande les permissions.",
"safariGrantPermissions": "Sélectionnez <b><i>OK</i></b> quand le navigateur demande les permissions.",
"nwjsGrantPermissions": "Merci d'autoriser le partage de votre camera et microphone",
"edgeGrantPermissions": "Sélectionner <b><i>Oui</i></b> quand le navigateur demande les permissions."
"edgeGrantPermissions": "Sélectionnez <b><i>Oui</i></b> quand le navigateur demande les permissions."
},
"keyboardShortcuts": {
"keyboardShortcuts": "Raccourcis clavier",
@@ -92,11 +98,12 @@
"title": " "
},
"suspendedoverlay": {
"title": "Votre vidéo-conférence a été arrêté parce que votre ordinateur s'est mis en veille.",
"text": "Appuyez sur <i>Rejoindre</i> pour vous reconnecter à la conversation",
"title": "",
"text": "",
"rejoinKeyTitle": "Rejoindre"
},
"toolbar": {
"addPeople": "",
"audioonly": "Activer / Désactiver le mode audio uniquement (économiser de la bande passante)",
"mute": "Muet / Actif",
"videomute": "Démarrer / Arrêter la caméra",
@@ -172,7 +179,7 @@
"mute": "Un participant a coupé son micro",
"kick": "Exclure",
"muted": "Muet",
"domute": "Vous ne pourrez plus réactiver leurs micros, mais ils peuvent l'activer par eux-même à tout moment.",
"domute": "Couper le micro",
"flip": "Contrôle à distance",
"remoteControl": "Contrôle à distance"
},
@@ -195,7 +202,8 @@
"remoteaddress_plural": "Adresses distantes :",
"transport": "Transport :",
"bandwidth": "Bande passante estimée :",
"na": "Revenez ici pour afficher les informations de connexion une fois la conférence démarrée"
"na": "Revenez ici pour afficher les informations de connexion une fois la conférence démarrée",
"turn": ""
},
"notify": {
"disconnected": "déconnecté",
@@ -273,8 +281,6 @@
"Save": "Sauvegarder",
"recording": "Enregistrement",
"recordingToken": "Saisissez un jeton d'enregistrement",
"Dial": "Composer",
"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",
"shareLink": "Partager le lien de la conférence",
@@ -297,7 +303,6 @@
"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> !",
"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__ !",
@@ -329,6 +334,8 @@
"goToStore": "Aller sur le webstore",
"externalInstallationTitle": "Extension requise : ",
"externalInstallationMsg": "Vous devez installer notre extension de partage de bureau.",
"inlineInstallationMsg": "Vous devez installer notre extension de partage de bureau.",
"inlineInstallExtension": "",
"muteParticipantTitle": "Couper le micro de ce participant?",
"muteParticipantBody": "Vous ne pourrez plus réactiver leurs micros, mais ils peuvent l'activer par eux-même à tout moment.",
"muteParticipantButton": "Couper le micro",
@@ -338,6 +345,7 @@
"remoteControlDeniedMessage": "__user__ a refusé votre demande de prise en main à distance!",
"remoteControlAllowedMessage": "Une erreur s'est produite lors de la demande dautorisation de prise en main à distance avec __user__!",
"remoteControlErrorMessage": "Une erreur s'est produite lors de la demande dautorisation de prise en main à distance avec __user__!",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "La prise en main à distance est terminée!",
"close": "Fermer",
"shareYourScreen": "Partagez votre écran",
@@ -422,15 +430,52 @@
},
"invite": {
"addPassword": "Ajouter un mot de passe",
"dialInNumbers": "Numéros de téléphone à composer",
"errorFetchingNumbers": "Échec d'obtention des numéros",
"callNumber": "Appeler le __number__",
"enterID": "Saisissez l'identifiant: __conferenceID__ suivi de # pour rejoindre avec un téléphone",
"howToDialIn": "Pour rejoindre avec un téléphone, utilisez un des des numéros suivants et l'identifiant de la conférence",
"hidePassword": "Cacher le mot de passe",
"inviteTo": "inviter des participants à __conferenceName__",
"loadingNumbers": "Chargement…",
"invitedYouTo": "__userName__ vous a invité(e) à la conférence __inviteURL__",
"locked": "Cet appel est verrouillé. les nouveaux interlocuteurs devraient avoir le lien et saisir le mot de passe pour rejoindre.",
"noNumbers": "Aucun numéro disponible",
"numbersDisabled": "La numérotation a été désactivée",
"showPassword": "Afficher le mot de passe",
"unlocked": "Cet appel est verrouillé. Tout nouveau participant avec un lien peut rejoindre l'appel."
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "HD",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "SD",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Composer",
"dialOut": "Appeler un numéro de téléphone",
"statusMessage": "est maintenant __status__",
"enterPhone": "Saisissez un numéro de téléphone",
"phoneNotAllowed": "Désolé, nous ne supportons pas encore cette destination!"
},
"addPeople": {
"add": "Ajouter",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -1,12 +1,19 @@
{
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"contactlist": "Մասնակիցներ (__pcount__)",
"addParticipants": "Կիսվել URL -ով",
"roomLocked": "Զանգողները պետք է ներմուծեն գաղտնաբառը",
"roomUnlocked": "Յուրաքանչյուրը ով ունի URL կարող է միանալ",
"passwordSetRemotely": "Սահմանվել է մեկ այլ մասնակցի կողմից",
"connectionsettings": "Միացման կարգավորումներ",
"poweredby": "Հիմնված է",
"feedback": "Հայտնեք ձեր կարծիքը",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "Խնդրում ենք ներկայացրեք Ձեր հանդիպման փորձը",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Ձեր կոնֆերանսը այժմ ստեղծվում է...",
"me": "ես",
"speaker": "Հռետոր",
@@ -14,106 +21,127 @@
"defaultNickname": "օրինակ՝ Պողոս Պողոսյան",
"defaultLink": "օրինակ՝ __url__",
"callingName": "__անուն__",
"audioOnly": {
"audioOnly": "",
"featureToggleDisabled": ""
},
"userMedia": {
"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": "Խնդրում ենք տրամադրել տեսախցիկը և խոսափողը օգտագործելու թույլտվություններ"
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
"androidGrantPermissions": "",
"firefoxGrantPermissions": "",
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": "Խնդրում ենք տրամադրել տեսախցիկը և խոսափողը օգտագործելու թույլտվություններ",
"edgeGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
"raiseHand": "",
"pushToTalk": "",
"toggleScreensharing": "",
"toggleFilmstrip": "",
"toggleShortcuts": "",
"focusLocal": "",
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
"keyboardShortcuts": "Ստեղնաշարի դյուրանցումներ (shortcuts)",
"raiseHand": "Բարձրացնել կամ իջեցնել ձեր ձեռքը",
"pushToTalk": "Սեղմեք խոսելու համար",
"toggleScreensharing": "Անցնել ֆոտոխցիկի և էկրանի փոխանակման միջև",
"toggleFilmstrip": "Ցույց տալ կամ թաքցնել տեսանյութերը",
"toggleShortcuts": "Ցույց տալ կամ թաքցնել այս օգնության մենյուն",
"focusLocal": "Կենտրոնանալ Ձեր տեսանյութի վրա",
"focusRemote": "Կենտրոնանալ մյուս մասնակցի տեսանյութի վրա",
"toggleChat": "Բացել կամ փակել չատի պանելը",
"mute": "Անջատել կամ միացնել խոսափողը",
"fullScreen": "Ամբողջ Էկրանի ռեժիմը միացնել/անջատել",
"videoMute": "Անջատել կամ միացնել տեսախցիկը",
"showSpeakerStats": ""
},
"welcomepage": {
"go": "ՄՈՒՏՔ",
"roomname": "Մուտքագրեք սենյակի անունը",
"disable": "Այլևս ցույց չտալ այս էջը",
"feature1": {
"title": "Հեշտ է օգտվել",
"content": "Ոչ մի լրացուցիչ ներբեռնումներ: __apple__ աշխատում է անմիջապես Ձեր բրաուզերում: Պարզապես հայտնեք ձեր կոնֆերանսի URL հասցեն ուրիշներին և դուք կապի մեջ էք:"
"content": "Ոչ մի լրացուցիչ ներբեռնումներ: __apple__ աշխատում է անմիջապես Ձեր բրաուզերում: Պարզապես հայտնեք ձեր կոնֆերանսի URL հասցեն ուրիշներին և դուք կապի մեջ էք:",
"title": "Հեշտ է օգտվել"
},
"feature2": {
"title": "Պետք չէ արագ կապ",
"content": "Բազմամասնակից վիդեո կոնֆերանսները աշխատում են ընդամենը 128 Կբ/վ թողունակությամբ: Իսկ միայն ձայնի կամ էկրանի ցուցադրման դեպքում՝ ավելի քիչ:"
"content": "Բազմամասնակից վիդեո կոնֆերանսները աշխատում են ընդամենը 128 Կբ/վ թողունակությամբ: Իսկ միայն ձայնի կամ էկրանի ցուցադրման դեպքում՝ ավելի քիչ:",
"title": "Պետք չէ արագ կապ"
},
"feature3": {
"title": "Բաց կոդ",
"content": "_app_ լիցենզավորված է Apache լիցենզիայով: Կարող էք ազատորեն ներբեռնել, օգտագործել, ձևափոխել և կիսվել դրանով այդ լիցենզիայի համապատասխան:"
"content": "_app_ լիցենզավորված է Apache լիցենզիայով: Կարող էք ազատորեն ներբեռնել, օգտագործել, ձևափոխել և կիսվել դրանով այդ լիցենզիայի համապատասխան:",
"title": "Բաց կոդ"
},
"feature4": {
"title": "Օգտվողների թիվը սահմանափակ չէ",
"content": "Չկան արհեստական սահմանափակումներ օգտագործողների կամ կոնֆերանսի մասնակիցների թվի համար: Սահմանափակող գործոնները՝ միայն սերվերի հզորությունն ու թողունակությունն են:"
"content": "Չկան արհեստական սահմանափակումներ օգտագործողների կամ կոնֆերանսի մասնակիցների թվի համար: Սահմանափակող գործոնները՝ միայն սերվերի հզորությունն ու թողունակությունն են:",
"title": "Օգտվողների թիվը սահմանափակ չէ"
},
"feature5": {
"title": "Էկրանի ցուցադրում",
"content": "Շատ հեշտ է ցուցադրել Ձեր էկրանը ուրիշներին: __app__ իդեալական է օնլայն ներկայացումների, դասախոսությունների և տեխնիկական սպասարկման համար:"
"content": "Շատ հեշտ է ցուցադրել Ձեր էկրանը ուրիշներին: __app__ իդեալական է օնլայն ներկայացումների, դասախոսությունների և տեխնիկական սպասարկման համար:",
"title": "Էկրանի ցուցադրում"
},
"feature6": {
"title": "Փակ սենյակներ",
"content": "Պե՞տք է առանձնանալ: __app__ կոնֆերանսում կարող էք փակվել սենյակը գաղտնաբառով, որպեսզի անսպասելի հյուրեր կամ ընդհատումներ չունենաք:"
"content": "Պե՞տք է առանձնանալ: __app__ կոնֆերանսում կարող էք փակվել սենյակը գաղտնաբառով, որպեսզի անսպասելի հյուրեր կամ ընդհատումներ չունենաք:",
"title": "Փակ սենյակներ"
},
"feature7": {
"title": "Համատեղ նշումներ",
"content": "Շնորհիվ __app__ -ում ընդգրկված Etherpad տեքստային խմբագրի, իրական ժամանակում կարող էք համատեղ նշումներ կատարել, ինչը շատ հարմար է հանդիպումն արձանագրելու, հոդվածներ գրելու և այլ նպատակների համար:"
"content": "Շնորհիվ __app__ -ում ընդգրկված Etherpad տեքստային խմբագրի, իրական ժամանակում կարող էք համատեղ նշումներ կատարել, ինչը շատ հարմար է հանդիպումն արձանագրելու, հոդվածներ գրելու և այլ նպատակների համար:",
"title": "Համատեղ նշումներ"
},
"feature8": {
"title": "Օգտագործման վիճակագրություն",
"content": "Օգտագործման վիճակագրություն կարելի է ստանալ հեշտ ինտեգրվող Piwik, Google Analytics կամ այլ մոնիտորինգի համակարգերի միջոցով:"
}
"content": "Օգտագործման վիճակագրություն կարելի է ստանալ հեշտ ինտեգրվող Piwik, Google Analytics կամ այլ մոնիտորինգի համակարգերի միջոցով:",
"title": "Օգտագործման վիճակագրություն"
},
"go": "ՄՈՒՏՔ",
"join": "Միանալ",
"privacy": "Գաղտնիություն",
"roomname": "Մուտքագրեք սենյակի անունը",
"roomnamePlaceHolder": "սենյակի անուն",
"sendFeedback": "Ուղարկել կարծիք",
"terms": "Տերմիններ"
},
"startupoverlay": {
"policyText": "",
"title": ""
"title": "__app__ ցանկանում է օգտագործել Ձեր խոսափողը և տեսախցիկը."
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
"text": "",
"rejoinKeyTitle": "Միանալ կրկին"
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "Ձայնը Միացնել/Անջատել ",
"videomute": "",
"videomute": "Տեսախցիկը Միացնել/Անջատել",
"authenticate": "Վավերացում",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"lock": "Փակել/բացել սենյակը",
"invite": "Կիսվել URL -ով",
"chat": "Բացել/փակել չատը",
"etherpad": "Բացել/փակել տարածված փաստաթուղթը",
"sharedvideo": "Կիսվել YouTube-ի նյութով",
"sharescreen": "",
"fullscreen": "",
"sharescreen": "Միացնել/ անջատել էկրանի տարածումը",
"fullscreen": "Ամբողջ Էկրանի ռեժիմը միացնել/անջատել",
"sip": "Զանգել SIP համարով",
"Settings": "Կարգավորումներ",
"hangup": "",
"hangup": "Դուրս գալ",
"login": "Մուտք",
"logout": "Ելք",
"dialpad": "",
"dialpad": "Բացել/փակել զանգի պատուհանը",
"sharedVideoMutedPopup": "Ձեր ցուցադրված տեսանյութի ձայնը անջատված է, այնպես որ <br />, կարող եք խոսել մյուս մասնակիցների հետ:",
"micMutedPopup": "Ձեր խոսափողը անջատված է՝<br/> կարող եք լիովին վայելել ձեր ցուցադրված տեսանյութը:",
"talkWhileMutedPopup": "",
"talkWhileMutedPopup": "Փորձու՞մ եք խոսել: Ձեր ձայնը անջատված է:",
"unableToUnmutePopup": "Դուք չեք կարող միացնել ձայնը, քանի դեռ միանցված է ցուցադրվող տեսանյութը:",
"cameraDisabled": "Տեսախցիկը հասանելի չէ",
"micDisabled": "Խոսափողը հասանելի չէ",
"filmstrip": "",
"profile": "",
"raiseHand": ""
"filmstrip": "Ցույց տալ/թաքցնել տեսանյութները",
"profile": "Փոխել քո Էջը",
"raiseHand": "Բարձրացնել կամ իջեցնել քո ձեռքը"
},
"unsupportedBrowser": {
"appInstalled": "կամ եթե դուք արդեն ունեք դա<br /><strong>ապա</strong>",
"appNotInstalled": "Ձեզ պետք է <strong>__app__</strong> այս հանդիպմանը Ձեր հեռախոսից միանալու համար:",
"downloadApp": "Բեռնել հավելվածը",
"joinConversation": "Միանալ հանդիպմանը",
"startConference": "Սկսել հանդիպումը"
},
"bottomtoolbar": {
"chat": "Բացել/փակել չատը",
"filmstrip": "Ցույց տալ/թաքցնել տեսանյութները",
"contactlist": ""
"contactlist": "Դիտել և հրավիրել մասնակիցների"
},
"chat": {
"nickname": {
@@ -133,18 +161,16 @@
"selectAudioOutput": "Ձայնային ելք",
"followMe": "Բոլորը հետևում են ինձ",
"noDevice": "Ոչինչ",
"noPermission": "Սարքը օգտագործելու թույլտվությունը տրված չէ",
"cameraAndMic": "Տեսախցիկ և խոսափող",
"moderator": "MODERATOR",
"password": "Դնել գաղտնաբառ",
"audioVideo": "ձայն և տեսանյութ",
"setPasswordLabel": "Փակել սենյակը գաղտնաբառով"
"audioVideo": "ձայն և տեսանյութ"
},
"profile": {
"title": "",
"title": "Պրոֆայլ",
"setDisplayNameLabel": "Դնել Ձեր երևացող անունը",
"setEmailLabel": "Սահմանեք Ձեր gravatar էլ.փոստը",
"setEmailInput": ""
"setEmailInput": "Մուտքագրեք էլ.հասցե"
},
"videothumbnail": {
"editnickname": "Սեղմեք Ձեր անունը <br/>փոխելու համար",
@@ -154,13 +180,15 @@
"kick": "Դուրս հանել",
"muted": "Ձայնը անջատված է",
"domute": "Անջատել ձայնը",
"flip": "Շրջել"
"flip": "Շրջել",
"remoteControl": "հեռահար կառավարում"
},
"connectionindicator": {
"header": "",
"header": "Կապի տվյալներ",
"bitrate": "Բիթրեյթ",
"packetloss": "Փաթեթների կորուստ՝",
"resolution": "Որակ՝",
"framerate": "",
"less": "Ցույց տալ ավելի քիչ",
"more": "Ցույց տալ ավելի շատ",
"address": "Հասցե՝",
@@ -170,7 +198,8 @@
"remoteaddress": "Հեռակա հասցե՝Հեռակա հասցեներ՝",
"transport": "Տրանսպորտ՝",
"bandwidth": "Մոտավոր թողունակություն՝",
"na": "Միացման տվյալները հասանելի կլինեն այստեղ կոնֆերանսի մեկնարկից հետո:"
"na": "Միացման տվյալները հասանելի կլինեն այստեղ կոնֆերանսի մեկնարկից հետո:",
"turn": ""
},
"notify": {
"disconnected": "անջատված է",
@@ -181,27 +210,26 @@
"focus": "Կոնֆերանսի կենտրոնացումը",
"focusFail": "__component__ հասանելի չէ - փորձեք կրկին __ms__ վայրկյանից",
"grantedTo": "Կարգավորիչի իրավունքները տրամադրված է __to__-ին",
"grantedToUnknown": "Կարգավորիչի իրավունքները տրամադրված է $t(somebody)! -ին",
"grantedToUnknown": "",
"muted": "Դուք խոսակցությունը սկսեցիք անջատած ձայնով:",
"mutedTitle": "Ձեր ձայնը անջատվա'ծ է",
"raisedHand": "Ցանկանում է խոսել"
},
"dialog": {
"add": "",
"add": "Ավելացնել",
"allow": "",
"kickMessage": "Վա՜յ: Ձեզ դուրս հանեցին հանդիպումից:",
"popupError": "Ձեր բրաուզերը արգելափակել է թռուցիկ(popup) պատուհանները այս կայքում: Խնդրում ենք միացրեք թռուցիկները Ձեր բրաուզերի անվտանգության կարգավորումներում և կրկին փորձեք:",
"passwordErrorTitle": "",
"passwordErrorTitle": "Գաղտնաբառի սխալ",
"passwordError": "Այս խոսակցությունը այս պահին պաշտպանված է գաղտնաբառով:Միայն կոնֆերանսի սեփականատերը կարող է սահմանել գաղտնաբառ:",
"passwordError2": "Այս խոսակցությունը այս պահին պաշտպանված չէ գաղտնաբառով:Միայն կոնֆերանսի սեփականատերը կարող է սահմանել գաղտնաբառ:",
"connectError": "Ու՜պս! Ինչոր բան այն չէ և մենք չկարողացանք միանալ կոնֆերանսին:",
"connectErrorWithMsg": "Ու՜պս! Ինչոր բան այն չէ և մենք չկարողացանք միանալ կոնֆերանսին: __msg__",
"incorrectPassword": "",
"incorrectPassword": "Գաղտնաբառը սխալ է",
"connecting": "Միանում է...",
"copy": "Պատճենել",
"error": "Սխալ",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"createPassword": "Ստեղծել գաղտնաբառ։",
"detectext": "Սխալ, երբ փորձում է հայտնաբերել էկրանի ցուցադրման ընդլայնումը:",
"failtoinstall": "Չհաջողվեց տեղադրել էկրանի ցուցադրման ընդլայնումը",
"failedpermissions": "Չհաջողվեց ստանալ թույլտվություն օգտագործելու տեղի խոսափողը և/ կամ տեսախցիկը:",
@@ -209,8 +237,7 @@
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"rejoinNow": "",
"maxUsersLimitReached": "Մասնակիցների առավելագույն թիվը արդեն լրացել է: Մասնակիցները արդեն հավաքվել են: Խնդրում ենք փորձեք ավելի ուշ:",
"lockTitle": "Փակումը ձախողվեց",
"lockMessage": "Ձախողվեց արգելափակել կոնֆերանսը:",
@@ -221,15 +248,15 @@
"unableToSwitch": "Անհնար է անցնել վիդեո հոսքին:",
"SLDFailure": "Ու՜պս: Ինչ-որ բան գնաց սխալ, և մենք չկարողացանք անջատել ձայնը (SLD Failure)",
"SRDFailure": "Ու՜պս: Ինչ-որ բան գնաց սխալ, և մենք չկարողացանք անջատել տեսահոսքը (SRD Failure)",
"oops": "Ու՜պս:",
"currentPassword": "",
"passwordLabel": "",
"oops": "Գաղտնաբառ",
"currentPassword": "Վերջին գաղտնաբառն է",
"passwordLabel": "Գաղտնաբառ",
"defaultError": "Առկա էր որոշակի սխալ",
"passwordRequired": "Պահանջվում է գաղտնաբառ",
"Ok": "Ok",
"done": "",
"done": "Կատարված է",
"Remove": "Հեռացնել",
"removePassword": "",
"removePassword": "Ջնջել գաղտնաբառը",
"shareVideoTitle": "Տարածել տեսանյութը",
"shareVideoLinkError": "Խնդրում ենք ներկայացնել ճիշտ Youtube հղում:",
"removeSharedVideoTitle": "Հեռացնել տարածված տեսանյութը",
@@ -239,7 +266,7 @@
"WaitForHostMsg": "Կոնֆերանսը <b> __ root__ </ b> դեռ չի սկսվել. Եթե դուք են հյուրընկալող եք ապա խնդրում ենք հաստատել իսկությունը: Հակառակ դեպքում, խնդրում ենք սպասել հյուրընկալող կժամանի.",
"IamHost": "Ես եմ ընդունողը",
"Cancel": "Չեղարկել",
"Submit": "",
"Submit": "Ներմուծել",
"retry": "Կրկին փորձել",
"logoutTitle": "Ելք",
"logoutQuestion": "Համոզված եք, որ ցանկանում եք դուրս գալ, եւ դադարեցնել կոնֆերանսը:",
@@ -250,11 +277,9 @@
"Save": "Պահպանել",
"recording": "Գրանցում",
"recordingToken": "Մուտքագրեք ձայնագրման կոդանշանը",
"Dial": "Զանգ",
"sipMsg": "Նշեք SIP համարը",
"passwordCheck": "Դուք վստա՞հ էք որ ցանկանում էք ջնջել Ձեր գաղտնաբառը։",
"passwordMsg": "Սահմանել գաղտնաբառ ձեր սենյակը կողպելու համար",
"shareLink": "",
"shareLink": "Տարածեք URL -ը որպեսզի զանգեք",
"settings1": "Կարգավորել Ձեր կոնֆերանսը",
"settings2": "Մասնակիցները միացան անջատվախ ձայնով",
"settings3": "Պահանջվում է մականունը<br/><br/>Դրեք գաղտնաբառ Ձեր սենյակը արգելափակելու համար",
@@ -270,11 +295,10 @@
"token": "սիմվոլ",
"tokenAuthFailedTitle": "Վավերացումը չի ստացվել",
"tokenAuthFailed": "Ներողություն,Դուք ընդունված չեք այս զանգին միանալու համար",
"displayNameRequired": "",
"displayNameRequired": "Ցուցադրվող անունը պարտադիր է",
"enterDisplayName": "Խնդրում ենք մուտքագրել Ձեր ցուցադրման անունը",
"extensionRequired": "Ընդլայնում է պահանջվում:",
"firefoxExtensionPrompt": "Դուք պետք է տեղադրեք Firefox ընդլայնում, որպեսզի օգտագործել էկրանի փոխանակման ռեժիմը: Խնդրում ենք փորձեք կրկին՝ այն <a href='__url__'> այստեղից ձեռք բերելուց հետո</a>:",
"rateExperience": "Խնդրում ենք ներկայացրեք Ձեր հանդիպման փորձը",
"feedbackHelp": "Ձեր կարծիքը կօգնի մեզ բարելավել ձեր տեսափորձը",
"feedbackQuestion": "Պատմեք մեզ Ձեր զանգի մասին",
"thankYou": "Շնորհակալություն __appName__ -ից օգտվելու համար:",
@@ -287,7 +311,7 @@
"stopLiveStreaming": "Կանգնացնել ուղիղ հեռարձակումը:",
"stopRecording": "Կանգնացնել ձայնագրումը",
"doNotShowWarningAgain": "Այլևս ցույց չտալ այս նախազգուշական էջը",
"doNotShowMessageAgain": "",
"doNotShowMessageAgain": "Այլևս ցույց չտալ այս հաղորդագրությունը",
"permissionDenied": "Թույլատվությունը արգելված է",
"screenSharingPermissionDeniedError": "Դուք չունեք թույլտվություն կիսվել Ձեր էկրանով",
"micErrorPresent": "Տեղի է ունեցել սխալ Ձեր խոսափողին միանալիս",
@@ -296,19 +320,33 @@
"cameraUnknownError": "Չի կարող օգտագործվել տեսախցիկը անհայտ պատճառով",
"cameraPermissionDeniedError": "Ձեզ թույլտվրված չէ օգտագործել Ձեր տեսախցիկը: Դուք կարող եք միացած մնալ համաժողովին, սակայն մյուսները չեն տեսնի ձեզ. Օգտագործեք տեսախցիկի կոճակը խնդիրը կարգավորելու համար",
"cameraNotFoundError": "Տեսախցիկ չի գտնվել",
"cameraConstraintFailedError": "Ձեր տեսախցիկը չի համապատասխանում որոշ խոչընդոտների",
"cameraConstraintFailedError": "",
"micUnknownError": "Չի կարող օգտագործվել տեսախցիկը անհայտ պատճառով",
"micPermissionDeniedError": "Ձեզ թույլտվրված չէ օգտագործել Ձեր խոսափողը: Դուք կարող եք միացած մնալ համաժողովին, սակայն մյուսները չեն լսի ձեզ. Օգտագործեք խոսափողի կոճակը խնդիրը կարգավորելու համար",
"micNotFoundError": "Խոսափող չի գտնվել",
"micConstraintFailedError": "Ձեր խոսափողը չի բավարարել պահանջվող խոչընդոտներից մի քանիսը ",
"micConstraintFailedError": "",
"micNotSendingData": "Մենք չեն կարողանում միանալ Ձեր խոսափողին: Խնդրում ենք ընտրել մեկ այլ սարք կարգավորումների ցանկից կամ փորձեք վերսկսել ծրագիրը",
"cameraNotSendingData": "Մենք չեն կարողանում միանալ Ձեր տեսախցիկին: Խնդրում ենք ստուգեք թե արդյոք մեկ ուրիշ սարք չի օգտագործում այն կամ ընտրեք մեկ այլ սարք կարգավորումների ցանկից կամ փորձեք վերսկսել ծրագիրը:",
"goToStore": "Գնալ դեպի վեբ խանութ",
"externalInstallationTitle": "Ընդլայնում է պահանջվում:",
"externalInstallationMsg": "Չհաջողվեց տեղադրել էկրանի ցուցադրման ընդլայնումը",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Անջատել ձայնը"
"inlineInstallationMsg": "Չհաջողվեց տեղադրել էկրանի ցուցադրման ընդլայնումը",
"inlineInstallExtension": "",
"muteParticipantTitle": "Անջատե՞լ այս մասնակցի ձայնը:",
"muteParticipantBody": "Դուք չեք կարող անջատել նրանց ձայնը, բայց նրանք կարող են անջատել իրենց ձայնը ամեն ժամանակ:",
"muteParticipantButton": "Անջատել ձայնը",
"remoteControlTitle": "",
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "__user__ մերժել է Ձեր հեռահար կառավարման հրավերը",
"remoteControlAllowedMessage": "__user__ ընդունել է Ձեր հեռահար կառավարման հրավերը",
"remoteControlErrorMessage": "Որոշակի սխալ է տեղի ունեցել հեռահար կառավարման հրավերը ընդունելու ժամանակ __user__ -ից",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "հեռահար կառավարման ընթացքը ավարտվեց",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"email": {
"sharedKey": [
@@ -351,7 +389,7 @@
"on": "Գրանցում",
"off": "Ձայնագրությունը կանգնացված է",
"failedToStart": "Ձայնագրությունը ստացվեց սկսել",
"buttonTooltip": "",
"buttonTooltip": "Սկսել / կանգնացնել ձայնագրությունը",
"error": "Ձայնագրությյունը չստացվեց: Փորձեք կրկին",
"unavailable": "Ձայնագրության ծառայությունը ներկայումս անհասանելի է: Խնդրում եմ փորձեք մի փոքր ուշ:"
},
@@ -361,9 +399,75 @@
"off": "Ուղիղ Հեռարձակումը կանգնեցված է",
"unavailable": "Ուղիղ հեռարձակման ծառայությունը ներկայումս հասանելի չէ: Խնդրում եք փորձեք ավելի ուշ:",
"failedToStart": "Ուղիղ հեռարձակումը չստացվեց սկսել",
"buttonTooltip": "",
"buttonTooltip": "Սկսել / կանգնեցնել ուղիղ հեռարձակումը",
"streamIdRequired": "Խնդրում ենք լրացնել հոսքի ID-ն, որպեսզի կսկսի հեռարձակումը:",
"streamIdHelp": "Ո՞րտեղից կարող եմ գտնել սա:",
"error": "Ուղիղ հեռարձակումը չստացվեց: Փորձեք կրկին",
"busy": "Բոլոր ձայնագրիչները ներկայումս զբաղված են: Խնդրում ենք փորձեք մի փոքր ուշ:"
},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "Անուն",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Զանգ",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "Ավելացնել",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -6,14 +6,25 @@
"passwordSetRemotely": "",
"connectionsettings": "Impostazioni Connessione",
"poweredby": "powered by",
"feedback": "",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "La tua conferenza sta per essere creata...",
"me": "io",
"speaker": "Relatore",
"raisedHand": "",
"raisedHand": "Vorrei intervenire",
"defaultNickname": "",
"defaultLink": "es. __url__",
"callingName": "",
"audioOnly": {
"audioOnly": "Solo audio",
"featureToggleDisabled": ""
},
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -22,7 +33,8 @@
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": ""
"nwjsGrantPermissions": "",
"edgeGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
@@ -35,45 +47,52 @@
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
"fullScreen": "Entra / Esci da schermo intero",
"videoMute": "",
"showSpeakerStats": ""
},
"\u0005keyboardShortcuts": {},
"welcomepage": {
"go": "VAI",
"roomname": "Inserisci Nome Stanza",
"disable": "",
"feature1": {
"title": "Semplice da usare",
"content": "Nessun download richiesto. __app__ funziona direttamente nel tuo browser. Condividi semplicemente l'URL della tua conferenza con altri per iniziare."
"content": "Nessun download richiesto. __app__ funziona direttamente nel tuo browser. Condividi semplicemente l'URL della tua conferenza con altri per iniziare.",
"title": "Semplice da usare"
},
"feature2": {
"title": "Poca banda",
"content": "Conferenze video multi utente funzionano con appena 128Kbps. La condivisione dello schermo ed conferenze solo audio sono possibili con molto meno."
"content": "Conferenze video multi utente funzionano con appena 128Kbps. La condivisione dello schermo ed conferenze solo audio sono possibili con molto meno.",
"title": "Poca banda"
},
"feature3": {
"title": "Open source",
"content": ""
"content": "",
"title": "Open source"
},
"feature4": {
"title": "Utenti illimitati",
"content": "Non ci sono restrizioni sul numero di utenti per una conferenza. La potenza del server e la banda a disposizione sono gli unici fattori limitanti."
"content": "Non ci sono restrizioni sul numero di utenti per una conferenza. La potenza del server e la banda a disposizione sono gli unici fattori limitanti.",
"title": "Utenti illimitati"
},
"feature5": {
"title": "Condivisione Schermo",
"content": "è facile condividere il tuo schermo con altri. __app__ è l'ideale per presentazioni online, letture, e sessioni di supporto tecnico."
"content": "è facile condividere il tuo schermo con altri. __app__ è l'ideale per presentazioni online, letture, e sessioni di supporto tecnico.",
"title": "Condivisione Schermo"
},
"feature6": {
"title": "Stanze sicure",
"content": "Hai bisogno di più privacy? Le conferenze di __app__ possono essere rese sicure con una password per escludere ospiti non desiderati e prevenire interruzioni."
"content": "Hai bisogno di più privacy? Le conferenze di __app__ possono essere rese sicure con una password per escludere ospiti non desiderati e prevenire interruzioni.",
"title": "Stanze sicure"
},
"feature7": {
"title": "Note condivise",
"content": "__app__ utilizza Etherpad, un editor di testo real-time e collaborativo che è ottimo per meeting, scrivere articoli e tanto altro."
"content": "__app__ utilizza Etherpad, un editor di testo real-time e collaborativo che è ottimo per meeting, scrivere articoli e tanto altro.",
"title": "Note condivise"
},
"feature8": {
"title": "Statistiche di utilizzo",
"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."
}
"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.",
"title": "Statistiche di utilizzo"
},
"go": "VAI",
"join": "",
"privacy": "",
"roomname": "Inserisci Nome Stanza",
"roomnamePlaceHolder": "",
"sendFeedback": "",
"terms": ""
},
"startupoverlay": {
"policyText": "",
@@ -81,19 +100,22 @@
},
"suspendedoverlay": {
"title": "",
"text": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "Microfono Attiva / Disattiva",
"videomute": "",
"videomute": "Abilita / Disabilita video",
"authenticate": "Autenticazione",
"lock": "",
"lock": "Blocca / Sblocca Stanza",
"invite": "",
"chat": "",
"chat": "Apri / Chiudi chat",
"etherpad": "",
"sharedvideo": "",
"sharescreen": "",
"fullscreen": "",
"fullscreen": "Entra / Esci da schermo intero",
"sip": "Chiama numero SIP",
"Settings": "Impostazioni",
"hangup": "",
@@ -110,6 +132,14 @@
"profile": "",
"raiseHand": ""
},
"\u0005toolbar": {},
"unsupportedBrowser": {
"appInstalled": "",
"appNotInstalled": "",
"downloadApp": "",
"joinConversation": "",
"startConference": ""
},
"bottomtoolbar": {
"chat": "Apri / Chiudi chat",
"filmstrip": "",
@@ -133,12 +163,10 @@
"selectAudioOutput": "",
"followMe": "",
"noDevice": "",
"noPermission": "",
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
"audioVideo": ""
},
"profile": {
"title": "",
@@ -149,18 +177,21 @@
"videothumbnail": {
"editnickname": "Clicca per modificare il tuo<br/>nome visualizzato",
"moderator": "Il proprietario<br/>della conferenza",
"videomute": "",
"videomute": "Il partecipante ha<br/>fermato il video.",
"mute": "Il partecipante è in muto",
"kick": "Espelli",
"muted": "Audio disattivato",
"domute": "Disattiva audio",
"flip": ""
"flip": "",
"remoteControl": ""
},
"\u0005videothumbnail": {},
"connectionindicator": {
"header": "",
"bitrate": "Bitrate:",
"packetloss": "Perdita pacchetti:",
"resolution": "Risoluzione:",
"framerate": "",
"less": "Mostra meno",
"more": "Mostra di più",
"address": "Indirizzo:",
@@ -174,7 +205,8 @@
"remoteaddress_plural": "Indirizzi remoti:",
"transport": "Trasporto:",
"bandwidth": "Banda stimata:",
"na": "Ritorna qui per informazioni sulla connessione una volta che la conferenza inizia"
"na": "Ritorna qui per informazioni sulla connessione una volta che la conferenza inizia",
"turn": ""
},
"notify": {
"disconnected": "disconnesso",
@@ -190,8 +222,10 @@
"mutedTitle": "Hai l'audio disattivato!",
"raisedHand": ""
},
"\u0005notify": {},
"dialog": {
"add": "",
"allow": "",
"kickMessage": "Accidenti! Sei stato espulso dalla conferenza !",
"popupError": "",
"passwordErrorTitle": "",
@@ -203,8 +237,6 @@
"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",
@@ -213,8 +245,7 @@
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"rejoinNow": "",
"maxUsersLimitReached": "",
"lockTitle": "Blocco fallito",
"lockMessage": "Impossibile bloccare la conferenza.",
@@ -254,31 +285,28 @@
"Save": "Salva",
"recording": "",
"recordingToken": "Inserire token di registrazione",
"Dial": "Componi",
"sipMsg": "Inserire numero SIP",
"passwordCheck": "Confermi la rimozione della password?",
"passwordMsg": "Imposta una password per bloccare la stanza",
"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": "",
"yourPassword": "password utente",
"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 utente",
"userPassword": "password utente",
"token": "token",
"tokenAuthFailedTitle": "",
"tokenAuthFailedTitle": "Autenticazione fallita",
"tokenAuthFailed": "",
"displayNameRequired": "",
"enterDisplayName": "Per favore, inserisci il tuo nome utente:",
"extensionRequired": "",
"firefoxExtensionPrompt": "",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "",
@@ -309,10 +337,24 @@
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"externalInstallationMsg": "Impossibile installare l'estensione per il desktop sharing",
"inlineInstallationMsg": "Impossibile installare l'estensione per il desktop sharing",
"inlineInstallExtension": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Disattiva audio"
"muteParticipantButton": "Disattiva audio",
"remoteControlTitle": "",
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "",
"remoteControlAllowedMessage": "",
"remoteControlErrorMessage": "",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"\u0005dialog": {},
"email": {
@@ -365,7 +407,73 @@
"failedToStart": "",
"buttonTooltip": "",
"streamIdRequired": "",
"streamIdHelp": "",
"error": "",
"busy": ""
},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "Nome",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Componi",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -6,7 +6,14 @@
"passwordSetRemotely": "",
"connectionsettings": "",
"poweredby": "",
"feedback": "",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "",
"me": "",
"speaker": "",
@@ -14,6 +21,10 @@
"defaultNickname": "",
"defaultLink": "",
"callingName": "",
"audioOnly": {
"audioOnly": "",
"featureToggleDisabled": ""
},
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -22,7 +33,8 @@
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": ""
"nwjsGrantPermissions": "",
"edgeGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
@@ -36,44 +48,50 @@
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
"videoMute": "",
"showSpeakerStats": ""
},
"welcomepage": {
"go": "",
"roomname": "",
"disable": "",
"feature1": {
"title": "",
"content": ""
"content": "",
"title": ""
},
"feature2": {
"title": "",
"content": ""
"content": "",
"title": ""
},
"feature3": {
"title": "",
"content": ""
"content": "",
"title": ""
},
"feature4": {
"title": "",
"content": ""
"content": "",
"title": ""
},
"feature5": {
"title": "",
"content": ""
"content": "",
"title": ""
},
"feature6": {
"title": "",
"content": ""
"content": "",
"title": ""
},
"feature7": {
"title": "",
"content": ""
"content": "",
"title": ""
},
"feature8": {
"title": "",
"content": ""
}
"content": "",
"title": ""
},
"go": "",
"join": "",
"privacy": "",
"roomname": "",
"roomnamePlaceHolder": "",
"sendFeedback": "",
"terms": ""
},
"startupoverlay": {
"policyText": "",
@@ -81,9 +99,12 @@
},
"suspendedoverlay": {
"title": "",
"text": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "",
"videomute": "",
"authenticate": "",
@@ -110,6 +131,13 @@
"profile": "",
"raiseHand": ""
},
"unsupportedBrowser": {
"appInstalled": "",
"appNotInstalled": "",
"downloadApp": "",
"joinConversation": "",
"startConference": ""
},
"bottomtoolbar": {
"chat": "",
"filmstrip": "",
@@ -133,12 +161,10 @@
"selectAudioOutput": "",
"followMe": "",
"noDevice": "",
"noPermission": "",
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
"audioVideo": ""
},
"profile": {
"title": "",
@@ -162,6 +188,7 @@
"bitrate": "",
"packetloss": "",
"resolution": "",
"framerate": "",
"less": "",
"more": "",
"address": "",
@@ -174,8 +201,10 @@
"remoteaddress": "",
"remoteaddress_plural": "",
"transport": "",
"transport_plural": "",
"bandwidth": "",
"na": ""
"na": "",
"turn": ""
},
"notify": {
"disconnected": "",
@@ -193,6 +222,7 @@
},
"dialog": {
"add": "",
"allow": "",
"kickMessage": "",
"popupError": "",
"passwordErrorTitle": "",
@@ -204,8 +234,6 @@
"connecting": "",
"copy": "",
"error": "",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "",
"failtoinstall": "",
@@ -214,8 +242,7 @@
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"rejoinNow": "",
"maxUsersLimitReached": "",
"lockTitle": "",
"lockMessage": "",
@@ -255,8 +282,6 @@
"Save": "",
"recording": "",
"recordingToken": "",
"Dial": "",
"sipMsg": "",
"passwordCheck": "",
"passwordMsg": "",
"shareLink": "",
@@ -279,7 +304,6 @@
"enterDisplayName": "",
"extensionRequired": "",
"firefoxExtensionPrompt": "",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "",
@@ -311,14 +335,23 @@
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"inlineInstallationMsg": "",
"inlineInstallExtension": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "",
"remoteControlTitle": "",
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "",
"remoteControlAllowedMessage": "",
"remoteControlErrorMessage": "",
"remoteControlStopMessage": ""
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"email": {
"sharedKey": "",
@@ -358,5 +391,70 @@
"streamIdHelp": "",
"error": "",
"busy": ""
},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -6,7 +6,14 @@
"passwordSetRemotely": "causit per qualqu'un mai",
"connectionsettings": "Paramètres de connexion",
"poweredby": "produit per",
"feedback": "Donatz-nos lo vòstre vejaire",
"feedback": {
"average": "Mejana",
"bad": "Marrida",
"good": "Bona",
"rateExperience": "Mercés de donar una nòta a vòstra experiéncia.",
"veryBad": "Fòrça marrida",
"veryGood": "Fòrça bona"
},
"inviteUrlDefaultMsg": "Vòstra conferéncia es en cors de creacion...",
"me": "ieu",
"speaker": "Nautparlaire",
@@ -14,29 +21,35 @@
"defaultNickname": "ex. Joan Delpuèch",
"defaultLink": "ex. __url__",
"callingName": "__name__",
"audioOnly": {
"audioOnly": "Àudio solament",
"featureToggleDisabled": "Lo cambiament de __feature__ es desactivat en mòde àudio solament"
},
"userMedia": {
"react-nativeGrantPermissions": "Mercés de donar las permissions d'utilizar vòstra camerà e vòstre microfòn en butant sul boton <b><i>Autorizar</i></b>",
"chromeGrantPermissions": "Mercés de donar las permissions d'utilizar vòstra camerà e vòstre microfòn en butant sul boton <b><i>Autorizar</i></b>",
"androidGrantPermissions": "Mercés de donar las permissions d'utilizar vòstra camerà e vòstre microfòn en butant sul boton <b><i>Autorizar</i></b>",
"firefoxGrantPermissions": "Mercés de donar las permissions d'utilizar vòstra camerà e vòstre microfòn en butant sul boton <b><i>Partejar l'aparelh seleccionat</i></b>",
"operaGrantPermissions": "Mercés de donar las permissions d'utilizar vòstra camerà e vòstre microfòn en butant sul boton <b><i>Autorizar</i></b>",
"iexplorerGrantPermissions": "Mercés de donar las permissions d'utilizar vòstra camerà e vòstre microfòn en butant sul boton <b><i>OK</i></b>",
"safariGrantPermissions": "Mercés de donar las permissions d'utilizar vòstra camerà e vòstre microfòn en butant sul boton <b><i>OK</i></b>",
"nwjsGrantPermissions": "Mercés de donar las permissions d'utilizar vòstra camerà e vòstre microfòn"
"react-nativeGrantPermissions": "Causissètz <b><i>Autorizar</i></b> quand vòstre navigador vos demanda l'autorizacion.",
"chromeGrantPermissions": "Causissètz <b><i>Autorizar</i></b> quand vòstre navigador vos demanda l'autorizacion.",
"androidGrantPermissions": "Causissètz <b><i>Autorizar</i></b> quand vòstre navigador vos demanda l'autorizacion.",
"firefoxGrantPermissions": "Causissètz <b><i>Partejar l'aparelh seleccionat</i></b> quand vòstre navigador vos demanda l'autorizacion.",
"operaGrantPermissions": "Causissètz <b><i>Autorizar</i></b> quand vòstre navigador vos demanda l'autorizacion.",
"iexplorerGrantPermissions": "Causissètz <b><i>OK</i></b> quand vòstre navigador vos demanda l'autorizacion.",
"safariGrantPermissions": "Causissètz <b><i>OK</i></b> quand vòstre navigador vos demanda l'autorizacion.",
"nwjsGrantPermissions": "Mercés de donar las permissions d'utilizar vòstra camerà e vòstre microfòn",
"edgeGrantPermissions": "Causissètz <b><i>Òc</i></b> quand vòstre navigador vos demanda l'autorizacion."
},
"keyboardShortcuts": {
"keyboardShortcuts": "Acorchis de clavièr",
"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",
"toggleFilmstrip": "Mostrar o rescondre la vidèo",
"toggleShortcuts": "Afichar o amagar aiceste menú d'ajuda",
"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à"
"videoMute": "Aviar o arrestar vòstra camerà",
"showSpeakerStats": "Mostrar las estadistica del microfòn"
},
"welcomepage": {
"disable": "Afichar pas mai aquesta pagina",
@@ -81,14 +94,17 @@
"terms": "Tèrmes"
},
"startupoverlay": {
"policyText": "&nbsp;",
"policyText": " ",
"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.",
"title": "Vòstra conferéncia vidèo es estada arrestada perque vòstre ordenador se botèt en velha.",
"text": "Quichatz lo boton <i>Tornar participar</i>.",
"rejoinKeyTitle": "Tornar participar"
},
"toolbar": {
"addPeople": "",
"audioonly": "Activar / Desactivar lo mòde àudio solament (emplega mens de debit)",
"mute": "Mut / Actiu",
"videomute": "Aviar / Arrestar la camerà",
"authenticate": "Autentificatz-vos",
@@ -111,12 +127,12 @@
"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": "Mostrar / escondre vidèos",
"filmstrip": "Mostrar / Rescondre vidèos",
"profile": "Modificar vòstre perfil",
"raiseHand": "o se l'avètz ja<br /><strong>alara</strong>"
"raiseHand": "Demandar / Daissar la paraula"
},
"unsupportedBrowser": {
"appInstalled": "o se ja l'avètz<br /><strong>alara</strong>",
"appInstalled": "o se l'avètz ja installat<br /><strong>alara</strong>",
"appNotInstalled": "Vos cal <strong>__app__</strong> per participar a la conversacion a partir de vòstre mobil",
"downloadApp": "Telecargar l'aplicacion",
"joinConversation": "Participar a la conversacion",
@@ -124,7 +140,7 @@
},
"bottomtoolbar": {
"chat": "Dobrir / tampar lo chat",
"filmstrip": "Mostrar / escondre vidèos",
"filmstrip": "Mostrar / rescondre vidèos",
"contactlist": "Veire e convidar de participants"
},
"chat": {
@@ -145,12 +161,10 @@
"selectAudioOutput": "Sortida àudio",
"followMe": "Tot lo mond me sèc",
"noDevice": "Pas cap",
"noPermission": "La permission d'utilizar l'aparelh es pas estada donada",
"cameraAndMic": "Camerà e microfòn",
"moderator": "MODERATOR",
"password": "DEFINIR UN SENHAL",
"audioVideo": "ÀUDIO E VIDÈO",
"setPasswordLabel": "Verrolhar vòstra sala amb un senhal"
"audioVideo": "ÀUDIO E VIDÈO"
},
"profile": {
"title": "Perfil",
@@ -174,6 +188,7 @@
"bitrate": "Debit :",
"packetloss": "Pèrda de paquets :",
"resolution": "Resolucion :",
"framerate": "Frequéncia imatge :",
"less": "Amagar lo detalh",
"more": "Ne veire mai",
"address": "Adreça :",
@@ -187,7 +202,8 @@
"remoteaddress_plural": "Adreças distantas :",
"transport": "Transpòrt :",
"bandwidth": "Benda passanta estimada :",
"na": "Tornatz aicí per afichar las informacions de connexion un còp la conferéncia aviada"
"na": "Tornatz aicí per afichar las informacions de connexion un còp la conferéncia aviada",
"turn": ""
},
"notify": {
"disconnected": "desconnectat",
@@ -198,13 +214,14 @@
"focus": "Focus de conferéncia",
"focusFail": "__component__ es pas disponible - ensajatz tornamai dins __ms__ sec",
"grantedTo": "Dreits moderator acordats a __to__ !",
"grantedToUnknown": "Dreits moderator acordats a $t(somebody) !",
"grantedToUnknown": "Drechs moderator acordats a $t(notify.somebody) !",
"muted": "Avètz començat la conversacion en mut.",
"mutedTitle": "Sètz en mut !",
"raisedHand": "Volriá parlar."
},
"dialog": {
"add": "Apondre",
"allow": "Autorizar",
"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",
@@ -216,18 +233,15 @@
"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 camerà.",
"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.",
"conferenceReloadTitle": "Malurosament, quicòm truquèt.",
"conferenceReloadMsg": "Sèm a reglar aquò ! Nòva connexion dins __seconds__ segondas...",
"conferenceDisconnectTitle": "Sètz estat desconnectat.",
"conferenceDisconnectMsg": "Vos cal benlèu verificar vòstra connexion al malhum. Nòva connexion dins __seconds__ segondas...",
"rejoinNow": "Participar ara",
"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.",
@@ -267,8 +281,6 @@
"Save": "Salvar",
"recording": "Enregistrament",
"recordingToken": "Sasissètz un geton d'enregistrament",
"Dial": "Compausar",
"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": "Partejatz lo ligam de la conversacion",
@@ -291,7 +303,6 @@
"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.",
"feedbackHelp": "Vòstres comentaris nos ajudaràn a milhorar l'experiéncia vidèo",
"feedbackQuestion": "Contatz-nos cossí èra vòstre apèl !",
"thankYou": "Mercé d'aver utilizat __appName__ !",
@@ -323,14 +334,23 @@
"goToStore": "Anar sul webstore",
"externalInstallationTitle": "Extension requesida :",
"externalInstallationMsg": "Avètz d'installar nòstra extension de partiment d'ecran.",
"inlineInstallationMsg": "Avètz d'installar nòstra extension de partiment d'ecran.",
"inlineInstallExtension": "Installar ara",
"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",
"remoteControlTitle": "Contraròtle alonhat",
"remoteControlTitle": "Contraròtle a distància",
"remoteControlRequestMessage": "Volètz autorizar __user__ a contrarotlar vòstre ordinador ?",
"remoteControlShareScreenWarning": "Remarcatz que se botatz «Autorizar» partejaretz vòstre ecran !",
"remoteControlDeniedMessage": "__user__ a refusat vòstra demanda de contraròtle alonhat !",
"remoteControlAllowedMessage": "__user__ a acceptat vòstra demanda de contraròtle alonhat !",
"remoteControlErrorMessage": "Error al moment de demandar lo contraròtle alonhat a __user__ !",
"remoteControlStopMessage": "La session de contraròtle alonhat es acabada !"
"startRemoteControlErrorMessage": "Una error s'es produsida en ensajar de començar la session de contraròtle a distància !",
"remoteControlStopMessage": "La session de contraròtle alonhat es acabada !",
"close": "Tampar",
"shareYourScreen": "Partejar vòstre ecran",
"yourEntireScreen": "Vòstre ecran complet",
"applicationWindow": "Fenèstra de l'aplicacion"
},
"email": {
"sharedKey": [
@@ -392,5 +412,70 @@
"streamIdHelp": "Ont tròbi aquò ?",
"error": "Fracàs de la transmission en dirècte. Mercés de tornar ensajar.",
"busy": "Tots los enresgistraires son ocupats. Mercés de tornar ensajar mai tard."
},
"speakerStats": {
"hours": "__count__ oras",
"minutes": "__count__ minutas",
"name": "Nom",
"seconds": "__count__ segondas",
"speakerStats": "Estatisticas parladors",
"speakerTime": "Temps de paraula"
},
"deviceSelection": {
"deviceSettings": "Paramètres de l'aparelh",
"noPermission": "Autorizacion pas acordada",
"previewUnavailable": "Apercebut pas disponible",
"selectADevice": "Seleccionatz un aparelh",
"testAudio": "Ensag son"
},
"invite": {
"addPassword": "Ajustar un senhal",
"callNumber": "Sonar lo __numerò__",
"enterID": "Picatz lidentificant de la conferéncia : __conferenceID__ seguit per # per sonar dempuèi un telefòn",
"howToDialIn": "Per sonar, utilizatz un dels numeròs seguents e identificants de conferéncia",
"hidePassword": "Rescondre lo senhal",
"inviteTo": "Convidar de mond a __conferenceName__",
"invitedYouTo": "__userName__ vos a convidat a la conferéncia __inviteURL__",
"locked": "Aquesta conversacion es clavada. Los nòu-venguts devon aver lo ligam e picar lo senhal per participar.",
"showPassword": "Mostrar lo senhal",
"unlocked": "Aquesta conversacion es pas clavada. Tot lo mond amb lo ligam pòdon participar."
},
"videoStatus": {
"callQuality": "Qualitat àudio",
"changeVideoTip": "Cambiatz la qualitat vidèo amb la barra d'aisina a man esquèrra.",
"hd": "HD",
"highDefinition": "Nauta definicion",
"ld": "Bassa definicion",
"lowDefinition": "Bassa definicion",
"p2pEnabled": "Connexion par a par activada",
"p2pVideoQualityDescription": "Amb lo mòde par a par, la qualitat de las sonadas recebudas pòt pas qu'èsser cambiada entre nauta e son solament. La rèsta dels paramètres seràn ignorats fins que lo mòde par a par s'acabe.",
"recHighDefinitionOnly": "Nauta definicion preferida.",
"sd": "SD",
"standardDefinition": "Definicion estandarda",
"qualityButtonTip": "Cambiar la qualitat de la vidèo recebuda"
},
"dialOut": {
"dial": "Compausar",
"dialOut": "Sonar una numerò de telefòn",
"statusMessage": "ara es __status__",
"enterPhone": "Picatz un numerò de telefòn",
"phoneNotAllowed": "Malaürosament suportem pas encara aquela destinacion !"
},
"addPeople": {
"add": "Apondre",
"noResults": "Pas cap de resultat trobat",
"searchPlaceholder": "Cercar de monde e salas a apondre",
"title": "Ajustatz de monde a vòstra sonada",
"failedToAdd": "Fracàs de l'ajust de participants"
},
"inlineDialogFailure": {
"msg": "Avèm un pauc patit a manténer la connexion.",
"retry": "Ensajar tornarmai",
"support": "Assisténcia",
"supportMsg": "Se ten d'arribat, contactatz l'"
},
"deviceError": {
"cameraPermission": "Error d'obtencion de la permission per la camerà",
"microphonePermission": "Error d'obtencion de la permission pel microfòn"
}
}

View File

@@ -6,7 +6,14 @@
"passwordSetRemotely": "",
"connectionsettings": "ustawienia połączenia",
"poweredby": "Uruchomiono",
"feedback": "jaka jest twoja opinia ?",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "Oceń proszę swoje doświadczenia z konferencji.",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "otwarto twoją konferencję",
"me": "to ja",
"speaker": "głośnik",
@@ -14,66 +21,78 @@
"defaultNickname": "np. Ziutek Kowalski",
"defaultLink": "np. _url_",
"callingName": "_nazwa_",
"audioOnly": {
"audioOnly": "",
"featureToggleDisabled": ""
},
"userMedia": {
"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": "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"
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
"androidGrantPermissions": "",
"firefoxGrantPermissions": "",
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": "wyraź zgodę na użycie kamery i mikrofonu",
"edgeGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
"keyboardShortcuts": "Skróty klawiaturowe:",
"raiseHand": "",
"pushToTalk": "",
"toggleScreensharing": "",
"toggleFilmstrip": "",
"toggleShortcuts": "",
"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": "",
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
"toggleChat": "Otwórz lub zamknij panel czat.",
"mute": "Wyłącz lub włącz mikrofon.",
"fullScreen": "Otwórz / Zamknij pełny ekran",
"videoMute": "",
"showSpeakerStats": ""
},
"\u0005keyboardShortcuts": {},
"welcomepage": {
"go": "IDŹ",
"roomname": "Podaj nazwę sali konferencyjnej",
"disable": "nie pokazuj ponownie",
"feature1": {
"title": "użyj",
"content": "nie musisz nic pobierać. _app_ jest gotowa do użycia bezpośrednio w przeglądarce. Zaproś innych do udziału w konferencji podając adres URL"
"content": "nie musisz nic pobierać. _app_ jest gotowa do użycia bezpośrednio w przeglądarce. Zaproś innych do udziału w konferencji podając adres URL",
"title": "użyj"
},
"feature2": {
"title": "za mała przepustowość",
"content": "Dla konferencji video potrzeba nie więcej niż 128 kbit/sek. Konferencje dzielenia ekranu lub tylko audio są możliwe przy mniejszej przepustowości. "
"content": "Dla konferencji video potrzeba nie więcej niż 128 kbit/sek. Konferencje dzielenia ekranu lub tylko audio są możliwe przy mniejszej przepustowości. ",
"title": "za mała przepustowość"
},
"feature3": {
"title": "Open source",
"content": "_app_ oparta jest na Apache License. Możesz swobodnie pobierać ją, używać, modyfikować i dzielić się nią."
"content": "_app_ oparta jest na Apache License. Możesz swobodnie pobierać ją, używać, modyfikować i dzielić się nią.",
"title": "Open source"
},
"feature4": {
"title": "Nieograniczona liczba użytkowników",
"content": "Liczba użytkowników czy uczestników konferencji nie jest ograniczona. Determinuje ją moc serwera i dostępna przepustowość lącza."
"content": "Liczba użytkowników czy uczestników konferencji nie jest ograniczona. Determinuje ją moc serwera i dostępna przepustowość lącza.",
"title": "Nieograniczona liczba użytkowników"
},
"feature5": {
"title": "Współdzielenie ekranu",
"content": "Z łatwością podzielisz się ekranem z innymi. _app_ jest idealnym narzędziem do prezentacji, nauczania i udzielania zdalnej pomocy technicznej."
"content": "Z łatwością podzielisz się ekranem z innymi. _app_ jest idealnym narzędziem do prezentacji, nauczania i udzielania zdalnej pomocy technicznej.",
"title": "Współdzielenie ekranu"
},
"feature6": {
"title": "Sale bezpieczne.",
"content": "Potrzebujesz prywatności? _app_ sale konferencyjne mogą być zabezpieczone hasłami niedopuszczającymi niezaproszonych uczestników czy też osoby chcące zakłócić konferencję."
"content": "Potrzebujesz prywatności? _app_ sale konferencyjne mogą być zabezpieczone hasłami niedopuszczającymi niezaproszonych uczestników czy też osoby chcące zakłócić konferencję.",
"title": "Sale bezpieczne."
},
"feature7": {
"title": "Współdzielenie uwag.",
"content": "_app_ zawiera Etherpad, współdzielony edytor tekstu doskonały dla redakcji zespołowych artykułów czy komentarzy."
"content": "_app_ zawiera Etherpad, współdzielony edytor tekstu doskonały dla redakcji zespołowych artykułów czy komentarzy.",
"title": "Współdzielenie uwag."
},
"feature8": {
"title": "Statystyki użycia.",
"content": "Analizuj uczestników konferencji z łatwościa integrując dane z Piwik i Google Analitics i innymi systemami monitorującymi."
}
"content": "Analizuj uczestników konferencji z łatwościa integrując dane z Piwik i Google Analitics i innymi systemami monitorującymi.",
"title": "Statystyki użycia."
},
"go": "IDŹ",
"join": "",
"privacy": "",
"roomname": "Podaj nazwę sali konferencyjnej",
"roomnamePlaceHolder": "",
"sendFeedback": "",
"terms": ""
},
"startupoverlay": {
"policyText": "",
@@ -81,19 +100,22 @@
},
"suspendedoverlay": {
"title": "",
"text": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "Wycisz / Pogłośnij",
"videomute": "",
"videomute": "Kamera start / stop ",
"authenticate": "Uwierzytelnianie",
"lock": "",
"lock": "Zamknij / Otwórz salę",
"invite": "",
"chat": "",
"chat": "Otwórz / Zamknij Czat",
"etherpad": "",
"sharedvideo": "Udostępniaj wideo w Youtube",
"sharescreen": "",
"fullscreen": "",
"fullscreen": "Otwórz / Zamknij pełny ekran",
"sip": "Wykręć numer SIP",
"Settings": "Ustawienia",
"hangup": "",
@@ -106,10 +128,18 @@
"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": "",
"filmstrip": "Pokaż / Ukryj klipy wideo",
"profile": "",
"raiseHand": ""
},
"\u0005toolbar": {},
"unsupportedBrowser": {
"appInstalled": "",
"appNotInstalled": "",
"downloadApp": "",
"joinConversation": "",
"startConference": ""
},
"bottomtoolbar": {
"chat": "Otwórz / Zamknij Czat",
"filmstrip": "Pokaż / Ukryj klipy wideo",
@@ -133,12 +163,10 @@
"selectAudioOutput": "Wyjście audio",
"followMe": "Wszyscy za mną",
"noDevice": "Brak",
"noPermission": "Nie ma zgody na użycie urządzenia",
"cameraAndMic": "Kamera i Mikrofon",
"moderator": "MODERATOR",
"password": "USTAW HASŁO",
"audioVideo": "AUDIO I WIDEO",
"setPasswordLabel": "Zamknij salę konferencyjną z hasłem"
"audioVideo": "AUDIO I WIDEO"
},
"profile": {
"title": "",
@@ -154,13 +182,15 @@
"kick": "Spadaj!",
"muted": "Wyciszony",
"domute": "Wyciszenie",
"flip": "Odwrócenie"
"flip": "Odwrócenie",
"remoteControl": ""
},
"connectionindicator": {
"header": "",
"bitrate": "Szybkość transmisji:",
"packetloss": "Strata pakietów:",
"resolution": "Rozdzielczość:",
"framerate": "",
"less": "Pokaż mniej",
"more": "Pokaż więcej",
"address": "Adres:",
@@ -178,7 +208,8 @@
"remoteaddress_plural_5": "",
"transport": "Przekazywanie:",
"bandwidth": "Zakładana przepustowość:",
"na": "Po informację o połączeniu wróć gdy wystartuje konferencja"
"na": "Po informację o połączeniu wróć gdy wystartuje konferencja",
"turn": ""
},
"notify": {
"disconnected": "rozłączone",
@@ -194,8 +225,10 @@
"mutedTitle": "Jesteś wyciszony!",
"raisedHand": "Możesz mówić."
},
"\u0005notify": {},
"dialog": {
"add": "",
"allow": "",
"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": "",
@@ -207,8 +240,6 @@
"connecting": "Nawiązywanie połączenia",
"copy": "Kopiuj",
"error": "Błąd",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Błąd podczas rozpoznania rozszerzenia wspóldzielenia ekranu.",
"failtoinstall": "Instalacja współdzielenia ekranu nie powiodła się.",
@@ -217,8 +248,7 @@
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"rejoinNow": "",
"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ę.",
@@ -235,7 +265,7 @@
"defaultError": "Wystąpił jakiś błąd",
"passwordRequired": "Wymagane hasło",
"Ok": "Ok",
"done": "",
"done": "Brak",
"Remove": "Usuń",
"removePassword": "",
"shareVideoTitle": "Współdziel wideo",
@@ -258,8 +288,6 @@
"Save": "Zapisz",
"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": "",
@@ -282,7 +310,6 @@
"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.",
"feedbackHelp": "Twoja opinia będzie pomocna w usprawnieniu naszego serwisu.",
"feedbackQuestion": "Powiedz nam o twoim połączeniu!",
"thankYou": "Dziękujemy Ci za używanie _appName_!",
@@ -295,7 +322,7 @@
"stopLiveStreaming": "Zatrzymaj transmisję live",
"stopRecording": "Zatrzymaj nagrywanie",
"doNotShowWarningAgain": "Nie pokazuj tego ostrzeżenia ponownie",
"doNotShowMessageAgain": "",
"doNotShowMessageAgain": "nie pokazuj ponownie",
"permissionDenied": "Brak uprawnień",
"screenSharingPermissionDeniedError": "Nie posiadasz uprawnień do współdzielenia ekranu.",
"micErrorPresent": "Wystąpił błąd w dostępie do mikrofonu.",
@@ -314,10 +341,25 @@
"goToStore": "Idź do sklepu",
"externalInstallationTitle": "Wymagane rozszerzenie",
"externalInstallationMsg": "Zainstaluj rozszerzenie naszego współdzielenia ekranu.",
"inlineInstallationMsg": "Zainstaluj rozszerzenie naszego współdzielenia ekranu.",
"inlineInstallExtension": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Wyciszenie"
"muteParticipantButton": "Wyciszenie",
"remoteControlTitle": "",
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "",
"remoteControlAllowedMessage": "",
"remoteControlErrorMessage": "",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"\u0005dialog": {},
"email": {
"sharedKey": [
"Ta konferencja jest zabezpieczona hasłem. Aby się podłączyć proszę zastosuj następujący pin:",
@@ -363,19 +405,87 @@
"on": "Nagrywanie",
"off": "Nagrywanie zatrzymane",
"failedToStart": "Nagrywanie nie jest możliwe",
"buttonTooltip": "",
"buttonTooltip": "Nagrywanie start / stop",
"error": "Nagranie się nie powiodło. Proszę, spróbuj ponownie.",
"unavailable": "Serwis nagrywania jest aktualnie niedostępny. Proszę, spróbować później."
},
"\u0005recording": {},
"liveStreaming": {
"pending": "Start strumieniowania live...",
"on": "Strumień live",
"off": "Strumieniowanie live zastopowane",
"unavailable": "Strumieniowanie live aktualnie jest niedostepne. Proszę spróbować później.",
"failedToStart": "Strumieniowanie live nie powiodło się",
"buttonTooltip": "",
"buttonTooltip": "Strumieniowanie live start / stop",
"streamIdRequired": "Proszę podaj id strumieniowania aby uruchomić live.",
"streamIdHelp": "",
"error": "Strumieniowanie live nie powiodło się. Spróbuj później.",
"busy": "Wszystkie nagrywarki są zajęte. Proszę, sprawdź ponownie później."
},
"\u0005liveStreaming": {},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "Nazwa",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Dzwoń",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -6,7 +6,14 @@
"passwordSetRemotely": "Definido por outro participante",
"connectionsettings": "Configurações de conexão",
"poweredby": "distribuído por",
"feedback": "Dê seus comentários",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "Por favor, avalie sua experiência na reunião.",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Sua conferência está sendo criado...",
"me": "eu",
"speaker": "Orador",
@@ -14,15 +21,20 @@
"defaultNickname": "ex. João Pedro",
"defaultLink": "i.e. __url__",
"callingName": "__name__",
"audioOnly": {
"audioOnly": "Somente áudio",
"featureToggleDisabled": "A alternância de __feature__ é desativada enquanto estiver no modo somente de áudio"
},
"userMedia": {
"react-nativeGrantPermissions": "Dê as permissões para usar sua câmera e microfone pressionando o botão <b> <i>Permitir</i> </b>",
"chromeGrantPermissions": "Dê as permissões para usar sua câmera e microfone pressionando o botão <b> <i>Permitir</i> </b>",
"androidGrantPermissions": "Dê as permissões para usar sua câmera e microfone pressionando o botão <b> <i>Permitir</i> </b>",
"firefoxGrantPermissions": "Dê as permissões para usar sua câmera e microfone pressionando o botão <b> <i>Compartilhar Dispositivos Selecionados</i> </b>",
"operaGrantPermissions": "Dê as permissões para usar sua câmera e microfone pressionando o botão <b> <i>Permitir</i> </b>",
"iexplorerGrantPermissions": "Dê as permissões para usar sua câmera e microfone pressionando o botão <b> <i>OK</i> </b>",
"safariGrantPermissions": "Dê as permissões para usar sua câmera e microfone pressionando o botão <b> <i>OK</i> </b>",
"nwjsGrantPermissions": "Dê as permissões para usar sua câmera e microfone"
"react-nativeGrantPermissions": "Selecione <b><i>Permitir</i></b> quando seu navegador perguntar pelas permissões.",
"chromeGrantPermissions": "Selecione <b><i>Permitir</i></b> quando seu navegador perguntar pelas permissões.",
"androidGrantPermissions": "Selecione <b><i>Permitir</i></b> quando seu navegador perguntar pelas permissões.",
"firefoxGrantPermissions": "Selecione <b><i>Compartilhar Dispositivos Selecionados</i></b> quando seu navegador perguntar pelas permissões.",
"operaGrantPermissions": "Selecione <b><i>Permitir</i></b> quando seu navegador perguntar pelas permissões.",
"iexplorerGrantPermissions": "Selecione <b><i>OK</i></b> quando seu navegador perguntar pelas permissões.",
"safariGrantPermissions": "Selecione <b><i>OK</i></b> quando seu navegador perguntar pelas permissões.",
"nwjsGrantPermissions": "Dê as permissões para usar sua câmera e microfone",
"edgeGrantPermissions": "Selecione <b><i>Sim</i></b> quando seu navegador perguntar pelas permissões."
},
"keyboardShortcuts": {
"keyboardShortcuts": "Atalhos de teclado",
@@ -36,7 +48,8 @@
"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"
"videoMute": "Iniciar ou parar sua câmera",
"showSpeakerStats": "Mostrar estatísticas do alto falante"
},
"welcomepage": {
"disable": "Não mostre esta página novamente",
@@ -81,14 +94,17 @@
"terms": "Termos"
},
"startupoverlay": {
"policyText": "&nbsp;",
"policyText": " ",
"title": "O __app__ precisa usar seu microfone e câmera."
},
"suspendedoverlay": {
"title": "Sua chamada de vídeo foi interrompida, porque seu computador foi dormir.",
"title": "",
"text": "",
"rejoinKeyTitle": "Reentrar"
},
"toolbar": {
"addPeople": "",
"audioonly": "Ativar / desativar modo somente áudio (economiza banda)",
"mute": "Mudo / Não mudo",
"videomute": "Iniciar ou parar a câmera",
"authenticate": "Autenticar",
@@ -117,9 +133,9 @@
},
"unsupportedBrowser": {
"appInstalled": "ou se você já tenha isso<br /> <strong>então</strong>",
"appNotInstalled": "Você precisa do <strong>__app__</strong> para começar um bate-papo no seu celular",
"appNotInstalled": "Você precisa do <strong>__app__</strong> para começar uma conversa no seu celular",
"downloadApp": "Baixe o Aplicativo",
"joinConversation": "Entre no bate-papo",
"joinConversation": "Entrar na conversa",
"startConference": "Comece uma conferência"
},
"bottomtoolbar": {
@@ -145,12 +161,10 @@
"selectAudioOutput": "Saída de áudio",
"followMe": "Todos me seguem",
"noDevice": "Nenhum",
"noPermission": "Permissão para usar o dispositivo não concedida",
"cameraAndMic": "Câmera e microfone",
"moderator": "MODERADOR",
"password": "DEFINIR SENHA",
"audioVideo": "ÁUDIO E VÍDEO",
"setPasswordLabel": "Trancar sua sala com uma senha."
"audioVideo": "ÁUDIO E VÍDEO"
},
"profile": {
"title": "Perfil",
@@ -174,6 +188,7 @@
"bitrate": "Taxa de bits:",
"packetloss": "Perda de pacote:",
"resolution": "Resolução:",
"framerate": "Taxa de quadros:",
"less": "Mostrar menos",
"more": "Mostrar mais",
"address": "Endereço:",
@@ -187,7 +202,8 @@
"remoteaddress_plural": "Endereços remotos:",
"transport": "Transporte:",
"bandwidth": "Largura de banda estimada:",
"na": "Volte aqui para informações de conexão uma vez que a conferência inicie"
"na": "Volte aqui para informações de conexão uma vez que a conferência inicie",
"turn": ""
},
"notify": {
"disconnected": "desconectado",
@@ -198,36 +214,34 @@
"focus": "Foco da conferência",
"focusFail": "__component__ não disponĩvel - tente em __ms__ seg.",
"grantedTo": "Direitos de moderador concedido para __to__!",
"grantedToUnknown": "Direitos de moderador concedido para $t(somebody)!",
"muted": "Você iniciou uma conversa muda.",
"grantedToUnknown": "Direitos de moderador concedido para $t(notify.somebody)!",
"muted": "Você iniciou uma conversa em mudo.",
"mutedTitle": "Você está mudo!",
"raisedHand": "Gostaria de falar."
},
"dialog": {
"add": "Adicionar",
"allow": "Permitir",
"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.",
"popupError": "Seu navegador está bloqueando janelas popup deste site. Por favor, ative 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.",
"passwordError2": "Esta conversa 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.",
"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.",
"conferenceReloadTitle": "Infelizmente, algo deu errado.",
"conferenceReloadMsg": "Estamos tentando consertar isto. Reconectando em __seconds__ segundos...",
"conferenceDisconnectTitle": "Você foi desconectado.",
"conferenceDisconnectMsg": "Você pode querer verificar sua conexão de rede. Reconectando em __seconds__ segundos ...",
"rejoinNow": "Voltar agora",
"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.",
@@ -267,8 +281,6 @@
"Save": "Salvar",
"recording": "Gravando",
"recordingToken": "Digite o token de gravação",
"Dial": "Discar",
"sipMsg": "Digite o número SIP",
"passwordCheck": "Você tem certeza que deseja remover sua senha?",
"passwordMsg": "Definir uma senha para trancar sua sala",
"shareLink": "Compartilhar o link para a chamada",
@@ -291,7 +303,6 @@
"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.",
"feedbackHelp": "Seu retorno nos ajudará a melhorar nossa experiência de vídeo.",
"feedbackQuestion": "Nos conte sobre sua chamada!",
"thankYou": "Obrigado por usar o __appName__!",
@@ -313,24 +324,33 @@
"cameraUnknownError": "Não pode usar a câmera por uma razão desconhecida.",
"cameraPermissionDeniedError": "Você não tem permissão para usar sua câmera. Você ainda pode entrar na conferência, mas os outros não verão você. Use o botão da câmera na barra de endereço para fixar isto.",
"cameraNotFoundError": "A câmera não foi encontrada.",
"cameraConstraintFailedError": "Sua câmera não satisfaz algumas condições requeridas.",
"cameraConstraintFailedError": "Sua câmera não satisfaz algumas condições necessárias.",
"micUnknownError": "Não pode usar o microfone por uma razão desconhecida.",
"micPermissionDeniedError": "Você não tem permissão para usar seu microfone. Você ainda pode entrar na conferência, mas os outros não ouvirão você. Use o botão da câmera na barra de endereço para fixar isto.",
"micNotFoundError": "O microfone não foi encontrado.",
"micConstraintFailedError": "Seu microfone não satisfaz algumas condições requeridas.",
"micConstraintFailedError": "Seu microfone não satisfaz algumas condições necessárias.",
"micNotSendingData": "Seu microfone está inacessível. Selecione outro dispositivo do menu de configurações ou tente reiniciar a aplicação.",
"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.",
"inlineInstallationMsg": "Você precisa instalar nossa extensão de compartilhamento de tela.",
"inlineInstallExtension": "",
"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",
"remoteControlTitle": "Controle remoto",
"remoteControlTitle": "Conexão de área de trabalho remota",
"remoteControlRequestMessage": "Permitirá __user__ controlar remotamente sua área de trabalho?",
"remoteControlShareScreenWarning": "Note que se você pressionar \"Permitir\" você vai compartilhar sua tela!",
"remoteControlDeniedMessage": "__user__ rejeitou sua requisição de controle remoto!",
"remoteControlAllowedMessage": "__user__ aceitou sua requisição de controle remoto!",
"remoteControlErrorMessage": "Um erro ocorreu enquanto tentava requerer a permissão de controle remoto de __user__!",
"remoteControlStopMessage": "A sessão de controle remoto terminou!"
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "A sessão de controle remoto terminou!",
"close": "Fechar",
"shareYourScreen": "Compartilhar sua tela",
"yourEntireScreen": "Toda sua tela",
"applicationWindow": "Janela de aplicativo"
},
"email": {
"sharedKey": [
@@ -392,5 +412,70 @@
"streamIdHelp": "Aonde eu encontro isto?",
"error": "Falha na transmissão ao vivo. Tente novamente",
"busy": "Todos os gravadores estão ocupados no momento. Por favor, tente mais tarde."
},
"speakerStats": {
"hours": "__count__h",
"minutes": "__count__m",
"name": "Nome",
"seconds": "__count__s",
"speakerStats": "Estatísticas do Apresentador",
"speakerTime": "Tempo do Apresentador"
},
"deviceSelection": {
"deviceSettings": "Configurações do dispositivo",
"noPermission": "Permissão não concedida",
"previewUnavailable": "Visualização indisponível",
"selectADevice": "Selecione um dispositivo",
"testAudio": "Testar o som"
},
"invite": {
"addPassword": "Adicionar uma senha",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "Esconder a senha",
"inviteTo": "Convidar pessoas para __conferenceName__",
"invitedYouTo": "",
"locked": "Esta chamada está travada. Novos participantes precisam ter o link e digitar a senha para entrar.",
"showPassword": "Mostrar senha",
"unlocked": "Esta chamada está destravada. Qualquer novo participante com o link pode participar."
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Discar",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "Adicionar",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -1,12 +1,19 @@
{
"contactlist": "Участники (__pcount__)",
"addParticipants": "",
"addParticipants": "Поделиться ссылкой",
"roomLocked": "Вызывающие должны ввести пароль",
"roomUnlocked": "Любой, владеющий ссылкой, может присоединиться",
"passwordSetRemotely": "установлен другим участником",
"connectionsettings": "Настройки подключения",
"poweredby": "работает на",
"feedback": "Оставьте нам свой отзыв",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "Пожалуйста, оцените ваш опыт встречи.",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Ваша конференция создается в данный момент...",
"me": "Я",
"speaker": "Говорящий",
@@ -14,15 +21,20 @@
"defaultNickname": "напр. Яна Цветочкина",
"defaultLink": "напр. __url__",
"callingName": "__name__",
"audioOnly": {
"audioOnly": "",
"featureToggleDisabled": ""
},
"userMedia": {
"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": "Пожалуйста дайте разрешение на доступ к камере и микрофону"
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
"androidGrantPermissions": "",
"firefoxGrantPermissions": "",
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": "Пожалуйста дайте разрешение на доступ к камере и микрофону",
"edgeGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "Комбинации клавиш",
@@ -36,54 +48,63 @@
"toggleChat": "Открыть или закрыть чат",
"mute": "Заглушить или включить микрофон",
"fullScreen": "Войти или выйти из полноэкранного режима",
"videoMute": "Включить или выключить вашу камеру"
"videoMute": "Включить или выключить вашу камеру",
"showSpeakerStats": ""
},
"welcomepage": {
"go": "Вперед!",
"roomname": "Введите название комнаты",
"disable": "Не показывать эту страницу снова",
"feature1": {
"title": "Простой в использовании",
"content": "Нет нужды что-либо скачивать. __app__ работает прямо из вашего браузера. Просто отправьте URL ссылку на вашу конференцию другим, чтобы начать общение."
"content": "Нет нужды что-либо скачивать. __app__ работает прямо из вашего браузера. Просто отправьте URL ссылку на вашу конференцию другим, чтобы начать общение.",
"title": "Простой в использовании"
},
"feature2": {
"title": "Низкие требования к ширине канала",
"content": "Многопользовательским видеоконференциям достаточно скорости передачи данных в 128 Кбит/с. Демонстрация экрана или аудиоконференции требуют и того меньше."
"content": "Многопользовательским видеоконференциям достаточно скорости передачи данных в 128 Кбит/с. Демонстрация экрана или аудиоконференции требуют и того меньше.",
"title": "Низкие требования к ширине канала"
},
"feature3": {
"title": "Исходный код открыт",
"content": "__app__ лицензирован под Apache License. Вы можете свободно скачивать, использовать, изменять это ПО в соответствии с условиями лицензии."
"content": "__app__ лицензирован под Apache License. Вы можете свободно скачивать, использовать, изменять это ПО в соответствии с условиями лицензии.",
"title": "Исходный код открыт"
},
"feature4": {
"title": "Количество пользовательниц не ограничено",
"content": "Нет никаких искусственных ограничений по количеству пользовательниц или участников конференций. Вас отграничивают только мощность сервера и качество соединения."
"content": "Нет никаких искусственных ограничений по количеству пользовательниц или участников конференций. Вас отграничивают только мощность сервера и качество соединения.",
"title": "Количество пользовательниц не ограничено"
},
"feature5": {
"title": "Общий доступ к экрану",
"content": "С лёгкостью можно пользоваться экраном совместно. __app__ идеально для онлайн презентаций, лекций и сеансов техподдержки."
"content": "С лёгкостью можно пользоваться экраном совместно. __app__ идеально для онлайн презентаций, лекций и сеансов техподдержки.",
"title": "Общий доступ к экрану"
},
"feature6": {
"title": "Защищённые комнаты",
"content": "Нужно больше приватности? __app__ конференц-комнаты могут быть защищены паролем, чтобы исключить незваных гостей или заминки."
"content": "Нужно больше приватности? __app__ конференц-комнаты могут быть защищены паролем, чтобы исключить незваных гостей или заминки.",
"title": "Защищённые комнаты"
},
"feature7": {
"title": "Поделиться заметками",
"content": "__app__ включает Etherpad, текстовый редактор для совместной работы над текстом в реальном времени, который замечательно подходит, чтобы вести протоколы или совместно писать статьи."
"content": "__app__ включает Etherpad, текстовый редактор для совместной работы над текстом в реальном времени, который замечательно подходит, чтобы вести протоколы или совместно писать статьи.",
"title": "Поделиться заметками"
},
"feature8": {
"title": "Статистика использования",
"content": "Узнайте больше о пользователях с помощью интеграции с Piwik, Google Analytics и другими системами мониторига и сбора статистики."
}
"content": "Узнайте больше о пользователях с помощью интеграции с Piwik, Google Analytics и другими системами мониторига и сбора статистики.",
"title": "Статистика использования"
},
"go": "Вперед!",
"join": "",
"privacy": "",
"roomname": "Введите название комнаты",
"roomnamePlaceHolder": "",
"sendFeedback": "",
"terms": ""
},
"startupoverlay": {
"policyText": "&nbsp;",
"policyText": "",
"title": "__app__ нуждается в использовании вашего микрофона и камеры."
},
"suspendedoverlay": {
"title": "Ваш видеозвонок был прерван, потому что этот компьютер пошёл спать.",
"title": "",
"text": "",
"rejoinKeyTitle": "Присоединиться повторно"
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "Вкл. / Выкл. звук",
"videomute": "Вкл / Выкл камеру",
"authenticate": "Аутентифицировать",
@@ -110,6 +131,13 @@
"profile": "Редактировать ваш профиль",
"raiseHand": "Поднять / Опустить вашу руку"
},
"unsupportedBrowser": {
"appInstalled": "",
"appNotInstalled": "",
"downloadApp": "",
"joinConversation": "",
"startConference": ""
},
"bottomtoolbar": {
"chat": "Открыть / Закрыть чат",
"filmstrip": "Показать / Скрыть видео",
@@ -133,12 +161,10 @@
"selectAudioOutput": "Звуковой выход",
"followMe": "Каждый следует за мной",
"noDevice": "Нет",
"noPermission": "Нет прав пользоваться устройством",
"cameraAndMic": "Камера и микрофон",
"moderator": "МОДЕРАТОР",
"password": "УСТАНОВИТЬ ПАРОЛЬ",
"audioVideo": "АУДИО И ВИДЕО",
"setPasswordLabel": "Заблокировать вашу комнату с помощью пароля."
"audioVideo": "АУДИО И ВИДЕО"
},
"profile": {
"title": "Профиль",
@@ -162,6 +188,7 @@
"bitrate": "Битрейт",
"packetloss": "Потеря пакетов:",
"resolution": "Разрешение:",
"framerate": "",
"less": "Свернуть",
"more": "Показать больше",
"address": "Адрес:",
@@ -179,7 +206,8 @@
"remoteaddress_plural_5": "",
"transport": "Метод отправки:",
"bandwidth": "Средняя скорость соединения:",
"na": "Вернитесь сюда за информацией о соединении, когда конференция начнётся"
"na": "Вернитесь сюда за информацией о соединении, когда конференция начнётся",
"turn": ""
},
"notify": {
"disconnected": "соединение разорвано",
@@ -190,13 +218,14 @@
"focus": "Фокусировка конференции",
"focusFail": "__component__ недоступен - повторите через __ms__ секунд",
"grantedTo": "Теперь модерирует __to__!",
"grantedToUnknown": "Права модератора теперь у $t(somebody)!",
"grantedToUnknown": "",
"muted": "Вы начали конференцию без звука.",
"mutedTitle": "Вы без звука!",
"raisedHand": "Хочу высказаться."
},
"dialog": {
"add": "Добавить",
"allow": "",
"kickMessage": "Фигасе! Вас прогнали со встречи!",
"popupError": "Ваш браузер блокирует всплывающие окна на этом сайте. Пожалуйста разрешите всплывающие окна в настройках безопасности и попробуйте снова.",
"passwordErrorTitle": "Ошибка пароля",
@@ -208,18 +237,15 @@
"connecting": "Идёт подключение",
"copy": "Копировать",
"error": "Ошибка",
"roomLocked": "Этот звонок блокируется. Новые звонящие должны иметь ссылку и ввести пароль, чтобы присоединиться",
"addPassword": "Добавить пароль",
"createPassword": "Создать пароль",
"detectext": "Ошибка при попытке определить расширение для совместного использования экрана.",
"failtoinstall": "Невозможно установить расширение для совместного использования рабочего стола",
"failedpermissions": "Невозможно получить права на использование локального микрофона и/или камеры.",
"conferenceReloadTitle": "К сожалению, что-то пошло не так",
"conferenceReloadMsg": "Мы пытаемся исправить это",
"conferenceDisconnectTitle": "Вы были отсоединены. Вы можете проверить подключение к сети.",
"conferenceDisconnectMsg": "Переподключение в...",
"reconnectNow": "Переподключиться сейчас",
"conferenceReloadTimeLeft": "__seconds__ сек.",
"conferenceReloadTitle": "",
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"rejoinNow": "",
"maxUsersLimitReached": "Достигнут максимум количества участников конференции. Конференция заполнена. Пожалуйста попробуйте позже!",
"lockTitle": "Блокировка не удалась",
"lockMessage": "Не удалось запереть конференцию",
@@ -259,8 +285,6 @@
"Save": "Сохранить",
"recording": "Запись",
"recordingToken": "Введите токен для записи",
"Dial": "Дозвон",
"sipMsg": "Введите SIP-номер",
"passwordCheck": "Вы уверены, что хотите удалить ваш пароль?",
"passwordMsg": "Введите пароль для вашей комнаты",
"shareLink": "Поделитесь ссылкой на звонок",
@@ -283,7 +307,6 @@
"enterDisplayName": "Пожалуйста, введите Ваше имя экрана",
"extensionRequired": "Требуется расширение:",
"firefoxExtensionPrompt": "Нужно установить расширение Firefox, чтобы совместно пользоваться экраном. Попробуйте позже, скачав его <a href='__url__'>отсюда</a>!",
"rateExperience": "Пожалуйста, оцените ваш опыт встречи.",
"feedbackHelp": "Ваша поддержка поможет нам улучшить опыт видео.",
"feedbackQuestion": "Расскажите нам о вашем звонке!",
"thankYou": "Спасибо за использование __appName__!",
@@ -305,24 +328,33 @@
"cameraUnknownError": "Не могу использовать камеру по неизвестной причине.",
"cameraPermissionDeniedError": "У вас нет прав на использование камеры. Вы можете участвовать в конференции, но другие не будут Вас видеть. Используйте значок с камерой в строке адреса, чтобы устранить проблему.",
"cameraNotFoundError": "Камера не была найдена.",
"cameraConstraintFailedError": "Ваша камера не отвечает некоторым требованиям.",
"cameraConstraintFailedError": "",
"micUnknownError": "Не могу пользоваться микрофоном по непонятным причинам.",
"micPermissionDeniedError": "Вы не дали прав на использование микрофона. Вы все-равно можете присоединиться к конференции, но никто не будет Вас слышать. Используйте иконку с камерой в адресной строке браузера, чтобы исправить это.",
"micNotFoundError": "Микрофон не был найден.",
"micConstraintFailedError": "Ваш микрофон не отвечает некоторым необходимым требованиям.",
"micConstraintFailedError": "",
"micNotSendingData": "Мы не можем получить доступ к вашему микрофону. Пожалуйста, выберите другое устройство из меню настроек или попробуйте перезапустить приложение.",
"cameraNotSendingData": "Мы не можем получить доступ к вашей камере. Пожалуйста, проверьте, используется ли это устройство другим приложением, выберите другое устройство из меню настроек или же перезапустите приложение.",
"goToStore": "Перейти к интернет-магазину",
"externalInstallationTitle": "Требуется расширение",
"externalInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.",
"inlineInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.",
"inlineInstallExtension": "",
"muteParticipantTitle": "Приглушить этого участника?",
"muteParticipantBody": "Вы не сможете перестать глушить их, но они могут сделать это сами в любое время.",
"muteParticipantButton": "Выключить звук",
"remoteControlTitle": "Дистанционное управление",
"remoteControlTitle": "",
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "__user__ отклонил ваш запрос на дистанционное управление!",
"remoteControlAllowedMessage": "__user__ принял ваш запрос на дистанционное управление!",
"remoteControlErrorMessage": "Произошла ошибка при попытке запросить разрешения удалённого управления от __user__!",
"remoteControlStopMessage": "Сессия дистанционного управления завершена!"
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "Сессия дистанционного управления завершена!",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"email": {
"sharedKey": [
@@ -384,5 +416,70 @@
"streamIdHelp": "Где я могу найти это?",
"error": "Не удалось начать трансляцию. Попробуйте снова.",
"busy": "Все рекордеры сейчас заняты. Попробуйте позже."
},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "Имя",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Дозвон",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "Добавить",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -6,7 +6,14 @@
"passwordSetRemotely": "",
"connectionsettings": "Nastavenie spojenia",
"poweredby": "založené na",
"feedback": "",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Vaša konferencia bola práve vytvorená...",
"me": "ja",
"speaker": "Rečník",
@@ -14,6 +21,10 @@
"defaultNickname": "",
"defaultLink": "napr. __url__",
"callingName": "",
"audioOnly": {
"audioOnly": "",
"featureToggleDisabled": ""
},
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -22,7 +33,8 @@
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": ""
"nwjsGrantPermissions": "",
"edgeGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
@@ -36,44 +48,50 @@
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
"videoMute": "",
"showSpeakerStats": ""
},
"welcomepage": {
"go": "Pripojiť",
"roomname": "Zadajte názov miestnosti",
"disable": "",
"feature1": {
"title": "Jednoduché na používanie",
"content": "Nie je potrebne nič sťahovať. __app_ funguje priamo vo Vašom prehliadači. Jednoducho zdieľajte URL adresu konferenčnej miestnosti a možete začať."
"content": "Nie je potrebne nič sťahovať. __app_ funguje priamo vo Vašom prehliadači. Jednoducho zdieľajte URL adresu konferenčnej miestnosti a možete začať.",
"title": "Jednoduché na používanie"
},
"feature2": {
"title": "Nízka náročnosť na prenos",
"content": "Viacuživateľská video konferencia s prenosovou rychlosťou iba 128Kbps. Konferencie iba so zdieľaním plochy alebo audia."
"content": "Viacuživateľská video konferencia s prenosovou rychlosťou iba 128Kbps. Konferencie iba so zdieľaním plochy alebo audia.",
"title": "Nízka náročnosť na prenos"
},
"feature3": {
"title": "Open source",
"content": "__app__ je licencované pod Apache licenciou. Možete ho voľne sťahovať, užívať, modifikovať a zdieľat podľa tejto licencie."
"content": "__app__ je licencované pod Apache licenciou. Možete ho voľne sťahovať, užívať, modifikovať a zdieľat podľa tejto licencie.",
"title": "Open source"
},
"feature4": {
"title": "Neobmedzený počet uživateľov",
"content": "Nie ste obmedzený počtom pripojených uživateľov. Jediným obmedzením su zdroje servera a internetového pripojenia."
"content": "Nie ste obmedzený počtom pripojených uživateľov. Jediným obmedzením su zdroje servera a internetového pripojenia.",
"title": "Neobmedzený počet uživateľov"
},
"feature5": {
"title": "Zdieľanie prac. plochy",
"content": "Je jednoducho možné zdieľať Vašu prac. plochu. __app__ je ideálne pre on-line prezentácie, školenia a technickú podporu."
"content": "Je jednoducho možné zdieľať Vašu prac. plochu. __app__ je ideálne pre on-line prezentácie, školenia a technickú podporu.",
"title": "Zdieľanie prac. plochy"
},
"feature6": {
"title": "Zabezpečené miestnosti",
"content": "Potrebujete súkromie? __app_ konferenčné miestosti možu byť zabezpečené heslom, aby ste predišli neželaným hosťom a vyrušovaniu."
"content": "Potrebujete súkromie? __app_ konferenčné miestosti možu byť zabezpečené heslom, aby ste predišli neželaným hosťom a vyrušovaniu.",
"title": "Zabezpečené miestnosti"
},
"feature7": {
"title": "Zdieľané poznámky",
"content": "__app_ poskytuje Etherpad, kooperatívny editor v reálnom čase, ideálny pre zapis zo stretnutia, písanie článkov a veľa iného."
"content": "__app_ poskytuje Etherpad, kooperatívny editor v reálnom čase, ideálny pre zapis zo stretnutia, písanie článkov a veľa iného.",
"title": "Zdieľané poznámky"
},
"feature8": {
"title": "Štatistiky používania",
"content": "Zistite o Vašich ivateľoch viac ľahko cez integráciu s Piwik, Google Analytics a inych monitorovacích a štatistických nástrojov."
}
"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.",
"title": "Štatistiky poívania"
},
"go": "Pripojiť",
"join": "",
"privacy": "",
"roomname": "Zadajte názov miestnosti",
"roomnamePlaceHolder": "",
"sendFeedback": "",
"terms": ""
},
"startupoverlay": {
"policyText": "",
@@ -81,9 +99,12 @@
},
"suspendedoverlay": {
"title": "",
"text": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "Vypnúť / Zapnúť mikrofón",
"videomute": "",
"authenticate": "Overiť",
@@ -110,6 +131,13 @@
"profile": "",
"raiseHand": ""
},
"unsupportedBrowser": {
"appInstalled": "",
"appNotInstalled": "",
"downloadApp": "",
"joinConversation": "",
"startConference": ""
},
"bottomtoolbar": {
"chat": "Otvoriť / zatvoriť chat",
"filmstrip": "",
@@ -133,12 +161,10 @@
"selectAudioOutput": "",
"followMe": "",
"noDevice": "",
"noPermission": "",
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
"audioVideo": ""
},
"profile": {
"title": "",
@@ -154,13 +180,15 @@
"kick": "Vyhodiť",
"muted": "Vypnutý mikrofón",
"domute": "Vypnút mikrofón",
"flip": ""
"flip": "",
"remoteControl": ""
},
"connectionindicator": {
"header": "",
"bitrate": "Prenos. rýchlosť",
"packetloss": "Strata packetov:",
"resolution": "Rozlíšenie:",
"framerate": "",
"less": "Zobraz menej",
"more": "Zobraz viac",
"address": "Adresa:",
@@ -178,7 +206,8 @@
"remoteaddress_plural_5": "",
"transport": "Prenos:",
"bandwidth": "Predpokladaný dat. tok:",
"na": "Vrať sa sem pre informácie o spojení hňed ked začne konferencia"
"na": "Vrať sa sem pre informácie o spojení hňed ked začne konferencia",
"turn": ""
},
"notify": {
"disconnected": "odpojený",
@@ -189,13 +218,14 @@
"focus": "Konferenčny focus",
"focusFail": "__component__ je nedostupný - skúste znova za __ms__ sek",
"grantedTo": "Práva moderátora boli udelené __to__!",
"grantedToUnknown": "Práva moderátora boli udelené $t(somebody)!",
"grantedToUnknown": "",
"muted": "Začali ste rozhovor s vypnutým mikrofónom.",
"mutedTitle": "Boli ste stíšený!",
"raisedHand": ""
},
"dialog": {
"add": "",
"allow": "",
"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": "",
@@ -207,8 +237,6 @@
"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",
@@ -217,8 +245,7 @@
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"rejoinNow": "",
"maxUsersLimitReached": "",
"lockTitle": "Zabezpečenie zlyhalo",
"lockMessage": "Zlyhanie pri pokuse o zabezpečenie konferencie.",
@@ -258,8 +285,6 @@
"Save": "Uložiť",
"recording": "",
"recordingToken": "Zadajte názov nahrávky",
"Dial": "Volať",
"sipMsg": "Vložte SIP číslo",
"passwordCheck": "Ste si istý, že chcete odstrániť heslo?",
"passwordMsg": "Zadajte heslo pre zabezpečenie miestnosti",
"shareLink": "",
@@ -282,7 +307,6 @@
"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": "",
@@ -314,9 +338,23 @@
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"inlineInstallationMsg": "",
"inlineInstallExtension": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Vypnút mikrofón"
"muteParticipantButton": "Vypnút mikrofón",
"remoteControlTitle": "",
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "",
"remoteControlAllowedMessage": "",
"remoteControlErrorMessage": "",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"email": {
"sharedKey": [
@@ -379,7 +417,73 @@
"failedToStart": "",
"buttonTooltip": "",
"streamIdRequired": "",
"streamIdHelp": "",
"error": "",
"busy": ""
},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "Meno",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Volať",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -6,7 +6,14 @@
"passwordSetRemotely": "",
"connectionsettings": "Nastavitve povezave",
"poweredby": "poganja",
"feedback": "",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Ustvarjanje vaše konference ...",
"me": "jaz",
"speaker": "Govornik",
@@ -14,6 +21,10 @@
"defaultNickname": "",
"defaultLink": "npr. __url__",
"callingName": "",
"audioOnly": {
"audioOnly": "",
"featureToggleDisabled": ""
},
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -22,7 +33,8 @@
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": ""
"nwjsGrantPermissions": "",
"edgeGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
@@ -36,44 +48,50 @@
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
"videoMute": "",
"showSpeakerStats": ""
},
"welcomepage": {
"go": "POJDI",
"roomname": "Vpišite ime sobe",
"disable": "",
"feature1": {
"title": "Enostavna uporaba",
"content": "Nič ni treba namestiti. __app__ deluje direktno v vašem brskalniku. Enostavno sporočite ostalim udeležencem URL svoje konference in začnite."
"content": "Nič ni treba namestiti. __app__ deluje direktno v vašem brskalniku. Enostavno sporočite ostalim udeležencem URL svoje konference in začnite.",
"title": "Enostavna uporaba"
},
"feature2": {
"title": "Ozka pasovna širina",
"content": "Video konferenca z več udeleženci s samo 128Kbps. Deljenje zaslona in samo avdio konference so možne že z veliko nižjo pasovno širino."
"content": "Video konferenca z več udeleženci s samo 128Kbps. Deljenje zaslona in samo avdio konference so možne že z veliko nižjo pasovno širino.",
"title": "Ozka pasovna širina"
},
"feature3": {
"title": "Odprta koda",
"content": ""
"content": "",
"title": "Odprta koda"
},
"feature4": {
"title": "Neomejeno število uporabnikov",
"content": "Nobene umetne omejitve števila uporabnikov ali udeležencev konference. Zmogljivost strežnika in pasovna širina sta edini omejitvi."
"content": "Nobene umetne omejitve števila uporabnikov ali udeležencev konference. Zmogljivost strežnika in pasovna širina sta edini omejitvi.",
"title": "Neomejeno število uporabnikov"
},
"feature5": {
"title": "Skupna raba zaslona",
"content": "Skupna raba zaslona z drugimi je zelo enostavna. __app__ je idealna rešitev za spletne predstavitve, predavanja in tehnično podporo."
"content": "Skupna raba zaslona z drugimi je zelo enostavna. __app__ je idealna rešitev za spletne predstavitve, predavanja in tehnično podporo.",
"title": "Skupna raba zaslona"
},
"feature6": {
"title": "Varne sobe",
"content": "Rabite zasebnost? Konferenčne sobe __app__ so lahko zaklenjene z geslom, da preprečite dostop neželenim gostom ter prekinitve."
"content": "Rabite zasebnost? Konferenčne sobe __app__ so lahko zaklenjene z geslom, da preprečite dostop neželenim gostom ter prekinitve.",
"title": "Varne sobe"
},
"feature7": {
"title": "Skupna raba zapiskov",
"content": "__app__ vsebuje Etherpad, realnočasovni skupinski urejevalnik besedil, ki je idealen za pisanje zapisnikov sestankov, člankov in še mnogo drugega."
"content": "__app__ vsebuje Etherpad, realnočasovni skupinski urejevalnik besedil, ki je idealen za pisanje zapisnikov sestankov, člankov in še mnogo drugega.",
"title": "Skupna raba zapiskov"
},
"feature8": {
"title": "Statistika uporabe",
"content": "Spoznajte svoje uporabnike z enostavno integracijo v Piwik, Google Analytics ter druge sisteme za nadzor uporabe in statistiko."
}
"content": "Spoznajte svoje uporabnike z enostavno integracijo v Piwik, Google Analytics ter druge sisteme za nadzor uporabe in statistiko.",
"title": "Statistika uporabe"
},
"go": "POJDI",
"join": "",
"privacy": "",
"roomname": "Vpišite ime sobe",
"roomnamePlaceHolder": "",
"sendFeedback": "",
"terms": ""
},
"startupoverlay": {
"policyText": "",
@@ -81,9 +99,12 @@
},
"suspendedoverlay": {
"title": "",
"text": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "Utišaj / Povrni glasnost",
"videomute": "",
"authenticate": "Overi",
@@ -110,6 +131,13 @@
"profile": "",
"raiseHand": ""
},
"unsupportedBrowser": {
"appInstalled": "",
"appNotInstalled": "",
"downloadApp": "",
"joinConversation": "",
"startConference": ""
},
"bottomtoolbar": {
"chat": "Odpri / zapri klepetalnico",
"filmstrip": "",
@@ -133,12 +161,10 @@
"selectAudioOutput": "",
"followMe": "",
"noDevice": "",
"noPermission": "",
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
"audioVideo": ""
},
"profile": {
"title": "",
@@ -154,13 +180,15 @@
"kick": "Izženi",
"muted": "Utišan",
"domute": "Utišaj",
"flip": ""
"flip": "",
"remoteControl": ""
},
"connectionindicator": {
"header": "",
"bitrate": "Bitna hitrost:",
"packetloss": "Izgubljeni paketi:",
"resolution": "Ločljivost:",
"framerate": "",
"less": "Pokaži manj",
"more": "Pokaži več",
"address": "Naslov:",
@@ -182,7 +210,8 @@
"remoteaddress_plural_3": "Oddaljeni naslovi:",
"transport": "Prenos:",
"bandwidth": "Ocenjena pasovna širina:",
"na": "Ko se konferenca začne se vrnite sem za informacije o povezavi"
"na": "Ko se konferenca začne se vrnite sem za informacije o povezavi",
"turn": ""
},
"notify": {
"disconnected": "odklopjeno",
@@ -193,13 +222,14 @@
"focus": "Fokus na konferenco",
"focusFail": "__component__ ni na razpolago - ponovni poskus čez __ms__ sec",
"grantedTo": "Moderatorske pravice dodeljene uporabniku __to__!",
"grantedToUnknown": "Moderatorske pravice dodeljene uporabniku $t(somebody)!",
"grantedToUnknown": "",
"muted": "Pogovor ste začeli utišano.",
"mutedTitle": "Utišani ste!",
"raisedHand": ""
},
"dialog": {
"add": "",
"allow": "",
"kickMessage": "Ojej! Izgnali so vas iz srečanja!",
"popupError": "",
"passwordErrorTitle": "",
@@ -211,8 +241,6 @@
"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",
@@ -221,8 +249,7 @@
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"rejoinNow": "",
"maxUsersLimitReached": "",
"lockTitle": "Zaklepanje ni uspelo",
"lockMessage": "",
@@ -262,8 +289,6 @@
"Save": "Shrani",
"recording": "",
"recordingToken": "Vnesite žeton za registracijo",
"Dial": "Pokliči",
"sipMsg": "Vnesite številko SIP",
"passwordCheck": "Ali res želite odstraniti geslo?",
"passwordMsg": "Nastavite geslo za zaklepanje sobe",
"shareLink": "",
@@ -286,7 +311,6 @@
"enterDisplayName": "",
"extensionRequired": "",
"firefoxExtensionPrompt": "",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "",
@@ -318,9 +342,23 @@
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"inlineInstallationMsg": "",
"inlineInstallExtension": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Utišaj"
"muteParticipantButton": "Utišaj",
"remoteControlTitle": "",
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "",
"remoteControlAllowedMessage": "",
"remoteControlErrorMessage": "",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"email": {
"sharedKey": "",
@@ -373,7 +411,73 @@
"failedToStart": "",
"buttonTooltip": "",
"streamIdRequired": "",
"streamIdHelp": "",
"error": "",
"busy": ""
},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "Ime",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Pokliči",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -1,19 +1,30 @@
{
"contactlist": "",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"contactlist": "Deltagare (__pcount__)",
"addParticipants": "Dela URL:en",
"roomLocked": "Inringande måste ange lösenord",
"roomUnlocked": "Alla med URL:en kan ansluta",
"passwordSetRemotely": "satt av en annan deltagare",
"connectionsettings": "Anslutningsinställningar",
"poweredby": "drivs av",
"feedback": "Ge oss din feedback",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "Skatta mötesupplevelsen.",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Din konferens håller på att skapas...",
"me": "jag",
"speaker": "Talare",
"raisedHand": "",
"defaultNickname": "",
"raisedHand": "Vill göra ett inlägg",
"defaultNickname": "t ex. Emma Röd",
"defaultLink": "t ex. __url__",
"callingName": "",
"callingName": "__name__",
"audioOnly": {
"audioOnly": "",
"featureToggleDisabled": ""
},
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -22,98 +33,115 @@
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": ""
"nwjsGrantPermissions": "Tillåt användning av din kamera och mikrofon",
"edgeGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
"raiseHand": "",
"pushToTalk": "",
"toggleScreensharing": "",
"toggleFilmstrip": "",
"toggleShortcuts": "",
"focusLocal": "",
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
"keyboardShortcuts": "Tangentbordsgenvägar",
"raiseHand": "Räck upp eller ta ner din jag vill ha ordet-hand",
"pushToTalk": "Tryck-för-att-prata",
"toggleScreensharing": "Växla mellan kamera och skärmdelning",
"toggleFilmstrip": "Visa eller dölj videorna ",
"toggleShortcuts": "Visa eller dölj hjälpmenyn",
"focusLocal": "Sätt fokus på din videobild",
"focusRemote": "Sätt fokus på annan deltagares videobild",
"toggleChat": "Öppna eller stäng chatten",
"mute": "Tysta eller aktivera din mikrofon",
"fullScreen": "Aktivera / avaktivera helskärm",
"videoMute": "Aktivera / avaktivera din kamera",
"showSpeakerStats": ""
},
"welcomepage": {
"go": "KÖR",
"roomname": "Skriv in rumsnamn",
"disable": "",
"disable": "Visa inte denna sida igen",
"feature1": {
"title": "Enkelt att använda",
"content": "Ingen nedladdning behövs. __app__ fungerar direkt inuti din webbläsare. Dela bara din konferens-URL med andra för att börja."
"content": "Ingen nedladdning behövs. __app__ fungerar direkt inuti din webbläsare. Dela bara din konferens-URL med andra för att börja.",
"title": "Enkelt att använda"
},
"feature2": {
"title": "Låg bandbredd",
"content": "Flerpartsvideokonferens fungerar med så lite som 128kbps. Skärmdelning och konferens med endast ljud är möjliga med betydligt mindre."
"content": "Flerpartsvideokonferens fungerar med så lite som 128kbps. Skärmdelning och konferens med endast ljud är möjliga med betydligt mindre.",
"title": "Låg bandbredd"
},
"feature3": {
"title": "Öppen källkod",
"content": "__app__ är licensierad under Apache-licens. Du är fri att ladda ner, använda, ändra och dela programvaran utifrån den här licensen."
"content": "__app__ är licensierad under Apache-licens. Du är fri att ladda ner, använda, ändra och dela programvaran utifrån den här licensen.",
"title": "Öppen källkod"
},
"feature4": {
"title": "Obegränsade användare",
"content": "Det finns inga artificiella restriktioner på antalet användare eller konferensdeltagare. Serverkraft och bandbredd är den enda begränsande faktorn."
"content": "Det finns inga artificiella restriktioner på antalet användare eller konferensdeltagare. Serverkraft och bandbredd är den enda begränsande faktorn.",
"title": "Obegränsade användare"
},
"feature5": {
"title": "Skärmdelning",
"content": "Det är enkelt att dela din skärm med andra. __app__ är idealiskt för online-presentationer, föreläsningar och teknikstödssessioner."
"content": "Det är enkelt att dela din skärm med andra. __app__ är idealiskt för online-presentationer, föreläsningar och teknikstödssessioner.",
"title": "Skärmdelning"
},
"feature6": {
"title": "Säkra rum",
"content": "Behöver du vara privat? Konferensrummen i __app__ kan säkras med lösenord för att exkludera oönskade gäster och förhindra störningsmoment."
"content": "Behöver du vara privat? Konferensrummen i __app__ kan säkras med lösenord för att exkludera oönskade gäster och förhindra störningsmoment.",
"title": "Säkra rum"
},
"feature7": {
"title": "Delade anteckningar",
"content": "__app__ använder sig av Etherpad, en kollaborativ textredigerare där du och konferensdeltagarna gemensamt kan skriva mötesanteckningar, artiklar eller annat."
"content": "__app__ använder sig av Etherpad, en kollaborativ textredigerare där du och konferensdeltagarna gemensamt kan skriva mötesanteckningar, artiklar eller annat.",
"title": "Delade anteckningar"
},
"feature8": {
"title": "Användningsstatistik",
"content": "Studera användningsmönster genom enkel integration med Piwik, Google Analytics och andra monitorerings- och statistiksystem."
}
"content": "Studera användningsmönster genom enkel integration med Piwik, Google Analytics och andra monitorerings- och statistiksystem.",
"title": "Användningsstatistik"
},
"go": "KÖR",
"join": "Gå med",
"privacy": "Integritet",
"roomname": "Skriv in rumsnamn",
"roomnamePlaceHolder": "rumsnamn",
"sendFeedback": "Ge återkoppling",
"terms": "Termer"
},
"startupoverlay": {
"policyText": "",
"title": ""
"title": "__app__ vill använda din kamera och mikrofon."
},
"suspendedoverlay": {
"title": "",
"rejoinKeyTitle": ""
"text": "",
"rejoinKeyTitle": "Gå med igen"
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "Slå av/på ljud",
"videomute": "",
"videomute": "Aktivera / avaktivera kameran",
"authenticate": "Autentisera",
"lock": "",
"invite": "",
"chat": "",
"etherpad": "",
"sharedvideo": "",
"sharescreen": "",
"fullscreen": "",
"lock": "Lås / lås upp rummet",
"invite": "Dela URL:en",
"chat": "Öppna / stäng chatten",
"etherpad": "Öppna / stäng delade dokument",
"sharedvideo": "Dela en Youtube-video",
"sharescreen": "Aktivera / avaktivera skärmdelning",
"fullscreen": "Aktivera / avaktivera helskärm",
"sip": "Ring SIP-nummer",
"Settings": "Inställningar",
"hangup": "",
"hangup": "Lämna",
"login": "Logga in",
"logout": "Logga ut",
"dialpad": "",
"sharedVideoMutedPopup": "",
"micMutedPopup": "",
"talkWhileMutedPopup": "",
"unableToUnmutePopup": "",
"cameraDisabled": "",
"micDisabled": "",
"filmstrip": "",
"profile": "",
"raiseHand": ""
"dialpad": "Visa / dölj knappsatsen",
"sharedVideoMutedPopup": "Din delade video har stängts av så<br/>att du kan prata med de andra deltagarna.",
"micMutedPopup": "Din mikrofon har tystats så<br/>att du kan njuta av din delade video.",
"talkWhileMutedPopup": "Försöker du tala? Din mikrofon är tystad.",
"unableToUnmutePopup": "Du kan inte slå på mikrofonen när delad video är på.",
"cameraDisabled": "Kameran är inte tillgänglig",
"micDisabled": "Mikrofonen är inte tillgänglig",
"filmstrip": "Visa / dölj videor",
"profile": "Redigera din profil",
"raiseHand": "Räck upp / ta ner din hand"
},
"unsupportedBrowser": {
"appInstalled": "eller om du redan har den<br /><strong>då</strong>",
"appNotInstalled": "Du behöver <strong>__app__</strong> för att gå med i mötet på din mobil",
"downloadApp": "Hämta appen",
"joinConversation": "Gå med i samtalet",
"startConference": "Påbörja ett möte"
},
"bottomtoolbar": {
"chat": "Öppna / stäng chat",
"filmstrip": "",
"contactlist": ""
"filmstrip": "Visa eller dölj videor",
"contactlist": "Bjud in deltagare"
},
"chat": {
"nickname": {
@@ -126,41 +154,41 @@
"title": "Inställningar",
"update": "Uppdatera",
"name": "Namn",
"startAudioMuted": "",
"startVideoMuted": "",
"selectCamera": "",
"selectMic": "",
"selectAudioOutput": "",
"followMe": "",
"noDevice": "",
"noPermission": "",
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
"startAudioMuted": "Alla börjar tystade",
"startVideoMuted": "Alla börjar osynliga",
"selectCamera": "Kamera",
"selectMic": "Mikrofon",
"selectAudioOutput": "Ljudutmatning",
"followMe": "Alla följer mej",
"noDevice": "Inga enheter",
"cameraAndMic": "Kamera och mikrofon",
"moderator": "MODERATOR",
"password": "Ställ in lösenord",
"audioVideo": "Audio och video"
},
"profile": {
"title": "",
"setDisplayNameLabel": "",
"setEmailLabel": "",
"setEmailInput": ""
"title": "Profil",
"setDisplayNameLabel": "Ange ditt visningsnamn",
"setEmailLabel": "Ange din gravatar-e-postadress",
"setEmailInput": "Skriv e-postadress"
},
"videothumbnail": {
"editnickname": "Klicka här för att <br/>redigera namn",
"moderator": "Ägaren av den<br/>här konferensen",
"videomute": "",
"videomute": "Deltagaren har<br/>stängt av kameran.",
"mute": "Deltagaren har avstängd mikrofon",
"kick": "Sparka ut",
"muted": "Tystad",
"domute": "Tysta",
"flip": ""
"flip": "Vänd",
"remoteControl": "Fjärrkontroll"
},
"connectionindicator": {
"header": "",
"header": "Anslutningsinformation",
"bitrate": "Bithastighet:",
"packetloss": "Paketförluster:",
"resolution": "Upplösning:",
"framerate": "",
"less": "Visa mindre",
"more": "Visa mer",
"address": "Adress:",
@@ -174,7 +202,8 @@
"remoteaddress_plural": "Fjärradresser:",
"transport": "Transport:",
"bandwidth": "Beräknad bandbredd:",
"na": "Återkom hit för uppkopplingsinformation när konferensen startat"
"na": "Återkom hit för uppkopplingsinformation när konferensen startat",
"turn": ""
},
"notify": {
"disconnected": "frånkopplad",
@@ -185,27 +214,26 @@
"focus": "Konferensfokus",
"focusFail": "__componen__ inte tillgänglig - försöker igen om __ms__ sek",
"grantedTo": "Moderatorsrättigheter tilldelat till __to__!",
"grantedToUnknown": "Moderatorsrättigheter tilldelat till $t(somebody)!",
"grantedToUnknown": "",
"muted": "Du har startat konversationen utan mikrofon.",
"mutedTitle": "Du har mikrofonen avstängd!",
"raisedHand": ""
"raisedHand": "Begär ordet."
},
"dialog": {
"add": "",
"add": "Lägg till",
"allow": "",
"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": "",
"passwordErrorTitle": "Lösenordsfel",
"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": "",
"incorrectPassword": "Lösenordet är felaktigt",
"connecting": "Ansluter",
"copy": "",
"copy": "Kopiera",
"error": "Fel",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"createPassword": "Ange ett lösenord",
"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.",
@@ -213,37 +241,36 @@
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"maxUsersLimitReached": "",
"rejoinNow": "",
"maxUsersLimitReached": "Gränsen för antal deltagare är nådd. Konferensrummet är full. Försök igen senare!",
"lockTitle": "Låsning misslyckades",
"lockMessage": "Misslyckades att låsa konferensen.",
"warning": "Varning",
"passwordNotSupported": "Rumslösenord stöds inte för tillfället.",
"internalErrorTitle": "",
"internalError": "",
"internalErrorTitle": "Internt fel",
"internalError": "Hoppsan! Något gick fel: [setRemoteDescription]",
"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": "",
"currentPassword": "Nuvarande lösenord är",
"passwordLabel": "Lösenord",
"defaultError": "Det uppstod någon typ av fel",
"passwordRequired": "Lösenord krävs",
"Ok": "Ok",
"done": "",
"done": "Klar",
"Remove": "Ta bort",
"removePassword": "",
"shareVideoTitle": "",
"shareVideoLinkError": "",
"removeSharedVideoTitle": "",
"removeSharedVideoMsg": "",
"alreadySharedVideoMsg": "",
"removePassword": "Ta bort lösenordet",
"shareVideoTitle": "Ta bort en delad video",
"shareVideoLinkError": "Skriv in en fungerande Youtube-länk.",
"removeSharedVideoTitle": "Ta bort den delade videon",
"removeSharedVideoMsg": "Är du säker på att du vill ta bort din delade video?",
"alreadySharedVideoMsg": "En annan deltagare delar redan en video. Mötesrummet tillåter endast en delad video åt gången.",
"WaitingForHost": "Väntar på värden ...",
"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": "",
"Submit": "Skicka",
"retry": "Försök igen",
"logoutTitle": "Logga ut",
"logoutQuestion": "Är du säker på att du vill logga ut och stoppa konferensen?",
@@ -252,69 +279,79 @@
"joinAgain": "Anslut igen",
"Share": "Dela",
"Save": "Spara",
"recording": "",
"recording": "Inspelning",
"recordingToken": "Skriv in inspelnings-token",
"Dial": "Ring upp",
"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",
"shareLink": "",
"shareLink": "Dela URL:en till mötesrummet",
"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": "",
"yourPassword": "Ange nytt lösenord",
"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": "",
"password": "Ange lösenord",
"userPassword": "användarlösenord",
"token": "token",
"tokenAuthFailedTitle": "",
"tokenAuthFailed": "",
"displayNameRequired": "",
"enterDisplayName": "",
"tokenAuthFailedTitle": "Autentisering misslyckades",
"tokenAuthFailed": "Du är inte behörig att delta i det här samtalet.",
"displayNameRequired": "Visningsnamn krävs",
"enterDisplayName": "Skriv ditt visningsnamn",
"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>!",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"feedbackHelp": "Din återkoppling gör att vi kan förbättra videoupplevelsen.",
"feedbackQuestion": "Berätta om ditt samtal!",
"thankYou": "Tack för att du använder __appName__!",
"sorryFeedback": "Tråkigt att du känner så. Vill du berätta mer?",
"liveStreaming": "",
"streamKey": "",
"startLiveStreaming": "",
"stopStreamingWarning": "",
"stopRecordingWarning": "",
"stopLiveStreaming": "",
"stopRecording": "",
"doNotShowWarningAgain": "",
"doNotShowMessageAgain": "",
"permissionDenied": "",
"screenSharingPermissionDeniedError": "",
"micErrorPresent": "",
"cameraErrorPresent": "",
"cameraUnsupportedResolutionError": "",
"cameraUnknownError": "",
"cameraPermissionDeniedError": "",
"cameraNotFoundError": "",
"liveStreaming": "Strömma",
"streamKey": "Strömnamn/nyckel",
"startLiveStreaming": "Strömma",
"stopStreamingWarning": "Vill du avsluta den pågående strömningen?",
"stopRecordingWarning": "Vill du avsluta den pågående inspelningen?",
"stopLiveStreaming": "Avsluta strömningen",
"stopRecording": "Avsluta inspelningen",
"doNotShowWarningAgain": "Visa inte denna varning igen",
"doNotShowMessageAgain": "Visa inte detta meddelande igen",
"permissionDenied": "Åtkomst nekad",
"screenSharingPermissionDeniedError": "Du har inte gett tillåtelse att dela din skärm.",
"micErrorPresent": "Kunde inte ansluta din mikrofon.",
"cameraErrorPresent": "Det gick inte att ansluta din kamera.",
"cameraUnsupportedResolutionError": "Din kamera stöder inte den krävda videoupplösningen.",
"cameraUnknownError": "Av okänd anledning kan din kamera inte användas.",
"cameraPermissionDeniedError": "Du har inte tillåtit användning av din kamera. Du kan gå med i mötet men de andra kan då inte se dej. Om du vill tillåta användning av din kamera gör du det via kameraknappen i URL-fältet.",
"cameraNotFoundError": "Hittar ingen kamera.",
"cameraConstraintFailedError": "",
"micUnknownError": "",
"micPermissionDeniedError": "",
"micNotFoundError": "",
"micUnknownError": "Av okänd anledning kan inte din mikrofon användas.",
"micPermissionDeniedError": "Du har inte tillåtit användning av din mikrofon. Du kan gå med i mötet men de andra kan då inte höra dej. Om du vill tillåta användning av din mikrofon gör du det via mikrofonknappen i URL-fältet.",
"micNotFoundError": "Hittar ingen mikrofon.",
"micConstraintFailedError": "",
"micNotSendingData": "",
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Tysta"
"micNotSendingData": "Kan inte ansluta din mikrofon. Välj en annan mikrofonenhet från inställningsmenyn eller försök starta/ladda om.",
"cameraNotSendingData": "Kan inte ansluta din kamera. Välj en annan kameraenhet från inställningsmenyn eller försök starta/ladda om.",
"goToStore": "Gå till appbutiken",
"externalInstallationTitle": "Tillägg krävs",
"externalInstallationMsg": "Misslyckades att installera skrivbordsdelnings-tillägget.",
"inlineInstallationMsg": "Misslyckades att installera skrivbordsdelnings-tillägget.",
"inlineInstallExtension": "",
"muteParticipantTitle": "Tysta deltagaren?",
"muteParticipantBody": "Du kan inte aktivera deras mikrofoner, men de kan göra det själva.",
"muteParticipantButton": "Tysta",
"remoteControlTitle": "",
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "__user__ avböjde din begäran om fjärrstyrning.",
"remoteControlAllowedMessage": "__user__ godkände din begäran om fjärrstyrning.",
"remoteControlErrorMessage": "Ett fel uppstod när fjärrstyrningsrättigheter begärdes från __user__.",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "Fjärrstyrningssessionen avslutades.",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"\u0005dialog": {},
"email": {
"sharedKey": [
"Den här konferensen är lösenordsskyddad. Vänligen använd följande kod när du kopplar upp dig:",
@@ -356,23 +393,89 @@
"ATTACHED": "Ansluten"
},
"recording": {
"pending": "",
"on": "",
"off": "",
"failedToStart": "",
"buttonTooltip": "",
"error": "",
"unavailable": ""
"pending": "Inspelningen väntar på att deltagare ska gå med ...",
"on": "Inspelning",
"off": "Inspelningen avslutades",
"failedToStart": "Inspelningen kunde inte påbörjas",
"buttonTooltip": "Börja / sluta spela in",
"error": "Inspelningen misslyckades. Försök igen.",
"unavailable": "Inspelningstjänsten är tillfälligt inte tillgänglig. Försök igen senare."
},
"liveStreaming": {
"pending": "",
"on": "",
"off": "",
"unavailable": "",
"failedToStart": "",
"buttonTooltip": "",
"streamIdRequired": "",
"error": "",
"busy": ""
"pending": "Börja strömma ...",
"on": "Strömma",
"off": "Strömning avslutad",
"unavailable": "Strömningstjänsten är tillfälligt inte tillgänglig. Försök igen senare.",
"failedToStart": "Strömningen kunde inte påbörjas",
"buttonTooltip": "Börja / sluta strömma",
"streamIdRequired": "Fyll i strömnings-id:t för att för att börja strömma.",
"streamIdHelp": "Var hittar jag det?",
"error": "Strömning misslyckades. Försök igen.",
"busy": "Alla inspelare är upptagna. Försök igen senare."
},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "Namn",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Ring upp",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "Lägg till",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -1,19 +1,30 @@
{
"contactlist": "",
"contactlist": "Katılımcılar (__pcount__)",
"addParticipants": "",
"roomLocked": "",
"roomUnlocked": "",
"passwordSetRemotely": "",
"roomLocked": "Katılımcı şifresi zorunludur",
"roomUnlocked": "Bağlantı ile herkes katılabilir.",
"passwordSetRemotely": "Diğer katılımcı tarafından ayarlandı",
"connectionsettings": "Bağlantı Ayarları",
"poweredby": "Gücünün kaynağı",
"feedback": "",
"inviteUrlDefaultMsg": "",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Konferans başlatılıyor...",
"me": "",
"speaker": "",
"raisedHand": "",
"defaultNickname": "",
"defaultLink": "",
"callingName": "",
"audioOnly": {
"audioOnly": "",
"featureToggleDisabled": ""
},
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
@@ -22,7 +33,8 @@
"operaGrantPermissions": "",
"iexplorerGrantPermissions": "",
"safariGrantPermissions": "",
"nwjsGrantPermissions": ""
"nwjsGrantPermissions": "",
"edgeGrantPermissions": ""
},
"keyboardShortcuts": {
"keyboardShortcuts": "",
@@ -35,45 +47,52 @@
"focusRemote": "",
"toggleChat": "",
"mute": "",
"fullScreen": "",
"videoMute": ""
"fullScreen": "Tam Ekrana Gir / Çık",
"videoMute": "",
"showSpeakerStats": ""
},
"\u0005keyboardShortcuts": {},
"welcomepage": {
"go": "GİT",
"roomname": "Oda adı girin",
"disable": "",
"feature1": {
"title": "Kullanımı kolay",
"content": "İndirmeye gerek yok. __app__ tarayıcınızda doğrudan çalışır. Başlamak için görüşme bağlantısını URL diğerleri ile paylaşın."
"content": "İndirmeye gerek yok. __app__ tarayıcınızda doğrudan çalışır. Başlamak için görüşme bağlantısını URL diğerleri ile paylaşın.",
"title": "Kullanımı kolay"
},
"feature2": {
"title": "Düşük bant genişliği ihtiyacı",
"content": "Ekran paylaşımı ve sadece ses ile çok katılımcılı video görüşmeleri, 128Kbps bağlantı ile mümkündür."
"content": "Ekran paylaşımı ve sadece ses ile çok katılımcılı video görüşmeleri, 128Kbps bağlantı ile mümkündür.",
"title": "Düşük bant genişliği ihtiyacı"
},
"feature3": {
"title": "ık kaynak kodlu",
"content": ""
"content": "",
"title": "ık kaynak kodlu"
},
"feature4": {
"title": "Sınırsız sayıda kullanıcı",
"content": "Kullanıcılar veya konferans katılımcılarının sayısında hiçbir yapay kısıtlama yoktur. Sadece sunucun güç ve bant genişliği, sınırlayıcı unsurdur."
"content": "Kullanıcılar veya konferans katılımcılarının sayısında hiçbir yapay kısıtlama yoktur. Sadece sunucun güç ve bant genişliği, sınırlayıcı unsurdur.",
"title": "Sınırsız sayıda kullanıcı"
},
"feature5": {
"title": "Ekran paylaşımı",
"content": "Diğerlerinle ekranınızı kolayca paylaşın. __app__ çevrimiçi sunumlar, dersler ve teknik destek oturumları için idealdir."
"content": "Diğerlerinle ekranınızı kolayca paylaşın. __app__ çevrimiçi sunumlar, dersler ve teknik destek oturumları için idealdir.",
"title": "Ekran paylaşımı"
},
"feature6": {
"title": "Güvenli odalar",
"content": "Biraz gizliliğe ihtiyacınız var? __app__ görüşme odaları, istemeyen misafirleri uzak tutmak ve kesinleri önlemek için bir parola ile güvence altına alınabilir."
"content": "Biraz gizliliğe ihtiyacınız var? __app__ görüşme odaları, istemeyen misafirleri uzak tutmak ve kesinleri önlemek için bir parola ile güvence altına alınabilir.",
"title": "Güvenli odalar"
},
"feature7": {
"title": "Paylaşımlı notlar",
"content": "__app__ Etherpad içerir, gerçek zamanlı bir ortak çalışma metin düzenleyicisidir. Görüşme tutanakları, makale yazımı ve daha fazlası için biçilmiş kaftandır."
"content": "__app__ Etherpad içerir, gerçek zamanlı bir ortak çalışma metin düzenleyicisidir. Görüşme tutanakları, makale yazımı ve daha fazlası için biçilmiş kaftandır.",
"title": "Paylaşımlı notlar"
},
"feature8": {
"title": "Kullanım istatistikleri",
"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."
}
"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.",
"title": "Kullanım istatistikleri"
},
"go": "GİT",
"join": "",
"privacy": "",
"roomname": "Oda adı girin",
"roomnamePlaceHolder": "",
"sendFeedback": "",
"terms": ""
},
"startupoverlay": {
"policyText": "",
@@ -81,19 +100,22 @@
},
"suspendedoverlay": {
"title": "",
"text": "",
"rejoinKeyTitle": ""
},
"toolbar": {
"addPeople": "",
"audioonly": "",
"mute": "Sessiz / Sesli",
"videomute": "",
"videomute": "Kamera başlat / durdur",
"authenticate": "Kimlik doğrula",
"lock": "",
"lock": "Odayı kilitle / kilit aç",
"invite": "",
"chat": "",
"chat": "Sohbeti aç / kapa",
"etherpad": "",
"sharedvideo": "",
"sharescreen": "",
"fullscreen": "",
"fullscreen": "Tam Ekrana Gir / Çık",
"sip": "SIP numara ara",
"Settings": "Ayarlar",
"hangup": "",
@@ -110,6 +132,14 @@
"profile": "",
"raiseHand": ""
},
"\u0005toolbar": {},
"unsupportedBrowser": {
"appInstalled": "",
"appNotInstalled": "",
"downloadApp": "",
"joinConversation": "",
"startConference": ""
},
"bottomtoolbar": {
"chat": "Sohbeti aç / kapa",
"filmstrip": "",
@@ -133,12 +163,10 @@
"selectAudioOutput": "",
"followMe": "",
"noDevice": "",
"noPermission": "",
"cameraAndMic": "",
"moderator": "",
"password": "",
"audioVideo": "",
"setPasswordLabel": ""
"audioVideo": ""
},
"profile": {
"title": "",
@@ -149,18 +177,21 @@
"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": "",
"videomute": "Katılımcı<br/>kamera durdurdu.",
"mute": "Katılımcı sessiz",
"kick": "Kovuldu",
"muted": "Sessiz",
"domute": "Sustur",
"flip": ""
"flip": "",
"remoteControl": ""
},
"\u0005videothumbnail": {},
"connectionindicator": {
"header": "",
"bitrate": "Bit hızı:",
"packetloss": "Paket kaybı:",
"resolution": "Çözünürlük:",
"framerate": "",
"less": "Daha az göster",
"more": "Daha fazla göster",
"address": "Adres:",
@@ -170,7 +201,8 @@
"remoteaddress": "Uzak adres:Uzak adresler:",
"transport": "Transport:",
"bandwidth": "Tahmini bant genişliği:",
"na": "Görüşme başladıktan sonra bağlantı bilgileri için buraya gel"
"na": "Görüşme başladıktan sonra bağlantı bilgileri için buraya gel",
"turn": ""
},
"notify": {
"disconnected": "bağlantı kesildi",
@@ -186,8 +218,10 @@
"mutedTitle": "",
"raisedHand": ""
},
"\u0005notify": {},
"dialog": {
"add": "",
"allow": "",
"kickMessage": "Ahhh! Görüşmeden, kavuldun!",
"popupError": "",
"passwordErrorTitle": "",
@@ -199,8 +233,6 @@
"connecting": "",
"copy": "",
"error": "Hata",
"roomLocked": "",
"addPassword": "",
"createPassword": "",
"detectext": "Ekran paylaşımı eklentisi tespit edilirken hata.",
"failtoinstall": "Masaüstü paylaşım eklentisi yüklenemedi",
@@ -209,8 +241,7 @@
"conferenceReloadMsg": "",
"conferenceDisconnectTitle": "",
"conferenceDisconnectMsg": "",
"reconnectNow": "",
"conferenceReloadTimeLeft": "",
"rejoinNow": "",
"maxUsersLimitReached": "",
"lockTitle": "Kilitlenemedi",
"lockMessage": "Görüşme kilitlenemedi.",
@@ -231,9 +262,9 @@
"Remove": "Kaldır",
"removePassword": "",
"shareVideoTitle": "",
"shareVideoLinkError": "",
"shareVideoLinkError": "Lütfen doğru prezi bağlantısı verin.",
"removeSharedVideoTitle": "",
"removeSharedVideoMsg": "",
"removeSharedVideoMsg": "Prezi kaldırmak istediğinizden emin misiniz?",
"alreadySharedVideoMsg": "",
"WaitingForHost": "",
"WaitForHostMsg": "",
@@ -250,22 +281,20 @@
"Save": "Kaydet",
"recording": "",
"recordingToken": "Kayıt jetonu girin",
"Dial": "Ara",
"sipMsg": "SIP numarası gir",
"passwordCheck": "Parolanızı kaldırmak istediğinizden emin misiniz?",
"passwordMsg": "Odanızı kilitlemek için bir parola koyun",
"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": "",
"yourPassword": "parolanız",
"Back": "Geri",
"serviceUnavailable": "Hizmet kullanım dışı",
"gracefulShutdown": "Hizmetimiz bakıp için durduruldu. Daha sonra tekrar deneyiniz.",
"Yes": "Evet",
"reservationError": "Rezervasyon sistemi hatası",
"reservationErrorMsg": "Hata kodu: __code__, mesaj: __msg__",
"password": "",
"password": "parolanız",
"userPassword": "parolanız",
"token": "",
"tokenAuthFailedTitle": "",
@@ -274,7 +303,6 @@
"enterDisplayName": "",
"extensionRequired": "",
"firefoxExtensionPrompt": "",
"rateExperience": "",
"feedbackHelp": "",
"feedbackQuestion": "",
"thankYou": "",
@@ -305,10 +333,24 @@
"cameraNotSendingData": "",
"goToStore": "",
"externalInstallationTitle": "",
"externalInstallationMsg": "",
"externalInstallationMsg": "Masaüstü paylaşım eklentisi yüklenemedi",
"inlineInstallationMsg": "Masaüstü paylaşım eklentisi yüklenemedi",
"inlineInstallExtension": "",
"muteParticipantTitle": "",
"muteParticipantBody": "",
"muteParticipantButton": "Sustur"
"muteParticipantButton": "Sustur",
"remoteControlTitle": "",
"remoteControlRequestMessage": "",
"remoteControlShareScreenWarning": "",
"remoteControlDeniedMessage": "",
"remoteControlAllowedMessage": "",
"remoteControlErrorMessage": "",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "",
"close": "",
"shareYourScreen": "",
"yourEntireScreen": "",
"applicationWindow": ""
},
"\u0005dialog": {},
"email": {
@@ -347,7 +389,73 @@
"failedToStart": "",
"buttonTooltip": "",
"streamIdRequired": "",
"streamIdHelp": "",
"error": "",
"busy": ""
},
"speakerStats": {
"hours": "",
"minutes": "",
"name": "Ad",
"seconds": "",
"speakerStats": "",
"speakerTime": ""
},
"deviceSelection": {
"deviceSettings": "",
"noPermission": "",
"previewUnavailable": "",
"selectADevice": "",
"testAudio": ""
},
"invite": {
"addPassword": "",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "",
"inviteTo": "",
"invitedYouTo": "",
"locked": "",
"showPassword": "",
"unlocked": ""
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Ara",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -1,12 +1,19 @@
{
"contactlist": "Người tham gia (__pcount__)",
"addParticipants": "",
"addParticipants": "Chia sẻ đường dẫn",
"roomLocked": "Người gọi phải nhập mật khẩu",
"roomUnlocked": "Bất kỳ ai có đường dẫn có thể tham gia",
"passwordSetRemotely": "được thiết lập bởi một người khác",
"connectionsettings": "Cài đặt kết nối",
"poweredby": "Được hỗ trợ bởi",
"feedback": "Góp ý cho chúng tôi",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "Vui lòng đánh giá trải nghiệm cuộc họp của bạn.",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "Hội nghị của bạn hiện đang được tạo...",
"me": "Tôi",
"speaker": "Diễn giả",
@@ -16,16 +23,15 @@
"callingName": "__name__",
"audioOnly": {
"audioOnly": "Chỉ âm thanh",
"featureToggleDisabled": "Việc chuyển đổi __feature__ bị vô hiệu hóa khi đang ở chế độ chỉ âm thanh",
"howToDisable": "Chế độ chỉ âm thanh đang được kích hoạt. Nhấp vào nút chỉ âm thanh ở thanh công cụ để vô hiệu hóa tính năng này"
"featureToggleDisabled": "Việc chuyển đổi __feature__ bị vô hiệu hóa khi đang ở chế độ chỉ âm thanh"
},
"userMedia": {
"react-nativeGrantPermissions": "",
"chromeGrantPermissions": "",
"androidGrantPermissions": "",
"react-nativeGrantPermissions": "Chọn <b><i>Cho phép</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
"chromeGrantPermissions": "Chọn <b><i>Cho phép</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
"androidGrantPermissions": "Chọn <b><i>Cho phép</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
"firefoxGrantPermissions": "Chọn <b><i>Chia sẻ thiết bị đã chọn</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
"operaGrantPermissions": "Chọn <b><i>Cho phép</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
"iexplorerGrantPermissions": "",
"iexplorerGrantPermissions": "Chọn <b><i>Có</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
"safariGrantPermissions": "Chọn <b><i>Có</i></b> khi trình duyệt của bạn yêu cầu cấp phép.",
"nwjsGrantPermissions": "Vui lòng cấp quyền sử dụng camera và microphone của bạn",
"edgeGrantPermissions": "Chọn <b><i>Có</i></b> khi trình duyệt của bạn yêu cầu cấp phép."
@@ -92,11 +98,12 @@
"title": "__app__ cần sử dụng microphone và camera của bạn."
},
"suspendedoverlay": {
"title": "Cuộc gọi video của bạn đã bị gián đoạn vì máy tính này đã chuyển sang trạng thái ngủ.",
"text": "Bấm nút <i>Tham gia lại</i> để kết nối trở lại cuộc trò chuyện của bạn.",
"title": "",
"text": "",
"rejoinKeyTitle": "Tham gia lại"
},
"toolbar": {
"addPeople": "",
"audioonly": "Bật / Tắt chế độ chỉ âm thanh (tiết kiệm băng thông)",
"mute": "Tắt tiếng / Bật tiếng",
"videomute": "Bật / Tắt camera",
@@ -109,10 +116,10 @@
"sharescreen": "Bắt đầu / Kết thúc chia sẻ màn hình",
"fullscreen": "Bật / Tắt chế độ toàn màn hình",
"sip": "Gọi số SIP",
"Settings": "",
"Settings": "Cài đặt",
"hangup": "Thoát",
"login": "Đăng nhập",
"logout": "",
"logout": "Đăng xuất",
"dialpad": "Mở / Đóng bàn phím số",
"sharedVideoMutedPopup": "Video chia sẻ của bạn đã bị tắt tiếng <br/> để bạn có thể nói chuyện với những người tham gia khác.",
"micMutedPopup": "Microphone của bạn đã bị tắt tiếng để bạn <br/> có thể thưởng thức video đã chia sẻ của bạn.",
@@ -146,7 +153,7 @@
"settings": {
"title": "Cài đặt",
"update": "Cập nhật",
"name": "",
"name": "Tên",
"startAudioMuted": "Mọi người bắt đầu đều bị tắt tiếng",
"startVideoMuted": "Mọi người bắt đầu đều bị ẩn",
"selectCamera": "Camera",
@@ -172,7 +179,7 @@
"mute": "Người tham gia bị tắt tiếng",
"kick": "Đẩy ra",
"muted": "Đã tắt tiếng",
"domute": "",
"domute": "Tắt tiếng",
"flip": "Lật",
"remoteControl": "Điều khiển từ xa"
},
@@ -196,7 +203,8 @@
"transport": "Vận chuyển:",
"transport_plural_undefined": "Các vận chuyển:",
"bandwidth": "Băng thông ước tính:",
"na": "Hãy quay trở lại đây để biết thông tin kết nối khi hội nghị bắt đầu"
"na": "Hãy quay trở lại đây để biết thông tin kết nối khi hội nghị bắt đầu",
"turn": ""
},
"notify": {
"disconnected": "đã ngắt kết nối",
@@ -223,9 +231,9 @@
"connectError": "Rất tiếc! Đã xảy ra sự cố và chúng tôi không thể kết nối với hội nghị.",
"connectErrorWithMsg": "Rất tiếc! Đã xảy ra sự cố và chúng tôi không thể kết nối với hội nghị: __msg__",
"incorrectPassword": "Sai mật khẩu",
"connecting": "",
"connecting": "Đang kết nối",
"copy": "Sao chép",
"error": "",
"error": "Lỗi",
"createPassword": "Tạo mật khẩu",
"detectext": "Lỗi khi cố gắng phát hiện tiện ích mở rộng chia sẻ máy tính.",
"failtoinstall": "Không thể cài đặt tiện ích mở rộng chia sẻ máy tính",
@@ -272,10 +280,8 @@
"joinAgain": "Tham gia lại",
"Share": "Chia sẻ",
"Save": "Lưu",
"recording": "",
"recording": "Đang ghi âm",
"recordingToken": "Nhập mã thông báo ghi âm",
"Dial": "Quay số",
"sipMsg": "Nhập số SIP",
"passwordCheck": "Bạn có chắc chắn muốn xóa mật khẩu của mình không?",
"passwordMsg": "Đặt mật khẩu để khóa phòng của bạn",
"shareLink": "Chia sẻ liên kết đến cuộc gọi",
@@ -298,12 +304,11 @@
"enterDisplayName": "Vui lòng nhập tên hiển thị của bạn",
"extensionRequired": "Yêu cầu tiện ích mở rộng:",
"firefoxExtensionPrompt": "Bạn cần phải cài đặt một tiện ích mở rộng của Firefox để chia sẻ màn hình. Vui lòng thử lại sau khi bạn <a href='__url__'>tải nó từ đây</a>!",
"rateExperience": "Vui lòng đánh giá trải nghiệm cuộc họp của bạn.",
"feedbackHelp": "Phản hồi của bạn sẽ giúp chúng tôi cải thiện trải nghiệm video.",
"feedbackQuestion": "Hãy cho chúng tôi biết về cuộc gọi của bạn!",
"thankYou": "Cám ơn bạn đã sử dụng __appName__!",
"sorryFeedback": "Chúng tôi rất tiếc khi nghe điều đó. Bạn có thể nói với chúng tôi thêm nữa không?",
"liveStreaming": "",
"liveStreaming": "Phát trực tuyến",
"streamKey": "Tên/khóa phát trực tuyến",
"startLiveStreaming": "Bắt đầu phát trực tuyến",
"stopStreamingWarning": "Bạn có chắc chắn muốn dừng phát trực tuyến?",
@@ -330,6 +335,8 @@
"goToStore": "Đi tới cửa hàng trên mạng",
"externalInstallationTitle": "Yêu cầu tiện ích mở rộng",
"externalInstallationMsg": "Bạn cần cài đặt tiện ích mở rộng chia sẻ máy tính của chúng tôi.",
"inlineInstallationMsg": "Bạn cần cài đặt tiện ích mở rộng chia sẻ máy tính của chúng tôi.",
"inlineInstallExtension": "",
"muteParticipantTitle": "Tắt tiếng của người tham dự này?",
"muteParticipantBody": "Bạn không thể tắt tiếng của họ, nhưng họ có thể tự tắt tiếng bất cứ lúc nào.",
"muteParticipantButton": "Tắt tiếng",
@@ -339,6 +346,7 @@
"remoteControlDeniedMessage": "__user__ đã từ chối yêu cầu điều khiển từ xa của bạn!",
"remoteControlAllowedMessage": "__user__ đã chấp nhận yêu cầu điều khiển từ xa của bạn!",
"remoteControlErrorMessage": "Đã xảy ra lỗi khi cố gắng yêu cầu quyền điều khiển từ xa từ __user__!",
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "Phiên điều khiển từ xa đã kết thúc!",
"close": "Đóng",
"shareYourScreen": "Chia sẻ màn hình của bạn",
@@ -423,15 +431,52 @@
},
"invite": {
"addPassword": "Thêm mật khẩu",
"dialInNumbers": "Số điện thoại quay số",
"errorFetchingNumbers": "Lấy số quay số thất bại",
"callNumber": "",
"enterID": "",
"howToDialIn": "",
"hidePassword": "Ẩn mật khẩu",
"inviteTo": "Mời mọi người tới __conferenceName__",
"loadingNumbers": "Đang tải...",
"invitedYouTo": "",
"locked": "Cuộc gọi này đã bị khóa. Bất kỳ người gọi mới nào đều phải có đường dẫn và nhập mật khẩu mới có thể tham gia.",
"noNumbers": "Không có số khả dụng",
"numbersDisabled": "Quay số đang bị vô hiệu hóa",
"showPassword": "Hiện mật khẩu",
"unlocked": "Cuộc gọi này đã được mở khóa. Bất kỳ người gọi mới nào có đường dẫn đều có thể tham gia."
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "Quay số",
"dialOut": "",
"statusMessage": "",
"enterPhone": "",
"phoneNotAllowed": ""
},
"addPeople": {
"add": "Thêm mới",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -6,7 +6,14 @@
"passwordSetRemotely": "由其他与会者设置",
"connectionsettings": "连接设置",
"poweredby": "技术支持",
"feedback": "请给我们您的反馈",
"feedback": {
"average": "",
"bad": "",
"good": "",
"rateExperience": "请评价您的会议体验。",
"veryBad": "",
"veryGood": ""
},
"inviteUrlDefaultMsg": "您的会议正在被创建。。。",
"me": "我",
"speaker": "发言人",
@@ -14,15 +21,20 @@
"defaultNickname": "例如 星视通",
"defaultLink": "例如 __url__",
"callingName": "__name__",
"audioOnly": {
"audioOnly": "只有音频",
"featureToggleDisabled": "在仅使用音频模式下切换功能无效"
},
"userMedia": {
"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": "请授权使用您的摄像头和麦克风"
"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": "请授权使用您的摄像头和麦克风",
"edgeGrantPermissions": "当浏览器要求权限许可时选择 <b><i>是</i></b>"
},
"keyboardShortcuts": {
"keyboardShortcuts": "快捷键",
@@ -36,7 +48,8 @@
"toggleChat": "打开或关闭聊天",
"mute": "静音或取消静音",
"fullScreen": "全屏或退出全屏",
"videoMute": "开启或关闭视频"
"videoMute": "开启或关闭视频",
"showSpeakerStats": "查看扬声器状态"
},
"welcomepage": {
"disable": "不再显示该页",
@@ -73,22 +86,25 @@
"title": "使用统计"
},
"go": "开始",
"join": "",
"privacy": "",
"join": "加入",
"privacy": "隐私",
"roomname": "请输入房间名",
"roomnamePlaceHolder": "",
"sendFeedback": "",
"terms": ""
"roomnamePlaceHolder": "房间名",
"sendFeedback": "发送反馈",
"terms": "条款"
},
"startupoverlay": {
"policyText": "&nbsp;",
"policyText": "~",
"title": "__app__ 需要使用您的麦克风和摄像头。"
},
"suspendedoverlay": {
"title": "由于您的电脑休眠,视频通话已经中断。",
"title": "",
"text": "",
"rejoinKeyTitle": "重新加入"
},
"toolbar": {
"addPeople": "",
"audioonly": "启用/禁用仅音频模式(节省带宽)",
"mute": "静音 / 解除静音",
"videomute": "开启 / 关闭 摄像头",
"authenticate": "认证",
@@ -116,11 +132,11 @@
"raiseHand": "请求 / 取消 发言"
},
"unsupportedBrowser": {
"appInstalled": "",
"appNotInstalled": "",
"downloadApp": "",
"joinConversation": "",
"startConference": ""
"appInstalled": "或者如果您已经安装了<br /><strong>那么</strong>",
"appNotInstalled": "您需要在您的移动设备上安装 <strong>__app__</strong> 来参与会议",
"downloadApp": "下载应用",
"joinConversation": "加入会议",
"startConference": "发起会议"
},
"bottomtoolbar": {
"chat": "开启 / 关闭 聊天",
@@ -145,12 +161,10 @@
"selectAudioOutput": "音频输出",
"followMe": "所有人跟随我",
"noDevice": "未发现设备",
"noPermission": "未授权使用设备",
"cameraAndMic": "摄像头和麦克风",
"moderator": "主持人",
"password": "设定密码",
"audioVideo": "音频和视频",
"setPasswordLabel": "用密码锁定房间"
"audioVideo": "音频和视频"
},
"profile": {
"title": "简介",
@@ -174,6 +188,7 @@
"bitrate": "比特率",
"packetloss": "丢包",
"resolution": "分辨率",
"framerate": "帧率:",
"less": "显示更少",
"more": "显示更多",
"address": "地址",
@@ -187,7 +202,8 @@
"remoteaddress": "远程地址:",
"transport": "传输:",
"bandwidth": "估计带宽:",
"na": "会议开始可回到此处查看连接信息"
"na": "会议开始可回到此处查看连接信息",
"turn": ""
},
"notify": {
"disconnected": "已断开连接",
@@ -205,6 +221,7 @@
},
"dialog": {
"add": "添加",
"allow": "允许",
"kickMessage": "您已被踢出会议!",
"popupError": "您的浏览器禁止弹窗,请到浏览器安全设置里设定允许弹窗后重试。",
"passwordErrorTitle": "密码错误",
@@ -216,18 +233,15 @@
"connecting": "连接中",
"copy": "复制",
"error": "错误",
"roomLocked": "此会话已被锁定,新与会者必须有链接地址和密码才能加入",
"addPassword": "添加密码",
"createPassword": "创建密码",
"detectext": "尝试检测桌面共享扩展时发生错误",
"failtoinstall": "安装桌面共享扩展失败",
"failedpermissions": "未能获取使用本地麦克风或摄像头的权限。",
"conferenceReloadTitle": "不好意思,出错了",
"conferenceReloadMsg": "正在尝试修复",
"conferenceDisconnectTitle": "您已断开连接,请检查您的网络连接。",
"conferenceDisconnectMsg": "重新连接中。。。",
"reconnectNow": "现在开始重新连接",
"conferenceReloadTimeLeft": "__seconds__秒。",
"conferenceReloadTitle": "不好意思,出错了",
"conferenceReloadMsg": "我们试着修复它。重连中__秒",
"conferenceDisconnectTitle": "你已经断开。",
"conferenceDisconnectMsg": "需要检查你的网络连接。重新连接中 __秒",
"rejoinNow": "马上重新加入",
"maxUsersLimitReached": "已达到会议的最大人数限制,请稍后尝试!",
"lockTitle": "锁定失败",
"lockMessage": "锁定会议失败。",
@@ -267,8 +281,6 @@
"Save": "保存",
"recording": "录制中",
"recordingToken": "输入记录标识",
"Dial": "拨号",
"sipMsg": "输入SIP号码",
"passwordCheck": "确定要移除密码吗?",
"passwordMsg": "设定密码来锁定房间",
"shareLink": "分享此会议的链接",
@@ -291,7 +303,6 @@
"enterDisplayName": "请输入您的显示名称",
"extensionRequired": "需要扩展程序",
"firefoxExtensionPrompt": "您需要安装Firefox的扩展才能使用屏幕共享功能。请从<a href='__url__'>这里获取后</a>!重试。",
"rateExperience": "请评价您的会议体验。",
"feedbackHelp": "您的反馈将帮助我们提高我们的视频体验。",
"feedbackQuestion": "告诉我们您的联系方式。",
"thankYou": "感谢使用__appName__",
@@ -313,24 +324,33 @@
"cameraUnknownError": "由于不可预知的错误,无法使用摄像头。",
"cameraPermissionDeniedError": "您未授权使用您的摄像头。您仍可参加会议但是其他人无法看到,使用地址栏里的摄像头按钮来启动摄像头。",
"cameraNotFoundError": "未发现摄像头",
"cameraConstraintFailedError": "摄像头不可用",
"cameraConstraintFailedError": "你的摄像头不满足要求。",
"micUnknownError": "未知错误,麦克风不可用",
"micPermissionDeniedError": "您未授权使用麦克风,您仍可参加会议但是其他人无法听到,使用地址栏里的摄像头按钮来启动麦克风",
"micNotFoundError": "未发现麦克风",
"micConstraintFailedError": "麦克风不满足要求的限制",
"micConstraintFailedError": "你的麦克风不满足要求",
"micNotSendingData": "麦克风无法使用,请从设置菜单选择其他设备或者重启应用",
"cameraNotSendingData": "摄像头无法使用,请检查摄像头是否被占用,从设置菜单选择其他设备或者重启应用。",
"goToStore": "跳转至应用商店",
"externalInstallationTitle": "需要扩展程序",
"externalInstallationMsg": "您需要安装桌面共享扩展",
"inlineInstallationMsg": "您需要安装桌面共享扩展",
"inlineInstallExtension": "",
"muteParticipantTitle": "静音该与会者吗?",
"muteParticipantBody": "您无法对他们解除静音,但是他们自己可以随时解除静音。",
"muteParticipantButton": "静音",
"remoteControlTitle": "远程控制",
"remoteControlTitle": "远程桌面控制",
"remoteControlRequestMessage": "你允许 __用户__ 远程控制你的桌面吗?",
"remoteControlShareScreenWarning": "注意:如果按下“允许”你将共享你的屏幕!",
"remoteControlDeniedMessage": "__user__ 拒绝了您的远程控制请求",
"remoteControlAllowedMessage": "__user__ 接受了您的远程控制请求",
"remoteControlErrorMessage": "在尝试向__user__请求远程控制权限时发生了一个错误",
"remoteControlStopMessage": "远程控制结束!"
"startRemoteControlErrorMessage": "",
"remoteControlStopMessage": "远程控制结束!",
"close": "关闭",
"shareYourScreen": "共享你的屏幕",
"yourEntireScreen": "你的整个屏幕",
"applicationWindow": "应用窗口"
},
"email": {
"sharedKey": [
@@ -392,5 +412,70 @@
"streamIdHelp": "在哪里找到这个",
"error": "流媒体直播失败。请重试。",
"busy": "所有的录制器都在忙。请稍后重试。"
},
"speakerStats": {
"hours": "__count__h",
"minutes": "__count__m",
"name": "名称",
"seconds": "__count__s",
"speakerStats": "发言者状态",
"speakerTime": "发言者时间"
},
"deviceSelection": {
"deviceSettings": "设备设置",
"noPermission": "未授权限 ",
"previewUnavailable": "预览不可用",
"selectADevice": "选择设备",
"testAudio": "测试声音"
},
"invite": {
"addPassword": "添加密码",
"callNumber": "呼叫__号码__",
"enterID": "在电话终端输入会议ID:__conferenceID__和#号拨打会议电话",
"howToDialIn": "用以下号码和会议编号拨号。",
"hidePassword": "隐藏密码",
"inviteTo": "邀请人到 __会议名称__",
"invitedYouTo": "",
"locked": "本次呼叫被锁定,新的呼叫必须有链接并输入口令后加入。",
"showPassword": "查看口令",
"unlocked": "本次呼叫已被锁定,用这个链接可以加入。"
},
"videoStatus": {
"callQuality": "",
"changeVideoTip": "",
"hd": "高清",
"highDefinition": "",
"ld": "",
"lowDefinition": "",
"p2pEnabled": "",
"p2pVideoQualityDescription": "",
"recHighDefinitionOnly": "",
"sd": "标清",
"standardDefinition": "",
"qualityButtonTip": ""
},
"dialOut": {
"dial": "拨号",
"dialOut": "呼叫电话号码",
"statusMessage": "",
"enterPhone": "输入电话号码",
"phoneNotAllowed": "还不支持这个目标!抱歉!"
},
"addPeople": {
"add": "添加",
"noResults": "",
"searchPlaceholder": "",
"title": "",
"failedToAdd": ""
},
"inlineDialogFailure": {
"msg": "",
"retry": "",
"support": "",
"supportMsg": ""
},
"deviceError": {
"cameraPermission": "",
"microphonePermission": ""
}
}

View File

@@ -1,9 +1,9 @@
{
"contactlist": "Participants (__pcount__)",
"contactlist": "__pcount__ Members",
"addParticipants": "Share the link",
"roomLocked": "Callers must enter a password",
"roomUnlocked": "Anyone with the link can join",
"passwordSetRemotely": "set by another participant",
"passwordSetRemotely": "set by another member",
"connectionsettings": "Connection Settings",
"poweredby": "powered by",
"feedback": "Give us your feedback",
@@ -59,7 +59,7 @@
"title": "Open source"
},
"feature4": {
"content": "There are no artificial restrictions on the number of users or conference participants. Server power and bandwidth are the only limiting factors.",
"content": "There are no artificial restrictions on the number of users or conference members. Server power and bandwidth are the only limiting factors.",
"title": "Unlimited users"
},
"feature5": {
@@ -114,8 +114,8 @@
"login": "Login",
"logout": "Logout",
"dialpad": "Open / Close dialpad",
"sharedVideoMutedPopup": "Your shared video has been muted so<br/>that you can talk to the other participants.",
"micMutedPopup": "Your microphone has been muted so that you<br/>would fully enjoy your shared video.",
"sharedVideoMutedPopup": "Your shared video has been muted so that you can talk to the other members.",
"micMutedPopup": "Your microphone has been muted so that you would fully enjoy your shared video.",
"talkWhileMutedPopup": "Trying to speak? You are muted.",
"unableToUnmutePopup": "You cannot un-mute while the shared video is on.",
"cameraDisabled": "Camera is not available",
@@ -134,7 +134,7 @@
"bottomtoolbar": {
"chat": "Open / close chat",
"filmstrip": "Show / hide videos",
"contactlist": "View and invite participants"
"contactlist": "View and invite members"
},
"chat":{
"nickname": {
@@ -168,10 +168,9 @@
},
"videothumbnail":
{
"editnickname": "Click to edit your<br/>display name",
"moderator": "The owner of<br/>this conference",
"videomute": "Participant has<br/>stopped the camera",
"mute": "Participant is muted",
"moderator": "Moderator",
"videomute": "Member has stopped the camera",
"mute": "Member is muted",
"kick": "Kick out",
"muted": "Muted",
"domute": "Mute",
@@ -240,7 +239,7 @@
"conferenceDisconnectTitle": "You have been disconnected.",
"conferenceDisconnectMsg": "You may want to check your network connection. Reconnecting in __seconds__ sec...",
"rejoinNow": "Rejoin now",
"maxUsersLimitReached": "The limit for maximum number of participants in the conference has been reached. The conference is full. Please try again later!",
"maxUsersLimitReached": "The limit for maximum number of members in the conference has been reached. The conference is full. Please try again later!",
"lockTitle": "Lock failed",
"lockMessage": "Failed to lock the conference.",
"warning": "Warning",
@@ -263,7 +262,7 @@
"shareVideoLinkError": "Please provide a correct youtube link.",
"removeSharedVideoTitle": "Remove shared video",
"removeSharedVideoMsg": "Are you sure you would like to remove your shared video?",
"alreadySharedVideoMsg": "Another participant is already sharing video. This conference allows only one shared video at a time.",
"alreadySharedVideoMsg": "Another member is already sharing video. This conference allows only one shared video at a time.",
"WaitingForHost": "Waiting for the host ...",
"WaitForHostMsg": "The conference <b>__room__ </b> has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
"IamHost": "I am the host",
@@ -282,9 +281,6 @@
"passwordCheck": "Are you sure you would like to remove your password?",
"passwordMsg": "Set a password to lock your room",
"shareLink": "Share the link to the call",
"settings1": "Configure your conference",
"settings2": "Participants join muted",
"settings3": "Require nicknames<br/><br/>Set a password to lock your room:",
"yourPassword": "Enter new password",
"Back": "Back",
"serviceUnavailable": "Service unavailable",
@@ -301,7 +297,6 @@
"enterDisplayName": "Please enter your display name",
"extensionRequired": "Extension required:",
"firefoxExtensionPrompt": "You need to install a Firefox extension in order to use screen sharing. Please try again after you <a href='__url__'>get it from here</a>!",
"rateExperience": "Please rate your meeting experience.",
"feedbackHelp": "Your feedback will help us to improve our video experience.",
"feedbackQuestion": "Tell us about your call!",
"thankYou": "Thank you for using __appName__!",
@@ -335,7 +330,7 @@
"externalInstallationMsg": "You need to install our desktop sharing extension.",
"inlineInstallationMsg": "You need to install our desktop sharing extension.",
"inlineInstallExtension": "Install now",
"muteParticipantTitle": "Mute this participant?",
"muteParticipantTitle": "Mute this member?",
"muteParticipantBody": "You won't be able to unmute them, but they can unmute themselves at any time.",
"muteParticipantButton": "Mute",
"remoteControlTitle": "Remote desktop control",
@@ -400,7 +395,7 @@
},
"recording":
{
"pending": "Recording waiting for a participant to join...",
"pending": "Recording waiting for a member to join...",
"on": "Recording",
"off": "Recording stopped",
"failedToStart": "Recording failed to start",
@@ -450,10 +445,18 @@
"unlocked": "This call is unlocked. Any new caller with the link may join the call."
},
"videoStatus": {
"hd": "HD",
"hdVideo": "HD video",
"sd": "SD",
"sdVideo": "SD video"
"callQuality": "Call Quality",
"hd": "HD",
"highDefinition": "High definition",
"labelTooltip": "Current video quality",
"ld": "LD",
"lowDefinition": "Low definition",
"p2pEnabled": "Peer to Peer Enabled",
"p2pVideoQualityDescription": "In peer to peer mode, received call quality can only be toggled between high and audio only. Other settings will not be honored until peer to peer is exited.",
"recHighDefinitionOnly": "Will prefer high definition.",
"sd": "SD",
"standardDefinition": "Standard definition",
"qualityButtonTip": "Change received video quality"
},
"dialOut": {
"dial": "Dial",
@@ -467,12 +470,24 @@
"noResults": "No matching search results",
"searchPlaceholder": "Search for people and rooms to add",
"title": "Add people to your call",
"failedToAdd": "Failed to add participants"
"failedToAdd": "Failed to add members"
},
"inlineDialogFailure": {
"msg": "We stumbled a bit.",
"retry": "Try again",
"support": "Support",
"supportMsg": "If this keeps happening, reach out to"
},
"deviceError": {
"cameraPermission": "Error obtaining camera permission",
"microphonePermission": "Error obtaining microphone permission"
},
"feedback": {
"average": "Average",
"bad": "Bad",
"good": "Good",
"rateExperience": "Please rate your meeting experience.",
"veryBad": "Very Bad",
"veryGood": "Very Good"
}
}

View File

@@ -26,6 +26,20 @@ let initialScreenSharingState = false;
*/
const transport = getJitsiMeetTransport();
/**
* The current audio availability.
*
* @type {boolean}
*/
let audioAvailable = true;
/**
* The current video availability.
*
* @type {boolean}
*/
let videoAvailable = true;
/**
* Initializes supported commands.
*
@@ -58,6 +72,26 @@ function initCommands() {
return false;
});
transport.on('request', ({ data, name }, callback) => {
switch (name) {
case 'is-audio-muted':
callback(APP.conference.isLocalAudioMuted());
break;
case 'is-video-muted':
callback(APP.conference.isLocalVideoMuted());
break;
case 'is-audio-available':
callback(audioAvailable);
break;
case 'is-video-available':
callback(videoAvailable);
break;
default:
return false;
}
return true;
});
}
/**
@@ -97,7 +131,9 @@ function shouldBeEnabled() {
*/
function toggleScreenSharing() {
if (APP.conference.isDesktopSharingEnabled) {
APP.conference.toggleScreenSharing();
// eslint-disable-next-line no-empty-function
APP.conference.toggleScreenSharing().catch(() => {});
} else {
initialScreenSharingState = !initialScreenSharingState;
}
@@ -265,6 +301,65 @@ class API {
this._sendEvent({ name: 'video-ready-to-close' });
}
/**
* Notify external application (if API is enabled) for audio muted status
* changed.
*
* @param {boolean} muted - The new muted status.
* @returns {void}
*/
notifyAudioMutedStatusChanged(muted) {
this._sendEvent({
name: 'audio-mute-status-changed',
muted
});
}
/**
* Notify external application (if API is enabled) for video muted status
* changed.
*
* @param {boolean} muted - The new muted status.
* @returns {void}
*/
notifyVideoMutedStatusChanged(muted) {
this._sendEvent({
name: 'video-mute-status-changed',
muted
});
}
/**
* Notify external application (if API is enabled) for audio availability
* changed.
*
* @param {boolean} available - True if available and false otherwise.
* @returns {void}
*/
notifyAudioAvailabilityChanged(available) {
audioAvailable = available;
this._sendEvent({
name: 'audio-availability-changed',
available
});
}
/**
* Notify external application (if API is enabled) for video available
* status changed.
*
* @param {boolean} available - True if available and false otherwise.
* @returns {void}
*/
notifyVideoAvailabilityChanged(available) {
videoAvailable = available;
this._sendEvent({
name: 'video-availability-changed',
available
});
}
/**
* Disposes the allocated resources.
*

View File

@@ -1,6 +1,6 @@
import EventEmitter from 'events';
import { urlObjectToString } from '../../../react/features/base/util';
import { urlObjectToString } from '../../../react/features/base/util/uri';
import {
PostMessageTransportBackend,
Transport
@@ -8,6 +8,10 @@ import {
const logger = require('jitsi-meet-logger').getLogger(__filename);
const ALWAYS_ON_TOP_FILENAMES = [
'css/all.css', 'libs/alwaysontop.min.js'
];
/**
* Maps the names of the commands expected by the API with the name of the
* commands expected by jitsi-meet
@@ -30,6 +34,8 @@ const commands = {
* events expected by jitsi-meet
*/
const events = {
'audio-availability-changed': 'audioAvailabilityChanged',
'audio-mute-status-changed': 'audioMuteStatusChanged',
'display-name-change': 'displayNameChange',
'incoming-message': 'incomingMessage',
'outgoing-message': 'outgoingMessage',
@@ -37,7 +43,9 @@ const events = {
'participant-left': 'participantLeft',
'video-ready-to-close': 'readyToClose',
'video-conference-joined': 'videoConferenceJoined',
'video-conference-left': 'videoConferenceLeft'
'video-conference-left': 'videoConferenceLeft',
'video-availability-changed': 'videoAvailabilityChanged',
'video-mute-status-changed': 'videoMuteStatusChanged'
};
/**
@@ -207,6 +215,7 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
noSSL,
roomName
});
this._baseUrl = `${noSSL ? 'http' : 'https'}://${domain}/`;
this._createIFrame(height, width);
this._transport = new Transport({
backend: new PostMessageTransportBackend({
@@ -236,6 +245,7 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
const frameName = `jitsiConferenceFrame${id}`;
this._frame = document.createElement('iframe');
this._frame.allow = 'camera; microphone';
this._frame.src = this._url;
this._frame.name = frameName;
this._frame.id = frameName;
@@ -245,6 +255,17 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
this._frame = this._parentNode.appendChild(this._frame);
}
/**
* Returns arrays with the all resources for the always on top feature.
*
* @returns {Array<string>}
*/
_getAlwaysOnTopResources() {
return ALWAYS_ON_TOP_FILENAMES.map(
filename => this._baseUrl + filename
);
}
/**
* Sets the size of the iframe element.
*
@@ -430,6 +451,30 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
}
}
/**
* Check if the audio is available.
*
* @returns {Promise} - Resolves with true if the audio available, with
* false if not and rejects on failure.
*/
isAudioAvailable() {
return this._transport.sendRequest({
name: 'is-audio-available'
});
}
/**
* Returns the audio mute status.
*
* @returns {Promise} - Resolves with the audio mute status and rejects on
* failure.
*/
isAudioMuted() {
return this._transport.sendRequest({
name: 'is-audio-muted'
});
}
/**
* Returns the iframe that loads Jitsi Meet.
*
@@ -449,6 +494,30 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
return this._numberOfParticipants;
}
/**
* Check if the video is available.
*
* @returns {Promise} - Resolves with true if the video available, with
* false if not and rejects on failure.
*/
isVideoAvailable() {
return this._transport.sendRequest({
name: 'is-video-available'
});
}
/**
* Returns the audio mute status.
*
* @returns {Promise} - Resolves with the audio mute status and rejects on
* failure.
*/
isVideoMuted() {
return this._transport.sendRequest({
name: 'is-video-muted'
});
}
/**
* Removes event listener.
*

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