From b256b55c3edffac31901c8a0a4dd8c8ece3af030 Mon Sep 17 00:00:00 2001 From: Mitsutaka Sato Date: Wed, 22 Apr 2020 15:02:34 +1200 Subject: [PATCH 01/65] Fix calcGuestStatus --- .../src/main/java/org/bigbluebutton/api/domain/Meeting.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java index 624e85cf493a..45f1efb7a1fd 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java @@ -355,7 +355,7 @@ public String calcGuestStatus(String role, Boolean guest, Boolean authned) { } else if (GuestPolicy.ALWAYS_DENY.equals(guestPolicy)) { return GuestPolicy.DENY; } else if (GuestPolicy.ASK_MODERATOR.equals(guestPolicy)) { - if (guest || (!ROLE_MODERATOR.equals(role) && authned)) { + if (guest || (!ROLE_MODERATOR.equals(role) && !authned)) { return GuestPolicy.WAIT ; } return GuestPolicy.ALLOW; From 942df3b1a65641dc6fbef8169bf69d4f277941cb Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Tue, 28 Apr 2020 16:43:14 +0000 Subject: [PATCH 02/65] add arrow to toggle userlist icon --- .../ui/components/nav-bar/component.jsx | 7 +++++ .../imports/ui/components/nav-bar/styles.scss | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx b/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx index 8ead98f12a52..7622c005eb30 100755 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx @@ -6,6 +6,7 @@ import { withModalMounter } from '/imports/ui/components/modal/service'; import withShortcutHelper from '/imports/ui/components/shortcut-help/service'; import getFromUserSettings from '/imports/ui/services/users-settings'; import { defineMessages, injectIntl } from 'react-intl'; +import Icon from '../icon/component'; import { styles } from './styles.scss'; import Button from '../button/component'; import RecordingIndicator from './recording-indicator/container'; @@ -91,6 +92,9 @@ class NavBar extends PureComponent {
+ {!isExpanded ? null + : + }

{presentationTitle}

diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/styles.scss b/bigbluebutton-html5/imports/ui/components/nav-bar/styles.scss index 16f878577395..b3e4205a4709 100755 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/styles.scss @@ -3,6 +3,9 @@ :root { --mobile-nav-height: 5rem; --mobile-margin-top: .25rem; + --arrow-l-left: 1.1rem; + --arrow-r-left: 2.5rem; + --arrow-size: 40%; } .navbar { @@ -73,6 +76,31 @@ } } +.arrowRight, +.arrowLeft { + position: absolute; + font-size: var(--arrow-size); + color: var(--color-white); +} + +.arrowLeft { + width: var(--lg-padding-y); + left: var(--arrow-l-left); + [dir="rtl"] & { + right: var(--arrow-r-left); + left: 0; + } +} + +.arrowRight { + width: var(--md-padding-x); + left: var(--arrow-r-left); + [dir="rtl"] & { + right: .5rem; + left: 0; + } +} + .btn { margin: 0; From e82e0f5be979424a8a0759f8acafbab542a8fab4 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Sat, 2 May 2020 16:50:40 +0000 Subject: [PATCH 03/65] fix see views in user list lock affecting webcams --- .../imports/ui/components/video-provider/service.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/service.js b/bigbluebutton-html5/imports/ui/components/video-provider/service.js index 398830b5f810..db93c6789152 100755 --- a/bigbluebutton-html5/imports/ui/components/video-provider/service.js +++ b/bigbluebutton-html5/imports/ui/components/video-provider/service.js @@ -76,7 +76,6 @@ class VideoService { getAllWebcamUsers() { const webcamsLocked = this.webcamsLocked(); const webcamsOnlyForModerator = this.webcamsOnlyForModerator(); - const hideUserList = this.hideUserList(); const currentUser = Users.findOne({ userId: Auth.userID }); const currentUserIsViewer = currentUser.role === ROLE_VIEWER; const sharedWebcam = this.isSharing; @@ -112,7 +111,7 @@ class VideoService { const userIsModerator = user => user.role === ROLE_MODERATOR; - if ((webcamsOnlyForModerator || hideUserList) && currentUserIsViewer) { + if ((webcamsOnlyForModerator) && currentUserIsViewer) { users = users.filter(userIsModerator); } From f9fa2f36dd94c2515df0dffb5aabd9638875ee4f Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Mon, 4 May 2020 13:40:13 +0000 Subject: [PATCH 04/65] set correct state for selected user on click --- .../user-participants/component.jsx | 12 ++++++++++++ .../user-list-item/user-dropdown/styles.scss | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/component.jsx index 9bca16580e86..cbe5dc9ed11d 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/component.jsx @@ -57,6 +57,7 @@ class UserParticipants extends Component { this.rove = this.rove.bind(this); this.changeState = this.changeState.bind(this); this.getUsers = this.getUsers.bind(this); + this.handleClickSelectedUser = this.handleClickSelectedUser.bind(this); } componentDidMount() { @@ -66,6 +67,11 @@ class UserParticipants extends Component { 'keydown', this.rove, ); + + this.refScrollContainer.addEventListener( + 'click', + this.handleClickSelectedUser, + ); } } @@ -88,6 +94,7 @@ class UserParticipants extends Component { componentWillUnmount() { this.refScrollContainer.removeEventListener('keydown', this.rove); + this.refScrollContainer.removeEventListener('click', this.handleClickSelectedUser); } getScrollContainerRef() { @@ -134,6 +141,11 @@ class UserParticipants extends Component { )); } + handleClickSelectedUser(event) { + const selectedUser = event.path.find(p => p.className && p.className.includes('participantsList')); + this.setState({ selectedUser }); + } + rove(event) { const { roving } = this.props; const { selectedUser } = this.state; diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss index 3e6e5bd0aa65..064803961373 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss @@ -88,6 +88,8 @@ outline-style: solid; background-color: var(--list-item-bg-hover); box-shadow: inset 0 0 0 var(--border-size) var(--item-focus-border), inset 1px 0 0 1px var(--item-focus-border); + border-top-left-radius: var(--sm-padding-y); + border-bottom-left-radius: var(--sm-padding-y); &:focus { outline-style: solid; @@ -96,7 +98,7 @@ } .userListItem { - //@extend %list-item; + @extend %list-item; flex-flow: column; flex-shrink: 0; } From 741455aebab4e35d28a760e65c5986502018294c Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Wed, 6 May 2020 15:14:07 +0000 Subject: [PATCH 05/65] remove hideUserList() from video-provider service --- .../imports/ui/components/video-provider/service.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/service.js b/bigbluebutton-html5/imports/ui/components/video-provider/service.js index db93c6789152..2910312f6803 100755 --- a/bigbluebutton-html5/imports/ui/components/video-provider/service.js +++ b/bigbluebutton-html5/imports/ui/components/video-provider/service.js @@ -134,12 +134,6 @@ class VideoService { return m.lockSettingsProps ? m.lockSettingsProps.disableCam : false; } - hideUserList() { - const m = Meetings.findOne({ meetingId: Auth.meetingID }, - { fields: { 'lockSettingsProps.hideUserList': 1 } }); - return m.lockSettingsProps ? m.lockSettingsProps.hideUserList : false; - } - userId() { return Auth.userID; } From 2ca54d69f46971a20f8cebac9e0e40ea72747ab1 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Thu, 7 May 2020 14:32:15 +0000 Subject: [PATCH 06/65] add remove user confirmation --- .../user-dropdown/component.jsx | 59 +++++++++++++++++- .../user-list-item/user-dropdown/styles.scss | 61 +++++++++++++++++++ bigbluebutton-html5/private/locales/en.json | 2 + 3 files changed, 120 insertions(+), 2 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx index c6cd4e0540f7..5418d8b08bdc 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx @@ -11,6 +11,9 @@ import DropdownList from '/imports/ui/components/dropdown/list/component'; import DropdownListItem from '/imports/ui/components/dropdown/list/item/component'; import DropdownListSeparator from '/imports/ui/components/dropdown/list/separator/component'; import lockContextContainer from '/imports/ui/components/lock-viewers/context/container'; +import { withModalMounter } from '/imports/ui/components/modal/service'; +import Modal from '/imports/ui/components/modal/simple/component'; +import Button from '/imports/ui/components/button/component'; import _ from 'lodash'; import { Session } from 'meteor/session'; @@ -99,6 +102,22 @@ const messages = defineMessages({ id: 'app.userList.menu.directoryLookup.label', description: 'Directory lookup', }, + yesLabel: { + id: 'app.endMeeting.yesLabel', + description: 'confirm button label', + }, + noLabel: { + id: 'app.endMeeting.noLabel', + description: 'cancel confirm button label', + }, + removeConfirmTitle: { + id: 'app.userList.menu.removeConfirmation.label', + description: 'title for remove user confirmation modal', + }, + removeConfirmDesc: { + id: 'app.userlist.menu.removeConfirmation.desc', + description: 'description for remove user confirmation', + }, }); const propTypes = { @@ -220,6 +239,7 @@ class UserDropdown extends PureComponent { userLocks, isMe, meetingIsBreakout, + mountModal, } = this.props; const { showNestedOptions } = this.state; @@ -387,7 +407,42 @@ class UserDropdown extends PureComponent { actions.push(this.makeDropdownItem( 'remove', intl.formatMessage(messages.RemoveUserLabel, { 0: user.name }), - () => this.onActionsHide(removeUser(user.userId)), + () => this.onActionsHide(mountModal( + mountModal(null)} + hideBorder + contentLabel={intl.formatMessage(messages.removeConfirmTitle)} + > +
+
+
+ {intl.formatMessage(messages.removeConfirmTitle)} +
+
+
+ {intl.formatMessage(messages.removeConfirmDesc)} +
+
+
+
+
, + )), 'circle_close', )); } @@ -628,4 +683,4 @@ class UserDropdown extends PureComponent { } UserDropdown.propTypes = propTypes; -export default lockContextContainer(UserDropdown); +export default withModalMounter(lockContextContainer(UserDropdown)); diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss index 3e6e5bd0aa65..2efd2342798a 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss @@ -1,6 +1,12 @@ @import "/imports/ui/components/user-list/styles.scss"; @import "/imports/ui/stylesheets/variables/_all"; @import '/imports/ui/stylesheets/mixins/_indicators'; +@import '/imports/ui/stylesheets/mixins/focus'; +@import "/imports/ui/components/modal/simple/styles"; + +:root { + --description-margin: 3.5rem; +} /* Animations * ========== @@ -135,3 +141,58 @@ color: var(--color-primary); } } + +.title { + color: var(--color-gray-dark); + font-weight: var(--headings-font-weight); + font-size: var(--jumbo-padding-y); +} + +.container { + display: flex; + align-items: center; + flex-direction: column; + padding: 0; + margin-top: 0; + margin-right: var(--description-margin); + margin-left: var(--description-margin); + margin-bottom: var(--lg-padding-x); +} + +.footer { + display:flex; +} + +.button { + padding-right: var(--jumbo-padding-y); + padding-left: var(--jumbo-padding-y); + margin: 0 var(--sm-padding-x) 0 0; + + [dir="rtl"] & { + margin: 0 0 0 var(--sm-padding-x); + } +} + +.description { + text-align: center; + line-height: var(--line-height-base); + color: var(--color-gray); + margin-bottom: var(--jumbo-padding-y) +} + +.modal { + @extend .modal; + padding: var(--sm-padding-y); +} + +.overlay { + @extend .overlay; +} + +.header { + margin: 0; + padding: 0; + border: none; + line-height: var(--title-position-left); + margin-bottom: var(--lg-padding-y); +} \ No newline at end of file diff --git a/bigbluebutton-html5/private/locales/en.json b/bigbluebutton-html5/private/locales/en.json index 711a6ff3651a..72a5c37af07c 100755 --- a/bigbluebutton-html5/private/locales/en.json +++ b/bigbluebutton-html5/private/locales/en.json @@ -72,6 +72,8 @@ "app.userList.menu.chat.label": "Start a private chat", "app.userList.menu.clearStatus.label": "Clear status", "app.userList.menu.removeUser.label": "Remove user", + "app.userList.menu.removeConfirmation.label": "Remove User Confirmation", + "app.userlist.menu.removeConfirmation.desc": "They will not be allowed to rejoin this current session.", "app.userList.menu.muteUserAudio.label": "Mute user", "app.userList.menu.unmuteUserAudio.label": "Unmute user", "app.userList.userAriaLabel": "{0} {1} {2} Status {3}", From 41e33d9cdac31d301da241f9cc2b24f6f40f7c14 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Fri, 8 May 2020 18:17:50 +0000 Subject: [PATCH 07/65] localise default poll options before calculating required annotation space --- .../whiteboard/annotations/poll/component.jsx | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/component.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/component.jsx index a05ddfb9ee92..75fa8f84bf95 100644 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/component.jsx @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import PollService from '/imports/ui/components/poll/service'; -import { injectIntl } from 'react-intl'; +import { injectIntl, intlShape } from 'react-intl'; class PollDrawComponent extends Component { constructor(props) { @@ -96,6 +96,28 @@ class PollDrawComponent extends Component { for (let i = 0; i < arrayLength; i += 1) { const _tempArray = []; const _result = result[i]; + let isDefaultPoll; + switch (_result.key.toLowerCase()) { + case 'true': + case 'false': + case 'yes': + case 'no': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + isDefaultPoll = true; + break; + default: + isDefaultPoll = false; + break; + } + + if (isDefaultPoll) { + _result.key = intl.formatMessage({ id: `app.poll.answer.${_result.key.toLowerCase()}` }); + } + _tempArray.push(_result.key, `${_result.numVotes}`); if (votesTotal === 0) { _tempArray.push('0%'); @@ -578,6 +600,7 @@ class PollDrawComponent extends Component { export default injectIntl(PollDrawComponent); PollDrawComponent.propTypes = { + intl: intlShape.isRequired, // Defines an annotation object, which contains all the basic info we need to draw a line annotation: PropTypes.shape({ id: PropTypes.string.isRequired, From 70f39ee758229bff76809e887fd3419f78277e7b Mon Sep 17 00:00:00 2001 From: Tiago Jacobs Date: Fri, 8 May 2020 18:45:35 -0300 Subject: [PATCH 08/65] Change validateAuthToken key generator --- .../imports/api/users/server/store/pendingAuthentications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js b/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js index c181ac8f9585..44376cc08564 100644 --- a/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js +++ b/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js @@ -13,7 +13,7 @@ class PendingAuthentitcations { authToken = authToken.replace(/ /g, ''); // Space separated key - return '${meetingId} ${userId} ${authToken}'; + return `${meetingId} ${userId} ${authToken}`; } add (meetingId, userId, authToken, methodInvocationObject) { From 041e16d2dd3b5102be9cf212ec30f8f80a58a07d Mon Sep 17 00:00:00 2001 From: Tiago D J Date: Fri, 8 May 2020 18:47:14 -0300 Subject: [PATCH 09/65] Change validateAuthToken key generator (#9468) --- .../imports/api/users/server/store/pendingAuthentications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js b/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js index c181ac8f9585..44376cc08564 100644 --- a/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js +++ b/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js @@ -13,7 +13,7 @@ class PendingAuthentitcations { authToken = authToken.replace(/ /g, ''); // Space separated key - return '${meetingId} ${userId} ${authToken}'; + return `${meetingId} ${userId} ${authToken}`; } add (meetingId, userId, authToken, methodInvocationObject) { From eee9d896688187b128d869e784a6ddad8dba9620 Mon Sep 17 00:00:00 2001 From: Tiago Jacobs Date: Fri, 8 May 2020 18:47:54 -0300 Subject: [PATCH 10/65] Add key to log message --- .../imports/api/users/server/store/pendingAuthentications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js b/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js index 44376cc08564..1e5e8014dd5c 100644 --- a/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js +++ b/bigbluebutton-html5/imports/api/users/server/store/pendingAuthentications.js @@ -25,8 +25,8 @@ class PendingAuthentitcations { } take (meetingId, userId, authToken) { - Logger.debug("PendingAuthentitcations :: take", {meetingId, userId, authToken}); const key = this.generateKey(meetingId, userId, authToken); + Logger.debug("PendingAuthentitcations :: take", {key, meetingId, userId, authToken}); // find matches const matches = this.store.filter( e => e.key === key ); From d6132e97b5f1d8cefc449bdc84562c9be73b4472 Mon Sep 17 00:00:00 2001 From: Tiago Jacobs Date: Fri, 8 May 2020 19:08:50 -0300 Subject: [PATCH 11/65] Postpone websocket close for a failed authToken --- .../imports/api/users/server/handlers/validateAuthToken.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js b/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js index dae1bf3b4a75..5831b5e1304f 100644 --- a/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js +++ b/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js @@ -31,7 +31,11 @@ export default function handleValidateAuthToken({ body }, meetingId) { const {methodInvocationObject} = pendingAuth; const connectionId = methodInvocationObject.connection.id; - methodInvocationObject.connection.close(); + // Schedule socket disconnection for this user, giving some time for client receiving the reason of disconnection + setTimeout(()=>{ + methodInvocationObject.connection.close(); + }, 2000); + Logger.info(`Closed connection ${connectionId} due to invalid auth token.`); } catch (e) { Logger.error(`Error closing socket for meetingId '${meetingId}', userId '${userId}', authToken ${authToken}`); From 80e6b168ea0c512575aaa0ab2afe8e9e32e125ed Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Sat, 9 May 2020 09:52:16 -0400 Subject: [PATCH 12/65] use Meteor setTimeout to run within Fiber --- .../imports/api/users/server/handlers/validateAuthToken.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js b/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js index 5831b5e1304f..9fa3c6ca1c25 100644 --- a/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js +++ b/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js @@ -32,7 +32,7 @@ export default function handleValidateAuthToken({ body }, meetingId) { const connectionId = methodInvocationObject.connection.id; // Schedule socket disconnection for this user, giving some time for client receiving the reason of disconnection - setTimeout(()=>{ + Meteor.setTimeout(()=>{ methodInvocationObject.connection.close(); }, 2000); From 2be89479ba6e4ef38fe69df7d0614e0aad650962 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Sat, 9 May 2020 17:19:41 +0000 Subject: [PATCH 13/65] close video preview modal if lock setting active --- .../ui/components/video-preview/component.jsx | 20 ++++++++++++------- .../ui/components/video-preview/container.jsx | 20 +++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx b/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx index 8dae76c9af97..17a3ff96facf 100755 --- a/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx @@ -412,7 +412,6 @@ class VideoPreview extends Component { }); this.video.srcObject = stream; this.deviceStream = stream; - }).catch((error) => { logger.warn({ logCode: 'video_preview_do_gum_preview_error', @@ -451,7 +450,7 @@ class VideoPreview extends Component { renderDeviceSelectors() { const { intl, - skipVideoPreview + skipVideoPreview, } = this.props; const { @@ -543,11 +542,11 @@ class VideoPreview extends Component {
); case VIEW_STATES.error: - return ( -
-
{deviceError}
-
- ); + return ( +
+
{deviceError}
+
+ ); case VIEW_STATES.found: default: return ( @@ -632,7 +631,14 @@ class VideoPreview extends Component { intl, hasMediaDevices, skipVideoPreview, + isCamLocked, } = this.props; + + if (isCamLocked === true) { + this.handleProceed(); + return null; + } + const { deviceError, previewError, diff --git a/bigbluebutton-html5/imports/ui/components/video-preview/container.jsx b/bigbluebutton-html5/imports/ui/components/video-preview/container.jsx index a9e1db734a1d..1e70e2e26947 100755 --- a/bigbluebutton-html5/imports/ui/components/video-preview/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/video-preview/container.jsx @@ -3,6 +3,9 @@ import { withModalMounter } from '/imports/ui/components/modal/service'; import { withTracker } from 'meteor/react-meteor-data'; import deviceInfo from '/imports/utils/deviceInfo'; import getFromUserSettings from '/imports/ui/services/users-settings'; +import Users from '/imports/api/users'; +import Meetings from '/imports/api/meetings'; +import Auth from '/imports/ui/services/auth'; import Service from './service'; import VideoPreview from './component'; import VideoService from '../video-provider/service'; @@ -13,11 +16,28 @@ const SKIP_VIDEO_PREVIEW = KURENTO_CONFIG.skipVideoPreview; const VideoPreviewContainer = props => ; +const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator; + +const isCamLocked = () => { + const meeting = Meetings.findOne({ meetingId: Auth.meetingID }, + { fields: { 'lockSettingsProps.disableCam': 1 } }); + const user = Users.findOne({ meetingId: Auth.meetingID, userId: Auth.userID }, + { fields: { locked: 1, role: 1 } }); + + if (meeting.lockSettingsProps !== undefined) { + if (user.locked && user.role !== ROLE_MODERATOR) { + return meeting.lockSettingsProps.disableCam; + } + } + return false; +}; + export default withModalMounter(withTracker(({ mountModal, fromInterface }) => ({ startSharing: () => { mountModal(null); VideoService.joinVideo(); }, + isCamLocked: isCamLocked(), closeModal: () => mountModal(null), changeWebcam: deviceId => Service.changeWebcam(deviceId), webcamDeviceId: Service.webcamDeviceId(), From b4825eceb17ec5b8a5e4712723dff49034722e13 Mon Sep 17 00:00:00 2001 From: basisbit Date: Sun, 10 May 2020 04:24:01 +0200 Subject: [PATCH 14/65] enable deletion of 14d old already published raw recordings by default --- bigbluebutton-config/cron.daily/bigbluebutton | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-config/cron.daily/bigbluebutton b/bigbluebutton-config/cron.daily/bigbluebutton index 165e35ca47a7..2a2f6571114f 100755 --- a/bigbluebutton-config/cron.daily/bigbluebutton +++ b/bigbluebutton-config/cron.daily/bigbluebutton @@ -120,7 +120,7 @@ remove_raw_of_published_recordings(){ done } -#remove_raw_of_published_recordings +remove_raw_of_published_recordings # # Remove old *.afm and *.pfb files from /tmp directory (if any exist) From eaccf8364c7f75b872b0d9b138da6e808230f653 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Mon, 11 May 2020 12:56:53 +0000 Subject: [PATCH 15/65] add outline to poll annotation text --- .../whiteboard/annotations/poll/component.jsx | 4 ++++ .../components/whiteboard/annotations/poll/styles.scss | 10 ++++++++++ 2 files changed, 14 insertions(+) create mode 100644 bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/styles.scss diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/component.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/component.jsx index 75fa8f84bf95..c9da2f1e72a3 100644 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/component.jsx @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import PollService from '/imports/ui/components/poll/service'; import { injectIntl, intlShape } from 'react-intl'; +import styles from './styles'; class PollDrawComponent extends Component { constructor(props) { @@ -453,6 +454,7 @@ class PollDrawComponent extends Component { y={line.keyColumn.yLeft} dy={maxLineHeight / 2} key={`${line.key}_key`} + className={styles.outline} > {line.keyColumn.keyString} @@ -484,6 +486,7 @@ class PollDrawComponent extends Component { y={line.percentColumn.yRight} dy={maxLineHeight / 2} key={`${line.key}_percent`} + className={styles.outline} > {line.percentColumn.percentString} @@ -504,6 +507,7 @@ class PollDrawComponent extends Component { dy={maxLineHeight / 2} key={`${line.key}_numVotes`} fill={line.barColumn.color} + className={styles.outline} > {line.barColumn.numVotes} diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/styles.scss b/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/styles.scss new file mode 100644 index 000000000000..dda7863fd032 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/poll/styles.scss @@ -0,0 +1,10 @@ +@import "/imports/ui/stylesheets/variables/_all"; + +:root { + --poll-annotation-gray: #333333; +} + +.outline { + stroke: var(--poll-annotation-gray); + stroke-width: .5; +} \ No newline at end of file From d10ab8f4afbfb309559ab3a2198abb76cc4a0687 Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Mon, 11 May 2020 11:53:48 -0400 Subject: [PATCH 16/65] Remove files containing incompatible (to BBB) license --- .../src/assets/presentation.css | 87 ------------- .../webminer/util/Log4jDirectConfigurer.java | 115 ------------------ 2 files changed, 202 deletions(-) delete mode 100644 bigbluebutton-client/src/assets/presentation.css delete mode 100755 labs/webminer/src/main/java/org/bigbluebutton/webminer/util/Log4jDirectConfigurer.java diff --git a/bigbluebutton-client/src/assets/presentation.css b/bigbluebutton-client/src/assets/presentation.css deleted file mode 100644 index f06130b69cf4..000000000000 --- a/bigbluebutton-client/src/assets/presentation.css +++ /dev/null @@ -1,87 +0,0 @@ -/* -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2003-2006 Adobe Macromedia Software LLC and its licensors. -// All Rights Reserved. -// The following is Sample Code and is subject to all restrictions on such code -// as contained in the End User License Agreement accompanying this product. -// If you have received this file from a source other than Adobe, -// then your use, modification, or distribution of it requires -// the prior written permission of Adobe. -// -//////////////////////////////////////////////////////////////////////////////// -*/ -Application -{ - backgroundColor: #484842; -} - -CarouselImage -{ - frameColor: #9e9c8d; - frameThickness: 1; - frameSize: 5; -} - -ToolTip -{ - backgroundColor: #484842; - color: #ffffff; -} - -.button -{ - themeColor: #b7babc; -} - -.thumbnailRolledOver -{ - backgroundColor: #787872; -} - -.thumbnailSelected -{ - backgroundColor: #383832; -} - -.thumbnailTitleBar -{ - fontSize: 12; - fontWeight: "bold"; - color: #666666; -} - -.thumbnailListBorderBox -{ - backgroundColor: #9e9c8d; -} - -.thumbnailList -{ - borderColor: #9e9c8d; - backgroundColor: #9e9c8d; - selectionColor: #9e9c8d; - rollOverColor: #9e9c8d; - themeColor: #383832; - borderStyle: "solid"; - cornerRadius: 10; -} - -.photoDescription -{ - fontWeight: "bold"; - fontSize: 14; - color: #ffffff; -} - -.photoName -{ - fontSize: 12; - color: #ffffff; -} - -.slideshowControlBar -{ - backgroundAlpha: .6; - backgroundColor: #5b5b5b; -} diff --git a/labs/webminer/src/main/java/org/bigbluebutton/webminer/util/Log4jDirectConfigurer.java b/labs/webminer/src/main/java/org/bigbluebutton/webminer/util/Log4jDirectConfigurer.java deleted file mode 100755 index cf515a7a9292..000000000000 --- a/labs/webminer/src/main/java/org/bigbluebutton/webminer/util/Log4jDirectConfigurer.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - @(#)Log4jDirectConfigurer.java $Revision: 1.1 $ $Date: 2008/11/13 13:50:20EST $ - * - * Copyright (c) 2008 N-III Project - Royal Canadian Mounted Police - * All rights reserved. - * - * This software is the confidential and proprietary information of Royal - * Canadian Mounted Police ("Confidential Information"). You shall not - * disclose such Confidential Information and contained herein are considered - * to be Protected and Internal use ONLY by N-III Project, RCMP. - */ -package org.bigbluebutton.webminer.util; - -import org.apache.log4j.LogManager; -import org.apache.log4j.PropertyConfigurator; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; - -/** - * TODO: Brief summary here - one or two sentence overview. - * - * TODO: Detailed explanation of how this works, what it subclasses or what - * should subclass it, etc. This should be as good as the Sun Javadocs. Consider - * embedding some simple examples of using this class. See the Sun Thread class - * for an example. - * - * @version $Revision: 1.1 $ - * @see [Class name#method name] TODO - */ - -public class Log4jDirectConfigurer implements InitializingBean, DisposableBean { - private static final long DEFAULT_REFRESH_INTERVAL = 6000L; - - private String location; - private String fileName; - private String interval; - - /** - * @return the location - */ - public String getLocation() { - return location; - } - - /** - * @param location - * the location to set - */ - public void setLocation(String location) { - this.location = location; - } - - /** - * @return the fileName - */ - public String getFileName() { - return fileName; - } - - /** - * @param fileName - * the fileName to set - */ - public void setFileName(String fileName) { - this.fileName = fileName; - } - - /** - * @return the interval - */ - public String getInterval() { - return interval; - } - - /** - * @param interval - * the interval to set - */ - public void setInterval(String interval) { - this.interval = interval; - } - - /* - * (non-Javadoc) - * - * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() - */ - public void afterPropertiesSet() throws Exception { - - if (getLocation() != null && getFileName() != null) { - - String fqName = System.getProperty(getLocation()) + "/" + getFileName(); - - // use default refresh interval if not specified - long refreshInterval = DEFAULT_REFRESH_INTERVAL; - String intervalString = getInterval(); - if (intervalString != null) { - refreshInterval = Long.parseLong(intervalString); - } - - // perform actual Log4J initialization - PropertyConfigurator.configureAndWatch(fqName, refreshInterval); - } else { - throw new IllegalArgumentException( - "Missing log4jConfigLocation or log4jConfigName parameter."); - } - } - - /* (non-Javadoc) - * @see org.springframework.beans.factory.DisposableBean#destroy() - */ - public void destroy() throws Exception { - LogManager.shutdown(); - } -} From dd16e636edb7192eedb5affc7d7d779b110db798 Mon Sep 17 00:00:00 2001 From: Farzad Akbarinezhad Date: Tue, 21 Apr 2020 11:34:16 +0430 Subject: [PATCH 17/65] customSvgIcon css class bug fixed for rtl layouts in RTL layout, selecting colors and font thickness parts in whiteboard, will not appear correctly when they expand; one item will be thrown out of the container (overflow). the following images demonstrate the problems. adding some additional style to customSvgIcon class in css will fix the bug. http://up.maralhost.com/do.php?img=359 http://up.maralhost.com/do.php?img=364 --- .../ui/components/whiteboard/whiteboard-toolbar/styles.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/styles.scss b/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/styles.scss index 779fe07e2587..4bd4361644b8 100755 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/styles.scss @@ -232,6 +232,8 @@ position: absolute; width: var(--toolbar-button-width); height: var(--toolbar-button-height); + left: 0; + top: 0; } .textThickness { From bff29e28ad13dd58c00e0fc06157fae38033e2b7 Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Mon, 11 May 2020 15:36:31 -0400 Subject: [PATCH 18/65] Pulled HTML5 locales May 11, 2020 --- .../private/locales/bg_BG.json | 3 +- bigbluebutton-html5/private/locales/ca.json | 9 +- bigbluebutton-html5/private/locales/de.json | 53 +- .../private/locales/de_DE.json | 5 + bigbluebutton-html5/private/locales/es.json | 33 +- bigbluebutton-html5/private/locales/eu.json | 5 + .../private/locales/fa_IR.json | 5 + bigbluebutton-html5/private/locales/fr.json | 5 + bigbluebutton-html5/private/locales/gl.json | 614 ++++++++++-------- .../private/locales/hi_IN.json | 1 + .../private/locales/it_IT.json | 4 + bigbluebutton-html5/private/locales/ja.json | 55 +- .../private/locales/ja_JP.json | 55 +- .../private/locales/ko_KR.json | 219 ++++--- .../private/locales/nb_NO.json | 83 +-- bigbluebutton-html5/private/locales/nl.json | 3 + .../private/locales/pl_PL.json | 4 +- bigbluebutton-html5/private/locales/pt.json | 11 +- bigbluebutton-html5/private/locales/sl.json | 3 + .../private/locales/uk_UA.json | 493 +++++++------- .../private/locales/vi_VN.json | 149 +++-- .../private/locales/zh_TW.json | 20 +- 22 files changed, 993 insertions(+), 839 deletions(-) create mode 100644 bigbluebutton-html5/private/locales/de_DE.json diff --git a/bigbluebutton-html5/private/locales/bg_BG.json b/bigbluebutton-html5/private/locales/bg_BG.json index a6e7d4428f1d..d27d2e56a9df 100644 --- a/bigbluebutton-html5/private/locales/bg_BG.json +++ b/bigbluebutton-html5/private/locales/bg_BG.json @@ -41,7 +41,7 @@ "app.captions.pad.hide": "Скрий субтитрите", "app.captions.pad.tip": "Натиснете Esc за връщане в редактора", "app.captions.pad.ownership": "Поемете контрол", - "app.captions.pad.ownershipTooltip": "Ще поемете контрол вълху писането на субтитри на {0}", + "app.captions.pad.ownershipTooltip": "Ще поемете контрол върху писането на субтитри на {0}", "app.captions.pad.interimResult": "Междинен резултат", "app.captions.pad.dictationStart": "Започни диктовка", "app.captions.pad.dictationStop": "Спри диктовката", @@ -111,6 +111,7 @@ "app.media.autoplayAlertDesc": "Разреши достъпа", "app.media.screenshare.start": "Споделянето на екрана започна", "app.media.screenshare.end": "Споделянето на екрана приключи", + "app.media.screenshare.safariNotSupported": "Споделянето на екран не се поддържа от Safari. Моля използвайте Firefox или Google Chrome", "app.media.screenshare.autoplayBlockedDesc": "Нуждаем се от Вашето разрешение за да Ви покажем екрана на презентатора", "app.media.screenshare.autoplayAllowLabel": "Виж споделения екран", "app.screenshare.notAllowed": "Грешка: Не беше дадено разрешение за достъп до екрана", diff --git a/bigbluebutton-html5/private/locales/ca.json b/bigbluebutton-html5/private/locales/ca.json index d58a33cb96fa..a4a2983e9126 100644 --- a/bigbluebutton-html5/private/locales/ca.json +++ b/bigbluebutton-html5/private/locales/ca.json @@ -3,7 +3,7 @@ "app.chat.submitLabel": "Envia missatge", "app.chat.errorMaxMessageLength": "El missatge és {0} caràcter(s) massa llarg", "app.chat.disconnected": "Esteu fora de línia, els missatges no es poden enviar", - "app.chat.locked": "El xar està bloquejar, els missatges no es poden enviar", + "app.chat.locked": "El xat està bloquejat, els missatges no es poden enviar", "app.chat.inputLabel": "Entrada del missatge pel xat {0}", "app.chat.inputPlaceholder": "Envia missatge a {0}", "app.chat.titlePublic": "Xat públic", @@ -111,6 +111,8 @@ "app.media.autoplayAlertDesc": "Permet accés", "app.media.screenshare.start": "Inici de pantalla compartida", "app.media.screenshare.end": "Fi de la pantalla compartida", + "app.media.screenshare.unavailable": "No es pot compartir pantalla", + "app.media.screenshare.safariNotSupported": "Compartir pantalla no està suportat a Safari.\nSi us Plau, empreu Firefox o Google Chrome.", "app.media.screenshare.autoplayBlockedDesc": "Es necessita donar permís per mostrar-te la pantalla del presentador", "app.media.screenshare.autoplayAllowLabel": "Veure pantalla compartida", "app.screenshare.notAllowed": "Error: No s'ha permés l'accés a la pantalla", @@ -169,6 +171,9 @@ "app.presentationUploder.rejectedError": "Els següents fitxers han estat rebutjats. Si us plau, comprovi el tipus de fitxer.", "app.presentationUploder.upload.progress": "Pujant ({0}&)", "app.presentationUploder.upload.413": "El fitxer és massa gran. Separeu-lo en diversos arxius.", + "app.presentationUploder.upload.408": "El temps de la sol·licitud de càrrega del token s'ha acabat", + "app.presentationUploder.upload.404": "404: Token de pujada no vàlid", + "app.presentationUploder.upload.401": "La sol·licitud del token de càrrega de presentació ha fallat.", "app.presentationUploder.conversion.conversionProcessingSlides": "Processant pàgina {0} de {1}", "app.presentationUploder.conversion.genericConversionStatus": "Convertint fitxer...", "app.presentationUploder.conversion.generatingThumbnail": "Generant miniatures ...", @@ -398,7 +403,7 @@ "app.audioModal.unsupportedBrowserLabel": "Sembla que esteu emprant un navegador no suportat del tot. Si us plau utilitzeu o {0} o {1} per a un suport complet.", "app.audioModal.closeLabel": "Tanca", "app.audioModal.yes": "Sí", - "app.audioModal.no": "O", + "app.audioModal.no": "No", "app.audioModal.yes.arialabel" : "L'eco és audible", "app.audioModal.no.arialabel" : "L'eco és inaudible", "app.audioModal.echoTestTitle": "Test privat d'eco. Digueu algunes paraules. Us escolteu?", diff --git a/bigbluebutton-html5/private/locales/de.json b/bigbluebutton-html5/private/locales/de.json index db55ca84f58f..24e1f8843425 100644 --- a/bigbluebutton-html5/private/locales/de.json +++ b/bigbluebutton-html5/private/locales/de.json @@ -50,8 +50,8 @@ "app.note.title": "Geteilte Notizen", "app.note.label": "Notiz", "app.note.hideNoteLabel": "Notiz verbergen", - "app.user.activityCheck": "Nutzeraktivitätsprüfung", - "app.user.activityCheck.label": "Prüfen, ob Nutzer noch in der Konferenz ist ({0})", + "app.user.activityCheck": "Teilnehmeraktivitätsprüfung", + "app.user.activityCheck.label": "Prüfen, ob der Teilnehmer noch in der Konferenz ist ({0})", "app.user.activityCheck.check": "Prüfen", "app.note.tipLabel": "Drücken Sie Esc, um die Editorwerkzeugliste auszuwählen", "app.userList.usersTitle": "Teilnehmer", @@ -67,8 +67,8 @@ "app.userList.toggleCompactView.label": "Kompaktansichtmodus wechseln", "app.userList.guest": "Gast", "app.userList.menuTitleContext": "Verfügbare Optionen", - "app.userList.chatListItem.unreadSingular": "{0} neue Nachricht(en)", - "app.userList.chatListItem.unreadPlural": "{0} neue Nachricht(en)", + "app.userList.chatListItem.unreadSingular": "{0} neue Nachricht", + "app.userList.chatListItem.unreadPlural": "{0} neue Nachrichten", "app.userList.menu.chat.label": "Privaten Chat starten", "app.userList.menu.clearStatus.label": "Status zurücksetzen", "app.userList.menu.removeUser.label": "Teilnehmer entfernen", @@ -83,21 +83,21 @@ "app.userList.menu.makePresenter.label": "Zum Präsentator machen", "app.userList.userOptions.manageUsersLabel": "Teilnehmer verwalten", "app.userList.userOptions.muteAllLabel": "Alle Teilnehmer stummschalten", - "app.userList.userOptions.muteAllDesc": "Schaltet alle Teilnehmer der Konferenz stumm", - "app.userList.userOptions.clearAllLabel": "Lösche alle Statusicons", - "app.userList.userOptions.clearAllDesc": "Löscht alle Statusicons der Teilnehmer", - "app.userList.userOptions.muteAllExceptPresenterLabel": "Schalte alle Teilnehmer außer den Präsentator stumm", - "app.userList.userOptions.muteAllExceptPresenterDesc": "Schaltet alle Teilnehmer außer den Präsentator stumm", + "app.userList.userOptions.muteAllDesc": "Alle Teilnehmer der Konferenz werden stumm geschaltet", + "app.userList.userOptions.clearAllLabel": "Alle Statusicons löschen", + "app.userList.userOptions.clearAllDesc": "Alle Statusicons der Teilnehmer löschen", + "app.userList.userOptions.muteAllExceptPresenterLabel": "Alle Teilnehmer außer den Präsentator stummschalten", + "app.userList.userOptions.muteAllExceptPresenterDesc": "Alle Teilnehmer der Konferenz außer dem Präsentator werden stumm geschaltet", "app.userList.userOptions.unmuteAllLabel": "Konferenz-Stummschaltung aufheben", "app.userList.userOptions.unmuteAllDesc": "Hebt die Konferenz-Stummschaltung auf", - "app.userList.userOptions.lockViewersLabel": "Zuschauerrechte einstellen", + "app.userList.userOptions.lockViewersLabel": "Teilnehmerrechte einschränken", "app.userList.userOptions.lockViewersDesc": "Schränkt bestimmte Funktionen der Konferenzteilnehmer ein", "app.userList.userOptions.disableCam": "Teilnehmerwebcams sind deaktiviert", "app.userList.userOptions.disableMic": "Teilnehmermikrofone sind deaktiviert", "app.userList.userOptions.disablePrivChat": "Privater Chat ist deaktiviert", "app.userList.userOptions.disablePubChat": "Öffentlicher Chat ist deaktiviert", "app.userList.userOptions.disableNote": "Geteilte Notizen sind jetzt gesperrt", - "app.userList.userOptions.hideUserList": "Die Teilnehmerliste ist jetzt für die Teilnehmer nicht mehr sichtbar", + "app.userList.userOptions.hideUserList": "Teilnehmerliste ist jetzt für die Teilnehmer ausgeblendet", "app.userList.userOptions.webcamsOnlyForModerator": "Nur Moderatoren können die Teilnehmerwebcams sehen (wegen eingeschränkter Rechteeinstellungen)", "app.userList.content.participants.options.clearedStatus": "Status aller Teilnehmer zurückgesetzt", "app.userList.userOptions.enableCam": "Teilnehmer dürfen ihre Webcam verwenden", @@ -105,7 +105,7 @@ "app.userList.userOptions.enablePrivChat": "Privater Chat ist erlaubt", "app.userList.userOptions.enablePubChat": "Öffentlicher Chat ist erlaubt", "app.userList.userOptions.enableNote": "Geteilte Notizen sind erlaubt", - "app.userList.userOptions.showUserList": "Die Teilnehmerliste ist jetzt für die Teilnehmer sichtbar", + "app.userList.userOptions.showUserList": "Teilnehmerliste ist jetzt für die Teilnehmer sichtbar", "app.userList.userOptions.enableOnlyModeratorWebcam": "Sie können Ihre Webcam jetzt freigeben, jeder wird Sie sehen.", "app.media.label": "Media", "app.media.autoplayAlertDesc": "Zugang erlauben", @@ -144,12 +144,12 @@ "app.presentation.presentationToolbar.fitWidthDesc": "Folie in voller Breite darstellen", "app.presentation.presentationToolbar.fitScreenLabel": "An Bildschirm anpassen", "app.presentation.presentationToolbar.fitScreenDesc": "Gesamte Folie darstellen", - "app.presentation.presentationToolbar.zoomLabel": "Vergrößerungsgrad", - "app.presentation.presentationToolbar.zoomDesc": "Vergrößerungsstufe der Präsentation ändern", - "app.presentation.presentationToolbar.zoomInLabel": "Reinzoomen", - "app.presentation.presentationToolbar.zoomInDesc": "In die Präsentation hinein zoomen", - "app.presentation.presentationToolbar.zoomOutLabel": "Rauszoomen", - "app.presentation.presentationToolbar.zoomOutDesc": "Aus der Präsentation heraus zoomen", + "app.presentation.presentationToolbar.zoomLabel": "Zoom", + "app.presentation.presentationToolbar.zoomDesc": "Zoom-Stufe der Präsentation ändern", + "app.presentation.presentationToolbar.zoomInLabel": "Vergrößern", + "app.presentation.presentationToolbar.zoomInDesc": "Vergrößern der Präsentation", + "app.presentation.presentationToolbar.zoomOutLabel": "Verkleinern", + "app.presentation.presentationToolbar.zoomOutDesc": "Verkleinern der Präsentation", "app.presentation.presentationToolbar.zoomReset": "Zoom zurücksetzen", "app.presentation.presentationToolbar.zoomIndicator": "Aktuelle Zoom-Stufe", "app.presentation.presentationToolbar.fitToWidth": "An Breite anpassen", @@ -171,6 +171,9 @@ "app.presentationUploder.rejectedError": "Die ausgewählten Dateien wurden zurückgewiesen. Bitte prüfen Sie die zulässigen Dateitypen.", "app.presentationUploder.upload.progress": "Hochladen ({0}%)", "app.presentationUploder.upload.413": "Die Datei ist zu groß. Bitte teilen Sie sie in mehrere kleinere Dateien auf.", + "app.presentationUploder.upload.408": "Zeitüberschreitung des Upload-Token anfordern.", + "app.presentationUploder.upload.404": "404: Ungültiger Upload-Token", + "app.presentationUploder.upload.401": "Anforderung des Upload-Tokens von Präsentationen fehlgeschlagen.", "app.presentationUploder.conversion.conversionProcessingSlides": "Verarbeite Seite {0} von {1}", "app.presentationUploder.conversion.genericConversionStatus": "Konvertiere Datei...", "app.presentationUploder.conversion.generatingThumbnail": "Erstelle Miniaturbilder...", @@ -192,9 +195,9 @@ "app.poll.pollPaneTitle": "Umfrage", "app.poll.quickPollTitle": "Schnellumfrage", "app.poll.hidePollDesc": "Versteckt das Umfragemenü", - "app.poll.customPollInstruction": "Um selbst erstellte Umfrage zu erstellen, klicken Sie die untenstehende Schaltfläche und geben Sie Ihre Optionen ein", + "app.poll.customPollInstruction": "Um eine benutzerdefinierte Umfrage zu erstellen, wählen Sie die Schaltfläche unten und geben Sie Ihre Optionen ein.", "app.poll.quickPollInstruction": "Wählen Sie eine der unten stehenden Optionen, um die Umfrage zu starten.", - "app.poll.customPollLabel": "Benutzerdefinierte Umfrage...", + "app.poll.customPollLabel": "Benutzerdefinierte Umfrage", "app.poll.startCustomLabel": "Benutzerdefinierte Umfrage starten", "app.poll.activePollInstruction": "Lassen Sie dieses Fenster offen, um auf die Antworten der Teilnehmer zu warten. Sobald Sie auf \"Umfrageergebnisse veröffentlichen\" klicken, werden die Ergebnisse angezeigt und die Umfrage beendet.", "app.poll.publishLabel": "Umfrageergebnisse veröffentlichen", @@ -230,7 +233,7 @@ "app.polling.pollAnswerLabel": "Umfrageantwort {0}", "app.polling.pollAnswerDesc": "Diese Option auswählen für Umfrage {0}", "app.failedMessage": "Es gibt Verbindungsprobleme mit dem Server.", - "app.downloadPresentationButton.label": "Ursprüngliche Version der Präsentation runterladen", + "app.downloadPresentationButton.label": "Ursprüngliche Version der Präsentation herunterladen", "app.connectingMessage": "Verbinde...", "app.waitingMessage": "Verbindung unterbrochen. Versuche in {0} Sekunden erneut zu verbinden...", "app.retryNow": "Jetzt erneut versuchen", @@ -238,7 +241,7 @@ "app.navBar.settingsDropdown.fullscreenLabel": "Als Vollbild darstellen", "app.navBar.settingsDropdown.settingsLabel": "Einstellungen öffnen", "app.navBar.settingsDropdown.aboutLabel": "Versionsinfo", - "app.navBar.settingsDropdown.leaveSessionLabel": "Konferenz verlassen", + "app.navBar.settingsDropdown.leaveSessionLabel": "Ausloggen", "app.navBar.settingsDropdown.exitFullscreenLabel": "Vollbilddarstellung beenden", "app.navBar.settingsDropdown.fullscreenDesc": "Einstellungsmenü als Vollbild darstellen", "app.navBar.settingsDropdown.settingsDesc": "Basiseinstellungen verändern", @@ -354,7 +357,7 @@ "app.actionsBar.emojiMenu.happyLabel": "Glücklich", "app.actionsBar.emojiMenu.happyDesc": "Ihren Status auf glücklich setzen", "app.actionsBar.emojiMenu.noneLabel": "Status löschen", - "app.actionsBar.emojiMenu.noneDesc": "Status löschen", + "app.actionsBar.emojiMenu.noneDesc": "Ihren Status löschen", "app.actionsBar.emojiMenu.applauseLabel": "Applaus", "app.actionsBar.emojiMenu.applauseDesc": "Ihren Status auf Applaus setzen", "app.actionsBar.emojiMenu.thumbsUpLabel": "Daumen hoch", @@ -511,8 +514,8 @@ "app.shortcut-help.togglePan": "Aktiviere Verschiebewerkzeug (Präsentator)", "app.shortcut-help.nextSlideDesc": "Nächste Folie (Präsentator)", "app.shortcut-help.previousSlideDesc": "Vorherige Folie (Präsentator)", - "app.lock-viewers.title": "Zuschauerrechte einstellen", - "app.lock-viewers.description": "Diese Optionen ermöglichen es, bestimmte Funktionen für Zuschauer einzuschränken.", + "app.lock-viewers.title": "Teilnehmerrechte einschränken", + "app.lock-viewers.description": "Diese Optionen ermöglichen es, bestimmte Funktionen für Teilnehmer einzuschränken.", "app.lock-viewers.featuresLable": "Funktion", "app.lock-viewers.lockStatusLabel": "Status", "app.lock-viewers.webcamLabel": "Webcam freigeben", diff --git a/bigbluebutton-html5/private/locales/de_DE.json b/bigbluebutton-html5/private/locales/de_DE.json new file mode 100644 index 000000000000..7e84f87a7bb1 --- /dev/null +++ b/bigbluebutton-html5/private/locales/de_DE.json @@ -0,0 +1,5 @@ +{ + "app.lock-viewers.otherViewersWebcamLabel": "Webcams anderer Teilnehmer sehen" + +} + diff --git a/bigbluebutton-html5/private/locales/es.json b/bigbluebutton-html5/private/locales/es.json index 2661435cdcc3..51e4ddad3835 100644 --- a/bigbluebutton-html5/private/locales/es.json +++ b/bigbluebutton-html5/private/locales/es.json @@ -111,6 +111,8 @@ "app.media.autoplayAlertDesc": "Permitir acceso", "app.media.screenshare.start": "Compartir pantalla ha iniciado", "app.media.screenshare.end": "Compartir pantalla ha finalizado", + "app.media.screenshare.unavailable": "Compartir pantalla no disponible", + "app.media.screenshare.safariNotSupported": "Compartir pantalla no está soportado en Safari.\nPor favor, use Firefox o Google Chrome.", "app.media.screenshare.autoplayBlockedDesc": "Necesitamos su permiso para mostrarle la pantalla del presentador", "app.media.screenshare.autoplayAllowLabel": "Ver pantalla compartida", "app.screenshare.notAllowed": "Error: No tiene permisos para acceder a la pantalla", @@ -160,15 +162,18 @@ "app.presentationUploder.confirmDesc": "Grardar los cambios e iniciar la presentación", "app.presentationUploder.dismissLabel": "Cancelar", "app.presentationUploder.dismissDesc": "Cerrar la ventana modal y descartar cambios.", - "app.presentationUploder.dropzoneLabel": "Arrastrar archivo aqui para cargarlo", - "app.presentationUploder.dropzoneImagesLabel": "Arrastrar imagenes aqui para cargarlas", + "app.presentationUploder.dropzoneLabel": "Arrastrar archivo aquí para cargarlo", + "app.presentationUploder.dropzoneImagesLabel": "Arrastrar imágenes aquí para cargarlas", "app.presentationUploder.browseFilesLabel": "o buscar archivos", "app.presentationUploder.browseImagesLabel": "o buscar imagenes", "app.presentationUploder.fileToUpload": "En proceso de ser cargado ...", - "app.presentationUploder.currentBadge": "Acual", + "app.presentationUploder.currentBadge": "Actual", "app.presentationUploder.rejectedError": "El(los) archivo(s) seleccionado(s) ha(n) sido rechazado(s). Por favor, revise el(los) tipo(s) de archivo.", "app.presentationUploder.upload.progress": "Cargando ({0}%)", "app.presentationUploder.upload.413": "Archivo muy grande, por favor divídelo en varios ficheros", + "app.presentationUploder.upload.408": "La solicitud de carga del token está fuera de tiempo.", + "app.presentationUploder.upload.404": "404: Token de subida no válido", + "app.presentationUploder.upload.401": "La solicitud del token de subida de presentación ha fallado.", "app.presentationUploder.conversion.conversionProcessingSlides": "Procesando página {0} de {1}", "app.presentationUploder.conversion.genericConversionStatus": "Convirtiendo archivos ...", "app.presentationUploder.conversion.generatingThumbnail": "Generando miniaturas ...", @@ -229,8 +234,8 @@ "app.polling.pollAnswerDesc": "Seleccione esta opcion para responder {0}", "app.failedMessage": "Disculpas, problemas conectando al servidor.", "app.downloadPresentationButton.label": "Descargar la presentación original", - "app.connectingMessage": "Conectandose ...", - "app.waitingMessage": "Desconectado. Se realizara un reintento en {0} segundos ...", + "app.connectingMessage": "Conectándose ...", + "app.waitingMessage": "Desconectado. Se realizará un reintento en {0} segundos ...", "app.retryNow": "Reintentando ahora", "app.navBar.settingsDropdown.optionsLabel": "Opciones", "app.navBar.settingsDropdown.fullscreenLabel": "Desplegar a pantalla completa", @@ -252,14 +257,14 @@ "app.navBar.userListToggleBtnLabel": "Alternar lista de usuarios", "app.navBar.toggleUserList.ariaLabel": "Cambio de usuarios y mensajes", "app.navBar.toggleUserList.newMessages": "con nueva notificación de mensaje ", - "app.navBar.recording": "Esta sesión esta siendo grabada", + "app.navBar.recording": "Esta sesión está siendo grabada", "app.navBar.recording.on": "Grabando", "app.navBar.recording.off": "No grabando", "app.navBar.emptyAudioBrdige": "No hay ningún micrófono activo. Comparta su micrófono para añadir audio a esta grabación.", "app.leaveConfirmation.confirmLabel": "Salir", "app.leaveConfirmation.confirmDesc": "Te desconecta de la reunión", "app.endMeeting.title": "Finalizar sesión", - "app.endMeeting.description": "¿Estas seguro de querer finalizar la sesión?", + "app.endMeeting.description": "¿Estás seguro de querer finalizar la sesión?", "app.endMeeting.yesLabel": "Si", "app.endMeeting.noLabel": "No", "app.about.title": "Acerca de", @@ -276,7 +281,7 @@ "app.actionsBar.raiseLabel": "Levantar", "app.actionsBar.label": "Barra de acciones", "app.actionsBar.actionsDropdown.restorePresentationLabel": "Reestablecer presentación", - "app.actionsBar.actionsDropdown.restorePresentationDesc": "Restaurar presentación despues de que ha sido cerrada", + "app.actionsBar.actionsDropdown.restorePresentationDesc": "Restaurar presentación después de que ha sido cerrada", "app.screenshare.screenShareLabel" : "Compartir pantalla", "app.submenu.application.applicationSectionTitle": "Aplicación", "app.submenu.application.animationsLabel": "Animaciones", @@ -415,8 +420,8 @@ "app.audioModal.playAudio.arialabel" : "Reproducir audio", "app.audioDial.tipIndicator": "Pista", "app.audioDial.tipMessage": "Pulse la tecla '0' en su teléfono para silenciarse/activar el audio a si mismo.", - "app.audioModal.connecting": "Conectandose", - "app.audioModal.connectingEchoTest": "Conenctandose a prueba de eco", + "app.audioModal.connecting": "Conectándose", + "app.audioModal.connectingEchoTest": "Conectándose a prueba de eco", "app.audioManager.joinedAudio": "Has ingresado a la conferencia de audio", "app.audioManager.joinedEcho": "Has ingresado a la prueba de eco", "app.audioManager.leftAudio": "Has abandonado la conferencia de audio", @@ -425,7 +430,7 @@ "app.audioManager.connectionError": "Error: Error de conexión", "app.audioManager.requestTimeout": "Error: Ocurrio un error de tiempo de espera", "app.audioManager.invalidTarget": "Error: Intento hacer una petición a un destino invalido", - "app.audioManager.mediaError": "Error: Ocurrio un error al obtener los dispositivos de medios", + "app.audioManager.mediaError": "Error: Ocurrió un error al obtener los dispositivos de medios", "app.audio.joinAudio": "Unirse al audio", "app.audio.leaveAudio": "Abandonar audio", "app.audio.enterSessionLabel": "Entrar a la sesión", @@ -442,7 +447,7 @@ "app.audio.permissionsOverlay.title": "Permitir acceso a tu micrófono", "app.audio.permissionsOverlay.hint": "Necesitamos tu autorización para acceder tus dipositivos de medios para poder ingresar a la conferencia de voz :)", "app.error.removed": "Has sido eliminado de la conferencia", - "app.error.meeting.ended": "Haz salido de la conferencia", + "app.error.meeting.ended": "Has salido de la conferencia", "app.meeting.logout.duplicateUserEjectReason": "Usuario duplicado intentando unirse a la reunión", "app.meeting.logout.permissionEjectReason": "Expulsado por violación de permiso", "app.meeting.logout.ejectedFromMeeting": "Usted ha sido expulsado/a de la reunión", @@ -487,7 +492,7 @@ "app.toast.setEmoji.label": "Estado del emoji cambiado a {0}", "app.toast.meetingMuteOn.label": "Todos los usuarios han sido silenciados", "app.toast.meetingMuteOff.label": "Función de silenciar ha sido deshabilitada", - "app.notification.recordingStart": "La sesión esta siendo grabada", + "app.notification.recordingStart": "La sesión está siendo grabada", "app.notification.recordingStop": "Esta sesión no está siendo grabada", "app.notification.recordingPaused": "Se ha dejado de grabar la sesión", "app.notification.recordingAriaLabel": "Tiempo de grabación", @@ -620,7 +625,7 @@ "app.whiteboard.toolbar.multiUserOn": "Activar modo multiusuario de pizarra", "app.whiteboard.toolbar.multiUserOff": "Desactivar modo multiusuario de pizarra", "app.whiteboard.toolbar.fontSize": "Lista de tamaño de letras", - "app.feedback.title": "Haz salido de la conferencia", + "app.feedback.title": "Has salido de la conferencia", "app.feedback.subtitle": "Nos encantaría saber cual fué tu experiencia con BigBlueButton (opcional)", "app.feedback.textarea": "¿Como podemos mejorar BigBlueButton?", "app.feedback.sendFeedback": "Enviar retroalimentación", diff --git a/bigbluebutton-html5/private/locales/eu.json b/bigbluebutton-html5/private/locales/eu.json index 807ece2a237b..3b14cc996fed 100644 --- a/bigbluebutton-html5/private/locales/eu.json +++ b/bigbluebutton-html5/private/locales/eu.json @@ -111,6 +111,8 @@ "app.media.autoplayAlertDesc": "Baimendu sartzea", "app.media.screenshare.start": "Pantaila partekatzea hasi da", "app.media.screenshare.end": "Pantaila partekatzea bukatu da", + "app.media.screenshare.unavailable": "Pantaila partekatzea ez dago eskuragarri", + "app.media.screenshare.safariNotSupported": "Pantaila partekatzea momentuz ez dago onartuta Safari-n. Mesedez, Forefox edo Chrome erabili ezazu.", "app.media.screenshare.autoplayBlockedDesc": "Zure baimena behar dugu aurkezlearen pantaila zuri erakusteko.", "app.media.screenshare.autoplayAllowLabel": "Ikusi partekatutako pantaila", "app.screenshare.notAllowed": "Errorea: Pantailan sartzeko baimena ez da eman.", @@ -169,6 +171,9 @@ "app.presentationUploder.rejectedError": "Hautatutako fitxategia(k) baztertu egin d(ir)a. Egiaztatu fitxategi mota(k).", "app.presentationUploder.upload.progress": "Igotzen (%{0})", "app.presentationUploder.upload.413": "Fitxategia handiegia da. Hainbat fitxategitan zatitu ezazu mesedez.", + "app.presentationUploder.upload.408": "Igoerako eskaera-tokenaren denbora agortu da.", + "app.presentationUploder.upload.404": "404: igoera-token baliogabea", + "app.presentationUploder.upload.401": "Aurkezpen-igoeraren eskaera-tokenak huts egin du.", "app.presentationUploder.conversion.conversionProcessingSlides": "{1} orrietatik {0}.a prozesatzen", "app.presentationUploder.conversion.genericConversionStatus": "Fitxategia bihurtzen...", "app.presentationUploder.conversion.generatingThumbnail": "Miniaturak sortzen...", diff --git a/bigbluebutton-html5/private/locales/fa_IR.json b/bigbluebutton-html5/private/locales/fa_IR.json index 89f6fa4d9b88..4adbb07a33ba 100644 --- a/bigbluebutton-html5/private/locales/fa_IR.json +++ b/bigbluebutton-html5/private/locales/fa_IR.json @@ -111,6 +111,8 @@ "app.media.autoplayAlertDesc": "دادن اجازه دسترسی", "app.media.screenshare.start": "اشتراک صفحه نمایش شروع شد", "app.media.screenshare.end": "اشتراک صفحه نمایش به پایان رسید.", + "app.media.screenshare.unavailable": "اشتراک صفحه در دسترس نیست", + "app.media.screenshare.safariNotSupported": "در حال حاضر اشتراک صفحه در سافاری پشتیبانی نمی شود. لطفا، از فایرفاکس یا گوگل کروم استفاده کنید.", "app.media.screenshare.autoplayBlockedDesc": "ما به مجوز شما برای نشان دادن شما به ارائه دهندگان نیاز داریم", "app.media.screenshare.autoplayAllowLabel": "مشاهده صفحه اشتراکی", "app.screenshare.notAllowed": "خطا : دسترسی برای نمایش صفحه ، ایجاد نشد", @@ -169,6 +171,9 @@ "app.presentationUploder.rejectedError": "فایل(های) انتخاب شده رد شدند. لطفا نوع فایل(ها) را بررسی کنید", "app.presentationUploder.upload.progress": "در حال بارگزاری ({0}%)", "app.presentationUploder.upload.413": "حجم فایل زیاد است.لطفا آن را به چند فایل کوچکتر تبدیل کنید", + "app.presentationUploder.upload.408": "زمان درخواست شناسه بارگذاری به پایان رسید.", + "app.presentationUploder.upload.404": "404: شناسه بارگذاری نامعتبر می باشد.", + "app.presentationUploder.upload.401": "درخواست شناسه بارگذاری ارائه ناموفق بوده است.", "app.presentationUploder.conversion.conversionProcessingSlides": "در حال پردازش صفحه {0} از {1}", "app.presentationUploder.conversion.genericConversionStatus": "در حال تبدیل فایل ...", "app.presentationUploder.conversion.generatingThumbnail": "در حال تولید تصاویر کوچک ...", diff --git a/bigbluebutton-html5/private/locales/fr.json b/bigbluebutton-html5/private/locales/fr.json index 4ef38a3ebf7b..fdf25f1a30cf 100644 --- a/bigbluebutton-html5/private/locales/fr.json +++ b/bigbluebutton-html5/private/locales/fr.json @@ -111,6 +111,8 @@ "app.media.autoplayAlertDesc": "Autoriser l'accès", "app.media.screenshare.start": "Le Partage d'écran a commencé", "app.media.screenshare.end": "Le Partage d'écran s'est terminé", + "app.media.screenshare.unavailable": "Partage d'écran indisponible", + "app.media.screenshare.safariNotSupported": "Le partage d'écran n'est actuellement pas supporté par Safari. Veuillez utiliser Firefox ou Google Chrome.", "app.media.screenshare.autoplayBlockedDesc": "Nous avons besoin de votre permission pour vous montrer l'écran du présentateur.", "app.media.screenshare.autoplayAllowLabel": "Afficher l'écran partagé", "app.screenshare.notAllowed": "Erreur: L'autorisation d'accès à l'écran n'a pas été accordée.", @@ -169,6 +171,9 @@ "app.presentationUploder.rejectedError": "Le(s) fichier(s) sélectionné(s) a été rejeté(s). Veuillez vérifier le format de ce(s) fichier(s).", "app.presentationUploder.upload.progress": "Chargement ({0}%)", "app.presentationUploder.upload.413": "Le fichier est trop volumineux. Veuillez le diviser en plusieurs fichiers s'il vous plaît.", + "app.presentationUploder.upload.408": "Le jeton de demande de téléversement a expiré.", + "app.presentationUploder.upload.404": "404: Jeton de téléversement invalide", + "app.presentationUploder.upload.401": "La demande d'un jeton de téléversement de présentation a échoué.", "app.presentationUploder.conversion.conversionProcessingSlides": "Traitement de la page {0} sur {1}", "app.presentationUploder.conversion.genericConversionStatus": "Conversion de fichier...", "app.presentationUploder.conversion.generatingThumbnail": "Génération des vignettes...", diff --git a/bigbluebutton-html5/private/locales/gl.json b/bigbluebutton-html5/private/locales/gl.json index 10f156aa2743..f75f39782fce 100644 --- a/bigbluebutton-html5/private/locales/gl.json +++ b/bigbluebutton-html5/private/locales/gl.json @@ -1,25 +1,25 @@ { - "app.home.greeting": "A túa presentación dara inicio nun momento...", + "app.home.greeting": "A súa presentación comezará en breve…", "app.chat.submitLabel": "Enviar mensaxe", - "app.chat.errorMaxMessageLength": "A mensaxe é {0} carácter(é) mais longo do esperado", - "app.chat.disconnected": "Estas desconectado, as mensaxes non poden ser enviados", - "app.chat.locked": "Chat bloqueado, as mensaxes non poden ser enviados", - "app.chat.inputLabel": "Entrada de mensaxe para chat {0}", + "app.chat.errorMaxMessageLength": "A mensaxe ten {0} carácter(es) mais do admitido", + "app.chat.disconnected": "Esta desconectado, non é posíbel enviar as mensaxes", + "app.chat.locked": "Conversa bloqueado, anon é posíbel enviar as mensaxes", + "app.chat.inputLabel": "Entrada de mensaxe para a conversa {0}", "app.chat.inputPlaceholder": "Enviar mensaxe a {0}.", - "app.chat.titlePublic": "Chat público", - "app.chat.titlePrivate": "Chat privado con {0}.", - "app.chat.partnerDisconnected": "{0} abandonou a reunión", + "app.chat.titlePublic": "Conversa pública", + "app.chat.titlePrivate": "Conversa privada con {0}.", + "app.chat.partnerDisconnected": "{0} abandonou a xuntanza", "app.chat.closeChatLabel": "Pechar {0}", - "app.chat.hideChatLabel": "Ocultar {0}", - "app.chat.moreMessages": "Máis mensaxes abaixo", - "app.chat.dropdown.options": "Opcións de chat", + "app.chat.hideChatLabel": "Agochar {0}", + "app.chat.moreMessages": "Máis mensaxes a seguir", + "app.chat.dropdown.options": "Opcións da conversa", "app.chat.dropdown.clear": "Limpar", "app.chat.dropdown.copy": "Copiar", "app.chat.dropdown.save": "Gardar", - "app.chat.label": "Chat", + "app.chat.label": "Conversa", "app.chat.offline": "Desconectado", - "app.chat.emptyLogLabel": "Rexistro de chat baleiro", - "app.chat.clearPublicChatMessage": "O chat publico foi borrado por un moderador", + "app.chat.emptyLogLabel": "Rexistro da conversa baleiro", + "app.chat.clearPublicChatMessage": "A conversa publica foi retirada por un moderador", "app.chat.multi.typing": "Varios usuarios están a escribir", "app.chat.one.typing": "{0} está a escribir", "app.chat.two.typing": "{0} e {1} están a escribir", @@ -28,185 +28,199 @@ "app.captions.menu.start": "Iniciar", "app.captions.menu.ariaStart": "Comezar a escribir subtítulos", "app.captions.menu.ariaStartDesc": "Abre o editor de subtítulos e pecha a xanela flotante", - "app.captions.menu.select": "Seleccione idiomas dispoñibles", - "app.captions.menu.ariaSelect": "Idioma de subtítulos", - "app.captions.menu.subtitle": "Selecciona o idioma e estilos para subtítulos a utilizar na túa sesión.", + "app.captions.menu.select": "Seleccione idiomas dispoñíbeis", + "app.captions.menu.ariaSelect": "Idioma dos subtítulos", + "app.captions.menu.subtitle": "Seleccione o idioma e estilos para subtítulos a utilizar na súa sesión.", "app.captions.menu.title": "Subtítulos", "app.captions.menu.fontSize": "Tamaño", "app.captions.menu.fontColor": "Cor de texto", - "app.captions.menu.fontFamily": "Fonte", + "app.captions.menu.fontFamily": "Tipo de letra", "app.captions.menu.backgroundColor": "Cor de fondo", - "app.captions.menu.previewLabel": "Previsualizar", - "app.captions.menu.cancelLabel": "Cancela", - "app.captions.pad.hide": "Ocultar subtítulos", - "app.captions.pad.tip": "Presione Esc para enfocar a barra de ferramentas do editor", + "app.captions.menu.previewLabel": "Vista previa", + "app.captions.menu.cancelLabel": "Cancelar", + "app.captions.pad.hide": "Agochar os subtítulos", + "app.captions.pad.tip": "Prema Esc para enfocar a barra de ferramentas do editor", "app.captions.pad.ownership": "Tomar o control", - "app.captions.pad.ownershipTooltip": "Será asignado como propietario de 0 {} subtítulos", + "app.captions.pad.ownershipTooltip": "Vai ser asignado coma propietario de {0} subtítulos", "app.captions.pad.interimResult": "Resultados provisionais", "app.captions.pad.dictationStart": "Iniciar ditado", "app.captions.pad.dictationStop": "Deter ditado", - "app.captions.pad.dictationOnDesc": "Activar recoñecemento de voz", - "app.captions.pad.dictationOffDesc": "Desactivar recoñecemento de voz", + "app.captions.pad.dictationOnDesc": "Activar o recoñecemento de voz", + "app.captions.pad.dictationOffDesc": "Desactivar o recoñecemento de voz", "app.note.title": "Notas compartidas", "app.note.label": "Nota", - "app.note.hideNoteLabel": "Ocultar nota", - "app.user.activityCheck": "Comprobar actividade do usuario", - "app.user.activityCheck.label": "Comprobar se o usuario continúa na reunión ({0})", + "app.note.hideNoteLabel": "Agochar nota", + "app.user.activityCheck": "Comprobar a actividade do usuario", + "app.user.activityCheck.label": "Comprobar se o usuario aínda está na xuntanza ({0})", "app.user.activityCheck.check": "Comprobar", - "app.note.tipLabel": "Presione Esc para enfocar a barra de ferramentas do editor", + "app.note.tipLabel": "Prema Esc para enfocar a barra de ferramentas do editor", "app.userList.usersTitle": "Usuarios", "app.userList.participantsTitle": "Participantes", "app.userList.messagesTitle": "Mensaxes", "app.userList.notesTitle": "Notas", - "app.userList.notesListItem.unreadContent": "Contido novo dispoñible na sección de notas compartidas", + "app.userList.notesListItem.unreadContent": "Contido novo dispoñíbel na sección de notas compartidas", "app.userList.captionsTitle": "Subtítulos", "app.userList.presenter": "Presentador", - "app.userList.you": "O teu", + "app.userList.you": "Vostede", "app.userList.locked": "Bloqueado", "app.userList.label": "Lista de usuarios", - "app.userList.toggleCompactView.label": "Cambiar a modo de vista compacta", - "app.userList.guest": "Huesped", - "app.userList.menuTitleContext": "Opcións dispoñibles", - "app.userList.chatListItem.unreadSingular": "{0} Nova Mensaxe", - "app.userList.chatListItem.unreadPlural": "{0} Novas mensaxes", - "app.userList.menu.chat.label": "Iniciar o chat privado", - "app.userList.menu.clearStatus.label": "Borrar estado", - "app.userList.menu.removeUser.label": "Eliminar usuario", - "app.userList.menu.muteUserAudio.label": "Deshabilitar audio de usuario", - "app.userList.menu.unmuteUserAudio.label": "Habilitar audio de usuario", + "app.userList.toggleCompactView.label": "Alternar o modo de vista compacta", + "app.userList.guest": "Convidado", + "app.userList.menuTitleContext": "Opcións dispoñíbeis", + "app.userList.chatListItem.unreadSingular": "{0} nova mensaxe", + "app.userList.chatListItem.unreadPlural": "{0} novas mensaxes", + "app.userList.menu.chat.label": "Iniciar a conversa privada", + "app.userList.menu.clearStatus.label": "Limpar o estado", + "app.userList.menu.removeUser.label": "Retirar o usuario", + "app.userList.menu.muteUserAudio.label": "Desactivar o son do usuario", + "app.userList.menu.unmuteUserAudio.label": "Activar o son do usuario", "app.userList.userAriaLabel": "{0} {1} {2} estado {3}", "app.userList.menu.promoteUser.label": "Promover a moderador", "app.userList.menu.demoteUser.label": "Degradar a espectador", "app.userList.menu.unlockUser.label": "Desbloquear {0}", "app.userList.menu.lockUser.label": "Bloquear {0}", - "app.userList.menu.directoryLookup.label": "Procura de directorio", + "app.userList.menu.directoryLookup.label": "Atopar directorio", "app.userList.menu.makePresenter.label": "Promover a presentador", - "app.userList.userOptions.manageUsersLabel": "Manexar usuarios", - "app.userList.userOptions.muteAllLabel": "Deshabilitar audio a todos os usuarios", - "app.userList.userOptions.muteAllDesc": "Deshabilitar audio a todos os usuarios na sesión", - "app.userList.userOptions.clearAllLabel": "Borrar todas as iconas de estado", - "app.userList.userOptions.clearAllDesc": "Borrar todas as iconas de estado de usuarios", - "app.userList.userOptions.muteAllExceptPresenterLabel": "Deshabilitar audio a todos os usuarios excepto a presentador", - "app.userList.userOptions.muteAllExceptPresenterDesc": "Deshabilitar audio a todos os usuarios na sesión excepto a presentador", - "app.userList.userOptions.unmuteAllLabel": "Desactivar funcion para deshabilitar audio", - "app.userList.userOptions.unmuteAllDesc": "Habilitar audio na sesión", + "app.userList.userOptions.manageUsersLabel": "Administrar usuarios", + "app.userList.userOptions.muteAllLabel": "Desactivar o son de todos os usuarios", + "app.userList.userOptions.muteAllDesc": "Desactivar o son de todos os usuarios na xuntanza", + "app.userList.userOptions.clearAllLabel": "Limpar todas as iconas de estado", + "app.userList.userOptions.clearAllDesc": "Limpar todas as iconas de estado dos usuarios", + "app.userList.userOptions.muteAllExceptPresenterLabel": "Silenciar a todos os usuarios agás o presentador", + "app.userList.userOptions.muteAllExceptPresenterDesc": "Silenciar a todos os usuarios na xuntanza agás o presentador", + "app.userList.userOptions.unmuteAllLabel": "Desactivar o silencio na xuntanza", + "app.userList.userOptions.unmuteAllDesc": "Activar o son na xuntanza", "app.userList.userOptions.lockViewersLabel": "Bloquear espectadores", - "app.userList.userOptions.lockViewersDesc": "Bloquear algunhas funcións a espectadores", - "app.userList.userOptions.disableCam": "Cámaras web de invitados deshabilitadas", - "app.userList.userOptions.disableMic": "Micrófonos de invitados deshabilitados", - "app.userList.userOptions.disablePrivChat": "Chat privado deshabilitado", - "app.userList.userOptions.disablePubChat": "Chat público deshabilitado", - "app.userList.userOptions.disableNote": "Notas compartidas bloqueadas", - "app.userList.userOptions.hideUserList": "Lista de usuarios oculta para participantes", + "app.userList.userOptions.lockViewersDesc": "Bloquear certas funcionalidades para os asistentes ao encontro", + "app.userList.userOptions.disableCam": "As cámaras web dos espectadores están desactivadas", + "app.userList.userOptions.disableMic": "Os micrófonos dos espectadores están desactivados", + "app.userList.userOptions.disablePrivChat": "A conversa privada está desactivada", + "app.userList.userOptions.disablePubChat": "A conversa pública está desactivada", + "app.userList.userOptions.disableNote": "As notas compartidas están bloqueadas", + "app.userList.userOptions.hideUserList": "A lista de usuarios agora está agochada para os espectadores", "app.userList.userOptions.webcamsOnlyForModerator": "Só os moderadores poden ver as cámaras web dos invitados (debido á configuración de bloqueo)", - "app.userList.content.participants.options.clearedStatus": "Todos os estados de usuario foron borrados", - "app.userList.userOptions.enableCam": "Cámaras web de invitados habilitadas", - "app.userList.userOptions.enableMic": "Micrófonos de invitados habilitados", - "app.userList.userOptions.enablePrivChat": "Chat privado habilitado", - "app.userList.userOptions.enablePubChat": "Chat público habilitado", - "app.userList.userOptions.enableNote": "Notas compartidas habilitadas", - "app.userList.userOptions.showUserList": "Lista de usuarios visible para participantes", - "app.userList.userOptions.enableOnlyModeratorWebcam": "Vostede pode habilitar o seu cámara web agora. Todos poderán verlle", - "app.media.label": "Media", + "app.userList.content.participants.options.clearedStatus": "Limparonse todos os estados de usuario", + "app.userList.userOptions.enableCam": "As cámaras web dos espectadores están activadas", + "app.userList.userOptions.enableMic": "Os micrófonos dos espectadores están activados", + "app.userList.userOptions.enablePrivChat": "A conversa privada está activada", + "app.userList.userOptions.enablePubChat": "A conversa pública está activada", + "app.userList.userOptions.enableNote": "As notas compartidas están activadas", + "app.userList.userOptions.showUserList": "A lista de usuarios agora amosase aos espectadores", + "app.userList.userOptions.enableOnlyModeratorWebcam": "Pode activar agora a súaúa cámara web, todos poderán velo", + "app.media.label": "Multimedia", "app.media.autoplayAlertDesc": "Permitir acceso", - "app.media.screenshare.start": "Compartir pantalla iniciou", - "app.media.screenshare.end": "Compartir pantalla finalizou", - "app.media.screenshare.autoplayBlockedDesc": "Necesitamos o seu permiso para mostrarlle a pantalla do presentador", - "app.media.screenshare.autoplayAllowLabel": "Ver pantalla compartida", - "app.meeting.ended": "A sesión finalizou", - "app.meeting.meetingTimeHasEnded": "Tempo finalizado. A reunión pecharase en breve", - "app.meeting.endedMessage": "Serás enviado á pantalla de inicio.", - "app.meeting.alertMeetingEndsUnderOneMinute": "A reunión péchase nun minuto", - "app.meeting.alertBreakoutEndsUnderOneMinute": "A micro-salga péchase nun minuto", - "app.presentation.hide": "Ocultar presentación", + "app.media.screenshare.start": "Comezou a pantalla compartida", + "app.media.screenshare.end": "Rematou a pantalla compartida", + "app.media.screenshare.unavailable": "A pantalla compartida non está dispoñíbel", + "app.media.screenshare.safariNotSupported": "Actualmente a pantalla compartida non é compatíbel co Safari. Use Firefox, Chromium ou Google Chrome.", + "app.media.screenshare.autoplayBlockedDesc": "Necesitamos o seu permiso para amosarlle a pantalla do presentador", + "app.media.screenshare.autoplayAllowLabel": "Ver a pantalla compartida", + "app.screenshare.notAllowed": "Erro: non se concedeu permiso para acceder á pantalla.", + "app.screenshare.notSupportedError": "Erro: a pantalla compartida só está permitida en dominios seguros (SSL)", + "app.screenshare.notReadableError": "Erro: produciuse un fallo ao tentar capturar a súa pantalla", + "app.screenshare.genericError": "Erro: produciuse un erro ao compartir a pantalla, ténteo de novo", + "app.meeting.ended": "Rematou a sesión", + "app.meeting.meetingTimeRemaining": "Tempo restante da xuntanza: {0}", + "app.meeting.meetingTimeHasEnded": "Rematou o tempo, A xuntanza pecharase en breve", + "app.meeting.endedMessage": "Será reenviado á pantalla de inicio", + "app.meeting.alertMeetingEndsUnderOneMinute": "A xuntanza pecharase nun minuto", + "app.meeting.alertBreakoutEndsUnderOneMinute": "A sala parcial pecharase nun minuto", + "app.presentation.hide": "Agochar a presentación", "app.presentation.notificationLabel": "Presentación actual", "app.presentation.slideContent": "Contido da diapositiva", - "app.presentation.startSlideContent": "Inicio do pase de diapositivas", - "app.presentation.endSlideContent": "Fin do pase de diapositivas", - "app.presentation.emptySlideContent": "Diapositiva actual sen contido", - "app.presentation.presentationToolbar.noNextSlideDesc": "Finalizar presentación", - "app.presentation.presentationToolbar.noPrevSlideDesc": "Iniciar presentación", - "app.presentation.presentationToolbar.selectLabel": "Seleccione diapositiva", + "app.presentation.startSlideContent": "Inicio do contido das diapositivas", + "app.presentation.endSlideContent": "Fin do contido das diapositivas", + "app.presentation.emptySlideContent": "Non hai contido para a diapositiva actual", + "app.presentation.presentationToolbar.noNextSlideDesc": "Rematar a presentación", + "app.presentation.presentationToolbar.noPrevSlideDesc": "Iniciar a presentación", + "app.presentation.presentationToolbar.selectLabel": "Seleccionar a diapositiva", "app.presentation.presentationToolbar.prevSlideLabel": "Diapositiva anterior", - "app.presentation.presentationToolbar.prevSlideDesc": "Cambiar presentación a diapositiva anterior", + "app.presentation.presentationToolbar.prevSlideDesc": "Cambia a presentación á diapositiva anterior", "app.presentation.presentationToolbar.nextSlideLabel": "Seguinte diapositiva", - "app.presentation.presentationToolbar.nextSlideDesc": "Cambiar presentación a diapositiva seguinte", - "app.presentation.presentationToolbar.skipSlideLabel": "Brincar diapositiva", - "app.presentation.presentationToolbar.skipSlideDesc": "Cambiar presentación a diapositiva específica", - "app.presentation.presentationToolbar.fitWidthLabel": "Axustar ao ancho", - "app.presentation.presentationToolbar.fitWidthDesc": "Mostrar diapositiva a todo o ancho", + "app.presentation.presentationToolbar.nextSlideDesc": "Cambia a presentación á seguinte diapositiva", + "app.presentation.presentationToolbar.skipSlideLabel": "Omitir diapositiva", + "app.presentation.presentationToolbar.skipSlideDesc": "Cambia a presentación a unha diapositiva específica", + "app.presentation.presentationToolbar.fitWidthLabel": "Axustar ao largo", + "app.presentation.presentationToolbar.fitWidthDesc": "Amosar todo o largo da diapositiva", "app.presentation.presentationToolbar.fitScreenLabel": "Axustar á pantalla", - "app.presentation.presentationToolbar.fitScreenDesc": "Mostrar toda a diapositiva", + "app.presentation.presentationToolbar.fitScreenDesc": "Amosar toda a diapositiva", "app.presentation.presentationToolbar.zoomLabel": "Zoom", - "app.presentation.presentationToolbar.zoomDesc": "Cambiar o nivel de Zoom da presentación", + "app.presentation.presentationToolbar.zoomDesc": "Cambiar o nivel de zoom da presentación", "app.presentation.presentationToolbar.zoomInLabel": "Achegarse", - "app.presentation.presentationToolbar.zoomInDesc": "Achegarse en presentación", + "app.presentation.presentationToolbar.zoomInDesc": "Ampliar a presentación", "app.presentation.presentationToolbar.zoomOutLabel": "Afastarse", - "app.presentation.presentationToolbar.zoomOutDesc": "Afastarse en presentación", - "app.presentation.presentationToolbar.zoomReset": "Reiniciar zoom", - "app.presentation.presentationToolbar.zoomIndicator": "Porcentaxe actual de zoom", - "app.presentation.presentationToolbar.fitToWidth": "Axustar ao ancho", + "app.presentation.presentationToolbar.zoomOutDesc": "Reducir a presentación", + "app.presentation.presentationToolbar.zoomReset": "Restaurar o zoom", + "app.presentation.presentationToolbar.zoomIndicator": "Porcentaxe de zoom actual", + "app.presentation.presentationToolbar.fitToWidth": "Axustar ao largo", "app.presentation.presentationToolbar.fitToPage": "Axustar á páxina", "app.presentation.presentationToolbar.goToSlide": "Diapositiva {0}", "app.presentationUploder.title": "Presentación", - "app.presentationUploder.message": "Como presentador ten a habilidade de subir calquera documento ofimático ou PDF/PDF. Recomendámoslle o formato PDF/PDF para obter os mellores resultados. Por favor asegúrese de que a presentación está seleccionada usando o selector circular na parte dereita.", - "app.presentationUploder.uploadLabel": "Cargar", + "app.presentationUploder.message": "Como presentador tes a posibilidade de enviar calquera documento de oficina ou ficheiro PDF. Recomendamos o ficheiro PDF para obter mellores resultados. Asegúrese de que a presentación está seleccionada usando o selector circular na parte dereita. ", + "app.presentationUploder.uploadLabel": "Enviar", "app.presentationUploder.confirmLabel": "Confirmar", "app.presentationUploder.confirmDesc": "Gardar os cambios e iniciar a presentación", "app.presentationUploder.dismissLabel": "Cancelar", - "app.presentationUploder.dismissDesc": "Pechar a xanela modal e descartar cambios.", - "app.presentationUploder.dropzoneLabel": "Arrastrar arquivo aqui para cargalo", - "app.presentationUploder.dropzoneImagesLabel": "Arrastrar imaxes aqui para cargalas", - "app.presentationUploder.browseFilesLabel": "ou buscar arquivos", - "app.presentationUploder.browseImagesLabel": "ou buscar imagenes", - "app.presentationUploder.fileToUpload": "En proceso de ser cargado ...", + "app.presentationUploder.dismissDesc": "Pechar a xanela modal e desbotar os seus cambios.", + "app.presentationUploder.dropzoneLabel": "Arrastre os ficheiros aquí para envialos", + "app.presentationUploder.dropzoneImagesLabel": "Arrastre as imaxes aquí para envialas", + "app.presentationUploder.browseFilesLabel": "ou busque os ficheiros", + "app.presentationUploder.browseImagesLabel": "ou busque as imaxes", + "app.presentationUploder.fileToUpload": "Para ser enviado…", "app.presentationUploder.currentBadge": "Acual", - "app.presentationUploder.rejectedError": "O(os) arquivo(s) seleccionado(s) ha(n) sido rexeitado(s). Por favor, revise o(os) tipo(s) de arquivo.", - "app.presentationUploder.upload.progress": "Cargando ({0}%)", - "app.presentationUploder.upload.413": "Arquivo moi grande, por favor divídeo en varios ficheiros", - "app.presentationUploder.conversion.conversionProcessingSlides": "Procesando páxina {0} de 1. {}", - "app.presentationUploder.conversion.genericConversionStatus": "Convertendo arquivos ...", - "app.presentationUploder.conversion.generatingThumbnail": "Xerando miniaturas ...", - "app.presentationUploder.conversion.generatedSlides": "Diapositivas foron xeradas ...", - "app.presentationUploder.conversion.generatingSvg": "Xerando imaxes SVG ...", - "app.presentationUploder.conversion.pdfHasBigPage": "Non se pode converter o ficheiro PDF/PDF, por favor proba a optimizalo", - "app.presentationUploder.conversion.timeout": "A conversión tomou demasiado tempo ...", - "app.presentationUploder.isDownloadableLabel": "A descarga da presentación non está permitida", - "app.presentationUploder.isNotDownloadableLabel": "Descarga de presentación permitida", - "app.presentationUploder.removePresentationLabel": "Borrar presentación", - "app.presentationUploder.setAsCurrentPresentation": "Establecer presentación como actual", - "app.presentationUploder.tableHeading.filename": "Nome de arquivo", + "app.presentationUploder.rejectedError": "O(s) ficheiro(s) seleccionado(s) foi(foron) rexeitado(s). Revise o(os) tipo(s) de ficheiro.", + "app.presentationUploder.upload.progress": "Enviando ({0}%)", + "app.presentationUploder.upload.413": "O ficheiro é grande de máis, divídao en varios ficheiros", + "app.presentationUploder.upload.408": "Solicitar o tempo de espera da testemuña de envío.", + "app.presentationUploder.upload.404": "404: testemuña de envío non válida", + "app.presentationUploder.upload.401": "Produciuse un fallo na solicitude do tempo de espera da testemuña de envío.", + "app.presentationUploder.conversion.conversionProcessingSlides": "Procesando páxina {0} de {1}", + "app.presentationUploder.conversion.genericConversionStatus": "Convertendo ficheiros…", + "app.presentationUploder.conversion.generatingThumbnail": "Xerando miniaturas…", + "app.presentationUploder.conversion.generatedSlides": "Presentacións xeradas…", + "app.presentationUploder.conversion.generatingSvg": "Xerando imaxes SVG…", + "app.presentationUploder.conversion.pageCountExceeded": "Excedeu o número de páxinas. Divida o ficheiro en varios ficheiros.", + "app.presentationUploder.conversion.officeDocConversionInvalid": "Produciuse un fallo ao procesar o documento de oficina. No seu lugar envíe un PDF.", + "app.presentationUploder.conversion.officeDocConversionFailed": "Produciuse un fallo ao procesar o documento de oficina. No seu lugar envíe un PDF.", + "app.presentationUploder.conversion.pdfHasBigPage": "Non foi posíbel converter o ficheiro PDF. Tente optimizalo", + "app.presentationUploder.conversion.timeout": "Vaites! a conversión tomou demasiado tempo", + "app.presentationUploder.conversion.pageCountFailed": "Produciuse un fallo ao determinar o número de páxinas.", + "app.presentationUploder.isDownloadableLabel": "Non permitir a descarga da presentación", + "app.presentationUploder.isNotDownloadableLabel": "Permitir a descarga da presentación", + "app.presentationUploder.removePresentationLabel": "Retirar a presentación", + "app.presentationUploder.setAsCurrentPresentation": "Estabelecer a presentación como actual", + "app.presentationUploder.tableHeading.filename": "Nome de ficheiro", "app.presentationUploder.tableHeading.options": "Opcións", "app.presentationUploder.tableHeading.status": "Estado", "app.poll.pollPaneTitle": "Enquisa", "app.poll.quickPollTitle": "Enquisa rápida", - "app.poll.hidePollDesc": "Ocultar o menu da enquisa", - "app.poll.customPollInstruction": "Para crear unha enquisa personalizada presiona o botón de abaixo e introduce as respostas.", - "app.poll.quickPollInstruction": "Selecciona unha das seguintes opcións para iniciar a túa enquisa. ", + "app.poll.hidePollDesc": "Agochar o panel do menú da enquisa", + "app.poll.customPollInstruction": "Para crear unha enquisa personalizada, seleccione o botón seguinte e introduza as súas opcións.", + "app.poll.quickPollInstruction": "Selecciona unha das seguintes opcións para iniciar a súa enquisa.", "app.poll.customPollLabel": "Enquisa personalizada", - "app.poll.startCustomLabel": "Iniciar enquisa personalizada", - "app.poll.activePollInstruction": "Deixe este panel aberto para ver as respostas en tempo real da súa enquisa. Cando estea listo presione 'Publicar resultados de enquisa' para publicar os resultados e finalizar a enquisa.", - "app.poll.publishLabel": "Publicar resultados da enquisa", - "app.poll.backLabel": "Regresar ás opcións da enquisa", + "app.poll.startCustomLabel": "Iniciar a enquisa personalizada", + "app.poll.activePollInstruction": "Deixe este panel aberto para ver as respostas en tempo real da súa enquisa. Cando estea listo prema en «Publicar os resultados da enquisa» para publicar os resultados e rematar a enquisa.", + "app.poll.publishLabel": "Publicar os resultados da enquisa", + "app.poll.backLabel": "Volver ás opcións da enquisa", "app.poll.closeLabel": "Pechar", - "app.poll.waitingLabel": "Esperando respostas ({0}/{1})", - "app.poll.ariaInputCount": "Opción de enquisa personalizada {0} de 1. {}", - "app.poll.customPlaceholder": "Agregar resposta de enquisa", - "app.poll.noPresentationSelected": "Non se seleccionou ningunha presentación! Por favor, seleccione unha.", - "app.poll.clickHereToSelect": "'Click' aquí para seleccionar", + "app.poll.waitingLabel": "Agardando respostas ({0}/{1})", + "app.poll.ariaInputCount": "Opción da enquisa personalizada {0} de {1}", + "app.poll.customPlaceholder": "Engadir opción de enquisa", + "app.poll.noPresentationSelected": "Non se seleccionou ningunha presentación Seleccione unha.", + "app.poll.clickHereToSelect": "Prema aquí para seleccionar", "app.poll.t": "Verdadeiro", "app.poll.f": "Falso", - "app.poll.tf": "Verdadeiro / Falseo", - "app.poll.y": "Se", + "app.poll.tf": "Verdadeiro / Falso", + "app.poll.y": "Si", "app.poll.n": "Non", - "app.poll.yn": "Se / Non", + "app.poll.yn": "Si / Non", "app.poll.a2": "A / B", "app.poll.a3": "A / B / C", "app.poll.a4": "A / B / C / D", "app.poll.a5": "A / B / C / D / E", "app.poll.answer.true": "Verdadeiro", "app.poll.answer.false": "Falso", - "app.poll.answer.yes": "Se", + "app.poll.answer.yes": "Si", "app.poll.answer.no": "Non", "app.poll.answer.a": "A", "app.poll.answer.b": "B", @@ -216,174 +230,198 @@ "app.poll.liveResult.usersTitle": "Usuarios", "app.poll.liveResult.responsesTitle": "Resposta", "app.polling.pollingTitle": "Opcións da enquisa", - "app.polling.pollAnswerLabel": "Resposta de enquisa {0}", - "app.polling.pollAnswerDesc": "Seleccione esta opcion para responder {0}", - "app.failedMessage": "Desculpas, problemas conectando ao servidor.", + "app.polling.pollAnswerLabel": "Resposta á enquisa {0}", + "app.polling.pollAnswerDesc": "Selecciona esta opción para votar por {0}", + "app.failedMessage": "Desculpas, hai problemas para conectar co servidor.", "app.downloadPresentationButton.label": "Descargar a presentación orixinal", - "app.connectingMessage": "Conectandose ...", - "app.waitingMessage": "Desconectado. Realizásese un reintento en 0 {} segundos ...", - "app.retryNow": "Reintentando agora", + "app.connectingMessage": "Conectandose…", + "app.waitingMessage": "Desconectado Tentando volver conectar en {0} segundos…", + "app.retryNow": "Volver tentalo agora", "app.navBar.settingsDropdown.optionsLabel": "Opcións", - "app.navBar.settingsDropdown.fullscreenLabel": "Despregar a pantalla completa", - "app.navBar.settingsDropdown.settingsLabel": "Abrir configuración", - "app.navBar.settingsDropdown.aboutLabel": "Acerca de", + "app.navBar.settingsDropdown.fullscreenLabel": "Poñer a pantalla completa", + "app.navBar.settingsDropdown.settingsLabel": "Axustes", + "app.navBar.settingsDropdown.aboutLabel": "Sobre", "app.navBar.settingsDropdown.leaveSessionLabel": "Saír", - "app.navBar.settingsDropdown.exitFullscreenLabel": "Saír de pantalla completa", - "app.navBar.settingsDropdown.fullscreenDesc": "Facer o menú de configuración a pantalla completa", - "app.navBar.settingsDropdown.settingsDesc": "Cambiar a configuración xeral", - "app.navBar.settingsDropdown.aboutDesc": "Mostrar información achega do cliente", - "app.navBar.settingsDropdown.leaveSessionDesc": "Abandonar a reunión", + "app.navBar.settingsDropdown.exitFullscreenLabel": "Saír da pantalla completa", + "app.navBar.settingsDropdown.fullscreenDesc": "Poñer o menú de axustes a pantalla completa", + "app.navBar.settingsDropdown.settingsDesc": "Cambiar os axustes xerais", + "app.navBar.settingsDropdown.aboutDesc": "Amosar información sobre o cliente", + "app.navBar.settingsDropdown.leaveSessionDesc": "Abandonar a xuntanza", "app.navBar.settingsDropdown.exitFullscreenDesc": "Saír do modo de pantalla completa", "app.navBar.settingsDropdown.hotkeysLabel": "Atallos de teclado", - "app.navBar.settingsDropdown.hotkeysDesc": "Listaxe de atallos de teclado dispoñibles", + "app.navBar.settingsDropdown.hotkeysDesc": "Lista de atallos de teclado dispoñíbeis", "app.navBar.settingsDropdown.helpLabel": "Axuda", - "app.navBar.settingsDropdown.helpDesc": "Ligazóns a videotutoriales (abre unha nova pestana)", + "app.navBar.settingsDropdown.helpDesc": "Vincular o usuario a vídeo titoriais (abre unha nova lapela)", "app.navBar.settingsDropdown.endMeetingDesc": "Finaliza a sesión actual", - "app.navBar.settingsDropdown.endMeetingLabel": "Finalizar sesión", - "app.navBar.userListToggleBtnLabel": "Alternar lista de usuarios", - "app.navBar.toggleUserList.ariaLabel": "Cambio de usuarios e mensaxes", - "app.navBar.toggleUserList.newMessages": "con nova notificación de mensaxe ", - "app.navBar.recording": "Esta sesión esta sendo gravada", + "app.navBar.settingsDropdown.endMeetingLabel": "Rematar a xuntanza", + "app.navBar.userListToggleBtnLabel": "Abrir/pechar a lista de usuarios", + "app.navBar.toggleUserList.ariaLabel": "Os usuarios e as mensaxes se alternan", + "app.navBar.toggleUserList.newMessages": "con nova notificación de mensaxes", + "app.navBar.recording": "Esta sesión esta a ser gravada", "app.navBar.recording.on": "Gravando", - "app.navBar.recording.off": "Non gravando", - "app.navBar.emptyAudioBrdige": "Non hai ningún micrófono activo. Comparta o seu micrófono para engadir audio a esta gravación.", - "app.leaveConfirmation.confirmLabel": "Saír", - "app.leaveConfirmation.confirmDesc": "Desconéctache da reunión", - "app.endMeeting.title": "Finalizar sesión", - "app.endMeeting.description": "Estas seguro de querer finalizar a sesión?", - "app.endMeeting.yesLabel": "Se", + "app.navBar.recording.off": "Non se está a gravar", + "app.navBar.emptyAudioBrdige": "Non hai ningún micrófono activo. Comparta o seu micrófono para engadir son a esta gravación.", + "app.leaveConfirmation.confirmLabel": "Abandonar", + "app.leaveConfirmation.confirmDesc": "Desconectarse da xuntanza", + "app.endMeeting.title": "Rematar a xuntanza", + "app.endMeeting.description": "Confirma que quere rematar esta sesión?", + "app.endMeeting.yesLabel": "Si", "app.endMeeting.noLabel": "Non", - "app.about.title": "Acerca de", - "app.about.confirmLabel": "OK", - "app.about.confirmDesc": "OK", + "app.about.title": "Sobre", + "app.about.version": "Versión do cliente:", + "app.about.copyright": "Dereitos de autoría:", + "app.about.confirmLabel": "Aceptar", + "app.about.confirmDesc": "Aceptar", "app.about.dismissLabel": "Cancelar", - "app.about.dismissDesc": "Pechar información achega do cliente", - "app.actionsBar.changeStatusLabel": "Cambiar estado", - "app.actionsBar.muteLabel": "Deshabilitar audio", - "app.actionsBar.unmuteLabel": "Habilitar audio", + "app.about.dismissDesc": "Pechar a información sobre o cliente", + "app.actionsBar.changeStatusLabel": "Cambiar o estado", + "app.actionsBar.muteLabel": "Desactivar o son", + "app.actionsBar.unmuteLabel": "Activar o son", "app.actionsBar.camOffLabel": "Cámara apagada", - "app.actionsBar.raiseLabel": "Levantar", + "app.actionsBar.raiseLabel": "Erguer", "app.actionsBar.label": "Barra de accións", - "app.actionsBar.actionsDropdown.restorePresentationLabel": "Reestablecer presentación", - "app.actionsBar.actionsDropdown.restorePresentationDesc": "Restaurar presentación despues de que foi pechada", + "app.actionsBar.actionsDropdown.restorePresentationLabel": "Reaurar a presentación", + "app.actionsBar.actionsDropdown.restorePresentationDesc": "Botón para restaurar a presentación após ter sido pechada", + "app.screenshare.screenShareLabel" : "Compartir pantalla", "app.submenu.application.applicationSectionTitle": "Aplicación", "app.submenu.application.animationsLabel": "Animacións", - "app.submenu.application.audioAlertLabel": "Alertas de son para o chat", - "app.submenu.application.pushAlertLabel": "Alertas visuais para o chat", - "app.submenu.application.userJoinAudioAlertLabel": "Alertas de audio para usuario entrante", + "app.submenu.application.audioAlertLabel": "Alertas de son para a conversa", + "app.submenu.application.pushAlertLabel": "Alertas visuais para a conversa", + "app.submenu.application.userJoinAudioAlertLabel": "Alertas de son para usuario entrante", "app.submenu.application.userJoinPushAlertLabel": "Alertas emerxentes para usuario entrante", - "app.submenu.application.fontSizeControlLabel": "Tamaño de fonte", - "app.submenu.application.increaseFontBtnLabel": "Incrementar tamaño de fonte", - "app.submenu.application.decreaseFontBtnLabel": "Reducir tamaño de fonte", + "app.submenu.application.fontSizeControlLabel": "Tamaño da letra", + "app.submenu.application.increaseFontBtnLabel": "Incrementar o tamaño da letra", + "app.submenu.application.decreaseFontBtnLabel": "Diminuír o tamaño da letra", "app.submenu.application.currentSize": "actualmente {0}", - "app.submenu.application.languageLabel": "Linguaxe de aplicación", - "app.submenu.application.languageOptionLabel": "Seleccionar linguaxe", + "app.submenu.application.languageLabel": "Idioma da aplicación", + "app.submenu.application.languageOptionLabel": "Escoller idioma", "app.submenu.application.noLocaleOptionLabel": "Non hai locais activos", - "app.submenu.audio.micSourceLabel": "Fonte de micrófono", - "app.submenu.audio.speakerSourceLabel": "Fonte de altofalantes", - "app.submenu.audio.streamVolumeLabel": "Volume do fluxo de audio", + "app.submenu.audio.micSourceLabel": "Orixe de micrófono", + "app.submenu.audio.speakerSourceLabel": "Orixe dos altofalantes", + "app.submenu.audio.streamVolumeLabel": "Volume do fluxo de son", "app.submenu.video.title": "Vídeo", - "app.submenu.video.videoSourceLabel": "Fonte do vídeo", - "app.submenu.video.videoOptionLabel": "Escoller ver fonte", - "app.submenu.video.videoQualityLabel": "Calidade de vídeo", - "app.submenu.video.qualityOptionLabel": "Escoller calidade do vídeo", - "app.submenu.video.participantsCamLabel": "Vendo webcams de participantes", + "app.submenu.video.videoSourceLabel": "Orixe do vídeo", + "app.submenu.video.videoOptionLabel": "Escoller ver a orixe", + "app.submenu.video.videoQualityLabel": "Calidade do vídeo", + "app.submenu.video.qualityOptionLabel": "Escoller a calidade do vídeo", + "app.submenu.video.participantsCamLabel": "Vista das cámaras web dos participantes", "app.settings.applicationTab.label": "Aplicación", - "app.settings.audioTab.label": "Audio", + "app.settings.audioTab.label": "Son", "app.settings.videoTab.label": "Vídeo", "app.settings.usersTab.label": "Participantes", - "app.settings.main.label": "Configuración", - "app.settings.main.cancel.label": "Cancela", - "app.settings.main.cancel.label.description": "Desfeita os cambios e pecha o menú de configuración", + "app.settings.main.label": "Axustes", + "app.settings.main.cancel.label": "Cancelar", + "app.settings.main.cancel.label.description": "Desbotar os cambios e pechar o menú de axustes", "app.settings.main.save.label": "Gardar", - "app.settings.main.save.label.description": "Gurada cambios e pecha o menú de configuración", + "app.settings.main.save.label.description": "Gardar os cambios e pechar o menú de axustes", "app.settings.dataSavingTab.label": "Aforro de datos", - "app.settings.dataSavingTab.webcam": "Habilitar webcams", - "app.settings.dataSavingTab.screenShare": "Habilitar escritorio compartido", - "app.settings.dataSavingTab.description": "Para aforrar ancho de banda axusta o que se se está mostrando", - "app.settings.save-notification.label": "A configuración gardouse", + "app.settings.dataSavingTab.webcam": "Activar as cámaras web", + "app.settings.dataSavingTab.screenShare": "Activar o escritorio compartido", + "app.settings.dataSavingTab.description": "Para aforrar largo de banda axustar o que se se está a amosar", + "app.settings.save-notification.label": "Gardáronse os axustes", "app.switch.onLabel": "Aceso", "app.switch.offLabel": "Apagado", + "app.talkingIndicator.ariaMuteDesc" : "Seleccione para silenciar o usuario", + "app.talkingIndicator.isTalking" : "{0} está chamando", + "app.talkingIndicator.wasTalking" : "{0} deixou de chamar", "app.actionsBar.actionsDropdown.actionsLabel": "Accións", - "app.actionsBar.actionsDropdown.presentationLabel": "Subir unha presentación", + "app.actionsBar.actionsDropdown.presentationLabel": "Enviar unha presentación", "app.actionsBar.actionsDropdown.initPollLabel": "Iniciar unha enquisa", - "app.actionsBar.actionsDropdown.desktopShareLabel": "Compartir a túa pantalla", - "app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Compartir pantalla esta bloqueada", - "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Deixar de compartir a túa pantalla", - "app.actionsBar.actionsDropdown.presentationDesc": "Subir a túa presentación", + "app.actionsBar.actionsDropdown.desktopShareLabel": "Compartir a súa pantalla", + "app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "A pantalla compartida está bloqueada", + "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Deixar de compartir a súa pantalla", + "app.actionsBar.actionsDropdown.presentationDesc": "Enviar a súa presentación", "app.actionsBar.actionsDropdown.initPollDesc": "Iniciar unha enquisa", - "app.actionsBar.actionsDropdown.desktopShareDesc": "Compartir a túa pantalla con outros", - "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Deixar de compartir a túa pantalla con outros", + "app.actionsBar.actionsDropdown.desktopShareDesc": "Compartir a súa pantalla con outros", + "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Deixar de compartir a súa pantalla con outros", "app.actionsBar.actionsDropdown.pollBtnLabel": "Iniciar unha enquisa", - "app.actionsBar.actionsDropdown.pollBtnDesc": "Cambia o panel de enquisa", - "app.actionsBar.actionsDropdown.saveUserNames": "Gardar nomes de usuario", - "app.actionsBar.actionsDropdown.createBreakoutRoom": "Crear grupos de traballo", - "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "crear grupos de traballo para dividir a sesión actual", + "app.actionsBar.actionsDropdown.pollBtnDesc": "Alternar o panel de enquisa", + "app.actionsBar.actionsDropdown.saveUserNames": "Gardar os nomes de usuario", + "app.actionsBar.actionsDropdown.createBreakoutRoom": "Crear salas parciais", + "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "crear salas parciais para dividir a xuntanza actual", "app.actionsBar.actionsDropdown.captionsLabel": "Escribir subtítulos", - "app.actionsBar.actionsDropdown.captionsDesc": "Alterna o panel de subtítulos", - "app.actionsBar.actionsDropdown.takePresenter": "Tomar rol de presentador", - "app.actionsBar.actionsDropdown.takePresenterDesc": "Asignarche a ti mesmo o rol de presentador", - "app.actionsBar.emojiMenu.statusTriggerLabel": "Establecer estado", + "app.actionsBar.actionsDropdown.captionsDesc": "Alternar o panel de subtítulos", + "app.actionsBar.actionsDropdown.takePresenter": "Tomar o rol de presentador", + "app.actionsBar.actionsDropdown.takePresenterDesc": "Asignarse a un mesmo como novo presentador", + "app.actionsBar.emojiMenu.statusTriggerLabel": "Estabelecer o estado", "app.actionsBar.emojiMenu.awayLabel": "Ausente", - "app.actionsBar.emojiMenu.awayDesc": "Cambiar o teu estado a ausente", - "app.actionsBar.emojiMenu.raiseHandLabel": "Alzar", - "app.actionsBar.emojiMenu.raiseHandDesc": "Alzar a man para preguntar", + "app.actionsBar.emojiMenu.awayDesc": "Cambiar o seu estado a ausente", + "app.actionsBar.emojiMenu.raiseHandLabel": "Erguer", + "app.actionsBar.emojiMenu.raiseHandDesc": "Erguer a man para facer unha pregunta", "app.actionsBar.emojiMenu.neutralLabel": "Indeciso", - "app.actionsBar.emojiMenu.neutralDesc": "Cambiar o teu estado a indeciso", - "app.actionsBar.emojiMenu.confusedLabel": "Confundido", - "app.actionsBar.emojiMenu.confusedDesc": "Cambiar o teu estado para confundido", + "app.actionsBar.emojiMenu.neutralDesc": "Cambiar o seu estado a indeciso", + "app.actionsBar.emojiMenu.confusedLabel": "Confuso", + "app.actionsBar.emojiMenu.confusedDesc": "Cambiar o seu estado a confuso", "app.actionsBar.emojiMenu.sadLabel": "Triste", - "app.actionsBar.emojiMenu.sadDesc": "Cambiar o teu estado a triste", + "app.actionsBar.emojiMenu.sadDesc": "Cambiar o seu estado a triste", "app.actionsBar.emojiMenu.happyLabel": "Feliz", - "app.actionsBar.emojiMenu.happyDesc": "Cambiar o teu estado a feliz", - "app.actionsBar.emojiMenu.noneLabel": "Limpar estado", - "app.actionsBar.emojiMenu.noneDesc": "Limpa o teu estado", - "app.actionsBar.emojiMenu.applauseLabel": "Aplausos", - "app.actionsBar.emojiMenu.applauseDesc": "Cambiar o teu estado a aplausos", + "app.actionsBar.emojiMenu.happyDesc": "Cambiar o seu estado a feliz", + "app.actionsBar.emojiMenu.noneLabel": "Limpar o estado", + "app.actionsBar.emojiMenu.noneDesc": "Limpar o seu estado", + "app.actionsBar.emojiMenu.applauseLabel": "Aplaudindo", + "app.actionsBar.emojiMenu.applauseDesc": "Cambiar o seu estado a aplaudindo", "app.actionsBar.emojiMenu.thumbsUpLabel": "Sinal de aprobación", - "app.actionsBar.emojiMenu.thumbsUpDesc": "Cambiar o teu estado a sinal de aprobación", + "app.actionsBar.emojiMenu.thumbsUpDesc": "Cambiar o seu estado a sinal de aprobación", "app.actionsBar.emojiMenu.thumbsDownLabel": "Sinal de desaprobación", - "app.actionsBar.emojiMenu.thumbsDownDesc": "Cambia o teu estdo a sinal de desaprobación", + "app.actionsBar.emojiMenu.thumbsDownDesc": "Cambia o seu estado a sinal de desaprobación", "app.actionsBar.currentStatusDesc": "estado actual {0}", "app.actionsBar.captions.start": "Comezar a ver subtítulos", "app.actionsBar.captions.stop": "Deixar de ver subtítulos", - "app.audioNotification.audioFailedMessage": "A túa conexión de audio fallou en conectarse", - "app.audioNotification.mediaFailedMessage": "getUserMicMedia fallou, Só orixes seguras son admitidos", + "app.audioNotification.audioFailedError1001": "WebSocket desconectado (error 1001)", + "app.audioNotification.audioFailedError1002": "Non foi posíbel facer unha conexión WebSocket (erro 1002)", + "app.audioNotification.audioFailedError1003": "A versión do navegador non é compatíbel (erro 1003)", + "app.audioNotification.audioFailedError1004": "Produciuse un fallo na chamada (razón={0}) (erro 1004)", + "app.audioNotification.audioFailedError1005": "A chamada rematou inesperadamente (erro 1005)", + "app.audioNotification.audioFailedError1006": "Rematou o tempo de espera da chamada (erro 1006)", + "app.audioNotification.audioFailedError1007": "Produciuse un fallo de conexión (erro ICE 1007)", + "app.audioNotification.audioFailedError1008": "Produciuse un fallo de transferencia (erro 1008)", + "app.audioNotification.audioFailedError1009": "Non foi posíbel recuperar a información do servidor STUN/TURN (erro 1009)", + "app.audioNotification.audioFailedError1010": "Rematou o tempo de espera da negociación da conexión (erro ICE 1010)", + "app.audioNotification.audioFailedError1011": "Rematou o tempo de espera da conexión (erro ICE 1011)", + "app.audioNotification.audioFailedError1012": "Conexión pechada (erro ICE 1012)", + "app.audioNotification.audioFailedMessage": "Produciuse un fallo na súa conexión de son", + "app.audioNotification.mediaFailedMessage": "Produciuse un fallo en getUserMicMedia xa que só se permiten as orixes seguras", "app.audioNotification.closeLabel": "Pechar", - "app.breakoutJoinConfirmation.message": "Queres unirche", - "app.breakoutJoinConfirmation.confirmDesc": "Ingresar a un grupo de traballo", + "app.audioNotificaion.reconnectingAsListenOnly": "O micrófono bloqueouse para os espectadores, vostede está conectado só como oínte", + "app.breakoutJoinConfirmation.title": "Unirse á sala parcial", + "app.breakoutJoinConfirmation.message": "Quere unirse?", + "app.breakoutJoinConfirmation.confirmDesc": "Unirse a unha sala parcial", "app.breakoutJoinConfirmation.dismissLabel": "Cancelar", - "app.breakoutJoinConfirmation.dismissDesc": "Pecha e rexeita entrada a grupo de traballo", - "app.breakoutJoinConfirmation.freeJoinMessage": "Selecciona o grupo de traballo a ingresar", - "app.breakoutWillCloseMessage": "Tempo transcorrido. Grupo de traballo pecharase en breve.", - "app.calculatingBreakoutTimeRemaining": "Calculando tempo restante ...", - "app.audioModal.ariaTitle": "Unirse en modo audio", + "app.breakoutJoinConfirmation.dismissDesc": "Pechar e rexeitar a entrada na sala parcial", + "app.breakoutJoinConfirmation.freeJoinMessage": "Seleccionar a sala parcial na que ingresar", + "app.breakoutTimeRemainingMessage": "Tempo restante da sala parcial: {0}", + "app.breakoutWillCloseMessage": "Rematou o tempo. A sala parcial pecharase en breve.", + "app.calculatingBreakoutTimeRemaining": "Calculando tempo restante…", + "app.audioModal.ariaTitle": "Unirse en modo de son", "app.audioModal.microphoneLabel": "Micrófono", "app.audioModal.listenOnlyLabel": "Só escoitar", - "app.audioModal.audioChoiceLabel": "Como queres unirche ao audio?", - "app.audioModal.iOSBrowser": "Audio/Vídeo non soportado", - "app.audioModal.iOSErrorDescription": "Neste momento o audio e vídeo non son soportados en Chrome para iOS.", - "app.audioModal.iOSErrorRecommendation": "Recomendámosche utilizar Safari VOS.", - "app.audioModal.audioChoiceDesc": "Selecciona como unirse ao audio nesta reunión", - "app.audioModal.unsupportedBrowserLabel": "Parece que está a usar un navegador non totalmente soportado. Por favor, utilice un dos seguintes {0} ó {1} para unha compatibilidade completa. ", + "app.audioModal.audioChoiceLabel": "Gustaríalle unirse ao son?", + "app.audioModal.iOSBrowser": "Son/vídeo non compatíbel", + "app.audioModal.iOSErrorDescription": "Neste momento o son e o vídeo non son compatíbeis co Chrome para iOS.", + "app.audioModal.iOSErrorRecommendation": "Recomendámoslle empregar Safari iOS.", + "app.audioModal.audioChoiceDesc": "Seleccionar como unirse ao son nesta xuntanza", + "app.audioModal.unsupportedBrowserLabel": "Parece que estás a usar un navegador que non é totalmente compatíbel. Utilice {0} ou {1} para obter unha compatibilidade completa.", "app.audioModal.closeLabel": "Pechar", - "app.audioModal.yes": "Se", + "app.audioModal.yes": "Si", "app.audioModal.no": "Non", - "app.audioModal.echoTestTitle": "Esta é unha proba de eco privada. Dí unhas palabras. Escoitaches o audio?", - "app.audioModal.settingsTitle": "Cambia a túa configuración de audio", - "app.audioModal.helpTitle": "Ocorreu un erro cos teus dispositivos de medios", - "app.audioModal.helpText": "Autorizaches o uso do teu micrófono? Ten en conta que cando tratas de ingresar ao audio, débeseche mostrar unha caixa de diálogo na que se solicita a túa autorización. Se non ocorreu tenta cambiar os permisos do teu micrófono no area de configuración do teu navegador.", - "app.audioModal.help.noSSL": "Esta páxina non é segura. Para poder usar o micrófono a páxina ten que ser servida por HTTPS. Por favor, contacte co administrador do servidor.", - "app.audioModal.help.macNotAllowed": "Parece que as preferencias do teu sistema Mac están a bloquear o acceso ao mícrofono. Abra Preferencias do sistema > Seguridade e privacidade > Privacidade > Micrófono, e verifica que o navegador que está a usar está activado.", + "app.audioModal.yes.arialabel" : "O eco é audíbel", + "app.audioModal.no.arialabel" : "O eco non é audíbel", + "app.audioModal.echoTestTitle": "Esta é unha proba de eco privada. Diga unhas palabras. Escoitou o son?", + "app.audioModal.settingsTitle": "Cambiar a súa configuración de son", + "app.audioModal.helpTitle": "Houbo un problema cos seus dispositivos multimedia", + "app.audioModal.helpText": "Deu permiso para acceder ao seu micrófono? Teña en conta que debería aparecer un diálogo cando tente unir o son, solicitando os permisos do seu dispositivo multimedia, acépteos para unirse á conferencia de son. Se non é así, tente cambiar os permisos do micrófono na configuración do seu navegador.", + "app.audioModal.help.noSSL": "Esta páxina non é segura. Para poder acceder ao micrófono a páxina ten que ser servida mediante HTTPS. Contacte co administrador do servidor.", + "app.audioModal.help.macNotAllowed": "Parece que as preferencias do teu sistema Mac están a bloquear o acceso ao mícrofono. Abra Preferencias do sistema > Seguridade e privacidade > Privacidade > Micrófono, e verifique que o navegador que está a usar está marcado.", "app.audioModal.audioDialTitle": "Únase usando o seu teléfono", "app.audioDial.audioDialDescription": "Marcar", - "app.audioModal.autoplayBlockedDesc": "Necesitamos o seu permiso para reproducir audio.", - "app.audioModal.playAudio": "Reproducir audio", - "app.audioModal.playAudio.arialabel" : "Reproducir audio", - "app.audioDial.tipIndicator": "Pista", - "app.audioDial.tipMessage": "Pulse a tecla '0' no seu teléfono para silenciarse/activar o audio a se mesmo.", - "app.audioModal.connecting": "Conectandose", - "app.audioModal.connectingEchoTest": "Conenctandose a proba de eco", + "app.audioDial.audioDialConfrenceText": "e introduza o número de PIN da conferencia:", + "app.audioModal.autoplayBlockedDesc": "Necesitamos o seu permiso para reproducir son.", + "app.audioModal.playAudio": "Reproducir son", + "app.audioModal.playAudio.arialabel" : "Reproducir son", + "app.audioDial.tipIndicator": "Consello", + "app.audioDial.tipMessage": "Prema a tecla «0» no seu teléfono para silenciar/activar o seu propio son.", + "app.audioModal.connecting": "Conectando", + "app.audioModal.connectingEchoTest": "Conectando coa proba de eco", "app.audioManager.joinedAudio": "Ingresaches á conferencia de audio", "app.audioManager.joinedEcho": "Ingresaches á proba de eco", "app.audioManager.leftAudio": "Abandonaches a conferencia de audio", @@ -393,7 +431,7 @@ "app.audio.enterSessionLabel": "Entrar á sesión", "app.audio.playSoundLabel": "Reproducir son", "app.audio.backLabel": "Atrás", - "app.audio.audioSettings.titleLabel": "Seleccionar a túa configuración de audio", + "app.audio.audioSettings.titleLabel": "Escolla a súa configuración de son", "app.audio.audioSettings.descriptionLabel": "Ten en conta que aparecerá un cadro de diálogo no teu navegador, que che pide a aceptar compartir o teu micrófono.", "app.audio.audioSettings.microphoneSourceLabel": "Fonte do micrófono", "app.audio.audioSettings.speakerSourceLabel": "Fonte de altofalante", @@ -404,9 +442,9 @@ "app.audio.permissionsOverlay.title": "Permitir acceso ao teu micrófono", "app.error.removed": "Fuches eliminado da conferencia", "app.error.meeting.ended": "Feixe saído da conferencia", - "app.meeting.logout.duplicateUserEjectReason": "Usuario duplicado tentando unirse á reunión", + "app.meeting.logout.duplicateUserEjectReason": "Usuario duplicado tentando unirse á xuntanza", "app.meeting.logout.permissionEjectReason": "Expulsado por violación de permiso", - "app.meeting.logout.ejectedFromMeeting": "Vostede foi expulsado/a de a reunión", + "app.meeting.logout.ejectedFromMeeting": "Vostede foi retirado/a da xuntanza", "app.meeting.logout.validateTokenFailedEjectReason": "Erro ao validar o token de autorización", "app.meeting.logout.userInactivityEjectReason": "Usuario inactivo por moito tempo", "app.meeting-ended.rating.legendLabel": "Cualificación de votos", @@ -419,9 +457,9 @@ "app.dropdown.close": "Pechar", "app.error.400": "Solicitude incorrecta", "app.error.401": "Non autorizado", - "app.error.403": "Vostede foi expulsado/a de a reunión", + "app.error.403": "Vostede foi retirado/a da xuntanza", "app.error.404": "Non se atopou", - "app.error.410": "A reunión finalizou", + "app.error.410": "Rematou a xuntanza", "app.error.500": "Ups, algo salio mal", "app.error.leaveLabel": "Ingresa de novo", "app.error.fallback.presentation.title": "Ocorreu un erro", @@ -440,12 +478,12 @@ "app.userList.guest.pendingGuestAlert": "Uniuse á sesión e está a esperar a súa aprobación.", "app.userList.guest.rememberChoice": "Lembrar elección", "app.user-info.title": "Procura de directorio", - "app.toast.breakoutRoomEnded": "A sesión de grupo de traballo finalizou. Ingresa ao audio novamente.", + "app.toast.breakoutRoomEnded": "A sala parcial rematou. Ingrese no son de novo.", "app.toast.chat.public": "Nova mensaxe en chat público", "app.toast.chat.private": "Nova mensaxe en chat privado", "app.toast.chat.system": "Sistema", "app.toast.clearedEmoji.label": "Estado do emoji borrado", - "app.toast.setEmoji.label": "Estado do emoji cambiado a 0. {}", + "app.toast.setEmoji.label": "Estado do emoji cambiado a {0}", "app.toast.meetingMuteOn.label": "Todos os usuarios foron silenciados", "app.toast.meetingMuteOff.label": "Función de silenciar foi deshabilitada", "app.notification.recordingStart": "A sesión esta sendo gravada", @@ -460,9 +498,9 @@ "app.shortcut-help.closeLabel": "Pechar", "app.shortcut-help.closeDesc": "Pecha o modo de Atallos de teclado", "app.shortcut-help.openOptions": "Abrir opcións", - "app.shortcut-help.toggleUserList": "Cambia lista de usuarios", + "app.shortcut-help.toggleUserList": "Alternar a lista de usuarios", "app.shortcut-help.toggleMute": "Deshabilitar / Habilitar audio", - "app.shortcut-help.togglePublicChat": "Cambia chat público (Lista de usuarios debe ser aberta)", + "app.shortcut-help.togglePublicChat": "Alternar a conversa pública (a lista de usuarios debe estar aberta)", "app.shortcut-help.hidePrivateChat": "Ocultar chat privado", "app.shortcut-help.closePrivateChat": "Pechar chat privado", "app.shortcut-help.openActions": "Abrir menú de accións", @@ -474,14 +512,14 @@ "app.lock-viewers.description": "Estas opcións permítenlle restrinxir certas características a observadores.", "app.lock-viewers.featuresLable": "Función", "app.lock-viewers.lockStatusLabel": "Estado", - "app.lock-viewers.webcamLabel": "Compartir webcam", - "app.lock-viewers.otherViewersWebcamLabel": "Ver a webcam doutros espectadores", + "app.lock-viewers.webcamLabel": "Compartir a cámara web", + "app.lock-viewers.otherViewersWebcamLabel": "Ver a cámara web doutros espectadores", "app.lock-viewers.microphoneLable": "Compartir micrófono", "app.lock-viewers.PublicChatLabel": "Enviar mensaxes ao chat Público", "app.lock-viewers.PrivateChatLable": "Enviar mensaxes ao chat Privado", "app.lock-viewers.notesLabel": "Editar notas compartidas", "app.lock-viewers.userListLabel": "Ver outros participantes na lista de usuarios", - "app.lock-viewers.ariaTitle": "Bloquear a observadores configuración modal", + "app.lock-viewers.ariaTitle": "Bloquear os axustes modais dos espectadores", "app.lock-viewers.button.apply": "Aplicar", "app.lock-viewers.button.cancel": "Cancela", "app.lock-viewers.locked": "Bloqueado", @@ -495,23 +533,23 @@ "app.videoPreview.profileLabel": "Calidade", "app.videoPreview.cancelLabel": "Cancelar", "app.videoPreview.closeLabel": "Pechar", - "app.videoPreview.findingWebcamsLabel": "Buscando webcams", + "app.videoPreview.findingWebcamsLabel": "Buscando cámaras web", "app.videoPreview.startSharingLabel": "Iniciar compartir", - "app.videoPreview.webcamOptionLabel": "Selecciona a webcam", - "app.videoPreview.webcamPreviewLabel": "Vista preliminar de webcam", - "app.videoPreview.webcamSettingsTitle": "Configuración de webcam", - "app.videoPreview.webcamNotFoundLabel": "Webcam non atopada", + "app.videoPreview.webcamOptionLabel": "Seleccionar a cámara web", + "app.videoPreview.webcamPreviewLabel": "Vista preliminar de cámara web", + "app.videoPreview.webcamSettingsTitle": "Axustes da cámara web", + "app.videoPreview.webcamNotFoundLabel": "Non se atopou a cámara web", "app.videoPreview.profileNotFoundLabel": "Perfil de cámara non soportado", - "app.video.joinVideo": "Compartir webcam", - "app.video.leaveVideo": "Deixar de compartir webcam", + "app.video.joinVideo": "Compartir a cámara web", + "app.video.leaveVideo": "Deixar de compartir a cámara web", "app.video.iceCandidateError": "Erro ao agregar candidato ICE", - "app.video.permissionError": "Erro ao compartit a webcam. Por favor revise os permisos", - "app.video.sharingError": "Erro ao compartir a webcam", + "app.video.permissionError": "Erro ao compartit a cámara web. Por favor revise os permisos", + "app.video.sharingError": "Erro ao compartir a cámara web", "app.video.notFoundError": "Webcam non fué atopada. Por favor asegurate de que se atopa conectada", "app.video.notAllowed": "Faltan permisos para compartir a webcam, por favor asegurate de que os permisos do navegador son correctos", "app.video.notSupportedError": "Só pódese compartir a webcam de fontes seguras, asegurate de que o certificado SSL sexa valido", "app.video.notReadableError": "Non se puido obter vídeo de webcam. Asegurate de que ningunha outra aplicación estea utilizandola.", - "app.video.suggestWebcamLock": "Aplicar a configuración de bloqueo ás cámaras web dos observadores?", + "app.video.suggestWebcamLock": "Forzar os axustes de bloqueo para as cámaras web dos espectadores?", "app.video.suggestWebcamLockReason": "(isto mellorará a estabilidade da gravación)", "app.video.enable": "Activar", "app.video.cancel": "Cancela", @@ -520,7 +558,7 @@ "app.video.videoLocked": "Compartir cámara web bloqueado", "app.video.videoButtonDesc": "Compartir webcam", "app.video.videoMenu": "Menú de vídeo", - "app.video.videoMenuDisabled": "Webcam deshabilitada", + "app.video.videoMenuDisabled": "O menú de vídeo da cámara web está desactivada nos axustes", "app.video.videoMenuDesc": "Abrir o menú de vídeo", "app.video.chromeExtensionError": "Debes instalar", "app.video.chromeExtensionErrorLink": "esta extensión de Chrome", @@ -580,11 +618,11 @@ "app.videoDock.webcamUnfocusDesc": "Desenfocar a camara seleccionada", "app.videoDock.autoplayBlockedDesc": "Necesitamos o seu permiso para mostrarlle as webcams doutros usuarios.", "app.videoDock.autoplayAllowLabel": "Ver webcams", - "app.invitation.title": "Invitación a grupo de traballo", + "app.invitation.title": "Convite a sala parcial", "app.invitation.confirm": "Convidar", - "app.createBreakoutRoom.title": "Grupos de traballo", - "app.createBreakoutRoom.ariaTitle": "Ocultar Salas de Descanso", - "app.createBreakoutRoom.breakoutRoomLabel": "Grupos de traballo {0}", + "app.createBreakoutRoom.title": "Salas parciais", + "app.createBreakoutRoom.ariaTitle": "Agochar as salas parciais", + "app.createBreakoutRoom.breakoutRoomLabel": "Salas parciais {0}", "app.createBreakoutRoom.generatingURL": "Xerando ligazón", "app.createBreakoutRoom.generatedURL": "Xerada", "app.createBreakoutRoom.duration": "Duración {0}", @@ -599,15 +637,15 @@ "app.createBreakoutRoom.numberOfRooms": "Número de salas", "app.createBreakoutRoom.durationInMinutes": "Duración (minutos)", "app.createBreakoutRoom.randomlyAssign": "Asignado aleatóriamente", - "app.createBreakoutRoom.endAllBreakouts": "Finalizar todos os grupos de traballo", + "app.createBreakoutRoom.endAllBreakouts": "Rematar todas as salas parciais", "app.createBreakoutRoom.roomName": "{0} (Sala - {1})", "app.createBreakoutRoom.doneLabel": "Finalizado", "app.createBreakoutRoom.nextLabel": "Seguinte", - "app.createBreakoutRoom.minusRoomTime": "Diminuír tempo de grupo de traballo", - "app.createBreakoutRoom.addRoomTime": "Aumentar tempo de grupo de traballo", + "app.createBreakoutRoom.minusRoomTime": "Diminuír o tempo da sala parcial", + "app.createBreakoutRoom.addRoomTime": "Incrementar o tempo da sala parcial", "app.createBreakoutRoom.addParticipantLabel": "+ Agregar participante", - "app.createBreakoutRoom.freeJoin": "Permitir aos usuarios seleccionar o grupo de traballo a ingresar", - "app.createBreakoutRoom.leastOneWarnBreakout": "Debes agregar almenos un usuario a cada grupo de traballo.", + "app.createBreakoutRoom.freeJoin": "Permitirlle aos usuarios escoller a sala parcial na que ingresar", + "app.createBreakoutRoom.leastOneWarnBreakout": "Debe poñer polo menos un usuario nunha sala parcial", "app.createBreakoutRoom.roomTime": "{0} minutos", "app.createBreakoutRoom.numberOfRoomsError": "O número de salas é invalido.", "app.externalVideo.start": "Compartir un novo vídeo", diff --git a/bigbluebutton-html5/private/locales/hi_IN.json b/bigbluebutton-html5/private/locales/hi_IN.json index 69b1909f486e..eb0eb9aaf0dd 100644 --- a/bigbluebutton-html5/private/locales/hi_IN.json +++ b/bigbluebutton-html5/private/locales/hi_IN.json @@ -20,6 +20,7 @@ "app.captions.menu.title": "बंद शीर्षक", "app.captions.menu.backgroundColor": "पीछे का रंग", "app.captions.menu.cancelLabel": "रद्द करना", + "app.captions.pad.hide": "my name is hari", "app.captions.pad.tip": "संपादक टूलबार पर ध्यान केंद्रित करने के लिए Esc दबाएं", "app.note.title": "साझा किए गए नोट्स", "app.note.label": "ध्यान दें", diff --git a/bigbluebutton-html5/private/locales/it_IT.json b/bigbluebutton-html5/private/locales/it_IT.json index bb3b4c07920e..263b93d3ce34 100644 --- a/bigbluebutton-html5/private/locales/it_IT.json +++ b/bigbluebutton-html5/private/locales/it_IT.json @@ -111,6 +111,8 @@ "app.media.autoplayAlertDesc": "Premetti l'accesso", "app.media.screenshare.start": "Condivisione schermo avviata", "app.media.screenshare.end": "Condivisione schermo terminata", + "app.media.screenshare.unavailable": "Condivisione schermo non disponibile", + "app.media.screenshare.safariNotSupported": "Attualmente la condivisione schermo non è supportata in Safari. Usa Firefox o Google Chrome.", "app.media.screenshare.autoplayBlockedDesc": "Abbiamo bisogno del tuo permesso per mostrarti lo schermo del presentatore", "app.media.screenshare.autoplayAllowLabel": "Visualizza schermo condiviso", "app.screenshare.notAllowed": "Errore: non è stato permesso l'accesso", @@ -169,6 +171,7 @@ "app.presentationUploder.rejectedError": "Il file selezionato è stato rifiutato. controllare il tipo di file.", "app.presentationUploder.upload.progress": "Caricamento ({0}%)", "app.presentationUploder.upload.413": "Il file è troppo grande. Per favore dividilo in più file.", + "app.presentationUploder.upload.404": "404: Token di upload non valido", "app.presentationUploder.conversion.conversionProcessingSlides": "Elaborazione pagina {0} di {1}", "app.presentationUploder.conversion.genericConversionStatus": "Conversione file...", "app.presentationUploder.conversion.generatingThumbnail": "Elaborazione anteprima...", @@ -583,6 +586,7 @@ "app.sfu.mediaServerOffline2001": "Il server dei media è offline. Riprova più tardi (errore 2001)", "app.sfu.mediaServerNoResources2002": "Il server dei media non ha risorse disponibili (errore 2002)", "app.sfu.mediaServerRequestTimeout2003": "Le richieste al server dei media sono scadute (errore 2003)", + "app.sfu.serverIceGatheringFailed2021": "Il server dei media non è riuscito a ottenere candidati per la connessione (errore ICE 2021)", "app.sfu.serverIceGatheringFailed2022": "Connessione al server dei media fallita (errore ICE 2022)", "app.sfu.mediaGenericError2200": "Il server dei media ha fallito a processare la richiesta (error 2200)", "app.sfu.invalidSdp2202":"Il client ha generato una richiesta di media invalida (errore SDP 2202)", diff --git a/bigbluebutton-html5/private/locales/ja.json b/bigbluebutton-html5/private/locales/ja.json index 30006a62879d..ac844c1b5df8 100644 --- a/bigbluebutton-html5/private/locales/ja.json +++ b/bigbluebutton-html5/private/locales/ja.json @@ -43,8 +43,8 @@ "app.captions.pad.ownership": "代わる", "app.captions.pad.ownershipTooltip": "{0} 字幕のオーナーになります", "app.captions.pad.interimResult": "中間結果", - "app.captions.pad.dictationStart": "ディクテーション開始", - "app.captions.pad.dictationStop": "ディクテーション終了", + "app.captions.pad.dictationStart": "口述開始", + "app.captions.pad.dictationStop": "口述終了", "app.captions.pad.dictationOnDesc": "音声認識オン", "app.captions.pad.dictationOffDesc": "音声認識オフ", "app.note.title": "共有メモ", @@ -82,7 +82,7 @@ "app.userList.menu.directoryLookup.label": "ディレクトリ検索", "app.userList.menu.makePresenter.label": "プレゼンターにする", "app.userList.userOptions.manageUsersLabel": "ユーザー管理", - "app.userList.userOptions.muteAllLabel": "全ユーザーをミュートにする", + "app.userList.userOptions.muteAllLabel": "全ユーザーをミュートする", "app.userList.userOptions.muteAllDesc": "この会議の全ユーザーをミュートにする", "app.userList.userOptions.clearAllLabel": "全ステータスアイコンを消去する", "app.userList.userOptions.clearAllDesc": "ユーザーの全ステータスアイコンを消去する", @@ -111,6 +111,8 @@ "app.media.autoplayAlertDesc": "アクセス許可", "app.media.screenshare.start": "画面共有を開始しました", "app.media.screenshare.end": "画面共有を終了しました", + "app.media.screenshare.unavailable": "画面共有は利用できません", + "app.media.screenshare.safariNotSupported": "画面共有は現在Safariではサポートされていません。FirefoxかGoogle Chromeをお使いください。", "app.media.screenshare.autoplayBlockedDesc": "プレゼンターの画面の共有を許可してください", "app.media.screenshare.autoplayAllowLabel": "共有画面を見る", "app.screenshare.notAllowed": "エラー:画面へのアクセスが許可されていません", @@ -169,6 +171,9 @@ "app.presentationUploder.rejectedError": "選択ファイルが拒否されました。ファイル形式を確認してください。", "app.presentationUploder.upload.progress": "アップロード中({0}%)", "app.presentationUploder.upload.413": "ファイルが大きすぎます。いくつかのファイルに分割してください。", + "app.presentationUploder.upload.408": "アップロードトークンの要求が時間切れになりました。", + "app.presentationUploder.upload.404": "エラー404:無効なアップロードトークン", + "app.presentationUploder.upload.401": "アップロードトークンの要求が失敗しました。", "app.presentationUploder.conversion.conversionProcessingSlides": "{1}ページ中{0}ページ目を処理中", "app.presentationUploder.conversion.genericConversionStatus": "ファイル変換中…", "app.presentationUploder.conversion.generatingThumbnail": "サムネイル作成中…", @@ -236,7 +241,7 @@ "app.navBar.settingsDropdown.fullscreenLabel": "全画面表示に切替", "app.navBar.settingsDropdown.settingsLabel": "設定を開く", "app.navBar.settingsDropdown.aboutLabel": "アバウト", - "app.navBar.settingsDropdown.leaveSessionLabel": "ログアウト", + "app.navBar.settingsDropdown.leaveSessionLabel": "退室", "app.navBar.settingsDropdown.exitFullscreenLabel": "全画面表示解除", "app.navBar.settingsDropdown.fullscreenDesc": "設定メニューを全画面表示", "app.navBar.settingsDropdown.settingsDesc": "一般の設定を変更", @@ -263,7 +268,7 @@ "app.endMeeting.yesLabel": "はい", "app.endMeeting.noLabel": "いいえ", "app.about.title": "アバウト", - "app.about.version": "バージョン:", + "app.about.version": "クライアントバージョン:", "app.about.copyright": "Copyright:", "app.about.confirmLabel": "OK", "app.about.confirmDesc": "OK", @@ -309,14 +314,14 @@ "app.settings.main.cancel.label.description": "変更を破棄し設定メニューを閉じる", "app.settings.main.save.label": "保存", "app.settings.main.save.label.description": "変更を保存し設定メニューを閉じる", - "app.settings.dataSavingTab.label": "データ保存", + "app.settings.dataSavingTab.label": "通信量を減らす", "app.settings.dataSavingTab.webcam": "ウェブカメラを有効にする", "app.settings.dataSavingTab.screenShare": "デスクトップ共有を有効にする", - "app.settings.dataSavingTab.description": "データ量を下げるには設定を変更してください", + "app.settings.dataSavingTab.description": "通信量を減らすため設定を変更してください", "app.settings.save-notification.label": "設定が保存されました", "app.switch.onLabel": "入", - "app.switch.offLabel": "断", - "app.talkingIndicator.ariaMuteDesc" : "ユーザをミュートにします", + "app.switch.offLabel": "切", + "app.talkingIndicator.ariaMuteDesc" : "ユーザをミュートします", "app.talkingIndicator.isTalking" : "{0} が話しています", "app.talkingIndicator.wasTalking" : "{0} が話し終えました", "app.actionsBar.actionsDropdown.actionsLabel": "アクション", @@ -328,7 +333,7 @@ "app.actionsBar.actionsDropdown.presentationDesc": "プレゼンテーションをアップロード", "app.actionsBar.actionsDropdown.initPollDesc": "投票を初期化", "app.actionsBar.actionsDropdown.desktopShareDesc": "他の人と画面を共有する", - "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "との画面共有をやめる", + "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "画面共有をやめる:", "app.actionsBar.actionsDropdown.pollBtnLabel": "投票を開始する", "app.actionsBar.actionsDropdown.pollBtnDesc": "投票画面を切替", "app.actionsBar.actionsDropdown.saveUserNames": "ユーザー名を保存する", @@ -345,8 +350,8 @@ "app.actionsBar.emojiMenu.raiseHandDesc": "質問がありましたら挙手してください", "app.actionsBar.emojiMenu.neutralLabel": "普通", "app.actionsBar.emojiMenu.neutralDesc": "ステータスを「普通」にする", - "app.actionsBar.emojiMenu.confusedLabel": "わけがわからない", - "app.actionsBar.emojiMenu.confusedDesc": "ステータスを「わけがわからない」にする", + "app.actionsBar.emojiMenu.confusedLabel": "わからん", + "app.actionsBar.emojiMenu.confusedDesc": "ステータスを「わからん」にする", "app.actionsBar.emojiMenu.sadLabel": "悲しい", "app.actionsBar.emojiMenu.sadDesc": "ステータスを「悲しい」にする", "app.actionsBar.emojiMenu.happyLabel": "ハッピー", @@ -388,7 +393,7 @@ "app.breakoutWillCloseMessage": "時間終了。まもなく小会議室を終了します。", "app.calculatingBreakoutTimeRemaining": "残り時間を計算中...", "app.audioModal.ariaTitle": "音声ウィンドウに参加", - "app.audioModal.microphoneLabel": "マイク", + "app.audioModal.microphoneLabel": "音声で参加", "app.audioModal.listenOnlyLabel": "聴講のみ", "app.audioModal.audioChoiceLabel": "音声はどうしますか?", "app.audioModal.iOSBrowser": "サポートされていない音声/ビデオ", @@ -445,10 +450,10 @@ "app.error.meeting.ended": "会議からログアウトしました", "app.meeting.logout.duplicateUserEjectReason": "重複したユーザが会議に参加しようとしています", "app.meeting.logout.permissionEjectReason": "許可違反により強制退室されました", - "app.meeting.logout.ejectedFromMeeting": "会議から退室しました", + "app.meeting.logout.ejectedFromMeeting": "会議から退室させられました", "app.meeting.logout.validateTokenFailedEjectReason": "認証トークンが確認できませんでした", "app.meeting.logout.userInactivityEjectReason": "一定時間操作がなかったため、接続が中断されました", - "app.meeting-ended.rating.legendLabel": "フィードバック評価", + "app.meeting-ended.rating.legendLabel": "評価のフィードバック", "app.meeting-ended.rating.starLabel": "スター", "app.modal.close": "閉じる", "app.modal.close.description": "変更を保存せずにウィンドウを閉じる", @@ -458,7 +463,7 @@ "app.dropdown.close": "閉じる", "app.error.400": "不正なリクエスト", "app.error.401": "権限がありません", - "app.error.403": "会議から退室しました", + "app.error.403": "会議から退室させられました", "app.error.404": "見つかりません", "app.error.410": "会議は終了しました", "app.error.500": "問題が起こりました", @@ -520,7 +525,7 @@ "app.lock-viewers.PrivateChatLable": "プライベートチャットにメッセージを送信する", "app.lock-viewers.notesLabel": "共有ノートを編集する", "app.lock-viewers.userListLabel": "他の視聴者をユーザーリストに表示する", - "app.lock-viewers.ariaTitle": "視聴者のモーダル設定をロックする", + "app.lock-viewers.ariaTitle": "閲覧者のロック設定モーダル", "app.lock-viewers.button.apply": "適用", "app.lock-viewers.button.cancel": "キャンセル", "app.lock-viewers.locked": "ロック", @@ -548,7 +553,7 @@ "app.video.permissionError": "ウェブカメラ共有でエラーが発生しました。許可設定を確認してください。", "app.video.sharingError": "ウェブカメラ共有エラー", "app.video.notFoundError": "ウェブカメラが見つかりませんでした。接続を確認してください", - "app.video.notAllowed": "ウェブカメラを共有する権限がありませんでした。ブラウザの設定を確認してください", + "app.video.notAllowed": "ウェブカメラを共有する権限がありません。ブラウザの設定を確認してください", "app.video.notSupportedError": "ウェブカメラは安全なページでしか共有できません。SSL証明書が有効か確かめてください", "app.video.notReadableError": "ウェブカメラの映像を取得できませんでした。他のプログラムが使ってないことを確認してください", "app.video.mediaFlowTimeout1020": "映像がサーバに届いていません (error 1020)", @@ -644,7 +649,7 @@ "app.createBreakoutRoom.join": "会議室に参加", "app.createBreakoutRoom.joinAudio": "音声で参加", "app.createBreakoutRoom.returnAudio": "音声を戻す", - "app.createBreakoutRoom.alreadyConnected": "会議室に入っています", + "app.createBreakoutRoom.alreadyConnected": "既に会議室内です", "app.createBreakoutRoom.confirm": "作成", "app.createBreakoutRoom.record": "録画", "app.createBreakoutRoom.numberOfRooms": "会議室数", @@ -663,20 +668,20 @@ "app.createBreakoutRoom.roomTime": "{0} 分", "app.createBreakoutRoom.numberOfRoomsError": "会議室の数が正しく設定されていません。", "app.externalVideo.start": "新しいビデオを共有", - "app.externalVideo.title": "外部からの動画を共有する", - "app.externalVideo.input": "外部動画URL", + "app.externalVideo.title": "インターネット上の動画を共有する", + "app.externalVideo.input": "動画のURL", "app.externalVideo.urlInput": "動画URLを追加", "app.externalVideo.urlError": "この動画URLは再生できませんでした", "app.externalVideo.close": "閉じる", "app.externalVideo.autoPlayWarning": "音声同期するには動画を再生してください", "app.network.connection.effective.slow": "接続の問題が発生しました", "app.network.connection.effective.slow.help": "ヘルプ", - "app.externalVideo.noteLabel": "注意:外部動画は録画できません。YouTube, Vimeo, Instructure Media, Twitch, Daily MotionのURLがサポートされています", - "app.actionsBar.actionsDropdown.shareExternalVideo": "外部からの動画を共有する", - "app.actionsBar.actionsDropdown.stopShareExternalVideo": "外部動画の共有停止", + "app.externalVideo.noteLabel": "注意:インターネット上の動画は録画できません。YouTube, Vimeo, Instructure Media, Twitch, Daily MotionのURLがサポートされています", + "app.actionsBar.actionsDropdown.shareExternalVideo": "動画を共有する", + "app.actionsBar.actionsDropdown.stopShareExternalVideo": "動画の共有停止", "app.iOSWarning.label": "iOS 12.2またはそれ以降のバージョンにアップグレードしてください", "app.legacy.unsupportedBrowser": "サポート対象外のブラウザを使用している可能性があります。サポート対象の{0}または{1}をお使いください。", - "app.legacy.upgradeBrowser": "バージョンのブラウザが古い可能性があります。サポート対象のブラウザへアップグレードしてください。", + "app.legacy.upgradeBrowser": "ブラウザのバージョンが古い可能性があります。サポート対象のブラウザへアップグレードしてください。", "app.legacy.criosBrowser": "iOSをお使いの場合、Safariを使ってください" } diff --git a/bigbluebutton-html5/private/locales/ja_JP.json b/bigbluebutton-html5/private/locales/ja_JP.json index 3517934bbce1..571f5846a4b8 100644 --- a/bigbluebutton-html5/private/locales/ja_JP.json +++ b/bigbluebutton-html5/private/locales/ja_JP.json @@ -43,8 +43,8 @@ "app.captions.pad.ownership": "代わる", "app.captions.pad.ownershipTooltip": "{0} 字幕のオーナになります", "app.captions.pad.interimResult": "中間結果", - "app.captions.pad.dictationStart": "ディクテーション開始", - "app.captions.pad.dictationStop": "ディクテーション終了", + "app.captions.pad.dictationStart": "口述開始", + "app.captions.pad.dictationStop": "口述終了", "app.captions.pad.dictationOnDesc": "音声認識オン", "app.captions.pad.dictationOffDesc": "音声認識オフ", "app.note.title": "共有メモ", @@ -82,7 +82,7 @@ "app.userList.menu.directoryLookup.label": "ディレクトリ検索", "app.userList.menu.makePresenter.label": "プレゼンターにする", "app.userList.userOptions.manageUsersLabel": "ユーザー管理", - "app.userList.userOptions.muteAllLabel": "全ユーザーをミュートにする", + "app.userList.userOptions.muteAllLabel": "全ユーザーをミュートする", "app.userList.userOptions.muteAllDesc": "この会議の全ユーザーをミュートする", "app.userList.userOptions.clearAllLabel": "全ステータスアイコンを消去する", "app.userList.userOptions.clearAllDesc": "ユーザーの全ステータスアイコンを消去する", @@ -111,6 +111,8 @@ "app.media.autoplayAlertDesc": "アクセスを許可します", "app.media.screenshare.start": "画面共有を開始しました", "app.media.screenshare.end": "画面共有を終了しました", + "app.media.screenshare.unavailable": "画面共有は利用できません", + "app.media.screenshare.safariNotSupported": "画面共有は現在Safariではサポートされていません。FirefoxかGoogle Chromeをお使いください。", "app.media.screenshare.autoplayBlockedDesc": "プレゼンターの画面を表示するには、あなたの許可が必要です。", "app.media.screenshare.autoplayAllowLabel": "共有画面を表示する", "app.screenshare.notAllowed": "エラー:画面へのアクセスが許可されていません。", @@ -169,6 +171,9 @@ "app.presentationUploder.rejectedError": "選択ファイルが拒否されました。ファイル形式を確認してください。", "app.presentationUploder.upload.progress": "アップロード中 ({0}%)", "app.presentationUploder.upload.413": "ファイルが大きすぎます。いくつかのファイルに分割してください。", + "app.presentationUploder.upload.408": "アップロードトークンの要求が時間切れになりました。", + "app.presentationUploder.upload.404": "エラー404:無効なアップロードトークン", + "app.presentationUploder.upload.401": "アップロードトークンの要求が失敗しました。", "app.presentationUploder.conversion.conversionProcessingSlides": "{1}ページ中{0}ページ目を処理中", "app.presentationUploder.conversion.genericConversionStatus": "ファイル変換中…", "app.presentationUploder.conversion.generatingThumbnail": "サムネイル作成中…", @@ -236,7 +241,7 @@ "app.navBar.settingsDropdown.fullscreenLabel": "全画面表示に切替", "app.navBar.settingsDropdown.settingsLabel": "設定", "app.navBar.settingsDropdown.aboutLabel": "製品情報", - "app.navBar.settingsDropdown.leaveSessionLabel": "ログアウト", + "app.navBar.settingsDropdown.leaveSessionLabel": "退室", "app.navBar.settingsDropdown.exitFullscreenLabel": "全画面表示解除", "app.navBar.settingsDropdown.fullscreenDesc": "設定メニューを全画面表示", "app.navBar.settingsDropdown.settingsDesc": "一般設定を変更", @@ -263,7 +268,7 @@ "app.endMeeting.yesLabel": "はい", "app.endMeeting.noLabel": "いいえ", "app.about.title": "製品情報", - "app.about.version": "バージョン:", + "app.about.version": "クライアントバージョン:", "app.about.copyright": "Copyright:", "app.about.confirmLabel": "OK", "app.about.confirmDesc": "OK", @@ -309,14 +314,14 @@ "app.settings.main.cancel.label.description": "変更を破棄し設定メニューを閉じる", "app.settings.main.save.label": "保存", "app.settings.main.save.label.description": "変更を保存し設定メニューを閉じる", - "app.settings.dataSavingTab.label": "データ保存", + "app.settings.dataSavingTab.label": "通信量を減らす", "app.settings.dataSavingTab.webcam": "ウェブカメラを有効にする", "app.settings.dataSavingTab.screenShare": "デスクトップ共有を有効にする", - "app.settings.dataSavingTab.description": "データ量を下げるには設定を変更してください", + "app.settings.dataSavingTab.description": "通信量を減らすため設定を変更してください", "app.settings.save-notification.label": "設定が保存されました", "app.switch.onLabel": "入", - "app.switch.offLabel": "断", - "app.talkingIndicator.ariaMuteDesc" : "ユーザをミュートにします", + "app.switch.offLabel": "切", + "app.talkingIndicator.ariaMuteDesc" : "ユーザをミュートします", "app.talkingIndicator.isTalking" : "{0} が話しています", "app.talkingIndicator.wasTalking" : "{0} が話し終えました", "app.actionsBar.actionsDropdown.actionsLabel": "アクション", @@ -328,7 +333,7 @@ "app.actionsBar.actionsDropdown.presentationDesc": "プレゼンテーションをアップロード", "app.actionsBar.actionsDropdown.initPollDesc": "投票を開始する", "app.actionsBar.actionsDropdown.desktopShareDesc": "他の人と画面を共有する", - "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "との画面共有をやめる", + "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "画面共有をやめる:", "app.actionsBar.actionsDropdown.pollBtnLabel": "投票を開始する", "app.actionsBar.actionsDropdown.pollBtnDesc": "投票画面を切替", "app.actionsBar.actionsDropdown.saveUserNames": "ユーザ名を保存する", @@ -345,8 +350,8 @@ "app.actionsBar.emojiMenu.raiseHandDesc": "質問がありましたら挙手してください", "app.actionsBar.emojiMenu.neutralLabel": "普通", "app.actionsBar.emojiMenu.neutralDesc": "ステータスを「普通」にする", - "app.actionsBar.emojiMenu.confusedLabel": "分からない", - "app.actionsBar.emojiMenu.confusedDesc": "ステータスを「分からない」にする", + "app.actionsBar.emojiMenu.confusedLabel": "わからん", + "app.actionsBar.emojiMenu.confusedDesc": "ステータスを「わからん」にする", "app.actionsBar.emojiMenu.sadLabel": "悲しい", "app.actionsBar.emojiMenu.sadDesc": "ステータスを「悲しい」にする", "app.actionsBar.emojiMenu.happyLabel": "ハッピー", @@ -388,7 +393,7 @@ "app.breakoutWillCloseMessage": "時間終了。まもなく小会議室を終了します。", "app.calculatingBreakoutTimeRemaining": "残り時間を計算中...", "app.audioModal.ariaTitle": "音声ウィンドウに参加", - "app.audioModal.microphoneLabel": "マイク", + "app.audioModal.microphoneLabel": "音声で参加", "app.audioModal.listenOnlyLabel": "聴講のみ", "app.audioModal.audioChoiceLabel": "音声はどうしますか?", "app.audioModal.iOSBrowser": "サポートされていない音声/ビデオ", @@ -445,10 +450,10 @@ "app.error.meeting.ended": "会議からログアウトしました", "app.meeting.logout.duplicateUserEjectReason": "重複したユーザが会議に参加しようとしています", "app.meeting.logout.permissionEjectReason": "許可違反により強制退室されました", - "app.meeting.logout.ejectedFromMeeting": "会議から退室しました", + "app.meeting.logout.ejectedFromMeeting": "会議から退室させられました", "app.meeting.logout.validateTokenFailedEjectReason": "認証トークンが確認できませんでした", "app.meeting.logout.userInactivityEjectReason": "一定時間操作がなかったため、接続が中断されました", - "app.meeting-ended.rating.legendLabel": "フィードバック評価", + "app.meeting-ended.rating.legendLabel": "評価のフィードバック", "app.meeting-ended.rating.starLabel": "スター", "app.modal.close": "閉じる", "app.modal.close.description": "変更を保存せずにウィンドウを閉じる", @@ -458,7 +463,7 @@ "app.dropdown.close": "閉じる", "app.error.400": "不正なリクエスト", "app.error.401": "権限がありません", - "app.error.403": "会議から退室しました", + "app.error.403": "会議から退室させられました", "app.error.404": "見つかりません", "app.error.410": "会議は終了しました", "app.error.500": "問題が発生しました", @@ -520,7 +525,7 @@ "app.lock-viewers.PrivateChatLable": "プライベートチャットにメッセージを送信する", "app.lock-viewers.notesLabel": "共有ノートを編集する", "app.lock-viewers.userListLabel": "他の閲覧者をユーザーリストに表示する", - "app.lock-viewers.ariaTitle": "閲覧者のモーダル設定をロックする", + "app.lock-viewers.ariaTitle": "閲覧者のロック設定モーダル", "app.lock-viewers.button.apply": "適用", "app.lock-viewers.button.cancel": "キャンセル", "app.lock-viewers.locked": "ロック", @@ -548,7 +553,7 @@ "app.video.permissionError": "ウェブカメラ共有でエラーが発生しました。許可設定を確認してください。", "app.video.sharingError": "ウェブカメラ共有エラー", "app.video.notFoundError": "ウェブカメラが見つかりませんでした。接続を確認してください", - "app.video.notAllowed": "ウェブカメラの共有が許可されていません。ブラウザの設定を確認してください。", + "app.video.notAllowed": "ウェブカメラを共有する権限がありません。ブラウザの設定を確認してください", "app.video.notSupportedError": "ウェブカメラは安全なページでしか共有できません。有効なSSL証明書か確認してください。", "app.video.notReadableError": "ウェブカメラの映像を取得できませんでした。 他のプログラムがウェブカメラを使用していないことを確認してください。", "app.video.mediaFlowTimeout1020": "映像がサーバに届いていません (error 1020)", @@ -644,7 +649,7 @@ "app.createBreakoutRoom.join": "参加する", "app.createBreakoutRoom.joinAudio": "音声で参加", "app.createBreakoutRoom.returnAudio": "音声を戻す", - "app.createBreakoutRoom.alreadyConnected": "会議室に入っています", + "app.createBreakoutRoom.alreadyConnected": "既に会議室内です", "app.createBreakoutRoom.confirm": "作成", "app.createBreakoutRoom.record": "録画", "app.createBreakoutRoom.numberOfRooms": "会議室数", @@ -663,20 +668,20 @@ "app.createBreakoutRoom.roomTime": "{0} 分", "app.createBreakoutRoom.numberOfRoomsError": "会議室の数が正しく設定されていません。", "app.externalVideo.start": "新しいビデオを共有", - "app.externalVideo.title": "外部からの動画を共有する", - "app.externalVideo.input": "外部動画URL", + "app.externalVideo.title": "インターネット上の動画を共有する", + "app.externalVideo.input": "動画URL", "app.externalVideo.urlInput": "動画URLを追加", "app.externalVideo.urlError": "この動画のURLはサポートされていません", "app.externalVideo.close": "閉じる", "app.externalVideo.autoPlayWarning": "動画を再生してメディアの同期を有効にする", "app.network.connection.effective.slow": "接続の問題が発生しました", "app.network.connection.effective.slow.help": "詳しい情報", - "app.externalVideo.noteLabel": "注意:外部動画は録画されません。YouTube, Vimeo, Instructure Media, Twitch, Daily MotionのURLがサポートされています", - "app.actionsBar.actionsDropdown.shareExternalVideo": "外部からの動画を共有する", - "app.actionsBar.actionsDropdown.stopShareExternalVideo": "外部動画の共有停止", + "app.externalVideo.noteLabel": "注意:インターネット上の動画は録画されません。YouTube, Vimeo, Instructure Media, Twitch, Daily MotionのURLがサポートされています", + "app.actionsBar.actionsDropdown.shareExternalVideo": "動画を共有する", + "app.actionsBar.actionsDropdown.stopShareExternalVideo": "動画の共有停止", "app.iOSWarning.label": "iOS 12.2またはそれ以降のバージョンにアップグレードしてください", "app.legacy.unsupportedBrowser": "サポート対象外のブラウザを使用している可能性があります。サポート対象の{0}または{1}をお使いください。", - "app.legacy.upgradeBrowser": "バージョンのブラウザが古い可能性があります。サポート対象のブラウザへアップグレードしてください。", + "app.legacy.upgradeBrowser": "ブラウザのバージョンが古い可能性があります。サポート対象のブラウザへアップグレードしてください。", "app.legacy.criosBrowser": "iOSではフルサポートのためにSafariをお使いください。" } diff --git a/bigbluebutton-html5/private/locales/ko_KR.json b/bigbluebutton-html5/private/locales/ko_KR.json index e8650cb1a269..1ebeccb6a4d0 100644 --- a/bigbluebutton-html5/private/locales/ko_KR.json +++ b/bigbluebutton-html5/private/locales/ko_KR.json @@ -1,14 +1,14 @@ { - "app.home.greeting": "프리젠테이션은 바로 시작될것입니다 ", + "app.home.greeting": "프리젠테이션이 곧 시작됩니다 ...", "app.chat.submitLabel": "메시지 보내기", "app.chat.errorMaxMessageLength": "메시지가 {0} 글자(들이) 깁니다 ", - "app.chat.disconnected": "연결이 끊어졌습니다. 메시지는 보내지지 않습니다 ", - "app.chat.locked": "채팅은 막혔습니다. 메시지는 보내지지 않습니다 ", - "app.chat.inputLabel": "채팅을 위해 메시지를 {0}입력 하세요 ", + "app.chat.disconnected": "연결이 끊어졌습니다. 메시지를 보낼 수 없습니다 ", + "app.chat.locked": "채팅이 잠겼습니다. 메시지를 보낼 수 없습니다 ", + "app.chat.inputLabel": "채팅을 위해 메시지를 {0} 입력 하세요 ", "app.chat.inputPlaceholder": "{0} 에게 메시지를 보내세요 ", "app.chat.titlePublic": "공개 채팅", - "app.chat.titlePrivate": "{0} 와 개인채팅", - "app.chat.partnerDisconnected": "{0} 가 미팅을 마쳤습니다 ", + "app.chat.titlePrivate": "{0} 와 비공개 채팅", + "app.chat.partnerDisconnected": "{0} 가 미팅에서 나갔습니다 ", "app.chat.closeChatLabel": "{0} 닫기 ", "app.chat.hideChatLabel": "{0} 숨기기", "app.chat.moreMessages": "아래쪽에 더많은 메시지", @@ -19,8 +19,8 @@ "app.chat.label": "채팅", "app.chat.offline": "오프라인", "app.chat.emptyLogLabel": "채팅 기록 지우기", - "app.chat.clearPublicChatMessage": "공개채팅기록이 주관자에 의해 지워졌습니다 ", - "app.chat.multi.typing": "다수의 사용자가 타이핑중입니다 ", + "app.chat.clearPublicChatMessage": "공개 채팅 기록이 주관자에 의해 지워졌습니다 ", + "app.chat.multi.typing": "여러 사용자가 타이핑하고 있습니다 ", "app.chat.one.typing": "{0} 가 타이핑중입니다 ", "app.chat.two.typing": "{0} 과 {1} 이 타이핑중입니다", "app.captions.label": "자막", @@ -28,25 +28,25 @@ "app.captions.menu.start": "시작", "app.captions.menu.ariaStart": "자막 쓰기 시작", "app.captions.menu.ariaStartDesc": "캡션 에디터 열고 창 닫기 ", - "app.captions.menu.select": "가능한 언어 선택", + "app.captions.menu.select": "사용 가능한 언어 선택", "app.captions.menu.ariaSelect": "자막 언어", - "app.captions.menu.subtitle": "당신의 세션중에 마감된 자막을 위한 언어와 스타일을 선택하세요", - "app.captions.menu.title": "마감된 자막", + "app.captions.menu.subtitle": "세션 내 폐쇄자막에 사용할 언어와 스타일을 선택하세요.", + "app.captions.menu.title": "폐쇄자막", "app.captions.menu.fontSize": "사이즈", "app.captions.menu.fontColor": "글자색", "app.captions.menu.fontFamily": "폰트", "app.captions.menu.backgroundColor": "배경색", "app.captions.menu.previewLabel": "미리보기", "app.captions.menu.cancelLabel": "취소", - "app.captions.pad.hide": "마감된 자막 숨기기", + "app.captions.pad.hide": "폐쇄자막 숨기기", "app.captions.pad.tip": "에디터 툴바에 포커스를 위해 ESC 를 누르세요", "app.captions.pad.ownership": "인수받기", "app.captions.pad.ownershipTooltip": "당신은 {0} 자막의 소유자로 지정되셨습니다 ", "app.captions.pad.interimResult": "중간 결과", "app.captions.pad.dictationStart": "받아쓰기 시작", "app.captions.pad.dictationStop": "받아쓰기 중지", - "app.captions.pad.dictationOnDesc": "발음 인식 켜기 ", - "app.captions.pad.dictationOffDesc": "발음 인식 끄기", + "app.captions.pad.dictationOnDesc": "음성 인식 켜기 ", + "app.captions.pad.dictationOffDesc": "음성 인식 끄기", "app.note.title": "노트 공유", "app.note.label": "노트", "app.note.hideNoteLabel": "노트 숨기기", @@ -69,19 +69,19 @@ "app.userList.menuTitleContext": "가능한 옵션", "app.userList.chatListItem.unreadSingular": "{0} 개 새로운 메시지", "app.userList.chatListItem.unreadPlural": "{0} 개 새로운 메시지들", - "app.userList.menu.chat.label": "개인채팅 시작", - "app.userList.menu.clearStatus.label": "상태 정리 ", - "app.userList.menu.removeUser.label": "사용자 지우기", + "app.userList.menu.chat.label": "비공개 채팅 시작", + "app.userList.menu.clearStatus.label": "상태 지우기", + "app.userList.menu.removeUser.label": "사용자 쫓아내기", "app.userList.menu.muteUserAudio.label": "사용자 음소거", "app.userList.menu.unmuteUserAudio.label": "사용자 음소거 취소", "app.userList.userAriaLabel": "{0}{1}{2} 상태 {3}", "app.userList.menu.promoteUser.label": "주관자로 승격", "app.userList.menu.demoteUser.label": "관람자로 강등", - "app.userList.menu.unlockUser.label": "{0} 해제", - "app.userList.menu.lockUser.label": "{0} 잠금", + "app.userList.menu.unlockUser.label": "{0} 잠금 해제", + "app.userList.menu.lockUser.label": "{0} 기능 잠금", "app.userList.menu.directoryLookup.label": "디렉토리 검색", "app.userList.menu.makePresenter.label": "발표자 만들기", - "app.userList.userOptions.manageUsersLabel": "사용자 만들기", + "app.userList.userOptions.manageUsersLabel": "사용자 관리", "app.userList.userOptions.muteAllLabel": "모든 사용자 음소거", "app.userList.userOptions.muteAllDesc": "미팅안의 모든 사용자 음소거", "app.userList.userOptions.clearAllLabel": "모든 상태 아이콘 지우기", @@ -89,40 +89,42 @@ "app.userList.userOptions.muteAllExceptPresenterLabel": "발표자를 제외한 모든 사용자 음소거", "app.userList.userOptions.muteAllExceptPresenterDesc": "미팅안에 발표자를 제외한 모든 사용자 음소거", "app.userList.userOptions.unmuteAllLabel": "미팅 음소거 끄기", - "app.userList.userOptions.unmuteAllDesc": "미팅 음소거 제거", - "app.userList.userOptions.lockViewersLabel": "관람자 잠그기", + "app.userList.userOptions.unmuteAllDesc": "미팅 음소거 해제", + "app.userList.userOptions.lockViewersLabel": "모든 관람자 잠그기", "app.userList.userOptions.lockViewersDesc": "미팅의 참석자 기능들을 잠그기", - "app.userList.userOptions.disableCam": "관람자의 웹캠은 불가능", - "app.userList.userOptions.disableMic": "관람자의 마이크는 불가능", - "app.userList.userOptions.disablePrivChat": "개인적 채팅은 금지", - "app.userList.userOptions.disablePubChat": "공개 채팅은 금지", + "app.userList.userOptions.disableCam": "관람자들의 웹캠 사용 중지", + "app.userList.userOptions.disableMic": "관람자들의 마이크 사용 중지", + "app.userList.userOptions.disablePrivChat": "비공개 채팅 사용 중지", + "app.userList.userOptions.disablePubChat": "공개 채팅 사용 중지", "app.userList.userOptions.disableNote": "공유노트는 잠겼습니다 ", "app.userList.userOptions.hideUserList": "관람자에게 사용자 리스트는 감춰집니다 ", - "app.userList.userOptions.webcamsOnlyForModerator": "주관자만 관람자의 웹캠을 볼 수 있습니다 (잠금세팅으로)", - "app.userList.content.participants.options.clearedStatus": "모든 사용자 상태 비우기", + "app.userList.userOptions.webcamsOnlyForModerator": "주관자만 관람자의 웹캠을 볼 수 있습니다 (잠금설정때문)", + "app.userList.content.participants.options.clearedStatus": "모든 사용자 상태 지우기", "app.userList.userOptions.enableCam": "관람자 웹캠사용 가능", "app.userList.userOptions.enableMic": "관람자 마이크 사용 가능", - "app.userList.userOptions.enablePrivChat": "개인적 채팅 가능", + "app.userList.userOptions.enablePrivChat": "비공개 채팅 가능", "app.userList.userOptions.enablePubChat": "공개 채팅 가능", "app.userList.userOptions.enableNote": "공유노트 사용 가능", "app.userList.userOptions.showUserList": "사용자 리스트가 관람자에게 보여짐", "app.userList.userOptions.enableOnlyModeratorWebcam": "웹캠 사용이 가능합니다. 모든 사람이 당신을 보게 됩니다 ", "app.media.label": "미디어", "app.media.autoplayAlertDesc": "접속 허가", - "app.media.screenshare.start": "스크린 공유 시작", + "app.media.screenshare.start": "스크린공유 시작", "app.media.screenshare.end": "스크린공유 종료 ", + "app.media.screenshare.unavailable": "스크린공유 불가", + "app.media.screenshare.safariNotSupported": "현재 Safari에서 스크린공유를 지원하지 않습니다. Firefox나 Chrome을 이용하세요.", "app.media.screenshare.autoplayBlockedDesc": "발표자의 스크린을 보여주기 위해 당신의 허가가 필요합니다 ", "app.media.screenshare.autoplayAllowLabel": "공유스크린 보기", - "app.screenshare.notAllowed": "에러: 스크린에 접근하기 위한 권한이 아직 없습니다 ", + "app.screenshare.notAllowed": "에러: 스크린에 접근하기 위한 권한이 부여되지 않았습니다.", "app.screenshare.notSupportedError": "에러: 스크린공유는 안전한 도메인 연결(SSL) 에서만 가능합니다 ", - "app.screenshare.notReadableError": "에러: 당신의 스크린을 캡쳐 하는데서 에러가 발생했습니다 ", + "app.screenshare.notReadableError": "에러: 스크린을 캡쳐 하는 도중에 오류가 발생했습니다 ", "app.screenshare.genericError": "에러: 스크린 공유에서 에러가 발생했습니다. 다시 시도해 보세요", "app.meeting.ended": "이 세션은 종료 되었습니다 ", "app.meeting.meetingTimeRemaining": "미팅시간은 {0} 남았습니다 ", "app.meeting.meetingTimeHasEnded": "시간종료. 미팅은 조만간 종료 됩니다 ", "app.meeting.endedMessage": "홈화면으로 돌아갑니다 ", - "app.meeting.alertMeetingEndsUnderOneMinute": "미팅은 몇분후 마감됩니다 ", - "app.meeting.alertBreakoutEndsUnderOneMinute": "브레이크아웃이 몇분내로 종료됩니다 ", + "app.meeting.alertMeetingEndsUnderOneMinute": "미팅은 1분 후에 종료됩니다. ", + "app.meeting.alertBreakoutEndsUnderOneMinute": "브레이크아웃이 1분 후에 종료됩니다 ", "app.presentation.hide": "프리젠테이션 숨기기", "app.presentation.notificationLabel": "현재 프리젠테이션", "app.presentation.slideContent": "슬라이드 컨텐츠", @@ -142,23 +144,24 @@ "app.presentation.presentationToolbar.fitWidthDesc": "슬라이드의 총 너비 보이기 ", "app.presentation.presentationToolbar.fitScreenLabel": "스크린 맞추기", "app.presentation.presentationToolbar.fitScreenDesc": "모든 슬라이드 보이기", - "app.presentation.presentationToolbar.zoomLabel": "확대", - "app.presentation.presentationToolbar.zoomDesc": "프리젠테이션의 확대 레벨 조정", + "app.presentation.presentationToolbar.zoomLabel": "확대/축소", + "app.presentation.presentationToolbar.zoomDesc": "프리젠테이션의 확대/축소 수준 변경", "app.presentation.presentationToolbar.zoomInLabel": "확대", "app.presentation.presentationToolbar.zoomInDesc": "프리젠테이션 확대", "app.presentation.presentationToolbar.zoomOutLabel": "축소", "app.presentation.presentationToolbar.zoomOutDesc": "프리젠테이션 축소", - "app.presentation.presentationToolbar.zoomReset": "확대 초기화", + "app.presentation.presentationToolbar.zoomReset": "확대/축소 초기화", "app.presentation.presentationToolbar.zoomIndicator": "현재 확대율", "app.presentation.presentationToolbar.fitToWidth": "너비 맞추기", "app.presentation.presentationToolbar.fitToPage": "페이지 맞추기", "app.presentation.presentationToolbar.goToSlide": "슬라이드 {0}", "app.presentationUploder.title": "프리젠테이션", + "app.presentationUploder.message": "발표자는 Office 문서나 PDF 파일을 업로드할 수 있습니다. PDF 파일의 업로드를 권장합니다. 우측의 원형 체크박스를 클릭해 프리젠테이션 파일을 선택하고 '확인'을 클릭하세요. ", "app.presentationUploder.uploadLabel": "업로드", "app.presentationUploder.confirmLabel": "확인", - "app.presentationUploder.confirmDesc": "변경된것을 저장하고 프리젠테이션을 시작", + "app.presentationUploder.confirmDesc": "변경 사항을 저장하고 프리젠테이션 시작", "app.presentationUploder.dismissLabel": "취소", - "app.presentationUploder.dismissDesc": "창을 닫고, 변경을 저장하지 않음", + "app.presentationUploder.dismissDesc": "변경 사항을 저장하지 않고 창 닫기", "app.presentationUploder.dropzoneLabel": "업로드를 위해 파일을 이곳에 드래그 하여 넣으세요 ", "app.presentationUploder.dropzoneImagesLabel": "업로드 하기 위해 이미지파일을 이곳에 드래그 하여 넣으세요 ", "app.presentationUploder.browseFilesLabel": "혹은 파일탐색기 열기 ", @@ -168,13 +171,20 @@ "app.presentationUploder.rejectedError": "선택한 파일(들)이 거절 되었습니다. 파일 종류(들)를 살펴 보세요 ", "app.presentationUploder.upload.progress": "업로드중 ({0}%)", "app.presentationUploder.upload.413": "파일이 너무 큽니다. 여러파일로 나누세요 ", + "app.presentationUploder.upload.408": "요청하신 업로드 토큰이 만료되었습니다.", + "app.presentationUploder.upload.404": "404: 잘못된 업로드 토큰", + "app.presentationUploder.upload.401": "프리젠테이션 업로드 토큰 요청이 실패했습니다.", "app.presentationUploder.conversion.conversionProcessingSlides": "{1} 중 {0} 페이지 진행 ", "app.presentationUploder.conversion.genericConversionStatus": "파일 변환", "app.presentationUploder.conversion.generatingThumbnail": "썸네일 생성중", "app.presentationUploder.conversion.generatedSlides": "슬라이드 생성중", "app.presentationUploder.conversion.generatingSvg": "SVG 이미지 생성중", + "app.presentationUploder.conversion.pageCountExceeded": "페이지 제한 초과. 여러파일로 나누세요.", + "app.presentationUploder.conversion.officeDocConversionInvalid": "Office 문서 처리 실패. PDF 파일로 업로드 하세요.", + "app.presentationUploder.conversion.officeDocConversionFailed": "Office 문서 처리 실패. PDF 파일로 업로드 하세요.", "app.presentationUploder.conversion.pdfHasBigPage": "PDF 파일을 변환할 수 없습니다. 최적화를 시도 해 보세요 ", "app.presentationUploder.conversion.timeout": "어머나! 변환이 너무 오래 걸리네요 ", + "app.presentationUploder.conversion.pageCountFailed": "페이지 수를 알 수 없음.", "app.presentationUploder.isDownloadableLabel": "프리젠테이션 다운로드는 금지됩니다 ", "app.presentationUploder.isNotDownloadableLabel": "프리젠테이션 다운로드 허가", "app.presentationUploder.removePresentationLabel": "프리젠테이션 제거 ", @@ -185,17 +195,17 @@ "app.poll.pollPaneTitle": "설문조사", "app.poll.quickPollTitle": "빠른설문", "app.poll.hidePollDesc": "설문메뉴 숨기기", - "app.poll.customPollInstruction": "맞춤형 설문조사를 생성하기 위해, 선택버튼으로 당신의 옵션을 넣으세요 ", - "app.poll.quickPollInstruction": "설문조사 시작을 위해 옵션을 선택 하세요 ", + "app.poll.customPollInstruction": "다른 형태의 답이 필요하면 아래 '맞춤형 설문조사'를 선택하고 설문조사를 시작하세요.", + "app.poll.quickPollInstruction": "예상되는 답의 형태를 고르고 설문조사를 시작하세요.", "app.poll.customPollLabel": "맞춤형 설문조사", "app.poll.startCustomLabel": "맞춤형 설문조사 시작", - "app.poll.activePollInstruction": "설문조사에 대한 실시간 반응을 보려면, 이 패널을 오픈해 놓으세요. 당신이 준비 되면, 설문을 끝내고 결과를 공개 하기 위해 '공개 설문 결과' 를 선택 하세요 ", - "app.poll.publishLabel": "공개 설문 결과", + "app.poll.activePollInstruction": "설문조사에 대한 실시간 반응을 보려면, 이 패널을 열어 놓으세요. 설문이 끝나면, 아래 '설문 결과 공개'를 클릭하고 결과를 알리세요.", + "app.poll.publishLabel": "설문 결과 공개", "app.poll.backLabel": "설문옵션으로 돌아가기", "app.poll.closeLabel": "닫기", "app.poll.waitingLabel": "응답대기 ({0}/{1})", "app.poll.ariaInputCount": "맞춤형 설문 옵션 {1} 중 {0}", - "app.poll.customPlaceholder": "설문 옵션 추가 ", + "app.poll.customPlaceholder": "대답 옵션 추가 ", "app.poll.noPresentationSelected": "프리젠테이션이 선택되지 않았습니다. 하나를 선택 하세요 ", "app.poll.clickHereToSelect": "선택하려면 클릭하세요 ", "app.poll.t": "참", @@ -226,7 +236,7 @@ "app.downloadPresentationButton.label": "원본 프리젠테이션 다운로드", "app.connectingMessage": "접속중 ...", "app.waitingMessage": "접속끊김. 재접속 시도 {0} 초 ...", - "app.retryNow": "다시 해 보세요 ", + "app.retryNow": "다시 시도 해 보세요 ", "app.navBar.settingsDropdown.optionsLabel": "옵션", "app.navBar.settingsDropdown.fullscreenLabel": "큰화면으로 ", "app.navBar.settingsDropdown.settingsLabel": "설정", @@ -249,9 +259,10 @@ "app.navBar.toggleUserList.newMessages": "새로운 메시지 알림과 함께", "app.navBar.recording": "이 세션은 녹화중입니다 ", "app.navBar.recording.on": "녹화", - "app.navBar.recording.off": "녹화 안됨 ", + "app.navBar.recording.off": "녹화하지 않음 ", + "app.navBar.emptyAudioBrdige": "활성화된 마이크 없음. 녹음하려면 마이크를 공유하세요.", "app.leaveConfirmation.confirmLabel": "떠나기", - "app.leaveConfirmation.confirmDesc": "미팅없이 로그 기록 ", + "app.leaveConfirmation.confirmDesc": "미팅에서 로그 아웃", "app.endMeeting.title": "미팅 끝", "app.endMeeting.description": "이 세션을 종료 하시겠습니까 ?", "app.endMeeting.yesLabel": "예", @@ -267,20 +278,22 @@ "app.actionsBar.muteLabel": "음소거", "app.actionsBar.unmuteLabel": "음소거 해제", "app.actionsBar.camOffLabel": "카메라 끄기", - "app.actionsBar.raiseLabel": "올리기", + "app.actionsBar.raiseLabel": "손들기", "app.actionsBar.label": "액션바", "app.actionsBar.actionsDropdown.restorePresentationLabel": "프리젠테이션 복구", "app.actionsBar.actionsDropdown.restorePresentationDesc": "프리젠테이션이 끝나고 복원하는 버튼", "app.screenshare.screenShareLabel" : "화면 공유", "app.submenu.application.applicationSectionTitle": "신청", "app.submenu.application.animationsLabel": "애니메이션", - "app.submenu.application.audioAlertLabel": "채팅을 위한 오디오 알림", - "app.submenu.application.pushAlertLabel": "채팅을 위한 팝업 알림", + "app.submenu.application.audioAlertLabel": "채팅 음성 알림", + "app.submenu.application.pushAlertLabel": "채팅 팝업 알림", + "app.submenu.application.userJoinAudioAlertLabel": "사용자 입장 시 음성 알림", + "app.submenu.application.userJoinPushAlertLabel": "사용자 입장 시 팝업 알림", "app.submenu.application.fontSizeControlLabel": "글자 크기", - "app.submenu.application.increaseFontBtnLabel": "신청 글자크기 확대", - "app.submenu.application.decreaseFontBtnLabel": "신청 글자 크기 줄임", + "app.submenu.application.increaseFontBtnLabel": "응용프로그램 글자크기 확대", + "app.submenu.application.decreaseFontBtnLabel": "응용프로그램 글자 크기 줄임", "app.submenu.application.currentSize": "현재 {0}", - "app.submenu.application.languageLabel": "신청 언어", + "app.submenu.application.languageLabel": "응용프로그램 언어", "app.submenu.application.languageOptionLabel": "언어 선택", "app.submenu.application.noLocaleOptionLabel": "활성 로케일 없음", "app.submenu.audio.micSourceLabel": "마이크 소스 ", @@ -308,7 +321,10 @@ "app.settings.save-notification.label": "설정이 저장되었습니다 ", "app.switch.onLabel": "켜기 ", "app.switch.offLabel": "끄기", - "app.actionsBar.actionsDropdown.actionsLabel": "활동", + "app.talkingIndicator.ariaMuteDesc" : "사용자를 음소거하려면 선택", + "app.talkingIndicator.isTalking" : "{0} 가 말하는 중입니다", + "app.talkingIndicator.wasTalking" : "{0} 가 말을 멈췄습니다", + "app.actionsBar.actionsDropdown.actionsLabel": "부가기능 활용", "app.actionsBar.actionsDropdown.presentationLabel": "프리젠테이션 업로드", "app.actionsBar.actionsDropdown.initPollLabel": "설문조사 초기화", "app.actionsBar.actionsDropdown.desktopShareLabel": "화면 공유", @@ -320,17 +336,17 @@ "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "화면 공유 중지", "app.actionsBar.actionsDropdown.pollBtnLabel": "설문 시작", "app.actionsBar.actionsDropdown.pollBtnDesc": "설문조사 창 띄우기", - "app.actionsBar.actionsDropdown.saveUserNames": "이름 저장", + "app.actionsBar.actionsDropdown.saveUserNames": "모든 사용자 이름 저장", "app.actionsBar.actionsDropdown.createBreakoutRoom": "브레이크아웃 룸 생성", "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "현재의 미팅을 나눠 브레이크아웃 생성", - "app.actionsBar.actionsDropdown.captionsLabel": "감춰진 자막 쓰기", + "app.actionsBar.actionsDropdown.captionsLabel": "폐쇄자막 쓰기", "app.actionsBar.actionsDropdown.captionsDesc": "자막창 띄우기", - "app.actionsBar.actionsDropdown.takePresenter": "발표자 수락", + "app.actionsBar.actionsDropdown.takePresenter": "발표권한 가져오기", "app.actionsBar.actionsDropdown.takePresenterDesc": "새로운 발표자로 자신을 임명", "app.actionsBar.emojiMenu.statusTriggerLabel": "상태 설정", "app.actionsBar.emojiMenu.awayLabel": "부재중", - "app.actionsBar.emojiMenu.awayDesc": "부재중으로 전환", - "app.actionsBar.emojiMenu.raiseHandLabel": "올리기", + "app.actionsBar.emojiMenu.awayDesc": "부재중으로 상태 변경", + "app.actionsBar.emojiMenu.raiseHandLabel": "손들기", "app.actionsBar.emojiMenu.raiseHandDesc": "질문을 위해 손 들기", "app.actionsBar.emojiMenu.neutralLabel": "미결정", "app.actionsBar.emojiMenu.neutralDesc": "미결정으로 상태 변경", @@ -340,8 +356,8 @@ "app.actionsBar.emojiMenu.sadDesc": "슬픔으로 상태 변경", "app.actionsBar.emojiMenu.happyLabel": "행복함", "app.actionsBar.emojiMenu.happyDesc": "행복함으로 상태 변경", - "app.actionsBar.emojiMenu.noneLabel": "상태 비우기", - "app.actionsBar.emojiMenu.noneDesc": "상태 비우기 ", + "app.actionsBar.emojiMenu.noneLabel": "상태 지우기", + "app.actionsBar.emojiMenu.noneDesc": "상태 지우기 ", "app.actionsBar.emojiMenu.applauseLabel": "박수", "app.actionsBar.emojiMenu.applauseDesc": "박수로 상태를 변경", "app.actionsBar.emojiMenu.thumbsUpLabel": "엄지척", @@ -349,12 +365,24 @@ "app.actionsBar.emojiMenu.thumbsDownLabel": "비공감", "app.actionsBar.emojiMenu.thumbsDownDesc": "비공감으로 상태를 변경", "app.actionsBar.currentStatusDesc": "현재 상태 {0}", - "app.actionsBar.captions.start": "감춘 자막 보기 시작", - "app.actionsBar.captions.stop": "감춘 자막 보기 중지 ", - "app.audioNotification.audioFailedMessage": "오디오 접속이 끊어졌습니다 ", - "app.audioNotification.mediaFailedMessage": "마이크정보 가져오기가 실패. 보안상태만 허가됨", + "app.actionsBar.captions.start": "폐쇄자막 보기 시작", + "app.actionsBar.captions.stop": "폐쇄자막 보기 중지 ", + "app.audioNotification.audioFailedError1001": "WebSocket 연결 끊김(오류 1001)", + "app.audioNotification.audioFailedError1002": "WebSocket 연결 불가(오류 1002)", + "app.audioNotification.audioFailedError1003": "지원하지 않는 브라우저 버전(오류 1003)", + "app.audioNotification.audioFailedError1004": "호출 실패(이유: {0}) (오류 1004)", + "app.audioNotification.audioFailedError1005": "비정상적 호출 종료(오류 1005)", + "app.audioNotification.audioFailedError1006": "호출 시간초과(오류 1006)", + "app.audioNotification.audioFailedError1007": "연결 실패(ICE 오류 1007)", + "app.audioNotification.audioFailedError1008": "전송 실패(오류 1008)", + "app.audioNotification.audioFailedError1009": "STUN/TURN 서버정보 가져오기 실패(오류 1009)", + "app.audioNotification.audioFailedError1010": "연결 협상 시간초과(ICE 오류 1010)", + "app.audioNotification.audioFailedError1011": "연결 시간초과(ICE 오류 1011)", + "app.audioNotification.audioFailedError1012": "연결 종료(ICE 오류 1012)", + "app.audioNotification.audioFailedMessage": "오디오 연결에 실패했습니다", + "app.audioNotification.mediaFailedMessage": "getUserMicMedia 실패. 안전한 소스만 허락됨", "app.audioNotification.closeLabel": "닫기", - "app.audioNotificaion.reconnectingAsListenOnly": "관람자의 마이크는 잠깁니다. 듣기만 가능한 상태로 접속 되었습니다 ", + "app.audioNotificaion.reconnectingAsListenOnly": "관람자의 마이크는 잠깁니다. 듣기만 가능한 상태로 연결되었습니다 ", "app.breakoutJoinConfirmation.title": "브레이크아웃 룸 들어가기", "app.breakoutJoinConfirmation.message": "합류 하시겠습니까 ?", "app.breakoutJoinConfirmation.confirmDesc": "브레이크아웃 룸에 합류하기", @@ -362,7 +390,7 @@ "app.breakoutJoinConfirmation.dismissDesc": "닫고 브레이크아웃 룸 합류 거절", "app.breakoutJoinConfirmation.freeJoinMessage": "합류할 브레이크아웃 룸 선택", "app.breakoutTimeRemainingMessage": "브레이크아웃 룸 남은 시간 : {0}", - "app.breakoutWillCloseMessage": "시간 종료. 브레이크아웃 룸은 닫힙니다 ", + "app.breakoutWillCloseMessage": "시간 종료. 브레이크아웃 룸은 곧 닫힙니다 ", "app.calculatingBreakoutTimeRemaining": "남은 시간 계산중 ...", "app.audioModal.ariaTitle": "오디오 창 합류", "app.audioModal.microphoneLabel": "마이크", @@ -378,12 +406,12 @@ "app.audioModal.no": "아니요", "app.audioModal.yes.arialabel" : "메아리 들리게 ", "app.audioModal.no.arialabel" : "메아리 들리지 않게 ", - "app.audioModal.echoTestTitle": "이것은 메아리 테스트 입니다. 몇마디 말을 해 보세요. 들리시나요 ?", + "app.audioModal.echoTestTitle": "메아리 테스트입니다. 말씀해 보세요. 들리시나요 ?", "app.audioModal.settingsTitle": "오디오 설정을 변경하세요 ", "app.audioModal.helpTitle": "미디어 장치에 문제가 있습니다 ", "app.audioModal.helpText": "마이크에 접근권한을 주었나요 ? 오디오에 합류하려고 할때 미디어 장치에 대한 권한을 묻는 창이 보일겁니다. 오디오 컨퍼런스에 합류하기 위해서는 권한을 허용하셔야 합니다. 이런 경우가 아니면, 브라우저 설정에서 마이크 권한을 변경하셔야 합니다 ", - "app.audioModal.help.noSSL": "이 페이지는 보안이 안되어 있습니다. 이 페이지에서 마이크 사용이 가능하려면 서버는 HTTPS 로 서비스 되어야 합니다. 서버관리자에게 도움을 요청 하세요 ", - "app.audioModal.help.macNotAllowed": "당신의 Mac 시스템 설정이 마이크 권한을 막는것 같아 보입니다. System Preference > Security & Privacy > Privacy > Microphone 으로 가서 사용함으로 체크되어 있는지 확인 해 보세요 ", + "app.audioModal.help.noSSL": "이 페이지는 안전하지 않습니다. 이 페이지에서 마이크를 사용하려면 HTTPS가 지원되어야 합니다. 서버관리자에게 도움을 요청 하세요 ", + "app.audioModal.help.macNotAllowed": "당신의 Mac 시스템 설정이 마이크 권한을 막는것 같아 보입니다. System Preference > Security & Privacy > Privacy > Microphone에서 사용함이 체크되어 있는지 확인 해 보세요 ", "app.audioModal.audioDialTitle": "전화로 합류하기", "app.audioDial.audioDialDescription": "다이얼", "app.audioDial.audioDialConfrenceText": "컨퍼런스 PIN 번호로 들어가기", @@ -393,7 +421,7 @@ "app.audioDial.tipIndicator": "팁", "app.audioDial.tipMessage": "전화기의 '0' 버튼을 누르면, 음소거/취소가 됩니다 ", "app.audioModal.connecting": "접속중", - "app.audioModal.connectingEchoTest": "메아리 테스트를 위한 접속 ", + "app.audioModal.connectingEchoTest": "메아리 테스트를 위한 연결 ", "app.audioManager.joinedAudio": "오디오 컨퍼런스에 합류하셨습니다 ", "app.audioManager.joinedEcho": "메아리 테스트에 합류하셨습니다 ", "app.audioManager.leftAudio": "오디오 컨퍼런스에서 나오셨습니다 ", @@ -420,11 +448,11 @@ "app.audio.permissionsOverlay.hint": "음성 컨퍼런스에 참여 하기 위해 미디어 장치에 대한 허가가 필요 합니다 :)", "app.error.removed": "컨퍼런스에서 퇴장하셨습니다 ", "app.error.meeting.ended": "컨퍼런스에서 나오셨습니다 ", - "app.meeting.logout.duplicateUserEjectReason": "미팅에 참여 하기 위해 사용자를 복제 ", + "app.meeting.logout.duplicateUserEjectReason": "회의에 참여하려는 사용자 중복", "app.meeting.logout.permissionEjectReason": "권한 위반으로 퇴거", "app.meeting.logout.ejectedFromMeeting": "미팅에서 퇴장되셨습니다 ", "app.meeting.logout.validateTokenFailedEjectReason": "권한 인증 실패 ", - "app.meeting.logout.userInactivityEjectReason": "사용자 비활성화 ", + "app.meeting.logout.userInactivityEjectReason": "사용자가 너무 오래 비활성 ", "app.meeting-ended.rating.legendLabel": "피드백 평가", "app.meeting-ended.rating.starLabel": "Star", "app.modal.close": "닫기", @@ -446,7 +474,7 @@ "app.guest.waiting": "합류 허가를 기다림", "app.userList.guest.waitingUsers": "사용자 기다림", "app.userList.guest.waitingUsersTitle": "사용자 관리", - "app.userList.guest.optionTitle": "보류자 돌아보기", + "app.userList.guest.optionTitle": "보류중인 사용자 검토", "app.userList.guest.allowAllAuthenticated": "인증된 자를 모두 허용", "app.userList.guest.allowAllGuests": "모든 게스트 허용", "app.userList.guest.allowEveryone": "모두 허용", @@ -457,8 +485,8 @@ "app.userList.guest.rememberChoice": "선택을 기억", "app.user-info.title": "디렉토리 검색", "app.toast.breakoutRoomEnded": "브레이크아웃 룸이 종료 되었습니다. 오디오로 다시 합류하세요", - "app.toast.chat.public": "새로운 공동 채팅 메시지", - "app.toast.chat.private": "새로운 개인채팅 메시지", + "app.toast.chat.public": "새로운 공개 채팅 메시지", + "app.toast.chat.private": "새로운 비공개 채팅 메시지", "app.toast.chat.system": "시스템", "app.toast.clearedEmoji.label": "이모지 상태 정리 ", "app.toast.setEmoji.label": "이모지 상태를 {0} 로 설정", @@ -468,6 +496,7 @@ "app.notification.recordingStop": "이 세션은 녹화되지 않습니다 ", "app.notification.recordingPaused": "이 세션은 더이상 녹화되지 않습니다 ", "app.notification.recordingAriaLabel": "녹화 시간", + "app.notification.userJoinPushAlert": "{0} 가 세션에 합류했습니다", "app.shortcut-help.title": "키보드 바로가기", "app.shortcut-help.accessKeyNotAvailable": "접속 키 불가 ", "app.shortcut-help.comboLabel": "Combo", @@ -477,23 +506,23 @@ "app.shortcut-help.openOptions": "옵션 열기", "app.shortcut-help.toggleUserList": "사용자 리스트 창 ", "app.shortcut-help.toggleMute": "음소거 / 해제", - "app.shortcut-help.togglePublicChat": "공동 채팅 창 ( 사용자 리스트가 열려 있어야 함 )", - "app.shortcut-help.hidePrivateChat": "개인 채팅 숨기기", - "app.shortcut-help.closePrivateChat": "개인 채팅 닫기 ", + "app.shortcut-help.togglePublicChat": "공개 채팅 창 ( 사용자 리스트가 열려 있어야 함 )", + "app.shortcut-help.hidePrivateChat": "비공개 채팅 숨기기", + "app.shortcut-help.closePrivateChat": "비공개 채팅 닫기 ", "app.shortcut-help.openActions": "기능 메뉴 열기", "app.shortcut-help.openStatus": "상태 메뉴 열기", "app.shortcut-help.togglePan": "Pan 도구 활성화 ( 발표자 )", "app.shortcut-help.nextSlideDesc": "다음 슬라이드 (발표자)", "app.shortcut-help.previousSlideDesc": "이전 슬라이드 (발표자)", "app.lock-viewers.title": "관람자 잠그기", - "app.lock-viewers.description": "이 옵션을 사용하면 시청자가 특정 기능을 사용하지 못하도록 제한 할 수 있습니다", + "app.lock-viewers.description": "이 옵션을 사용하면 관람자가 특정 기능을 사용하지 못하도록 제한 할 수 있습니다", "app.lock-viewers.featuresLable": "특징", "app.lock-viewers.lockStatusLabel": "상태", "app.lock-viewers.webcamLabel": "웹캠 공유", "app.lock-viewers.otherViewersWebcamLabel": "다른 관람자의 웹캠 보기", "app.lock-viewers.microphoneLable": "마이크 공유", - "app.lock-viewers.PublicChatLabel": "공동 채팅 메시지 보내기", - "app.lock-viewers.PrivateChatLable": "개인 채팅 메시지 보내기", + "app.lock-viewers.PublicChatLabel": "공개 채팅 메시지 보내기", + "app.lock-viewers.PrivateChatLable": "비공개 채팅 메시지 보내기", "app.lock-viewers.notesLabel": "공유 노트 쓰기", "app.lock-viewers.userListLabel": "사용자 리스트에 있는 다른 관람자 보기 ", "app.lock-viewers.ariaTitle": "관람자 설정창 고정", @@ -504,10 +533,10 @@ "app.recording.startTitle": "녹화 시작", "app.recording.stopTitle": "녹화 일시중지", "app.recording.resumeTitle": "녹화 재시작", - "app.recording.startDescription": "녹화 중단 버튼을 누른후 녹화 버튼을 다시 누를 수 있습니다 ", - "app.recording.stopDescription": "녹화를 중단 하시겠습니까 ? 녹화버튼을 눌러서 녹화를 다시 시작하실 수 있습니다 ", + "app.recording.startDescription": "녹화 버튼을 눌러 녹화를 일시중지 시킬 수 있습니다", + "app.recording.stopDescription": "녹화를 일시중지 하시겠습니까 ? 녹화 재시작 버튼을 누르면 계속 녹화할 수 있습니다 ", "app.videoPreview.cameraLabel": "카메라", - "app.videoPreview.profileLabel": "퀄리티", + "app.videoPreview.profileLabel": "품질", "app.videoPreview.cancelLabel": "취소", "app.videoPreview.closeLabel": "닫기", "app.videoPreview.findingWebcamsLabel": "웹캠 찾기", @@ -520,12 +549,14 @@ "app.video.joinVideo": "웹캠 공유", "app.video.leaveVideo": "웹캠 공유 중지", "app.video.iceCandidateError": "ICE 추가 에러 ", + "app.video.iceConnectionStateError": "연결 실패(ICE 오류 1107)", "app.video.permissionError": "웹캠 공유중 에러. 장치 권한을 체크 하세요 ", "app.video.sharingError": "웹캠 공유 에러 ", "app.video.notFoundError": "웹캠을 찾지 못했습니다. 연결을 확인 해 보세요 ", "app.video.notAllowed": "웹캠 공유 권한을 찾지 못했습니다. 브라우저 권한을 확인 하세요 ", "app.video.notSupportedError": "안전한 접속에서만 웹캠공유가 가능합니다. SSL 인증서에 문제가 없는지 확인 하세요 ", "app.video.notReadableError": "웹캠 비디오를 가져 올 수 없습니다. 다른 프로그램에서 웹캠을 사용하고 있지 않은지 확인 하세요 ", + "app.video.mediaFlowTimeout1020": "Media가 서버에 도달할 수 없습니다(오류 1020)", "app.video.suggestWebcamLock": "관람자의 웹캠을 강제로 잠금설정 하겠습니까 ?", "app.video.suggestWebcamLockReason": "( 이것은 미팅의 안정성을 높여줄것입니다 )", "app.video.enable": "가능", @@ -542,7 +573,7 @@ "app.video.stats.title": "접속 현황", "app.video.stats.packetsReceived": "패킷 접수 ", "app.video.stats.packetsSent": "패킷 전송", - "app.video.stats.packetsLost": "패킷 실종", + "app.video.stats.packetsLost": "패킷 손실", "app.video.stats.bitrate": "비트레이트", "app.video.stats.lostPercentage": "총 실패율", "app.video.stats.lostRecentPercentage": "최근 실패율", @@ -553,6 +584,16 @@ "app.video.stats.encodeUsagePercent": "인코딩 사용율", "app.video.stats.currentDelay": "현재 지연", "app.fullscreenButton.label": "{0} 을 꽉찬화면으로 ", + "app.deskshare.iceConnectionStateError": "스크린 공유 중 연결 실패(ICE 오류 1108)", + "app.sfu.mediaServerConnectionError2000": "미디어 서버에 연결할 수 없음(오류 2000)", + "app.sfu.mediaServerOffline2001": "미디어서버가 꺼져있습니다. 다시 시도해 보세요(오류 2001)", + "app.sfu.mediaServerNoResources2002": "미디어서버에 가용자원이 없습니다(오류 2002)", + "app.sfu.mediaServerRequestTimeout2003": "미디어서버 요청 시간이 초과되었습니다(오류 2003)", + "app.sfu.serverIceGatheringFailed2021": "미디어서버가 연결대상을 수집할 수 없습니다(ICE 오류 2021)", + "app.sfu.serverIceGatheringFailed2022": "미디어서버 연결 실패(ICE 오류 2022)", + "app.sfu.mediaGenericError2200": "미디어서버가 요청을 처리하지 못했습니다(오류 2200)", + "app.sfu.invalidSdp2202":"클라이언트가 유효하지 않은 미디어 요청을 생성했습니다(SDP 오류 2202)", + "app.sfu.noAvailableCodec2203": "서버에서 적절한 코덱을 찾을 수 없습니다(오류 2203)", "app.meeting.endNotification.ok.label": "예", "app.whiteboard.annotations.poll": "설문결과 공개 ", "app.whiteboard.toolbar.tools": "도구들", @@ -592,7 +633,7 @@ "app.videoDock.webcamFocusLabel": "촛점", "app.videoDock.webcamFocusDesc": "선택된 웹캠에 집중", "app.videoDock.webcamUnfocusLabel": "포커스 해제", - "app.videoDock.webcamUnfocusDesc": "선택된 웹캡에 포커스 해제", + "app.videoDock.webcamUnfocusDesc": "선택된 웹캠에 포커스 해제", "app.videoDock.autoplayBlockedDesc": "다른 사용자의 웹캠을 보여 주기 위해 당신의 허가가 필요 합니다 ", "app.videoDock.autoplayAllowLabel": "웹캠 보기", "app.invitation.title": "브레이크아웃룸 초대", @@ -618,7 +659,7 @@ "app.createBreakoutRoom.roomName": "{0} ( 룸 - {1} )", "app.createBreakoutRoom.doneLabel": "완료", "app.createBreakoutRoom.nextLabel": "다음", - "app.createBreakoutRoom.minusRoomTime": "브레이크 아웃 룸 시간 줄이기 ", + "app.createBreakoutRoom.minusRoomTime": "브레이크 아웃룸 시간 줄이기 ", "app.createBreakoutRoom.addRoomTime": "브레이크 아웃룸 시간 늘리기", "app.createBreakoutRoom.addParticipantLabel": "+ 참가자 추가", "app.createBreakoutRoom.freeJoin": "사용자가 참여할 브레이크 아웃룸을 선택하게 허가 ", @@ -638,7 +679,7 @@ "app.externalVideo.noteLabel": "알림 : 외부 비디오 공유는 녹화에 나타나지 않습니다. Youtube, Vimeo, Instructure Media, Twitch and Daily Motion URL 은 지원됩니다 ", "app.actionsBar.actionsDropdown.shareExternalVideo": "외부 비디오 공유", "app.actionsBar.actionsDropdown.stopShareExternalVideo": "외부 비디오 공유 중지 ", - "app.iOSWarning.label": "iOS 12.2 혹은 그 이상으로 업그레이드 하세요 ", + "app.iOSWarning.label": "iOS 12.2 이상으로 업그레이드 하세요 ", "app.legacy.unsupportedBrowser": "지원되지 않는 브라우저를 사용하시는것 같습니다. 충분한 지원을 위해 {0} 이나 {1} 를 사용하세요 ", "app.legacy.upgradeBrowser": "오래된 버전의 브라우저를 사용하시는것 같습니다. 충분한 지원을 위해 브라우저를 업그레이드 하세요 ", "app.legacy.criosBrowser": "iOS 를 사용중이시라면, Safari 브라우저를 사용하세요 " diff --git a/bigbluebutton-html5/private/locales/nb_NO.json b/bigbluebutton-html5/private/locales/nb_NO.json index cc3b046240e5..4e040627d40e 100644 --- a/bigbluebutton-html5/private/locales/nb_NO.json +++ b/bigbluebutton-html5/private/locales/nb_NO.json @@ -1,16 +1,16 @@ { "app.home.greeting": "Presentasjonen din starter snart ...", "app.chat.submitLabel": "Send melding", - "app.chat.errorMaxMessageLength": "Meldingen er {0} bokstaver for lang", + "app.chat.errorMaxMessageLength": "Meldingen er {0} bokstav(er) for lang", "app.chat.disconnected": "Du er frakoblet, meldinger kan ikke bli sendt.", "app.chat.locked": "Chat er for øyeblikket låst, meldinger kan ikke bli sendt", - "app.chat.inputLabel": "Skrivefelt for chat [0]", - "app.chat.inputPlaceholder": "Send melding til [0]", + "app.chat.inputLabel": "Skrivefelt for chat {0}", + "app.chat.inputPlaceholder": "Send melding til {0}", "app.chat.titlePublic": "Gruppechat", - "app.chat.titlePrivate": "Privat chat med [0]", - "app.chat.partnerDisconnected": "[0] har forlatt møtet", - "app.chat.closeChatLabel": "Lukk [0]", - "app.chat.hideChatLabel": "Skjul [0]", + "app.chat.titlePrivate": "Privat chat med {0}", + "app.chat.partnerDisconnected": "{0} har forlatt møtet", + "app.chat.closeChatLabel": "Lukk {0}", + "app.chat.hideChatLabel": "Skjul {0}", "app.chat.moreMessages": "Flere meldinger under", "app.chat.dropdown.options": "Chatinnstillinger", "app.chat.dropdown.clear": "Tøm", @@ -21,8 +21,8 @@ "app.chat.emptyLogLabel": "Chatloggen er tom", "app.chat.clearPublicChatMessage": "Gruppechaten har blitt tømt av en moderator", "app.chat.multi.typing": "Flere brukere skriver", - "app.chat.one.typing": "[0] skriver", - "app.chat.two.typing": "[0] og [1] skriver", + "app.chat.one.typing": "{0} skriver", + "app.chat.two.typing": "{0} og {1} skriver", "app.captions.label": "Undertekster", "app.captions.menu.close": "Lukk", "app.captions.menu.start": "Start", @@ -41,7 +41,7 @@ "app.captions.pad.hide": "Skjul undertekster", "app.captions.pad.tip": "Trykk på Escape for å fokusere på verktøylinjen for redigering", "app.captions.pad.ownership": "Ta over", - "app.captions.pad.ownershipTooltip": "Du vil bli satt som eier av [0] undertekster", + "app.captions.pad.ownershipTooltip": "Du vil bli satt som eier av {0} undertekster", "app.captions.pad.interimResult": "Midlertidige resultater", "app.captions.pad.dictationStart": "Start diktering", "app.captions.pad.dictationStop": "Stopp diktering", @@ -67,8 +67,8 @@ "app.userList.toggleCompactView.label": "Kompaktmodus", "app.userList.guest": "Gjest", "app.userList.menuTitleContext": "Tilgjengelige valg", - "app.userList.chatListItem.unreadSingular": "[0] Ny melding", - "app.userList.chatListItem.unreadPlural": "[0] nye meldinger", + "app.userList.chatListItem.unreadSingular": "{0} Ny melding", + "app.userList.chatListItem.unreadPlural": "{0} nye meldinger", "app.userList.menu.chat.label": "Start en privat chat", "app.userList.menu.clearStatus.label": "Tilbakestill status", "app.userList.menu.removeUser.label": "Fjern bruker", @@ -77,8 +77,8 @@ "app.userList.userAriaLabel": "{0} {1} {2} Status {3}", "app.userList.menu.promoteUser.label": "Oppgrader til moderator", "app.userList.menu.demoteUser.label": "Nedgrader til deltager", - "app.userList.menu.unlockUser.label": "Lås opp [0]", - "app.userList.menu.lockUser.label": "Lås [0]", + "app.userList.menu.unlockUser.label": "Lås opp {0}", + "app.userList.menu.lockUser.label": "Lås {0}", "app.userList.menu.directoryLookup.label": "Katalogoppslag", "app.userList.menu.makePresenter.label": "Gi presentator", "app.userList.userOptions.manageUsersLabel": "Administrer brukere", @@ -120,7 +120,7 @@ "app.screenshare.notReadableError": "Feil: Noe gikk galt under skjermdeling", "app.screenshare.genericError": "Feil: Noe gikk galt under skjermdeling, vennligst prøv igjen", "app.meeting.ended": "Denne økten er avsluttet", - "app.meeting.meetingTimeRemaining": "Gjenværende tid: [0]", + "app.meeting.meetingTimeRemaining": "Gjenværende tid: {0}", "app.meeting.meetingTimeHasEnded": "Tiden er ute. Møtet avsluttes straks", "app.meeting.endedMessage": "Du blir videreført til hjemskjermen", "app.meeting.alertMeetingEndsUnderOneMinute": "Møtet avsluttes om ett minutt", @@ -154,7 +154,7 @@ "app.presentation.presentationToolbar.zoomIndicator": "Nåværende størrelsesprosent", "app.presentation.presentationToolbar.fitToWidth": "Tilpass bredde", "app.presentation.presentationToolbar.fitToPage": "Tilpass side", - "app.presentation.presentationToolbar.goToSlide": "Slide [0]", + "app.presentation.presentationToolbar.goToSlide": "Slide {0}", "app.presentationUploder.title": "Presentasjon", "app.presentationUploder.message": "Som presentator har du muligheten til å laste opp ethvert officedokument eller PDF fil. Vi anbefaler PDF for optimalt resultat. Vennligst se at presentasjonen er valgt ved bruk av den runde avsjekksboksen på høyre side.", "app.presentationUploder.uploadLabel": "Last opp", @@ -171,7 +171,10 @@ "app.presentationUploder.rejectedError": "De valgte filen(e) har ikke blitt godtatt. Vennligst sjekk filtypen(e).", "app.presentationUploder.upload.progress": "Laster opp ({0}%)", "app.presentationUploder.upload.413": "Filen er for stor, vennligst del den opp i flere filer", - "app.presentationUploder.conversion.conversionProcessingSlides": "Bearbeider side [0] av [1]", + "app.presentationUploder.upload.408": "Forespørsel om oplastingsnøkkel gikk ut på tid", + "app.presentationUploder.upload.404": "404: Ikke godkjent opplastingsnøkkel", + "app.presentationUploder.upload.401": "Foresøprring av opplastingstoken feilet.", + "app.presentationUploder.conversion.conversionProcessingSlides": "Bearbeider side {0} av {1}", "app.presentationUploder.conversion.genericConversionStatus": "Konverterer fil ...", "app.presentationUploder.conversion.generatingThumbnail": "Genererer miniatyrbilder", "app.presentationUploder.conversion.generatedSlides": "Sider generert ...", @@ -201,7 +204,7 @@ "app.poll.backLabel": "Tilbake til spørsmålsvalg", "app.poll.closeLabel": "Lukk", "app.poll.waitingLabel": "Venter på svar ({0}/{1})", - "app.poll.ariaInputCount": "Tilpasset spørsmålsvalg[0] av [1]", + "app.poll.ariaInputCount": "Tilpasset spørsmålsvalg {0} av {1}", "app.poll.customPlaceholder": "Legg til spørsmålsvalg", "app.poll.noPresentationSelected": "Ingen presentasjon valgt! Vennligst velg en.", "app.poll.clickHereToSelect": "Trykk her for å velge", @@ -227,12 +230,12 @@ "app.poll.liveResult.usersTitle": "Brukere", "app.poll.liveResult.responsesTitle": "Tilbakemelding", "app.polling.pollingTitle": "Spørsmålsvalg", - "app.polling.pollAnswerLabel": "Svar[0]", - "app.polling.pollAnswerDesc": "Velg dette for å stemme på [0]", + "app.polling.pollAnswerLabel": "Svar {0}", + "app.polling.pollAnswerDesc": "Velg dette for å stemme på {0}", "app.failedMessage": "Beklager, vi har problemer med å koble til serveren.", "app.downloadPresentationButton.label": "Last ned presentasjonen", "app.connectingMessage": "Kobler til ...", - "app.waitingMessage": "Frakoblet. Prøver å koble til på nytt om [0] sekunder ...", + "app.waitingMessage": "Frakoblet. Prøver å koble til på nytt om {0} sekunder ...", "app.retryNow": "Prøv igjen nå", "app.navBar.settingsDropdown.optionsLabel": "Valg", "app.navBar.settingsDropdown.fullscreenLabel": "Gjør fullskjerm", @@ -289,7 +292,7 @@ "app.submenu.application.fontSizeControlLabel": "Tekststørrelse", "app.submenu.application.increaseFontBtnLabel": "Forstørr applikasjonens tekststørrelse", "app.submenu.application.decreaseFontBtnLabel": "Forminsk applikasjonens fontstørrelse", - "app.submenu.application.currentSize": "for øyeblikket [0]", + "app.submenu.application.currentSize": "for øyeblikket {0}", "app.submenu.application.languageLabel": "Applikasjonsspråk", "app.submenu.application.languageOptionLabel": "Velg språk", "app.submenu.application.noLocaleOptionLabel": "Ingen aktive språk", @@ -319,8 +322,8 @@ "app.switch.onLabel": "På", "app.switch.offLabel": "Av", "app.talkingIndicator.ariaMuteDesc" : "Velg for å gjøre brukeren lydløs", - "app.talkingIndicator.isTalking" : "[0] snakker", - "app.talkingIndicator.wasTalking" : "[0] stoppet å snakke", + "app.talkingIndicator.isTalking" : "{0} snakker", + "app.talkingIndicator.wasTalking" : "{0} stoppet å snakke", "app.actionsBar.actionsDropdown.actionsLabel": "Handlinger", "app.actionsBar.actionsDropdown.presentationLabel": "Last opp en presentasjon", "app.actionsBar.actionsDropdown.initPollLabel": "Start en spørrerunde", @@ -361,13 +364,13 @@ "app.actionsBar.emojiMenu.thumbsUpDesc": "Endre din status til tommel opp", "app.actionsBar.emojiMenu.thumbsDownLabel": "Tommel ned", "app.actionsBar.emojiMenu.thumbsDownDesc": "ndre din status til tommel ned", - "app.actionsBar.currentStatusDesc": "Nåværende status [0]", + "app.actionsBar.currentStatusDesc": "Nåværende status {0}", "app.actionsBar.captions.start": "Start visning av undertekster", "app.actionsBar.captions.stop": "Stopp visning av undertekster", "app.audioNotification.audioFailedError1001": "WebSocket Disconnected (error 1002)", "app.audioNotification.audioFailedError1002": "Kunne ikke lage en WebSocket tilkobling (error 1002)", "app.audioNotification.audioFailedError1003": "Nettleserversjonen er ikke støttet (error 1003)", - "app.audioNotification.audioFailedError1004": "Feil ved oppringning (årsak=[0])) (error 1004)", + "app.audioNotification.audioFailedError1004": "Feil ved oppringning (årsak={0}) (error 1004)", "app.audioNotification.audioFailedError1005": "Oppringningen stoppet uvventet (error 1005)", "app.audioNotification.audioFailedError1006": "Oppringningen tok for lang tid (error 1006)", "app.audioNotification.audioFailedError1007": "Tilkoblingsfeil (ICE error 1007)", @@ -386,7 +389,7 @@ "app.breakoutJoinConfirmation.dismissLabel": "Avbryt", "app.breakoutJoinConfirmation.dismissDesc": "Lukker og avviser forespørselen om grupperom", "app.breakoutJoinConfirmation.freeJoinMessage": "Velg et grupperom å bli med i", - "app.breakoutTimeRemainingMessage": "Gjenværende tid for grupperom: [0]", + "app.breakoutTimeRemainingMessage": "Gjenværende tid for grupperom: {0}", "app.breakoutWillCloseMessage": "Tiden er ute. Grupperom avsluttes snart", "app.calculatingBreakoutTimeRemaining": "Kalkulerer gjenværende tid ...", "app.audioModal.ariaTitle": "Audiomodal", @@ -397,7 +400,7 @@ "app.audioModal.iOSErrorDescription": "På nåværende tidspunkt er ikke audio og video støttet på Chrome for iOS", "app.audioModal.iOSErrorRecommendation": "Vi anbefaler at du bruker Safari for iOS", "app.audioModal.audioChoiceDesc": "Velg hvordan du ønsker å bli med i lydmøtet", - "app.audioModal.unsupportedBrowserLabel": "Det ser ut som du bruker en nettleser som ikke er fullt støttet. Velg enten [0] eller [1] for full støtte.", + "app.audioModal.unsupportedBrowserLabel": "Det ser ut som du bruker en nettleser som ikke er fullt støttet. Velg enten {0} eller {1} for full støtte.", "app.audioModal.closeLabel": "Lukk", "app.audioModal.yes": "Ja", "app.audioModal.no": "Nei", @@ -476,8 +479,8 @@ "app.userList.guest.allowAllGuests": "Godta alle gjester", "app.userList.guest.allowEveryone": "Godta alle", "app.userList.guest.denyEveryone": "Blokker alle", - "app.userList.guest.pendingUsers": "[0] Ventende brukere", - "app.userList.guest.pendingGuestUsers": "[0] ventende gjestebrukere", + "app.userList.guest.pendingUsers": "{0} Ventende brukere", + "app.userList.guest.pendingGuestUsers": "{0} ventende gjestebrukere", "app.userList.guest.pendingGuestAlert": "Har blitt med i møtet og venter på din godkjenning", "app.userList.guest.rememberChoice": "Husk valg", "app.user-info.title": "Katalogoppslag", @@ -486,14 +489,14 @@ "app.toast.chat.private": "Ny privatmelding", "app.toast.chat.system": "System", "app.toast.clearedEmoji.label": "Emoji status tilbakesatt", - "app.toast.setEmoji.label": "Emoji status satt til [0]", + "app.toast.setEmoji.label": "Emoji status satt til {0}", "app.toast.meetingMuteOn.label": "Alle brukere har blitt mutet", "app.toast.meetingMuteOff.label": "Møtemute er skrudd av", "app.notification.recordingStart": "Dette møtet blir nå spilt inn", "app.notification.recordingStop": "Dette møtet blir ikke spilt inn", "app.notification.recordingPaused": "Dette møtet blir ikke spilt inn lengre", "app.notification.recordingAriaLabel": "Innspillingstid", - "app.notification.userJoinPushAlert": "[0] ble med i møtet", + "app.notification.userJoinPushAlert": "{0} ble med i møtet", "app.shortcut-help.title": "Tastatursnarveier", "app.shortcut-help.accessKeyNotAvailable": "Tilgangsnøkler ikke tilgjengelig", "app.shortcut-help.comboLabel": "Kombinasjon", @@ -580,7 +583,7 @@ "app.video.stats.rtt": "RTT", "app.video.stats.encodeUsagePercent": "Encodeforbruk", "app.video.stats.currentDelay": "Nåværende forsinkelse", - "app.fullscreenButton.label": "Gjør [0] fullskjerm", + "app.fullscreenButton.label": "Gjør {0} fullskjerm", "app.deskshare.iceConnectionStateError": "Connection failed when sharing screen (ICE error 1108)", "app.sfu.mediaServerConnectionError2000": "Unable to connect to media server (error 2000)", "app.sfu.mediaServerOffline2001": "Media server is offline. Please try again later (error 2001)", @@ -637,12 +640,12 @@ "app.invitation.confirm": "Inviter", "app.createBreakoutRoom.title": "Grupperom", "app.createBreakoutRoom.ariaTitle": "Skjul grupperom", - "app.createBreakoutRoom.breakoutRoomLabel": "Grupperom [0]", + "app.createBreakoutRoom.breakoutRoomLabel": "Grupperom {0}", "app.createBreakoutRoom.generatingURL": "Genererer URL", "app.createBreakoutRoom.generatedURL": "Generert", - "app.createBreakoutRoom.duration": "Varighet [0]", - "app.createBreakoutRoom.room": "Rom [0]", - "app.createBreakoutRoom.notAssigned": "Ikke designert ((0))", + "app.createBreakoutRoom.duration": "Varighet {0}", + "app.createBreakoutRoom.room": "Rom {0}", + "app.createBreakoutRoom.notAssigned": "Ikke designert ({0})", "app.createBreakoutRoom.join": "Bli med i rommet", "app.createBreakoutRoom.joinAudio": "Bli med i lydkonferansen", "app.createBreakoutRoom.returnAudio": "Lydsvar", @@ -653,7 +656,7 @@ "app.createBreakoutRoom.durationInMinutes": "Varighet (minutter)", "app.createBreakoutRoom.randomlyAssign": "Tilfeldig designert", "app.createBreakoutRoom.endAllBreakouts": "Avslutt alle grupperom", - "app.createBreakoutRoom.roomName": "(0) (Room - (1))", + "app.createBreakoutRoom.roomName": "{0} (Rom - {1})", "app.createBreakoutRoom.doneLabel": "Ferdig", "app.createBreakoutRoom.nextLabel": "Neste", "app.createBreakoutRoom.minusRoomTime": "Forkort tiden til grupperom", @@ -662,7 +665,7 @@ "app.createBreakoutRoom.freeJoin": "Tillat brukere å velge grupperom å bli med i", "app.createBreakoutRoom.leastOneWarnBreakout": "Du må plassere minst en bruker i et grupperom", "app.createBreakoutRoom.modalDesc": "Tips: Du kan dra-og-slippe en brukers navn for å designere de til et spesifikt grupperom", - "app.createBreakoutRoom.roomTime": "[0] minutter", + "app.createBreakoutRoom.roomTime": "{0} minutter", "app.createBreakoutRoom.numberOfRoomsError": "Ugyldig antall rom", "app.externalVideo.start": "Del en ny video", "app.externalVideo.title": "Del en ekstern video", @@ -677,7 +680,7 @@ "app.actionsBar.actionsDropdown.shareExternalVideo": "Del en ekstern video", "app.actionsBar.actionsDropdown.stopShareExternalVideo": "Stopp deling av ekstern video", "app.iOSWarning.label": "Vennligst oppgrader til iOS 12.2 eller høyere", - "app.legacy.unsupportedBrowser": "Det ser ut som du bruker en nettleser som ikke er støttet. Vennligst bruk [0] eller[1] for full støtte.", + "app.legacy.unsupportedBrowser": "Det ser ut som du bruker en nettleser som ikke er støttet. Vennligst bruk {0} eller {1} for full støtte.", "app.legacy.upgradeBrowser": "Det ser ut som du bruker en eldre utgave av en støttet nettleser. Vennligst oppdater nettleseren for å få full funksjonalitet", "app.legacy.criosBrowser": "Vennligst bruk Safari på iOS for full funksjonalitet" diff --git a/bigbluebutton-html5/private/locales/nl.json b/bigbluebutton-html5/private/locales/nl.json index f5337ac9ce60..78597e03d777 100644 --- a/bigbluebutton-html5/private/locales/nl.json +++ b/bigbluebutton-html5/private/locales/nl.json @@ -171,6 +171,9 @@ "app.presentationUploder.rejectedError": "De geselecteerde bestanden zijn geweigerd. Controleer de bestandstype (s).", "app.presentationUploder.upload.progress": "Uploaden ({0}%)", "app.presentationUploder.upload.413": "Bestand is te groot. Splitsen in meerdere bestanden.", + "app.presentationUploder.upload.408": "Verzoek time-out voor uploadtoken.", + "app.presentationUploder.upload.404": "404: Ongeldig uploadtoken", + "app.presentationUploder.upload.401": "Verzoek voor presentatie uploadtoken mislukt.", "app.presentationUploder.conversion.conversionProcessingSlides": "Verwerkingspagina {0} van {1}", "app.presentationUploder.conversion.genericConversionStatus": "Bestand converteren ...", "app.presentationUploder.conversion.generatingThumbnail": "Miniaturen genereren ...", diff --git a/bigbluebutton-html5/private/locales/pl_PL.json b/bigbluebutton-html5/private/locales/pl_PL.json index de6e56057f9a..5acd17a1bc0b 100644 --- a/bigbluebutton-html5/private/locales/pl_PL.json +++ b/bigbluebutton-html5/private/locales/pl_PL.json @@ -111,6 +111,8 @@ "app.media.autoplayAlertDesc": "Zezwól na dostęp", "app.media.screenshare.start": "Rozpoczęto udostępnianie ekranu", "app.media.screenshare.end": "Zakończono udostępnianie ekranu", + "app.media.screenshare.unavailable": "Udostępnianie ekranu niedostępne", + "app.media.screenshare.safariNotSupported": "Udostępnianie ekranu jest aktualnie niedostępne w Safari. Proszę użyć przeglądarki Firefox lub Google Chrome.", "app.media.screenshare.autoplayBlockedDesc": "Potrzebujemy Twojej zgody aby wyświetlić ekran prelegenta.", "app.media.screenshare.autoplayAllowLabel": "Zobacz udostępniony ekran", "app.screenshare.notAllowed": "Błąd: Nie udzielono uprawnień na dostęp do ekranu.", @@ -259,7 +261,7 @@ "app.leaveConfirmation.confirmLabel": "Wyjdź", "app.leaveConfirmation.confirmDesc": "Wylogowuje Cię ze spotkania", "app.endMeeting.title": "Zakończ spotkanie", - "app.endMeeting.description": "Czy chcesz zakończyć tą sesję?", + "app.endMeeting.description": "Czy chcesz zakończyć tę sesję?", "app.endMeeting.yesLabel": "Tak", "app.endMeeting.noLabel": "Nie", "app.about.title": "O kliencie", diff --git a/bigbluebutton-html5/private/locales/pt.json b/bigbluebutton-html5/private/locales/pt.json index 27bec1f2582a..3d02d8fdeb7c 100644 --- a/bigbluebutton-html5/private/locales/pt.json +++ b/bigbluebutton-html5/private/locales/pt.json @@ -111,6 +111,8 @@ "app.media.autoplayAlertDesc": "Permitir acesso", "app.media.screenshare.start": "A partilha do ecrã iniciou", "app.media.screenshare.end": "A partilha do ecrã terminou", + "app.media.screenshare.unavailable": "Partilha de ecrã indisponível", + "app.media.screenshare.safariNotSupported": "Actualmente, a partilha de ecrã não é suportada no Safari. Por favor, utilize o Firefox ou o Google Chrome.", "app.media.screenshare.autoplayBlockedDesc": "Necessitamos da sua permissão para lhe mostrar o ecrã do apresentador", "app.media.screenshare.autoplayAllowLabel": "Ver ecrã partilhado", "app.screenshare.notAllowed": "Erro: Permissão para aceder ao ecrã não for fornecida", @@ -160,8 +162,8 @@ "app.presentationUploder.confirmDesc": "Guardar as alterações e iniciar a apresentação", "app.presentationUploder.dismissLabel": "Cancelar", "app.presentationUploder.dismissDesc": "Fechar a janela e não guardar as alterações", - "app.presentationUploder.dropzoneLabel": "Arraste e ficheiros para aqui para os carregar", - "app.presentationUploder.dropzoneImagesLabel": "Arraste imagens para aqui para as carregar", + "app.presentationUploder.dropzoneLabel": "Arraste ficheiros para aqui, para os carregar", + "app.presentationUploder.dropzoneImagesLabel": "Arraste imagens para aqui, para as carregar", "app.presentationUploder.browseFilesLabel": "ou procure ficheiros", "app.presentationUploder.browseImagesLabel": "ou procure/capture imagens", "app.presentationUploder.fileToUpload": "Para carregar ...", @@ -169,6 +171,9 @@ "app.presentationUploder.rejectedError": "O(s) ficheiro(s) selecionados foram rejeitados.\nVerifique por favor os tipos de ficheiro.", "app.presentationUploder.upload.progress": "A carregar ({0}%)", "app.presentationUploder.upload.413": "O ficheiro é demasiado grande. Por favor divida o mesmo em vários ficheiros.", + "app.presentationUploder.upload.408": "Timeout no pedido de token de carregamento.", + "app.presentationUploder.upload.404": "404: Token de carregamento inválido", + "app.presentationUploder.upload.401": "O pedido de um token de carregamento de apresentação, falhou.", "app.presentationUploder.conversion.conversionProcessingSlides": "A processar a página {0} de {1}", "app.presentationUploder.conversion.genericConversionStatus": "A converter o ficheiro ...", "app.presentationUploder.conversion.generatingThumbnail": "A gerar miniaturas ...", @@ -325,7 +330,7 @@ "app.actionsBar.actionsDropdown.desktopShareLabel": "Partilhar o seu ecrã", "app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Partilha de ecrã bloqueada", "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Parar partilha de ecrã", - "app.actionsBar.actionsDropdown.presentationDesc": "Carregar a apresentação", + "app.actionsBar.actionsDropdown.presentationDesc": "Carregar a sua apresentação", "app.actionsBar.actionsDropdown.initPollDesc": "Iniciar uma sondagem", "app.actionsBar.actionsDropdown.desktopShareDesc": "Partilhar o seu ecrã com os outros", "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Parar a partilha do seu ecrã com", diff --git a/bigbluebutton-html5/private/locales/sl.json b/bigbluebutton-html5/private/locales/sl.json index 870a2090aa93..55d4af6e4e98 100644 --- a/bigbluebutton-html5/private/locales/sl.json +++ b/bigbluebutton-html5/private/locales/sl.json @@ -171,6 +171,9 @@ "app.presentationUploder.rejectedError": "Izbrane datoteke so zavrnjene. Preverite podprtost vrst datotek.", "app.presentationUploder.upload.progress": "Poteka pošiljanje ({0} %)", "app.presentationUploder.upload.413": "Datoteka je prevelika. Razdelite jo na več manjših.", + "app.presentationUploder.upload.408": "Zahteva pošiljanja je časovno potekla.", + "app.presentationUploder.upload.404": "404: neveljaven žeton pošiljanja", + "app.presentationUploder.upload.401": "Zahteva po pošiljanju predstavitve je spodletela.", "app.presentationUploder.conversion.conversionProcessingSlides": "Poteka priprava strani {0} od {1}", "app.presentationUploder.conversion.genericConversionStatus": "Poteka pretvarjanje datoteke ...", "app.presentationUploder.conversion.generatingThumbnail": "Poteka ustvarjanje sličic ...", diff --git a/bigbluebutton-html5/private/locales/uk_UA.json b/bigbluebutton-html5/private/locales/uk_UA.json index 59448707fc65..2b710e9979d5 100644 --- a/bigbluebutton-html5/private/locales/uk_UA.json +++ b/bigbluebutton-html5/private/locales/uk_UA.json @@ -1,14 +1,14 @@ { - "app.home.greeting": "Ласкаво просимо! Ваша презентація почнеться найближчим часом... ", + "app.home.greeting": "Вітаємо! Ваша презентація почнеться найближчим часом... ", "app.chat.submitLabel": "Надіслати повідомлення", - "app.chat.errorMaxMessageLength": "Повідомлення із {0} символа(-ів) занадто довге", + "app.chat.errorMaxMessageLength": "Повідомлення з {0} символів є занадто довгим", "app.chat.disconnected": "Ви від'єднались, повідомлення не можуть бути надіслані", - "app.chat.locked": "Чат заблокований, повідомлення неможливо надіслати", - "app.chat.inputLabel": "Введення повідомлення для чату {0}", - "app.chat.inputPlaceholder": "Надіслати повідомлення для {0}", + "app.chat.locked": "Чат заблоковано, неможливо надіслати повідомлення", + "app.chat.inputLabel": "Текст повідомлення у чаті з {0}", + "app.chat.inputPlaceholder": "Надіслати повідомлення у {0}", "app.chat.titlePublic": "Загальний чат", "app.chat.titlePrivate": "Приватний чат з {0}", - "app.chat.partnerDisconnected": "{0} покинув конференцію", + "app.chat.partnerDisconnected": "{0} вийшов з конференції", "app.chat.closeChatLabel": "Закрити {0}", "app.chat.hideChatLabel": "Приховати {0}", "app.chat.moreMessages": "Більше повідомлень нижче", @@ -37,7 +37,7 @@ "app.captions.menu.fontFamily": "Шрифт", "app.captions.menu.backgroundColor": "Колір фону", "app.captions.menu.previewLabel": "Попередній перегляд", - "app.captions.menu.cancelLabel": "Відмінити", + "app.captions.menu.cancelLabel": "Скасувати", "app.captions.pad.hide": "Приховати субтитри", "app.captions.pad.tip": "Натисніть Esc, щоб сфокусувати панель інструментів редактора", "app.captions.pad.ownership": "Стати ведучим", @@ -46,10 +46,10 @@ "app.captions.pad.dictationStart": "Почати диктування", "app.captions.pad.dictationStop": "Зупинити диктування", "app.captions.pad.dictationOnDesc": "Включити розпізнавання мови", - "app.captions.pad.dictationOffDesc": "Виключити розпізнавання мови", - "app.note.title": "Спільні примітки", - "app.note.label": "Примітки", - "app.note.hideNoteLabel": "Сховати примітки", + "app.captions.pad.dictationOffDesc": "Вимкнути розпізнавання мови", + "app.note.title": "Спільні нотатки", + "app.note.label": "Нотатки", + "app.note.hideNoteLabel": "Сховати нотатки", "app.user.activityCheck": "Перевірка активності користувача", "app.user.activityCheck.label": "Перевірте, чи знаходиться користувач у зустрiчi ({0})", "app.user.activityCheck.check": "Перевірка", @@ -57,12 +57,12 @@ "app.userList.usersTitle": "Користувачі", "app.userList.participantsTitle": "Учасники", "app.userList.messagesTitle": "Повідомлення", - "app.userList.notesTitle": "Примітки", - "app.userList.notesListItem.unreadContent": "В розділі \"Спільні примітки\" появилась нова інформація", + "app.userList.notesTitle": "Нотатки", + "app.userList.notesListItem.unreadContent": "Оновлення у розділі \"Спільні нотатки\"", "app.userList.captionsTitle": "Субтитри", "app.userList.presenter": "Ведучий", "app.userList.you": "Ви", - "app.userList.locked": "Обмеження", + "app.userList.locked": "Обмежено", "app.userList.label": "Список користувачів", "app.userList.toggleCompactView.label": "Увімкнути/вимкнути компактний вид", "app.userList.guest": "Гість", @@ -70,7 +70,7 @@ "app.userList.chatListItem.unreadSingular": "{0} нове повідомлення", "app.userList.chatListItem.unreadPlural": "{0} нових повідомлень", "app.userList.menu.chat.label": "Почати приватний чат", - "app.userList.menu.clearStatus.label": "Очистити статус", + "app.userList.menu.clearStatus.label": "Зняти статус", "app.userList.menu.removeUser.label": "Виключити користувача", "app.userList.menu.muteUserAudio.label": "Вимкнути мікрофон користувача", "app.userList.menu.unmuteUserAudio.label": "Увімкнути мікрофон користувача", @@ -79,51 +79,53 @@ "app.userList.menu.demoteUser.label": "Понизити до глядача", "app.userList.menu.unlockUser.label": "Зняти обмеження для {0}", "app.userList.menu.lockUser.label": "Обмежити можливості для {0}", - "app.userList.menu.directoryLookup.label": "Пошук в каталозі", + "app.userList.menu.directoryLookup.label": "Пошук у каталозі", "app.userList.menu.makePresenter.label": "Зробити ведучим", "app.userList.userOptions.manageUsersLabel": "Керувати користувачами", "app.userList.userOptions.muteAllLabel": "Вимкнути мікрофон всім", "app.userList.userOptions.muteAllDesc": "Вимкнути всім учасникам мікрофон", - "app.userList.userOptions.clearAllLabel": "Очистити всі статуси", - "app.userList.userOptions.clearAllDesc": "Очистить статуси всіх учасників", - "app.userList.userOptions.muteAllExceptPresenterLabel": "Вимкнути усім мікрофон, окрім модератора", - "app.userList.userOptions.muteAllExceptPresenterDesc": "Вимикає усім учасникам мікрофон, окрім модератора", - "app.userList.userOptions.unmuteAllLabel": "Скасувати вимкнений мікрофон", + "app.userList.userOptions.clearAllLabel": "Зняти всі статуси", + "app.userList.userOptions.clearAllDesc": "Зняти статуси усіх учасників", + "app.userList.userOptions.muteAllExceptPresenterLabel": "Вимкнути усім мікрофони, окрім модератора", + "app.userList.userOptions.muteAllExceptPresenterDesc": "Вимикає усім учасникам мікрофони, окрім модератора", + "app.userList.userOptions.unmuteAllLabel": "Увімкнути мікрофон", "app.userList.userOptions.unmuteAllDesc": "Скасовує вимкнення мікрофону", - "app.userList.userOptions.lockViewersLabel": "Обмеження можливостей користувачів", - "app.userList.userOptions.lockViewersDesc": "Обмежити веб-камеру, мікрофон, можливість писати в чат...", - "app.userList.userOptions.disableCam": "Веб-камери глядачів відключені", - "app.userList.userOptions.disableMic": "Мікрофони глядачів відключені", + "app.userList.userOptions.lockViewersLabel": "Обмеження доступних функцій", + "app.userList.userOptions.lockViewersDesc": "Обмежити вебкамеру, мікрофон, можливість писати в чат...", + "app.userList.userOptions.disableCam": "Вебкамери глядачів вимкнено", + "app.userList.userOptions.disableMic": "Мікрофони глядачів вимкнено", "app.userList.userOptions.disablePrivChat": "Приватний чат вимкнено", "app.userList.userOptions.disablePubChat": "Загальний чат вимкнено", - "app.userList.userOptions.disableNote": "Спільні нотатки тепер заблоковані", - "app.userList.userOptions.hideUserList": "Список користувачів тепер прихований від учасників", - "app.userList.userOptions.webcamsOnlyForModerator": "Веб-камери глядачів можуть бачити лише модератори (через налаштування блокування)", - "app.userList.content.participants.options.clearedStatus": "Статус очищено", - "app.userList.userOptions.enableCam": "Веб-камери глядачів увімкнено", + "app.userList.userOptions.disableNote": "Спільні нотатки тепер заблоковано", + "app.userList.userOptions.hideUserList": "Список користувачів тепер приховано від учасників", + "app.userList.userOptions.webcamsOnlyForModerator": "Вебкамери глядачів можуть бачити лише модератори (через налаштування блокування)", + "app.userList.content.participants.options.clearedStatus": "Статуси користувачів знято", + "app.userList.userOptions.enableCam": "Вебкамери глядачів увімкнено", "app.userList.userOptions.enableMic": "Мікрофони глядачів увімкнено", "app.userList.userOptions.enablePrivChat": "Приватний чат увімкнено", "app.userList.userOptions.enablePubChat": "Загальний чат увімкнено", "app.userList.userOptions.enableNote": "Спільні нотатки тепер увімкнено", "app.userList.userOptions.showUserList": "Список користувачів тепер видимий для учасників", - "app.userList.userOptions.enableOnlyModeratorWebcam": "Тепер можна активувати веб-камеру, всі бачитимуть вас", - "app.media.label": "Медіа", + "app.userList.userOptions.enableOnlyModeratorWebcam": "Тепер можна активувати вебкамеру, всі бачитимуть вас", + "app.media.label": "Мультимедії", "app.media.autoplayAlertDesc": "Дозволити доступ", "app.media.screenshare.start": "Демонстрація екрану розпочалася", "app.media.screenshare.end": "Демонстрацію екрану закінчено", - "app.media.screenshare.autoplayBlockedDesc": "Нам потрібен Ваш дозвіл, щоб показати Вам екран ведучого.", + "app.media.screenshare.unavailable": "Демонстрація екрану недоступна", + "app.media.screenshare.safariNotSupported": "Демонстрація екрану зараз не підтримується у Safari. Будь ласка, скористайтеся Firefox чи Google Chrome.", + "app.media.screenshare.autoplayBlockedDesc": "Нам потрібен дозвіл, щоб показати вам екран ведучого.", "app.media.screenshare.autoplayAllowLabel": "Показати екран, який демонструється", "app.screenshare.notAllowed": "Помилка: Дозвіл на доступ до екрану не було надано.", "app.screenshare.notSupportedError": "Помилка: Демонстрація екрану можлива тільки на безпечних (SSL) доменах", - "app.screenshare.notReadableError": "Помилка: При спробі захопити екран сталась помилка", + "app.screenshare.notReadableError": "Помилка: При спробі захопити екран сталася помилка", "app.screenshare.genericError": "Помилка: Відбулась помилка при демонстрації екрану. Будь ласка, спробуйте пізніше", "app.meeting.ended": "Ця сесія завершилася", "app.meeting.meetingTimeRemaining": "Залишилось часу зустрічі: {0}", "app.meeting.meetingTimeHasEnded": "Час закінчився. Зустріч буде закрито незабаром", - "app.meeting.endedMessage": "Ви будете перенаправлені на головний екран", + "app.meeting.endedMessage": "Переспрямування на головний екран", "app.meeting.alertMeetingEndsUnderOneMinute": "Зустріч закінчується через хвилину.", "app.meeting.alertBreakoutEndsUnderOneMinute": "Зустріч закінчується через хвилину.", - "app.presentation.hide": "Приховати презентацію", + "app.presentation.hide": "Згорнути презентацію", "app.presentation.notificationLabel": "Поточна презентація", "app.presentation.slideContent": "Вміст слайду", "app.presentation.startSlideContent": "Початок вмісту слайду", @@ -154,35 +156,38 @@ "app.presentation.presentationToolbar.fitToPage": "Підігнати під розмір сторінки", "app.presentation.presentationToolbar.goToSlide": "Слайд {0}", "app.presentationUploder.title": "Презентація", - "app.presentationUploder.message": "Як ведучий ви маєте можливість завантажувати будь-який офісний документ або PDF-файл. Для найкращих результатів ми рекомендуємо PDF-файл. Переконайтеся, що вибрано презентацію за допомогою прапорця праворуч.", + "app.presentationUploder.message": "Як ведучий ви маєте можливість завантажувати будь-який документ або PDF-файл. Для найкращих результатів ми рекомендуємо PDF-файл. Переконайтеся, що вибрано презентацію - скористайтеся прапорцем, який розташовано праворуч.", "app.presentationUploder.uploadLabel": "Завантажити", "app.presentationUploder.confirmLabel": "Підтвердити", "app.presentationUploder.confirmDesc": "Зберегти зміни та розпочати презентацію", - "app.presentationUploder.dismissLabel": "Відмінити", - "app.presentationUploder.dismissDesc": "Закрити вікно зображення та скасувати зміни", - "app.presentationUploder.dropzoneLabel": "Перетягніть файли сюди, щоб завантажити", - "app.presentationUploder.dropzoneImagesLabel": "Перетягніть зображення сюди, щоб завантажити", + "app.presentationUploder.dismissLabel": "Скасувати", + "app.presentationUploder.dismissDesc": "Закрити вікно зображення та скасувати ваші зміни", + "app.presentationUploder.dropzoneLabel": "Для завантаження перетягніть файли сюди", + "app.presentationUploder.dropzoneImagesLabel": "Для завантаження перетягніть зображення сюди", "app.presentationUploder.browseFilesLabel": "або виберіть файл", "app.presentationUploder.browseImagesLabel": "або виберіть/захопіть зображення", "app.presentationUploder.fileToUpload": "Буде завантажено ...", "app.presentationUploder.currentBadge": "Поточний", - "app.presentationUploder.rejectedError": "Вибрані файл(и) відхилено. Перевірте тип файлу(iв).", + "app.presentationUploder.rejectedError": "Неможливо завантажити вибрані файл(и). Перевірте тип файлу(iв).", "app.presentationUploder.upload.progress": "Завантаження ({0}%)", "app.presentationUploder.upload.413": "Файл занадто великий. Будь ласка, розділіть його на декілька файлів меншого розміру.", + "app.presentationUploder.upload.408": "Вичерпано час запиту дії токену для завантаження.", + "app.presentationUploder.upload.404": "404: Неправильний токен для завантаження", + "app.presentationUploder.upload.401": "Не вдалося здійснити запит токену для завантаження презентації.", "app.presentationUploder.conversion.conversionProcessingSlides": "Обробка сторінки {0} з {1}", "app.presentationUploder.conversion.genericConversionStatus": "Файл конвертується...", - "app.presentationUploder.conversion.generatingThumbnail": "Генерування мініатюр...", - "app.presentationUploder.conversion.generatedSlides": "Слайди генеруються...", - "app.presentationUploder.conversion.generatingSvg": "Генерування слайдів SVG...", - "app.presentationUploder.conversion.pageCountExceeded": "Перевищено кількість сторінок.Будь ласка, розділіть файл на декілька.", - "app.presentationUploder.conversion.officeDocConversionInvalid": "Не вийшло опрацювати документ Office. Будь ласка завантажте PDF натомість.", - "app.presentationUploder.conversion.officeDocConversionFailed": "Не вийшло опрацювати документ Office. Будь ласка завантажте PDF натомість.", - "app.presentationUploder.conversion.pdfHasBigPage": "Ми не змогли конвертувати PDF файл, будь ласка, спробуйте оптимізувати його", + "app.presentationUploder.conversion.generatingThumbnail": "Створення мініатюр...", + "app.presentationUploder.conversion.generatedSlides": "Слайди створюються...", + "app.presentationUploder.conversion.generatingSvg": "Створення слайдів SVG...", + "app.presentationUploder.conversion.pageCountExceeded": "Перевищено кількість сторінок. Будь ласка, розділіть файл на декілька.", + "app.presentationUploder.conversion.officeDocConversionInvalid": "Не вийшло опрацювати документ. Будь ласка, завантажте файл у форматі PDF.", + "app.presentationUploder.conversion.officeDocConversionFailed": "Не вийшло опрацювати документ. Будь ласка, завантажте файл у форматі PDF.", + "app.presentationUploder.conversion.pdfHasBigPage": "Ми не змогли конвертувати PDF-файл. Будь ласка, спробуйте оптимізувати його", "app.presentationUploder.conversion.timeout": "Ой, перетворення займає надто багато часу", "app.presentationUploder.conversion.pageCountFailed": "Не вийшло визначити кількість сторінок.", - "app.presentationUploder.isDownloadableLabel": "Не дозволяти скачувати презентацію", - "app.presentationUploder.isNotDownloadableLabel": "Дозволити скачувати презентацію", - "app.presentationUploder.removePresentationLabel": "Видалити презентацію", + "app.presentationUploder.isDownloadableLabel": "Заборонити звантаження презентації", + "app.presentationUploder.isNotDownloadableLabel": "Дозволити звантажувати презентацію", + "app.presentationUploder.removePresentationLabel": "Вилучити презентацію", "app.presentationUploder.setAsCurrentPresentation": "Встановити презентацію поточною", "app.presentationUploder.tableHeading.filename": "Ім'я файлу", "app.presentationUploder.tableHeading.options": "Опції", @@ -201,11 +206,11 @@ "app.poll.waitingLabel": "Очікування на відповіді ({0} / {1})", "app.poll.ariaInputCount": "Опція спеціального опитування {0} з {1}", "app.poll.customPlaceholder": "Додати варіант опитування", - "app.poll.noPresentationSelected": "Не вибрано жодної презентації! Виберіть одну.", + "app.poll.noPresentationSelected": "Не вибрано жодної презентації! Виберіть щонайменше одну.", "app.poll.clickHereToSelect": "Натисніть тут, щоб вибрати", - "app.poll.t": "Вірно", + "app.poll.t": "Правильно", "app.poll.f": "Хибно", - "app.poll.tf": "Правда / Неправда", + "app.poll.tf": "Правильно / хибно", "app.poll.y": "Так", "app.poll.n": "Ні", "app.poll.yn": "Так / Ні", @@ -213,7 +218,7 @@ "app.poll.a3": "A / B / C", "app.poll.a4": "A / B / C / D", "app.poll.a5": "A / B / C / D / E", - "app.poll.answer.true": "Вірно", + "app.poll.answer.true": "Правильно", "app.poll.answer.false": "Хибно", "app.poll.answer.yes": "Так", "app.poll.answer.no": "Ні", @@ -230,10 +235,10 @@ "app.failedMessage": "Вибачте, проблеми з підключенням до сервера.", "app.downloadPresentationButton.label": "Скачати оригінал презентації", "app.connectingMessage": "З'єднання...", - "app.waitingMessage": "Втрачено з'еднання. Спроба повторного підключення через {0} секунд...", + "app.waitingMessage": "Втрачено з'єднання. Спроба повторного з'єднання через {0} секунд...", "app.retryNow": "Повторити", "app.navBar.settingsDropdown.optionsLabel": "Опції", - "app.navBar.settingsDropdown.fullscreenLabel": "Розгорнути на весь екран", + "app.navBar.settingsDropdown.fullscreenLabel": "На весь екран", "app.navBar.settingsDropdown.settingsLabel": "Відкрити параметри", "app.navBar.settingsDropdown.aboutLabel": "Про програму", "app.navBar.settingsDropdown.leaveSessionLabel": "Вихід", @@ -241,16 +246,16 @@ "app.navBar.settingsDropdown.fullscreenDesc": "Розгорнути меню параметрів на весь екран", "app.navBar.settingsDropdown.settingsDesc": "Змінити загальні параметри", "app.navBar.settingsDropdown.aboutDesc": "Показати інформацію про клієнта", - "app.navBar.settingsDropdown.leaveSessionDesc": "Залишити конференцію", + "app.navBar.settingsDropdown.leaveSessionDesc": "Вийти", "app.navBar.settingsDropdown.exitFullscreenDesc": "Вийти з повноекранного режиму", "app.navBar.settingsDropdown.hotkeysLabel": "Гарячі клавіші", - "app.navBar.settingsDropdown.hotkeysDesc": "Перепис доступних гарячих клавiш", + "app.navBar.settingsDropdown.hotkeysDesc": "Перелік гарячих клавiш", "app.navBar.settingsDropdown.helpLabel": "Допомога", - "app.navBar.settingsDropdown.helpDesc": "Перенаправляє користувача з відеоуроками (відкривається нова вкладка)", + "app.navBar.settingsDropdown.helpDesc": "Переспрямовує користувача до відео з інструкціями (нова вкладка)", "app.navBar.settingsDropdown.endMeetingDesc": "Завершити зустріч", "app.navBar.settingsDropdown.endMeetingLabel": "Завершити зустріч", "app.navBar.userListToggleBtnLabel": "Увімкнути/вимкнути список користувачів", - "app.navBar.toggleUserList.ariaLabel": "Увімкнути/вимкнути користувачів та повідомлення", + "app.navBar.toggleUserList.ariaLabel": "Перемкнути користувачів та повідомлення", "app.navBar.toggleUserList.newMessages": "зі сповіщенням про нове повідомлення", "app.navBar.recording": "Ця сесія записується", "app.navBar.recording.on": "Записується", @@ -265,9 +270,9 @@ "app.about.title": "Про програму", "app.about.version": "Збірка клієнта:", "app.about.copyright": "Авторське право:", - "app.about.confirmLabel": "OK", - "app.about.confirmDesc": "OK", - "app.about.dismissLabel": "Відміна", + "app.about.confirmLabel": "Гаразд", + "app.about.confirmDesc": "Гаразд", + "app.about.dismissLabel": "Скасувати", "app.about.dismissDesc": "Закрити інформацію про клієнта", "app.actionsBar.changeStatusLabel": "Змінити статус", "app.actionsBar.muteLabel": "Вимкнути мікрофон", @@ -275,14 +280,14 @@ "app.actionsBar.camOffLabel": "Вимкнути камеру", "app.actionsBar.raiseLabel": "Підняти", "app.actionsBar.label": "Панель дій", - "app.actionsBar.actionsDropdown.restorePresentationLabel": "Повернути презентацію", + "app.actionsBar.actionsDropdown.restorePresentationLabel": "Розгорнути презентацію", "app.actionsBar.actionsDropdown.restorePresentationDesc": "Кнопка для повернення презентації, яку було закрито", "app.screenshare.screenShareLabel" : "Демонстрація екрану", "app.submenu.application.applicationSectionTitle": "Застосунок", - "app.submenu.application.animationsLabel": "Анімації", - "app.submenu.application.audioAlertLabel": "Аудіо сповіщення для чату", - "app.submenu.application.pushAlertLabel": "Спливаючі сповіщення для чату", - "app.submenu.application.userJoinAudioAlertLabel": "Аудіо сповіщення приєднання користувача", + "app.submenu.application.animationsLabel": "Ефекти", + "app.submenu.application.audioAlertLabel": "Звукове сповіщення чату", + "app.submenu.application.pushAlertLabel": "Спливаючі сповіщення чату", + "app.submenu.application.userJoinAudioAlertLabel": "Звукове сповіщення приєднання користувача", "app.submenu.application.userJoinPushAlertLabel": "Спливаючі сповіщення приєднання користувача", "app.submenu.application.fontSizeControlLabel": "Розмір шрифту", "app.submenu.application.increaseFontBtnLabel": "Збільшити шрифт застосунку", @@ -290,29 +295,29 @@ "app.submenu.application.currentSize": "зараз {0}", "app.submenu.application.languageLabel": "Мова застосунку", "app.submenu.application.languageOptionLabel": "Вибрати мову", - "app.submenu.application.noLocaleOptionLabel": "Відсутні доступні переклади", + "app.submenu.application.noLocaleOptionLabel": "Відсутні переклади", "app.submenu.audio.micSourceLabel": "Джерело мікрофона", "app.submenu.audio.speakerSourceLabel": "Джерело динаміків", - "app.submenu.audio.streamVolumeLabel": "Гучність аудіо потоку", + "app.submenu.audio.streamVolumeLabel": "Гучність звукового потоку", "app.submenu.video.title": "Відео", "app.submenu.video.videoSourceLabel": "Джерело відео", "app.submenu.video.videoOptionLabel": "Виберіть джерело відео", "app.submenu.video.videoQualityLabel": "Якість відео", "app.submenu.video.qualityOptionLabel": "Виберіть якість відео", - "app.submenu.video.participantsCamLabel": "Перегляд веб-камер учасників", + "app.submenu.video.participantsCamLabel": "Перегляд вебкамер учасників", "app.settings.applicationTab.label": "Застосунок", - "app.settings.audioTab.label": "Аудіо", + "app.settings.audioTab.label": "Звук", "app.settings.videoTab.label": "Відео", "app.settings.usersTab.label": "Учасники", "app.settings.main.label": "Налаштування", - "app.settings.main.cancel.label": "Відмінити", - "app.settings.main.cancel.label.description": "Відміняє зміни та закриває меню налаштувань", + "app.settings.main.cancel.label": "Скасувати", + "app.settings.main.cancel.label.description": "Скасовує зміни та закриває меню налаштувань", "app.settings.main.save.label": "Зберегти", "app.settings.main.save.label.description": "Зберігає зміни та закриває меню налаштувань", "app.settings.dataSavingTab.label": "Збереження даних", - "app.settings.dataSavingTab.webcam": "Увімкнути веб-камери", - "app.settings.dataSavingTab.screenShare": "Увімкнути демонстрацію робочого столу", - "app.settings.dataSavingTab.description": "Щоб зберегти пропускну здатність, виберіть що зараз буде відображатись.", + "app.settings.dataSavingTab.webcam": "Увімкнути вебкамери", + "app.settings.dataSavingTab.screenShare": "Увімкнути демонстрацію стільниці", + "app.settings.dataSavingTab.description": "Для заощадження трафіку виберіть те, що потрібно показувати на екрані.", "app.settings.save-notification.label": "Налаштування збережено", "app.switch.onLabel": "УВІМК.", "app.switch.offLabel": "ВИМК.", @@ -320,49 +325,49 @@ "app.talkingIndicator.isTalking" : "{0} говорить", "app.talkingIndicator.wasTalking" : "{0} закінчив говорити", "app.actionsBar.actionsDropdown.actionsLabel": "Дії", - "app.actionsBar.actionsDropdown.presentationLabel": "Завантажити презентацію", - "app.actionsBar.actionsDropdown.initPollLabel": "Розпочати опитування", + "app.actionsBar.actionsDropdown.presentationLabel": "Завантажити", + "app.actionsBar.actionsDropdown.initPollLabel": "Опитування", "app.actionsBar.actionsDropdown.desktopShareLabel": "Демонструвати ваш екран", "app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Демонстрація екрану заблокована", "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Зупинити демонстрацію екрану", "app.actionsBar.actionsDropdown.presentationDesc": "Завантажити вашу презентацію", - "app.actionsBar.actionsDropdown.initPollDesc": "Розпочати опитування", + "app.actionsBar.actionsDropdown.initPollDesc": "Опитування", "app.actionsBar.actionsDropdown.desktopShareDesc": "Демонструвати ваш екран іншим учасникам", "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Зупинити демонстрацію екрану", "app.actionsBar.actionsDropdown.pollBtnLabel": "Розпочати опитування", - "app.actionsBar.actionsDropdown.pollBtnDesc": "Вкл/Викл панель опитування", + "app.actionsBar.actionsDropdown.pollBtnDesc": "Перемкнути панель опитування", "app.actionsBar.actionsDropdown.saveUserNames": "Зберегти імена користувачів", "app.actionsBar.actionsDropdown.createBreakoutRoom": "Створити кімнати для учасників", "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "створити кімнати і розділити учасників між ними ", "app.actionsBar.actionsDropdown.captionsLabel": "Написати приховані субтитри", - "app.actionsBar.actionsDropdown.captionsDesc": "Включає панель субтитрів", + "app.actionsBar.actionsDropdown.captionsDesc": "Вмикає панель субтитрів", "app.actionsBar.actionsDropdown.takePresenter": "Стати презентатором", - "app.actionsBar.actionsDropdown.takePresenterDesc": "Встановити себе ведучим/презентером", - "app.actionsBar.emojiMenu.statusTriggerLabel": "Задати статус", + "app.actionsBar.actionsDropdown.takePresenterDesc": "Встановити себе ведучим/презентатором", + "app.actionsBar.emojiMenu.statusTriggerLabel": "Встановити статус", "app.actionsBar.emojiMenu.awayLabel": "Відійшов", - "app.actionsBar.emojiMenu.awayDesc": "Змінює ваш статус на \\\"Відійшов\\\"", - "app.actionsBar.emojiMenu.raiseHandLabel": "Підняти руку", - "app.actionsBar.emojiMenu.raiseHandDesc": "Підняти руку щоб поставити питання", + "app.actionsBar.emojiMenu.awayDesc": "Змінює ваш статус на \"Відійшов\"", + "app.actionsBar.emojiMenu.raiseHandLabel": "Піднято руку", + "app.actionsBar.emojiMenu.raiseHandDesc": "Підняти руку, щоб поставити питання", "app.actionsBar.emojiMenu.neutralLabel": "Не визначився", - "app.actionsBar.emojiMenu.neutralDesc": "Змінює ваш статус на \\\"Не визначився\\\"", + "app.actionsBar.emojiMenu.neutralDesc": "Змінює ваш статус на \"Не визначився\"", "app.actionsBar.emojiMenu.confusedLabel": "Збентежений", - "app.actionsBar.emojiMenu.confusedDesc": "Змінює ваш статус на \\\"Збентежений\\\"", + "app.actionsBar.emojiMenu.confusedDesc": "Змінює ваш статус на \"Збентежений\"", "app.actionsBar.emojiMenu.sadLabel": "Сумний", - "app.actionsBar.emojiMenu.sadDesc": "Змінює ваш статус на \\\"Сумний\\\"", + "app.actionsBar.emojiMenu.sadDesc": "Змінює ваш статус на \"Сумний\"", "app.actionsBar.emojiMenu.happyLabel": "Щасливий", - "app.actionsBar.emojiMenu.happyDesc": "Змінює ваш статус на \\\"Щасливий\\\"", - "app.actionsBar.emojiMenu.noneLabel": "Очистити статус", - "app.actionsBar.emojiMenu.noneDesc": "Очищує ваш статус", + "app.actionsBar.emojiMenu.happyDesc": "Змінює ваш статус на \"Щасливий\"", + "app.actionsBar.emojiMenu.noneLabel": "Зняти статус", + "app.actionsBar.emojiMenu.noneDesc": "Знімає ваш статус", "app.actionsBar.emojiMenu.applauseLabel": "Оплески", - "app.actionsBar.emojiMenu.applauseDesc": "Змінює ваш статус на \\\"Оплески\\\"", + "app.actionsBar.emojiMenu.applauseDesc": "Змінює ваш статус на \"Оплески\"", "app.actionsBar.emojiMenu.thumbsUpLabel": "Подобається", - "app.actionsBar.emojiMenu.thumbsUpDesc": "Змінює ваш статус на \\\"Подобається\\\"", + "app.actionsBar.emojiMenu.thumbsUpDesc": "Змінює ваш статус на \"Подобається\"", "app.actionsBar.emojiMenu.thumbsDownLabel": "Не подобається", - "app.actionsBar.emojiMenu.thumbsDownDesc": "Змінює ваш статус на \\\"Не подобається\\\"", - "app.actionsBar.currentStatusDesc": "нинішній статус {0}", + "app.actionsBar.emojiMenu.thumbsDownDesc": "Змінює ваш статус на \"Не подобається\"", + "app.actionsBar.currentStatusDesc": "поточний статус {0}", "app.actionsBar.captions.start": "Почати перегляд субтитрів", "app.actionsBar.captions.stop": "Зупинити перегляд субтитрів", - "app.audioNotification.audioFailedError1001": "WebSocket відключено (Помилка 1001)", + "app.audioNotification.audioFailedError1001": "WebSocket від'єднано (Помилка 1001)", "app.audioNotification.audioFailedError1002": "Не можу створити WebSocket з'єднання (Помилка 1002)", "app.audioNotification.audioFailedError1003": "Версія браузера не підтримується (Помилка 1003)", "app.audioNotification.audioFailedError1004": "Помилка у виклилику (reason={0}) (Помилка 1004)", @@ -374,78 +379,78 @@ "app.audioNotification.audioFailedError1010": "Час на узгодження з'єднання вичерпано ( ICE помилка 1010)", "app.audioNotification.audioFailedError1011": "Час з'єднання вийшов (ICE помилка 1011)", "app.audioNotification.audioFailedError1012": "З'єднання закрите (ICE помилка 1012)", - "app.audioNotification.audioFailedMessage": "Не вдалося встановити аудіо з'єднання", + "app.audioNotification.audioFailedMessage": "Не вдалося встановити голосове з'єднання", "app.audioNotification.mediaFailedMessage": "Помилка getUserMicMedia, дозволені тільки безпечні джерела", "app.audioNotification.closeLabel": "Закрити", - "app.audioNotificaion.reconnectingAsListenOnly": "Аудіо було заблоковано модератором, ви підключилися лише як слухач", - "app.breakoutJoinConfirmation.title": "Приєднатись до зустрічі", + "app.audioNotificaion.reconnectingAsListenOnly": "Звук було заблоковано модератором, вас приєднано лише як слухача", + "app.breakoutJoinConfirmation.title": "Приєднатися до зустрічі", "app.breakoutJoinConfirmation.message": "Чи хочете ви приєднатися до", "app.breakoutJoinConfirmation.confirmDesc": "Приєднує вас до зустрічі", "app.breakoutJoinConfirmation.dismissLabel": "Скасувати", "app.breakoutJoinConfirmation.dismissDesc": "Закриває та відмовляє в приєднанні до зустрічі", - "app.breakoutJoinConfirmation.freeJoinMessage": "Виберіть конференцію до якої бажаєте під’єднатися", + "app.breakoutJoinConfirmation.freeJoinMessage": "Виберіть конференцію, до якої бажаєте під’єднатися", "app.breakoutTimeRemainingMessage": "Час до закінчення конференції: {0}", "app.breakoutWillCloseMessage": "Час вичерпано. Конференцію невдовзі буде закрито", - "app.calculatingBreakoutTimeRemaining": "Підрахунок часу що залишився...", - "app.audioModal.ariaTitle": "Вікно підключення до аудіо-конференції", + "app.calculatingBreakoutTimeRemaining": "Підрахунок часу, що залишився...", + "app.audioModal.ariaTitle": "Вікно підключення до голосової конференції", "app.audioModal.microphoneLabel": "Мікрофон", "app.audioModal.listenOnlyLabel": "Тільки слухати", - "app.audioModal.audioChoiceLabel": "Як ви хочете увійти в аудіо-конференцію?", - "app.audioModal.iOSBrowser": "Аудіо/Відео не підтримується", - "app.audioModal.iOSErrorDescription": "Наразі аудіо та відео в Chrome для iOS не підтримуються.", + "app.audioModal.audioChoiceLabel": "Як ви хочете приєднатися до голосової конференції?", + "app.audioModal.iOSBrowser": "Звук/відео не підтримується", + "app.audioModal.iOSErrorDescription": "Наразі звук та відео у Chrome для iOS не підтримуються.", "app.audioModal.iOSErrorRecommendation": "Ми рекомендуємо використовувати Safari для iOS.", - "app.audioModal.audioChoiceDesc": "Виберіть як брати участь в аудіоконференції", + "app.audioModal.audioChoiceDesc": "Виберіть спосіб участі у голосовій конференції", "app.audioModal.unsupportedBrowserLabel": "Схоже, ви використовуєте браузер, який повністю не підтримується. Для повної підтримки використовуйте {0} або {1}.", "app.audioModal.closeLabel": "Закрити", "app.audioModal.yes": "Так", "app.audioModal.no": "Ні", - "app.audioModal.yes.arialabel" : "Звучить ехо", - "app.audioModal.no.arialabel" : "Ехо не звучить", - "app.audioModal.echoTestTitle": "Це приватний ехо-тест. Промовте кілька слів. Чи чуєте ви себе в динаміках?", - "app.audioModal.settingsTitle": "Змінити налаштування аудіо", - "app.audioModal.helpTitle": "З'явилися проблеми з вашими аудіоприладами", - "app.audioModal.helpText": "Чи надали ви BigBlueButton дозвіл на доступ до мікрофона? Зверніть увагу, що коли ви намагаєтеся приєднатися до аудіо-конференції, має з'явитися діалогове вікно, в якому Вас запитають дозвіл на підключення медіа-пристрою, будь ласка, надайте його, щоб приєднатися до аудіо-конференції. Якщо цього не відбулося, спробуйте змінити дозволи мікрофона у налаштуваннях вашого веб-переглядача.", + "app.audioModal.yes.arialabel" : "Чутно луну", + "app.audioModal.no.arialabel" : "Луну не чутно", + "app.audioModal.echoTestTitle": "Це приватна перевірка луни. Промовте кілька слів. Чи чуєте ви себе в динаміках?", + "app.audioModal.settingsTitle": "Змінити налаштування звуку", + "app.audioModal.helpTitle": "З'явилися проблеми з пристроями відтворення звуку", + "app.audioModal.helpText": "Чи ви надали BigBlueButton дозвіл на доступ до мікрофона? Зверніть увагу, що коли ви намагаєтеся приєднатися до голосової конференції, має з'явитися діалогове вікно, в якому вас запитають про дозвіл на під'єднання мультимедійних пристроїв. Будь ласка, прийміть це, щоб встановити голосовий зв'язок. Якщо цього не відбулося спробуйте змінити дозволи мікрофона у налаштуваннях вашого переглядача.", "app.audioModal.help.noSSL": "Сторінка незахищена. Щоб дозволити доступ до мікрофона, сторінка повинна обслуговуватися через HTTPS. Будь ласка, зв'яжіться з адміністратором сервера.", - "app.audioModal.help.macNotAllowed": "Схоже, системні настройки Mac блокують доступ до Вашого мікрофону. Відкрийте System Preferences> Security & Privacy> Privacy> Microphone, і переконайтеся, що використовуваний Вами браузер відзначений.", + "app.audioModal.help.macNotAllowed": "Схоже, системні налаштування Mac блокують доступ до вашого мікрофону. Відкрийте System Preferences > Security & Privacy > Privacy > Microphone та переконайтеся, що вибрано переглядач, яким ви користуєтеся.", "app.audioModal.audioDialTitle": "Приєднатися за допомогою телефону", "app.audioDial.audioDialDescription": "Наберіть номер", - "app.audioDial.audioDialConfrenceText": "і введіть PIN-код конференції:", - "app.audioModal.autoplayBlockedDesc": "Нам необхідний Ваш дозвіл на відтворення аудіо", + "app.audioDial.audioDialConfrenceText": "та введіть PIN-код конференції:", + "app.audioModal.autoplayBlockedDesc": "Нам необхідний дозвіл на відтворення звуку", "app.audioModal.playAudio": "Відтворювати звук", "app.audioModal.playAudio.arialabel" : "Відтворювати звук", "app.audioDial.tipIndicator": "Підказка", - "app.audioDial.tipMessage": "Натисніть кнопку '0' на телефоні, щоб відключити / включити свій мікрофон", - "app.audioModal.connecting": "Підключення", - "app.audioModal.connectingEchoTest": "Підключення до ехо тесту", - "app.audioManager.joinedAudio": "Ви приєдналися до аудіоконференції", - "app.audioManager.joinedEcho": "Ви приєдналися до ехо тесту", - "app.audioManager.leftAudio": "Ви покинули аудіо конференцію", - "app.audioManager.reconnectingAudio": "Спроба повторно підключити аудіо", + "app.audioDial.tipMessage": "Натисніть кнопку '0' на телефоні, щоб вимкнути чи увімкнути мікрофон", + "app.audioModal.connecting": "Приєднання", + "app.audioModal.connectingEchoTest": "Приєднання до перевірки на луну", + "app.audioManager.joinedAudio": "Ви приєдналися до голосової конференції", + "app.audioManager.joinedEcho": "Ви приєдналися до перевірки на луну", + "app.audioManager.leftAudio": "Ви вийшли з голосової конференції", + "app.audioManager.reconnectingAudio": "Спроба повторно приєднати голос", "app.audioManager.genericError": "Помилка: Щось пішло не так, будь ласка, спробуйте ще раз", "app.audioManager.connectionError": "Помилка: Підключення не вдалося", "app.audioManager.requestTimeout": "Помилка: Час очікування підключення вичерпано", - "app.audioManager.invalidTarget": "Помилка: Спроба запросити що-небудь від невірної цілі", - "app.audioManager.mediaError": "Помилка: Виникли проблеми з вашими аудіопристроями", - "app.audio.joinAudio": "Приєднатися до аудіоконференції", - "app.audio.leaveAudio": "Залишити аудіоконференцію", - "app.audio.enterSessionLabel": "Підключитися до сеансу", + "app.audioManager.invalidTarget": "Помилка: Спроба запросити до неправильного призначення", + "app.audioManager.mediaError": "Помилка: Виникли проблеми з пристроями відтворення звуку", + "app.audio.joinAudio": "Приєднатися до голосової конференції ", + "app.audio.leaveAudio": "Вийти", + "app.audio.enterSessionLabel": "Приєднатися до сеансу", "app.audio.playSoundLabel": "Програти звук", "app.audio.backLabel": "Назад", "app.audio.audioSettings.titleLabel": "Виберіть налаштування звуку", - "app.audio.audioSettings.descriptionLabel": "Зверніть увагу, що в вашому браузері з'явиться діалогове вікно, що вимагає дозволу вашого мікрофона.", + "app.audio.audioSettings.descriptionLabel": "Зверніть увагу, що у вашому переглядачі з'явиться діалогове вікно для надання дозволу на доступ до мікрофона.", "app.audio.audioSettings.microphoneSourceLabel": "Джерело мікрофона", "app.audio.audioSettings.speakerSourceLabel": "Джерело динаміків", - "app.audio.audioSettings.microphoneStreamLabel": "Гучність вашого аудіопотоку", + "app.audio.audioSettings.microphoneStreamLabel": "Гучність вашого звукового потоку", "app.audio.audioSettings.retryLabel": "Повторити", - "app.audio.listenOnly.backLabel": "Незад", + "app.audio.listenOnly.backLabel": "Назад", "app.audio.listenOnly.closeLabel": "Закрити", - "app.audio.permissionsOverlay.title": "Дозволити BigBlueButton використовувати ваші медіа-пристрої", - "app.audio.permissionsOverlay.hint": "Нам потрібно, щоб ви дозволили нам використовувати свої медіа-пристрої, щоб приєднатись до голосової конференції :)", - "app.error.removed": "Ви були вилучені з конференції", + "app.audio.permissionsOverlay.title": "Дозволити BigBlueButton використовувати ваші мультимедійні пристрої", + "app.audio.permissionsOverlay.hint": "Нам потрібно, щоб ви дозволили використовувати мультимедійні пристрої, щоб приєднатись до голосової конференції :)", + "app.error.removed": "Вас було вилучено з конференції", "app.error.meeting.ended": "Ви вийшли з конференції", - "app.meeting.logout.duplicateUserEjectReason": "Дубльований користувач намагається приєднатися до зустрічі", + "app.meeting.logout.duplicateUserEjectReason": "Користувач з таким же ім'ям намагається приєднатися до зустрічі", "app.meeting.logout.permissionEjectReason": "Вилучено через порушення дозволу", - "app.meeting.logout.ejectedFromMeeting": "Ви були вилучені з зустрiчi", + "app.meeting.logout.ejectedFromMeeting": "Вас було вилучено із зустрічі", "app.meeting.logout.validateTokenFailedEjectReason": "Не вдалося перевірити токен авторизації", "app.meeting.logout.userInactivityEjectReason": "Користувач неактивний занадто довго", "app.meeting-ended.rating.legendLabel": "Рейтинг відгуків", @@ -464,9 +469,9 @@ "app.error.500": "Ой, щось пішло не так", "app.error.leaveLabel": "Увійдіть знову", "app.error.fallback.presentation.title": "Виникла помилка", - "app.error.fallback.presentation.description": "Він зареєстрований. Спробуйте перезавантажити сторінку.", + "app.error.fallback.presentation.description": "Уже увійшли. Спробуйте перезавантажити сторінку.", "app.error.fallback.presentation.reloadButton": "Перезавантажити", - "app.guest.waiting": "Очікування схвалення для приєднання", + "app.guest.waiting": "Очікування схвалення приєднання", "app.userList.guest.waitingUsers": "Очікування користувачів", "app.userList.guest.waitingUsersTitle": "Керування користувачами", "app.userList.guest.optionTitle": "Перегляньте очікуваних користувачів", @@ -474,19 +479,19 @@ "app.userList.guest.allowAllGuests": "Дозволити всім гостям", "app.userList.guest.allowEveryone": "Дозволити всім", "app.userList.guest.denyEveryone": "Заборонити всім", - "app.userList.guest.pendingUsers": "{0} Користувачів в очікуванні", - "app.userList.guest.pendingGuestUsers": "{0} Гостей в очікуванні", - "app.userList.guest.pendingGuestAlert": "Приєднався до сесії та очікує Вашого дозволу", + "app.userList.guest.pendingUsers": "{0} користувачів в очікуванні", + "app.userList.guest.pendingGuestUsers": "{0} гостей в очікуванні", + "app.userList.guest.pendingGuestAlert": "Приєднався до сесії та очікує вашого схвалення", "app.userList.guest.rememberChoice": "Запам'ятати вибір", - "app.user-info.title": "Пошук в каталозі", + "app.user-info.title": "Пошук у каталозі", "app.toast.breakoutRoomEnded": "Конференція закінчилася. Будь ласка, приєднайтесь знову до аудіо конференції.", - "app.toast.chat.public": "Нове повідомлення у публічному чаті", + "app.toast.chat.public": "Нове повідомлення у загальному чаті", "app.toast.chat.private": "Нове повідомлення у приватному чаті", "app.toast.chat.system": "Система", - "app.toast.clearedEmoji.label": "Статус емодзі очищено", - "app.toast.setEmoji.label": "Статус емодзі встановлено: {0}", - "app.toast.meetingMuteOn.label": "Всім користувачам виключено мікрофони", - "app.toast.meetingMuteOff.label": "Блокування мікрофону виключено", + "app.toast.clearedEmoji.label": "Статус знято", + "app.toast.setEmoji.label": "{0}", + "app.toast.meetingMuteOn.label": "Всім користувачам вимкнено мікрофони", + "app.toast.meetingMuteOff.label": "Блокування мікрофону вимкнено", "app.notification.recordingStart": "Цей сеанс наразі записується", "app.notification.recordingStop": "Цей сеанс не записується", "app.notification.recordingPaused": "Цей сеанс більше не записується", @@ -499,8 +504,8 @@ "app.shortcut-help.closeLabel": "Закрити", "app.shortcut-help.closeDesc": "Закриває вікно клавіш швидкого доступу", "app.shortcut-help.openOptions": "Відкриває параметри", - "app.shortcut-help.toggleUserList": "Вмикає список користувачів", - "app.shortcut-help.toggleMute": "Вмикає / Вимикає мікрофон", + "app.shortcut-help.toggleUserList": "Перемикає список користувачів", + "app.shortcut-help.toggleMute": "Перемикає стан мікрофону", "app.shortcut-help.togglePublicChat": "Вмикає загальний чат (Список користувачів має бути відкритим)", "app.shortcut-help.hidePrivateChat": "Приховує приватний чат", "app.shortcut-help.closePrivateChat": "Закриває приватний чат", @@ -509,66 +514,66 @@ "app.shortcut-help.togglePan": "Активувати інструмент панорамування (Ведучий)", "app.shortcut-help.nextSlideDesc": "Наступний слайд (Ведучий)", "app.shortcut-help.previousSlideDesc": "Попередній слайд (Ведучий)", - "app.lock-viewers.title": "Обмеження можливостей користувачів", - "app.lock-viewers.description": "Ці налаштування дозволяють заборонити учасникам використовувати певні функції", + "app.lock-viewers.title": "Обмеження доступних функцій", + "app.lock-viewers.description": "Ці налаштування дозволяють обмежити учасників у доступі до певних функцій", "app.lock-viewers.featuresLable": "Функція", - "app.lock-viewers.lockStatusLabel": "Статус", - "app.lock-viewers.webcamLabel": "Транслювати веб-камеру", - "app.lock-viewers.otherViewersWebcamLabel": "Бачити веб-камери інших глядачів", - "app.lock-viewers.microphoneLable": "Увімкнути мікрофон", - "app.lock-viewers.PublicChatLabel": "Надіслати повідомлення у загальному чаті", - "app.lock-viewers.PrivateChatLable": "Надіслати повідомлення у приватному чаті", - "app.lock-viewers.notesLabel": "Редагувати спільні примітки", - "app.lock-viewers.userListLabel": "Подивитися інших учасників в списку користувачів", + "app.lock-viewers.lockStatusLabel": "Стан", + "app.lock-viewers.webcamLabel": "Увімкнути вебкамеру", + "app.lock-viewers.otherViewersWebcamLabel": "Бачити вебкамери інших глядачів", + "app.lock-viewers.microphoneLable": "Вмикати свій мікрофон", + "app.lock-viewers.PublicChatLabel": "Надсилати повідомлення у загальному чаті", + "app.lock-viewers.PrivateChatLable": "Надсилати повідомлення у приватному чаті", + "app.lock-viewers.notesLabel": "Редагувати спільні нотатки", + "app.lock-viewers.userListLabel": "Переглядати учасників у списку користувачів", "app.lock-viewers.ariaTitle": "Вікно налаштування блокування користувачів", "app.lock-viewers.button.apply": "Застосувати", - "app.lock-viewers.button.cancel": "Відхилити", - "app.lock-viewers.locked": "Обмеження", + "app.lock-viewers.button.cancel": "Скасувати", + "app.lock-viewers.locked": "Обмежено", "app.lock-viewers.unlocked": "Розблокований", "app.recording.startTitle": "Почати запис", "app.recording.stopTitle": "Поставити запис на паузу", "app.recording.resumeTitle": "Відновити запис", - "app.recording.startDescription": "Ви зможете натиснути пізніше ще раз кнопку запису, щоб призупинити запис.", - "app.recording.stopDescription": "Ви впевнені, що хочете призупинити запис? Ви зможете відновити запис, повторно натиснувши кнопку запису.", + "app.recording.startDescription": "Для паузи запису, будь ласка, натисніть повторно кнопку запису.", + "app.recording.stopDescription": "Ви впевнені, що хочете призупинити запис? Ви зможете відновити запис - для цього ще раз натисніть на кнопку запису.", "app.videoPreview.cameraLabel": "Камера", "app.videoPreview.profileLabel": "Якість", "app.videoPreview.cancelLabel": "Відмінити", "app.videoPreview.closeLabel": "Закрити", - "app.videoPreview.findingWebcamsLabel": "Пошук веб-камер", + "app.videoPreview.findingWebcamsLabel": "Пошук вебкамер", "app.videoPreview.startSharingLabel": "Почати трансляцію", - "app.videoPreview.webcamOptionLabel": "Виберіть веб-камеру", - "app.videoPreview.webcamPreviewLabel": "Попередній перегляд веб-камери", - "app.videoPreview.webcamSettingsTitle": "Налаштування веб-камери", - "app.videoPreview.webcamNotFoundLabel": "Веб-камеру не знайдено", - "app.videoPreview.profileNotFoundLabel": "Не знайдено підтримуваних веб-камер", - "app.video.joinVideo": "Транслювати веб-камеру", - "app.video.leaveVideo": "Припинити транслювати веб-камеру", + "app.videoPreview.webcamOptionLabel": "Виберіть вебкамеру", + "app.videoPreview.webcamPreviewLabel": "Попередній перегляд вебкамери", + "app.videoPreview.webcamSettingsTitle": "Налаштування вебкамери", + "app.videoPreview.webcamNotFoundLabel": "Вебкамеру не знайдено", + "app.videoPreview.profileNotFoundLabel": "Не знайдено підтримувану вебкамеру", + "app.video.joinVideo": "Увімкнути вебкамеру", + "app.video.leaveVideo": "Вимкнути вебкамеру", "app.video.iceCandidateError": "Помилка додавання ICE кандидату", "app.video.iceConnectionStateError": "Не вдалося з'єднатися (ICE помилка 1107)", - "app.video.permissionError": "Помилка при трансляції веб-камери. Будь ласка перевірте дозволи", - "app.video.sharingError": "Помилка при трансляції веб-камери", - "app.video.notFoundError": "Не вдалося знайти веб-камеру. Переконайтеся, що вона під'єднана", - "app.video.notAllowed": "Відсутній дозвіл на трансляцію веб-камери, будь ласка, переконайтеся, що ваш браузер має необхідні дозволи", - "app.video.notSupportedError": "Можна транслювати веб-камеру лише з безпечних джерел, переконайтеся, що сертифікат SSL дійсний", - "app.video.notReadableError": "Не вдалося отримати відео з веб-камери. Будь ласка, переконайтеся, що інша програма не використовує веб-камеру", - "app.video.mediaFlowTimeout1020": "Медіа не досягає сервера (помилка 1020)", - "app.video.suggestWebcamLock": "Примусово заблокувати веб-камери учасникам?", + "app.video.permissionError": "Помилка при трансляції вебкамери. Будь ласка перевірте дозволи", + "app.video.sharingError": "Помилка при трансляції вебкамери", + "app.video.notFoundError": "Не вдалося знайти вебкамеру. Переконайтеся, що її під'єднано", + "app.video.notAllowed": "Відсутній дозвіл на трансляцію вебкамери, будь ласка, переконайтеся, що ваш переглядач має необхідні дозволи", + "app.video.notSupportedError": "Дозволяється транслювати потік з вебкамери лише з безпечних джерел, переконайтеся, що сертифікат SSL дійсний", + "app.video.notReadableError": "Не вдалося отримати відео з вебкамери. Будь ласка, переконайтеся, що інша програма не використовує її", + "app.video.mediaFlowTimeout1020": "Мультимедії не досягають сервера (помилка 1020)", + "app.video.suggestWebcamLock": "Примусово заблокувати вебкамери учасникам?", "app.video.suggestWebcamLockReason": "(це підвищить стабільність конференції)", - "app.video.enable": "Включити", - "app.video.cancel": "Відмінити", + "app.video.enable": "Увімкнути", + "app.video.cancel": "Скасувати", "app.video.swapCam": "Змінити", - "app.video.swapCamDesc": "поміняти напрямок веб-камер", - "app.video.videoLocked": "Транслювати веб-камеру заблоковано", - "app.video.videoButtonDesc": "Транслювати веб-камеру", + "app.video.swapCamDesc": "поміняти фокус вебкамери", + "app.video.videoLocked": "Трансляцію вебкамери заблоковано", + "app.video.videoButtonDesc": "Увімкнути вебкамеру", "app.video.videoMenu": "Меню відео", - "app.video.videoMenuDisabled": "Меню відео веб-камера відключено в налаштуваннях", + "app.video.videoMenuDisabled": "Меню відео: вебкамеру вимкнено у налаштуваннях", "app.video.videoMenuDesc": "Відкрити контекстне меню відео", "app.video.chromeExtensionError": "Ви маєте встановити", "app.video.chromeExtensionErrorLink": "це розширення Chrome", "app.video.stats.title": "Статистика з'єднань", - "app.video.stats.packetsReceived": "Пакети отримані", - "app.video.stats.packetsSent": "Пакети відправлені", - "app.video.stats.packetsLost": "Пакети втрачені", + "app.video.stats.packetsReceived": "Отримані пакети", + "app.video.stats.packetsSent": "Надіслані пакети", + "app.video.stats.packetsLost": "Втрачені пакети", "app.video.stats.bitrate": "Бітрейт", "app.video.stats.lostPercentage": "Загальний відсоток втрачених", "app.video.stats.lostRecentPercentage": "Нинішній відсоток втрачених", @@ -576,33 +581,33 @@ "app.video.stats.codec": "Кодек", "app.video.stats.decodeDelay": "Затримка декодування", "app.video.stats.rtt": "Час RTT", - "app.video.stats.encodeUsagePercent": "Використання кодуванням", + "app.video.stats.encodeUsagePercent": "Використання кодування", "app.video.stats.currentDelay": "Поточна затримка", "app.fullscreenButton.label": "{0} на весь екран", - "app.deskshare.iceConnectionStateError": "Не вдале з'єднання після демонстрації екрана (ICE помилка 1108)", - "app.sfu.mediaServerConnectionError2000": "Не можливо з'єднатися з медіа сервером (помилка 2000)", - "app.sfu.mediaServerOffline2001": "Медіа сервер офлайн. Будь ласка спробуйте пізніше (помилка 2001)", - "app.sfu.mediaServerNoResources2002": "На медіа сервері немає доступних ресурсів (помилка 2002)", - "app.sfu.mediaServerRequestTimeout2003": "Час запитів медіа сервера вичерпується (помилка 2003)", - "app.sfu.serverIceGatheringFailed2021": "Медіа сервер не може зібрати кандидатів на з'єднання (ICE помилка 2021)", - "app.sfu.serverIceGatheringFailed2022": "З'єднання медіа сервера не вдалося (ICE помилка 2022)", - "app.sfu.mediaGenericError2200": "Медіа сервер не зміг обробити запит (помилка 2200)", + "app.deskshare.iceConnectionStateError": "Не вдалося встановити з'єднання під час демонстрації екрану (ICE помилка 1108)", + "app.sfu.mediaServerConnectionError2000": "Не можливо з'єднатися з мультимедійним сервером (помилка 2000)", + "app.sfu.mediaServerOffline2001": "Мультимедійний сервер недоступний. Будь ласка спробуйте пізніше (помилка 2001)", + "app.sfu.mediaServerNoResources2002": "На мультимедійному сервері немає доступних ресурсів (помилка 2002)", + "app.sfu.mediaServerRequestTimeout2003": "Час запитів мультимедійного сервера закінчується (помилка 2003)", + "app.sfu.serverIceGatheringFailed2021": "Мультимедійний сервер не може зібрати кандидатів на з'єднання (ICE помилка 2021)", + "app.sfu.serverIceGatheringFailed2022": "Не вдалося встановити з'єднання з мультимедійним сервером (ICE помилка 2022)", + "app.sfu.mediaGenericError2200": "Мультимедійний сервер не зміг обробити запит (помилка 2200)", "app.sfu.invalidSdp2202":"Клієнт сформував пошкоджений медіа запит (SDP помилка 2202)", - "app.sfu.noAvailableCodec2203": "Сервер не може знайти підходящий кодек (помилка 2203)", - "app.meeting.endNotification.ok.label": "OK", - "app.whiteboard.annotations.poll": "Результати опитування були опубліковані", + "app.sfu.noAvailableCodec2203": "Сервер не може визначити відповідний кодек (помилка 2203)", + "app.meeting.endNotification.ok.label": "Гаразд", + "app.whiteboard.annotations.poll": "Результати опитування опубліковано", "app.whiteboard.toolbar.tools": "Інструменти", "app.whiteboard.toolbar.tools.hand": "Переміщення", "app.whiteboard.toolbar.tools.pencil": "Олівець", "app.whiteboard.toolbar.tools.rectangle": "Чотирикутник", "app.whiteboard.toolbar.tools.triangle": "Трикутник", - "app.whiteboard.toolbar.tools.ellipse": "Окружність", + "app.whiteboard.toolbar.tools.ellipse": "Коло", "app.whiteboard.toolbar.tools.line": "Лінія", "app.whiteboard.toolbar.tools.text": "Текст", - "app.whiteboard.toolbar.thickness": "Товщина малювання", - "app.whiteboard.toolbar.thicknessDisabled": "Товщину малювання вимкнуто", - "app.whiteboard.toolbar.color": "Кольори", - "app.whiteboard.toolbar.colorDisabled": "Кольори відключено", + "app.whiteboard.toolbar.thickness": "Товщина", + "app.whiteboard.toolbar.thicknessDisabled": "Товщина малювання неактивна", + "app.whiteboard.toolbar.color": "Колір", + "app.whiteboard.toolbar.colorDisabled": "Кольори неактивні", "app.whiteboard.toolbar.color.black": "Чорний", "app.whiteboard.toolbar.color.white": "Білий", "app.whiteboard.toolbar.color.red": "Червоний", @@ -615,42 +620,42 @@ "app.whiteboard.toolbar.color.violet": "Фіолетовий", "app.whiteboard.toolbar.color.magenta": "Пурпурний", "app.whiteboard.toolbar.color.silver": "Сірий", - "app.whiteboard.toolbar.undo": "Скасувати останній надпис", - "app.whiteboard.toolbar.clear": "Очистити всі надписи", - "app.whiteboard.toolbar.multiUserOn": "Увімкніть багатокористувацький режим", - "app.whiteboard.toolbar.multiUserOff": "Вимкніть режим багаторазового використання", + "app.whiteboard.toolbar.undo": "Скасувати", + "app.whiteboard.toolbar.clear": "Стерти все", + "app.whiteboard.toolbar.multiUserOn": "Увімкнути спільний доступ", + "app.whiteboard.toolbar.multiUserOff": "Вимкнути спільний доступ", "app.whiteboard.toolbar.fontSize": "Вибір розміру шрифту", "app.feedback.title": "Ви вийшли з конференції", - "app.feedback.subtitle": "Ми хотіли б почути про ваш досвід роботи з BigBlueButton (необов'язково)", - "app.feedback.textarea": "Як ми можемо зробити BigBlueButton краще?", + "app.feedback.subtitle": "Будь ласка, поділіться вашим досвідом користування BigBlueButton (необов'язково)", + "app.feedback.textarea": "Як можна покращити BigBlueButton?", "app.feedback.sendFeedback": "Надіслати відгук", - "app.feedback.sendFeedbackDesc": "Надіслати відгук і залишити зустріч", + "app.feedback.sendFeedbackDesc": "Надіслати відгук та вийти", "app.videoDock.webcamFocusLabel": "Фокус", - "app.videoDock.webcamFocusDesc": "Сфокусувати вибрану веб-камеру", - "app.videoDock.webcamUnfocusLabel": "Розфокусувати", - "app.videoDock.webcamUnfocusDesc": "Розфокусувати вибрану веб-камеру", - "app.videoDock.autoplayBlockedDesc": "Нам потрібен Ваш дозвіл, щоб показати Вам веб-камери інших.", - "app.videoDock.autoplayAllowLabel": "Подивитися веб-камери", - "app.invitation.title": "Запрошення в кімнату для учасників", + "app.videoDock.webcamFocusDesc": "Сфокусувати вибрану вебкамеру", + "app.videoDock.webcamUnfocusLabel": "Змінити фокус", + "app.videoDock.webcamUnfocusDesc": "Змінити фокус вебкамери", + "app.videoDock.autoplayBlockedDesc": "Нам потрібен дозвіл, щоб показати вам вебкамери інших учасників.", + "app.videoDock.autoplayAllowLabel": "Подивитися вебкамери", + "app.invitation.title": "Запрошення учасників до окремих кімнат", "app.invitation.confirm": "Запросити", - "app.createBreakoutRoom.title": "Кімнати для учасників", - "app.createBreakoutRoom.ariaTitle": "Приховати кімнати для учасників", - "app.createBreakoutRoom.breakoutRoomLabel": "Кімнати для учасників {0}", - "app.createBreakoutRoom.generatingURL": "Генерування URL", - "app.createBreakoutRoom.generatedURL": "Згенеровано", + "app.createBreakoutRoom.title": "Розділити учасників на кімнати", + "app.createBreakoutRoom.ariaTitle": "Приховати кімнати учасників", + "app.createBreakoutRoom.breakoutRoomLabel": "Кімнати учасників {0}", + "app.createBreakoutRoom.generatingURL": "Створення URL", + "app.createBreakoutRoom.generatedURL": "Створено", "app.createBreakoutRoom.duration": "Тривалість {0}", "app.createBreakoutRoom.room": "Кімната {0}", - "app.createBreakoutRoom.notAssigned": "Не присвоєно ({0})", - "app.createBreakoutRoom.join": "Приєднатись до кімнати", - "app.createBreakoutRoom.joinAudio": "Приєднатися до аудіоконференції", - "app.createBreakoutRoom.returnAudio": "Повернути аудіо", - "app.createBreakoutRoom.alreadyConnected": "Вже в кімнаті", + "app.createBreakoutRoom.notAssigned": "Не призначено ({0})", + "app.createBreakoutRoom.join": "Приєднатися до кімнати", + "app.createBreakoutRoom.joinAudio": "Приєднатися до голосової конференції", + "app.createBreakoutRoom.returnAudio": "Повернути звук", + "app.createBreakoutRoom.alreadyConnected": "Вже у кімнаті", "app.createBreakoutRoom.confirm": "Створити", "app.createBreakoutRoom.record": "Записати", "app.createBreakoutRoom.numberOfRooms": "Кількість кімнат", "app.createBreakoutRoom.durationInMinutes": "Тривалість (хвилини)", - "app.createBreakoutRoom.randomlyAssign": "Випадково присвоїти", - "app.createBreakoutRoom.endAllBreakouts": "Завершити всі кімнати учасників", + "app.createBreakoutRoom.randomlyAssign": "Випадково призначити", + "app.createBreakoutRoom.endAllBreakouts": "Закрити усі кімнати учасників", "app.createBreakoutRoom.roomName": "{0} (Кімната - {1})", "app.createBreakoutRoom.doneLabel": "Готово", "app.createBreakoutRoom.nextLabel": "Далі", @@ -658,26 +663,26 @@ "app.createBreakoutRoom.addRoomTime": "Збільшити тривалість до", "app.createBreakoutRoom.addParticipantLabel": "+ Додати учасника", "app.createBreakoutRoom.freeJoin": "Дозволити користувачам обирати кімнату самостійно", - "app.createBreakoutRoom.leastOneWarnBreakout": "Щонайменш один користувач повинен бути в кімнаті.", - "app.createBreakoutRoom.modalDesc": "Замітка: Ви можете перетягувати імена користувачів, щоб призначити їх у певні групові кімнати.", + "app.createBreakoutRoom.leastOneWarnBreakout": "Щонайменше один користувач має бути присутнім у кімнаті.", + "app.createBreakoutRoom.modalDesc": "Примітка: Щоб призначити користувачів до певної кімнати, будь ласка, перетягніть їхні імена до комірок кімнат.", "app.createBreakoutRoom.roomTime": "{0} хвилин", - "app.createBreakoutRoom.numberOfRoomsError": "Кількість кімнат неправильна.", + "app.createBreakoutRoom.numberOfRoomsError": "Кількість кімнат є неправильною.", "app.externalVideo.start": "Поділитися новим відео", - "app.externalVideo.title": "Поділитися відео із зовнішніх ресурсів", + "app.externalVideo.title": "Демонстрація відео", "app.externalVideo.input": "Зовнішня URL-адреса відео", "app.externalVideo.urlInput": "Додати URL-адресу відео", "app.externalVideo.urlError": "Ця URL-адреса відео не підтримується", "app.externalVideo.close": "Закрити", - "app.externalVideo.autoPlayWarning": "Запустіть відео, щоб активувати синхронізацію медіа", + "app.externalVideo.autoPlayWarning": "Відтворити відео для синхронізації мультимедії", "app.network.connection.effective.slow": "Спостерігаються проблеми зі з'єднанням", "app.network.connection.effective.slow.help": "Детальна інформація", - "app.externalVideo.noteLabel": "Замітка: відео із зовнішніх ресурсів не буде відображатися в записі. Підтримуються посилання YouTube, Vimeo, Instructure Media, Twitch і Daily Motion.", - "app.actionsBar.actionsDropdown.shareExternalVideo": "Поділитися відео із зовнішніх ресурсів", + "app.externalVideo.noteLabel": "Примітка: Відео із зовнішніх ресурсів не буде показуватися у записі. Підтримуються посилання YouTube, Vimeo, Instructure Media, Twitch та Daily Motion.", + "app.actionsBar.actionsDropdown.shareExternalVideo": "Демонстрація відео", "app.actionsBar.actionsDropdown.stopShareExternalVideo": "Припинити показ відео із зовнішніх ресурсів", - "app.iOSWarning.label": "Будь ласка, оновіться до iOS 12.2 або більш нової версії", - "app.legacy.unsupportedBrowser": "Схоже, ви використовуєте браузер, який в повному обсязі не підтримується. Будь ласка, використовуйте {0} або {1} для повної підтримки.", - "app.legacy.upgradeBrowser": "Схоже, ви використовуєте старшу версію підтримуваного браузера. Будь ласка, встановіть нову версію для повної підтримки.", - "app.legacy.criosBrowser": "На iOS, будь ласка, використовуйте браузер Safari для повної підтримки." + "app.iOSWarning.label": "Будь ласка, оновіть пристрій з iOS до версії 12.2 або новішої версії", + "app.legacy.unsupportedBrowser": "Схоже, ви використовуєте переглядач, який в повному обсязі не підтримується. Будь ласка, використовуйте {0} або {1} для повної підтримки.", + "app.legacy.upgradeBrowser": "Схоже, ви використовуєте старішу версію переглядача, який підтримується. Будь ласка, оновіть його для повної підтримки.", + "app.legacy.criosBrowser": "Будь ласка, використовуйте переглядач Safari на пристрої з iOS для повної підтримки." } diff --git a/bigbluebutton-html5/private/locales/vi_VN.json b/bigbluebutton-html5/private/locales/vi_VN.json index efc0d805adf1..8e99e7b94713 100644 --- a/bigbluebutton-html5/private/locales/vi_VN.json +++ b/bigbluebutton-html5/private/locales/vi_VN.json @@ -1,5 +1,5 @@ { - "app.home.greeting": "Phần trình bày của bạn sẽ bắt đầu trong trong ít phút ...", + "app.home.greeting": "Phần trình bày của bạn sẽ bắt đầu trong trong giây lát ...", "app.chat.submitLabel": "Gửi tin nhắn", "app.chat.errorMaxMessageLength": "Thông báo {0} kí tự(s) quá dài", "app.chat.disconnected": "Bạn đã mất kết nối, tin nhắn không gửi được", @@ -7,7 +7,7 @@ "app.chat.inputLabel": "Tin nhắn nhập vào cuộc trò chuyện {0}", "app.chat.inputPlaceholder": "Gửi tin nhắn tới {0}", "app.chat.titlePublic": "Thảo luận chung", - "app.chat.titlePrivate": "Chat riêng tư với {0}", + "app.chat.titlePrivate": "Chat riêng với {0}", "app.chat.partnerDisconnected": "{0} đã rời cuộc họp", "app.chat.closeChatLabel": "Đóng {0}", "app.chat.hideChatLabel": "Ẩn {0}", @@ -18,7 +18,7 @@ "app.chat.dropdown.save": "Lưu", "app.chat.label": "Chat", "app.chat.offline": "Ngoại tuyến", - "app.chat.emptyLogLabel": "Nhật kí chat trống", + "app.chat.emptyLogLabel": "Không có nhật ký trò truyện", "app.chat.clearPublicChatMessage": "Lịch sử trò chuyện công khai được xóa bởi người quản lí", "app.chat.multi.typing": "Nhiều người đang gõ", "app.chat.one.typing": "{0} đang gõ", @@ -30,7 +30,7 @@ "app.captions.menu.ariaStartDesc": "Mở tùy chỉnh phụ đề và đóng cửa sổ", "app.captions.menu.select": "Chọn các ngôn ngữ sẵn có", "app.captions.menu.ariaSelect": "Ngôn ngữ phụ đề", - "app.captions.menu.subtitle": "Chọn một ngôn ngữ và kiểu cách cho phụ đề cho lần này", + "app.captions.menu.subtitle": "Chọn một ngôn ngữ và tùy chỉnh phụ đề", "app.captions.menu.title": "Đóng chú thích", "app.captions.menu.fontSize": "Kích cỡ", "app.captions.menu.fontColor": "Màu chữ", @@ -40,23 +40,23 @@ "app.captions.menu.cancelLabel": "Hủy", "app.captions.pad.hide": "Đóng chú thích", "app.captions.pad.tip": "Nhấn ESC dể chuyển ra thanh công cụ", - "app.captions.pad.ownership": "Làm tiếp", + "app.captions.pad.ownership": " Lấy lại", "app.captions.pad.ownershipTooltip": "Bạn sẽ được chỉ định là người sở hữu của {0} phụ đề", "app.captions.pad.interimResult": "Kết quả tạm thời", "app.captions.pad.dictationStart": "Bắt đầu đọc chính tả", "app.captions.pad.dictationStop": "Kết thúc viết chính tả", "app.captions.pad.dictationOnDesc": "Bật nhận diện lời nói", "app.captions.pad.dictationOffDesc": "Tắt nhận diện lời nói", - "app.note.title": "Shared Notes", + "app.note.title": "Ghi chú chung", "app.note.label": "Ghi chú", "app.note.hideNoteLabel": "Ẩn ghi chú", "app.user.activityCheck": "Kiểm tra hoạt động người dùng", - "app.user.activityCheck.label": "Kiểm tra nếu người dùng đang ở trong cuộc thảo luận ({0})", + "app.user.activityCheck.label": "Kiểm tra nếu người dùng vẫn đang trong cuộc họp ({0})", "app.user.activityCheck.check": "Kiểm tra", - "app.note.tipLabel": "Nhấn ESC dể chuyển ra thanh công cụ", + "app.note.tipLabel": "Nhấn ESC để chuyển ra thanh công cụ", "app.userList.usersTitle": "Người dùng", - "app.userList.participantsTitle": "Người tham gia", - "app.userList.messagesTitle": "Thông báo", + "app.userList.participantsTitle": "Người tham dự", + "app.userList.messagesTitle": "Tin nhắn", "app.userList.notesTitle": "Ghi chú", "app.userList.notesListItem.unreadContent": "Có thông tin mới trong phần chia sẻ ghi chú", "app.userList.captionsTitle": "Phụ đề", @@ -66,16 +66,16 @@ "app.userList.label": "Danh sách người dùng", "app.userList.toggleCompactView.label": "Chuyển sang chế độ thu nhỏ", "app.userList.guest": "Khách ", - "app.userList.menuTitleContext": "Tùy chọn khả dụng", + "app.userList.menuTitleContext": "Tùy chọn sẵn có", "app.userList.chatListItem.unreadSingular": "{0} Thông báo mới", "app.userList.chatListItem.unreadPlural": "{0} Thông báo mới", - "app.userList.menu.chat.label": "Nói chuyện riêng tư", + "app.userList.menu.chat.label": " Chat riêng", "app.userList.menu.clearStatus.label": "Xóa trạng thái", "app.userList.menu.removeUser.label": "Xóa người dùng", - "app.userList.menu.muteUserAudio.label": "Tắt tiếng người dùng", - "app.userList.menu.unmuteUserAudio.label": "Bỏ tắt tiếng người dùng", + "app.userList.menu.muteUserAudio.label": "Tắt tiếng", + "app.userList.menu.unmuteUserAudio.label": "Mở tiếng", "app.userList.userAriaLabel": "{0}{1}{2} Trạng thái {3}", - "app.userList.menu.promoteUser.label": "Cấp quyền làm quản lý", + "app.userList.menu.promoteUser.label": "Cấp quyền quản lý", "app.userList.menu.demoteUser.label": "Bỏ quyền quản lý", "app.userList.menu.unlockUser.label": "Mở khóa {0}", "app.userList.menu.lockUser.label": "Khóa {0}", @@ -83,26 +83,26 @@ "app.userList.menu.makePresenter.label": "Trao quyền thuyết trình ", "app.userList.userOptions.manageUsersLabel": "Quản lý người dùng", "app.userList.userOptions.muteAllLabel": "Tắt tiếng tất cả", - "app.userList.userOptions.muteAllDesc": "Tắt tiếng tất cả người dùng trong cuộc hội thoại", + "app.userList.userOptions.muteAllDesc": "Tắt tiếng tất cả", "app.userList.userOptions.clearAllLabel": "Xóa tất cả các biểu tượng trạng thái", "app.userList.userOptions.clearAllDesc": "Xóa các biểu tượng trạng thái từ người dùng", - "app.userList.userOptions.muteAllExceptPresenterLabel": "Tắt tiếng tất cả ngoại trừ người trình bày", - "app.userList.userOptions.muteAllExceptPresenterDesc": "Tắt tiếng tất cả trong cuộc hội thoại ngoại trừ người trình bày", - "app.userList.userOptions.unmuteAllLabel": "Turn off meeting mute", - "app.userList.userOptions.unmuteAllDesc": "Unmutes the meeting", + "app.userList.userOptions.muteAllExceptPresenterLabel": "Tắt tiếng tất cả trừ người trình bày", + "app.userList.userOptions.muteAllExceptPresenterDesc": "Tắt tiếng tất cả trừ người trình bày", + "app.userList.userOptions.unmuteAllLabel": "Tắt tiếng cuộc họp", + "app.userList.userOptions.unmuteAllDesc": "Mở tiếng cuộc họp", "app.userList.userOptions.lockViewersLabel": "Khóa người xem", "app.userList.userOptions.lockViewersDesc": "Khóa một số chức năng nhất định cho người tham dự cuộc hội thoại", "app.userList.userOptions.disableCam": "Webcam người dùng không khả dụng", "app.userList.userOptions.disableMic": "Mic người dùng không khả dụng", - "app.userList.userOptions.disablePrivChat": "Trò chuyện riêng tư không khả dụng", - "app.userList.userOptions.disablePubChat": "Trò chuyện công khai không khả dụng", + "app.userList.userOptions.disablePrivChat": " Chát riêng đã bị tắt", + "app.userList.userOptions.disablePubChat": " Tắt chat công khai", "app.userList.userOptions.disableNote": "Shared notes đã khóa ", "app.userList.userOptions.hideUserList": "Người xem không thể xem được danh sách người dùng", "app.userList.userOptions.webcamsOnlyForModerator": "Chỉ người quản trị mới thấy được lượng người xem (Do khóa cài đặt)", "app.userList.content.participants.options.clearedStatus": "Xóa tất cả trạng thái người dùng", - "app.userList.userOptions.enableCam": "Webcam của người xem có thể dùng được", - "app.userList.userOptions.enableMic": "Mic của người xem có thể dùng được", - "app.userList.userOptions.enablePrivChat": "Nói chuyện riêng tư có thể dùng được", + "app.userList.userOptions.enableCam": "Webcam đã được kích hoạt", + "app.userList.userOptions.enableMic": "Mic của người xem đã được kích hoạt", + "app.userList.userOptions.enablePrivChat": "Được phép chat riêng", "app.userList.userOptions.enablePubChat": "Có thể sử dụng trò chuyện công khai", "app.userList.userOptions.enableNote": "Có thể sử dụng shared notes", "app.userList.userOptions.showUserList": "Người xem có thể xem được danh sách người dùng", @@ -111,19 +111,21 @@ "app.media.autoplayAlertDesc": "Cho phép truy cập", "app.media.screenshare.start": "Chia sẻ màn hình bắt đầu", "app.media.screenshare.end": "Chia sẻ màn hình đã tắt", + "app.media.screenshare.unavailable": "Không thể chia sẻ màn hình", + "app.media.screenshare.safariNotSupported": "Chia sẻ màn hình không hỗ trợ cho trình duyệt Safari, vui lòng sử dụng Chrome hoặc Firefox", "app.media.screenshare.autoplayBlockedDesc": "Bạn cần phải cho phép để có thể xem được màn hình của người đang trình bày", "app.media.screenshare.autoplayAllowLabel": "Xem màn hình chung", "app.screenshare.notAllowed": "Lỗi: Chưa cho phép xem màn hình", "app.screenshare.notSupportedError": "Lỗi: Chia sẻ màn hình chỉ được phép trên domains (SSL) an toàn", "app.screenshare.notReadableError": "Lỗi: Không thể chụp màn hình được", "app.screenshare.genericError": "Lỗi: không thể chia sẻ màn hình, xin hãy thử lại", - "app.meeting.ended": "Phiên hoạt động đã kết thúc", + "app.meeting.ended": "Phiên họp này đã kết thúc", "app.meeting.meetingTimeRemaining": "Thời gian còn lại của cuộc họp: {0}", "app.meeting.meetingTimeHasEnded": "Hết giờ. Cuộc họp sẽ đóng lại", "app.meeting.endedMessage": "Bạn sẽ được chuyển hướng về lại trang chủ màn hình", "app.meeting.alertMeetingEndsUnderOneMinute": "Cuộc họp sẽ kết thúc trong một phút nữa", "app.meeting.alertBreakoutEndsUnderOneMinute": "Giải lao sẽ kết thúc trong một phúc nữa ", - "app.presentation.hide": "Ẩn phần trình bày", + "app.presentation.hide": "Ẩn Trình bày", "app.presentation.notificationLabel": "Phần trình bày hiện tại", "app.presentation.slideContent": "Nội dung slide", "app.presentation.startSlideContent": "Nội dung slide bắt đầu", @@ -155,7 +157,7 @@ "app.presentation.presentationToolbar.goToSlide": "Slide {0}", "app.presentationUploder.title": "Phần trình bày", "app.presentationUploder.message": "Với bài thuyết trình bạn có thể tải lên nhiều file office hoặc PDF. Chúng tôi khuyên nên dùng file PDF để được kết quả hiển thị tốt nhất. Vui lòng đảm bảo rằng có 1 file trình bày được chọn bằng cách chọn vào ô checkbox phía bên phải.", - "app.presentationUploder.uploadLabel": "Đưa lên", + "app.presentationUploder.uploadLabel": "Tải lên", "app.presentationUploder.confirmLabel": "Xác nhận", "app.presentationUploder.confirmDesc": "Lưu lại những thay dổi và bắt đầu bài trình bày", "app.presentationUploder.dismissLabel": "Hủy", @@ -164,21 +166,24 @@ "app.presentationUploder.dropzoneImagesLabel": "Kéo và thả hình ảnh vào đây để đưa lên.", "app.presentationUploder.browseFilesLabel": "Hoặc chọn đường dẫn cho file", "app.presentationUploder.browseImagesLabel": "Hoặc chọn đường dẫn/chụp ảnh cho các hình ảnh.", - "app.presentationUploder.fileToUpload": "Chuẩn bị dưa lên...", + "app.presentationUploder.fileToUpload": "Chuẩn bị tải lên...", "app.presentationUploder.currentBadge": "Hiện tại", "app.presentationUploder.rejectedError": "(Các) Tài liệu không hợp lệ, xin hãy kiểm tra lại định dạng (các) tài liệu", - "app.presentationUploder.upload.progress": "Đang đưa lên ({0}%)", + "app.presentationUploder.upload.progress": "Đang tải lên ({0}%)", "app.presentationUploder.upload.413": "File quá dung lượng. Vui lòng cắt nhỏ thành nhiều file để giảm dung lượng.", "app.presentationUploder.conversion.conversionProcessingSlides": "Đang xử lý {0} trên {1} trang", "app.presentationUploder.conversion.genericConversionStatus": "Đang chuyển đổi file...", "app.presentationUploder.conversion.generatingThumbnail": "Tạo thumbnails", "app.presentationUploder.conversion.generatedSlides": "Các slide được tạo...", "app.presentationUploder.conversion.generatingSvg": "Tạo hình ảnh SVG ...", + "app.presentationUploder.conversion.officeDocConversionInvalid": "Lỗi tải file, Vui lòng tải file PDF/PPT", + "app.presentationUploder.conversion.officeDocConversionFailed": "Lỗi tải file, Vui lòng tải file PDF/PPT", "app.presentationUploder.conversion.pdfHasBigPage": "Chúng tôi không thể chuyển thành PDF, vui lòng tối ưu hóa nó", "app.presentationUploder.conversion.timeout": "Ops, sự thay đổi mất một khoảng thời gian", + "app.presentationUploder.conversion.pageCountFailed": "Lỗi không xác định được số trang", "app.presentationUploder.isDownloadableLabel": "Không cho phép tải xuống phần trình bày", "app.presentationUploder.isNotDownloadableLabel": "Cho phép tải xuống phần trình bày", - "app.presentationUploder.removePresentationLabel": "Bỏ phần trình bày", + "app.presentationUploder.removePresentationLabel": "Xóa phần trình bày", "app.presentationUploder.setAsCurrentPresentation": "Thiết lập phần trình bày hiện tại", "app.presentationUploder.tableHeading.filename": "Tên file", "app.presentationUploder.tableHeading.options": "Tùy chọn", @@ -235,7 +240,7 @@ "app.navBar.settingsDropdown.leaveSessionLabel": "Đăng xuất ", "app.navBar.settingsDropdown.exitFullscreenLabel": "Tắt chế độ toàn màn hình", "app.navBar.settingsDropdown.fullscreenDesc": "Tạo menu cài đặt màn hình ", - "app.navBar.settingsDropdown.settingsDesc": "Thay dổi cài đặt chung", + "app.navBar.settingsDropdown.settingsDesc": "Thay đổi cài đặt chung", "app.navBar.settingsDropdown.aboutDesc": "Hiển thị thông tin về khách hàng", "app.navBar.settingsDropdown.leaveSessionDesc": "Rời cuộc họp", "app.navBar.settingsDropdown.exitFullscreenDesc": "Tắt chế độ xem toàn màn hình", @@ -244,17 +249,17 @@ "app.navBar.settingsDropdown.helpLabel": "Hỗ trợ", "app.navBar.settingsDropdown.helpDesc": "Liên kết người dùng với các video khóa học (mở tab mới)", "app.navBar.settingsDropdown.endMeetingDesc": "Kết thúc cuộc họp hiện tại", - "app.navBar.settingsDropdown.endMeetingLabel": "Cuộc họp kết thúc", + "app.navBar.settingsDropdown.endMeetingLabel": "Kết thúc cuộp họp", "app.navBar.userListToggleBtnLabel": "Danh sách người dùng chuyển đổi", "app.navBar.toggleUserList.ariaLabel": "Chuyển đổi người dùng và tin nhắn", - "app.navBar.toggleUserList.newMessages": "Với thông báo tin nhắn mới", + "app.navBar.toggleUserList.newMessages": "với thông báo tin nhắn mới", "app.navBar.recording": "Phiên hoạt động đang dược ghi lại", "app.navBar.recording.on": "Ghi hình", "app.navBar.recording.off": "Không được ghi hình", "app.navBar.emptyAudioBrdige": "Không có micro đang kích hoạt. Chia sẻ micro của bạn để thêm âm thanh vào file recording này.", "app.leaveConfirmation.confirmLabel": "Rời khỏi", "app.leaveConfirmation.confirmDesc": "Đăng xuất khỏi cuộc họp", - "app.endMeeting.title": "Cuộc họp kết thúc", + "app.endMeeting.title": "Kết thúc cuộc họp", "app.endMeeting.description": "Bạn thực sự muốn kết thúc phiên hoạt động ?", "app.endMeeting.yesLabel": "Có", "app.endMeeting.noLabel": "Không", @@ -269,7 +274,7 @@ "app.actionsBar.muteLabel": "Tắt tiếng", "app.actionsBar.unmuteLabel": "Bật tiếng", "app.actionsBar.camOffLabel": "Camera tắt", - "app.actionsBar.raiseLabel": "Kéo lên", + "app.actionsBar.raiseLabel": " Giơ tay", "app.actionsBar.label": "Thanh hành động", "app.actionsBar.actionsDropdown.restorePresentationLabel": "Khôi phục phần trình bày", "app.actionsBar.actionsDropdown.restorePresentationDesc": "Nhấn nút để khôi phục phần trình bày sau khi nó tắt", @@ -290,7 +295,7 @@ "app.submenu.audio.micSourceLabel": "Nguồn micro", "app.submenu.audio.speakerSourceLabel": "Nguồn loa", "app.submenu.audio.streamVolumeLabel": "Âm lượng âm thanh của bạn", - "app.submenu.video.title": "video", + "app.submenu.video.title": "Video", "app.submenu.video.videoSourceLabel": "Nguồn video", "app.submenu.video.videoOptionLabel": "Chọn nguồn video", "app.submenu.video.videoQualityLabel": "Chất lượng video", @@ -298,7 +303,7 @@ "app.submenu.video.participantsCamLabel": "Xem webcam của các thành viên", "app.settings.applicationTab.label": "Ứng dụng", "app.settings.audioTab.label": "Âm thanh", - "app.settings.videoTab.label": "video", + "app.settings.videoTab.label": "Video", "app.settings.usersTab.label": "Người tham gia", "app.settings.main.label": "Cài đặt", "app.settings.main.cancel.label": "Hủy", @@ -317,9 +322,9 @@ "app.talkingIndicator.wasTalking" : "{0} dừng nói", "app.actionsBar.actionsDropdown.actionsLabel": "Các hành động", "app.actionsBar.actionsDropdown.presentationLabel": "Tải lên phần trình bày", - "app.actionsBar.actionsDropdown.initPollLabel": "Khởi tạo cuộc thăm dò ý kiến", - "app.actionsBar.actionsDropdown.desktopShareLabel": "Chia sẻ màn hình của bạn", - "app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Chia sẻ màn hình đã khóa", + "app.actionsBar.actionsDropdown.initPollLabel": "Tạo cuộc thăm dò ý kiến", + "app.actionsBar.actionsDropdown.desktopShareLabel": "Chia sẻ màn hình", + "app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Chia sẻ màn hình đã bị khóa", "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Dừng chia sẻ màn hình của bạn", "app.actionsBar.actionsDropdown.presentationDesc": "Tải lên phần trình bày của bạn", "app.actionsBar.actionsDropdown.initPollDesc": "Khởi tạo cuộc thăm dò ý kiến", @@ -367,7 +372,7 @@ "app.breakoutJoinConfirmation.confirmDesc": "Mời bạn tham gia vào phòng được chia nhóm", "app.breakoutJoinConfirmation.dismissLabel": "Hủy", "app.breakoutJoinConfirmation.dismissDesc": "Đóng và từ chối lời mời tham gia phòng chia nhóm", - "app.breakoutJoinConfirmation.freeJoinMessage": "Chọn một phòng đã dược chia nhóm để tham gia", + "app.breakoutJoinConfirmation.freeJoinMessage": "Chọn một phòng đã được chia nhóm để tham gia", "app.breakoutTimeRemainingMessage": "Thời gian còn lại của phòng: {0}", "app.breakoutWillCloseMessage": "Hết giờ. Phòng chia nhóm sẽ đóng", "app.calculatingBreakoutTimeRemaining": "Tính thời gian còn lại ...", @@ -428,7 +433,7 @@ "app.error.removed": "Bạn vừa bị xóa khỏi cuộc hội nghị", "app.error.meeting.ended": "Bạn vừa đăng xuất khỏi cuộc hội nghị", "app.meeting.logout.duplicateUserEjectReason": "Một người dùng khác đang cố dùng tài khoản của bạn để tham gia vào cuộc họp", - "app.meeting.logout.permissionEjectReason": "Bị từ chối cho vi phạm quyền", + "app.meeting.logout.permissionEjectReason": "Bị từ chối do vi phạm quyền", "app.meeting.logout.ejectedFromMeeting": "Bạn vừa bị xóa khỏi phòng họp ", "app.meeting.logout.validateTokenFailedEjectReason": "Không thể xác thực mã thông báo ủy quyền", "app.meeting.logout.userInactivityEjectReason": "Người dùng đã quá lâu không hoạt động", @@ -486,14 +491,14 @@ "app.shortcut-help.toggleUserList": "Chuyển đổi danh sách người dùng", "app.shortcut-help.toggleMute": "Tắt tiếng/ Bật tiếng", "app.shortcut-help.togglePublicChat": "Chuyển đổi trò chuyện công khai (Danh sách người dùng phải được mở)", - "app.shortcut-help.hidePrivateChat": "Ẩn cuộc trò chuyện riêng tư", - "app.shortcut-help.closePrivateChat": "Đóng cuộc trò chuyện riêng tư", + "app.shortcut-help.hidePrivateChat": "Ẩn chat riêng", + "app.shortcut-help.closePrivateChat": "Đóng chat riêng tư", "app.shortcut-help.openActions": "Mở menu hoạt động", "app.shortcut-help.openStatus": "Mở menu trạng thái", "app.shortcut-help.togglePan": "Kich hoạt công cụ Pan (Người trình bày)", "app.shortcut-help.nextSlideDesc": "Slide tiếp theo (Người trình bày)", - "app.shortcut-help.previousSlideDesc": "Slide phía trước (Người trình bày)", - "app.lock-viewers.title": "Khóa người xem", + "app.shortcut-help.previousSlideDesc": "Slide trước (Người trình bày)", + "app.lock-viewers.title": "Khóa camera", "app.lock-viewers.description": "Các tùy chọn này cho phép bạn hạn chế người xem từ việc sử dụng các tính năng cụ thể.", "app.lock-viewers.featuresLable": "Nổi bật", "app.lock-viewers.lockStatusLabel": "Trạng thái", @@ -501,19 +506,19 @@ "app.lock-viewers.otherViewersWebcamLabel": "Xem các webcam người dùng khác", "app.lock-viewers.microphoneLable": "Chia sẻ micro", "app.lock-viewers.PublicChatLabel": "Gửi tin nhắn trò chuyện công khai", - "app.lock-viewers.PrivateChatLable": "Gửi tin nhắn trò chuyện riêng tư", - "app.lock-viewers.notesLabel": "Chỉnh sửa Shared Notes", + "app.lock-viewers.PrivateChatLable": "Gửi tin nhắn riêng", + "app.lock-viewers.notesLabel": "Sửa Ghi chú chung", "app.lock-viewers.userListLabel": "Xem những người xem khác trong danh sách Người dùng", "app.lock-viewers.ariaTitle": "Khóa phương thức tùy chỉnh người xem", "app.lock-viewers.button.apply": "Xác nhận", "app.lock-viewers.button.cancel": "Hủy", "app.lock-viewers.locked": "Bị khóa", "app.lock-viewers.unlocked": "Mở khóa", - "app.recording.startTitle": "Bắt đầu ghi âm", - "app.recording.stopTitle": "Tạm dừng ghi âm", - "app.recording.resumeTitle": "Tiếp tục ghi âm", - "app.recording.startDescription": "Bạn có thể ấn nút ghi âm lại để tạm dừng việc ghi âm", - "app.recording.stopDescription": "Bạn có chắc là muốn tạm dừng ghi âm? Bạn có thể tiếp tục ghi âm lại bằng cách ấn nút ghi âm lại lần nữa", + "app.recording.startTitle": "Bắt đầu ghi hình", + "app.recording.stopTitle": "Tạm dừng ghi hình", + "app.recording.resumeTitle": "Tiếp tục ghi hình", + "app.recording.startDescription": "Bạn có thể ấn nút Ghi hình lại để tạm dừng", + "app.recording.stopDescription": "Bạn có chắc là muốn tạm dừng ghi hình? Bạn có thể tiếp tục ghi hình lại bằng cách ấn nút ghi hình lần nữa", "app.videoPreview.cameraLabel": "Camera", "app.videoPreview.profileLabel": "Chất lượng", "app.videoPreview.cancelLabel": "Hủy", @@ -526,15 +531,15 @@ "app.videoPreview.webcamNotFoundLabel": "Không tìm thấy webcam", "app.videoPreview.profileNotFoundLabel": "Không hỗ trợ camera", "app.video.joinVideo": "Chia sẻ webcam", - "app.video.leaveVideo": "Dừng việc chia sẻ webcam", + "app.video.leaveVideo": "Dừng chia sẻ webcam", "app.video.iceCandidateError": "Error on adding ICE candidate", - "app.video.permissionError": "Error on sharing webcam. Please check permissions", - "app.video.sharingError": "Error on sharing webcam", - "app.video.notFoundError": "Không thể tìm thấy webcam. Đảm bảo rằng thiết bị đã kết nối", - "app.video.notAllowed": "Thiếu quyền chia sẻ webcam, vui lòng đảm bảo quyền truy cập trình duyệt của bạn", + "app.video.permissionError": "Lỗi chia sẻ camera, vui lòng kiểm tra quyền chia sẻ", + "app.video.sharingError": "\bLỗi chia sẻ camera", + "app.video.notFoundError": "Không thể tìm thấy webcam. Kiểm tra lại thiết bị", + "app.video.notAllowed": "Thiếu quyền chia sẻ webcam, kiểm tra lại quyền truy cập camera của Trình duyệt", "app.video.notSupportedError": "Chỉ có thể chia sẻ video webcam với các nguồn an toàn, dảm bảo rằng chứng chỉ SSL của bạn hợp lệ", "app.video.notReadableError": "Không thể nhận video webcam. Đảm bảo rằng các chương trình khác đang không sử dụng webcam", - "app.video.suggestWebcamLock": "Bắt buộc khóa tùy chỉnh webcam của người xem", + "app.video.suggestWebcamLock": "Buộc khóa tùy chỉnh webcam của người xem", "app.video.suggestWebcamLockReason": "(việc này sẽ giúp buổi họp được ổn định hơn)", "app.video.enable": "Cho phép", "app.video.cancel": "Hủy", @@ -542,7 +547,7 @@ "app.video.swapCamDesc": "Đổi vị trí các webcam", "app.video.videoLocked": "Chia sẻ webcam đã khóa", "app.video.videoButtonDesc": "Chia sẻ webcam", - "app.video.videoMenu": "menu video", + "app.video.videoMenu": "Menu video", "app.video.videoMenuDisabled": "menu video webcam không khả đụng trong mục cài đặt", "app.video.videoMenuDesc": "Mở thanh menu video trượt xuống", "app.video.chromeExtensionError": "Bạn phải cài đặt", @@ -556,13 +561,13 @@ "app.video.stats.lostRecentPercentage": "Phần trăm bị mất gần đây", "app.video.stats.dimensions": "Kích thước", "app.video.stats.codec": "Tiền mã hóa", - "app.video.stats.decodeDelay": "Đỗ trệ giải mã", + "app.video.stats.decodeDelay": "Đỗ trễ giải mã", "app.video.stats.rtt": "RTT", "app.video.stats.encodeUsagePercent": "Sử dụng mã hóa", - "app.video.stats.currentDelay": "Sự chậm trễ hiện tại", + "app.video.stats.currentDelay": "Độ trễ hiện tại", "app.fullscreenButton.label": "Tạo {0} toàn màn hình", "app.meeting.endNotification.ok.label": "Đồng ý", - "app.whiteboard.annotations.poll": "Kết quả cuộc thăm dò ý kiến đã được công bố", + "app.whiteboard.annotations.poll": "Đã công bố kết quả thăm dò ý kiến", "app.whiteboard.toolbar.tools": "Công cụ", "app.whiteboard.toolbar.tools.hand": "Pan", "app.whiteboard.toolbar.tools.pencil": "Bút chì", @@ -589,10 +594,10 @@ "app.whiteboard.toolbar.color.silver": "Màu bạc", "app.whiteboard.toolbar.undo": "Hoàn tác chú thích", "app.whiteboard.toolbar.clear": "Xóa tất cả các chú thích", - "app.whiteboard.toolbar.multiUserOn": "Bật bảng trắng cho nhiều người dùng", - "app.whiteboard.toolbar.multiUserOff": "Tắt bảng trắng cho nhiều người dùng", + "app.whiteboard.toolbar.multiUserOn": "Chia sẻ bảng trắng", + "app.whiteboard.toolbar.multiUserOff": " Tắt chia sẻ bảng trắng", "app.whiteboard.toolbar.fontSize": "Danh sách kích thước phông chữ", - "app.feedback.title": "Bạn vừa đăng xuất khỏi cuộc hội nghị", + "app.feedback.title": "Bạn vừa đăng xuất khỏi cuộc họp", "app.feedback.subtitle": "Chúng tôi muốn nghe trải nghiệm của bạn về hệ thống này (tùy chọn)", "app.feedback.textarea": "Làm thế nào để hệ thống tốt hơn?", "app.feedback.sendFeedback": "Gửi phản hồi", @@ -603,11 +608,11 @@ "app.videoDock.webcamUnfocusDesc": "Không tập trung vào các webcam đã chọn", "app.videoDock.autoplayBlockedDesc": "Bạn cần phải cho phép để có thể xem được webcam của người khác", "app.videoDock.autoplayAllowLabel": "Xem webcam", - "app.invitation.title": "Lời mời vào phòng chia nhóm", + "app.invitation.title": "Mời vào phòng chia nhóm thảo luận", "app.invitation.confirm": "Mời", - "app.createBreakoutRoom.title": "Chia nhóm", + "app.createBreakoutRoom.title": "Chia nhóm thảo luận", "app.createBreakoutRoom.ariaTitle": "Ẩn các phòng chia nhóm", - "app.createBreakoutRoom.breakoutRoomLabel": "Phong chia nhóm {0}", + "app.createBreakoutRoom.breakoutRoomLabel": "Phòng thảo luận {0}", "app.createBreakoutRoom.generatingURL": "Tạo URL", "app.createBreakoutRoom.generatedURL": "Tạo", "app.createBreakoutRoom.duration": "Thời lượng {0}", @@ -635,13 +640,13 @@ "app.createBreakoutRoom.roomTime": "{0} phút", "app.createBreakoutRoom.numberOfRoomsError": "Số phòng không hợp lí", "app.externalVideo.start": "Chia sẻ video mới", - "app.externalVideo.title": "Chia sẻ 1 video ở ngoài", + "app.externalVideo.title": "Chia sẻ 1 video bên ngoài", "app.externalVideo.input": "URL của video ở ngoài", "app.externalVideo.urlInput": "Thêm video URL", "app.externalVideo.urlError": "URL này không được hỗ trợ", "app.externalVideo.close": "Đóng", "app.externalVideo.autoPlayWarning": "Phát video để bật đồng bộ hóa phương tiện", - "app.network.connection.effective.slow": "Chúng tôi nhận thấy các vấn đề kết nối", + "app.network.connection.effective.slow": "Có vấn đề về kết nối", "app.network.connection.effective.slow.help": "Thông tin thêm", "app.externalVideo.noteLabel": "Lưu ý: Các video được chia sẻ sẽ không xuất hiện trong bản recording. Cho phép: YouTube, Vimeo, Instructure Media, Twitch, Daily Motion.", "app.actionsBar.actionsDropdown.shareExternalVideo": "Chia sẻ 1 video ở ngoài", diff --git a/bigbluebutton-html5/private/locales/zh_TW.json b/bigbluebutton-html5/private/locales/zh_TW.json index 9903129ccf52..6ea0dc6d079f 100644 --- a/bigbluebutton-html5/private/locales/zh_TW.json +++ b/bigbluebutton-html5/private/locales/zh_TW.json @@ -82,12 +82,12 @@ "app.userList.menu.directoryLookup.label": "目錄查找", "app.userList.menu.makePresenter.label": "設為簡報者", "app.userList.userOptions.manageUsersLabel": "管理使用者", - "app.userList.userOptions.muteAllLabel": "靜音所有參考者", + "app.userList.userOptions.muteAllLabel": "將所有使用者設為靜音", "app.userList.userOptions.muteAllDesc": "靜音會議中所有使用者", "app.userList.userOptions.clearAllLabel": "清除所有狀態圖示", "app.userList.userOptions.clearAllDesc": "清除所有與會者狀態圖示", - "app.userList.userOptions.muteAllExceptPresenterLabel": "除了主持人外,使用者全部靜音", - "app.userList.userOptions.muteAllExceptPresenterDesc": "除了主持人外,靜音會議中所有使用者", + "app.userList.userOptions.muteAllExceptPresenterLabel": "除了簡報者外,使用者全部靜音", + "app.userList.userOptions.muteAllExceptPresenterDesc": "除了簡報者外,靜音會議中所有使用者", "app.userList.userOptions.unmuteAllLabel": "關閉會議室靜音", "app.userList.userOptions.unmuteAllDesc": "解除會議室靜音", "app.userList.userOptions.lockViewersLabel": "鎖定聽眾", @@ -111,7 +111,7 @@ "app.media.autoplayAlertDesc": "允許存取", "app.media.screenshare.start": "畫面分享已開始", "app.media.screenshare.end": "畫面分享已結束", - "app.media.screenshare.autoplayBlockedDesc": "我們需要您的許可才能向您顯示主持人畫面。", + "app.media.screenshare.autoplayBlockedDesc": "我們需要您的許可才能向您顯示簡報者畫面。", "app.media.screenshare.autoplayAllowLabel": "查看分享畫面", "app.screenshare.notAllowed": "錯誤: 未授與畫面存取權限", "app.screenshare.notSupportedError": "錯誤: 螢幕分享只允許在安全的(SSL)域名", @@ -154,7 +154,7 @@ "app.presentation.presentationToolbar.fitToPage": "適合頁面", "app.presentation.presentationToolbar.goToSlide": "投影片 {0}", "app.presentationUploder.title": "投影片", - "app.presentationUploder.message": "作為主持人,您可以上傳任何Office文檔或PDF文件。 我們建議您使用PDF文件以獲得最佳效果。 請確保使用右側的圓形圈選框,選取了要演說的文件。", + "app.presentationUploder.message": "作為簡報者,您可以上傳任何Office文檔或PDF文件。 我們建議您使用PDF文件以獲得最佳效果。 請確保使用右側的圓形圈選框,選取了要演說的文件。", "app.presentationUploder.uploadLabel": "上傳", "app.presentationUploder.confirmLabel": "確認", "app.presentationUploder.confirmDesc": "保存變更並且啟用簡報", @@ -336,8 +336,8 @@ "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "目前的會議創建分組會議室", "app.actionsBar.actionsDropdown.captionsLabel": "寫入隱藏式字幕", "app.actionsBar.actionsDropdown.captionsDesc": "開/關字幕面版", - "app.actionsBar.actionsDropdown.takePresenter": "當主持人", - "app.actionsBar.actionsDropdown.takePresenterDesc": "設定自己為主持人", + "app.actionsBar.actionsDropdown.takePresenter": "當簡報者", + "app.actionsBar.actionsDropdown.takePresenterDesc": "設定自己為簡報者", "app.actionsBar.emojiMenu.statusTriggerLabel": "設定狀態", "app.actionsBar.emojiMenu.awayLabel": "離開", "app.actionsBar.emojiMenu.awayDesc": "變更您的狀態為離開", @@ -506,9 +506,9 @@ "app.shortcut-help.closePrivateChat": "關閉私人聊天", "app.shortcut-help.openActions": "打開動作選單", "app.shortcut-help.openStatus": "打開狀態選單", - "app.shortcut-help.togglePan": "啟用Pan工具(主持人)", - "app.shortcut-help.nextSlideDesc": "下一張投影片(主持人)", - "app.shortcut-help.previousSlideDesc": "上一張投影片(主持人)", + "app.shortcut-help.togglePan": "啟用Pan工具(簡報者)", + "app.shortcut-help.nextSlideDesc": "下一張投影片(簡報者)", + "app.shortcut-help.previousSlideDesc": "上一張投影片(簡報者)", "app.lock-viewers.title": "鎖定聽眾", "app.lock-viewers.description": "這些選項讓你禁止聽眾使用特定功能. ", "app.lock-viewers.featuresLable": "功能", From 228b3c7327e8e9f0d5c8b6d81ba46cbd72d68cfd Mon Sep 17 00:00:00 2001 From: yogiks Date: Fri, 8 May 2020 16:01:26 +0530 Subject: [PATCH 19/65] Pulled Kannada (kn.json) from Transifex --- bigbluebutton-html5/private/locales/kn.json | 686 ++++++++++++++++++++ 1 file changed, 686 insertions(+) create mode 100644 bigbluebutton-html5/private/locales/kn.json diff --git a/bigbluebutton-html5/private/locales/kn.json b/bigbluebutton-html5/private/locales/kn.json new file mode 100644 index 000000000000..4fb26843466b --- /dev/null +++ b/bigbluebutton-html5/private/locales/kn.json @@ -0,0 +1,686 @@ +{ + "app.home.greeting": "ನಿಮ್ಮ ಪ್ರಸ್ತುತಿ ಶೀಘ್ರದಲ್ಲೇ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ", + "app.chat.submitLabel": "ಸಂದೇಶವನ್ನು ಕಳುಹಿಸಿ", + "app.chat.errorMaxMessageLength": "ಸಂದೇಶವು {0} ಅಕ್ಷರಗಳಿರುವುದರಿಂದ ತುಂಬಾ ಉದ್ದವಾಗಿದೆ", + "app.chat.disconnected": "ನೀವು ಸಂಪರ್ಕದಿಂದ ಕಡಿತಗೊಂಡಿದ್ದೀರಿ, ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲಾಗುವುದಿಲ್ಲ", + "app.chat.locked": "ಚಾಟ್ ಲಾಕ್ ಆಗಿದೆ, ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲಾಗುವುದಿಲ್ಲ", + "app.chat.inputLabel": "ಚಾಟ್‌ಗಾಗಿ ಸಂದೇಶ ಇನ್‌ಪುಟ್ {0}", + "app.chat.inputPlaceholder": "{0} ರವರಿಗೆ ಸಂದೇಶವನ್ನು ಕಳುಹಿಸಿ", + "app.chat.titlePublic": "ಸಾರ್ವಜನಿಕ ಚಾಟ್", + "app.chat.titlePrivate": "ಇವರೊಂದಿಗೆ ಖಾಸಗಿ ಚಾಟ್ {0}", + "app.chat.partnerDisconnected": "ಸಭೆಯಿಂದ ಹೊರಬಂದಿದ್ದಾರೆ {0}", + "app.chat.closeChatLabel": "ಮುಚ್ಚಿ {0}", + "app.chat.hideChatLabel": "ಮರೆಮಾಡಿ {0}", + "app.chat.moreMessages": "ಕೆಳಗಿನ ಹೆಚ್ಚಿನ ಸಂದೇಶಗಳು", + "app.chat.dropdown.options": "ಚಾಟ್ ಆಯ್ಕೆಗಳು", + "app.chat.dropdown.clear": "ಸ್ಪಷ್ಟ", + "app.chat.dropdown.copy": "ನಕಲಿಸಿ", + "app.chat.dropdown.save": "ಉಳಿಸಿ", + "app.chat.label": "ಚಾಟ್‌", + "app.chat.offline": "ಆಫ್‌ಲೈನ್", + "app.chat.emptyLogLabel": "ಚಾಟ್ ಲಾಗ್ ಖಾಲಿಯಾಗಿದೆ", + "app.chat.clearPublicChatMessage": "ಸಾರ್ವಜನಿಕ ಚಾಟ್ ಇತಿಹಾಸವನ್ನು ಮಾಡರೇಟರ್ ತೆರವುಗೊಳಿಸಿದ್ದಾರೆ", + "app.chat.multi.typing": "ಹಲವು ಬಳಕೆದಾರರು ಟೈಪ್ ಮಾಡುತ್ತಿದ್ದಾರೆ", + "app.chat.one.typing": "{0} ಟೈಪ್ ಮಾಡುತ್ತಿರುವರು", + "app.chat.two.typing": "{0} ಮತ್ತು {1} ಟೈಪ್ ಮಾಡುತ್ತಿದ್ದಾರೆ", + "app.captions.label": "ಶೀರ್ಷಿಕೆಗಳು", + "app.captions.menu.close": "ಮುಚ್ಚಿ {0}", + "app.captions.menu.start": "ಪ್ರಾರಂಭಿಸಿ", + "app.captions.menu.ariaStart": "ಶೀರ್ಷಿಕೆಗಳನ್ನು ಬರೆಯಲು ಪ್ರಾರಂಭಿಸಿ", + "app.captions.menu.ariaStartDesc": "ಶೀರ್ಷಿಕೆಗಳ ಸಂಪಾದಕವನ್ನು ತೆರೆಯುತ್ತದೆ ಮತ್ತು ಮೋಡಲ್ ಅನ್ನು ಮುಚ್ಚುತ್ತದೆ", + "app.captions.menu.select": "ಲಭ್ಯವಿರುವ ಭಾಷೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "app.captions.menu.ariaSelect": "ಶೀರ್ಷಿಕೆಗಳ ಭಾಷೆ", + "app.captions.menu.subtitle": "ನಿಮ್ಮ ಅಧಿವೇಶನದಲ್ಲಿ ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಗಳಿಗಾಗಿ ದಯವಿಟ್ಟು ಭಾಷೆ ಮತ್ತು ಶೈಲಿಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ.", + "app.captions.menu.title": "ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಗಳು", + "app.captions.menu.fontSize": "ಗಾತ್ರ", + "app.captions.menu.fontColor": "ಪಠ್ಯದ ಬಣ್ಣ", + "app.captions.menu.fontFamily": "ಅಕ್ಷರ ವಿನ್ಯಾಸ", + "app.captions.menu.backgroundColor": "ಹಿನ್ನೆಲೆ ಬಣ್ಣ", + "app.captions.menu.previewLabel": "ಮುನ್ನೋಟ", + "app.captions.menu.cancelLabel": "ರದ್ದುಮಾಡಿ", + "app.captions.pad.hide": "ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಗಳನ್ನು ಮರೆಮಾಡಿ", + "app.captions.pad.tip": "ಫೋಕಸ್ ಎಡಿಟರ್ ಟೂಲ್‌ಬಾರ್ ಮಾಡಲು Esc ಒತ್ತಿರಿ", + "app.captions.pad.ownership": "ವಹಿಸಿಕೊಳ್ಳಿ", + "app.captions.pad.ownershipTooltip": "ನಿಮ್ಮನ್ನು {0} ಶೀರ್ಷಿಕೆಗಳ ಮಾಲೀಕರಾಗಿ ನಿಯೋಜಿಸಲಾಗುತ್ತದೆ", + "app.captions.pad.interimResult": "ಮಧ್ಯಂತರ ಫಲಿತಾಂಶಗಳು", + "app.captions.pad.dictationStart": "ಉಕ್ತಲೇಖನ ಪ್ರಾರಂಭಿಸಿ", + "app.captions.pad.dictationStop": "ಉಕ್ತಲೇಖನ ನಿಲ್ಲಿಸಿ", + "app.captions.pad.dictationOnDesc": "ಭಾಷಣ ಗುರುತಿಸುವಿಕೆಯನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ", + "app.captions.pad.dictationOffDesc": "ಭಾಷಣ ಗುರುತಿಸುವಿಕೆಯನ್ನು ಆಫ್ ಮಾಡುತ್ತದೆ", + "app.note.title": "ಹಂಚಿದ ಟಿಪ್ಪಣಿಗಳು", + "app.note.label": "ಸೂಚನೆ", + "app.note.hideNoteLabel": "ಟಿಪ್ಪಣಿ ಮರೆಮಾಡಿ", + "app.user.activityCheck": "ಬಳಕೆದಾರರ ಚಟುವಟಿಕೆ ಪರಿಶೀಲನೆ", + "app.user.activityCheck.label": "ಬಳಕೆದಾರರು ಇನ್ನೂ ಸಭೆಯಲ್ಲಿದ್ದಾರೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ ({0})", + "app.user.activityCheck.check": "ಪರಿಶೀಲಿಸಿ", + "app.note.tipLabel": "ಫೋಕಸ್ ಎಡಿಟರ್ ಟೂಲ್‌ಬಾರ್ ಮಾಡಲು Esc ಒತ್ತಿರಿ", + "app.userList.usersTitle": "ಬಳಕೆದಾರರು", + "app.userList.participantsTitle": "ಭಾಗವಹಿಸುವವರು", + "app.userList.messagesTitle": "ಸಂದೇಶಗಳು", + "app.userList.notesTitle": "ಟಿಪ್ಪಣಿಗಳು", + "app.userList.notesListItem.unreadContent": "ಹಂಚಿದ ಟಿಪ್ಪಣಿಗಳ ವಿಭಾಗದಲ್ಲಿ ಹೊಸ ವಿಷಯ ಲಭ್ಯವಿದೆ", + "app.userList.captionsTitle": "ಶೀರ್ಷಿಕೆಗಳು", + "app.userList.presenter": "ಪ್ರಸ್ತುತ ಪಡಿಸುವವ", + "app.userList.you": "ನೀವು", + "app.userList.locked": "ಲಾಕ್ ಮಾಡಲಾಗಿದೆ", + "app.userList.label": "ಬಳಕೆದಾರರ ಪಟ್ಟಿ", + "app.userList.toggleCompactView.label": "ಕಾಂಪ್ಯಾಕ್ಟ್ ವೀಕ್ಷಣೆ ಮೋಡ್ ಅನ್ನು ಟಾಗಲ್ ಮಾಡಿ", + "app.userList.guest": "ಅತಿಥಿ", + "app.userList.menuTitleContext": "ಲಭ್ಯವಿರುವ ಆಯ್ಕೆಗಳು", + "app.userList.chatListItem.unreadSingular": "{0} ಹೊಸ ಸಂದೇಶ", + "app.userList.chatListItem.unreadPlural": "{0} ಹೊಸ ಸಂದೇಶಗಳು", + "app.userList.menu.chat.label": "ಖಾಸಗಿ ಚಾಟ್ ಪ್ರಾರಂಭಿಸಿ", + "app.userList.menu.clearStatus.label": "ಸ್ಥಿತಿಯನ್ನು ತೆರವುಗೊಳಿಸಿ", + "app.userList.menu.removeUser.label": "ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕಿ", + "app.userList.menu.muteUserAudio.label": "ಬಳಕೆದಾರರನ್ನು ಸ್ಥಬ್ಧ ಮಾಡಿ", + "app.userList.menu.unmuteUserAudio.label": "ಬಳಕೆದಾರರನ್ನು ಸ್ಥಬ್ಧತೆಯಿಂದ ತೆರೆಯಿರಿ", + "app.userList.userAriaLabel": "{0}, {1}, {2} ಸ್ಥಿತಿ {3}", + "app.userList.menu.promoteUser.label": "ಮಾಡರೇಟರ್‌ಗೆ ಮುಂಬಡ್ತಿ ನೀಡಿ", + "app.userList.menu.demoteUser.label": "ವೀಕ್ಷಕರಾಗಿ ಹಿಂಬಡ್ತಿ ನೀಡಿ", + "app.userList.menu.unlockUser.label": "ಅನ್ಲಾಕ್ ಮಾಡಿ {0}", + "app.userList.menu.lockUser.label": "{0} ಲಾಕ್ ಮಾಡಿ", + "app.userList.menu.directoryLookup.label": "ಸೂಚಿಕೆಯಲ್ಲಿ ಹುಡುಕಿ", + "app.userList.menu.makePresenter.label": "ಪ್ರಸ್ತುತಪಡುವವರಾಗಿ ಮಾಡಿ", + "app.userList.userOptions.manageUsersLabel": "ಬಳಕೆದಾರರನ್ನು ನಿರ್ವಹಿಸಿ", + "app.userList.userOptions.muteAllLabel": "ಎಲ್ಲಾ ಬಳಕೆದಾರರನ್ನು ಸ್ಥಬ್ಧ ಮಾಡಿ", + "app.userList.userOptions.muteAllDesc": "ಸಭೆಯಲ್ಲಿ ಎಲ್ಲಾ ಬಳಕೆದಾರರನ್ನು ಸ್ಥಬ್ಧ ಮಾಡುತ್ತದೆ", + "app.userList.userOptions.clearAllLabel": "ಎಲ್ಲಾ ಸ್ಥಿತಿ ಲಾಂಛನಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ", + "app.userList.userOptions.clearAllDesc": "ಬಳಕೆದಾರರಿಂದ ಎಲ್ಲಾ ಸ್ಥಿತಿ ಲಾಂಛನಗಳನ್ನು ತೆರವುಗೊಳಿಸುತ್ತದೆ", + "app.userList.userOptions.muteAllExceptPresenterLabel": "ಪ್ರಸ್ತುತಪಡುವವರನ್ನು ಹೊರತುಪಡಿಸಿ ಎಲ್ಲಾ ಬಳಕೆದಾರರನ್ನು ಸ್ಥಬ್ಧ ಮಾಡಿ", + "app.userList.userOptions.muteAllExceptPresenterDesc": "ಪ್ರಸ್ತುತಪಡುವವರನ್ನು ಹೊರತುಪಡಿಸಿ ಸಭೆಯಲ್ಲಿರುವ ಎಲ್ಲ ಬಳಕೆದಾರರನ್ನು ಸ್ಥಬ್ಧ ಮಾಡುತ್ತದೆ", + "app.userList.userOptions.unmuteAllLabel": "ಸಭೆಯ ಸ್ಥಬ್ಧವನ್ನು ಆರಿಸಿರಿ", + "app.userList.userOptions.unmuteAllDesc": "ಸಭೆಯನ್ನು ಸ್ಥಬ್ಧತೆಯಿಂದ ತೆರೆಯುತ್ತದೆ", + "app.userList.userOptions.lockViewersLabel": "ವೀಕ್ಷಕರನ್ನು ಲಾಕ್ ಮಾಡಿ", + "app.userList.userOptions.lockViewersDesc": "ಸಭೆಯಲ್ಲಿ ಪಾಲ್ಗೊಳ್ಳುವವರಿಗೆ ಕೆಲವು ಕಾರ್ಯಗಳನ್ನು ಲಾಕ್ ಮಾಡಿ", + "app.userList.userOptions.disableCam": "ವೀಕ್ಷಕರ ವೆಬ್‌ಕ್ಯಾಮ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.userList.userOptions.disableMic": "ವೀಕ್ಷಕರ ಮೈಕ್ರೊಫೋನ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.userList.userOptions.disablePrivChat": "ಖಾಸಗಿ ಚಾಟ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.userList.userOptions.disablePubChat": "ಸಾರ್ವಜನಿಕ ಚಾಟ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.userList.userOptions.disableNote": "ಹಂಚಿದ ಟಿಪ್ಪಣಿಗಳನ್ನು ಈಗ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ", + "app.userList.userOptions.hideUserList": "ಬಳಕೆದಾರರ ಪಟ್ಟಿಯನ್ನು ಈಗ ವೀಕ್ಷಕರಿಗೆ ಮರೆಮಾಡಲಾಗಿದೆ", + "app.userList.userOptions.webcamsOnlyForModerator": "ಮಾಡರೇಟರ್‌ಗಳು ಮಾತ್ರ ವೀಕ್ಷಕರ ವೆಬ್‌ಕ್ಯಾಮ್‌ಗಳನ್ನು ನೋಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ (ಲಾಕ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಕಾರಣ)", + "app.userList.content.participants.options.clearedStatus": "ಎಲ್ಲಾ ಬಳಕೆದಾರರ ಸ್ಥಿತಿಗಳನ್ನು ತೆರವುಗೊಳಿಸಲಾಗಿದೆ", + "app.userList.userOptions.enableCam": "ವೀಕ್ಷಕರ ವೆಬ್‌ಕ್ಯಾಮ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.userList.userOptions.enableMic": "ವೀಕ್ಷಕರ ಮೈಕ್ರೊಫೋನ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.userList.userOptions.enablePrivChat": "ಖಾಸಗಿ ಚಾಟ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.userList.userOptions.enablePubChat": "ಸಾರ್ವಜನಿಕ ಚಾಟ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.userList.userOptions.enableNote": "ಹಂಚಿದ ಟಿಪ್ಪಣಿಗಳನ್ನು ಈಗ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.userList.userOptions.showUserList": "ಬಳಕೆದಾರರ ಪಟ್ಟಿಯನ್ನು ಈಗ ವೀಕ್ಷಕರಿಗೆ ತೋರಿಸಲಾಗಿದೆ", + "app.userList.userOptions.enableOnlyModeratorWebcam": "ನಿಮ್ಮ ವೆಬ್‌ಕ್ಯಾಮ್ ಅನ್ನು ನೀವು ಈಗ ಸಕ್ರಿಯಗೊಳಿಸಬಹುದು, ಎಲ್ಲರೂ ನಿಮ್ಮನ್ನು ನೋಡುತ್ತಾರೆ", + "app.media.label": "ಮಾಧ್ಯಮ", + "app.media.autoplayAlertDesc": "ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಿ", + "app.media.screenshare.start": "ಸ್ಕ್ರೀನ್‌ಶೇರ್ ಪ್ರಾರಂಭವಾಗಿದೆ", + "app.media.screenshare.end": "ಸ್ಕ್ರೀನ್‌ಶೇರ್ ಕೊನೆಗೊಂಡಿದೆ", + "app.media.screenshare.unavailable": "ಸ್ಕ್ರೀನ್‌ಶೇರ್ ಲಭ್ಯವಿಲ್ಲ", + "app.media.screenshare.safariNotSupported": "ಸ್ಕ್ರೀನ್‌ಶೇರ್ ಅನ್ನು ಸಫಾರಿಯಲ್ಲಿ ಪ್ರಸ್ತುತ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ದಯವಿಟ್ಟು, ಫೈರ್‌ಫಾಕ್ಸ್ ಅಥವಾ ಗೂಗಲ್ ಕ್ರೋಮ್ ಬಳಸಿ.", + "app.media.screenshare.autoplayBlockedDesc": "ನಿರೂಪಕರ ಪರದೆಯನ್ನು ನಿಮಗೆ ತೋರಿಸಲು ನಮಗೆ ನಿಮ್ಮ ಅನುಮತಿ ಬೇಕು.", + "app.media.screenshare.autoplayAllowLabel": "ಹಂಚಿದ ಪರದೆಯನ್ನು ವೀಕ್ಷಿಸಿ", + "app.screenshare.notAllowed": "ದೋಷ: ಪರದೆಯನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿ ನೀಡಲಾಗಿಲ್ಲ.", + "app.screenshare.notSupportedError": "ದೋಷ: ಸುರಕ್ಷಿತ (ಎಸ್‌ಎಸ್‌ಎಲ್) ಡೊಮೇನ್‌ಗಳಲ್ಲಿ ಮಾತ್ರ ಸ್ಕ್ರೀನ್‌ಶೇರಿಂಗ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ", + "app.screenshare.notReadableError": "ದೋಷ: ನಿಮ್ಮ ಪರದೆಯನ್ನು ಸೆರೆಹಿಡಿಯಲು ಪ್ರಯತ್ನಿಸುವಾಗ ವಿಫಲವಾಗಿದೆ", + "app.screenshare.genericError": "ದೋಷ: ಸ್ಕ್ರೀನ್‌ಶೇರಿಂಗ್‌ನಲ್ಲಿ ದೋಷ ಸಂಭವಿಸಿದೆ, ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ", + "app.meeting.ended": "ಈ ಅಧಿವೇಶನ ಕೊನೆಗೊಂಡಿದೆ", + "app.meeting.meetingTimeRemaining": "ಸಭೆಯ ಸಮಯ ಉಳಿದಿದೆ: {0}", + "app.meeting.meetingTimeHasEnded": "ಸಮಯ ಕೊನೆಗೊಂಡಿತು. ಸಭೆ ಶೀಘ್ರದಲ್ಲೇ ಮುಚ್ಚಲಿದೆ", + "app.meeting.endedMessage": "ನಿಮ್ಮನ್ನು ಮತ್ತೆ ಮುಖಪುಟಕ್ಕೆ ರವಾನಿಸಲಾಗುತ್ತದೆ", + "app.meeting.alertMeetingEndsUnderOneMinute": "ಸಭೆ ಒಂದು ನಿಮಿಷದಲ್ಲಿ ಮುಚ್ಚುತ್ತಿದೆ.", + "app.meeting.alertBreakoutEndsUnderOneMinute": "ಬ್ರೇಕ್ out ಟ್ ಒಂದು ನಿಮಿಷದಲ್ಲಿ ಮುಚ್ಚುತ್ತಿದೆ.", + "app.presentation.hide": "ಪ್ರಸ್ತುತಿಯನ್ನು ಮರೆಮಾಡಿ", + "app.presentation.notificationLabel": "ಪ್ರಸ್ತುತ ಪ್ರಸ್ತುತಿ", + "app.presentation.slideContent": "ಜಾರುಕ ವಿಷಯ", + "app.presentation.startSlideContent": "ಜಾರುಕದ ವಿಷಯ ಪ್ರಾರಂಭ", + "app.presentation.endSlideContent": "ಜಾರುಕದ ವಿಷಯ ಅಂತ್ಯ", + "app.presentation.emptySlideContent": "ಪ್ರಸ್ತುತ ಸ್ಲೈಡ್‌ಗೆ ಯಾವುದೇ ವಿಷಯವಿಲ್ಲ", + "app.presentation.presentationToolbar.noNextSlideDesc": "ಪ್ರಸ್ತುತಿಯ ಅಂತ್ಯ", + "app.presentation.presentationToolbar.noPrevSlideDesc": "ಪ್ರಸ್ತುತಿಯ ಪ್ರಾರಂಭ", + "app.presentation.presentationToolbar.selectLabel": "ಜಾರುಕ ಆಯ್ಕೆಮಾಡಿ", + "app.presentation.presentationToolbar.prevSlideLabel": "ಹಿಂದಿನ ಜಾರುಕ", + "app.presentation.presentationToolbar.prevSlideDesc": "ಪ್ರಸ್ತುತಿಯನ್ನು ಹಿಂದಿನ ಜಾರುಕಕ್ಕೆ ಬದಲಾಯಿಸಿ", + "app.presentation.presentationToolbar.nextSlideLabel": "ಮುಂದಿನ ಜಾರುಕ", + "app.presentation.presentationToolbar.nextSlideDesc": "ಪ್ರಸ್ತುತಿಯನ್ನು ಮುಂದಿನ ಸ್ಲೈಡ್‌ಗೆ ಬದಲಾಯಿಸಿ", + "app.presentation.presentationToolbar.skipSlideLabel": "ಜಾರುಕ ಬಿಟ್ಟುಬಿಡಿ", + "app.presentation.presentationToolbar.skipSlideDesc": "ಪ್ರಸ್ತುತಿಯನ್ನು ನಿರ್ದಿಷ್ಟ ಜಾರುಕಕ್ಕೆ ಬದಲಾಯಿಸಿ", + "app.presentation.presentationToolbar.fitWidthLabel": "ಅಗಲಕ್ಕೆ ಹೊಂದಿಕೊಳ್ಳಿ", + "app.presentation.presentationToolbar.fitWidthDesc": "ಜಾರುಕದ ಸಂಪೂರ್ಣ ಅಗಲವನ್ನು ಪ್ರದರ್ಶಿಸಿ", + "app.presentation.presentationToolbar.fitScreenLabel": "ಪರದೆಗೆ ಹೊಂದಿಕೊಳ್ಳಿ", + "app.presentation.presentationToolbar.fitScreenDesc": "ಇಡೀ ಜಾರುಕವನ್ನು ಪ್ರದರ್ಶಿಸಿ", + "app.presentation.presentationToolbar.zoomLabel": "ಜೂಮ್ ಮಾಡಿ", + "app.presentation.presentationToolbar.zoomDesc": "ಪ್ರಸ್ತುತಿಯ ಜೂಮ್ ಮಟ್ಟವನ್ನು ಬದಲಾಯಿಸಿ", + "app.presentation.presentationToolbar.zoomInLabel": "ಇನ್ನು ಹತ್ತಿರವಾಗಿಸಿ", + "app.presentation.presentationToolbar.zoomInDesc": "ಪ್ರಸ್ತುತಿಯಲ್ಲಿ ಜೂಮ್ ಮಾಡಿ", + "app.presentation.presentationToolbar.zoomOutLabel": "ಜೂಮ್‌ ಔಟ್ ಮಾಡಿ", + "app.presentation.presentationToolbar.zoomOutDesc": "ಪ್ರಸ್ತುತಿಯಿಂದ ಜೂಮ್‌ ಔಟ್ ಮಾಡಿ", + "app.presentation.presentationToolbar.zoomReset": "ಜೂಮ್ ಅನ್ನು ಮರುಹೊಂದಿಸಿ", + "app.presentation.presentationToolbar.zoomIndicator": "ಪ್ರಸ್ತುತ ಜೂಮ್ ಶೇಕಡಾವಾರು", + "app.presentation.presentationToolbar.fitToWidth": "ಅಗಲಕ್ಕೆ ಹೊಂದಿಕೊಳ್ಳಿ", + "app.presentation.presentationToolbar.fitToPage": "ಪುಟಕ್ಕೆ ತಕ್ಕಂತೆ ಹೊಂದಿಸಿ", + "app.presentation.presentationToolbar.goToSlide": "ಜಾರುಕ {0}", + "app.presentationUploder.title": "ಪ್ರಸ್ತುತಿ", + "app.presentationUploder.message": "ನಿರೂಪಕ ಆಗಿ ನೀವು ಯಾವುದೇ ಕಚೇರಿ ಡಾಕ್ಯುಮೆಂಟ್ ಅಥವಾ ಪಿಡಿಎಫ್ ಫೈಲ್ ಅನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಹೊಂದಿದ್ದೀರಿ. ಉತ್ತಮ ಫಲಿತಾಂಶಗಳಿಗಾಗಿ ನಾವು ಪಿಡಿಎಫ್ ಫೈಲ್ ಅನ್ನು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ. ಬಲಭಾಗದಲ್ಲಿರುವ ವೃತ್ತದ ಚೆಕ್‌ಬಾಕ್ಸ್ ಬಳಸಿ ಪ್ರಸ್ತುತಿಯನ್ನು ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.", + "app.presentationUploder.uploadLabel": "ಅಪ್‌ಲೋಡ್ ಮಾಡಿ", + "app.presentationUploder.confirmLabel": "ದೃಢೀಕರಿಸಿ", + "app.presentationUploder.confirmDesc": "ನಿಮ್ಮ ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಿ ಮತ್ತು ಪ್ರಸ್ತುತಿಯನ್ನು ಪ್ರಾರಂಭಿಸಿ", + "app.presentationUploder.dismissLabel": "ರದ್ದುಮಾಡಿ", + "app.presentationUploder.dismissDesc": "ಮೋಡಲ್ ವಿಂಡೋವನ್ನು ಮುಚ್ಚಿ ಮತ್ತು ನಿಮ್ಮ ಬದಲಾವಣೆಗಳನ್ನು ತ್ಯಜಿಸಿ", + "app.presentationUploder.dropzoneLabel": "ಕಡತಗಳನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಇಲ್ಲಿ ಎಳೆಯಿರಿ", + "app.presentationUploder.dropzoneImagesLabel": "ಚಿತ್ರಗಳನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಇಲ್ಲಿ ಎಳೆಯಿರಿ", + "app.presentationUploder.browseFilesLabel": "ಅಥವಾ ಕಡತಗಳಿಗಾಗಿ ಬ್ರೌಸ್ ಮಾಡಿ", + "app.presentationUploder.browseImagesLabel": "ಅಥವಾ ಚಿತ್ರಗಳಿಗಾಗಿ ಬ್ರೌಸ್ ಮಾಡಿ / ಸೆರೆಹಿಡಿಯಿರಿ", + "app.presentationUploder.fileToUpload": "ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ...", + "app.presentationUploder.currentBadge": "ಪ್ರಸ್ತುತ", + "app.presentationUploder.rejectedError": "ಆಯ್ದ ಕಡತ (ಗಳನ್ನು) ತಿರಸ್ಕರಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಕಡತ ಪ್ರಕಾರ (ಗಳನ್ನು) ಪರಿಶೀಲಿಸಿ.", + "app.presentationUploder.upload.progress": "ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ ({0}%)", + "app.presentationUploder.upload.413": "ಕಡತ ತುಂಬಾ ದೊಡ್ಡದಾಗಿದೆ. ದಯವಿಟ್ಟು ಬಹು ಕಡತಗಳಾಗಿ ವಿಭಜಿಸಿ.", + "app.presentationUploder.upload.408": "ಅಪ್ಲೋಡ್ ಟೋಕನ್ ಟೈಮ್ಔಟ್ ಆಗಿದೆ.", + "app.presentationUploder.upload.404": "404: ಅಪ್ಲೋಡ್ ಟೋಕನ್ ಸರಿಯಿಲ್ಲ", + "app.presentationUploder.upload.401": "ಪ್ರೆಸಂಟೇಶನ್ ಅಪ್ಲೋಡ್ ಮಾಡುವ ಕೋರಿಕೆ ವಿಫಲವಾಗಿದೆ.", + "app.presentationUploder.conversion.conversionProcessingSlides": "{0} ನ {1} ಪುಟವನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲಾಗುತ್ತಿದೆ", + "app.presentationUploder.conversion.genericConversionStatus": "ಕಡತವನ್ನು ಪರಿವರ್ತಿಸಲಾಗುತ್ತಿದೆ ...", + "app.presentationUploder.conversion.generatingThumbnail": "ಥಂಬ್‌ನೇಲ್‌ಗಳನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ ...", + "app.presentationUploder.conversion.generatedSlides": "ಜಾರುಕಗಳನ್ನು ರಚಿಸಲಾಗಿದೆ ...", + "app.presentationUploder.conversion.generatingSvg": "ಎಸ್‌ವಿಜಿ ಚಿತ್ರಗಳನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ ...", + "app.presentationUploder.conversion.pageCountExceeded": "ಪುಟಗಳ ಸಂಖ್ಯೆ ಮೀರಿದೆ. ದಯವಿಟ್ಟು ಫೈಲ್ ಅನ್ನು ಬಹು ಫೈಲ್‌ಗಳಾಗಿ ವಿಭಜಿಸಿ.", + "app.presentationUploder.conversion.officeDocConversionInvalid": "ಕಚೇರಿ ಡಾಕ್ಯುಮೆಂಟ್ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ. ಬದಲಿಗೆ ಪಿಡಿಎಫ್ ಅನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿ.", + "app.presentationUploder.conversion.officeDocConversionFailed": "ಕಚೇರಿ ಡಾಕ್ಯುಮೆಂಟ್ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ. ಬದಲಿಗೆ ಪಿಡಿಎಫ್ ಅನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿ.", + "app.presentationUploder.conversion.pdfHasBigPage": "ನಮಗೆ ಪಿಡಿಎಫ್ ಫೈಲ್ ಅನ್ನು ಪರಿವರ್ತಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ, ದಯವಿಟ್ಟು ಅದನ್ನು ಅತ್ಯುತ್ತಮವಾಗಿಸಲು ಪ್ರಯತ್ನಿಸಿ", + "app.presentationUploder.conversion.timeout": "ಅಯ್ಯೊ, ಪರಿವರ್ತನೆ ತುಂಬಾ ಸಮಯ ತೆಗೆದುಕೊಂಡಿತು", + "app.presentationUploder.conversion.pageCountFailed": "ಪುಟಗಳ ಸಂಖ್ಯೆಯನ್ನು ನಿರ್ಧರಿಸಲು ವಿಫಲವಾಗಿದೆ.", + "app.presentationUploder.isDownloadableLabel": "ಪ್ರಸ್ತುತಿಯನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು ಅನುಮತಿಸಬೇಡಿ", + "app.presentationUploder.isNotDownloadableLabel": "ಪ್ರಸ್ತುತಿಯನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು ಅನುಮತಿಸಿ", + "app.presentationUploder.removePresentationLabel": "ಪ್ರಸ್ತುತಿಯನ್ನು ತೆಗೆದುಹಾಕಿ", + "app.presentationUploder.setAsCurrentPresentation": "ಪ್ರಸ್ತುತಿಯನ್ನು ಪ್ರಸ್ತುತ ಎಂದು ಹೊಂದಿಸಿ", + "app.presentationUploder.tableHeading.filename": "ಕಡತದ ಹೆಸರು", + "app.presentationUploder.tableHeading.options": "ಆಯ್ಕೆಗಳು", + "app.presentationUploder.tableHeading.status": "ಸ್ಥಿತಿ", + "app.poll.pollPaneTitle": "ಮತದಾನ", + "app.poll.quickPollTitle": "ತ್ವರಿತ ಸಮೀಕ್ಷೆ", + "app.poll.hidePollDesc": "ಸಮೀಕ್ಷೆ ಮೆನು ಫಲಕವನ್ನು ಮರೆಮಾಡುತ್ತದೆ", + "app.poll.customPollInstruction": "ಕಸ್ಟಮ್ ಸಮೀಕ್ಷೆಯನ್ನು ರಚಿಸಲು, ಕೆಳಗಿನ ಬಟನ್ ಆಯ್ಕೆಮಾಡಿ ಮತ್ತು ನಿಮ್ಮ ಆಯ್ಕೆಗಳನ್ನು ನಮೂದಿಸಿ.", + "app.poll.quickPollInstruction": "ನಿಮ್ಮ ಸಮೀಕ್ಷೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಕೆಳಗಿನ ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ.", + "app.poll.customPollLabel": "ಕಸ್ಟಮ್ ಸಮೀಕ್ಷೆ", + "app.poll.startCustomLabel": "ಕಸ್ಟಮ್ ಸಮೀಕ್ಷೆಯನ್ನು ಪ್ರಾರಂಭಿಸಿ", + "app.poll.activePollInstruction": "ನಿಮ್ಮ ಸಮೀಕ್ಷೆಗೆ ನೇರ ಪ್ರತಿಕ್ರಿಯೆಗಳನ್ನು ನೋಡಲು ಈ ಫಲಕವನ್ನು ಮುಕ್ತವಾಗಿ ಬಿಡಿ. ನೀವು ಸಿದ್ಧರಾದಾಗ, ಫಲಿತಾಂಶಗಳನ್ನು ಪ್ರಕಟಿಸಲು ಮತ್ತು ಮತದಾನವನ್ನು ಕೊನೆಗೊಳಿಸಲು 'ಮತದಾನ ಫಲಿತಾಂಶಗಳನ್ನು ಪ್ರಕಟಿಸಿ' ಆಯ್ಕೆಮಾಡಿ.", + "app.poll.publishLabel": "ಮತದಾನ ಫಲಿತಾಂಶಗಳನ್ನು ಪ್ರಕಟಿಸಿ", + "app.poll.backLabel": "ಮತದಾನದ ಆಯ್ಕೆಗಳಿಗೆ ಹಿಂತಿರುಗಿ", + "app.poll.closeLabel": "ಮುಚ್ಚಿ", + "app.poll.waitingLabel": "ಪ್ರತಿಕ್ರಿಯೆಗಳಿಗಾಗಿ ಕಾಯಲಾಗುತ್ತಿದೆ ({0} / {1})", + "app.poll.ariaInputCount": "{1} ನ ಕಸ್ಟಮ್ ಪೋಲ್ ಆಯ್ಕೆ {0}", + "app.poll.customPlaceholder": "ಮತದಾನ ಆಯ್ಕೆಯನ್ನು ಸೇರಿಸಿ", + "app.poll.noPresentationSelected": "ಯಾವುದೇ ಪ್ರಸ್ತುತಿಯನ್ನು ಆಯ್ಕೆ ಮಾಡಿಲ್ಲ! ದಯವಿಟ್ಟು ಒಂದನ್ನು ಆರಿಸಿ.", + "app.poll.clickHereToSelect": "ಆಯ್ಕೆ ಮಾಡಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ", + "app.poll.t": "ಸರಿ", + "app.poll.f": "ತಪ್ಪು", + "app.poll.tf": "ಸರಿ / ತಪ್ಪು", + "app.poll.y": "ಹೌದು", + "app.poll.n": "ಇಲ್ಲ", + "app.poll.yn": "ಹೌದು / ಅಲ್ಲ", + "app.poll.a2": "A / B", + "app.poll.a3": "A / B / C", + "app.poll.a4": "A / B / C / D", + "app.poll.a5": "A / B / C / D / E", + "app.poll.answer.true": "ಸರಿ", + "app.poll.answer.false": "ತಪ್ಪು", + "app.poll.answer.yes": "ಹೌದು", + "app.poll.answer.no": "ಇಲ್ಲ", + "app.poll.answer.a": "A", + "app.poll.answer.b": "B", + "app.poll.answer.c": "C", + "app.poll.answer.d": "D", + "app.poll.answer.e": "E", + "app.poll.liveResult.usersTitle": "ಬಳಕೆದಾರರು", + "app.poll.liveResult.responsesTitle": "ಪ್ರತಿಕ್ರಿಯೆ", + "app.polling.pollingTitle": "ಮತದಾನದ ಆಯ್ಕೆಗಳು", + "app.polling.pollAnswerLabel": "ಸಮೀಕ್ಷೆಯ ಉತ್ತರ {0}", + "app.polling.pollAnswerDesc": "{0} ಗೆ ಮತ ಚಲಾಯಿಸಲು ಈ ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ", + "app.failedMessage": "ಕ್ಷಮೆಯಾಚಿಸಿ, ಸರ್ವರ್‌ಗೆ ಸಂಪರ್ಕಿಸಲು ತೊಂದರೆ.", + "app.downloadPresentationButton.label": "ಮೂಲ ಪ್ರಸ್ತುತಿಯನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ", + "app.connectingMessage": "ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ ...", + "app.waitingMessage": "ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ. {0} ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮರುಸಂಪರ್ಕಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ ...", + "app.retryNow": "ಈಗ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ", + "app.navBar.settingsDropdown.optionsLabel": "ಆಯ್ಕೆಗಳು", + "app.navBar.settingsDropdown.fullscreenLabel": "ಪೂರ್ಣಪರದೆ ಮಾಡಿ", + "app.navBar.settingsDropdown.settingsLabel": "ಸಂಯೋಜನೆಗಳು", + "app.navBar.settingsDropdown.aboutLabel": "ಬಗ್ಗೆ", + "app.navBar.settingsDropdown.leaveSessionLabel": "ಲಾಗ್ ಔಟ್", + "app.navBar.settingsDropdown.exitFullscreenLabel": "ಪೂರ್ಣಪರದೆ ನಿರ್ಗಮಿಸಿ", + "app.navBar.settingsDropdown.fullscreenDesc": "ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಮೆನುವನ್ನು ಪೂರ್ಣಪರದೆ ಮಾಡಿ", + "app.navBar.settingsDropdown.settingsDesc": "ಸಾಮಾನ್ಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಿ", + "app.navBar.settingsDropdown.aboutDesc": "ಕ್ಲೈಂಟ್ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ತೋರಿಸಿ", + "app.navBar.settingsDropdown.leaveSessionDesc": "ಸಭೆಯನ್ನು ಬಿಡಿ", + "app.navBar.settingsDropdown.exitFullscreenDesc": "ಪೂರ್ಣಪರದೆ ಮೋಡ್‌ನಿಂದ ನಿರ್ಗಮಿಸಿ", + "app.navBar.settingsDropdown.hotkeysLabel": "ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು", + "app.navBar.settingsDropdown.hotkeysDesc": "ಲಭ್ಯವಿರುವ ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳ ಪಟ್ಟಿ", + "app.navBar.settingsDropdown.helpLabel": "ಸಹಾಯ", + "app.navBar.settingsDropdown.helpDesc": "ವೀಡಿಯೊ ಟ್ಯುಟೋರಿಯಲ್ಗಳಿಗೆ ಬಳಕೆದಾರರನ್ನು ಲಿಂಕ್ ಮಾಡುತ್ತದೆ (ಹೊಸ ಟ್ಯಾಬ್ ತೆರೆಯುತ್ತದೆ)", + "app.navBar.settingsDropdown.endMeetingDesc": "ಪ್ರಸ್ತುತ ಸಭೆಯನ್ನು ಕೊನೆಗೊಳಿಸುತ್ತದೆ", + "app.navBar.settingsDropdown.endMeetingLabel": "ಸಭೆಯನ್ನು ಕೊನೆಗೊಳಿಸಿ", + "app.navBar.userListToggleBtnLabel": "ಬಳಕೆದಾರರ ಪಟ್ಟಿ ಟಾಗಲ್ ಮಾಡಿ", + "app.navBar.toggleUserList.ariaLabel": "ಬಳಕೆದಾರರು ಮತ್ತು ಸಂದೇಶಗಳು ಟಾಗಲ್ ಆಗುತ್ತವೆ", + "app.navBar.toggleUserList.newMessages": "ಹೊಸ ಸಂದೇಶ ಅಧಿಸೂಚನೆಯೊಂದಿಗೆ", + "app.navBar.recording": "ಈ ಅಧಿವೇಶನವನ್ನು ದಾಖಲಿಸಲಾಗುತ್ತಿದೆ", + "app.navBar.recording.on": "ರೆಕಾರ್ಡಿಂಗ್", + "app.navBar.recording.off": "ರೆಕಾರ್ಡಿಂಗ್ ಮಾಡುತ್ತಿಲ್ಲ", + "app.navBar.emptyAudioBrdige": "ಸಕ್ರಿಯ ಮೈಕ್ರೊಫೋನ್ ಇಲ್ಲ. ಈ ರೆಕಾರ್ಡಿಂಗ್‌ಗೆ ಆಡಿಯೊ ಸೇರಿಸಲು ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಹಂಚಿಕೊಳ್ಳಿ.", + "app.leaveConfirmation.confirmLabel": "ಹೊರಬನ್ನಿ", + "app.leaveConfirmation.confirmDesc": "ನಿಮ್ಮನ್ನು ಸಭೆಯಿಂದ ಹೊರಹಾಕುತ್ತದೆ", + "app.endMeeting.title": "ಸಭೆಯನ್ನು ಕೊನೆಗೊಳಿಸಿ", + "app.endMeeting.description": "ಈ ಅಧಿವೇಶನವನ್ನು ಕೊನೆಗೊಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?", + "app.endMeeting.yesLabel": "ಹೌದು", + "app.endMeeting.noLabel": "ಇಲ್ಲ", + "app.about.title": "ಬಗ್ಗೆ", + "app.about.version": "ಗ್ರಾಹಕ ನಿರ್ಮಾಣ:", + "app.about.copyright": "ಕೃತಿಸ್ವಾಮ್ಯ:", + "app.about.confirmLabel": "ಸರಿ", + "app.about.confirmDesc": "ಸರಿ", + "app.about.dismissLabel": "ರದ್ದುಮಾಡಿ", + "app.about.dismissDesc": "ಕ್ಲೈಂಟ್ ಮಾಹಿತಿಯ ಬಗ್ಗೆ ಮುಚ್ಚಿ", + "app.actionsBar.changeStatusLabel": "ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸಿ", + "app.actionsBar.muteLabel": "ಸ್ಥಬ್ಧ ಮಾಡಿ ", + "app.actionsBar.unmuteLabel": "ಸ್ಥಬ್ಧದಿಂದ ಹೊರಬನ್ನಿ", + "app.actionsBar.camOffLabel": "ಕ್ಯಾಮೆರಾ ಆಫ್ ಆಗಿದೆ", + "app.actionsBar.raiseLabel": "ಎತ್ತು", + "app.actionsBar.label": "ಕ್ರಿಯೆಗಳ ಪಟ್ಟಿ", + "app.actionsBar.actionsDropdown.restorePresentationLabel": "ಪ್ರಸ್ತುತಿಯನ್ನು ಮರುಸ್ಥಾಪಿಸಿ", + "app.actionsBar.actionsDropdown.restorePresentationDesc": "ಪ್ರಸ್ತುತಿಯನ್ನು ಮುಚ್ಚಿದ ನಂತರ ಅದನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲು ಬಟನ್", + "app.screenshare.screenShareLabel" : "ಪರದೆಯ ಪಾಲು", + "app.submenu.application.applicationSectionTitle": "ಅಪ್ಲಿಕೇಶನ್", + "app.submenu.application.animationsLabel": "ಅನಿಮೇಷನ್", + "app.submenu.application.audioAlertLabel": "ಚಾಟ್‌ಗಾಗಿ ಆಡಿಯೊ ಎಚ್ಚರಿಕೆಗಳು", + "app.submenu.application.pushAlertLabel": "ಚಾಟ್‌ಗಾಗಿ ಪುಟಿಕೆ ಎಚ್ಚರಿಕೆಗಳು", + "app.submenu.application.userJoinAudioAlertLabel": "ಬಳಕೆದಾರರ ಸೇರ್ಪಡೆಗಾಗಿ ಆಡಿಯೊ ಎಚ್ಚರಿಕೆಗಳು", + "app.submenu.application.userJoinPushAlertLabel": "ಬಳಕೆದಾರ ಸೇರ್ಪಡೆಗಾಗಿ ಪುಟಿವ ಎಚ್ಚರಿಕೆಗಳು", + "app.submenu.application.fontSizeControlLabel": "ಅಕ್ಷರ ಗಾತ್ರ", + "app.submenu.application.increaseFontBtnLabel": "ಅಪ್ಲಿಕೇಶನ್ ಅಕ್ಷರ ವಿನ್ಯಾಸ ಗಾತ್ರವನ್ನು ಹೆಚ್ಚಿಸಿ", + "app.submenu.application.decreaseFontBtnLabel": "ಅಪ್ಲಿಕೇಶನ್ ವಿನ್ಯಾಸ ಗಾತ್ರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ", + "app.submenu.application.currentSize": "ಪ್ರಸ್ತುತ {0}", + "app.submenu.application.languageLabel": "ಅಪ್ಲಿಕೇಶನ್ ಭಾಷೆ", + "app.submenu.application.languageOptionLabel": "ಭಾಷೆಯನ್ನು ಆರಿಸಿ", + "app.submenu.application.noLocaleOptionLabel": "ಸಕ್ರಿಯ ಸ್ಥಳಗಳಿಲ್ಲ", + "app.submenu.audio.micSourceLabel": "ಮೈಕ್ರೊಫೋನ್ ಮೂಲ", + "app.submenu.audio.speakerSourceLabel": "ಸ್ಪೀಕರ್ ಮೂಲ", + "app.submenu.audio.streamVolumeLabel": "ನಿಮ್ಮ ಆಡಿಯೊ ಸ್ಟ್ರೀಮ್ ಪರಿಮಾಣ", + "app.submenu.video.title": "ವೀಡಿಯೊ", + "app.submenu.video.videoSourceLabel": "ಮೂಲವನ್ನು ವೀಕ್ಷಿಸಿ", + "app.submenu.video.videoOptionLabel": "ವೀಕ್ಷಣೆ ಮೂಲವನ್ನು ಆರಿಸಿ", + "app.submenu.video.videoQualityLabel": "ವೀಡಿಯೊ ಗುಣಮಟ್ಟ", + "app.submenu.video.qualityOptionLabel": "ವೀಡಿಯೊ ಗುಣಮಟ್ಟವನ್ನು ಆರಿಸಿ", + "app.submenu.video.participantsCamLabel": "ಭಾಗವಹಿಸುವವರ ವೆಬ್‌ಕ್ಯಾಮ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ", + "app.settings.applicationTab.label": "ಅಪ್ಲಿಕೇಶನ್", + "app.settings.audioTab.label": "ಆಡಿಯೋ", + "app.settings.videoTab.label": "ವೀಡಿಯೊ", + "app.settings.usersTab.label": "ಭಾಗವಹಿಸುವವರು", + "app.settings.main.label": "ಸಂಯೋಜನೆಗಳು", + "app.settings.main.cancel.label": "ರದ್ದುಮಾಡಿ", + "app.settings.main.cancel.label.description": "ಬದಲಾವಣೆಗಳನ್ನು ತಿರಸ್ಕರಿಸುತ್ತದೆ ಮತ್ತು ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಮೆನುವನ್ನು ಮುಚ್ಚುತ್ತದೆ", + "app.settings.main.save.label": "ಉಳಿಸಿ", + "app.settings.main.save.label.description": "ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸುತ್ತದೆ ಮತ್ತು ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಮೆನುವನ್ನು ಮುಚ್ಚುತ್ತದೆ", + "app.settings.dataSavingTab.label": "ಡೇಟಾ ಉಳಿತಾಯ", + "app.settings.dataSavingTab.webcam": "ವೆಬ್‌ಕ್ಯಾಮ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ", + "app.settings.dataSavingTab.screenShare": "ಡೆಸ್ಕ್‌ಟಾಪ್ ಹಂಚಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ", + "app.settings.dataSavingTab.description": "ನಿಮ್ಮ ಬ್ಯಾಂಡ್‌ವಿಡ್ತ್ ಉಳಿಸಲು ಪ್ರಸ್ತುತ ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತಿರುವದನ್ನು ಹೊಂದಿಸಿ.", + "app.settings.save-notification.label": "ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಉಳಿಸಲಾಗಿದೆ", + "app.switch.onLabel": "ಆನ್ ಆಗಿದೆ", + "app.switch.offLabel": "ಆರಿಸಿ", + "app.talkingIndicator.ariaMuteDesc" : "ಬಳಕೆದಾರರನ್ನು ಮ್ಯೂಟ್ ಮಾಡಲು ಆಯ್ಕೆಮಾಡಿ", + "app.talkingIndicator.isTalking" : "{0} ಮಾತನಾಡುತ್ತಿದೆ", + "app.talkingIndicator.wasTalking" : "{0} ಮಾತನಾಡುವುದನ್ನು ನಿಲ್ಲಿಸಿದೆ", + "app.actionsBar.actionsDropdown.actionsLabel": "ಕ್ರಿಯೆಗಳು", + "app.actionsBar.actionsDropdown.presentationLabel": "ಪ್ರಸ್ತುತಿಯನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿ", + "app.actionsBar.actionsDropdown.initPollLabel": "ಸಮೀಕ್ಷೆಯನ್ನು ಪ್ರಾರಂಭಿಸಿ", + "app.actionsBar.actionsDropdown.desktopShareLabel": "ನಿಮ್ಮ ಪರದೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳಿ", + "app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "ಸ್ಕ್ರೀನ್‌ಶೇರ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ", + "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "ನಿಮ್ಮ ಪರದೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳುವುದನ್ನು ನಿಲ್ಲಿಸಿ", + "app.actionsBar.actionsDropdown.presentationDesc": "ನಿಮ್ಮ ಪ್ರಸ್ತುತಿಯನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿ", + "app.actionsBar.actionsDropdown.initPollDesc": "ಸಮೀಕ್ಷೆಯನ್ನು ಪ್ರಾರಂಭಿಸಿ", + "app.actionsBar.actionsDropdown.desktopShareDesc": "ನಿಮ್ಮ ಪರದೆಯನ್ನು ಇತರರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ", + "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "ನಿಮ್ಮ ಪರದೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳುವುದನ್ನು ನಿಲ್ಲಿಸಿ", + "app.actionsBar.actionsDropdown.pollBtnLabel": "ಸಮೀಕ್ಷೆಯನ್ನು ಪ್ರಾರಂಭಿಸಿ", + "app.actionsBar.actionsDropdown.pollBtnDesc": "ಮತದಾನ ಫಲಕವನ್ನು ಟಾಗಲ್ ಮಾಡುತ್ತದೆ", + "app.actionsBar.actionsDropdown.saveUserNames": "ಬಳಕೆದಾರರ ಹೆಸರುಗಳನ್ನು ಉಳಿಸಿ", + "app.actionsBar.actionsDropdown.createBreakoutRoom": "ಬ್ರೇಕ್ ಔಟ್ ಕೊಠಡಿಗಳನ್ನು ರಚಿಸಿ", + "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "ಪ್ರಸ್ತುತ ಸಭೆಯನ್ನು ವಿಭಜಿಸಲು ಬ್ರೇಕ್‌ ಔಟ್ಗಳನ್ನು ರಚಿಸಿ", + "app.actionsBar.actionsDropdown.captionsLabel": "ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಗಳನ್ನು ಬರೆಯಿರಿ", + "app.actionsBar.actionsDropdown.captionsDesc": "ಶೀರ್ಷಿಕೆಗಳ ಫಲಕವನ್ನು ಟಾಗಲ್ ಮಾಡುತ್ತದೆ", + "app.actionsBar.actionsDropdown.takePresenter": "ಪ್ರೆಸೆಂಟರ್ ತೆಗೆದುಕೊಳ್ಳಿ", + "app.actionsBar.actionsDropdown.takePresenterDesc": "ನಿಮ್ಮನ್ನು ಹೊಸ ನಿರೂಪಕರಾಗಿ ನಿಯೋಜಿಸಿ", + "app.actionsBar.emojiMenu.statusTriggerLabel": "ಸ್ಥಿತಿಯನ್ನು ಹೊಂದಿಸಿ", + "app.actionsBar.emojiMenu.awayLabel": "ದೂರ", + "app.actionsBar.emojiMenu.awayDesc": "ನಿಮ್ಮ ಸ್ಥಿತಿಯನ್ನು ದೂರಕ್ಕೆ ಬದಲಾಯಿಸಿ", + "app.actionsBar.emojiMenu.raiseHandLabel": "ಎತ್ತು", + "app.actionsBar.emojiMenu.raiseHandDesc": "ಪ್ರಶ್ನೆ ಕೇಳಲು ನಿಮ್ಮ ಕೈ ಎತ್ತಿ", + "app.actionsBar.emojiMenu.neutralLabel": "ತೀರ್ಮಾನವಾಗಿಲ್ಲ", + "app.actionsBar.emojiMenu.neutralDesc": "ನಿಮ್ಮ ಸ್ಥಿತಿಯನ್ನು ನಿರ್ಧರಿಸದ ಸ್ಥಿತಿಗೆ ಬದಲಾಯಿಸಿ", + "app.actionsBar.emojiMenu.confusedLabel": "ಗೊಂದಲ", + "app.actionsBar.emojiMenu.confusedDesc": "ನಿಮ್ಮ ಸ್ಥಿತಿಯನ್ನು ಗೊಂದಲಕ್ಕೆ ಬದಲಾಯಿಸಿ", + "app.actionsBar.emojiMenu.sadLabel": "ದುಃಖ", + "app.actionsBar.emojiMenu.sadDesc": "ನಿಮ್ಮ ಸ್ಥಿತಿಯನ್ನು ದುಃಖಕ್ಕೆ ಬದಲಾಯಿಸಿ", + "app.actionsBar.emojiMenu.happyLabel": "ಸಂತೋಷ", + "app.actionsBar.emojiMenu.happyDesc": "ನಿಮ್ಮ ಸ್ಥಿತಿಯನ್ನು ಸಂತೋಷವಾಗಿ ಬದಲಾಯಿಸಿ", + "app.actionsBar.emojiMenu.noneLabel": "ಸ್ಥಿತಿ ತೆರವುಗೊಳಿಸಿ", + "app.actionsBar.emojiMenu.noneDesc": "ನಿಮ್ಮ ಸ್ಥಿತಿಯನ್ನು ತೆರವುಗೊಳಿಸಿ", + "app.actionsBar.emojiMenu.applauseLabel": "ಚಪ್ಪಾಳೆ", + "app.actionsBar.emojiMenu.applauseDesc": "ನಿಮ್ಮ ಸ್ಥಿತಿಯನ್ನು ಚಪ್ಪಾಳೆಗೆ ಬದಲಾಯಿಸಿ", + "app.actionsBar.emojiMenu.thumbsUpLabel": "ಥಂಬ್ಸ್ ಅಪ್", + "app.actionsBar.emojiMenu.thumbsUpDesc": "ನಿಮ್ಮ ಸ್ಥಿತಿಯನ್ನು ಥಂಬ್ಸ್ ಅಪ್ ಆಗಿ ಬದಲಾಯಿಸಿ", + "app.actionsBar.emojiMenu.thumbsDownLabel": "ಥಂಬ್ಸ್ ಡೌನ್", + "app.actionsBar.emojiMenu.thumbsDownDesc": "ನಿಮ್ಮ ಸ್ಥಿತಿಯನ್ನು ಥಂಬ್ಸ್ ಡೌನ್ ಆಗಿ ಬದಲಾಯಿಸಿ", + "app.actionsBar.currentStatusDesc": "ಪ್ರಸ್ತುತ ಸ್ಥಿತಿ {0}", + "app.actionsBar.captions.start": "ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಪ್ರಾರಂಭಿಸಿ", + "app.actionsBar.captions.stop": "ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಗಳನ್ನು ನೋಡುವುದನ್ನು ನಿಲ್ಲಿಸಿ", + "app.audioNotification.audioFailedError1001": "ವೆಬ್‌ಸಾಕೆಟ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ (ದೋಷ 1001)", + "app.audioNotification.audioFailedError1002": "ವೆಬ್‌ಸಾಕೆಟ್ ಸಂಪರ್ಕವನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ (ದೋಷ 1002)", + "app.audioNotification.audioFailedError1003": "ಬ್ರೌಸರ್ ಆವೃತ್ತಿಯನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ (ದೋಷ 1003)", + "app.audioNotification.audioFailedError1004": "ಕರೆಯಲ್ಲಿ ವಿಫಲತೆ (ಕಾರಣ = {0}) (ದೋಷ 1004)", + "app.audioNotification.audioFailedError1005": "ಕರೆ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ (ದೋಷ 1005)", + "app.audioNotification.audioFailedError1006": "ಕರೆ ಸಮಯ ಮೀರಿದೆ (ದೋಷ 1006)", + "app.audioNotification.audioFailedError1007": "ಸಂಪರ್ಕ ವೈಫಲ್ಯ (ICE ದೋಷ 1007)", + "app.audioNotification.audioFailedError1008": "ವರ್ಗಾವಣೆ ವಿಫಲವಾಗಿದೆ (ದೋಷ 1008)", + "app.audioNotification.audioFailedError1009": "STUN / TURN ಸರ್ವರ್ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ (ದೋಷ 1009)", + "app.audioNotification.audioFailedError1010": "ಸಂಪರ್ಕ ಸಮಾಲೋಚನೆ ಕಾಲಾವಧಿ (ICE ದೋಷ 1010)", + "app.audioNotification.audioFailedError1011": "ಸಂಪರ್ಕ ಸಮಯ ಮೀರಿದೆ (ICE ದೋಷ 1011)", + "app.audioNotification.audioFailedError1012": "ಸಂಪರ್ಕವನ್ನು ಮುಚ್ಚಲಾಗಿದೆ (ICE ದೋಷ 1012)", + "app.audioNotification.audioFailedMessage": "ನಿಮ್ಮ ಆಡಿಯೊ ಸಂಪರ್ಕವನ್ನು ಸಂಪರ್ಕಿಸಲು ವಿಫಲವಾಗಿದೆ", + "app.audioNotification.mediaFailedMessage": "ಸುರಕ್ಷಿತ ಮೂಲಗಳನ್ನು ಮಾತ್ರ ಅನುಮತಿಸಲಾಗಿರುವುದರಿಂದ getUserMicMedia ವಿಫಲವಾಗಿದೆ", + "app.audioNotification.closeLabel": "ಮುಚ್ಚಿ", + "app.audioNotificaion.reconnectingAsListenOnly": "ವೀಕ್ಷಕರಿಗೆ ಮೈಕ್ರೊಫೋನ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ, ನಿಮ್ಮನ್ನು ಕೇಳಲು ಮಾತ್ರ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ", + "app.breakoutJoinConfirmation.title": "ಬ್ರೇಕ್ ಔಟ್‌ ಕೋಣೆಗೆ ಸೇರಿ", + "app.breakoutJoinConfirmation.message": "ನೀವು ಸೇರಲು ಬಯಸುವಿರಾ", + "app.breakoutJoinConfirmation.confirmDesc": "ಬ್ರೇಕ್ ಔಟ್ ಕೋಣೆಗೆ ನಿಮ್ಮೊಂದಿಗೆ ಸೇರಿ", + "app.breakoutJoinConfirmation.dismissLabel": "ರದ್ದುಮಾಡಿ", + "app.breakoutJoinConfirmation.dismissDesc": "ಬ್ರೇಕ್ ಔಟ್ ಕೋಣೆಗೆ ಸೇರುವುದನ್ನು ಮುಚ್ಚುತ್ತದೆ ಮತ್ತು ತಿರಸ್ಕರಿಸುತ್ತದೆ", + "app.breakoutJoinConfirmation.freeJoinMessage": "ಸೇರಲು ಬ್ರೇಕ್ ಔಟ್ ಕೋಣೆಯನ್ನು ಆರಿಸಿ", + "app.breakoutTimeRemainingMessage": "ಬ್ರೇಕ್ ಔಟ್ ಕೋಣೆಯ ಸಮಯ ಉಳಿದಿದೆ: {0}", + "app.breakoutWillCloseMessage": "ಸಮಯ ಕೊನೆಗೊಂಡಿತು. ಬ್ರೇಕ್ ಔಟ್ ಕೊಠಡಿ ಶೀಘ್ರದಲ್ಲೇ ಮುಚ್ಚಲಿದೆ", + "app.calculatingBreakoutTimeRemaining": "ಉಳಿದ ಸಮಯವನ್ನು ಲೆಕ್ಕಹಾಕಲಾಗುತ್ತಿದೆ ...", + "app.audioModal.ariaTitle": "ಆಡಿಯೊ ಮೋಡಲ್‌ಗೆ ಸೇರಿ", + "app.audioModal.microphoneLabel": "ಮೈಕ್ರೊಫೋನ್", + "app.audioModal.listenOnlyLabel": "ಕೇವಲ ಆಲಿಸಿ", + "app.audioModal.audioChoiceLabel": "ಆಡಿಯೊಗೆ ಸೇರಲು ನೀವು ಹೇಗೆ ಬಯಸುತ್ತೀರಿ?", + "app.audioModal.iOSBrowser": "ಆಡಿಯೋ / ವಿಡಿಯೋ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ", + "app.audioModal.iOSErrorDescription": "ಈ ಸಮಯದಲ್ಲಿ iOS ಕ್ರೋಮ್ನಲ್ಲಿ ಆಡಿಯೋ ಮತ್ತು ವೀಡಿಯೊ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ.", + "app.audioModal.iOSErrorRecommendation": "ಸಫಾರಿ iOS ಬಳಸಲು ನಾವು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ.", + "app.audioModal.audioChoiceDesc": "ಈ ಸಭೆಯಲ್ಲಿ ಆಡಿಯೊವನ್ನು ಹೇಗೆ ಸೇರಬೇಕೆಂದು ಆಯ್ಕೆಮಾಡಿ", + "app.audioModal.unsupportedBrowserLabel": "ನೀವು ಸಂಪೂರ್ಣವಾಗಿ ಬೆಂಬಲಿಸದ ಬ್ರೌಸರ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಂತೆ ತೋರುತ್ತಿದೆ. ಪೂರ್ಣ ಬೆಂಬಲಕ್ಕಾಗಿ ದಯವಿಟ್ಟು {0} ಅಥವಾ {1} ಬಳಸಿ.", + "app.audioModal.closeLabel": "ಮುಚ್ಚಿ", + "app.audioModal.yes": "ಹೌದು", + "app.audioModal.no": "ಇಲ್ಲ", + "app.audioModal.yes.arialabel" : "ಪ್ರತಿಧ್ವನಿ ಕೇಳಿಸುತ್ತಿದೆ", + "app.audioModal.no.arialabel" : "ಪ್ರತಿಧ್ವನಿ ಕೇಳಿಸುವುದಿಲ್ಲ", + "app.audioModal.echoTestTitle": "ಇದು ಖಾಸಗಿ ಪ್ರತಿಧ್ವನಿ ಪರೀಕ್ಷೆ. ಕೆಲವು ಮಾತುಗಳನ್ನು ಮಾತನಾಡಿ. ನೀವು ಆಡಿಯೋ ಕೇಳಿದ್ದೀರಾ?", + "app.audioModal.settingsTitle": "ನಿಮ್ಮ ಆಡಿಯೊ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಿ", + "app.audioModal.helpTitle": "ನಿಮ್ಮ ಮಾಧ್ಯಮ ಸಾಧನಗಳಲ್ಲಿ ಸಮಸ್ಯೆ ಇದೆ", + "app.audioModal.helpText": "ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಪ್ರವೇಶಿಸಲು ನೀವು ಅನುಮತಿ ನೀಡಿದ್ದೀರಾ? ನೀವು ಆಡಿಯೊಗೆ ಸೇರಲು ಪ್ರಯತ್ನಿಸಿದಾಗ, ನಿಮ್ಮ ಮಾಧ್ಯಮ ಸಾಧನ ಅನುಮತಿಗಳನ್ನು ಕೇಳುವಾಗ ಸಂವಾದವು ಗೋಚರಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಗಮನಿಸಿ, ಆಡಿಯೊ ಸಮ್ಮೇಳನಕ್ಕೆ ಸೇರಲು ದಯವಿಟ್ಟು ಅದನ್ನು ಸ್ವೀಕರಿಸಿ. ಅದು ನಿಜವಾಗದಿದ್ದರೆ, ನಿಮ್ಮ ಬ್ರೌಸರ್‌ನ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಅನುಮತಿಗಳನ್ನು ಬದಲಾಯಿಸಲು ಪ್ರಯತ್ನಿಸಿ.", + "app.audioModal.help.noSSL": "ಈ ಪುಟವು ಅಸುರಕ್ಷಿತವಾಗಿದೆ. ಮೈಕ್ರೊಫೋನ್ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಲು ಪುಟವನ್ನು HTTPS ಮೂಲಕ ಒದಗಿಸಬೇಕು. ದಯವಿಟ್ಟು ಸರ್ವರ್ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.", + "app.audioModal.help.macNotAllowed": "ನಿಮ್ಮ ಮ್ಯಾಕ್ ಸಿಸ್ಟಮ್ ಪ್ರಾಶಸ್ತ್ಯಗಳು ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಪ್ರವೇಶವನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತಿರುವಂತೆ ತೋರುತ್ತಿದೆ. ಸಿಸ್ಟಮ್ ಪ್ರಾಶಸ್ತ್ಯಗಳು> ಭದ್ರತೆ ಮತ್ತು ಗೌಪ್ಯತೆ> ಗೌಪ್ಯತೆ> ಮೈಕ್ರೊಫೋನ್ ತೆರೆಯಿರಿ ಮತ್ತು ನೀವು ಬಳಸುತ್ತಿರುವ ಬ್ರೌಸರ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.", + "app.audioModal.audioDialTitle": "ನಿಮ್ಮ ಫೋನ್ ಬಳಸಿ ಸೇರಿ", + "app.audioDial.audioDialDescription": "ಡಯಲ್ ಮಾಡಿ", + "app.audioDial.audioDialConfrenceText": "ಮತ್ತು ಕಾನ್ಫರೆನ್ಸ್ ಪಿನ್ ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ:", + "app.audioModal.autoplayBlockedDesc": "ಆಡಿಯೋ ಪ್ಲೇ ಮಾಡಲು ನಮಗೆ ನಿಮ್ಮ ಅನುಮತಿ ಬೇಕು.", + "app.audioModal.playAudio": "ಆಡಿಯೊ ಪ್ಲೇ ಮಾಡಿ", + "app.audioModal.playAudio.arialabel" : "ಆಡಿಯೊ ಪ್ಲೇ ಮಾಡಿ", + "app.audioDial.tipIndicator": "ಸಲಹೆ", + "app.audioDial.tipMessage": "ನಿಮ್ಮನ್ನು ಮ್ಯೂಟ್ ಮಾಡಲು / ಮ್ಯೂಟ್ ಮಾಡಲು ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ '0' ಕೀಲಿಯನ್ನು ಒತ್ತಿ.", + "app.audioModal.connecting": "ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ", + "app.audioModal.connectingEchoTest": "ಪ್ರತಿಧ್ವನಿ ಪರೀಕ್ಷೆಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ", + "app.audioManager.joinedAudio": "ನೀವು ಆಡಿಯೋ ಸಮ್ಮೇಳನಕ್ಕೆ ಸೇರಿದ್ದೀರಿ", + "app.audioManager.joinedEcho": "ನೀವು ಪ್ರತಿಧ್ವನಿ ಪರೀಕ್ಷೆಗೆ ಸೇರಿದ್ದೀರಿ", + "app.audioManager.leftAudio": "ನೀವು ಆಡಿಯೋ ಸಮ್ಮೇಳನವನ್ನು ತೊರೆದಿದ್ದೀರಿ", + "app.audioManager.reconnectingAudio": "ಆಡಿಯೊವನ್ನು ಮರುಸಂಪರ್ಕಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ", + "app.audioManager.genericError": "ದೋಷ: ದೋಷ ಸಂಭವಿಸಿದೆ, ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ", + "app.audioManager.connectionError": "ದೋಷ: ಸಂಪರ್ಕ ದೋಷ", + "app.audioManager.requestTimeout": "ದೋಷ: ವಿನಂತಿಯಲ್ಲಿ ಸಮಯ ಮೀರಿದೆ", + "app.audioManager.invalidTarget": "ದೋಷ: ಅಮಾನ್ಯ ಗುರಿಯತ್ತ ಏನನ್ನಾದರೂ ವಿನಂತಿಸಲು ಪ್ರಯತ್ನಿಸಿದೆ", + "app.audioManager.mediaError": "ದೋಷ: ನಿಮ್ಮ ಮಾಧ್ಯಮ ಸಾಧನಗಳನ್ನು ಪಡೆಯುವಲ್ಲಿ ಸಮಸ್ಯೆ ಇದೆ", + "app.audio.joinAudio": "ಆಡಿಯೊಗೆ ಸೇರಿ", + "app.audio.leaveAudio": "ಆಡಿಯೊವನ್ನು ಬಿಡಿ", + "app.audio.enterSessionLabel": "ನಮೂದಿಸಿ", + "app.audio.playSoundLabel": "ಧ್ವನಿ ಪ್ಲೇ ಮಾಡಿ", + "app.audio.backLabel": "ಹಿಂದೆ", + "app.audio.audioSettings.titleLabel": "ನಿಮ್ಮ ಆಡಿಯೊ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆರಿಸಿ", + "app.audio.audioSettings.descriptionLabel": "ದಯವಿಟ್ಟು ಗಮನಿಸಿ, ನಿಮ್ಮ ಬ್ರೌಸರ್‌ನಲ್ಲಿ ಸಂವಾದ ಕಾಣಿಸುತ್ತದೆ, ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಹಂಚಿಕೆಯನ್ನು ಸ್ವೀಕರಿಸಲು ನಿಮಗೆ ಅಗತ್ಯವಿರುತ್ತದೆ.", + "app.audio.audioSettings.microphoneSourceLabel": "ಮೈಕ್ರೊಫೋನ್ ಮೂಲ", + "app.audio.audioSettings.speakerSourceLabel": "ಸ್ಪೀಕರ್ ಮೂಲ", + "app.audio.audioSettings.microphoneStreamLabel": "ನಿಮ್ಮ ಆಡಿಯೊ ಸ್ಟ್ರೀಮ್ ಪರಿಮಾಣ", + "app.audio.audioSettings.retryLabel": "ಮರುಪ್ರಯತ್ನಿಸಿ", + "app.audio.listenOnly.backLabel": "ಹಿಂದೆ", + "app.audio.listenOnly.closeLabel": "ಮುಚ್ಚಿ", + "app.audio.permissionsOverlay.title": "ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್‌ಗೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಿ", + "app.audio.permissionsOverlay.hint": "ನಿಮ್ಮನ್ನು ಧ್ವನಿ ಸಮ್ಮೇಳನಕ್ಕೆ ಸೇರಲು ನಿಮ್ಮ ಮಾಧ್ಯಮ ಸಾಧನಗಳನ್ನು ಬಳಸಲು ನಮಗೆ ನೀವು ಅನುಮತಿಸಬೇಕಾಗಿದೆ :)", + "app.error.removed": "ನಿಮ್ಮನ್ನು ಸಮ್ಮೇಳನದಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ", + "app.error.meeting.ended": "ನೀವು ಸಮ್ಮೇಳನದಿಂದ ಲಾಗ್ ಔಟ್‌ ಆಗಿದ್ದೀರಿ", + "app.meeting.logout.duplicateUserEjectReason": "ಸಭೆಗೆ ಸೇರಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ನಕಲಿ ಬಳಕೆದಾರ", + "app.meeting.logout.permissionEjectReason": "ಅನುಮತಿ ಉಲ್ಲಂಘನೆಯಿಂದಾಗಿ ಹೊರಹಾಕಲಾಗಿದೆ", + "app.meeting.logout.ejectedFromMeeting": "ನಿಮ್ಮನ್ನು ಸಭೆಯಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ", + "app.meeting.logout.validateTokenFailedEjectReason": "ದೃಢೀಕರಣ ಟೋಕನ್ ಅನ್ನು ಮೌಲ್ಯೀಕರಿಸಲು ವಿಫಲವಾಗಿದೆ", + "app.meeting.logout.userInactivityEjectReason": "ಬಳಕೆದಾರರು ತುಂಬಾ ಸಮಯದವರೆಗೆ ನಿಷ್ಕ್ರಿಯರಾಗಿದ್ದಾರೆ", + "app.meeting-ended.rating.legendLabel": "ಪ್ರತಿಕ್ರಿಯೆ ರೇಟಿಂಗ್", + "app.meeting-ended.rating.starLabel": "ನಕ್ಷತ್ರ", + "app.modal.close": "ಮುಚ್ಚಿ", + "app.modal.close.description": "ಬದಲಾವಣೆಗಳನ್ನು ಕಡೆಗಣಿಸುತ್ತದೆ ಮತ್ತು ಮೋಡಲ್ ಅನ್ನು ಮುಚ್ಚುತ್ತದೆ", + "app.modal.confirm": "ಮುಗಿದಿದೆ", + "app.modal.newTab": "(ಹೊಸ ಟ್ಯಾಬ್ ತೆರೆಯುತ್ತದೆ)", + "app.modal.confirm.description": "ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸುತ್ತದೆ ಮತ್ತು ಮೋಡಲ್ ಅನ್ನು ಮುಚ್ಚುತ್ತದೆ", + "app.dropdown.close": "ಮುಚ್ಚಿ", + "app.error.400": "ಕೆಟ್ಟ ವಿನಂತಿ", + "app.error.401": "ಅನಧಿಕೃತ", + "app.error.403": "ನಿಮ್ಮನ್ನು ಸಭೆಯಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ", + "app.error.404": "ಸಿಕ್ಕಿಲ್ಲ", + "app.error.410": "ಸಭೆ ಮುಗಿದಿದೆ", + "app.error.500": "ಅಯ್ಯೊ, ಏನೋ ತಪ್ಪಾಗಿದೆ", + "app.error.leaveLabel": "ಮತ್ತೆ ಲಾಗ್ ಇನ್ ಮಾಡಿ", + "app.error.fallback.presentation.title": "ಒಂದು ತಪ್ಪು ನಡೆದಿದೆ", + "app.error.fallback.presentation.description": "ಇದನ್ನು ಲಾಗ್ ಮಾಡಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಪುಟವನ್ನು ಮರುಲೋಡ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ.", + "app.error.fallback.presentation.reloadButton": "ಮರುಲೋಡ್ ಮಾಡಿ", + "app.guest.waiting": "ಸೇರಲು ಅನುಮೋದನೆಗಾಗಿ ಕಾಯಲಾಗುತ್ತಿದೆ", + "app.userList.guest.waitingUsers": "ಕಾಯುತ್ತಿರುವ ಬಳಕೆದಾರರು", + "app.userList.guest.waitingUsersTitle": "ಬಳಕೆದಾರ ನಿರ್ವಹಣೆ", + "app.userList.guest.optionTitle": "ಬಾಕಿ ಉಳಿದಿರುವ ಬಳಕೆದಾರರನ್ನು ಪರಿಶೀಲಿಸಿ", + "app.userList.guest.allowAllAuthenticated": "ಎಲ್ಲವನ್ನೂ ದೃಢೀಕರಿಸಲು ಅನುಮತಿಸಿ", + "app.userList.guest.allowAllGuests": "ಎಲ್ಲಾ ಅತಿಥಿಗಳನ್ನು ಅನುಮತಿಸಿ", + "app.userList.guest.allowEveryone": "ಎಲ್ಲರಿಗೂ ಅನುಮತಿಸಿ", + "app.userList.guest.denyEveryone": "ಎಲ್ಲರನ್ನು ನಿರಾಕರಿಸು", + "app.userList.guest.pendingUsers": "{0} ಬಾಕಿ ಉಳಿದಿರುವ ಬಳಕೆದಾರರು", + "app.userList.guest.pendingGuestUsers": "{0} ಅತಿಥಿ ಬಳಕೆದಾರರು ಬಾಕಿ ಉಳಿದಿದ್ದಾರೆ", + "app.userList.guest.pendingGuestAlert": "ಅಧಿವೇಶನಕ್ಕೆ ಸೇರಿದ್ದಾರೆ ಮತ್ತು ನಿಮ್ಮ ಅನುಮೋದನೆಗಾಗಿ ಕಾಯುತ್ತಿದ್ದಾರೆ.", + "app.userList.guest.rememberChoice": "ಆಯ್ಕೆಯನ್ನು ನೆನಪಿಡಿ", + "app.user-info.title": "ಡೈರೆಕ್ಟರಿ ಲುಕಪ್", + "app.toast.breakoutRoomEnded": "ಬ್ರೇಕ್ ಔಟ್‌ ಕೊಠಡಿ ಕೊನೆಗೊಂಡಿತು. ದಯವಿಟ್ಟು ಆಡಿಯೊದಲ್ಲಿ ಮತ್ತೆ ಸೇರಿ.", + "app.toast.chat.public": "ಹೊಸ ಸಾರ್ವಜನಿಕ ಚಾಟ್ ಸಂದೇಶ", + "app.toast.chat.private": "ಹೊಸ ಖಾಸಗಿ ಚಾಟ್ ಸಂದೇಶ", + "app.toast.chat.system": "ಸಿಸ್ಟಮ್", + "app.toast.clearedEmoji.label": "ಎಮೋಜಿ ಸ್ಥಿತಿಯನ್ನು ತೆರವುಗೊಳಿಸಲಾಗಿದೆ", + "app.toast.setEmoji.label": "ಎಮೋಜಿ ಸ್ಥಿತಿಯನ್ನು {0} ಗೆ ಹೊಂದಿಸಲಾಗಿದೆ", + "app.toast.meetingMuteOn.label": "ಎಲ್ಲಾ ಬಳಕೆದಾರರನ್ನು ಮ್ಯೂಟ್ ಮಾಡಲಾಗಿದೆ", + "app.toast.meetingMuteOff.label": "ಮೀಟಿಂಗ್ ಮ್ಯೂಟ್ ಆಫ್ ಮಾಡಲಾಗಿದೆ", + "app.notification.recordingStart": "ಈ ಅಧಿವೇಶನವನ್ನು ಈಗ ದಾಖಲಿಸಲಾಗುತ್ತಿದೆ", + "app.notification.recordingStop": "ಈ ಅಧಿವೇಶನವನ್ನು ದಾಖಲಿಸಲಾಗುವುದಿಲ್ಲ", + "app.notification.recordingPaused": "ಈ ಅಧಿವೇಶನವನ್ನು ಇನ್ನು ಮುಂದೆ ದಾಖಲಿಸಲಾಗುವುದಿಲ್ಲ", + "app.notification.recordingAriaLabel": "ರೆಕಾರ್ಡ್ ಮಾಡಿದ ಸಮಯ", + "app.notification.userJoinPushAlert": "{0} ಅಧಿವೇಶನಕ್ಕೆ ಸೇರಿದರು", + "app.shortcut-help.title": "ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು", + "app.shortcut-help.accessKeyNotAvailable": "ಪ್ರವೇಶ ಕೀಗಳು ಲಭ್ಯವಿಲ್ಲ", + "app.shortcut-help.comboLabel": "ಕಾಂಬೊ", + "app.shortcut-help.functionLabel": "ಕಾರ್ಯ", + "app.shortcut-help.closeLabel": "ಮುಚ್ಚಿ", + "app.shortcut-help.closeDesc": "ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳ ಮೋಡಲ್ ಅನ್ನು ಮುಚ್ಚುತ್ತದೆ", + "app.shortcut-help.openOptions": "ಆಯ್ಕೆಗಳನ್ನು ತೆರೆಯಿರಿ", + "app.shortcut-help.toggleUserList": "ಬಳಕೆದಾರರ ಪಟ್ಟಿಯನ್ನು ಟಾಗಲ್ ಮಾಡಿ", + "app.shortcut-help.toggleMute": "ಸ್ಥಬ್ಧ / ನಿಸ್ಥಬ್ಧ ಮಾಡಿ", + "app.shortcut-help.togglePublicChat": "ಸಾರ್ವಜನಿಕ ಚಾಟ್ ಅನ್ನು ಟಾಗಲ್ ಮಾಡಿ (ಬಳಕೆದಾರರ ಪಟ್ಟಿ ತೆರೆದಿರಬೇಕು)", + "app.shortcut-help.hidePrivateChat": "ಖಾಸಗಿ ಚಾಟ್ ಅನ್ನು ಮರೆಮಾಡಿ", + "app.shortcut-help.closePrivateChat": "ಖಾಸಗಿ ಚಾಟ್ ಮುಚ್ಚಿ", + "app.shortcut-help.openActions": "ಕ್ರಿಯೆಗಳ ಮೆನು ತೆರೆಯಿರಿ", + "app.shortcut-help.openStatus": "ಸ್ಥಿತಿ ಮೆನು ತೆರೆಯಿರಿ", + "app.shortcut-help.togglePan": "ಪ್ಯಾನ್ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ (ಪ್ರೆಸೆಂಟರ್)", + "app.shortcut-help.nextSlideDesc": "ಮುಂದಿನ ಸ್ಲೈಡ್ (ಪ್ರೆಸೆಂಟರ್)", + "app.shortcut-help.previousSlideDesc": "ಹಿಂದಿನ ಸ್ಲೈಡ್ (ಪ್ರೆಸೆಂಟರ್)", + "app.lock-viewers.title": "ವೀಕ್ಷಕರನ್ನು ಲಾಕ್ ಮಾಡಿ", + "app.lock-viewers.description": "ನಿರ್ದಿಷ್ಟ ಆಯ್ಕೆಗಳನ್ನು ಬಳಸದಂತೆ ವೀಕ್ಷಕರನ್ನು ನಿರ್ಬಂಧಿಸಲು ಈ ಆಯ್ಕೆಗಳು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.", + "app.lock-viewers.featuresLable": "ವೈಶಿಷ್ಟ್ಯ", + "app.lock-viewers.lockStatusLabel": "ಸ್ಥಿತಿ", + "app.lock-viewers.webcamLabel": "ವೆಬ್‌ಕ್ಯಾಮ್ ಹಂಚಿಕೊಳ್ಳಿ", + "app.lock-viewers.otherViewersWebcamLabel": "ಇತರ ವೀಕ್ಷಕರ ವೆಬ್‌ಕ್ಯಾಮ್‌ಗಳನ್ನು ನೋಡಿ", + "app.lock-viewers.microphoneLable": "ಮೈಕ್ರೊಫೋನ್ ಹಂಚಿಕೊಳ್ಳಿ", + "app.lock-viewers.PublicChatLabel": "ಸಾರ್ವಜನಿಕ ಚಾಟ್ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ", + "app.lock-viewers.PrivateChatLable": "ಖಾಸಗಿ ಚಾಟ್ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ", + "app.lock-viewers.notesLabel": "ಹಂಚಿದ ಟಿಪ್ಪಣಿಗಳನ್ನು ಸಂಪಾದಿಸಿ", + "app.lock-viewers.userListLabel": "ಬಳಕೆದಾರರ ಪಟ್ಟಿಯಲ್ಲಿ ಇತರ ವೀಕ್ಷಕರನ್ನು ನೋಡಿ", + "app.lock-viewers.ariaTitle": "ವೀಕ್ಷಕರ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಲಾಕ್ ಮಾಡಿ", + "app.lock-viewers.button.apply": "ಅನ್ವಯಿಸು", + "app.lock-viewers.button.cancel": "ರದ್ದುಮಾಡಿ", + "app.lock-viewers.locked": "ಲಾಕ್ ಮಾಡಲಾಗಿದೆ", + "app.lock-viewers.unlocked": "ಅನ್ಲಾಕ್ ಮಾಡಲಾಗಿದೆ", + "app.recording.startTitle": "ರೆಕಾರ್ಡಿಂಗ್ ಪ್ರಾರಂಭಿಸಿ", + "app.recording.stopTitle": "ರೆಕಾರ್ಡಿಂಗ್ ಅನ್ನು ವಿರಾಮಗೊಳಿಸಿ", + "app.recording.resumeTitle": "ರೆಕಾರ್ಡಿಂಗ್ ಅನ್ನು ಪುನರಾರಂಭಿಸಿ", + "app.recording.startDescription": "ರೆಕಾರ್ಡಿಂಗ್ ಅನ್ನು ವಿರಾಮಗೊಳಿಸಲು ನೀವು ನಂತರ ಮತ್ತೆ ರೆಕಾರ್ಡ್ ಬಟನ್ ಆಯ್ಕೆ ಮಾಡಬಹುದು.", + "app.recording.stopDescription": "ರೆಕಾರ್ಡಿಂಗ್ ಅನ್ನು ವಿರಾಮಗೊಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? ರೆಕಾರ್ಡ್ ಬಟನ್ ಅನ್ನು ಮತ್ತೆ ಆರಿಸುವ ಮೂಲಕ ನೀವು ಪುನರಾರಂಭಿಸಬಹುದು.", + "app.videoPreview.cameraLabel": "ಕ್ಯಾಮೆರಾ", + "app.videoPreview.profileLabel": "ಗುಣಮಟ್ಟ", + "app.videoPreview.cancelLabel": "ರದ್ದುಮಾಡಿ", + "app.videoPreview.closeLabel": "ಮುಚ್ಚಿ", + "app.videoPreview.findingWebcamsLabel": "ವೆಬ್‌ಕ್ಯಾಮ್‌ಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ", + "app.videoPreview.startSharingLabel": "ಹಂಚಿಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಿ", + "app.videoPreview.webcamOptionLabel": "ವೆಬ್‌ಕ್ಯಾಮ್ ಆಯ್ಕೆಮಾಡಿ", + "app.videoPreview.webcamPreviewLabel": "ವೆಬ್‌ಕ್ಯಾಮ್ ಪೂರ್ವವೀಕ್ಷಣೆ", + "app.videoPreview.webcamSettingsTitle": "ವೆಬ್‌ಕ್ಯಾಮ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು", + "app.videoPreview.webcamNotFoundLabel": "ವೆಬ್‌ಕ್ಯಾಮ್ ಕಂಡುಬಂದಿಲ್ಲ", + "app.videoPreview.profileNotFoundLabel": "ಬೆಂಬಲಿತ ಕ್ಯಾಮೆರಾ ಪ್ರೊಫೈಲ್ ಇಲ್ಲ", + "app.video.joinVideo": "ವೆಬ್‌ಕ್ಯಾಮ್ ಹಂಚಿಕೊಳ್ಳಿ", + "app.video.leaveVideo": "ವೆಬ್‌ಕ್ಯಾಮ್ ಹಂಚಿಕೊಳ್ಳುವುದನ್ನು ನಿಲ್ಲಿಸಿ", + "app.video.iceCandidateError": "ICE ಅಭ್ಯರ್ಥಿಯನ್ನು ಸೇರಿಸುವಲ್ಲಿ ದೋಷ", + "app.video.iceConnectionStateError": "ಸಂಪರ್ಕ ವೈಫಲ್ಯ (ICE ದೋಷ 1107)", + "app.video.permissionError": "ವೆಬ್‌ಕ್ಯಾಮ್ ಹಂಚಿಕೊಳ್ಳುವಲ್ಲಿ ದೋಷ. ದಯವಿಟ್ಟು ಅನುಮತಿಗಳನ್ನು ಪರಿಶೀಲಿಸಿ", + "app.video.sharingError": "ವೆಬ್‌ಕ್ಯಾಮ್ ಹಂಚಿಕೊಳ್ಳುವಲ್ಲಿ ದೋಷ", + "app.video.notFoundError": "ವೆಬ್‌ಕ್ಯಾಮ್ ಸಿಗಲಿಲ್ಲ. ಇದು ಸಂಪರ್ಕಗೊಂಡಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ", + "app.video.notAllowed": "ಹಂಚಿಕೆ ವೆಬ್‌ಕ್ಯಾಮ್‌ಗೆ ಅನುಮತಿ ಕಾಣೆಯಾಗಿದೆ, ದಯವಿಟ್ಟು ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನುಮತಿಗಳನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ", + "app.video.notSupportedError": "ವೆಬ್‌ಕ್ಯಾಮ್ ವೀಡಿಯೊವನ್ನು ಸುರಕ್ಷಿತ ಮೂಲಗಳೊಂದಿಗೆ ಮಾತ್ರ ಹಂಚಿಕೊಳ್ಳಬಹುದು, ನಿಮ್ಮ ಎಸ್‌ಎಸ್‌ಎಲ್ ಪ್ರಮಾಣಪತ್ರವು ಮಾನ್ಯವಾಗಿದೆಯೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ", + "app.video.notReadableError": "ವೆಬ್‌ಕ್ಯಾಮ್ ವೀಡಿಯೊ ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಮತ್ತೊಂದು ಪ್ರೋಗ್ರಾಂ ವೆಬ್‌ಕ್ಯಾಮ್ ಬಳಸುತ್ತಿಲ್ಲ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ", + "app.video.mediaFlowTimeout1020": "ಮಾಧ್ಯಮವು ಸರ್ವರ್ ಅನ್ನು ತಲುಪಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ (ದೋಷ 1020)", + "app.video.suggestWebcamLock": "ವೀಕ್ಷಕರಿಗೆ ವೆಬ್‌ಕ್ಯಾಮ್‌ಗಳಿಗೆ ಲಾಕ್ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಜಾರಿಗೊಳಿಸುವುದೇ?", + "app.video.suggestWebcamLockReason": "(ಇದು ಸಭೆಯ ಸ್ಥಿರತೆಯನ್ನು ಸುಧಾರಿಸುತ್ತದೆ)", + "app.video.enable": "ಸಕ್ರಿಯಗೊಳಿಸಿ", + "app.video.cancel": "ರದ್ದುಮಾಡಿ", + "app.video.swapCam": "ಸ್ವಾಪ್ ಮಾಡಿ", + "app.video.swapCamDesc": "ವೆಬ್‌ಕ್ಯಾಮ್‌ಗಳ ದಿಕ್ಕನ್ನು ವಿನಿಮಯ ಮಾಡಿಕೊಳ್ಳಿ", + "app.video.videoLocked": "ವೆಬ್‌ಕ್ಯಾಮ್ ಹಂಚಿಕೆ ಲಾಕ್ ಆಗಿದೆ", + "app.video.videoButtonDesc": "ವೆಬ್‌ಕ್ಯಾಮ್ ಹಂಚಿಕೊಳ್ಳಿ", + "app.video.videoMenu": "ವೀಡಿಯೊ ಮೆನು", + "app.video.videoMenuDisabled": "ವೀಡಿಯೊ ಮೆನು ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ವೆಬ್‌ಕ್ಯಾಮ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.video.videoMenuDesc": "ವೀಡಿಯೊ ಮೆನು ಡ್ರಾಪ್‌ಡೌನ್ ತೆರೆಯಿರಿ", + "app.video.chromeExtensionError": "ನೀವು ಸ್ಥಾಪಿಸಬೇಕು", + "app.video.chromeExtensionErrorLink": "ಈ ಕ್ರೋಮ್‌ ವಿಸ್ತರಣೆ", + "app.video.stats.title": "ಸಂಪರ್ಕ ಅಂಕಿಅಂಶಗಳು", + "app.video.stats.packetsReceived": "ಪ್ಯಾಕೆಟ್‌ಗಳನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ", + "app.video.stats.packetsSent": "ಪ್ಯಾಕೆಟ್‌ಗಳನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ", + "app.video.stats.packetsLost": "ಪ್ಯಾಕೆಟ್‌ಗಳು ಕಳೆದುಹೋಗಿವೆ", + "app.video.stats.bitrate": "ಬಿಟ್‌ ರೇಟ್‌ ", + "app.video.stats.lostPercentage": "ಒಟ್ಟು ಶೇಕಡಾವಾರು ಕಳೆದುಹೋಗಿದೆ", + "app.video.stats.lostRecentPercentage": "ಇತ್ತೀಚಿನ ಶೇಕಡಾವಾರು ನಷ್ಟವಾಗಿದೆ", + "app.video.stats.dimensions": "ಆಯಾಮಗಳು", + "app.video.stats.codec": "ಕೋಡೆಕ್", + "app.video.stats.decodeDelay": "ಡಿಕೋಡ್ ವಿಳಂಬ", + "app.video.stats.rtt": "RTT", + "app.video.stats.encodeUsagePercent": "ಎನ್ಕೋಡ್ ಬಳಕೆ", + "app.video.stats.currentDelay": "ಪ್ರಸ್ತುತ ವಿಳಂಬ", + "app.fullscreenButton.label": "{0} ಪೂರ್ಣಪರದೆ ಮಾಡಿ", + "app.deskshare.iceConnectionStateError": "ಪರದೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳುವಾಗ ಸಂಪರ್ಕ ವಿಫಲವಾಗಿದೆ (ICE ದೋಷ 1108)", + "app.sfu.mediaServerConnectionError2000": "ಮಾಧ್ಯಮ ಸರ್ವರ್‌ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ (ದೋಷ 2000)", + "app.sfu.mediaServerOffline2001": "ಮಾಧ್ಯಮ ಸರ್ವರ್ ಆಫ್‌ಲೈನ್‌ನಲ್ಲಿದೆ. ದಯವಿಟ್ಟು ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ (ದೋಷ 2001)", + "app.sfu.mediaServerNoResources2002": "ಮಾಧ್ಯಮ ಸರ್ವರ್‌ಗೆ ಲಭ್ಯವಿರುವ ಸಂಪನ್ಮೂಲಗಳಿಲ್ಲ (ದೋಷ 2002)", + "app.sfu.mediaServerRequestTimeout2003": "ಮಾಧ್ಯಮ ಸರ್ವರ್ ವಿನಂತಿಗಳು ಸಮಯ ಮೀರಿದೆ (ದೋಷ 2003)", + "app.sfu.serverIceGatheringFailed2021": "ಮಾಧ್ಯಮ ಸರ್ವರ್ ಸಂಪರ್ಕ ಅಭ್ಯರ್ಥಿಗಳನ್ನು ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ (ICE ದೋಷ 2021)", + "app.sfu.serverIceGatheringFailed2022": "ಮಾಧ್ಯಮ ಸರ್ವರ್ ಸಂಪರ್ಕ ವಿಫಲವಾಗಿದೆ (ICE ದೋಷ 2022)", + "app.sfu.mediaGenericError2200": "ವಿನಂತಿಯನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಮಾಧ್ಯಮ ಸರ್ವರ್ ವಿಫಲವಾಗಿದೆ (ದೋಷ 2200)", + "app.sfu.invalidSdp2202":"ಕ್ಲೈಂಟ್ ಅಮಾನ್ಯ ಮಾಧ್ಯಮ ವಿನಂತಿಯನ್ನು ರಚಿಸಿದೆ (ಎಸ್‌ಡಿಪಿ ದೋಷ 2202)", + "app.sfu.noAvailableCodec2203": "ಸರ್ವರ್‌ಗೆ ಸೂಕ್ತವಾದ ಕೊಡೆಕ್ ಸಿಗಲಿಲ್ಲ (ದೋಷ 2203)", + "app.meeting.endNotification.ok.label": "ಸರಿ", + "app.whiteboard.annotations.poll": "ಸಮೀಕ್ಷೆಯ ಫಲಿತಾಂಶಗಳನ್ನು ಪ್ರಕಟಿಸಲಾಗಿದೆ", + "app.whiteboard.toolbar.tools": "ಪರಿಕರಗಳು", + "app.whiteboard.toolbar.tools.hand": "ಪ್ಯಾನ್", + "app.whiteboard.toolbar.tools.pencil": "ಪೆನ್ಸಿಲ್/ಸೀಸದ ಕಡ್ಡಿ", + "app.whiteboard.toolbar.tools.rectangle": "ಆಯಾತ", + "app.whiteboard.toolbar.tools.triangle": "ತ್ರಿಕೋನ", + "app.whiteboard.toolbar.tools.ellipse": "ದೀರ್ಘವೃತ್ತ", + "app.whiteboard.toolbar.tools.line": "ಸಾಲು", + "app.whiteboard.toolbar.tools.text": "ಪಠ್ಯ", + "app.whiteboard.toolbar.thickness": "ರೇಖಾಚಿತ್ರ ದಪ್ಪ", + "app.whiteboard.toolbar.thicknessDisabled": "ಚಿತ್ರಾಕೃತಿ/ರೇಖಾಚಿತ್ರ ದಪ್ಪವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.whiteboard.toolbar.color": "ಬಣ್ಣಗಳು", + "app.whiteboard.toolbar.colorDisabled": "ಬಣ್ಣಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ", + "app.whiteboard.toolbar.color.black": "ಕಪ್ಪು", + "app.whiteboard.toolbar.color.white": "ಬಿಳಿ", + "app.whiteboard.toolbar.color.red": "ಕೆಂಪು", + "app.whiteboard.toolbar.color.orange": "ಕಿತ್ತಳೆ", + "app.whiteboard.toolbar.color.eletricLime": "ವಿದ್ಯುತ್ ಸುಣ್ಣ", + "app.whiteboard.toolbar.color.lime": "ಸುಣ್ಣ", + "app.whiteboard.toolbar.color.cyan": "ಸಯಾನ್", + "app.whiteboard.toolbar.color.dodgerBlue": "ಡಾಡ್ಜರ್ ನೀಲಿ", + "app.whiteboard.toolbar.color.blue": "ನೀಲಿ", + "app.whiteboard.toolbar.color.violet": "ನೇರಳೆ", + "app.whiteboard.toolbar.color.magenta": "ಕೆನ್ನೇರಳೆ", + "app.whiteboard.toolbar.color.silver": "ಬೆಳ್ಳಿ", + "app.whiteboard.toolbar.undo": "ಟಿಪ್ಪಣಿ ರದ್ದುಗೊಳಿಸಿ", + "app.whiteboard.toolbar.clear": "ಎಲ್ಲಾ ಟಿಪ್ಪಣಿಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ", + "app.whiteboard.toolbar.multiUserOn": "ಬಹು-ಬಳಕೆದಾರ ವೈಟ್‌ಬೋರ್ಡ್ ಆನ್ ಮಾಡಿ", + "app.whiteboard.toolbar.multiUserOff": "ಬಹು-ಬಳಕೆದಾರ ವೈಟ್‌ಬೋರ್ಡ್ ಆಫ್ ಮಾಡಿ", + "app.whiteboard.toolbar.fontSize": "ಫಾಂಟ್ ಗಾತ್ರದ ಪಟ್ಟಿ", + "app.feedback.title": "ನೀವು ಸಮ್ಮೇಳನದಿಂದ ಲಾಗ್ ಔಟ್ ಆಗಿದ್ದೀರಿ", + "app.feedback.subtitle": "ಬಿಗ್‌ಬ್ಲೂಬಟನ್‌ನೊಂದಿಗಿನ ನಿಮ್ಮ ಅನುಭವದ ಬಗ್ಗೆ ಕೇಳಲು ನಾವು ಇಷ್ಟಪಡುತ್ತೇವೆ (ಐಶ್ಚಿಕ)", + "app.feedback.textarea": "ಬಿಗ್‌ಬ್ಲೂಬಟನ್ ಅನ್ನು ನಾವು ಹೇಗೆ ಉತ್ತಮಗೊಳಿಸಬಹುದು?", + "app.feedback.sendFeedback": "ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ", + "app.feedback.sendFeedbackDesc": "ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ ಮತ್ತು ಸಭೆಯನ್ನು ಬಿಡಿ", + "app.videoDock.webcamFocusLabel": "ಕೇಂದ್ರೀಕರಿಸಿ", + "app.videoDock.webcamFocusDesc": "ಆಯ್ದ ವೆಬ್‌ಕ್ಯಾಮ್ ಅನ್ನು ಕೇಂದ್ರೀಕರಿಸಿ", + "app.videoDock.webcamUnfocusLabel": "ಕೇಂದ್ರೀಕರಿಸಬೇಡಿ", + "app.videoDock.webcamUnfocusDesc": "ಆಯ್ದ ವೆಬ್‌ಕ್ಯಾಮ್ ಅನ್ನು ಕೇಂದ್ರೀಕರಿಸಿ", + "app.videoDock.autoplayBlockedDesc": "ಇತರ ಬಳಕೆದಾರರ ವೆಬ್‌ಕ್ಯಾಮ್‌ಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸಲು ನಮಗೆ ನಿಮ್ಮ ಅನುಮತಿ ಬೇಕು.", + "app.videoDock.autoplayAllowLabel": "ವೆಬ್‌ಕ್ಯಾಮ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ", + "app.invitation.title": "ಬ್ರೇಕ್ ಔಟ್ ಕೋಣೆಯ ಆಮಂತ್ರಣ", + "app.invitation.confirm": "ಆಹ್ವಾನಿಸಿ", + "app.createBreakoutRoom.title": "ಬ್ರೇಕ್ ಔಟ್ ಕೊಠಡಿಗಳು", + "app.createBreakoutRoom.ariaTitle": "ಬ್ರೇಕ್ ಔಟ್ ಕೊಠಡಿಗಳನ್ನು ಮರೆಮಾಡಿ", + "app.createBreakoutRoom.breakoutRoomLabel": "ಬ್ರೇಕ್ ಔಟ್ ಕೊಠಡಿಗಳು {0}", + "app.createBreakoutRoom.generatingURL": "URL ಅನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ", + "app.createBreakoutRoom.generatedURL": "ರಚಿಸಲಾಗಿದೆ", + "app.createBreakoutRoom.duration": "ಅವಧಿ {0}", + "app.createBreakoutRoom.room": "ಕೊಠಡಿ {0}", + "app.createBreakoutRoom.notAssigned": "ನಿಯೋಜಿಸಲಾಗಿಲ್ಲ ({0})", + "app.createBreakoutRoom.join": "ಕೋಣೆಗೆ ಸೇರಿ", + "app.createBreakoutRoom.joinAudio": "ಆಡಿಯೊಗೆ ಸೇರಿ", + "app.createBreakoutRoom.returnAudio": "ಆಡಿಯೊ ಹಿಂತಿರುಗಿ", + "app.createBreakoutRoom.alreadyConnected": "ಈಗಾಗಲೇ ಕೋಣೆಯಲ್ಲಿದೆ", + "app.createBreakoutRoom.confirm": "ರಚಿಸಿ", + "app.createBreakoutRoom.record": "ರೆಕಾರ್ಡ್ ಮಾಡಿ", + "app.createBreakoutRoom.numberOfRooms": "ಕೊಠಡಿಗಳ ಸಂಖ್ಯೆ", + "app.createBreakoutRoom.durationInMinutes": "ಅವಧಿ (ನಿಮಿಷಗಳು)", + "app.createBreakoutRoom.randomlyAssign": "ಯಾದೃಚ್ಚಕವಾಗಿ ನಿಯೋಜಿಸಿ", + "app.createBreakoutRoom.endAllBreakouts": "ಎಲ್ಲಾ ಬ್ರೇಕ್ ಔಟ್ ಕೊಠಡಿಗಳನ್ನು ಕೊನೆಗೊಳಿಸಿ", + "app.createBreakoutRoom.roomName": "{0} (ಕೊಠಡಿ - {1})", + "app.createBreakoutRoom.doneLabel": "ಮುಗಿದಿದೆ", + "app.createBreakoutRoom.nextLabel": "ಮುಂದೆ", + "app.createBreakoutRoom.minusRoomTime": "ಬ್ರೇಕ್ ಔಟ್ ಕೋಣೆಯ ಸಮಯವನ್ನು ಕಡಿಮೆ ಮಾಡಿ", + "app.createBreakoutRoom.addRoomTime": "ಬ್ರೇಕ್ ಔಟ್ ಕೋಣೆಯ ಸಮಯವನ್ನು ಹೆಚ್ಚಿಸಿ", + "app.createBreakoutRoom.addParticipantLabel": "ಭಾಗವಹಿಸುವವರನ್ನು ಸೇರಿಸಿ +", + "app.createBreakoutRoom.freeJoin": "ಸೇರಲು ಬ್ರೇಕ್ ಔಟ್ ಕೋಣೆಯನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಬಳಕೆದಾರರನ್ನು ಅನುಮತಿಸಿ", + "app.createBreakoutRoom.leastOneWarnBreakout": "ನೀವು ಕನಿಷ್ಠ ಒಬ್ಬ ಬಳಕೆದಾರರನ್ನು ಬ್ರೇಕ್‌ ಔಟ್ ಕೋಣೆಯಲ್ಲಿ ಇಡಬೇಕು.", + "app.createBreakoutRoom.modalDesc": "ಸುಳಿವು: ಬಳಕೆದಾರರ ಹೆಸರನ್ನು ನಿರ್ದಿಷ್ಟ ಬ್ರೇಕ್‌ ಔಟ್ ಕೋಣೆಗೆ ನಿಯೋಜಿಸಲು ನೀವು ಅವುಗಳನ್ನು ಎಳೆಯಿರಿ ಮತ್ತು ಬಿಡಬಹುದು.", + "app.createBreakoutRoom.roomTime": "{0} ನಿಮಿಷಗಳು", + "app.createBreakoutRoom.numberOfRoomsError": "ಕೊಠಡಿಗಳ ಸಂಖ್ಯೆ ಅಮಾನ್ಯವಾಗಿದೆ.", + "app.externalVideo.start": "ಹೊಸ ವೀಡಿಯೊವನ್ನು ಹಂಚಿಕೊಳ್ಳಿ", + "app.externalVideo.title": "ಬಾಹ್ಯ ವೀಡಿಯೊವನ್ನು ಹಂಚಿಕೊಳ್ಳಿ", + "app.externalVideo.input": "ಬಾಹ್ಯ ವೀಡಿಯೊ URL", + "app.externalVideo.urlInput": "ವೀಡಿಯೊ URL ಸೇರಿಸಿ", + "app.externalVideo.urlError": "ಈ ವೀಡಿಯೊ URL ಬೆಂಬಲಿಸುವುದಿಲ್ಲ", + "app.externalVideo.close": "ಮುಚ್ಚಿ", + "app.externalVideo.autoPlayWarning": "ಮಾಧ್ಯಮ ಸಿಂಕ್ರೊನೈಸೇಶನ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವೀಡಿಯೊವನ್ನು ಪ್ಲೇ ಮಾಡಿ", + "app.network.connection.effective.slow": "ಸಂಪರ್ಕ ಸಮಸ್ಯೆಗಳನ್ನು ನಾವು ಗಮನಿಸುತ್ತಿದ್ದೇವೆ.", + "app.network.connection.effective.slow.help": "ಹೆಚ್ಚಿನ ಮಾಹಿತಿ", + "app.externalVideo.noteLabel": "ಗಮನಿಸಿ: ಹಂಚಿದ ಬಾಹ್ಯ ವೀಡಿಯೊಗಳು ರೆಕಾರ್ಡಿಂಗ್‌ನಲ್ಲಿ ಗೋಚರಿಸುವುದಿಲ್ಲ. ಯೂಟ್ಯೂಬ್, ವಿಮಿಯೋ, ಇನ್‌ಸ್ಟ್ರಕ್ಚರ್ ಮೀಡಿಯಾ, ಟ್ವಿಚ್ ಮತ್ತು ಡೈಲಿ ಮೋಷನ್ URL ಗಳನ್ನು ಬೆಂಬಲಿಸಲಾಗುತ್ತದೆ.", + "app.actionsBar.actionsDropdown.shareExternalVideo": "ಬಾಹ್ಯ ವೀಡಿಯೊವನ್ನು ಹಂಚಿಕೊಳ್ಳಿ", + "app.actionsBar.actionsDropdown.stopShareExternalVideo": "ಬಾಹ್ಯ ವೀಡಿಯೊ ಹಂಚಿಕೊಳ್ಳುವುದನ್ನು ನಿಲ್ಲಿಸಿ", + "app.iOSWarning.label": "ದಯವಿಟ್ಟು iOS 12.2 ಅಥವಾ ಹೆಚ್ಚಿನದಕ್ಕೆ ಅಪ್‌ಗ್ರೇಡ್ ಮಾಡಿ", + "app.legacy.unsupportedBrowser": "ನೀವು ಬೆಂಬಲಿಸದ ಬ್ರೌಸರ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಂತೆ ತೋರುತ್ತಿದೆ. ಪೂರ್ಣ ಬೆಂಬಲಕ್ಕಾಗಿ ದಯವಿಟ್ಟು {0} ಅಥವಾ {1 use ಬಳಸಿ.", + "app.legacy.upgradeBrowser": "ನೀವು ಬೆಂಬಲಿತ ಬ್ರೌಸರ್‌ನ ಹಳೆಯ ಆವೃತ್ತಿಯನ್ನು ಬಳಸುತ್ತಿರುವಂತೆ ತೋರುತ್ತಿದೆ. ಪೂರ್ಣ ಬೆಂಬಲಕ್ಕಾಗಿ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು ಅಪ್‌ಗ್ರೇಡ್ ಮಾಡಿ.", + "app.legacy.criosBrowser": "iOSನಲ್ಲಿ ದಯವಿಟ್ಟು ಪೂರ್ಣ ಬೆಂಬಲಕ್ಕಾಗಿ ಸಫಾರಿ ಬಳಸಿ." +} From 360fce978152d10578bbba02cee8e5cde608cebc Mon Sep 17 00:00:00 2001 From: yogiks Date: Fri, 8 May 2020 15:57:23 +0530 Subject: [PATCH 20/65] Included Kannada --- bigbluebutton-html5/imports/startup/client/intl.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bigbluebutton-html5/imports/startup/client/intl.jsx b/bigbluebutton-html5/imports/startup/client/intl.jsx index 5166efdd2b33..278ea1e0d667 100644 --- a/bigbluebutton-html5/imports/startup/client/intl.jsx +++ b/bigbluebutton-html5/imports/startup/client/intl.jsx @@ -31,6 +31,7 @@ import it from 'react-intl/locale-data/it'; import ja from 'react-intl/locale-data/ja'; import ka from 'react-intl/locale-data/ka'; import km from 'react-intl/locale-data/km'; +import kn from 'react-intl/locale-data/kn'; import ko from 'react-intl/locale-data/ko'; import lt from 'react-intl/locale-data/lt'; import lv from 'react-intl/locale-data/lv'; @@ -78,6 +79,7 @@ addLocaleData([ ...ja, ...ka, ...km, + ...kn, ...ko, ...lt, ...lv, From 5f4676ec63ba29e538e179cf1df6d9ce26d9c855 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Tue, 12 May 2020 19:07:01 +0000 Subject: [PATCH 21/65] show lock by moderator label on shared notes --- .../user-list/user-list-content/styles.scss | 5 ++++ .../user-notes/component.jsx | 16 +++++++++++-- .../user-notes/container.jsx | 24 +++++++++++++++---- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/styles.scss b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/styles.scss index fac980e0fd80..f0e2dc7778eb 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/styles.scss @@ -134,3 +134,8 @@ overflow: hidden; flex-shrink: 1; } + +.noteLock { + font-size: 65%; + color: var(--color-gray-light); +} diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx index 34b1bc594390..75fb591c5c43 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx @@ -57,7 +57,7 @@ class UserNotes extends Component { } renderNotes() { - const { intl } = this.props; + const { intl, disableNotes } = this.props; const { unread } = this.state; let notification = null; @@ -82,7 +82,19 @@ class UserNotes extends Component { onClick={NoteService.toggleNotePanel} > - {intl.formatMessage(intlMessages.sharedNotes)} +
+
+ {intl.formatMessage(intlMessages.sharedNotes)} +
+ {disableNotes + ? ( +
+ + Locked by (moderator) +
+ ) : null + } +
{notification}
); diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx index 4e8f514ec274..bc14addf6dd6 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx @@ -1,11 +1,27 @@ import React from 'react'; import { withTracker } from 'meteor/react-meteor-data'; import NoteService from '/imports/ui/components/note/service'; +import Meetings from '/imports/api/meetings'; +import Users from '/imports/api/users'; +import Auth from '/imports/ui/services/auth'; import UserNotes from './component'; +const ROLE_VIEWER = Meteor.settings.public.user.role_viewer; + const UserNotesContainer = props => ; -export default withTracker(() => ({ - isPanelOpened: NoteService.isPanelOpened(), - revs: NoteService.getRevs(), -}))(UserNotesContainer); +export default withTracker(() => { + const Meeting = Meetings.findOne({ meetingId: Auth.meetingID }, + { fields: { 'lockSettingsProps.disableNote': 1 } }); + const isViewer = Users.findOne({ meetingId: Auth.meetingID, userId: Auth.userID }, { + fields: { + role: 1, + }, + }).role === ROLE_VIEWER; + + return { + isPanelOpened: NoteService.isPanelOpened(), + revs: NoteService.getRevs(), + disableNotes: Meeting.lockSettingsProps.disableNote && isViewer, + }; +})(UserNotesContainer); From c28b0108eac61dc08bd3aef4a066a6a945c402a4 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Tue, 12 May 2020 19:43:10 +0000 Subject: [PATCH 22/65] prevent user item displaying as locked for shared notes lock --- .../imports/ui/components/user-list/service.js | 3 +-- .../user-list/user-list-content/user-notes/component.jsx | 4 ++-- .../user-list/user-list-content/user-notes/container.jsx | 3 ++- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/user-list/service.js b/bigbluebutton-html5/imports/ui/components/user-list/service.js index 189a52085f1c..c1b082740e4f 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/service.js +++ b/bigbluebutton-html5/imports/ui/components/user-list/service.js @@ -286,8 +286,7 @@ const isMeetingLocked = (id) => { if (lockSettings.disableCam || lockSettings.disableMic || lockSettings.disablePrivateChat - || lockSettings.disablePublicChat - || lockSettings.disableNote) { + || lockSettings.disablePublicChat) { isLocked = true; } } diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx index 75fb591c5c43..340a3947008f 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx @@ -57,7 +57,7 @@ class UserNotes extends Component { } renderNotes() { - const { intl, disableNotes } = this.props; + const { intl, disableNote } = this.props; const { unread } = this.state; let notification = null; @@ -86,7 +86,7 @@ class UserNotes extends Component {
{intl.formatMessage(intlMessages.sharedNotes)}
- {disableNotes + {disableNote ? (
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx index bc14addf6dd6..9090376936ff 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx @@ -18,10 +18,11 @@ export default withTracker(() => { role: 1, }, }).role === ROLE_VIEWER; + const shouldDisableNote = (Meeting.lockSettingsProps.disableNote) && isViewer; return { isPanelOpened: NoteService.isPanelOpened(), revs: NoteService.getRevs(), - disableNotes: Meeting.lockSettingsProps.disableNote && isViewer, + disableNote: shouldDisableNote, }; })(UserNotesContainer); From 4c23e060bf5c0e05d02482b911f784d2e653cc11 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Tue, 12 May 2020 21:04:07 +0000 Subject: [PATCH 23/65] add username to remove confirmation title / update modal description --- .../user-list-item/user-dropdown/component.jsx | 4 ++-- bigbluebutton-html5/private/locales/en.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx index 5418d8b08bdc..5ced7fb6f2a3 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx @@ -413,12 +413,12 @@ class UserDropdown extends PureComponent { className={styles.modal} onRequestClose={() => mountModal(null)} hideBorder - contentLabel={intl.formatMessage(messages.removeConfirmTitle)} + contentLabel={intl.formatMessage(messages.removeConfirmTitle, { 0: user.name })} >
- {intl.formatMessage(messages.removeConfirmTitle)} + {intl.formatMessage(messages.removeConfirmTitle, { 0: user.name })}
diff --git a/bigbluebutton-html5/private/locales/en.json b/bigbluebutton-html5/private/locales/en.json index 72a5c37af07c..f5f23652d1db 100755 --- a/bigbluebutton-html5/private/locales/en.json +++ b/bigbluebutton-html5/private/locales/en.json @@ -72,8 +72,8 @@ "app.userList.menu.chat.label": "Start a private chat", "app.userList.menu.clearStatus.label": "Clear status", "app.userList.menu.removeUser.label": "Remove user", - "app.userList.menu.removeConfirmation.label": "Remove User Confirmation", - "app.userlist.menu.removeConfirmation.desc": "They will not be allowed to rejoin this current session.", + "app.userList.menu.removeConfirmation.label": "Remove user ({0})", + "app.userlist.menu.removeConfirmation.desc": "Are you sure you want to remove this user? Once removed they will not be able to rejoin this session.", "app.userList.menu.muteUserAudio.label": "Mute user", "app.userList.menu.unmuteUserAudio.label": "Unmute user", "app.userList.userAriaLabel": "{0} {1} {2} Status {3}", From 26143e588964cb8f005203d60538e8268bd99d2a Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Tue, 12 May 2020 21:21:56 +0000 Subject: [PATCH 24/65] prevent user item unlock affecting shared notes --- bigbluebutton-html5/imports/ui/components/note/service.js | 4 ++-- .../user-list/user-list-content/user-notes/component.jsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/note/service.js b/bigbluebutton-html5/imports/ui/components/note/service.js index 1eaa0ca51d40..303bece5e19f 100644 --- a/bigbluebutton-html5/imports/ui/components/note/service.js +++ b/bigbluebutton-html5/imports/ui/components/note/service.js @@ -43,7 +43,7 @@ const isLocked = () => { const meeting = Meetings.findOne({ meetingId: Auth.meetingID }, { fields: { 'lockSettingsProps.disableNote': 1 } }); const user = Users.findOne({ userId: Auth.userID }, { fields: { locked: 1, role: 1 } }); - if (meeting.lockSettingsProps && user.locked && user.role !== ROLE_MODERATOR) { + if (meeting.lockSettingsProps && user.role !== ROLE_MODERATOR) { return meeting.lockSettingsProps.disableNote; } return false; @@ -75,7 +75,7 @@ const isEnabled = () => { const toggleNotePanel = () => { Session.set( 'openPanel', - isPanelOpened() ? 'userlist' : 'note' + isPanelOpened() ? 'userlist' : 'note', ); }; diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx index 340a3947008f..235fb755dcaa 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx @@ -101,7 +101,7 @@ class UserNotes extends Component { } render() { - const { intl } = this.props; + const { intl, disableNote } = this.props; if (!NoteService.isEnabled()) return null; From 43a9f04edff2d2e291b62719a1bb456f711d7a26 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Tue, 12 May 2020 21:34:07 +0000 Subject: [PATCH 25/65] localise string --- .../user-list-content/user-notes/component.jsx | 10 +++++++++- bigbluebutton-html5/private/locales/en.json | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx index 235fb755dcaa..60cf083574b1 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx @@ -26,6 +26,14 @@ const intlMessages = defineMessages({ id: 'app.userList.notesListItem.unreadContent', description: 'Aria label for notes unread content', }, + locked: { + id: 'app.userList.locked', + description: '', + }, + byModerator: { + id: 'app.userList.byModerator', + description: '', + }, }); class UserNotes extends Component { @@ -90,7 +98,7 @@ class UserNotes extends Component { ? (
- Locked by (moderator) + {`${intl.formatMessage(intlMessages.locked)} ${intl.formatMessage(intlMessages.byModerator)}`}
) : null } diff --git a/bigbluebutton-html5/private/locales/en.json b/bigbluebutton-html5/private/locales/en.json index 72a5c37af07c..675d76016c37 100755 --- a/bigbluebutton-html5/private/locales/en.json +++ b/bigbluebutton-html5/private/locales/en.json @@ -63,6 +63,7 @@ "app.userList.presenter": "Presenter", "app.userList.you": "You", "app.userList.locked": "Locked", + "app.userList.byModerator": "by (Moderator)", "app.userList.label": "User list", "app.userList.toggleCompactView.label": "Toggle compact view mode", "app.userList.guest": "Guest", From 6af3a41c5d991de51328db8af053b04f7f54bdf8 Mon Sep 17 00:00:00 2001 From: Fred Dixon Date: Wed, 13 May 2020 08:39:32 -0400 Subject: [PATCH 26/65] Update bbb-conf Added display of kurento.sip_ip --- bigbluebutton-config/bin/bbb-conf | 1 + 1 file changed, 1 insertion(+) diff --git a/bigbluebutton-config/bin/bbb-conf b/bigbluebutton-config/bin/bbb-conf index bd4752330967..5ebc103d1fbe 100755 --- a/bigbluebutton-config/bin/bbb-conf +++ b/bigbluebutton-config/bin/bbb-conf @@ -1656,6 +1656,7 @@ if [ $CHECK ]; then echo "$KURENTO_CONFIG (Kurento SFU)" echo " kurento.ip: $(yq r $KURENTO_CONFIG kurento[0].ip)" echo " kurento.url: $(yq r $KURENTO_CONFIG kurento[0].url)" + echo " kurento.sip_ip: $(yq r $KURENTO_CONFIG freeswitch.sip_ip)" echo " localIpAddress: $(yq r $KURENTO_CONFIG localIpAddress)" echo " recordScreenSharing: $(yq r $KURENTO_CONFIG recordScreenSharing)" echo " recordWebcams: $(yq r $KURENTO_CONFIG recordWebcams)" From 79c435f9f977951008b587321087d3c4235764b8 Mon Sep 17 00:00:00 2001 From: prlanzarin Date: Thu, 14 May 2020 16:31:22 +0000 Subject: [PATCH 27/65] kurento-utils: add a fallback for getTracks Add a fallback in case getTracks isnt available (ahem safari 12.1). Use addStream directly on the peer instead --- .../public/compatibility/kurento-utils.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/bigbluebutton-html5/public/compatibility/kurento-utils.js b/bigbluebutton-html5/public/compatibility/kurento-utils.js index bc5d67b1391d..575ccf1ca2ec 100755 --- a/bigbluebutton-html5/public/compatibility/kurento-utils.js +++ b/bigbluebutton-html5/public/compatibility/kurento-utils.js @@ -440,10 +440,20 @@ function WebRtcPeer(mode, options, callback) { self.showLocalVideo(); } if (videoStream) { - videoStream.getTracks().forEach(track => pc.addTrack(track, videoStream)); + if (typeof videoStream.getTracks === 'function' + && typeof pc.addTrack === 'function') { + videoStream.getTracks().forEach(track => pc.addTrack(track, videoStream)); + } else { + pc.addStream(videoStream); + } } if (audioStream) { - audioStream.getTracks().forEach(track => pc.addTrack(track, audioStream)); + if (typeof audioStream.getTracks === 'function' + && typeof pc.addTrack === 'function') { + audioStream.getTracks().forEach(track => pc.addTrack(track, audioStream)); + } else { + pc.addStream(audioStream); + } } var browser = parser.getBrowser(); if (mode === 'sendonly' && (browser.name === 'Chrome' || browser.name === 'Chromium') && browser.major === 39) { From fe8e719757efd1fc23b9bf7a144810b23dcd0e0a Mon Sep 17 00:00:00 2001 From: prlanzarin Date: Thu, 14 May 2020 16:32:14 +0000 Subject: [PATCH 28/65] kurento-extension: add optional stream paremeter to avoid gUM/gDM if already done --- .../public/compatibility/kurento-extension.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/bigbluebutton-html5/public/compatibility/kurento-extension.js b/bigbluebutton-html5/public/compatibility/kurento-extension.js index 49c015488727..22e880715695 100755 --- a/bigbluebutton-html5/public/compatibility/kurento-extension.js +++ b/bigbluebutton-html5/public/compatibility/kurento-extension.js @@ -27,7 +27,7 @@ Kurento = function ( this.internalMeetingId = internalMeetingId; // Optional parameters are: userName, caleeName, chromeExtension, wsUrl, iceServers, - // chromeScreenshareSources, firefoxScreenshareSource, logger + // chromeScreenshareSources, firefoxScreenshareSource, logger, stream Object.assign(this, options); @@ -449,6 +449,7 @@ Kurento.prototype.startScreensharing = function () { this.onIceCandidate(candidate, this.SEND_ROLE); }, sendSource: 'desktop', + videoStream: this.stream || undefined, }; let resolution; @@ -877,11 +878,6 @@ window.getScreenConstraints = function (sendSource, callback) { if (hasDisplayMedia) { return callback(null, getDisplayMediaConstraints()); } - - if (isSafari) { - // At this time (version 11.1), Safari doesn't support screenshare. - return document.dispatchEvent(new Event('safariScreenshareNotSupported')); - } }; window.kurentoInitialize = function () { From e875408f8db8f742f9ae9ef320968c37b8c2d248 Mon Sep 17 00:00:00 2001 From: prlanzarin Date: Thu, 14 May 2020 16:36:03 +0000 Subject: [PATCH 29/65] screenshare: add support on Safari 12.1+ and make constraints configurable This adds support for screensharing on Safari 12.1+ or whichever has getDisplayMedia enabled To be conservative and backwards compatible, I`ve maintained the current gUM-based code available as a fallback for those still using older versions of FF or Chrome Made screenshare constraints configurable. The constraints config will be piped directly to gDM, so it`s just a regular gDM constraint dictionary --- .../api/screenshare/client/bridge/kurento.js | 9 ++- .../api/screenshare/client/bridge/service.js | 76 +++++++++++++++++++ .../actions-bar/desktop-share/component.jsx | 5 +- .../ui/components/screenshare/service.js | 5 +- .../private/config/settings.yml | 19 ++++- 5 files changed, 104 insertions(+), 10 deletions(-) diff --git a/bigbluebutton-html5/imports/api/screenshare/client/bridge/kurento.js b/bigbluebutton-html5/imports/api/screenshare/client/bridge/kurento.js index 3ad3aa1c2511..b375bd91041d 100755 --- a/bigbluebutton-html5/imports/api/screenshare/client/bridge/kurento.js +++ b/bigbluebutton-html5/imports/api/screenshare/client/bridge/kurento.js @@ -8,8 +8,8 @@ const SFU_CONFIG = Meteor.settings.public.kurento; const SFU_URL = SFU_CONFIG.wsUrl; const CHROME_DEFAULT_EXTENSION_KEY = SFU_CONFIG.chromeDefaultExtensionKey; const CHROME_CUSTOM_EXTENSION_KEY = SFU_CONFIG.chromeExtensionKey; -const CHROME_SCREENSHARE_SOURCES = SFU_CONFIG.chromeScreenshareSources; -const FIREFOX_SCREENSHARE_SOURCE = SFU_CONFIG.firefoxScreenshareSource; +const CHROME_SCREENSHARE_SOURCES = SFU_CONFIG.screenshare.chromeScreenshareSources; +const FIREFOX_SCREENSHARE_SOURCE = SFU_CONFIG.screenshare.firefoxScreenshareSource; const SCREENSHARE_VIDEO_TAG = 'screenshareVideo'; const CHROME_EXTENSION_KEY = CHROME_CUSTOM_EXTENSION_KEY === 'KEY' ? CHROME_DEFAULT_EXTENSION_KEY : CHROME_CUSTOM_EXTENSION_KEY; @@ -161,12 +161,13 @@ export default class KurentoScreenshareBridge { window.kurentoExitVideo(); } - async kurentoShareScreen(onFail) { + async kurentoShareScreen(onFail, stream) { let iceServers = []; try { iceServers = await fetchWebRTCMappedStunTurnServers(getSessionToken()); } catch (error) { logger.error({ logCode: 'screenshare_presenter_fetchstunturninfo_error' }, + 'Screenshare bridge failed to fetch STUN/TURN info, using default'); } finally { const options = { @@ -193,6 +194,8 @@ export default class KurentoScreenshareBridge { }, 'Screenshare presenter started succesfully'); }; + options.stream = stream || undefined; + window.kurentoShareScreen( SCREENSHARE_VIDEO_TAG, BridgeService.getConferenceBridge(), diff --git a/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js b/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js index b1be0cc4291e..2a41c744b0c1 100644 --- a/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js +++ b/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js @@ -1,7 +1,83 @@ import Meetings from '/imports/api/meetings'; +import logger from '/imports/startup/client/logger'; + +const { + constraints: GDM_CONSTRAINTS, +} = Meteor.settings.public.kurento.screenshare; + +const hasDisplayMedia = (typeof navigator.getDisplayMedia === 'function' + || (navigator.mediaDevices && typeof navigator.mediaDevices.getDisplayMedia === 'function')); const getConferenceBridge = () => Meetings.findOne().voiceProp.voiceConf; +const getScreenStream = async () => { + const gDMCallback = (stream) => { + if (typeof stream.getVideoTracks === 'function' + && typeof constraints.video === 'object') { + stream.getVideoTracks().forEach(track => { + if (typeof track.applyConstraints === 'function') { + track.applyConstraints(constraints.video).catch(error => { + logger.warn({ + logCode: 'screenshare_videoconstraint_failed', + extraInfo: { errorName: error.name, errorCode: error.code }, + }, + 'Error applying screenshare video constraint'); + }); + } + }); + } + + if (typeof stream.getAudioTracks === 'function' + && typeof constraints.audio === 'object') { + stream.getAudioTracks().forEach(track => { + if (typeof track.applyConstraints === 'function') { + track.APplyConstraints(constraints.audio).catch(error => { + logger.warn({ + logCode: 'screenshare_audioconstraint_failed', + extraInfo: { errorName: error.name, errorCode: error.code }, + }, 'Error applying screenshare audio constraint'); + }); + } + }); + } + + return Promise.resolve(stream); + } + + const constraints = hasDisplayMedia ? GDM_CONSTRAINTS : null; + + // getDisplayMedia isn't supported, generate no stream and let the legacy + // constraint fetcher work its way on kurento-extension.js + if (constraints == null) { + return Promise.resolve(); + } else { + if (typeof navigator.getDisplayMedia === 'function') { + return navigator.getDisplayMedia(constraints) + .then(gDMCallback) + .catch(error => { + logger.error({ + logCode: 'screenshare_getdisplaymedia_failed', + extraInfo: { errorName: error.name, errorCode: error.code }, + }, 'getDisplayMedia call failed'); + return Promise.resolve(); + }); + } else if (navigator.mediaDevices && typeof navigator.mediaDevices.getDisplayMedia === 'function') { + return navigator.mediaDevices.getDisplayMedia(constraints) + .then(gDMCallback) + .catch(error => { + logger.error({ + logCode: 'screenshare_getdisplaymedia_failed', + extraInfo: { errorName: error.name, errorCode: error.code }, + }, 'getDisplayMedia call failed'); + return Promise.resolve(); + }); + } + } +} + + export default { + hasDisplayMedia, getConferenceBridge, + getScreenStream, }; diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx index e4a185903dc4..0cb2cd7893ad 100755 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx @@ -9,6 +9,7 @@ import cx from 'classnames'; import Modal from '/imports/ui/components/modal/simple/component'; import { withModalMounter } from '../../modal/service'; import { styles } from '../styles'; +import ScreenshareBridgeService from '/imports/api/screenshare/client/bridge/service'; const propTypes = { intl: intlShape.isRequired, @@ -114,7 +115,7 @@ const isMobileBrowser = (BROWSER_RESULTS ? BROWSER_RESULTS.mobile : false) || (BROWSER_RESULTS && BROWSER_RESULTS.os ? BROWSER_RESULTS.os.includes('Android') // mobile flag doesn't always work : false); -const isSafari = BROWSER_RESULTS.name === 'safari'; +const IS_SAFARI = BROWSER_RESULTS.name === 'safari'; const DesktopShare = ({ intl, @@ -182,7 +183,7 @@ const DesktopShare = ({ circle size="lg" onClick={isVideoBroadcasting ? handleUnshareScreen : () => { - if (isSafari) { + if (!IS_SAFARI || (IS_SAFARI && ScreenshareBridgeService.hasDisplayMedia)) { return mountModal( { stopWatching(); } - KurentoBridge.kurentoShareScreen(onFail); + BridgeService.getScreenStream().then(stream => { + KurentoBridge.kurentoShareScreen(onFail, stream); + }).catch(onFail); }; const screenShareEndAlert = () => new Audio(`${Meteor.settings.public.app.cdn + Meteor.settings.public.app.basename}/resources/sounds/ScreenshareOff.mp3`).play(); diff --git a/bigbluebutton-html5/private/config/settings.yml b/bigbluebutton-html5/private/config/settings.yml index b40d1296e378..3453db191a27 100755 --- a/bigbluebutton-html5/private/config/settings.yml +++ b/bigbluebutton-html5/private/config/settings.yml @@ -90,10 +90,21 @@ public: chromeDefaultExtensionLink: https://chrome.google.com/webstore/detail/bigbluebutton-screenshare/akgoaoikmbmhcopjgakkcepdgdgkjfbc chromeExtensionKey: KEY chromeExtensionLink: LINK - chromeScreenshareSources: - - window - - screen - firefoxScreenshareSource: window + screenshare: + constraints: + video: + frameRate: + ideal: 5 + max: 10 + width: + max: 2560 + height: + max: 1600 + audio: false + chromeScreenshareSources: + - window + - screen + firefoxScreenshareSource: window cameraProfiles: - id: low name: Low quality From a6a5aaf3d9e60e1a1a8cfc1341ee574ad3b429c4 Mon Sep 17 00:00:00 2001 From: Paulo Lanzarin Date: Thu, 14 May 2020 14:00:58 -0300 Subject: [PATCH 30/65] screenshare: typo in applyConstraints --- .../imports/api/screenshare/client/bridge/service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js b/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js index 2a41c744b0c1..e2565e434cbf 100644 --- a/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js +++ b/bigbluebutton-html5/imports/api/screenshare/client/bridge/service.js @@ -31,7 +31,7 @@ const getScreenStream = async () => { && typeof constraints.audio === 'object') { stream.getAudioTracks().forEach(track => { if (typeof track.applyConstraints === 'function') { - track.APplyConstraints(constraints.audio).catch(error => { + track.applyConstraints(constraints.audio).catch(error => { logger.warn({ logCode: 'screenshare_audioconstraint_failed', extraInfo: { errorName: error.name, errorCode: error.code }, From 75413957818623aefc4b716345f32a7199fd392a Mon Sep 17 00:00:00 2001 From: Paulo Lanzarin Date: Thu, 14 May 2020 15:23:07 -0300 Subject: [PATCH 31/65] screenshare: fix safari availability check --- .../ui/components/actions-bar/desktop-share/component.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx index 0cb2cd7893ad..e1431baf1692 100755 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx @@ -183,7 +183,7 @@ const DesktopShare = ({ circle size="lg" onClick={isVideoBroadcasting ? handleUnshareScreen : () => { - if (!IS_SAFARI || (IS_SAFARI && ScreenshareBridgeService.hasDisplayMedia)) { + if (IS_SAFARI && !ScreenshareBridgeService.hasDisplayMedia)) { return mountModal( Date: Fri, 15 May 2020 13:42:20 +0200 Subject: [PATCH 32/65] akka-bbb-apps only listen on localhost attack surface reduction by having akka-bbb-apps only listen on localhost --- akka-bbb-apps/src/universal/conf/application.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-bbb-apps/src/universal/conf/application.conf b/akka-bbb-apps/src/universal/conf/application.conf index 559036109552..4bf02465c110 100755 --- a/akka-bbb-apps/src/universal/conf/application.conf +++ b/akka-bbb-apps/src/universal/conf/application.conf @@ -65,7 +65,7 @@ sharedNotes { } http { - interface = "0.0.0.0" + interface = "127.0.0.1" port = 9999 } From f327f31e71ac980ea8af1dde5946e3350a0784c9 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Fri, 15 May 2020 13:10:52 +0000 Subject: [PATCH 33/65] update not supported string to be browser agnostic (screen share) --- .../ui/components/actions-bar/desktop-share/component.jsx | 8 ++++---- bigbluebutton-html5/private/locales/en.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx index e4a185903dc4..b485b3a8a492 100755 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/desktop-share/component.jsx @@ -55,9 +55,9 @@ const intlMessages = defineMessages({ id: 'app.screenshare.notSupportedError', description: 'error message when trying to share screen in unsafe environments', }, - noSafariScreenShare: { - id: 'app.media.screenshare.safariNotSupported', - descriptions: 'error message when trying to share screen on safari', + screenShareNotSupported: { + id: 'app.media.screenshare.notSupported', + descriptions: 'error message when trying share screen on unsupported browsers', }, screenShareUnavailable: { id: 'app.media.screenshare.unavailable', @@ -193,7 +193,7 @@ const DesktopShare = ({

{intl.formatMessage(intlMessages.screenShareUnavailable)}

-

{intl.formatMessage(intlMessages.noSafariScreenShare)}

+

{intl.formatMessage(intlMessages.screenShareNotSupported)}

); } handleShareScreen(onFail); diff --git a/bigbluebutton-html5/private/locales/en.json b/bigbluebutton-html5/private/locales/en.json index 347e5dddfa3b..23d2416df21e 100755 --- a/bigbluebutton-html5/private/locales/en.json +++ b/bigbluebutton-html5/private/locales/en.json @@ -115,7 +115,7 @@ "app.media.screenshare.start": "Screenshare has started", "app.media.screenshare.end": "Screenshare has ended", "app.media.screenshare.unavailable": "Screenshare Unavailable", - "app.media.screenshare.safariNotSupported": "Screenshare is currently not supported in Safari. Please, use Firefox or Google Chrome.", + "app.media.screenshare.notSupported": "Screensharing is not supported in this browser.", "app.media.screenshare.autoplayBlockedDesc": "We need your permission to show you the presenter's screen.", "app.media.screenshare.autoplayAllowLabel": "View shared screen", "app.screenshare.notAllowed": "Error: Permission to access screen wasn't granted.", From 76a645c1008f8e18bb6b2a0c7bda4af81f5de695 Mon Sep 17 00:00:00 2001 From: Fred Dixon Date: Fri, 15 May 2020 12:25:28 -0400 Subject: [PATCH 34/65] Update bigbluebutton-release Bump to 2.2.11 --- bigbluebutton-config/bigbluebutton-release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-config/bigbluebutton-release b/bigbluebutton-config/bigbluebutton-release index 206a358f8837..675cad0e0bf8 100644 --- a/bigbluebutton-config/bigbluebutton-release +++ b/bigbluebutton-config/bigbluebutton-release @@ -1,2 +1,2 @@ -BIGBLUEBUTTON_RELEASE=2.2.10 +BIGBLUEBUTTON_RELEASE=2.2.11 From 6f80291637c17f41cc13592487bda6aea8b5e6f0 Mon Sep 17 00:00:00 2001 From: Fred Dixon Date: Sat, 16 May 2020 08:44:50 -0500 Subject: [PATCH 35/65] Bump to 2.2.11-dev --- bigbluebutton-config/bigbluebutton-release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-config/bigbluebutton-release b/bigbluebutton-config/bigbluebutton-release index 675cad0e0bf8..6134ec4dbf0f 100644 --- a/bigbluebutton-config/bigbluebutton-release +++ b/bigbluebutton-config/bigbluebutton-release @@ -1,2 +1,2 @@ -BIGBLUEBUTTON_RELEASE=2.2.11 +BIGBLUEBUTTON_RELEASE=2.2.11-dev From b257e34d9db60394b38aa6dc502fd7b774f3aa25 Mon Sep 17 00:00:00 2001 From: Fred Dixon Date: Sat, 16 May 2020 08:45:27 -0500 Subject: [PATCH 36/65] Check for kurento.sip_ip is correct --- bigbluebutton-config/bin/bbb-conf | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/bigbluebutton-config/bin/bbb-conf b/bigbluebutton-config/bin/bbb-conf index 5ebc103d1fbe..dfea29d646b2 100755 --- a/bigbluebutton-config/bin/bbb-conf +++ b/bigbluebutton-config/bin/bbb-conf @@ -1537,6 +1537,23 @@ check_state() { echo "#" fi + FREESWITCH_SIP=$(netstat -anlt | grep :5066 | grep -v tcp6 | grep LISTEN | sed 's/ [ ]*/ /g' | cut -d' ' -f4 | sed 's/:5066//g') + KURENTO_SIP=$(yq r $KURENTO_CONFIG freeswitch.sip_ip) + + if [ ! -z "$FREESWITCH_SIP" ]; then + if [ "$FREESWITCH_SIP" != "$KURENTO_SIP" ]; then + echo + echo "#" + echo "# Kurento is will try to connect to $KURENTO_SIP but FreeSWITCH is listening on $FREESWITCH_SIP for port 5066" + echo "#" + echo "# To fix, run the commands" + echo "#" + echo "# sudo yq w -i /usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml freeswitch.sip_ip $FREESWITCH_SIP" + echo "# sudo chown bigbluebutton:bigbluebutton /usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml" + echo "#" + fi + fi + exit 0 } From 0eae6393672866b1c9471c658361159f000c0164 Mon Sep 17 00:00:00 2001 From: Fred Dixon Date: Sat, 16 May 2020 10:20:48 -0400 Subject: [PATCH 37/65] Update bigbluebutton-release Bump to 2.2.11 --- bigbluebutton-config/bigbluebutton-release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-config/bigbluebutton-release b/bigbluebutton-config/bigbluebutton-release index 6134ec4dbf0f..675cad0e0bf8 100644 --- a/bigbluebutton-config/bigbluebutton-release +++ b/bigbluebutton-config/bigbluebutton-release @@ -1,2 +1,2 @@ -BIGBLUEBUTTON_RELEASE=2.2.11-dev +BIGBLUEBUTTON_RELEASE=2.2.11 From e48e5bf3365c6dda416c7c5f635e9fc84e4b35a7 Mon Sep 17 00:00:00 2001 From: Fred Dixon Date: Sat, 16 May 2020 10:28:28 -0500 Subject: [PATCH 38/65] Fix presenation playback on iPad for iOS 13 --- .../playback/presentation/2.0/lib/writing.js | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/record-and-playback/presentation/playback/presentation/2.0/lib/writing.js b/record-and-playback/presentation/playback/presentation/2.0/lib/writing.js index b4d12b201d17..147156f6cf88 100755 --- a/record-and-playback/presentation/playback/presentation/2.0/lib/writing.js +++ b/record-and-playback/presentation/playback/presentation/2.0/lib/writing.js @@ -103,11 +103,33 @@ function getFullURL() { return url; }; +// https://stackoverflow.com/a/60553965 +function detectLyingiOS13iPad() { + var userAgent = navigator.userAgent || navigator.vendor || window.opera; + // Lying iOS13 iPad + if (userAgent.match(/Macintosh/i) !== null) { + // need to distinguish between Macbook and iPad + var canvas = document.createElement("canvas"); + if (canvas !== null) { + var context = canvas.getContext("webgl") || canvas.getContext("experimental-webgl"); + if (context) { + var info = context.getExtension("WEBGL_debug_renderer_info"); + if (info) { + var renderer = context.getParameter(info.UNMASKED_RENDERER_WEBGL); + if (renderer.indexOf("Apple") !== -1) + return true; + } + } + } + } + return false; +} + // http://stackoverflow.com/a/11381730 function mobileAndTabletCheck() { let check = false; (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera); - return check; + return check || detectLyingiOS13iPad();; } // Draw the cursor at a specific point From 860c85e09c01e98d92d1f09a86a8e544269d71aa Mon Sep 17 00:00:00 2001 From: Lucas Zawacki Date: Mon, 18 May 2020 12:06:06 -0300 Subject: [PATCH 39/65] Update react-player library --- bigbluebutton-html5/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-html5/package.json b/bigbluebutton-html5/package.json index 6244d70074c8..a3ec4a13a09b 100755 --- a/bigbluebutton-html5/package.json +++ b/bigbluebutton-html5/package.json @@ -65,7 +65,7 @@ "react-dropzone": "^7.0.1", "react-intl": "~2.7.2", "react-modal": "~3.6.1", - "react-player": "^1.11.1", + "react-player": "^2.0.1", "react-render-in-browser": "^1.1.1", "react-tabs": "^2.3.1", "react-toastify": "^4.5.2", From aa8326995c59e174dba434bf3278387079d5cfab Mon Sep 17 00:00:00 2001 From: Lucas Zawacki Date: Mon, 18 May 2020 12:11:12 -0300 Subject: [PATCH 40/65] Work with video time based in seconds (integers) --- .../imports/ui/components/external-video-player/component.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/ui/components/external-video-player/component.jsx b/bigbluebutton-html5/imports/ui/components/external-video-player/component.jsx index 845076181ce3..0b17025fa388 100644 --- a/bigbluebutton-html5/imports/ui/components/external-video-player/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/external-video-player/component.jsx @@ -201,7 +201,7 @@ class VideoPlayer extends Component { getCurrentTime() { if (this.player && this.player.getCurrentTime) { - return this.player.getCurrentTime(); + return Math.round(this.player.getCurrentTime()); } } From b9c75b48729f4a5de154c96ccfbc7ce251f991a1 Mon Sep 17 00:00:00 2001 From: Lucas Zawacki Date: Mon, 18 May 2020 13:16:03 -0300 Subject: [PATCH 41/65] Remove timestamp correction logic --- .../server/methods/initializeExternalVideo.js | 12 ++----- .../external-video-player/component.jsx | 34 ++++++------------- 2 files changed, 13 insertions(+), 33 deletions(-) diff --git a/bigbluebutton-html5/imports/api/external-videos/server/methods/initializeExternalVideo.js b/bigbluebutton-html5/imports/api/external-videos/server/methods/initializeExternalVideo.js index 2c76ad38fe92..30990e1f42f1 100644 --- a/bigbluebutton-html5/imports/api/external-videos/server/methods/initializeExternalVideo.js +++ b/bigbluebutton-html5/imports/api/external-videos/server/methods/initializeExternalVideo.js @@ -2,25 +2,17 @@ import { extractCredentials } from '/imports/api/common/server/helpers'; import Logger from '/imports/startup/server/logger'; const allowRecentMessages = (eventName, message) => { - const LATE_MESSAGE_THRESHOLD = 3000; const { userId, meetingId, time, - timestamp, rate, state, } = message; - if (timestamp > Date.now() - LATE_MESSAGE_THRESHOLD) { - Logger.debug(`ExternalVideo Streamer auth allowed userId: ${userId}, meetingId: ${meetingId}, event: ${eventName}, time: ${time}, timestamp: ${timestamp/1000} rate: ${rate}, state: ${state}`); - return true; - } - - Logger.debug(`ExternalVideo Streamer auth rejected userId: ${userId}, meetingId: ${meetingId}, event: ${eventName}, time: ${time}, timestamp: ${timestamp/1000} rate: ${rate}, state: ${state}`); - - return false; + Logger.debug(`ExternalVideo Streamer auth allowed userId: ${userId}, meetingId: ${meetingId}, event: ${eventName}, time: ${time} rate: ${rate}, state: ${state}`); + return true; }; export default function initializeExternalVideo() { diff --git a/bigbluebutton-html5/imports/ui/components/external-video-player/component.jsx b/bigbluebutton-html5/imports/ui/components/external-video-player/component.jsx index 0b17025fa388..627d8ef74d97 100644 --- a/bigbluebutton-html5/imports/ui/components/external-video-player/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/external-video-player/component.jsx @@ -171,7 +171,7 @@ class VideoPlayer extends Component { const messageDelay = (msg === 'play' || msg === 'stop') ? THROTTLE_INTERVAL_SECONDS : 0; this.throttleTimeout = setTimeout(() => { - sendMessage(msg, { ...params, timestamp }); + sendMessage(msg, { ...params }); }, messageDelay*1000); this.lastMessage = msg; @@ -267,25 +267,25 @@ class VideoPlayer extends Component { }, SYNC_INTERVAL_SECONDS * 1000); } else { - onMessage('play', ({ time, timestamp }) => { + onMessage('play', ({ time }) => { const { hasPlayedBefore, player } = this; if (!player || !hasPlayedBefore) { return; } - this.seekTo(time, timestamp); + this.seekTo(time); this.setState({ playing: true }); logger.debug({ logCode: 'external_video_client_play' }, 'Play external video'); }); - onMessage('stop', ({ time, timestamp }) => { + onMessage('stop', ({ time }) => { const { hasPlayedBefore, player } = this; if (!player || !hasPlayedBefore) { return; } - this.seekTo(time, timestamp); + this.seekTo(time); this.setState({ playing: false }); logger.debug({ logCode: 'external_video_client_stop' }, 'Stop external video'); @@ -304,7 +304,7 @@ class VideoPlayer extends Component { onMessage('playerUpdate', (data) => { const { hasPlayedBefore, player } = this; const { playing } = this.state; - const { time, timestamp, rate, state } = data; + const { time, rate, state } = data; if (!player || !hasPlayedBefore) { return; @@ -320,7 +320,7 @@ class VideoPlayer extends Component { }, 'Change external video playback rate.'); } - this.seekTo(time, timestamp); + this.seekTo(time); if (playing !== state) { this.setState({ playing: state }); @@ -329,32 +329,20 @@ class VideoPlayer extends Component { } } - seekTo(time, timestamp) { + seekTo(time) { const { player } = this; if (!player) { return logger.error("No player on seek"); } - const curTimestamp = Date.now(); - const timestampDiff = (curTimestamp - timestamp)/1000; - const realTime = time + timestampDiff; - - // Ignore seek commands that arrived too late - if (timestampDiff > SYNC_INTERVAL_SECONDS) { - logger.debug({ - logCode: 'external_video_client_message_too_late', - extraInfo: { time, timestamp, }, - }, 'Not seeking because message came too late'); - return; - } // Seek if viewer has drifted too far away from presenter - if (Math.abs(this.getCurrentTime() - realTime) > SYNC_INTERVAL_SECONDS*0.75) { - player.seekTo(realTime, true); + if (Math.abs(this.getCurrentTime() - time) > SYNC_INTERVAL_SECONDS*0.75) { + player.seekTo(time, true); logger.debug({ logCode: 'external_video_client_update_seek', - extraInfo: { time, timestamp, }, + extraInfo: { time, }, }, `Seek external video to: ${time}`); } } From 9219621cd25fd43ba72c57de8aa1238584d215ff Mon Sep 17 00:00:00 2001 From: Lucas Zawacki Date: Mon, 18 May 2020 15:45:29 -0300 Subject: [PATCH 42/65] Add package lock for react-player update --- bigbluebutton-html5/package-lock.json | 44 +++++++++++++++++---------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/bigbluebutton-html5/package-lock.json b/bigbluebutton-html5/package-lock.json index 55c3749f7162..ded57267f88b 100644 --- a/bigbluebutton-html5/package-lock.json +++ b/bigbluebutton-html5/package-lock.json @@ -253,7 +253,7 @@ }, "ansi-escapes": { "version": "3.1.0", - "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, @@ -652,7 +652,7 @@ }, "bignumber.js": { "version": "2.4.0", - "resolved": "http://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=", "dev": true }, @@ -1610,7 +1610,7 @@ }, "es6-promise": { "version": "3.3.1", - "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", "dev": true }, @@ -1797,7 +1797,7 @@ "dependencies": { "doctrine": { "version": "1.5.0", - "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -1816,7 +1816,7 @@ }, "load-json-file": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { @@ -2228,7 +2228,7 @@ }, "file-type": { "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", "dev": true }, @@ -3967,6 +3967,11 @@ "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" }, + "memoize-one": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", + "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==" + }, "memwatch-next": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/memwatch-next/-/memwatch-next-0.3.0.tgz", @@ -5591,6 +5596,11 @@ "prop-types": "^15.6.2" } }, + "react-fast-compare": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.1.1.tgz", + "integrity": "sha512-SCsAORWK59BvauR2L1BTdjQbJcSGJJz03U0awektk2hshLKrITDDFTlgGCqIZpTDlPC/NFlZee6xTMzXPVLiHw==" + }, "react-intl": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-2.7.2.tgz", @@ -5625,19 +5635,21 @@ } }, "react-player": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/react-player/-/react-player-1.11.1.tgz", - "integrity": "sha512-bS4qls4eICdwklCm/jqjSvYZt1dl07biT8aAiXG9dMZ2s789cZtCDiHdwKP2FH82jHYk5oFfHXy7EL9lMjUfxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-player/-/react-player-2.0.1.tgz", + "integrity": "sha512-QG/NutOfDq4FF/7nzMDzM4nmb8ExVES/5n973NSZgZ/1iE6ObmhDOau9gO67NPYOQv/RhOJ4S8b0g9bVAdK9vA==", "requires": { - "deepmerge": "^3.0.0", + "deepmerge": "^4.0.0", "load-script": "^1.0.0", - "prop-types": "^15.5.6" + "memoize-one": "^5.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.0.1" }, "dependencies": { "deepmerge": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", - "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" } } }, @@ -5923,7 +5935,7 @@ }, "tough-cookie": { "version": "2.3.4", - "resolved": "http://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { @@ -7459,7 +7471,7 @@ "dependencies": { "xmlbuilder": { "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true } From 2637685c1cd426bda703bab015f45813d9bba832 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Tue, 19 May 2020 13:58:00 +0000 Subject: [PATCH 43/65] update shared note item style --- .../user-list/user-list-content/styles.scss | 26 +++++++++++++++++-- .../user-notes/component.jsx | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/styles.scss b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/styles.scss index f0e2dc7778eb..152d9c98c4ef 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/styles.scss @@ -32,6 +32,7 @@ border-radius: none; } + overflow-x: hidden; outline-width: 1px !important; outline-color: transparent !important; } @@ -70,6 +71,11 @@ font-size: 175%; color: var(--color-gray-light); flex: 0 0 2.2rem; + margin-right: var(--sm-padding-x); + [dir="rtl"] & { + margin-right: 0; + margin-left: var(--sm-padding-x); + } } > span { @@ -91,6 +97,12 @@ } } + div { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + &:active { background-color: var(--list-item-bg-hover); box-shadow: inset 0 0 0 var(--border-size) var(--item-focus-border), inset 1px 0 0 1px var(--item-focus-border); @@ -136,6 +148,16 @@ } .noteLock { - font-size: 65%; - color: var(--color-gray-light); + font-weight: 200; + font-size: var(--font-size-smaller); + color: var(--color-gray); + + > i { + font-size: var(--font-size-xs); + } +} + +.noteTitle { + font-weight: 400; + font-size: var(--font-size-small); } diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx index 60cf083574b1..a61ae121a85f 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/component.jsx @@ -91,7 +91,7 @@ class UserNotes extends Component { >
-
+
{intl.formatMessage(intlMessages.sharedNotes)}
{disableNote From eb006d470be5e4e59fc4d8aca19dba797d0c5953 Mon Sep 17 00:00:00 2001 From: Richard Alam Date: Tue, 19 May 2020 12:41:35 -0700 Subject: [PATCH 44/65] Ejected users due to permission check cannot rejoin meeting - users who are ejected from meeting because of permission check cannot rejoin meeting as we mark them as banned. Only users ejected by a moderator should be banned. Later on, we should make the moderator indicate if the ejected user should be bannd or not. see https://github.com/bigbluebutton/bigbluebutton/issues/9608 --- .../core/apps/PermissionCheck.scala | 3 +- .../users/EjectDuplicateUserReqMsgHdlr.scala | 3 +- .../EjectUserFromMeetingCmdMsgHdlr.scala | 36 +++++++++++++++++-- .../core/apps/users/UsersApp.scala | 5 +-- .../users/ValidateAuthTokenReqMsgHdlr.scala | 6 ++-- .../core/models/RegisteredUsers.scala | 21 ++++++----- .../core/running/MeetingActor.scala | 11 +++++- 7 files changed, 63 insertions(+), 22 deletions(-) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermissionCheck.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermissionCheck.scala index 9c57ac580da5..760203a56dff 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermissionCheck.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermissionCheck.scala @@ -85,7 +85,8 @@ object PermissionCheck { outGW: OutMsgRouter, liveMeeting: LiveMeeting): Unit = { val ejectedBy = SystemUser.ID - UsersApp.ejectUserFromMeeting(outGW, liveMeeting, userId, ejectedBy, reason, EjectReasonCode.PERMISSION_FAILED) + UsersApp.ejectUserFromMeeting(outGW, liveMeeting, userId, ejectedBy, reason, EjectReasonCode.PERMISSION_FAILED, ban = false) + // send a system message to force disconnection Sender.sendDisconnectClientSysMsg(meetingId, userId, ejectedBy, reason, outGW) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectDuplicateUserReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectDuplicateUserReqMsgHdlr.scala index f502556385ab..f7111af84fd6 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectDuplicateUserReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectDuplicateUserReqMsgHdlr.scala @@ -17,7 +17,8 @@ trait EjectDuplicateUserReqMsgHdlr { val ejectedBy = SystemUser.ID val reason = "user ejected because of duplicate external userid" - UsersApp.ejectUserFromMeeting(outGW, liveMeeting, userId, ejectedBy, reason, EjectReasonCode.DUPLICATE_USER) + UsersApp.ejectUserFromMeeting(outGW, liveMeeting, userId, ejectedBy, reason, EjectReasonCode.DUPLICATE_USER, ban = false) + // send a system message to force disconnection Sender.sendDisconnectClientSysMsg(meetingId, userId, ejectedBy, EjectReasonCode.DUPLICATE_USER, outGW) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala index 4915c73f8008..d7802a351514 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala @@ -33,6 +33,12 @@ trait EjectUserFromMeetingCmdMsgHdlr extends RightsManagementTrait { ejectedByUser <- RegisteredUsers.findWithUserId(ejectedBy, liveMeeting.registeredUsers) } yield { if (registeredUser.externId != ejectedByUser.externId) { + // Hardcode right now to true. Once we've added the ban field to the + // eject message, we can use that here. + // For the moment, just assume that is a user is ejected by another user, + // then that user should be banned (ralam may 19, 2020) + // see https://github.com/bigbluebutton/bigbluebutton/issues/9608 + val ban = true // Eject users //println("****************** User " + ejectedBy + " ejecting user " + userId) // User might have joined using multiple browsers. @@ -40,7 +46,15 @@ trait EjectUserFromMeetingCmdMsgHdlr extends RightsManagementTrait { // ralam april 21, 2020 RegisteredUsers.findAllWithExternUserId(registeredUser.externId, liveMeeting.registeredUsers) foreach { ru => //println("****************** User " + ejectedBy + " ejecting other user " + ru.id) - UsersApp.ejectUserFromMeeting(outGW, liveMeeting, ru.id, ejectedBy, reason, EjectReasonCode.EJECT_USER) + UsersApp.ejectUserFromMeeting( + outGW, + liveMeeting, + ru.id, + ejectedBy, + reason, + EjectReasonCode.EJECT_USER, + ban + ) // send a system message to force disconnection Sender.sendDisconnectClientSysMsg(meetingId, ru.id, ejectedBy, EjectReasonCode.EJECT_USER, outGW) } @@ -48,7 +62,15 @@ trait EjectUserFromMeetingCmdMsgHdlr extends RightsManagementTrait { // User is ejecting self, so just eject this userid not all sessions if joined using multiple // browsers. ralam april 23, 2020 //println("****************** User " + ejectedBy + " ejecting self " + userId) - UsersApp.ejectUserFromMeeting(outGW, liveMeeting, userId, ejectedBy, reason, EjectReasonCode.EJECT_USER) + UsersApp.ejectUserFromMeeting( + outGW, + liveMeeting, + userId, + ejectedBy, + reason, + EjectReasonCode.EJECT_USER, + ban = false + ) // send a system message to force disconnection Sender.sendDisconnectClientSysMsg(meetingId, userId, ejectedBy, EjectReasonCode.EJECT_USER, outGW) } @@ -70,7 +92,15 @@ trait EjectUserFromMeetingSysMsgHdlr { val ejectedBy = msg.body.ejectedBy val reason = "user ejected by a component on system" - UsersApp.ejectUserFromMeeting(outGW, liveMeeting, userId, ejectedBy, reason, EjectReasonCode.SYSTEM_EJECT_USER) + UsersApp.ejectUserFromMeeting( + outGW, + liveMeeting, + userId, + ejectedBy, + reason, + EjectReasonCode.SYSTEM_EJECT_USER, + ban = false + ) // send a system message to force disconnection Sender.sendDisconnectClientSysMsg(meetingId, userId, ejectedBy, EjectReasonCode.SYSTEM_EJECT_USER, outGW) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala index cf64e4e22108..b6c06ff6d62a 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala @@ -87,13 +87,14 @@ object UsersApp { } def ejectUserFromMeeting(outGW: OutMsgRouter, liveMeeting: LiveMeeting, - userId: String, ejectedBy: String, reason: String, reasonCode: String): Unit = { + userId: String, ejectedBy: String, reason: String, + reasonCode: String, ban: Boolean): Unit = { val meetingId = liveMeeting.props.meetingProp.intId for { user <- Users2x.ejectFromMeeting(liveMeeting.users2x, userId) - reguser <- RegisteredUsers.eject(userId, liveMeeting.registeredUsers, ejectedBy) + reguser <- RegisteredUsers.eject(userId, liveMeeting.registeredUsers, ban) } yield { sendUserEjectedMessageToClient(outGW, meetingId, userId, ejectedBy, reason, reasonCode) sendUserLeftMeetingToAllClients(outGW, meetingId, userId) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ValidateAuthTokenReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ValidateAuthTokenReqMsgHdlr.scala index bae7853a5b5f..69614b883526 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ValidateAuthTokenReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ValidateAuthTokenReqMsgHdlr.scala @@ -25,13 +25,13 @@ trait ValidateAuthTokenReqMsgHdlr extends HandlerHelpers { regUser match { case Some(u) => - // Check if ejected user is rejoining. + // Check if banned user is rejoining. // Fail validation if ejected user is rejoining. // ralam april 21, 2020 - if (u.guestStatus == GuestStatus.ALLOW && !u.ejected) { + if (u.guestStatus == GuestStatus.ALLOW && !u.banned) { userValidated(u, state) } else { - if (u.ejected) { + if (u.banned) { failReason = "Ejected user rejoining" failReasonCode = EjectReasonCode.EJECTED_USER_REJOINING } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala index 052b4e859580..17e7f429ce62 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala @@ -62,12 +62,12 @@ object RegisteredUsers { findWithExternUserId(user.externId, users) match { case Some(u) => - if (u.ejected) { - // Ejected user is rejoining. Don't add so that validate token + if (u.banned) { + // Banned user is rejoining. Don't add so that validate token // will fail and can't join. // ralam april 21, 2020 - val ejectedUser = user.copy(ejected = true) - users.save(ejectedUser) + val bannedUser = user.copy(banned = true) + users.save(bannedUser) } else { // If user hasn't been ejected, we allow user to join // as the user might be joining using 2 browsers for @@ -81,16 +81,16 @@ object RegisteredUsers { } - private def banUser(ejectedUser: RegisteredUser, users: RegisteredUsers, ejectedByUser: RegisteredUser): RegisteredUser = { + private def banOrEjectUser(ejectedUser: RegisteredUser, users: RegisteredUsers, ban: Boolean): RegisteredUser = { // Some users join with multiple browser to manage the meeting. // Don't black list a user ejecting oneself. // ralam april 23, 2020 - if (ejectedUser.externId != ejectedByUser.externId) { + if (ban) { // Set a flag that user has been ejected. We flag the user instead of // removing so we can eject when user tries to rejoin with the same // external userid. // ralam april 21, 2020 - val u = ejectedUser.modify(_.ejected).setTo(true) + val u = ejectedUser.modify(_.banned).setTo(true) users.save(u) u } else { @@ -98,12 +98,11 @@ object RegisteredUsers { ejectedUser } } - def eject(id: String, users: RegisteredUsers, ejectedBy: String): Option[RegisteredUser] = { + def eject(id: String, users: RegisteredUsers, ban: Boolean): Option[RegisteredUser] = { for { ru <- findWithUserId(id, users) - eu <- findWithUserId(ejectedBy, users) } yield { - banUser(ru, users, eu) + banOrEjectUser(ru, users, ban) } } @@ -166,6 +165,6 @@ case class RegisteredUser( registeredOn: Long, joined: Boolean, markAsJoinTimedOut: Boolean, - ejected: Boolean + banned: Boolean ) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala index e14e30a7e0c4..b5b2fb22df50 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala @@ -740,7 +740,16 @@ class MeetingActor( users foreach { u => val respondedOnTime = (lastUserInactivityInspectSentOn - expiryTracker.userInactivityThresholdInMs) < u.lastActivityTime && (lastUserInactivityInspectSentOn + expiryTracker.userActivitySignResponseDelayInMs) > u.lastActivityTime if (!respondedOnTime) { - UsersApp.ejectUserFromMeeting(outGW, liveMeeting, u.intId, SystemUser.ID, "User inactive for too long.", EjectReasonCode.USER_INACTIVITY) + UsersApp.ejectUserFromMeeting( + outGW, + liveMeeting, + u.intId, + SystemUser.ID, + "User inactive for too long.", + EjectReasonCode.USER_INACTIVITY, + ban = false + ) + Sender.sendDisconnectClientSysMsg(liveMeeting.props.meetingProp.intId, u.intId, SystemUser.ID, EjectReasonCode.USER_INACTIVITY, outGW) } } From aeb6cdd30f72a0802232848375746eaa525b12f2 Mon Sep 17 00:00:00 2001 From: Fred Dixon Date: Tue, 19 May 2020 17:56:03 -0400 Subject: [PATCH 45/65] Update bigbluebutton-release Bump to 2.2.12 --- bigbluebutton-config/bigbluebutton-release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-config/bigbluebutton-release b/bigbluebutton-config/bigbluebutton-release index 675cad0e0bf8..4351466c0410 100644 --- a/bigbluebutton-config/bigbluebutton-release +++ b/bigbluebutton-config/bigbluebutton-release @@ -1,2 +1,2 @@ -BIGBLUEBUTTON_RELEASE=2.2.11 +BIGBLUEBUTTON_RELEASE=2.2.12 From 73085ee88cf93b6befeadfc9ad490255b6b25de2 Mon Sep 17 00:00:00 2001 From: Pedro Beschorner Marin Date: Wed, 20 May 2020 09:34:53 -0300 Subject: [PATCH 46/65] Avoid guest promotion --- .../ui/components/user-list/user-list-content/container.jsx | 1 + .../user-list-item/user-dropdown/component.jsx | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx index 380959918428..20baca6303e4 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx @@ -15,6 +15,7 @@ export default withTracker(() => ({ fields: { userId: 1, role: 1, + guest: 1, locked: 1, presenter: 1, }, diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx index 5ced7fb6f2a3..3e00f15882aa 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx @@ -365,7 +365,7 @@ class UserDropdown extends PureComponent { )); } - if (allowedToPromote && isMeteorConnected) { + if (allowedToPromote && !user.guest && isMeteorConnected) { actions.push(this.makeDropdownItem( 'promote', intl.formatMessage(messages.PromoteUserLabel), @@ -374,7 +374,7 @@ class UserDropdown extends PureComponent { )); } - if (allowedToDemote && isMeteorConnected) { + if (allowedToDemote && !user.guest && isMeteorConnected) { actions.push(this.makeDropdownItem( 'demote', intl.formatMessage(messages.DemoteUserLabel), From 13cf0799a1e93605f4be0fb5e5d6424a0b1fad64 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Wed, 20 May 2020 13:47:04 +0000 Subject: [PATCH 47/65] fix shortcuts passed as userData not activating --- .../ui/components/shortcut-help/component.jsx | 23 +++++++++---------- .../private/config/settings.yml | 3 --- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/shortcut-help/component.jsx b/bigbluebutton-html5/imports/ui/components/shortcut-help/component.jsx index e5f563245bbf..97a88ccd05d7 100644 --- a/bigbluebutton-html5/imports/ui/components/shortcut-help/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/shortcut-help/component.jsx @@ -32,43 +32,43 @@ const intlMessages = defineMessages({ id: 'app.shortcut-help.functionLabel', description: 'heading for shortcut function column', }, - openOptions: { + openoptions: { id: 'app.shortcut-help.openOptions', description: 'describes the open options shortcut', }, - toggleUserList: { + toggleuserlist: { id: 'app.shortcut-help.toggleUserList', description: 'describes the toggle userlist shortcut', }, - toggleMute: { + togglemute: { id: 'app.shortcut-help.toggleMute', description: 'describes the toggle mute shortcut', }, - togglePublicChat: { + togglepublicchat: { id: 'app.shortcut-help.togglePublicChat', description: 'describes the toggle public chat shortcut', }, - hidePrivateChat: { + hideprivatechat: { id: 'app.shortcut-help.hidePrivateChat', description: 'describes the hide public chat shortcut', }, - closePrivateChat: { + closeprivatechat: { id: 'app.shortcut-help.closePrivateChat', description: 'describes the close private chat shortcut', }, - openActions: { + openactions: { id: 'app.shortcut-help.openActions', description: 'describes the open actions shortcut', }, - openStatus: { + openstatus: { id: 'app.shortcut-help.openStatus', description: 'describes the open status shortcut', }, - joinAudio: { + joinaudio: { id: 'app.audio.joinAudio', description: 'describes the join audio shortcut', }, - leaveAudio: { + leaveaudio: { id: 'app.audio.leaveAudio', description: 'describes the leave audio shortcut', }, @@ -122,11 +122,10 @@ const ShortcutHelpComponent = (props) => { const shortcutItems = shortcuts.map((shortcut) => { if (!CHAT_ENABLED && shortcut.descId.indexOf('Chat') !== -1) return null; - return ( {`${accessMod} + ${shortcut.accesskey}`} - {intl.formatMessage(intlMessages[`${shortcut.descId}`])} + {`${intl.formatMessage(intlMessages[`${shortcut.descId.toLowerCase()}`])}`} ); }); diff --git a/bigbluebutton-html5/private/config/settings.yml b/bigbluebutton-html5/private/config/settings.yml index b40d1296e378..367fbbf76b23 100755 --- a/bigbluebutton-html5/private/config/settings.yml +++ b/bigbluebutton-html5/private/config/settings.yml @@ -68,9 +68,6 @@ public: openActions: accesskey: A descId: openActions - openStatus: - accesskey: S - descId: openStatus branding: displayBrandingArea: false connectionTimeout: 60000 From 201fa2902e5ffd7093580103ac380bec35c3108e Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Wed, 20 May 2020 15:54:08 -0400 Subject: [PATCH 48/65] Only provide modOnlyMessage to moderators. Promoted mod requires refresh to see it --- .../imports/api/meetings/server/publishers.js | 1 + .../imports/ui/components/chat/container.jsx | 6 ++++-- .../imports/ui/components/join-handler/component.jsx | 10 +++++++++- .../imports/ui/components/user-list/service.js | 2 ++ .../bigbluebutton/web/controllers/ApiController.groovy | 2 +- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/bigbluebutton-html5/imports/api/meetings/server/publishers.js b/bigbluebutton-html5/imports/api/meetings/server/publishers.js index 997c79b66b4b..daef36455cc5 100755 --- a/bigbluebutton-html5/imports/api/meetings/server/publishers.js +++ b/bigbluebutton-html5/imports/api/meetings/server/publishers.js @@ -33,6 +33,7 @@ function meetings(isModerator = false) { const options = { fields: { password: false, + 'welcomeProp.modOnlyMessage': false, }, }; diff --git a/bigbluebutton-html5/imports/ui/components/chat/container.jsx b/bigbluebutton-html5/imports/ui/components/chat/container.jsx index 01f35774cb1b..8528af4ef400 100755 --- a/bigbluebutton-html5/imports/ui/components/chat/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/chat/container.jsx @@ -5,6 +5,7 @@ import { Session } from 'meteor/session'; import Auth from '/imports/ui/services/auth'; import Chat from './component'; import ChatService from './service'; +import Storage from '/imports/ui/services/storage/session'; const CHAT_CONFIG = Meteor.settings.public.chat; const PUBLIC_CHAT_KEY = CHAT_CONFIG.public_id; @@ -88,12 +89,13 @@ export default injectIntl(withTracker(({ intl }) => { const moderatorTime = time + 1; const moderatorId = `moderator-msg-${moderatorTime}`; + const modOnlyMessage = Storage.getItem('ModeratorOnlyMessage'); const moderatorMsg = { id: moderatorId, content: [{ id: moderatorId, - text: welcomeProp.modOnlyMessage, + text: modOnlyMessage, time: moderatorTime, }], time: moderatorTime, @@ -109,7 +111,7 @@ export default injectIntl(withTracker(({ intl }) => { const messagesFormated = messagesBeforeWelcomeMsg .concat(welcomeMsg) - .concat(amIModerator ? moderatorMsg : []) + .concat((amIModerator && modOnlyMessage) ? moderatorMsg : []) .concat(messagesAfterWelcomeMsg); messages = messagesFormated.sort((a, b) => (a.time - b.time)); diff --git a/bigbluebutton-html5/imports/ui/components/join-handler/component.jsx b/bigbluebutton-html5/imports/ui/components/join-handler/component.jsx index f3abba65a00f..b5de6d3bc85a 100755 --- a/bigbluebutton-html5/imports/ui/components/join-handler/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/join-handler/component.jsx @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import { Session } from 'meteor/session'; import PropTypes from 'prop-types'; import Auth from '/imports/ui/services/auth'; -import { setCustomLogoUrl } from '/imports/ui/components/user-list/service'; +import { setCustomLogoUrl, setModeratorOnlyMessage } from '/imports/ui/components/user-list/service'; import { makeCall } from '/imports/ui/services/api'; import logger from '/imports/startup/client/logger'; import LoadingScreen from '/imports/ui/components/loading-screen/component'; @@ -140,6 +140,13 @@ class JoinHandler extends Component { return resp; }; + const setModOnlyMessage = (resp) => { + if (resp && resp.modOnlyMessage) { + setModeratorOnlyMessage(resp.modOnlyMessage); + } + return resp; + }; + const setCustomData = (resp) => { const { customdata } = resp; @@ -169,6 +176,7 @@ class JoinHandler extends Component { setBannerProps(response); setLogoURL(response); + setModOnlyMessage(response); logUserInfo(); Tracker.autorun(async (cd) => { diff --git a/bigbluebutton-html5/imports/ui/components/user-list/service.js b/bigbluebutton-html5/imports/ui/components/user-list/service.js index c1b082740e4f..dc3be30521bf 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/service.js +++ b/bigbluebutton-html5/imports/ui/components/user-list/service.js @@ -42,6 +42,8 @@ const CUSTOM_LOGO_URL_KEY = 'CustomLogoUrl'; export const setCustomLogoUrl = path => Storage.setItem(CUSTOM_LOGO_URL_KEY, path); +export const setModeratorOnlyMessage = msg => Storage.setItem('ModeratorOnlyMessage', msg); + const getCustomLogoUrl = () => Storage.getItem(CUSTOM_LOGO_URL_KEY); const sortUsersByName = (a, b) => { diff --git a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy index f2eef9036427..c31b826c833e 100755 --- a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy +++ b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy @@ -1505,7 +1505,7 @@ class ApiController { logoutTimer meeting.getLogoutTimer() allowStartStopRecording meeting.getAllowStartStopRecording() welcome us.welcome - if (!StringUtils.isEmpty(meeting.moderatorOnlyMessage)) { + if (!StringUtils.isEmpty(meeting.moderatorOnlyMessage) && us.role.equals(ROLE_MODERATOR)) { modOnlyMessage meeting.moderatorOnlyMessage } if (!StringUtils.isEmpty(meeting.bannerText)) { From 5238d8119316405a8407bbfcdd82fc3ef79a1bc3 Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Wed, 20 May 2020 17:07:36 -0400 Subject: [PATCH 49/65] Simplify the code used for promote-demote subscriptions --- .../api/breakouts/server/publishers.js | 24 +++++++++---------- .../imports/api/meetings/server/publishers.js | 16 ++++++------- .../imports/api/users/server/publishers.js | 18 +++++++------- .../ui/components/subscriptions/component.jsx | 14 +---------- 4 files changed, 27 insertions(+), 45 deletions(-) diff --git a/bigbluebutton-html5/imports/api/breakouts/server/publishers.js b/bigbluebutton-html5/imports/api/breakouts/server/publishers.js index d0040bd87ecc..405414e284aa 100755 --- a/bigbluebutton-html5/imports/api/breakouts/server/publishers.js +++ b/bigbluebutton-html5/imports/api/breakouts/server/publishers.js @@ -6,7 +6,7 @@ import { extractCredentials } from '/imports/api/common/server/helpers'; const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator; -function breakouts(moderator = false) { +function breakouts() { if (!this.userId) { return Breakouts.find({ meetingId: '' }); } @@ -14,18 +14,16 @@ function breakouts(moderator = false) { const { meetingId, requesterUserId } = extractCredentials(this.userId); Logger.debug(`Publishing Breakouts for ${meetingId} ${requesterUserId}`); - if (moderator) { - const User = Users.findOne({ userId: requesterUserId, meetingId }); - if (!!User && User.role === ROLE_MODERATOR) { - const presenterSelector = { - $or: [ - { parentMeetingId: meetingId }, - { breakoutId: meetingId }, - ], - }; - - return Breakouts.find(presenterSelector); - } + const User = Users.findOne({ userId: requesterUserId, meetingId }, { fields: { role: 1 } }); + if (!!User && User.role === ROLE_MODERATOR) { + const presenterSelector = { + $or: [ + { parentMeetingId: meetingId }, + { breakoutId: meetingId }, + ], + }; + + return Breakouts.find(presenterSelector); } const selector = { diff --git a/bigbluebutton-html5/imports/api/meetings/server/publishers.js b/bigbluebutton-html5/imports/api/meetings/server/publishers.js index 997c79b66b4b..6062acd3390a 100755 --- a/bigbluebutton-html5/imports/api/meetings/server/publishers.js +++ b/bigbluebutton-html5/imports/api/meetings/server/publishers.js @@ -6,7 +6,7 @@ import { extractCredentials } from '/imports/api/common/server/helpers'; const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator; -function meetings(isModerator = false) { +function meetings() { if (!this.userId) { return Meetings.find({ meetingId: '' }); } @@ -20,14 +20,12 @@ function meetings(isModerator = false) { ], }; - if (isModerator) { - const User = Users.findOne({ userId: requesterUserId, meetingId }); - if (!!User && User.role === ROLE_MODERATOR) { - selector.$or.push({ - 'meetingProp.isBreakout': true, - 'breakoutProps.parentId': meetingId, - }); - } + const User = Users.findOne({ userId: requesterUserId, meetingId }, { fields: { role: 1 } }); + if (!!User && User.role === ROLE_MODERATOR) { + selector.$or.push({ + 'meetingProp.isBreakout': true, + 'breakoutProps.parentId': meetingId, + }); } const options = { diff --git a/bigbluebutton-html5/imports/api/users/server/publishers.js b/bigbluebutton-html5/imports/api/users/server/publishers.js index 861fb357e16d..d7c029716013 100644 --- a/bigbluebutton-html5/imports/api/users/server/publishers.js +++ b/bigbluebutton-html5/imports/api/users/server/publishers.js @@ -51,7 +51,7 @@ function publishCurrentUser(...args) { Meteor.publish('current-user', publishCurrentUser); -function users(isModerator = false) { +function users() { if (!this.userId) { return Users.find({ meetingId: '' }); } @@ -63,15 +63,13 @@ function users(isModerator = false) { ], }; - if (isModerator) { - const User = Users.findOne({ userId: requesterUserId, meetingId }); - if (!!User && User.role === ROLE_MODERATOR) { - selector.$or.push({ - 'breakoutProps.isBreakoutUser': true, - 'breakoutProps.parentId': meetingId, - connectionStatus: 'online', - }); - } + const User = Users.findOne({ userId: requesterUserId, meetingId }, { fields: { role: 1 } }); + if (!!User && User.role === ROLE_MODERATOR) { + selector.$or.push({ + 'breakoutProps.isBreakoutUser': true, + 'breakoutProps.parentId': meetingId, + connectionStatus: 'online', + }); } const options = { diff --git a/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx b/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx index 62fd2f003acd..cf94c7714115 100755 --- a/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx @@ -3,14 +3,12 @@ import { withTracker } from 'meteor/react-meteor-data'; import Auth from '/imports/ui/services/auth'; import logger from '/imports/startup/client/logger'; import GroupChat from '/imports/api/group-chat'; -import Users from '/imports/api/users'; import Annotations from '/imports/api/annotations'; import AnnotationsTextService from '/imports/ui/components/whiteboard/annotations/text/service'; import AnnotationsLocal from '/imports/ui/components/whiteboard/service'; const CHAT_CONFIG = Meteor.settings.public.chat; -const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator; const CHAT_ENABLED = CHAT_CONFIG.enabled; const PUBLIC_GROUP_CHAT_ID = CHAT_CONFIG.public_group_id; const PUBLIC_CHAT_TYPE = CHAT_CONFIG.type_public; @@ -20,7 +18,7 @@ const SUBSCRIPTIONS = [ 'voiceUsers', 'whiteboard-multi-user', 'screenshare', 'group-chat', 'presentation-pods', 'users-settings', 'guestUser', 'users-infos', 'note', 'meeting-time-remaining', 'network-information', 'ping-pong', 'local-settings', 'users-typing', 'record-meetings', 'video-streams', - 'voice-call-states', + 'voice-call-states', 'breakouts', ]; class Subscriptions extends Component { @@ -62,7 +60,6 @@ export default withTracker(() => { return Meteor.subscribe( name, - credentials, subscriptionErrorHandler, ); }); @@ -88,15 +85,6 @@ export default withTracker(() => { subscriptionsHandlers.push(groupChatMessageHandler); } - const User = Users.findOne({ intId: requesterUserId }, { fields: { role: 1 } }); - - if (User) { - const userIsModerator = User.role === ROLE_MODERATOR; - Meteor.subscribe('users', userIsModerator, subscriptionErrorHandler); - Meteor.subscribe('breakouts', userIsModerator, subscriptionErrorHandler); - Meteor.subscribe('meetings', userIsModerator, subscriptionErrorHandler); - } - const annotationsHandler = Meteor.subscribe('annotations', { onReady: () => { const activeTextShapeId = AnnotationsTextService.activeTextShapeId(); From 8eb6235b1eaac748524f657b02815a6be782fd13 Mon Sep 17 00:00:00 2001 From: prlanzarin Date: Thu, 21 May 2020 04:04:36 +0000 Subject: [PATCH 50/65] sip.js/kurento-utils: remove default 3rd party STUN servers Removing 3rd party default STUN servers from those dependencies as to prevent unexpected behaviour --- .../public/compatibility/kurento-utils.js | 14 -------------- bigbluebutton-html5/public/compatibility/sip.js | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/bigbluebutton-html5/public/compatibility/kurento-utils.js b/bigbluebutton-html5/public/compatibility/kurento-utils.js index bc5d67b1391d..b43e2985005c 100755 --- a/bigbluebutton-html5/public/compatibility/kurento-utils.js +++ b/bigbluebutton-html5/public/compatibility/kurento-utils.js @@ -1073,20 +1073,6 @@ var freeice = module.exports = function(opts) { },{"./stun.json":6,"./turn.json":7,"normalice":12}],6:[function(require,module,exports){ module.exports=[ - "stun.l.google.com:19302", - "stun1.l.google.com:19302", - "stun2.l.google.com:19302", - "stun3.l.google.com:19302", - "stun4.l.google.com:19302", - "stun.ekiga.net", - "stun.ideasip.com", - "stun.schlund.de", - "stun.stunprotocol.org:3478", - "stun.voiparound.com", - "stun.voipbuster.com", - "stun.voipstunt.com", - "stun.voxgratia.org", - "stun.services.mozilla.com" ] },{}],7:[function(require,module,exports){ diff --git a/bigbluebutton-html5/public/compatibility/sip.js b/bigbluebutton-html5/public/compatibility/sip.js index 20be1c483812..5a5a1e733bae 100755 --- a/bigbluebutton-html5/public/compatibility/sip.js +++ b/bigbluebutton-html5/public/compatibility/sip.js @@ -9552,7 +9552,7 @@ UA.prototype.loadConfig = function(configuration) { // Session parameters iceCheckingTimeout: 5000, noAnswerTimeout: 60, - stunServers: ['stun:stun.l.google.com:19302'], + stunServers: [], turnServers: [], // Logging parameters From 2cba85e86689e3e3889c59e739905936b2cb22ee Mon Sep 17 00:00:00 2001 From: prlanzarin Date: Thu, 21 May 2020 04:20:46 +0000 Subject: [PATCH 51/65] html5: refactor STUN/TURN fetch, add fallback STUN, fix deadlock in audio join Refactored STUN/TURN fetch to be done only once, when successful, per session and cache it in mem to avoid too many reqs. Current way is a bit dumb, this should increase reliability a bit more. The caching is configurable so folks who want to use very short lived TURN credentials can disable it Add a fallback STUN config option to be used when the default STUN/TURN fetch fails Clean the safari/no candidate generation pre flight check from 3rd party STUNs Fix deadlock in audio join when STUN/TURN fetch failed --- .../api/audio/client/bridge/kurento.js | 3 +- .../imports/api/audio/client/bridge/sip.js | 20 ++++++- .../api/screenshare/client/bridge/kurento.js | 4 +- .../components/video-provider/component.jsx | 10 +++- .../imports/utils/fetchStunTurnServers.js | 55 ++++++++++++++----- .../imports/utils/safari-webrtc.js | 27 ++------- .../private/config/settings.yml | 2 + 7 files changed, 81 insertions(+), 40 deletions(-) diff --git a/bigbluebutton-html5/imports/api/audio/client/bridge/kurento.js b/bigbluebutton-html5/imports/api/audio/client/bridge/kurento.js index 7f1e4aeffda6..3d4625731c6e 100755 --- a/bigbluebutton-html5/imports/api/audio/client/bridge/kurento.js +++ b/bigbluebutton-html5/imports/api/audio/client/bridge/kurento.js @@ -1,6 +1,6 @@ import BaseAudioBridge from './base'; import Auth from '/imports/ui/services/auth'; -import { fetchWebRTCMappedStunTurnServers } from '/imports/utils/fetchStunTurnServers'; +import { fetchWebRTCMappedStunTurnServers, getMappedFallbackStun } from '/imports/utils/fetchStunTurnServers'; import playAndRetry from '/imports/utils/mediaElementPlayRetry'; import logger from '/imports/startup/client/logger'; @@ -64,6 +64,7 @@ export default class KurentoAudioBridge extends BaseAudioBridge { } catch (error) { logger.error({ logCode: 'sfuaudiobridge_stunturn_fetch_failed' }, 'SFU audio bridge failed to fetch STUN/TURN info, using default servers'); + iceServers = getMappedFallbackStun(); } finally { logger.debug({ logCode: 'sfuaudiobridge_stunturn_fetch_sucess', extraInfo: { iceServers } }, 'SFU audio bridge got STUN/TURN servers'); diff --git a/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js b/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js index 6411026f5477..55688ef261e5 100755 --- a/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js +++ b/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js @@ -1,7 +1,7 @@ import browser from 'browser-detect'; import BaseAudioBridge from './base'; import logger from '/imports/startup/client/logger'; -import { fetchStunTurnServers } from '/imports/utils/fetchStunTurnServers'; +import { fetchStunTurnServers, getFallbackStun } from '/imports/utils/fetchStunTurnServers'; import { isUnifiedPlan, toUnifiedPlan, @@ -85,6 +85,22 @@ class SIPSession { }); } + async getIceServers (sessionToken) { + try { + const iceServers = await fetchStunTurnServers(sessionToken); + return iceServers; + } catch (error) { + logger.error({ + logCode: 'sip_js_fetchstunturninfo_error', + extraInfo: { + errorCode: error.code, + errorMessage: error.message, + }, + }, 'Full audio bridge failed to fetch STUN/TURN info'); + return getFallbackStun(); + } + } + doCall(options) { const { isListenOnly, @@ -105,7 +121,7 @@ class SIPSession { this.user.callerIdName = callerIdName; this.callOptions = options; - return fetchStunTurnServers(sessionToken) + return this.getIceServers(sessionToken) .then(this.createUserAgent.bind(this)) .then(this.inviteUserAgent.bind(this)) .then(this.setupEventHandlers.bind(this)); diff --git a/bigbluebutton-html5/imports/api/screenshare/client/bridge/kurento.js b/bigbluebutton-html5/imports/api/screenshare/client/bridge/kurento.js index 3ad3aa1c2511..47a1401d1cce 100755 --- a/bigbluebutton-html5/imports/api/screenshare/client/bridge/kurento.js +++ b/bigbluebutton-html5/imports/api/screenshare/client/bridge/kurento.js @@ -1,6 +1,6 @@ import Auth from '/imports/ui/services/auth'; import BridgeService from './service'; -import { fetchWebRTCMappedStunTurnServers } from '/imports/utils/fetchStunTurnServers'; +import { fetchWebRTCMappedStunTurnServers, getMappedFallbackStun } from '/imports/utils/fetchStunTurnServers'; import playAndRetry from '/imports/utils/mediaElementPlayRetry'; import logger from '/imports/startup/client/logger'; @@ -72,6 +72,7 @@ export default class KurentoScreenshareBridge { } catch (error) { logger.error({ logCode: 'screenshare_viwer_fetchstunturninfo_error', extraInfo: { error } }, 'Screenshare bridge failed to fetch STUN/TURN info, using default'); + iceServers = getMappedFallbackStun(); } finally { const options = { wsUrl: Auth.authenticateURL(SFU_URL), @@ -168,6 +169,7 @@ export default class KurentoScreenshareBridge { } catch (error) { logger.error({ logCode: 'screenshare_presenter_fetchstunturninfo_error' }, 'Screenshare bridge failed to fetch STUN/TURN info, using default'); + iceServers = getMappedFallbackStun(); } finally { const options = { wsUrl: Auth.authenticateURL(SFU_URL), diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/component.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/component.jsx index d2ef0306a02d..79070fa000d2 100755 --- a/bigbluebutton-html5/imports/ui/components/video-provider/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/video-provider/component.jsx @@ -3,7 +3,10 @@ import { defineMessages, injectIntl } from 'react-intl'; import { Session } from 'meteor/session'; import { notify } from '/imports/ui/services/notification'; import VisibilityEvent from '/imports/utils/visibilityEvent'; -import { fetchWebRTCMappedStunTurnServers } from '/imports/utils/fetchStunTurnServers'; +import { + fetchWebRTCMappedStunTurnServers, + getMappedFallbackStun, +} from '/imports/utils/fetchStunTurnServers'; import PropTypes from 'prop-types'; import ReconnectingWebSocket from 'reconnecting-websocket'; import logger from '/imports/startup/client/logger'; @@ -608,9 +611,12 @@ class VideoProvider extends Component { logger.error({ logCode: 'video_provider_fetchstunturninfo_error', extraInfo: { - error, + errorCode: error.code, + errorMessage: error.message, }, }, 'video-provider failed to fetch STUN/TURN info, using default'); + // Use fallback STUN server + iceServers = getMappedFallbackStun(); } finally { const { constraints, bitrate, id: profileId } = VideoProvider.getCameraProfile(); this.outboundIceQueues[id] = []; diff --git a/bigbluebutton-html5/imports/utils/fetchStunTurnServers.js b/bigbluebutton-html5/imports/utils/fetchStunTurnServers.js index ee90b03d2179..4400364e503f 100644 --- a/bigbluebutton-html5/imports/utils/fetchStunTurnServers.js +++ b/bigbluebutton-html5/imports/utils/fetchStunTurnServers.js @@ -2,11 +2,18 @@ import _ from 'lodash'; const MEDIA = Meteor.settings.public.media; const STUN_TURN_FETCH_URL = MEDIA.stunTurnServersFetchAddress; +const CACHE_STUN_TURN = MEDIA.cacheStunTurnServers; +const FALLBACK_STUN_SERVER = MEDIA.fallbackStunServer; + +let STUN_TURN_DICT; +let MAPPED_STUN_TURN_DICT; const fetchStunTurnServers = function (sessionToken) { + if (STUN_TURN_DICT && CACHE_STUN_TURN) return Promise.resolve(STUN_TURN_DICT); + const handleStunTurnResponse = ({ stunServers, turnServers }) => { if (!stunServers && !turnServers) { - return { error: 404, stun: [], turn: [] }; + return Promise.reject(new Error('Could not fetch STUN/TURN servers')); } const turnReply = []; @@ -19,35 +26,57 @@ const fetchStunTurnServers = function (sessionToken) { }); }); - return { + const stDictionary = { stun: stunServers.map(server => server.url), turn: turnReply, }; + + STUN_TURN_DICT = stDictionary; + + return Promise.resolve(stDictionary); }; const url = `${STUN_TURN_FETCH_URL}?sessionToken=${sessionToken}`; return fetch(url, { credentials: 'same-origin' }) .then(res => res.json()) .then(handleStunTurnResponse) - .then((response) => { - if (response.error) { - return Promise.reject('Could not fetch the stuns/turns servers!'); - } - return response; - }); }; +const mapStunTurn = ({ stun, turn }) => { + const rtcStuns = stun.map(url => ({ urls: url })); + const rtcTurns = turn.map(t => ({ urls: t.urls, credential: t.password, username: t.username })); + return rtcStuns.concat(rtcTurns); +}; + +const getFallbackStun = () => { + const stun = FALLBACK_STUN_SERVER ? [FALLBACK_STUN_SERVER] : [] + return { stun, turn: [] }; +} + +const getMappedFallbackStun = () => { + return FALLBACK_STUN_SERVER ? [{ urls: FALLBACK_STUN_SERVER }] : []; +} + const fetchWebRTCMappedStunTurnServers = function (sessionToken) { return new Promise(async (resolve, reject) => { try { - const { stun, turn } = await fetchStunTurnServers(sessionToken); - const rtcStuns = stun.map(url => ({ urls: url })); - const rtcTurns = turn.map(t => ({ urls: t.urls, credential: t.password, username: t.username })); - return resolve(rtcStuns.concat(rtcTurns)); + if (MAPPED_STUN_TURN_DICT && CACHE_STUN_TURN) { + return resolve(MAPPED_STUN_TURN_DICT); + } + + const stDictionary = await fetchStunTurnServers(sessionToken); + + MAPPED_STUN_TURN_DICT = mapStunTurn(stDictionary); + return resolve(MAPPED_STUN_TURN_DICT); } catch (error) { return reject(error); } }); }; -export { fetchStunTurnServers, fetchWebRTCMappedStunTurnServers }; +export { + fetchStunTurnServers, + fetchWebRTCMappedStunTurnServers, + getFallbackStun, + getMappedFallbackStun, +}; diff --git a/bigbluebutton-html5/imports/utils/safari-webrtc.js b/bigbluebutton-html5/imports/utils/safari-webrtc.js index f1101cc146a0..01d1149f7c1c 100644 --- a/bigbluebutton-html5/imports/utils/safari-webrtc.js +++ b/bigbluebutton-html5/imports/utils/safari-webrtc.js @@ -1,34 +1,19 @@ -import { fetchWebRTCMappedStunTurnServers } from '/imports/utils/fetchStunTurnServers'; +import { + fetchWebRTCMappedStunTurnServers, + getMappedFallbackStun, +} from '/imports/utils/fetchStunTurnServers'; import Auth from '/imports/ui/services/auth'; import { Session } from 'meteor/session'; import logger from '/imports/startup/client/logger'; -const defaultIceServersList = [ - { urls: 'stun:stun.l.google.com:19302' }, - { urls: 'stun:stun1.l.google.com:19302' }, - { urls: 'stun:stun2.l.google.com:19302' }, - { urls: 'stun:stun3.l.google.com:19302' }, - { urls: 'stun:stun4.l.google.com:19302' }, - { urls: 'stun:stun.ekiga.net' }, - { urls: 'stun:stun.ideasip.com' }, - { urls: 'stun:stun.schlund.de' }, - { urls: 'stun:stun.stunprotocol.org:3478' }, - { urls: 'stun:stun.voiparound.com' }, - { urls: 'stun:stun.voipbuster.com' }, - { urls: 'stun:stun.voipstunt.com' }, - { urls: 'stun:stun.voxgratia.org' }, - { urls: 'stun:stun.services.mozilla.com' }, -]; - const getSessionToken = () => Auth.sessionToken; export async function getIceServersList() { try { const iceServers = await fetchWebRTCMappedStunTurnServers(getSessionToken()); - - return iceServers || defaultIceServersList; + return iceServers; } catch (error) { - return defaultIceServersList; + return getMappedFallbackStun(); } } diff --git a/bigbluebutton-html5/private/config/settings.yml b/bigbluebutton-html5/private/config/settings.yml index b40d1296e378..3959c8777cc7 100755 --- a/bigbluebutton-html5/private/config/settings.yml +++ b/bigbluebutton-html5/private/config/settings.yml @@ -170,6 +170,8 @@ public: hidePresentation: false media: stunTurnServersFetchAddress: "/bigbluebutton/api/stuns" + cacheStunTurnServers: true + fallbackStunServer: '' mediaTag: "#remote-media" callTransferTimeout: 5000 callHangupTimeout: 2000 From 6943fef65cc0ea76ab4506f4f3ab95dd448184c2 Mon Sep 17 00:00:00 2001 From: Richard Alam Date: Thu, 21 May 2020 05:01:21 -0700 Subject: [PATCH 52/65] Format conference num - separate conf num with space instead of dash Initial work on more flexible formatting is being done in https://github.com/ritzalam/bigbluebutton/tree/format-voice-conf-number This just addresses complaints on mailing list that separating using '-' is confusing. --- .../api/ParamsProcessorUtil.java | 38 +++++++------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java index a6953c0dea2f..fa5b0fbb7397 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java @@ -24,14 +24,9 @@ import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.SortedSet; -import java.util.TreeSet; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -123,23 +118,16 @@ public class ParamsProcessorUtil { private Boolean defaultAllowDuplicateExtUserid = true; private String formatConfNum(String s) { - if (s.length() == 5) { - StringBuilder confNumDash = new StringBuilder(s); - confNumDash.insert(2, '-'); - return confNumDash.toString(); - } else if (s.length() == 6 || s.length() == 7) { - StringBuilder confNumDash = new StringBuilder(s); - confNumDash.insert(3, '-'); - return confNumDash.toString(); - } else if (s.length() == 8) { - StringBuilder confNumDash = new StringBuilder(s); - confNumDash.insert(4, '-'); - return confNumDash.toString(); - } else if (s.length() == 9) { - StringBuilder confNumDash = new StringBuilder(s); - confNumDash.insert(3, '-'); - confNumDash.insert(7, '-'); - return confNumDash.toString(); + if (s.length() > 5) { + Long confNumL = Long.parseLong(s); + + Locale numFormatLocale = new Locale("en", "US"); + String formatPattern = "#,###"; + DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(numFormatLocale); + unusualSymbols.setGroupingSeparator(' '); + DecimalFormat numFormatter = new DecimalFormat(formatPattern, unusualSymbols); + numFormatter.setGroupingSize(3); + return numFormatter.format(confNumL); } return s; From 8fc32bc7dcc70338d3027b16fd1cafb17c19b6c0 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Thu, 21 May 2020 18:26:47 +0000 Subject: [PATCH 53/65] update message in media container --- .../imports/ui/components/media/container.jsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/media/container.jsx b/bigbluebutton-html5/imports/ui/components/media/container.jsx index 723e1b2be6df..80908e85c4cd 100755 --- a/bigbluebutton-html5/imports/ui/components/media/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/media/container.jsx @@ -33,9 +33,9 @@ const intlMessages = defineMessages({ id: 'app.media.screenshare.end', description: 'toast to show when a screenshare has ended', }, - screenshareSafariNotSupportedError: { - id: 'app.media.screenshare.safariNotSupported', - description: 'Error message for screenshare not supported on Safari', + screenshareNotSupported: { + id: 'app.media.screenshare.notSupported', + description: 'Error message for screenshare not supported', }, chromeExtensionError: { id: 'app.video.chromeExtensionError', @@ -50,7 +50,7 @@ const intlMessages = defineMessages({ class MediaContainer extends Component { componentWillMount() { document.addEventListener('installChromeExtension', this.installChromeExtension.bind(this)); - document.addEventListener('safariScreenshareNotSupported', this.safariScreenshareNotSupported.bind(this)); + document.addEventListener('screenshareNotSupported', this.screenshareNotSupported.bind(this)); } componentWillReceiveProps(nextProps) { @@ -70,7 +70,7 @@ class MediaContainer extends Component { componentWillUnmount() { document.removeEventListener('installChromeExtension', this.installChromeExtension.bind(this)); - document.removeEventListener('safariScreenshareNotSupported', this.safariScreenshareNotSupported.bind(this)); + document.removeEventListener('screenshareNotSupported', this.screenshareNotSupported.bind(this)); } installChromeExtension() { @@ -92,9 +92,9 @@ class MediaContainer extends Component { notify(chromeErrorElement, 'error', 'desktop'); } - safariScreenshareNotSupported() { + screenshareNotSupported() { const { intl } = this.props; - notify(intl.formatMessage(intlMessages.screenshareSafariNotSupportedError), 'error', 'desktop'); + notify(intl.formatMessage(intlMessages.screenshareNotSupported), 'error', 'desktop'); } render() { From 51c3543826ac67a74181994d82e369ca5a24d977 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Thu, 21 May 2020 18:43:34 +0000 Subject: [PATCH 54/65] fix shortcuts not working when helper is passed an array --- .../imports/ui/components/audio/audio-controls/component.jsx | 4 ++-- .../imports/ui/components/shortcut-help/service.jsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/component.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/component.jsx index 90be874a036a..abf8323c274f 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/component.jsx @@ -92,7 +92,7 @@ class AudioControls extends PureComponent { icon={muted ? 'mute' : 'unmute'} size="lg" circle - accessKey={shortcuts.toggleMute} + accessKey={shortcuts.togglemute} /> ) : null}
- {intl.formatMessage(messages.removeConfirmDesc)} +
+
+
+ + ); + } +} + +RemoveUserModal.propTypes = propTypes; +export default withModalMounter(RemoveUserModal); diff --git a/bigbluebutton-html5/imports/ui/components/modal/remove-user/styles.scss b/bigbluebutton-html5/imports/ui/components/modal/remove-user/styles.scss new file mode 100644 index 000000000000..04bd76c015b2 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/modal/remove-user/styles.scss @@ -0,0 +1,61 @@ +@import "/imports/ui/components/user-list/styles.scss"; +@import "/imports/ui/stylesheets/variables/_all"; +@import '/imports/ui/stylesheets/mixins/_indicators'; +@import '/imports/ui/stylesheets/mixins/focus'; +@import "/imports/ui/components/modal/simple/styles"; + +.title { + color: var(--color-gray-dark); + font-weight: var(--headings-font-weight); + font-size: var(--jumbo-padding-y); + } + + .container { + display: flex; + align-items: center; + flex-direction: column; + padding: 0; + margin-top: 0; + margin-right: var(--description-margin); + margin-left: var(--description-margin); + margin-bottom: var(--lg-padding-x); + } + + .footer { + display:flex; + } + + .button { + padding-right: var(--jumbo-padding-y); + padding-left: var(--jumbo-padding-y); + margin: 0 var(--sm-padding-x) 0 0; + + [dir="rtl"] & { + margin: 0 0 0 var(--sm-padding-x); + } + } + + .description { + text-align: center; + line-height: var(--line-height-base); + color: var(--color-gray); + margin-bottom: var(--jumbo-padding-y) + } + + .modal { + @extend .modal; + padding: var(--sm-padding-y); + } + + .overlay { + @extend .overlay; + } + + .header { + margin: 0; + padding: 0; + border: none; + line-height: var(--title-position-left); + margin-bottom: var(--lg-padding-y); + } + \ No newline at end of file diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx index 3cb80aacc679..590771678aa6 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx @@ -12,9 +12,7 @@ import DropdownListItem from '/imports/ui/components/dropdown/list/item/componen import DropdownListSeparator from '/imports/ui/components/dropdown/list/separator/component'; import lockContextContainer from '/imports/ui/components/lock-viewers/context/container'; import { withModalMounter } from '/imports/ui/components/modal/service'; -import Modal from '/imports/ui/components/modal/simple/component'; -import Button from '/imports/ui/components/button/component'; - +import RemoveUserModal from '/imports/ui/components/modal/remove-user/component'; import _ from 'lodash'; import { Session } from 'meteor/session'; import { styles } from './styles'; @@ -416,52 +414,11 @@ class UserDropdown extends PureComponent { 'remove', intl.formatMessage(messages.RemoveUserLabel, { 0: user.name }), () => this.onActionsHide(mountModal( - mountModal(null)} - hideBorder - contentLabel={intl.formatMessage(messages.removeConfirmTitle, { 0: user.name })} - > -
-
-
- {intl.formatMessage(messages.removeConfirmTitle, { 0: user.name })} -
-
-
- -
- -
-
-
-
, + , )), 'circle_close', )); diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss index d4d9562c118c..50e88bcdfa77 100755 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/styles.scss @@ -143,58 +143,3 @@ color: var(--color-primary); } } - -.title { - color: var(--color-gray-dark); - font-weight: var(--headings-font-weight); - font-size: var(--jumbo-padding-y); -} - -.container { - display: flex; - align-items: center; - flex-direction: column; - padding: 0; - margin-top: 0; - margin-right: var(--description-margin); - margin-left: var(--description-margin); - margin-bottom: var(--lg-padding-x); -} - -.footer { - display:flex; -} - -.button { - padding-right: var(--jumbo-padding-y); - padding-left: var(--jumbo-padding-y); - margin: 0 var(--sm-padding-x) 0 0; - - [dir="rtl"] & { - margin: 0 0 0 var(--sm-padding-x); - } -} - -.description { - text-align: center; - line-height: var(--line-height-base); - color: var(--color-gray); - margin-bottom: var(--jumbo-padding-y) -} - -.modal { - @extend .modal; - padding: var(--sm-padding-y); -} - -.overlay { - @extend .overlay; -} - -.header { - margin: 0; - padding: 0; - border: none; - line-height: var(--title-position-left); - margin-bottom: var(--lg-padding-y); -} \ No newline at end of file From afe995393eb28b8001304396d46f900c522d133f Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Fri, 22 May 2020 14:41:11 +0000 Subject: [PATCH 60/65] remove className --- .../imports/ui/components/modal/remove-user/component.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-html5/imports/ui/components/modal/remove-user/component.jsx b/bigbluebutton-html5/imports/ui/components/modal/remove-user/component.jsx index 3d973cc1297b..f2dfdf3f799f 100644 --- a/bigbluebutton-html5/imports/ui/components/modal/remove-user/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/modal/remove-user/component.jsx @@ -62,7 +62,7 @@ class RemoveUserModal extends Component {
-