diff --git a/README.md b/README.md index b4da36622b23..7a81a71e478a 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ And many more! ## Using Jitsi Meet -Using Jitsi Meet is straightforward, as it's browser based. Head over to [meet.jit.si](https://meet.jit.si) and give it a try. It's anonymous, scalable and free to use. All browsers are supported! +Using Jitsi Meet is straightforward, as it's browser based. Head over to [meet.jit.si](https://meet.jit.si) and give it a try. It's scalable and free to use. All you need is a Google, Facebook or GitHub account in order to start a meeting. All browsers are supported! Using mobile? No problem, you can either use your mobile web browser or our fully-featured mobile apps: diff --git a/config.js b/config.js index bc408ce37d37..5c4acb8d21b8 100644 --- a/config.js +++ b/config.js @@ -378,7 +378,7 @@ var config = { // DEPRECATED. Use transcription.preferredLanguage instead. // preferredTranscribeLanguage: 'en-US', - // DEPRECATED. Use transcription.autoCaptionOnRecord instead. + // DEPRECATED. Use transcription.autoTranscribeOnRecord instead. // autoCaptionOnRecord: false, // Transcription options. @@ -410,8 +410,8 @@ var config = { // // Disable start transcription for all participants. // disableStartForAll: false, - // // Enables automatic turning on captions when recording is started - // autoCaptionOnRecord: false, + // // Enables automatic turning on transcribing when recording is started + // autoTranscribeOnRecord: false, // }, // Misc diff --git a/css/_recording.scss b/css/_recording.scss index c95ae8a74c4e..10d5f2d6cdaf 100644 --- a/css/_recording.scss +++ b/css/_recording.scss @@ -15,6 +15,10 @@ font-size: 14px; margin-left: 16px; max-width: 70%; + + &-no-space { + margin-left: 0; + } } &.space-top { diff --git a/lang/main-ar.json b/lang/main-ar.json index 4ab43173c1aa..a4d1034972c4 100644 --- a/lang/main-ar.json +++ b/lang/main-ar.json @@ -557,8 +557,6 @@ "youtubeTerms": "شروط خدمة يوتيوب" }, "lobby": { - "admit": "سمح بالدخول", - "admitAll": "سمح للجميع بالدخول", "allow": "اسمح", "backToKnockModeButton": "لا يوجد كلمة مرور، اطلب الإذن بالدخول بدلًا من ذلك.", "chat": "دردشة", @@ -593,8 +591,6 @@ "notificationTitle": "غرفة الانتظار", "passwordField": "أدخل كلمة الدخول إلى المُلتقى", "passwordJoinButton": "انضم", - "reject": "رفض", - "rejectAll": "رفض الكل", "title": "غرفة الانتظار", "toggleLabel": "فعِّل غرفة الانتظار" }, @@ -720,6 +716,8 @@ }, "participantsPane": { "actions": { + "admit": "سمح بالدخول", + "admitAll": "سمح للجميع بالدخول", "allow": "السماح للحاضرين بـ:", "allowVideo": "السماح بالفيديو", "askUnmute": "اطلب إعادة الصوت", @@ -732,6 +730,7 @@ "mute": "كتم الصوت", "muteAll": "كتم الكل", "muteEveryoneElse": "كتم صوت الآخرين", + "reject": "رفض", "stopEveryonesVideo": "أوقف فيديو الجميع", "stopVideo": "أوقف الفيديو", "unblockEveryoneMicCamera": "قم بإلغاء حظر ميكروفون وكاميرا الجميع", diff --git a/lang/main-bg.json b/lang/main-bg.json index d39538276c52..977a23f88307 100644 --- a/lang/main-bg.json +++ b/lang/main-bg.json @@ -420,8 +420,6 @@ "youtubeTerms": "Условия за ползване на YouTube" }, "lobby": { - "admit": "Допусни", - "allow": "Разреши", "backToKnockModeButton": "Заявка за включване без парола", "dialogTitle": "Режим лоби", "disableDialogContent": "Режим Лоби е включен. Този решим защитава срещите Ви от случайни посетители. Искате ли да го изключите?", @@ -450,7 +448,6 @@ "notificationTitle": "Лоби", "passwordField": "Въведи парола за срещата", "passwordJoinButton": "Влез", - "reject": "Откажи", "title": "Лоби", "toggleLabel": "Включи лоби" }, @@ -521,6 +518,13 @@ "suboptimalExperienceTitle": "Внимание", "unmute": "Пускане на микрофона" }, + "participantsPane": { + "actions": { + "admit": "Допусни", + "allow": "Разреши", + "reject": "Откажи" + } + }, "passwordDigitsOnly": "До {{number}} цифри", "passwordSetRemotely": "зададена от друг участник", "poweredby": "с подкрепата на", diff --git a/lang/main-ca.json b/lang/main-ca.json index 6edbe8d45e3c..1fc23db9b9d0 100644 --- a/lang/main-ca.json +++ b/lang/main-ca.json @@ -561,8 +561,6 @@ "youtubeTerms": "Condicions de servei de YouTube" }, "lobby": { - "admit": "Admet", - "admitAll": "Admet tothom", "allow": "Permet", "backToKnockModeButton": "Demaneu per a unir-vos", "chat": "Xat", @@ -597,8 +595,6 @@ "notificationTitle": "Sala d'espera", "passwordField": "Introduïu la contrasenya de la reunió", "passwordJoinButton": "Entra", - "reject": "Rebuja", - "rejectAll": "Rebutja-ho tot", "title": "Sala d'espera", "toggleLabel": "Activa la sala d'espera" }, @@ -727,6 +723,8 @@ }, "participantsPane": { "actions": { + "admit": "Admet", + "admitAll": "Admet tothom", "allow": "Permet als assistents:", "allowVideo": "Permet el vídeo", "askUnmute": "Demanar l'activació el micròfon", @@ -739,6 +737,7 @@ "mute": "Silenciar", "muteAll": "Silencia tothom", "muteEveryoneElse": "Silenciar tothom", + "reject": "Rebuja", "stopEveryonesVideo": "Atura el vídeo a tothom", "stopVideo": "Atura el vídeo", "unblockEveryoneMicCamera": "Desbloquejar el micròfon i la càmera de tothom", diff --git a/lang/main-cs.json b/lang/main-cs.json index 4d83c0bfdba6..61fda818c428 100644 --- a/lang/main-cs.json +++ b/lang/main-cs.json @@ -557,8 +557,6 @@ "youtubeTerms": "Podmínky používání YouTube" }, "lobby": { - "admit": "", - "admitAll": "", "allow": "Povolit", "backToKnockModeButton": "Žádné heslo, místo toho požádat o přijetí", "chat": "", @@ -593,7 +591,6 @@ "notificationTitle": "Předsálí", "passwordField": "Zadejte heslo setkání", "passwordJoinButton": "Vstoupit", - "reject": "Odmítnout", "title": "Předsálí", "toggleLabel": "Zapnout předsálí" }, @@ -719,22 +716,7 @@ }, "participantsPane": { "actions": { - "allow": "", - "allowVideo": "", - "askUnmute": "", - "audioModeration": "", - "blockEveryoneMicCamera": "", - "invite": "", - "moreModerationActions": "", - "moreModerationControls": "", - "moreParticipantOptions": "", - "mute": "", - "muteAll": "", - "muteEveryoneElse": "", - "stopEveryonesVideo": "", - "stopVideo": "", - "unblockEveryoneMicCamera": "", - "videoModeration": "" + "reject": "Odmítnout" }, "close": "", "header": "", diff --git a/lang/main-de.json b/lang/main-de.json index ac3035563006..7cfc12663c82 100644 --- a/lang/main-de.json +++ b/lang/main-de.json @@ -636,8 +636,6 @@ "youtubeTerms": "YouTube-Nutzungsbedingungen" }, "lobby": { - "admit": "Zulassen", - "admitAll": "Alle zulassen", "backToKnockModeButton": "Kein Passwort, stattdessen Beitritt anfragen", "chat": "Chat", "dialogTitle": "Lobbymodus", @@ -671,8 +669,6 @@ "notificationLobbyEnabled": "{{originParticipantName}} hat die Lobby aktiviert", "notificationTitle": "Lobby", "passwordJoinButton": "Beitreten", - "reject": "Ablehnen", - "rejectAll": "Alle ablehnen", "title": "Lobby", "toggleLabel": "Lobby aktivieren" }, @@ -807,6 +803,8 @@ }, "participantsPane": { "actions": { + "admit": "Zulassen", + "admitAll": "Alle zulassen", "allow": "Anwesenden erlauben:", "allowVideo": "Kamera einschalten", "askUnmute": "Anfragen, Stummschaltung aufzuheben", @@ -819,6 +817,7 @@ "mute": "Stummschalten", "muteAll": "Alle stummschalten", "muteEveryoneElse": "Alle anderen stummschalten", + "reject": "Ablehnen", "stopEveryonesVideo": "Alle Kameras ausschalten", "stopVideo": "Kamera ausschalten", "unblockEveryoneMicCamera": "Kamera und Mikrofon von allen entsperren", @@ -918,7 +917,7 @@ "joinWithoutAudio": "Ohne Ton beitreten", "keyboardShortcuts": "Tastaturkurzbefehle aktivieren", "linkCopied": "Link in die Zwischenablage kopiert", - "lookGood": "Ihr Mikrofon scheint zu funktionieren.", + "lookGood": "Alles scheint zu funktionieren.", "or": "oder", "premeeting": "Vorschau", "proceedAnyway": "Trotzdem fortsetzen", @@ -1154,7 +1153,7 @@ "toolbar": { "Settings": "Einstellungen", "accessibilityLabel": { - "Settings": "Einstellungen ein-/ausschalten", + "Settings": "Einstellungen einschalten", "audioOnly": "„Nur Audio“ ein-/ausschalten", "audioRoute": "Audiogerät auswählen", "boo": "Buhen", @@ -1200,7 +1199,7 @@ "moreActions": "Menü „Weitere Einstellungen“ ein-/ausschalten", "moreActionsMenu": "Menü „Weitere Einstellungen“", "moreOptions": "Menü „Weitere Optionen“", - "mute": "Mikrofon aktivieren / deaktivieren", + "mute": "Mikrofon deaktivieren", "muteEveryone": "Alle stummschalten", "muteEveryoneElse": "Alle anderen stummschalten", "muteEveryoneElsesVideoStream": "Alle anderen Kameras ausschalten", @@ -1238,7 +1237,7 @@ "toggleFilmstrip": "Miniaturansichten ein-/ausschalten", "unmute": "Stummschaltung aufheben", "videoblur": "Unscharfer Hintergrund ein-/ausschalten", - "videomute": "„Video stummschalten“ ein-/ausschalten", + "videomute": "Kamera stoppen", "videomuteGUMPending": "Verbinde Ihre Kamera", "videounmute": "Kamera einschalten" }, @@ -1287,7 +1286,7 @@ "lowerYourHand": "Hand senken", "moreActions": "Weitere Einstellungen", "moreOptions": "Weitere Optionen", - "mute": "Stummschalten", + "mute": "Audio stummschalten", "muteEveryone": "Alle stummschalten", "muteEveryonesVideo": "Alle Kameras ausschalten", "muteGUMPending": "Verbinde Ihre Kamera", diff --git a/lang/main-dsb.json b/lang/main-dsb.json index 65df62825009..ea702ffaa2c3 100644 --- a/lang/main-dsb.json +++ b/lang/main-dsb.json @@ -563,8 +563,6 @@ "youtubeTerms": "wužywaŕske wustawki za youtube" }, "lobby": { - "admit": "pśizwóliś", - "admitAll": "wšyknym pśizwólenje daś", "backToKnockModeButton": "mimo kodowego słowa, město togo wó pśistup pšosyś", "chat": "chat", "dialogTitle": "lobbyjowy modus", @@ -598,8 +596,6 @@ "notificationTitle": "lobby", "passwordField": "kodowe słowo za konferencu zapódaś", "passwordJoinButton": "pśistupiś", - "reject": "wótpokazaś", - "rejectAll": "wšykne wótpokazaś", "title": "", "toggleLabel": "lobby aktiwěrowaś / deaktiwěrowaś" }, @@ -730,6 +726,8 @@ }, "participantsPane": { "actions": { + "admit": "pśizwóliś", + "admitAll": "wšyknym pśizwólenje daś", "allow": "wobźělnikam pšawo daś:", "allowVideo": "kameru aktiwěrowaś", "askUnmute": "pšosbu wó anulěrowanje wuśišenja stajiś", @@ -742,6 +740,7 @@ "mute": "wuśišyś", "muteAll": "wšyknych wuśišyś", "muteEveryoneElse": "wšykne druge wuśišyś", + "reject": "wótpokazaś", "stopEveryonesVideo": "wšykne kamery wušaltowaś", "stopVideo": "kameru wušaltowaś", "unblockEveryoneMicCamera": "blokěrowane kamery a mikrofon wšyknych zasej aktiwěrowaś", diff --git a/lang/main-el.json b/lang/main-el.json index 078d423f0016..454b9743633d 100644 --- a/lang/main-el.json +++ b/lang/main-el.json @@ -580,8 +580,6 @@ "youtubeTerms": "Όροι υπηρεσιών YouTube" }, "lobby": { - "admit": "Αποδοχή", - "admitAll": "Αποδοχή όλων", "backToKnockModeButton": "Αίτημα εισόδου", "chat": "Συνομιλία", "dialogTitle": "Λειτουργία υποδοχής", @@ -615,8 +613,6 @@ "notificationTitle": "Υποδοχή", "passwordField": "Εισάγετε τον κωδικό σύσκεψης", "passwordJoinButton": "Συμμετοχή", - "reject": "Απόρριψη", - "rejectAll": "Απόρριψη όλων", "title": "Υποδοχή", "toggleLabel": "Ενεργοποίηση υποδοχής" }, @@ -745,6 +741,8 @@ }, "participantsPane": { "actions": { + "admit": "Αποδοχή", + "admitAll": "Αποδοχή όλων", "allow": "Επιτρέψτε στους συμμετέχοντες να:", "allowVideo": "Επιτρέψτε το βίντεο", "askUnmute": "Αίτηση για κατάργηση σίγησης", @@ -757,6 +755,7 @@ "mute": "Σίγηση", "muteAll": "Σίγηση όλων", "muteEveryoneElse": "Σίγηση όλων των άλλων", + "reject": "Απόρριψη", "stopEveryonesVideo": "Διακοπή όλων των βίντεο", "stopVideo": "Διακοπή του βίντεο", "unblockEveryoneMicCamera": "Επιτρέψτε τα μικρόφωνα και τις κάμερες όλων", diff --git a/lang/main-eo.json b/lang/main-eo.json index 2947722bc30f..2f79904d9983 100644 --- a/lang/main-eo.json +++ b/lang/main-eo.json @@ -561,8 +561,6 @@ "youtubeTerms": "Uzkondiĉoj de YouTube" }, "lobby": { - "admit": "Akcepti", - "admitAll": "Akcepti ĉion", "allow": "Permesi", "backToKnockModeButton": "Petu por aliĝi", "chat": "Babilejo", @@ -597,8 +595,6 @@ "notificationTitle": "Atendejo", "passwordField": "Entajpu pasvorton de la renkontiĝo", "passwordJoinButton": "Aliĝi", - "reject": "Malakceptu", - "rejectAll": "Malakceptu ĉion", "title": "Atendejo", "toggleLabel": "Ŝaltu atendejon" }, @@ -725,6 +721,8 @@ }, "participantsPane": { "actions": { + "admit": "Akcepti", + "admitAll": "Akcepti ĉion", "allow": "Al la partoprenantoj permesi:", "allowVideo": "Permesi kameraon", "askUnmute": "Peti malsilentigi", @@ -737,6 +735,7 @@ "mute": "Silentigi", "muteAll": "Silentigi ĉiujn", "muteEveryoneElse": "Silentigi ĉiujn aliajn", + "reject": "Malakceptu", "stopEveryonesVideo": "Ĉesigu ĉies videaĵon", "stopVideo": "Ĉesigu la videaĵon", "unblockEveryoneMicCamera": "Malbloku ĉies mikrofonon kaj kameraon", diff --git a/lang/main-es.json b/lang/main-es.json index e5b31fccd478..3d9c05d2d905 100644 --- a/lang/main-es.json +++ b/lang/main-es.json @@ -598,8 +598,6 @@ "youtubeTerms": "Términos de servicios de YouTube" }, "lobby": { - "admit": "Admitir", - "admitAll": "Admitir todo", "backToKnockModeButton": "No hay contraseña, pide permiso para entrar.", "chat": "Chat", "dialogTitle": "Sala de espera", @@ -633,8 +631,6 @@ "notificationTitle": "Sala de espera", "passwordField": "Introduce la contraseña de la reunión", "passwordJoinButton": "Entrar", - "reject": "Rechazar", - "rejectAll": "Rechazar todo", "title": "Sala de espera", "toggleLabel": "Activar sala de espera" }, @@ -768,6 +764,8 @@ }, "participantsPane": { "actions": { + "admit": "Admitir", + "admitAll": "Admitir todo", "allow": "Permitir a los asistentes:", "allowVideo": "Permitir vídeo", "askUnmute": "Pida que le quiten el silencio", @@ -780,6 +778,7 @@ "mute": "Silenciar", "muteAll": "Silenciar a todos", "muteEveryoneElse": "Silenciar al resto", + "reject": "Rechazar", "stopEveryonesVideo": "Detener el vídeo de todos", "stopVideo": "Detener el vídeo", "unblockEveryoneMicCamera": "Desbloquear el micrófono y la cámara de todos", diff --git a/lang/main-esUS.json b/lang/main-esUS.json index 6fd3213aa89b..f4b0b85775e3 100644 --- a/lang/main-esUS.json +++ b/lang/main-esUS.json @@ -521,8 +521,6 @@ "youtubeTerms": "Términos de servicios de YouTube" }, "lobby": { - "admit": "Admitir", - "admitAll": "Admitir todo", "allow": "permitir", "backToKnockModeButton": "No hay contraseña, pide permiso para entrar.", "dialogTitle": "Sala de espera", @@ -553,8 +551,6 @@ "notificationTitle": "Sala de espera", "passwordField": "Introduce la contraseña de la reunión", "passwordJoinButton": "Entrar", - "reject": "Rechazar", - "rejectAll": "Rechazar todo", "title": "Sala de espera", "toggleLabel": "Activar sala de espera" }, @@ -652,6 +648,8 @@ }, "participantsPane": { "actions": { + "admit": "Admitir", + "admitAll": "Admitir todo", "allow": "Permitir a los asistentes:", "allowVideo": "Permitir vídeo", "askUnmute": "Pida que le quiten el silencio", @@ -661,6 +659,7 @@ "mute": "Silenciar", "muteAll": "Silenciar a todos los demás", "muteEveryoneElse": "Silenciar al resto", + "reject": "Rechazar", "stopEveryonesVideo": "Detener el vídeo de todos", "stopVideo": "Detener el vídeo", "unblockEveryoneMicCamera": "Desbloquear el micrófono y la cámara de todos", diff --git a/lang/main-eu.json b/lang/main-eu.json index f8ff424fbbd8..32d49bffcff5 100644 --- a/lang/main-eu.json +++ b/lang/main-eu.json @@ -463,8 +463,6 @@ "youtubeTerms": "YouTuberen erabilpen baldintzak" }, "lobby": { - "admit": "Onartu", - "admitAll": "Onartu guztiak", "allow": "Baimendu", "backToKnockModeButton": "Ez du pasahitza erabili, baina sartzea eskatu du", "dialogTitle": "Itxaron-gela modua", @@ -494,7 +492,6 @@ "notificationTitle": "Itxaron-gela", "passwordField": "Idatzi bileraren pasahitza", "passwordJoinButton": "Sartu", - "reject": "Baztertu", "title": "Itxaron-gela", "toggleLabel": "Itxaron-gela aktibatu" }, @@ -576,8 +573,11 @@ }, "participantsPane": { "actions": { + "admit": "Onartu", + "admitAll": "Onartu guztiak", "invite": "Gonbidatu norbait", "muteAll": "Ixilarazi guztiak", + "reject": "Baztertu", "stopVideo": "Gelditu bideoa" }, "close": "Itxi", diff --git a/lang/main-fa.json b/lang/main-fa.json index eff0544c8dc5..06cdcc534129 100644 --- a/lang/main-fa.json +++ b/lang/main-fa.json @@ -606,8 +606,6 @@ "youtubeTerms": "شرایط خدمات یوتیوب" }, "lobby": { - "admit": "پذیرفتن", - "admitAll": "پذیرفتن همه", "backToKnockModeButton": "درخواست برای پیوستن", "chat": "گپ", "dialogTitle": "حالت اتاق انتظار", @@ -641,8 +639,6 @@ "notificationTitle": "اتاق انتظار", "passwordField": "گذرواژهٔ جلسه را وارد کنید", "passwordJoinButton": "پیوستن", - "reject": "ردکردن", - "rejectAll": "ردکردن همه", "title": "اتاق انتظار", "toggleLabel": "فعال‌کردن اتاق انتظار" }, @@ -776,6 +772,8 @@ }, "participantsPane": { "actions": { + "admit": "پذیرفتن", + "admitAll": "پذیرفتن همه", "allow": "به حاضران اجازه دهید:", "allowVideo": "اجازهٔ ویدیو", "askUnmute": "درخواست وصل‌کردن صدا", @@ -788,6 +786,7 @@ "mute": "بی‌صداکردن", "muteAll": "بی‌صداکردن همه", "muteEveryoneElse": "بی‌صداکردن بقیه افراد", + "reject": "ردکردن", "stopEveryonesVideo": "توقف ویدیوی همه", "stopVideo": "توقف ویدیو", "unblockEveryoneMicCamera": "رفع مسدودی میکروفون و دوربین همه", diff --git a/lang/main-fr.json b/lang/main-fr.json index 7463887dc2d4..c5c5f9f71348 100644 --- a/lang/main-fr.json +++ b/lang/main-fr.json @@ -584,8 +584,6 @@ "youtubeTerms": "Conditions d'utilisation de YouTube" }, "lobby": { - "admit": "Accepter", - "admitAll": "Tout accepter", "backToKnockModeButton": "Aucun mot de passe, demander à rejoindre plutôt", "chat": "Chat", "dialogTitle": "Mode salle d'attente", @@ -619,8 +617,6 @@ "notificationTitle": "Salle d'attente", "passwordField": "Veuillez saisir le mot de passe de la réunion", "passwordJoinButton": "Rejoindre", - "reject": "Refuser", - "rejectAll": "Refuser tout", "title": "Salle d'attente", "toggleLabel": "Activer la salle d'attente" }, @@ -751,6 +747,8 @@ }, "participantsPane": { "actions": { + "admit": "Accepter", + "admitAll": "Tout accepter", "allow": "Autoriser les participants à:", "allowVideo": "permettre la vidéo", "askUnmute": "Demander de réactiver le micro", @@ -763,6 +761,7 @@ "mute": "Couper le micro", "muteAll": "Couper le micro de tout le monde", "muteEveryoneElse": "Couper le micro de tous les autres", + "reject": "Refuser", "stopEveryonesVideo": "Couper toutes les caméras", "stopVideo": "Couper la vidéo", "unblockEveryoneMicCamera": "Débloquer tous les micros et caméras", diff --git a/lang/main-hi.json b/lang/main-hi.json index 21cfacd6057f..213e970309f7 100644 --- a/lang/main-hi.json +++ b/lang/main-hi.json @@ -482,7 +482,6 @@ "notificationTitle": "लॉबी", "passwordField": "मीटिंग पासवर्ड दर्ज करें", "passwordJoinButton": "Join", - "reject": "अस्वीकार", "title": "लॉबी", "toggleLabel": "लॉबी सक्षम करें" }, @@ -559,6 +558,11 @@ "videoMutedRemotelyDescription": "You can always turn it on again.", "videoMutedRemotelyTitle": "आपका कैमरा {{participantDisplayName}}द्वारा अक्षम कर दिया गया है!" }, + "participantsPane": { + "actions": { + "reject": "अस्वीकार" + } + }, "passwordDigitsOnly": "Up to {{number}} digits", "passwordSetRemotely": "दूसरे प्रतिभागी द्वारा निर्धारित", "poweredby": "powered by", diff --git a/lang/main-hr.json b/lang/main-hr.json index ab9a9c41376b..9a5d23d82605 100644 --- a/lang/main-hr.json +++ b/lang/main-hr.json @@ -561,8 +561,6 @@ "youtubeTerms": "Uvjeti YouTube usluge" }, "lobby": { - "admit": "Prihvati", - "admitAll": "Prihvati sve", "allow": "Dopusti", "backToKnockModeButton": "Zatraži pridruživanje", "chat": "Chat", @@ -597,8 +595,6 @@ "notificationTitle": "Predvorje", "passwordField": "Upiši lozinku sastanka", "passwordJoinButton": "Pridruži se", - "reject": "Odbij", - "rejectAll": "Odbij sve", "title": "Predvorje", "toggleLabel": "Uključi predvorje" }, @@ -725,6 +721,8 @@ }, "participantsPane": { "actions": { + "admit": "Prihvati", + "admitAll": "Prihvati sve", "allow": "Dozvoli sudionicima da:", "allowVideo": "Dozvole video", "askUnmute": "Zatraže isključivanje zvuka", @@ -737,6 +735,7 @@ "mute": "Isključe zvuk", "muteAll": "Isključe zvuk svih sudionika", "muteEveryoneElse": "Isključe zvuk svih drugih", + "reject": "Odbij", "stopEveryonesVideo": "Prekinu videa svih", "stopVideo": "Prekinu video", "unblockEveryoneMicCamera": "Deblokiraju mikrofone i kamere svih sudionika", diff --git a/lang/main-hsb.json b/lang/main-hsb.json index 29e44c461a77..514c23567020 100644 --- a/lang/main-hsb.json +++ b/lang/main-hsb.json @@ -551,8 +551,6 @@ "youtubeTerms": "wuměnjenja wužiwanja na YouTube" }, "lobby": { - "admit": "přizwolić", - "admitAll": "wšitko přizwolić", "allow": "přiwzać", "backToKnockModeButton": "žane hesło, město toho wo přistup prosyć", "chat": "chat", @@ -587,8 +585,6 @@ "notificationTitle": "lobby", "passwordField": "konferencne hesło zapodać", "passwordJoinButton": "přistupić", - "reject": "wotpokazać", - "rejectAll": "wšitko wotpokazać", "title": "lobby", "toggleLabel": "lobby aktiwěrować" }, @@ -710,6 +706,8 @@ }, "participantsPane": { "actions": { + "admit": "přizwolić", + "admitAll": "wšitko přizwolić", "allow": "přitomnym dowolić", "allowVideo": "kameru zaswěčić", "askUnmute": "wo wotstajenje šaltowanja na němosć prosyć", @@ -722,6 +720,7 @@ "mute": "něme šaltować", "muteAll": "wšěch němych šaltować", "muteEveryoneElse": "wšěch druhich němych šaltować", + "reject": "wotpokazać", "stopEveryonesVideo": "wšitke kamery hasnyć", "stopVideo": "kameru hasnyć", "unblockEveryoneMicCamera": "kameru a mikrofon wšěch wočinić", diff --git a/lang/main-hu.json b/lang/main-hu.json index 83a03a3ea507..66d6fe199b6b 100644 --- a/lang/main-hu.json +++ b/lang/main-hu.json @@ -462,8 +462,6 @@ "youtubeTerms": "YouTube szolgáltatási feltételek" }, "lobby": { - "admit": "Engedélyezés", - "admitAll": "Mindet engedélyez", "allow": "Engedélyez", "backToKnockModeButton": "Csatlakozási kérelem küldése", "chat": "Chat", @@ -495,8 +493,6 @@ "notificationTitle": "Lobby", "passwordField": "Adja meg az értekezlet jelszavát", "passwordJoinButton": "Csatlakozás", - "reject": "Elutasít", - "rejectAll": "Mindet elutasít", "toggleLabel": "Lobby engedélyezése" }, "localRecording": { @@ -579,6 +575,8 @@ }, "participantsPane": { "actions": { + "admit": "Engedélyezés", + "admitAll": "Mindet engedélyez", "allow": "Engedélyezés a résztvevőknek, hogy:", "allowVideo": "Videó engedélyezése", "askUnmute": "Kérje a némítás feloldását", @@ -591,6 +589,7 @@ "mute": "Némítás", "muteAll": "Mindenkit elnémít", "muteEveryoneElse": "Mute everyone else", + "reject": "Elutasít", "stopEveryonesVideo": "Mindenki videójának leállítása", "stopVideo": "Videó leállítása", "unblockEveryoneMicCamera": "Unblock everyone's mic and camera", diff --git a/lang/main-it.json b/lang/main-it.json index d3ceab8b2215..d010b8d0fb35 100644 --- a/lang/main-it.json +++ b/lang/main-it.json @@ -561,8 +561,6 @@ "youtubeTerms": "Condizioni di utilizzo di YouTube" }, "lobby": { - "admit": "Ammetti", - "admitAll": "Ammetti tutti", "allow": "Autorizza", "backToKnockModeButton": "Nessuna password, richiedi l'accesso", "chat": "Conversazione", @@ -597,8 +595,6 @@ "notificationTitle": "Sala d'attesa", "passwordField": "Inserisci la password della riunione", "passwordJoinButton": "Entra", - "reject": "Respingi", - "rejectAll": "Respingi tutti", "title": "Sala d'attesa", "toggleLabel": "Attiva sala d'attesa" }, @@ -725,6 +721,8 @@ }, "participantsPane": { "actions": { + "admit": "Ammetti", + "admitAll": "Ammetti tutti", "allow": "Permetti ai partecipanti di:", "allowVideo": "Autorizza video", "askUnmute": "Chiedi di accendere microfono", @@ -737,6 +735,7 @@ "mute": "Silenzia", "muteAll": "Silenzia tutti", "muteEveryoneElse": "Silenzia tutti gli altri", + "reject": "Respingi", "stopEveryonesVideo": "Ferma il video di tutti", "stopVideo": "Ferma il video", "unblockEveryoneMicCamera": "Sblocca audio e video a tutti", diff --git a/lang/main-ja.json b/lang/main-ja.json index 1174c5b456b7..ed89e50b6995 100644 --- a/lang/main-ja.json +++ b/lang/main-ja.json @@ -525,8 +525,6 @@ "youtubeTerms": "YouTube サービス利用規約" }, "lobby": { - "admit": "許可", - "admitAll": "全員許可", "allow": "許可", "backToKnockModeButton": "参加を依頼", "dialogTitle": "ロビーモード", @@ -557,8 +555,6 @@ "notificationTitle": "ロビー", "passwordField": "ミーティングパスワードを入力してください", "passwordJoinButton": "参加", - "reject": "却下", - "rejectAll": "全員却下", "title": "ロビー", "toggleLabel": "ロビーを有効" }, @@ -671,6 +667,8 @@ }, "participantsPane": { "actions": { + "admit": "許可", + "admitAll": "全員許可", "allow": "参加者に次のことを許可:", "allowVideo": "ビデオを許可", "askUnmute": "ミュート解除を依頼", @@ -683,6 +681,7 @@ "mute": "ミュート", "muteAll": "全員をミュート", "muteEveryoneElse": "他のすべての人をミュート", + "reject": "却下", "stopEveryonesVideo": "全員のビデオを停止", "stopVideo": "ビデオを停止", "unblockEveryoneMicCamera": "全員のマイクとビデオのブロックを解除", diff --git a/lang/main-kab.json b/lang/main-kab.json index 78d3be99aa60..077181efea44 100644 --- a/lang/main-kab.json +++ b/lang/main-kab.json @@ -498,8 +498,6 @@ "youtubeTerms": "Tiwtilin n yimeẓla n Youtube" }, "lobby": { - "admit": "Steεref", - "admitAll": "Steεref s kullec", "allow": "Sireg", "backToKnockModeButton": "Ulac awal uffir, suter attekki deg ubdil-is", "dialogTitle": "Askar Lobby", @@ -530,8 +528,6 @@ "notificationTitle": "Taxxamt n uraǧu", "passwordField": "Sekcem awal uffir n temlilit", "passwordJoinButton": "Semlil", - "reject": "Agi", - "rejectAll": "Agi akk", "title": "Taxxamt n uraǧu", "toggleLabel": "Rmed Lobby" }, @@ -628,6 +624,8 @@ }, "participantsPane": { "actions": { + "admit": "Steεref", + "admitAll": "Steεref s kullec", "allow": "Sireg i yimttekkiyen ad:", "allowVideo": "Sireg tavidyut", "askUnmute": "Suter tririt n ṣṣut", @@ -637,6 +635,7 @@ "mute": "Asusam", "muteAll": "Sgugem meṛṛa", "muteEveryoneElse": "Sgugem-iten i meṛṛa", + "reject": "Agi", "stopEveryonesVideo": "Seḥbes tavidyut n yal yiwen", "stopVideo": "Seḥbes tavidyut n Youtube", "unblockEveryoneMicCamera": "Serreḥ i usawaḍ d tkamiṛat n yal yiwen", diff --git a/lang/main-lv.json b/lang/main-lv.json index 52514b70a560..fe3d63c6693f 100644 --- a/lang/main-lv.json +++ b/lang/main-lv.json @@ -642,8 +642,6 @@ "youtubeTerms": "YouTube pakalpojumu sniegšanas noteikumi" }, "lobby": { - "admit": "Apstiprināt", - "admitAll": "Apstiprināt visus", "backToKnockModeButton": "Pajautāt pievienoties", "chat": "Tērzēšana", "dialogTitle": "Vestibila režīms", @@ -677,8 +675,6 @@ "notificationLobbyEnabled": "Vestibilu iespējoja {{originParticipantName}}", "notificationTitle": "Vestibils", "passwordJoinButton": "Pievienoties", - "reject": "Noraidīt", - "rejectAll": "Noraidīt visus", "title": "Vestibils", "toggleLabel": "Iespējot vestibilu" }, @@ -816,6 +812,8 @@ }, "participantsPane": { "actions": { + "admit": "Apstiprināt", + "admitAll": "Apstiprināt visus", "allow": "Atļaut dalībniekiem:", "allowVideo": "Atļaut video", "askUnmute": "Lūgt ieslēgt skaņu", @@ -829,6 +827,7 @@ "mute": "Apklusināt", "muteAll": "Apklusināt visus", "muteEveryoneElse": "Apklusināt pārējos", + "reject": "Noraidīt", "stopEveryonesVideo": "Izslēgt visiem video", "stopVideo": "Izslēgt video", "unblockEveryoneMicCamera": "Atbloķēt visiem mikrofonu un kameru", diff --git a/lang/main-ml.json b/lang/main-ml.json index 9d97ab2dbada..ca525406d5a9 100644 --- a/lang/main-ml.json +++ b/lang/main-ml.json @@ -464,7 +464,6 @@ "notificationTitle": "ലോബി", "passwordField": "മീറ്റിംഗ് പാസ്‌വേഡ് നൽകുക", "passwordJoinButton": "ചേരുക", - "reject": "നിരസിക്കുക", "title": "ലോബി", "toggleLabel": "ലോബി പ്രവർത്തനക്ഷമമാക്കുക" }, @@ -539,6 +538,11 @@ "suboptimalExperienceTitle": "ബ്രൗസർ മുന്നറിയിപ്പ്", "unmute": "അൺമ്യൂട്ട്" }, + "participantsPane": { + "actions": { + "reject": "നിരസിക്കുക" + } + }, "passwordDigitsOnly": "{{number}} അക്കങ്ങൾ വരെ", "passwordSetRemotely": "മറ്റൊരു പങ്കാളി സജ്ജമാക്കിയത്", "poweredby": "powered by", diff --git a/lang/main-mn.json b/lang/main-mn.json index 73651ce5d709..a029acd932d1 100644 --- a/lang/main-mn.json +++ b/lang/main-mn.json @@ -586,8 +586,6 @@ "youtubeTerms": "YouTube үйлчилгээний нөхцөл" }, "lobby": { - "admit": "Ok", - "admitAll": "Бүгдийг зөвшөөр", "backToKnockModeButton": "Зөвшөөрөл хүсэх", "chat": "Зурвас", "dialogTitle": "Лобби горим", @@ -621,8 +619,6 @@ "notificationTitle": "Лобби", "passwordField": "Нууц үгээ оруулна уу", "passwordJoinButton": "Оролцох", - "reject": "Татгалзах", - "rejectAll": "Бүгдийг татгалзуулах", "title": "Лобби", "toggleLabel": "Лобби идэвхижүүлэх" }, @@ -755,6 +751,8 @@ }, "participantsPane": { "actions": { + "admit": "Ok", + "admitAll": "Бүгдийг зөвшөөр", "allow": "Оролцогчийг зөвшөөрөх:", "allowVideo": "Дүрс зөвшөөрөх", "askUnmute": "Дуугаа нээхийг хүсэх", @@ -767,6 +765,7 @@ "mute": "Дуугүй болгох", "muteAll": "Бүгдийг дуугүй болгох", "muteEveryoneElse": "Бүгдийг дуугүй болгох", + "reject": "Татгалзах", "stopEveryonesVideo": "Бүгдийн дүрсийг хаах", "stopVideo": "Дүрс хаах", "unblockEveryoneMicCamera": "Бүх хүний микрофон, камерыг нээх", diff --git a/lang/main-nl.json b/lang/main-nl.json index 08cc217b82b6..14d94e7e42bd 100644 --- a/lang/main-nl.json +++ b/lang/main-nl.json @@ -486,8 +486,6 @@ "youtubeTerms": "Servicevoorwaarden YouTube" }, "lobby": { - "admit": "Toelaten", - "admitAll": "Allen toelaten", "allow": "Toestaan", "backToKnockModeButton": "Geen wachtwoord, vraag om deel te mogen nemen", "dialogTitle": "Lobby-modus", @@ -519,8 +517,6 @@ "notificationTitle": "Lobby", "passwordField": "Voer wachtwoord voor vergadering in", "passwordJoinButton": "Deelnemen", - "reject": "Afwijzen", - "rejectAll": "Allen afwijzen", "title": "Lobby", "toggleLabel": "Lobby inschakelen" }, @@ -624,6 +620,8 @@ }, "participantsPane": { "actions": { + "admit": "Toelaten", + "admitAll": "Allen toelaten", "allow": "Sta deelnemers toe:", "allowVideo": "Video toestaan", "askUnmute": "Vragen om dempen op te heffen", @@ -636,6 +634,7 @@ "mute": "Dempen", "muteAll": "Allen dempen", "muteEveryoneElse": "Alle anderen dempen", + "reject": "Afwijzen", "stopEveryonesVideo": "Camera's van iedereen uitzetten", "stopVideo": "Camera uitzetten", "unblockEveryoneMicCamera": "Deblokkeer microfoon en camera van allen", diff --git a/lang/main-oc.json b/lang/main-oc.json index ce6d76911147..c85adc30f5fa 100644 --- a/lang/main-oc.json +++ b/lang/main-oc.json @@ -524,8 +524,6 @@ "youtubeTerms": "Condicions d’utilizacion de YouTube" }, "lobby": { - "admit": "Acceptar", - "admitAll": "Tot acceptar", "allow": "Autorizar", "backToKnockModeButton": "Cap de senhal, demandar a participar a la plaça", "dialogTitle": "Mòde sala d'espèra", @@ -556,8 +554,6 @@ "notificationTitle": "Sala d'espèra", "passwordField": "Picatz lo senhal de la conferéncia", "passwordJoinButton": "Rejónher", - "reject": "Regetar", - "rejectAll": "Tot regetar", "title": "Sala d'espèra", "toggleLabel": "Activar la sala d'espèra" }, @@ -670,6 +666,8 @@ }, "participantsPane": { "actions": { + "admit": "Acceptar", + "admitAll": "Tot acceptar", "allow": "Permetre als convidats de :", "allowVideo": "Autorizar la vidèo", "askUnmute": "Demandar a restablir lo son", @@ -682,6 +680,7 @@ "mute": "Amudir", "muteAll": "Amudir tot lo monde", "muteEveryoneElse": "Amudir tot los demai", + "reject": "Regetar", "stopEveryonesVideo": "Arrestar la vidèo de tot lo monde", "stopVideo": "Arrestar la vidèo", "unblockEveryoneMicCamera": "Desblocar lo microfòn e la camèra de tot lo monde", diff --git a/lang/main-pl.json b/lang/main-pl.json index 4b1725acaf34..f41eac5850fe 100644 --- a/lang/main-pl.json +++ b/lang/main-pl.json @@ -586,8 +586,6 @@ "youtubeTerms": "Warunki użytkowania YouTube" }, "lobby": { - "admit": "Pozwól", - "admitAll": "Pozwól wszystkim", "backToKnockModeButton": "Brak hasła, poproś o dołączenie", "chat": "Chat", "dialogTitle": "Lobby", @@ -621,8 +619,6 @@ "notificationTitle": "Lobby", "passwordField": "Wprowadź hasło", "passwordJoinButton": "Dołącz", - "reject": "Odrzuć", - "rejectAll": "Odrzuć wszystkich", "title": "Lobby", "toggleLabel": "Włącz / Wyłącz lobby" }, @@ -756,6 +752,8 @@ }, "participantsPane": { "actions": { + "admit": "Pozwól", + "admitAll": "Pozwól wszystkim", "allow": "Zezwól uczestnikom na:", "allowVideo": "Zezwól na wideo", "askUnmute": "Poproś o wyłączenie wyciszenia", @@ -768,6 +766,7 @@ "mute": "Wycisz", "muteAll": "Wycisz wszystkich", "muteEveryoneElse": "Wycisz pozostałych", + "reject": "Odrzuć", "stopEveryonesVideo": "Wyłącz wszystkie kamery", "stopVideo": "Wyłącz kamerę", "unblockEveryoneMicCamera": "Odblokuj wszystkim kamerę i mikrofon", diff --git a/lang/main-pt.json b/lang/main-pt.json index fc4cb71001ac..1f0cc9688b7d 100644 --- a/lang/main-pt.json +++ b/lang/main-pt.json @@ -421,6 +421,7 @@ "sessTerminatedReason": "A reunião foi encerrada", "sessionRestarted": "Chamada reiniciada devido a um problema de ligação.", "shareAudio": "Continuar", + "shareAudioAltText": "Para partilhar o conteúdo pretendido, navegue até ao \"Separador do navegador\", seleccione o conteúdo, active a marca de verificação \"Partilhar áudio\" e, em seguida, clique no botão \"Partilhar\"", "shareAudioTitle": "Como partilhar áudio", "shareAudioWarningD1": "precisa de parar a partilha do ecrã antes de partilhar o seu áudio.", "shareAudioWarningD2": "precisa de reiniciar a sua partilha de ecrã e verificar a opção \"partilhar áudio\".", @@ -641,8 +642,6 @@ "youtubeTerms": "Termos de serviços do YouTube" }, "lobby": { - "admit": "Aceitar", - "admitAll": "Aceitar todos", "backToKnockModeButton": "Peça para aderir", "chat": "Chat", "dialogTitle": "Modo sala de espera", @@ -676,8 +675,6 @@ "notificationLobbyEnabled": "A sala de espera foi activada por {{originParticipantName}}", "notificationTitle": "Sala de espera", "passwordJoinButton": "Solicitar", - "reject": "Rejeitar", - "rejectAll": "Rejeitar todos", "title": "Sala de espera", "toggleLabel": "Ativar sala de espera" }, @@ -815,6 +812,8 @@ }, "participantsPane": { "actions": { + "admit": "Aceitar", + "admitAll": "Aceitar todos", "allow": "Permitir aos participantes:", "allowVideo": "Permitir vídeo", "askUnmute": "Pedir para ligar o som", @@ -828,6 +827,7 @@ "mute": "Silenciar", "muteAll": "Silenciar todos", "muteEveryoneElse": "Silenciar todos os outros", + "reject": "Rejeitar", "stopEveryonesVideo": "Desligar a câmara de todos", "stopVideo": "Desligar a câmara", "unblockEveryoneMicCamera": "Desbloquear o microfone e a câmara de todos", @@ -837,6 +837,7 @@ "headings": { "lobby": "Sala de espera ({{count}})", "participantsList": "Participantes da reunião ({{count}})", + "visitorRequests": " (pedidos {{count}})", "visitors": "Visitantes ({{count}})", "waitingLobby": "Aguardam na sala de espera ({{count}})" }, @@ -927,7 +928,7 @@ "joinWithoutAudio": "Entrar sem áudio", "keyboardShortcuts": "Ativar os atalhos de teclado", "linkCopied": "Link copiado para a área de transferência", - "lookGood": "O seu microfone funciona corretamente", + "lookGood": "Tudo está a funcionar corretamente", "or": "ou", "premeeting": "Pré-reunião", "proceedAnyway": "Continuar na mesma", @@ -1015,12 +1016,15 @@ "onlyRecordSelf": "Gravar apenas as minhas transmissões áudio e vídeo", "pending": "Preparando para gravar a reunião...", "rec": "REC", + "recordAudioAndVideo": "Gravar áudio e vídeo", + "recordTranscription": "Gravar transcrições", "saveLocalRecording": "Guardar ficheiro de gravação localmente (Beta)", "serviceDescription": "Sua gravação será salva pelo serviço de gravação", "serviceDescriptionCloud": "Gravação na nuvem", "serviceDescriptionCloudInfo": "As reuniões gravadas são automaticamente apagadas 24h após a hora de gravação.", "serviceName": "Serviço de gravação", "sessionAlreadyActive": "Esta sessão já está a ser gravada ou transmitida em direto.", + "showAdvancedOptions": "Opções avançadas", "signIn": "Entrar", "signOut": "Sair", "surfaceError": "Por favor, seleccione o separador actual.", @@ -1163,7 +1167,7 @@ "toolbar": { "Settings": "Definições", "accessibilityLabel": { - "Settings": "Mudar configurações", + "Settings": "Abrir definições", "audioOnly": "Mudar para apenas áudio", "audioRoute": "Selecionar o dispositivo de som", "boo": "Vaia", diff --git a/lang/main-ptBR.json b/lang/main-ptBR.json index 5c0b1a69e936..b64f74bcbd26 100644 --- a/lang/main-ptBR.json +++ b/lang/main-ptBR.json @@ -642,8 +642,6 @@ "youtubeTerms": "Termos de serviços do YouTube" }, "lobby": { - "admit": "Aceitar", - "admitAll": "Aceitar todos", "backToKnockModeButton": "Sem senha, peça para se juntar", "chat": "Chat", "dialogTitle": "Modo sala de espera", @@ -677,8 +675,6 @@ "notificationLobbyEnabled": "Sala de espera foi habilitada por {{originParticipantName}}", "notificationTitle": "Sala de espera", "passwordJoinButton": "Solicitar", - "reject": "Rejeitar", - "rejectAll": "Rejeitar todos", "title": "Sala de espera", "toggleLabel": "Habilitar sala de espera" }, @@ -816,6 +812,8 @@ }, "participantsPane": { "actions": { + "admit": "Aceitar", + "admitAll": "Aceitar todos", "allow": "Permitir aos participantes:", "allowVideo": "Permitir vídeo", "askUnmute": "Pedir para ativar som", @@ -829,6 +827,7 @@ "mute": "Silenciar", "muteAll": "Silenciar todos", "muteEveryoneElse": "Silenciar todos os demais", + "reject": "Rejeitar", "stopEveryonesVideo": "Parar vídeo de todos", "stopVideo": "Parar vídeo", "unblockEveryoneMicCamera": "Desbloquear microfone e câmera de todos", diff --git a/lang/main-ru.json b/lang/main-ru.json index d102e1315efb..7c6b214a5e09 100644 --- a/lang/main-ru.json +++ b/lang/main-ru.json @@ -557,8 +557,6 @@ "youtubeTerms": "Условия использования YouTube" }, "lobby": { - "admit": "Признать", - "admitAll": "Признать все", "backToKnockModeButton": "Попросить присоединиться", "chat": "Чат", "dialogTitle": "Режим лобби", @@ -592,8 +590,6 @@ "notificationTitle": "Лобби", "passwordField": "Введите пароль встречи", "passwordJoinButton": "Присоединиться", - "reject": "Отказать", - "rejectAll": "Отказать всем", "title": "Лобби", "toggleLabel": "Включить лобби" }, @@ -720,6 +716,8 @@ }, "participantsPane": { "actions": { + "admit": "Признать", + "admitAll": "Признать все", "allow": "Разрешить", "allowVideo": "Разрешить видео", "askUnmute": "Попросить разрешение включить микрофон", @@ -732,6 +730,7 @@ "mute": "Выключить звук", "muteAll": "Выключить звук у всех", "muteEveryoneElse": "Выключить микрофон у остальных", + "reject": "Отказать", "stopEveryonesVideo": "Выключить у всех камеру", "stopVideo": "Остановить видео", "unblockEveryoneMicCamera": "Разблокировать у всех микрофон и камеру", diff --git a/lang/main-sc.json b/lang/main-sc.json index 225f42f10d6e..638bbf7652c3 100644 --- a/lang/main-sc.json +++ b/lang/main-sc.json @@ -561,8 +561,6 @@ "youtubeTerms": "Cunditziones de servìtziu de YouTube" }, "lobby": { - "admit": "Ammite", - "admitAll": "Ammite totu", "allow": "Permite", "backToKnockModeButton": "Pedi de intrare", "chat": "Tzarrada", @@ -597,8 +595,6 @@ "notificationTitle": "Aposentu de abetu", "passwordField": "Inserta sa crae de sa riunione", "passwordJoinButton": "Aderi", - "reject": "Refuda", - "rejectAll": "Refuda totu", "title": "Aposentu de abetu", "toggleLabel": "Ativa s'aposentu de abetu" }, @@ -727,6 +723,8 @@ }, "participantsPane": { "actions": { + "admit": "Ammite", + "admitAll": "Ammite totu", "allow": "Permite a is partetzipantes:", "allowVideo": "Permite vìdeu", "askUnmute": "Pedi de ativare su micròfonu", @@ -739,6 +737,7 @@ "mute": "A sa muda", "muteAll": "Totu a sa muda", "muteEveryoneElse": "Pone totus a sa muda", + "reject": "Refuda", "stopEveryonesVideo": "Istuda su vìdeu de totu is partetzipantes", "stopVideo": "Firma su vìdeu", "unblockEveryoneMicCamera": "Isbloca su micròfonu e sa càmera de totu is partetzipantes", diff --git a/lang/main-sk.json b/lang/main-sk.json index 430403a00a40..cf7fcbd8bf06 100644 --- a/lang/main-sk.json +++ b/lang/main-sk.json @@ -466,7 +466,6 @@ "notificationTitle": "Čakáreň", "passwordField": "Zadajte heslo do konferencie", "passwordJoinButton": "Vstúpiť", - "reject": "Odmietnuť", "title": "Čakáreň", "toggleLabel": "Zapnúť čakáreň" }, @@ -541,6 +540,11 @@ "suboptimalExperienceTitle": "Prehliadačové varovanie", "unmute": "Zapnúť mikrofón" }, + "participantsPane": { + "actions": { + "reject": "Odmietnuť" + } + }, "passwordDigitsOnly": "až {{number}} číslic", "passwordSetRemotely": "nastavené iným účastníkom", "poweredby": "založené na", diff --git a/lang/main-sl.json b/lang/main-sl.json index eda8a8d29acd..7ce87fd4cc9b 100644 --- a/lang/main-sl.json +++ b/lang/main-sl.json @@ -499,8 +499,6 @@ "youtubeTerms": "Pogoji uporabe YouTube" }, "lobby": { - "admit": "Sprejmi", - "admitAll": "Sprejmi vse", "allow": "Dovoli", "backToKnockModeButton": "Prosi za dostop", "dialogTitle": "Način predsobe", @@ -531,8 +529,6 @@ "notificationTitle": "Predsoba", "passwordField": "Vnesite geslo sestanka", "passwordJoinButton": "Pridruži se", - "reject": "Zavrni", - "rejectAll": "Zavrni vse", "title": "Predsoba", "toggleLabel": "Omogoči predsobo" }, @@ -629,6 +625,8 @@ }, "participantsPane": { "actions": { + "admit": "Sprejmi", + "admitAll": "Sprejmi vse", "allow": "Udeleženci si lahko:", "allowVideo": "Dovoli video", "askUnmute": "Prosi za vklop mikrofona", @@ -638,6 +636,7 @@ "mute": "Izklopi zvok", "muteAll": "Izklopi zvok vsem", "muteEveryoneElse": "Izklopi zvok vsem ostalim", + "reject": "Zavrni", "stopEveryonesVideo": "Izklopi video vsem ostalim", "stopVideo": "Izklopi video", "unblockEveryoneMicCamera": "Dovoli zvok in video vsem udeležencem", diff --git a/lang/main-sq.json b/lang/main-sq.json index c68b58f5a17a..c77030acbf93 100644 --- a/lang/main-sq.json +++ b/lang/main-sq.json @@ -582,8 +582,6 @@ "youtubeTerms": "Kushte shërbimi YouTube" }, "lobby": { - "admit": "Pranoje", - "admitAll": "Pranoji të tërë", "backToKnockModeButton": "Kërkoji të marrë pjesë", "chat": "Fjalosje", "dialogTitle": "Mënyra holl", @@ -617,8 +615,6 @@ "notificationTitle": "Holl", "passwordField": "Jepni fjalëkalim takimi", "passwordJoinButton": "Hyni", - "reject": "Hidhe poshtë", - "rejectAll": "Hidhi poshtë të tërë", "title": "Holl", "toggleLabel": "Aktivizoni hollin" }, @@ -749,6 +745,8 @@ }, "participantsPane": { "actions": { + "admit": "Pranoje", + "admitAll": "Pranoji të tërë", "allow": "Lejoju pjesëmarrësve të:", "allowVideo": "Çaktivizoni videon", "askUnmute": "Kërkoni heqje heshtimi", @@ -761,6 +759,7 @@ "mute": "Heshtoje", "muteAll": "Heshtoji të tërë", "muteEveryoneElse": "Heshto gjithkënd tjetër", + "reject": "Hidhe poshtë", "stopEveryonesVideo": "Ndal videon e gjithkujt", "stopVideo": "Ndale videon", "unblockEveryoneMicCamera": "Zhblloko mikrofonin dhe kamerën e gjithkujt", diff --git a/lang/main-sv.json b/lang/main-sv.json index ab9d80f9441d..5bdf8604c62a 100644 --- a/lang/main-sv.json +++ b/lang/main-sv.json @@ -587,8 +587,6 @@ "youtubeTerms": "Tjänstevillkor för YouTube" }, "lobby": { - "admit": "Godkänn", - "admitAll": "Godkänn alla", "backToKnockModeButton": "Tillbaka till väntrum", "chat": "Chatt", "dialogTitle": "Väntrum", @@ -622,8 +620,6 @@ "notificationTitle": "Väntrum", "passwordField": "Ange möteslösenord", "passwordJoinButton": "Anslut", - "reject": "Avvisa", - "rejectAll": "Avvisa alla", "title": "Lobby", "toggleLabel": "Aktivera väntrum" }, @@ -757,6 +753,8 @@ }, "participantsPane": { "actions": { + "admit": "Godkänn", + "admitAll": "Godkänn alla", "allow": "Låt deltagarna:", "allowVideo": "Tillåt kamera", "askUnmute": "Be om att aktivera ljud", @@ -769,6 +767,7 @@ "mute": "Stäng av ljud", "muteAll": "Stäng av allt ljud", "muteEveryoneElse": "Inaktivera ljud för alla deltagare", + "reject": "Avvisa", "stopEveryonesVideo": "Inaktivera allas video", "stopVideo": "Inaktivera video", "unblockEveryoneMicCamera": "Aktivera allas mikrofon och kamera", diff --git a/lang/main-te.json b/lang/main-te.json index eef0aca660df..ba6d9ac1a564 100644 --- a/lang/main-te.json +++ b/lang/main-te.json @@ -455,8 +455,6 @@ "youtubeTerms": "యూట్యూబ్ సేవా నియమాలు" }, "lobby": { - "admit": "అనుమతించు", - "allow": "అనుమతించు", "backToKnockModeButton": "సంకేతపదం లేదు, చేర్చుకోమని అడుగు", "dialogTitle": "Lobby mode", "disableDialogContent": "Lobby mode is currently enabled. This feature ensures that unwanted participants can't join your meeting. Do you want to disable it?", @@ -485,7 +483,6 @@ "notificationTitle": "Lobby", "passwordField": "సమావేశం సంకేతపదం ఇవ్వండి", "passwordJoinButton": "చేరు", - "reject": "నిరాకరించు", "title": "Lobby", "toggleLabel": "Enable lobby" }, @@ -566,8 +563,11 @@ }, "participantsPane": { "actions": { + "admit": "అనుమతించు", + "allow": "అనుమతించు", "invite": "ప్రజలను ఆహ్వానించు", "muteAll": "అందరినీ మౌనించు", + "reject": "నిరాకరించు", "stopVideo": "వీడియో ఆపివేయి" }, "headings": { diff --git a/lang/main-tr.json b/lang/main-tr.json index 9cc022bb1572..ac2d23aff4f6 100644 --- a/lang/main-tr.json +++ b/lang/main-tr.json @@ -561,8 +561,6 @@ "youtubeTerms": "YouTube hizmet şartları" }, "lobby": { - "admit": "Kabul et", - "admitAll": "Hepsini kabul et", "allow": "İzin ver", "backToKnockModeButton": "Parola yok, bunun yerine katılmayı isteyin", "chat": "Sohbet et", @@ -597,8 +595,6 @@ "notificationTitle": "Lobi", "passwordField": "Toplantı parolasını giriniz", "passwordJoinButton": "Katıl", - "reject": "Reddet", - "rejectAll": "Hepsini reddet", "title": "Lobi", "toggleLabel": "Lobiyi etkinleştir" }, @@ -725,6 +721,8 @@ }, "participantsPane": { "actions": { + "admit": "Kabul et", + "admitAll": "Hepsini kabul et", "allow": "Katılımcıların şunları yapmasına izin ver:", "allowVideo": "Video'ya izin ver", "askUnmute": "Sesi açmayı iste", @@ -737,6 +735,7 @@ "mute": "Sessize al", "muteAll": "Herkesi sessize al", "muteEveryoneElse": "Diğer herkesi sessize al", + "reject": "Reddet", "stopEveryonesVideo": "Herkesin videosunu durdur", "stopVideo": "Video'yu durdur", "unblockEveryoneMicCamera": "Herkesin mikrofonunun ve kamerasının engellemesini kaldır", diff --git a/lang/main-uk.json b/lang/main-uk.json index e76f5284978c..e77325327f7f 100644 --- a/lang/main-uk.json +++ b/lang/main-uk.json @@ -584,8 +584,6 @@ "youtubeTerms": "Умови надання послуг YouTube" }, "lobby": { - "admit": "Допустити", - "admitAll": "Допустити всіх", "backToKnockModeButton": "Запитати дозволу", "chat": "Чат", "dialogTitle": "Приймальна", @@ -619,8 +617,6 @@ "notificationTitle": "Приймальна", "passwordField": "Ввести пароль зустрічі", "passwordJoinButton": "Приєднатися", - "reject": "Відмовити", - "rejectAll": "Відмовити всім", "title": "Приймальна", "toggleLabel": "Увімкнути приймальну" }, @@ -753,6 +749,8 @@ }, "participantsPane": { "actions": { + "admit": "Допустити", + "admitAll": "Допустити всіх", "allow": "Дозволити учасникам:", "allowVideo": "Розблокувати камеру", "askUnmute": "Надати слово", @@ -765,6 +763,7 @@ "mute": "Вимкнути мікрофон", "muteAll": "Вимкнути мікрофони всім", "muteEveryoneElse": "Вимкнути мікрофони всім іншим", + "reject": "Відмовити", "stopEveryonesVideo": "Вимкнути камери всім", "stopVideo": "Вимкнути камеру", "unblockEveryoneMicCamera": "Розблокувати всім мікрофон і камеру", diff --git a/lang/main-zhCN.json b/lang/main-zhCN.json index 045b44ccfaba..3ea7210345eb 100644 --- a/lang/main-zhCN.json +++ b/lang/main-zhCN.json @@ -627,8 +627,6 @@ "youtubeTerms": "YouTube服务条款" }, "lobby": { - "admit": "同意", - "admitAll": "同意全部", "backToKnockModeButton": "请求加入", "chat": "聊天", "dialogTitle": "大厅模式", @@ -662,8 +660,6 @@ "notificationTitle": "大厅", "passwordField": "输入会议密码", "passwordJoinButton": "加入", - "reject": "拒绝", - "rejectAll": "拒绝全部", "title": "大厅", "toggleLabel": "开启大厅模式" }, @@ -798,6 +794,8 @@ }, "participantsPane": { "actions": { + "admit": "同意", + "admitAll": "同意全部", "allow": "允许参会者:", "allowVideo": "允许视频", "askUnmute": "请求解除静音", @@ -810,6 +808,7 @@ "mute": "静音", "muteAll": "全体静音", "muteEveryoneElse": "全体静音", + "reject": "拒绝", "stopEveryonesVideo": "禁用所有人视频", "stopVideo": "禁用视频", "unblockEveryoneMicCamera": "允许所有人的麦克风和摄像头", diff --git a/lang/main-zhTW.json b/lang/main-zhTW.json index 7d149cfa22df..8dc5058523e0 100644 --- a/lang/main-zhTW.json +++ b/lang/main-zhTW.json @@ -641,8 +641,6 @@ "youtubeTerms": "YouTube 服務條款" }, "lobby": { - "admit": "準許", - "admitAll": "準許所有人", "backToKnockModeButton": "請求加入", "chat": "聊天", "dialogTitle": "大廳模式", @@ -676,8 +674,6 @@ "notificationTitle": "大廳", "passwordField": "輸入會議密碼", "passwordJoinButton": "加入", - "reject": "拒絕", - "rejectAll": "拒絕所有人", "title": "大廳", "toggleLabel": "啟用大廳模式" }, @@ -815,6 +811,8 @@ }, "participantsPane": { "actions": { + "admit": "準許", + "admitAll": "準許所有人", "allow": "允許與會者能夠:", "allowVideo": "允許視訊", "askUnmute": "要求解除靜音", @@ -828,6 +826,7 @@ "mute": "靜音", "muteAll": "靜音所有人", "muteEveryoneElse": "靜音其他人", + "reject": "拒絕", "stopEveryonesVideo": "停用所有人的視訊", "stopVideo": "停用視訊", "unblockEveryoneMicCamera": "解除封鎖所有人的麥克風及網路攝影機", diff --git a/lang/main.json b/lang/main.json index b03f2e1ad35f..87e2037fd813 100644 --- a/lang/main.json +++ b/lang/main.json @@ -642,8 +642,6 @@ "youtubeTerms": "YouTube terms of services" }, "lobby": { - "admit": "Admit", - "admitAll": "Admit all", "backToKnockModeButton": "Ask to join", "chat": "Chat", "dialogTitle": "Lobby mode", @@ -677,8 +675,6 @@ "notificationLobbyEnabled": "Lobby has been enabled by {{originParticipantName}}", "notificationTitle": "Lobby", "passwordJoinButton": "Join", - "reject": "Reject", - "rejectAll": "Reject all", "title": "Lobby", "toggleLabel": "Enable lobby" }, @@ -816,6 +812,8 @@ }, "participantsPane": { "actions": { + "admit": "Admit", + "admitAll": "Admit all", "allow": "Allow attendees to:", "allowVideo": "Allow video", "askUnmute": "Ask to unmute", @@ -829,6 +827,7 @@ "mute": "Mute", "muteAll": "Mute all", "muteEveryoneElse": "Mute everyone else", + "reject": "Reject", "stopEveryonesVideo": "Stop everyone's video", "stopVideo": "Stop video", "unblockEveryoneMicCamera": "Unblock everyone's mic and camera", @@ -838,7 +837,8 @@ "headings": { "lobby": "Lobby ({{count}})", "participantsList": "Meeting participants ({{count}})", - "visitors": "Visitors ({{count}})", + "visitorRequests": " (requests {{count}})", + "visitors": "Visitors {{count}}", "waitingLobby": "Waiting in lobby ({{count}})" }, "search": "Search participants", @@ -928,7 +928,7 @@ "joinWithoutAudio": "Join without audio", "keyboardShortcuts": "Enable Keyboard shortcuts", "linkCopied": "Link copied to clipboard", - "lookGood": "Your microphone is working properly", + "lookGood": "Everything is working properly", "or": "or", "premeeting": "Pre meeting", "proceedAnyway": "Proceed anyway", @@ -1016,12 +1016,15 @@ "onlyRecordSelf": "Record only my audio and video streams", "pending": "Preparing to record the meeting...", "rec": "REC", + "recordAudioAndVideo": "Record audio and video", + "recordTranscription": "Record transcription", "saveLocalRecording": "Save recording file locally (Beta)", "serviceDescription": "Your recording will be saved by the recording service", "serviceDescriptionCloud": "Cloud recording", "serviceDescriptionCloudInfo": "Recorded meetings are automatically cleared 24h after their recording time.", "serviceName": "Recording service", "sessionAlreadyActive": "This session is already being recorded or live streamed.", + "showAdvancedOptions": "Advanced options", "signIn": "Sign in", "signOut": "Sign out", "surfaceError": "Please select the current tab.", @@ -1164,7 +1167,7 @@ "toolbar": { "Settings": "Settings", "accessibilityLabel": { - "Settings": "Toggle settings", + "Settings": "Open settings", "audioOnly": "Toggle audio only", "audioRoute": "Select the sound device", "boo": "Boo", @@ -1210,7 +1213,7 @@ "moreActions": "More actions", "moreActionsMenu": "More actions menu", "moreOptions": "Show more options", - "mute": "Mute", + "mute": "Mute microphone", "muteEveryone": "Mute everyone", "muteEveryoneElse": "Mute everyone else", "muteEveryoneElsesVideoStream": "Stop everyone else's video", @@ -1246,7 +1249,7 @@ "tileView": "Toggle tile view", "toggleCamera": "Toggle camera", "toggleFilmstrip": "Toggle filmstrip", - "unmute": "Unmute", + "unmute": "Unmute microphone", "videoblur": "Toggle video blur", "videomute": "Stop camera", "videomuteGUMPending": "Connecting your camera", @@ -1297,7 +1300,7 @@ "lowerYourHand": "Lower your hand", "moreActions": "More actions", "moreOptions": "More options", - "mute": "Mute", + "mute": "Mute microphone", "muteEveryone": "Mute everyone", "muteEveryonesVideo": "Disable everyone's camera", "muteGUMPending": "Connecting your microphone", @@ -1343,7 +1346,7 @@ "talkWhileMutedPopup": "Trying to speak? You are muted.", "tileViewToggle": "Toggle tile view", "toggleCamera": "Toggle camera", - "unmute": "Unmute", + "unmute": "Unmute microphone", "videoSettings": "Video settings", "videomute": "Stop camera", "videomuteGUMPending": "Connecting your camera", diff --git a/modules/API/API.js b/modules/API/API.js index bb1599ab2a35..77a77c15d36f 100644 --- a/modules/API/API.js +++ b/modules/API/API.js @@ -466,8 +466,8 @@ function initCommands() { 'toggle-subtitles': () => { APP.store.dispatch(toggleRequestingSubtitles()); }, - 'set-subtitles': enabled => { - APP.store.dispatch(setRequestingSubtitles(enabled)); + 'set-subtitles': (enabled, displaySubtitles, language) => { + APP.store.dispatch(setRequestingSubtitles(enabled, displaySubtitles, language)); }, 'toggle-tile-view': () => { sendAnalytics(createApiEvent('tile-view.toggled')); @@ -835,8 +835,6 @@ function initCommands() { return true; } - logger.warn(`Unknown API command received: ${name}`); - return false; }); transport.on('request', (request, callback) => { diff --git a/package-lock.json b/package-lock.json index 2378f0570378..aae316d5b808 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,7 +59,7 @@ "js-md5": "0.6.1", "js-sha512": "0.8.0", "jwt-decode": "2.2.0", - "lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1734.0.0+34ceebd2/lib-jitsi-meet.tgz", + "lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1750.0.0+ca40744f/lib-jitsi-meet.tgz", "lodash": "4.17.21", "moment": "2.29.4", "moment-duration-format": "2.2.2", @@ -11860,8 +11860,8 @@ }, "node_modules/lib-jitsi-meet": { "version": "0.0.0", - "resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1734.0.0+34ceebd2/lib-jitsi-meet.tgz", - "integrity": "sha512-mHWUJ8Q4uhFsx2EZoRhgq8iGgitXig9hZ+uOuHana2YWjj1ZU0GhS5fl7VGr+LxtsonclQBBbGDt8/JkNLcfgg==", + "resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1750.0.0+ca40744f/lib-jitsi-meet.tgz", + "integrity": "sha512-A4NdzOU4iYjyxxMiG35NN3vPlf209p+plJpJLpZu2Q3fmjVeu4GM613vr/UzmD+4tYR9XL+sPiFH464uGDjzxA==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -27399,8 +27399,8 @@ } }, "lib-jitsi-meet": { - "version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1734.0.0+34ceebd2/lib-jitsi-meet.tgz", - "integrity": "sha512-mHWUJ8Q4uhFsx2EZoRhgq8iGgitXig9hZ+uOuHana2YWjj1ZU0GhS5fl7VGr+LxtsonclQBBbGDt8/JkNLcfgg==", + "version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1750.0.0+ca40744f/lib-jitsi-meet.tgz", + "integrity": "sha512-A4NdzOU4iYjyxxMiG35NN3vPlf209p+plJpJLpZu2Q3fmjVeu4GM613vr/UzmD+4tYR9XL+sPiFH464uGDjzxA==", "requires": { "@jitsi/js-utils": "2.2.1", "@jitsi/logger": "2.0.2", diff --git a/package.json b/package.json index b3eb87f52012..204b9e4aecd1 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "js-md5": "0.6.1", "js-sha512": "0.8.0", "jwt-decode": "2.2.0", - "lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1734.0.0+34ceebd2/lib-jitsi-meet.tgz", + "lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1750.0.0+ca40744f/lib-jitsi-meet.tgz", "lodash": "4.17.21", "moment": "2.29.4", "moment-duration-format": "2.2.2", diff --git a/react-native-sdk/index.tsx b/react-native-sdk/index.tsx index f7de9aa42949..447008aa45bf 100644 --- a/react-native-sdk/index.tsx +++ b/react-native-sdk/index.tsx @@ -13,9 +13,12 @@ import React, { } from 'react'; import { View, ViewStyle } from 'react-native'; +import type { IRoomsInfo } from '../react/features/breakout-rooms/types'; + import { appNavigate } from './react/features/app/actions.native'; import { App } from './react/features/app/components/App.native'; import { setAudioMuted, setVideoMuted } from './react/features/base/media/actions'; +import { getRoomsInfo } from './react/features/breakout-rooms/functions'; interface IEventListeners { @@ -28,6 +31,7 @@ interface IEventListeners { onConferenceWillJoin?: Function; onEnterPictureInPicture?: Function; onParticipantJoined?: Function; + onParticipantLeft?: ({ id }: { id: string }) => void; onReadyToClose?: Function; } @@ -48,10 +52,17 @@ interface IAppProps { userInfo?: IUserInfo; } +export interface JitsiRefProps { + close: Function; + setAudioMuted?: (muted: boolean) => void; + setVideoMuted?: (muted: boolean) => void; + getRoomsInfo?: () => IRoomsInfo; +} + /** * Main React Native SDK component that displays a Jitsi Meet conference and gets all required params as props */ -export const JitsiMeeting = forwardRef((props: IAppProps, ref) => { +export const JitsiMeeting = forwardRef((props, ref) => { const [ appProps, setAppProps ] = useState({}); const app = useRef(null); const { @@ -81,6 +92,11 @@ export const JitsiMeeting = forwardRef((props: IAppProps, ref) => { const dispatch = app.current.state.store.dispatch; dispatch(setVideoMuted(muted)); + }, + getRoomsInfo: () => { + const state = app.current.state.store.getState(); + + return getRoomsInfo(state); } })); @@ -118,6 +134,7 @@ export const JitsiMeeting = forwardRef((props: IAppProps, ref) => { onConferenceLeft: eventListeners?.onConferenceLeft, onEnterPictureInPicture: eventListeners?.onEnterPictureInPicture, onParticipantJoined: eventListeners?.onParticipantJoined, + onParticipantLeft: eventListeners?.onParticipantLeft, onReadyToClose: eventListeners?.onReadyToClose }, 'url': urlProps, diff --git a/react/features/base/config/configType.ts b/react/features/base/config/configType.ts index 7b7986ae8ba0..839aa5bddf40 100644 --- a/react/features/base/config/configType.ts +++ b/react/features/base/config/configType.ts @@ -583,7 +583,7 @@ export interface IConfig { transcribeWithAppLanguage?: boolean; transcribingEnabled?: boolean; transcription?: { - autoCaptionOnRecord?: boolean; + autoTranscribeOnRecord?: boolean; disableStartForAll?: boolean; enabled?: boolean; preferredLanguage?: string; diff --git a/react/features/base/config/reducer.ts b/react/features/base/config/reducer.ts index 0d97fe208474..dbc6bd7532cd 100644 --- a/react/features/base/config/reducer.ts +++ b/react/features/base/config/reducer.ts @@ -465,7 +465,7 @@ function _translateLegacyConfig(oldValue: IConfig) { if (oldValue.autoCaptionOnRecord !== undefined) { newValue.transcription = { ...newValue.transcription, - autoCaptionOnRecord: oldValue.autoCaptionOnRecord + autoTranscribeOnRecord: oldValue.autoCaptionOnRecord }; } diff --git a/react/features/base/i18n/i18next.ts b/react/features/base/i18n/i18next.ts index 8305d9af375e..c352f32f2677 100644 --- a/react/features/base/i18n/i18next.ts +++ b/react/features/base/i18n/i18next.ts @@ -40,14 +40,6 @@ export const LANGUAGES: Array = Object.keys(LANGUAGES_RESOURCES); */ export const TRANSLATION_LANGUAGES: Array = Object.keys(TRANSLATION_LANGUAGES_RESOURCES); -/** - * The available/supported translation languages head. (Languages displayed on the top ). - * - * @public - * @type {Array} - */ -export const TRANSLATION_LANGUAGES_HEAD: Array = [ 'en' ]; - /** * The default language. * @@ -58,6 +50,14 @@ export const TRANSLATION_LANGUAGES_HEAD: Array = [ 'en' ]; */ export const DEFAULT_LANGUAGE = 'en'; +/** + * The available/supported translation languages head. (Languages displayed on the top ). + * + * @public + * @type {Array} + */ +export const TRANSLATION_LANGUAGES_HEAD: Array = [ DEFAULT_LANGUAGE ]; + /** * The options to initialize i18next with. * diff --git a/react/features/base/lib-jitsi-meet/middleware.ts b/react/features/base/lib-jitsi-meet/middleware.ts index 397db6da7bd1..1e66134df6d5 100644 --- a/react/features/base/lib-jitsi-meet/middleware.ts +++ b/react/features/base/lib-jitsi-meet/middleware.ts @@ -7,7 +7,6 @@ import { PARTICIPANT_LEFT } from '../participants/actionTypes'; import MiddlewareRegistry from '../redux/MiddlewareRegistry'; import JitsiMeetJS from './_'; -import { LIB_WILL_INIT } from './actionTypes'; import { disposeLib, initLib } from './actions'; /** @@ -22,14 +21,6 @@ import { disposeLib, initLib } from './actions'; */ MiddlewareRegistry.register(store => next => action => { switch (action.type) { - case LIB_WILL_INIT: - // Moved from conference.js init method. It appears the error handlers - // are not used for mobile. - if (typeof APP !== 'undefined') { - _setErrorHandlers(); - } - break; - case SET_NETWORK_INFO: JitsiMeetJS.setNetworkInfo({ isOnline: action.isOnline @@ -81,47 +72,3 @@ function _setConfig({ dispatch, getState }: IStore, next: Function, action: AnyA return result; } - -/** - * Attaches our custom error handlers to the window object. - * - * @returns {void} - */ -function _setErrorHandlers() { - // attaches global error handler, if there is already one, respect it - if (JitsiMeetJS.getGlobalOnErrorHandler) { - const oldOnErrorHandler = window.onerror; - - // TODO: Don't remove this ignore. The build fails on macOS and we don't know yet why. - - // @ts-ignore - window.onerror = (message, source, lineno, colno, error) => { // eslint-disable-line max-params - const errMsg = message || error?.message; - const stack = error?.stack; - - JitsiMeetJS.getGlobalOnErrorHandler(errMsg, source, lineno, colno, stack); - - if (oldOnErrorHandler) { - oldOnErrorHandler(message, source, lineno, colno, error); - } - }; - - const oldOnUnhandledRejection = window.onunhandledrejection; - - window.onunhandledrejection = function(event) { - let message = event.reason; - let stack: string | undefined = 'n/a'; - - if (event.reason instanceof Error) { - ({ message, stack } = event.reason); - } - - JitsiMeetJS.getGlobalOnErrorHandler(message, null, null, null, stack); - - if (oldOnUnhandledRejection) { - // @ts-ignore - oldOnUnhandledRejection(event); - } - }; - } -} diff --git a/react/features/base/media/components/native/Audio.ts b/react/features/base/media/components/native/Audio.ts index 12ac118d0ecc..0e70d4b0ecd3 100644 --- a/react/features/base/media/components/native/Audio.ts +++ b/react/features/base/media/components/native/Audio.ts @@ -1,7 +1,7 @@ import Sound from 'react-native-sound'; import logger from '../../logger'; -import AbstractAudio from '../AbstractAudio'; +import AbstractAudio, { IProps } from '../AbstractAudio'; /** * The React Native/mobile {@link Component} which is similar to Web's @@ -31,12 +31,25 @@ export default class Audio extends AbstractAudio { } } + /** + * Implements React's {@link Component#componentDidUpdate()}. + * + * @inheritdoc + */ + async componentDidUpdate(prevProps: IProps): Promise { + // source is different !! call didunmount and call didmount + if (prevProps.src !== this.props.src) { + await this.componentWillUnmount(); + await this.componentDidMount(); + } + } + /** * Will load the sound, after the component did mount. * * @returns {void} */ - componentDidMount() { + async componentDidMount() { this._sound = this.props.src ? new Sound( @@ -50,7 +63,7 @@ export default class Audio extends AbstractAudio { * * @returns {void} */ - componentWillUnmount() { + async componentWillUnmount() { if (this._sound) { this._sound.release(); this._sound = null; diff --git a/react/features/base/media/constants.ts b/react/features/base/media/constants.ts index 90497a2f4592..f8e610def285 100644 --- a/react/features/base/media/constants.ts +++ b/react/features/base/media/constants.ts @@ -38,6 +38,15 @@ export const SCREENSHARE_MUTISM_AUTHORITY = { USER: 1 << 2 }; +/** + * The languages supported for audio files. + */ +export enum AudioSupportedLanguage { + en = 'en', + fr = 'fr', + frCA = 'frCA' +} + /** * The types of authorities which may mute/unmute the local video. * diff --git a/react/features/base/media/functions.ts b/react/features/base/media/functions.ts index e20c3bae2a19..7093283a83fe 100644 --- a/react/features/base/media/functions.ts +++ b/react/features/base/media/functions.ts @@ -2,7 +2,7 @@ import { IStateful } from '../app/types'; import { toState } from '../redux/functions'; import { getPropertyValue } from '../settings/functions'; -import { VIDEO_MUTISM_AUTHORITY } from './constants'; +import { AudioSupportedLanguage, VIDEO_MUTISM_AUTHORITY } from './constants'; // XXX The configurations/preferences/settings startWithAudioMuted and startWithVideoMuted were introduced for @@ -127,3 +127,20 @@ export function shouldRenderVideoTrack( && !videoTrack.muted && (!waitForVideoStarted || videoTrack.videoStarted)); } + +/** + * Computes the localized sound file source. + * + * @param {string} file - The default file source. + * @param {string} language - The language to use for localization. + * @returns {string} + */ +export const getSoundFileSrc = (file: string, language: string): string => { + if (!AudioSupportedLanguage[language as keyof typeof AudioSupportedLanguage] + || language === AudioSupportedLanguage.en) { + return file; + } + const fileTokens = file.split('.'); + + return `${fileTokens[0]}_${language}.${fileTokens[1]}`; +}; diff --git a/react/features/base/sounds/middleware.any.ts b/react/features/base/sounds/middleware.any.ts index 5267783838fc..2bfa0a60ada8 100644 --- a/react/features/base/sounds/middleware.any.ts +++ b/react/features/base/sounds/middleware.any.ts @@ -1,5 +1,11 @@ +import i18next from 'i18next'; + +import { registerE2eeAudioFiles } from '../../../features/e2ee/functions'; +import { registerRecordingAudioFiles } from '../../../features/recording/functions'; import { IStore } from '../../app/types'; +import { AudioSupportedLanguage } from '../media/constants'; import MiddlewareRegistry from '../redux/MiddlewareRegistry'; +import StateListenerRegistry from '../redux/StateListenerRegistry'; import { PLAY_SOUND, STOP_SOUND } from './actionTypes'; import logger from './logger'; @@ -71,3 +77,53 @@ function _stopSound({ getState }: IStore, soundId: string) { logger.warn(`STOP_SOUND: no sound found for id: ${soundId}`); } } + +/** + * Returns whether the language is supported for audio messages. + * + * @param {string} language - The requested language. + * @returns {boolean} + */ +function isLanguageSupported(language: string): Boolean { + return Boolean(AudioSupportedLanguage[language as keyof typeof AudioSupportedLanguage]); +} + +/** + * Checking if it's necessary to reload the translated files. + * + * @param {string} language - The next language. + * @param {string} prevLanguage - The previous language. + * @returns {boolean} + */ +function shouldReloadAudioFiles(language: string, prevLanguage: string): Boolean { + const isNextLanguageSupported = isLanguageSupported(language); + const isPrevLanguageSupported = isLanguageSupported(prevLanguage); + + return ( + + // From an unsupported language (which defaulted to English) to a supported language (that isn't English). + isNextLanguageSupported && language !== AudioSupportedLanguage.en && !isPrevLanguageSupported + ) || ( + + // From a supported language (that wasn't English) to English. + !isNextLanguageSupported && isPrevLanguageSupported && prevLanguage !== AudioSupportedLanguage.en + ) || ( + + // From a supported language to another. + isNextLanguageSupported && isPrevLanguageSupported + ); +} + +/** + * Set up state change listener for language. + */ +StateListenerRegistry.register( + () => i18next.language, + (language, { dispatch }, prevLanguage): void => { + + if (language !== prevLanguage && shouldReloadAudioFiles(language, prevLanguage)) { + registerE2eeAudioFiles(dispatch, true); + registerRecordingAudioFiles(dispatch, true); + } + } +); diff --git a/react/features/e2ee/functions.ts b/react/features/e2ee/functions.ts index bb96acc650b4..6bf6857f58cd 100644 --- a/react/features/e2ee/functions.ts +++ b/react/features/e2ee/functions.ts @@ -1,10 +1,23 @@ -import { IReduxState } from '../app/types'; +import i18next from 'i18next'; + +import { IReduxState, IStore } from '../app/types'; import { IStateful } from '../base/app/types'; +import { getSoundFileSrc } from '../base/media/functions'; import { getParticipantById, getParticipantCount, getParticipantCountWithFake } from '../base/participants/functions'; import { toState } from '../base/redux/functions'; +import { registerSound, unregisterSound } from '../base/sounds/actions'; +import { + E2EE_OFF_SOUND_ID, + E2EE_ON_SOUND_ID, + MAX_MODE_LIMIT, + MAX_MODE_THRESHOLD +} from './constants'; +import { + E2EE_OFF_SOUND_FILE, + E2EE_ON_SOUND_FILE +} from './sounds'; -import { MAX_MODE_LIMIT, MAX_MODE_THRESHOLD } from './constants'; /** * Gets the value of a specific React {@code Component} prop of the currently @@ -73,3 +86,35 @@ export function displayVerification(state: IReduxState, pId: string) { && participant?.e2eeVerificationAvailable && participant?.e2eeVerified === undefined); } + +/** + * Unregisters the audio files based on locale. + * + * @param {Dispatch} dispatch - The redux dispatch function. + * @returns {void} + */ +export function unregisterE2eeAudioFiles(dispatch: IStore['dispatch']) { + dispatch(unregisterSound(E2EE_OFF_SOUND_ID)); + dispatch(unregisterSound(E2EE_ON_SOUND_ID)); +} + +/** + * Registers the audio files based on locale. + * + * @param {Dispatch} dispatch - The redux dispatch function. + * @param {boolean|undefined} shouldUnregister - Whether the sounds should be unregistered. + * @returns {void} + */ +export function registerE2eeAudioFiles(dispatch: IStore['dispatch'], shouldUnregister?: boolean) { + const language = i18next.language; + + shouldUnregister && unregisterE2eeAudioFiles(dispatch); + + dispatch(registerSound( + E2EE_OFF_SOUND_ID, + getSoundFileSrc(E2EE_OFF_SOUND_FILE, language))); + + dispatch(registerSound( + E2EE_ON_SOUND_ID, + getSoundFileSrc(E2EE_ON_SOUND_FILE, language))); +} diff --git a/react/features/e2ee/middleware.ts b/react/features/e2ee/middleware.ts index cdc31e8a7828..2e4707b13393 100644 --- a/react/features/e2ee/middleware.ts +++ b/react/features/e2ee/middleware.ts @@ -1,4 +1,3 @@ - import { IStore } from '../app/types'; import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../base/app/actionTypes'; import { CONFERENCE_JOINED } from '../base/conference/actionTypes'; @@ -14,16 +13,19 @@ import { } from '../base/participants/functions'; import MiddlewareRegistry from '../base/redux/MiddlewareRegistry'; import StateListenerRegistry from '../base/redux/StateListenerRegistry'; -import { playSound, registerSound, unregisterSound } from '../base/sounds/actions'; +import { playSound } from '../base/sounds/actions'; import { PARTICIPANT_VERIFIED, SET_MEDIA_ENCRYPTION_KEY, START_VERIFICATION, TOGGLE_E2EE } from './actionTypes'; import { setE2EEMaxMode, toggleE2EE } from './actions'; import ParticipantVerificationDialog from './components/ParticipantVerificationDialog'; import { E2EE_OFF_SOUND_ID, E2EE_ON_SOUND_ID, MAX_MODE } from './constants'; -import { isMaxModeReached, isMaxModeThresholdReached } from './functions'; +import { + isMaxModeReached, + isMaxModeThresholdReached, + registerE2eeAudioFiles, + unregisterE2eeAudioFiles +} from './functions'; import logger from './logger'; -import { E2EE_OFF_SOUND_FILE, E2EE_ON_SOUND_FILE } from './sounds'; - /** * Middleware that captures actions related to E2EE. @@ -36,18 +38,11 @@ MiddlewareRegistry.register(({ dispatch, getState }) => next => action => { switch (action.type) { case APP_WILL_MOUNT: - dispatch(registerSound( - E2EE_OFF_SOUND_ID, - E2EE_OFF_SOUND_FILE)); - - dispatch(registerSound( - E2EE_ON_SOUND_ID, - E2EE_ON_SOUND_FILE)); + registerE2eeAudioFiles(dispatch); break; case APP_WILL_UNMOUNT: - dispatch(unregisterSound(E2EE_OFF_SOUND_ID)); - dispatch(unregisterSound(E2EE_ON_SOUND_ID)); + unregisterE2eeAudioFiles(dispatch); break; case CONFERENCE_JOINED: diff --git a/react/features/invite/components/add-people-dialog/native/AddPeopleDialog.tsx b/react/features/invite/components/add-people-dialog/native/AddPeopleDialog.tsx index 9bba9d7797ff..13eb042cca8d 100644 --- a/react/features/invite/components/add-people-dialog/native/AddPeopleDialog.tsx +++ b/react/features/invite/components/add-people-dialog/native/AddPeopleDialog.tsx @@ -4,6 +4,7 @@ import { WithTranslation } from 'react-i18next'; import { ActivityIndicator, FlatList, + SafeAreaView, TouchableOpacity, View, ViewStyle @@ -199,6 +200,7 @@ class AddPeopleDialog extends AbstractAddPeopleDialog { return ( { */ _renderShareMeetingButton() { return ( - { src = { IconShare } style = { styles.shareIcon } /> - + ); } diff --git a/react/features/invite/components/add-people-dialog/native/styles.ts b/react/features/invite/components/add-people-dialog/native/styles.ts index c512bddc0bce..3935ebefe85d 100644 --- a/react/features/invite/components/add-people-dialog/native/styles.ts +++ b/react/features/invite/components/add-people-dialog/native/styles.ts @@ -29,8 +29,7 @@ export default { bottomBar: { alignItems: 'center', justifyContent: 'center', - backgroundColor: BaseTheme.palette.ui01, - height: BaseTheme.spacing[10] + backgroundColor: BaseTheme.palette.ui01 }, clearButton: { diff --git a/react/features/large-video/actions.web.ts b/react/features/large-video/actions.web.ts index 45120fcc264b..8a36cc568c26 100644 --- a/react/features/large-video/actions.web.ts +++ b/react/features/large-video/actions.web.ts @@ -1,8 +1,8 @@ // @ts-expect-error import VideoLayout from '../../../modules/UI/videolayout/VideoLayout'; import { IStore } from '../app/types'; -import { MEDIA_TYPE } from '../base/media/constants'; -import { getTrackByMediaTypeAndParticipant } from '../base/tracks/functions.web'; +import { getParticipantById } from '../base/participants/functions'; +import { getVideoTrackByParticipant } from '../base/tracks/functions.web'; import { SET_SEE_WHAT_IS_BEING_SHARED } from './actionTypes'; @@ -19,11 +19,12 @@ export function captureLargeVideoScreenshot() { const largeVideo = state['features/large-video']; const promise = Promise.resolve(); - if (!largeVideo) { + if (!largeVideo?.participantId) { return promise; } - const tracks = state['features/base/tracks']; - const participantTrack = getTrackByMediaTypeAndParticipant(tracks, MEDIA_TYPE.VIDEO, largeVideo.participantId); + + const participant = getParticipantById(state, largeVideo.participantId); + const participantTrack = getVideoTrackByParticipant(state, participant); // Participants that join the call video muted do not have a jitsiTrack attached. if (!participantTrack?.jitsiTrack) { diff --git a/react/features/lobby/middleware.ts b/react/features/lobby/middleware.ts index 259fbda9647a..503d4d63474b 100644 --- a/react/features/lobby/middleware.ts +++ b/react/features/lobby/middleware.ts @@ -207,7 +207,7 @@ function _handleLobbyNotification(store: IStore) { descriptionKey = 'notify.participantWantsToJoin'; notificationTitle = firstParticipant.name; icon = NOTIFICATION_ICON.PARTICIPANT; - customActionNameKey = [ 'lobby.admit', 'lobby.reject' ]; + customActionNameKey = [ 'participantsPane.actions.admit', 'participantsPane.actions.reject' ]; customActionType = [ BUTTON_TYPES.PRIMARY, BUTTON_TYPES.DESTRUCTIVE ]; customActionHandler = [ () => batch(() => { dispatch(hideNotification(LOBBY_NOTIFICATION_ID)); diff --git a/react/features/mobile/call-integration/middleware.ts b/react/features/mobile/call-integration/middleware.ts index f2ce4fc39c39..451f163b944a 100644 --- a/react/features/mobile/call-integration/middleware.ts +++ b/react/features/mobile/call-integration/middleware.ts @@ -154,10 +154,11 @@ function _conferenceFailed({ getState }: IStore, next: Function, action: AnyActi // prevented the user from joining a specific conference but the app may be // able to eventually join the conference. if (!action.error.recoverable) { + const { callUUID } = action.conference; - if (action?.conference?.callUUID) { + if (callUUID) { delete action.conference.callUUID; - CallIntegration.reportCallFailed(action.conference.callUUIDID); + CallIntegration.reportCallFailed(callUUID); } } @@ -184,9 +185,9 @@ function _conferenceJoined({ getState }: IStore, next: Function, action: AnyActi return result; } - if (action?.conference?.callUUID) { - const { callUUID } = action.conference; + const { callUUID } = action.conference; + if (callUUID) { CallIntegration.reportConnectedOutgoingCall(callUUID) .then(() => { // iOS 13 doesn't like the mute state to be false before the call is started @@ -229,9 +230,11 @@ function _conferenceLeft({ getState }: IStore, next: Function, action: AnyAction return result; } - if (action?.conference?.callUUID) { + const { callUUID } = action.conference; + + if (callUUID) { delete action.conference.callUUID; - CallIntegration.endCall(action.conference.callUUID); + CallIntegration.endCall(callUUID); } return result; @@ -270,7 +273,7 @@ function _conferenceWillJoin({ dispatch, getState }: IStore, next: Function, act } // When assigning the call UUID, do so in upper case, since iOS will return - // it upper cased. + // it upper-cased. conference.callUUID = (callUUID || uuidv4()).toUpperCase(); CallIntegration.startCall(conference.callUUID, handle, hasVideo) diff --git a/react/features/mobile/external-api/middleware.ts b/react/features/mobile/external-api/middleware.ts index ef28d47c31a6..ca3aaf7ad84e 100644 --- a/react/features/mobile/external-api/middleware.ts +++ b/react/features/mobile/external-api/middleware.ts @@ -379,9 +379,10 @@ function _registerForNativeEvents(store: IStore) { dispatch(sendMessage(message)); }); - eventEmitter.addListener(ExternalAPI.SET_CLOSED_CAPTIONS_ENABLED, ({ enabled }: any) => { - dispatch(setRequestingSubtitles(enabled)); - }); + eventEmitter.addListener(ExternalAPI.SET_CLOSED_CAPTIONS_ENABLED, + ({ enabled, displaySubtitles, language }: any) => { + dispatch(setRequestingSubtitles(enabled, displaySubtitles, language)); + }); eventEmitter.addListener(ExternalAPI.TOGGLE_CAMERA, () => { dispatch(toggleCameraFacingMode()); diff --git a/react/features/mobile/react-native-sdk/middleware.js b/react/features/mobile/react-native-sdk/middleware.js index a27185986c75..21b2f34d1012 100644 --- a/react/features/mobile/react-native-sdk/middleware.js +++ b/react/features/mobile/react-native-sdk/middleware.js @@ -9,7 +9,7 @@ import { CONFERENCE_WILL_JOIN } from '../../base/conference/actionTypes'; import { SET_AUDIO_MUTED, SET_VIDEO_MUTED } from '../../base/media/actionTypes'; -import { PARTICIPANT_JOINED } from '../../base/participants/actionTypes'; +import { PARTICIPANT_JOINED, PARTICIPANT_LEFT } from '../../base/participants/actionTypes'; import MiddlewareRegistry from '../../base/redux/MiddlewareRegistry'; import StateListenerRegistry from '../../base/redux/StateListenerRegistry'; import { READY_TO_CLOSE } from '../external-api/actionTypes'; @@ -63,6 +63,14 @@ const { JMOngoingConference } = NativeModules; rnSdkHandlers?.onParticipantJoined && rnSdkHandlers?.onParticipantJoined(participantInfo); break; } + case PARTICIPANT_LEFT: { + const { participant } = action; + + const { id } = participant ?? {}; + + rnSdkHandlers?.onParticipantLeft && rnSdkHandlers?.onParticipantLeft({ id }); + break; + } case READY_TO_CLOSE: rnSdkHandlers?.onReadyToClose && rnSdkHandlers?.onReadyToClose(); break; diff --git a/react/features/participants-pane/components/native/ContextMenuLobbyParticipantReject.tsx b/react/features/participants-pane/components/native/ContextMenuLobbyParticipantReject.tsx index 33d508bdbd0c..f0ffb7f75da1 100644 --- a/react/features/participants-pane/components/native/ContextMenuLobbyParticipantReject.tsx +++ b/react/features/participants-pane/components/native/ContextMenuLobbyParticipantReject.tsx @@ -58,7 +58,7 @@ const ContextMenuLobbyParticipantReject = ({ participant: p }: IProps) => { - { t('lobby.reject') } + { t('participantsPane.actions.reject') } ); diff --git a/react/features/participants-pane/components/native/LobbyParticipantItem.tsx b/react/features/participants-pane/components/native/LobbyParticipantItem.tsx index ccfb6b8b18de..8baa2e7452c1 100644 --- a/react/features/participants-pane/components/native/LobbyParticipantItem.tsx +++ b/react/features/participants-pane/components/native/LobbyParticipantItem.tsx @@ -19,8 +19,8 @@ interface IProps { export const LobbyParticipantItem = ({ participant: p }: IProps) => { const dispatch = useDispatch(); - const admit = useCallback(() => dispatch(setKnockingParticipantApproval(p.id, true)), [ dispatch ]); - const reject = useCallback(() => dispatch(setKnockingParticipantApproval(p.id, false)), [ dispatch ]); + const admit = useCallback(() => dispatch(setKnockingParticipantApproval(p.id, true)), [ dispatch, p.id ]); + const reject = useCallback(() => dispatch(setKnockingParticipantApproval(p.id, false)), [ dispatch, p.id ]); return ( { key = { p.id } participantID = { p.id } >