diff --git a/bigbluebutton-config/bin/bbb-conf b/bigbluebutton-config/bin/bbb-conf
index d4ce42551abdbc2fcde1cc573943ee5705fcb805..123ae2437da538a78f5cebe82eeb8f82957fa480 100755
--- a/bigbluebutton-config/bin/bbb-conf
+++ b/bigbluebutton-config/bin/bbb-conf
@@ -92,14 +92,14 @@ source /etc/bigbluebutton/bigbluebutton-release
 
 if [ -f /etc/centos-release ]; then
     DISTRIB_ID=centos
-    TOMCAT_SERVICE=tomcat
-    TOMCAT_DIR=/var/lib/$TOMCAT_SERVICE
+    TOMCAT_USER=tomcat
+    TOMCAT_DIR=/var/lib/$TOMCAT_USER
     SERVLET_LOGS=/usr/share/tomcat/logs
     REDIS_SERVICE=redis.service
 else
     . /etc/lsb-release    # Get value for DISTRIB_ID
-    TOMCAT_SERVICE=tomcat7
-    TOMCAT_DIR=/var/lib/$TOMCAT_SERVICE
+    TOMCAT_USER=tomcat7
+    TOMCAT_DIR=/var/lib/$TOMCAT_USER
     SERVLET_LOGS=$TOMCAT_DIR/logs
     REDIS_SERVICE=redis-server
 fi
@@ -328,7 +328,15 @@ stop_bigbluebutton () {
         BBB_WEB=bbb-web
     fi
 
-    systemctl stop red5 $TOMCAT_SERVICE nginx freeswitch $REDIS_SERVICE bbb-apps-akka $BBB_TRANSCODE_AKKA bbb-fsesl-akka bbb-rap-archive-worker.service bbb-rap-process-worker.service bbb-rap-publish-worker.service bbb-rap-sanity-worker.service bbb-record-core.timer $HTML5 $WEBHOOKS $ETHERPAD $BBB_WEB
+    if [ -d $TOMCAT_DIR ]; then
+      TOMCAT_SERVICE=$TOMCAT_USER
+    fi
+
+    if [ -d $RED5_DIR ]; then
+      BBB_APPS_AKKA_SERVICE=bbb-apps-akka
+    fi
+
+    systemctl stop red5 $TOMCAT_SERVICE $BBB_APPS_AKKA_SERVICE nginx freeswitch $REDIS_SERVICE bbb-apps-akka $BBB_TRANSCODE_AKKA bbb-fsesl-akka bbb-rap-archive-worker.service bbb-rap-process-worker.service bbb-rap-publish-worker.service bbb-rap-sanity-worker.service bbb-record-core.timer $HTML5 $WEBHOOKS $ETHERPAD $BBB_WEB
 }
 
 start_bigbluebutton () {
@@ -431,7 +439,7 @@ display_bigbluebutton_status () {
     units="red5 nginx freeswitch $REDIS_SERVICE bbb-apps-akka bbb-transcode-akka bbb-fsesl-akka"
  
     if [ -d $TOMCAT_DIR ]; then
-      units="$units $TOMCAT_SERVICE"
+      units="$units $TOMCAT_USER"
     fi
 
     if [ -f /usr/lib/systemd/system/bbb-html5.service ]; then
@@ -936,14 +944,14 @@ check_state() {
 
     if ! netstat -ant | grep '8090' > /dev/null; then
         print_header
-        NOT_RUNNING_APPS="${NOT_RUNNING_APPS} ${TOMCAT_SERVICE} or grails"
+        NOT_RUNNING_APPS="${NOT_RUNNING_APPS} ${TOMCAT_USER} or grails"
     else
         if ps aux |  ps -aef | grep -v grep | grep grails | grep run-app > /dev/null; then
         print_header
         RUNNING_APPS="${RUNNING_APPS} Grails"
-        echo "#   ${TOMCAT_SERVICE}:      noticed you are running grails run-app instead of ${TOMCAT_SERVICE}"
+        echo "#   ${TOMCAT_USER}:      noticed you are running grails run-app instead of ${TOMCAT_USER}"
         else
-            RUNNING_APPS="${RUNNING_APPS} ${TOMCAT_SERVICE}"
+            RUNNING_APPS="${RUNNING_APPS} ${TOMCAT_USER}"
         fi
     fi
 
diff --git a/bigbluebutton-html5/imports/api/annotations/server/methods/sendAnnotation.js b/bigbluebutton-html5/imports/api/annotations/server/methods/sendAnnotation.js
index 656f28b48721ae0a403ba5302ce9a9b45b37202d..9700c6415f4b876ba8afcd5fae72f8d8d0e0213d 100755
--- a/bigbluebutton-html5/imports/api/annotations/server/methods/sendAnnotation.js
+++ b/bigbluebutton-html5/imports/api/annotations/server/methods/sendAnnotation.js
@@ -44,14 +44,59 @@ export default function sendAnnotation(credentials, annotation) {
   // and then slide/presentation changes, the user lost presenter rights,
   // or multi-user whiteboard gets turned off
   // So we allow the last "DRAW_END" message to pass through, to finish the shape.
-  const allowed = isPodPresenter(meetingId, whiteboardId, requesterUserId) ||
-    getMultiUserStatus(meetingId, whiteboardId) ||
-    isLastMessage(meetingId, annotation, requesterUserId);
+  const allowed = isPodPresenter(meetingId, whiteboardId, requesterUserId)
+    || getMultiUserStatus(meetingId, whiteboardId)
+    || isLastMessage(meetingId, annotation, requesterUserId);
 
   if (!allowed) {
     throw new Meteor.Error('not-allowed', `User ${requesterUserId} is not allowed to send an annotation`);
   }
 
+  if (annotation.annotationType === 'text') {
+    check(annotation, {
+      id: String,
+      status: String,
+      annotationType: String,
+      annotationInfo: {
+        x: Number,
+        y: Number,
+        fontColor: Number,
+        calcedFontSize: Number,
+        textBoxWidth: Number,
+        text: String,
+        textBoxHeight: Number,
+        id: String,
+        whiteboardId: String,
+        status: String,
+        fontSize: Number,
+        dataPoints: String,
+        type: String,
+      },
+      wbId: String,
+      userId: String,
+      position: Number,
+    });
+  } else {
+    check(annotation, {
+      id: String,
+      status: String,
+      annotationType: String,
+      annotationInfo: {
+        color: Number,
+        thickness: Number,
+        points: Array,
+        id: String,
+        whiteboardId: String,
+        status: String,
+        type: String,
+        dimensions: Match.Maybe([Number]),
+      },
+      wbId: String,
+      userId: String,
+      position: Number,
+    });
+  }
+
   const payload = {
     annotation,
   };
diff --git a/bigbluebutton-html5/imports/api/audio/client/bridge/kurento.js b/bigbluebutton-html5/imports/api/audio/client/bridge/kurento.js
old mode 100644
new mode 100755
index aa91ad5c311f2a585808e0a2dafab6ed6f7683d7..95bd3414cfeb95ddebf9dd657e65a112c4d58f8d
--- a/bigbluebutton-html5/imports/api/audio/client/bridge/kurento.js
+++ b/bigbluebutton-html5/imports/api/audio/client/bridge/kurento.js
@@ -89,7 +89,10 @@ export default class KurentoAudioBridge extends BaseAudioBridge {
         };
 
         const onFail = (error) => {
-          const { reason } = error;
+          let reason = 'Undefined';
+          if (error) {
+            reason = error.reason || error.id || error;
+          }
           this.callback({
             status: this.baseCallStates.failed,
             error: this.baseErrorCodes.CONNECTION_ERROR,
diff --git a/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js b/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js
index 3aa3bd611f359a24c4ba024079e39fa42d0c4ad1..92d6542bd3288c2a52e7377ea3f676ee96a8a507 100755
--- a/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js
+++ b/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js
@@ -2,7 +2,9 @@ import browser from 'browser-detect';
 import BaseAudioBridge from './base';
 import logger from '/imports/startup/client/logger';
 import { fetchStunTurnServers } from '/imports/utils/fetchStunTurnServers';
-import { isUnifiedPlan, toUnifiedPlan, toPlanB} from '/imports/utils/sdpUtils';
+import {
+  isUnifiedPlan, toUnifiedPlan, toPlanB, stripMDnsCandidates,
+} from '/imports/utils/sdpUtils';
 
 const MEDIA = Meteor.settings.public.media;
 const MEDIA_TAG = MEDIA.mediaTag;
@@ -40,6 +42,7 @@ export default class SIPBridge extends BaseAudioBridge {
     window.isUnifiedPlan = isUnifiedPlan;
     window.toUnifiedPlan = toUnifiedPlan;
     window.toPlanB = toPlanB;
+    window.stripMDnsCandidates = stripMDnsCandidates;
   }
 
   static parseDTMF(message) {
@@ -182,7 +185,7 @@ export default class SIPBridge extends BaseAudioBridge {
       // transceivers - prlanzarin 2019/05/21
       const browserUA = window.navigator.userAgent.toLocaleLowerCase();
       const isSafariWebview = ((browserUA.indexOf('iphone') > -1
-        || browserUA.indexOf('ipad') > -1) && browserUA.indexOf('safari') == -1);
+        || browserUA.indexOf('ipad') > -1) && browserUA.indexOf('safari') === -1);
 
       // Second UA check to get all Safari browsers to enable Unified Plan <-> PlanB
       // translation
diff --git a/bigbluebutton-html5/imports/startup/client/base.jsx b/bigbluebutton-html5/imports/startup/client/base.jsx
index 91ac5b3e70876d5213052f50b8358b2b9769cca5..2c8df7178c218843f5d46ec6072bd9f3ea78ff1d 100755
--- a/bigbluebutton-html5/imports/startup/client/base.jsx
+++ b/bigbluebutton-html5/imports/startup/client/base.jsx
@@ -33,7 +33,7 @@ const propTypes = {
 
 const defaultProps = {
   locale: undefined,
-  approved: undefined,
+  approved: false,
   meetingExist: false,
   subscriptionsReady: false,
 };
@@ -227,7 +227,7 @@ const BaseContainer = withTracker(() => {
     if (meetingEnded) Session.set('codeError', '410');
   }
 
-  const approved = Users.findOne({ userId: Auth.userID, approved: true, guest: true });
+  const approved = !!Users.findOne({ userId: Auth.userID, approved: true, guest: true });
   const ejected = Users.findOne({ userId: Auth.userID, ejected: true });
   if (Session.get('codeError')) {
     return {
diff --git a/bigbluebutton-html5/imports/startup/client/intl.jsx b/bigbluebutton-html5/imports/startup/client/intl.jsx
index 41687658139ed1183c04b30b37c38ff2f43d01da..307c3b09bfa63a9f74f9c741da408768ceb6df71 100644
--- a/bigbluebutton-html5/imports/startup/client/intl.jsx
+++ b/bigbluebutton-html5/imports/startup/client/intl.jsx
@@ -17,6 +17,7 @@ import fa from 'react-intl/locale-data/fa';
 import fr from 'react-intl/locale-data/fr';
 import he from 'react-intl/locale-data/he';
 import hi from 'react-intl/locale-data/hi';
+import hu from 'react-intl/locale-data/hu';
 import id from 'react-intl/locale-data/id';
 import it from 'react-intl/locale-data/it';
 import ja from 'react-intl/locale-data/ja';
@@ -44,6 +45,7 @@ addLocaleData([
   ...fr,
   ...he,
   ...hi,
+  ...hu,
   ...id,
   ...it,
   ...ja,
diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/component.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/component.jsx
index 997b75a60096caca38d64f1e4fb4d8b6b0ff8fd3..aabcbe8f61f1685fc9c2d92ca31113894c38248a 100755
--- a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/component.jsx
@@ -442,7 +442,7 @@ class AudioModal extends Component {
 
     return (
       <span>
-        {showPermissionsOvelay ? <PermissionsOverlay /> : null}
+        {showPermissionsOvelay ? <PermissionsOverlay closeModal={closeModal} /> : null}
         <Modal
           overlayClassName={styles.overlay}
           className={styles.modal}
diff --git a/bigbluebutton-html5/imports/ui/components/audio/permissions-overlay/component.jsx b/bigbluebutton-html5/imports/ui/components/audio/permissions-overlay/component.jsx
index 1ebf36945ccefc44f940d3b69becccd8d73ae5d8..a1ac3e0e65352070cb45151af9eaaff029dd08de 100644
--- a/bigbluebutton-html5/imports/ui/components/audio/permissions-overlay/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/audio/permissions-overlay/component.jsx
@@ -1,10 +1,12 @@
 import React from 'react';
 import { injectIntl, intlShape, defineMessages } from 'react-intl';
 import Modal from '/imports/ui/components/modal/simple/component';
+import PropTypes from 'prop-types';
 import { styles } from './styles';
 
 const propTypes = {
   intl: intlShape.isRequired,
+  closeModal: PropTypes.func.isRequired,
 };
 
 const intlMessages = defineMessages({
diff --git a/bigbluebutton-html5/imports/ui/components/end-meeting-confirmation/component.jsx b/bigbluebutton-html5/imports/ui/components/end-meeting-confirmation/component.jsx
index 2dde19f705bbfedfd82a4a87462a5a4ec62a3274..2b99b2c673a2b824f7555d9692937b4558cc9c6b 100644
--- a/bigbluebutton-html5/imports/ui/components/end-meeting-confirmation/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/end-meeting-confirmation/component.jsx
@@ -49,6 +49,7 @@ class EndMeetingComponent extends React.PureComponent {
           </div>
           <div className={styles.footer}>
             <Button
+              data-test="confirmEndMeeting"
               color="primary"
               className={styles.button}
               label={intl.formatMessage(intlMessages.yesLabel)}
diff --git a/bigbluebutton-html5/imports/ui/components/lock-viewers/notify/component.jsx b/bigbluebutton-html5/imports/ui/components/lock-viewers/notify/component.jsx
index 3edcdfd6b68996862dc3b53ca61e0fe34f412dd6..95bde9fcdef1b169ac90fcf23e0961db1067a063 100644
--- a/bigbluebutton-html5/imports/ui/components/lock-viewers/notify/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/lock-viewers/notify/component.jsx
@@ -3,7 +3,7 @@ import { defineMessages, injectIntl } from 'react-intl';
 import { notify } from '/imports/ui/services/notification';
 import _ from 'lodash';
 
-const intlMessages = defineMessages({
+const intlDisableMessages = defineMessages({
   disableCam: {
     id: 'app.userList.userOptions.disableCam',
     description: 'label to disable cam notification',
@@ -30,6 +30,33 @@ const intlMessages = defineMessages({
   },
 });
 
+const intlEnableMessages = defineMessages({
+  disableCam: {
+    id: 'app.userList.userOptions.enableCam',
+    description: 'label to enable cam notification',
+  },
+  disableMic: {
+    id: 'app.userList.userOptions.enableMic',
+    description: 'label to enable mic notification',
+  },
+  disablePrivateChat: {
+    id: 'app.userList.userOptions.enablePrivChat',
+    description: 'label to enable private chat notification',
+  },
+  disablePublicChat: {
+    id: 'app.userList.userOptions.enablePubChat',
+    description: 'label to enable private chat notification',
+  },
+  disableNote: {
+    id: 'app.userList.userOptions.enableNote',
+    description: 'label to enable note notification',
+  },
+  onlyModeratorWebcam: {
+    id: 'app.userList.userOptions.enableOnlyModeratorWebcam',
+    description: 'label to enable all webcams except for the moderators cam',
+  },
+});
+
 class LockViewersNotifyComponent extends Component {
   componentDidUpdate(prevProps) {
     const {
@@ -43,18 +70,36 @@ class LockViewersNotifyComponent extends Component {
       webcamsOnlyForModerator: prevWebcamsOnlyForModerator,
     } = prevProps;
 
+    function notifyLocks(arrLocks, intlMessages) {
+      arrLocks.forEach((key) => {
+        notify(intl.formatMessage(intlMessages[key]), 'info', 'lock');
+      });
+    }
+
     if (!_.isEqual(lockSettings, prevLockSettings)) {
       const rejectedKeys = ['setBy', 'lockedLayout'];
-      const filteredSettings = Object.keys(lockSettings)
+
+      const disabledSettings = Object.keys(lockSettings)
         .filter(key => prevLockSettings[key] !== lockSettings[key]
           && lockSettings[key]
           && !rejectedKeys.includes(key));
-      filteredSettings.forEach((key) => {
-        notify(intl.formatMessage(intlMessages[key]), 'info', 'lock');
-      });
+      const enableSettings = Object.keys(lockSettings)
+        .filter(key => prevLockSettings[key] !== lockSettings[key]
+          && !lockSettings[key]
+          && !rejectedKeys.includes(key));
+
+      if (disabledSettings.length > 0) {
+        notifyLocks(disabledSettings, intlDisableMessages);
+      }
+      if (enableSettings.length > 0) {
+        notifyLocks(enableSettings, intlEnableMessages);
+      }
     }
     if (webcamsOnlyForModerator && !prevWebcamsOnlyForModerator) {
-      notify(intl.formatMessage(intlMessages.onlyModeratorWebcam), 'info', 'lock');
+      notify(intl.formatMessage(intlDisableMessages.onlyModeratorWebcam), 'info', 'lock');
+    }
+    if (!webcamsOnlyForModerator && prevWebcamsOnlyForModerator) {
+      notify(intl.formatMessage(intlEnableMessages.onlyModeratorWebcam), 'info', 'lock');
     }
   }
 
diff --git a/bigbluebutton-html5/imports/ui/components/media/component.jsx b/bigbluebutton-html5/imports/ui/components/media/component.jsx
index 20a8510028a696595e608eaee1ca6469bdca987c..45f295c565ce8e05fe2ef626d603ef709388ab30 100644
--- a/bigbluebutton-html5/imports/ui/components/media/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/media/component.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
 import cx from 'classnames';
-import VideoProviderContainer from '/imports/ui/components/video-provider/container';
+import WebcamDraggableOverlay from './webcam-draggable-overlay/component';
 
 import { styles } from './styles';
 
@@ -18,6 +18,11 @@ const defaultProps = {
 
 
 export default class Media extends Component {
+  constructor(props) {
+    super(props);
+    this.refContainer = React.createRef();
+  }
+
   componentWillUpdate() {
     window.dispatchEvent(new Event('resize'));
   }
@@ -60,13 +65,22 @@ export default class Media extends Component {
     });
 
     return (
-      <div className={styles.container}>
+      <div
+        id="container"
+        className={cx(styles.container)}
+        ref={this.refContainer}
+      >
         <div className={!swapLayout ? contentClassName : overlayClassName}>
           {children}
         </div>
-        <div className={!swapLayout ? overlayClassName : contentClassName}>
-          { !disableVideo && !audioModalIsOpen ? <VideoProviderContainer /> : null }
-        </div>
+        <WebcamDraggableOverlay
+          refMediaContainer={this.refContainer}
+          swapLayout={swapLayout}
+          floatingOverlay={floatingOverlay}
+          hideOverlay={hideOverlay}
+          disableVideo={disableVideo}
+          audioModalIsOpen={audioModalIsOpen}
+        />
       </div>
     );
   }
diff --git a/bigbluebutton-html5/imports/ui/components/media/styles.scss b/bigbluebutton-html5/imports/ui/components/media/styles.scss
index 333bc57b9819f0fd08f42abacc6243ec3680f4bb..106191a85a27f80a812fd1e4c69dc89209cb7979 100644
--- a/bigbluebutton-html5/imports/ui/components/media/styles.scss
+++ b/bigbluebutton-html5/imports/ui/components/media/styles.scss
@@ -1,4 +1,5 @@
 @import "../../stylesheets/variables/_all";
+@import "../../stylesheets/variables/video";
 
 .container {
   order: 1;
@@ -18,20 +19,40 @@
   overflow: auto;
   width: 100%;
   position: relative;
+  order: 2;
 }
 
 .overlay {
-  flex: 1;
   display: flex;
-  order: 1;
   width: 100%;
-  border: 5px solid transparent;
-  border-top: 0 !important;
+  border: 0;
+  margin-top: 10px;
+  margin-bottom: 10px;
+  z-index: 2;
+  align-items: center;
+  
+  min-height: calc(var(--video-width) / var(--video-ratio));
+}
+
+.overlayRelative{
   position: relative;
+}
 
-  @include mq($medium-up) {
-    border: 10px solid transparent;
-  }
+.overlayAbsoluteSingle{
+  position: absolute;
+  height: calc(var(--video-width) / var(--video-ratio));
+}
+
+.overlayAbsoluteMult{
+  position: absolute;
+}
+
+.overlayToTop {
+  order: 3;
+}
+
+.overlayToBottom {
+  order: 1;
 }
 
 .hideOverlay {
@@ -44,28 +65,61 @@
 }
 
 .floatingOverlay {
-  --overlay-width: 20vw;
-  --overlay-min-width: 235px;
-  --overlay-max-width: 20vw;
-  --overlay-ratio: calc(16 / 9);
+  margin: 10px;
 
   @include mq($medium-up) {
     z-index: 999;
-    position: fixed;
-    margin: 0;
-    bottom: .8rem;
-    left: auto;
-    right: .8rem;
-    width: var(--overlay-width);
-    min-width: var(--overlay-min-width);
-    max-width: var(--overlay-max-width);
-    height: calc(var(--overlay-width) / var(--overlay-ratio));
-    min-height: calc(var(--overlay-min-width) / var(--overlay-ratio));
-    max-height: calc(var(--overlay-max-width) / var(--overlay-ratio));
-
-    [dir="rtl"] & {
-      right: auto;
-      left: .8rem;
-    }
+    position: absolute;
+    bottom: 0;
+    right: 0;
+    width: var(--video-width);
+    min-width: var(--video-width);
+    max-width: var(--video-max-width);
+    height: calc(var(--video-width) / var(--video-ratio));
+    min-height: calc(var(--video-width) / var(--video-ratio));
   }
 }
+
+.hide {
+  display: none;
+}
+
+.show {
+  display: block;
+}
+
+.top {
+  top: 0;
+}
+
+.bottom {
+  bottom: 0;
+}
+
+.dragging {
+  opacity: .5;
+}
+
+.dropZoneTop,
+.dropZoneBottom {
+  border: 1px dashed var(--color-gray-light);
+  position: absolute;
+  width: 100%;
+  z-index: 9999;
+  cursor: grabbing;
+}
+
+.dropZoneTop {
+  top: 0;
+}
+
+.dropZoneBottom {
+  bottom: 0;
+}
+
+.dropZoneBg {
+  position: absolute;
+  z-index: 99;
+  width: 100%;
+  background-color: rgba(255, 255, 255, .3);
+}
\ No newline at end of file
diff --git a/bigbluebutton-html5/imports/ui/components/media/webcam-draggable-overlay/component.jsx b/bigbluebutton-html5/imports/ui/components/media/webcam-draggable-overlay/component.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..42f14f9d926291f3325025ad9841f3133552016e
--- /dev/null
+++ b/bigbluebutton-html5/imports/ui/components/media/webcam-draggable-overlay/component.jsx
@@ -0,0 +1,551 @@
+import React, { Component, Fragment } from 'react';
+import PropTypes from 'prop-types';
+import cx from 'classnames';
+import VideoProviderContainer from '/imports/ui/components/video-provider/container';
+import _ from 'lodash';
+import browser from 'browser-detect';
+
+import Draggable from 'react-draggable';
+
+import { styles } from '../styles';
+
+const propTypes = {
+  floatingOverlay: PropTypes.bool,
+  hideOverlay: PropTypes.bool,
+};
+
+const defaultProps = {
+  floatingOverlay: false,
+  hideOverlay: true,
+};
+
+const fullscreenChangedEvents = [
+  'fullscreenchange',
+  'webkitfullscreenchange',
+  'mozfullscreenchange',
+  'MSFullscreenChange',
+];
+
+const BROWSER_ISMOBILE = browser().mobile;
+
+export default class WebcamDraggableOverlay extends Component {
+  static getWebcamBySelector() {
+    return document.querySelector('video[class^="media"]');
+  }
+
+  static getWebcamBySelectorCount() {
+    return document.querySelectorAll('video[class^="media"]').length;
+  }
+
+  static getWebcamListBySelector() {
+    return document.querySelector('div[class^="videoList"]');
+  }
+
+  static getVideoCanvasBySelector() {
+    return document.querySelector('div[class^="videoCanvas"]');
+  }
+
+  static getOverlayBySelector() {
+    return document.querySelector('div[class*="overlay"]');
+  }
+
+  static isOverlayAbsolute() {
+    return !!(document.querySelector('div[class*="overlayAbsolute"]'));
+  }
+
+  static getIsOverlayChanged() {
+    const overlayToTop = document.querySelector('div[class*="overlayToTop"]');
+    const overlayToBottom = document.querySelector('div[class*="overlayToBottom"]');
+
+    return !!(overlayToTop || overlayToBottom);
+  }
+
+  static getGridLineNum(numCams, camWidth, containerWidth) {
+    let used = (camWidth + 10) * numCams;
+    let countLines = 0;
+
+    while (used > containerWidth) {
+      used -= containerWidth;
+      countLines += 1;
+    }
+
+    return countLines + 1;
+  }
+
+  static waitFor(condition, callback) {
+    const cond = condition();
+    if (!cond) {
+      setTimeout(WebcamDraggableOverlay.waitFor.bind(null, condition, callback), 500);
+    } else {
+      callback();
+    }
+    return false;
+  }
+
+  constructor(props) {
+    super(props);
+
+    this.state = {
+      dragging: false,
+      showDropZones: false,
+      showBgDropZoneTop: false,
+      showBgDropZoneBottom: false,
+      dropOnTop: BROWSER_ISMOBILE,
+      dropOnBottom: !BROWSER_ISMOBILE,
+      initialPosition: { x: 0, y: 0 },
+      initialRectPosition: { x: 0, y: 0 },
+      lastPosition: { x: 0, y: 0 },
+      resetPosition: false,
+      isFullScreen: false,
+      isVideoLoaded: false,
+      isMinWidth: false,
+      userLength: 0,
+    };
+
+    this.updateWebcamPositionByResize = this.updateWebcamPositionByResize.bind(this);
+
+    this.eventResizeListener = _.throttle(
+      this.updateWebcamPositionByResize,
+      500,
+      {
+        leading: true,
+        trailing: true,
+      },
+    );
+
+    this.videoMounted = this.videoMounted.bind(this);
+
+    this.handleWebcamDragStart = this.handleWebcamDragStart.bind(this);
+    this.handleWebcamDragStop = this.handleWebcamDragStop.bind(this);
+    this.handleFullscreenChange = this.handleFullscreenChange.bind(this);
+    this.fullscreenButtonChange = this.fullscreenButtonChange.bind(this);
+
+    this.getVideoListUsersChange = this.getVideoListUsersChange.bind(this);
+    this.setIsFullScreen = this.setIsFullScreen.bind(this);
+    this.setResetPosition = this.setResetPosition.bind(this);
+    this.setInitialReferencePoint = this.setInitialReferencePoint.bind(this);
+    this.setLastPosition = this.setLastPosition.bind(this);
+    this.setLastWebcamPosition = this.setLastWebcamPosition.bind(this);
+    this.setisMinWidth = this.setisMinWidth.bind(this);
+
+    this.dropZoneTopEnterHandler = this.dropZoneTopEnterHandler.bind(this);
+    this.dropZoneTopLeaveHandler = this.dropZoneTopLeaveHandler.bind(this);
+
+    this.dropZoneBottomEnterHandler = this.dropZoneBottomEnterHandler.bind(this);
+    this.dropZoneBottomLeaveHandler = this.dropZoneBottomLeaveHandler.bind(this);
+
+    this.dropZoneTopMouseUpHandler = this.dropZoneTopMouseUpHandler.bind(this);
+    this.dropZoneBottomMouseUpHandler = this.dropZoneBottomMouseUpHandler.bind(this);
+  }
+
+  componentDidMount() {
+    const { floatingOverlay } = this.props;
+    const { resetPosition } = this.state;
+
+    if (!floatingOverlay
+      && !resetPosition) this.setResetPosition(true);
+
+    window.addEventListener('resize', this.eventResizeListener);
+
+    fullscreenChangedEvents.forEach((event) => {
+      document.addEventListener(event, this.handleFullscreenChange);
+    });
+
+    // Ensures that the event will be called before the resize
+    document.addEventListener('webcamFullscreenButtonChange', this.fullscreenButtonChange);
+
+    window.addEventListener('videoListUsersChange', this.getVideoListUsersChange);
+  }
+
+  componentDidUpdate(prevProps, prevState) {
+    const { userLength } = this.state;
+    if (userLength !== prevState.userLength) {
+      this.setLastWebcamPosition({ x: 0 });
+    }
+  }
+
+  componentWillUnmount() {
+    fullscreenChangedEvents.forEach((event) => {
+      document.removeEventListener(event, this.fullScreenToggleCallback);
+    });
+
+    document.removeEventListener('webcamFullscreenButtonChange', this.fullscreenButtonChange);
+  }
+
+  getVideoListUsersChange() {
+    const userLength = WebcamDraggableOverlay.getWebcamBySelectorCount();
+    this.setState({ userLength });
+  }
+
+  setIsFullScreen(isFullScreen) {
+    this.setState({ isFullScreen });
+  }
+
+  setResetPosition(resetPosition) {
+    this.setState({ resetPosition });
+  }
+
+  setLastPosition(x, y) {
+    this.setState({ lastPosition: { x, y } });
+  }
+
+  setInitialReferencePoint() {
+    const { refMediaContainer } = this.props;
+    const { userLength } = this.state;
+    const { current: mediaContainer } = refMediaContainer;
+
+    const webcamBySelector = WebcamDraggableOverlay.getWebcamBySelector();
+
+    if (webcamBySelector && mediaContainer) {
+      if (userLength === 0) this.getVideoListUsersChange();
+
+      let x = 0;
+      let y = 0;
+
+      const webcamBySelectorRect = webcamBySelector.getBoundingClientRect();
+      const {
+        width: webcamWidth,
+        height: webcamHeight,
+      } = webcamBySelectorRect;
+
+      const mediaContainerRect = mediaContainer.getBoundingClientRect();
+      const {
+        width: mediaWidth,
+        height: mediaHeight,
+      } = mediaContainerRect;
+
+      const lineNum = WebcamDraggableOverlay
+        .getGridLineNum(userLength, webcamWidth, mediaWidth);
+
+      x = mediaWidth - ((webcamWidth + 10) * userLength); // 10 is margin
+      y = mediaHeight - ((webcamHeight + 10) * lineNum); // 10 is margin
+
+      if (x === 0 && y === 0) return false;
+
+      this.setState({ initialRectPosition: { x, y } });
+      return true;
+    }
+    return false;
+  }
+
+  setLastWebcamPosition() {
+    const { refMediaContainer } = this.props;
+    const { current: mediaContainer } = refMediaContainer;
+    const { initialRectPosition, userLength } = this.state;
+
+    const { x: initX, y: initY } = initialRectPosition;
+    const webcamBySelector = WebcamDraggableOverlay.getWebcamBySelector();
+
+    if (webcamBySelector && mediaContainer) {
+      const webcamBySelectorRect = webcamBySelector.getBoundingClientRect();
+      const {
+        left: webcamLeft,
+        top: webcamTop,
+      } = webcamBySelectorRect;
+
+      const mediaContainerRect = mediaContainer.getBoundingClientRect();
+      const {
+        left: mediaLeft,
+        top: mediaTop,
+      } = mediaContainerRect;
+
+      const webcamXByMedia = userLength > 1 ? 0 : webcamLeft - mediaLeft;
+      const webcamYByMedia = webcamTop - mediaTop;
+
+      let x = 0;
+      let y = 0;
+
+      if (webcamXByMedia > 0) {
+        x = webcamXByMedia - initX;
+      } else {
+        x = 0 - initX;
+      }
+      if (webcamXByMedia > initX) x = -(initY - 10);
+      if (userLength > 1) x = 0;
+
+      y = webcamYByMedia - (initY - 10);
+
+      if (webcamYByMedia > initY) {
+        y = -10;
+      }
+      if (webcamYByMedia < 0) y = -(initY - 10);
+
+      this.setLastPosition(x, y);
+    }
+  }
+
+  setisMinWidth(isMinWidth) {
+    this.setState({ isMinWidth });
+  }
+
+  videoMounted() {
+    this.setResetPosition(true);
+    WebcamDraggableOverlay.waitFor(this.setInitialReferencePoint, this.setLastWebcamPosition);
+    this.setState({ isVideoLoaded: true });
+  }
+
+  fullscreenButtonChange() {
+    this.setIsFullScreen(true);
+  }
+
+  updateWebcamPositionByResize() {
+    const {
+      isVideoLoaded,
+      isMinWidth,
+    } = this.state;
+    const webcamBySelectorCount = WebcamDraggableOverlay.getWebcamBySelectorCount();
+
+    if (isVideoLoaded) {
+      if (WebcamDraggableOverlay.isOverlayAbsolute() && webcamBySelectorCount > 1) {
+        this.setInitialReferencePoint();
+        this.setLastWebcamPosition();
+      }
+      this.setInitialReferencePoint();
+      this.setLastWebcamPosition();
+    }
+
+    if (window.innerWidth < 641) {
+      this.setisMinWidth(true);
+      this.setState({ dropOnBottom: true });
+      this.setResetPosition(true);
+    } else if (isMinWidth) {
+      this.setisMinWidth(false);
+    }
+  }
+
+  handleFullscreenChange() {
+    if (document.fullscreenElement
+      || document.webkitFullscreenElement
+      || document.mozFullScreenElement
+      || document.msFullscreenElement) {
+      window.removeEventListener('resize', this.eventResizeListener);
+      this.setIsFullScreen(true);
+    } else {
+      this.setIsFullScreen(false);
+      window.addEventListener('resize', this.eventResizeListener);
+    }
+  }
+
+  handleWebcamDragStart() {
+    const { floatingOverlay } = this.props;
+    const {
+      dragging,
+      showDropZones,
+      dropOnTop,
+      dropOnBottom,
+      resetPosition,
+    } = this.state;
+
+    if (!floatingOverlay) WebcamDraggableOverlay.getOverlayBySelector().style.bottom = 0;
+
+    if (!dragging) this.setState({ dragging: true });
+    if (!showDropZones) this.setState({ showDropZones: true });
+    if (dropOnTop) this.setState({ dropOnTop: false });
+    if (dropOnBottom) this.setState({ dropOnBottom: false });
+    if (resetPosition) this.setState({ resetPosition: false });
+    window.dispatchEvent(new Event('resize'));
+  }
+
+  handleWebcamDragStop(e, position) {
+    const {
+      dragging,
+      showDropZones,
+    } = this.state;
+
+    const { x, y } = position;
+
+    if (dragging) this.setState({ dragging: false });
+    if (showDropZones) this.setState({ showDropZones: false });
+
+    this.setLastPosition(x, y);
+  }
+
+  dropZoneTopEnterHandler() {
+    const {
+      showBgDropZoneTop,
+    } = this.state;
+
+    if (!showBgDropZoneTop) this.setState({ showBgDropZoneTop: true });
+  }
+
+  dropZoneBottomEnterHandler() {
+    const {
+      showBgDropZoneBottom,
+    } = this.state;
+
+    if (!showBgDropZoneBottom) this.setState({ showBgDropZoneBottom: true });
+  }
+
+  dropZoneTopLeaveHandler() {
+    const {
+      showBgDropZoneTop,
+    } = this.state;
+
+    if (showBgDropZoneTop) this.setState({ showBgDropZoneTop: false });
+  }
+
+  dropZoneBottomLeaveHandler() {
+    const {
+      showBgDropZoneBottom,
+    } = this.state;
+
+    if (showBgDropZoneBottom) this.setState({ showBgDropZoneBottom: false });
+  }
+
+  dropZoneTopMouseUpHandler() {
+    const { dropOnTop } = this.state;
+    if (!dropOnTop) {
+      this.setState({
+        dropOnTop: true,
+        dropOnBottom: false,
+        resetPosition: true,
+      });
+    }
+    window.dispatchEvent(new Event('resize'));
+    setTimeout(() => this.setLastWebcamPosition(), 500);
+  }
+
+  dropZoneBottomMouseUpHandler() {
+    const { dropOnBottom } = this.state;
+    if (!dropOnBottom) {
+      this.setState({
+        dropOnTop: false,
+        dropOnBottom: true,
+        resetPosition: true,
+      });
+    }
+    window.dispatchEvent(new Event('resize'));
+    setTimeout(() => this.setLastWebcamPosition(), 500);
+  }
+
+  render() {
+    const {
+      swapLayout,
+      floatingOverlay,
+      hideOverlay,
+      disableVideo,
+      audioModalIsOpen,
+    } = this.props;
+
+    const {
+      dragging,
+      showDropZones,
+      showBgDropZoneTop,
+      showBgDropZoneBottom,
+      dropOnTop,
+      dropOnBottom,
+      initialPosition,
+      lastPosition,
+      resetPosition,
+      isFullScreen,
+      isMinWidth,
+    } = this.state;
+
+    const webcamBySelectorCount = WebcamDraggableOverlay.getWebcamBySelectorCount();
+
+    const contentClassName = cx({
+      [styles.content]: true,
+    });
+
+    const overlayClassName = cx({
+      [styles.overlay]: true,
+      [styles.overlayRelative]: (dropOnTop || dropOnBottom),
+      [styles.overlayAbsoluteSingle]: (!dropOnTop && !dropOnBottom && webcamBySelectorCount <= 1),
+      [styles.overlayAbsoluteMult]: (!dropOnTop && !dropOnBottom && webcamBySelectorCount > 1),
+      [styles.hideOverlay]: hideOverlay,
+      [styles.floatingOverlay]: floatingOverlay && (!dropOnTop && !dropOnBottom),
+      [styles.overlayToTop]: dropOnTop,
+      [styles.overlayToBottom]: dropOnBottom,
+      [styles.dragging]: dragging,
+    });
+
+    const dropZoneTopClassName = cx({
+      [styles.dropZoneTop]: true,
+      [styles.show]: showDropZones,
+      [styles.hide]: !showDropZones,
+    });
+
+    const dropZoneBottomClassName = cx({
+      [styles.dropZoneBottom]: true,
+      [styles.show]: showDropZones,
+      [styles.hide]: !showDropZones,
+    });
+
+    const dropZoneBgTopClassName = cx({
+      [styles.dropZoneBg]: true,
+      [styles.top]: true,
+      [styles.show]: showBgDropZoneTop,
+      [styles.hide]: !showBgDropZoneTop,
+    });
+
+    const dropZoneBgBottomClassName = cx({
+      [styles.dropZoneBg]: true,
+      [styles.bottom]: true,
+      [styles.show]: showBgDropZoneBottom,
+      [styles.hide]: !showBgDropZoneBottom,
+    });
+
+    const cursor = () => {
+      if ((!swapLayout || !isFullScreen || !BROWSER_ISMOBILE) && !dragging && !isMinWidth) return 'grab';
+      if (dragging) return 'grabbing';
+      return 'default';
+    };
+
+    return (
+      <Fragment>
+        <div
+          className={dropZoneTopClassName}
+          onMouseEnter={this.dropZoneTopEnterHandler}
+          onMouseLeave={this.dropZoneTopLeaveHandler}
+          onMouseUp={this.dropZoneTopMouseUpHandler}
+          role="presentation"
+          style={{ height: '100px' }}
+        />
+        <div
+          className={dropZoneBgTopClassName}
+          style={{ height: '100px' }}
+        />
+
+        <Draggable
+          handle="video"
+          bounds="#container"
+          onStart={this.handleWebcamDragStart}
+          onStop={this.handleWebcamDragStop}
+          onMouseDown={e => e.preventDefault()}
+          disabled={swapLayout || isFullScreen || BROWSER_ISMOBILE || isMinWidth}
+          position={resetPosition || swapLayout ? initialPosition : lastPosition}
+        >
+          <div
+            className={!swapLayout ? overlayClassName : contentClassName}
+          >
+            {
+              !disableVideo && !audioModalIsOpen
+                ? (
+                  <VideoProviderContainer
+                    cursor={cursor()}
+                    onMount={this.videoMounted}
+                    onUpdate={this.videoUpdated}
+                  />
+                ) : null}
+          </div>
+        </Draggable>
+
+        <div
+          className={dropZoneBottomClassName}
+          onMouseEnter={this.dropZoneBottomEnterHandler}
+          onMouseLeave={this.dropZoneBottomLeaveHandler}
+          onMouseUp={this.dropZoneBottomMouseUpHandler}
+          role="presentation"
+          style={{ height: '100px' }}
+        />
+        <div
+          className={dropZoneBgBottomClassName}
+          style={{ height: '100px' }}
+        />
+      </Fragment>
+    );
+  }
+}
+
+WebcamDraggableOverlay.propTypes = propTypes;
+WebcamDraggableOverlay.defaultProps = defaultProps;
diff --git a/bigbluebutton-html5/imports/ui/components/meeting-ended/component.jsx b/bigbluebutton-html5/imports/ui/components/meeting-ended/component.jsx
index d43aeffc8094b46c0480a4f52cb6a28091ce4489..af697fdc5db886e538de1dee08b917568e48dae5 100755
--- a/bigbluebutton-html5/imports/ui/components/meeting-ended/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/meeting-ended/component.jsx
@@ -170,7 +170,7 @@ class MeetingEnded extends React.PureComponent {
       <div className={styles.parent}>
         <div className={styles.modal}>
           <div className={styles.content}>
-            <h1 className={styles.title}>
+            <h1 className={styles.title} data-test="meetingEndedModalTitle">
               {
                 intl.formatMessage(intlMessage[code] || intlMessage[430])
               }
diff --git a/bigbluebutton-html5/imports/ui/components/modal/fullscreen/component.jsx b/bigbluebutton-html5/imports/ui/components/modal/fullscreen/component.jsx
index 00995d241e36fe53ed2ad3711823234068d365bc..12a90008332e17de9bfba09af7dda7ddfe0468c8 100644
--- a/bigbluebutton-html5/imports/ui/components/modal/fullscreen/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/modal/fullscreen/component.jsx
@@ -40,6 +40,7 @@ const propTypes = {
     disabled: PropTypes.bool,
   }),
   preventClosing: PropTypes.bool,
+  shouldCloseOnOverlayClick: PropTypes.bool,
 };
 
 const defaultProps = {
@@ -54,9 +55,31 @@ const defaultProps = {
 };
 
 class ModalFullscreen extends PureComponent {
+  constructor(props) {
+    super(props);
+
+    this.handleAction = this.handleAction.bind(this);
+  }
+
   handleAction(name) {
-    const action = this.props[name];
-    return this.props.modalHide(action.callback);
+    const { confirm, dismiss, modalHide } = this.props;
+    const { callback: callBackConfirm } = confirm;
+    const { callback: callBackDismiss } = dismiss;
+
+    let callback;
+
+    switch (name) {
+      case 'confirm':
+        callback = callBackConfirm;
+        break;
+      case 'dismiss':
+        callback = callBackDismiss;
+        break;
+      default:
+        break;
+    }
+
+    return modalHide(callback);
   }
 
   render() {
@@ -66,6 +89,7 @@ class ModalFullscreen extends PureComponent {
       confirm,
       dismiss,
       className,
+      children,
       modalisOpen,
       preventClosing,
       ...otherProps
@@ -93,17 +117,17 @@ class ModalFullscreen extends PureComponent {
               label={intl.formatMessage(intlMessages.modalClose)}
               aria-label={`${intl.formatMessage(intlMessages.modalClose)} ${title}`}
               disabled={dismiss.disabled}
-              onClick={this.handleAction.bind(this, 'dismiss')}
+              onClick={() => this.handleAction('dismiss')}
               aria-describedby="modalDismissDescription"
             />
             <Button
               data-test="modalConfirmButton"
               color="primary"
               className={popoutIcon ? cx(styles.confirm, styles.popout) : styles.confirm}
-              label={confirm.label}
+              label={confirm.label || intl.formatMessage(intlMessages.modalDone)}
               aria-label={confirmAriaLabel}
               disabled={confirm.disabled}
-              onClick={this.handleAction.bind(this, 'confirm')}
+              onClick={() => this.handleAction('confirm')}
               aria-describedby="modalConfirmDescription"
               icon={confirm.icon || null}
               iconRight={popoutIcon}
@@ -111,7 +135,7 @@ class ModalFullscreen extends PureComponent {
           </div>
         </header>
         <div className={styles.content}>
-          {this.props.children}
+          {children}
         </div>
         <div id="modalDismissDescription" hidden>{intl.formatMessage(intlMessages.modalCloseDescription)}</div>
         <div id="modalConfirmDescription" hidden>{intl.formatMessage(intlMessages.modalDoneDescription)}</div>
diff --git a/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/component.jsx b/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/component.jsx
index 07ba5b9844e6d0fac73c79497216aa4252f3072f..cf9369f3185a0b1ea003d060d182fd1315e8a98c 100755
--- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/component.jsx
@@ -18,6 +18,7 @@ import { styles } from './styles.scss';
 
 const propTypes = {
   intl: intlShape.isRequired,
+  mountModal: PropTypes.func.isRequired,
   defaultFileName: PropTypes.string.isRequired,
   fileSizeMin: PropTypes.number.isRequired,
   fileSizeMax: PropTypes.number.isRequired,
@@ -48,9 +49,13 @@ const intlMessages = defineMessages({
     id: 'app.presentationUploder.message',
     description: 'message warning the types of files accepted',
   },
+  uploadLabel: {
+    id: 'app.presentationUploder.uploadLabel',
+    description: 'confirm label when presentations are to be uploaded',
+  },
   confirmLabel: {
     id: 'app.presentationUploder.confirmLabel',
-    description: 'used in the button that start the upload of the new presentation',
+    description: 'confirm label when no presentations are to be uploaded',
   },
   confirmDesc: {
     id: 'app.presentationUploder.confirmDesc',
@@ -174,6 +179,7 @@ class PresentationUploader extends Component {
       oldCurrentId: currentPres ? currentPres.id : -1,
       preventClosing: false,
       disableActions: false,
+      disableConfirm: false,
     };
 
     this.handleConfirm = this.handleConfirm.bind(this);
@@ -189,6 +195,15 @@ class PresentationUploader extends Component {
     this.releaseActionsOnPresentationError = this.releaseActionsOnPresentationError.bind(this);
   }
 
+  static getDerivedStateFromProps(props, state) {
+    if (props.presentations[0].isCurrent && state.disableConfirm) {
+      return {
+        disableConfirm: !state.disableConfirm,
+      };
+    }
+    return null;
+  }
+
   componentDidUpdate() {
     this.releaseActionsOnPresentationError();
   }
@@ -395,6 +410,7 @@ class PresentationUploader extends Component {
 
     this.setState({
       presentations: presentationsUpdated,
+      disableConfirm: false,
     });
   }
 
@@ -408,6 +424,7 @@ class PresentationUploader extends Component {
       presentations: update(presentations, {
         $splice: [[toRemoveIndex, 1]],
       }),
+      disableConfirm: true,
     });
   }
 
@@ -669,7 +686,19 @@ class PresentationUploader extends Component {
 
   render() {
     const { intl } = this.props;
-    const { preventClosing, disableActions } = this.state;
+    const {
+      preventClosing, disableActions, presentations, disableConfirm,
+    } = this.state;
+
+    let awaitingConversion = false;
+    presentations.map((presentation) => {
+      if (!presentation.conversion.done) awaitingConversion = true;
+      return null;
+    });
+
+    const confirmLabel = awaitingConversion
+      ? intl.formatMessage(intlMessages.uploadLabel)
+      : intl.formatMessage(intlMessages.confirmLabel);
 
     return (
       <ModalFullscreen
@@ -677,9 +706,9 @@ class PresentationUploader extends Component {
         preventClosing={preventClosing}
         confirm={{
           callback: this.handleConfirm,
-          label: intl.formatMessage(intlMessages.confirmLabel),
+          label: confirmLabel,
           description: intl.formatMessage(intlMessages.confirmDesc),
-          disabled: disableActions,
+          disabled: disableConfirm,
         }}
         dismiss={{
           callback: this.handleDismiss,
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/component.jsx
index bc39f5f8f8ab38bd1953edff9462f96c371a6bf5..6032f1daa5c6a17c127f520183d024d8d6e65df2 100644
--- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/component.jsx
@@ -50,6 +50,9 @@ class UserListItem extends PureComponent {
       hasPrivateChatBetweenUsers,
       toggleUserLock,
       requestUserInformation,
+      userInBreakout,
+      breakoutSequence,
+      meetignIsBreakout,
     } = this.props;
 
     const { meetingId, lockSettingsProps } = meeting;
@@ -80,6 +83,9 @@ class UserListItem extends PureComponent {
           hasPrivateChatBetweenUsers,
           toggleUserLock,
           requestUserInformation,
+          userInBreakout,
+          breakoutSequence,
+          meetignIsBreakout,
         }}
       />
     );
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/container.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/container.jsx
index e27d54154b162b2d11c859833d53dbcdde184cf6..70e36ae0b1c4528febd57fa6915cb58237d11866 100644
--- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/container.jsx
@@ -1,11 +1,22 @@
 import React from 'react';
 import { withTracker } from 'meteor/react-meteor-data';
 import Users from '/imports/api/users';
+import Breakouts from '/imports/api/breakouts';
+import Meetings from '/imports/api/meetings';
+import Auth from '/imports/ui/services/auth';
 import mapUser from '/imports/ui/services/user/mapUser';
 import UserListItem from './component';
 
 const UserListItemContainer = props => <UserListItem {...props} />;
 
-export default withTracker(({ userId }) => ({
-  user: mapUser(Users.findOne({ userId })),
-}))(UserListItemContainer);
+export default withTracker(({ userId }) => {
+  const findUserInBreakout = Breakouts.findOne({ 'joinedUsers.userId': new RegExp(`^${userId}`) });
+  const breakoutSequence = (findUserInBreakout || {}).sequence;
+  const Meeting = Meetings.findOne({ MeetingId: Auth.meetingID });
+  return {
+    user: mapUser(Users.findOne({ userId })),
+    userInBreakout: !!findUserInBreakout,
+    breakoutSequence,
+    meetignIsBreakout: Meeting && Meeting.meetingProp.isBreakout,
+  };
+})(UserListItemContainer);
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 3362870d2b3e04f1a85908f5c9e9e56128c959e0..5fc57cb5a9970b66c87fda338a37dee3f5c0e97d 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
@@ -460,6 +460,9 @@ class UserDropdown extends PureComponent {
     const {
       normalizeEmojiName,
       user,
+      userInBreakout,
+      breakoutSequence,
+      meetignIsBreakout,
     } = this.props;
 
     const { clientType } = user;
@@ -470,6 +473,7 @@ class UserDropdown extends PureComponent {
       : user.name.toLowerCase().slice(0, 2);
 
     const iconVoiceOnlyUser = (<Icon iconName="audio_on" />);
+    const userIcon = isVoiceOnly ? iconVoiceOnlyUser : iconUser;
 
     return (
       <UserAvatar
@@ -482,7 +486,10 @@ class UserDropdown extends PureComponent {
         noVoice={!user.isVoiceUser}
         color={user.color}
       >
-        {isVoiceOnly ? iconVoiceOnlyUser : iconUser}
+        {
+        userInBreakout
+        && !meetignIsBreakout
+          ? breakoutSequence : userIcon}
       </UserAvatar>
     );
   }
@@ -496,7 +503,7 @@ class UserDropdown extends PureComponent {
       isMeetingLocked,
       meetingId,
     } = this.props;
-
+    
     const {
       isActionsOpen,
       dropdownVisible,
diff --git a/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx b/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx
index bc64c27d4ae3a13dc5277a49fbb5efc90636321c..8ad42ff94b787542bd9ad670ff09d2c8732c54b0 100755
--- a/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx
@@ -501,7 +501,7 @@ class VideoPreview extends Component {
               color="primary"
               label={intl.formatMessage(intlMessages.startSharingLabel)}
               onClick={() => this.handleStartSharing()}
-              disabled={isStartSharingDisabled}
+              disabled={isStartSharingDisabled || isStartSharingDisabled === null}
             />
           </div>
         </div>
diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/component.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/component.jsx
index bdc35fa9a2c77cfb2cd4ce8384f54e5ec7a9a4f7..2cf9f87fb1591c07086ba7d54326213baa2a820c 100755
--- a/bigbluebutton-html5/imports/ui/components/video-provider/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/video-provider/component.jsx
@@ -111,6 +111,10 @@ const MAX_CAMERA_SHARE_FAILED_WAIT_TIME = 60000;
 const PING_INTERVAL = 15000;
 
 class VideoProvider extends Component {
+  static notifyError(message) {
+    notify(message, 'error', 'video');
+  }
+
   constructor(props) {
     super(props);
 
@@ -158,6 +162,9 @@ class VideoProvider extends Component {
   }
 
   componentDidMount() {
+    const { onMount } = this.props;
+    onMount();
+
     this.checkIceConnectivity();
     document.addEventListener('joinVideo', this.shareWebcam); // TODO find a better way to do this
     document.addEventListener('exitVideo', this.unshareWebcam);
@@ -203,6 +210,11 @@ class VideoProvider extends Component {
     usersToDisconnect.forEach(id => this.stopWebRTCPeer(id));
   }
 
+  componentDidUpdate(prevProps) {
+    const { users } = this.props;
+    if (users.length !== prevProps.users.length) window.dispatchEvent(new Event('videoListUsersChange'));
+  }
+
   componentWillUnmount() {
     document.removeEventListener('joinVideo', this.shareWebcam);
     document.removeEventListener('exitVideo', this.unshareWebcam);
@@ -312,8 +324,8 @@ class VideoProvider extends Component {
     // host candidates
     if (browser().name === 'safari') {
       const { intl } = this.props;
-      tryGenerateIceCandidates().catch((e) => {
-        this.notifyError(intl.formatMessage(intlSFUErrors[2021]));
+      tryGenerateIceCandidates().catch(() => {
+        VideoProvider.notifyError(intl.formatMessage(intlSFUErrors[2021]));
       });
     }
   }
@@ -375,11 +387,9 @@ class VideoProvider extends Component {
           this.logger('error', `client: Websocket error '${error}' on message '${message.id}'`, 'video_provider_ws_error', { topic: 'ws' });
         }
       });
-    } else {
+    } else if (message.id !== 'stop') {
       // No need to queue video stop messages
-      if (message.id !== 'stop') {
-        this.wsQueue.push(message);
-      }
+      this.wsQueue.push(message);
     }
   }
 
@@ -402,6 +412,7 @@ class VideoProvider extends Component {
 
         peer.didSDPAnswered = true;
         this._processIceQueue(peer, id);
+        return true;
       });
     } else {
       this.logger('warn', '[startResponse] Message arrived after the peer was already thrown out, discarding it...', 'video_provider_no_peer');
@@ -419,6 +430,7 @@ class VideoProvider extends Component {
           if (err) {
             return this.logger('error', `Error adding candidate: ${err}`, 'video_provider_ice_candidate_cant_add', { cameraId: message.cameraId });
           }
+          return true;
         });
       } else {
         if (webRtcPeer.iceQueue == null) {
@@ -548,7 +560,7 @@ class VideoProvider extends Component {
             return this._webRTCOnError(errorGenOffer, id, shareWebcam);
           }
 
-          this.logger('debug', `Invoking SDP offer callback function ${location.host}`, 'video_provider_sdp_offer_callback', { cameraId: id, offerSdp });
+          this.logger('debug', `Invoking SDP offer callback function ${window.location.host}`, 'video_provider_sdp_offer_callback', { cameraId: id, offerSdp });
 
           const message = {
             type: 'video',
@@ -560,10 +572,14 @@ class VideoProvider extends Component {
             voiceBridge,
           };
           this.sendMessage(message);
+          return true;
         });
+        return true;
       });
       if (this.webRtcPeers[id].peerConnection) {
-        this.webRtcPeers[id].peerConnection.oniceconnectionstatechange = this._getOnIceConnectionStateChangeCallback(id);
+        this.webRtcPeers[id]
+          .peerConnection
+          .oniceconnectionstatechange = this._getOnIceConnectionStateChangeCallback(id);
       }
       if (ENABLE_NETWORK_INFORMATION) {
         newWebcamConnection(id);
@@ -579,7 +595,7 @@ class VideoProvider extends Component {
       this.logger('error', `Camera share has not succeeded in ${CAMERA_SHARE_FAILED_WAIT_TIME}`, 'video_provider_cam_timeout', { cameraId: id });
 
       if (userId === id) {
-        this.notifyError(intl.formatMessage(intlClientErrors.mediaFlowTimeout));
+        VideoProvider.notifyError(intl.formatMessage(intlClientErrors.mediaFlowTimeout));
         this.stopWebRTCPeer(id, false);
       } else {
         // Subscribers try to reconnect according to their timers if media could
@@ -589,7 +605,8 @@ class VideoProvider extends Component {
         this.createWebRTCPeer(id, shareWebcam);
 
         // Increment reconnect interval
-        this.restartTimer[id] = Math.min(2 * this.restartTimer[id], MAX_CAMERA_SHARE_FAILED_WAIT_TIME);
+        this.restartTimer[id] = Math
+          .min(2 * this.restartTimer[id], MAX_CAMERA_SHARE_FAILED_WAIT_TIME);
 
         this.logger('info', `Reconnecting peer ${id} with timer`, 'video_provider_reconnecting_peer', this.restartTimer);
       }
@@ -603,9 +620,10 @@ class VideoProvider extends Component {
       const candidate = peer.iceQueue.shift();
       peer.addIceCandidate(candidate, (err) => {
         if (err) {
-          this.notifyError(intl.formatMessage(intlClientErrors.iceCandidateError));
+          VideoProvider.notifyError(intl.formatMessage(intlClientErrors.iceCandidateError));
           return this.logger('error', `Error adding candidate: ${err}`, 'video_provider_cant_add_candidate', { cameraId });
         }
+        return true;
       });
     }
   }
@@ -624,10 +642,10 @@ class VideoProvider extends Component {
     this.logger('error', ' WebRTC peerObj create error', 'video_provider_webrtc_error_before', { id, error });
     const errorMessage = intlClientErrors[error.name]
       || intlSFUErrors[error] || intlClientErrors.permissionError;
-    this.notifyError(intl.formatMessage(errorMessage));
+    VideoProvider.notifyError(intl.formatMessage(errorMessage));
     this.stopWebRTCPeer(id);
 
-    return this.logger('error', errorMessage, 'video_provider_webrtc_error_after', { cameraId: id, errorMessage });
+    this.logger('error', errorMessage, 'video_provider_webrtc_error_after', { cameraId: id, errorMessage });
   }
 
   _getOnIceCandidateCallback(id, shareWebcam) {
@@ -669,7 +687,7 @@ class VideoProvider extends Component {
         this.logger('error', `ICE connection state id:${id}, connectionState:${connectionState}`, 'video_provider_ice_connection_failed_state');
 
         this.stopWebRTCPeer(id);
-        this.notifyError(intl.formatMessage(intlClientErrors.iceConnectionStateError));
+        VideoProvider.notifyError(intl.formatMessage(intlClientErrors.iceConnectionStateError));
       }
     };
   }
@@ -739,7 +757,7 @@ class VideoProvider extends Component {
           res.packetsLost = parseInt(res.packetsLost, 10) || 0;
           res.packetsReceived = parseInt(res.packetsReceived, 10);
 
-          if ((isNaN(res.packetsSent) && res.packetsReceived === 0)
+          if ((Number.isNaN(res.packetsSent) && res.packetsReceived === 0)
             || (res.type === 'outbound-rtp' && res.isRemote)) {
             return; // Discard local video receiving
           }
@@ -794,9 +812,11 @@ class VideoProvider extends Component {
       const lastVideoStats = videoStatsArray[videoStatsArray.length - 1];
 
       const videoIntervalPacketsLost = lastVideoStats.packetsLost - firstVideoStats.packetsLost;
-      const videoIntervalPacketsReceived = lastVideoStats.packetsReceived - firstVideoStats.packetsReceived;
+      const videoIntervalPacketsReceived = lastVideoStats
+        .packetsReceived - firstVideoStats.packetsReceived;
       const videoIntervalPacketsSent = lastVideoStats.packetsSent - firstVideoStats.packetsSent;
-      const videoIntervalBytesReceived = lastVideoStats.bytesReceived - firstVideoStats.bytesReceived;
+      const videoIntervalBytesReceived = lastVideoStats
+        .bytesReceived - firstVideoStats.bytesReceived;
       const videoIntervalBytesSent = lastVideoStats.bytesSent - firstVideoStats.bytesSent;
 
       const videoReceivedInterval = lastVideoStats.timestamp - firstVideoStats.timestamp;
@@ -813,13 +833,18 @@ class VideoProvider extends Component {
 
       let videoBitrate;
       if (videoStats.packetsReceived > 0) { // Remote video
-        videoLostPercentage = ((videoStats.packetsLost / ((videoStats.packetsLost + videoStats.packetsReceived)) * 100) || 0).toFixed(1);
+        videoLostPercentage = ((videoStats
+          .packetsLost / ((videoStats
+            .packetsLost + videoStats.packetsReceived) * 100)) || 0).toFixed(1);
         videoBitrate = Math.floor(videoKbitsReceivedPerSecond || 0);
-        videoLostRecentPercentage = ((videoIntervalPacketsLost / ((videoIntervalPacketsLost + videoIntervalPacketsReceived)) * 100) || 0).toFixed(1);
+        videoLostRecentPercentage = ((videoIntervalPacketsLost / ((videoIntervalPacketsLost
+          + videoIntervalPacketsReceived) * 100)) || 0).toFixed(1);
       } else {
-        videoLostPercentage = (((videoStats.packetsLost / (videoStats.packetsLost + videoStats.packetsSent)) * 100) || 0).toFixed(1);
+        videoLostPercentage = (((videoStats.packetsLost / (videoStats.packetsLost
+          + videoStats.packetsSent)) * 100) || 0).toFixed(1);
         videoBitrate = Math.floor(videoKbitsSentPerSecond || 0);
-        videoLostRecentPercentage = ((videoIntervalPacketsLost / ((videoIntervalPacketsLost + videoIntervalPacketsSent) * 100)) || 0).toFixed(1);
+        videoLostRecentPercentage = ((videoIntervalPacketsLost / ((videoIntervalPacketsLost
+          + videoIntervalPacketsSent) * 100)) || 0).toFixed(1);
       }
 
       const result = {
@@ -950,7 +975,7 @@ class VideoProvider extends Component {
     });
     if (message.streamId === userId) {
       this.unshareWebcam();
-      this.notifyError(intl.formatMessage(intlSFUErrors[code]
+      VideoProvider.notifyError(intl.formatMessage(intlSFUErrors[code]
         || intlSFUErrors[2200]));
     } else {
       this.stopWebRTCPeer(message.cameraId);
@@ -959,10 +984,6 @@ class VideoProvider extends Component {
     this.logger('error', `Handle error ---------------------> ${message.message}`, 'video_provider_handle_sfu_error', { message });
   }
 
-  notifyError(message) {
-    notify(message, 'error', 'video');
-  }
-
   shareWebcam() {
     if (this.connectedToMediaServer()) {
       this.logger('info', 'Sharing webcam', 'video_provider_share_webcam');
@@ -984,9 +1005,10 @@ class VideoProvider extends Component {
     const { socketOpen } = this.state;
     if (!socketOpen) return null;
 
-    const { users, enableVideoStats } = this.props;
+    const { users, enableVideoStats, cursor } = this.props;
     return (
       <VideoList
+        cursor={cursor}
         users={users}
         onMount={this.createVideoTag}
         getStats={this.getStats}
diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/container.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/container.jsx
index 2fea564c46643a04980b66aa7d7a0082dc38369a..9cee75901ca36197ce581157b4c309c3c1aa43d6 100755
--- a/bigbluebutton-html5/imports/ui/components/video-provider/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/video-provider/container.jsx
@@ -9,7 +9,8 @@ const VideoProviderContainer = ({ children, ...props }) => {
   return (!users.length ? null : <VideoProvider {...props}>{children}</VideoProvider>);
 };
 
-export default withTracker(() => ({
+export default withTracker(props => ({
+  cursor: props.cursor,
   meetingId: VideoService.meetingId(),
   users: VideoService.getAllUsersVideo(),
   userId: VideoService.userId(),
@@ -17,4 +18,5 @@ export default withTracker(() => ({
   userName: VideoService.userName(),
   enableVideoStats: getFromUserSettings('enableVideoStats', Meteor.settings.public.kurento.enableVideoStats),
   voiceBridge: VideoService.voiceBridge(),
+  onMount: props.onMount,
 }))(VideoProviderContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/video-list/component.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/video-list/component.jsx
index 1fa16e4871a70c18351238a901f9b687916233e0..7a18d9a44344f52e4a4f0f387cc64074180ac2e2 100644
--- a/bigbluebutton-html5/imports/ui/components/video-provider/video-list/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-list/component.jsx
@@ -1,7 +1,6 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl } from 'react-intl';
-import _ from 'lodash';
 import cx from 'classnames';
 import { styles } from './styles';
 import VideoListItem from './video-list-item/component';
@@ -30,97 +29,17 @@ const intlMessages = defineMessages({
 });
 
 // See: https://stackoverflow.com/a/3513565
-const findOptimalGrid = (canvasWidth, canvasHeight, gutter, aspectRatio, numItems, columns = 1) => {
-  const rows = Math.ceil(numItems / columns);
-
-  const gutterTotalWidth = (columns - 1) * gutter;
-  const gutterTotalHeight = (rows - 1) * gutter;
-
-  const usableWidth = canvasWidth - gutterTotalWidth;
-  const usableHeight = canvasHeight - gutterTotalHeight;
-
-  let cellWidth = Math.floor(usableWidth / columns);
-  let cellHeight = Math.ceil(cellWidth / aspectRatio);
-
-  if ((cellHeight * rows) > usableHeight) {
-    cellHeight = Math.floor(usableHeight / rows);
-    cellWidth = Math.ceil(cellHeight * aspectRatio);
-  }
-
-  return {
-    columns,
-    rows,
-    width: (cellWidth * columns) + gutterTotalWidth,
-    height: (cellHeight * rows) + gutterTotalHeight,
-    filledArea: (cellWidth * cellHeight) * numItems,
-  };
-};
-
 class VideoList extends Component {
   constructor(props) {
     super(props);
 
     this.state = {
       focusedId: false,
-      optimalGrid: {
-        cols: 1,
-        rows: 1,
-        filledArea: 0,
-      },
     };
 
     this.ticking = false;
     this.grid = null;
     this.canvas = null;
-    this.handleCanvasResize = _.throttle(this.handleCanvasResize.bind(this), 66);
-    this.setOptimalGrid = this.setOptimalGrid.bind(this);
-  }
-
-  componentDidMount() {
-    this.handleCanvasResize();
-    window.addEventListener('resize', this.handleCanvasResize, false);
-  }
-
-  componentWillUnmount() {
-    window.removeEventListener('resize', this.handleCanvasResize, false);
-  }
-
-  setOptimalGrid() {
-    let numItems = this.props.users.length;
-
-    if (numItems < 1 || !this.canvas || !this.grid) {
-      return;
-    }
-
-    const { focusedId } = this.state;
-    const aspectRatio = 4 / 3;
-    const { width: canvasWidth, height: canvasHeight } = this.canvas.getBoundingClientRect();
-    const gridGutter = parseInt(window.getComputedStyle(this.grid).getPropertyValue('grid-row-gap'), 10);
-
-
-    const hasFocusedItem = numItems > 2 && focusedId;
-
-    // Has a focused item so we need +3 cells
-    if (hasFocusedItem) {
-      numItems += 3;
-    }
-
-    const optimalGrid = _.range(1, numItems + 1).reduce((currentGrid, col) => {
-      const testGrid = findOptimalGrid(
-        canvasWidth, canvasHeight, gridGutter,
-        aspectRatio, numItems, col,
-      );
-
-      // We need a minimun of 2 rows and columns for the focused
-      const focusedConstraint = hasFocusedItem ? testGrid.rows > 1 && testGrid.columns > 1 : true;
-      const betterThanCurrent = testGrid.filledArea > currentGrid.filledArea;
-
-      return focusedConstraint && betterThanCurrent ? testGrid : currentGrid;
-    }, { filledArea: 0 });
-
-    this.setState({
-      optimalGrid,
-    });
   }
 
   handleVideoFocus(id) {
@@ -128,22 +47,12 @@ class VideoList extends Component {
     this.setState({
       focusedId: focusedId !== id ? id : false,
     }, this.handleCanvasResize);
-  }
-
-  handleCanvasResize() {
-    if (!this.ticking) {
-      window.requestAnimationFrame(() => {
-        this.ticking = false;
-        this.setOptimalGrid();
-      });
-    }
-
-    this.ticking = true;
+    window.dispatchEvent(new Event('resize'));
   }
 
   renderVideoList() {
     const {
-      intl, users, onMount, getStats, stopGettingStats, enableVideoStats,
+      intl, users, onMount, getStats, stopGettingStats, enableVideoStats, cursor,
     } = this.props;
     const { focusedId } = this.state;
 
@@ -167,15 +76,15 @@ class VideoList extends Component {
             [styles.videoListItem]: true,
             [styles.focused]: focusedId === user.id && users.length > 2,
           })}
+          style={{
+            cursor,
+          }}
         >
           <VideoListItem
             numOfUsers={users.length}
             user={user}
             actions={actions}
-            onMount={(videoRef) => {
-              this.handleCanvasResize();
-              return onMount(user.id, videoRef);
-            }}
+            onMount={(videoRef) => { onMount(user.id, videoRef); }}
             getStats={(videoRef, callback) => getStats(user.id, videoRef, callback)}
             stopGettingStats={() => stopGettingStats(user.id)}
             enableVideoStats={enableVideoStats}
@@ -187,8 +96,6 @@ class VideoList extends Component {
 
   render() {
     const { users } = this.props;
-    const { optimalGrid } = this.state;
-
     return (
       <div
         ref={(ref) => { this.canvas = ref; }}
@@ -198,12 +105,6 @@ class VideoList extends Component {
           <div
             ref={(ref) => { this.grid = ref; }}
             className={styles.videoList}
-            style={{
-              width: `${optimalGrid.width}px`,
-              height: `${optimalGrid.height}px`,
-              gridTemplateColumns: `repeat(${optimalGrid.columns}, 1fr)`,
-              gridTemplateRows: `repeat(${optimalGrid.rows}, 1fr)`,
-            }}
           >
             {this.renderVideoList()}
           </div>
diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/video-list/styles.scss b/bigbluebutton-html5/imports/ui/components/video-provider/video-list/styles.scss
index 4527df146ab4aa409963a400bc589529b4483e35..56d924289be289e16d098d63e53aeb2d2be63fa6 100755
--- a/bigbluebutton-html5/imports/ui/components/video-provider/video-list/styles.scss
+++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-list/styles.scss
@@ -1,4 +1,6 @@
 @import "/imports/ui/stylesheets/variables/_all";
+@import "/imports/ui/stylesheets/variables/video";
+
 :root {
   --color-white-with-transparency: #ffffff40;
 }
@@ -7,22 +9,33 @@
   --cam-dropdown-width: 70%;
   --audio-indicator-width: 1.12rem;
   --audio-indicator-fs: 75%;
-  position: absolute;
+  position: relative;
+  width: 100%;
   top: 0;
   left: 0;
   right: 0;
   bottom: 0;
-  display: flex;
   align-items: center;
   justify-content: center;
+  min-height: calc(var(--video-width) / var(--video-ratio));
 }
 
 .videoList {
   display: grid;
+  padding: 10px;
+  border-radius: 5px;
+
+  min-height: calc(var(--video-width) / var(--video-ratio));
+
+  grid-template-columns: repeat(auto-fit, var(--video-width));
+  grid-auto-columns: var(--video-width);
+  grid-auto-rows: calc(var(--video-width) / var(--video-ratio));
 
-  grid-auto-flow: dense;
   grid-gap: 5px;
 
+  align-items: center;
+  justify-content: center;
+
   @include mq($medium-up) {
     grid-gap: 10px;
   }
@@ -30,21 +43,39 @@
 
 .videoListItem {
   display: flex;
-  overflow: hidden;
+  max-width: fit-content;
 
   &.focused {
     grid-column: 1 / span 2;
     grid-row: 1 / span 2;
+    width: 100%;
+    min-width: 100%;
+    max-width: 100%;
+    height: 100%;
+    min-height: 100%;
+    max-height: 100%;
   }
+
+  width: var(--video-width);
+  min-width: var(--video-width);
+  height: calc(var(--video-width) / var(--video-ratio));
+  min-height: calc(var(--video-width) / var(--video-ratio));
 }
 
 .content {
   position: relative;
-  display: flex;
   min-width: 100%;
   height: 100%;
+  min-height: 100%;
   border-radius: 5px;
 
+  background-color: var(--color-gray);
+
+  width: var(--video-width);
+  min-width: var(--video-width);
+  height: calc(var(--video-width) / var(--video-ratio));
+  min-height: calc(var(--video-width) / var(--video-ratio));
+
   &::after {
     content: "";
     position: absolute;
@@ -65,9 +96,26 @@
   &.talking::after {
     opacity: 1;
   }
+
+  .focused & {
+    width: 100%;
+    min-width: 100%;
+    max-width: 100%;
+    height: 100%;
+    min-height: 100%;
+    max-height: 100%;
+  }
+}
+
+.contentLoading {
+  width: var(--video-width);
+  min-width: var(--video-width);
+  height: calc(var(--video-width) / var(--video-ratio));
+  min-height: calc(var(--video-width) / var(--video-ratio));
 }
 
 %media-area {
+
   position: relative;
   height: 100%;
   width: 100%;
@@ -76,8 +124,13 @@
 }
 
 @keyframes spin {
-  from { transform: rotate(0deg); }
-  to { transform: rotate(-360deg); }
+  from {
+    transform: rotate(0deg);
+  }
+
+  to {
+    transform: rotate(-360deg);
+  }
 }
 
 .connecting {
@@ -88,13 +141,16 @@
   font-size: 2.5rem;
   text-align: center;
   white-space: nowrap;
+  width: 100%;
+  height: 100%;
+
 
   &::after {
     content: '';
     display: inline-block;
     height: 100%;
     vertical-align: middle;
-    margin:0 -0.25em 0 0;
+    margin: 0 -0.25em 0 0;
 
     [dir="rtl"] & {
       margin: 0 0 0 -0.25em
@@ -102,7 +158,8 @@
   }
 
   &::before {
-    content: "\e949"; /* ascii code for the ellipsis character */
+    content: "\e949";
+    /* ascii code for the ellipsis character */
     font-family: 'bbb-icons' !important;
     display: inline-block;
 
@@ -128,14 +185,15 @@
   z-index: 2;
 }
 
-.dropdown, .dropdownFireFox {
+.dropdown,
+.dropdownFireFox {
   flex: 1;
   display: flex;
   outline: none !important;
   width: var(--cam-dropdown-width);
 
   @include mq($medium-up) {
-    > [aria-expanded] {
+    >[aria-expanded] {
       padding: .25rem;
     }
   }
@@ -145,7 +203,8 @@
   max-width: 100%;
 }
 
-.dropdownTrigger, .userName {
+.dropdownTrigger,
+.userName {
   @extend %text-elipsis;
   position: relative;
   background-color: var(--color-black);
@@ -176,7 +235,7 @@
 
 .dropdownContent {
   min-width: 8.5rem;
-  
+
   [dir="rtl"] & {
     right: 2rem;
   }
@@ -212,7 +271,7 @@
 }
 
 .webRTCStats {
-  background: rgba(0,0,0,0.85);
+  background: rgba(0, 0, 0, 0.85);
   padding: 15px;
   height: 100%;
   color: var(--color-white);
@@ -237,4 +296,4 @@
 
 .voice {
   background-color: var(--color-success);
-}
+}
\ No newline at end of file
diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/video-list/video-list-item/component.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/video-list/video-list-item/component.jsx
index 5a91960a8e2ce15424b3f22caa355f76a5085863..46a1d2b782561425485f8a2cb8a613e211bddb48 100755
--- a/bigbluebutton-html5/imports/ui/components/video-provider/video-list/video-list-item/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-list/video-list-item/component.jsx
@@ -31,15 +31,19 @@ class VideoListItem extends Component {
     this.state = {
       showStats: false,
       stats: { video: {} },
+      videoIsReady: false,
     };
 
     this.toggleStats = this.toggleStats.bind(this);
     this.setStats = this.setStats.bind(this);
+    this.setVideoIsReady = this.setVideoIsReady.bind(this);
   }
 
   componentDidMount() {
     const { onMount } = this.props;
     onMount(this.videoTag);
+
+    this.videoTag.addEventListener('loadeddata', () => this.setVideoIsReady());
   }
 
   componentDidUpdate() {
@@ -72,6 +76,12 @@ class VideoListItem extends Component {
     this.setState({ stats: { ...stats, video, audio } });
   }
 
+  setVideoIsReady() {
+    const { videoIsReady } = this.state;
+    if (!videoIsReady) this.setState({ videoIsReady: true });
+    window.dispatchEvent(new Event('resize'));
+  }
+
   getAvailableActions() {
     const {
       intl,
@@ -118,7 +128,7 @@ class VideoListItem extends Component {
   }
 
   render() {
-    const { showStats, stats } = this.state;
+    const { showStats, stats, videoIsReady } = this.state;
     const { user, numOfUsers } = this.props;
     const availableActions = this.getAvailableActions();
     const enableVideoMenu = Meteor.settings.public.kurento.enableVideoMenu || false;
@@ -130,13 +140,17 @@ class VideoListItem extends Component {
       <div className={cx({
         [styles.content]: true,
         [styles.talking]: user.isTalking,
+        [styles.contentLoading]: !videoIsReady,
       })}
       >
-        <div className={styles.connecting} />
+        {!videoIsReady && <div className={styles.connecting} />}
         <video
-          className={styles.media}
+          muted
+          className={cx({
+            [styles.media]: true,
+            [styles.contentLoading]: !videoIsReady,
+          })}
           ref={(ref) => { this.videoTag = ref; }}
-          muted={user.isCurrent}
           autoPlay
           playsInline
         />
@@ -173,8 +187,12 @@ class VideoListItem extends Component {
           {user.isMuted ? <Icon className={styles.muted} iconName="unmute_filled" /> : null}
           {user.isListenOnly ? <Icon className={styles.voice} iconName="listen" /> : null}
         </div>
-        {showStats ? <VideoListItemStats toggleStats={this.toggleStats} stats={stats} /> : null}
-        {this.renderFullscreenButton()}
+        {
+          showStats
+            ? <VideoListItemStats toggleStats={this.toggleStats} stats={stats} />
+            : null
+        }
+        {videoIsReady && this.renderFullscreenButton()}
       </div>
     );
   }
@@ -189,7 +207,7 @@ VideoListItem.defaultProps = {
 VideoListItem.propTypes = {
   intl: intlShape.isRequired,
   enableVideoStats: PropTypes.bool.isRequired,
-  actions: PropTypes.arrayOf(PropTypes.func).isRequired,
+  actions: PropTypes.arrayOf(PropTypes.object).isRequired,
   user: PropTypes.objectOf(PropTypes.oneOfType([
     PropTypes.bool,
     PropTypes.number,
diff --git a/bigbluebutton-html5/imports/ui/components/waiting-users/component.jsx b/bigbluebutton-html5/imports/ui/components/waiting-users/component.jsx
index 8c5d929f3f9bcf3225a886c9e3a5f72b649c878c..ba9c1272b7efce10e6345dfd0e329cd0d4b890d4 100755
--- a/bigbluebutton-html5/imports/ui/components/waiting-users/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/waiting-users/component.jsx
@@ -216,10 +216,10 @@ const WaitingUsers = (props) => {
             ))
           }
         </div>
-        <div>
-          <label htmlFor="remiderUsersId" className={styles.rememberContainer}>
-            <input id="remiderUsersId" type="checkbox" onChange={onCheckBoxChange} />
-            <p>{intl.formatMessage(intlMessages.rememberChoice)}</p>
+        <div className={styles.rememberContainer}>
+          <input id="rememderCheckboxId" type="checkbox" onChange={onCheckBoxChange} />
+          <label htmlFor="rememderCheckboxId">
+            {intl.formatMessage(intlMessages.rememberChoice)}
           </label>
         </div>
         {renderPendingUsers(
diff --git a/bigbluebutton-html5/imports/ui/components/waiting-users/styles.scss b/bigbluebutton-html5/imports/ui/components/waiting-users/styles.scss
index c5980f39186ed7d2318ffa28d027df83eda6ad19..520adccd9a4979d83da29865db09a489a962d2e5 100644
--- a/bigbluebutton-html5/imports/ui/components/waiting-users/styles.scss
+++ b/bigbluebutton-html5/imports/ui/components/waiting-users/styles.scss
@@ -153,20 +153,20 @@
   width: 100%;
 }
 
-.remenberContainer {
-  margin: 1rem 0;
+.rememberContainer {
+  margin: 1rem 1rem;
   height: 2rem;
   display: flex;
   align-items: center;
-  & > p {
+  & > label {
     height: fit-content;
     padding: 0;
     margin: 0;
-    margin-left: .5rem;
+    margin-left: .7rem;
 
     [dir="rtl"] & {
       margin: 0;
-      margin-right: .5rem;
+      margin-right: .7rem;
     }
   }
-}
\ No newline at end of file
+}
diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/component.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/component.jsx
index 6c0f0c9b862d032d60241a4803f5a02729ffc949..3196c0895b46f49955a246551a37b486a06fb005 100755
--- a/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/component.jsx
@@ -599,7 +599,7 @@ class WhiteboardToolbar extends Component {
                 to={colorSelected.value}
                 begin="indefinite"
                 dur={TRANSITION_DURATION}
-                repeatCount="0"
+                repeatCount="1"
                 fill="freeze"
               />
               <animate
@@ -610,7 +610,7 @@ class WhiteboardToolbar extends Component {
                 to={thicknessSelected.value}
                 begin="indefinite"
                 dur={TRANSITION_DURATION}
-                repeatCount="0"
+                repeatCount="1"
                 fill="freeze"
               />
             </circle>
@@ -692,7 +692,7 @@ class WhiteboardToolbar extends Component {
                 to={colorSelected.value}
                 begin="indefinite"
                 dur={TRANSITION_DURATION}
-                repeatCount="0"
+                repeatCount="1"
                 fill="freeze"
               />
             </rect>
diff --git a/bigbluebutton-html5/imports/ui/services/audio-manager/index.js b/bigbluebutton-html5/imports/ui/services/audio-manager/index.js
index 740fc59d84e4d17d1615a70896d4d92556898120..23e0201a875f7c6b2aaf6d983244874858c6350e 100755
--- a/bigbluebutton-html5/imports/ui/services/audio-manager/index.js
+++ b/bigbluebutton-html5/imports/ui/services/audio-manager/index.js
@@ -310,7 +310,7 @@ class AudioManager {
         this.onAudioJoin();
         resolve(STARTED);
       } else if (status === ENDED) {
-        logger.debug({ logCode: 'audio_ended' }, 'Audio ended without issue');
+        logger.info({ logCode: 'audio_ended' }, 'Audio ended without issue');
         this.onAudioExit();
       } else if (status === FAILED) {
         const errorKey = this.messages.error[error] || this.messages.error.GENERIC_ERROR;
diff --git a/bigbluebutton-html5/imports/ui/services/auth/index.js b/bigbluebutton-html5/imports/ui/services/auth/index.js
index 2113b849a965bf79b0ff13945dd3903e8beacc6a..700b8839e062e1f9c8bbf0f8556276a4634ddb0c 100755
--- a/bigbluebutton-html5/imports/ui/services/auth/index.js
+++ b/bigbluebutton-html5/imports/ui/services/auth/index.js
@@ -200,7 +200,6 @@ class Auth {
     return new Promise((resolve, reject) => {
       Meteor.connection.setUserId(`${this.meetingID}-${this.userID}`);
       let computation = null;
-      let currentUserHandler = null;
 
       const validationTimeout = setTimeout(() => {
         computation.stop();
@@ -212,10 +211,7 @@ class Auth {
 
       Tracker.autorun((c) => {
         computation = c;
-
-        if (!currentUserHandler) {
-          currentUserHandler = Meteor.subscribe('current-user', this.credentials);
-        }
+        Meteor.subscribe('current-user', this.credentials);
 
         const selector = { meetingId: this.meetingID, userId: this.userID };
         const User = Users.findOne(selector);
diff --git a/bigbluebutton-html5/imports/ui/services/user/mapUser.js b/bigbluebutton-html5/imports/ui/services/user/mapUser.js
index 435e907a41bcbf11ef84a372b840673ca75204e6..656914ef08f4a2163b59fc75a3d3e160725261b7 100755
--- a/bigbluebutton-html5/imports/ui/services/user/mapUser.js
+++ b/bigbluebutton-html5/imports/ui/services/user/mapUser.js
@@ -33,6 +33,7 @@ const mapUser = (user) => {
     loginTime: user.loginTime,
     effectiveConnectionType: user.effectiveConnectionType,
     externalUserId: user.extId,
+    isBreakoutUser: user.breakoutProps.isBreakoutUser,
   };
 
   mappedUser.isLocked = user.locked && !(mappedUser.isPresenter || mappedUser.isModerator);
diff --git a/bigbluebutton-html5/imports/ui/stylesheets/variables/video.scss b/bigbluebutton-html5/imports/ui/stylesheets/variables/video.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c524e6ae29984ca6c66fb1949ee06ece67358bf0
--- /dev/null
+++ b/bigbluebutton-html5/imports/ui/stylesheets/variables/video.scss
@@ -0,0 +1,13 @@
+@import "../../stylesheets/variables/_all";
+
+:root {
+  --video-width: 10vw;
+  --video-ratio: calc(4 / 3);
+}
+
+
+@include mq($small-only) {
+  :root {
+    --video-width: 20vw;
+  }
+}
\ No newline at end of file
diff --git a/bigbluebutton-html5/imports/utils/sdpUtils.js b/bigbluebutton-html5/imports/utils/sdpUtils.js
index 454c905ca18536914b6c4449dc9e42b448b550e0..a079f0e8cb837d99d3cf0283ffd69561924a9bcc 100644
--- a/bigbluebutton-html5/imports/utils/sdpUtils.js
+++ b/bigbluebutton-html5/imports/utils/sdpUtils.js
@@ -1,5 +1,5 @@
-import Interop from '@jitsi/sdp-interop'
-import transform from 'sdp-transform'
+import Interop from '@jitsi/sdp-interop';
+import transform from 'sdp-transform';
 import logger from '/imports/startup/client/logger';
 
 // sdp-interop library for unified-plan <-> plan-b translation
@@ -8,9 +8,7 @@ const interop = new Interop.Interop();
 // Some heuristics to determine if the input SDP is Unified Plan
 const isUnifiedPlan = (sdp) => {
   const parsedSDP = transform.parse(sdp);
-  if (parsedSDP.media.length <= 3 && parsedSDP.media.every((m) => {
-    return ['video', 'audio', 'data'].indexOf(m.mid) !== -1;
-  })) {
+  if (parsedSDP.media.length <= 3 && parsedSDP.media.every(m => ['video', 'audio', 'data'].indexOf(m.mid) !== -1)) {
     logger.info({ logCode: 'sdp_utils_not_unified_plan' }, 'SDP does not look like Unified Plan');
     return false;
   }
@@ -18,14 +16,12 @@ const isUnifiedPlan = (sdp) => {
   logger.info({ logCode: 'sdp_utils_is_unified_plan' }, 'SDP looks like Unified Plan');
 
   return true;
-}
+};
 
 // Some heuristics to determine if the input SDP is Plan B
 const isPlanB = (sdp) => {
   const parsedSDP = transform.parse(sdp);
-  if (parsedSDP.media.length > 3 || !parsedSDP.media.every((m) => {
-    return ['video', 'audio', 'data'].indexOf(m.mid) !== -1;
-  })) {
+  if (parsedSDP.media.length > 3 || !parsedSDP.media.every(m => ['video', 'audio', 'data'].indexOf(m.mid) !== -1)) {
     logger.info({ logCode: 'sdp_utils_not_plan_b' }, 'SDP does not look like Plan B');
     return false;
   }
@@ -33,7 +29,7 @@ const isPlanB = (sdp) => {
   logger.info({ logCode: 'sdp_utils_is_plan_b' }, 'SDP looks like Plan B');
 
   return true;
-}
+};
 
 
 // Specific method for translating FS SDPs from Plan B to Unified Plan (vice-versa)
@@ -41,12 +37,32 @@ const toPlanB = (unifiedPlanSDP) => {
   const planBSDP = interop.toPlanB(unifiedPlanSDP);
   logger.info({ logCode: 'sdp_utils_unified_plan_to_plan_b' }, `Converted Unified Plan to Plan B ${JSON.stringify(planBSDP)}`);
   return planBSDP;
-}
+};
 
 const toUnifiedPlan = (planBSDP) => {
   const unifiedPlanSDP = interop.toUnifiedPlan(planBSDP);
   logger.info({ logCode: 'sdp_utils_plan_b_to_unified_plan' }, `Converted Plan B to Unified Plan ${JSON.stringify(unifiedPlanSDP)}`);
   return unifiedPlanSDP;
-}
+};
 
-export { interop, isUnifiedPlan, toPlanB, toUnifiedPlan };
+const stripMDnsCandidates = (sdp) => {
+  const parsedSDP = transform.parse(sdp);
+  let strippedCandidates = 0;
+  parsedSDP.media.forEach((media) => {
+    media.candidates = media.candidates.filter((candidate) => {
+      if (candidate.ip && candidate.ip.indexOf('.local') === -1) {
+        return true;
+      }
+      strippedCandidates += 1;
+      return false;
+    });
+  });
+  if (strippedCandidates > 0) {
+    logger.info({ logCode: 'sdp_utils_mdns_candidate_strip' }, `Stripped ${strippedCandidates} mDNS candidates`);
+  }
+  return transform.write(parsedSDP);
+};
+
+export {
+  interop, isUnifiedPlan, toPlanB, toUnifiedPlan, stripMDnsCandidates,
+};
diff --git a/bigbluebutton-html5/package-lock.json b/bigbluebutton-html5/package-lock.json
index d4ddff00407ce4ae3b0a85b9c8df4ac57c15c219..25db4498cf3fc19647d63d3e14871b60d692048d 100644
--- a/bigbluebutton-html5/package-lock.json
+++ b/bigbluebutton-html5/package-lock.json
@@ -139,7 +139,7 @@
         },
         "chalk": {
           "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
           "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
           "dev": true,
           "requires": {
@@ -466,6 +466,12 @@
       "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
       "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI="
     },
+    "async-limiter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+      "dev": true
+    },
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -526,19 +532,12 @@
       "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
     },
     "axios": {
-      "version": "0.18.0",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
-      "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
+      "version": "0.19.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
+      "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
       "requires": {
-        "follow-redirects": "^1.3.0",
-        "is-buffer": "^1.1.5"
-      },
-      "dependencies": {
-        "is-buffer": {
-          "version": "1.1.6",
-          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-          "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
-        }
+        "follow-redirects": "1.5.10",
+        "is-buffer": "^2.0.2"
       }
     },
     "axobject-query": {
@@ -653,7 +652,7 @@
     },
     "bl": {
       "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
+      "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
       "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
       "dev": true,
       "requires": {
@@ -831,7 +830,7 @@
       "dependencies": {
         "callsites": {
           "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+          "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
           "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
           "dev": true
         }
@@ -912,6 +911,24 @@
       "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
       "dev": true
     },
+    "chrome-remote-interface": {
+      "version": "0.25.7",
+      "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.25.7.tgz",
+      "integrity": "sha512-6zI6LbR2IiGmduFZededaerEr9hHXabxT/L+fRrdq65a0CfyLMzpq0BKuZiqN0Upqcacsb6q2POj7fmobwBsEA==",
+      "dev": true,
+      "requires": {
+        "commander": "2.11.x",
+        "ws": "3.3.x"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.11.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+          "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+          "dev": true
+        }
+      }
+    },
     "ci-info": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
@@ -1491,7 +1508,7 @@
     },
     "enabled": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz",
+      "resolved": "http://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz",
       "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=",
       "requires": {
         "env-variable": "0.0.x"
@@ -2095,7 +2112,7 @@
     },
     "fecha": {
       "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
+      "resolved": "http://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
       "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg=="
     },
     "fibers": {
@@ -2196,25 +2213,20 @@
       "dev": true
     },
     "follow-redirects": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz",
-      "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==",
+      "version": "1.5.10",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
+      "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
       "requires": {
-        "debug": "^3.2.6"
+        "debug": "=3.1.0"
       },
       "dependencies": {
         "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
           "requires": {
-            "ms": "^2.1.1"
+            "ms": "2.0.0"
           }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
         }
       }
     },
@@ -2412,7 +2424,7 @@
     },
     "globby": {
       "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+      "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
       "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
       "dev": true,
       "requires": {
@@ -3245,6 +3257,12 @@
       "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
       "dev": true
     },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -3266,6 +3284,22 @@
       "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
       "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
     },
+    "jasmine": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.4.0.tgz",
+      "integrity": "sha512-sR9b4n+fnBFDEd7VS2el2DeHgKcPiMVn44rtKFumq9q7P/t8WrxsVIZPob4UDdgcDNCwyDqwxCt4k9TDRmjPoQ==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3",
+        "jasmine-core": "~3.4.0"
+      }
+    },
+    "jasmine-core": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz",
+      "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==",
+      "dev": true
+    },
     "jimp": {
       "version": "0.2.28",
       "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz",
@@ -3568,7 +3602,7 @@
         },
         "chalk": {
           "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
           "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
           "dev": true,
           "requires": {
@@ -4577,6 +4611,15 @@
         }
       }
     },
+    "node-netstat": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/node-netstat/-/node-netstat-1.6.0.tgz",
+      "integrity": "sha512-KPDopkvPllhcILoHMWYUxvOO5c+VcPB38LxlOFPiZhZ/hJTMH/GXGCs6nvxu4d6unwsbEfgzJ4pPye3CFv9yTg==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
     "node-releases": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.1.tgz",
@@ -4689,7 +4732,7 @@
     },
     "npm-install-package": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz",
+      "resolved": "http://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz",
       "integrity": "sha1-1+/jz816sAYUuJbqUxGdyaslkSU=",
       "dev": true
     },
@@ -4872,7 +4915,7 @@
       "dependencies": {
         "minimist": {
           "version": "0.0.10",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
           "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
           "dev": true
         },
@@ -5448,6 +5491,15 @@
         "scheduler": "^0.13.1"
       }
     },
+    "react-draggable": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.1.1.tgz",
+      "integrity": "sha512-tqIgDUm4XPSFbxelYpcsnayPU79P26ChnszDl5/RDFKfMuHnRxypS+OFfEyAEO1CtqaB3lrecQ2dyNIE2G0TlQ==",
+      "requires": {
+        "classnames": "^2.2.5",
+        "prop-types": "^15.6.0"
+      }
+    },
     "react-dropzone": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-7.0.1.tgz",
@@ -5913,7 +5965,7 @@
     },
     "safe-regex": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
       "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
       "dev": true,
       "requires": {
@@ -6744,6 +6796,12 @@
       "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
       "dev": true
     },
+    "ultron": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+      "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+      "dev": true
+    },
     "union-value": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
@@ -6928,12 +6986,34 @@
         "loose-envify": "^1.0.0"
       }
     },
+    "wdio-devtools-service": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/wdio-devtools-service/-/wdio-devtools-service-0.1.6.tgz",
+      "integrity": "sha512-6SpiFf7QcBmUINV63ezgahpohH00NG6MpEm5OkWQrtAmqUOkFxQvpAk2pGk/4JdXXoj5s/AeSF6v5ILa8IxLTA==",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "chrome-remote-interface": "^0.25.3",
+        "node-netstat": "^1.4.2"
+      }
+    },
     "wdio-dot-reporter": {
       "version": "0.0.10",
       "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz",
       "integrity": "sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg==",
       "dev": true
     },
+    "wdio-jasmine-framework": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/wdio-jasmine-framework/-/wdio-jasmine-framework-0.3.8.tgz",
+      "integrity": "sha512-oOM/h8HcXdmbFEZcm2Cm3rKxaz9o0KDk7pMwJ3Coqk29qDUwaUChZHrF3L1ls1mTxL28o5q8ad+Fbm6d4Kzdvg==",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "jasmine": "^3.3.0",
+        "wdio-sync": "0.7.3"
+      }
+    },
     "wdio-junit-reporter": {
       "version": "0.4.4",
       "resolved": "https://registry.npmjs.org/wdio-junit-reporter/-/wdio-junit-reporter-0.4.4.tgz",
@@ -6973,6 +7053,17 @@
         "humanize-duration": "~3.15.0"
       }
     },
+    "wdio-sync": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/wdio-sync/-/wdio-sync-0.7.3.tgz",
+      "integrity": "sha512-ukASSHOQmOxaz5HTILR0jykqlHBtAPsBpMtwhpiG0aW9uc7SO7PF+E5LhVvTG4ypAh+UGmY3rTjohOsqDr39jw==",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "fibers": "^3.0.0",
+        "object.assign": "^4.0.3"
+      }
+    },
     "wdio-visual-regression-service": {
       "version": "0.9.0",
       "resolved": "https://registry.npmjs.org/wdio-visual-regression-service/-/wdio-visual-regression-service-0.9.0.tgz",
@@ -6990,9 +7081,9 @@
       }
     },
     "webdriver-manager": {
-      "version": "12.1.1",
-      "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.1.tgz",
-      "integrity": "sha512-L9TEQmZs6JbMMRQI1w60mfps265/NCr0toYJl7p/R2OAk6oXAfwI6jqYP7EWae+d7Ad2S2Aj4+rzxoSjqk3ZuA==",
+      "version": "12.1.4",
+      "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.4.tgz",
+      "integrity": "sha512-aNUzdimlHSl3EotUTdE2QwP9sBUjZgWPCy8C+m1wMmF9jBDKuO/24nnpr2O25Db8dYtsjvj9drPTpSIGqRrNnQ==",
       "dev": true,
       "requires": {
         "adm-zip": "^0.4.9",
@@ -7016,7 +7107,7 @@
         },
         "chalk": {
           "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
           "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
           "dev": true,
           "requires": {
@@ -7044,7 +7135,7 @@
         },
         "globby": {
           "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+          "resolved": "http://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
           "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
           "dev": true,
           "requires": {
@@ -7114,7 +7205,7 @@
         },
         "external-editor": {
           "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+          "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
           "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
           "dev": true,
           "requires": {
@@ -7274,6 +7365,17 @@
         "mkdirp": "^0.5.1"
       }
     },
+    "ws": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+      "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+      "dev": true,
+      "requires": {
+        "async-limiter": "~1.0.0",
+        "safe-buffer": "~5.1.0",
+        "ultron": "~1.1.0"
+      }
+    },
     "xhr": {
       "version": "2.5.0",
       "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz",
diff --git a/bigbluebutton-html5/package.json b/bigbluebutton-html5/package.json
index 406f8121a9c349e9d0b42c62cb592ae7f1875e79..9d5a95055bb37c3a521e0072ec773c083e611154 100755
--- a/bigbluebutton-html5/package.json
+++ b/bigbluebutton-html5/package.json
@@ -9,7 +9,7 @@
     "generate-refs-visual-regression-desktop": "rm -rf tests/webdriverio/screenshots; npm run test-visual-regression-desktop",
     "start:prod": "meteor reset && ROOT_URL=http://127.0.0.1/html5client NODE_ENV=production meteor --production",
     "start:dev": "ROOT_URL=http://127.0.0.1/html5client NODE_ENV=development meteor",
-    "test": "jest",
+    "test": "wdio ./tests/webdriverio/wdio.conf.js",
     "lint": "eslint . --ext .jsx,.js"
   },
   "meteor": {
@@ -28,6 +28,7 @@
     }
   },
   "dependencies": {
+    "axios": "^0.19.0",
     "@babel/runtime": "^7.3.1",
     "@browser-bunyan/server-stream": "^1.5.0",
     "autoprefixer": "~9.3.1",
@@ -55,6 +56,7 @@
     "react-autosize-textarea": "^5.0.1",
     "react-color": "^2.17.0",
     "react-dom": "^16.8.1",
+    "react-draggable": "^3.1.1",
     "react-dropzone": "^7.0.1",
     "react-intl": "~2.7.2",
     "react-modal": "~3.6.1",
@@ -72,7 +74,6 @@
     "tippy.js": "^3.4.1",
     "useragent": "^2.3.0",
     "winston": "^3.2.1",
-    "axios": "^0.18.0",
     "yaml": "^1.3.2"
   },
   "devDependencies": {
@@ -89,10 +90,12 @@
     "postcss-modules-local-by-default": "1.2.0",
     "postcss-modules-scope": "1.1.0",
     "postcss-modules-values": "1.3.0",
+    "wdio-devtools-service": "^0.1.6",
+    "wdio-jasmine-framework": "^0.3.8",
     "wdio-junit-reporter": "~0.4.4",
     "wdio-spec-reporter": "^0.1.5",
     "wdio-visual-regression-service": "~0.9.0",
-    "webdriver-manager": "^12.1.1",
+    "webdriver-manager": "^12.1.4",
     "webdriverio": "^4.14.2"
   },
   "cssModules": {
diff --git a/bigbluebutton-html5/private/config/settings.yml b/bigbluebutton-html5/private/config/settings.yml
index 8c45ed80c8d2ccb5f53ace925adf8f85f3862704..9951e506b1782c9ea3b48be3b1bd0b803e6a3e4d 100755
--- a/bigbluebutton-html5/private/config/settings.yml
+++ b/bigbluebutton-html5/private/config/settings.yml
@@ -358,4 +358,4 @@ private:
     - browser: safari
       version: [11, 1]
     - browser: electron
-      version: [0, 36]
\ No newline at end of file
+      version: [0, 36]
diff --git a/bigbluebutton-html5/private/locales/ar.json b/bigbluebutton-html5/private/locales/ar.json
index cb5d3753813ce4ca5ed3ccd84d3a3b9d7e15499f..df6405fb84ffd8d30a5c6026bab9dc326d01bfa7 100644
--- a/bigbluebutton-html5/private/locales/ar.json
+++ b/bigbluebutton-html5/private/locales/ar.json
@@ -19,6 +19,11 @@
     "app.chat.offline": "غير متصل",
     "app.chat.emptyLogLabel": "سجل دردشة فارغة",
     "app.chat.clearPublicChatMessage": "تم مسح تاريخ الدردشة من قبل المشرف",
+    "app.captions.menu.close": "غلق",
+    "app.captions.menu.backgroundColor": "لون الخلفية",
+    "app.captions.menu.cancelLabel": "إلغاء",
+    "app.captions.pad.tip": "اضغط المفتاح Esc للتركيز علي شريط أدوات المحرر",
+    "app.captions.pad.ownership": "التملك",
     "app.note.title": "ملاحظات مشتركة",
     "app.note.label": "ملاحظة",
     "app.note.hideNoteLabel": "إخفاء الملاحظة",
@@ -107,8 +112,7 @@
     "app.presentation.presentationToolbar.fitToPage": "المناسبة للصفحة",
     "app.presentation.presentationToolbar.goToSlide": "شريحة {0}",
     "app.presentationUploder.title": "عرض",
-    "app.presentationUploder.message": "كمقدم في BigBlueButton ، لديك القدرة على رفع أي مستند مكتب أو ملف PDF. نوصي بتحميل ملف PDF للحصول على أفضل نتائج.",
-    "app.presentationUploder.confirmLabel": "رفع",
+    "app.presentationUploder.uploadLabel": "رفع",
     "app.presentationUploder.confirmDesc": "حفظ التغييرات وبدء العرض",
     "app.presentationUploder.dismissLabel": "إلغاء",
     "app.presentationUploder.dismissDesc": "أغلق النافذة الشتراطية وتجاهل التغييرات",
@@ -119,7 +123,6 @@
     "app.presentationUploder.fileToUpload": "وسيتم رفعها ...",
     "app.presentationUploder.currentBadge": "حالي",
     "app.presentationUploder.genericError": "عفوا، حدث خطأ ما",
-    "app.presentationUploder.rejectedError": "بعض الملفات المختارة تم رفضها. الرجاء التأكد من نوع الملف",
     "app.presentationUploder.upload.progress": "رفع ({0}٪)",
     "app.presentationUploder.upload.413": "الملف كبير جدا",
     "app.presentationUploder.conversion.conversionProcessingSlides": "معالجة الصفحة {0} من {1}",
@@ -162,6 +165,15 @@
     "app.poll.a3": "أ / ب / ج",
     "app.poll.a4": "أ / ب / ج / د",
     "app.poll.a5": "أ / ب / ج / د / ه",
+    "app.poll.answer.true": "صواب",
+    "app.poll.answer.false": "خطأ",
+    "app.poll.answer.yes": "نعم",
+    "app.poll.answer.no": "لا",
+    "app.poll.answer.a": "Ø£",
+    "app.poll.answer.b": "ب",
+    "app.poll.answer.c": "ج",
+    "app.poll.answer.d": "د",
+    "app.poll.answer.e": "Ù‡",
     "app.poll.liveResult.usersTitle": "المستخدمون",
     "app.poll.liveResult.responsesTitle": "الإجابة",
     "app.polling.pollingTitle": "خيارات التصويت",
@@ -223,6 +235,7 @@
     "app.submenu.application.fontSizeControlLabel": "حجم الخط",
     "app.submenu.application.increaseFontBtnLabel": "زيادة حجم خط التطبيق",
     "app.submenu.application.decreaseFontBtnLabel": "تقليص حجم خط التطبيق",
+    "app.submenu.application.currentSize": "حاليا {0}",
     "app.submenu.application.languageLabel": "لغة التطبيق",
     "app.submenu.application.ariaLanguageLabel": "تغيير لغة التطبيق",
     "app.submenu.application.languageOptionLabel": "اختيار اللغة",
@@ -236,18 +249,6 @@
     "app.submenu.video.videoQualityLabel": "جودة الفيديو",
     "app.submenu.video.qualityOptionLabel": "اختيار جودة الفيديو",
     "app.submenu.video.participantsCamLabel": "عرض كاميرات ويب المشاركين ",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "التعليقات",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "التملك",
-    "app.submenu.closedCaptions.languageLabel": "لغة",
-    "app.submenu.closedCaptions.localeOptionLabel": "اختيار اللغة",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "لا توجد لغات نشطة",
-    "app.submenu.closedCaptions.fontFamilyLabel": "نوع الخط",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "اختيار نوع الخط",
-    "app.submenu.closedCaptions.fontSizeLabel": "حجم الخط",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "اختيار حجم الخط",
-    "app.submenu.closedCaptions.backgroundColorLabel": "لون الخلفية",
-    "app.submenu.closedCaptions.fontColorLabel": "لون الخط",
-    "app.submenu.closedCaptions.noLocaleSelected": "لم يتم اختيار لغة",
     "app.submenu.participants.muteAllLabel": "كتم الكل باستثناء المقدم",
     "app.submenu.participants.lockAllLabel": "اقفل جميع المشاهدين",
     "app.submenu.participants.lockItemLabel": "المشاهدون {0}",
@@ -269,7 +270,6 @@
     "app.settings.applicationTab.label": "التطبيق",
     "app.settings.audioTab.label": "الصوت",
     "app.settings.videoTab.label": "فيديو",
-    "app.settings.closedcaptionTab.label": "التعليقات",
     "app.settings.usersTab.label": "المشاركون",
     "app.settings.main.label": "الإعدادات",
     "app.settings.main.cancel.label": "إلغاء",
@@ -339,7 +339,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "تم قفل صوت المشاهدين، حيث يتم اتصالك بالاستماع فقط",
     "app.breakoutJoinConfirmation.title": "انضم إلى الغرفة المفرقة",
     "app.breakoutJoinConfirmation.message": "هل تود الانضمام",
-    "app.breakoutJoinConfirmation.confirmLabel": "انضم",
     "app.breakoutJoinConfirmation.confirmDesc": "انضم إليكم إلى الغرفة المفرقة",
     "app.breakoutJoinConfirmation.dismissLabel": "إلغاء",
     "app.breakoutJoinConfirmation.dismissDesc": "يغلق ويرفض الانضمام إلى الغرفة المفرقة",
@@ -405,6 +404,7 @@
     "app.modal.close": "غلق",
     "app.modal.close.description": "تجاهل التغييرات و غلق النافذة",
     "app.modal.confirm": "تم",
+    "app.modal.newTab": "(فتح علامة تبويب جديدة)",
     "app.modal.confirm.description": "حفظ التغييرات وغلق النافذة",
     "app.dropdown.close": "غلق",
     "app.error.400": "طلب خاطئ",
@@ -593,16 +593,21 @@
     "app.createBreakoutRoom.freeJoin": "السماح للمستخدمين باختيار الغرفة المفرقة الذين يودون الالتحاق بها",
     "app.createBreakoutRoom.leastOneWarnBreakout": "يجب وضع مستخدم واحد علي الأقل في غرفة مفرقة.",
     "app.createBreakoutRoom.modalDesc": "أكمل الخطوات التالية لإنشاء غرف في جلستك ، لأضافة مشاركين إلى غرفة.",
+    "app.createBreakoutRoom.roomTime": "{0} دقيقة",
     "app.externalVideo.start": "مشاركة فيديو جديد",
     "app.externalVideo.title": "مشاركة فيديو YouTube",
     "app.externalVideo.input": "رابط الفيديو YouTube",
     "app.externalVideo.urlInput": "إضافة فيديو YouTube",
     "app.externalVideo.urlError": "الرايط ليس فيديو YouTube صالح",
     "app.externalVideo.close": "غلق",
+    "app.network.connection.effective.slow": "نلاحظ مشاكل في الاتصال",
+    "app.network.connection.effective.slow.help": "كيفية إصلاحه؟",
     "app.externalVideo.noteLabel": "ملاحظة: لن تظهر مقاطع فيديو YouTube المشتركة في التسجيل",
     "app.actionsBar.actionsDropdown.shareExternalVideo": "مشاركة فيديو YouTube",
     "app.actionsBar.actionsDropdown.stopShareExternalVideo": "إيقاف مشاركة فيديو YouTube",
     "app.iOSWarning.label": "يرجى الترقية إلى iOS 12.2 أو اعلى",
     "app.legacy.unsupportedBrowser": "يبدو انك تستخدم مستعرضا غير معتمد. الرجاء استخدام {0} أو {1} للحصول علي الدعم الكامل.",
     "app.legacy.upgradeBrowser": "يبدو انك تستخدم إصدارا قديما من مستعرض معتمد. الرجاء ترقيه المتصفح للحصول علي الدعم الكامل."
+
 }
+
diff --git a/bigbluebutton-html5/private/locales/bg_BG.json b/bigbluebutton-html5/private/locales/bg_BG.json
index ff8b310b967db17bd3818a29c437bd4924455dfd..cd690caabc554d020079f72302bee2857790eb0c 100644
--- a/bigbluebutton-html5/private/locales/bg_BG.json
+++ b/bigbluebutton-html5/private/locales/bg_BG.json
@@ -12,6 +12,10 @@
     "app.chat.dropdown.save": "Save",
     "app.chat.label": "Chat",
     "app.chat.emptyLogLabel": "Chat log empty",
+    "app.captions.menu.close": "Close",
+    "app.captions.menu.backgroundColor": "Background color",
+    "app.captions.menu.cancelLabel": "Cancel",
+    "app.captions.pad.ownership": "Take ownership",
     "app.userList.usersTitle": "Потребители",
     "app.userList.participantsTitle": "Participants",
     "app.userList.messagesTitle": "Съобщения",
@@ -81,14 +85,6 @@
     "app.submenu.video.videoOptionLabel": "Choose view source",
     "app.submenu.video.qualityOptionLabel": "Choose the video quality",
     "app.submenu.video.participantsCamLabel": "Viewing participants webcams",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Take ownership",
-    "app.submenu.closedCaptions.languageLabel": "Language",
-    "app.submenu.closedCaptions.localeOptionLabel": "Choose language",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "No active locales",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Font family",
-    "app.submenu.closedCaptions.fontSizeLabel": "Font size",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Background color",
-    "app.submenu.closedCaptions.fontColorLabel": "Font color",
     "app.submenu.participants.muteAllLabel": "Mute all except the presenter",
     "app.submenu.participants.lockMicAriaLabel": "Microphone lock",
     "app.submenu.participants.lockCamAriaLabel": "Webcam lock",
@@ -138,7 +134,6 @@
     "app.audioNotification.audioFailedMessage": "Your audio connection failed to connect",
     "app.audioNotification.closeLabel": "Close",
     "app.breakoutJoinConfirmation.message": "Do you want to join",
-    "app.breakoutJoinConfirmation.confirmLabel": "Join",
     "app.breakoutJoinConfirmation.dismissLabel": "Cancel",
     "app.audioModal.microphoneLabel": "Microphone",
     "app.audioModal.audioChoiceLabel": "How would you like to join the audio?",
diff --git a/bigbluebutton-html5/private/locales/cs_CZ.json b/bigbluebutton-html5/private/locales/cs_CZ.json
index 012eaf11f8033326bd41d83fcb6411e9170669e6..b0c68eb82fc48fd31f7145197f660da3125cd303 100644
--- a/bigbluebutton-html5/private/locales/cs_CZ.json
+++ b/bigbluebutton-html5/private/locales/cs_CZ.json
@@ -18,6 +18,11 @@
     "app.chat.label": "Chat",
     "app.chat.emptyLogLabel": "Log chatu je prázdný",
     "app.chat.clearPublicChatMessage": "Historie chatu byla smazána moderátorem",
+    "app.captions.menu.close": "Zavřít",
+    "app.captions.menu.start": "Start",
+    "app.captions.menu.backgroundColor": "Barva pozadí",
+    "app.captions.menu.cancelLabel": "Zrušit",
+    "app.captions.pad.ownership": "Převzít kontrolu nad titulky",
     "app.note.title": "Sdílené poznámky",
     "app.note.label": "Poznámka",
     "app.note.hideNoteLabel": "Schovat poznámky",
@@ -96,7 +101,6 @@
     "app.presentationUploder.fileToUpload": "K nahrávání...",
     "app.presentationUploder.currentBadge": "Aktuální",
     "app.presentationUploder.genericError": "O ou, něco se nepovedlo.",
-    "app.presentationUploder.rejectedError": "Některé z vybraných souborů byly odmítnuty. Prosím zkontrolujte typ souborů (mime).",
     "app.presentationUploder.upload.progress": "Nahrávání ({0}%)",
     "app.presentationUploder.conversion.conversionProcessingSlides": "Zpracovávám stránku {0} z {1}",
     "app.presentationUploder.conversion.genericConversionStatus": "Zpracování souboru...",
@@ -124,6 +128,8 @@
     "app.poll.a3": "A / B / C",
     "app.poll.a4": "A / B / C / D",
     "app.poll.a5": "A / B / C / D / E",
+    "app.poll.answer.yes": "Ano, ukončit",
+    "app.poll.answer.no": "Ne",
     "app.poll.liveResult.usersTitle": "Uživatelé",
     "app.poll.liveResult.responsesTitle": "Odpověď",
     "app.polling.pollingTitle": "Možnosti hlasování",
@@ -194,18 +200,6 @@
     "app.submenu.video.videoQualityLabel": "Kvalita videa",
     "app.submenu.video.qualityOptionLabel": "Vyberte kvalitu videa",
     "app.submenu.video.participantsCamLabel": "Webkamery účastníků",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "Titulky",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Převzít kontrolu nad titulky",
-    "app.submenu.closedCaptions.languageLabel": "Jazyk",
-    "app.submenu.closedCaptions.localeOptionLabel": "Vyberte jazyk",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "Žádné jazyky k dispozici",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Písmo",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "Zvolte rodinu písma",
-    "app.submenu.closedCaptions.fontSizeLabel": "Velikost písma",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "Zvolte velikost písma",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Barva pozadí",
-    "app.submenu.closedCaptions.fontColorLabel": "Barva písma",
-    "app.submenu.closedCaptions.noLocaleSelected": "Nevybrán žádný jazyk",
     "app.submenu.participants.muteAllLabel": "Ztlumit všechny kromě přednášejícího",
     "app.submenu.participants.lockAllLabel": "Uzamknout všechny posluchače",
     "app.submenu.participants.lockItemLabel": "Posluchači {0}",
@@ -227,7 +221,6 @@
     "app.settings.applicationTab.label": "Aplikace",
     "app.settings.audioTab.label": "Audio",
     "app.settings.videoTab.label": "Video",
-    "app.settings.closedcaptionTab.label": "Titulky",
     "app.settings.usersTab.label": "Účastníci",
     "app.settings.main.label": "Nastavení",
     "app.settings.main.cancel.label": "Zrušit",
@@ -292,7 +285,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "Použití mikrofonu pro posluchače je uzamčeno, jste proto připojováni pouze pro poslech",
     "app.breakoutJoinConfirmation.title": "Připojit se do vedlejší místnosti",
     "app.breakoutJoinConfirmation.message": "Chcete se připojit",
-    "app.breakoutJoinConfirmation.confirmLabel": "Připojit",
     "app.breakoutJoinConfirmation.confirmDesc": "Připojit se do vedlejší místnosti",
     "app.breakoutJoinConfirmation.dismissLabel": "Zrušit",
     "app.breakoutJoinConfirmation.dismissDesc": "Zavřít a nepřipojovat se do vedlejší místnosti",
diff --git a/bigbluebutton-html5/private/locales/de.json b/bigbluebutton-html5/private/locales/de.json
index 0c40ab6f14408c32a894aec385b51fd801663097..5dc5cb731757928975193968b0271f96d573b0ec 100644
--- a/bigbluebutton-html5/private/locales/de.json
+++ b/bigbluebutton-html5/private/locales/de.json
@@ -16,8 +16,23 @@
     "app.chat.dropdown.copy": "Kopieren",
     "app.chat.dropdown.save": "Speichern",
     "app.chat.label": "Chat",
+    "app.chat.offline": "Offline",
     "app.chat.emptyLogLabel": "Chat-Log ist leer",
     "app.chat.clearPublicChatMessage": "Der öffentliche Chatverlauf wurde durch einen Moderator gelöscht",
+    "app.captions.label": "Untertitel",
+    "app.captions.menu.close": "Schließen",
+    "app.captions.menu.start": "Start",
+    "app.captions.menu.select": "Verfügbare Sprache auswählen",
+    "app.captions.menu.title": "Untertitelmenü",
+    "app.captions.menu.fontSize": "Größe",
+    "app.captions.menu.fontColor": "Schriftfarbe",
+    "app.captions.menu.fontFamily": "Schriftart",
+    "app.captions.menu.backgroundColor": "Hintergrundfarbe",
+    "app.captions.menu.previewLabel": "Vorschau",
+    "app.captions.menu.cancelLabel": "Abbrechen",
+    "app.captions.pad.hide": "Untertitel verbergen",
+    "app.captions.pad.tip": "Drücken Sie Esc um die Editorwerkzeugliste auszuwählen",
+    "app.captions.pad.ownership": "Untertitelkontrolle übernehmen",
     "app.note.title": "Geteilte Notizen",
     "app.note.label": "Notiz",
     "app.note.hideNoteLabel": "Notiz verbergen",
@@ -29,6 +44,7 @@
     "app.userList.participantsTitle": "Teilnehmer",
     "app.userList.messagesTitle": "Nachrichten",
     "app.userList.notesTitle": "Notizen",
+    "app.userList.captionsTitle": "Untertitel",
     "app.userList.presenter": "Präsentator",
     "app.userList.you": "Sie",
     "app.userList.locked": "Gesperrt",
@@ -67,6 +83,12 @@
     "app.userList.userOptions.disablePubChat": "Öffentlicher Chat ist deaktiviert",
     "app.userList.userOptions.disableNote": "Geteilte Notizen sind jetzt gesperrt",
     "app.userList.userOptions.webcamsOnlyForModerator": "Nur Moderatoren können die Teilnehmerwebcams sehen (wegen eingeschränkter Rechteeinstellungen)",
+    "app.userList.userOptions.enableCam": "Teilnehmer dürfen ihre Webcam verwenden",
+    "app.userList.userOptions.enableMic": "Teilnehmer dürfen ihr Mikrofon verwenden",
+    "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.enableOnlyModeratorWebcam": "Sie können Ihre Webcam jetzt freigeben, jeder wird Sie sehen.",
     "app.media.label": "Media",
     "app.media.screenshare.start": "Bildschirmfreigabe wurde gestartet",
     "app.media.screenshare.end": "Bildschirmfreigabe wurde gestoppt",
@@ -106,8 +128,9 @@
     "app.presentation.presentationToolbar.fitToPage": "An Seite anpassen",
     "app.presentation.presentationToolbar.goToSlide": "Folie {0}",
     "app.presentationUploder.title": "Präsentation",
-    "app.presentationUploder.message": "Als Präsentator in BigBlueButton haben sie die Möglichkeit Office-Dokumente oder PDF-Dateien hochzuladen. PDF-Dateien haben dabei die bessere Qualität.",
-    "app.presentationUploder.confirmLabel": "Hochladen",
+    "app.presentationUploder.message": "Als Präsentator in BigBlueButton haben Sie die Möglichkeit Office-Dokumente oder PDF-Dateien hochzuladen. PDF-Dateien haben dabei die bessere Qualität. Bitte stellen Sie sicher, dass eine Präsentation durch das runde Markierungsfeld auf der rechten Seite ausgewählt ist.",
+    "app.presentationUploder.uploadLabel": "Hochladen",
+    "app.presentationUploder.confirmLabel": "Bestätigen",
     "app.presentationUploder.confirmDesc": "Änderungen speichern und Präsentation starten",
     "app.presentationUploder.dismissLabel": "Abbrechen",
     "app.presentationUploder.dismissDesc": "Fenster schließen und Änderungen verwerfen",
@@ -118,7 +141,7 @@
     "app.presentationUploder.fileToUpload": "Wird hochgeladen...",
     "app.presentationUploder.currentBadge": "Aktuell",
     "app.presentationUploder.genericError": "Ups, irgendwas ist schief gelaufen",
-    "app.presentationUploder.rejectedError": "Einige der ausgewählten Dateien wurden zurückgewiesen. Bitte prüfen Sie die Datei-Mime-Typen",
+    "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": "Datei zu groß, Limit von 200 Seiten erreicht",
     "app.presentationUploder.conversion.conversionProcessingSlides": "Verarbeite Seite {0} von {1}",
@@ -161,6 +184,15 @@
     "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": "Wahr",
+    "app.poll.answer.false": "Falsch",
+    "app.poll.answer.yes": "Ja",
+    "app.poll.answer.no": "Nein",
+    "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": "Teilnehmer",
     "app.poll.liveResult.responsesTitle": "Antwort",
     "app.polling.pollingTitle": "Umfrageoptionen",
@@ -222,6 +254,7 @@
     "app.submenu.application.fontSizeControlLabel": "Schriftgröße",
     "app.submenu.application.increaseFontBtnLabel": "Schriftgröße erhöhen",
     "app.submenu.application.decreaseFontBtnLabel": "Schriftgröße verringern",
+    "app.submenu.application.currentSize": "aktuell {0}",
     "app.submenu.application.languageLabel": "Sprache",
     "app.submenu.application.ariaLanguageLabel": "Applikationssprache ändern",
     "app.submenu.application.languageOptionLabel": "Sprache auswählen",
@@ -235,18 +268,6 @@
     "app.submenu.video.videoQualityLabel": "Videoqualität",
     "app.submenu.video.qualityOptionLabel": "Videoqualität auswählen",
     "app.submenu.video.participantsCamLabel": "Webcamvideo anderer Teilnehmer darstellen",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "Untertitel",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Untertitelkontrolle übernehmen",
-    "app.submenu.closedCaptions.languageLabel": "Sprache",
-    "app.submenu.closedCaptions.localeOptionLabel": "Sprache auswählen",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "Keine aktiven Gebietsschemata",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Schriftart",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "Schriftart auswählen",
-    "app.submenu.closedCaptions.fontSizeLabel": "Schriftgröße",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "Schriftgröße auswählen",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Hintergrundfarbe",
-    "app.submenu.closedCaptions.fontColorLabel": "Schriftfarbe",
-    "app.submenu.closedCaptions.noLocaleSelected": "Kleine Locale ausgewählt",
     "app.submenu.participants.muteAllLabel": "Alle stummschalten außer Präsentator",
     "app.submenu.participants.lockAllLabel": "Alle Teilnehmer arretieren",
     "app.submenu.participants.lockItemLabel": "Teilnehmer {0}",
@@ -268,7 +289,6 @@
     "app.settings.applicationTab.label": "Anwendung",
     "app.settings.audioTab.label": "Audio",
     "app.settings.videoTab.label": "Video",
-    "app.settings.closedcaptionTab.label": "Untertitel",
     "app.settings.usersTab.label": "Teilnehmer",
     "app.settings.main.label": "Einstellungen",
     "app.settings.main.cancel.label": "Abbrechen",
@@ -296,6 +316,8 @@
     "app.actionsBar.actionsDropdown.saveUserNames": "Teilnehmernamen speichern",
     "app.actionsBar.actionsDropdown.createBreakoutRoom": "Breakout-Räume erstellen",
     "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "ermöglicht die aktuelle Konferenz in mehrere Räume aufzuteilen",
+    "app.actionsBar.actionsDropdown.captionsLabel": "Untertitel schreiben",
+    "app.actionsBar.actionsDropdown.captionsDesc": "Untertitelfenster umschalten",
     "app.actionsBar.actionsDropdown.takePresenter": "Zum Präsentator werden",
     "app.actionsBar.actionsDropdown.takePresenterDesc": "Sich selber zum neuen Präsentator machen",
     "app.actionsBar.emojiMenu.statusTriggerLabel": "Status setzen",
@@ -320,6 +342,8 @@
     "app.actionsBar.emojiMenu.thumbsDownLabel": "Daumen runter",
     "app.actionsBar.emojiMenu.thumbsDownDesc": "Ihren Status auf Daumen runter setzen",
     "app.actionsBar.currentStatusDesc": "Aktueller Status {0}",
+    "app.actionsBar.captions.start": "Untertitel starten",
+    "app.actionsBar.captions.stop": "Untertitel stoppen",
     "app.audioNotification.audioFailedError1001": "Fehler 1001: Websocket unterbrochen",
     "app.audioNotification.audioFailedError1002": "Fehler 1002: Websocketverbindung konnte nicht hergestellt werden",
     "app.audioNotification.audioFailedError1003": "Fehler 1003: Browserversion wird nicht unterstützt",
@@ -338,7 +362,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "Mikrofonnutzung wurde für alle Zuschauer gesperrt, Sie werden als reiner Zuhörer verbunden",
     "app.breakoutJoinConfirmation.title": "Breakout-Raum beitreten",
     "app.breakoutJoinConfirmation.message": "Möchten Sie beitreten",
-    "app.breakoutJoinConfirmation.confirmLabel": "Beitreten",
     "app.breakoutJoinConfirmation.confirmDesc": "Dem Breakout-Raum beitreten",
     "app.breakoutJoinConfirmation.dismissLabel": "Abbrechen",
     "app.breakoutJoinConfirmation.dismissDesc": "Schließen und die Teilnahme am Breakout-Raum verweigern",
@@ -404,6 +427,7 @@
     "app.modal.close": "Schließen",
     "app.modal.close.description": "Änderungen verwerfen und Dialog schließen",
     "app.modal.confirm": "Fertig",
+    "app.modal.newTab": "(Öffnet neuen Tab)",
     "app.modal.confirm.description": "Änderungen speichern und Dialog schließen",
     "app.dropdown.close": "Schließen",
     "app.error.400": "Ungültige Anfrage",
@@ -592,12 +616,15 @@
     "app.createBreakoutRoom.freeJoin": "Den Teilnehmern erlauben, sich selber einen Breakout-Raum auszusuchen.",
     "app.createBreakoutRoom.leastOneWarnBreakout": "Jedem Breakout-Raum muss wenigstens ein Teilnehmer zugeordnet sein.",
     "app.createBreakoutRoom.modalDesc": "Vervollständigen Sie die folgenden Schritte um Breakout-Räume zu erzeugen. Verteilen Sie die Teilnehmer auf die Räume.",
+    "app.createBreakoutRoom.roomTime": "{0} Minuten",
     "app.externalVideo.start": "Neues Video teilen",
     "app.externalVideo.title": "Youtubevideo teilen",
     "app.externalVideo.input": "URL des YouTube-Videos",
     "app.externalVideo.urlInput": "Youtube URL hinzufügen",
     "app.externalVideo.urlError": "Diese URL ist kein gültiges Youtube-Video",
     "app.externalVideo.close": "Schließen",
+    "app.network.connection.effective.slow": "Es wurden Verbindungsprobleme beobachtet.",
+    "app.network.connection.effective.slow.help": "Wie löst man die Probleme?",
     "app.externalVideo.noteLabel": "Hinweis: Geteile Youtube-Videos werden nicht in der Aufzeichnung sichtbar sein",
     "app.actionsBar.actionsDropdown.shareExternalVideo": "Youtube-Video teilen",
     "app.actionsBar.actionsDropdown.stopShareExternalVideo": "Teilen des Youtube-Videos stoppen",
diff --git a/bigbluebutton-html5/private/locales/el_GR.json b/bigbluebutton-html5/private/locales/el_GR.json
index 3e578ef109cf9ea37323bbc33d8feb72dad5d6ab..0981f1463f469dcbf76e948a3b7389e491635fca 100644
--- a/bigbluebutton-html5/private/locales/el_GR.json
+++ b/bigbluebutton-html5/private/locales/el_GR.json
@@ -13,6 +13,8 @@
     "app.chat.dropdown.copy": "Αντιγραφή",
     "app.chat.dropdown.save": "Αποθήκευση",
     "app.chat.label": "Συνομιλία",
+    "app.captions.menu.start": "Εκκίνηση",
+    "app.captions.menu.cancelLabel": "Ακύρωση",
     "app.userList.usersTitle": "Χρήστες",
     "app.userList.messagesTitle": "Μηνύματα",
     "app.userList.presenter": "Παρουσιαστής",
@@ -42,9 +44,6 @@
     "app.submenu.application.fontSizeControlLabel": "Μέγεθος γραμματοσειράς",
     "app.submenu.application.languageOptionLabel": "Επιλογή γλώσσας",
     "app.submenu.video.videoSourceLabel": "Προβολή πηγαίου",
-    "app.submenu.closedCaptions.languageLabel": "Γλώσσα",
-    "app.submenu.closedCaptions.localeOptionLabel": "Επιλογή γλώσσας",
-    "app.submenu.closedCaptions.fontSizeLabel": "Μέγεθος γραμματοσειράς",
     "app.settings.main.label": "Άνοιγμα ρυθμίσεων",
     "app.settings.main.cancel.label": "Ακύρωση",
     "app.settings.main.save.label": "Αποθήκευση",
diff --git a/bigbluebutton-html5/private/locales/en.json b/bigbluebutton-html5/private/locales/en.json
index b3835fae80dfef88965b6b6802b7241c94e1fb3b..3ebef4a7888ccdc0e36d0d0b0a2abfebb868e500 100755
--- a/bigbluebutton-html5/private/locales/en.json
+++ b/bigbluebutton-html5/private/locales/en.json
@@ -83,6 +83,12 @@
     "app.userList.userOptions.disablePubChat": "Public chat is disabled",
     "app.userList.userOptions.disableNote": "Shared notes are now locked",
     "app.userList.userOptions.webcamsOnlyForModerator": "Only moderators are able to see viewers' webcams (due to lock settings)",
+    "app.userList.userOptions.enableCam": "Viewers' webcams are enabled",
+    "app.userList.userOptions.enableMic": "Viewers' microphones are enabled",
+    "app.userList.userOptions.enablePrivChat": "Private chat is enabled",
+    "app.userList.userOptions.enablePubChat": "Public chat is enabled",
+    "app.userList.userOptions.enableNote": "Shared notes are now enabled",
+    "app.userList.userOptions.enableOnlyModeratorWebcam": "You can enable your webcam now, everyone will see you",
     "app.media.label": "Media",
     "app.media.screenshare.start": "Screenshare has started",
     "app.media.screenshare.end": "Screenshare has ended",
@@ -122,8 +128,9 @@
     "app.presentation.presentationToolbar.fitToPage": "Fit to page",
     "app.presentation.presentationToolbar.goToSlide": "Slide {0}",
     "app.presentationUploder.title": "Presentation",
-    "app.presentationUploder.message": "As a presenter you have the ability of uploading any office document or PDF file.  We recommend PDF file for best results.",
-    "app.presentationUploder.confirmLabel": "Upload",
+    "app.presentationUploder.message": "As a presenter you have the ability of uploading any office document or PDF file.  We recommend PDF file for best results. Please ensure that a presentation is selected using the circle checkbox on the right hand side.",
+    "app.presentationUploder.uploadLabel": "Upload",
+    "app.presentationUploder.confirmLabel": "Confirm",
     "app.presentationUploder.confirmDesc": "Save your changes and start the presentation",
     "app.presentationUploder.dismissLabel": "Cancel",
     "app.presentationUploder.dismissDesc": "Close the modal window and discard your changes",
diff --git a/bigbluebutton-html5/private/locales/es.json b/bigbluebutton-html5/private/locales/es.json
index d4883bc4a278514ddb15a456130286cad757fda9..eafeaaabb0a69c91114e4bcad3cc6227b16ed874 100644
--- a/bigbluebutton-html5/private/locales/es.json
+++ b/bigbluebutton-html5/private/locales/es.json
@@ -16,15 +16,35 @@
     "app.chat.dropdown.copy": "Copiar",
     "app.chat.dropdown.save": "Guardar",
     "app.chat.label": "Chat",
+    "app.chat.offline": "Desconectado",
     "app.chat.emptyLogLabel": "Registro de chat vacío",
     "app.chat.clearPublicChatMessage": "El chat publico fue borrado por un moderador",
+    "app.captions.label": "Subtítulos",
+    "app.captions.menu.close": "Cerrar",
+    "app.captions.menu.start": "Iniciar",
+    "app.captions.menu.select": "Seleccione idiomas disponibles",
+    "app.captions.menu.title": "Menú de subtítulos",
+    "app.captions.menu.fontSize": "Tamaño",
+    "app.captions.menu.fontColor": "Color de texto",
+    "app.captions.menu.fontFamily": "Fuente",
+    "app.captions.menu.backgroundColor": "Color 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 la barra de herramientas del editor",
+    "app.captions.pad.ownership": "Tomar el control",
     "app.note.title": "Notas compartidas",
     "app.note.label": "Nota",
     "app.note.hideNoteLabel": "Ocultar nota",
+    "app.user.activityCheck": "Comprobar actividad del usuario",
+    "app.user.activityCheck.label": "Comprobar si el usuario continúa en la reunión ({0})",
+    "app.user.activityCheck.check": "Comprobar",
+    "app.note.tipLabel": "Presione Esc para enfocar la barra de herramientas del editor",
     "app.userList.usersTitle": "Usuarios",
     "app.userList.participantsTitle": "Participantes",
     "app.userList.messagesTitle": "Mensajes",
     "app.userList.notesTitle": "Notas",
+    "app.userList.captionsTitle": "Subtítulos",
     "app.userList.presenter": "Presentador",
     "app.userList.you": "Tu",
     "app.userList.locked": "Bloqueado",
@@ -34,6 +54,7 @@
     "app.userList.menuTitleContext": "Opciones disponibles",
     "app.userList.chatListItem.unreadSingular": "{0} Nuevo Mensaje",
     "app.userList.chatListItem.unreadPlural": "{0} Nuevos mensajes",
+    "app.userList.menu.chat.label": "Iniciar 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",
@@ -43,6 +64,7 @@
     "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": "Búsqueda de directorio",
     "app.userList.menu.makePresenter.label": "Promover a presentador",
     "app.userList.userOptions.manageUsersLabel": "Manejar usuarios",
     "app.userList.userOptions.muteAllLabel": "Deshabilitar audio a todos los usuarios",
@@ -55,12 +77,34 @@
     "app.userList.userOptions.unmuteAllDesc": "Habilitar audio en la sesión",
     "app.userList.userOptions.lockViewersLabel": "Bloquear espectadores",
     "app.userList.userOptions.lockViewersDesc": "Bloquear algunas funciones 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.webcamsOnlyForModerator": "Solo los moderadores pueden ver las cámaras web de los invitados (debido a la configuración de bloqueo)",
+    "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.enableOnlyModeratorWebcam": "Usted puede habilitar su cámara web ahora. Todos podrán verle",
     "app.media.label": "Media",
     "app.media.screenshare.start": "Compartir pantalla ha iniciado",
     "app.media.screenshare.end": "Compartir pantalla ha finalizado",
     "app.media.screenshare.safariNotSupported": "Compartir pantalla actualmente no es soportada por Safari. Por favor usilize Firefox o Google Chrome.",
     "app.meeting.ended": "La sesión ha finalizado",
+    "app.meeting.meetingTimeRemaining": "Tiempo restante de la reunión: {0}",
+    "app.meeting.meetingTimeHasEnded": "Tiempo finalizado. La reunión se cerrará en breve",
     "app.meeting.endedMessage": "Serás enviado a la pantalla de inicio.",
+    "app.meeting.alertMeetingEndsUnderOneMinute": "La reunión se cierra en un minuto",
+    "app.presentation.hide": "Ocultar presentación",
+    "app.presentation.notificationLabel": "Presentación actual",
+    "app.presentation.slideContent": "Contenido de la diapositiva",
+    "app.presentation.startSlideContent": "Inicio del pase de diapositivas",
+    "app.presentation.endSlideContent": "Fin del pase de diapositivas",
+    "app.presentation.emptySlideContent": "Diapositiva actual sin contenido",
+    "app.presentation.presentationToolbar.selectLabel": "Seleccione diapositiva",
     "app.presentation.presentationToolbar.prevSlideLabel": "Diapositiva anterior",
     "app.presentation.presentationToolbar.prevSlideDesc": "Cambiar presentación a diapositiva anterior",
     "app.presentation.presentationToolbar.nextSlideLabel": "Siguiente diapositiva",
@@ -77,9 +121,15 @@
     "app.presentation.presentationToolbar.zoomInDesc": "Acercarse en presentación",
     "app.presentation.presentationToolbar.zoomOutLabel": "Alejarse",
     "app.presentation.presentationToolbar.zoomOutDesc": "Alejarse en presentación",
+    "app.presentation.presentationToolbar.zoomReset": "Reiniciar zoom",
+    "app.presentation.presentationToolbar.zoomIndicator": "Porcentaje actual de zoom",
     "app.presentation.presentationToolbar.fitToWidth": "Ajustar a lo ancho",
+    "app.presentation.presentationToolbar.fitToPage": "Ajustar a la página",
     "app.presentation.presentationToolbar.goToSlide": "Diapositiva {0}",
     "app.presentationUploder.title": "Presentación",
+    "app.presentationUploder.message": "Como presentador, tiene la capacidad de cargar cualquier documento de Office o archivo PDF. Recomendamos archivos PDF para obtener los mejores resultados. Asegúrese de seleccionar una presentación utilizando la casilla de verificación en forma de círculo en el lado derecho.",
+    "app.presentationUploder.uploadLabel": "Cargar",
+    "app.presentationUploder.confirmLabel": "Confirmar",
     "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.",
@@ -90,24 +140,41 @@
     "app.presentationUploder.fileToUpload": "En proceso de ser cargado ...",
     "app.presentationUploder.currentBadge": "Acual",
     "app.presentationUploder.genericError": "Ups, algo salio mal",
-    "app.presentationUploder.rejectedError": "Algunos de los archivos seleccionados fueron rechazados. Por favor verifique el mime type de los archivo",
+    "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, se ha alcanzado el máximo de 200 páginas",
     "app.presentationUploder.conversion.conversionProcessingSlides": "Procesando página {0} de {1}",
     "app.presentationUploder.conversion.genericConversionStatus": "Convirtiendo archivos ...",
     "app.presentationUploder.conversion.generatingThumbnail": "Generando miniaturas ...",
     "app.presentationUploder.conversion.generatedSlides": "Diapositivas han sido generadas ...",
     "app.presentationUploder.conversion.generatingSvg": "Generando imágenes SVG ...",
+    "app.presentationUploder.conversion.pageCountExceeded": "Ops, el contador ha excedido el límite de 200 páginas",
     "app.presentationUploder.conversion.timeout": "La conversión tomó demasiado tiempo ...",
+    "app.presentationUploder.isDownloadableLabel": "La descarga de la presentación no 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": "Nombre de archivo",
     "app.presentationUploder.tableHeading.options": "Opciones",
+    "app.presentationUploder.tableHeading.status": "Estado",
     "app.poll.pollPaneTitle": "Encuesta",
+    "app.poll.quickPollTitle": "Encuesta rápida",
     "app.poll.hidePollDesc": "Ocultar el menu de la encuesta",
     "app.poll.customPollInstruction": "Para crear una encuesta personalizada presiona el botón de abajo e introduce las respuestas.",
     "app.poll.quickPollInstruction": "Selecciona una de las siguientes opciones para iniciar tu encuesta. ",
     "app.poll.customPollLabel": "Encuesta personalizada",
     "app.poll.startCustomLabel": "Iniciar encuesta personalizada",
+    "app.poll.activePollInstruction": "Deje esta ventana abierta para permitir a otros a responder a la encuesta.\nSeleccionando \"Publicar resultados de la encuesta\" o navegando hacia tras finalizará la encuesta.",
+    "app.poll.publishLabel": "Publicar resultados de la encuesta",
     "app.poll.backLabel": "Regresar a las opciones de la encuesta",
     "app.poll.closeLabel": "Cerrar",
+    "app.poll.waitingLabel": "Esperando respuestas ({0}/{1})",
+    "app.poll.ariaInputCount": "Opción de encuesta personalizada {0} de {1}",
     "app.poll.customPlaceholder": "Agregar respuesta de encuesta",
+    "app.poll.noPresentationSelected": "¡No se ha seleccionado ninguna presentación! Por favor, seleccione una.",
+    "app.poll.clickHereToSelect": "'Click' aquí para seleccionar",
+    "app.poll.t": "Verdadero",
+    "app.poll.f": "Falso",
     "app.poll.tf": "Verdadero / Falseo",
     "app.poll.y": "Si",
     "app.poll.n": "No",
@@ -116,12 +183,22 @@
     "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": "Verdadero",
+    "app.poll.answer.false": "Falso",
+    "app.poll.answer.yes": "Si",
+    "app.poll.answer.no": "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": "Usuarios",
     "app.poll.liveResult.responsesTitle": "Respuesta",
     "app.polling.pollingTitle": "Opciones de la encuesta",
     "app.polling.pollAnswerLabel": "Respuesta de encuesta {0}",
     "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.navBar.settingsDropdown.optionsLabel": "Opciones",
@@ -135,7 +212,10 @@
     "app.navBar.settingsDropdown.aboutDesc": "Mostrar información acerca del cliente",
     "app.navBar.settingsDropdown.leaveSessionDesc": "Abandonar la reunión",
     "app.navBar.settingsDropdown.exitFullscreenDesc": "Salir del modo de pantalla completa",
+    "app.navBar.settingsDropdown.hotkeysLabel": "Atajos de teclado",
+    "app.navBar.settingsDropdown.hotkeysDesc": "Listado de atajos de teclado disponibles",
     "app.navBar.settingsDropdown.helpLabel": "Ayuda",
+    "app.navBar.settingsDropdown.helpDesc": "Enlaces a videotutoriales (abre una nueva pestaña)",
     "app.navBar.settingsDropdown.endMeetingDesc": "Finaliza la sesión actual",
     "app.navBar.settingsDropdown.endMeetingLabel": "Finalizar sesión",
     "app.navBar.userListToggleBtnLabel": "Alternar lista de usuarios",
@@ -165,10 +245,15 @@
     "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.screenshare.screenShareLabel" : "Compartir pantalla",
     "app.submenu.application.applicationSectionTitle": "Aplicación",
+    "app.submenu.application.animationsLabel": "Animaciones",
+    "app.submenu.application.audioAlertLabel": "Alertas de sonido para el chat",
+    "app.submenu.application.pushAlertLabel": "Alertas visuales para el chat",
     "app.submenu.application.fontSizeControlLabel": "Tamaño de fuente",
     "app.submenu.application.increaseFontBtnLabel": "Incrementar tamaño de fuente",
     "app.submenu.application.decreaseFontBtnLabel": "Reducir tamaño de fuente",
+    "app.submenu.application.currentSize": "actualmente {0}",
     "app.submenu.application.languageLabel": "Lenguaje de aplicación",
     "app.submenu.application.ariaLanguageLabel": "Cambiar lenguaje de aplicación",
     "app.submenu.application.languageOptionLabel": "Seleccionar lenguaje",
@@ -179,20 +264,9 @@
     "app.submenu.video.title": "Video",
     "app.submenu.video.videoSourceLabel": "Fuente del video",
     "app.submenu.video.videoOptionLabel": "Escoger ver fuente",
+    "app.submenu.video.videoQualityLabel": "Calidad de vídeo",
     "app.submenu.video.qualityOptionLabel": "Escoger calidad del video",
     "app.submenu.video.participantsCamLabel": "Viendo webcams de participantes",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "Subtítulos",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Tomar el control",
-    "app.submenu.closedCaptions.languageLabel": "Lenguaje",
-    "app.submenu.closedCaptions.localeOptionLabel": "Seleccionar lenguaje",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "No hay locales activos",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Familia de fuente",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "Selecciona tipo de letra",
-    "app.submenu.closedCaptions.fontSizeLabel": "Tamaño de fuente",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "Selecciona tamaño de letra",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Color de fondo",
-    "app.submenu.closedCaptions.fontColorLabel": "Color de fuente",
-    "app.submenu.closedCaptions.noLocaleSelected": "Idioma no seleccionado",
     "app.submenu.participants.muteAllLabel": "Deshabilitar audio a todos menos al presentador",
     "app.submenu.participants.lockAllLabel": "Bloquear a todos los usuarios",
     "app.submenu.participants.lockItemLabel": "Espectadores {0}",
@@ -214,7 +288,6 @@
     "app.settings.applicationTab.label": "Aplicación",
     "app.settings.audioTab.label": "Audio",
     "app.settings.videoTab.label": "Video",
-    "app.settings.closedcaptionTab.label": "Subtítulos",
     "app.settings.usersTab.label": "Participantes",
     "app.settings.main.label": "Configuración",
     "app.settings.main.cancel.label": "Cancela",
@@ -225,6 +298,7 @@
     "app.settings.dataSavingTab.webcam": "Habilitar webcams",
     "app.settings.dataSavingTab.screenShare": "Habilitar escritorio compartido",
     "app.settings.dataSavingTab.description": "Para ahorrar ancho de banda ajusta lo que se se está mostrando",
+    "app.settings.save-notification.label": "La configuración se ha guardado",
     "app.switch.onLabel": "Encendido",
     "app.switch.offLabel": "Apagado",
     "app.actionsBar.actionsDropdown.actionsLabel": "Acciones",
@@ -238,8 +312,12 @@
     "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Dejar de compartir tu pantalla con otros",
     "app.actionsBar.actionsDropdown.pollBtnLabel": "Iniciar una encuesta",
     "app.actionsBar.actionsDropdown.pollBtnDesc": "Cambia el panel de encuesta",
+    "app.actionsBar.actionsDropdown.saveUserNames": "Guardar nombres de usuarios",
     "app.actionsBar.actionsDropdown.createBreakoutRoom": "Crear grupos de trabajo",
     "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "crear grupos de trabajo para dividir la sesión actual",
+    "app.actionsBar.actionsDropdown.captionsLabel": "Escribir subtítulos",
+    "app.actionsBar.actionsDropdown.captionsDesc": "Alterna el panel de subtítulos",
+    "app.actionsBar.actionsDropdown.takePresenter": "Tomar rol de presentador",
     "app.actionsBar.actionsDropdown.takePresenterDesc": "Asignarte a ti mismo el rol de presentador",
     "app.actionsBar.emojiMenu.statusTriggerLabel": "Establecer estado",
     "app.actionsBar.emojiMenu.awayLabel": "Ausente",
@@ -263,9 +341,12 @@
     "app.actionsBar.emojiMenu.thumbsDownLabel": "Señal de desaprobación",
     "app.actionsBar.emojiMenu.thumbsDownDesc": "Cambia tu estdo a señal de desaprobación",
     "app.actionsBar.currentStatusDesc": "estado actual {0}",
+    "app.actionsBar.captions.start": "Comenzar a ver subtítulos",
+    "app.actionsBar.captions.stop": "Dejar de ver subtítulos",
     "app.audioNotification.audioFailedError1001": "Error 1001: WebSocket desconectado",
     "app.audioNotification.audioFailedError1002": "Error 1002: No puede establecerse conexión de WebSocket",
     "app.audioNotification.audioFailedError1003": "Error 1003: Versión de navegador no soportado ",
+    "app.audioNotification.audioFailedError1004": "Error 1004: Fallo en llamada (razón={0})",
     "app.audioNotification.audioFailedError1005": "Error 1005: La llamada terminó inesperadamente",
     "app.audioNotification.audioFailedError1006": "Error 1006: Tiempo de espera de llamada agotado",
     "app.audioNotification.audioFailedError1007": "Error 1007: Fallo de negociación ICE",
@@ -273,13 +354,13 @@
     "app.audioNotification.audioFailedError1009": "Error 1009: No se pudo obtener información de servidor STUN/TURN",
     "app.audioNotification.audioFailedError1010": "Error 1010: Se acabó tiempo de negociación ICE  ",
     "app.audioNotification.audioFailedError1011": "Error 1011: Se acabó tiempo recolectando ICE",
+    "app.audioNotification.audioFailedError1012": "Error 1012: Conexión ICE cerrada",
     "app.audioNotification.audioFailedMessage": "Tu conexión de audio falló en conectarse",
     "app.audioNotification.mediaFailedMessage": "getUserMicMedia falló, Solo orígenes seguros son admitidos",
     "app.audioNotification.closeLabel": "Cerrar",
     "app.audioNotificaion.reconnectingAsListenOnly": "El micrófono ha sido bloqueado para todos los espectadores, tu conexión es en modo \"solo escuchar\"",
     "app.breakoutJoinConfirmation.title": "Ingresar a un grupo de trabajo",
     "app.breakoutJoinConfirmation.message": "Quieres unirte",
-    "app.breakoutJoinConfirmation.confirmLabel": "Unirte",
     "app.breakoutJoinConfirmation.confirmDesc": "Ingresar a un grupo de trabajo",
     "app.breakoutJoinConfirmation.dismissLabel": "Cancelar",
     "app.breakoutJoinConfirmation.dismissDesc": "Cierra y rechaza entrada a grupo de trabajo",
@@ -287,6 +368,7 @@
     "app.breakoutTimeRemainingMessage": "Tiempo restante en grupo de trabajo: {0}",
     "app.breakoutWillCloseMessage": "Tiempo transcurrido. Grupo de trabajo se cerrará en breve.",
     "app.calculatingBreakoutTimeRemaining": "Calculando tiempo restante ...",
+    "app.audioModal.ariaTitle": "Unirse en modo audio",
     "app.audioModal.microphoneLabel": "Micrófono",
     "app.audioModal.listenOnlyLabel": "Solo escuchar",
     "app.audioModal.audioChoiceLabel": "¿Como quieres unirte al audio?",
@@ -294,6 +376,7 @@
     "app.audioModal.iOSErrorDescription": "En este momento el audio y video no son soportados en Chrome para iOS.",
     "app.audioModal.iOSErrorRecommendation": "Te recomendamos utilizar Safari OS.",
     "app.audioModal.audioChoiceDesc": "Selecciona como unirse al audio en esta reunión",
+    "app.audioModal.unsupportedBrowserLabel": "Parece que está usando un navegador no totalmente soportado. Por favor, utilice uno de los siguientes {0} ó {1} para una compatibilidad completa. ",
     "app.audioModal.closeLabel": "Cerrar",
     "app.audioModal.yes": "Si",
     "app.audioModal.no": "No",
@@ -303,6 +386,9 @@
     "app.audioModal.settingsTitle": "Cambia tu configuración de audio",
     "app.audioModal.helpTitle": "Ocurrió un error con tus dispositivos de medios",
     "app.audioModal.helpText": "¿Autorizaste el uso de tu micrófono? Ten en cuenta que cuando tratas de ingresar al audio, se te debe mostrar una caja de diálogo en la que se solicita tu autorización. Si no ocurrió intenta cambiar los permisos de tu micrófono en el area de configuración de tu navegador.",
+    "app.audioModal.audioDialTitle": "Únase usando su teléfono",
+    "app.audioDial.audioDialDescription": "Marcar",
+    "app.audioDial.audioDialConfrenceText": "e introduzca el número PIN de la conferencia:",
     "app.audioModal.connecting": "Conectandose",
     "app.audioModal.connectingEchoTest": "Conenctandose a prueba de eco",
     "app.audioManager.joinedAudio": "Has ingresado a la conferencia de audio",
@@ -330,25 +416,53 @@
     "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.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",
+    "app.meeting.logout.validateTokenFailedEjectReason": "Error al validar el token de autorización",
+    "app.meeting.logout.userInactivityEjectReason": "Usuario inactivo por mucho tiempo",
+    "app.meeting-ended.rating.legendLabel": "Calificación de votos",
+    "app.meeting-ended.rating.starLabel": "Estrella",
     "app.modal.close": "Cerrar",
     "app.modal.confirm": "Finalizado",
+    "app.modal.newTab": "(abre nueva pestaña)",
     "app.dropdown.close": "Cerrar",
     "app.error.400": "Solicitud incorrecta",
     "app.error.401": "No autorizado",
+    "app.error.403": "Usted ha sido expulsado/a de la reunión",
     "app.error.404": "No se encontró",
+    "app.error.410": "La reunión ha finalizado",
     "app.error.500": "Ups, algo salio mal",
     "app.error.leaveLabel": "Ingresa de nuevo",
+    "app.error.fallback.presentation.title": "Ha ocurrido un error",
+    "app.error.fallback.presentation.description": "Esto se ha registrado. Por favor, intente volver a cargar la página.",
+    "app.error.fallback.presentation.reloadButton": "Recargar",
     "app.guest.waiting": "Esperando aprobación para unirse",
+    "app.userList.guest.waitingUsers": "Usuarios en espera",
+    "app.userList.guest.waitingUsersTitle": "Gestión de usuarios",
+    "app.userList.guest.optionTitle": "Revisar de usuarios pendientes",
+    "app.userList.guest.allowAllAuthenticated": "Permitir todos los autenticados",
+    "app.userList.guest.allowAllGuests": "Permitir todos los invitados",
+    "app.userList.guest.allowEveryone": "Permitir a todos",
+    "app.userList.guest.denyEveryone": "Denegar a todos",
+    "app.userList.guest.pendingUsers": "{0} Usuarios pendientes",
+    "app.userList.guest.pendingGuestUsers": "{0} Invitados pendientes",
+    "app.userList.guest.pendingGuestAlert": "Se ha unido a la sesión y está esperando su aprobación.",
+    "app.userList.guest.rememberChoice": "Recordar elección",
+    "app.user-info.title": "Búsqueda de directorio",
     "app.toast.breakoutRoomEnded": "La sesión de grupo de trabajo ha finalizado. Ingresa al audio nuevamente.",
     "app.toast.chat.public": "Nuevo mensaje en chat público",
     "app.toast.chat.private": "Nuevo mensaje en chat privado",
     "app.toast.chat.system": "Sistema",
     "app.notification.recordingStart": "La sesión esta siendo grabada",
     "app.notification.recordingStop": "Se ha dejado de grabar la sesión",
+    "app.notification.recordingAriaLabel": "Tiempo de grabación",
+    "app.shortcut-help.title": "Atajos de teclado",
     "app.shortcut-help.accessKeyNotAvailable": "Teclas de acceso no disponibles",
     "app.shortcut-help.comboLabel": "Combinación",
     "app.shortcut-help.functionLabel": "Función",
     "app.shortcut-help.closeLabel": "Cerrar",
+    "app.shortcut-help.closeDesc": "Cierra el modo de Atajos de teclado",
     "app.shortcut-help.openOptions": "Abrir opciones",
     "app.shortcut-help.toggleUserList": "Cambia lista de usuarios",
     "app.shortcut-help.toggleMute": "Deshabilitar / Habilitar audio",
@@ -357,6 +471,9 @@
     "app.shortcut-help.closePrivateChat": "Cerrar chat privado",
     "app.shortcut-help.openActions": "Abrir menú de acciones",
     "app.shortcut-help.openStatus": "Abrir el menú de estados",
+    "app.shortcut-help.togglePan": "Activar herramienta Pan (Presentador)",
+    "app.shortcut-help.nextSlideDesc": "Diapositiva siguiente (Presentador)",
+    "app.shortcut-help.previousSlideDesc": "Diapositiva anterior (Presentador)",
     "app.lock-viewers.title": "Bloquear espectadores",
     "app.lock-viewers.description": "Estas opciones te permiten restringir el accesso a ciertas funciones disponibles para espectadores, como bloquear la habilidad de utilizar chat privado. (Estas restricciones no aplican a moderadores)",
     "app.lock-viewers.featuresLable": "Función",
@@ -366,11 +483,15 @@
     "app.lock-viewers.microphoneLable": "Micrófono",
     "app.lock-viewers.PublicChatLabel": "Chat público",
     "app.lock-viewers.PrivateChatLable": "Chat privado",
+    "app.lock-viewers.notesLabel": "Notas compartidas",
     "app.lock-viewers.Layout": "Diseño de pantalla",
     "app.recording.startTitle": "Iniciar grabación",
+    "app.recording.stopTitle": "Pausar grabación",
+    "app.recording.resumeTitle": "Continuar grabación",
     "app.recording.startDescription": "(Puedes hacer click en el icono nuevamente para detener la grabación)",
     "app.recording.stopDescription": "¿Quieres detener la grabación de la sesión? (Puedes continuar la grabación en cualquier momento haciendo click en el icono de iniciar grabación.)",
     "app.videoPreview.cameraLabel": "Webcam",
+    "app.videoPreview.profileLabel": "Calidad",
     "app.videoPreview.cancelLabel": "Cancelar",
     "app.videoPreview.closeLabel": "Cerrar",
     "app.videoPreview.startSharingLabel": "Iniciar compartir",
@@ -378,6 +499,7 @@
     "app.videoPreview.webcamPreviewLabel": "Vista preliminar de webcam",
     "app.videoPreview.webcamSettingsTitle": "Configuración de webcam",
     "app.videoPreview.webcamNotFoundLabel": "Webcam no encontrada",
+    "app.videoPreview.profileNotFoundLabel": "Perfil de cámara no soportado",
     "app.video.joinVideo": "Compartir webcam",
     "app.video.leaveVideo": "Dejar de compartir webcam",
     "app.video.iceCandidateError": "Error al agregar candidato ICE",
@@ -391,6 +513,7 @@
     "app.video.mediaFlowTimeout1020": "Error 1020: Medio no llego al servidor",
     "app.video.swapCam": "Intercambiar",
     "app.video.swapCamDesc": "intercambiar la dirección de las webcams",
+    "app.video.videoLocked": "Compartir cámara web bloqueado",
     "app.video.videoButtonDesc": "Botón de ingresar a video",
     "app.video.videoMenu": "Menú de video",
     "app.video.videoMenuDisabled": "Webcam deshabilitada",
@@ -410,6 +533,7 @@
     "app.video.stats.rtt": "RTT",
     "app.video.stats.encodeUsagePercent": "Uso de codificador",
     "app.video.stats.currentDelay": "Demora actual",
+    "app.fullscreenButton.label": "Hacer {0} pantalla completa",
     "app.deskshare.iceConnectionStateError": "Error 1108: Conexión ICE fallida al compartir la pantalla",
     "app.sfu.mediaServerConnectionError2000": "Error 2000: No es posible conectarse al servidor de medios",
     "app.sfu.mediaServerOffline2001": "Error 2001: Servidor de medios fuera de línea. Por favor intentelo nuevamente.",
@@ -421,6 +545,7 @@
     "app.sfu.invalidSdp2202":"Error 2202: El client generato un SDP invalido",
     "app.sfu.noAvailableCodec2203": "Error 2203: El servidor no encontró un Codec apropiado",
     "app.meeting.endNotification.ok.label": "OK",
+    "app.whiteboard.annotations.poll": "Resultados de la encuesta compartidos",
     "app.whiteboard.toolbar.tools": "Herramientas",
     "app.whiteboard.toolbar.tools.hand": "Panorama",
     "app.whiteboard.toolbar.tools.pencil": "Lápiz",
@@ -462,6 +587,7 @@
     "app.invitation.title": "Invitación a grupo de trabajo",
     "app.invitation.confirm": "Invitar",
     "app.createBreakoutRoom.title": "Grupos de trabajo",
+    "app.createBreakoutRoom.ariaTitle": "Ocultar Salas de Descanso",
     "app.createBreakoutRoom.breakoutRoomLabel": "Grupos de trabajo {0}",
     "app.createBreakoutRoom.generatingURL": "Generando enlace",
     "app.createBreakoutRoom.generatedURL": "Generada",
@@ -472,6 +598,7 @@
     "app.createBreakoutRoom.joinAudio": "Ingresar al audio",
     "app.createBreakoutRoom.returnAudio": "Regresar al audio",
     "app.createBreakoutRoom.confirm": "Crear",
+    "app.createBreakoutRoom.record": "Grabar",
     "app.createBreakoutRoom.numberOfRooms": "Número de salas",
     "app.createBreakoutRoom.durationInMinutes": "Duración (minutos)",
     "app.createBreakoutRoom.randomlyAssign": "Asignado aleatóriamente",
@@ -479,15 +606,27 @@
     "app.createBreakoutRoom.roomName": "{0} (Sala - {1})",
     "app.createBreakoutRoom.doneLabel": "Finalizado",
     "app.createBreakoutRoom.nextLabel": "Siguiente",
+    "app.createBreakoutRoom.minusRoomTime": "Disminuir tiempo de Sala de Descanso",
+    "app.createBreakoutRoom.addRoomTime": "Aumentar tiempo de Sala de Descanso",
     "app.createBreakoutRoom.addParticipantLabel": "+ Agregar participante",
     "app.createBreakoutRoom.freeJoin": "Permitir a los usuarios seleccionar el grupo de trabajo a ingresar",
     "app.createBreakoutRoom.leastOneWarnBreakout": "Debes agregar almenos un usuario a cada grupo de trabajo.",
     "app.createBreakoutRoom.modalDesc": "Completa los siguientes pasos para crear grupos de trabajo en tu sesión y poder agregar participantes",
+    "app.createBreakoutRoom.roomTime": "{0} minutos",
     "app.externalVideo.start": "Compartir un nuevo video",
     "app.externalVideo.title": "Compartir un video de YouTube",
     "app.externalVideo.input": "Enlace a video de YouTube",
+    "app.externalVideo.urlInput": "Agregar URL de YouTube",
     "app.externalVideo.urlError": "Este enlace no es un video de YouTube valido",
-    "app.externalVideo.close": "Cerrar"
+    "app.externalVideo.close": "Cerrar",
+    "app.network.connection.effective.slow": "Estamos detectando problemas de conectividad.",
+    "app.network.connection.effective.slow.help": "¿Cómo resolverlo?",
+    "app.externalVideo.noteLabel": "Nota: Los vídeos de YouTube compartidos no aparecerán en la grabación ",
+    "app.actionsBar.actionsDropdown.shareExternalVideo": "Compartir vídeo de YouTube",
+    "app.actionsBar.actionsDropdown.stopShareExternalVideo": "Dejar de compartir vídeo de YouTube",
+    "app.iOSWarning.label": "Por favor, actualice a iOS 12.2 o superior",
+    "app.legacy.unsupportedBrowser": "Parece que está usando un navegador no totalmente soportado. Por favor, utilice uno de los siguientes {0} ó {1} para una compatibilidad completa.",
+    "app.legacy.upgradeBrowser": "Parece que está usando una versión antigua del navegador. Por favor, actualice su navegador para una compatibilidad completa."
 
 }
 
diff --git a/bigbluebutton-html5/private/locales/es_ES.json b/bigbluebutton-html5/private/locales/es_ES.json
index 7bb8e246410686614c7b52c6795708cc698c2574..cc6fbfd9624c230d534a9b7ad287b5872de10a28 100644
--- a/bigbluebutton-html5/private/locales/es_ES.json
+++ b/bigbluebutton-html5/private/locales/es_ES.json
@@ -14,6 +14,10 @@
     "app.chat.dropdown.save": "Guardar",
     "app.chat.label": "Chat",
     "app.chat.emptyLogLabel": "Registro de chat vacío",
+    "app.captions.menu.close": "Cerrar",
+    "app.captions.menu.backgroundColor": "Color de fondo",
+    "app.captions.menu.cancelLabel": "Cancelar",
+    "app.captions.pad.ownership": "Tomar el control",
     "app.userList.usersTitle": "Usuarios",
     "app.userList.participantsTitle": "Participantes",
     "app.userList.messagesTitle": "Mensajes",
@@ -85,14 +89,6 @@
     "app.submenu.video.videoOptionLabel": "Escoger ver fuente",
     "app.submenu.video.qualityOptionLabel": "Escoger calidad del video",
     "app.submenu.video.participantsCamLabel": "Viendo webcams de participantes",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Tomar el control",
-    "app.submenu.closedCaptions.languageLabel": "Lenguaje",
-    "app.submenu.closedCaptions.localeOptionLabel": "Seleccionar lenguaje",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "No hay locales activos",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Familia de fuente",
-    "app.submenu.closedCaptions.fontSizeLabel": "Tamaño de fuente",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Color de fondo",
-    "app.submenu.closedCaptions.fontColorLabel": "Color de fuente",
     "app.submenu.participants.muteAllLabel": "Silenciar a todos menos al presentador",
     "app.submenu.participants.lockMicAriaLabel": "Bloquea micrófono",
     "app.submenu.participants.lockCamAriaLabel": "Bloquea webcam",
@@ -152,7 +148,6 @@
     "app.audioNotification.audioFailedMessage": "Tu conexión de audio falló en conectarse",
     "app.audioNotification.closeLabel": "Cerrar",
     "app.breakoutJoinConfirmation.message": "Quieres unirte",
-    "app.breakoutJoinConfirmation.confirmLabel": "Unirte",
     "app.breakoutJoinConfirmation.dismissLabel": "Cancelar",
     "app.audioModal.microphoneLabel": "Micrófono",
     "app.audioModal.audioChoiceLabel": "¿Como quieres unirte al audio?",
diff --git a/bigbluebutton-html5/private/locales/es_MX.json b/bigbluebutton-html5/private/locales/es_MX.json
index de88f503bdff6b7bcf367ae48f2a36472ed8a956..8b47a395cd7f674fd8c50ad6d852da0afd681c47 100644
--- a/bigbluebutton-html5/private/locales/es_MX.json
+++ b/bigbluebutton-html5/private/locales/es_MX.json
@@ -18,6 +18,12 @@
     "app.chat.label": "Chat",
     "app.chat.emptyLogLabel": "Registro de chat vacío",
     "app.chat.clearPublicChatMessage": "El chat publico fue borrado por un moderador",
+    "app.captions.menu.close": "Cerrar",
+    "app.captions.menu.start": "Iniciar",
+    "app.captions.menu.backgroundColor": "Color de fondo",
+    "app.captions.menu.cancelLabel": "Cancelar",
+    "app.captions.pad.tip": "Pulse la tecla Esc para enfocar la barra de herramientas de edición",
+    "app.captions.pad.ownership": "Tomar el control",
     "app.note.title": "Notas compartidas",
     "app.note.label": "Nota",
     "app.note.hideNoteLabel": "Ocultar nota",
@@ -103,8 +109,7 @@
     "app.presentation.presentationToolbar.fitToPage": "Ajustar presentación al tamaño de la página",
     "app.presentation.presentationToolbar.goToSlide": "Diapositiva {0}",
     "app.presentationUploder.title": "Presentación",
-    "app.presentationUploder.message": "Como presentador puedes cargar cualquier documento Office o archivo PDF. Se recomienda utilizar PDF para mejores resultados.",
-    "app.presentationUploder.confirmLabel": "Cargar",
+    "app.presentationUploder.uploadLabel": "Cargar",
     "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.",
@@ -115,7 +120,6 @@
     "app.presentationUploder.fileToUpload": "En proceso de ser cargado ...",
     "app.presentationUploder.currentBadge": "Acual",
     "app.presentationUploder.genericError": "Ups, algo salio mal",
-    "app.presentationUploder.rejectedError": "Algunos de los archivos seleccionados fueron rechazados. Por favor verifique el mime type de los archivo",
     "app.presentationUploder.upload.progress": "Cargando ({0}%)",
     "app.presentationUploder.upload.413": "Archivo demasiado grande pasa el máximo de 200 páginas.",
     "app.presentationUploder.conversion.conversionProcessingSlides": "Procesando página {0} de {1}",
@@ -154,6 +158,10 @@
     "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": "Verdadero",
+    "app.poll.answer.false": "Falso",
+    "app.poll.answer.yes": "Si",
+    "app.poll.answer.no": "No",
     "app.poll.liveResult.usersTitle": "Usuarios",
     "app.poll.liveResult.responsesTitle": "Respuesta",
     "app.polling.pollingTitle": "Opciones de la encuesta",
@@ -225,18 +233,6 @@
     "app.submenu.video.videoQualityLabel": "Calidad de video",
     "app.submenu.video.qualityOptionLabel": "Escoger calidad del video",
     "app.submenu.video.participantsCamLabel": "Viendo webcams de participantes",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "Subtítulos",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Tomar el control",
-    "app.submenu.closedCaptions.languageLabel": "Lenguaje",
-    "app.submenu.closedCaptions.localeOptionLabel": "Seleccionar lenguaje",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "No hay locales activos",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Familia de fuente",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "Selecciona tipo de letra",
-    "app.submenu.closedCaptions.fontSizeLabel": "Tamaño de fuente",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "Selecciona tamaño de letra",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Color de fondo",
-    "app.submenu.closedCaptions.fontColorLabel": "Color de fuente",
-    "app.submenu.closedCaptions.noLocaleSelected": "Idioma no seleccionado",
     "app.submenu.participants.muteAllLabel": "Deshabilitar audio a todos menos al presentador",
     "app.submenu.participants.lockAllLabel": "Bloquear a todos los usuarios",
     "app.submenu.participants.lockItemLabel": "Espectadores {0}",
@@ -258,7 +254,6 @@
     "app.settings.applicationTab.label": "Aplicación",
     "app.settings.audioTab.label": "Audio",
     "app.settings.videoTab.label": "Video",
-    "app.settings.closedcaptionTab.label": "Subtítulos",
     "app.settings.usersTab.label": "Participantes",
     "app.settings.main.label": "Configuración",
     "app.settings.main.cancel.label": "Cancela",
@@ -327,7 +322,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "El micrófono ha sido bloqueado para todos los espectadores, tu conexión es en modo \"solo escuchar\"",
     "app.breakoutJoinConfirmation.title": "Ingresar a un grupo de trabajo",
     "app.breakoutJoinConfirmation.message": "Quieres unirte",
-    "app.breakoutJoinConfirmation.confirmLabel": "Unirte",
     "app.breakoutJoinConfirmation.confirmDesc": "Ingresar a un grupo de trabajo",
     "app.breakoutJoinConfirmation.dismissLabel": "Cancelar",
     "app.breakoutJoinConfirmation.dismissDesc": "Cierra y rechaza entrada a grupo de trabajo",
diff --git a/bigbluebutton-html5/private/locales/eu.json b/bigbluebutton-html5/private/locales/eu.json
index fa393049785fe8be00ca6b3ab1e52913d08856cf..9f29792c1a034039a364e0757e5d4d923fd77fdb 100644
--- a/bigbluebutton-html5/private/locales/eu.json
+++ b/bigbluebutton-html5/private/locales/eu.json
@@ -18,6 +18,11 @@
     "app.chat.label": "Txata",
     "app.chat.emptyLogLabel": "Txataren erregistroa hutsik dago",
     "app.chat.clearPublicChatMessage": "Moderatzaile batek txat publikoaren historia garbitu du",
+    "app.captions.menu.close": "Itxi",
+    "app.captions.menu.backgroundColor": "Atzeko planoaren kolorea",
+    "app.captions.menu.cancelLabel": "Utzi",
+    "app.captions.pad.tip": "Sakatu Esc edizioaren tresna-barra fokuratzeko",
+    "app.captions.pad.ownership": "Hartu jabetza",
     "app.note.title": "Ohar partekatuak",
     "app.note.label": "Oharra",
     "app.note.hideNoteLabel": "Ezkutatu oharra",
@@ -103,8 +108,7 @@
     "app.presentation.presentationToolbar.fitToPage": "Doitu orrira",
     "app.presentation.presentationToolbar.goToSlide": "{0}. diapositiba",
     "app.presentationUploder.title": "Aurkezpena",
-    "app.presentationUploder.message": "Aurkezle gisa kargatzen ahal dituzu bulegoko dokumentuak edo PDF fitxategiak. Emaitza onenak izateko PDFa kargatzea gomendatzen dugu.",
-    "app.presentationUploder.confirmLabel": "Kargatu",
+    "app.presentationUploder.uploadLabel": "Kargatu",
     "app.presentationUploder.confirmDesc": "Gorde aldaketak eta hasi aurkezpena",
     "app.presentationUploder.dismissLabel": "Utzi",
     "app.presentationUploder.dismissDesc": "Itxi leihoa eta baztertu aldaketak",
@@ -115,7 +119,6 @@
     "app.presentationUploder.fileToUpload": "Kargatzeko ...",
     "app.presentationUploder.currentBadge": "Unekoa",
     "app.presentationUploder.genericError": "Ops, zerbait oker joan da",
-    "app.presentationUploder.rejectedError": "Hautatutako zenbait fitxategi ukatu dira. Begiratu fitxategien luzapenak.",
     "app.presentationUploder.upload.progress": "Kargatzen (%{0})",
     "app.presentationUploder.upload.413": "Fitxategi handiegia, 200 orriko maximoa gainditu du",
     "app.presentationUploder.conversion.conversionProcessingSlides": "{1} orritatik {0} prozesatzen",
@@ -155,6 +158,10 @@
     "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": "Egia",
+    "app.poll.answer.false": "Faltsua",
+    "app.poll.answer.yes": "Bai",
+    "app.poll.answer.no": "Ez",
     "app.poll.liveResult.usersTitle": "Erabiltzaileak",
     "app.poll.liveResult.responsesTitle": "Erantzuna",
     "app.polling.pollingTitle": "Inkestaren aukerak",
@@ -226,18 +233,6 @@
     "app.submenu.video.videoQualityLabel": "Bideo kalitatea",
     "app.submenu.video.qualityOptionLabel": "Aukeratu bideo kalitatea",
     "app.submenu.video.participantsCamLabel": "Parte-hartzaileen web-kamerak ikustea",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "Azpitituluak",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Hartu jabetza",
-    "app.submenu.closedCaptions.languageLabel": "Hizkuntza",
-    "app.submenu.closedCaptions.localeOptionLabel": "Aukeratu hizkuntza",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "Gogoko hizkuntza aktibatu gabe dago",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Letra mota",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "Aukeratu letra mota",
-    "app.submenu.closedCaptions.fontSizeLabel": "Letra tamaina",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "Aukeratu letra tamaina",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Atzeko planoaren kolorea",
-    "app.submenu.closedCaptions.fontColorLabel": "Letra-kolorea",
-    "app.submenu.closedCaptions.noLocaleSelected": "Gogoko hizkuntza hautatu gabe dago",
     "app.submenu.participants.muteAllLabel": "Isilarazi guztiak aurkezlea izan ezik",
     "app.submenu.participants.lockAllLabel": "Blokeatu ikusle guztiak",
     "app.submenu.participants.lockItemLabel": "Ikusleak {0}",
@@ -259,7 +254,6 @@
     "app.settings.applicationTab.label": "Aplikazioa",
     "app.settings.audioTab.label": "Audioa",
     "app.settings.videoTab.label": "Bideoa",
-    "app.settings.closedcaptionTab.label": "Azpitituluak",
     "app.settings.usersTab.label": "Parte hartzaileak",
     "app.settings.main.label": "Ezarpenak",
     "app.settings.main.cancel.label": "Utzi",
@@ -328,7 +322,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "Ikusleek mikrofonoak blokeatuta dituzte, soilik entzuteko moduan konektatzen ari zara",
     "app.breakoutJoinConfirmation.title": "Sartu taldeko gelan",
     "app.breakoutJoinConfirmation.message": "Sartu nahi duzu",
-    "app.breakoutJoinConfirmation.confirmLabel": "Sartu",
     "app.breakoutJoinConfirmation.confirmDesc": "Sartu taldeko gelan",
     "app.breakoutJoinConfirmation.dismissLabel": "Utzi",
     "app.breakoutJoinConfirmation.dismissDesc": "Itxi eta uko egiten dio taldeko gelan sartzeari",
diff --git a/bigbluebutton-html5/private/locales/fa_IR.json b/bigbluebutton-html5/private/locales/fa_IR.json
index 32545680af5f4a10e1f14403050de313be7fa0c3..e08ace74bc73f0f475ba9078c9ec72d9e879e386 100644
--- a/bigbluebutton-html5/private/locales/fa_IR.json
+++ b/bigbluebutton-html5/private/locales/fa_IR.json
@@ -1,76 +1,199 @@
 {
+    "app.home.greeting": "ارائه شما به زودی آغاز خواهد شد ...",
     "app.chat.submitLabel": "ارسال پیام",
-    "app.chat.errorMinMessageLength": "پیام شما {0} کاراکتر(0) است، برای ارسال، کوتاه است.",
-    "app.chat.errorMaxMessageLength": "پیام شما {0} کارکتر(0) است  و برای ارسال خیلی طولانیست.",
-    "app.chat.inputLabel": "ورودی پیام برای چت{0}",
-    "app.chat.inputPlaceholder": "پیام{0}",
+    "app.chat.errorMinMessageLength": "پیام {0} کاراکتر(ی) بسیار کوتاه است",
+    "app.chat.errorMaxMessageLength": "پیام {0} کاراکتر(ی) بسیار بلند است",
+    "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.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.dropdown.clear": "پاکسازی",
+    "app.chat.dropdown.copy": "کپی",
+    "app.chat.dropdown.save": "ذخیره",
     "app.chat.label": "گفتگو",
+    "app.chat.offline": "آفلاین",
     "app.chat.emptyLogLabel": "پاک کردن سابقه گفتگو",
-    "app.chat.clearPublicChatMessage": "سابقه گفتگوها توسط مدیر حذف گردید.",
-    "app.userList.usersTitle": "دانش آموزان",
-    "app.userList.participantsTitle": "دانش آموزان",
+    "app.chat.clearPublicChatMessage": "سابقه گفتگوها توسط مدیر حذف گردید",
+    "app.captions.label": "عناوین",
+    "app.captions.menu.close": "بستن",
+    "app.captions.menu.start": "شروع",
+    "app.captions.menu.select": "انتخاب زبان موجود",
+    "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.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.presenter": "استاد",
+    "app.userList.notesTitle": "یاددادشت ها",
+    "app.userList.captionsTitle": "عناوین",
+    "app.userList.presenter": "ارائه دهنده",
     "app.userList.you": "شما",
     "app.userList.locked": "قفل شده",
-    "app.userList.toggleCompactView.label": "مخفی کردن نوار ابزار",
+    "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.menu.unmuteUserAudio.label": "فعال سازی صدای کاربر",
     "app.userList.userAriaLabel": "{0} {1} {2} وضعیت {3}",
     "app.userList.menu.promoteUser.label": "ارتقا نقش به مدیر",
-    "app.userList.menu.demoteUser.label": "تبدیل به دانش آموز",
-    "app.media.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.webcamsOnlyForModerator": "تنها مدیران امکان مشاهده دوربین های کاربران را دارند (به دلیل تنظیمات قفل)",
+    "app.media.label": "صدا و تصویر",
     "app.media.screenshare.start": "اشتراک صفحه نمایش شروع شد",
     "app.media.screenshare.end": "اشتراک صفحه نمایش به پایان رسید.",
-    "app.media.screenshare.safariNotSupported": "در حال حاضر اشتراک صفحه نمایش در مرورگر سافاری پشتیبانی نمیشد، لطفا از کروم یا فایرفاکس استفاده کنید.",
+    "app.media.screenshare.safariNotSupported": "در حال حاضر اشتراک صفحه نمایش در مرورگر سافاری پشتیبانی نمیشود، لطفا از کروم یا فایرفاکس استفاده کنید.",
     "app.meeting.ended": "جلسه پایان یافت",
-    "app.meeting.endedMessage": "شما در حال انتقال به صفحه اصلی هستید.",
+    "app.meeting.meetingTimeRemaining": "زمان باقی مانده از جلسه: {0}",
+    "app.meeting.meetingTimeHasEnded": "زمان جلسه به اتمام رسید. جلسه در اسرع وقت بسته خواهد شد",
+    "app.meeting.endedMessage": "شما در حال انتقال به صفحه اصلی هستید",
+    "app.meeting.alertMeetingEndsUnderOneMinute": "جلسه ظرف یک دقیقه آینده بسته خواهد شد.",
+    "app.meeting.alertBreakoutEndsUnderOneMinute": "جلسه ظرف یک دقیقه آینده به اتمام خواهد رسید.",
+    "app.presentation.hide": "پنهان سازی ارائه",
+    "app.presentation.notificationLabel": "ارائه کنونی",
+    "app.presentation.slideContent": "محتوای اسلاید",
+    "app.presentation.startSlideContent": "شروع محتوای اسلاید",
+    "app.presentation.endSlideContent": "انتهای محتوای اسلاید",
+    "app.presentation.emptySlideContent": "محتوایی برای اسلاید کنونی وجود ندارد",
+    "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.skipSlideLabel": "رد کردن اسلاید",
     "app.presentation.presentationToolbar.skipSlideDesc": "تغییر ارائه به یک اسلاید خاص",
-    "app.presentation.presentationToolbar.fitWidthLabel": "اندازه تصویر را متناسب با عرض صفحه کن.",
+    "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.fitToWidth": "اندازه تصویر را متناسب با عرض صفحه کن.",
+    "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.uploadLabel": "بارگزاری",
     "app.presentationUploder.confirmDesc": "تغییرات خود را ذخیره کنید و ارائه را آغاز نمایید.",
-    "app.presentationUploder.dismissLabel": "کنسل",
+    "app.presentationUploder.dismissLabel": "لغو",
     "app.presentationUploder.dismissDesc": "بستن پنجره و حذف تغییرات شما",
-    "app.presentationUploder.dropzoneLabel": "فایل های خود را برای آپلود به اینجا بکشید.",
+    "app.presentationUploder.dropzoneLabel": "فایل های خود را برای آپلود کشیده و در اینجا رها کنید",
+    "app.presentationUploder.dropzoneImagesLabel": "تصاویر را به منظور بارگزاری اینجا رها کنید",
     "app.presentationUploder.browseFilesLabel": "یا برای انتخاب فایل کلیک کنید.",
-    "app.presentationUploder.currentBadge": "جاری",
-    "app.presentationUploder.genericError": "اشتباهی اتفاق افتاد.",
-    "app.presentationUploder.upload.progress": "در حال آپلود ({0}%)",
+    "app.presentationUploder.browseImagesLabel": "یا عکس ها را بروز/بگیر",
+    "app.presentationUploder.fileToUpload": "به منظور بارگزاری ...",
+    "app.presentationUploder.currentBadge": "کنونی",
+    "app.presentationUploder.genericError": "اوپس، خطایی رخ داد",
+    "app.presentationUploder.rejectedError": "فایل(های) انتخاب شده رد شدند. لطفا نوع فایل(ها) را بررسی کنید",
+    "app.presentationUploder.upload.progress": "در حال بارگزاری ({0}%)",
+    "app.presentationUploder.upload.413": "اندازه فایل بسیار بزرگ است، به ماکسیمم تعداد 200 صفحه رسید",
     "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": "اوپس، تعداد حداکثر صفحات از 200 صفحه بیشتر شده است",
+    "app.presentationUploder.conversion.timeout": "اوپس، عملیات تبدیل خیلی طول کشید",
+    "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": "گزینه نظرسنجی شخصی {0} از {1}",
+    "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.liveResult.usersTitle": "دانش آموزان",
+    "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",
+    "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.failedMessage": "عذر خواهی، مشکلی در اتصال به سرور به وجود آمده است.",
+    "app.downloadPresentationButton.label": "دانلود فایل اصلی ارائه",
+    "app.connectingMessage": "در حال اتصال ...",
+    "app.waitingMessage": "ارتباط قطع شد. در حال تلاش مجدد در {0} ثانیه ...",
     "app.navBar.settingsDropdown.optionsLabel": "گزینه ها",
     "app.navBar.settingsDropdown.fullscreenLabel": "تمام صفحه",
     "app.navBar.settingsDropdown.settingsLabel": "تنظیمات",
@@ -78,52 +201,73 @@
     "app.navBar.settingsDropdown.leaveSessionLabel": "خروج",
     "app.navBar.settingsDropdown.exitFullscreenLabel": "بستن حالت تمام صفحه",
     "app.navBar.settingsDropdown.fullscreenDesc": "منوی تنظیمات را تمام صفحه کن",
-    "app.navBar.settingsDropdown.settingsDesc": "تغییر تنظیمات معمول",
-    "app.navBar.settingsDropdown.aboutDesc": "نمایش اطلاعات دانش آموز",
+    "app.navBar.settingsDropdown.settingsDesc": "تغییر تنظیمات عمومی",
+    "app.navBar.settingsDropdown.aboutDesc": "نمایش اطلاعات مربوط به کاربران",
     "app.navBar.settingsDropdown.leaveSessionDesc": "ترک جلسه",
     "app.navBar.settingsDropdown.exitFullscreenDesc": "خروج از حالت تمام صفحه",
-    "app.navBar.userListToggleBtnLabel": "نمایش لیست کاربران",
-    "app.navBar.toggleUserList.newMessages": "با اعلان پیام جدید",
-    "app.navBar.recording": "جلسه در حال ضبط شدن است.",
+    "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.recording.off": "ضبط نمیشود",
     "app.leaveConfirmation.confirmLabel": "ترک",
-    "app.leaveConfirmation.confirmDesc": "پیام های شما بیرون از جلسه",
+    "app.leaveConfirmation.confirmDesc": "شما را از جلسه خارج میکند",
+    "app.endMeeting.title": "اتمام جلسه",
+    "app.endMeeting.description": "آیا مطمئنید که میخواهید این جلسه را به اتمام برسانید؟",
     "app.endMeeting.yesLabel": "بله",
     "app.endMeeting.noLabel": "خیر",
     "app.about.title": "درباره",
-    "app.about.copyright": "کپی رایت",
+    "app.about.version": "نسخه کاربر:",
+    "app.about.copyright": "حق نشر",
     "app.about.confirmLabel": "تایید",
     "app.about.confirmDesc": "تایید",
-    "app.about.dismissLabel": "کنسل",
-    "app.about.dismissDesc": "بستن قسمت درباره کاربر",
+    "app.about.dismissLabel": "لغو",
+    "app.about.dismissDesc": "بستن قسمت اطلاعات کاربر",
+    "app.actionsBar.changeStatusLabel": "تغییر وضعیت",
     "app.actionsBar.muteLabel": "حالت بی صدا",
     "app.actionsBar.unmuteLabel": "فعال سازی صدا",
+    "app.actionsBar.camOffLabel": "خاموش کردن دوربین",
     "app.actionsBar.raiseLabel": "اجازه گرفتن از استاد",
-    "app.submenu.application.applicationSectionTitle": "نرم افزار",
+    "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.fontSizeControlLabel": "اندازه متن",
-    "app.submenu.application.increaseFontBtnLabel": "افزایش اندازه متن نرم افزار",
-    "app.submenu.application.decreaseFontBtnLabel": "کاهش اندازه متن نرم افزار",
-    "app.submenu.application.languageLabel": "زبان نرم افزار",
+    "app.submenu.application.increaseFontBtnLabel": "افزایش اندازه متن برنامه",
+    "app.submenu.application.decreaseFontBtnLabel": "کاهش اندازه متن برنامه",
+    "app.submenu.application.currentSize": "در حال حاضر {0}",
+    "app.submenu.application.languageLabel": "زبان برنامه",
+    "app.submenu.application.ariaLanguageLabel": "تغییر زبان برنامه",
     "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.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.submenu.closedCaptions.takeOwnershipLabel": "بدست گرفتن کنترل",
-    "app.submenu.closedCaptions.languageLabel": "زبان",
-    "app.submenu.closedCaptions.localeOptionLabel": "انتخاب زبان",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "هیچ زبان فعالی وجود ندارد.",
-    "app.submenu.closedCaptions.fontFamilyLabel": "فونت",
-    "app.submenu.closedCaptions.fontSizeLabel": "اندازه فونت",
-    "app.submenu.closedCaptions.backgroundColorLabel": "رنگ پس زمینه",
-    "app.submenu.closedCaptions.fontColorLabel": "رنگ متن",
+    "app.submenu.video.participantsCamLabel": "مشاهده دوربین شرکت کنندگان",
     "app.submenu.participants.muteAllLabel": "غیر فعال سازی صدای کاربران به جز اساتید",
+    "app.submenu.participants.lockAllLabel": "قفل کردن همه کاربران",
+    "app.submenu.participants.lockItemLabel": "کاربران {0}",
+    "app.submenu.participants.lockMicDesc": "غیرفعال کردن میکروفون برای تمامی کاربران قفل شده",
+    "app.submenu.participants.lockCamDesc": "غیرفعال کردن دوربین برای تمامی کاربران قفل شده",
+    "app.submenu.participants.lockPublicChatDesc": "غیرفعال کردن گفتگوی عمومی برای همه کاربران قفل شده",
+    "app.submenu.participants.lockPrivateChatDesc": "غیرفعال سازی گفتگوی خصوصی برای تمام کابران قفل شده",
+    "app.submenu.participants.lockLayoutDesc": "قفل کردن چینش صفحه برای همه کاربران قفل شده",
     "app.submenu.participants.lockMicAriaLabel": "قفل کردن میکروفن",
     "app.submenu.participants.lockCamAriaLabel": "قفل کردن دوربین",
     "app.submenu.participants.lockPublicChatAriaLabel": "قفل کردن گفتگوی عمومی",
@@ -131,135 +275,249 @@
     "app.submenu.participants.lockLayoutAriaLabel": "قفل کردن چینش تصویر",
     "app.submenu.participants.lockMicLabel": "میکروفن",
     "app.submenu.participants.lockCamLabel": "دوربین",
+    "app.submenu.participants.lockPublicChatLabel": "گفتگوی عمومی",
+    "app.submenu.participants.lockPrivateChatLabel": "گفتگوی خصوصی",
     "app.submenu.participants.lockLayoutLabel": "چینش تصویر",
     "app.settings.applicationTab.label": "نرم افزار",
     "app.settings.audioTab.label": "صدا",
-    "app.settings.videoTab.label": "تصویر کلاس",
-    "app.settings.usersTab.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.description": "برای صرفه جویی در مصرف اینترنت آیتم هایی که باید نمایش داده شوند را انتخاب کنید.",
+    "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.actionsBar.actionsDropdown.actionsLabel": "فعالیت ها",
-    "app.actionsBar.actionsDropdown.presentationLabel": "آپلود فایل ارائه",
+    "app.actionsBar.actionsDropdown.presentationLabel": "بارگزاری فایل ارائه",
     "app.actionsBar.actionsDropdown.initPollLabel": "ایجاد نظرسنجی",
-    "app.actionsBar.actionsDropdown.desktopShareLabel": "اشتراک صفحه نمایش شما",
-    "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "متوقف کردن اشتراک گذاری دسکتاپ شما",
+    "app.actionsBar.actionsDropdown.desktopShareLabel": "اشتراک صفحه نمایش",
+    "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "متوقف کردن اشتراک گذاری میز کار",
     "app.actionsBar.actionsDropdown.presentationDesc": "آپلود فایل ارائه شما",
     "app.actionsBar.actionsDropdown.initPollDesc": "ایجاد نظرسنجی",
-    "app.actionsBar.actionsDropdown.desktopShareDesc": "اشتراک گذاری تصویر کامپیوتر شما با دیگران",
-    "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "توقف اشتراک گذاری تصویر کامپیوتر شما با دیگران",
-    "app.actionsBar.emojiMenu.awayLabel": "عدم حضور در کلاس",
-    "app.actionsBar.emojiMenu.awayDesc": "تغییر وضعیت شما به عدم حضور در کلاس",
+    "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.raiseHandDesc": "دست خود را بالا برده تا از استاد درخواست سوال کنید",
     "app.actionsBar.emojiMenu.neutralLabel": "تصمیم گیری نشده",
-    "app.actionsBar.emojiMenu.neutralDesc": "تغییر وضعیت شما به تصمیم گیری نشده",
-    "app.actionsBar.emojiMenu.confusedLabel": "کامل نفهمیدم",
-    "app.actionsBar.emojiMenu.confusedDesc": "تغییر وضعیت شما به وضعیت کامل نفهمیدم",
+    "app.actionsBar.emojiMenu.neutralDesc": "تغییر وضعیت خود به تصمیم گیری نشده",
+    "app.actionsBar.emojiMenu.confusedLabel": "گیج شدم",
+    "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.happyDesc": "تغییر وضعیت خود به خوشحال",
     "app.actionsBar.emojiMenu.noneLabel": "پاک کردن وضعیت",
-    "app.actionsBar.emojiMenu.noneDesc": "پاک کردن وضعیت شما",
-    "app.actionsBar.emojiMenu.applauseLabel": "تحسین کردن.",
-    "app.actionsBar.emojiMenu.applauseDesc": "تغییر وضعیت شما به تحسین کردن",
+    "app.actionsBar.emojiMenu.noneDesc": "پاک کردن وضعیت خود",
+    "app.actionsBar.emojiMenu.applauseLabel": "تحسین",
+    "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.audioNotification.audioFailedError1001": "خطای 1001: سوکت شما قطع شد",
-    "app.audioNotification.audioFailedError1002": "خطای 1002: امکان ارتباط با سوکت برای شما فراهم نیست، وضعیت نت خود را بررسی کنید یا آن را تغییر دهید.",
-    "app.audioNotification.audioFailedError1003": "خطای 1003: نسخه مرورگر شما برای کلاس مناسب نیست.",
-    "app.audioNotification.audioFailedError1005": "خطای 1005: تماس به صورت نامشخصی قطع شد",
-    "app.audioNotification.audioFailedError1006": "خطای 1006: تماس بسیار طولانی شد",
-    "app.audioNotification.audioFailedError1007": "خطای 1007: خطای ارتباط ice",
-    "app.audioNotification.audioFailedError1008": "خطای 1008: انتقال میسر نشد",
-    "app.audioNotification.audioFailedError1009": "خطای 1009: امکان پیدا کردن STUN/TURN وجود ندارد.",
-    "app.audioNotification.audioFailedError1010": "خطای 1010: ICE برقرار نشد اینترنت خود را چک کنید.",
-    "app.audioNotification.audioFailedError1011": "خطای 1011: ICE برقرار نشد",
-    "app.audioNotification.audioFailedMessage": "امکان اتصال صدای شما فراهم نیست.",
+    "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": "خطای 1004: خطا در تماس (دلیل = {0})",
+    "app.audioNotification.audioFailedError1005": "خطای 1005: تماس به دلیل نامشخصی قطع شد",
+    "app.audioNotification.audioFailedError1006": "خطای 1006: تماس با خطای تایم اوت مواجه شد",
+    "app.audioNotification.audioFailedError1007": "خطای 1007: مذاکره برای ICE با خطا مواجه شد",
+    "app.audioNotification.audioFailedError1008": "خطای 1008: انتقال با خطا مواجه شد",
+    "app.audioNotification.audioFailedError1009": "خطای 1009: امکان دریافت اطلاعات STUN/TURN وجود ندارد",
+    "app.audioNotification.audioFailedError1010": "خطای 1010: مذاکره برای ICE با خطای تایم اوت مواجه شد",
+    "app.audioNotification.audioFailedError1011": "خطای 1011: گردآوری اطلاعات از ICE با خطا مواجه شد",
+    "app.audioNotification.audioFailedError1012": "خطا 1012: اتصال ICE بسته شد",
+    "app.audioNotification.audioFailedMessage": "اتصال صدای شما با خطا موجه شد",
+    "app.audioNotification.mediaFailedMessage": "متد getUserMicMedia به دلیل اینکه اتصال تنها از طریق لینک امن امکان پذیر است، با خطا مواجه شد",
     "app.audioNotification.closeLabel": "بستن",
-    "app.breakoutJoinConfirmation.message": "آیا میخواهید وارد شوید",
-    "app.breakoutJoinConfirmation.confirmLabel": "پیوستن",
-    "app.breakoutJoinConfirmation.dismissLabel": "کنسل",
-    "app.audioModal.microphoneLabel": "گوینده هم باشم.",
-    "app.audioModal.audioChoiceLabel": "چگونه میخواهید صدا را دریافت کنید.",
-    "app.audioModal.iOSErrorDescription": "در حال حاضر صدا و تصویر در کروم iOS پشتیبانی نمیشود.",
-    "app.audioModal.iOSErrorRecommendation": "پیشنهاد ما استفاده از سافاری است.",
-    "app.audioModal.audioChoiceDesc": "انتخاب کنید چگونه صدا را در این جلسه میخواهید دریافت کنید",
+    "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.connecting": "در حال اتصال...",
-    "app.audioModal.connectingEchoTest": "اتصال به تست اکو",
+    "app.audioModal.helpTitle": "مشکلی در سخت افزار صوت و تصویر شما وجود دارد",
+    "app.audioModal.helpText": "آیا شما مجوز استفاده از میکروفون خود را داده اید؟ شایان ذکر است که هنگام اتصال به بخش صدا یک کادر میبایست باز شود که از شما مجوز دسترسی به بخش مدیا را درخواست کند، لطفا آن را برای اتصال به بخش صدا قبول کنید. اگر مشکل این نیست، تنظیمات مجوزات میکروفون در مرورگر خود را تغییر دهید.",
+    "app.audioModal.audioDialTitle": "پیوستن به بخش صوتی با استفاده از تلفن خود",
+    "app.audioDial.audioDialDescription": "شماره گیری",
+    "app.audioDial.audioDialConfrenceText": "و عدد پین کنفرانس را وارد کنید:",
+    "app.audioModal.connecting": "در حال اتصال",
+    "app.audioModal.connectingEchoTest": "در حال اتصال به آزمایش اِکو",
     "app.audioManager.joinedAudio": "شما به جلسه صوتی وارد شده اید",
     "app.audioManager.joinedEcho": "شما به تست اکو پیوسته اید",
     "app.audioManager.leftAudio": "شما جلسه صوتی را ترک کرده اید",
-    "app.audioManager.genericError": "خطا: مشکلی پیش آمده است لطفا مجدد سعی کنید.",
+    "app.audioManager.genericError": "خطا: مشکلی پیش آمده است، لطفا مجدد سعی کنید.",
     "app.audioManager.connectionError": "خطا: خطای ارتباط",
-    "app.audioManager.requestTimeout": "خطا: خطای طول کشیدن بیش از اندازه در درخواست.",
-    "app.audioManager.invalidTarget": "خطا: تلاش برای درخواست چیزی غیر صحیح",
-    "app.audioManager.mediaError": "خطا: مشکلی در اتصال سخت افزار شما با کلاس موجود است.",
+    "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.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.closeLabel": "بستن",
-    "app.audio.permissionsOverlay.title": "اجازه دهید کلاس به میکروفن  شما دسترسی داشته باشد.",
-    "app.error.removed": "شما از کنفرانس کنار گذاشته شده اید.",
+    "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.401": "شناسایی نشد",
+    "app.error.400": "درخواست اشتباه",
+    "app.error.401": "احراز هویت نشده",
+    "app.error.403": "شما از جلسه حذف شدید",
     "app.error.404": "پیدا نشد",
-    "app.error.500": "خطای پیش آمده است.",
-    "app.error.leaveLabel": "ورود مجدد",
-    "app.guest.waiting": "منتظر تایید جهت پیوستن",
+    "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.notification.recordingStart": "جلسه در حال ضبط شدن است",
-    "app.notification.recordingStop": "جلسه دیگر ضبط نمیشود.",
-    "app.shortcut-help.comboLabel": "کمبو",
+    "app.notification.recordingStop": "جلسه دیگر ضبط نمیشود",
+    "app.notification.recordingAriaLabel": "زمان رکورد شده",
+    "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.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": "فعالسازی ابزار Pan (ارائه دهنده)",
+    "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.Layout": "چینش تصویر",
-    "app.videoPreview.cancelLabel": "کنسل",
+    "app.lock-viewers.PublicChatLabel": "گفتگوی عمومی",
+    "app.lock-viewers.PrivateChatLable": "گفتگوی خصوصی",
+    "app.lock-viewers.notesLabel": "یادداشت های اشتراکی",
+    "app.lock-viewers.Layout": "چینش صفحه",
+    "app.lock-viewers.ariaTitle": "قفل کردن کادر کاربران",
+    "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.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": "خطای 1107: مذاکره برای ICE با شکست مواجه شد",
+    "app.video.permissionError": "خطا در اشتراک گذاری دوربین. لطفا مجوزات دسترسی را بررسی کنید",
     "app.video.sharingError": "خطا در اشتراک دوربین",
-    "app.video.notFoundError": "دوربین یافت نشد. لطفا مطمئن شوید که دوربین متصل است.",
-    "app.video.notAllowed": "اجازه دسترسی مرورگر به دوربین داده نشده است. لطفا دسترسی های مرورگر را چک کنید.",
-    "app.video.notSupportedError": "مطمئن شوید SSL فعال است.",
-    "app.video.notReadableError": "عدم امکان دسترسی به داده های دوربین، مطمئن شوید دوربین شما جای دیگری درگیر نیست.",
+    "app.video.notFoundError": "دوربین یافت نشد. لطفا مطمئن شوید که دوربین وصل است",
+    "app.video.notAllowed": "اجازه دسترسی مرورگر به دوربین داده نشده است. لطفا دسترسی های مرورگر را بررسی کنید.",
+    "app.video.notSupportedError": "تنها امکان اشتراک ویدئو از منابع امن امکان پذیر است، مطمئن شوید گواهی SSL تان معتبر است",
+    "app.video.notReadableError": "عدم امکان دسترسی به دوربین، مطمئن شوید دوربین شما توسط برنامه دیگری در حال استفاده نیست",
+    "app.video.mediaFlowTimeout1020": "خطای 1020: اتصال با سرور برقرار نشد",
     "app.video.swapCam": "جابجا کردن",
-    "app.video.swapCamDesc": "جابجا کردن موقعیت تصویر دوربین ها",
+    "app.video.swapCamDesc": "جابجا کردن جهت تصویر دوربین ها",
+    "app.video.videoLocked": "اشتراک گذاری  دوبین قفل شده است",
+    "app.video.videoButtonDesc": "دگمه اتصال به ویدئو",
     "app.video.videoMenu": "منوی دوربین",
-    "app.video.videoMenuDesc": "منوی تنظیمات دوربین",
-    "app.video.chromeExtensionError": "شما باید نصب کنید.",
-    "app.video.stats.title": "وضعیت اتصال",
-    "app.video.stats.packetsReceived": "بسته های دریافت شده.",
+    "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": "بیت ریت",
@@ -269,49 +527,102 @@
     "app.video.stats.codec": "کدک",
     "app.video.stats.decodeDelay": "تاخیر بازگشایی",
     "app.video.stats.rtt": "RTT",
-    "app.video.stats.encodeUsagePercent": "استفاده ENCOD",
+    "app.video.stats.encodeUsagePercent": "میزان استفاده از انکود",
     "app.video.stats.currentDelay": "تاخیر جاری",
-    "app.sfu.mediaServerConnectionError2000": "خطای 2000: عدم امکان ارتباط با سرور",
-    "app.sfu.mediaServerOffline2001": "خطای 2001: سرور مدیا اینترنت ندارد. لطفا بعدا چک کنید.",
-    "app.sfu.mediaServerNoResources2002": "خطای 2002: سرور مدیا منابع قابل دسترسی ندارد.",
-    "app.sfu.mediaServerRequestTimeout2003": "خطای 2003: درخواست های سرور مدیا TIMEOUT میشود",
-    "app.sfu.serverIceGatheringFailed2021": "خطای 2021: سرور مدیا ICE ندارد.",
-    "app.sfu.serverIceGatheringFailed2022": "خطای 2022: سرور مدیا اتصال ICE ندارد.",
-    "app.sfu.invalidSdp2202":"خطای 2202: کاربر SDP اشتباه ایجاد کرده است.",
-    "app.sfu.noAvailableCodec2203": "خطای 2203: سرور کدک متناسب را پیدا نمیکند",
-    "app.meeting.endNotification.ok.label": "باشه",
+    "app.fullscreenButton.label": "تغییر {0} به تمام صفحه",
+    "app.deskshare.iceConnectionStateError": "خطای 1108: اتصال ICE هنگام اشتراک گذاری صفحه با خطا مواجه شد",
+    "app.sfu.mediaServerConnectionError2000": "خطای 2000: عدم امکان ارتباط با سرور مدیا",
+    "app.sfu.mediaServerOffline2001": "خطای 2001: سرور مدیا در دسترس نیست. لطفا بعدا تلاش کنید.",
+    "app.sfu.mediaServerNoResources2002": "خطای 2002: سرور مدیا منابع کافی ندارد",
+    "app.sfu.mediaServerRequestTimeout2003": "خطای 2003: درخواست های سرور مدیا با تایم اون مواجه میشود",
+    "app.sfu.serverIceGatheringFailed2021": "خطای 2021: سرور مدیا امکان جمع آوری داوطلب های ICE را ندارد",
+    "app.sfu.serverIceGatheringFailed2022": "خطای 2022: اتصال ICE به سرور مدیا با شکست مواجه شد",
+    "app.sfu.mediaGenericError2200": "خطای 2200: سرور مدیا در هنگام پردازش درخواست با مشکل مواجه شد",
+    "app.sfu.invalidSdp2202":"خطای 2202: کاربر SDP نادرست ایجاد کرده است",
+    "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.undo": "لغو حاشیه نویسی",
     "app.whiteboard.toolbar.clear": "پاک کردن همه حاشیه نویسی ها",
-    "app.whiteboard.toolbar.multiUserOn": "فعال کردن حالت چند کابره",
-    "app.whiteboard.toolbar.multiUserOff": "خاموش کردن حالت چند کاربره",
-    "app.feedback.title": "شما از کنفرانس بیرون رفته اید",
-    "app.feedback.subtitle": "بسیار ممنون میشویم نظر خود را در خصوص کلاس بفرمایید(نظر شما)",
-    "app.feedback.textarea": "چگونه میتوان کلاس را بهتر کرد؟",
-    "app.feedback.sendFeedback": "ارسال پیشنهاد و انتقاد",
+    "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.webcamFocusDesc": "تمرکز روی دوربین انتخاب شده",
     "app.videoDock.webcamUnfocusLabel": "خروج از حالت تمرکز",
-    "app.videoDock.webcamUnfocusDesc": "خروج از حالت تمرکز در دوربین انتخاب شده",
+    "app.videoDock.webcamUnfocusDesc": "خروج از حالت تمرکز روی دوربین انتخاب شده",
+    "app.invitation.title": "دعوت به اتاق زیرمجموعه",
+    "app.invitation.confirm": "دعوت",
+    "app.createBreakoutRoom.title": "اتاق های زیرمجموعه",
+    "app.createBreakoutRoom.ariaTitle": "پنهان سازی اتاق های زیرمجموعه",
+    "app.createBreakoutRoom.breakoutRoomLabel": "اتاق های زیرمجموعه {0}",
+    "app.createBreakoutRoom.generatingURL": "در حال تولید ادرس",
+    "app.createBreakoutRoom.generatedURL": "تولید شده",
+    "app.createBreakoutRoom.duration": "طول {0}",
+    "app.createBreakoutRoom.room": "اتاق {0}",
+    "app.createBreakoutRoom.notAssigned": "واگذار نشده ({0})",
+    "app.createBreakoutRoom.join": "پیوستن به اتاق",
     "app.createBreakoutRoom.joinAudio": "پیوستن به صدا",
-    "app.externalVideo.close": "بستن"
+    "app.createBreakoutRoom.returnAudio": "صدای بازگشتی",
+    "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.externalVideo.start": "به اشتراک گذاری ویدئو جدید",
+    "app.externalVideo.title": "اشتراک گذاری ویدئوی یوتیوب",
+    "app.externalVideo.input": "ادرس ویدئوی یوتیوب",
+    "app.externalVideo.urlInput": "افزودن ادرس ویدئو یوتیوب",
+    "app.externalVideo.urlError": "این آدرس یک ویدئو معتبر یوتیوب نیست",
+    "app.externalVideo.close": "بستن",
+    "app.network.connection.effective.slow": "ما مشکلاتی در  اتصال مشاهده میکنیم",
+    "app.network.connection.effective.slow.help": "چگونه درست شود؟",
+    "app.externalVideo.noteLabel": "نکته: ویدئوهای به اشتراک گذاشته شده در بازپخش ضبط نمایش داده نخواهند شد",
+    "app.actionsBar.actionsDropdown.shareExternalVideo": "اشتراک ویدئو یوتیوب",
+    "app.actionsBar.actionsDropdown.stopShareExternalVideo": "متوقف کردن اشتراک ویدئو یوتیوب",
+    "app.iOSWarning.label": "لطفا به IOS نسخه 12.2 یا بالاتر ارتقا دهید",
+    "app.legacy.unsupportedBrowser": "به نظر میرسد شما از مرورگری استفاده میکنید که پشتیبانی نمیشود. لطفا برای پشتیبانی کامل از {0} یا {1} استفاده کنید",
+    "app.legacy.upgradeBrowser": "به نظر میرسد شما از نسخه قدیمی یک مرورگر پشتیبانی شده استفاده میکنید. لطفا به منظور پشتیبانی کامل مرورگر خود را به روز رسانی کنید."
 
 }
 
diff --git a/bigbluebutton-html5/private/locales/fr.json b/bigbluebutton-html5/private/locales/fr.json
index fb1eb690824ec70773f09afca3eb38816f29fa80..dbb9cbe40dde466b40e5a01bcd9271c5c16904db 100644
--- a/bigbluebutton-html5/private/locales/fr.json
+++ b/bigbluebutton-html5/private/locales/fr.json
@@ -1,5 +1,5 @@
 {
-    "app.home.greeting": "Votre présentation commencera dans quelques instants ...",
+    "app.home.greeting": "Votre présentation commencera dans quelques instants...",
     "app.chat.submitLabel": "Envoyer message",
     "app.chat.errorMinMessageLength": "Le message est {0} caractère(s) trop court",
     "app.chat.errorMaxMessageLength": "Le message est {0} caractère(s) trop long",
@@ -16,8 +16,21 @@
     "app.chat.dropdown.copy": "Copier",
     "app.chat.dropdown.save": "Sauvegarder",
     "app.chat.label": "Discussion",
+    "app.chat.offline": "Déconnecté",
     "app.chat.emptyLogLabel": "Journal de discussion vide",
     "app.chat.clearPublicChatMessage": "L'historique des discussions publiques a été effacé par un modérateur",
+    "app.captions.label": "Sous-titre",
+    "app.captions.menu.close": "Fermer",
+    "app.captions.menu.start": "Débuter",
+    "app.captions.menu.select": "Sélectionnez une langue disponible",
+    "app.captions.menu.fontSize": "Taille",
+    "app.captions.menu.fontColor": "Couleur du texte",
+    "app.captions.menu.fontFamily": "Police d'écriture",
+    "app.captions.menu.backgroundColor": "Couleur du fond",
+    "app.captions.menu.previewLabel": "Prévisualiser",
+    "app.captions.menu.cancelLabel": "Annuler",
+    "app.captions.pad.tip": "Appuyez sur Echap pour centrer sur la barre d'outils de l'éditeur.",
+    "app.captions.pad.ownership": "S'approprier",
     "app.note.title": "Notes Partagées",
     "app.note.label": "Note",
     "app.note.hideNoteLabel": "Masquer la note",
@@ -29,6 +42,7 @@
     "app.userList.participantsTitle": "Participants",
     "app.userList.messagesTitle": "Messages",
     "app.userList.notesTitle": "Notes",
+    "app.userList.captionsTitle": "Sous-titre",
     "app.userList.presenter": "Présentateur",
     "app.userList.you": "Vous",
     "app.userList.locked": "Verrouillé",
@@ -49,14 +63,14 @@
     "app.userList.menu.unlockUser.label": "Débloquer {0}",
     "app.userList.menu.lockUser.label": "Bloquer {0}",
     "app.userList.menu.directoryLookup.label": "Recherche dans l'annuaire",
-    "app.userList.menu.makePresenter.label": "Rendre comme présentateur",
+    "app.userList.menu.makePresenter.label": "Définir comme présentateur",
     "app.userList.userOptions.manageUsersLabel": "Gérer les utilisateurs",
     "app.userList.userOptions.muteAllLabel": "Mettre en sourdine tous les utilisateurs",
     "app.userList.userOptions.muteAllDesc": "Met en sourdine tous les utilisateurs de la réunion",
-    "app.userList.userOptions.clearAllLabel": "Effacer toutes les icônes de status",
-    "app.userList.userOptions.clearAllDesc": "Effacer toutes les icônes de status des utilisateurs",
+    "app.userList.userOptions.clearAllLabel": "Effacer toutes les icônes de statut",
+    "app.userList.userOptions.clearAllDesc": "Effacer toutes les icônes de statut des utilisateurs",
     "app.userList.userOptions.muteAllExceptPresenterLabel": "Mettre en sourdine tous les utilisateurs sauf le présentateur",
-    "app.userList.userOptions.muteAllExceptPresenterDesc": "Mettre en sourdines tous les utilisateurs de la réunion sauf le présentateur",
+    "app.userList.userOptions.muteAllExceptPresenterDesc": "Mettre en sourdine tous les utilisateurs de la réunion sauf le présentateur",
     "app.userList.userOptions.unmuteAllLabel": "Désactiver la sourdine",
     "app.userList.userOptions.unmuteAllDesc": "Désactiver la sourdine pour la réunion",
     "app.userList.userOptions.lockViewersLabel": "Verrouiller les participants",
@@ -65,17 +79,20 @@
     "app.userList.userOptions.disableMic": "Les microphones des participants sont désactivés",
     "app.userList.userOptions.disablePrivChat": "Le chat privé est désactivé",
     "app.userList.userOptions.disablePubChat": "Le chat public est désactivé",
+    "app.userList.userOptions.disableNote": "Les notes partagées sont maintenant verrouillées",
+    "app.userList.userOptions.webcamsOnlyForModerator": "Seuls les modérateurs peuvent voir les webcams des participants (selon les paramètres de verrouillage)",
     "app.media.label": "Média",
     "app.media.screenshare.start": "Le Partage d'écran à commencé",
     "app.media.screenshare.end": "Le Partage d'écran s'est terminé",
     "app.media.screenshare.safariNotSupported": "Le Partage d'écran n'est pour le moment pas supporté par Safari. Veuillez utiliser Firefox ou Google Chrome.",
     "app.meeting.ended": "Cette session s'est terminée",
-    "app.meeting.meetingTimeRemaining": "Temps de réunion restant: {0}",
+    "app.meeting.meetingTimeRemaining": "Temps de réunion restant : {0}",
     "app.meeting.meetingTimeHasEnded": "Le temps s'est écoulé. La réunion sera bientôt close",
     "app.meeting.endedMessage": "Vous serez redirigé vers l'écran d'accueil",
     "app.meeting.alertMeetingEndsUnderOneMinute": "La réunion se termine dans une minute.",
     "app.meeting.alertBreakoutEndsUnderOneMinute": "La réunion privée se ferme dans une minute.",
     "app.presentation.hide": "Masquer la présentation",
+    "app.presentation.notificationLabel": "Présentation courante",
     "app.presentation.slideContent": "Contenu de la diapositive",
     "app.presentation.startSlideContent": "Début du contenu de la diapositive",
     "app.presentation.endSlideContent": "Fin du contenu de la diapositive",
@@ -99,50 +116,52 @@
     "app.presentation.presentationToolbar.zoomOutDesc": "Dézoomer de la présentation",
     "app.presentation.presentationToolbar.zoomReset": "Réinitialiser le zoom",
     "app.presentation.presentationToolbar.zoomIndicator": "Pourcentage de zoom actuel",
-    "app.presentation.presentationToolbar.fitToWidth": "Adapté à la largeur",
+    "app.presentation.presentationToolbar.fitToWidth": "Adapter à la largeur",
     "app.presentation.presentationToolbar.fitToPage": "Ajuster à la page",
     "app.presentation.presentationToolbar.goToSlide": "Diapositive {0}",
     "app.presentationUploder.title": "Présentation",
-    "app.presentationUploder.message": "En tant que présentateur, vous avez la possibilité de télécharger n'importe quel document Office ou fichier PDF. Nous recommandons le fichier PDF pour de meilleurs résultats.",
-    "app.presentationUploder.confirmLabel": "Télécharger",
+    "app.presentationUploder.uploadLabel": "Télécharger",
     "app.presentationUploder.confirmDesc": "Sauvegardez vos modifications et lancez la présentation",
     "app.presentationUploder.dismissLabel": "Annuler",
     "app.presentationUploder.dismissDesc": "Ferme la fenêtre d'option et supprime vos modifications",
     "app.presentationUploder.dropzoneLabel": "Faites glisser les fichiers ici pour les charger",
-    "app.presentationUploder.dropzoneImagesLabel": "Faites glisser les images ici pour charger",
+    "app.presentationUploder.dropzoneImagesLabel": "Faites glisser les images ici pour les charger",
     "app.presentationUploder.browseFilesLabel": "ou parcourez pour trouver des fichiers",
     "app.presentationUploder.browseImagesLabel": "ou parcourir/capturer des images",
-    "app.presentationUploder.fileToUpload": "Pour être chargé ...",
+    "app.presentationUploder.fileToUpload": "Pour être chargé...",
     "app.presentationUploder.currentBadge": "En cours",
     "app.presentationUploder.genericError": "Oups, quelque chose s'est mal passé",
-    "app.presentationUploder.rejectedError": "Certains des fichiers sélectionnés sont rejetés. Veuillez vérifier les types de fichiers MIME.",
     "app.presentationUploder.upload.progress": "Chargement ({0}%)",
     "app.presentationUploder.upload.413": "Le fichier est trop volumineux, 200 pages maximum atteintes",
     "app.presentationUploder.conversion.conversionProcessingSlides": "Traitement de la page {0} sur {1}",
-    "app.presentationUploder.conversion.genericConversionStatus": "Conversion de fichier ...",
-    "app.presentationUploder.conversion.generatingThumbnail": "Générer des vignettes ...",
-    "app.presentationUploder.conversion.generatedSlides": "Diapositives générées ...",
-    "app.presentationUploder.conversion.generatingSvg": "Générer des images SVG ...",
+    "app.presentationUploder.conversion.genericConversionStatus": "Conversion de fichier...",
+    "app.presentationUploder.conversion.generatingThumbnail": "Génération des vignettes...",
+    "app.presentationUploder.conversion.generatedSlides": "Diapositives générées...",
+    "app.presentationUploder.conversion.generatingSvg": "Génération des images SVG...",
     "app.presentationUploder.conversion.pageCountExceeded": "Oops, le nombre de pages a dépassé la limite de 200 pages",
     "app.presentationUploder.conversion.timeout": "Oops, la conversion a pris trop de temps",
     "app.presentationUploder.isDownloadableLabel": "Ne pas autoriser le téléchargement de la présentation",
     "app.presentationUploder.isNotDownloadableLabel": "Autoriser le téléchargement de la présentation",
     "app.presentationUploder.removePresentationLabel": "Supprimer la présentation",
     "app.presentationUploder.setAsCurrentPresentation": "Définir la présentation comme courante",
+    "app.presentationUploder.tableHeading.filename": "Nom de fichier",
     "app.presentationUploder.tableHeading.options": "Options",
+    "app.presentationUploder.tableHeading.status": "Statut",
     "app.poll.pollPaneTitle": "Sondage",
     "app.poll.quickPollTitle": "Sondage Rapide",
     "app.poll.hidePollDesc": "Masque le volet du menu du sondage",
     "app.poll.customPollInstruction": "Pour créer un sondage personnalisé, sélectionnez le bouton ci-dessous et entrez vos options.",
     "app.poll.quickPollInstruction": "Sélectionnez une option ci-dessous pour démarrer votre sondage.",
     "app.poll.customPollLabel": "Sondage personnalisé",
-    "app.poll.startCustomLabel": "Start custom poll",
-    "app.poll.activePollInstruction": "Laissez cette fenêtre ouverte pour permettre aux autres de répondre au sondage. Sélectionner \"Publier les résultats de l'interrogation\" ou revenir en arrière met fin à l'interrogation.",
+    "app.poll.startCustomLabel": "Démarrez un sondage personnalisé",
+    "app.poll.activePollInstruction": "Laissez cette fenêtre ouverte pour permettre aux autres de répondre au sondage. Sélectionner \"Publier les résultats du sondage\" ou revenir en arrière met fin au sondage.",
     "app.poll.publishLabel": "Publier les résultats du sondage",
-    "app.poll.backLabel": "Retour aux options de vote",
+    "app.poll.backLabel": "Retour aux options de sondage",
     "app.poll.closeLabel": "Fermer",
+    "app.poll.waitingLabel": "En attente des réponses ({0}/{1})",
+    "app.poll.ariaInputCount": "Option de sondage personnalisé {0} de {1} ",
     "app.poll.customPlaceholder": "Ajouter une option de sondage",
-    "app.poll.noPresentationSelected": "Aucune présentation sélectionnée! SVP, sélectionnez en une.",
+    "app.poll.noPresentationSelected": "Aucune présentation sélectionnée ! Veuillez en  sélectionner une.",
     "app.poll.clickHereToSelect": "Cliquez ici pour sélectionner",
     "app.poll.t": "Vrai",
     "app.poll.f": "Faux",
@@ -154,6 +173,15 @@
     "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": "Vrai",
+    "app.poll.answer.false": "Faux",
+    "app.poll.answer.yes": "Oui",
+    "app.poll.answer.no": "Non",
+    "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": "Utilisateurs",
     "app.poll.liveResult.responsesTitle": "Réponse",
     "app.polling.pollingTitle": "Options de sondage",
@@ -161,8 +189,8 @@
     "app.polling.pollAnswerDesc": "Choisir cette option pour voter pour {0}",
     "app.failedMessage": "Problème de connexion au serveur, toutes nos excuses.",
     "app.downloadPresentationButton.label": "Télécharger la présentation originale",
-    "app.connectingMessage": "Connexion ...",
-    "app.waitingMessage": "Déconnecté. Essayez de vous reconnecter en {0} secondes ...",
+    "app.connectingMessage": "Connexion...",
+    "app.waitingMessage": "Déconnecté. Essayez de vous reconnecter dans {0} secondes...",
     "app.navBar.settingsDropdown.optionsLabel": "Options",
     "app.navBar.settingsDropdown.fullscreenLabel": "Plein écran",
     "app.navBar.settingsDropdown.settingsLabel": "Ouvrir les paramètres",
@@ -174,11 +202,14 @@
     "app.navBar.settingsDropdown.aboutDesc": "Afficher les informations du client",
     "app.navBar.settingsDropdown.leaveSessionDesc": "Quitter la conférence",
     "app.navBar.settingsDropdown.exitFullscreenDesc": "Quitter le mode plein écran",
+    "app.navBar.settingsDropdown.hotkeysLabel": "Raccourcis clavier",
+    "app.navBar.settingsDropdown.hotkeysDesc": "Liste des raccourcis clavier disponibles",
     "app.navBar.settingsDropdown.helpLabel": "Aide",
+    "app.navBar.settingsDropdown.helpDesc": "Lien utilisateur vers les tutoriels vidéo (ouvre un nouvel onglet)",
     "app.navBar.settingsDropdown.endMeetingDesc": "Termine la réunion en cours",
     "app.navBar.settingsDropdown.endMeetingLabel": "Mettre fin à la réunion",
-    "app.navBar.userListToggleBtnLabel": "Basculer l'affichage de la Liste des Utilisateurs",
-    "app.navBar.toggleUserList.ariaLabel": "Les utilisateurs et les messages bascule",
+    "app.navBar.userListToggleBtnLabel": "Basculer l'affichage sur la Liste des Utilisateurs",
+    "app.navBar.toggleUserList.ariaLabel": "Basculer sur les utilisateurs et les messages",
     "app.navBar.toggleUserList.newMessages": "avec notification des nouveaux messages",
     "app.navBar.recording": "Cette session est enregistrée",
     "app.navBar.recording.on": "Enregistrement en cours",
@@ -186,17 +217,17 @@
     "app.leaveConfirmation.confirmLabel": "Quitter",
     "app.leaveConfirmation.confirmDesc": "Vous déconnecte de la conférence",
     "app.endMeeting.title": "Mettre fin à la réunion",
-    "app.endMeeting.description": "Êtes-vous sûr de vouloir terminer cette session?",
+    "app.endMeeting.description": "Êtes-vous sûr de vouloir terminer cette session ?",
     "app.endMeeting.yesLabel": "Oui",
     "app.endMeeting.noLabel": "Non",
     "app.about.title": "À propos",
-    "app.about.version": "Client build:",
+    "app.about.version": "Version du client :",
     "app.about.copyright": "Copyright :",
     "app.about.confirmLabel": "OK",
     "app.about.confirmDesc": "OK",
     "app.about.dismissLabel": "Annuler",
     "app.about.dismissDesc": "Fermer l'information client",
-    "app.actionsBar.changeStatusLabel": "Changer status",
+    "app.actionsBar.changeStatusLabel": "Changer statut",
     "app.actionsBar.muteLabel": "Rendre silencieux",
     "app.actionsBar.unmuteLabel": "Autoriser à parler",
     "app.actionsBar.camOffLabel": "Caméra éteinte",
@@ -212,6 +243,7 @@
     "app.submenu.application.fontSizeControlLabel": "Taille des caractères",
     "app.submenu.application.increaseFontBtnLabel": "Augmenter la Taille de la Police",
     "app.submenu.application.decreaseFontBtnLabel": "Diminuer la Taille de la Police",
+    "app.submenu.application.currentSize": "actuellement {0}",
     "app.submenu.application.languageLabel": "Langue de l'application",
     "app.submenu.application.ariaLanguageLabel": "Changer la langue de l'application",
     "app.submenu.application.languageOptionLabel": "Choisir la langue",
@@ -220,23 +252,11 @@
     "app.submenu.audio.speakerSourceLabel": "Source du haut-parleur",
     "app.submenu.audio.streamVolumeLabel": "Volume de votre flux audio",
     "app.submenu.video.title": "Vidéo",
-    "app.submenu.video.videoSourceLabel": "Voir la source",
+    "app.submenu.video.videoSourceLabel": "Source de la vue",
     "app.submenu.video.videoOptionLabel": "Choisir la source de la vue",
     "app.submenu.video.videoQualityLabel": "Qualité vidéo",
     "app.submenu.video.qualityOptionLabel": "Choisissez la qualité vidéo",
     "app.submenu.video.participantsCamLabel": "Voir les webcams des participants",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "Sous-titres",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "S'approprier",
-    "app.submenu.closedCaptions.languageLabel": "Langue",
-    "app.submenu.closedCaptions.localeOptionLabel": "Choisir la langue",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "Pas de lieux actifs",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Famille de police",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "Choisir la famille de police",
-    "app.submenu.closedCaptions.fontSizeLabel": "Taille des caractères",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "Choisissez la taille de la police",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Couleur du fond",
-    "app.submenu.closedCaptions.fontColorLabel": "Couleur des caractères",
-    "app.submenu.closedCaptions.noLocaleSelected": "La localization n'est pas sélectionnée",
     "app.submenu.participants.muteAllLabel": "Couper le son, excepté pour le présentateur",
     "app.submenu.participants.lockAllLabel": "Verrouiller tous les participants",
     "app.submenu.participants.lockItemLabel": "Participants {0}",
@@ -258,7 +278,6 @@
     "app.settings.applicationTab.label": "Application",
     "app.settings.audioTab.label": "Audio",
     "app.settings.videoTab.label": "Vidéo",
-    "app.settings.closedcaptionTab.label": "Sous-titres",
     "app.settings.usersTab.label": "Participants",
     "app.settings.main.label": "Paramètres",
     "app.settings.main.cancel.label": "Annuler",
@@ -269,6 +288,7 @@
     "app.settings.dataSavingTab.webcam": "Activer les webcams",
     "app.settings.dataSavingTab.screenShare": "Activer le partage de bureau",
     "app.settings.dataSavingTab.description": "Pour économiser votre bande passante, ajustez ce qui est actuellement affiché.",
+    "app.settings.save-notification.label": "Les paramètres ont été enregistrés",
     "app.switch.onLabel": "ON",
     "app.switch.offLabel": "OFF",
     "app.actionsBar.actionsDropdown.actionsLabel": "Actions",
@@ -286,7 +306,7 @@
     "app.actionsBar.actionsDropdown.createBreakoutRoom": "Créer des réunions privées",
     "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "Créer des réunions privées pour scinder la réunion en cours",
     "app.actionsBar.actionsDropdown.takePresenter": "Devenir présentateur",
-    "app.actionsBar.actionsDropdown.takePresenterDesc": "Assigne-toi comme nouveau présentateur",
+    "app.actionsBar.actionsDropdown.takePresenterDesc": "S'assigner comme nouveau présentateur",
     "app.actionsBar.emojiMenu.statusTriggerLabel": "Définir le statut",
     "app.actionsBar.emojiMenu.awayLabel": "Éloigné",
     "app.actionsBar.emojiMenu.awayDesc": "Passer votre état à éloigné",
@@ -302,7 +322,7 @@
     "app.actionsBar.emojiMenu.happyDesc": "Passer votre état à ravi",
     "app.actionsBar.emojiMenu.noneLabel": "Effacer votre état",
     "app.actionsBar.emojiMenu.noneDesc": "Effacer votre statut",
-    "app.actionsBar.emojiMenu.applauseLabel": "Approuver",
+    "app.actionsBar.emojiMenu.applauseLabel": "Applaudissements",
     "app.actionsBar.emojiMenu.applauseDesc": "Passer votre état à applaudissements",
     "app.actionsBar.emojiMenu.thumbsUpLabel": "Favorable",
     "app.actionsBar.emojiMenu.thumbsUpDesc": "Passer votre statut à favorable",
@@ -312,7 +332,7 @@
     "app.audioNotification.audioFailedError1001": "Erreur 1001 : WebSocket déconnecté",
     "app.audioNotification.audioFailedError1002": "Erreur 1002 : impossible d'établir une connexion WebSocket.",
     "app.audioNotification.audioFailedError1003": "Erreur 1003 : version de navigateur non supportée",
-    "app.audioNotification.audioFailedError1004": "Erreur 1004: Échec de l'appel (raison = {0})",
+    "app.audioNotification.audioFailedError1004": "Erreur 1004 : échec de l'appel (raison = {0})",
     "app.audioNotification.audioFailedError1005": "Erreur 1005 : l'appel s'est terminé inopinément",
     "app.audioNotification.audioFailedError1006": "Erreur 1006 : délai d'appel dépassé",
     "app.audioNotification.audioFailedError1007": "Erreur 1007 : la négociation ICE a échoué",
@@ -320,21 +340,21 @@
     "app.audioNotification.audioFailedError1009": "Erreur 1009 : impossible de récupérer les informations du serveur STUN/TURN.",
     "app.audioNotification.audioFailedError1010": "Erreur 1010 :  délai dépassé durant la négociation ICE",
     "app.audioNotification.audioFailedError1011": "Erreur 1011 : délai d'attente dépassé pour ICE",
-    "app.audioNotification.audioFailedError1012": "Erreur 1012: connexion ICE fermée",
+    "app.audioNotification.audioFailedError1012": "Erreur 1012 : connexion ICE fermée",
     "app.audioNotification.audioFailedMessage": "Votre connexion audio à échoué",
     "app.audioNotification.mediaFailedMessage": "getUserMicMedia a échoué car seules les origines sécurisées sont autorisées",
     "app.audioNotification.closeLabel": "Fermer",
     "app.audioNotificaion.reconnectingAsListenOnly": "Le microphone est verrouillé pour les participants, vous êtes connecté en mode écoute uniquement.",
     "app.breakoutJoinConfirmation.title": "Rejoindre la salle de groupe",
     "app.breakoutJoinConfirmation.message": "Voulez-vous rejoindre",
-    "app.breakoutJoinConfirmation.confirmLabel": "Rejoindre",
     "app.breakoutJoinConfirmation.confirmDesc": "Rejoignez la réunion privée",
     "app.breakoutJoinConfirmation.dismissLabel": "Annuler",
     "app.breakoutJoinConfirmation.dismissDesc": "Fermer et refuser d'entrer dans la réunion privée",
     "app.breakoutJoinConfirmation.freeJoinMessage": "Choisissez une réunion privée à rejoindre",
-    "app.breakoutTimeRemainingMessage": "Temps restant dans la réunion privée: {0}",
+    "app.breakoutTimeRemainingMessage": "Temps restant dans la réunion privée : {0}",
     "app.breakoutWillCloseMessage": "Le temps s'est écoulé. La réunion privée fermera bientôt",
-    "app.calculatingBreakoutTimeRemaining": "Calcul du temps restant ...",
+    "app.calculatingBreakoutTimeRemaining": "Calcul du temps restant...",
+    "app.audioModal.ariaTitle": "Fenêtre modale pour joindre en audio",
     "app.audioModal.microphoneLabel": "Microphone",
     "app.audioModal.listenOnlyLabel": "Écoute seule",
     "app.audioModal.audioChoiceLabel": "Voulez-vous rejoindre l'audio ?",
@@ -348,10 +368,13 @@
     "app.audioModal.no": "Non",
     "app.audioModal.yes.arialabel" : "Écho activé",
     "app.audioModal.no.arialabel" : "Écho désactivé",
-    "app.audioModal.echoTestTitle": "Ceci est un test d'écho privé. Parlez quelques mots. Avez-vous entendu de l'audio?",
+    "app.audioModal.echoTestTitle": "Ceci est un test d'écho privé. Prononcez quelques mots. Avez-vous entendu de l'audio ?",
     "app.audioModal.settingsTitle": "Modifier vos paramètres audio",
     "app.audioModal.helpTitle": "Il y a un problème avec vos périphériques",
-    "app.audioModal.helpText": "Avez-vous donné la permission d'accéder à votre microphone? Notez qu'une boîte de dialogue doit apparaître lorsque vous essayez de rejoindre l'audio, demandant les autorisations de votre périphérique multimédia. Veuillez l'accepter pour rejoindre la conférence audio. Si ce n'est pas le cas, essayez de modifier les autorisations de votre microphone dans les paramètres de votre navigateur.",
+    "app.audioModal.helpText": "Avez-vous donné la permission d'accéder à votre microphone ? Notez qu'une boîte de dialogue doit apparaître lorsque vous essayez de rejoindre l'audio, demandant les autorisations de votre périphérique multimédia. Veuillez l'accepter pour rejoindre la conférence audio. Si ce n'est pas le cas, essayez de modifier les autorisations de votre microphone dans les paramètres de votre navigateur.",
+    "app.audioModal.audioDialTitle": "Joindre avec votre téléphone",
+    "app.audioDial.audioDialDescription": "Composer",
+    "app.audioDial.audioDialConfrenceText": "et saisir le numéro PIN de la conférence :",
     "app.audioModal.connecting": "Connexion en cours",
     "app.audioModal.connectingEchoTest": "Connexion au test d'écho",
     "app.audioManager.joinedAudio": "Vous avez rejoint la conférence audio",
@@ -384,15 +407,22 @@
     "app.meeting.logout.ejectedFromMeeting": "Vous avez été éjecté de la réunion",
     "app.meeting.logout.validateTokenFailedEjectReason": "Échec de la validation du jeton d'autorisation",
     "app.meeting.logout.userInactivityEjectReason": "Utilisateur inactif trop longtemps",
+    "app.meeting-ended.rating.legendLabel": "Évaluation",
+    "app.meeting-ended.rating.starLabel": "Favori",
     "app.modal.close": "Fermer",
+    "app.modal.close.description": "Annule les changements et ferme la fenêtre modale",
     "app.modal.confirm": "Terminé",
+    "app.modal.newTab": "(ouvre un nouvel onglet)",
+    "app.modal.confirm.description": "Sauvegarde les changements et ferme la fenêtre modale",
     "app.dropdown.close": "Fermer",
     "app.error.400": "Mauvaise Requête",
     "app.error.401": "Non autorisé",
     "app.error.403": "Vous avez été éjecté de la réunion",
     "app.error.404": "Non trouvé",
+    "app.error.410": "La conférence est terminée",
     "app.error.500": "Oups, quelque chose s'est mal passé",
     "app.error.leaveLabel": "Connectez-vous à nouveau",
+    "app.error.fallback.presentation.title": "Une erreur s'est produite",
     "app.error.fallback.presentation.description": "Il a été connecté. Essayez de recharger la page.",
     "app.error.fallback.presentation.reloadButton": "Recharger",
     "app.guest.waiting": "En attente de l'approbation d'adhésion",
@@ -408,17 +438,19 @@
     "app.userList.guest.pendingGuestAlert": "A rejoint la session et attend votre approbation.",
     "app.userList.guest.rememberChoice": "Se rappeler du choix",
     "app.user-info.title": "Recherche dans l'annuaire",
-    "app.toast.breakoutRoomEnded": "La réunion privée s'est terminée. S'il vous plaît rejoindre dans l'audio.",
+    "app.toast.breakoutRoomEnded": "La réunion privée s'est terminée. Veuillez rejoindre l'audio.",
     "app.toast.chat.public": "Nouveau message de discussion publique",
     "app.toast.chat.private": "Nouveau message de discussion privée",
     "app.toast.chat.system": "Système",
     "app.notification.recordingStart": "Cette session est maintenant enregistrée",
     "app.notification.recordingStop": "Cette session n'est maintenant plus enregistrée",
     "app.notification.recordingAriaLabel": "Temps enregistré",
+    "app.shortcut-help.title": "Raccourcis clavier",
     "app.shortcut-help.accessKeyNotAvailable": "Clés d'accès non disponibles",
     "app.shortcut-help.comboLabel": "Combo",
     "app.shortcut-help.functionLabel": "Fonction",
     "app.shortcut-help.closeLabel": "Fermer",
+    "app.shortcut-help.closeDesc": "Ferme la fenêtre modale des raccourcis clavier",
     "app.shortcut-help.openOptions": "Ouvrir les options",
     "app.shortcut-help.toggleUserList": "Basculer la liste d'utilisateurs",
     "app.shortcut-help.toggleMute": "Assourdir / Activer",
@@ -426,9 +458,11 @@
     "app.shortcut-help.hidePrivateChat": "Masquer la discussion privée",
     "app.shortcut-help.closePrivateChat": "Fermer la discussion privée",
     "app.shortcut-help.openActions": "Ouvrir le menu des actions",
-    "app.shortcut-help.openStatus": "Ouvrir le menu de status",
+    "app.shortcut-help.openStatus": "Ouvrir le menu de statut",
     "app.shortcut-help.togglePan": "Activer l'outil Panoramique (Présentateur)",
-    "app.lock-viewers.title": "Verrouiller les téléspectateurs",
+    "app.shortcut-help.nextSlideDesc": "Diapositive suivante (Présentateur)",
+    "app.shortcut-help.previousSlideDesc": "Diapositive précédente (Présentateur)",
+    "app.lock-viewers.title": "Verrouiller les spectateurs",
     "app.lock-viewers.description": "Ces options vous permettent d'empêcher les participants d'utiliser des fonctionnalités spécifiques. (Ces paramètres de verrouillage ne s'appliquent pas aux modérateurs.)",
     "app.lock-viewers.featuresLable": "Fonctionnalité",
     "app.lock-viewers.lockStatusLabel": "Statut verrouillé",
@@ -437,13 +471,16 @@
     "app.lock-viewers.microphoneLable": "Microphone",
     "app.lock-viewers.PublicChatLabel": "Discussion publique",
     "app.lock-viewers.PrivateChatLable": "Discussion privée",
+    "app.lock-viewers.notesLabel": "Notes partagées",
     "app.lock-viewers.Layout": "Disposition",
+    "app.lock-viewers.ariaTitle": "Verrouille la fenêtre modale des participants",
     "app.recording.startTitle": "Commencer l'enregistrement",
     "app.recording.stopTitle": "Enregistrement en pause",
     "app.recording.resumeTitle": "Reprendre l'enregistrement",
     "app.recording.startDescription": "(Vous pouvez sélectionner le bouton d'enregistrement ultérieurement pour mettre l'enregistrement en pause.)",
-    "app.recording.stopDescription": "Êtes-vous sûr de vouloir mettre l'enregistrement en pause? (Vous pouvez reprendre en sélectionnant à nouveau le bouton d'enregistrement.)",
+    "app.recording.stopDescription": "Êtes-vous sûr de vouloir mettre l'enregistrement en pause ? (Vous pouvez reprendre en sélectionnant à nouveau le bouton d'enregistrement.)",
     "app.videoPreview.cameraLabel": "Caméra",
+    "app.videoPreview.profileLabel": "Qualité",
     "app.videoPreview.cancelLabel": "Annuler",
     "app.videoPreview.closeLabel": "Fermer",
     "app.videoPreview.startSharingLabel": "Commencer à partager",
@@ -451,23 +488,24 @@
     "app.videoPreview.webcamPreviewLabel": "Aperçu de la webcam",
     "app.videoPreview.webcamSettingsTitle": "Paramètres de la webcam",
     "app.videoPreview.webcamNotFoundLabel": "Webcam introuvable",
+    "app.videoPreview.profileNotFoundLabel": "Profil de caméra non supporté",
     "app.video.joinVideo": "Partager webcam",
     "app.video.leaveVideo": "Arrêtez le partage de la webcam",
     "app.video.iceCandidateError": "Erreur lors de l'ajout du candidat ICE",
     "app.video.iceConnectionStateError": "Erreur 1107 : négociation ICE échouée",
-    "app.video.permissionError": "Erreur lors du partage de la webcam. S'il vous plaît vérifier les permissions",
+    "app.video.permissionError": "Erreur lors du partage de la webcam. Veuillez vérifier les permissions",
     "app.video.sharingError": "Erreur lors du partage de la Webcam",
     "app.video.notFoundError": "Webcam introuvable. Assurez-vous qu'elle soit bien connectée",
     "app.video.notAllowed": "Permission manquante pour partager la Webcam. Veuillez vérifier les permissions dans votre navigateur",
     "app.video.notSupportedError": "La vidéo de la webcam peut uniquement être partagée avec des sources sûres ; assurez-vous que votre certificat SSL est valide",
     "app.video.notReadableError": "Impossible d'obtenir la vidéo de la webcam. Assurez-vous qu'aucun autre programme n'utilise la webcam",
-    "app.video.mediaFlowTimeout1020": "Erreur 1020: le média n'a pas pu atteindre le serveur",
+    "app.video.mediaFlowTimeout1020": "Erreur 1020 : le média n'a pas pu atteindre le serveur",
     "app.video.swapCam": "Échanger",
     "app.video.swapCamDesc": "Permuter les Webcams",
-    "app.video.videoLocked": "Partage webcam vérouillé",
-    "app.video.videoButtonDesc": "le bouton Rejoindre la vidéo",
+    "app.video.videoLocked": "Partage webcam verrouillé",
+    "app.video.videoButtonDesc": "Bouton Rejoindre la vidéo",
     "app.video.videoMenu": "Menu Vidéo",
-    "app.video.videoMenuDisabled": "le menu vidéo de la webcam est désactivée dans les paramètres",
+    "app.video.videoMenuDisabled": "Le menu vidéo de la webcam est désactivé dans les paramètres",
     "app.video.videoMenuDesc": "Ouvrir le menu déroulant de la vidéo",
     "app.video.chromeExtensionError": "Vous devez installer ",
     "app.video.chromeExtensionErrorLink": "cette extension Chrome",
@@ -492,10 +530,11 @@
     "app.sfu.mediaServerRequestTimeout2003": "Erreur 2003 : les demandes du serveur multimédia expirent",
     "app.sfu.serverIceGatheringFailed2021": "Erreur 2021 : le serveur multimédia ne peut pas rassembler de candidats ICE",
     "app.sfu.serverIceGatheringFailed2022": "Erreur 2022 : la connexion ICE au serveur de médias a échoué",
-    "app.sfu.mediaGenericError2200": "Erreur 2200: le serveur de médias n'a pas pu traiter la demande",
+    "app.sfu.mediaGenericError2200": "Erreur 2200 : le serveur de médias n'a pas pu traiter la demande",
     "app.sfu.invalidSdp2202":"Erreur 2202 : le client a généré un SDP non valide",
     "app.sfu.noAvailableCodec2203": "Erreur 2203 : le serveur n'a pas trouvé de codec approprié",
     "app.meeting.endNotification.ok.label": "OK",
+    "app.whiteboard.annotations.poll": "Les résultats du sondage ont été publiés",
     "app.whiteboard.toolbar.tools": "Outils",
     "app.whiteboard.toolbar.tools.hand": "Pan",
     "app.whiteboard.toolbar.tools.pencil": "Crayon",
@@ -512,7 +551,7 @@
     "app.whiteboard.toolbar.color.white": "Blanc",
     "app.whiteboard.toolbar.color.red": "Rouge",
     "app.whiteboard.toolbar.color.orange": "Orange",
-    "app.whiteboard.toolbar.color.eletricLime": "Chaux électrique",
+    "app.whiteboard.toolbar.color.eletricLime": "Vert électrique",
     "app.whiteboard.toolbar.color.lime": "Vert",
     "app.whiteboard.toolbar.color.cyan": "Cyan",
     "app.whiteboard.toolbar.color.dodgerBlue": "Dodger bleu",
@@ -529,7 +568,7 @@
     "app.feedback.subtitle": "Nous aimerions connaitre votre expérience avec BigBlueButton (optionnel)",
     "app.feedback.textarea": "Comment pouvons nous améliorer BigBlueButton ?",
     "app.feedback.sendFeedback": "Envoyer l'avis",
-    "app.feedback.sendFeedbackDesc": "Envoyez un feedback et quittez la réunion",
+    "app.feedback.sendFeedbackDesc": "Envoyer une évaluation et quitter la réunion",
     "app.videoDock.webcamFocusLabel": "Focus",
     "app.videoDock.webcamFocusDesc": "Focus sur la webcam sélectionnée",
     "app.videoDock.webcamUnfocusLabel": "Arrêt du focus",
@@ -548,7 +587,8 @@
     "app.createBreakoutRoom.joinAudio": "Rejoindre l'Audio",
     "app.createBreakoutRoom.returnAudio": "Retour audio",
     "app.createBreakoutRoom.confirm": "Créer",
-    "app.createBreakoutRoom.numberOfRooms": "Nombre de rénuions",
+    "app.createBreakoutRoom.record": "Enregistre",
+    "app.createBreakoutRoom.numberOfRooms": "Nombre de réunions",
     "app.createBreakoutRoom.durationInMinutes": "Durée (minutes)",
     "app.createBreakoutRoom.randomlyAssign": "Assigner au hasard",
     "app.createBreakoutRoom.endAllBreakouts": "Terminer toutes les réunions privées",
@@ -559,17 +599,23 @@
     "app.createBreakoutRoom.addRoomTime": "Augmenter la durée d'une réunion privée",
     "app.createBreakoutRoom.addParticipantLabel": "+ Ajouter participant",
     "app.createBreakoutRoom.freeJoin": "Autoriser les participants à choisir une salle de réunion à rejoindre",
-    "app.createBreakoutRoom.leastOneWarnBreakout": "Vous devez placer au moins un participants dans une réunion privée.",
+    "app.createBreakoutRoom.leastOneWarnBreakout": "Vous devez placer au moins un participant dans une réunion privée.",
     "app.createBreakoutRoom.modalDesc": "Suivez les étapes ci-dessous pour créer des réunions dans votre session. Pour ajouter des participants à une réunion.",
+    "app.createBreakoutRoom.roomTime": "{0} minutes",
     "app.externalVideo.start": "Partager une nouvelle vidéo",
     "app.externalVideo.title": "Partager une vidéo YouTube",
     "app.externalVideo.input": "URL de la vidéo YouTube",
     "app.externalVideo.urlInput": "Ajouter une URL YouTube",
     "app.externalVideo.urlError": "Cette URL n'est pas une vidéo YouTube valide.",
     "app.externalVideo.close": "Fermer",
-    "app.externalVideo.noteLabel": "Remarque: les vidéos YouTube partagées n'apparaîtront pas dans l'enregistrement.",
+    "app.network.connection.effective.slow": "Nous remarquons des problèmes de connectivité.",
+    "app.network.connection.effective.slow.help": "Comment corriger cela ?",
+    "app.externalVideo.noteLabel": "Remarque : les vidéos YouTube partagées n'apparaîtront pas dans l'enregistrement.",
     "app.actionsBar.actionsDropdown.shareExternalVideo": "Partage de vidéo YouTube",
-    "app.actionsBar.actionsDropdown.stopShareExternalVideo": "Arrêtez le partage vidéo YouTube"
+    "app.actionsBar.actionsDropdown.stopShareExternalVideo": "Arrêtez le partage vidéo YouTube",
+    "app.iOSWarning.label": "Veuillez mettre à jour vers iOS 12.2 ou supérieur",
+    "app.legacy.unsupportedBrowser": "Il semblerait que vous utilisiez un navigateur qui n'est pas supporté. Veuillez utiliser {0} or {1} pour un support complet.",
+    "app.legacy.upgradeBrowser": "Il semblerait que vous utilisiez une ancienne version d'un navigateur supporté. Veuillez mettre à jour votre navigateur pour un support complet."
 
 }
 
diff --git a/bigbluebutton-html5/private/locales/he.json b/bigbluebutton-html5/private/locales/he.json
index c4a86a7d2c6600a069bfd46c7bb90bdb17f988e3..816197a2a61eb387b8971b987899ad688fde8266 100644
--- a/bigbluebutton-html5/private/locales/he.json
+++ b/bigbluebutton-html5/private/locales/he.json
@@ -12,6 +12,7 @@
     "app.chat.dropdown.copy": "העתק",
     "app.chat.dropdown.save": "שמור",
     "app.chat.label": "צ'אט",
+    "app.captions.menu.cancelLabel": "בטל",
     "app.note.title": "פנקס משותף",
     "app.userList.usersTitle": "משתתפים",
     "app.userList.notesTitle": "הערות",
@@ -33,6 +34,8 @@
     "app.presentationUploder.dismissLabel": "בטל",
     "app.poll.y": "כן",
     "app.poll.n": "לא",
+    "app.poll.answer.yes": "כן",
+    "app.poll.answer.no": "לא",
     "app.poll.liveResult.usersTitle": "משתתפים",
     "app.connectingMessage": "מתחבר ...",
     "app.navBar.settingsDropdown.aboutLabel": "אודות",
@@ -42,7 +45,6 @@
     "app.endMeeting.noLabel": "לא",
     "app.about.title": "אודות",
     "app.about.dismissLabel": "בטל",
-    "app.submenu.closedCaptions.languageLabel": "שפה",
     "app.submenu.participants.lockPublicChatLabel": "צ'אט ציבורי",
     "app.submenu.participants.lockPrivateChatLabel": "צ'אט פרטי",
     "app.settings.main.cancel.label": "בטל",
diff --git a/bigbluebutton-html5/private/locales/hi_IN.json b/bigbluebutton-html5/private/locales/hi_IN.json
index d67e590e1d6d8573bfb2f7f3df5a66a3365ba8da..486a5ac4952069cf7ca7d0f7595258e8e7407825 100644
--- a/bigbluebutton-html5/private/locales/hi_IN.json
+++ b/bigbluebutton-html5/private/locales/hi_IN.json
@@ -18,6 +18,11 @@
     "app.chat.label": "बातचीत",
     "app.chat.emptyLogLabel": "चैट लॉग खाली है",
     "app.chat.clearPublicChatMessage": "सार्वजनिक चैट इतिहास एक मॉडरेटर द्वारा साफ़ किया गया था",
+    "app.captions.menu.close": "बंद करे",
+    "app.captions.menu.backgroundColor": "पीछे का रंग",
+    "app.captions.menu.cancelLabel": "रद्द करना",
+    "app.captions.pad.tip": "संपादक टूलबार पर ध्यान केंद्रित करने के लिए Esc दबाएं",
+    "app.captions.pad.ownership": "स्वामित्व लेने",
     "app.note.title": "साझा किए गए नोट्स",
     "app.note.label": "ध्यान दें",
     "app.note.hideNoteLabel": "नोट छिपाएं",
@@ -104,8 +109,7 @@
     "app.presentation.presentationToolbar.fitToPage": "पेज के लिए फिट",
     "app.presentation.presentationToolbar.goToSlide": "स्लाइड {0}",
     "app.presentationUploder.title": "प्रदर्शन",
-    "app.presentationUploder.message": "प्रस्तुतकर्ता के रूप में आपके पास किसी भी कार्यालय दस्तावेज़ या पीडीएफ फाइल को अपलोड करने की क्षमता है। हम सर्वोत्तम परिणामों के लिए पीडीएफ फाइल की सलाह देते हैं।",
-    "app.presentationUploder.confirmLabel": "अपलोड",
+    "app.presentationUploder.uploadLabel": "अपलोड",
     "app.presentationUploder.confirmDesc": "अपने परिवर्तन सहेजें और प्रस्तुति शुरू करें",
     "app.presentationUploder.dismissLabel": "रद्द करना",
     "app.presentationUploder.dismissDesc": "मोडल विंडो बंद करें और अपने परिवर्तनों को त्यागें",
@@ -116,7 +120,6 @@
     "app.presentationUploder.fileToUpload": "अपलोड किया जाना है ...",
     "app.presentationUploder.currentBadge": "वर्तमान",
     "app.presentationUploder.genericError": "ओह! कुछ गलत हो गया है",
-    "app.presentationUploder.rejectedError": "चयनित फ़ाइलों में से कुछ को अस्वीकार कर दिया जाता है। कृपया फ़ाइल माइम प्रकार की जाँच करें।",
     "app.presentationUploder.upload.progress": "अपलोड करना ({0}%)",
     "app.presentationUploder.upload.413": "फ़ाइल बहुत बड़ी है, अधिकतम 200 पृष्ठ पहुंच गए हैं",
     "app.presentationUploder.conversion.conversionProcessingSlides": "प्रोसेसिंग पेज {0} का {1}",
@@ -156,6 +159,10 @@
     "app.poll.a3": "ए / बी / सी",
     "app.poll.a4": "ऐ/ बी /सी /डी",
     "app.poll.a5": "ए / बी / सी / डी / ई",
+    "app.poll.answer.true": "सच",
+    "app.poll.answer.false": "असत्य",
+    "app.poll.answer.yes": "हाँ",
+    "app.poll.answer.no": "नहीं",
     "app.poll.liveResult.usersTitle": "उपयोगकर्ताओं",
     "app.poll.liveResult.responsesTitle": "प्रतिक्रिया",
     "app.polling.pollingTitle": "मतदान के विकल्प",
@@ -227,18 +234,6 @@
     "app.submenu.video.videoQualityLabel": "वीडियो की गुणवत्ता",
     "app.submenu.video.qualityOptionLabel": "वीडियो की गुणवत्ता चुनें",
     "app.submenu.video.participantsCamLabel": "प्रतिभागियों को वेबकैम देखना",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "बंद शीर्षक",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "स्वामित्व लेने",
-    "app.submenu.closedCaptions.languageLabel": "भाषा",
-    "app.submenu.closedCaptions.localeOptionLabel": "भाषा चुनें",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "कोई सक्रिय स्थान नहीं",
-    "app.submenu.closedCaptions.fontFamilyLabel": "फ़ॉन्ट परिवार",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "फ़ॉन्ट-परिवार चुनें",
-    "app.submenu.closedCaptions.fontSizeLabel": "फ़ॉन्ट आकार",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "फ़ॉन्ट आकार चुनें",
-    "app.submenu.closedCaptions.backgroundColorLabel": "पीछे का रंग",
-    "app.submenu.closedCaptions.fontColorLabel": "लिपि का रंग",
-    "app.submenu.closedCaptions.noLocaleSelected": "लोकेल का चयन नहीं किया गया है",
     "app.submenu.participants.muteAllLabel": "प्रस्तुतकर्ता को छोड़कर सभी को म्यूट करें",
     "app.submenu.participants.lockAllLabel": "सभी दर्शकों को लॉक करें",
     "app.submenu.participants.lockItemLabel": "दर्शक {0}",
@@ -260,7 +255,6 @@
     "app.settings.applicationTab.label": "आवेदन",
     "app.settings.audioTab.label": "ऑडियो",
     "app.settings.videoTab.label": "Video",
-    "app.settings.closedcaptionTab.label": "बंद शीर्षक",
     "app.settings.usersTab.label": "प्रतिभागियों",
     "app.settings.main.label": "सेटिंग्स",
     "app.settings.main.cancel.label": "रद्द करना",
@@ -329,7 +323,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "दर्शकों के लिए माइक्रोफ़ोन लॉक कर दिया गया है, आपको केवल सुनने के रूप में जोड़ा जा रहा है",
     "app.breakoutJoinConfirmation.title": "ब्रेकआउट रूम में शामिल हों",
     "app.breakoutJoinConfirmation.message": "क्या तुम शामिल होना चाहते हो",
-    "app.breakoutJoinConfirmation.confirmLabel": "शामिल हों",
     "app.breakoutJoinConfirmation.confirmDesc": "आप ब्रेकआउट रूम में शामिल हों",
     "app.breakoutJoinConfirmation.dismissLabel": "रद्द करना",
     "app.breakoutJoinConfirmation.dismissDesc": "ब्रेकआउट रूम में शामिल होने के लिए बंद और अस्वीकार करता है",
diff --git a/bigbluebutton-html5/private/locales/hu_HU.json b/bigbluebutton-html5/private/locales/hu_HU.json
new file mode 100644
index 0000000000000000000000000000000000000000..6db0c2dff90c2f0d25ecb532bdfa6d4839e07d20
--- /dev/null
+++ b/bigbluebutton-html5/private/locales/hu_HU.json
@@ -0,0 +1,636 @@
+{
+    "app.home.greeting": "A prezentáció hamarosan elindul ...",
+    "app.chat.submitLabel": "Üzenet küldése",
+    "app.chat.errorMinMessageLength": "Az üzenet {0} karakterrel túl rövid",
+    "app.chat.errorMaxMessageLength": "Az üzenet {0} karakterrel túl hosszú",
+    "app.chat.inputLabel": "{0}: üzenet érkezett",
+    "app.chat.inputPlaceholder": "{0} üzenete",
+    "app.chat.titlePublic": "Nyilvános üzenetek",
+    "app.chat.titlePrivate": "Privát üzenetek {0} felhasználóval",
+    "app.chat.partnerDisconnected": "{0} kilépett",
+    "app.chat.closeChatLabel": "{0} bezárása",
+    "app.chat.hideChatLabel": "{0} elrejtése",
+    "app.chat.moreMessages": "További üzenetek lejjebb",
+    "app.chat.dropdown.options": "Üzenetek beállításai",
+    "app.chat.dropdown.clear": "Törlés",
+    "app.chat.dropdown.copy": "Másolás",
+    "app.chat.dropdown.save": "Mentés",
+    "app.chat.label": "Ãœzenetek",
+    "app.chat.offline": "Offline",
+    "app.chat.emptyLogLabel": "Az üzenetek naplója üres",
+    "app.chat.clearPublicChatMessage": "A nyilvános beszélgetés előzményeit csak moderátor törölheti",
+    "app.captions.label": "Feliratok",
+    "app.captions.menu.close": "Bezárás",
+    "app.captions.menu.start": "Indítás",
+    "app.captions.menu.select": "Válassz nyelvet",
+    "app.captions.menu.title": "Feliratmenü",
+    "app.captions.menu.fontSize": "Méret",
+    "app.captions.menu.fontColor": "Betűszín",
+    "app.captions.menu.fontFamily": "Betű",
+    "app.captions.menu.backgroundColor": "Háttérszín",
+    "app.captions.menu.previewLabel": "Előnézet",
+    "app.captions.menu.cancelLabel": "Mégsem",
+    "app.captions.pad.hide": "Felirat elrejtése",
+    "app.captions.pad.tip": "Nyomj Esc-et a szerkesztő eszköztárra fokuszálásához",
+    "app.captions.pad.ownership": "Tulajdonos cseréje",
+    "app.note.title": "Megosztott jegyzetek",
+    "app.note.label": "Jegyzetek",
+    "app.note.hideNoteLabel": "Jegyzet elrejtése",
+    "app.user.activityCheck": "Felhasználói aktivitás ellenőrzése",
+    "app.user.activityCheck.label": "Ellenőrzi, hogy a felhasználó még az előadás résztvevője-e ({0})",
+    "app.user.activityCheck.check": "Ellenőrzés",
+    "app.note.tipLabel": "Nyomj Esc-et a szerkesztő eszköztárra fokuszálásához",
+    "app.userList.usersTitle": "Felhasználók",
+    "app.userList.participantsTitle": "Résztvevők",
+    "app.userList.messagesTitle": "Ãœzenetek",
+    "app.userList.notesTitle": "Jegyetek",
+    "app.userList.captionsTitle": "Feliratok",
+    "app.userList.presenter": "Előadó",
+    "app.userList.you": "Én",
+    "app.userList.locked": "Zárolt",
+    "app.userList.label": "Felhasználók",
+    "app.userList.toggleCompactView.label": "Kompakt nézet be-, kikapcsolása",
+    "app.userList.guest": "Vendég",
+    "app.userList.menuTitleContext": "Elérhető beállítások",
+    "app.userList.chatListItem.unreadSingular": "{0} új úzenet",
+    "app.userList.chatListItem.unreadPlural": "{0} új úzenet",
+    "app.userList.menu.chat.label": "Privát üzenetek indítása",
+    "app.userList.menu.clearStatus.label": "Állapot törlése",
+    "app.userList.menu.removeUser.label": "Felhasználó eltávolítása",
+    "app.userList.menu.muteUserAudio.label": "Felhasználó némítása",
+    "app.userList.menu.unmuteUserAudio.label": "Felhasználó hangosítása",
+    "app.userList.userAriaLabel": "{0} {1} {2}  állapot {3}",
+    "app.userList.menu.promoteUser.label": "Előléptetés moderátorrá",
+    "app.userList.menu.demoteUser.label": "Lefokozás résztvevővé",
+    "app.userList.menu.unlockUser.label": "{0} zárolásának feloldása",
+    "app.userList.menu.lockUser.label": "{0} zárolása",
+    "app.userList.menu.directoryLookup.label": "Címtárkeresés",
+    "app.userList.menu.makePresenter.label": "Legyen az előadó",
+    "app.userList.userOptions.manageUsersLabel": "Felhasználók kezelése",
+    "app.userList.userOptions.muteAllLabel": "Összes felhasználó némítása",
+    "app.userList.userOptions.muteAllDesc": "Előadás összes felhasználójának némítása",
+    "app.userList.userOptions.clearAllLabel": "Összes állapotikon törlése",
+    "app.userList.userOptions.clearAllDesc": "Összes felhasználó állapotikonjának törlése",
+    "app.userList.userOptions.muteAllExceptPresenterLabel": "Összes felhasználó némítása, az előadó kivételével",
+    "app.userList.userOptions.muteAllExceptPresenterDesc": "Előadás összes felhasználójának némítása, az előadó kivételével",
+    "app.userList.userOptions.unmuteAllLabel": "Mindenki hangosítása",
+    "app.userList.userOptions.unmuteAllDesc": "Az előadás hangosítása",
+    "app.userList.userOptions.lockViewersLabel": "Résztvevők zárolása",
+    "app.userList.userOptions.lockViewersDesc": "Az előadás résztvevőinek számos funkció zárolása",
+    "app.userList.userOptions.disableCam": "A résztvevők webkamerája le van tiltva",
+    "app.userList.userOptions.disableMic": "A résztvevők mikrofonja le van tiltva",
+    "app.userList.userOptions.disablePrivChat": "A privát üzenetek le van tiltva",
+    "app.userList.userOptions.disablePubChat": "A nyilvános üzenetek le van tiltva",
+    "app.userList.userOptions.disableNote": "A megosztott jegyzetek zárolva vannak",
+    "app.userList.userOptions.webcamsOnlyForModerator": "Csak a moderátorok láthatják a résztvevők webkaméráját (zárolási beállítások miatt)",
+    "app.userList.userOptions.enableCam": " A résztvevők webkamerája engedélyezve van",
+    "app.userList.userOptions.enableMic": "A résztvevők mikrofonja engedélyezve van",
+    "app.userList.userOptions.enablePrivChat": "A privát üzenetek engedélyezve van",
+    "app.userList.userOptions.enablePubChat": "A nyilvános üzenetek engedélyezve van",
+    "app.userList.userOptions.enableNote": "A megosztott jegyzet engedélyezve van",
+    "app.userList.userOptions.enableOnlyModeratorWebcam": "A webkamerád engedélyezve van, így a többiek láthatnak",
+    "app.media.label": "Média",
+    "app.media.screenshare.start": "A képernyőmegosztás elindult",
+    "app.media.screenshare.end": "A képernyőmegosztás befejeződött",
+    "app.media.screenshare.safariNotSupported": "A képernyőmegosztás jelenleg nem működik Safari alatt. Javasoljuk Firefox, illetve Google Chrome használatát.",
+    "app.meeting.ended": "Ez a munkamenet befejeződött",
+    "app.meeting.meetingTimeRemaining": "Az előadásból hátralévő idő: {0}",
+    "app.meeting.meetingTimeHasEnded": "Az idő lejárt. Az előadás hamarosan véget ér",
+    "app.meeting.endedMessage": "Visszairányítunk a kezdőképernyőre",
+    "app.meeting.alertMeetingEndsUnderOneMinute": "Az előadás egy perc múlva bezárul.",
+    "app.meeting.alertBreakoutEndsUnderOneMinute": "A csapatszoba egy perc múlva bezárul.",
+    "app.presentation.hide": "Prezentáció elrejtése",
+    "app.presentation.notificationLabel": "Jelenlegi prezentáció",
+    "app.presentation.slideContent": "Diatartalom",
+    "app.presentation.startSlideContent": "Diatartalom indítása",
+    "app.presentation.endSlideContent": "Diatartalom befejezése",
+    "app.presentation.emptySlideContent": "A jelenlegi diának nincs tartalma",
+    "app.presentation.presentationToolbar.selectLabel": "Dia választása",
+    "app.presentation.presentationToolbar.prevSlideLabel": "Előző dia",
+    "app.presentation.presentationToolbar.prevSlideDesc": "A prezentáció az előző diára ugrik",
+    "app.presentation.presentationToolbar.nextSlideLabel": "Következő dia",
+    "app.presentation.presentationToolbar.nextSlideDesc": "A prezentáció a következő diára ugrik",
+    "app.presentation.presentationToolbar.skipSlideLabel": "Dia kihagyása",
+    "app.presentation.presentationToolbar.skipSlideDesc": "A prezentáció egy megadott diára ugrik",
+    "app.presentation.presentationToolbar.fitWidthLabel": "A szélességhez illeszkedjen",
+    "app.presentation.presentationToolbar.fitWidthDesc": "A dia teljes szélességének megjelenítése",
+    "app.presentation.presentationToolbar.fitScreenLabel": "A képernyőhöz illeszkedjen",
+    "app.presentation.presentationToolbar.fitScreenDesc": "A teljes dia megjelenítése",
+    "app.presentation.presentationToolbar.zoomLabel": "Nagyítás",
+    "app.presentation.presentationToolbar.zoomDesc": "A prezentáció nagyítási szintjének módosítása",
+    "app.presentation.presentationToolbar.zoomInLabel": "Nagyítás",
+    "app.presentation.presentationToolbar.zoomInDesc": "A prezentációra nagyítás",
+    "app.presentation.presentationToolbar.zoomOutLabel": "Kicsinyítése",
+    "app.presentation.presentationToolbar.zoomOutDesc": "A prezentációról kicsinyítés",
+    "app.presentation.presentationToolbar.zoomReset": "Nagyítás szint visszaállítása",
+    "app.presentation.presentationToolbar.zoomIndicator": "Jelenlegi nagyítás százaléka",
+    "app.presentation.presentationToolbar.fitToWidth": "A szélességhez illeszkedjen",
+    "app.presentation.presentationToolbar.fitToPage": "Az oldalhoz illeszkedjen",
+    "app.presentation.presentationToolbar.goToSlide": "{0}. dia",
+    "app.presentationUploder.title": "Prezentáció",
+    "app.presentationUploder.message": "Előadóként tetszőleges office dokumentumot, illetve PDF fájlt fel tudsz tölteni. A legjobb eredmény érdekében javasoljuk PDF fájl használatát. Kérjük, ellenőrizze, hogy egy prezentációt kiválasztott a jobb oldalon lévő jelölővel.",
+    "app.presentationUploder.uploadLabel": "Feltöltés",
+    "app.presentationUploder.confirmLabel": "Jóváhagyás",
+    "app.presentationUploder.confirmDesc": "Mentsd a módosításaidat és indítsd a prezentációt",
+    "app.presentationUploder.dismissLabel": "Mégsem",
+    "app.presentationUploder.dismissDesc": "Az ablak bezárása és a módosítások elvetése",
+    "app.presentationUploder.dropzoneLabel": "A feltöltéshez dobj ide fájlokat",
+    "app.presentationUploder.dropzoneImagesLabel": "A feltöltéshez dobj ide képeket",
+    "app.presentationUploder.browseFilesLabel": "vagy tallózz fájlokat",
+    "app.presentationUploder.browseImagesLabel": "vagy tallózz/metsz képeket",
+    "app.presentationUploder.fileToUpload": "Feltöltendő ...",
+    "app.presentationUploder.currentBadge": "Jelenlegi",
+    "app.presentationUploder.genericError": "Sajnáljuk, hiba történt",
+    "app.presentationUploder.rejectedError": "A kiválasztott fájl(oka)t visszautasítottuk. Kérjük, ellenőrizd a fájl(ok) típusát.",
+    "app.presentationUploder.upload.progress": "({0}%) feltöltve",
+    "app.presentationUploder.upload.413": "A fájl túl nagy, az maximum 200 oldalt tartalmazhat",
+    "app.presentationUploder.conversion.conversionProcessingSlides": "{0} / {1} oldal folyamatban",
+    "app.presentationUploder.conversion.genericConversionStatus": "Fájl átalakítása ...",
+    "app.presentationUploder.conversion.generatingThumbnail": "Miniatűrök létrehozása ...",
+    "app.presentationUploder.conversion.generatedSlides": "Diák létrehozása ...",
+    "app.presentationUploder.conversion.generatingSvg": "SVG képek létrehozása ...",
+    "app.presentationUploder.conversion.pageCountExceeded": "Sajnáljuk, a oldalszámláló elérte a maximális 200 oldalt",
+    "app.presentationUploder.conversion.timeout": "Sajnáljuk, az átalakítás túl sokáig tartott",
+    "app.presentationUploder.isDownloadableLabel": "A prezentáció letöltésének tiltása",
+    "app.presentationUploder.isNotDownloadableLabel": "A prezentáció letöltésének engedélyezése",
+    "app.presentationUploder.removePresentationLabel": "Prezentáció törlése",
+    "app.presentationUploder.setAsCurrentPresentation": "Prezentáció beállítása jelenlegire",
+    "app.presentationUploder.tableHeading.filename": "Fájlnév",
+    "app.presentationUploder.tableHeading.options": "Beállítások",
+    "app.presentationUploder.tableHeading.status": "Állapot",
+    "app.poll.pollPaneTitle": "Szavazás",
+    "app.poll.quickPollTitle": "Gyorsszavazás",
+    "app.poll.hidePollDesc": "Szavazásmenü-panel elrejtése",
+    "app.poll.customPollInstruction": "Egyéni szavazás létrehozásához válaszd a lenti gombot és add meg a válaszlehetőségeket.",
+    "app.poll.quickPollInstruction": "Válassz egy beállítást a szavazás indításához",
+    "app.poll.customPollLabel": "Egyéni szavazás",
+    "app.poll.startCustomLabel": "Egyéni szavazás indítása",
+    "app.poll.activePollInstruction": "Ne zárd be az ablakot, hogy a többiek szavazhassanak. A 'Szavazás eredményének közzététele', illetve a visszatérés véget vet a szavazásnak.",
+    "app.poll.publishLabel": "Szavazás eredményének közzététele",
+    "app.poll.backLabel": "Vissza a szavazás beállításaihoz",
+    "app.poll.closeLabel": "Bezárás",
+    "app.poll.waitingLabel": "Várakozás a válaszokra ({0}/{1})",
+    "app.poll.ariaInputCount": " {0} / {1} egyéni válaszlehetőség",
+    "app.poll.customPlaceholder": "Válaszlehetőség hozzáadása",
+    "app.poll.noPresentationSelected": "Egy prezentáció sincs kiválasztva. Kérjük, válasszon egyet. ",
+    "app.poll.clickHereToSelect": "A választásához kattints ide",
+    "app.poll.t": "Igaz",
+    "app.poll.f": "Hamis",
+    "app.poll.tf": "Igaz / Hamis",
+    "app.poll.y": "Igen",
+    "app.poll.n": "Nem",
+    "app.poll.yn": "Igen / Nem",
+    "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": "Igaz",
+    "app.poll.answer.false": "Hamis",
+    "app.poll.answer.yes": "Igen",
+    "app.poll.answer.no": "Nem",
+    "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": "Felhasználók",
+    "app.poll.liveResult.responsesTitle": "Válasz",
+    "app.polling.pollingTitle": "Válaszlehetőségek",
+    "app.polling.pollAnswerLabel": "{0} válasz",
+    "app.polling.pollAnswerDesc": "Válaszd ezt a lehetőséget, hogy erre szavazz: {0}",
+    "app.failedMessage": "Sajnáljuk, hiba a szerverhez kapcsolódáskor",
+    "app.downloadPresentationButton.label": "Az eredeti prezentáció letöltése",
+    "app.connectingMessage": "Kapcsolódás ...",
+    "app.waitingMessage": "Szétkapcsolódtunk. {0} másodperc múlva próbálunk újra csatlakozni ...",
+    "app.navBar.settingsDropdown.optionsLabel": "Beállítások",
+    "app.navBar.settingsDropdown.fullscreenLabel": "Teljes képernyő",
+    "app.navBar.settingsDropdown.settingsLabel": "Beállítások",
+    "app.navBar.settingsDropdown.aboutLabel": "Névjegy",
+    "app.navBar.settingsDropdown.leaveSessionLabel": "Kijelentkezés",
+    "app.navBar.settingsDropdown.exitFullscreenLabel": "Teljes képernyő bezárása",
+    "app.navBar.settingsDropdown.fullscreenDesc": "Beállítások menü megjelenítése teljes képernyős módban",
+    "app.navBar.settingsDropdown.settingsDesc": "Általános beállítások módosítása",
+    "app.navBar.settingsDropdown.aboutDesc": "Információk megjelenítése a kliensről",
+    "app.navBar.settingsDropdown.leaveSessionDesc": "Kilépés az előadásból",
+    "app.navBar.settingsDropdown.exitFullscreenDesc": "Teljes képernyős mód bezárása",
+    "app.navBar.settingsDropdown.hotkeysLabel": "Gyorsbillentyűk",
+    "app.navBar.settingsDropdown.hotkeysDesc": "Gyorsbillentyűk listája",
+    "app.navBar.settingsDropdown.helpLabel": "Súgó",
+    "app.navBar.settingsDropdown.helpDesc": "Megnyitja a videó útmutatókat (új ablakban nyílik meg)",
+    "app.navBar.settingsDropdown.endMeetingDesc": "A jelenlegi találkozót megszakítja",
+    "app.navBar.settingsDropdown.endMeetingLabel": "Előadás befejezése",
+    "app.navBar.userListToggleBtnLabel": "Felhasználók ablak be-, kikapcsolása",
+    "app.navBar.toggleUserList.ariaLabel": "Felhasználók és Üzentek felcserélése",
+    "app.navBar.toggleUserList.newMessages": "új üzenetértesítéssel",
+    "app.navBar.recording": "Ezt a munkamenetet rögzítjük",
+    "app.navBar.recording.on": "Felvétel",
+    "app.navBar.recording.off": "Nem készül felvétel",
+    "app.leaveConfirmation.confirmLabel": "Kilépés",
+    "app.leaveConfirmation.confirmDesc": "Kiléptél az előadásból",
+    "app.endMeeting.title": "Előadás befejezése",
+    "app.endMeeting.description": "Biztos, hogy bezárja ezt a munkamenetet?",
+    "app.endMeeting.yesLabel": "Igen",
+    "app.endMeeting.noLabel": "Nem",
+    "app.about.title": "Névjegy",
+    "app.about.version": "Kliens buildszáma:",
+    "app.about.copyright": "Copyright:",
+    "app.about.confirmLabel": "OK",
+    "app.about.confirmDesc": "OK",
+    "app.about.dismissLabel": "Mégsem",
+    "app.about.dismissDesc": "Kliensinformációk bezárása",
+    "app.actionsBar.changeStatusLabel": "Állapot módosítása",
+    "app.actionsBar.muteLabel": "Némítás",
+    "app.actionsBar.unmuteLabel": "Hangosítás",
+    "app.actionsBar.camOffLabel": "Kamera kikapcsolása",
+    "app.actionsBar.raiseLabel": "Kézfeltartás",
+    "app.actionsBar.label": "Műveletek sáv",
+    "app.actionsBar.actionsDropdown.restorePresentationLabel": "Prezentáció visszaállítása",
+    "app.actionsBar.actionsDropdown.restorePresentationDesc": "Gomb a prezentáció visszaállítására annak bezárása után",
+    "app.screenshare.screenShareLabel" : "Képernyőmegosztás",
+    "app.submenu.application.applicationSectionTitle": "Alkalmazás",
+    "app.submenu.application.animationsLabel": "Animációk",
+    "app.submenu.application.audioAlertLabel": "Értesítési hang",
+    "app.submenu.application.pushAlertLabel": "Felugró értesítés",
+    "app.submenu.application.fontSizeControlLabel": "Betűméter",
+    "app.submenu.application.increaseFontBtnLabel": "Az alkalmazás betűméretének csökkentése",
+    "app.submenu.application.decreaseFontBtnLabel": "Az alkalmazás betűméretének növelése",
+    "app.submenu.application.currentSize": "{0} jelenleg",
+    "app.submenu.application.languageLabel": "Az alkalmazás nyelve",
+    "app.submenu.application.ariaLanguageLabel": "Az alkalmazás nyelvének módosítása",
+    "app.submenu.application.languageOptionLabel": "Válassz nyelvet",
+    "app.submenu.application.noLocaleOptionLabel": "Egy aktív fordítás sincs",
+    "app.submenu.audio.micSourceLabel": "Mikrofon forrása",
+    "app.submenu.audio.speakerSourceLabel": "Hangszóró forrása",
+    "app.submenu.audio.streamVolumeLabel": "A hangstream hangerőd",
+    "app.submenu.video.title": "Videó",
+    "app.submenu.video.videoSourceLabel": "Forrás megjelenítése",
+    "app.submenu.video.videoOptionLabel": "Forrásnézet bezárása",
+    "app.submenu.video.videoQualityLabel": "Videó minősége",
+    "app.submenu.video.qualityOptionLabel": "Válaszd ki a videó minőségét ",
+    "app.submenu.video.participantsCamLabel": "Résztvevők webkamerájának megtekintése",
+    "app.submenu.participants.muteAllLabel": "Mindenki némítása, az előadó kivételével",
+    "app.submenu.participants.lockAllLabel": "Összes résztvevő zárolása",
+    "app.submenu.participants.lockItemLabel": "{0} résztvevő",
+    "app.submenu.participants.lockMicDesc": "Az összes zárolt felhasználó mikrofonját letiltja",
+    "app.submenu.participants.lockCamDesc": "Az összes zárolt felhasználó webkameráját letiltja",
+    "app.submenu.participants.lockPublicChatDesc": "A nyilvános üzenetek tiltása az összes zárolt felhasználónál",
+    "app.submenu.participants.lockPrivateChatDesc": "A privát üzenetek tiltása az összes zárolt felhasználónál",
+    "app.submenu.participants.lockLayoutDesc": "Az összes zárolt résztvevő lerendezésének zárolása",
+    "app.submenu.participants.lockMicAriaLabel": "Mikorofon zárolása",
+    "app.submenu.participants.lockCamAriaLabel": "Webkamera zárolása",
+    "app.submenu.participants.lockPublicChatAriaLabel": "Nyilvános üzenetek zárolása",
+    "app.submenu.participants.lockPrivateChatAriaLabel": "Privát üzenetek zárolása",
+    "app.submenu.participants.lockLayoutAriaLabel": "Elrendezés zárolása",
+    "app.submenu.participants.lockMicLabel": "Mikrofon",
+    "app.submenu.participants.lockCamLabel": "Webkamera",
+    "app.submenu.participants.lockPublicChatLabel": "Nyilvános üzenetek",
+    "app.submenu.participants.lockPrivateChatLabel": "Privát üzenetek",
+    "app.submenu.participants.lockLayoutLabel": "Elrendezés",
+    "app.settings.applicationTab.label": "Alkalmazás",
+    "app.settings.audioTab.label": "Hang",
+    "app.settings.videoTab.label": "Videó",
+    "app.settings.usersTab.label": "Résztvevők",
+    "app.settings.main.label": "Beállítások",
+    "app.settings.main.cancel.label": "Mégsem",
+    "app.settings.main.cancel.label.description": "Módosítások elvetése és a beállítások menü bezárása",
+    "app.settings.main.save.label": "Mentés",
+    "app.settings.main.save.label.description": "Módosítások mentése és a beállítások menü bezárása",
+    "app.settings.dataSavingTab.label": "Adatmegtakarítás",
+    "app.settings.dataSavingTab.webcam": "Webkamerák engedélyezése",
+    "app.settings.dataSavingTab.screenShare": "Képernyőmegosztás engedélyezése",
+    "app.settings.dataSavingTab.description": "Igazítsd a sávszélességedhez, hogy mi jelenhessen meg a képernyődön.",
+    "app.settings.save-notification.label": "A beállításokat mentettük",
+    "app.switch.onLabel": "BE",
+    "app.switch.offLabel": "KI",
+    "app.actionsBar.actionsDropdown.actionsLabel": "Műveletek",
+    "app.actionsBar.actionsDropdown.presentationLabel": "Prezentáció feltöltése",
+    "app.actionsBar.actionsDropdown.initPollLabel": "Meghívás szavazásra",
+    "app.actionsBar.actionsDropdown.desktopShareLabel": "Képernyőm megosztása",
+    "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Képernyőm megosztásának befejezése",
+    "app.actionsBar.actionsDropdown.presentationDesc": "Prezentációd feltöltése",
+    "app.actionsBar.actionsDropdown.initPollDesc": "Meghívás szavazásra",
+    "app.actionsBar.actionsDropdown.desktopShareDesc": "Képernyőm megosztás másokkal",
+    "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Képernyőm megosztásának befejezése vele:",
+    "app.actionsBar.actionsDropdown.pollBtnLabel": "Szavazás indítása",
+    "app.actionsBar.actionsDropdown.pollBtnDesc": "Szavazásmenü-panel be-, kikapcsolása",
+    "app.actionsBar.actionsDropdown.saveUserNames": "Felhasználók neveinek mentése",
+    "app.actionsBar.actionsDropdown.createBreakoutRoom": "Csapatszobák létrehozása",
+    "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "Csapatszobák létrehozása a jelenlegi találkozó felosztására",
+    "app.actionsBar.actionsDropdown.captionsLabel": "Feliratok írása",
+    "app.actionsBar.actionsDropdown.captionsDesc": "Feliratok panel be-, kikapcsolása ",
+    "app.actionsBar.actionsDropdown.takePresenter": "Legyen az előadó",
+    "app.actionsBar.actionsDropdown.takePresenterDesc": "Legyek én az új előadó",
+    "app.actionsBar.emojiMenu.statusTriggerLabel": "Állapot beállítása",
+    "app.actionsBar.emojiMenu.awayLabel": "Nem vagyok a gépnél",
+    "app.actionsBar.emojiMenu.awayDesc": "Az állapotot 'Nem vagyok a gépnél'-re módosítja",
+    "app.actionsBar.emojiMenu.raiseHandLabel": "Kézfeltartás",
+    "app.actionsBar.emojiMenu.raiseHandDesc": "Jelentkezz, hogy kérdezhess",
+    "app.actionsBar.emojiMenu.neutralLabel": "Bizonytalan",
+    "app.actionsBar.emojiMenu.neutralDesc": "Az állapotot 'Bizonytalan'-ra módosítja",
+    "app.actionsBar.emojiMenu.confusedLabel": "Összezavarodott",
+    "app.actionsBar.emojiMenu.confusedDesc": "Az állapotot 'Összezavarodott'-ra módosítja",
+    "app.actionsBar.emojiMenu.sadLabel": "Szomorú",
+    "app.actionsBar.emojiMenu.sadDesc": "Az állapotot 'Szomorú'-ra módosítja",
+    "app.actionsBar.emojiMenu.happyLabel": "Vidám",
+    "app.actionsBar.emojiMenu.happyDesc": "Az állapotot 'Vidám'-ra módosítja",
+    "app.actionsBar.emojiMenu.noneLabel": "Állapot törlése",
+    "app.actionsBar.emojiMenu.noneDesc": "Állapotom törlése",
+    "app.actionsBar.emojiMenu.applauseLabel": "Taps",
+    "app.actionsBar.emojiMenu.applauseDesc": "Az állapotot 'Taps'-ra módosítja",
+    "app.actionsBar.emojiMenu.thumbsUpLabel": "Tetszik",
+    "app.actionsBar.emojiMenu.thumbsUpDesc": "Az állapotot 'Tetszik'-re módosítja",
+    "app.actionsBar.emojiMenu.thumbsDownLabel": "Nem tetszik",
+    "app.actionsBar.emojiMenu.thumbsDownDesc": "Az állapotot 'Nem tetszik'-re módosítja",
+    "app.actionsBar.currentStatusDesc": "{0} jelenlegi állapot",
+    "app.actionsBar.captions.start": "Feliratok megtekintésének indítása",
+    "app.actionsBar.captions.stop": "Feliratok megtekintésének befejezése",
+    "app.audioNotification.audioFailedError1001": "Hiba 1001: WebSocket kapcsolat megszakadt",
+    "app.audioNotification.audioFailedError1002": "Hiba 1002: Websocket kapcsolat nem jött létre",
+    "app.audioNotification.audioFailedError1003": "Hiba 1003: Nem támogatott böngészőverzió",
+    "app.audioNotification.audioFailedError1004": "Hiba 1004: Hiba a híváskor (ok={0})",
+    "app.audioNotification.audioFailedError1005": "Hiba 1005: Hívás váratlanul véget ért",
+    "app.audioNotification.audioFailedError1006": "Hiba 1006: Hívás időtúllépése",
+    "app.audioNotification.audioFailedError1007": "Hiba 1007: ICE egyezkedés sikertelen",
+    "app.audioNotification.audioFailedError1008": "Hiba 1008: Átvitel sikertelen",
+    "app.audioNotification.audioFailedError1009": "Hiba 1009: Nem sikerült hozzájutni a STUN/TURN szerverinformációhoz",
+    "app.audioNotification.audioFailedError1010": "Hiba 1010: ICE egyezkedési időtúllépés",
+    "app.audioNotification.audioFailedError1011": "Hiba 1011: ICE gyűjtési időtúllépés",
+    "app.audioNotification.audioFailedError1012": "Hiba 1012: ICE kapcsolat lezárult",
+    "app.audioNotification.audioFailedMessage": "A hangcsatlakozásod sikertelen",
+    "app.audioNotification.mediaFailedMessage": "getUserMicMedia sikertelen, mivel csak biztonságos eredet engedélyezett",
+    "app.audioNotification.closeLabel": "Bezárás",
+    "app.audioNotificaion.reconnectingAsListenOnly": "A résztvevők mikrofonját zároltuk, csak hallgathat",
+    "app.breakoutJoinConfirmation.title": "Belépés csapatszobához",
+    "app.breakoutJoinConfirmation.message": " Csatlakozik ide:",
+    "app.breakoutJoinConfirmation.confirmDesc": "Belépek egy csapatszobába",
+    "app.breakoutJoinConfirmation.dismissLabel": "Mégsem",
+    "app.breakoutJoinConfirmation.dismissDesc": "A csapatszoba bezárása és a csatlakozási kérelmek visszautasítása",
+    "app.breakoutJoinConfirmation.freeJoinMessage": "Csapatszoba választása",
+    "app.breakoutTimeRemainingMessage": "Csapatszoba hátralévő ideje: {0}",
+    "app.breakoutWillCloseMessage": "Az idő lejárt. A csapatszoba hamarosan bezárul",
+    "app.calculatingBreakoutTimeRemaining": "Hátralévő idő számítása ...",
+    "app.audioModal.ariaTitle": "Csatlakozás hangablak",
+    "app.audioModal.microphoneLabel": "Mikrofon",
+    "app.audioModal.listenOnlyLabel": "Csak hallgatok",
+    "app.audioModal.audioChoiceLabel": "Hogyan csatlakozol a beszélgetéshez? ",
+    "app.audioModal.iOSBrowser": "Hang/videó nem támogatott",
+    "app.audioModal.iOSErrorDescription": "A hangot és a videót nem támogatjuk az iOS-en Chrome böngészővel.",
+    "app.audioModal.iOSErrorRecommendation": "Javasoljuk iOS Safari használatát.",
+    "app.audioModal.audioChoiceDesc": "Válassz, hogyan csatlakozol hanggal ehhez az előadáshoz",
+    "app.audioModal.unsupportedBrowserLabel": "Úgy néz ki, hogy a böngésződ nem teljesen támogatott. Kérjük, használj {0} vagy {1} böngészőt a teljes támogatás érdekében.",
+    "app.audioModal.closeLabel": "Bezárás",
+    "app.audioModal.yes": "Igen",
+    "app.audioModal.no": "Nem",
+    "app.audioModal.yes.arialabel" : "A visszhang hallható",
+    "app.audioModal.no.arialabel" : "A visszhang nem hallható",
+    "app.audioModal.echoTestTitle": "Ez a te hangteszted, más nem hallja. Mondj néhány szót. Hallod a hangot?",
+    "app.audioModal.settingsTitle": "Hangbeállításaim módosítása",
+    "app.audioModal.helpTitle": "Hiba történt a médiaeszközöddel",
+    "app.audioModal.helpText": "Adtál engedélyt a mikrofonod eléréséhez? Amikor csatlakozol egy beszélgetéshez, egy felugró ablak jelenik meg, melyben engedélyt tudsz adni a médiaeszközöd használatához. Kérjük, engedélyezd, hogy csatlakozhass a beszélgetéshez. Amennyiben nincs ilyen ablak, a böngésződ beállításaiban módosítsd a mikrofonod használatához az engedélyt.",
+    "app.audioModal.audioDialTitle": "Csatlakozás telefon használatával",
+    "app.audioDial.audioDialDescription": "Tárcsázás",
+    "app.audioDial.audioDialConfrenceText": "és add meg a megbeszélés PIN számát: ",
+    "app.audioModal.connecting": "Kapcsolódás",
+    "app.audioModal.connectingEchoTest": "Kapcsolódás a hangteszthez",
+    "app.audioManager.joinedAudio": "Csatlakoztál a beszélgetéshez",
+    "app.audioManager.joinedEcho": "Csatlakoztál a hangteszthez",
+    "app.audioManager.leftAudio": "Kiléptél a beszélgetésből",
+    "app.audioManager.genericError": "Hiba: Hiba lépett fel, kérem, próbálja újra.",
+    "app.audioManager.connectionError": "Hiba: Kapcsolódási hiba",
+    "app.audioManager.requestTimeout": "Hiba: Időtúllépés a kérésben",
+    "app.audioManager.invalidTarget": "Hiba: Egy érvénytelen célnak próbáltak valamit küldeni",
+    "app.audioManager.mediaError": "Hiba: Probléma lépett fel a médiaeszközök megszerzésekor",
+    "app.audio.joinAudio": "Hang bekapcsolása",
+    "app.audio.leaveAudio": "Hang kikapcsolása",
+    "app.audio.enterSessionLabel": "Belépés a munkamenetbe",
+    "app.audio.playSoundLabel": "Hang lejátszása",
+    "app.audio.backLabel": "Vissza",
+    "app.audio.audioSettings.titleLabel": "Válaszd ki a hangbeállításaidat",
+    "app.audio.audioSettings.descriptionLabel": "Kérjük, figyelj, hogy egy ablak fog megjelenni a böngésződben, benne kérés, hogy fogadd el a mikrofonod megosztását.",
+    "app.audio.audioSettings.microphoneSourceLabel": "Mikrofon forrása",
+    "app.audio.audioSettings.speakerSourceLabel": "Hangszóró forrása",
+    "app.audio.audioSettings.microphoneStreamLabel": "A hangstream hangerőd",
+    "app.audio.audioSettings.retryLabel": "Újra",
+    "app.audio.listenOnly.backLabel": "Vissza",
+    "app.audio.listenOnly.closeLabel": "Bezárás",
+    "app.audio.permissionsOverlay.title": "Engedélyezd, hogy használhassuk a mikrofonod",
+    "app.audio.permissionsOverlay.hint": "A médiaeszközöd használatához az engedélyedre van szükségünk :)",
+    "app.error.removed": "Eltávolítottak a beszélgetésből",
+    "app.error.meeting.ended": "Kiléptél a beszélgetésből",
+    "app.meeting.logout.duplicateUserEjectReason": "Egy felhasználó többször próbál csatlakozni az előadáshoz",
+    "app.meeting.logout.permissionEjectReason": "Engedély megsértése miatt kidobtunk",
+    "app.meeting.logout.ejectedFromMeeting": "Eltávolítottak a megbeszélésből",
+    "app.meeting.logout.validateTokenFailedEjectReason": "Hitelesítési token érvényesítése sikertelen",
+    "app.meeting.logout.userInactivityEjectReason": "A felhasználó túl sokáig volt inaktív",
+    "app.meeting-ended.rating.legendLabel": "Visszajelzési értékelés",
+    "app.meeting-ended.rating.starLabel": "Csillag",
+    "app.modal.close": "Bezárás",
+    "app.modal.close.description": "Módosítások elvetése és az ablak bezárása ",
+    "app.modal.confirm": "Kész",
+    "app.modal.newTab": "(új ablakban nyílik meg)",
+    "app.modal.confirm.description": "Módosítások mentése és az ablak bezárása",
+    "app.dropdown.close": "Bezárás",
+    "app.error.400": "Hibás kérés",
+    "app.error.401": "Nem hitelesített",
+    "app.error.403": "Eltávolítottak a megbeszélésből",
+    "app.error.404": "Nem található",
+    "app.error.410": "A találkozó véget ért",
+    "app.error.500": "Sajnáljuk, hiba történt",
+    "app.error.leaveLabel": "Bejelentkezés újra",
+    "app.error.fallback.presentation.title": "Hiba lépett fel",
+    "app.error.fallback.presentation.description": "Naplóztuk. Kérjük, próbáld újra betölteni az oldalt.",
+    "app.error.fallback.presentation.reloadButton": "Újratöltése",
+    "app.guest.waiting": "Várakozás jóváhagyásra",
+    "app.userList.guest.waitingUsers": "Várakozó felhasználók",
+    "app.userList.guest.waitingUsersTitle": "Felhasználókezelése",
+    "app.userList.guest.optionTitle": "Várakozó felhasználók előnézete",
+    "app.userList.guest.allowAllAuthenticated": "Összes hitelesített felhasználó engedélyezése ",
+    "app.userList.guest.allowAllGuests": "Összes vendég engedélyezése ",
+    "app.userList.guest.allowEveryone": "Mindenki engedélyezése",
+    "app.userList.guest.denyEveryone": "Mindenki tiltása",
+    "app.userList.guest.pendingUsers": "{0} várakozó felhasználó",
+    "app.userList.guest.pendingGuestUsers": "{0} várakozó vendégfelhasználó",
+    "app.userList.guest.pendingGuestAlert": "csatlakozott a munkamenethez és várakozik a jóváhagyásodra.",
+    "app.userList.guest.rememberChoice": "Választás megjegyzése",
+    "app.user-info.title": "Címtárkeresés",
+    "app.toast.breakoutRoomEnded": "A csapatszoba bezárult. Csatlakozz újra a találkozóhoz.",
+    "app.toast.chat.public": "Új nyilvános üzenet",
+    "app.toast.chat.private": "Új privát üzenet",
+    "app.toast.chat.system": "Rendszer",
+    "app.notification.recordingStart": "Ezt a munkamenetet rögzítjük",
+    "app.notification.recordingStop": "Ezt a munkamenetet nem rögzítjük tovább",
+    "app.notification.recordingAriaLabel": "Felvétel hossza",
+    "app.shortcut-help.title": "Gyorsbillentyűk",
+    "app.shortcut-help.accessKeyNotAvailable": "A hozzáférési kulcsok nem érhetőek el",
+    "app.shortcut-help.comboLabel": "Kombó",
+    "app.shortcut-help.functionLabel": "Funkció",
+    "app.shortcut-help.closeLabel": "Bezárás",
+    "app.shortcut-help.closeDesc": "Bezárja a gyorsbillentyűk ablakot",
+    "app.shortcut-help.openOptions": "Beállítások megnyitása",
+    "app.shortcut-help.toggleUserList": "Felhasználók ablak be-, kikapcsolása",
+    "app.shortcut-help.toggleMute": "Némít / Hangosít",
+    "app.shortcut-help.togglePublicChat": "Nyilvános üzenetek be-, kikapcsolása (a Felhasználók ablaknak nyitva kell lennie)",
+    "app.shortcut-help.hidePrivateChat": "Privát üzenetek elrejtése",
+    "app.shortcut-help.closePrivateChat": "Privát üzenetek bezárása",
+    "app.shortcut-help.openActions": "Műveletek menü megnyitása",
+    "app.shortcut-help.openStatus": "Állapotok menü megnyitása",
+    "app.shortcut-help.togglePan": "Mozgató eszköz bekapcsolása (előadó)",
+    "app.shortcut-help.nextSlideDesc": "Következő dia (előadó)",
+    "app.shortcut-help.previousSlideDesc": "Előző dia (előadó)",
+    "app.lock-viewers.title": "Résztvevők zárolása",
+    "app.lock-viewers.description": "Ezek az opciókkal letilthatod, hogy a résztvevők néhány funkciót használhassanak. (Ezek a tiltások nem érintik a moderátorokat.)",
+    "app.lock-viewers.featuresLable": "Tulajdonság",
+    "app.lock-viewers.lockStatusLabel": "Zárolt állapot",
+    "app.lock-viewers.webcamLabel": "Webkamera",
+    "app.lock-viewers.otherViewersWebcamLabel": "A többiek webkamrájának megtekintése",
+    "app.lock-viewers.microphoneLable": "Mikrofon",
+    "app.lock-viewers.PublicChatLabel": "Nyilvános üzenetek",
+    "app.lock-viewers.PrivateChatLable": "Privát üzenetek",
+    "app.lock-viewers.notesLabel": "Megosztott jegyzetek",
+    "app.lock-viewers.Layout": "Elrendezés",
+    "app.lock-viewers.ariaTitle": "Zárolt felhasználók ablaka",
+    "app.recording.startTitle": "Felvétel indítása",
+    "app.recording.stopTitle": "Felvétel szüneteltetése",
+    "app.recording.resumeTitle": "Felvétel folytatása",
+    "app.recording.startDescription": "(A felvétel szüneteltetéséhez használd a felvétel gombot.)",
+    "app.recording.stopDescription": "Biztos, hogy szünetelteted a felvételt? (A gomb újbóli megnyomásával folytatható a felvétel.)",
+    "app.videoPreview.cameraLabel": "Kamera",
+    "app.videoPreview.profileLabel": "Minőség",
+    "app.videoPreview.cancelLabel": "Mégsem",
+    "app.videoPreview.closeLabel": "Bezárás",
+    "app.videoPreview.startSharingLabel": "Megosztás indítása",
+    "app.videoPreview.webcamOptionLabel": "Válassz webkamerát",
+    "app.videoPreview.webcamPreviewLabel": "Webkamerám előnézete",
+    "app.videoPreview.webcamSettingsTitle": "Webkamerám beállításai",
+    "app.videoPreview.webcamNotFoundLabel": "Egy webkamera sem található",
+    "app.videoPreview.profileNotFoundLabel": "Egy támogatott kameraprofil sem található",
+    "app.video.joinVideo": "Webkamerám megosztása",
+    "app.video.leaveVideo": "Webkamerám megosztásának befejezése",
+    "app.video.iceCandidateError": "Hiba az ICE-jelölt hozzáadásakor",
+    "app.video.iceConnectionStateError": "Hiba 1107: Az ICE-tárgyalások sikertelenek",
+    "app.video.permissionError": "Hiba a webkamera megosztásakor. Kérjük, ellenőrizze az jogosultságokat, engedélyeket",
+    "app.video.sharingError": "Hiba a webkamera megosztásakor",
+    "app.video.notFoundError": "A webkamera nem található. Kérem, győződj meg róla, hogy csatlakoztatva van",
+    "app.video.notAllowed": "Hiányzik engedély a kamera megosztásához, kérem, ellenőrizd a böngésződ beállításait",
+    "app.video.notSupportedError": "Csak biztonságok forrásból oszthatsz meg webkamerát, ezért kérjük, ellenőrizd, hogy SSL tanúsítványod érvényes-e",
+    "app.video.notReadableError": "Nem vesszük a webkamera képét. Kérjük, ellenőrizd, hogy másik program ne használja a webkamerát",
+    "app.video.mediaFlowTimeout1020": "Hiba 1020: A média nem éri el a szervert",
+    "app.video.swapCam": "Megfordítás",
+    "app.video.swapCamDesc": "Webkamera irányának megfordítása",
+    "app.video.videoLocked": "Webkamera megosztása zárolva",
+    "app.video.videoButtonDesc": "Csatlakozás videó gomb",
+    "app.video.videoMenu": "Videómenü",
+    "app.video.videoMenuDisabled": "Videó menü Webkamera ki van kapcsolva a beállításokban",
+    "app.video.videoMenuDesc": "Videó lenyíló menü megnyitása",
+    "app.video.chromeExtensionError": "Szükséges telepítenie",
+    "app.video.chromeExtensionErrorLink": "ez a Chrome bővítmény",
+    "app.video.stats.title": "Kapcsolódási statisztikák",
+    "app.video.stats.packetsReceived": "Megérkezett csomagok",
+    "app.video.stats.packetsSent": "Elküldött csomagok",
+    "app.video.stats.packetsLost": "Elveszett csomagok",
+    "app.video.stats.bitrate": "Bitráta",
+    "app.video.stats.lostPercentage": "Összes veszteség százalékban",
+    "app.video.stats.lostRecentPercentage": "Jelenlegi veszteség százalékban",
+    "app.video.stats.dimensions": "Méretek",
+    "app.video.stats.codec": "Kodek",
+    "app.video.stats.decodeDelay": "Dekódolás késleltetése",
+    "app.video.stats.rtt": "RTT",
+    "app.video.stats.encodeUsagePercent": "Kódolás használata",
+    "app.video.stats.currentDelay": "Jelenlegi elcsúszás",
+    "app.fullscreenButton.label": "{0} teljes képernyős módra állítása",
+    "app.deskshare.iceConnectionStateError": "Hiba 1108: ICE kapcsolódási hiba a képernyőmegosztáskor",
+    "app.sfu.mediaServerConnectionError2000": "Hiba 2000: Nem sikerült csatlakozni a médiaszerverhez",
+    "app.sfu.mediaServerOffline2001": "Hiba 2001: A médiaszerver ki van kapcsolva. Kérjük, próbálja később.",
+    "app.sfu.mediaServerNoResources2002": "Hiba 2002: A médiaszervernek nincs elérhető erőforrása",
+    "app.sfu.mediaServerRequestTimeout2003": "Hiba: 2003: Időtúllépés a médiaszerver kéréseivel",
+    "app.sfu.serverIceGatheringFailed2021": "Hiba 2021: A médiaszerver nem tud ICE jelölteket gyűjteni",
+    "app.sfu.serverIceGatheringFailed2022": "Hiba 2022: Médiaszerver ICE kapcsolódási hiba",
+    "app.sfu.mediaGenericError2200": "Hiba 2200: A médiaszerver nem tudja kiszolgálni a kérést",
+    "app.sfu.invalidSdp2202":"Hiba 2202: A kliens nem valós SDP-t hozott létre",
+    "app.sfu.noAvailableCodec2203": "Hiba 2203: A szerver nem találja a megfelelő kodeket",
+    "app.meeting.endNotification.ok.label": "OK",
+    "app.whiteboard.annotations.poll": "A szavazás eredményeit sikeresen közzétetted",
+    "app.whiteboard.toolbar.tools": "Eszközök",
+    "app.whiteboard.toolbar.tools.hand": "Mozgatás",
+    "app.whiteboard.toolbar.tools.pencil": "Ceruza",
+    "app.whiteboard.toolbar.tools.rectangle": "Téglalap",
+    "app.whiteboard.toolbar.tools.triangle": "Háromszög",
+    "app.whiteboard.toolbar.tools.ellipse": "Ellipszis",
+    "app.whiteboard.toolbar.tools.line": "Vonal",
+    "app.whiteboard.toolbar.tools.text": "Szöveg",
+    "app.whiteboard.toolbar.thickness": "Rajzolás vastagsága",
+    "app.whiteboard.toolbar.thicknessDisabled": "A rajzolás vastagsága ki van kapcsolva",
+    "app.whiteboard.toolbar.color": "Színek",
+    "app.whiteboard.toolbar.colorDisabled": "A színek le van tiltva",
+    "app.whiteboard.toolbar.color.black": "Fekete",
+    "app.whiteboard.toolbar.color.white": "Fehér",
+    "app.whiteboard.toolbar.color.red": "Piros",
+    "app.whiteboard.toolbar.color.orange": "Narancs",
+    "app.whiteboard.toolbar.color.eletricLime": "Elektromos zöldcitrom",
+    "app.whiteboard.toolbar.color.lime": "Zöldcitrom",
+    "app.whiteboard.toolbar.color.cyan": "Cián",
+    "app.whiteboard.toolbar.color.dodgerBlue": "Vagánykék",
+    "app.whiteboard.toolbar.color.blue": "Kék",
+    "app.whiteboard.toolbar.color.violet": "Ibolya",
+    "app.whiteboard.toolbar.color.magenta": "Magenta",
+    "app.whiteboard.toolbar.color.silver": "Ezüst",
+    "app.whiteboard.toolbar.undo": "Rajzolás visszavonása",
+    "app.whiteboard.toolbar.clear": "Összes rajzolás törlése",
+    "app.whiteboard.toolbar.multiUserOn": "Többfelhasználós rajztábla bekapcsolása",
+    "app.whiteboard.toolbar.multiUserOff": "Többfelhasználós rajztábla kikapcsolása",
+    "app.whiteboard.toolbar.fontSize": "Betűméretek",
+    "app.feedback.title": "Kiléptél a beszélgetésből",
+    "app.feedback.subtitle": "Örömmel vesszük, ha írsz néhány szót a BigBlueButton használatának tapasztalatairól (nem kötelező)",
+    "app.feedback.textarea": "Hogyan tennéd jobbá a BigBlueButton-t?",
+    "app.feedback.sendFeedback": "Visszajelzés küldése",
+    "app.feedback.sendFeedbackDesc": "Visszajelzés küldése és kilépés a találkozóból",
+    "app.videoDock.webcamFocusLabel": "Fókusz",
+    "app.videoDock.webcamFocusDesc": "Fókusz a kiválasztott webkamerára",
+    "app.videoDock.webcamUnfocusLabel": "Fókusz elvétele",
+    "app.videoDock.webcamUnfocusDesc": "Fókusz elvétele a kiválasztott webkameráról",
+    "app.invitation.title": "Meghívás csapatszobába",
+    "app.invitation.confirm": "Meghívás",
+    "app.createBreakoutRoom.title": "Csapatszobák",
+    "app.createBreakoutRoom.ariaTitle": "Csapatszobák elrejtése",
+    "app.createBreakoutRoom.breakoutRoomLabel": "{0} csapatszoba",
+    "app.createBreakoutRoom.generatingURL": "URL létrehozása",
+    "app.createBreakoutRoom.generatedURL": "Generált",
+    "app.createBreakoutRoom.duration": "{0} időtartam",
+    "app.createBreakoutRoom.room": "{0} szoba",
+    "app.createBreakoutRoom.notAssigned": "({0}) nincs hozzárendelve",
+    "app.createBreakoutRoom.join": "Belépés szobába",
+    "app.createBreakoutRoom.joinAudio": "Hang bekapcsolása",
+    "app.createBreakoutRoom.returnAudio": "Vissza a beszélgetéshez",
+    "app.createBreakoutRoom.confirm": "Létrehozás",
+    "app.createBreakoutRoom.record": "Rögzítés",
+    "app.createBreakoutRoom.numberOfRooms": "Szobák száma",
+    "app.createBreakoutRoom.durationInMinutes": "Időtartam (percben)",
+    "app.createBreakoutRoom.randomlyAssign": "Véletlenszerű hozzárendelés",
+    "app.createBreakoutRoom.endAllBreakouts": "Összes csapatszoba bezárása",
+    "app.createBreakoutRoom.roomName": "{0} (Szoba - {1})",
+    "app.createBreakoutRoom.doneLabel": "Kész",
+    "app.createBreakoutRoom.nextLabel": "Következő",
+    "app.createBreakoutRoom.minusRoomTime": "Csapatszoba idejének csökkentése",
+    "app.createBreakoutRoom.addRoomTime": "Csapatszoba idejének növelése",
+    "app.createBreakoutRoom.addParticipantLabel": "+ Résztvevő hozzáadása",
+    "app.createBreakoutRoom.freeJoin": "A felhasználók maguk választhatnak csapatszobát",
+    "app.createBreakoutRoom.leastOneWarnBreakout": "Minden csapatszobába legalább egy felhasználónak kell kerülnie.",
+    "app.createBreakoutRoom.modalDesc": "Hajtsd végre az alábbi lépéseket, hogy szobákat hozz létre és felhasználókat rendelj a szobákhoz.",
+    "app.createBreakoutRoom.roomTime": "{0} perc",
+    "app.externalVideo.start": "Egy új videó megosztása",
+    "app.externalVideo.title": "Egy YouTube videó megosztása",
+    "app.externalVideo.input": "YouTube videó URL-je",
+    "app.externalVideo.urlInput": "YouTube URL hozzáadása",
+    "app.externalVideo.urlError": "Ez nem YouTube videó URL-je",
+    "app.externalVideo.close": "Bezárás",
+    "app.network.connection.effective.slow": "Kapcsolódási problémát érzékeltünk.",
+    "app.network.connection.effective.slow.help": "Hogyan javítsam meg?",
+    "app.externalVideo.noteLabel": "Megjegyzés: A megosztott YouTube videókat nem rögzítjük",
+    "app.actionsBar.actionsDropdown.shareExternalVideo": "YouTube videó megosztása",
+    "app.actionsBar.actionsDropdown.stopShareExternalVideo": "YouTube videó megosztásának leállítása",
+    "app.iOSWarning.label": "Frissíts iOS 12.2-re vagy újabbra",
+    "app.legacy.unsupportedBrowser": "Úgy néz ki, hogy a böngésződ nem támogatott. Kérjük, használj {0} vagy {1} böngészőt a teljes támogatás érdekében.",
+    "app.legacy.upgradeBrowser": "Úgy néz ki, hogy a böngésződ egy régi verzióját használod. Kérjük, frissítsd a böngésződet a teljes támogatás érdekében."
+
+}
+
diff --git a/bigbluebutton-html5/private/locales/id.json b/bigbluebutton-html5/private/locales/id.json
index 1c930ae2c9a88a736a13c5693f25e3678a8bc728..b40613cb57780addeffdca9e56f699fc1ad39f70 100644
--- a/bigbluebutton-html5/private/locales/id.json
+++ b/bigbluebutton-html5/private/locales/id.json
@@ -16,6 +16,11 @@
     "app.chat.dropdown.save": "Simpan",
     "app.chat.label": "Chat",
     "app.chat.emptyLogLabel": "Log Chatting kosong",
+    "app.captions.menu.close": "Tutup",
+    "app.captions.menu.start": "Mulai",
+    "app.captions.menu.backgroundColor": "Warna latar",
+    "app.captions.menu.cancelLabel": "Batalkan",
+    "app.captions.pad.ownership": "Ambil kepemilikan",
     "app.userList.usersTitle": "Pengguna",
     "app.userList.participantsTitle": "Peserta",
     "app.userList.messagesTitle": "Pesan",
@@ -97,14 +102,6 @@
     "app.submenu.video.videoOptionLabel": "Pilih Lihat Sumber",
     "app.submenu.video.qualityOptionLabel": "Pilih kualitas video",
     "app.submenu.video.participantsCamLabel": "Melihat Web Kamera Peserta",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Ambil kepemilikan",
-    "app.submenu.closedCaptions.languageLabel": "Bahasa",
-    "app.submenu.closedCaptions.localeOptionLabel": "Pilih Bahasa",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "Tidaki ada lokalisasi yang aktif",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Jenis Huruf",
-    "app.submenu.closedCaptions.fontSizeLabel": "Ukuran Huruf",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Warna latar",
-    "app.submenu.closedCaptions.fontColorLabel": "Warna Huruf",
     "app.submenu.participants.muteAllLabel": "Diamkan semua kecuali pemateri",
     "app.submenu.participants.lockMicAriaLabel": "Kunci Mikropon",
     "app.submenu.participants.lockCamAriaLabel": "Kunci Web Kamera.",
@@ -154,7 +151,6 @@
     "app.audioNotification.audioFailedMessage": "Koneksi audio anda gagal terhubung",
     "app.audioNotification.closeLabel": "Tutup",
     "app.breakoutJoinConfirmation.message": "Anda ingin bergabung ?",
-    "app.breakoutJoinConfirmation.confirmLabel": "Bergabung",
     "app.breakoutJoinConfirmation.dismissLabel": "Batalkan",
     "app.audioModal.microphoneLabel": "MIkropon",
     "app.audioModal.audioChoiceLabel": "Bagaimana anda akan terhubung dengan audio?",
diff --git a/bigbluebutton-html5/private/locales/it_IT.json b/bigbluebutton-html5/private/locales/it_IT.json
index eade0ba936087845f921ee5dd13d14ce7482ef18..f817807a2037df41f2d9aa52f681dc04c28ece5a 100644
--- a/bigbluebutton-html5/private/locales/it_IT.json
+++ b/bigbluebutton-html5/private/locales/it_IT.json
@@ -16,8 +16,14 @@
     "app.chat.dropdown.copy": "Copia",
     "app.chat.dropdown.save": "Salva",
     "app.chat.label": "Chat",
+    "app.chat.offline": "Disconnesso",
     "app.chat.emptyLogLabel": "Il registro chat è vuoto",
     "app.chat.clearPublicChatMessage": "Il registro della Chat pubblica è stato cancellato da un moderatore",
+    "app.captions.menu.close": "Chiudi",
+    "app.captions.menu.backgroundColor": "Colore di sfondo",
+    "app.captions.menu.cancelLabel": "Annulla",
+    "app.captions.pad.tip": "Premi ESC per utilizzare la barra degli strumenti",
+    "app.captions.pad.ownership": "Prendi il controllo",
     "app.note.title": "Note condivise",
     "app.note.label": "Note",
     "app.note.hideNoteLabel": "Nascondi nota",
@@ -106,8 +112,7 @@
     "app.presentation.presentationToolbar.fitToPage": "Adatta alla pagina",
     "app.presentation.presentationToolbar.goToSlide": "Slide {0}",
     "app.presentationUploder.title": "Presentazione",
-    "app.presentationUploder.message": "Come presentatore hai la possibilità di caricare qualsiasi documento o PDF. Il formato PDF è consigliato per un risultato ottimale",
-    "app.presentationUploder.confirmLabel": "Carica",
+    "app.presentationUploder.uploadLabel": "Carica",
     "app.presentationUploder.confirmDesc": "Salva modifiche e avvia presentazione",
     "app.presentationUploder.dismissLabel": "Annulla",
     "app.presentationUploder.dismissDesc": "Chiudi la finestra e annulla le modifiche",
@@ -118,7 +123,6 @@
     "app.presentationUploder.fileToUpload": "Da caricare...",
     "app.presentationUploder.currentBadge": "Attuale",
     "app.presentationUploder.genericError": "Dannazione, qualcosa è andato storto",
-    "app.presentationUploder.rejectedError": "Alcuni dei file selezionati sono stati rifiutati. Per favore controllare il tipo di file.",
     "app.presentationUploder.upload.progress": "Caricamento ({0}%)",
     "app.presentationUploder.upload.413": "Il file è troppo grande, il numero massimo di 200 pagine è stato raggiunto",
     "app.presentationUploder.conversion.conversionProcessingSlides": "Elaborazione pagina {0} di {1}",
@@ -161,6 +165,15 @@
     "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": "Vero",
+    "app.poll.answer.false": "Falso",
+    "app.poll.answer.yes": "Si",
+    "app.poll.answer.no": "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": "Utenti",
     "app.poll.liveResult.responsesTitle": "Risposta",
     "app.polling.pollingTitle": "Opzioni sondaggio",
@@ -222,6 +235,7 @@
     "app.submenu.application.fontSizeControlLabel": "Dimensione carattere",
     "app.submenu.application.increaseFontBtnLabel": "Aumenta dimensione carattere",
     "app.submenu.application.decreaseFontBtnLabel": "Diminuisci dimensione carattere",
+    "app.submenu.application.currentSize": "attualmente {0}",
     "app.submenu.application.languageLabel": "Lingua dell'interfaccia",
     "app.submenu.application.ariaLanguageLabel": "Cambia lingua applicazione",
     "app.submenu.application.languageOptionLabel": "Scegli linguaggio",
@@ -235,18 +249,6 @@
     "app.submenu.video.videoQualityLabel": "Qualità Video ",
     "app.submenu.video.qualityOptionLabel": "Seleziona la qualità video",
     "app.submenu.video.participantsCamLabel": "Visualizza webcam partecipanti",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "Sottotitoli",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Prendi il controllo",
-    "app.submenu.closedCaptions.languageLabel": "Lingua",
-    "app.submenu.closedCaptions.localeOptionLabel": "Scegli linguaggio",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "Non ci sono localizzazioni attive",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Carattere",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "Seleziona carattere",
-    "app.submenu.closedCaptions.fontSizeLabel": "Dimensione carattere",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "Seleziona dimensione carattere",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Colore di sfondo",
-    "app.submenu.closedCaptions.fontColorLabel": "Colore testo",
-    "app.submenu.closedCaptions.noLocaleSelected": "Localizzazione non selezionata",
     "app.submenu.participants.muteAllLabel": "Silenzia tutti eccetto il presentatore",
     "app.submenu.participants.lockAllLabel": "Blocca tutti gli spettatori",
     "app.submenu.participants.lockItemLabel": "Spettatori {0}",
@@ -268,7 +270,6 @@
     "app.settings.applicationTab.label": "Applicazione",
     "app.settings.audioTab.label": "Audio",
     "app.settings.videoTab.label": "Video",
-    "app.settings.closedcaptionTab.label": "Sottotitoli",
     "app.settings.usersTab.label": "Partecipanti",
     "app.settings.main.label": "Impostazioni",
     "app.settings.main.cancel.label": "Annulla",
@@ -338,7 +339,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "Il microfono è stato bloccato per gli spettatori, puoi collegarti solo come ascoltatore",
     "app.breakoutJoinConfirmation.title": "Entra nella Stanza Separata ",
     "app.breakoutJoinConfirmation.message": "Vuoi partecipare",
-    "app.breakoutJoinConfirmation.confirmLabel": "Pertecipa",
     "app.breakoutJoinConfirmation.confirmDesc": "Partecipa con te nella Stanza Separata",
     "app.breakoutJoinConfirmation.dismissLabel": "Annulla",
     "app.breakoutJoinConfirmation.dismissDesc": "Chiudi e non accettare ingressi nella Stanza Separata",
@@ -404,6 +404,7 @@
     "app.modal.close": "Chiudi",
     "app.modal.close.description": "Annula le modifiche e chiudi la finestra",
     "app.modal.confirm": "Fatto",
+    "app.modal.newTab": "(apre una nuova scheda)",
     "app.modal.confirm.description": "Salva le modifiche e chiudi la finestra",
     "app.dropdown.close": "Chiudi",
     "app.error.400": "Richiesta Errata",
@@ -592,12 +593,15 @@
     "app.createBreakoutRoom.freeJoin": "Permetti agli utenti di entrare in una Stanza Separata",
     "app.createBreakoutRoom.leastOneWarnBreakout": "Devi posizionare almeno un utente nella Stanza Separata",
     "app.createBreakoutRoom.modalDesc": "Completa i passaggi seguenti per creare Stanze nella tua sessione e aggiungere partecipanti ad esse.",
+    "app.createBreakoutRoom.roomTime": "{0} minuti",
     "app.externalVideo.start": "Condividi un nuovo video",
     "app.externalVideo.title": "Condividi un video da YouTube",
     "app.externalVideo.input": "Indirizzo video YouTube ",
     "app.externalVideo.urlInput": "Aggiungi un indirizzo da YouTube",
     "app.externalVideo.urlError": "Questo indirizzo non è un video YouTube valido",
     "app.externalVideo.close": "Chiudi",
+    "app.network.connection.effective.slow": "Stiamo rilevando problemi di connessione",
+    "app.network.connection.effective.slow.help": "Come risolvere?",
     "app.externalVideo.noteLabel": "Nota: I video condivisi da YouTube non appariranno nella registrazione",
     "app.actionsBar.actionsDropdown.shareExternalVideo": "Condividi un video da YouTube",
     "app.actionsBar.actionsDropdown.stopShareExternalVideo": "Interrompi condivisione video da YouTube",
diff --git a/bigbluebutton-html5/private/locales/ja.json b/bigbluebutton-html5/private/locales/ja.json
index 8cd672994b2bb133e8118835aeeac51cacd8c9d6..3315d9689984e7c5d5c824b2a151ab1e89385834 100644
--- a/bigbluebutton-html5/private/locales/ja.json
+++ b/bigbluebutton-html5/private/locales/ja.json
@@ -18,6 +18,12 @@
     "app.chat.label": "チャット",
     "app.chat.emptyLogLabel": "チャットログは空です",
     "app.chat.clearPublicChatMessage": "チャット履歴はモデレーターにより消去されました",
+    "app.captions.menu.close": "閉じる",
+    "app.captions.menu.start": "開始",
+    "app.captions.menu.backgroundColor": "背景色",
+    "app.captions.menu.cancelLabel": "キャンセル",
+    "app.captions.pad.tip": "Escを押してエディターツールバーにフォーカスする",
+    "app.captions.pad.ownership": "所有権をとる",
     "app.note.title": "共有メモ",
     "app.note.label": "メモ",
     "app.note.hideNoteLabel": "メモを隠す",
@@ -97,7 +103,6 @@
     "app.presentation.presentationToolbar.fitToPage": "ページに合わせる",
     "app.presentation.presentationToolbar.goToSlide": "スライド {0}",
     "app.presentationUploder.title": "プレゼンテーション",
-    "app.presentationUploder.message": "プレゼンターはドキュメントをアップロードすることができます。お勧めのファイル形式はPDFファイルです。",
     "app.presentationUploder.confirmDesc": "変更を保存してプレゼンテーションを開始する",
     "app.presentationUploder.dismissLabel": "キャンセル",
     "app.presentationUploder.dismissDesc": "変更を保存せずウィンドウを閉じる",
@@ -108,7 +113,6 @@
     "app.presentationUploder.fileToUpload": "アップロードされます…",
     "app.presentationUploder.currentBadge": "現在",
     "app.presentationUploder.genericError": "エラーが発生しました",
-    "app.presentationUploder.rejectedError": "いくつかの選択ファイルが拒否されました。ファイルのMIMEタイプを確認してください。",
     "app.presentationUploder.upload.progress": "アップロード中({0}%)",
     "app.presentationUploder.conversion.conversionProcessingSlides": "{1}ページ中{0}ページ目を処理中",
     "app.presentationUploder.conversion.genericConversionStatus": "ファイル変換中…",
@@ -145,6 +149,10 @@
     "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.liveResult.usersTitle": "ユーザー",
     "app.poll.liveResult.responsesTitle": "回答",
     "app.polling.pollingTitle": "投票オプション",
@@ -216,18 +224,6 @@
     "app.submenu.video.videoQualityLabel": "ビデオ品質",
     "app.submenu.video.qualityOptionLabel": "ビデオ品質を選択",
     "app.submenu.video.participantsCamLabel": "参加者のウェブカメラを見ています",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "字幕",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "所有権をとる",
-    "app.submenu.closedCaptions.languageLabel": "言語",
-    "app.submenu.closedCaptions.localeOptionLabel": "言語を選択",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "アクティブなロケールがありません",
-    "app.submenu.closedCaptions.fontFamilyLabel": "フォントファミリー",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "フォントファミリーを選択",
-    "app.submenu.closedCaptions.fontSizeLabel": "フォントサイズ",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "フォントサイズ",
-    "app.submenu.closedCaptions.backgroundColorLabel": "背景色",
-    "app.submenu.closedCaptions.fontColorLabel": "フォント色",
-    "app.submenu.closedCaptions.noLocaleSelected": "ロケールが選択されていません",
     "app.submenu.participants.muteAllLabel": "プレゼンター以外の全員をミュート",
     "app.submenu.participants.lockAllLabel": "全ビューアーをロックする",
     "app.submenu.participants.lockItemLabel": "ビューアー {0}",
@@ -249,7 +245,6 @@
     "app.settings.applicationTab.label": "アプリケーション",
     "app.settings.audioTab.label": "音声",
     "app.settings.videoTab.label": "ビデオ",
-    "app.settings.closedcaptionTab.label": "字幕",
     "app.settings.usersTab.label": "参加者",
     "app.settings.main.label": "設定",
     "app.settings.main.cancel.label": "キャンセル",
@@ -316,7 +311,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "ビューアーのマイクがロックされています。この接続は「聴講のみ」です。",
     "app.breakoutJoinConfirmation.title": "ブレイクアウトルームに参加する",
     "app.breakoutJoinConfirmation.message": "参加しますか",
-    "app.breakoutJoinConfirmation.confirmLabel": "参加",
     "app.breakoutJoinConfirmation.confirmDesc": "ブレイクアウトルームに参加しました",
     "app.breakoutJoinConfirmation.dismissLabel": "キャンセル",
     "app.breakoutJoinConfirmation.dismissDesc": "ブレイクアウトルームに参加しないで画面を閉じる",
diff --git a/bigbluebutton-html5/private/locales/ja_JP.json b/bigbluebutton-html5/private/locales/ja_JP.json
index e2642d8164cfa19858b3a3685407b222d33a4c4b..a7553d7b0d685d9942e4587df6c321122d64dd1a 100644
--- a/bigbluebutton-html5/private/locales/ja_JP.json
+++ b/bigbluebutton-html5/private/locales/ja_JP.json
@@ -18,6 +18,12 @@
     "app.chat.label": "チャット",
     "app.chat.emptyLogLabel": "チャットログは空です",
     "app.chat.clearPublicChatMessage": "グループチャット履歴はモデレーターにより消去されました",
+    "app.captions.menu.close": "閉じる",
+    "app.captions.menu.start": "開始",
+    "app.captions.menu.backgroundColor": "背景色",
+    "app.captions.menu.cancelLabel": "キャンセル",
+    "app.captions.pad.tip": "Escを押してエディタツールバーにフォーカスする",
+    "app.captions.pad.ownership": "所有権をとる",
     "app.note.title": "共有メモ",
     "app.note.label": "メモ",
     "app.note.hideNoteLabel": "メモを隠す",
@@ -97,7 +103,6 @@
     "app.presentation.presentationToolbar.fitToPage": "ページに合わせる",
     "app.presentation.presentationToolbar.goToSlide": "スライド {0}",
     "app.presentationUploder.title": "プレゼンテーション",
-    "app.presentationUploder.message": "プレゼンターはドキュメントをアップロードすることができます。お勧めのファイル形式はPDFファイルです。",
     "app.presentationUploder.confirmDesc": "変更を保存してプレゼンテーションを開始する",
     "app.presentationUploder.dismissLabel": "キャンセル",
     "app.presentationUploder.dismissDesc": "変更を保存せずウィンドウを閉じる",
@@ -108,7 +113,6 @@
     "app.presentationUploder.fileToUpload": "アップロードする...",
     "app.presentationUploder.currentBadge": "現在",
     "app.presentationUploder.genericError": "エラーが発生しました",
-    "app.presentationUploder.rejectedError": "いくつかの選択ファイルが拒否されました。ファイルのMIMEタイプを確認してください。",
     "app.presentationUploder.upload.progress": "アップロード中 ({0}%)",
     "app.presentationUploder.conversion.conversionProcessingSlides": "{1}ページ中{0}ページ目を処理中",
     "app.presentationUploder.conversion.genericConversionStatus": "ファイル変換中…",
@@ -145,6 +149,10 @@
     "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.liveResult.usersTitle": "ユーザー",
     "app.poll.liveResult.responsesTitle": "回答",
     "app.polling.pollingTitle": "投票オプション",
@@ -216,18 +224,6 @@
     "app.submenu.video.videoQualityLabel": "ビデオ品質",
     "app.submenu.video.qualityOptionLabel": "ビデオ品質を選択",
     "app.submenu.video.participantsCamLabel": "参加者のウェブカメラを見ています",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "字幕",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "所有権をとる",
-    "app.submenu.closedCaptions.languageLabel": "言語",
-    "app.submenu.closedCaptions.localeOptionLabel": "言語を選択",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "アクティブなロケールがありません",
-    "app.submenu.closedCaptions.fontFamilyLabel": "フォントファミリー",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "フォントファミリーを選択",
-    "app.submenu.closedCaptions.fontSizeLabel": "フォントサイズ",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "フォントサイズを選択",
-    "app.submenu.closedCaptions.backgroundColorLabel": "背景色",
-    "app.submenu.closedCaptions.fontColorLabel": "フォント色",
-    "app.submenu.closedCaptions.noLocaleSelected": "ロケールが選択されていません",
     "app.submenu.participants.muteAllLabel": "プレゼンター以外の全員をミュート",
     "app.submenu.participants.lockAllLabel": "全ビューアーをロックする",
     "app.submenu.participants.lockItemLabel": "ビューアー {0}",
@@ -249,7 +245,6 @@
     "app.settings.applicationTab.label": "アプリケーション",
     "app.settings.audioTab.label": "音声",
     "app.settings.videoTab.label": "ビデオ",
-    "app.settings.closedcaptionTab.label": "字幕",
     "app.settings.usersTab.label": "参加者",
     "app.settings.main.label": "設定",
     "app.settings.main.cancel.label": "キャンセル",
@@ -316,7 +311,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "ビューアーのマイクがロックされています。この接続は「聴講のみ」です。",
     "app.breakoutJoinConfirmation.title": "ブレイクアウトルームに参加する",
     "app.breakoutJoinConfirmation.message": "参加しますか",
-    "app.breakoutJoinConfirmation.confirmLabel": "参加",
     "app.breakoutJoinConfirmation.confirmDesc": "ブレイクアウトルームに参加しました",
     "app.breakoutJoinConfirmation.dismissLabel": "キャンセル",
     "app.breakoutJoinConfirmation.dismissDesc": "ブレイクアウトルームに参加しないで画面を閉じる",
diff --git a/bigbluebutton-html5/private/locales/km.json b/bigbluebutton-html5/private/locales/km.json
index 9c6367e379d16a432b201f8951790328cce84871..84b9a3a0fb3a8cfb4a42d25d0d2ddb34fa48c950 100644
--- a/bigbluebutton-html5/private/locales/km.json
+++ b/bigbluebutton-html5/private/locales/km.json
@@ -1,5 +1,5 @@
 {
-    "app.home.greeting": "បទ​បង្ហាញ​របស់​អ្នក​នឹង​ចាប់ផ្តើម​បន្តិច​ទៀត​នេះ",
+    "app.home.greeting": "បទ​បង្ហាញ​របស់​អ្នក​នឹង​ចាប់ផ្តើម​បន្តិច​ទៀត​នេះ ...",
     "app.chat.submitLabel": "ផ្ញើ​សារ",
     "app.chat.errorMinMessageLength": "សារ​នេះ​នៅ​ខ្វះ {0} តួ​អក្សរ​ទៀត",
     "app.chat.errorMaxMessageLength": "សារ​នេះ​លើស {0} តួ​អក្សរ",
@@ -16,26 +16,80 @@
     "app.chat.dropdown.copy": "ចម្លង",
     "app.chat.dropdown.save": "រក្សាទុក",
     "app.chat.label": "ការជជែក",
+    "app.chat.offline": "ក្រៅបណ្តាញ",
     "app.chat.emptyLogLabel": "កំណត់ត្រា​ការ​ជជែក​ទទេ",
+    "app.chat.clearPublicChatMessage": "ប្រវត្តិនៃការជជែកសាធារណៈត្រូវបានសម្អាតដោយអ្នកសម្របសម្រួល",
+    "app.captions.menu.close": "បិទ",
+    "app.captions.menu.backgroundColor": "ពណ៌​ផ្ទៃ​ខាង​ក្រោយ",
+    "app.captions.menu.cancelLabel": "បោះបង់",
+    "app.captions.pad.tip": "ចុច Esc ដើម្បីផ្តោតទៅលើរបារឧបករណ៍សម្រាប់កម្មវិធីសរសេរ",
+    "app.captions.pad.ownership": "យក​ធ្វើ​ជា​របស់​ខ្លួន​ឯង",
     "app.note.title": "ចំណាំរួមគ្នា",
     "app.note.label": "ចំណាំ",
     "app.note.hideNoteLabel": "លាក់ចំណាំ",
     "app.user.activityCheck": "ការពិនិត្យសកម្មភាពអ្នកប្រើ",
     "app.user.activityCheck.label": "ពិនិត្យថាតើអ្នកប្រើនៅក្នុងការប្រជុំទៀតទេ ({0})",
     "app.user.activityCheck.check": "ពិនិត្យ",
-    "app.userList.usersTitle": "អ្នកប្រើប្រាស់",
+    "app.note.tipLabel": "ចុច Esc ដើម្បីផ្តោតទៅលើរបារឧបករណ៍សម្រាប់កម្មវិធីសរសេរ",
+    "app.userList.usersTitle": "អ្នកប្រើ",
     "app.userList.participantsTitle": "អ្នកចូលរួម",
     "app.userList.messagesTitle": "សារ",
-    "app.userList.presenter": "អ្នក​ធ្វើ​បទ​បង្ហាញ",
+    "app.userList.notesTitle": "ចំណាំ",
+    "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.muteUserAudio.label": "បិទសម្លេងអ្នកប្រើប្រាស់",
-    "app.userList.menu.unmuteUserAudio.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.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.webcamsOnlyForModerator": "មានតែអ្នកសម្របសម្រួលទេទើបអាចមើលកាមេរ៉ារបស់អ្នកមើលបាន (ដោយសារតែការកំណត់សម្រាប់បិទ)",
     "app.media.label": "មេឌៀ",
+    "app.media.screenshare.start": "ការចែករំលែកអេក្រង់បានចាប់ផ្តើុម",
+    "app.media.screenshare.end": "ការចែករំលែកអេក្រង់បានបញ្ចប់",
+    "app.media.screenshare.safariNotSupported": "មុខងារចែករំលែកអេក្រង់មិនទាន់ប្រើបានលើ Safari ទេ។ សូមប្រើ​ Firefox ឬ Google Chrome។",
+    "app.meeting.ended": "ការប្រជុំត្រូវបានបញ្ចប់",
+    "app.meeting.meetingTimeRemaining": "ពេលប្រជុំនៅសល់៖  {0}",
+    "app.meeting.meetingTimeHasEnded": "ដល់ពេលកំណត់។ ការប្រជុំនឹងបញ្ចប់បន្តិចទៀតនេះ។",
+    "app.meeting.endedMessage": "អ្នកនឹងត្រូវនាំទៅកាន់ទំព័រដើម",
+    "app.meeting.alertMeetingEndsUnderOneMinute": "ការប្រជុំនឹងបិទនៅពេលបន្តិចទៀត",
+    "app.meeting.alertBreakoutEndsUnderOneMinute": "បន្ទប់បំបែកនឹងបិទនាពេលបន្តិចទៀត",
+    "app.presentation.hide": "លាក់បទបង្ហាញ",
+    "app.presentation.notificationLabel": "បទបង្ហាញបច្ចុប្បន្ន",
+    "app.presentation.slideContent": "ខ្លឹមសារក្នុងស្លាយ",
+    "app.presentation.startSlideContent": "ខ្លឹមសារក្នុងស្លាយចាប់ផ្តើម",
+    "app.presentation.endSlideContent": "ខ្លឹមសារក្នុងស្លាយបញ្ចប់",
+    "app.presentation.emptySlideContent": "មិនមានខ្លឹមសារសម្រាប់ស្លាយបច្ចុប្បន្នទេ",
+    "app.presentation.presentationToolbar.selectLabel": "ជ្រើសស្លាយ",
     "app.presentation.presentationToolbar.prevSlideLabel": "ស្លាយ​មុន",
     "app.presentation.presentationToolbar.prevSlideDesc": "ប្តូរ​បទ​បង្ហាញ​ទៅ​ស្លាយ​មុន",
     "app.presentation.presentationToolbar.nextSlideLabel": "ស្លាយ​បន្ទាប់",
@@ -48,18 +102,90 @@
     "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.uploadLabel": "ផ្ទុកឡើង",
+    "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.genericError": "អុញ! មាន​បញ្ហា​អ្វី​មួយ​ហើយ",
+    "app.presentationUploder.upload.progress": "កំពុងផ្ទុកឡើង ({0}%)",
+    "app.presentationUploder.upload.413": "ឯកសារធំពេក ដល់កម្រិតទំព័រ ២០០",
+    "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.timeout": "អុញ ការបម្លែងចំណាយពេលច្រើនហួស",
+    "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": "ជម្រើស {0} នៃ {1} ក្នុងការស្ទង់មតិថ្មី",
+    "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.liveResult.usersTitle": "អ្នកប្រើប្រាស់",
+    "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.navBar.settingsDropdown.optionsLabel": "ជម្រើស",
     "app.navBar.settingsDropdown.fullscreenLabel": "បើក​ពេញ​អេក្រង់",
-    "app.navBar.settingsDropdown.settingsLabel": "បើក​ការ​កំណត់",
+    "app.navBar.settingsDropdown.settingsLabel": "ការ​កំណត់",
     "app.navBar.settingsDropdown.aboutLabel": "អំពី",
     "app.navBar.settingsDropdown.leaveSessionLabel": "ចាកចេញ",
     "app.navBar.settingsDropdown.exitFullscreenLabel": "ចាកចេញ​ពី​អេក្រង់​ពេញ",
@@ -68,45 +194,69 @@
     "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.leaveConfirmation.confirmLabel": "ចាកចេញ",
     "app.leaveConfirmation.confirmDesc": "ដក​អ្នក​ចេញ​ពី​ការ​ប្រជុំ",
+    "app.endMeeting.title": "បញ្ចប់ការប្រជុំ",
+    "app.endMeeting.description": "តើអ្នកពិតជាចង់បញ្ចប់ការប្រជុំនេះមែនទេ?",
     "app.endMeeting.yesLabel": "បាទ/ចាស",
     "app.endMeeting.noLabel": "ទេ",
     "app.about.title": "អំពី",
-    "app.about.copyright": "សិទ្ធិ​អ្នកនិពន្ធ ៖",
+    "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.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.fontSizeControlLabel": "ទំហំ​អក្សរ​",
     "app.submenu.application.increaseFontBtnLabel": "បង្កើន​ទំហំ​អក្សរ​ក្នុង​កម្មវិធី",
     "app.submenu.application.decreaseFontBtnLabel": "បន្ថយ​ទំហំ​អក្សរ​ក្នុង​កម្មវិធី",
+    "app.submenu.application.currentSize": "បច្ចុប្បន្ន {0}",
     "app.submenu.application.languageLabel": "ភាសា​របស់​កម្មវិធី",
+    "app.submenu.application.ariaLanguageLabel": "ប្តូរភាសាក្នុងកម្មវិធី",
     "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.videoSourceLabel": "ប្រភពបង្ហាញ​",
+    "app.submenu.video.videoOptionLabel": "ជ្រើសរើស​​ប្រភពបង្ហាញ",
+    "app.submenu.video.videoQualityLabel": "កម្រិត​គុណភាព​វីដេអូ",
     "app.submenu.video.qualityOptionLabel": "ជ្រើសរើស​គុណភាព​វីដេអូ",
     "app.submenu.video.participantsCamLabel": "កំពុង​បង្ហាញ​វេបខេម​របស់​អ្នក​ចូលរួម",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "យក​ធ្វើ​ជា​របស់​ខ្លួន​ឯង",
-    "app.submenu.closedCaptions.languageLabel": "ភាសា",
-    "app.submenu.closedCaptions.localeOptionLabel": "ជ្រើសរើស​ភាសា",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "មិន​មាន​ភាសា",
-    "app.submenu.closedCaptions.fontFamilyLabel": "ពុម្ព​អក្សរ",
-    "app.submenu.closedCaptions.fontSizeLabel": "ទំហំ​អក្សរ",
-    "app.submenu.closedCaptions.backgroundColorLabel": "ពណ៌​ផ្ទៃ​ខាង​ក្រោយ",
-    "app.submenu.closedCaptions.fontColorLabel": "ពណ៌​អក្សរ​",
     "app.submenu.participants.muteAllLabel": "បិទ​សម្លេង​ទាំងអស់​លើក​លែង​តែ​អ្នក​ធ្វើ​បទ​បង្ហាញ",
+    "app.submenu.participants.lockAllLabel": "បិទអ្នកមើលទាំងអស់",
+    "app.submenu.participants.lockItemLabel": "អ្នកមើល {0}",
+    "app.submenu.participants.lockMicDesc": "បិទ​មីក្រូហ្វូន​សម្រាប់​អ្នកមើល​ដែល​បាន​បិទ​ទាំងអស់",
+    "app.submenu.participants.lockCamDesc": "បិទ​វេបខេម​សម្រាប់​អ្នកមើលដែល​បាន​បិទ​ទាំងអស់",
+    "app.submenu.participants.lockPublicChatDesc": "បិទ​ការ​ជជែក​សាធារណៈ​សម្រាប់​អ្នកមើលដែល​បាន​បិទ​ទាំងអស់",
+    "app.submenu.participants.lockPrivateChatDesc": "បិទ​ការ​ជជែក​ឯកជន​សម្រាប់​អ្នកមើល​ដែល​បាន​បិទ​ទាំងអស់",
+    "app.submenu.participants.lockLayoutDesc": "បិទ​ទម្រង់​សម្រាប់​អ្នកមើល​ដែល​បាន​បិទ​ទាំងអស់",
     "app.submenu.participants.lockMicAriaLabel": "ការ​បិទ​មីក្រូហ្វូន",
     "app.submenu.participants.lockCamAriaLabel": "ការ​បិទ​វេបខេម",
     "app.submenu.participants.lockPublicChatAriaLabel": "ការ​បិទ​ការ​ជជែក​សាធារណៈ",
@@ -114,6 +264,8 @@
     "app.submenu.participants.lockLayoutAriaLabel": "ការ​បិទ​ទម្រង់",
     "app.submenu.participants.lockMicLabel": "មីក្រូហ្វូន",
     "app.submenu.participants.lockCamLabel": "វេបខេម",
+    "app.submenu.participants.lockPublicChatLabel": "ជជែក​សាធារណៈ",
+    "app.submenu.participants.lockPrivateChatLabel": "ជជែក​ឯកជន",
     "app.submenu.participants.lockLayoutLabel": "ទម្រង់",
     "app.settings.applicationTab.label": "កម្មវិធី",
     "app.settings.audioTab.label": "សម្លេង",
@@ -124,13 +276,30 @@
     "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.actionsBar.actionsDropdown.actionsLabel": "សកម្មភាព",
     "app.actionsBar.actionsDropdown.presentationLabel": "ផ្ទុក​ឡើង​បទ​បង្ហាញ",
     "app.actionsBar.actionsDropdown.initPollLabel": "ចាប់ផ្តើម​ការ​ស្ទង់​មតិ",
     "app.actionsBar.actionsDropdown.desktopShareLabel": "ចែក​រំលែក​អេក្រង់​របស់​អ្នក",
+    "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.takePresenter": "យកអ្នកបង្ហាញ",
+    "app.actionsBar.actionsDropdown.takePresenterDesc": "ឲ្យខ្លួនឯងជាអ្នកបង្ហាញថ្មី",
+    "app.actionsBar.emojiMenu.statusTriggerLabel": "ដាក់ស្ថានភាព",
     "app.actionsBar.emojiMenu.awayLabel": "នៅ​ឆ្ងាយ",
     "app.actionsBar.emojiMenu.awayDesc": "ប្តូរ​ស្ថានភាព​របស់​អ្នក​ទៅ \\\"នៅឆ្ងាយ\\\"",
     "app.actionsBar.emojiMenu.raiseHandLabel": "លើកដៃ",
@@ -155,6 +324,7 @@
     "app.audioNotification.audioFailedError1001": "កំហុស 1001: WebSocket មិនបានភ្ជាប់",
     "app.audioNotification.audioFailedError1002": "កំហុស 1002: មិនអាចធ្វើការតភ្ជាប់ WebSocket បាន",
     "app.audioNotification.audioFailedError1003": "កំហុស 1003: កំណែកម្មវិធីរុករកមិនត្រូវបានគាំទ្រទេ",
+    "app.audioNotification.audioFailedError1004": "កំហុស 1004: បរាជ័យក្នុងការហៅ (មូលហេតុ={0})",
     "app.audioNotification.audioFailedError1005": "កំហុស 1005: ការហៅបានបញ្ចប់ដោយមិនបានរំពឹងទុក",
     "app.audioNotification.audioFailedError1006": "កំហុស 1006: ការហៅបានអស់ពេល",
     "app.audioNotification.audioFailedError1007": "កំហុស 1007: ការចរចា ICE បរាជ័យ",
@@ -162,10 +332,11 @@
     "app.audioNotification.audioFailedError1009": "កំហុស 1009: មិនអាចទៅយកពត៌មានរបស់ម៉ាស៊ីនបម្រើ STUN / TURN",
     "app.audioNotification.audioFailedError1010": "កំហុស 1010: អស់ពេលចរចា ICE",
     "app.audioNotification.audioFailedError1011": "កំហុស 1011: អស់ពេលប្រមូលផ្តុំ ICE",
+    "app.audioNotification.audioFailedError1012": "កំហុស 1012: ការភ្ជាប់ទៅកាន់ ICE ត្រូវបានបិទ",
     "app.audioNotification.audioFailedMessage": "ការ​តភ្ជាប់​សម្លេង​របស់​អ្នក​មិន​បាន​ជោគជ័យ",
+    "app.audioNotification.mediaFailedMessage": "getUserMicMedia មិន​បាន​ជោគជ័យ។ មាន​តែ​ប្រភព​ដើម​ដែល​មាន​សុវត្ថិភាព​ទេ​ទើប​ត្រូវ​បាន​អនុញ្ញាត។",
     "app.audioNotification.closeLabel": "បិទ",
     "app.breakoutJoinConfirmation.message": "តើ​អ្នក​ចង់​ចូល​រួម",
-    "app.breakoutJoinConfirmation.confirmLabel": "ចូលរួម",
     "app.breakoutJoinConfirmation.dismissLabel": "បោះបង់",
     "app.audioModal.microphoneLabel": "មីក្រូហ្វូន",
     "app.audioModal.audioChoiceLabel": "តើ​អ្នក​ចង់​ចូលរួម​ដោយ​ប្រើ​សម្លេង​របៀប​ណា?",
@@ -202,17 +373,29 @@
     "app.error.500": "អុញ! មាន​បញ្ហា​អ្វី​មួយ​ហើយ",
     "app.error.leaveLabel": "ចូល​ម្តង​ទៀត",
     "app.guest.waiting": "កំពុងរង់ចាំការយល់ព្រមដើម្បីចូលរួម",
+    "app.userList.guest.waitingUsers": "កំពុងចាំអ្នកប្រើ",
+    "app.userList.guest.waitingUsersTitle": "ការគ្រប់គ្រងអ្នកប្រើ",
+    "app.userList.guest.optionTitle": "ពិនិត្យអ្នកប្រើដែលនៅរង់ចាំ",
+    "app.userList.guest.pendingUsers": "អ្នករង់ចាំ {0} ",
+    "app.userList.guest.pendingGuestUsers": "អ្នករង់ចាំជាភ្ញៀវ {0} ",
+    "app.user-info.title": "ការរកមើលក្នុងបញ្ជីឈ្មោះ",
     "app.notification.recordingStart": "វគ្គនេះកំពុងត្រូវបានថតទុក",
     "app.notification.recordingStop": "វគ្គនេះមិនកំពុងត្រូវបានថតទុកទៀតទេ",
+    "app.shortcut-help.title": "ផ្លូវកាត់តាមក្តារចុច",
     "app.shortcut-help.closeLabel": "បិទ",
+    "app.lock-viewers.title": "បិទអ្នកមើល",
     "app.lock-viewers.webcamLabel": "វេបខេម",
     "app.lock-viewers.microphoneLable": "មីក្រូហ្វូន",
+    "app.lock-viewers.PublicChatLabel": "ជជែក​សាធារណៈ",
+    "app.lock-viewers.PrivateChatLable": "ជជែក​ឯកជន",
     "app.lock-viewers.Layout": "ទម្រង់",
     "app.videoPreview.cancelLabel": "បោះបង់",
     "app.videoPreview.closeLabel": "បិទ",
     "app.meeting.endNotification.ok.label": "យល់ព្រម",
+    "app.whiteboard.annotations.poll": "លទ្ធផលស្ទង់មតិត្រូវបានប្រកាស",
     "app.feedback.title": "អ្នកបានចាកចេញពីសន្និសិត",
     "app.createBreakoutRoom.joinAudio": "ប្រើ​សម្លេង",
+    "app.createBreakoutRoom.freeJoin": "អនុញ្ញាតឲ្យអ្នកប្រើជ្រើសបន្ទប់បំបែកដែលចង់ចូល",
     "app.externalVideo.close": "បិទ"
 
 }
diff --git a/bigbluebutton-html5/private/locales/pl_PL.json b/bigbluebutton-html5/private/locales/pl_PL.json
index 0c3959ffd13f323bcc3ef367c5bd349724969a91..e94bbf8a55d83c45239f974e6367f30a1deafc87 100644
--- a/bigbluebutton-html5/private/locales/pl_PL.json
+++ b/bigbluebutton-html5/private/locales/pl_PL.json
@@ -8,6 +8,7 @@
     "app.chat.dropdown.copy": "Kopiuj",
     "app.chat.dropdown.save": "Zapisz",
     "app.chat.label": "Czat",
+    "app.captions.menu.close": "Zamknij",
     "app.note.title": "Udostępnione notatki",
     "app.note.label": "Notatka",
     "app.note.hideNoteLabel": "Ukryj notatkÄ™",
diff --git a/bigbluebutton-html5/private/locales/pt.json b/bigbluebutton-html5/private/locales/pt.json
index e5d30d1c3bd93f2d38104aad3d0a76c99e4d41bd..9bca29aea39dbe29735c1fc9f0d806587d8b6887 100644
--- a/bigbluebutton-html5/private/locales/pt.json
+++ b/bigbluebutton-html5/private/locales/pt.json
@@ -1,5 +1,5 @@
 {
-    "app.home.greeting": "A sua apresentação vai iniciar em breve ...",
+    "app.home.greeting": "A sessão vai iniciar em breve ...",
     "app.chat.submitLabel": "Enviar mensagem",
     "app.chat.errorMinMessageLength": "Mensagem menor do que {0} caracter(es)",
     "app.chat.errorMaxMessageLength": "Mensagem maior do que {0} caracter(es)",
@@ -16,8 +16,23 @@
     "app.chat.dropdown.copy": "Copiar",
     "app.chat.dropdown.save": "Guardar",
     "app.chat.label": "Chat",
-    "app.chat.emptyLogLabel": "Registo do chat vazio",
+    "app.chat.offline": "Offline",
+    "app.chat.emptyLogLabel": "Registo do chat está vazio",
     "app.chat.clearPublicChatMessage": "O histórico do chat público foi apagado por um moderador",
+    "app.captions.label": "Legendas",
+    "app.captions.menu.close": "Fechar",
+    "app.captions.menu.start": "Iniciar",
+    "app.captions.menu.select": "Selecione um idioma disponível",
+    "app.captions.menu.title": "Menu das legendas",
+    "app.captions.menu.fontSize": "Tamanho",
+    "app.captions.menu.fontColor": "Cor do texto",
+    "app.captions.menu.fontFamily": "Tipo de letra",
+    "app.captions.menu.backgroundColor": "Cor de fundo",
+    "app.captions.menu.previewLabel": "Pré-visualizar",
+    "app.captions.menu.cancelLabel": "Cancelar",
+    "app.captions.pad.hide": "Esconder legendas",
+    "app.captions.pad.tip": "Prima Esc para barra voltar à barra de ferramentas do editor",
+    "app.captions.pad.ownership": "Assumir o controle",
     "app.note.title": "Notas Partilhadas",
     "app.note.label": "Nota",
     "app.note.hideNoteLabel": "Ocultar nota",
@@ -29,20 +44,21 @@
     "app.userList.participantsTitle": "Participantes",
     "app.userList.messagesTitle": "Mensagens",
     "app.userList.notesTitle": "Notas",
+    "app.userList.captionsTitle": "Legendas",
     "app.userList.presenter": "Apresentador",
-    "app.userList.you": "Você",
+    "app.userList.you": "Eu",
     "app.userList.locked": "Bloqueado",
     "app.userList.label": "Lista de utilizadores",
     "app.userList.toggleCompactView.label": "Alternar para o modo de exibição compacto",
     "app.userList.guest": "Convidado",
     "app.userList.menuTitleContext": "Opções disponíveis",
-    "app.userList.chatListItem.unreadSingular": "{0} Nova mensagem",
+    "app.userList.chatListItem.unreadSingular": "{0} Nova Mensagem",
     "app.userList.chatListItem.unreadPlural": "{0} Novas Mensagens",
     "app.userList.menu.chat.label": "Iniciar chat privado",
     "app.userList.menu.clearStatus.label": "Limpar estado",
     "app.userList.menu.removeUser.label": "Remover utilizador",
     "app.userList.menu.muteUserAudio.label": "Silenciar utilizador",
-    "app.userList.menu.unmuteUserAudio.label": "Desbloquear microfone do utilizador",
+    "app.userList.menu.unmuteUserAudio.label": "Ativar microfone do utilizador",
     "app.userList.userAriaLabel": "{0} {1} {2}  Estado {3}",
     "app.userList.menu.promoteUser.label": "Promover a moderador",
     "app.userList.menu.demoteUser.label": "Despromover a participante",
@@ -57,16 +73,16 @@
     "app.userList.userOptions.clearAllDesc": "Limpa o ícone de estado de todos os utilizadores",
     "app.userList.userOptions.muteAllExceptPresenterLabel": "Silenciar todos os utilizadores exceto o apresentador",
     "app.userList.userOptions.muteAllExceptPresenterDesc": "Silencia todos os utilizadores na sessão, exceto o apresentador",
-    "app.userList.userOptions.unmuteAllLabel": "Desligar o silêncio da sessão",
-    "app.userList.userOptions.unmuteAllDesc": "Anula o silêncio da sessão",
-    "app.userList.userOptions.lockViewersLabel": "Restringir participantes",
-    "app.userList.userOptions.lockViewersDesc": "Restringir acesso a algumas funcionalidades por participantes da sala",
-    "app.userList.userOptions.disableCam": "Webcams dos espetadores estão desativadas",
-    "app.userList.userOptions.disableMic": "Microfones dos espetadores estão desativados",
-    "app.userList.userOptions.disablePrivChat": "Chat privado está desativado",
-    "app.userList.userOptions.disablePubChat": "Chat público está desativado",
+    "app.userList.userOptions.unmuteAllLabel": "Desligar o modo silêncio da sessão",
+    "app.userList.userOptions.unmuteAllDesc": "Desliga o modo de silêncio da sessão",
+    "app.userList.userOptions.lockViewersLabel": "Bloquear participantes",
+    "app.userList.userOptions.lockViewersDesc": "Bloquear acesso a algumas funcionalidades aos participantes da sessão",
+    "app.userList.userOptions.disableCam": "As webcams dos espetadores estão desativadas",
+    "app.userList.userOptions.disableMic": "Os microfones dos espetadores estão desativados",
+    "app.userList.userOptions.disablePrivChat": "O chat privado está desativado",
+    "app.userList.userOptions.disablePubChat": "O chat público está desativado",
     "app.userList.userOptions.disableNote": "As notas partilhadas estão bloqueadas",
-    "app.userList.userOptions.webcamsOnlyForModerator": "Apenas moderadores podem ver as webcams dos participantes (devido às configurações de restrição)",
+    "app.userList.userOptions.webcamsOnlyForModerator": "Apenas moderadores podem ver as webcams dos participantes (devido às configurações de bloqueio)",
     "app.media.label": "Media",
     "app.media.screenshare.start": "A partilha do ecrã iniciou",
     "app.media.screenshare.end": "A partilha do ecrã terminou",
@@ -78,6 +94,7 @@
     "app.meeting.alertMeetingEndsUnderOneMinute": "Sessão vai terminar dentro de 1 minuto",
     "app.meeting.alertBreakoutEndsUnderOneMinute": "Sala de grupo vai terminar dentro de 1 minuto",
     "app.presentation.hide": "Ocultar a apresentação",
+    "app.presentation.notificationLabel": "Apresentação atual",
     "app.presentation.slideContent": "Conteúdo de slide",
     "app.presentation.startSlideContent": "Início do conteúdo de slide",
     "app.presentation.endSlideContent": "Fim do conteúdo de slide",
@@ -105,8 +122,7 @@
     "app.presentation.presentationToolbar.fitToPage": "Ajustar à página",
     "app.presentation.presentationToolbar.goToSlide": "Slide {0}",
     "app.presentationUploder.title": "Apresentação",
-    "app.presentationUploder.message": "Como apresentador, tem permissão para carregar qualquer documento do office ou um ficheiro PDF. Recomendamos um ficheiro PDF para melhores resultados.",
-    "app.presentationUploder.confirmLabel": "Carregar",
+    "app.presentationUploder.uploadLabel": "Carregar",
     "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",
@@ -117,7 +133,7 @@
     "app.presentationUploder.fileToUpload": "Para carregar ...",
     "app.presentationUploder.currentBadge": "Atual",
     "app.presentationUploder.genericError": "Ops, ocorreu um erro",
-    "app.presentationUploder.rejectedError": "Alguns dos ficheiros selecionados foram rejeitados. Por favor, verifique o tipo de ficheiro.",
+    "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. Foi atingido o limite de 200 páginas",
     "app.presentationUploder.conversion.conversionProcessingSlides": "A processar a página {0} de {1}",
@@ -131,7 +147,9 @@
     "app.presentationUploder.isNotDownloadableLabel": "Permitir que a apresentação seja descarregada",
     "app.presentationUploder.removePresentationLabel": "Eliminar apresentação",
     "app.presentationUploder.setAsCurrentPresentation": "Definir apresentação como atual",
+    "app.presentationUploder.tableHeading.filename": "Nome do ficheiro",
     "app.presentationUploder.tableHeading.options": "Opções",
+    "app.presentationUploder.tableHeading.status": "Estado",
     "app.poll.pollPaneTitle": "Sondagem",
     "app.poll.quickPollTitle": "Sondagem rápida",
     "app.poll.hidePollDesc": "Ocultar menu de sondagem",
@@ -146,7 +164,7 @@
     "app.poll.waitingLabel": "A aguardar respostas ({0}/{1}) ",
     "app.poll.ariaInputCount": "Opção de sondagem customizada {0} of {1} ",
     "app.poll.customPlaceholder": "Adicionar opção à sondagem",
-    "app.poll.noPresentationSelected": "Nenhuma apresentação foi selecionada! Por favor selecione uma.",
+    "app.poll.noPresentationSelected": "Não foi selecionada nenhuma apresentação! Por favor selecione uma.",
     "app.poll.clickHereToSelect": "Clique aqui para selecionar",
     "app.poll.t": "Verdadeiro",
     "app.poll.f": "Falso",
@@ -158,13 +176,22 @@
     "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": "Sim",
+    "app.poll.answer.no": "Não",
+    "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": "Utilizadores",
     "app.poll.liveResult.responsesTitle": "Respostas",
     "app.polling.pollingTitle": "Opções da sondagem",
     "app.polling.pollAnswerLabel": "Resposta à sondagem {0}",
     "app.polling.pollAnswerDesc": "Selecione esta opção para votar em {0}",
     "app.failedMessage": "Lamentamos mas estamos com problemas de ligação ao servidor",
-    "app.downloadPresentationButton.label": "Descarregue a apresentação original",
+    "app.downloadPresentationButton.label": "Descarregar a apresentação original",
     "app.connectingMessage": "A ligar ...",
     "app.waitingMessage": "Desligado. A tentar ligar novamente em {0} segundos ...\n",
     "app.navBar.settingsDropdown.optionsLabel": "Opções",
@@ -181,6 +208,7 @@
     "app.navBar.settingsDropdown.hotkeysLabel": "Atalhos do teclado",
     "app.navBar.settingsDropdown.hotkeysDesc": "Lista de atalhos de teclado disponíveis",
     "app.navBar.settingsDropdown.helpLabel": "Ajuda",
+    "app.navBar.settingsDropdown.helpDesc": "Links para tutoriais vídeo (abre num novo separador)",
     "app.navBar.settingsDropdown.endMeetingDesc": "Termina a sessão atual",
     "app.navBar.settingsDropdown.endMeetingLabel": "Terminar sessão",
     "app.navBar.userListToggleBtnLabel": "Alternar lista de utilizadores",
@@ -218,6 +246,7 @@
     "app.submenu.application.fontSizeControlLabel": "Tamanho da fonte",
     "app.submenu.application.increaseFontBtnLabel": "Aumentar o tamanho da fonte da aplicação",
     "app.submenu.application.decreaseFontBtnLabel": "Diminuir o tamanho da fonte da aplicação",
+    "app.submenu.application.currentSize": "de momento {0}",
     "app.submenu.application.languageLabel": "Idioma da aplicação",
     "app.submenu.application.ariaLanguageLabel": "Alterar idioma da aplicação",
     "app.submenu.application.languageOptionLabel": "Escolha o idioma",
@@ -231,18 +260,6 @@
     "app.submenu.video.videoQualityLabel": "Qualidade do vídeo",
     "app.submenu.video.qualityOptionLabel": "Escolha a qualidade do vídeo",
     "app.submenu.video.participantsCamLabel": "Visualizar webcams dos participantes",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "Legendas",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Assumir o controle",
-    "app.submenu.closedCaptions.languageLabel": "Idioma",
-    "app.submenu.closedCaptions.localeOptionLabel": "Escolha o idioma",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "Nenhum esquema de idioma ativo",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Tipo de letra",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "Escolha o tipo de letra",
-    "app.submenu.closedCaptions.fontSizeLabel": "Tamanho da fonte",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "Escolher tamanho da letra",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Cor de fundo",
-    "app.submenu.closedCaptions.fontColorLabel": "Cor da letra",
-    "app.submenu.closedCaptions.noLocaleSelected": "Idioma não selecionado",
     "app.submenu.participants.muteAllLabel": "Silenciar todos exceto o apresentador",
     "app.submenu.participants.lockAllLabel": "Bloquear todos os participantes",
     "app.submenu.participants.lockItemLabel": "Participantes {0}",
@@ -264,7 +281,6 @@
     "app.settings.applicationTab.label": "Aplicação",
     "app.settings.audioTab.label": "Áudio",
     "app.settings.videoTab.label": "Vídeo",
-    "app.settings.closedcaptionTab.label": "Legendas",
     "app.settings.usersTab.label": "Participantes",
     "app.settings.main.label": "Configurações",
     "app.settings.main.cancel.label": "Cancelar",
@@ -275,6 +291,7 @@
     "app.settings.dataSavingTab.webcam": "Permitir webcams",
     "app.settings.dataSavingTab.screenShare": "Permitir partilha de ecrã",
     "app.settings.dataSavingTab.description": "Para otimizar o volume de transferência de dados, ajuste o que está a ser exibido atualmente.",
+    "app.settings.save-notification.label": "As configurações foram guardadas",
     "app.switch.onLabel": "Ligar",
     "app.switch.offLabel": "Desligar",
     "app.actionsBar.actionsDropdown.actionsLabel": "Ações",
@@ -291,6 +308,8 @@
     "app.actionsBar.actionsDropdown.saveUserNames": "Guardar os nomes de utilizador",
     "app.actionsBar.actionsDropdown.createBreakoutRoom": "Criar salas de grupo",
     "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "Cria salas de grupo para dividir a sessão atual",
+    "app.actionsBar.actionsDropdown.captionsLabel": "Introduzir legenda",
+    "app.actionsBar.actionsDropdown.captionsDesc": "Alterna painel de legendas",
     "app.actionsBar.actionsDropdown.takePresenter": "Assumir apresentador",
     "app.actionsBar.actionsDropdown.takePresenterDesc": "Atribuir a si o papel de apresentador",
     "app.actionsBar.emojiMenu.statusTriggerLabel": "Definir estado",
@@ -315,6 +334,8 @@
     "app.actionsBar.emojiMenu.thumbsDownLabel": "Polegar para baixo",
     "app.actionsBar.emojiMenu.thumbsDownDesc": "Mudar o seu estado para polegar para baixo",
     "app.actionsBar.currentStatusDesc": "estado atual {0}",
+    "app.actionsBar.captions.start": "Iniciar visualização das legendas",
+    "app.actionsBar.captions.stop": "Terminar visualização das legendas",
     "app.audioNotification.audioFailedError1001": "Erro 1001: Ligação ao WebSocket terminada",
     "app.audioNotification.audioFailedError1002": "Erro 1002: Não foi possível estabelecer a ligação WebSocket",
     "app.audioNotification.audioFailedError1003": "Erro 1003: Versão do navegador não suportada",
@@ -333,7 +354,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "O microfone foi bloqueado para os participantes, vai entrar no modo ouvir apenas",
     "app.breakoutJoinConfirmation.title": "Entrar na sessão de grupo",
     "app.breakoutJoinConfirmation.message": "Pretende entrar",
-    "app.breakoutJoinConfirmation.confirmLabel": "Entrar",
     "app.breakoutJoinConfirmation.confirmDesc": "Entrar na sessão de grupo",
     "app.breakoutJoinConfirmation.dismissLabel": "Cancelar",
     "app.breakoutJoinConfirmation.dismissDesc": "Fecha e rejeita a entrada na sessão de grupo",
@@ -394,8 +414,13 @@
     "app.meeting.logout.ejectedFromMeeting": "Foi removido da sessão",
     "app.meeting.logout.validateTokenFailedEjectReason": "A validação do token de autorização falhou",
     "app.meeting.logout.userInactivityEjectReason": "Utilizador inativo por demasiado tempo",
+    "app.meeting-ended.rating.legendLabel": "Avaliação",
+    "app.meeting-ended.rating.starLabel": "Estrelas",
     "app.modal.close": "Fechar",
+    "app.modal.close.description": "Ignora alterações e fecha a janela modal",
     "app.modal.confirm": "Terminado",
+    "app.modal.newTab": "(abre novo separador)",
+    "app.modal.confirm.description": "Guarda as alterações e fecha a janela modal",
     "app.dropdown.close": "Fechar",
     "app.error.400": "400 Pedido incorreto",
     "app.error.401": "Não autorizado",
@@ -435,7 +460,7 @@
     "app.shortcut-help.closeDesc": "Fecha a modal de atalhos do teclado",
     "app.shortcut-help.openOptions": "Abrir Configurações",
     "app.shortcut-help.toggleUserList": "Alternar a lista de utilizadores",
-    "app.shortcut-help.toggleMute": "Silênciar/ Falar",
+    "app.shortcut-help.toggleMute": "Silênciar/ Ativar",
     "app.shortcut-help.togglePublicChat": "Alternar Chat Públioco (A lista de utilizadores deve estar aberta)",
     "app.shortcut-help.hidePrivateChat": "Esconder o chat privado",
     "app.shortcut-help.closePrivateChat": "Fechar o chat privado",
@@ -444,8 +469,8 @@
     "app.shortcut-help.togglePan": "Ativar a ferramenta Pan (apresentador)",
     "app.shortcut-help.nextSlideDesc": "Slide seguinte (apresentador)",
     "app.shortcut-help.previousSlideDesc": "Slide anterior (apresentador)",
-    "app.lock-viewers.title": "Restringir participantes",
-    "app.lock-viewers.description": "Estas opções permitem restringir as funcionalidades disponíveis para os participantes.   (Estas configurações não se aplicam aos moderadores.)",
+    "app.lock-viewers.title": "Bloquear participantes",
+    "app.lock-viewers.description": "Estas opções permitem bloquear as funcionalidades disponíveis para os participantes.   (Estas configurações não se aplicam aos moderadores.)",
     "app.lock-viewers.featuresLable": "Funcionalidade",
     "app.lock-viewers.lockStatusLabel": "Estado de bloqueio",
     "app.lock-viewers.webcamLabel": "Webcam",
@@ -545,7 +570,7 @@
     "app.whiteboard.toolbar.clear": "Limpar todas as anotações",
     "app.whiteboard.toolbar.multiUserOn": "Iniciar o modo multiutilizador",
     "app.whiteboard.toolbar.multiUserOff": "Terminar modo multiutilizador",
-    "app.whiteboard.toolbar.fontSize": "Lista de tamanhos de fonte",
+    "app.whiteboard.toolbar.fontSize": "Lista de tamanhos de letra",
     "app.feedback.title": "Saiu da sessão",
     "app.feedback.subtitle": "Gostaríamos de conhecer a sua opinião sobre a sua experiência com o BigBlueButton (opcional)",
     "app.feedback.textarea": "Como podemos melhorar o BigBlueButton?",
@@ -583,12 +608,15 @@
     "app.createBreakoutRoom.freeJoin": "Permitir que os utilizadores escolham uma sala de grupo para entrar",
     "app.createBreakoutRoom.leastOneWarnBreakout": "É necessário atribuir pelo menos um utilizador a uma sala de grupo",
     "app.createBreakoutRoom.modalDesc": "Siga os passos seguintes para criar salas de grupo na sessão",
+    "app.createBreakoutRoom.roomTime": "{0} minutos",
     "app.externalVideo.start": "Partilhar novo vídeo",
     "app.externalVideo.title": "Partilhar vídeo YouTube",
     "app.externalVideo.input": "URL do vídeo YouTube",
     "app.externalVideo.urlInput": "Adicionar vídeo YouTube ",
     "app.externalVideo.urlError": "O URL não é um vídeo YouTube válido",
     "app.externalVideo.close": "Fechar",
+    "app.network.connection.effective.slow": "Estão a ocorrer problemas na ligação",
+    "app.network.connection.effective.slow.help": "Como resolver?",
     "app.externalVideo.noteLabel": "Nota: Vídeos YouTube partilhados não aparecerão na gravação",
     "app.actionsBar.actionsDropdown.shareExternalVideo": "Partilhar vídeo YouTube",
     "app.actionsBar.actionsDropdown.stopShareExternalVideo": "Terminar partilha de vídeo YouTube",
diff --git a/bigbluebutton-html5/private/locales/pt_BR.json b/bigbluebutton-html5/private/locales/pt_BR.json
index cf954e7ec084e79201ee35d888745f743d967805..29c3335dc4024152df9bcfed9bd437bcd2023465 100644
--- a/bigbluebutton-html5/private/locales/pt_BR.json
+++ b/bigbluebutton-html5/private/locales/pt_BR.json
@@ -16,8 +16,15 @@
     "app.chat.dropdown.copy": "Copiar",
     "app.chat.dropdown.save": "Salvar",
     "app.chat.label": "Bate-papo",
+    "app.chat.offline": "Offline",
     "app.chat.emptyLogLabel": "Registro do bate-papo vazio",
     "app.chat.clearPublicChatMessage": "O histórico do bate-papo público foi apagado por um moderador",
+    "app.captions.menu.close": "Fechar",
+    "app.captions.menu.start": "Iniciar",
+    "app.captions.menu.backgroundColor": "Cor de fundo",
+    "app.captions.menu.cancelLabel": "Cancelar",
+    "app.captions.pad.tip": "Pressione Esc para focar na barra de ferramentas do editor",
+    "app.captions.pad.ownership": "Assumir o controle",
     "app.note.title": "Notas compartilhadas",
     "app.note.label": "Nota",
     "app.note.hideNoteLabel": "Ocultar nota",
@@ -106,8 +113,7 @@
     "app.presentation.presentationToolbar.fitToPage": "Ajustar à página",
     "app.presentation.presentationToolbar.goToSlide": "Slide {0}",
     "app.presentationUploder.title": "Apresentação",
-    "app.presentationUploder.message": "Como apresentador, você pode enviar qualquer documento do Office ou arquivo PDF. Para melhores resultados, recomendamos que se carregue arquivos em PDF.",
-    "app.presentationUploder.confirmLabel": "Enviar",
+    "app.presentationUploder.uploadLabel": "Enviar",
     "app.presentationUploder.confirmDesc": "Salvar as alterações e inicie a apresentação",
     "app.presentationUploder.dismissLabel": "Cancelar",
     "app.presentationUploder.dismissDesc": "Feche a janela e descarte as alterações",
@@ -118,7 +124,6 @@
     "app.presentationUploder.fileToUpload": "Carregar arquivo...",
     "app.presentationUploder.currentBadge": "Atual",
     "app.presentationUploder.genericError": "Ops, algo deu errado",
-    "app.presentationUploder.rejectedError": "Algum dos arquivos selecionados foi rejeitado. Por favor, verifique o tipo de arquivo.",
     "app.presentationUploder.upload.progress": "Carregando ({0}%)",
     "app.presentationUploder.upload.413": "O arquivo é muito grande, número máximo de 200 páginas foi atingido",
     "app.presentationUploder.conversion.conversionProcessingSlides": "Processando página {0} de {1}",
@@ -161,6 +166,15 @@
     "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": "Sim",
+    "app.poll.answer.no": "Não",
+    "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": "Usuários",
     "app.poll.liveResult.responsesTitle": "Respostas",
     "app.polling.pollingTitle": "Opções da enquete",
@@ -222,6 +236,7 @@
     "app.submenu.application.fontSizeControlLabel": "Tamanho da fonte",
     "app.submenu.application.increaseFontBtnLabel": "Aumentar o tamanho da fonte da aplicação",
     "app.submenu.application.decreaseFontBtnLabel": "Diminuir o tamanho da fonte da aplicação",
+    "app.submenu.application.currentSize": "atualmente {0}",
     "app.submenu.application.languageLabel": "Idioma da aplicação",
     "app.submenu.application.ariaLanguageLabel": "Alterar idioma da aplicação",
     "app.submenu.application.languageOptionLabel": "Escolha o idioma",
@@ -235,18 +250,6 @@
     "app.submenu.video.videoQualityLabel": "Qualidade do vídeo",
     "app.submenu.video.qualityOptionLabel": "Escolha a qualidade do vídeo",
     "app.submenu.video.participantsCamLabel": "Visualizando webcams dos participantes",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "Legendas",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Assumir o controle",
-    "app.submenu.closedCaptions.languageLabel": "Idioma",
-    "app.submenu.closedCaptions.localeOptionLabel": "Escolha o idioma",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "Nenhum esquema de idioma ativo",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Família da fonte",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "Selecionar família da fonte",
-    "app.submenu.closedCaptions.fontSizeLabel": "Tamanho da fonte",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "Escolha o tamanho da fonte",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Cor de fundo",
-    "app.submenu.closedCaptions.fontColorLabel": "Cor da fonte",
-    "app.submenu.closedCaptions.noLocaleSelected": "Idioma não selecionado",
     "app.submenu.participants.muteAllLabel": "Silenciar todos exceto o apresentador",
     "app.submenu.participants.lockAllLabel": "Restringir todos os participantes",
     "app.submenu.participants.lockItemLabel": "Participantes {0}",
@@ -268,7 +271,6 @@
     "app.settings.applicationTab.label": "Aplicação",
     "app.settings.audioTab.label": "Áudio",
     "app.settings.videoTab.label": "Vídeo",
-    "app.settings.closedcaptionTab.label": "Legendas",
     "app.settings.usersTab.label": "Participantes",
     "app.settings.main.label": "Configurações",
     "app.settings.main.cancel.label": "Cancelar",
@@ -338,7 +340,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "O microfone foi bloqueado para participantes, você está sendo conectado como ouvinte",
     "app.breakoutJoinConfirmation.title": "Entrar na sala de apoio",
     "app.breakoutJoinConfirmation.message": "Gostaria de participar",
-    "app.breakoutJoinConfirmation.confirmLabel": "Entrar",
     "app.breakoutJoinConfirmation.confirmDesc": "Entrar na sala de apoio",
     "app.breakoutJoinConfirmation.dismissLabel": "Cancelar",
     "app.breakoutJoinConfirmation.dismissDesc": "Fechar e rejeitar o convite a sala de apoio",
@@ -404,6 +405,7 @@
     "app.modal.close": "Fechar",
     "app.modal.close.description": "Descartar alterações e fechar janela",
     "app.modal.confirm": "Confirmar",
+    "app.modal.newTab": "(abre nova aba)",
     "app.modal.confirm.description": "Salvar alterações e fechar janela",
     "app.dropdown.close": "Fechar",
     "app.error.400": "400 Solicitação incorreta",
@@ -592,12 +594,15 @@
     "app.createBreakoutRoom.freeJoin": "Permitir que os usuários escolham uma sala de apoio para entrar",
     "app.createBreakoutRoom.leastOneWarnBreakout": "Você precisa atribuir pelo menos um usuário a uma sala de apoio",
     "app.createBreakoutRoom.modalDesc": "Complete os passos abaixo para criar salas de apoio na sessão",
+    "app.createBreakoutRoom.roomTime": "{0} minutos",
     "app.externalVideo.start": "Compartilhar vídeo",
     "app.externalVideo.title": "Compartilhar um vídeo do YouTube",
     "app.externalVideo.input": "URL do vídeo no YouTube",
     "app.externalVideo.urlInput": "Adicione uma URL do YouTube",
     "app.externalVideo.urlError": "Esta não é uma URL válida para um vídeo no YouTube",
     "app.externalVideo.close": "Fechar",
+    "app.network.connection.effective.slow": "Estamos percebendo problemas de conectividade.",
+    "app.network.connection.effective.slow.help": "Como corrigi-lo?",
     "app.externalVideo.noteLabel": "Nota: Vídeos compartilhados do YouTube não serão exibidos na gravação",
     "app.actionsBar.actionsDropdown.shareExternalVideo": "Compartilhar um vídeo do YouTube",
     "app.actionsBar.actionsDropdown.stopShareExternalVideo": "Parar de compartilhar o vídeo do Youtube",
diff --git a/bigbluebutton-html5/private/locales/ru_RU.json b/bigbluebutton-html5/private/locales/ru_RU.json
index ee67a9272a4ac3d550464c47e274fdbe978bd0b8..fdfd9c8a95422bdd7e608abd2fee194ee370f357 100644
--- a/bigbluebutton-html5/private/locales/ru_RU.json
+++ b/bigbluebutton-html5/private/locales/ru_RU.json
@@ -16,34 +16,90 @@
     "app.chat.dropdown.copy": "Копировать",
     "app.chat.dropdown.save": "Сохранить",
     "app.chat.label": "Чат",
+    "app.chat.offline": "Не в сети",
     "app.chat.emptyLogLabel": "Журнал чата пуст",
     "app.chat.clearPublicChatMessage": "Журнал общего чата был очищен модератором",
+    "app.captions.label": "Субтитры",
+    "app.captions.menu.close": "Закрыть",
+    "app.captions.menu.start": "Начать",
+    "app.captions.menu.select": "Выбрать доступный язык",
+    "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.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.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.unmuteAllDesc": "Снять блокировку микрофонов в конференции",
+    "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.webcamsOnlyForModerator": "Только модераторы могут видеть веб-камеры зрителей (из-за настроек блокировки)",
+    "app.userList.userOptions.enableCam": "Вэб-камеры зрителей включены",
+    "app.userList.userOptions.enableMic": "Микрофоны зрителей включены",
+    "app.userList.userOptions.enablePrivChat": "Приватный чат включен",
+    "app.userList.userOptions.enablePubChat": "Общий чат включен",
+    "app.userList.userOptions.enableNote": "Общие заметки теперь включены",
+    "app.userList.userOptions.enableOnlyModeratorWebcam": "Теперь вы можете включить вашу вэб-камеру, и все вас увидят",
     "app.media.label": "Медиа",
     "app.media.screenshare.start": "Демонстрация экрана началась",
     "app.media.screenshare.end": "Демонстрация экрана закончилась",
     "app.media.screenshare.safariNotSupported": "Демонстрация экрана на данный момент не поддерживается Safari. Пожалуйста, используйте Firefox или Google Chrome.",
     "app.meeting.ended": "Сеанс окончен",
+    "app.meeting.meetingTimeRemaining": "До окончания конференции осталось: {0}",
+    "app.meeting.meetingTimeHasEnded": "Время вышло. Конференция скоро закроется.",
     "app.meeting.endedMessage": "Вы будете перенаправлены назад на главный экран",
+    "app.meeting.alertMeetingEndsUnderOneMinute": "Конференция закроется через 1 минуту",
+    "app.presentation.hide": "Скрыть презентацию",
+    "app.presentation.notificationLabel": "Текущая презентация",
+    "app.presentation.emptySlideContent": "Текущий слайд не содержит никакой информации",
+    "app.presentation.presentationToolbar.selectLabel": "Выбрать слайд",
     "app.presentation.presentationToolbar.prevSlideLabel": "Предыдущий слайд",
     "app.presentation.presentationToolbar.prevSlideDesc": "Переключить презентацию на предыдущий слайд",
     "app.presentation.presentationToolbar.nextSlideLabel": "Следующий слайд",
@@ -56,26 +112,90 @@
     "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": "Как ведущий, вы можете загрузить любой офисный документ или файл PDF. Для лучшего результата, мы рекомендуем загружать PDF.\nПожалуйста убедитесь, что презентация выбрана с помощью круглого флажка  с правой стороны.",
+    "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.genericError": "Ой, что-то пошло не так",
+    "app.presentationUploder.rejectedError": "Загрузка выбранных файлов была отклонена. Пожалуйста проверьте тип файла (файлов)",
     "app.presentationUploder.upload.progress": "Загрузка ({0}%)",
+    "app.presentationUploder.upload.413": "Файл слишком большой, превышен лимит в 200 страниц",
     "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": "Ой, достигнут лимит количества страниц (200)",
+    "app.presentationUploder.conversion.timeout": "Ой, конвертация занимает слишком много времени...",
+    "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": "Пользовательский параметр опроса {0} из {1}",
+    "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.navBar.settingsDropdown.optionsLabel": "Опции",
     "app.navBar.settingsDropdown.fullscreenLabel": "Перейти в полноэкранный режим",
     "app.navBar.settingsDropdown.settingsLabel": "Открыть настройки",
@@ -87,32 +207,49 @@
     "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.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.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.fontSizeControlLabel": "Размер шрифта",
     "app.submenu.application.increaseFontBtnLabel": "Увеличить шрифт приложения",
     "app.submenu.application.decreaseFontBtnLabel": "Уменьшить шрифт приложения",
+    "app.submenu.application.currentSize": "текущее {0}",
     "app.submenu.application.languageLabel": "Язык приложения",
+    "app.submenu.application.ariaLanguageLabel": "Изменить язык приложения",
     "app.submenu.application.languageOptionLabel": "Выберите язык",
     "app.submenu.application.noLocaleOptionLabel": "Нет доступных переводов",
     "app.submenu.audio.micSourceLabel": "Источник микрофона",
@@ -121,17 +258,17 @@
     "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.closedCaptions.takeOwnershipLabel": "Перехватить",
-    "app.submenu.closedCaptions.languageLabel": "Язык",
-    "app.submenu.closedCaptions.localeOptionLabel": "Выберите язык",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "Нет доступных переводов",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Шрифт",
-    "app.submenu.closedCaptions.fontSizeLabel": "Размер шрифта",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Цвет фона",
-    "app.submenu.closedCaptions.fontColorLabel": "Цвет шрифта",
     "app.submenu.participants.muteAllLabel": "Выключить микрофоны у всех кроме ведущего",
+    "app.submenu.participants.lockAllLabel": "Заблокировать всех зрителей",
+    "app.submenu.participants.lockItemLabel": "Зрители {0}",
+    "app.submenu.participants.lockMicDesc": "Отключить микрофон у всех заблокированных зрителей",
+    "app.submenu.participants.lockCamDesc": "Отключить веб-камеру у всех заблокированных зрителей",
+    "app.submenu.participants.lockPublicChatDesc": "Отключить общий чат для всех заблокированных зрителей",
+    "app.submenu.participants.lockPrivateChatDesc": "Отключить приватный чат для всех заблокированных зрителей",
+    "app.submenu.participants.lockLayoutDesc": "Заблокировать расположение окон для всех заблокированных зрителей",
     "app.submenu.participants.lockMicAriaLabel": "Заблокировать микрофон",
     "app.submenu.participants.lockCamAriaLabel": "Заблокировать веб-камеру",
     "app.submenu.participants.lockPublicChatAriaLabel": "Заблокировать общий чат",
@@ -139,6 +276,8 @@
     "app.submenu.participants.lockLayoutAriaLabel": "Заблокировать расположение окон",
     "app.submenu.participants.lockMicLabel": "Микрофон",
     "app.submenu.participants.lockCamLabel": "Веб-камера",
+    "app.submenu.participants.lockPublicChatLabel": "Общий чат",
+    "app.submenu.participants.lockPrivateChatLabel": "Приватный чат",
     "app.submenu.participants.lockLayoutLabel": "Расположение окон",
     "app.settings.applicationTab.label": "Приложение",
     "app.settings.audioTab.label": "Аудио",
@@ -149,7 +288,11 @@
     "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.actionsBar.actionsDropdown.actionsLabel": "Действия",
@@ -161,6 +304,12 @@
     "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.takePresenterDesc": "Назначить себя новым ведущим",
+    "app.actionsBar.emojiMenu.statusTriggerLabel": "Установить статус",
     "app.actionsBar.emojiMenu.awayLabel": "Отошел",
     "app.actionsBar.emojiMenu.awayDesc": "Изменяет ваш статус на \\\"Отошел\\\"",
     "app.actionsBar.emojiMenu.raiseHandLabel": "Поднять руку",
@@ -182,9 +331,12 @@
     "app.actionsBar.emojiMenu.thumbsDownLabel": "Не нравится",
     "app.actionsBar.emojiMenu.thumbsDownDesc": "Изменяет ваш статус на \\\"Не нравится\\\"",
     "app.actionsBar.currentStatusDesc": "текущий статус {0}",
+    "app.actionsBar.captions.start": "Начать просмотр скрытых субтитров",
+    "app.actionsBar.captions.stop": "Прекратить просмотр скрытых субтитров",
     "app.audioNotification.audioFailedError1001": "Ошибка 1001: WebSocket отключен",
     "app.audioNotification.audioFailedError1002": "Ошибка 1002: Не удалось установить соединение WebSocket",
     "app.audioNotification.audioFailedError1003": "Ошибка 1003: Версия браузера не поддерживается",
+    "app.audioNotification.audioFailedError1004": "Ошибка 1004: Сбой вызова (reason={0})",
     "app.audioNotification.audioFailedError1005": "Ошибка 1005: Вызов внезапно прервался",
     "app.audioNotification.audioFailedError1006": "Ошибка 1006: Время вызова истекло",
     "app.audioNotification.audioFailedError1007": "Ошибка 1007: Согласование ICE не состоялось",
@@ -192,22 +344,30 @@
     "app.audioNotification.audioFailedError1009": "Ошибка 1009: не удалось получить информацию STUN/TURN сервера",
     "app.audioNotification.audioFailedError1010": "Ошибка 1010: Время согласования ICE истекло ",
     "app.audioNotification.audioFailedError1011": "Ошибка 1011: Превышено время сбора ICE",
+    "app.audioNotification.audioFailedError1012": "Ошибка 1012: соединение ICE закрыто",
     "app.audioNotification.audioFailedMessage": "Не удалось установить аудио-соединение",
+    "app.audioNotification.mediaFailedMessage": "Ошибка getUserMicMedia, разрешены только безопасные источники",
     "app.audioNotification.closeLabel": "Закрыть",
+    "app.audioNotificaion.reconnectingAsListenOnly": "Микрофон был заблокирован для зрителей, вы присоединились в режиме прослушивания",
+    "app.breakoutJoinConfirmation.title": "Присоединиться к комнате групповой работы",
     "app.breakoutJoinConfirmation.message": "Вы хотите присоединиться к ",
-    "app.breakoutJoinConfirmation.confirmLabel": "Присоединиться",
+    "app.breakoutJoinConfirmation.confirmDesc": "Присоединяет вас в комнату для групповой работы",
     "app.breakoutJoinConfirmation.dismissLabel": "Отмена",
+    "app.calculatingBreakoutTimeRemaining": "Подсчёт оставшегося времени...",
     "app.audioModal.microphoneLabel": "Микрофон",
     "app.audioModal.listenOnlyLabel": "Только слушать",
     "app.audioModal.audioChoiceLabel": "Как вы хотите войти в аудио-конференцию?",
+    "app.audioModal.iOSBrowser": "Аудио/Видео не поддерживается",
     "app.audioModal.iOSErrorDescription": "В настоящее время аудио и видео не поддерживаются в Chrome для iOS.",
     "app.audioModal.iOSErrorRecommendation": "Мы рекомендуем использовать Safari для 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.connecting": "Подключение",
@@ -241,19 +401,28 @@
     "app.error.500": "Упс, что-то пошло не так",
     "app.error.leaveLabel": "Зайдите снова",
     "app.guest.waiting": "Ожидание одобрения входа",
+    "app.user-info.title": "Поиск в каталоге",
     "app.toast.chat.public": "Новое сообщение в публичном чате",
     "app.toast.chat.private": "Новое сообщение в приватном чате",
     "app.toast.chat.system": "Система",
     "app.notification.recordingStart": "Этот сеанс записывается",
     "app.notification.recordingStop": "Этот сеанс больше не будет записан",
+    "app.shortcut-help.title": "Клавиши быстрого доступа",
     "app.shortcut-help.comboLabel": "Комбо",
     "app.shortcut-help.functionLabel": "Функция",
     "app.shortcut-help.closeLabel": "Закрыть",
     "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.lock-viewers.webcamLabel": "Веб-камера",
     "app.lock-viewers.microphoneLable": "Микрофон",
+    "app.lock-viewers.PublicChatLabel": "Общий чат",
+    "app.lock-viewers.PrivateChatLable": "Приватный чат",
     "app.lock-viewers.Layout": "Расположение окон",
     "app.videoPreview.cancelLabel": "Отмена",
     "app.videoPreview.closeLabel": "Закрыть",
diff --git a/bigbluebutton-html5/private/locales/tr_TR.json b/bigbluebutton-html5/private/locales/tr_TR.json
index 399b86787be523a3ab6e62e5572e92007a65e04c..341e94020589948be514ba600eb7e3564c01c431 100644
--- a/bigbluebutton-html5/private/locales/tr_TR.json
+++ b/bigbluebutton-html5/private/locales/tr_TR.json
@@ -17,6 +17,11 @@
     "app.chat.label": "Sohbet",
     "app.chat.emptyLogLabel": "Sohbet sistem kayıtları boş",
     "app.chat.clearPublicChatMessage": "Genel sohbet geçmişi moderatör tarafından temizlendi",
+    "app.captions.menu.close": "Kapat",
+    "app.captions.menu.start": "BaÅŸlat",
+    "app.captions.menu.backgroundColor": "Arkalan rengi",
+    "app.captions.menu.cancelLabel": "Vazgeç",
+    "app.captions.pad.ownership": "Sahiplik al",
     "app.userList.usersTitle": "Kullanıcılar",
     "app.userList.participantsTitle": "Katılımcılar",
     "app.userList.messagesTitle": "Mesajlar",
@@ -66,6 +71,8 @@
     "app.poll.closeLabel": "Kapat",
     "app.poll.y": "Evet",
     "app.poll.n": "Hayır",
+    "app.poll.answer.yes": "Evet",
+    "app.poll.answer.no": "Hayır",
     "app.poll.liveResult.usersTitle": "Kullanıcılar",
     "app.polling.pollAnswerLabel": "{0} Oylamasını cevapla",
     "app.polling.pollAnswerDesc": "{0} Oylaması için bu seçeneği seç",
@@ -117,14 +124,6 @@
     "app.submenu.video.videoOptionLabel": "Görüntü kaynağını seç",
     "app.submenu.video.qualityOptionLabel": "Video kalitesini seç",
     "app.submenu.video.participantsCamLabel": "Katılımcıların web kameraları görüntüleniyor",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Sahiplik al",
-    "app.submenu.closedCaptions.languageLabel": "Dil",
-    "app.submenu.closedCaptions.localeOptionLabel": "Dil seçin",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "Aktif yerel ayar bulunamadı",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Yazı tipi",
-    "app.submenu.closedCaptions.fontSizeLabel": "Yazı büyüklüğü",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Arkalan rengi",
-    "app.submenu.closedCaptions.fontColorLabel": "Yazı rengi",
     "app.submenu.participants.muteAllLabel": "Sunucu hariç tümünü sustur",
     "app.submenu.participants.lockMicAriaLabel": "Mikrofon kilidi",
     "app.submenu.participants.lockCamAriaLabel": "Web kamera kilidi",
@@ -189,7 +188,6 @@
     "app.audioNotification.audioFailedMessage": "Ses bağlantınız sağlanamadı",
     "app.audioNotification.closeLabel": "Kapat",
     "app.breakoutJoinConfirmation.message": "Katılmak istiyor musunuz?",
-    "app.breakoutJoinConfirmation.confirmLabel": "Katıl",
     "app.breakoutJoinConfirmation.dismissLabel": "Vazgeç",
     "app.audioModal.microphoneLabel": "Mikrofon",
     "app.audioModal.audioChoiceLabel": "Sesli katılımınızı nasıl yapmak istersiniz?",
diff --git a/bigbluebutton-html5/private/locales/uk_UA.json b/bigbluebutton-html5/private/locales/uk_UA.json
index 533610ef45e2688504d48efd8c474fe5759ad57d..5362e87eae5912f4ed020e26e58f389e8b4f8a8c 100644
--- a/bigbluebutton-html5/private/locales/uk_UA.json
+++ b/bigbluebutton-html5/private/locales/uk_UA.json
@@ -16,11 +16,28 @@
     "app.chat.dropdown.copy": "Скопіювати",
     "app.chat.dropdown.save": "Зберегти",
     "app.chat.label": "Чат",
+    "app.chat.offline": "Не в мережі",
     "app.chat.emptyLogLabel": "Журнал чату порожній",
     "app.chat.clearPublicChatMessage": "Історія публічного чату була очищена модератором",
+    "app.captions.menu.close": "Закрити",
+    "app.captions.menu.start": "Почати",
+    "app.captions.menu.select": "Виберіть доступну мову",
+    "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.note.title": "Спільні примітки",
     "app.note.label": "Примітки",
     "app.note.hideNoteLabel": "Сховати примітки",
+    "app.user.activityCheck": "Перевірка активності користувача",
+    "app.user.activityCheck.label": "Перевірте, чи знаходиться користувач у зустрiчi ({0})",
+    "app.user.activityCheck.check": "Перевірка",
+    "app.note.tipLabel": "Натисніть Esc, щоб сфокусувати панель інструментів редактора",
     "app.userList.usersTitle": "Користувачі",
     "app.userList.participantsTitle": "Учасники",
     "app.userList.messagesTitle": "Повідомлення",
@@ -34,6 +51,7 @@
     "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": "Вимкнути мікрофон користувача",
@@ -55,6 +73,18 @@
     "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.webcamsOnlyForModerator": "Веб-камери глядачів можуть бачити лише модератори (через налаштування блокування)",
+    "app.userList.userOptions.enableCam": "Веб-камери глядачів увімкнено",
+    "app.userList.userOptions.enableMic": "Мікрофони глядачів увімкнено",
+    "app.userList.userOptions.enablePrivChat": "Приватний чат увімкнено",
+    "app.userList.userOptions.enablePubChat": "Загальнодоступний чат увімкнено",
+    "app.userList.userOptions.enableNote": "Спільні нотатки тепер увімкнено",
+    "app.userList.userOptions.enableOnlyModeratorWebcam": "Тепер можна активувати веб-камеру, всі бачитимуть вас",
     "app.media.label": "Медіа",
     "app.media.screenshare.start": "Демонстрація екрану розпочалася",
     "app.media.screenshare.end": "Демонстрацію екрану закінчено",
@@ -65,10 +95,13 @@
     "app.meeting.endedMessage": "Ви будете перенаправлені на головний екран",
     "app.meeting.alertMeetingEndsUnderOneMinute": "Зустріч закінчується через хвилину.",
     "app.meeting.alertBreakoutEndsUnderOneMinute": "Зустріч закінчується через хвилину.",
+    "app.presentation.hide": "Приховати презентацію",
+    "app.presentation.notificationLabel": "Поточна презентація",
     "app.presentation.slideContent": "Вміст слайду",
     "app.presentation.startSlideContent": "Початок вмісту слайду",
     "app.presentation.endSlideContent": "Кінець вмісту слайду",
     "app.presentation.emptySlideContent": "Даний слайд порожній",
+    "app.presentation.presentationToolbar.selectLabel": "Вибрати слайд",
     "app.presentation.presentationToolbar.prevSlideLabel": "Попередній слайд",
     "app.presentation.presentationToolbar.prevSlideDesc": "Перемкнути презентацію на попередній слайд",
     "app.presentation.presentationToolbar.nextSlideLabel": "Наступний слайд",
@@ -90,6 +123,9 @@
     "app.presentation.presentationToolbar.fitToWidth": "Підігнати по ширині",
     "app.presentation.presentationToolbar.goToSlide": "Слайд {0}",
     "app.presentationUploder.title": "Презентація",
+    "app.presentationUploder.message": "Як ведучий ви маєте можливість завантажувати будь-який офісний документ або PDF-файл. Для найкращих результатів ми рекомендуємо PDF-файл. Переконайтеся, що вибрано презентацію за допомогою прапорця праворуч.",
+    "app.presentationUploder.uploadLabel": "Завантажити",
+    "app.presentationUploder.confirmLabel": "Підтвердити",
     "app.presentationUploder.confirmDesc": "Зберегти зміни та розпочати презентацію",
     "app.presentationUploder.dismissLabel": "Відмінити",
     "app.presentationUploder.dismissDesc": "Закрити вікно зображення та скасувати зміни",
@@ -100,20 +136,25 @@
     "app.presentationUploder.fileToUpload": "Буде завантажено ...",
     "app.presentationUploder.currentBadge": "Поточний",
     "app.presentationUploder.genericError": "Ой, щось пішло не так",
-    "app.presentationUploder.rejectedError": "Деякі з обраних файлів було відкинуто. Будь ласка, перевірте mime-типи файлів.",
+    "app.presentationUploder.rejectedError": "Вибрані файл(и) відхилено. Перевірте тип файлу(iв).",
     "app.presentationUploder.upload.progress": "Завантаження ({0}%)",
+    "app.presentationUploder.upload.413": "Файл завеликий, не більше 200 сторінок",
     "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": "Ой, кількість сторінок перевищила ліміт у 200 сторінок",
     "app.presentationUploder.conversion.timeout": "Ой, перетворення займає надто багато часу",
     "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": "Оберіть опцію нижче, щоб почати опитування.",
@@ -123,7 +164,13 @@
     "app.poll.publishLabel": "Опублікувати результати опитування",
     "app.poll.backLabel": "Назад до параметрів опитування",
     "app.poll.closeLabel": "Закрити",
+    "app.poll.waitingLabel": "Очікування на відповіді ({0} / {1})",
+    "app.poll.ariaInputCount": "Опція спеціального опитування {0} з {1}",
     "app.poll.customPlaceholder": "Додати варіант опитування",
+    "app.poll.noPresentationSelected": "Не вибрано жодної презентації! Виберіть одну.",
+    "app.poll.clickHereToSelect": "Натисніть тут, щоб вибрати",
+    "app.poll.t": "Вірно",
+    "app.poll.f": "Хибно",
     "app.poll.tf": "Правда / Неправда",
     "app.poll.y": "Так",
     "app.poll.n": "Ні",
@@ -132,6 +179,15 @@
     "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": "А",
+    "app.poll.answer.b": "Б",
+    "app.poll.answer.c": "Ð’",
+    "app.poll.answer.d": "Г",
+    "app.poll.answer.e": "Ґ",
     "app.poll.liveResult.usersTitle": "Користувачі",
     "app.poll.liveResult.responsesTitle": "Відповідь",
     "app.polling.pollingTitle": "Опитування: оберіть варіант",
@@ -152,7 +208,10 @@
     "app.navBar.settingsDropdown.aboutDesc": "Показати інформацію про клієнта",
     "app.navBar.settingsDropdown.leaveSessionDesc": "Залишити конференцію",
     "app.navBar.settingsDropdown.exitFullscreenDesc": "Вийти з повноекранного режиму",
+    "app.navBar.settingsDropdown.hotkeysLabel": "Гарячі клавіши",
+    "app.navBar.settingsDropdown.hotkeysDesc": "Перепис доступних гарячих клавiш",
     "app.navBar.settingsDropdown.helpLabel": "Допомога",
+    "app.navBar.settingsDropdown.helpDesc": "Перенаправляє користувача з відеоуроками (відкривається нова вкладка)",
     "app.navBar.settingsDropdown.endMeetingDesc": "Завершити зустріч",
     "app.navBar.settingsDropdown.endMeetingLabel": "Завершити зустріч",
     "app.navBar.userListToggleBtnLabel": "Увімкнути/вимкнути список користувачів",
@@ -190,6 +249,7 @@
     "app.submenu.application.fontSizeControlLabel": "Розмір шрифту",
     "app.submenu.application.increaseFontBtnLabel": "Збільшити шрифт застосунку",
     "app.submenu.application.decreaseFontBtnLabel": "Зменшити шрифт застосунку",
+    "app.submenu.application.currentSize": "зараз {0}",
     "app.submenu.application.languageLabel": "Мова застосунку",
     "app.submenu.application.ariaLanguageLabel": "Змінити мову застосунку",
     "app.submenu.application.languageOptionLabel": "Вибрати мову",
@@ -203,18 +263,6 @@
     "app.submenu.video.videoQualityLabel": "Якість відео",
     "app.submenu.video.qualityOptionLabel": "Виберіть якість відео",
     "app.submenu.video.participantsCamLabel": "Перегляд веб-камер учасників",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "Субтитри",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "Перехопити",
-    "app.submenu.closedCaptions.languageLabel": "Мова",
-    "app.submenu.closedCaptions.localeOptionLabel": "Виберіть мову",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "Відсутні доступні переклади",
-    "app.submenu.closedCaptions.fontFamilyLabel": "Шрифт",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "Виберіть шрифт",
-    "app.submenu.closedCaptions.fontSizeLabel": "Розмір шрифту",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "Виберіть розмір шрифту",
-    "app.submenu.closedCaptions.backgroundColorLabel": "Колір фону",
-    "app.submenu.closedCaptions.fontColorLabel": "Колір шрифта",
-    "app.submenu.closedCaptions.noLocaleSelected": "Мову не вибрано",
     "app.submenu.participants.muteAllLabel": "Вимкнути мікрофони у всіх окрім ведучого",
     "app.submenu.participants.lockAllLabel": "Заблокувати всіх учасників",
     "app.submenu.participants.lockItemLabel": "Учасники {0}",
@@ -236,7 +284,6 @@
     "app.settings.applicationTab.label": "Застосунок",
     "app.settings.audioTab.label": "Аудіо",
     "app.settings.videoTab.label": "Відео",
-    "app.settings.closedcaptionTab.label": "Субтитри",
     "app.settings.usersTab.label": "Учасники",
     "app.settings.main.label": "Налаштування",
     "app.settings.main.cancel.label": "Відмінити",
@@ -247,6 +294,7 @@
     "app.settings.dataSavingTab.webcam": "Увімкнути веб-камери",
     "app.settings.dataSavingTab.screenShare": "Увімкнути демонстрацію робочого столу",
     "app.settings.dataSavingTab.description": "Щоб зберегти пропускну здатність, виберіть що зараз буде відображатись.",
+    "app.settings.save-notification.label": "Налаштування збережено",
     "app.switch.onLabel": "УВІМК.",
     "app.switch.offLabel": "ВИМК.",
     "app.actionsBar.actionsDropdown.actionsLabel": "Дії",
@@ -260,8 +308,10 @@
     "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.takePresenter": "Стати презентатором",
     "app.actionsBar.actionsDropdown.takePresenterDesc": "Встановити себе ведучим/презентером",
     "app.actionsBar.emojiMenu.statusTriggerLabel": "Задати статус",
     "app.actionsBar.emojiMenu.awayLabel": "Відійшов",
@@ -285,6 +335,8 @@
     "app.actionsBar.emojiMenu.thumbsDownLabel": "Не подобається",
     "app.actionsBar.emojiMenu.thumbsDownDesc": "Змінює ваш статус на \\\"Не подобається\\\"",
     "app.actionsBar.currentStatusDesc": "нинішній статус {0}",
+    "app.actionsBar.captions.start": "Почати перегляд субтитрів",
+    "app.actionsBar.captions.stop": "Зупинити перегляд субтитрів",
     "app.audioNotification.audioFailedError1001": "Помилка 1001: WebSocket відключено",
     "app.audioNotification.audioFailedError1002": "Помилка 1002: Не вдалось встановити з'єднання WebSocket",
     "app.audioNotification.audioFailedError1003": "Помилка 1003: Версія браузера не підтримується",
@@ -303,7 +355,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "Аудіо було заблоковано модератором, ви підключилися лише як слухач",
     "app.breakoutJoinConfirmation.title": "Приєднатись до зустрічі",
     "app.breakoutJoinConfirmation.message": "Чи хочете ви приєднатися до",
-    "app.breakoutJoinConfirmation.confirmLabel": "Приєднатися",
     "app.breakoutJoinConfirmation.confirmDesc": "Приєднує вас до зустрічі",
     "app.breakoutJoinConfirmation.dismissLabel": "Скасувати",
     "app.breakoutJoinConfirmation.dismissDesc": "Закриває та відмовляє в приєднанні до зустрічі",
@@ -318,6 +369,7 @@
     "app.audioModal.iOSErrorDescription": "Наразі аудіо та відео в Chrome для iOS не підтримуються.",
     "app.audioModal.iOSErrorRecommendation": "Ми рекомендуємо використовувати Safari для iOS.",
     "app.audioModal.audioChoiceDesc": "Виберіть як брати участь в аудіоконференції",
+    "app.audioModal.unsupportedBrowserLabel": "Схоже, ви використовуєте браузер, який повністю не підтримується. Для повної підтримки використовуйте {0} або {1}.",
     "app.audioModal.closeLabel": "Закрити",
     "app.audioModal.yes": "Так",
     "app.audioModal.no": "Ні",
@@ -327,6 +379,8 @@
     "app.audioModal.settingsTitle": "Змінити налаштування аудіо",
     "app.audioModal.helpTitle": "З'явилися проблеми з вашими аудіоприладами",
     "app.audioModal.helpText": "Чи надали ви BigBlueButton дозвіл на доступ до мікрофона? Зверніть увагу що коли ви намагаєтеся приєднатися до аудіоконференції має з'явитися діалогове вікно запитуючи дозволи на підключення медіа-пристрою, будь ласка, прийміть це, щоб приєднатися до аудіоконференції. Якщо цього не відбулося спробуйте змінити дозволи мікрофона у налаштуваннях вашого веб-переглядача.",
+    "app.audioModal.audioDialTitle": "Приєднатися за допомогою телефону",
+    "app.audioDial.audioDialConfrenceText": "і введіть PIN-код конференції:",
     "app.audioModal.connecting": "Підключення",
     "app.audioModal.connectingEchoTest": "Підключення до ехо тесту",
     "app.audioManager.joinedAudio": "Ви приєдналися до аудіоконференції",
@@ -354,15 +408,30 @@
     "app.audio.permissionsOverlay.hint": "Нам потрібно, щоб ви дозволили нам використовувати свої медіа-пристрої, щоб приєднатись до голосової конференції :)",
     "app.error.removed": "Ви були вилучені з конференції",
     "app.error.meeting.ended": "Ви вийшли з конференції",
+    "app.meeting.logout.duplicateUserEjectReason": "Дубльований користувач намагається приєднатися до зустрічі",
+    "app.meeting.logout.permissionEjectReason": "Вилучено через порушення дозволу",
+    "app.meeting.logout.ejectedFromMeeting": "Ви були вилучені з зустрiчi",
+    "app.meeting.logout.validateTokenFailedEjectReason": "Не вдалося перевірити токен авторизації",
+    "app.meeting.logout.userInactivityEjectReason": "Користувач неактивний занадто довго",
+    "app.meeting-ended.rating.legendLabel": "Рейтинг відгуків",
     "app.modal.close": "Закрити",
     "app.modal.confirm": "Готово",
+    "app.modal.newTab": "(відкриває нову вкладку)",
     "app.dropdown.close": "Закрити",
     "app.error.400": "Поганий запит",
     "app.error.401": "Неавторизований",
+    "app.error.403": "Ви були вилучені з зустрiчi",
     "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.toast.breakoutRoomEnded": "Конференція закінчилася. Будь ласка, приєднайтесь знову до аудіо конференції.",
     "app.toast.chat.public": "Нове повідомлення у публічному чаті",
     "app.toast.chat.private": "Нове повідомлення у приватному чаті",
@@ -370,6 +439,7 @@
     "app.notification.recordingStart": "Цей сеанс наразі записується",
     "app.notification.recordingStop": "Цей сеанс більше не записується",
     "app.notification.recordingAriaLabel": "Записано часу ",
+    "app.shortcut-help.title": "Гарячі клавіши",
     "app.shortcut-help.accessKeyNotAvailable": "Клавіші швидкого доступу недоступні.",
     "app.shortcut-help.comboLabel": "Комбо",
     "app.shortcut-help.functionLabel": "Функція",
diff --git a/bigbluebutton-html5/private/locales/vi_VN.json b/bigbluebutton-html5/private/locales/vi_VN.json
index 16ab98ba11159f33e7708ac5fe6ec2a15a97bcd2..fd7a8cbd89d813f8aa1253d927778e23e15dac89 100644
--- a/bigbluebutton-html5/private/locales/vi_VN.json
+++ b/bigbluebutton-html5/private/locales/vi_VN.json
@@ -1,25 +1,34 @@
 {
-    "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 ít phút ...",
     "app.chat.submitLabel": "Gửi tin nhắn",
-    "app.chat.errorMinMessageLength": "Thông báo là {0} kí tự quá ngắn",
-    "app.chat.errorMaxMessageLength": "Thông báo là{0} kí tự quá dài",
-    "app.chat.inputLabel": "Tin nhắn nhập vào cuộc trò chuyện{0}",
+    "app.chat.errorMinMessageLength": "Thông báo {0} kí tự(s) quá ngắn",
+    "app.chat.errorMaxMessageLength": "Thông báo {0} kí tự(s) quá dài",
+    "app.chat.inputLabel": "Tin nhắn nhập vào cuộc trò chuyện {0}",
     "app.chat.inputPlaceholder": "Thông báo {0}",
-    "app.chat.titlePublic": "Cuộc trò chuyện công khai",
-    "app.chat.titlePrivate": "Trò chuyện riêng tư với {0}",
+    "app.chat.titlePublic": "Thảo luận chung",
+    "app.chat.titlePrivate": "Chat riêng tư với {0}",
+    "app.chat.partnerDisconnected": "{0} đã rời cuộc họp",
     "app.chat.closeChatLabel": "Đóng {0}",
     "app.chat.hideChatLabel": "Ẩn {0}",
+    "app.chat.moreMessages": "Xem nhiều tin nhắn hơn bên dưới",
     "app.chat.dropdown.options": "Tùy chọn trò chuyện",
     "app.chat.dropdown.clear": "Xóa",
     "app.chat.dropdown.copy": "Sao chép",
     "app.chat.dropdown.save": "LÆ°u",
-    "app.chat.label": "Trò chuyện",
-    "app.chat.emptyLogLabel": "Nhật kí trò chuyện trống",
+    "app.chat.label": "Chat",
+    "app.chat.offline": "Ngoại tuyến",
+    "app.chat.emptyLogLabel": "Nhật kí chat trống",
     "app.chat.clearPublicChatMessage": "Lịch sử trò chuyện công khai được xóa bởi người quản lí",
-    "app.note.title": "Chia sẻ ghi chú",
+    "app.captions.menu.close": "Đóng",
+    "app.captions.menu.backgroundColor": "Màu nền",
+    "app.captions.menu.cancelLabel": "Hủy",
+    "app.captions.pad.tip": "Nhấn ESC dể chuyển ra thanh công cụ",
+    "app.captions.pad.ownership": "Chiếm quyền quản lý",
+    "app.note.title": "Shared Notes",
     "app.note.label": "Ghi chú",
     "app.note.hideNoteLabel": "Ẩn ghi chú",
-    "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": "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.check": "Kiểm tra",
     "app.note.tipLabel": "Nhấn ESC dể chuyển ra thanh công cụ",
     "app.userList.usersTitle": "Người dùng",
@@ -38,38 +47,567 @@
     "app.userList.menu.chat.label": "Bắt đầu cuộc trò chuyện riêng tư ",
     "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": "Chặn người dùng",
-    "app.userList.menu.unmuteUserAudio.label": "Bỏ chặn 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.userAriaLabel": "{0}{1}{2} Trạng thái {3}",
-    "app.userList.menu.promoteUser.label": "Đề xuất tới người quản trị",
-    "app.userList.menu.demoteUser.label": "Giảm lượt xem",
+    "app.userList.menu.promoteUser.label": "Cấp quyền làm 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}",
     "app.userList.menu.directoryLookup.label": "Tra cứu thư mục",
-    "app.userList.menu.makePresenter.label": "Tạo người thuyết trình ",
+    "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": "Chặn tất cả người dùng",
-    "app.userList.userOptions.muteAllDesc": "Chặn tất cả người dùng trong cuộc hội thoại",
+    "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.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": "Chặn tất cả người dùng ngoại trừ người trình bày",
-    "app.userList.userOptions.muteAllExceptPresenterDesc": "Chặn tất cả người dùng trong cuộc hội thoại ngoại trừ người trình bày",
-    "app.userList.userOptions.unmuteAllLabel": "Tắt chặn hội thoại",
-    "app.userList.userOptions.unmuteAllDesc": "Bỏ chặn hội thoại",
+    "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.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.disableNote": "Chia sẻ ghi chú đã khóa ",
+    "app.userList.userOptions.disableNote": "Shared notes đã khóa ",
     "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.media.label": "Truyền thông",
+    "app.media.label": "Media",
+    "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.safariNotSupported": "Chia sẻ màn hình không được hỗ trợ bởi Safari. Vui lòng dùng FireFox hoặc Google Chrome",
+    "app.meeting.ended": "Phiên hoạt động đã 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.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",
+    "app.presentation.endSlideContent": "Nội dung slide  kết thúc",
+    "app.presentation.emptySlideContent": "Slide hiện tại không có nội dung",
+    "app.presentation.presentationToolbar.selectLabel": "Chọn slide",
+    "app.presentation.presentationToolbar.prevSlideLabel": "Slide trÆ°á»›c",
+    "app.presentation.presentationToolbar.prevSlideDesc": "Thay đổi phần trình bày cho slide trước",
+    "app.presentation.presentationToolbar.nextSlideLabel": "Slide kế tiếp",
+    "app.presentation.presentationToolbar.nextSlideDesc": "Thay đổi phần trình bày cho slide kết tiếp",
+    "app.presentation.presentationToolbar.skipSlideLabel": "Bỏ qua slide",
+    "app.presentation.presentationToolbar.skipSlideDesc": "Thay dổi phần trình bày cho slide cụ thể",
+    "app.presentation.presentationToolbar.fitWidthLabel": "Khớp với bề ngang màn hình",
+    "app.presentation.presentationToolbar.fitWidthDesc": "Hiển thị toàn bề ngang của slide",
+    "app.presentation.presentationToolbar.fitScreenLabel": "Khớp với toàn bộ màn hình",
+    "app.presentation.presentationToolbar.fitScreenDesc": "Hiển thị toàn bộ slide được chọn",
+    "app.presentation.presentationToolbar.zoomLabel": "Phóng to",
+    "app.presentation.presentationToolbar.zoomDesc": "Thay dổi mức độ thu phóng của phần hiển thị",
+    "app.presentation.presentationToolbar.zoomInLabel": "Phóng to",
+    "app.presentation.presentationToolbar.zoomInDesc": "Phóng to phần trình bày",
+    "app.presentation.presentationToolbar.zoomOutLabel": "Thu nhỏ",
+    "app.presentation.presentationToolbar.zoomOutDesc": "Thu nhỏ phần trình bày",
+    "app.presentation.presentationToolbar.zoomReset": "Reset thu phóng",
+    "app.presentation.presentationToolbar.zoomIndicator": "Tỷ lệ thu phóng hiện tại",
+    "app.presentation.presentationToolbar.fitToWidth": "Khớp với bề ngang màn hình",
+    "app.presentation.presentationToolbar.fitToPage": "Khớp với toàn bộ trang",
+    "app.presentation.presentationToolbar.goToSlide": "Slide {0}",
+    "app.presentationUploder.title": "Phần trình bày",
+    "app.presentationUploder.uploadLabel": "Đưa lê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",
+    "app.presentationUploder.dismissDesc": "Đóng và bỏ lưu.  ",
+    "app.presentationUploder.dropzoneLabel": "Kéo và thả file vào dây để đưa lên.",
+    "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.currentBadge": "Hiện tại",
+    "app.presentationUploder.genericError": "Ops, đã xảy ra lỗi",
+    "app.presentationUploder.upload.progress": "Đang đưa lên ({0}%)",
+    "app.presentationUploder.upload.413": "Kích thước file quá lớn, tối đa là 200 trang.",
+    "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.pageCountExceeded": "Ops, Số trang hiện tại vượt quá 200 trang.",
+    "app.presentationUploder.conversion.timeout": "Ops, sự thay đổi mất một khoảng thời gian",
+    "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.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",
+    "app.presentationUploder.tableHeading.status": "Trạng thái",
+    "app.poll.pollPaneTitle": "Thăm dò ý kiến",
+    "app.poll.quickPollTitle": "Thăm dò ý kiến nhanh",
+    "app.poll.hidePollDesc": "Ẩn thanh thăm dò ý kiến",
+    "app.poll.customPollInstruction": "Để tạo khảo sát, vui lòng bấm nút bên dưới và nhập ý kiến của bạn",
+    "app.poll.quickPollInstruction": "Chọn một lựa chọn bên dưới để bắt đầu cuộc khảo sát của bạn",
+    "app.poll.customPollLabel": "Tùy biến thăm dò ý kiến",
+    "app.poll.startCustomLabel": "Bắt đầu cuộc thăm dò ý kiến",
+    "app.poll.activePollInstruction": "Không dóng cửa sổ này để cho người khác có thể tham gia vào cuộc thăm dò ý kiến. Vui lòng chọn 'Công bố kết quả' hoặc nút quay lại để kết thúc cuộc khảo sát.",
+    "app.poll.publishLabel": "Công bố kết quả",
+    "app.poll.backLabel": "Quay lại các tùy chọn của cuộc thăm dò ý kiến",
+    "app.poll.closeLabel": "Đóng",
+    "app.poll.waitingLabel": "Đang chờ phản hồi ({0}/{1})",
+    "app.poll.ariaInputCount": "Tùy chỉnh các ý kiến {0} trên {1}",
+    "app.poll.customPlaceholder": "Thêm một ý kiến ",
+    "app.poll.noPresentationSelected": "Phần trình bày chưa được chọn! Vui lòng chọn một trong những phần trình bày trên",
+    "app.poll.clickHereToSelect": "Nhấp vào đây để chọn",
+    "app.poll.t": "Đúng",
+    "app.poll.f": "Sai",
+    "app.poll.tf": "Đúng/Sai",
+    "app.poll.y": "Đồng ý",
+    "app.poll.n": "Không",
+    "app.poll.yn": "Đồng ý/Không",
+    "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": "Đúng",
+    "app.poll.answer.false": "Sai",
+    "app.poll.answer.yes": "Đồng ý",
+    "app.poll.answer.no": "Không",
+    "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": "Người dùng",
+    "app.poll.liveResult.responsesTitle": "Phản hồi",
+    "app.polling.pollingTitle": "Các ý kiến trong cuộc khảo sát",
+    "app.polling.pollAnswerLabel": "Kết quả cuộc thăm dò ý kiến {0}",
+    "app.polling.pollAnswerDesc": "Chọn ý kiến này để bỏ phiếu cho {0}",
+    "app.failedMessage": "Xin lỗi, kết nối với máy chủ đã xảy ra lỗi",
+    "app.downloadPresentationButton.label": "Tải xuống file phần trình bày gốc",
+    "app.connectingMessage": "Đang kết nối ...",
+    "app.waitingMessage": "Mất kết nối. Kết nối lại trong {0} giây ...",
+    "app.navBar.settingsDropdown.optionsLabel": "Tùy chọn",
+    "app.navBar.settingsDropdown.fullscreenLabel": "Xem toàn màn hình",
+    "app.navBar.settingsDropdown.settingsLabel": "Cài đặt",
+    "app.navBar.settingsDropdown.aboutLabel": "Giới thiệu",
+    "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.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",
+    "app.navBar.settingsDropdown.hotkeysLabel": "Các phím tắt bàn phím ",
+    "app.navBar.settingsDropdown.hotkeysDesc": "Danh sách các phím tắt có sẵn",
+    "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.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.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.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.description": "Bạn thực sự muốn kết thúc phiên hoạt động ?",
+    "app.endMeeting.yesLabel": "Đồng ý",
+    "app.endMeeting.noLabel": "Không",
+    "app.about.title": "Giới thiệu",
+    "app.about.version": "Xậy dựng khách hàng:",
+    "app.about.copyright": "Bản quyền:",
+    "app.about.confirmLabel": "Đồng ý",
+    "app.about.confirmDesc": "Đồng ý",
+    "app.about.dismissLabel": "Hủy",
+    "app.about.dismissDesc": "Đóng thông tin về khách hàng",
+    "app.actionsBar.changeStatusLabel": "Thay dổi trạng thái",
+    "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.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",
+    "app.screenshare.screenShareLabel" : "Chia sẻ màn hình",
+    "app.submenu.application.applicationSectionTitle": "Ứng dụng",
+    "app.submenu.application.animationsLabel": " Các hình ảnh động",
+    "app.submenu.application.audioAlertLabel": "Cảnh báo âm thanh cho cuộc trò chuyện",
+    "app.submenu.application.pushAlertLabel": "Cảnh báo quảng cáo cho cuộc trò chuyện",
+    "app.submenu.application.fontSizeControlLabel": "Cỡ chữ",
+    "app.submenu.application.increaseFontBtnLabel": "Tăng cỡ chữ của ứng dụng",
+    "app.submenu.application.decreaseFontBtnLabel": "Giảm cỡ chữ của ứng dụng",
+    "app.submenu.application.currentSize": "hiện tại {0}",
+    "app.submenu.application.languageLabel": "Ngôn ngữ của ứng dụng",
+    "app.submenu.application.ariaLanguageLabel": "Thay đổi ngôn ngữ của ứng dụng",
+    "app.submenu.application.languageOptionLabel": "Chọn ngôn ngữ",
+    "app.submenu.application.noLocaleOptionLabel": "Không có hoạt động ",
+    "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.videoSourceLabel": "Nguồn video",
+    "app.submenu.video.videoOptionLabel": "Chọn nguồn video",
+    "app.submenu.video.videoQualityLabel": "Chất lượng video",
+    "app.submenu.video.qualityOptionLabel": "Chọn chất lượng video",
+    "app.submenu.video.participantsCamLabel": "Xem webcam của các thành viên",
+    "app.submenu.participants.muteAllLabel": "Tắt tiếng tất cả ngoại trừ người trình bày",
+    "app.submenu.participants.lockAllLabel": "Khóa tất cả người xem",
+    "app.submenu.participants.lockItemLabel": "Người xem {0}",
+    "app.submenu.participants.lockMicDesc": "Tắt micro cho tất cả người xem bị khóa",
+    "app.submenu.participants.lockCamDesc": "Tắt webcam cho tất cả người xem bị khóa",
+    "app.submenu.participants.lockPublicChatDesc": "Tắt trò chuyện công cộng cho người xem bị khóa",
+    "app.submenu.participants.lockPrivateChatDesc": "Tắt trò chuyện riêng tư cho tất cả người xem bị khóa",
+    "app.submenu.participants.lockLayoutDesc": "Khóa layout cho tất cả người xem đã bị khóa",
+    "app.submenu.participants.lockMicAriaLabel": "Khóa micro",
+    "app.submenu.participants.lockCamAriaLabel": "Khóa webcam",
+    "app.submenu.participants.lockPublicChatAriaLabel": "Khóa cuộc trò chuyện công cộng",
+    "app.submenu.participants.lockPrivateChatAriaLabel": "Khóa cuộc trò chuyện riêng tư",
+    "app.submenu.participants.lockLayoutAriaLabel": "Khóa layout",
+    "app.submenu.participants.lockMicLabel": "Microphone",
+    "app.submenu.participants.lockCamLabel": "Webcam",
+    "app.submenu.participants.lockPublicChatLabel": "Thảo luận chung",
+    "app.submenu.participants.lockPrivateChatLabel": "Thảo luận riêng",
+    "app.submenu.participants.lockLayoutLabel": "Layout",
+    "app.settings.applicationTab.label": "Ứng dụng",
+    "app.settings.audioTab.label": "Âm thanh",
+    "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",
+    "app.settings.main.cancel.label.description": "Hủy bỏ các thay đổi và dóng phần cài đặt",
     "app.settings.main.save.label": "LÆ°u",
+    "app.settings.main.save.label.description": "Lưu các thay đổi và đóng lại",
+    "app.settings.dataSavingTab.label": "Tiết kiệm dữ liệu",
+    "app.settings.dataSavingTab.webcam": "Cho phép webcam",
+    "app.settings.dataSavingTab.screenShare": "Cho phép chia sẻ màn hình",
+    "app.settings.dataSavingTab.description": "Để tiết kiệm băng thông của bạn, hãy điều chỉnh những gì đang hiển thị ",
+    "app.settings.save-notification.label": "Cài đặt đã được lưu lại",
+    "app.switch.onLabel": "Mở",
+    "app.switch.offLabel": "Tắt",
+    "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.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",
+    "app.actionsBar.actionsDropdown.desktopShareDesc": "Chia sẻ màn hình của bạn với người khác",
+    "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Dừng chia sẻ màn hình với ",
+    "app.actionsBar.actionsDropdown.pollBtnLabel": "Tạo thăm dò ý kiến",
+    "app.actionsBar.actionsDropdown.pollBtnDesc": "Cửa sổ bình chọn",
+    "app.actionsBar.actionsDropdown.saveUserNames": "Lưu tên các người dùng",
+    "app.actionsBar.actionsDropdown.createBreakoutRoom": "Chia nhóm",
+    "app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "Chia nhóm cho cuộc họp hiện tại",
+    "app.actionsBar.actionsDropdown.takePresenter": "Lấy quyền trình bày",
+    "app.actionsBar.actionsDropdown.takePresenterDesc": "Chỉ định bạn là người trình bày mới",
+    "app.actionsBar.emojiMenu.statusTriggerLabel": "Đặt dòng trạng thái",
+    "app.actionsBar.emojiMenu.awayLabel": "Cách xa",
+    "app.actionsBar.emojiMenu.awayDesc": "Thay đổi trạng thái của bạn ",
+    "app.actionsBar.emojiMenu.raiseHandLabel": "Kéo lên",
+    "app.actionsBar.emojiMenu.raiseHandDesc": "Hãy giơ tay để đặt câu hỏi",
+    "app.actionsBar.emojiMenu.neutralLabel": "Chưa quyết định",
+    "app.actionsBar.emojiMenu.neutralDesc": "Thay đổi trạng thái của bạn thành chưa quyết định",
+    "app.actionsBar.emojiMenu.confusedLabel": "Phân vân",
+    "app.actionsBar.emojiMenu.confusedDesc": "Thay đổi trạng thái của bạn thành phân vân",
+    "app.actionsBar.emojiMenu.sadLabel": "Buồn",
+    "app.actionsBar.emojiMenu.sadDesc": "Thay đổi trạng thái của bạn thành buồn",
+    "app.actionsBar.emojiMenu.happyLabel": "Vui vẻ",
+    "app.actionsBar.emojiMenu.happyDesc": "Thay đổi trạng thái của bạn thành vui vẻ",
+    "app.actionsBar.emojiMenu.noneLabel": "Xóa dòng trạng thái",
+    "app.actionsBar.emojiMenu.noneDesc": "Xóa dòng trạng thái của bạn",
+    "app.actionsBar.emojiMenu.applauseLabel": "Hoan nghênh",
+    "app.actionsBar.emojiMenu.applauseDesc": "Thay đổi trạng thái của bạn thành hoan nghênh",
+    "app.actionsBar.emojiMenu.thumbsUpLabel": "Đồng ý",
+    "app.actionsBar.emojiMenu.thumbsUpDesc": "Thay đổi trạng thái của bạn thành đồng ý",
+    "app.actionsBar.emojiMenu.thumbsDownLabel": "Không đồng ý",
+    "app.actionsBar.emojiMenu.thumbsDownDesc": "Thay đổi trạng thái của bạn thành không đồng ý",
+    "app.actionsBar.currentStatusDesc": "trang thái hiện tại {0}",
+    "app.audioNotification.audioFailedError1001": "Error 1001: WebSocket disconnected",
+    "app.audioNotification.audioFailedError1002": "Error 1002: Could not make a WebSocket connection   ",
+    "app.audioNotification.audioFailedError1003": "Error 1003: Browser version not supported   ",
+    "app.audioNotification.audioFailedError1004": "Error 1004: Failure on call (reason={0})",
+    "app.audioNotification.audioFailedError1005": "Error 1005: Call ended unexpectedly",
+    "app.audioNotification.audioFailedError1006": "Error 1006: Call timed out ",
+    "app.audioNotification.audioFailedError1007": "Error 1007: ICE negotiation failed",
+    "app.audioNotification.audioFailedError1008": "Error 1008: Transfer failed",
+    "app.audioNotification.audioFailedError1009": "Error 1009: Could not fetch STUN/TURN server information",
+    "app.audioNotification.audioFailedError1010": "Error 1010: ICE negotiation timeout",
+    "app.audioNotification.audioFailedError1011": "Error 1011: ICE gathering timeout",
+    "app.audioNotification.audioFailedError1012": "Error 1012: ICE connection closed",
+    "app.audioNotification.audioFailedMessage": "Kết nối âm thanh của bạn bị lỗi",
+    "app.audioNotification.mediaFailedMessage": "getUserMicMedia không thành công vì chỉ nguồn gốc an toàn mới được cho phép",
+    "app.audioNotification.closeLabel": "Đóng",
+    "app.audioNotificaion.reconnectingAsListenOnly": "Micro của người xem đã bị khóa, bạn chỉ có thể nghe khi kết nối",
+    "app.breakoutJoinConfirmation.title": "Tham gia phòng đã được chia nhóm",
+    "app.breakoutJoinConfirmation.message": "Bạn có muốn tham gia ?",
+    "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.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 ...",
+    "app.audioModal.ariaTitle": "Tham gia phương thức âm thanh",
+    "app.audioModal.microphoneLabel": "Nghe và nói",
+    "app.audioModal.listenOnlyLabel": "Chỉ nghe",
+    "app.audioModal.audioChoiceLabel": "Bạn muốn tham gia với hình thức âm thanh như thế nào ?",
+    "app.audioModal.iOSBrowser": "Âm thanh/Video không được hô trợ",
+    "app.audioModal.iOSErrorDescription": "Âm thanh và video không được hỗ trên Chrome của IOS tại thời điểm hiện tại",
+    "app.audioModal.iOSErrorRecommendation": "Chúng tôi khuyên bạn nên dùng Safari iOS",
+    "app.audioModal.audioChoiceDesc": "Chọn cách thức tham gia cuộc gọi trong cuộc họp",
+    "app.audioModal.unsupportedBrowserLabel": "Có lẽ bạn đang sử dụng trình duyệt không được hỗ trợ đầy đử. Vui lòng sử dụng {0} hoặc {1} để được hỗ trợ tốt nhất",
+    "app.audioModal.closeLabel": "Đóng",
+    "app.audioModal.yes": "Đồng ý",
+    "app.audioModal.no": "Không",
+    "app.audioModal.yes.arialabel" : "Tiếng vọng có thể nghe được",
+    "app.audioModal.no.arialabel" : "Tiếng vọng không thể nghe",
+    "app.audioModal.echoTestTitle": "Đây là một bài kiểm tra tiếng vọng. Hãy nói vài từ. Bạn đã nghe âm thanh chưa ?",
+    "app.audioModal.settingsTitle": "Thay đổi cài đặt âm thanh",
+    "app.audioModal.helpTitle": "Có một vài vấn đề với thiết bị của bạn",
+    "app.audioModal.helpText": "Bạn đã cho phép truy cập vào micrô của bạn? Lưu ý rằng một hộp thoại sẽ xuất hiện khi bạn cố gắng tham gia âm thanh, yêu cầu quyền của thiết bị đa phương tiện, vui lòng chấp nhận điều đó để tham gia hội nghị âm thanh. Nếu đó không phải là trường hợp, hãy thử thay đổi quyền micrô trong cài đặt trình duyệt của bạn.",
+    "app.audioModal.audioDialTitle": "Tham gia bằng cách sử dụng điện thoại của bạn",
+    "app.audioDial.audioDialDescription": "Quay số",
+    "app.audioDial.audioDialConfrenceText": "và nhập mã số PIN xác nhận: ",
+    "app.audioModal.connecting": "Đang kết nối",
+    "app.audioModal.connectingEchoTest": "Kết nối tới phần kiểm tra âm thanh ",
+    "app.audioManager.joinedAudio": "Bạn đã tham gia cuộ hội thoại âm thanh",
+    "app.audioManager.joinedEcho": "Bạn đã tham gia phần kiểm tra âm thanh ",
+    "app.audioManager.leftAudio": "Bạn vừa rời cuộc hội thoại âm thanh",
+    "app.audioManager.genericError": "Error: An error has occurred, please try again",
+    "app.audioManager.connectionError": "Error: Connection error",
+    "app.audioManager.requestTimeout": "Error: There was a timeout in the request   ",
+    "app.audioManager.invalidTarget": "Error: Tried to request something to an invalid target",
+    "app.audioManager.mediaError": "Error: There was an issue getting your media devices",
+    "app.audio.joinAudio": "Sử dụng âm thanh",
+    "app.audio.leaveAudio": "Không sử dụng âm thanh",
+    "app.audio.enterSessionLabel": "Nhập phiên hoạt động",
+    "app.audio.playSoundLabel": "Nghe âm thanh",
+    "app.audio.backLabel": "Quay lại",
+    "app.audio.audioSettings.titleLabel": "Chọn mục cài đặt âm thanh của bạn",
+    "app.audio.audioSettings.descriptionLabel": "Xin lưu ý, một hộp thoại sẽ xuất hiện trong trình duyệt của bạn, yêu cầu bạn chấp nhận chia sẻ micrô của mình.",
+    "app.audio.audioSettings.microphoneSourceLabel": "Nguồn micro",
+    "app.audio.audioSettings.speakerSourceLabel": "Nguồn âm thanh",
+    "app.audio.audioSettings.microphoneStreamLabel": "Âm lượng âm thanh của bạn",
+    "app.audio.audioSettings.retryLabel": "Thử lại",
+    "app.audio.listenOnly.backLabel": "Quay lại",
+    "app.audio.listenOnly.closeLabel": "Đóng",
+    "app.audio.permissionsOverlay.title": "Cho phép truy cập vào micro của bạn",
+    "app.audio.permissionsOverlay.hint": "Chúng tôi cần bạn cho phép chúng tôi sử dụng các thiết bị đa phương tiện của bạn để cùng bạn tham gia hội nghị bằng giọng nói :)",
+    "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.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",
+    "app.meeting-ended.rating.legendLabel": "Đánh giá phản hồi",
+    "app.meeting-ended.rating.starLabel": "Ngôi sao",
+    "app.modal.close": "Đóng",
+    "app.modal.close.description": "Bỏ qua các thay dổi và đóng phương thức",
+    "app.modal.confirm": "Xong",
+    "app.modal.newTab": "(Mở tab mới)",
+    "app.modal.confirm.description": "Lưu các thay dổi và dóng lại",
+    "app.dropdown.close": "Đóng",
+    "app.error.400": "Yêu cầu xấu",
+    "app.error.401": "Không được phép",
+    "app.error.403": "Bạn vừa bị xóa khỏi phòng họp  ",
+    "app.error.404": "Không tìm thấy",
+    "app.error.410": "Cuộc họp đã kết thúc",
+    "app.error.500": "Ops, đã xảy ra lỗi",
+    "app.error.leaveLabel": "Đăng nhập lại",
+    "app.error.fallback.presentation.title": "Một lỗi đã xuất hiện",
+    "app.error.fallback.presentation.description": "Tài khoản đã được đăng nhập. Vui lòng tải lại trang",
+    "app.error.fallback.presentation.reloadButton": "Tải lại",
+    "app.guest.waiting": "Chờ phê duyệt để tham gia ",
+    "app.userList.guest.waitingUsers": "Người dùng đang chờ",
+    "app.userList.guest.waitingUsersTitle": "Quản lí người dùng",
+    "app.userList.guest.optionTitle": "Đánh giá người dùng đang chờ xử lý",
+    "app.userList.guest.allowAllAuthenticated": "Cho phép xác thực tất cả",
+    "app.userList.guest.allowAllGuests": "Cho phép tất cả khách ",
+    "app.userList.guest.allowEveryone": "Cho phép tất cả mọi người",
+    "app.userList.guest.denyEveryone": "Từ chối tất cả mọi người",
+    "app.userList.guest.pendingUsers": "{0} Người dùng đang chờ xử lý",
+    "app.userList.guest.pendingGuestUsers": "{0} Khách đang chờ xử lý",
+    "app.userList.guest.pendingGuestAlert": "Đã tham gia bài học và đang chờ sự chấp thuận của bạn",
+    "app.userList.guest.rememberChoice": "Nhớ lựa chọn",
     "app.user-info.title": "Tra cứu thư mục",
-    "app.lock-viewers.title": "Khóa người xem"
+    "app.toast.breakoutRoomEnded": "Phòng chia nhóm đã kết thúc. Vui lòng tham gia lại và cài đặt âm thanh",
+    "app.toast.chat.public": "Tin nhắn trò chuyện công khai mới",
+    "app.toast.chat.private": "Tin nhắn trò chuyện riêng tư mới",
+    "app.toast.chat.system": "Hệ thống",
+    "app.notification.recordingStart": "Buổi học này đang được ghi hình lại ",
+    "app.notification.recordingStop": "Buổi học này không được ghi hình lại",
+    "app.notification.recordingAriaLabel": "Thời gian ghi hình",
+    "app.shortcut-help.title": "Các phím tắt bàn phím ",
+    "app.shortcut-help.accessKeyNotAvailable": "Khóa truy cập không có sẵn",
+    "app.shortcut-help.comboLabel": "Kết hợp",
+    "app.shortcut-help.functionLabel": "Chức năng",
+    "app.shortcut-help.closeLabel": "Đóng",
+    "app.shortcut-help.closeDesc": "Đóng phương thức phím tắt bàn phím",
+    "app.shortcut-help.openOptions": "Mở tùy chọn",
+    "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.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.lock-viewers.description": "Các tùy chọn này cho phép bạn hạn chế người xem sử dụng các tính năng cụ thể. (Những cài đặt khóa này không áp dụng cho người điều hành.)",
+    "app.lock-viewers.featuresLable": "Nổi bật",
+    "app.lock-viewers.lockStatusLabel": "Khóa trạng thái",
+    "app.lock-viewers.webcamLabel": "Webcam",
+    "app.lock-viewers.otherViewersWebcamLabel": "Xem các webcam người dùng khác",
+    "app.lock-viewers.microphoneLable": "Microphone",
+    "app.lock-viewers.PublicChatLabel": "Cuộc trò chuyện công cộng",
+    "app.lock-viewers.PrivateChatLable": "Cuộc trò chuyện riêng tư",
+    "app.lock-viewers.notesLabel": "Chia sẻ ghi chú",
+    "app.lock-viewers.Layout": "Layout",
+    "app.lock-viewers.ariaTitle": "Khóa phương thức người xem",
+    "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ể chọn lại nút ghi âm sau để tạm dừng ghi âm.)",
+    "app.recording.stopDescription": "Bạn có chắc chắn muốn tạm dừng ghi âm? (Bạn có thể tiếp tục bằng cách chọn lại nút ghi.)",
+    "app.videoPreview.cameraLabel": "Camera",
+    "app.videoPreview.profileLabel": "Chất lượng",
+    "app.videoPreview.cancelLabel": "Hủy",
+    "app.videoPreview.closeLabel": "Đóng",
+    "app.videoPreview.startSharingLabel": "Bắt đầu chia sẻ",
+    "app.videoPreview.webcamOptionLabel": "Chọn webcam",
+    "app.videoPreview.webcamPreviewLabel": "Xem trÆ°á»›c webcam",
+    "app.videoPreview.webcamSettingsTitle": "Cài đặt webcam",
+    "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.iceCandidateError": "Error on adding ICE candidate",
+    "app.video.iceConnectionStateError": "Error 1107: ICE negotiation failed  ",
+    "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.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.mediaFlowTimeout1020": "Error 1020: media could not reach the server",
+    "app.video.swapCam": "Đổi",
+    "app.video.swapCamDesc": "Đổi vị trí các webcam",
+    "app.video.videoLocked": "Chia sẻ webcam đã khóa",
+    "app.video.videoButtonDesc": "Nút tham gia 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",
+    "app.video.chromeExtensionErrorLink": "tiện ích mở rộng Chrome này",
+    "app.video.stats.title": "Các chỉ số kết nối",
+    "app.video.stats.packetsReceived": "Các gói đã nhận",
+    "app.video.stats.packetsSent": "Các gói đã gửi",
+    "app.video.stats.packetsLost": "Các gói bị mất",
+    "app.video.stats.bitrate": "Tốc độ bit",
+    "app.video.stats.lostPercentage": "Tổng phần trăm bị mất",
+    "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.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.fullscreenButton.label": "Tạo {0} toàn màn hình",
+    "app.deskshare.iceConnectionStateError": "Error 1108: ICE connection failed when sharing screen",
+    "app.sfu.mediaServerConnectionError2000": "Error 2000: Unable to connect to media server",
+    "app.sfu.mediaServerOffline2001": "Error 2001: Media server is offline. Please try again later.",
+    "app.sfu.mediaServerNoResources2002": "Error 2002: Media server has no available resources",
+    "app.sfu.mediaServerRequestTimeout2003": "Error 2003: Media server requests are timing out",
+    "app.sfu.serverIceGatheringFailed2021": "Error 2021: Media server cannot gather ICE candidates",
+    "app.sfu.serverIceGatheringFailed2022": "Error 2022: Media server ICE connection failed",
+    "app.sfu.mediaGenericError2200": "Error 2200: Media server failed to process request",
+    "app.sfu.invalidSdp2202":"Error 2202: Client generated an invalid SDP",
+    "app.sfu.noAvailableCodec2203": "Error 2203: Server could not find an appropriate codec",
+    "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.toolbar.tools": "Công cụ",
+    "app.whiteboard.toolbar.tools.hand": "Pan",
+    "app.whiteboard.toolbar.tools.pencil": "Bút chì",
+    "app.whiteboard.toolbar.tools.rectangle": "Hình chữ nhật",
+    "app.whiteboard.toolbar.tools.triangle": "Hình tam giác",
+    "app.whiteboard.toolbar.tools.ellipse": "Hình ellipse",
+    "app.whiteboard.toolbar.tools.line": "Đường thẳng",
+    "app.whiteboard.toolbar.tools.text": "Văn bản",
+    "app.whiteboard.toolbar.thickness": "Nét vẽ có độ dày",
+    "app.whiteboard.toolbar.thicknessDisabled": "Nét vẽ có độ dày không khả dụng",
+    "app.whiteboard.toolbar.color": "Màu sắc",
+    "app.whiteboard.toolbar.colorDisabled": "Màu sắc không khả dụng",
+    "app.whiteboard.toolbar.color.black": "Màu đen",
+    "app.whiteboard.toolbar.color.white": "Màu trắng",
+    "app.whiteboard.toolbar.color.red": "Màu đỏ",
+    "app.whiteboard.toolbar.color.orange": "Màu cam",
+    "app.whiteboard.toolbar.color.eletricLime": "Màu vỏ chanh",
+    "app.whiteboard.toolbar.color.lime": "Màu vỏ chanh",
+    "app.whiteboard.toolbar.color.cyan": "Màu lục lam",
+    "app.whiteboard.toolbar.color.dodgerBlue": "Màu xanh lam",
+    "app.whiteboard.toolbar.color.blue": "Màu xanh",
+    "app.whiteboard.toolbar.color.violet": "Màu tím",
+    "app.whiteboard.toolbar.color.magenta": "Màu đỏ tươi",
+    "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.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.subtitle": "Chúng tôi muốn nghe về trải nghiệm của bạn về BigBlueButton (tùy chọn)",
+    "app.feedback.textarea": "Làm thế nào để chúng tối tạo BigBlueButton tốt hơn ?",
+    "app.feedback.sendFeedback": "Gửi phản hồi",
+    "app.feedback.sendFeedbackDesc": "Gửi phản hồi và rời cuộc họp",
+    "app.videoDock.webcamFocusLabel": "Tập trung",
+    "app.videoDock.webcamFocusDesc": "Tập trung vào các webcam đã chọn",
+    "app.videoDock.webcamUnfocusLabel": "Không tập trung",
+    "app.videoDock.webcamUnfocusDesc": "Không tập trung vào các webcam đã chọn",
+    "app.invitation.title": "Lời mời vào phòng chia nhóm",
+    "app.invitation.confirm": "Mời",
+    "app.createBreakoutRoom.title": "Chia nhóm",
+    "app.createBreakoutRoom.ariaTitle": "Ẩn các phòng chia nhóm",
+    "app.createBreakoutRoom.breakoutRoomLabel": "Phong chia nhóm {0}",
+    "app.createBreakoutRoom.generatingURL": "Tạo URL",
+    "app.createBreakoutRoom.generatedURL": "Tạo",
+    "app.createBreakoutRoom.duration": "Thời lượng {0}",
+    "app.createBreakoutRoom.room": "Phòng {0}",
+    "app.createBreakoutRoom.notAssigned": "Không được chỉ định ({0})",
+    "app.createBreakoutRoom.join": "Phòng tham gia",
+    "app.createBreakoutRoom.joinAudio": "Tham gia âm thanh",
+    "app.createBreakoutRoom.returnAudio": "Quay lại âm thanh",
+    "app.createBreakoutRoom.confirm": "Tạo",
+    "app.createBreakoutRoom.record": "Ghi lại",
+    "app.createBreakoutRoom.numberOfRooms": "Số phòng",
+    "app.createBreakoutRoom.durationInMinutes": "Thời lượng (phút)",
+    "app.createBreakoutRoom.randomlyAssign": "Chỉ định ngẫu nhiên",
+    "app.createBreakoutRoom.endAllBreakouts": "Kết thúc tất cả phòng giải lao",
+    "app.createBreakoutRoom.roomName": "{0} (Phòng - {1})",
+    "app.createBreakoutRoom.doneLabel": "Xong",
+    "app.createBreakoutRoom.nextLabel": "Tiếp theo",
+    "app.createBreakoutRoom.minusRoomTime": "Giảm thời gian phòng chia nhóm",
+    "app.createBreakoutRoom.addRoomTime": "Tăng thời gian phòng chia nhóm",
+    "app.createBreakoutRoom.addParticipantLabel": "+ Thêm người tham gia",
+    "app.createBreakoutRoom.freeJoin": "Cho phép người dùng chọn phòng chia nhóm để tham gia",
+    "app.createBreakoutRoom.leastOneWarnBreakout": "Bạn phải đặt ít nhất một người dùng trong phòng chia nhóm",
+    "app.createBreakoutRoom.modalDesc": "Hoàn thành các bước bên dưới để tạo các phòng trong buổi học của bạn. Để thêm người tham gia vào phòng",
+    "app.createBreakoutRoom.roomTime": "{0} phút",
+    "app.externalVideo.start": "Chia sẻ video mới",
+    "app.externalVideo.title": "Chia sẻ một video YouTube",
+    "app.externalVideo.input": "Link dường dẫn video YouTube",
+    "app.externalVideo.urlInput": "Thêm đường dẫn link YouTube",
+    "app.externalVideo.urlError": "Địa chỉ liên kết video YouTube này không hợp lệ",
+    "app.externalVideo.close": "Đóng",
+    "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.help": "Làm thế nào để khắc phục nó ?",
+    "app.externalVideo.noteLabel": "Chú ý: Video YouTube dược chia sẻ sẽ không xuất hiện trong bản ghi âm",
+    "app.actionsBar.actionsDropdown.shareExternalVideo": "Chia sẻ video YouTube",
+    "app.actionsBar.actionsDropdown.stopShareExternalVideo": "Dừng chia sẻ video YouTube",
+    "app.iOSWarning.label": "Vui lòng nâng cấp lên IOS 12.2 hoặc cao hơn",
+    "app.legacy.unsupportedBrowser": "Có lẽ bạn đang sử dụng trình duyệt không được hỗ trợ đầy đử. Vui lòng sử dụng {0} hoặc {1} để được hỗ trợ tốt nhất",
+    "app.legacy.upgradeBrowser": "Có vẻ như bạn đang sử dụng phiên bản cũ hơn của trình duyệt được hỗ trợ. Vui lòng nâng cấp trình duyệt của bạn để được hỗ trợ đầy đủ."
 
 }
 
diff --git a/bigbluebutton-html5/private/locales/zh_CN.json b/bigbluebutton-html5/private/locales/zh_CN.json
index 9f45a7afd2370767ca418e0bafbe0c13ed81579c..bfc9964252250efcde598423cc5da85df33316a2 100644
--- a/bigbluebutton-html5/private/locales/zh_CN.json
+++ b/bigbluebutton-html5/private/locales/zh_CN.json
@@ -18,6 +18,12 @@
     "app.chat.label": "聊天",
     "app.chat.emptyLogLabel": "聊天日志是空的",
     "app.chat.clearPublicChatMessage": "公共聊天历史记录已被主持人清空",
+    "app.captions.menu.close": "关闭",
+    "app.captions.menu.start": "开始",
+    "app.captions.menu.backgroundColor": "背景色",
+    "app.captions.menu.cancelLabel": "取消",
+    "app.captions.pad.tip": "按Esc键定位到编辑器工具栏",
+    "app.captions.pad.ownership": "获取所有者权限",
     "app.note.title": "共享笔记",
     "app.note.label": "笔记",
     "app.note.hideNoteLabel": "隐藏笔记面板",
@@ -106,8 +112,7 @@
     "app.presentation.presentationToolbar.fitToPage": "适应页面",
     "app.presentation.presentationToolbar.goToSlide": "幻灯片{0}",
     "app.presentationUploder.title": "演示",
-    "app.presentationUploder.message": "作为演示者,您可以上载任何Office文档或PDF文件。我们推荐PDF文件以获得最佳结果。",
-    "app.presentationUploder.confirmLabel": "上传",
+    "app.presentationUploder.uploadLabel": "上传",
     "app.presentationUploder.confirmDesc": "保存更改并开始演示",
     "app.presentationUploder.dismissLabel": "取消",
     "app.presentationUploder.dismissDesc": "关闭窗口并丢弃更改",
@@ -118,7 +123,6 @@
     "app.presentationUploder.fileToUpload": "等待上传",
     "app.presentationUploder.currentBadge": "当前",
     "app.presentationUploder.genericError": "哎哟,出错了",
-    "app.presentationUploder.rejectedError": "部分文件被拒绝。请检查文件格式。 ",
     "app.presentationUploder.upload.progress": "上传中({0}%)",
     "app.presentationUploder.upload.413": "文件太大,最多只能200页",
     "app.presentationUploder.conversion.conversionProcessingSlides": "处理中,第{0}页/共{1}页",
@@ -161,6 +165,10 @@
     "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.liveResult.usersTitle": "用户",
     "app.poll.liveResult.responsesTitle": "反馈",
     "app.polling.pollingTitle": "投票选项",
@@ -235,18 +243,6 @@
     "app.submenu.video.videoQualityLabel": "视频画面质量",
     "app.submenu.video.qualityOptionLabel": "选择视频质量",
     "app.submenu.video.participantsCamLabel": "查看参会者的摄像头",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "隐藏式字幕",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "获取所有者权限",
-    "app.submenu.closedCaptions.languageLabel": "语言",
-    "app.submenu.closedCaptions.localeOptionLabel": "选择语言",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "无可用的语言",
-    "app.submenu.closedCaptions.fontFamilyLabel": "字体",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "选择字体",
-    "app.submenu.closedCaptions.fontSizeLabel": "字号",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "选择字号",
-    "app.submenu.closedCaptions.backgroundColorLabel": "背景色",
-    "app.submenu.closedCaptions.fontColorLabel": "字体颜色",
-    "app.submenu.closedCaptions.noLocaleSelected": "没有选择地区",
     "app.submenu.participants.muteAllLabel": "将演示者以外的人都静音",
     "app.submenu.participants.lockAllLabel": "锁定所有观众",
     "app.submenu.participants.lockItemLabel": "观众{0}",
@@ -268,7 +264,6 @@
     "app.settings.applicationTab.label": "应用",
     "app.settings.audioTab.label": "音频",
     "app.settings.videoTab.label": "视频",
-    "app.settings.closedcaptionTab.label": "隐藏式字幕",
     "app.settings.usersTab.label": "参会者",
     "app.settings.main.label": "设置",
     "app.settings.main.cancel.label": "取消",
@@ -338,7 +333,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "观众的麦克风被锁定,您现在仅能聆听。",
     "app.breakoutJoinConfirmation.title": "加入分组会议室",
     "app.breakoutJoinConfirmation.message": "您想加入吗?",
-    "app.breakoutJoinConfirmation.confirmLabel": "加入",
     "app.breakoutJoinConfirmation.confirmDesc": "将您加入分组会议室",
     "app.breakoutJoinConfirmation.dismissLabel": "取消",
     "app.breakoutJoinConfirmation.dismissDesc": "关闭并拒绝加入分组会议室",
diff --git a/bigbluebutton-html5/private/locales/zh_TW.json b/bigbluebutton-html5/private/locales/zh_TW.json
index dacbba2b817dd3055ee8e9a4555cf580e5f4b813..30c4ad0489fe8f1b0d79dca2e5f1fe0dccecb4bf 100644
--- a/bigbluebutton-html5/private/locales/zh_TW.json
+++ b/bigbluebutton-html5/private/locales/zh_TW.json
@@ -16,8 +16,23 @@
     "app.chat.dropdown.copy": "拷貝",
     "app.chat.dropdown.save": "儲存",
     "app.chat.label": "聊天",
+    "app.chat.offline": "下線",
     "app.chat.emptyLogLabel": "空的聊天紀錄",
     "app.chat.clearPublicChatMessage": "公開聊天紀錄已被主持人清空了",
+    "app.captions.label": "字幕",
+    "app.captions.menu.close": "關閉",
+    "app.captions.menu.start": "開始",
+    "app.captions.menu.select": "選擇可用語言",
+    "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.note.title": "共享筆記",
     "app.note.label": "筆記",
     "app.note.hideNoteLabel": "隱藏筆記",
@@ -29,6 +44,7 @@
     "app.userList.participantsTitle": "參與者",
     "app.userList.messagesTitle": "訊息",
     "app.userList.notesTitle": "筆記",
+    "app.userList.captionsTitle": "字幕",
     "app.userList.presenter": "主持人",
     "app.userList.you": "您",
     "app.userList.locked": "已鎖定",
@@ -67,6 +83,12 @@
     "app.userList.userOptions.disablePubChat": "已停用公開聊天",
     "app.userList.userOptions.disableNote": "共享筆記目前鎖定中",
     "app.userList.userOptions.webcamsOnlyForModerator": "只有主持人可以看到與會者的視訊(由於鎖定設置)",
+    "app.userList.userOptions.enableCam": "與會者的網路攝影機已啟用",
+    "app.userList.userOptions.enableMic": "與會者的麥克風已啟用",
+    "app.userList.userOptions.enablePrivChat": "私聊已啟用",
+    "app.userList.userOptions.enablePubChat": "公開聊天已啟用",
+    "app.userList.userOptions.enableNote": "公享筆記目前已啟用",
+    "app.userList.userOptions.enableOnlyModeratorWebcam": "您現在能夠啟用您的網路攝影機,大家都可以看到您。",
     "app.media.label": "媒體",
     "app.media.screenshare.start": "畫面分享已開始",
     "app.media.screenshare.end": "畫面分享已結束",
@@ -106,8 +128,9 @@
     "app.presentation.presentationToolbar.fitToPage": "適合頁面",
     "app.presentation.presentationToolbar.goToSlide": "投影片 {0}",
     "app.presentationUploder.title": "ç°¡å ±",
-    "app.presentationUploder.message": "身為主持人,您可以上傳任何Office文件或PDF檔。我們推薦採用PDF檔案獲取最佳效果。",
-    "app.presentationUploder.confirmLabel": "上傳",
+    "app.presentationUploder.message": "身為主持人,您可以上傳任何Office文件或PDF檔,我們推薦採用PDF檔案獲取最佳效果。請確認使用右手邊的圓形複選框選擇簡報。",
+    "app.presentationUploder.uploadLabel": "上傳",
+    "app.presentationUploder.confirmLabel": "確認",
     "app.presentationUploder.confirmDesc": "保存變更並且啟用簡報",
     "app.presentationUploder.dismissLabel": "取消",
     "app.presentationUploder.dismissDesc": "關閉視窗並且忽略改變",
@@ -118,7 +141,7 @@
     "app.presentationUploder.fileToUpload": "等待上傳 ...",
     "app.presentationUploder.currentBadge": "目前",
     "app.presentationUploder.genericError": "哎呀,有問題",
-    "app.presentationUploder.rejectedError": "有些選取的檔案被拒,請確認檔案格式。",
+    "app.presentationUploder.rejectedError": "所選檔案已被退回,請認檔案格式。",
     "app.presentationUploder.upload.progress": "上傳中 ({0}%)",
     "app.presentationUploder.upload.413": "文件太大,已抵達最多200頁",
     "app.presentationUploder.conversion.conversionProcessingSlides": "處理中,第 {0}/{1} 頁",
@@ -161,6 +184,15 @@
     "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": "投票選項",
@@ -222,6 +254,7 @@
     "app.submenu.application.fontSizeControlLabel": "字型大小",
     "app.submenu.application.increaseFontBtnLabel": "提高應用程式字體",
     "app.submenu.application.decreaseFontBtnLabel": "降低應用程式字體",
+    "app.submenu.application.currentSize": "目前  {0}",
     "app.submenu.application.languageLabel": "應用程式語言",
     "app.submenu.application.ariaLanguageLabel": "選變應用程式語言",
     "app.submenu.application.languageOptionLabel": "選擇語言",
@@ -235,18 +268,6 @@
     "app.submenu.video.videoQualityLabel": "視訊品質",
     "app.submenu.video.qualityOptionLabel": "選取視訊品質",
     "app.submenu.video.participantsCamLabel": "顯示與會者視訊",
-    "app.submenu.closedCaptions.closedCaptionsLabel": "隱藏式字幕",
-    "app.submenu.closedCaptions.takeOwnershipLabel": "獲取所有者權限",
-    "app.submenu.closedCaptions.languageLabel": "語言",
-    "app.submenu.closedCaptions.localeOptionLabel": "選擇語言",
-    "app.submenu.closedCaptions.noLocaleOptionLabel": "沒有可用的語言",
-    "app.submenu.closedCaptions.fontFamilyLabel": "å­—åž‹",
-    "app.submenu.closedCaptions.fontFamilyOptionLabel": "選擇字型",
-    "app.submenu.closedCaptions.fontSizeLabel": "字型大小",
-    "app.submenu.closedCaptions.fontSizeOptionLabel": "選擇字型大小",
-    "app.submenu.closedCaptions.backgroundColorLabel": "背景顏色",
-    "app.submenu.closedCaptions.fontColorLabel": "字體顏色",
-    "app.submenu.closedCaptions.noLocaleSelected": "沒有選擇地區",
     "app.submenu.participants.muteAllLabel": "主持人外全部靜音",
     "app.submenu.participants.lockAllLabel": "鎖定所有與會者",
     "app.submenu.participants.lockItemLabel": "與會者 {0}",
@@ -268,7 +289,6 @@
     "app.settings.applicationTab.label": "應用",
     "app.settings.audioTab.label": "聲音",
     "app.settings.videoTab.label": "視訊",
-    "app.settings.closedcaptionTab.label": "隱藏式字幕",
     "app.settings.usersTab.label": "與會者",
     "app.settings.main.label": "設定",
     "app.settings.main.cancel.label": "取消",
@@ -296,6 +316,8 @@
     "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": "設定狀態",
@@ -320,6 +342,8 @@
     "app.actionsBar.emojiMenu.thumbsDownLabel": "反對",
     "app.actionsBar.emojiMenu.thumbsDownDesc": "變更您的狀態為反對",
     "app.actionsBar.currentStatusDesc": "目前狀態 {0}",
+    "app.actionsBar.captions.start": "開始觀看隱藏式字幕",
+    "app.actionsBar.captions.stop": "停止觀看隱藏式字幕",
     "app.audioNotification.audioFailedError1001": "Error 1001: WebSocket 斷線了",
     "app.audioNotification.audioFailedError1002": "Error 1002: 無法建立 WebSocket 連線",
     "app.audioNotification.audioFailedError1003": "Error 1003: 瀏覽器版本不支援",
@@ -338,7 +362,6 @@
     "app.audioNotificaion.reconnectingAsListenOnly": "與會者麥克風已被鎖定,您現在只能聆聽。",
     "app.breakoutJoinConfirmation.title": "加入分組會議室",
     "app.breakoutJoinConfirmation.message": "您要加入嗎?",
-    "app.breakoutJoinConfirmation.confirmLabel": "加入",
     "app.breakoutJoinConfirmation.confirmDesc": "將您加入分組會議室",
     "app.breakoutJoinConfirmation.dismissLabel": "取消",
     "app.breakoutJoinConfirmation.dismissDesc": "關閉並拒絕加入分組會議室",
@@ -404,6 +427,7 @@
     "app.modal.close": "關閉",
     "app.modal.close.description": "忽視變更並且關閉模組",
     "app.modal.confirm": "完成",
+    "app.modal.newTab": "(開啟新分頁)",
     "app.modal.confirm.description": "儲存變更並且關閉模組",
     "app.dropdown.close": "關閉",
     "app.error.400": "錯誤請求",
@@ -592,12 +616,15 @@
     "app.createBreakoutRoom.freeJoin": "允許與會者選擇並加入分組討論會議室",
     "app.createBreakoutRoom.leastOneWarnBreakout": "您必需指派一位人員到每個分組討論會議室",
     "app.createBreakoutRoom.modalDesc": "完成以下步驟建立分組會議室,並增加與會者進入其中。",
+    "app.createBreakoutRoom.roomTime": "{0} 分鐘",
     "app.externalVideo.start": "分享一個影片",
     "app.externalVideo.title": "分享一個YouTube影片",
     "app.externalVideo.input": "YouTube 影片網址",
     "app.externalVideo.urlInput": "加入YouTube網址",
     "app.externalVideo.urlError": "這個網址不是有效的YouTube影片",
     "app.externalVideo.close": "關閉",
+    "app.network.connection.effective.slow": "我們查覺到連接問題。",
+    "app.network.connection.effective.slow.help": "如何修正它?",
     "app.externalVideo.noteLabel": "注意: 分享 YouTube 影片不會顯示在錄製中",
     "app.actionsBar.actionsDropdown.shareExternalVideo": "分享 YouTube 影片",
     "app.actionsBar.actionsDropdown.stopShareExternalVideo": "停止分享 YouTube 影片",
diff --git a/bigbluebutton-html5/public/compatibility/sip.js b/bigbluebutton-html5/public/compatibility/sip.js
index 63ea6b37abf1c01f469b39b81dbe551b487493ba..ddea0ad180f227fc59abe81bb7528f70ba60df18 100755
--- a/bigbluebutton-html5/public/compatibility/sip.js
+++ b/bigbluebutton-html5/public/compatibility/sip.js
@@ -11618,6 +11618,9 @@ MediaHandler.prototype = Object.create(SIP.MediaHandler.prototype, {
 
         sdp = SIP.Hacks.Chrome.needsExplicitlyInactiveSDP(sdp);
         sdp = SIP.Hacks.AllBrowsers.unmaskDtls(sdp);
+        if (window.stripMDnsCandidates) {
+          sdp = window.stripMDnsCandidates(sdp);
+        }
 
         var sdpWrapper = {
           type: methodName === 'createOffer' ? 'offer' : 'answer',
diff --git a/bigbluebutton-html5/tests/webdriverio/pageobjects/chat.page.js b/bigbluebutton-html5/tests/webdriverio/pageobjects/chat.page.js
new file mode 100644
index 0000000000000000000000000000000000000000..75ff5d6639f82dccbf99ce9ee252f69368620e22
--- /dev/null
+++ b/bigbluebutton-html5/tests/webdriverio/pageobjects/chat.page.js
@@ -0,0 +1,79 @@
+
+
+const Page = require('./page');
+
+const pageObject = new Page();
+const chai = require('chai');
+
+class ChatPage extends Page {
+  get publicChatSelector() {
+    return '#message-input';
+  }
+
+  get publicChatElement() {
+    return $(this.publicChatSelector);
+  }
+
+  sendPublicChatMessage(message) {
+    this.publicChatElement.setValue(message);
+    pageObject.pressEnter();
+  }
+
+  // ////////
+
+  get chatDropdownTriggerSelector() {
+    return '[data-test=chatDropdownTrigger]';
+  }
+
+  get chatDropdownTriggerElement() {
+    return $(this.chatDropdownTriggerSelector);
+  }
+
+  triggerChatDropdown() {
+    this.chatDropdownTriggerElement.click();
+  }
+
+  // ////////
+
+  get clearChatButtonSelector() {
+    return '[data-test=chatClear]';
+  }
+
+  get clearChatButtonElement() {
+    return $(this.clearChatButtonSelector);
+  }
+
+  clearChat() {
+    this.clearChatButtonElement.click();
+  }
+
+  // ////////
+
+  get saveChatButtonSelector() {
+    return '[data-test=chatSave]';
+  }
+
+  get saveChatButtonElement() {
+    return $(this.saveChatButtonSelector);
+  }
+
+  saveChat() {
+    this.saveChatButtonElement.click();
+  }
+
+  // ////////
+
+  get copyChatButtonSelector() {
+    return '[data-test=chatCopy]';
+  }
+
+  get copyChatButtonElement() {
+    return $(this.copyChatButtonSelector);
+  }
+
+  copyChat() {
+    this.copyChatButtonElement.click();
+  }
+}
+
+module.exports = new ChatPage();
diff --git a/bigbluebutton-html5/tests/webdriverio/pageobjects/landing.page.js b/bigbluebutton-html5/tests/webdriverio/pageobjects/landing.page.js
new file mode 100644
index 0000000000000000000000000000000000000000..ef3c30dc61f1df53c1777ee3dd4ada3d4b9b72bf
--- /dev/null
+++ b/bigbluebutton-html5/tests/webdriverio/pageobjects/landing.page.js
@@ -0,0 +1,54 @@
+
+
+const Page = require('./page');
+
+const pageObject = new Page();
+const chai = require('chai');
+
+class LandingPage extends Page {
+  get meetingNameInputSelector() {
+    return 'input[name=meetingname]';
+  }
+
+  get meetingNameInputElement() {
+    return $(this.meetingNameInputSelector);
+  }
+
+  // ////////
+
+  get usernameInputSelector() {
+    return 'input[name=username]';
+  }
+
+  get usernameInputElement() {
+    return $(this.usernameInputSelector);
+  }
+
+  // ////////
+
+  joinWithButtonClick() {
+    this.joinButtonElement.click();
+  }
+
+  joinWithEnterKey() {
+    pageObject.pressEnter();
+  }
+
+  // ////////
+
+  get joinButtonSelector() {
+    return 'input[type=submit]';
+  }
+
+  get joinButtonElement() {
+    return $(this.joinButtonSelector);
+  }
+
+  // ////////
+
+  open() {
+    super.open('demo/demoHTML5.jsp');
+  }
+}
+
+module.exports = new LandingPage();
diff --git a/bigbluebutton-html5/tests/webdriverio/pageobjects/modal.page.js b/bigbluebutton-html5/tests/webdriverio/pageobjects/modal.page.js
new file mode 100644
index 0000000000000000000000000000000000000000..09b69ce63decbe23603c2509ba187f1489f414eb
--- /dev/null
+++ b/bigbluebutton-html5/tests/webdriverio/pageobjects/modal.page.js
@@ -0,0 +1,38 @@
+
+
+const Page = require('./page');
+
+const pageObject = new Page();
+const chai = require('chai');
+
+class ModalPage extends Page {
+  get modalCloseSelector() {
+    return 'i.icon-bbb-close';
+  }
+
+  get modalCloseElement() {
+    return $(this.modalCloseSelector);
+  }
+
+  closeAudioModal() {
+    this.modalCloseElement.click();
+  }
+
+  get meetingEndedModalTitleSelector() {
+    return '[data-test=meetingEndedModalTitle]';
+  }
+
+  get aboutModalSelector() {
+    return '[aria-label=About]';
+  }
+
+  get modalConfirmButtonSelector() {
+    return '[data-test=modalConfirmButton]';
+  }
+
+  get modalConfirmButtonElement() {
+    return browser.element(this.modalConfirmButtonSelector);
+  }
+}
+
+module.exports = new ModalPage();
diff --git a/bigbluebutton-html5/tests/webdriverio/pageobjects/page.js b/bigbluebutton-html5/tests/webdriverio/pageobjects/page.js
new file mode 100644
index 0000000000000000000000000000000000000000..4894e8c616c2ab53b88f35fa61521c62ac589cb3
--- /dev/null
+++ b/bigbluebutton-html5/tests/webdriverio/pageobjects/page.js
@@ -0,0 +1,13 @@
+
+
+class Page {
+  open(path) {
+    browser.url(path);
+  }
+
+  pressEnter() {
+    browser.keys('Enter');
+  }
+}
+
+module.exports = Page;
diff --git a/bigbluebutton-html5/tests/webdriverio/pageobjects/settings.page.js b/bigbluebutton-html5/tests/webdriverio/pageobjects/settings.page.js
new file mode 100644
index 0000000000000000000000000000000000000000..e046e12b559683b5d144b669070a09812f4d0ced
--- /dev/null
+++ b/bigbluebutton-html5/tests/webdriverio/pageobjects/settings.page.js
@@ -0,0 +1,93 @@
+
+
+const Page = require('./page');
+
+const pageObject = new Page();
+const chai = require('chai');
+
+class SettingsPage extends Page {
+  // open the settings dropdown
+  get openSettingsDropdownSelector() {
+    return 'i.icon-bbb-more';
+  }
+
+  get openSettingsDropdownElement() {
+    return $(this.openSettingsDropdownSelector);
+  }
+
+  openSettingsDropdown() {
+    this.openSettingsDropdownElement.click();
+  }
+
+  // ////////
+
+  get endMeetingButtonSelector() {
+    return 'i.icon-bbb-application';
+  }
+
+  get endMeetingButtonElement() {
+    return $(this.endMeetingButtonSelector);
+  }
+
+  clickEndMeetingButton() {
+    this.endMeetingButtonElement.click();
+  }
+
+  // ////////
+
+  get confirmEndMeetingSelector() {
+    return '[data-test=confirmEndMeeting]';
+  }
+
+  get confirmEndMeetingElement() {
+    return $(this.confirmEndMeetingSelector);
+  }
+
+  confirmEndMeeting() {
+    this.confirmEndMeetingElement.click();
+  }
+
+  // ////////
+
+  get logoutButtonSelector() {
+    return 'i.icon-bbb-logout';
+  }
+
+  get logoutButtonElement() {
+    return $(this.logoutButtonSelector);
+  }
+
+  clickLogoutButton() {
+    this.logoutButtonElement.click();
+  }
+
+  // ////////
+
+  get settingsButtonSelector() {
+    return 'i.icon-bbb-settings';
+  }
+
+  get settingsButtonElement() {
+    return $(this.settingsButtonSelector);
+  }
+
+  clickSettingsButton() {
+    this.settingsButtonElement.click();
+  }
+
+  // ////////
+
+  get languageSelectSelector() {
+    return '#langSelector';
+  }
+
+  get languageSelectElement() {
+    return $(this.languageSelectSelector);
+  }
+
+  clickLanguageSelect() {
+    this.languageSelectElement.click();
+  }
+}
+
+module.exports = new SettingsPage();
diff --git a/bigbluebutton-html5/tests/webdriverio/specs/chat.spec.js b/bigbluebutton-html5/tests/webdriverio/specs/chat.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..a4c8b1e32d39476ad0f8a26a7194e08c09719585
--- /dev/null
+++ b/bigbluebutton-html5/tests/webdriverio/specs/chat.spec.js
@@ -0,0 +1,76 @@
+
+
+const LandingPage = require('../pageobjects/landing.page');
+const ModalPage = require('../pageobjects/modal.page');
+const ChatPage = require('../pageobjects/chat.page');
+const Utils = require('../utils');
+
+const WAIT_TIME = 10000;
+
+const loginWithoutAudio = function () {
+  // login
+  LandingPage.open();
+  browser.setValue(LandingPage.usernameInputSelector, 'user');
+  LandingPage.joinWithEnterKey();
+
+  // close audio modal
+  browser.waitForExist(ModalPage.modalCloseSelector, WAIT_TIME);
+  ModalPage.closeAudioModal();
+};
+
+describe('Chat', () => {
+  beforeEach(() => {
+    Utils.configureViewport();
+    jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
+  });
+
+  it('should be able to send a message',
+    () => {
+      loginWithoutAudio();
+
+      browser.waitForExist(ChatPage.publicChatSelector, WAIT_TIME);
+      ChatPage.sendPublicChatMessage('Hello');
+    });
+
+  it('should be able to save chat',
+    () => {
+      loginWithoutAudio();
+
+      browser.waitForExist(ChatPage.publicChatSelector, WAIT_TIME);
+      ChatPage.sendPublicChatMessage('Hello');
+
+      browser.waitForExist(ChatPage.chatDropdownTriggerSelector, WAIT_TIME);
+      ChatPage.triggerChatDropdown();
+
+      browser.waitForExist(ChatPage.saveChatButtonSelector, WAIT_TIME);
+      ChatPage.saveChat();
+    });
+
+  it('should be able to copy chat',
+    () => {
+      loginWithoutAudio();
+
+      browser.waitForExist(ChatPage.publicChatSelector, WAIT_TIME);
+      ChatPage.sendPublicChatMessage('Hello');
+
+      browser.waitForExist(ChatPage.chatDropdownTriggerSelector, WAIT_TIME);
+      ChatPage.triggerChatDropdown();
+
+      browser.waitForExist(ChatPage.copyChatButtonSelector, WAIT_TIME);
+      ChatPage.copyChat();
+    });
+
+  it('should be able to clear chat',
+    () => {
+      loginWithoutAudio();
+
+      browser.waitForExist(ChatPage.publicChatSelector, WAIT_TIME);
+      ChatPage.sendPublicChatMessage('Hello');
+
+      browser.waitForExist(ChatPage.chatDropdownTriggerSelector, WAIT_TIME);
+      ChatPage.triggerChatDropdown();
+
+      browser.waitForExist(ChatPage.clearChatButtonSelector, WAIT_TIME);
+      ChatPage.clearChat();
+    });
+});
diff --git a/bigbluebutton-html5/tests/webdriverio/specs/settings.spec.js b/bigbluebutton-html5/tests/webdriverio/specs/settings.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..0477fd2582283f5cae9df283e84607d25753c843
--- /dev/null
+++ b/bigbluebutton-html5/tests/webdriverio/specs/settings.spec.js
@@ -0,0 +1,109 @@
+
+
+const chai = require('chai');
+const LandingPage = require('../pageobjects/landing.page');
+const ModalPage = require('../pageobjects/modal.page');
+const SettingsPage = require('../pageobjects/settings.page');
+const Utils = require('../utils');
+
+const openSettingsDropdown = function () {
+  browser.waitForExist(SettingsPage.openSettingsDropdownSelector, WAIT_TIME);
+  SettingsPage.openSettingsDropdown();
+};
+
+const closeAudioModal = function () {
+  browser.waitForExist(ModalPage.modalCloseSelector, WAIT_TIME);
+  ModalPage.closeAudioModal();
+};
+
+const openSettingsModal = function () {
+  browser.waitForExist(SettingsPage.settingsButtonSelector, WAIT_TIME);
+  SettingsPage.clickSettingsButton();
+};
+
+const WAIT_TIME = 10000;
+let errorsCounter = 0;
+
+describe('Settings', () => {
+  beforeAll(() => {
+    Utils.configureViewport();
+    jasmine.DEFAULT_TIMEOUT_INTERVAL = 300000;
+  });
+
+  beforeEach(() => {
+    LandingPage.open();
+    browser.setValue(LandingPage.usernameInputSelector, 'user');
+    browser.setValue(LandingPage.meetingNameInputSelector, 'Demo Meeting Tests');
+    LandingPage.joinWithEnterKey();
+    closeAudioModal();
+  });
+
+  it('should be able to use all locales',
+    () => {
+      openSettingsDropdown();
+      openSettingsModal();
+      browser.waitForExist(`${SettingsPage.languageSelectSelector} option:not([disabled]`, WAIT_TIME);
+      const locales = browser.elements('#langSelector option:not([disabled]').value.map(e => e.getValue());
+      browser.refresh();
+
+      browser.cdp('Console', 'enable');
+      browser.on('Console.messageAdded', (log) => {
+        if (log.message.level === 'error') {
+          console.log(log.message.text);
+          errorsCounter += 1;
+        }
+      });
+
+      locales.forEach((locale) => {
+        errorsCounter = 0;
+
+        closeAudioModal();
+        openSettingsDropdown();
+        openSettingsModal();
+
+        browser.waitForExist(SettingsPage.languageSelectSelector, WAIT_TIME);
+        SettingsPage.clickLanguageSelect();
+        browser.waitForExist(`option[value=${locale}]`, WAIT_TIME);
+
+        $(`option[value=${locale}]`).click();
+
+        browser.waitForExist(ModalPage.modalConfirmButtonSelector, WAIT_TIME);
+        ModalPage.modalConfirmButtonElement.click();
+
+        browser.pause(500);
+        browser.refresh();
+        browser.pause(500);
+        console.log(`[switching to ${locale}] number of errors: ${errorsCounter}`);
+
+        chai.expect(errorsCounter < 5).to.be.true;
+      });
+    });
+
+  it('should be able to end meeting and get confirmation',
+    () => {
+      openSettingsDropdown();
+
+      // click End Meeting
+      browser.waitForExist(SettingsPage.endMeetingButtonSelector, WAIT_TIME);
+      SettingsPage.clickEndMeetingButton();
+
+      // confirm
+      browser.waitForExist(SettingsPage.confirmEndMeetingSelector, WAIT_TIME);
+      SettingsPage.confirmEndMeeting();
+
+      // check the confirmation page
+      browser.waitForExist(ModalPage.meetingEndedModalTitleSelector, WAIT_TIME);
+    });
+
+  it('should be able to logout and get confirmation',
+    () => {
+      openSettingsDropdown();
+
+      // click Logout
+      browser.waitForExist(SettingsPage.logoutButtonSelector, WAIT_TIME);
+      SettingsPage.clickLogoutButton();
+
+      // check the confirmation page
+      browser.waitForExist(ModalPage.meetingEndedModalTitleSelector, WAIT_TIME);
+    });
+});
diff --git a/bigbluebutton-html5/tests/webdriverio/utils.js b/bigbluebutton-html5/tests/webdriverio/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..0c07a8f6de489e0074172309322233c39bde17de
--- /dev/null
+++ b/bigbluebutton-html5/tests/webdriverio/utils.js
@@ -0,0 +1,12 @@
+
+
+class Utils {
+  configureViewport() {
+    browser.setViewportSize({
+      width: 1366,
+      height: 768,
+    });
+  }
+}
+
+module.exports = new Utils();
diff --git a/bigbluebutton-html5/tests/webdriverio/wdio.conf.js b/bigbluebutton-html5/tests/webdriverio/wdio.conf.js
new file mode 100644
index 0000000000000000000000000000000000000000..65bf9e33545c7b0a8ae2e965c5a494d3f0483692
--- /dev/null
+++ b/bigbluebutton-html5/tests/webdriverio/wdio.conf.js
@@ -0,0 +1,10 @@
+exports.config = {
+  specs: ['tests/webdriverio/specs/**/*.spec.js'],
+  capabilities: [{
+    browserName: 'chrome',
+  }],
+  services: ['devtools'],
+  framework: 'jasmine',
+  reporters: ['spec'],
+  baseUrl: '',
+};
diff --git a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties
index 264dd1111ca348b4b1caaa7c7a0b8a333ec1f5c4..cf3d146171fad1519e0ae2fde8520c90acbc67bb 100755
--- a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties
+++ b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties
@@ -201,7 +201,8 @@ keepEvents=false
 #----------------------------------------------------
 # This URL is where the BBB client is accessible. When a user sucessfully
 # enters a name and password, she is redirected here to load the client.
-bigbluebutton.web.serverURL=192.168.246.131
+# Do not commit changes to this field.
+bigbluebutton.web.serverURL=https://bigbluebutton.example.com
 
 
 #----------------------------------------------------
@@ -326,5 +327,8 @@ lockSettingsLockOnJoin=true
 lockSettingsLockOnJoinConfigurable=false
 
 allowDuplicateExtUserid=true
+<<<<<<< HEAD
 
-defaultTextTrackUrl=${bigbluebutton.web.serverURL}/bigbluebutton
\ No newline at end of file
+defaultTextTrackUrl=${bigbluebutton.web.serverURL}/bigbluebutton
+=======
+>>>>>>> 40d87e801950a9c22332dff0500564f930059238
diff --git a/record-and-playback/core/lib/recordandplayback.rb b/record-and-playback/core/lib/recordandplayback.rb
index f45bb4a2e9086dca742450e9a10f2c60d7b2d04f..04bd6e07ac07a15bc74166bdee5a8cc9126d9796 100755
--- a/record-and-playback/core/lib/recordandplayback.rb
+++ b/record-and-playback/core/lib/recordandplayback.rb
@@ -160,7 +160,7 @@ module BigBlueButton
         http.head(uri.request_uri)
       }
       unless response.is_a? Net::HTTPSuccess
-        raise "File not available: #{respose.message}"
+        raise "File not available: #{response.message}"
       end
     end