diff --git a/bigbluebutton-client/locale/ar/bbbResources.properties b/bigbluebutton-client/locale/ar/bbbResources.properties index 17bbf6a6fd8009f569f66c05582c7f8dc43669f7..39b2ac585233a98354ec51d6978be76a12e091fc 100644 --- a/bigbluebutton-client/locale/ar/bbbResources.properties +++ b/bigbluebutton-client/locale/ar/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = الإتصال بالخادم bbb.mainshell.statusProgress.loading = تØÙ…يل bbb.mainshell.statusProgress.cannotConnectServer = عÙوا, لا يمكن الاتصال بالخادم. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (إصدار {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = Ø§ÙØªØ Ù†Ø§ÙØ°Ø© السجلّ bbb.mainshell.meetingNotFound = الاجتماع غير موجود bbb.mainshell.invalidAuthToken = رمز مصادقة غير ØµØ§Ù„Ø @@ -140,7 +140,7 @@ bbb.clientstatus.title = تنبيه الاعدادات bbb.clientstatus.notification = الإخطارات الغير مقروءة bbb.clientstatus.close = إغلاق bbb.clientstatus.tunneling.title = برنامج الØÙ…اية -bbb.clientstatus.tunneling.message = "يمنع Ø£ØØ¯ جدران الØÙ…اية العميل التابع لك من الاتصال بصورة مباشرة من خلال بوابة 1935 بالخادم البعيد؛ ÙˆÙ†Ø±Ø¬Ø Ø§Ù„Ø§ØªØµØ§Ù„ من خلال شبكة أقل تقييدا لإمكانية التواصل بشكل أكثر استقرارا وثباتا. " +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = إصدار Ø§Ù„Ù…ØªØµÙØ bbb.clientstatus.browser.message = "إذا كان Ù„Ù…ØªØµÙØ الخاص بك ({0}) غير Ù…ÙØØ¯Ø«Ø› Ù†Ø±Ø¬Ø ØªØØ¯ÙŠØ« هذا Ø§Ù„Ù…ØªØµÙØ ليتواكب مع Ø£ØØ¯Ø« نسخة صادرة من هذا النوع من Ø§Ù„Ù…ØªØµÙØØ§Øª. " bbb.clientstatus.flash.title = مشغل الÙلاش diff --git a/bigbluebutton-client/locale/cs_CZ/bbbResources.properties b/bigbluebutton-client/locale/cs_CZ/bbbResources.properties index abecc53cf48a7f434d10d97161760a1159a8c18f..a23d37469b962d7a51d66fefaa31b0c409accca6 100644 --- a/bigbluebutton-client/locale/cs_CZ/bbbResources.properties +++ b/bigbluebutton-client/locale/cs_CZ/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = KonfiguraÄnà oznámenà bbb.clientstatus.notification = NepÅ™eÄtená oznámenà bbb.clientstatus.close = ZavÅ™Ãt bbb.clientstatus.tunneling.title = Firewall -bbb.clientstatus.tunneling.message = Firewall znemožňuje pÅ™Ãmé pÅ™ipojenà ke vzdálenému serveru na portu 1935. Pro stabilnà pÅ™ipojenà doporuÄujeme ménÄ› retriktivnà nastavenà sÃtÄ›. +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Verze prohlÞeÄe bbb.clientstatus.browser.message = Váš prohlÞeÄ ({0}) je zastaralý. DoporuÄujeme aktualizovat na poslednà verzi. bbb.clientstatus.flash.title = Flash pÅ™ehrávaÄ diff --git a/bigbluebutton-client/locale/cy_GB/bbbResources.properties b/bigbluebutton-client/locale/cy_GB/bbbResources.properties index f9a5c25a4d156e1851869e150efeba94a03b2f49..924d75bb5fdfc62e4dfd635f38022c7c09f7203a 100644 --- a/bigbluebutton-client/locale/cy_GB/bbbResources.properties +++ b/bigbluebutton-client/locale/cy_GB/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = bbb.clientstatus.notification = bbb.clientstatus.close = Cau bbb.clientstatus.tunneling.title = Mur gwarchod -bbb.clientstatus.tunneling.message = Mae mur gwarchod yn atal eich cleient rhag cysylltu yn uniongyrchol ar borth 1935 i'r gweinydd. Argymell ymuno â rhwydwaith llai cyfyngol ar gyfer cysylltiad mwy sefydlog +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Fersiwn Porwr bbb.clientstatus.browser.message = bbb.clientstatus.flash.title = Flash Player diff --git a/bigbluebutton-client/locale/da_DK/bbbResources.properties b/bigbluebutton-client/locale/da_DK/bbbResources.properties index 6530e862603dc8205b0f8966ebcc438c40fb1135..9fa30d0d13f82f54f922aca196e477ee20c2e932 100644 --- a/bigbluebutton-client/locale/da_DK/bbbResources.properties +++ b/bigbluebutton-client/locale/da_DK/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Tilslutter til serveren bbb.mainshell.statusProgress.loading = Indlæser bbb.mainshell.statusProgress.cannotConnectServer = Vi kan desværre ikke oprette forbindelse til serveren. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = Ã…bn log-vinduet bbb.mainshell.meetingNotFound = Ingen møde fundet. bbb.mainshell.invalidAuthToken = Ugyldig godkendelse @@ -140,7 +140,7 @@ bbb.clientstatus.title = Konfigurations meddelelser bbb.clientstatus.notification = Ikke læst notifikationer bbb.clientstatus.close = Luk bbb.clientstatus.tunneling.title = Firewall -bbb.clientstatus.tunneling.message = En firewall forhindrer din klient i at forbinde direkte med port 1935. Vi anbefaler at deltage i en mindre restriktiv netværk for at opnÃ¥ en mere stabil forbindelse. +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Browser version bbb.clientstatus.browser.message = Din browser ({0}) er ikke op til date. Vi anbefaler at du opdatere til den seneste version. bbb.clientstatus.flash.title = Flash Player @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = Offentliggør bbb.polling.closeButton.label = Luk bbb.polling.customPollOption.label = Brugeropsat afstemning... bbb.polling.pollModal.title = Live undersøgelse resultater -bbb.polling.pollModal.hint = Efterlad dette vindue Ã¥bent for at give eleverne mulighed for at svare pÃ¥ afstemningen. Afstemningen lukkes ved trykke pÃ¥ Luk eller Offentliggør. +bbb.polling.pollModal.hint = bbb.polling.customChoices.title = Indtast svarmuligheder bbb.polling.respondersLabel.novotes = Venter pÃ¥ svar bbb.polling.respondersLabel.text = {0} brugere har svaret diff --git a/bigbluebutton-client/locale/de_DE/bbbResources.properties b/bigbluebutton-client/locale/de_DE/bbbResources.properties index 167387278f0d38972b74d613891cc0a757a821cd..21382cb375554c4904814b5f605579dde146681b 100644 --- a/bigbluebutton-client/locale/de_DE/bbbResources.properties +++ b/bigbluebutton-client/locale/de_DE/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Baue Verbindung zum Server auf bbb.mainshell.statusProgress.loading = Lade bbb.mainshell.statusProgress.cannotConnectServer = Verbindung zum Server konnte nicht hergestellt werden. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = (c) 2018 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) bbb.mainshell.logBtn.toolTip = Protokollfenster öffnen bbb.mainshell.meetingNotFound = Kein Meeting gefunden bbb.mainshell.invalidAuthToken = Ungültiges Authentifizierungs-Token @@ -45,7 +45,7 @@ bbb.micSettings.changeMic = Mikrofon testen oder ändern bbb.micSettings.changeMic.toolTip = Öffne die Mikrofoneinstellungen des Flash Players bbb.micSettings.comboMicList.toolTip = Wählen Sie ein Mikrofon bbb.micSettings.micRecordVolume.label = Pegel -bbb.micSettings.micRecordVolume.toolTip = Stellen Sie Ihr Mikrofon erneut ein +bbb.micSettings.micRecordVolume.toolTip = Stellen Sie Ihren Mikrofonpegel ein bbb.micSettings.nextButton = Weiter bbb.micSettings.nextButton.toolTip = Echotest starten bbb.micSettings.join = Jetzt teilnehmen @@ -115,8 +115,8 @@ bbb.mainToolbar.recordBtn.toolTip.onlyModerators = Nur Moderatoren können die A bbb.mainToolbar.recordBtn.toolTip.wontInterrupt = Die Aufzeichnung kann nicht unterbrochen werden bbb.mainToolbar.recordBtn.toolTip.wontRecord = Diese Sitzung kann nicht aufgezeichnet werden bbb.mainToolbar.recordBtn.confirm.title = Aufzeichnung bestätigen -bbb.mainToolbar.recordBtn.confirm.message.start = Sind Sie sicher, dass Sie die Aufzeichnung der Sitzung starten wollen? -bbb.mainToolbar.recordBtn.confirm.message.stop = Sind Sie sicher, dass Sie die Aufzeichnung der Sitzung beenden wollen? +bbb.mainToolbar.recordBtn.confirm.message.start = Sind Sie sicher, dass Sie die Aufzeichnung der Konferenz starten wollen? +bbb.mainToolbar.recordBtn.confirm.message.stop = Sind Sie sicher, dass Sie die Aufzeichnung der Konferenz beenden wollen? bbb.mainToolbar.recordBtn.notification.title = Aufnahme-Benachrichtigung bbb.mainToolbar.recordBtn.notification.message1 = Sie können diese Konferenz aufnehmen. bbb.mainToolbar.recordBtn.notification.message2 = Klicken Sie den Aufnahme Start-/Stop-Button in der Titelleiste, um die Aufnahme zu beginnen oder zu beenden. @@ -140,7 +140,7 @@ bbb.clientstatus.title = Konfigurationsmeldungen bbb.clientstatus.notification = Ungelesene Meldungen bbb.clientstatus.close = Schließen bbb.clientstatus.tunneling.title = Firewall -bbb.clientstatus.tunneling.message = Eine Firewall verhindert, dass ihr BBB Client sich direkt auf Port 1935 mit dem Server verbindet. Es wird empfohlen ein weniger restriktives Netzwerk zu verwenden, um eine stabilere Verbindung zum Server herzustellen. +bbb.clientstatus.tunneling.message = Eine Firewall verhindert, dass sich Ihr Client direkt mit dem Server verbinden kann. Es wird empfohlen, aus einem weniger restriktiven Netzwerk an Konferenzen teilzunehmen, damit die Verbindung stabiler ist. bbb.clientstatus.browser.title = Browser Version bbb.clientstatus.browser.message = Ihr Browser ({0}) ist nicht aktuell. Es wird empfohlen, ihn auf die neuste Version zu aktualisieren bbb.clientstatus.flash.title = Flash Player @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = Veröffentlichen bbb.polling.closeButton.label = Schließen bbb.polling.customPollOption.label = Benutzerdefinierte Umfrage... bbb.polling.pollModal.title = Live Umfrageergebnisse -bbb.polling.pollModal.hint = Lassen Sie dieses Fenster geöffnet, damit die Teilnehmer ihre Antworten abgeben können. Wenn Sie auf Veröffentlichen oder Schließen klicken, wird die Umfrage dadurch beendet. +bbb.polling.pollModal.hint = Lassen Sie dieses Fenster offen, um auf die Antworten der Teilnehmer zu warten. Sobald Sie auf Veröffentlichen oder Schließen klicken, wird die Umfrage beendet. bbb.polling.customChoices.title = Antwortoptionen eingeben bbb.polling.respondersLabel.novotes = Warte auf Rückmeldungen bbb.polling.respondersLabel.text = {0} Nutzer haben geantwortet @@ -801,7 +801,7 @@ bbb.shortcutkey.specialKeys.minus = Minus bbb.toolbar.videodock.toolTip.closeAllVideos = Alle Videos schließen bbb.users.settings.lockAll = Alle Teilnehmer stummschalten bbb.users.settings.lockAllExcept = Teilnehmer sperren außer Präsentator -bbb.users.settings.lockSettings = Teilnehmer sperren... +bbb.users.settings.lockSettings = Teilnehmerfunktionen einschränken bbb.users.settings.breakoutRooms = Breakout-Räume ... bbb.users.settings.sendBreakoutRoomsInvitations = Einladungen für Breakout-Räume verschicken ... bbb.users.settings.unlockAll = Alle Teilnehmer freigeben @@ -815,15 +815,15 @@ bbb.lockSettings.cancel.toolTip = Fenster schließen ohne zu speichern bbb.lockSettings.hint = Diese Optionen ermöglichen es, bestimmte Funktionen für Zuschauer einzuschränken, wie z.B. die Nutzung des privaten Chats. (Diese Einschränkungen gelten nicht für Moderatoren) bbb.lockSettings.moderatorLocking = Sperrung durch Moderator -bbb.lockSettings.privateChat = Privater Chat -bbb.lockSettings.publicChat = Öffentlicher Chat -bbb.lockSettings.webcam = Webcam -bbb.lockSettings.webcamsOnlyForModerator = Webcams der anderen Zuschauer ausblenden -bbb.lockSettings.microphone = Mikrofon -bbb.lockSettings.layout = Layout -bbb.lockSettings.title=Teilnehmer sperren +bbb.lockSettings.privateChat = Privater Chat gesperrt +bbb.lockSettings.publicChat = Öffentlicher Chat gesperrt +bbb.lockSettings.webcam = Webcamfreigabe gesperrt +bbb.lockSettings.webcamsOnlyForModerator = Webcams anderer Teilnehmer sehen +bbb.lockSettings.microphone = Mikrofonfreigabe gesperrt +bbb.lockSettings.layout = Layoutwechsel gesperrt +bbb.lockSettings.title=Funktionen einschränken bbb.lockSettings.feature=Eigenschaft -bbb.lockSettings.locked=Gesperrt +bbb.lockSettings.locked=Aktiviert bbb.lockSettings.lockOnJoin=Beim Konferenzbeitritt sperren bbb.users.breakout.breakoutRooms = Breakout-Räume diff --git a/bigbluebutton-client/locale/el_GR/bbbResources.properties b/bigbluebutton-client/locale/el_GR/bbbResources.properties index ed233676b4bbdf594b99eb667d26ddf03ec27bf9..3888d43c13fa8821eda3620a04ba1bc15118739b 100644 --- a/bigbluebutton-client/locale/el_GR/bbbResources.properties +++ b/bigbluebutton-client/locale/el_GR/bbbResources.properties @@ -1,8 +1,8 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = ΣÏνδεση στον διακομιστή -bbb.mainshell.statusProgress.loading = +bbb.mainshell.statusProgress.loading = ΦοÏτώνει bbb.mainshell.statusProgress.cannotConnectServer = ΛυποÏμαστε, αλλά δεν μποÏοÏμε να συνδεθοÏμε στο διακομιστή -bbb.mainshell.copyrightLabel2 = +bbb.mainshell.copyrightLabel2 = (c) 2016 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) bbb.mainshell.logBtn.toolTip = Ανοίξτε το παÏάθυÏο καταγÏαφής bbb.mainshell.meetingNotFound = Δεν βÏÎθηκε η συνεδÏίαση bbb.mainshell.invalidAuthToken = Λάθος στοιχεία πιστοποίησης @@ -17,9 +17,9 @@ bbb.mainshell.quote.attribution.2 = bbb.mainshell.quote.sentence.3 = bbb.mainshell.quote.attribution.3 = bbb.mainshell.quote.sentence.4 = -bbb.mainshell.quote.attribution.4 = +bbb.mainshell.quote.attribution.4 = Anthony J. D'Angelo bbb.mainshell.quote.sentence.5 = -bbb.mainshell.quote.attribution.5 = +bbb.mainshell.quote.attribution.5 = Neil Armstrong bbb.oldlocalewindow.reminder1 = ΜποÏεί να Îχετε παλαιότεÏη μετάφÏαση του BigBlueButton. bbb.oldlocalewindow.reminder2 = ΠαÏακαλοÏμε εκκαθαÏίστε το Ï€Ïόσφατο ιστοÏικό του πεÏιηγητή σας και ξαναπÏοσπαθήστε. bbb.oldlocalewindow.windowTitle = Î Ïοσοχή: Παλαιά ΜετάφÏαση @@ -97,7 +97,7 @@ bbb.webrtcWarning.connection.reestablished = Αποκαταστάθηκε η σ bbb.inactivityWarning.title = bbb.inactivityWarning.message = bbb.shuttingDown.message = -bbb.inactivityWarning.cancel = +bbb.inactivityWarning.cancel = ΑκÏÏωση bbb.mainToolbar.helpBtn = Βοήθεια bbb.mainToolbar.logoutBtn = ΑποσÏνδεση bbb.mainToolbar.logoutBtn.toolTip = ΑποσÏνδεση @@ -123,16 +123,16 @@ bbb.mainToolbar.recordBtn.notification.message2 = Για την εκκίνηση bbb.mainToolbar.recordingLabel.recording = (ΕγγÏαφή) bbb.mainToolbar.recordingLabel.notRecording = Δεν γίνεται εγγÏαφή bbb.waitWindow.waitMessage.message = -bbb.waitWindow.waitMessage.title = -bbb.guests.title = +bbb.waitWindow.waitMessage.title = Αναμονή +bbb.guests.title = ΕπισκÎπτες bbb.guests.message.singular = bbb.guests.message.plural = -bbb.guests.allowBtn.toolTip = +bbb.guests.allowBtn.toolTip = ΕπιτÏÎπω bbb.guests.allowEveryoneBtn.text = bbb.guests.denyBtn.toolTip = bbb.guests.denyEveryoneBtn.text = bbb.guests.rememberAction.text = -bbb.guests.alwaysAccept = +bbb.guests.alwaysAccept = Αποδοχή πάντα bbb.guests.alwaysDeny = bbb.guests.askModerator = bbb.guests.Management = @@ -140,7 +140,7 @@ bbb.clientstatus.title = Ειδοποιήσεις Ïυθμίσεων bbb.clientstatus.notification = Αδιάβαστες ειδοποιήσεις bbb.clientstatus.close = Κλείσιμο bbb.clientstatus.tunneling.title = Τείχος Î Ïοστασίας -bbb.clientstatus.tunneling.message = Ένα τείχος Ï€Ïοστασίας εμποδίζει τον πελάτη σας να συνδεθεί απευθείας στη θÏÏα 1935 στον απομακÏυσμÎνο διακομιστή. Î Ïοτείνουμε να ενταχθεί σε Îνα λιγότεÏο πεÏιοÏιστικό δίκτυο για μια πιο σταθεÏή σÏνδεση. +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Έκδοση πεÏιηγητή bbb.clientstatus.browser.message = Ο πεÏιηγητής σας ({0}) δεν είναι ενημεÏωμÎνος. Î Ïοτείνεται ενημÎÏωση στην τελευταία Îκδοση. bbb.clientstatus.flash.title = Flash Player @@ -151,7 +151,7 @@ bbb.clientstatus.webrtc.almostStrongStatus = bbb.clientstatus.webrtc.almostWeakStatus = bbb.clientstatus.webrtc.weakStatus = bbb.clientstatus.webrtc.message = ΣυνιστοÏμε τη χÏήση είτε του Firefox ή του Chrome για καλÏτεÏη ακουστική. -bbb.clientstatus.java.title = +bbb.clientstatus.java.title = Java bbb.clientstatus.java.notdetected = bbb.clientstatus.java.notinstalled = bbb.clientstatus.java.oldversion = @@ -200,7 +200,7 @@ bbb.users.usersGrid.statusItemRenderer.speakFaster = bbb.users.usersGrid.statusItemRenderer.speakSlower = bbb.users.usersGrid.statusItemRenderer.away = bbb.users.usersGrid.statusItemRenderer.confused = -bbb.users.usersGrid.statusItemRenderer.neutral = +bbb.users.usersGrid.statusItemRenderer.neutral = ΟυδÎτεÏο bbb.users.usersGrid.statusItemRenderer.happy = bbb.users.usersGrid.statusItemRenderer.sad = bbb.users.usersGrid.statusItemRenderer.clearStatus = ΚαθαÏισμός κατάστασης @@ -215,7 +215,7 @@ bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Κάντε κλικ για ν bbb.users.usersGrid.mediaItemRenderer.pushToMute = Κάντε κλικ για να απενεÏγοποιήσετε τον ήχο στον χÏήστη bbb.users.usersGrid.mediaItemRenderer.pushToLock = Κλείδωμα του χÏήστη {0} bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Ξεκλείδωμα του χÏήστη {0} -bbb.users.usersGrid.mediaItemRenderer.kickUser = +bbb.users.usersGrid.mediaItemRenderer.kickUser = ΔιαγÏαφή {0} bbb.users.usersGrid.mediaItemRenderer.webcam = Η κάμεÏα διαμοιÏάζεται bbb.users.usersGrid.mediaItemRenderer.micOff = ΜικÏόφωνο κλειστό bbb.users.usersGrid.mediaItemRenderer.micOn = ΜικÏόφωνο ανοικτό @@ -225,15 +225,15 @@ bbb.users.usersGrid.mediaItemRenderer.demoteUser = bbb.users.emojiStatus.clear = ΚαθαÏισμός bbb.users.emojiStatus.raiseHand = bbb.users.emojiStatus.happy = -bbb.users.emojiStatus.neutral = +bbb.users.emojiStatus.neutral = ΟυδÎτεÏο bbb.users.emojiStatus.sad = bbb.users.emojiStatus.confused = bbb.users.emojiStatus.away = bbb.users.emojiStatus.thumbsUp = bbb.users.emojiStatus.thumbsDown = bbb.users.emojiStatus.applause = -bbb.users.emojiStatus.agree = -bbb.users.emojiStatus.disagree = +bbb.users.emojiStatus.agree = Συμφωνώ +bbb.users.emojiStatus.disagree = Δεν Συμφωνώ bbb.users.emojiStatus.none = bbb.users.emojiStatus.speakLouder = bbb.users.emojiStatus.speakSofter = @@ -257,7 +257,7 @@ bbb.presentation.uploadcomplete = Η μεταφόÏτωση ολοκληÏώθη bbb.presentation.uploaded = μεταφοÏτώθηκε. bbb.presentation.document.supported = Το μεταφοÏτωμÎνο ÎγγÏαφο υποστηÏίζεται. Ξεκινάει η διαδικασία μετατÏοπής... bbb.presentation.document.converted = Το ÎγγÏαφο του office μετατÏάπηκε επιτυχώς. -bbb.presentation.error.document.convert.failed = +bbb.presentation.error.document.convert.failed = Δοκιμάστε να μετατÏÎψετε το ÎγγÏαφο σε PDF και ανεβάστε το ξανά. bbb.presentation.error.document.convert.invalid = bbb.presentation.error.io = IO (ERROR)Σφάλμα (Εισόδου-Εξόδου): ΠαÏακαλοÏμε επικοινωνήστε με τον διαχειÏιστή. bbb.presentation.error.security = Security Σφάλμα (Σφάλμα Ασφαλείας): ΠαÏακαλοÏμε επικοινωνήστε με τον διαχειÏιστή. @@ -287,7 +287,7 @@ bbb.fileupload.deleteBtn.toolTip = ΔιαγÏαφή παÏουσίασης bbb.fileupload.showBtn = Î Ïοβολή bbb.fileupload.retry = bbb.fileupload.showBtn.toolTip = Î Ïοβολή παÏουσίασης -bbb.fileupload.close.tooltip = +bbb.fileupload.close.tooltip = Κλείσιμο bbb.fileupload.close.accessibilityName = bbb.fileupload.genThumbText = ΔημιουÏγία μικÏογÏαφιών... bbb.fileupload.progBarLbl = Î Ïόοδος: @@ -295,10 +295,10 @@ bbb.fileupload.fileFormatHint = bbb.fileupload.letUserDownload = bbb.fileupload.letUserDownload.tooltip = bbb.filedownload.title = -bbb.filedownload.close.tooltip = +bbb.filedownload.close.tooltip = Κλείσιμο bbb.filedownload.close.accessibilityName = bbb.filedownload.fileLbl = -bbb.filedownload.downloadBtn = +bbb.filedownload.downloadBtn = ΚατÎβασμα bbb.filedownload.downloadBtn.toolTip = bbb.filedownload.thisFileIsDownloadable = bbb.chat.title = Συζήτηση @@ -309,13 +309,13 @@ bbb.chat.sendBtn.toolTip = Αποστολή μηνÏματος bbb.chat.sendBtn.accessibilityName = Αποστολή μηνÏματος bbb.chat.saveBtn.toolTip = bbb.chat.saveBtn.accessibilityName = -bbb.chat.saveBtn.label = +bbb.chat.saveBtn.label = Αποθήκευση bbb.chat.save.complete = bbb.chat.save.ioerror = bbb.chat.save.filename = bbb.chat.copyBtn.toolTip = bbb.chat.copyBtn.accessibilityName = -bbb.chat.copyBtn.label = +bbb.chat.copyBtn.label = ΑντιγÏαφή bbb.chat.copy.complete = bbb.chat.clearBtn.toolTip = bbb.chat.clearBtn.accessibilityName = @@ -334,7 +334,7 @@ bbb.chat.usersList.accessibilityName = ΕπιλÎξτε το χÏήστη για bbb.chat.chatOptions = ΠαÏάθυÏο συνομιλίας ΕπιλογÎÏ‚ συνομιλίας bbb.chat.fontSize = ΠαÏάθυÏο συνομιλίας ΜÎγεθος γÏαμματοσειÏάς bbb.chat.cmbFontSize.toolTip = Επιλογή ΜεγÎθους ΓÏαμματοσειÏάς ΠαÏάθυÏου Συνομιλίας -bbb.chat.messageList = +bbb.chat.messageList = ΜηνÏματα Συνομιλίας bbb.chat.minimizeBtn.accessibilityName = Ελαχιστοποίηση του παÏαθÏÏου συνομιλίας bbb.chat.maximizeRestoreBtn.accessibilityName = Μεγιστοποίηση του παÏαθÏÏου συνομιλίας bbb.chat.closeBtn.accessibilityName = Κλείσιμο του παÏαθÏÏου συνομιλίας @@ -373,17 +373,17 @@ bbb.video.streamClose.toolTip = Κλείσιμο Ïοής για: {0} bbb.video.message.browserhttp = bbb.screensharePublish.title = bbb.screensharePublish.pause.tooltip = -bbb.screensharePublish.pause.label = +bbb.screensharePublish.pause.label = ΠαÏση bbb.screensharePublish.restart.tooltip = -bbb.screensharePublish.restart.label = +bbb.screensharePublish.restart.label = ΣυνÎχεια bbb.screensharePublish.maximizeRestoreBtn.toolTip = bbb.screensharePublish.closeBtn.toolTip = bbb.screensharePublish.closeBtn.accessibilityName = -bbb.screensharePublish.minimizeBtn.toolTip = +bbb.screensharePublish.minimizeBtn.toolTip = Ελαχιστοποίηση bbb.screensharePublish.minimizeBtn.accessibilityName = bbb.screensharePublish.maximizeRestoreBtn.accessibilityName = bbb.screensharePublish.commonHelpText.text = -bbb.screensharePublish.helpButton.toolTip = +bbb.screensharePublish.helpButton.toolTip = Βοήθεια bbb.screensharePublish.helpButton.accessibilityName = bbb.screensharePublish.helpText.PCIE1 = bbb.screensharePublish.helpText.PCIE2 = @@ -413,7 +413,7 @@ bbb.screensharePublish.helpText.LinuxChrome1 = bbb.screensharePublish.helpText.LinuxChrome2 = bbb.screensharePublish.helpText.LinuxChrome3 = bbb.screensharePublish.shareTypeLabel.text = -bbb.screensharePublish.shareType.fullScreen = +bbb.screensharePublish.shareType.fullScreen = ΠλήÏης οθόνη bbb.screensharePublish.shareType.region = bbb.screensharePublish.pauseMessage.label = bbb.screensharePublish.startFailed.label = @@ -422,9 +422,9 @@ bbb.screensharePublish.jwsCrashed.label = bbb.screensharePublish.commonErrorMessage.label = bbb.screensharePublish.tunnelingErrorMessage.one = bbb.screensharePublish.tunnelingErrorMessage.two = -bbb.screensharePublish.cancelButton.label = -bbb.screensharePublish.startButton.label = -bbb.screensharePublish.stopButton.label = +bbb.screensharePublish.cancelButton.label = ΑκÏÏωση +bbb.screensharePublish.startButton.label = ΈναÏξη +bbb.screensharePublish.stopButton.label = Διακοπή bbb.screensharePublish.stopButton.toolTip = bbb.screensharePublish.WebRTCChromeExtensionMissing.label = bbb.screensharePublish.WebRTCRetryExtensionInstallation.label = @@ -440,17 +440,17 @@ bbb.screenshareView.actualSize = bbb.screenshareView.minimizeBtn.accessibilityName = bbb.screenshareView.maximizeRestoreBtn.accessibilityName = bbb.screenshareView.closeBtn.accessibilityName = -bbb.toolbar.phone.toolTip.start = -bbb.toolbar.phone.toolTip.stop = +bbb.toolbar.phone.toolTip.start = ΕνεÏγοποίηση Ήχου (μικÏόφωνο ή μόνο ακÏόαση) +bbb.toolbar.phone.toolTip.stop = ΑπενεÏγοποίηση Ήχου bbb.toolbar.phone.toolTip.mute = Διακοπή παÏακολοÏθησης συνεδÏίου bbb.toolbar.phone.toolTip.unmute = Εκκίνηση παÏακολοÏθησης συνεδÏίου bbb.toolbar.phone.toolTip.nomic = Δε βÏÎθηκε μικÏόφωνο -bbb.toolbar.deskshare.toolTip.start = -bbb.toolbar.deskshare.toolTip.stop = +bbb.toolbar.deskshare.toolTip.start = Άνοιγμα του παÏαθÏÏου διαμοιÏÎ±ÏƒÎ¼Î¿Ï ÎµÏ€Î¹Ï†Î¬Î½ÎµÎ¹Î±Ï‚ εÏγασίας +bbb.toolbar.deskshare.toolTip.stop = Διακοπή διαμοιÏÎ±ÏƒÎ¼Î¿Ï Ï„Î·Ï‚ επιφάνειας εÏγασίας σου bbb.toolbar.sharednotes.toolTip = bbb.toolbar.video.toolTip.start = ΔιαμοιÏασμός της κάμεÏας σας bbb.toolbar.video.toolTip.stop = Κλείσιμο διαμοιÏÎ±ÏƒÎ¼Î¿Ï Ï„Î·Ï‚ κάμεÏάς σου -bbb.layout.addButton.label = +bbb.layout.addButton.label = Î Ïοσθήκη bbb.layout.addButton.toolTip = Î Ïοσθήκη της Ï€ÏοσαÏμοσμÎνης εμφάνισης στην λίστα bbb.layout.overwriteLayoutName.title = bbb.layout.overwriteLayoutName.text = @@ -464,7 +464,7 @@ bbb.layout.combo.custom = * Î ÏοσαÏμοσμÎνη εμφάνιση bbb.layout.combo.customName = Î ÏοσαÏμοσμÎνη εμφάνιση bbb.layout.combo.remote = ΑπομακÏυσμÎνο bbb.layout.window.name = -bbb.layout.window.close.tooltip = +bbb.layout.window.close.tooltip = Κλείσιμο bbb.layout.window.close.accessibilityName = bbb.layout.save.complete = Οι εμφανίσεις αποθηκεÏτηκαν επιτυχώς bbb.layout.save.ioerror = @@ -517,9 +517,9 @@ bbb.logout.refresh.message = Εάν αυτή η αποσÏνδεση ήταν α bbb.logout.refresh.label = ΕπανασÏνδεση bbb.logout.feedback.hint = bbb.logout.feedback.label = -bbb.settings.title = -bbb.settings.ok = -bbb.settings.cancel = +bbb.settings.title = Ρυθμίσεις +bbb.settings.ok = OK +bbb.settings.cancel = ΑκÏÏωση bbb.settings.btn.toolTip = bbb.logout.confirm.title = Επιβεβαίωση ΑποσÏνδεσης bbb.logout.confirm.message = Είστε σίγουÏος/η οτι θÎλετε να αποσυνδεθείτε; @@ -542,7 +542,7 @@ bbb.notes.saveBtn.toolTip = Αποθήκευση σημείωσης bbb.sharedNotes.title = bbb.sharedNotes.quickLink.label = bbb.sharedNotes.createNoteWindow.label = -bbb.sharedNotes.createNoteWindow.close.tooltip = +bbb.sharedNotes.createNoteWindow.close.tooltip = Κλείσιμο bbb.sharedNotes.createNoteWindow.close.accessibilityName = bbb.sharedNotes.typing.single = bbb.sharedNotes.typing.double = @@ -551,8 +551,8 @@ bbb.sharedNotes.save.toolTip = bbb.sharedNotes.save.complete = bbb.sharedNotes.save.ioerror = bbb.sharedNotes.save.htmlLabel = -bbb.sharedNotes.save.txtLabel = -bbb.sharedNotes.new.label = +bbb.sharedNotes.save.txtLabel = Απλο κείμενο (.txt) +bbb.sharedNotes.new.label = ΔημιουÏγία bbb.sharedNotes.new.toolTip = bbb.sharedNotes.limit.label = bbb.sharedNotes.clear.label = @@ -578,21 +578,21 @@ bbb.settings.flash.label = Σφάλμα Îκδοσης Flash bbb.settings.flash.text = Έχετε εγκατεστημÎνη την Îκδοση {0} του Flash, αλλά χÏειάζεστε τουλάχιστον την Îκδοση {1} για να λειτουÏγεί το BigBlueButton απÏόσκοπτα. Κάντε κλικ στο πλήκτÏο παÏακάτω για να εγκαταστήσετε τη νεότεÏη Îκδοση του Ï€ÏογÏάμματος Adobe Flash. bbb.settings.flash.command = Εγκατάσταση νεότεÏης Îκδοσης Flash bbb.settings.isight.label = Σφάλμα κάμεÏας iSight -bbb.settings.isight.text = +bbb.settings.isight.text = Εάν αντιμετωπίζετε Ï€Ïοβλήματα με την iSight κάμεÏά σας, ενδεχομÎνως αυτό να οφείλεται στο ότι χÏησιμοποιείτε OS X 10.6.5., κάτι που είναι γνωστό ότι δημιουÏγεί Ï€Ïοβλήματα στο Flash και δεν είναι δυνατή η σÏλληψη εικόνας από την iSight κάμεÏα. Για να το διοÏθώσετε, κάντε κλικ στον παÏακάτω σÏνδεσμο για να εγκαταστήσετε μια νεότεÏη Îκδοση του Flash, ή αναβαθμίστε το λογισμικό Mac σε νεότεÏη Îκδοση. bbb.settings.isight.command = Εγκατάσταση Flash 10.2 RC2 bbb.settings.warning.label = Î Ïοειδοποίηση bbb.settings.warning.close = Κλείσιμο της Ï€Ïοειδοποίησης bbb.settings.noissues = Δεν εντοπίστηκαν εκκÏεμή ζητήματα bbb.settings.instructions = Αποδεχτείτε το αίτημα του Flash που ζητά δικαιώματα Ï€Ïόσβασης στην κάμεÏά σας. Εάν βλÎπετε και ακοÏτε τον εαυτό σας σωστά, ο πεÏιηγητής σας Îχει Ïυθμιστεί σωστά. Άλλα σημαντικά ζητήματα εμφανίζονται παÏακάτω. Κάντε κλικ σε καθÎνα από αυτά για να βÏείτε πιθανÎÏ‚ λÏσεις. bbb.bwmonitor.title = -bbb.bwmonitor.upload = -bbb.bwmonitor.upload.short = -bbb.bwmonitor.download = -bbb.bwmonitor.download.short = -bbb.bwmonitor.total = +bbb.bwmonitor.upload = ΜεταφόÏτωση +bbb.bwmonitor.upload.short = Πάνω +bbb.bwmonitor.download = ΚατÎβασμα +bbb.bwmonitor.download.short = Κάτω +bbb.bwmonitor.total = ΣÏνολο bbb.bwmonitor.current = -bbb.bwmonitor.available = -bbb.bwmonitor.latency = +bbb.bwmonitor.available = ΔιαθÎσιμος/η +bbb.bwmonitor.latency = ΚαθυστÎÏηση ltbcustom.bbb.highlighter.toolbar.triangle = ΤÏίγωνο ltbcustom.bbb.highlighter.toolbar.triangle.accessibilityName = Αλλαγή του κÎÏσοÏα της οθόνης σε Ï„Ïίγωνο ltbcustom.bbb.highlighter.toolbar.line = ΓÏαμμή @@ -620,12 +620,12 @@ bbb.caption.option.takeowner = bbb.caption.option.takeowner.tooltip = bbb.caption.option.fontfamily = bbb.caption.option.fontfamily.tooltip = -bbb.caption.option.fontsize = -bbb.caption.option.fontsize.tooltip = +bbb.caption.option.fontsize = ΜÎγεθος γÏαμματοσειÏάς: +bbb.caption.option.fontsize.tooltip = ΜÎγεθος γÏαμματοσειÏάς bbb.caption.option.backcolor = bbb.caption.option.backcolor.tooltip = -bbb.caption.option.textcolor = -bbb.caption.option.textcolor.tooltip = +bbb.caption.option.textcolor = ΧÏώμα γÏαμματοσειÏάς: +bbb.caption.option.textcolor.tooltip = ΧÏώμα γÏαμματοσειÏάς bbb.accessibility.clientReady = Έτοιμο @@ -662,7 +662,7 @@ bbb.shortcutkey.general.minimize.function = Ελαχιστοποίηση Ï„ÏÎ bbb.shortcutkey.general.maximize = 187 bbb.shortcutkey.general.maximize.function = Μεγιστοποίηση Ï„ÏÎχοντος παÏαθÏÏου -bbb.shortcutkey.flash.exit = +bbb.shortcutkey.flash.exit = 79 bbb.shortcutkey.flash.exit.function = ΕπικÎντÏωση εκτός του flash παÏαθÏÏου bbb.shortcutkey.users.muteme = 77 bbb.shortcutkey.users.muteme.function = Σίγαση και ενεÏγοποίηση του μικÏοφώνου σου @@ -681,7 +681,7 @@ bbb.shortcutkey.focus.presentation = 51 bbb.shortcutkey.focus.presentation.function = Μετακίνηση της εστίασης στο παÏάθυÏο της ΠαÏουσίασης bbb.shortcutkey.focus.chat = 52 bbb.shortcutkey.focus.chat.function = ΜεταφοÏά της εστίασης στο παÏάθυÏο συνομιλίας -bbb.shortcutkey.focus.caption = +bbb.shortcutkey.focus.caption = 53 bbb.shortcutkey.focus.caption.function = bbb.shortcutkey.share.desktop = 68 @@ -696,7 +696,7 @@ bbb.shortcutkey.logout.function = ΑποσÏνδεση από αυτή την σ bbb.shortcutkey.raiseHand = 82 bbb.shortcutkey.raiseHand.function = Ύψωσε το χÎÏι σου -bbb.shortcutkey.present.upload = +bbb.shortcutkey.present.upload = 89 bbb.shortcutkey.present.upload.function = ΑνÎβασμα παÏουσίασης bbb.shortcutkey.present.previous = 65 bbb.shortcutkey.present.previous.function = Πήγαινε στην Ï€ÏοηγοÏμενη διαφάνεια @@ -706,12 +706,12 @@ bbb.shortcutkey.present.next = 69 bbb.shortcutkey.present.next.function = Πήγαινε στην επόμενη διαφάνεια bbb.shortcutkey.present.fitWidth = 70 bbb.shortcutkey.present.fitWidth.function = Î ÏοσάÏμοσε τις διαφάνειες στο πλάτος -bbb.shortcutkey.present.fitPage = +bbb.shortcutkey.present.fitPage = 82 bbb.shortcutkey.present.fitPage.function = Î ÏοσάÏμοσε τις διαφάνειες στη σελίδα -bbb.shortcutkey.users.makePresenter = +bbb.shortcutkey.users.makePresenter = 89 bbb.shortcutkey.users.makePresenter.function = Κάνε το επιλεγμÎνο άτομο παÏουσιαστή -bbb.shortcutkey.users.kick = +bbb.shortcutkey.users.kick = 69 bbb.shortcutkey.users.kick.function = bbb.shortcutkey.users.mute = 83 bbb.shortcutkey.users.mute.function = Σίγαση ή ενεÏγοποίηση του ήχου στο επιλεγμÎνο άτομο @@ -719,18 +719,18 @@ bbb.shortcutkey.users.muteall = 65 bbb.shortcutkey.users.muteall.function = Σίγαση ή ενεÏγοποίηση του ήχου σε όλους τους χÏήστες bbb.shortcutkey.users.muteAllButPres = 65 bbb.shortcutkey.users.muteAllButPres.function = Σίγαση σε όλους εκτός του παÏουσιαστή -bbb.shortcutkey.users.breakoutRooms = +bbb.shortcutkey.users.breakoutRooms = 75 bbb.shortcutkey.users.breakoutRooms.function = -bbb.shortcutkey.users.focusBreakoutRooms = +bbb.shortcutkey.users.focusBreakoutRooms = 82 bbb.shortcutkey.users.focusBreakoutRooms.function = -bbb.shortcutkey.users.listenToBreakoutRoom = +bbb.shortcutkey.users.listenToBreakoutRoom = 76 bbb.shortcutkey.users.listenToBreakoutRoom.function = -bbb.shortcutkey.users.joinBreakoutRoom = +bbb.shortcutkey.users.joinBreakoutRoom = 79 bbb.shortcutkey.users.joinBreakoutRoom.function = bbb.shortcutkey.chat.focusTabs = 89 bbb.shortcutkey.chat.focusTabs.function = Εστίασε στις καÏÏ„Îλες συνομιλιών -bbb.shortcutkey.chat.focusBox = +bbb.shortcutkey.chat.focusBox = 82 bbb.shortcutkey.chat.focusBox.function = bbb.shortcutkey.chat.changeColour = 67 bbb.shortcutkey.chat.changeColour.function = Εστίαση στην επιλογή χÏώματος γÏαμματαοσειÏάς. @@ -756,7 +756,7 @@ bbb.shortcutkey.chat.chatbox.goread.function = Πλοήγηση στο πιο Ï€ bbb.shortcutkey.chat.chatbox.debug = 71 bbb.shortcutkey.chat.chatbox.debug.function = Î ÏοσωÏινό ενεÏγό κουμπί αποσφαλμάτωσης -bbb.shortcutkey.caption.takeOwnership = +bbb.shortcutkey.caption.takeOwnership = 79 bbb.shortcutkey.caption.takeOwnership.function = bbb.polling.startButton.tooltip = ΈναÏξη ΨηφοφοÏίας @@ -831,21 +831,21 @@ bbb.users.breakout.updateBreakoutRooms = bbb.users.breakout.timerForRoom.toolTip = bbb.users.breakout.timer.toolTip = bbb.users.breakout.calculatingRemainingTime = -bbb.users.breakout.closing = +bbb.users.breakout.closing = Κλείνει bbb.users.breakout.closewarning.text = -bbb.users.breakout.rooms = +bbb.users.breakout.rooms = Δωμάτια bbb.users.breakout.roomsCombo.accessibilityName = -bbb.users.breakout.room = +bbb.users.breakout.room = Δωμάτιο bbb.users.breakout.timeLimit = bbb.users.breakout.durationStepper.accessibilityName = -bbb.users.breakout.minutes = -bbb.users.breakout.record = +bbb.users.breakout.minutes = Λεπτά +bbb.users.breakout.record = ΕγγÏαφή bbb.users.breakout.recordCheckbox.accessibilityName = bbb.users.breakout.notAssigned = bbb.users.breakout.dragAndDropToolTip = -bbb.users.breakout.start = -bbb.users.breakout.invite = -bbb.users.breakout.close = +bbb.users.breakout.start = ΈναÏξη +bbb.users.breakout.invite = Î Ïοσκάλεσε +bbb.users.breakout.close = Κλείσιμο bbb.users.breakout.closeAllRooms = bbb.users.breakout.insufficientUsers = bbb.users.breakout.confirm = @@ -853,19 +853,19 @@ bbb.users.breakout.invited = bbb.users.breakout.accept = bbb.users.breakout.joinSession = bbb.users.breakout.joinSession.accessibilityName = -bbb.users.breakout.joinSession.close.tooltip = +bbb.users.breakout.joinSession.close.tooltip = Κλείσιμο bbb.users.breakout.joinSession.close.accessibilityName = bbb.users.breakout.youareinroom = -bbb.users.roomsGrid.room = -bbb.users.roomsGrid.users = -bbb.users.roomsGrid.action = +bbb.users.roomsGrid.room = Δωμάτιο +bbb.users.roomsGrid.users = ΧÏήστες +bbb.users.roomsGrid.action = ΕνÎÏγεια bbb.users.roomsGrid.transfer = bbb.users.roomsGrid.join = bbb.users.roomsGrid.noUsers = bbb.langSelector.default= -bbb.alert.cancel = -bbb.alert.ok = -bbb.alert.no = -bbb.alert.yes = +bbb.alert.cancel = ΑκÏÏωση +bbb.alert.ok = OK +bbb.alert.no = Οχι +bbb.alert.yes = Îαι diff --git a/bigbluebutton-client/locale/es_419/bbbResources.properties b/bigbluebutton-client/locale/es_419/bbbResources.properties index fe87e9ff650ad8d4247056e1653ed10d244c4d94..b99e7a232d6d49cecf45c7d207ebbbeb6bee3020 100644 --- a/bigbluebutton-client/locale/es_419/bbbResources.properties +++ b/bigbluebutton-client/locale/es_419/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Conectando al servidor bbb.mainshell.statusProgress.loading = Cargando bbb.mainshell.statusProgress.cannotConnectServer = Lo sentimos, no se puede conectar al servidor. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (versión {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = Abrir la ventana de Registro (Log) bbb.mainshell.meetingNotFound = Sesión no encontrada bbb.mainshell.invalidAuthToken = Token de autenticación inválido @@ -70,7 +70,7 @@ bbb.micPermissions.message.browserhttp = bbb.micPermissions.firefox.title = Permisos de micrófono en Firefox bbb.micPermissions.firefox.message = bbb.micPermissions.chrome.title = Permisos de micrófono en Chrome -bbb.micPermissions.chrome.message = +bbb.micPermissions.chrome.message = Haz click para dar permiso a Chrome de usar tu micrófono. bbb.micWarning.title = Alerta de audio bbb.micWarning.joinBtn.label = Unirse de todas formas bbb.micWarning.testAgain.label = Probar de nuevo @@ -123,33 +123,33 @@ bbb.mainToolbar.recordBtn.notification.message2 = Debe hacer click en el botón bbb.mainToolbar.recordingLabel.recording = (Grabación) bbb.mainToolbar.recordingLabel.notRecording = No grabando bbb.waitWindow.waitMessage.message = -bbb.waitWindow.waitMessage.title = +bbb.waitWindow.waitMessage.title = Esperando bbb.guests.title = -bbb.guests.message.singular = -bbb.guests.message.plural = +bbb.guests.message.singular = {0} participantes desean unirse a esta reunión +bbb.guests.message.plural = {0} participantes desean ingresar a esta reunión bbb.guests.allowBtn.toolTip = bbb.guests.allowEveryoneBtn.text = -bbb.guests.denyBtn.toolTip = -bbb.guests.denyEveryoneBtn.text = +bbb.guests.denyBtn.toolTip = Negar +bbb.guests.denyEveryoneBtn.text = Negar a todos bbb.guests.rememberAction.text = bbb.guests.alwaysAccept = -bbb.guests.alwaysDeny = -bbb.guests.askModerator = -bbb.guests.Management = +bbb.guests.alwaysDeny = Siempre negar +bbb.guests.askModerator = Preguntar al moderador +bbb.guests.Management = Gestión de invitados bbb.clientstatus.title = Notificaciones de configuración bbb.clientstatus.notification = Notificaciones sin leer bbb.clientstatus.close = Cerrar bbb.clientstatus.tunneling.title = Contrafuegos -bbb.clientstatus.tunneling.message = Un cortafuegos está evitando que el cliente se conecte directamente al servidor remoto por el puerto 1935. Se recomienda utilizar una red menos restringida para obtener una conexión más estable +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Versión de navegador bbb.clientstatus.browser.message = El navegador ({0}) no se encuentra actualizado. Se recomienda actualizarlo a la última versión. bbb.clientstatus.flash.title = Reproductor Flash bbb.clientstatus.flash.message = El reproductor Flash ({0}) no se encuentra actualizado. Se recomienda actualizarlo a la última versión. bbb.clientstatus.webrtc.title = Audio -bbb.clientstatus.webrtc.strongStatus = -bbb.clientstatus.webrtc.almostStrongStatus = -bbb.clientstatus.webrtc.almostWeakStatus = -bbb.clientstatus.webrtc.weakStatus = +bbb.clientstatus.webrtc.strongStatus = Tu conexión de audio WebRTC es genial +bbb.clientstatus.webrtc.almostStrongStatus = Tu conexión de audio WebRTC es buena +bbb.clientstatus.webrtc.almostWeakStatus = Tu conexión de audio WebRTC es mala +bbb.clientstatus.webrtc.weakStatus = Quizas existe un problema con su conexión de audio WebRTC bbb.clientstatus.webrtc.message = Se recomienda utilizar Firefox o Chrome para obtener mejor calidad de audio. bbb.clientstatus.java.title = bbb.clientstatus.java.notdetected = @@ -189,14 +189,14 @@ bbb.users.usersGrid.statusItemRenderer = Estado bbb.users.usersGrid.statusItemRenderer.changePresenter = Haga click para cambiar a presentador bbb.users.usersGrid.statusItemRenderer.presenter = Presentador bbb.users.usersGrid.statusItemRenderer.moderator = Moderador -bbb.users.usersGrid.statusItemRenderer.voiceOnlyUser = +bbb.users.usersGrid.statusItemRenderer.voiceOnlyUser = Solo voz bbb.users.usersGrid.statusItemRenderer.raiseHand = bbb.users.usersGrid.statusItemRenderer.applause = Aplauso bbb.users.usersGrid.statusItemRenderer.thumbsUp = bbb.users.usersGrid.statusItemRenderer.thumbsDown = bbb.users.usersGrid.statusItemRenderer.speakLouder = -bbb.users.usersGrid.statusItemRenderer.speakSofter = -bbb.users.usersGrid.statusItemRenderer.speakFaster = +bbb.users.usersGrid.statusItemRenderer.speakSofter = Hablar más suave +bbb.users.usersGrid.statusItemRenderer.speakFaster = Hablar rápido bbb.users.usersGrid.statusItemRenderer.speakSlower = bbb.users.usersGrid.statusItemRenderer.away = Ausente bbb.users.usersGrid.statusItemRenderer.confused = Confundido @@ -215,13 +215,13 @@ bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Activar audio a {0} bbb.users.usersGrid.mediaItemRenderer.pushToMute = Desactivar audio a {0} bbb.users.usersGrid.mediaItemRenderer.pushToLock = Bloquear {0} bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Desbloquear {0} -bbb.users.usersGrid.mediaItemRenderer.kickUser = +bbb.users.usersGrid.mediaItemRenderer.kickUser = Expulsar {0} bbb.users.usersGrid.mediaItemRenderer.webcam = Compartiendo cámara Web bbb.users.usersGrid.mediaItemRenderer.micOff = Micrófono apagado bbb.users.usersGrid.mediaItemRenderer.micOn = Micrófono encendido bbb.users.usersGrid.mediaItemRenderer.noAudio = No está en la Conferencia de Voz bbb.users.usersGrid.mediaItemRenderer.promoteUser = -bbb.users.usersGrid.mediaItemRenderer.demoteUser = +bbb.users.usersGrid.mediaItemRenderer.demoteUser = Degradar {0} al participante bbb.users.emojiStatus.clear = Limpiar bbb.users.emojiStatus.raiseHand = Levantar la mano bbb.users.emojiStatus.happy = Contento @@ -232,13 +232,13 @@ bbb.users.emojiStatus.away = Ausente bbb.users.emojiStatus.thumbsUp = Señal de aprobación bbb.users.emojiStatus.thumbsDown = Señal de desaprobación bbb.users.emojiStatus.applause = Aplauso -bbb.users.emojiStatus.agree = -bbb.users.emojiStatus.disagree = +bbb.users.emojiStatus.agree = Estoy de acuerdo +bbb.users.emojiStatus.disagree = No estoy de acuerdo bbb.users.emojiStatus.none = -bbb.users.emojiStatus.speakLouder = +bbb.users.emojiStatus.speakLouder = PodrÃas hablar mas alto? bbb.users.emojiStatus.speakSofter = bbb.users.emojiStatus.speakFaster = -bbb.users.emojiStatus.speakSlower = +bbb.users.emojiStatus.speakSlower = Por favor, podrÃas hablar mas despacio? bbb.users.emojiStatus.beRightBack = bbb.presentation.title = Presentación bbb.presentation.titleWithPres = Presentación: {0} @@ -258,7 +258,7 @@ bbb.presentation.uploaded = cargado. bbb.presentation.document.supported = El documento cargado es soportado. Iniciando la conversión... bbb.presentation.document.converted = La conversión del documento de Office fué exitosa. bbb.presentation.error.document.convert.failed = Intenta convertir el archivo a PDF y reintenta subirlo -bbb.presentation.error.document.convert.invalid = +bbb.presentation.error.document.convert.invalid = Por favor, convertir este documento primero en PDF. bbb.presentation.error.io = Error de comunicación: Por favor contacte al administrador. bbb.presentation.error.security = Error de seguridad: Por favor contacte al administrador. bbb.presentation.error.convert.notsupported = Error: El documento cargado no esta soportado. Por favor, carge un tipo de documento soportado. @@ -291,13 +291,13 @@ bbb.fileupload.close.tooltip = Cerrar bbb.fileupload.close.accessibilityName = bbb.fileupload.genThumbText = Generando vistas en miniatura.. bbb.fileupload.progBarLbl = Progreso: -bbb.fileupload.fileFormatHint = +bbb.fileupload.fileFormatHint = Puede cargar cualquier documento Office o Documento en Formato Portable (PDF). Para mejores resultados, recomendamos cargar un PDF. bbb.fileupload.letUserDownload = -bbb.fileupload.letUserDownload.tooltip = -bbb.filedownload.title = +bbb.fileupload.letUserDownload.tooltip = Haz click aquà si desea que los otros usuarios descarguen su presentación +bbb.filedownload.title = Descargar las presentaciones bbb.filedownload.close.tooltip = Cerrar bbb.filedownload.close.accessibilityName = -bbb.filedownload.fileLbl = +bbb.filedownload.fileLbl = Escoge archivo para descargar: bbb.filedownload.downloadBtn = bbb.filedownload.downloadBtn.toolTip = bbb.filedownload.thisFileIsDownloadable = @@ -309,16 +309,16 @@ bbb.chat.sendBtn.toolTip = Enviar Mensaje bbb.chat.sendBtn.accessibilityName = Enviar mensaje del chat bbb.chat.saveBtn.toolTip = bbb.chat.saveBtn.accessibilityName = -bbb.chat.saveBtn.label = +bbb.chat.saveBtn.label = Guardar bbb.chat.save.complete = bbb.chat.save.ioerror = -bbb.chat.save.filename = -bbb.chat.copyBtn.toolTip = +bbb.chat.save.filename = Chat público +bbb.chat.copyBtn.toolTip = Copiar chat bbb.chat.copyBtn.accessibilityName = -bbb.chat.copyBtn.label = +bbb.chat.copyBtn.label = Copiar bbb.chat.copy.complete = -bbb.chat.clearBtn.toolTip = -bbb.chat.clearBtn.accessibilityName = +bbb.chat.clearBtn.toolTip = Limpiar chat público +bbb.chat.clearBtn.accessibilityName = Limpiar el historial público del chat bbb.chat.clearBtn.chatMessage = bbb.chat.clearBtn.alert.title = bbb.chat.clearBtn.alert.text = @@ -340,7 +340,7 @@ bbb.chat.maximizeRestoreBtn.accessibilityName = Maximizar la ventana del chat bbb.chat.closeBtn.accessibilityName = Cerrar a ventana del chat bbb.chat.chatTabs.accessibleNotice = Nuevos mensajes en esta pestaña. bbb.chat.chatMessage.systemMessage = Sistema -bbb.chat.chatMessage.stringRespresentation = +bbb.chat.chatMessage.stringRespresentation = De {0} {1} a {2} bbb.chat.chatMessage.tooLong = El mensaje demasiado largo por {0} carácter(es) bbb.publishVideo.changeCameraBtn.labelText = Cambiar la configuración de la camara bbb.publishVideo.changeCameraBtn.toolTip = Abrir la ventana de configuración de la cámara @@ -372,74 +372,74 @@ bbb.video.publish.titleBar = Ventana de iniciación de la cámara web bbb.video.streamClose.toolTip = Terminar transmisión para: {0} bbb.video.message.browserhttp = bbb.screensharePublish.title = Compartir Pantalla: Previsualización del Presentador -bbb.screensharePublish.pause.tooltip = +bbb.screensharePublish.pause.tooltip = Pausar pantalla compartida bbb.screensharePublish.pause.label = Pausa -bbb.screensharePublish.restart.tooltip = -bbb.screensharePublish.restart.label = +bbb.screensharePublish.restart.tooltip = Reanudar pantalla compartida +bbb.screensharePublish.restart.label = Reaundar bbb.screensharePublish.maximizeRestoreBtn.toolTip = No puedes maximizar esta ventana. bbb.screensharePublish.closeBtn.toolTip = Dejar de compartir y cerrar -bbb.screensharePublish.closeBtn.accessibilityName = +bbb.screensharePublish.closeBtn.accessibilityName = Parar compartir y cerrar ventana de publicación de pantalla compartida bbb.screensharePublish.minimizeBtn.toolTip = Minimizar -bbb.screensharePublish.minimizeBtn.accessibilityName = -bbb.screensharePublish.maximizeRestoreBtn.accessibilityName = -bbb.screensharePublish.commonHelpText.text = +bbb.screensharePublish.minimizeBtn.accessibilityName = Minimizar la ventana de Escritorio Compartido. +bbb.screensharePublish.maximizeRestoreBtn.accessibilityName = Maximizar la ventana de Escritorio Compartido. +bbb.screensharePublish.commonHelpText.text = Los siguientes pasos abajo le guiarán sobre como compartir la pantalla (requiere Java). bbb.screensharePublish.helpButton.toolTip = Ayuda -bbb.screensharePublish.helpButton.accessibilityName = -bbb.screensharePublish.helpText.PCIE1 = -bbb.screensharePublish.helpText.PCIE2 = +bbb.screensharePublish.helpButton.accessibilityName = Ayuda (Abrir tutorial en una nueva ventana) +bbb.screensharePublish.helpText.PCIE1 = 1. Seleccione 'Abrir' +bbb.screensharePublish.helpText.PCIE2 = 2. Aceptar el certificado bbb.screensharePublish.helpText.PCIE3 = -bbb.screensharePublish.helpText.PCFirefox1 = -bbb.screensharePublish.helpText.PCFirefox2 = +bbb.screensharePublish.helpText.PCFirefox1 = 1. Click 'OK' para comenzar +bbb.screensharePublish.helpText.PCFirefox2 = 2. Aceptar el certificado bbb.screensharePublish.helpText.PCFirefox3 = -bbb.screensharePublish.helpText.PCChrome1 = -bbb.screensharePublish.helpText.PCChrome2 = -bbb.screensharePublish.helpText.PCChrome3 = -bbb.screensharePublish.helpText.MacSafari1 = -bbb.screensharePublish.helpText.MacSafari2 = -bbb.screensharePublish.helpText.MacSafari3 = -bbb.screensharePublish.helpText.MacSafari4 = -bbb.screensharePublish.helpText.MacFirefox1 = -bbb.screensharePublish.helpText.MacFirefox2 = -bbb.screensharePublish.helpText.MacFirefox3 = -bbb.screensharePublish.helpText.MacFirefox4 = -bbb.screensharePublish.helpText.MacChrome1 = -bbb.screensharePublish.helpText.MacChrome2 = -bbb.screensharePublish.helpText.MacChrome3 = -bbb.screensharePublish.helpText.MacChrome4 = -bbb.screensharePublish.helpText.LinuxFirefox1 = -bbb.screensharePublish.helpText.LinuxFirefox2 = +bbb.screensharePublish.helpText.PCChrome1 = 1. Localiza 'screenshare.jnlp' +bbb.screensharePublish.helpText.PCChrome2 = 2. Haga click para abrir +bbb.screensharePublish.helpText.PCChrome3 = 3. Aceptar el certificado +bbb.screensharePublish.helpText.MacSafari1 = 1. Localiza 'screenshare.jnlp' +bbb.screensharePublish.helpText.MacSafari2 = 2. Selecciona 'Mostrar en Finder' +bbb.screensharePublish.helpText.MacSafari3 = 3. Haga click en botón derecho y seleccione 'Abrir' +bbb.screensharePublish.helpText.MacSafari4 = 4. Seleccione 'Abrir' (si se le solicita) +bbb.screensharePublish.helpText.MacFirefox1 = 1. Escoge 'Guardar archivo' (Si pregunta) +bbb.screensharePublish.helpText.MacFirefox2 = 2. Selecciona 'Mostrar en Finder' +bbb.screensharePublish.helpText.MacFirefox3 = 3. Haga click en botón derecho y seleccione 'Abrir' +bbb.screensharePublish.helpText.MacFirefox4 = 4. Seleccione 'Abrir' (si se le solicita) +bbb.screensharePublish.helpText.MacChrome1 = 1. Localiza 'screenshare.jnlp' +bbb.screensharePublish.helpText.MacChrome2 = 2. Selecciona 'Mostrar en Finder' +bbb.screensharePublish.helpText.MacChrome3 = 3. Haga click en botón derecho y seleccione 'Abrir' +bbb.screensharePublish.helpText.MacChrome4 = 4. Seleccione 'Abrir' (si se le solicita) +bbb.screensharePublish.helpText.LinuxFirefox1 = 1. Click 'OK' para comenzar +bbb.screensharePublish.helpText.LinuxFirefox2 = Aceptar el certificado bbb.screensharePublish.helpText.LinuxFirefox3 = -bbb.screensharePublish.helpText.LinuxChrome1 = -bbb.screensharePublish.helpText.LinuxChrome2 = -bbb.screensharePublish.helpText.LinuxChrome3 = -bbb.screensharePublish.shareTypeLabel.text = -bbb.screensharePublish.shareType.fullScreen = -bbb.screensharePublish.shareType.region = -bbb.screensharePublish.pauseMessage.label = -bbb.screensharePublish.startFailed.label = -bbb.screensharePublish.restartFailed.label = -bbb.screensharePublish.jwsCrashed.label = -bbb.screensharePublish.commonErrorMessage.label = -bbb.screensharePublish.tunnelingErrorMessage.one = +bbb.screensharePublish.helpText.LinuxChrome1 = 1. Localiza 'screenshare.jnlp' +bbb.screensharePublish.helpText.LinuxChrome2 = 2. Haga click para abrir +bbb.screensharePublish.helpText.LinuxChrome3 = 3. Aceptar el certificado +bbb.screensharePublish.shareTypeLabel.text = Compartir: +bbb.screensharePublish.shareType.fullScreen = Pantalla completa +bbb.screensharePublish.shareType.region = Región +bbb.screensharePublish.pauseMessage.label = Pantalla compartida actualmente pausada. +bbb.screensharePublish.startFailed.label = No detectó comienzo de pantalla compartida. +bbb.screensharePublish.restartFailed.label = No detectó reinicio de pantalla compartida. +bbb.screensharePublish.jwsCrashed.label = La aplicación pantalla compartida cerró inesperadamente. +bbb.screensharePublish.commonErrorMessage.label = Seleccione 'Cancelar' y trate nuevamente. +bbb.screensharePublish.tunnelingErrorMessage.one = Compartir pantalla no esta disponible para usar. bbb.screensharePublish.tunnelingErrorMessage.two = bbb.screensharePublish.cancelButton.label = Cancelar bbb.screensharePublish.startButton.label = Iniciar -bbb.screensharePublish.stopButton.label = -bbb.screensharePublish.stopButton.toolTip = -bbb.screensharePublish.WebRTCChromeExtensionMissing.label = -bbb.screensharePublish.WebRTCRetryExtensionInstallation.label = +bbb.screensharePublish.stopButton.label = Detener +bbb.screensharePublish.stopButton.toolTip = Detener compartir tu pantalla +bbb.screensharePublish.WebRTCChromeExtensionMissing.label = Esta usando una versión reciente de Chrome pero no esta instalado la extensión de pantalla compartida. +bbb.screensharePublish.WebRTCRetryExtensionInstallation.label = Después de instalar la extensión de pantalla compartida, por favor hacer click abajo en 'Reintentar' bbb.screensharePublish.WebRTCExtensionFailFallback.label = bbb.screensharePublish.WebRTCPrivateBrowsingWarning.label = -bbb.screensharePublish.WebRTCExtensionInstallButton.label = -bbb.screensharePublish.WebRTCUseJavaButton.label = +bbb.screensharePublish.WebRTCExtensionInstallButton.label = Click aquà para instalar +bbb.screensharePublish.WebRTCUseJavaButton.label = Usar Java pantalla compartida bbb.screensharePublish.WebRTCVideoLoading.label = bbb.screensharePublish.sharingMessage= bbb.screenshareView.title = Compartir escritorio bbb.screenshareView.fitToWindow = Ajustarse a la pantalla -bbb.screenshareView.actualSize = -bbb.screenshareView.minimizeBtn.accessibilityName = -bbb.screenshareView.maximizeRestoreBtn.accessibilityName = -bbb.screenshareView.closeBtn.accessibilityName = +bbb.screenshareView.actualSize = Mostrar tamaño actual +bbb.screenshareView.minimizeBtn.accessibilityName = Minimizar la ventana de Escritorio Compartido +bbb.screenshareView.maximizeRestoreBtn.accessibilityName = Maximizar la ventana de Escritorio Compartido +bbb.screenshareView.closeBtn.accessibilityName = Cerrar la ventana de Escritorio Compartido bbb.toolbar.phone.toolTip.start = Habilitar el audio (Micrófono o solo escuchar) bbb.toolbar.phone.toolTip.stop = Dejar de compartir micrófono bbb.toolbar.phone.toolTip.mute = Dejar de escuchar la conferencia @@ -447,7 +447,7 @@ bbb.toolbar.phone.toolTip.unmute = Empezar a escuchar la conferencia bbb.toolbar.phone.toolTip.nomic = No se ha detectado micrófono bbb.toolbar.deskshare.toolTip.start = Compartir escritorio bbb.toolbar.deskshare.toolTip.stop = Dejar de compartir escritorio -bbb.toolbar.sharednotes.toolTip = +bbb.toolbar.sharednotes.toolTip = Abrir notas compartidas bbb.toolbar.video.toolTip.start = Compartir su cámara Web bbb.toolbar.video.toolTip.stop = Dejar de compartir su cámara Web bbb.layout.addButton.label = Agregar @@ -463,14 +463,14 @@ bbb.layout.combo.prompt = Aplicar diseño bbb.layout.combo.custom = *Diseño personalizado bbb.layout.combo.customName = Diseño personalizado bbb.layout.combo.remote = Remoto -bbb.layout.window.name = +bbb.layout.window.name = Nombre de Diseño bbb.layout.window.close.tooltip = Cerrar bbb.layout.window.close.accessibilityName = bbb.layout.save.complete = Los diseños fueron guardados exitosamente bbb.layout.save.ioerror = bbb.layout.load.complete = Los diseños fueron cargados bbb.layout.load.failed = Error al cargar diseños -bbb.layout.sync = +bbb.layout.sync = Tu diseño ha sido enviado a todos los participantes bbb.layout.name.defaultlayout = Alineación de ventanas por defecto bbb.layout.name.closedcaption = Subtitulos bbb.layout.name.videochat = Chat de Video @@ -479,11 +479,11 @@ bbb.layout.name.presentfocus = Presentación bbb.layout.name.presentandusers = bbb.layout.name.lectureassistant = Asistente de conferencia bbb.layout.name.lecture = Conferencia -bbb.layout.name.sharednotes = +bbb.layout.name.sharednotes = Notas compartidas bbb.layout.addCurrentToFileWindow.title = bbb.layout.addCurrentToFileWindow.text = bbb.layout.denyAddToFile.toolTip = -bbb.layout.confirmAddToFile.toolTip = +bbb.layout.confirmAddToFile.toolTip = Confirmar aceptar el diseño actual bbb.highlighter.toolbar.pencil = Lápiz bbb.highlighter.toolbar.pencil.accessibilityName = Cambiar el cursor a lápiz bbb.highlighter.toolbar.ellipse = CÃrculo @@ -509,13 +509,13 @@ bbb.logout.connectionfailed = La conexión al servidor ha terminado bbb.logout.rejected = La conexión al servidor ha sido rechazada bbb.logout.invalidapp = La aplicación red5 no existe bbb.logout.unknown = Su cliente ha perdido conexión con el servidor -bbb.logout.guestkickedout = +bbb.logout.guestkickedout = El moderador no permitió ingreses a esta reunión bbb.logout.usercommand = Usted ha salido de la conferencia -bbb.logour.breakoutRoomClose = -bbb.logout.ejectedFromMeeting = +bbb.logour.breakoutRoomClose = La ventana de su navegador se cerrará +bbb.logout.ejectedFromMeeting = Usted a sido expulsado de la reunión. bbb.logout.refresh.message = Si esta desconexión no estaba planificada, pulse el botón para reconectar. bbb.logout.refresh.label = Reconectar -bbb.logout.feedback.hint = +bbb.logout.feedback.hint = Como podemos hacer BigBlueButton Mejor? bbb.logout.feedback.label = bbb.settings.title = bbb.settings.ok = Correcto @@ -523,7 +523,7 @@ bbb.settings.cancel = Cancelar bbb.settings.btn.toolTip = bbb.logout.confirm.title = Confirmar Cerrar Sesión bbb.logout.confirm.message = ¿Esta seguro que desea cerrar sesión? -bbb.logout.confirm.endMeeting = +bbb.logout.confirm.endMeeting = Si y finalizar la reunión bbb.logout.confirm.yes = Si bbb.logout.confirm.no = No bbb.endSession.confirm.title = @@ -544,16 +544,16 @@ bbb.sharedNotes.quickLink.label = bbb.sharedNotes.createNoteWindow.label = bbb.sharedNotes.createNoteWindow.close.tooltip = Cerrar bbb.sharedNotes.createNoteWindow.close.accessibilityName = -bbb.sharedNotes.typing.single = -bbb.sharedNotes.typing.double = -bbb.sharedNotes.typing.multiple = +bbb.sharedNotes.typing.single = {0} esta escribiendo... +bbb.sharedNotes.typing.double = {0} y {1} están escribiendo... +bbb.sharedNotes.typing.multiple = Varias personas están escribiendo... bbb.sharedNotes.save.toolTip = bbb.sharedNotes.save.complete = bbb.sharedNotes.save.ioerror = bbb.sharedNotes.save.htmlLabel = -bbb.sharedNotes.save.txtLabel = +bbb.sharedNotes.save.txtLabel = Texto plano (.txt) bbb.sharedNotes.new.label = -bbb.sharedNotes.new.toolTip = +bbb.sharedNotes.new.toolTip = Crear nota adicional bbb.sharedNotes.limit.label = bbb.sharedNotes.clear.label = bbb.sharedNotes.undo.toolTip = @@ -578,20 +578,20 @@ bbb.settings.flash.label = Error de versión de Flash bbb.settings.flash.text = Usted tiene Flash {0} instalado, pero necesita por lo menos la versión {1} para ejecutar BigBlueButton adecuadamente. Haga clic en el botón de abajo para instalar la última versión de Adobe Flash. bbb.settings.flash.command = Instalar la versión más reciente de Java bbb.settings.isight.label = Error en cámara iSight -bbb.settings.isight.text = +bbb.settings.isight.text = Si presenta problemas con su cámara iSight, puede deberse a que está ejecutando OS X 10.6.5, El cual es conocido por presentar problemas con Flash en la captura de vÃdeo desde la cámara iSight.\n Para corregir esto, haga clic en el enlace de abajo para instalar la versión más reciente de Flash Player, o actualizar tu Mac a la versión más reciente bbb.settings.isight.command = Instalar Flash 10.2 RC2 bbb.settings.warning.label = Advertencia bbb.settings.warning.close = Alerta bbb.settings.noissues = Ninguna edicion excepcional se ha detectado bbb.settings.instructions = Acepte el mensaje de Flash que le pide permisos de cámara. Si usted puede verse y oÃrse, su navegador se ha configurado correctamente. Otros problemas potenciales se muestran a continuación. Haga clic en cada uno para encontrar una posible solución. bbb.bwmonitor.title = -bbb.bwmonitor.upload = +bbb.bwmonitor.upload = Subir bbb.bwmonitor.upload.short = bbb.bwmonitor.download = -bbb.bwmonitor.download.short = -bbb.bwmonitor.total = -bbb.bwmonitor.current = -bbb.bwmonitor.available = +bbb.bwmonitor.download.short = Abajo +bbb.bwmonitor.total = Total +bbb.bwmonitor.current = Actual +bbb.bwmonitor.available = Disponible bbb.bwmonitor.latency = ltbcustom.bbb.highlighter.toolbar.triangle = Triángulo ltbcustom.bbb.highlighter.toolbar.triangle.accessibilityName = Cambiar Cursor de Pizarra a Triángulo @@ -602,22 +602,22 @@ ltbcustom.bbb.highlighter.toolbar.text.accessibilityName = Cambiar Cursos de piz ltbcustom.bbb.highlighter.texttoolbar.textColorPicker = Color de texto ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = Támaño de fuente bbb.caption.window.title = Subtitulos -bbb.caption.quickLink.label = -bbb.caption.window.titleBar = -bbb.caption.window.minimizeBtn.accessibilityName = -bbb.caption.window.maximizeRestoreBtn.accessibilityName = +bbb.caption.quickLink.label = Ventana de subtÃtulos +bbb.caption.window.titleBar = Barra de tÃtulo de la ventana de subtÃtulos +bbb.caption.window.minimizeBtn.accessibilityName = Minimiza la ventana de subtÃtulos +bbb.caption.window.maximizeRestoreBtn.accessibilityName = Maximiza la ventana de subtÃtulos bbb.caption.transcript.noowner = Ninguno bbb.caption.transcript.youowner = Usted -bbb.caption.transcript.pastewarning.title = -bbb.caption.transcript.pastewarning.text = -bbb.caption.transcript.inputArea.toolTip = -bbb.caption.transcript.outputArea.toolTip = +bbb.caption.transcript.pastewarning.title = Advertencia de pegado de subtÃtulos +bbb.caption.transcript.pastewarning.text = El texto a pegar no puede exceder de {0} caracteres. Usted pegó {1} caracteres. +bbb.caption.transcript.inputArea.toolTip = Ãrea interna de subtÃtulos +bbb.caption.transcript.outputArea.toolTip = Ãrea externa de subtÃtulos bbb.caption.option.label = Opciones bbb.caption.option.language = Idioma: bbb.caption.option.language.tooltip = Seleccionar idioma de subtitulos -bbb.caption.option.language.accessibilityName = +bbb.caption.option.language.accessibilityName = Seleccione lenguaje de traducción. Use las teclas de dirección para navegar. bbb.caption.option.takeowner = Apropiarse -bbb.caption.option.takeowner.tooltip = +bbb.caption.option.takeowner.tooltip = Usar lenguaje seleccionado bbb.caption.option.fontfamily = Tipo de letra: bbb.caption.option.fontfamily.tooltip = Tipo de letra bbb.caption.option.fontsize = Tamaño de letra: @@ -643,16 +643,16 @@ bbb.accessibility.chat.initialDescription = Por favor usar las teclas direcciona bbb.accessibility.notes.notesview.input = Entradas de las notas bbb.shortcuthelp.title = Teclas de acceso directo -bbb.shortcuthelp.titleBar = +bbb.shortcuthelp.titleBar = Teclas de acceso directo de la ventana de la barra de tÃtulo bbb.shortcuthelp.minimizeBtn.accessibilityName = Minimizar la ventana de accesos rápidos bbb.shortcuthelp.maximizeRestoreBtn.accessibilityName = Mazimizar la ventana de accesos rápidos bbb.shortcuthelp.closeBtn.accessibilityName = Cerrar la ventana de accesos rápidos -bbb.shortcuthelp.dropdown.accessibilityName = +bbb.shortcuthelp.dropdown.accessibilityName = Atajo para Categorias bbb.shortcuthelp.dropdown.general = Accesos rápidos globales bbb.shortcuthelp.dropdown.presentation = Accesos rápidos a la presentación bbb.shortcuthelp.dropdown.chat = Acceso rápido al chat bbb.shortcuthelp.dropdown.users = Acceso rápido a los usuarios -bbb.shortcuthelp.dropdown.caption = +bbb.shortcuthelp.dropdown.caption = Atajos de subtÃtulos bbb.shortcuthelp.browserWarning.text = bbb.shortcuthelp.headers.shortcut = Acceso Rápido bbb.shortcuthelp.headers.function = Función @@ -682,7 +682,7 @@ bbb.shortcutkey.focus.presentation.function = Mover enfoque a la ventana de pres bbb.shortcutkey.focus.chat = 52 bbb.shortcutkey.focus.chat.function = Mover enfoque a la venta de chat bbb.shortcutkey.focus.caption = 53 -bbb.shortcutkey.focus.caption.function = +bbb.shortcutkey.focus.caption.function = Mover ventana para observar subtÃtulos bbb.shortcutkey.share.desktop = 68 bbb.shortcutkey.share.desktop.function = Abrir la ventana de compartir escritorio @@ -712,7 +712,7 @@ bbb.shortcutkey.present.fitPage.function = Ajustar diapositivas en la página bbb.shortcutkey.users.makePresenter = 89 bbb.shortcutkey.users.makePresenter.function = Hacer presentador a la persona seleccionada bbb.shortcutkey.users.kick = 69 -bbb.shortcutkey.users.kick.function = +bbb.shortcutkey.users.kick.function = Expulsar persona seleccionada de la reunión bbb.shortcutkey.users.mute = 83 bbb.shortcutkey.users.mute.function = Activar o Desactivar sonido de la persona seleccionada bbb.shortcutkey.users.muteall = 65 @@ -720,18 +720,18 @@ bbb.shortcutkey.users.muteall.function = Activar o Desactivar sonido a todos los bbb.shortcutkey.users.muteAllButPres = 65 bbb.shortcutkey.users.muteAllButPres.function = Silenciar a todos excepto al presentador bbb.shortcutkey.users.breakoutRooms = 75 -bbb.shortcutkey.users.breakoutRooms.function = +bbb.shortcutkey.users.breakoutRooms.function = Ventana de salas de reunion bbb.shortcutkey.users.focusBreakoutRooms = 82 -bbb.shortcutkey.users.focusBreakoutRooms.function = +bbb.shortcutkey.users.focusBreakoutRooms.function = Observar lista de sala de reunion bbb.shortcutkey.users.listenToBreakoutRoom = 76 -bbb.shortcutkey.users.listenToBreakoutRoom.function = +bbb.shortcutkey.users.listenToBreakoutRoom.function = Escuchar sala de reunión seleccionada bbb.shortcutkey.users.joinBreakoutRoom = 79 -bbb.shortcutkey.users.joinBreakoutRoom.function = +bbb.shortcutkey.users.joinBreakoutRoom.function = Unirse a la sala de reunión seleccionada bbb.shortcutkey.chat.focusTabs = 89 bbb.shortcutkey.chat.focusTabs.function = Enfocar a las pestañas del chat bbb.shortcutkey.chat.focusBox = 82 -bbb.shortcutkey.chat.focusBox.function = +bbb.shortcutkey.chat.focusBox.function = Observar la lista de mensajes del chat bbb.shortcutkey.chat.changeColour = 67 bbb.shortcutkey.chat.changeColour.function = Enfocar en el seleccionador de color de la fuente bbb.shortcutkey.chat.sendMessage = 83 @@ -757,13 +757,13 @@ bbb.shortcutkey.chat.chatbox.debug = 71 bbb.shortcutkey.chat.chatbox.debug.function = Tecla de acceso rápido para depurar temporalmente bbb.shortcutkey.caption.takeOwnership = 79 -bbb.shortcutkey.caption.takeOwnership.function = +bbb.shortcutkey.caption.takeOwnership.function = Usar lenguaje seleccionado bbb.polling.startButton.tooltip = Iniciar una encuesta bbb.polling.startButton.label = Iniciar encuesta bbb.polling.publishButton.label = Publicar bbb.polling.closeButton.label = Cerrar -bbb.polling.customPollOption.label = +bbb.polling.customPollOption.label = Encuesta personalizada... bbb.polling.pollModal.title = Resultados de la encuesta en tiempo real bbb.polling.pollModal.hint = bbb.polling.customChoices.title = Agregar opciones para la encuesta @@ -803,7 +803,7 @@ bbb.users.settings.lockAll = Bloquear a todos bbb.users.settings.lockAllExcept = Bloquear todos menos presentador bbb.users.settings.lockSettings = Bloquear espectadores ... bbb.users.settings.breakoutRooms = Sesión de pequeños gupos... -bbb.users.settings.sendBreakoutRoomsInvitations = +bbb.users.settings.sendBreakoutRoomsInvitations = Enviar invitaciones a salas de reuniones bbb.users.settings.unlockAll = Desbloquear a todos los espectadores bbb.users.settings.roomIsLocked = Bloqueado por defecto bbb.users.settings.roomIsMuted = Silenciado por defecto @@ -827,31 +827,31 @@ bbb.lockSettings.locked=Bloqueado bbb.lockSettings.lockOnJoin=Unirse bbb.users.breakout.breakoutRooms = Sesión de pequeños gupos -bbb.users.breakout.updateBreakoutRooms = +bbb.users.breakout.updateBreakoutRooms = Actualizar sala de reunión bbb.users.breakout.timerForRoom.toolTip = -bbb.users.breakout.timer.toolTip = +bbb.users.breakout.timer.toolTip = Tiempo restante para las salas de reunión bbb.users.breakout.calculatingRemainingTime = Calculando tiempo restante .... bbb.users.breakout.closing = Cerrando bbb.users.breakout.closewarning.text = bbb.users.breakout.rooms = Sesiones -bbb.users.breakout.roomsCombo.accessibilityName = +bbb.users.breakout.roomsCombo.accessibilityName = Número de salas para crear bbb.users.breakout.room = Sesión bbb.users.breakout.timeLimit = LÃmite de tiempo -bbb.users.breakout.durationStepper.accessibilityName = +bbb.users.breakout.durationStepper.accessibilityName = Tiempo lÃmite en minutos bbb.users.breakout.minutes = Minutos bbb.users.breakout.record = Grabar -bbb.users.breakout.recordCheckbox.accessibilityName = +bbb.users.breakout.recordCheckbox.accessibilityName = Grabar sala de reunion bbb.users.breakout.notAssigned = No asignado bbb.users.breakout.dragAndDropToolTip = Consejo: Puedes arrastarr y soltar usuarios entre los cuartos bbb.users.breakout.start = Iniciar -bbb.users.breakout.invite = +bbb.users.breakout.invite = Invitar bbb.users.breakout.close = Cerrar bbb.users.breakout.closeAllRooms = Cerrar todas las sesiones de pequeños grupos -bbb.users.breakout.insufficientUsers = -bbb.users.breakout.confirm = -bbb.users.breakout.invited = +bbb.users.breakout.insufficientUsers = Usuarios insuficientes. Se requiere al menos un usuario en una sala de reuniones. +bbb.users.breakout.confirm = Unirse a una sala de reuniones +bbb.users.breakout.invited = Has sido invitado a reunirte 1Sala de Reunión1 bbb.users.breakout.accept = -bbb.users.breakout.joinSession = +bbb.users.breakout.joinSession = Unirse a la sesión bbb.users.breakout.joinSession.accessibilityName = bbb.users.breakout.joinSession.close.tooltip = Cerrar bbb.users.breakout.joinSession.close.accessibilityName = diff --git a/bigbluebutton-client/locale/es_ES/bbbResources.properties b/bigbluebutton-client/locale/es_ES/bbbResources.properties index b75e0c7b4606e35fe5c89fe51b86d3a87befb0c2..4ee421aa7088422a5f73013c4502f9b6dd75b489 100644 --- a/bigbluebutton-client/locale/es_ES/bbbResources.properties +++ b/bigbluebutton-client/locale/es_ES/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Conectando con el servidor bbb.mainshell.statusProgress.loading = Cargando bbb.mainshell.statusProgress.cannotConnectServer = Lo sentimos, no es posible conectar con el servidor. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = (c) 2018 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (compilación {0}) bbb.mainshell.logBtn.toolTip = Abrir ventana de histórico bbb.mainshell.meetingNotFound = Reunión no encontrada bbb.mainshell.invalidAuthToken = Token de Autentificación No Válido @@ -140,7 +140,7 @@ bbb.clientstatus.title = Notificaciones de configuración bbb.clientstatus.notification = Notificaciones sin leer bbb.clientstatus.close = Cerrar bbb.clientstatus.tunneling.title = Cortafuegos -bbb.clientstatus.tunneling.message = Un cortafuegos está evitando que el cliente se conecte directamente al servidor remoto por el puerto 1935. Se recomienda utilizar una red menos restringida para obtener una conexión más estable +bbb.clientstatus.tunneling.message = Un cortafuegos está impidiendo que tu cliente se conecte directamente al servidor remoto. Te recomendamos conectarte a una red menos restrictiva para conseguir una conexión más estable. bbb.clientstatus.browser.title = Versión del navegador bbb.clientstatus.browser.message = El navegador ({0}) no se encuentra actualizado. Se recomienda actualizarlo a la última versión. bbb.clientstatus.flash.title = Reproductor Flash @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = Publicar bbb.polling.closeButton.label = Cerrar bbb.polling.customPollOption.label = Encuesta a Medida... bbb.polling.pollModal.title = Resultados en vivo -bbb.polling.pollModal.hint = Deja esta ventana abierta para permitir que los estudiantes puedan contestar a la encuesta. Pulsar el botón Publicar o Cerrar finalizará la encuesta. +bbb.polling.pollModal.hint = Deja esta ventana abierta para permitir a otros contestar a la encuesta. Seleccionar Publicar o Cerrar finalizará la encuesta. bbb.polling.customChoices.title = Opciones de la encuesta bbb.polling.respondersLabel.novotes = Esperando respuestas bbb.polling.respondersLabel.text = {0} Usuarios han respondido @@ -818,7 +818,7 @@ bbb.lockSettings.moderatorLocking = Bloqueo de moderador bbb.lockSettings.privateChat = Chat privado bbb.lockSettings.publicChat = Chat público bbb.lockSettings.webcam = Cámara -bbb.lockSettings.webcamsOnlyForModerator = Ocultar las webcam de otros asistentes +bbb.lockSettings.webcamsOnlyForModerator = Ver las cámaras de los otros participantes bbb.lockSettings.microphone = Micrófono bbb.lockSettings.layout = Diseño bbb.lockSettings.title=Bloquear audiencia diff --git a/bigbluebutton-client/locale/es_LA/bbbResources.properties b/bigbluebutton-client/locale/es_LA/bbbResources.properties index fe87e9ff650ad8d4247056e1653ed10d244c4d94..b99e7a232d6d49cecf45c7d207ebbbeb6bee3020 100644 --- a/bigbluebutton-client/locale/es_LA/bbbResources.properties +++ b/bigbluebutton-client/locale/es_LA/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Conectando al servidor bbb.mainshell.statusProgress.loading = Cargando bbb.mainshell.statusProgress.cannotConnectServer = Lo sentimos, no se puede conectar al servidor. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (versión {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = Abrir la ventana de Registro (Log) bbb.mainshell.meetingNotFound = Sesión no encontrada bbb.mainshell.invalidAuthToken = Token de autenticación inválido @@ -70,7 +70,7 @@ bbb.micPermissions.message.browserhttp = bbb.micPermissions.firefox.title = Permisos de micrófono en Firefox bbb.micPermissions.firefox.message = bbb.micPermissions.chrome.title = Permisos de micrófono en Chrome -bbb.micPermissions.chrome.message = +bbb.micPermissions.chrome.message = Haz click para dar permiso a Chrome de usar tu micrófono. bbb.micWarning.title = Alerta de audio bbb.micWarning.joinBtn.label = Unirse de todas formas bbb.micWarning.testAgain.label = Probar de nuevo @@ -123,33 +123,33 @@ bbb.mainToolbar.recordBtn.notification.message2 = Debe hacer click en el botón bbb.mainToolbar.recordingLabel.recording = (Grabación) bbb.mainToolbar.recordingLabel.notRecording = No grabando bbb.waitWindow.waitMessage.message = -bbb.waitWindow.waitMessage.title = +bbb.waitWindow.waitMessage.title = Esperando bbb.guests.title = -bbb.guests.message.singular = -bbb.guests.message.plural = +bbb.guests.message.singular = {0} participantes desean unirse a esta reunión +bbb.guests.message.plural = {0} participantes desean ingresar a esta reunión bbb.guests.allowBtn.toolTip = bbb.guests.allowEveryoneBtn.text = -bbb.guests.denyBtn.toolTip = -bbb.guests.denyEveryoneBtn.text = +bbb.guests.denyBtn.toolTip = Negar +bbb.guests.denyEveryoneBtn.text = Negar a todos bbb.guests.rememberAction.text = bbb.guests.alwaysAccept = -bbb.guests.alwaysDeny = -bbb.guests.askModerator = -bbb.guests.Management = +bbb.guests.alwaysDeny = Siempre negar +bbb.guests.askModerator = Preguntar al moderador +bbb.guests.Management = Gestión de invitados bbb.clientstatus.title = Notificaciones de configuración bbb.clientstatus.notification = Notificaciones sin leer bbb.clientstatus.close = Cerrar bbb.clientstatus.tunneling.title = Contrafuegos -bbb.clientstatus.tunneling.message = Un cortafuegos está evitando que el cliente se conecte directamente al servidor remoto por el puerto 1935. Se recomienda utilizar una red menos restringida para obtener una conexión más estable +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Versión de navegador bbb.clientstatus.browser.message = El navegador ({0}) no se encuentra actualizado. Se recomienda actualizarlo a la última versión. bbb.clientstatus.flash.title = Reproductor Flash bbb.clientstatus.flash.message = El reproductor Flash ({0}) no se encuentra actualizado. Se recomienda actualizarlo a la última versión. bbb.clientstatus.webrtc.title = Audio -bbb.clientstatus.webrtc.strongStatus = -bbb.clientstatus.webrtc.almostStrongStatus = -bbb.clientstatus.webrtc.almostWeakStatus = -bbb.clientstatus.webrtc.weakStatus = +bbb.clientstatus.webrtc.strongStatus = Tu conexión de audio WebRTC es genial +bbb.clientstatus.webrtc.almostStrongStatus = Tu conexión de audio WebRTC es buena +bbb.clientstatus.webrtc.almostWeakStatus = Tu conexión de audio WebRTC es mala +bbb.clientstatus.webrtc.weakStatus = Quizas existe un problema con su conexión de audio WebRTC bbb.clientstatus.webrtc.message = Se recomienda utilizar Firefox o Chrome para obtener mejor calidad de audio. bbb.clientstatus.java.title = bbb.clientstatus.java.notdetected = @@ -189,14 +189,14 @@ bbb.users.usersGrid.statusItemRenderer = Estado bbb.users.usersGrid.statusItemRenderer.changePresenter = Haga click para cambiar a presentador bbb.users.usersGrid.statusItemRenderer.presenter = Presentador bbb.users.usersGrid.statusItemRenderer.moderator = Moderador -bbb.users.usersGrid.statusItemRenderer.voiceOnlyUser = +bbb.users.usersGrid.statusItemRenderer.voiceOnlyUser = Solo voz bbb.users.usersGrid.statusItemRenderer.raiseHand = bbb.users.usersGrid.statusItemRenderer.applause = Aplauso bbb.users.usersGrid.statusItemRenderer.thumbsUp = bbb.users.usersGrid.statusItemRenderer.thumbsDown = bbb.users.usersGrid.statusItemRenderer.speakLouder = -bbb.users.usersGrid.statusItemRenderer.speakSofter = -bbb.users.usersGrid.statusItemRenderer.speakFaster = +bbb.users.usersGrid.statusItemRenderer.speakSofter = Hablar más suave +bbb.users.usersGrid.statusItemRenderer.speakFaster = Hablar rápido bbb.users.usersGrid.statusItemRenderer.speakSlower = bbb.users.usersGrid.statusItemRenderer.away = Ausente bbb.users.usersGrid.statusItemRenderer.confused = Confundido @@ -215,13 +215,13 @@ bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Activar audio a {0} bbb.users.usersGrid.mediaItemRenderer.pushToMute = Desactivar audio a {0} bbb.users.usersGrid.mediaItemRenderer.pushToLock = Bloquear {0} bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Desbloquear {0} -bbb.users.usersGrid.mediaItemRenderer.kickUser = +bbb.users.usersGrid.mediaItemRenderer.kickUser = Expulsar {0} bbb.users.usersGrid.mediaItemRenderer.webcam = Compartiendo cámara Web bbb.users.usersGrid.mediaItemRenderer.micOff = Micrófono apagado bbb.users.usersGrid.mediaItemRenderer.micOn = Micrófono encendido bbb.users.usersGrid.mediaItemRenderer.noAudio = No está en la Conferencia de Voz bbb.users.usersGrid.mediaItemRenderer.promoteUser = -bbb.users.usersGrid.mediaItemRenderer.demoteUser = +bbb.users.usersGrid.mediaItemRenderer.demoteUser = Degradar {0} al participante bbb.users.emojiStatus.clear = Limpiar bbb.users.emojiStatus.raiseHand = Levantar la mano bbb.users.emojiStatus.happy = Contento @@ -232,13 +232,13 @@ bbb.users.emojiStatus.away = Ausente bbb.users.emojiStatus.thumbsUp = Señal de aprobación bbb.users.emojiStatus.thumbsDown = Señal de desaprobación bbb.users.emojiStatus.applause = Aplauso -bbb.users.emojiStatus.agree = -bbb.users.emojiStatus.disagree = +bbb.users.emojiStatus.agree = Estoy de acuerdo +bbb.users.emojiStatus.disagree = No estoy de acuerdo bbb.users.emojiStatus.none = -bbb.users.emojiStatus.speakLouder = +bbb.users.emojiStatus.speakLouder = PodrÃas hablar mas alto? bbb.users.emojiStatus.speakSofter = bbb.users.emojiStatus.speakFaster = -bbb.users.emojiStatus.speakSlower = +bbb.users.emojiStatus.speakSlower = Por favor, podrÃas hablar mas despacio? bbb.users.emojiStatus.beRightBack = bbb.presentation.title = Presentación bbb.presentation.titleWithPres = Presentación: {0} @@ -258,7 +258,7 @@ bbb.presentation.uploaded = cargado. bbb.presentation.document.supported = El documento cargado es soportado. Iniciando la conversión... bbb.presentation.document.converted = La conversión del documento de Office fué exitosa. bbb.presentation.error.document.convert.failed = Intenta convertir el archivo a PDF y reintenta subirlo -bbb.presentation.error.document.convert.invalid = +bbb.presentation.error.document.convert.invalid = Por favor, convertir este documento primero en PDF. bbb.presentation.error.io = Error de comunicación: Por favor contacte al administrador. bbb.presentation.error.security = Error de seguridad: Por favor contacte al administrador. bbb.presentation.error.convert.notsupported = Error: El documento cargado no esta soportado. Por favor, carge un tipo de documento soportado. @@ -291,13 +291,13 @@ bbb.fileupload.close.tooltip = Cerrar bbb.fileupload.close.accessibilityName = bbb.fileupload.genThumbText = Generando vistas en miniatura.. bbb.fileupload.progBarLbl = Progreso: -bbb.fileupload.fileFormatHint = +bbb.fileupload.fileFormatHint = Puede cargar cualquier documento Office o Documento en Formato Portable (PDF). Para mejores resultados, recomendamos cargar un PDF. bbb.fileupload.letUserDownload = -bbb.fileupload.letUserDownload.tooltip = -bbb.filedownload.title = +bbb.fileupload.letUserDownload.tooltip = Haz click aquà si desea que los otros usuarios descarguen su presentación +bbb.filedownload.title = Descargar las presentaciones bbb.filedownload.close.tooltip = Cerrar bbb.filedownload.close.accessibilityName = -bbb.filedownload.fileLbl = +bbb.filedownload.fileLbl = Escoge archivo para descargar: bbb.filedownload.downloadBtn = bbb.filedownload.downloadBtn.toolTip = bbb.filedownload.thisFileIsDownloadable = @@ -309,16 +309,16 @@ bbb.chat.sendBtn.toolTip = Enviar Mensaje bbb.chat.sendBtn.accessibilityName = Enviar mensaje del chat bbb.chat.saveBtn.toolTip = bbb.chat.saveBtn.accessibilityName = -bbb.chat.saveBtn.label = +bbb.chat.saveBtn.label = Guardar bbb.chat.save.complete = bbb.chat.save.ioerror = -bbb.chat.save.filename = -bbb.chat.copyBtn.toolTip = +bbb.chat.save.filename = Chat público +bbb.chat.copyBtn.toolTip = Copiar chat bbb.chat.copyBtn.accessibilityName = -bbb.chat.copyBtn.label = +bbb.chat.copyBtn.label = Copiar bbb.chat.copy.complete = -bbb.chat.clearBtn.toolTip = -bbb.chat.clearBtn.accessibilityName = +bbb.chat.clearBtn.toolTip = Limpiar chat público +bbb.chat.clearBtn.accessibilityName = Limpiar el historial público del chat bbb.chat.clearBtn.chatMessage = bbb.chat.clearBtn.alert.title = bbb.chat.clearBtn.alert.text = @@ -340,7 +340,7 @@ bbb.chat.maximizeRestoreBtn.accessibilityName = Maximizar la ventana del chat bbb.chat.closeBtn.accessibilityName = Cerrar a ventana del chat bbb.chat.chatTabs.accessibleNotice = Nuevos mensajes en esta pestaña. bbb.chat.chatMessage.systemMessage = Sistema -bbb.chat.chatMessage.stringRespresentation = +bbb.chat.chatMessage.stringRespresentation = De {0} {1} a {2} bbb.chat.chatMessage.tooLong = El mensaje demasiado largo por {0} carácter(es) bbb.publishVideo.changeCameraBtn.labelText = Cambiar la configuración de la camara bbb.publishVideo.changeCameraBtn.toolTip = Abrir la ventana de configuración de la cámara @@ -372,74 +372,74 @@ bbb.video.publish.titleBar = Ventana de iniciación de la cámara web bbb.video.streamClose.toolTip = Terminar transmisión para: {0} bbb.video.message.browserhttp = bbb.screensharePublish.title = Compartir Pantalla: Previsualización del Presentador -bbb.screensharePublish.pause.tooltip = +bbb.screensharePublish.pause.tooltip = Pausar pantalla compartida bbb.screensharePublish.pause.label = Pausa -bbb.screensharePublish.restart.tooltip = -bbb.screensharePublish.restart.label = +bbb.screensharePublish.restart.tooltip = Reanudar pantalla compartida +bbb.screensharePublish.restart.label = Reaundar bbb.screensharePublish.maximizeRestoreBtn.toolTip = No puedes maximizar esta ventana. bbb.screensharePublish.closeBtn.toolTip = Dejar de compartir y cerrar -bbb.screensharePublish.closeBtn.accessibilityName = +bbb.screensharePublish.closeBtn.accessibilityName = Parar compartir y cerrar ventana de publicación de pantalla compartida bbb.screensharePublish.minimizeBtn.toolTip = Minimizar -bbb.screensharePublish.minimizeBtn.accessibilityName = -bbb.screensharePublish.maximizeRestoreBtn.accessibilityName = -bbb.screensharePublish.commonHelpText.text = +bbb.screensharePublish.minimizeBtn.accessibilityName = Minimizar la ventana de Escritorio Compartido. +bbb.screensharePublish.maximizeRestoreBtn.accessibilityName = Maximizar la ventana de Escritorio Compartido. +bbb.screensharePublish.commonHelpText.text = Los siguientes pasos abajo le guiarán sobre como compartir la pantalla (requiere Java). bbb.screensharePublish.helpButton.toolTip = Ayuda -bbb.screensharePublish.helpButton.accessibilityName = -bbb.screensharePublish.helpText.PCIE1 = -bbb.screensharePublish.helpText.PCIE2 = +bbb.screensharePublish.helpButton.accessibilityName = Ayuda (Abrir tutorial en una nueva ventana) +bbb.screensharePublish.helpText.PCIE1 = 1. Seleccione 'Abrir' +bbb.screensharePublish.helpText.PCIE2 = 2. Aceptar el certificado bbb.screensharePublish.helpText.PCIE3 = -bbb.screensharePublish.helpText.PCFirefox1 = -bbb.screensharePublish.helpText.PCFirefox2 = +bbb.screensharePublish.helpText.PCFirefox1 = 1. Click 'OK' para comenzar +bbb.screensharePublish.helpText.PCFirefox2 = 2. Aceptar el certificado bbb.screensharePublish.helpText.PCFirefox3 = -bbb.screensharePublish.helpText.PCChrome1 = -bbb.screensharePublish.helpText.PCChrome2 = -bbb.screensharePublish.helpText.PCChrome3 = -bbb.screensharePublish.helpText.MacSafari1 = -bbb.screensharePublish.helpText.MacSafari2 = -bbb.screensharePublish.helpText.MacSafari3 = -bbb.screensharePublish.helpText.MacSafari4 = -bbb.screensharePublish.helpText.MacFirefox1 = -bbb.screensharePublish.helpText.MacFirefox2 = -bbb.screensharePublish.helpText.MacFirefox3 = -bbb.screensharePublish.helpText.MacFirefox4 = -bbb.screensharePublish.helpText.MacChrome1 = -bbb.screensharePublish.helpText.MacChrome2 = -bbb.screensharePublish.helpText.MacChrome3 = -bbb.screensharePublish.helpText.MacChrome4 = -bbb.screensharePublish.helpText.LinuxFirefox1 = -bbb.screensharePublish.helpText.LinuxFirefox2 = +bbb.screensharePublish.helpText.PCChrome1 = 1. Localiza 'screenshare.jnlp' +bbb.screensharePublish.helpText.PCChrome2 = 2. Haga click para abrir +bbb.screensharePublish.helpText.PCChrome3 = 3. Aceptar el certificado +bbb.screensharePublish.helpText.MacSafari1 = 1. Localiza 'screenshare.jnlp' +bbb.screensharePublish.helpText.MacSafari2 = 2. Selecciona 'Mostrar en Finder' +bbb.screensharePublish.helpText.MacSafari3 = 3. Haga click en botón derecho y seleccione 'Abrir' +bbb.screensharePublish.helpText.MacSafari4 = 4. Seleccione 'Abrir' (si se le solicita) +bbb.screensharePublish.helpText.MacFirefox1 = 1. Escoge 'Guardar archivo' (Si pregunta) +bbb.screensharePublish.helpText.MacFirefox2 = 2. Selecciona 'Mostrar en Finder' +bbb.screensharePublish.helpText.MacFirefox3 = 3. Haga click en botón derecho y seleccione 'Abrir' +bbb.screensharePublish.helpText.MacFirefox4 = 4. Seleccione 'Abrir' (si se le solicita) +bbb.screensharePublish.helpText.MacChrome1 = 1. Localiza 'screenshare.jnlp' +bbb.screensharePublish.helpText.MacChrome2 = 2. Selecciona 'Mostrar en Finder' +bbb.screensharePublish.helpText.MacChrome3 = 3. Haga click en botón derecho y seleccione 'Abrir' +bbb.screensharePublish.helpText.MacChrome4 = 4. Seleccione 'Abrir' (si se le solicita) +bbb.screensharePublish.helpText.LinuxFirefox1 = 1. Click 'OK' para comenzar +bbb.screensharePublish.helpText.LinuxFirefox2 = Aceptar el certificado bbb.screensharePublish.helpText.LinuxFirefox3 = -bbb.screensharePublish.helpText.LinuxChrome1 = -bbb.screensharePublish.helpText.LinuxChrome2 = -bbb.screensharePublish.helpText.LinuxChrome3 = -bbb.screensharePublish.shareTypeLabel.text = -bbb.screensharePublish.shareType.fullScreen = -bbb.screensharePublish.shareType.region = -bbb.screensharePublish.pauseMessage.label = -bbb.screensharePublish.startFailed.label = -bbb.screensharePublish.restartFailed.label = -bbb.screensharePublish.jwsCrashed.label = -bbb.screensharePublish.commonErrorMessage.label = -bbb.screensharePublish.tunnelingErrorMessage.one = +bbb.screensharePublish.helpText.LinuxChrome1 = 1. Localiza 'screenshare.jnlp' +bbb.screensharePublish.helpText.LinuxChrome2 = 2. Haga click para abrir +bbb.screensharePublish.helpText.LinuxChrome3 = 3. Aceptar el certificado +bbb.screensharePublish.shareTypeLabel.text = Compartir: +bbb.screensharePublish.shareType.fullScreen = Pantalla completa +bbb.screensharePublish.shareType.region = Región +bbb.screensharePublish.pauseMessage.label = Pantalla compartida actualmente pausada. +bbb.screensharePublish.startFailed.label = No detectó comienzo de pantalla compartida. +bbb.screensharePublish.restartFailed.label = No detectó reinicio de pantalla compartida. +bbb.screensharePublish.jwsCrashed.label = La aplicación pantalla compartida cerró inesperadamente. +bbb.screensharePublish.commonErrorMessage.label = Seleccione 'Cancelar' y trate nuevamente. +bbb.screensharePublish.tunnelingErrorMessage.one = Compartir pantalla no esta disponible para usar. bbb.screensharePublish.tunnelingErrorMessage.two = bbb.screensharePublish.cancelButton.label = Cancelar bbb.screensharePublish.startButton.label = Iniciar -bbb.screensharePublish.stopButton.label = -bbb.screensharePublish.stopButton.toolTip = -bbb.screensharePublish.WebRTCChromeExtensionMissing.label = -bbb.screensharePublish.WebRTCRetryExtensionInstallation.label = +bbb.screensharePublish.stopButton.label = Detener +bbb.screensharePublish.stopButton.toolTip = Detener compartir tu pantalla +bbb.screensharePublish.WebRTCChromeExtensionMissing.label = Esta usando una versión reciente de Chrome pero no esta instalado la extensión de pantalla compartida. +bbb.screensharePublish.WebRTCRetryExtensionInstallation.label = Después de instalar la extensión de pantalla compartida, por favor hacer click abajo en 'Reintentar' bbb.screensharePublish.WebRTCExtensionFailFallback.label = bbb.screensharePublish.WebRTCPrivateBrowsingWarning.label = -bbb.screensharePublish.WebRTCExtensionInstallButton.label = -bbb.screensharePublish.WebRTCUseJavaButton.label = +bbb.screensharePublish.WebRTCExtensionInstallButton.label = Click aquà para instalar +bbb.screensharePublish.WebRTCUseJavaButton.label = Usar Java pantalla compartida bbb.screensharePublish.WebRTCVideoLoading.label = bbb.screensharePublish.sharingMessage= bbb.screenshareView.title = Compartir escritorio bbb.screenshareView.fitToWindow = Ajustarse a la pantalla -bbb.screenshareView.actualSize = -bbb.screenshareView.minimizeBtn.accessibilityName = -bbb.screenshareView.maximizeRestoreBtn.accessibilityName = -bbb.screenshareView.closeBtn.accessibilityName = +bbb.screenshareView.actualSize = Mostrar tamaño actual +bbb.screenshareView.minimizeBtn.accessibilityName = Minimizar la ventana de Escritorio Compartido +bbb.screenshareView.maximizeRestoreBtn.accessibilityName = Maximizar la ventana de Escritorio Compartido +bbb.screenshareView.closeBtn.accessibilityName = Cerrar la ventana de Escritorio Compartido bbb.toolbar.phone.toolTip.start = Habilitar el audio (Micrófono o solo escuchar) bbb.toolbar.phone.toolTip.stop = Dejar de compartir micrófono bbb.toolbar.phone.toolTip.mute = Dejar de escuchar la conferencia @@ -447,7 +447,7 @@ bbb.toolbar.phone.toolTip.unmute = Empezar a escuchar la conferencia bbb.toolbar.phone.toolTip.nomic = No se ha detectado micrófono bbb.toolbar.deskshare.toolTip.start = Compartir escritorio bbb.toolbar.deskshare.toolTip.stop = Dejar de compartir escritorio -bbb.toolbar.sharednotes.toolTip = +bbb.toolbar.sharednotes.toolTip = Abrir notas compartidas bbb.toolbar.video.toolTip.start = Compartir su cámara Web bbb.toolbar.video.toolTip.stop = Dejar de compartir su cámara Web bbb.layout.addButton.label = Agregar @@ -463,14 +463,14 @@ bbb.layout.combo.prompt = Aplicar diseño bbb.layout.combo.custom = *Diseño personalizado bbb.layout.combo.customName = Diseño personalizado bbb.layout.combo.remote = Remoto -bbb.layout.window.name = +bbb.layout.window.name = Nombre de Diseño bbb.layout.window.close.tooltip = Cerrar bbb.layout.window.close.accessibilityName = bbb.layout.save.complete = Los diseños fueron guardados exitosamente bbb.layout.save.ioerror = bbb.layout.load.complete = Los diseños fueron cargados bbb.layout.load.failed = Error al cargar diseños -bbb.layout.sync = +bbb.layout.sync = Tu diseño ha sido enviado a todos los participantes bbb.layout.name.defaultlayout = Alineación de ventanas por defecto bbb.layout.name.closedcaption = Subtitulos bbb.layout.name.videochat = Chat de Video @@ -479,11 +479,11 @@ bbb.layout.name.presentfocus = Presentación bbb.layout.name.presentandusers = bbb.layout.name.lectureassistant = Asistente de conferencia bbb.layout.name.lecture = Conferencia -bbb.layout.name.sharednotes = +bbb.layout.name.sharednotes = Notas compartidas bbb.layout.addCurrentToFileWindow.title = bbb.layout.addCurrentToFileWindow.text = bbb.layout.denyAddToFile.toolTip = -bbb.layout.confirmAddToFile.toolTip = +bbb.layout.confirmAddToFile.toolTip = Confirmar aceptar el diseño actual bbb.highlighter.toolbar.pencil = Lápiz bbb.highlighter.toolbar.pencil.accessibilityName = Cambiar el cursor a lápiz bbb.highlighter.toolbar.ellipse = CÃrculo @@ -509,13 +509,13 @@ bbb.logout.connectionfailed = La conexión al servidor ha terminado bbb.logout.rejected = La conexión al servidor ha sido rechazada bbb.logout.invalidapp = La aplicación red5 no existe bbb.logout.unknown = Su cliente ha perdido conexión con el servidor -bbb.logout.guestkickedout = +bbb.logout.guestkickedout = El moderador no permitió ingreses a esta reunión bbb.logout.usercommand = Usted ha salido de la conferencia -bbb.logour.breakoutRoomClose = -bbb.logout.ejectedFromMeeting = +bbb.logour.breakoutRoomClose = La ventana de su navegador se cerrará +bbb.logout.ejectedFromMeeting = Usted a sido expulsado de la reunión. bbb.logout.refresh.message = Si esta desconexión no estaba planificada, pulse el botón para reconectar. bbb.logout.refresh.label = Reconectar -bbb.logout.feedback.hint = +bbb.logout.feedback.hint = Como podemos hacer BigBlueButton Mejor? bbb.logout.feedback.label = bbb.settings.title = bbb.settings.ok = Correcto @@ -523,7 +523,7 @@ bbb.settings.cancel = Cancelar bbb.settings.btn.toolTip = bbb.logout.confirm.title = Confirmar Cerrar Sesión bbb.logout.confirm.message = ¿Esta seguro que desea cerrar sesión? -bbb.logout.confirm.endMeeting = +bbb.logout.confirm.endMeeting = Si y finalizar la reunión bbb.logout.confirm.yes = Si bbb.logout.confirm.no = No bbb.endSession.confirm.title = @@ -544,16 +544,16 @@ bbb.sharedNotes.quickLink.label = bbb.sharedNotes.createNoteWindow.label = bbb.sharedNotes.createNoteWindow.close.tooltip = Cerrar bbb.sharedNotes.createNoteWindow.close.accessibilityName = -bbb.sharedNotes.typing.single = -bbb.sharedNotes.typing.double = -bbb.sharedNotes.typing.multiple = +bbb.sharedNotes.typing.single = {0} esta escribiendo... +bbb.sharedNotes.typing.double = {0} y {1} están escribiendo... +bbb.sharedNotes.typing.multiple = Varias personas están escribiendo... bbb.sharedNotes.save.toolTip = bbb.sharedNotes.save.complete = bbb.sharedNotes.save.ioerror = bbb.sharedNotes.save.htmlLabel = -bbb.sharedNotes.save.txtLabel = +bbb.sharedNotes.save.txtLabel = Texto plano (.txt) bbb.sharedNotes.new.label = -bbb.sharedNotes.new.toolTip = +bbb.sharedNotes.new.toolTip = Crear nota adicional bbb.sharedNotes.limit.label = bbb.sharedNotes.clear.label = bbb.sharedNotes.undo.toolTip = @@ -578,20 +578,20 @@ bbb.settings.flash.label = Error de versión de Flash bbb.settings.flash.text = Usted tiene Flash {0} instalado, pero necesita por lo menos la versión {1} para ejecutar BigBlueButton adecuadamente. Haga clic en el botón de abajo para instalar la última versión de Adobe Flash. bbb.settings.flash.command = Instalar la versión más reciente de Java bbb.settings.isight.label = Error en cámara iSight -bbb.settings.isight.text = +bbb.settings.isight.text = Si presenta problemas con su cámara iSight, puede deberse a que está ejecutando OS X 10.6.5, El cual es conocido por presentar problemas con Flash en la captura de vÃdeo desde la cámara iSight.\n Para corregir esto, haga clic en el enlace de abajo para instalar la versión más reciente de Flash Player, o actualizar tu Mac a la versión más reciente bbb.settings.isight.command = Instalar Flash 10.2 RC2 bbb.settings.warning.label = Advertencia bbb.settings.warning.close = Alerta bbb.settings.noissues = Ninguna edicion excepcional se ha detectado bbb.settings.instructions = Acepte el mensaje de Flash que le pide permisos de cámara. Si usted puede verse y oÃrse, su navegador se ha configurado correctamente. Otros problemas potenciales se muestran a continuación. Haga clic en cada uno para encontrar una posible solución. bbb.bwmonitor.title = -bbb.bwmonitor.upload = +bbb.bwmonitor.upload = Subir bbb.bwmonitor.upload.short = bbb.bwmonitor.download = -bbb.bwmonitor.download.short = -bbb.bwmonitor.total = -bbb.bwmonitor.current = -bbb.bwmonitor.available = +bbb.bwmonitor.download.short = Abajo +bbb.bwmonitor.total = Total +bbb.bwmonitor.current = Actual +bbb.bwmonitor.available = Disponible bbb.bwmonitor.latency = ltbcustom.bbb.highlighter.toolbar.triangle = Triángulo ltbcustom.bbb.highlighter.toolbar.triangle.accessibilityName = Cambiar Cursor de Pizarra a Triángulo @@ -602,22 +602,22 @@ ltbcustom.bbb.highlighter.toolbar.text.accessibilityName = Cambiar Cursos de piz ltbcustom.bbb.highlighter.texttoolbar.textColorPicker = Color de texto ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = Támaño de fuente bbb.caption.window.title = Subtitulos -bbb.caption.quickLink.label = -bbb.caption.window.titleBar = -bbb.caption.window.minimizeBtn.accessibilityName = -bbb.caption.window.maximizeRestoreBtn.accessibilityName = +bbb.caption.quickLink.label = Ventana de subtÃtulos +bbb.caption.window.titleBar = Barra de tÃtulo de la ventana de subtÃtulos +bbb.caption.window.minimizeBtn.accessibilityName = Minimiza la ventana de subtÃtulos +bbb.caption.window.maximizeRestoreBtn.accessibilityName = Maximiza la ventana de subtÃtulos bbb.caption.transcript.noowner = Ninguno bbb.caption.transcript.youowner = Usted -bbb.caption.transcript.pastewarning.title = -bbb.caption.transcript.pastewarning.text = -bbb.caption.transcript.inputArea.toolTip = -bbb.caption.transcript.outputArea.toolTip = +bbb.caption.transcript.pastewarning.title = Advertencia de pegado de subtÃtulos +bbb.caption.transcript.pastewarning.text = El texto a pegar no puede exceder de {0} caracteres. Usted pegó {1} caracteres. +bbb.caption.transcript.inputArea.toolTip = Ãrea interna de subtÃtulos +bbb.caption.transcript.outputArea.toolTip = Ãrea externa de subtÃtulos bbb.caption.option.label = Opciones bbb.caption.option.language = Idioma: bbb.caption.option.language.tooltip = Seleccionar idioma de subtitulos -bbb.caption.option.language.accessibilityName = +bbb.caption.option.language.accessibilityName = Seleccione lenguaje de traducción. Use las teclas de dirección para navegar. bbb.caption.option.takeowner = Apropiarse -bbb.caption.option.takeowner.tooltip = +bbb.caption.option.takeowner.tooltip = Usar lenguaje seleccionado bbb.caption.option.fontfamily = Tipo de letra: bbb.caption.option.fontfamily.tooltip = Tipo de letra bbb.caption.option.fontsize = Tamaño de letra: @@ -643,16 +643,16 @@ bbb.accessibility.chat.initialDescription = Por favor usar las teclas direcciona bbb.accessibility.notes.notesview.input = Entradas de las notas bbb.shortcuthelp.title = Teclas de acceso directo -bbb.shortcuthelp.titleBar = +bbb.shortcuthelp.titleBar = Teclas de acceso directo de la ventana de la barra de tÃtulo bbb.shortcuthelp.minimizeBtn.accessibilityName = Minimizar la ventana de accesos rápidos bbb.shortcuthelp.maximizeRestoreBtn.accessibilityName = Mazimizar la ventana de accesos rápidos bbb.shortcuthelp.closeBtn.accessibilityName = Cerrar la ventana de accesos rápidos -bbb.shortcuthelp.dropdown.accessibilityName = +bbb.shortcuthelp.dropdown.accessibilityName = Atajo para Categorias bbb.shortcuthelp.dropdown.general = Accesos rápidos globales bbb.shortcuthelp.dropdown.presentation = Accesos rápidos a la presentación bbb.shortcuthelp.dropdown.chat = Acceso rápido al chat bbb.shortcuthelp.dropdown.users = Acceso rápido a los usuarios -bbb.shortcuthelp.dropdown.caption = +bbb.shortcuthelp.dropdown.caption = Atajos de subtÃtulos bbb.shortcuthelp.browserWarning.text = bbb.shortcuthelp.headers.shortcut = Acceso Rápido bbb.shortcuthelp.headers.function = Función @@ -682,7 +682,7 @@ bbb.shortcutkey.focus.presentation.function = Mover enfoque a la ventana de pres bbb.shortcutkey.focus.chat = 52 bbb.shortcutkey.focus.chat.function = Mover enfoque a la venta de chat bbb.shortcutkey.focus.caption = 53 -bbb.shortcutkey.focus.caption.function = +bbb.shortcutkey.focus.caption.function = Mover ventana para observar subtÃtulos bbb.shortcutkey.share.desktop = 68 bbb.shortcutkey.share.desktop.function = Abrir la ventana de compartir escritorio @@ -712,7 +712,7 @@ bbb.shortcutkey.present.fitPage.function = Ajustar diapositivas en la página bbb.shortcutkey.users.makePresenter = 89 bbb.shortcutkey.users.makePresenter.function = Hacer presentador a la persona seleccionada bbb.shortcutkey.users.kick = 69 -bbb.shortcutkey.users.kick.function = +bbb.shortcutkey.users.kick.function = Expulsar persona seleccionada de la reunión bbb.shortcutkey.users.mute = 83 bbb.shortcutkey.users.mute.function = Activar o Desactivar sonido de la persona seleccionada bbb.shortcutkey.users.muteall = 65 @@ -720,18 +720,18 @@ bbb.shortcutkey.users.muteall.function = Activar o Desactivar sonido a todos los bbb.shortcutkey.users.muteAllButPres = 65 bbb.shortcutkey.users.muteAllButPres.function = Silenciar a todos excepto al presentador bbb.shortcutkey.users.breakoutRooms = 75 -bbb.shortcutkey.users.breakoutRooms.function = +bbb.shortcutkey.users.breakoutRooms.function = Ventana de salas de reunion bbb.shortcutkey.users.focusBreakoutRooms = 82 -bbb.shortcutkey.users.focusBreakoutRooms.function = +bbb.shortcutkey.users.focusBreakoutRooms.function = Observar lista de sala de reunion bbb.shortcutkey.users.listenToBreakoutRoom = 76 -bbb.shortcutkey.users.listenToBreakoutRoom.function = +bbb.shortcutkey.users.listenToBreakoutRoom.function = Escuchar sala de reunión seleccionada bbb.shortcutkey.users.joinBreakoutRoom = 79 -bbb.shortcutkey.users.joinBreakoutRoom.function = +bbb.shortcutkey.users.joinBreakoutRoom.function = Unirse a la sala de reunión seleccionada bbb.shortcutkey.chat.focusTabs = 89 bbb.shortcutkey.chat.focusTabs.function = Enfocar a las pestañas del chat bbb.shortcutkey.chat.focusBox = 82 -bbb.shortcutkey.chat.focusBox.function = +bbb.shortcutkey.chat.focusBox.function = Observar la lista de mensajes del chat bbb.shortcutkey.chat.changeColour = 67 bbb.shortcutkey.chat.changeColour.function = Enfocar en el seleccionador de color de la fuente bbb.shortcutkey.chat.sendMessage = 83 @@ -757,13 +757,13 @@ bbb.shortcutkey.chat.chatbox.debug = 71 bbb.shortcutkey.chat.chatbox.debug.function = Tecla de acceso rápido para depurar temporalmente bbb.shortcutkey.caption.takeOwnership = 79 -bbb.shortcutkey.caption.takeOwnership.function = +bbb.shortcutkey.caption.takeOwnership.function = Usar lenguaje seleccionado bbb.polling.startButton.tooltip = Iniciar una encuesta bbb.polling.startButton.label = Iniciar encuesta bbb.polling.publishButton.label = Publicar bbb.polling.closeButton.label = Cerrar -bbb.polling.customPollOption.label = +bbb.polling.customPollOption.label = Encuesta personalizada... bbb.polling.pollModal.title = Resultados de la encuesta en tiempo real bbb.polling.pollModal.hint = bbb.polling.customChoices.title = Agregar opciones para la encuesta @@ -803,7 +803,7 @@ bbb.users.settings.lockAll = Bloquear a todos bbb.users.settings.lockAllExcept = Bloquear todos menos presentador bbb.users.settings.lockSettings = Bloquear espectadores ... bbb.users.settings.breakoutRooms = Sesión de pequeños gupos... -bbb.users.settings.sendBreakoutRoomsInvitations = +bbb.users.settings.sendBreakoutRoomsInvitations = Enviar invitaciones a salas de reuniones bbb.users.settings.unlockAll = Desbloquear a todos los espectadores bbb.users.settings.roomIsLocked = Bloqueado por defecto bbb.users.settings.roomIsMuted = Silenciado por defecto @@ -827,31 +827,31 @@ bbb.lockSettings.locked=Bloqueado bbb.lockSettings.lockOnJoin=Unirse bbb.users.breakout.breakoutRooms = Sesión de pequeños gupos -bbb.users.breakout.updateBreakoutRooms = +bbb.users.breakout.updateBreakoutRooms = Actualizar sala de reunión bbb.users.breakout.timerForRoom.toolTip = -bbb.users.breakout.timer.toolTip = +bbb.users.breakout.timer.toolTip = Tiempo restante para las salas de reunión bbb.users.breakout.calculatingRemainingTime = Calculando tiempo restante .... bbb.users.breakout.closing = Cerrando bbb.users.breakout.closewarning.text = bbb.users.breakout.rooms = Sesiones -bbb.users.breakout.roomsCombo.accessibilityName = +bbb.users.breakout.roomsCombo.accessibilityName = Número de salas para crear bbb.users.breakout.room = Sesión bbb.users.breakout.timeLimit = LÃmite de tiempo -bbb.users.breakout.durationStepper.accessibilityName = +bbb.users.breakout.durationStepper.accessibilityName = Tiempo lÃmite en minutos bbb.users.breakout.minutes = Minutos bbb.users.breakout.record = Grabar -bbb.users.breakout.recordCheckbox.accessibilityName = +bbb.users.breakout.recordCheckbox.accessibilityName = Grabar sala de reunion bbb.users.breakout.notAssigned = No asignado bbb.users.breakout.dragAndDropToolTip = Consejo: Puedes arrastarr y soltar usuarios entre los cuartos bbb.users.breakout.start = Iniciar -bbb.users.breakout.invite = +bbb.users.breakout.invite = Invitar bbb.users.breakout.close = Cerrar bbb.users.breakout.closeAllRooms = Cerrar todas las sesiones de pequeños grupos -bbb.users.breakout.insufficientUsers = -bbb.users.breakout.confirm = -bbb.users.breakout.invited = +bbb.users.breakout.insufficientUsers = Usuarios insuficientes. Se requiere al menos un usuario en una sala de reuniones. +bbb.users.breakout.confirm = Unirse a una sala de reuniones +bbb.users.breakout.invited = Has sido invitado a reunirte 1Sala de Reunión1 bbb.users.breakout.accept = -bbb.users.breakout.joinSession = +bbb.users.breakout.joinSession = Unirse a la sesión bbb.users.breakout.joinSession.accessibilityName = bbb.users.breakout.joinSession.close.tooltip = Cerrar bbb.users.breakout.joinSession.close.accessibilityName = diff --git a/bigbluebutton-client/locale/et_EE/bbbResources.properties b/bigbluebutton-client/locale/et_EE/bbbResources.properties index 13467f43ed4dd7bdfccc4cfba7174a01a832307f..89c679e9736c363dd4c84de8d2e96a519f40dc64 100644 --- a/bigbluebutton-client/locale/et_EE/bbbResources.properties +++ b/bigbluebutton-client/locale/et_EE/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = Sätete teavitused bbb.clientstatus.notification = Lugemata teavitused bbb.clientstatus.close = Sulge bbb.clientstatus.tunneling.title = Tulemüür -bbb.clientstatus.tunneling.message = Tulemüür piirab otseühenduste loomist välise serveri pordiga 1935.\nStabiilsema ühenduse saavutamisega serveriga soovitame sul kasutada vähem piiravat võrguühendust. +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Brauseri versioon bbb.clientstatus.browser.message = Sinu brauseri versioon ({0}) on vana. Soovitame uuendada brauser viimasele versioonile. bbb.clientstatus.flash.title = Flash Player diff --git a/bigbluebutton-client/locale/eu_ES/bbbResources.properties b/bigbluebutton-client/locale/eu_ES/bbbResources.properties index e4b4e69717f4b09a3597ebc4221185f4780e7ea8..84d7e758f9c3b43833ff0e01c8afe62f4c042857 100644 --- a/bigbluebutton-client/locale/eu_ES/bbbResources.properties +++ b/bigbluebutton-client/locale/eu_ES/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = Jakinarazpenen konfigurazioa bbb.clientstatus.notification = Irakurri gabeko jakinarazpenak bbb.clientstatus.close = Itxi bbb.clientstatus.tunneling.title = Suebaki -bbb.clientstatus.tunneling.message = Suebaki batek saihesten du zure bezeroa eta zerbitzariaren arteko konexioa. Konexio hau zuzenean 1935 atakan da. Muga apaleko sare bat erabiltzea gomendatzen dugu konexio egonkorrago bat lortzeko. +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Nabigatzailearen bertsioa bbb.clientstatus.browser.message = Zure nabigatzailea ({0}) ez da gaurkotu. Azken bertsioarekin eguneratzea gomendatzen dugu. bbb.clientstatus.flash.title = Flash Player diff --git a/bigbluebutton-client/locale/fa_IR/bbbResources.properties b/bigbluebutton-client/locale/fa_IR/bbbResources.properties index f25c2dce70ba90d8bc0363155ffe4ea014028e7b..ec39f702d7155ef0476573761490bdffa8d58a8e 100755 --- a/bigbluebutton-client/locale/fa_IR/bbbResources.properties +++ b/bigbluebutton-client/locale/fa_IR/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = در ØØ§Ù„ اتصال به سرور bbb.mainshell.statusProgress.loading = bbb.mainshell.statusProgress.cannotConnectServer = Ù…ØªØ§Ø³ÙØ§Ù†Ù‡ØŒ امکان اتصال به سرور وجود ندارد. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = باز کردن پنجره تنظیمات میکروÙون bbb.mainshell.meetingNotFound = جلسه ÛŒØ§ÙØª نشد bbb.mainshell.invalidAuthToken = توکن Ø§ØØ±Ø§Ø² هویت نامعتبر @@ -140,7 +140,7 @@ bbb.clientstatus.title = پیکربندی اطلاع اعلان ها bbb.clientstatus.notification = اعلان های خوانده نشده bbb.clientstatus.close = بستن bbb.clientstatus.tunneling.title = دیوار اتش -bbb.clientstatus.tunneling.message = دیوار آتش، مانع اتصال مستقیم کاربر شما به سرور روی درگاه 1935 Ù…ÛŒ شود. پیشنهاد Ù…ÛŒ شود تا به به منظور اتصال پایدارتر، به یک شبکه با Ù…ØØ¯ÙˆØ¯ÛŒØª کمتر متصل شوید +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = نسخه مرورگر bbb.clientstatus.browser.message = مرورگر شما ({0}) به روز نیست. پیشنهاد Ù…ÛŒ شود به جدید ترین نسخه به روز رسانی کنید. bbb.clientstatus.flash.title = Ùلش پلیر diff --git a/bigbluebutton-client/locale/fr_CA/bbbResources.properties b/bigbluebutton-client/locale/fr_CA/bbbResources.properties index 11580918202255865143e26c336705cffc889b95..fd819c1dbb0b60684b83269acbf946fe01ead9a4 100644 --- a/bigbluebutton-client/locale/fr_CA/bbbResources.properties +++ b/bigbluebutton-client/locale/fr_CA/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Connexion au serveur bbb.mainshell.statusProgress.loading = chargement bbb.mainshell.statusProgress.cannotConnectServer = Désolé, impossible d'établir une connexion au serveur. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = Ouvrir la fenêtre de log bbb.mainshell.meetingNotFound = Conférence non trouvée bbb.mainshell.invalidAuthToken = Jeton d'authentification invalide @@ -140,7 +140,7 @@ bbb.clientstatus.title = Notifications de configuration bbb.clientstatus.notification = Notifications non lus bbb.clientstatus.close = Fermer bbb.clientstatus.tunneling.title = Pare-feu -bbb.clientstatus.tunneling.message = Un pare-feu empêche votre client de se connecter directement sur ​​le port 1935 sur le serveur distant . Recommander se joindre à un réseau moins restrictif pour une connexion plus stable +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Version du navigateur bbb.clientstatus.browser.message = Votre navigateur ({0}) ne êtes pas mis à jour. Recommander la mise à jour à la dernière version. bbb.clientstatus.flash.title = Flash Player @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = Publier bbb.polling.closeButton.label = Fermer bbb.polling.customPollOption.label = Votes personnalisés... bbb.polling.pollModal.title = Résultats de sondage en direct -bbb.polling.pollModal.hint = Laissez cette fenêtre ouverte pour permettre aux étudiants de répondre au sondage. La sélection du bouton Publier ou Fermer met fin au sondage. +bbb.polling.pollModal.hint = bbb.polling.customChoices.title = Entrez les choix de vote bbb.polling.respondersLabel.novotes = En attente de réponses bbb.polling.respondersLabel.text = {0} utilisateurs ont répondu diff --git a/bigbluebutton-client/locale/fr_FR/bbbResources.properties b/bigbluebutton-client/locale/fr_FR/bbbResources.properties index d1529d0ff295af7ffe64d3dff0badbfc15f75645..83863143a20b6622c4f11af5152b6c1e5174ae98 100644 --- a/bigbluebutton-client/locale/fr_FR/bbbResources.properties +++ b/bigbluebutton-client/locale/fr_FR/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Connexion au serveur bbb.mainshell.statusProgress.loading = Chargement bbb.mainshell.statusProgress.cannotConnectServer = Désolé, impossible d'établir une connexion au serveur. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (version {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = Ouvrir la fenêtre de log bbb.mainshell.meetingNotFound = Conférence introuvable bbb.mainshell.invalidAuthToken = Jeton d'authentification invalide @@ -140,7 +140,7 @@ bbb.clientstatus.title = Configuration des notifications bbb.clientstatus.notification = Notifications non lues bbb.clientstatus.close = Fermer bbb.clientstatus.tunneling.title = Pare-feu -bbb.clientstatus.tunneling.message = Un pare-feu empêche votre client de se connecter directement au port 1935 du serveur distant. Il est recommandé de se connecter à un réseau moins restrictif pour obtenir une connexion plus stable. +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Version du navigateur bbb.clientstatus.browser.message = Votre navigateur ({0}) n'est pas à jour. Il est recommandé d'installer la dernière version. bbb.clientstatus.flash.title = Flash Player @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = Publier bbb.polling.closeButton.label = Fermer bbb.polling.customPollOption.label = Votes personnalisés... bbb.polling.pollModal.title = Les résultats du vote en direct -bbb.polling.pollModal.hint = Laissez cette fenêtre ouverte pour permettre aux étudiants de répondre au vote. Sélectionner le bouton Publier ou Fermer va arrêter le vote. +bbb.polling.pollModal.hint = bbb.polling.customChoices.title = Entrer les choix du vote bbb.polling.respondersLabel.novotes = En attente des réponses bbb.polling.respondersLabel.text = {0} utilisateurs ont répondu diff --git a/bigbluebutton-client/locale/hi/bbbResources.properties b/bigbluebutton-client/locale/hi/bbbResources.properties index c64986623aa70d2d154a9107dffbe6be1293f1d7..abf35ec6160f09e359a1c086bbb8936609cf363f 100644 --- a/bigbluebutton-client/locale/hi/bbbResources.properties +++ b/bigbluebutton-client/locale/hi/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = सरà¥à¤µà¤° से कनेकà¥à¤Ÿ हो रहा है bbb.mainshell.statusProgress.loading = bbb.mainshell.statusProgress.cannotConnectServer = कà¥à¤·à¤®à¤¾ करें, हम सरà¥à¤µà¤° से कनेकà¥à¤Ÿ नहीं कर सकते -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = लॉग विंडो खोलें bbb.mainshell.meetingNotFound = बैठक नहीं मिली bbb.mainshell.invalidAuthToken = अमानà¥à¤¯ पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण टोकन @@ -140,7 +140,7 @@ bbb.clientstatus.title = विनà¥à¤¯à¤¾à¤¸ सूचनाà¤à¤‚ bbb.clientstatus.notification = अपठित सूचनाà¤à¤‚ bbb.clientstatus.close = बंद करे bbb.clientstatus.tunneling.title = फ़ायरवॉल -bbb.clientstatus.tunneling.message = फ़ायरवॉल आपके कà¥à¤²à¤¾à¤‡à¤‚ट को पोरà¥à¤Ÿ 1935 पर सीधे रिमोट सरà¥à¤µà¤° से कनेकà¥à¤Ÿ करने से रोक रहा है। अधिक सà¥à¤¥à¤¿à¤° कनेकà¥à¤¶à¤¨ के लिठà¤à¤• कम पà¥à¤°à¤¤à¤¿à¤¬à¤‚धातà¥à¤®à¤• नेटवरà¥à¤• में शामिल होने की सिफारिश करें +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° संसà¥à¤•रण bbb.clientstatus.browser.message = आपका बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° ({0}) अप-टू-डेट नहीं है नवीनतम संसà¥à¤•रण को अपडेट करने की अनà¥à¤¶à¤‚सा bbb.clientstatus.flash.title = फ़à¥à¤²à¥ˆà¤¶ पà¥à¤²à¥‡à¤¯à¤° diff --git a/bigbluebutton-client/locale/ht/bbbResources.properties b/bigbluebutton-client/locale/ht/bbbResources.properties new file mode 100644 index 0000000000000000000000000000000000000000..f5f028b52b98d8eb435954e8ab06ae6c9133b21b --- /dev/null +++ b/bigbluebutton-client/locale/ht/bbbResources.properties @@ -0,0 +1,871 @@ +bbb.mainshell.locale.version = +bbb.mainshell.statusProgress.connecting = +bbb.mainshell.statusProgress.loading = +bbb.mainshell.statusProgress.cannotConnectServer = +bbb.mainshell.copyrightLabel2 = +bbb.mainshell.logBtn.toolTip = +bbb.mainshell.meetingNotFound = +bbb.mainshell.invalidAuthToken = +bbb.mainshell.resetLayoutBtn.toolTip = +bbb.mainshell.notification.tunnelling = +bbb.mainshell.notification.webrtc = +bbb.mainshell.fullscreenBtn.toolTip = +bbb.mainshell.quote.sentence.1 = +bbb.mainshell.quote.attribution.1 = +bbb.mainshell.quote.sentence.2 = +bbb.mainshell.quote.attribution.2 = +bbb.mainshell.quote.sentence.3 = +bbb.mainshell.quote.attribution.3 = +bbb.mainshell.quote.sentence.4 = +bbb.mainshell.quote.attribution.4 = +bbb.mainshell.quote.sentence.5 = +bbb.mainshell.quote.attribution.5 = +bbb.oldlocalewindow.reminder1 = +bbb.oldlocalewindow.reminder2 = +bbb.oldlocalewindow.windowTitle = +bbb.audioSelection.title = +bbb.audioSelection.btnMicrophone.label = +bbb.audioSelection.btnMicrophone.toolTip = +bbb.audioSelection.btnListenOnly.label = +bbb.audioSelection.btnListenOnly.toolTip = +bbb.audioSelection.txtPhone.text = +bbb.micSettings.title = +bbb.micSettings.speakers.header = +bbb.micSettings.microphone.header = +bbb.micSettings.playSound = +bbb.micSettings.playSound.toolTip = +bbb.micSettings.hearFromHeadset = +bbb.micSettings.speakIntoMic = +bbb.micSettings.echoTestMicPrompt = +bbb.micSettings.echoTestAudioYes = +bbb.micSettings.echoTestAudioNo = +bbb.micSettings.speakIntoMicTestLevel = +bbb.micSettings.recommendHeadset = +bbb.micSettings.changeMic = +bbb.micSettings.changeMic.toolTip = +bbb.micSettings.comboMicList.toolTip = +bbb.micSettings.micRecordVolume.label = +bbb.micSettings.micRecordVolume.toolTip = +bbb.micSettings.nextButton = +bbb.micSettings.nextButton.toolTip = +bbb.micSettings.join = +bbb.micSettings.join.toolTip = +bbb.micSettings.cancel = +bbb.micSettings.connectingtoecho = +bbb.micSettings.connectingtoecho.error = +bbb.micSettings.cancel.toolTip = +bbb.micSettings.access.helpButton = +bbb.micSettings.access.title = +bbb.micSettings.webrtc.title = +bbb.micSettings.webrtc.capableBrowser = +bbb.micSettings.webrtc.capableBrowser.dontuseit = +bbb.micSettings.webrtc.capableBrowser.dontuseit.toolTip = +bbb.micSettings.webrtc.notCapableBrowser = +bbb.micSettings.webrtc.connecting = +bbb.micSettings.webrtc.waitingforice = +bbb.micSettings.webrtc.transferring = +bbb.micSettings.webrtc.endingecho = +bbb.micSettings.webrtc.endedecho = +bbb.micPermissions.message.browserhttp = +bbb.micPermissions.firefox.title = +bbb.micPermissions.firefox.message = +bbb.micPermissions.chrome.title = +bbb.micPermissions.chrome.message = +bbb.micWarning.title = +bbb.micWarning.joinBtn.label = +bbb.micWarning.testAgain.label = +bbb.micWarning.message = +bbb.webrtcWarning.message = +bbb.webrtcWarning.title = +bbb.webrtcWarning.failedError.1001 = +bbb.webrtcWarning.failedError.1002 = +bbb.webrtcWarning.failedError.1003 = +bbb.webrtcWarning.failedError.1004 = +bbb.webrtcWarning.failedError.1005 = +bbb.webrtcWarning.failedError.1006 = +bbb.webrtcWarning.failedError.1007 = +bbb.webrtcWarning.failedError.1008 = +bbb.webrtcWarning.failedError.1009 = +bbb.webrtcWarning.failedError.1010 = +bbb.webrtcWarning.failedError.1011 = +bbb.webrtcWarning.failedError.unknown = +bbb.webrtcWarning.failedError.mediamissing = +bbb.webrtcWarning.failedError.endedunexpectedly = +bbb.webrtcWarning.connection.dropped = +bbb.webrtcWarning.connection.reconnecting = +bbb.webrtcWarning.connection.reestablished = +bbb.inactivityWarning.title = +bbb.inactivityWarning.message = +bbb.shuttingDown.message = +bbb.inactivityWarning.cancel = +bbb.mainToolbar.helpBtn = +bbb.mainToolbar.logoutBtn = +bbb.mainToolbar.logoutBtn.toolTip = +bbb.mainToolbar.idleLogoutBtn = +bbb.mainToolbar.langSelector = +bbb.mainToolbar.settingsBtn = +bbb.mainToolbar.settingsBtn.toolTip = +bbb.mainToolbar.shortcutBtn = +bbb.mainToolbar.shortcutBtn.toolTip = +bbb.mainToolbar.recordBtn.toolTip.start = +bbb.mainToolbar.recordBtn.toolTip.stop = +bbb.mainToolbar.recordBtn.toolTip.recording = +bbb.mainToolbar.recordBtn.toolTip.notRecording = +bbb.mainToolbar.recordBtn.toolTip.onlyModerators = +bbb.mainToolbar.recordBtn.toolTip.wontInterrupt = +bbb.mainToolbar.recordBtn.toolTip.wontRecord = +bbb.mainToolbar.recordBtn.confirm.title = +bbb.mainToolbar.recordBtn.confirm.message.start = +bbb.mainToolbar.recordBtn.confirm.message.stop = +bbb.mainToolbar.recordBtn.notification.title = +bbb.mainToolbar.recordBtn.notification.message1 = +bbb.mainToolbar.recordBtn.notification.message2 = +bbb.mainToolbar.recordingLabel.recording = +bbb.mainToolbar.recordingLabel.notRecording = +bbb.waitWindow.waitMessage.message = +bbb.waitWindow.waitMessage.title = +bbb.guests.title = +bbb.guests.message.singular = +bbb.guests.message.plural = +bbb.guests.allowBtn.toolTip = +bbb.guests.allowEveryoneBtn.text = +bbb.guests.denyBtn.toolTip = +bbb.guests.denyEveryoneBtn.text = +bbb.guests.rememberAction.text = +bbb.guests.alwaysAccept = +bbb.guests.alwaysDeny = +bbb.guests.askModerator = +bbb.guests.Management = +bbb.clientstatus.title = +bbb.clientstatus.notification = +bbb.clientstatus.close = +bbb.clientstatus.tunneling.title = +bbb.clientstatus.tunneling.message = +bbb.clientstatus.browser.title = +bbb.clientstatus.browser.message = +bbb.clientstatus.flash.title = +bbb.clientstatus.flash.message = +bbb.clientstatus.webrtc.title = +bbb.clientstatus.webrtc.strongStatus = +bbb.clientstatus.webrtc.almostStrongStatus = +bbb.clientstatus.webrtc.almostWeakStatus = +bbb.clientstatus.webrtc.weakStatus = +bbb.clientstatus.webrtc.message = +bbb.clientstatus.java.title = +bbb.clientstatus.java.notdetected = +bbb.clientstatus.java.notinstalled = +bbb.clientstatus.java.oldversion = +bbb.window.minimizeBtn.toolTip = +bbb.window.maximizeRestoreBtn.toolTip = +bbb.window.closeBtn.toolTip = +bbb.videoDock.titleBar = +bbb.presentation.titleBar = +bbb.chat.titleBar = +bbb.users.title = +bbb.users.titleBar = +bbb.users.quickLink.label = +bbb.users.minimizeBtn.accessibilityName = +bbb.users.maximizeRestoreBtn.accessibilityName = +bbb.users.settings.buttonTooltip = +bbb.users.settings.audioSettings = +bbb.users.settings.webcamSettings = +bbb.users.settings.muteAll = +bbb.users.settings.muteAllExcept = +bbb.users.settings.unmuteAll = +bbb.users.settings.clearAllStatus = +bbb.users.emojiStatusBtn.toolTip = +bbb.users.roomMuted.text = +bbb.users.roomLocked.text = +bbb.users.pushToTalk.toolTip = +bbb.users.pushToMute.toolTip = +bbb.users.muteMeBtnTxt.talk = +bbb.users.muteMeBtnTxt.mute = +bbb.users.muteMeBtnTxt.muted = +bbb.users.usersGrid.contextmenu.exportusers = +bbb.users.usersGrid.accessibilityName = +bbb.users.usersGrid.nameItemRenderer = +bbb.users.usersGrid.nameItemRenderer.youIdentifier = +bbb.users.usersGrid.statusItemRenderer = +bbb.users.usersGrid.statusItemRenderer.changePresenter = +bbb.users.usersGrid.statusItemRenderer.presenter = +bbb.users.usersGrid.statusItemRenderer.moderator = +bbb.users.usersGrid.statusItemRenderer.voiceOnlyUser = +bbb.users.usersGrid.statusItemRenderer.raiseHand = +bbb.users.usersGrid.statusItemRenderer.applause = +bbb.users.usersGrid.statusItemRenderer.thumbsUp = +bbb.users.usersGrid.statusItemRenderer.thumbsDown = +bbb.users.usersGrid.statusItemRenderer.speakLouder = +bbb.users.usersGrid.statusItemRenderer.speakSofter = +bbb.users.usersGrid.statusItemRenderer.speakFaster = +bbb.users.usersGrid.statusItemRenderer.speakSlower = +bbb.users.usersGrid.statusItemRenderer.away = +bbb.users.usersGrid.statusItemRenderer.confused = +bbb.users.usersGrid.statusItemRenderer.neutral = +bbb.users.usersGrid.statusItemRenderer.happy = +bbb.users.usersGrid.statusItemRenderer.sad = +bbb.users.usersGrid.statusItemRenderer.clearStatus = +bbb.users.usersGrid.statusItemRenderer.viewer = +bbb.users.usersGrid.statusItemRenderer.streamIcon.toolTip = +bbb.users.usersGrid.statusItemRenderer.presIcon.toolTip = +bbb.users.usersGrid.mediaItemRenderer = +bbb.users.usersGrid.mediaItemRenderer.talking = +bbb.users.usersGrid.mediaItemRenderer.webcam = +bbb.users.usersGrid.mediaItemRenderer.webcamBtn = +bbb.users.usersGrid.mediaItemRenderer.pushToTalk = +bbb.users.usersGrid.mediaItemRenderer.pushToMute = +bbb.users.usersGrid.mediaItemRenderer.pushToLock = +bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = +bbb.users.usersGrid.mediaItemRenderer.kickUser = +bbb.users.usersGrid.mediaItemRenderer.webcam = +bbb.users.usersGrid.mediaItemRenderer.micOff = +bbb.users.usersGrid.mediaItemRenderer.micOn = +bbb.users.usersGrid.mediaItemRenderer.noAudio = +bbb.users.usersGrid.mediaItemRenderer.promoteUser = +bbb.users.usersGrid.mediaItemRenderer.demoteUser = +bbb.users.emojiStatus.clear = +bbb.users.emojiStatus.raiseHand = +bbb.users.emojiStatus.happy = +bbb.users.emojiStatus.neutral = +bbb.users.emojiStatus.sad = +bbb.users.emojiStatus.confused = +bbb.users.emojiStatus.away = +bbb.users.emojiStatus.thumbsUp = +bbb.users.emojiStatus.thumbsDown = +bbb.users.emojiStatus.applause = +bbb.users.emojiStatus.agree = +bbb.users.emojiStatus.disagree = +bbb.users.emojiStatus.none = +bbb.users.emojiStatus.speakLouder = +bbb.users.emojiStatus.speakSofter = +bbb.users.emojiStatus.speakFaster = +bbb.users.emojiStatus.speakSlower = +bbb.users.emojiStatus.beRightBack = +bbb.presentation.title = +bbb.presentation.titleWithPres = +bbb.presentation.quickLink.label = +bbb.presentation.fitToWidth.toolTip = +bbb.presentation.fitToPage.toolTip = +bbb.presentation.uploadPresBtn.toolTip = +bbb.presentation.downloadPresBtn.toolTip = +bbb.presentation.poll.response = +bbb.presentation.backBtn.toolTip = +bbb.presentation.btnSlideNum.accessibilityName = +bbb.presentation.btnSlideNum.toolTip = +bbb.presentation.forwardBtn.toolTip = +bbb.presentation.maxUploadFileExceededAlert = +bbb.presentation.uploadcomplete = +bbb.presentation.uploaded = +bbb.presentation.document.supported = +bbb.presentation.document.converted = +bbb.presentation.error.document.convert.failed = +bbb.presentation.error.document.convert.invalid = +bbb.presentation.error.io = +bbb.presentation.error.security = +bbb.presentation.error.convert.notsupported = +bbb.presentation.error.convert.nbpage = +bbb.presentation.error.convert.maxnbpagereach = +bbb.presentation.converted = +bbb.presentation.slider = +bbb.presentation.slideloader.starttext = +bbb.presentation.slideloader.endtext = +bbb.presentation.uploadwindow.presentationfile = +bbb.presentation.uploadwindow.pdf = +bbb.presentation.uploadwindow.word = +bbb.presentation.uploadwindow.excel = +bbb.presentation.uploadwindow.powerpoint = +bbb.presentation.uploadwindow.image = +bbb.presentation.minimizeBtn.accessibilityName = +bbb.presentation.maximizeRestoreBtn.accessibilityName = +bbb.presentation.closeBtn.accessibilityName = +bbb.fileupload.title = +bbb.fileupload.lblFileName.defaultText = +bbb.fileupload.selectBtn.label = +bbb.fileupload.selectBtn.toolTip = +bbb.fileupload.uploadBtn = +bbb.fileupload.uploadBtn.toolTip = +bbb.fileupload.deleteBtn.toolTip = +bbb.fileupload.showBtn = +bbb.fileupload.retry = +bbb.fileupload.showBtn.toolTip = +bbb.fileupload.close.tooltip = +bbb.fileupload.close.accessibilityName = +bbb.fileupload.genThumbText = +bbb.fileupload.progBarLbl = +bbb.fileupload.fileFormatHint = +bbb.fileupload.letUserDownload = +bbb.fileupload.letUserDownload.tooltip = +bbb.filedownload.title = +bbb.filedownload.close.tooltip = +bbb.filedownload.close.accessibilityName = +bbb.filedownload.fileLbl = +bbb.filedownload.downloadBtn = +bbb.filedownload.downloadBtn.toolTip = +bbb.filedownload.thisFileIsDownloadable = +bbb.chat.title = +bbb.chat.quickLink.label = +bbb.chat.cmpColorPicker.toolTip = +bbb.chat.input.accessibilityName = +bbb.chat.sendBtn.toolTip = +bbb.chat.sendBtn.accessibilityName = +bbb.chat.saveBtn.toolTip = +bbb.chat.saveBtn.accessibilityName = +bbb.chat.saveBtn.label = +bbb.chat.save.complete = +bbb.chat.save.ioerror = +bbb.chat.save.filename = +bbb.chat.copyBtn.toolTip = +bbb.chat.copyBtn.accessibilityName = +bbb.chat.copyBtn.label = +bbb.chat.copy.complete = +bbb.chat.clearBtn.toolTip = +bbb.chat.clearBtn.accessibilityName = +bbb.chat.clearBtn.chatMessage = +bbb.chat.clearBtn.alert.title = +bbb.chat.clearBtn.alert.text = +bbb.chat.contextmenu.copyalltext = +bbb.chat.publicChatUsername = +bbb.chat.optionsTabName = +bbb.chat.privateChatSelect = +bbb.chat.private.userLeft = +bbb.chat.private.userJoined = +bbb.chat.private.closeMessage = +bbb.chat.usersList.toolTip = +bbb.chat.usersList.accessibilityName = +bbb.chat.chatOptions = +bbb.chat.fontSize = +bbb.chat.cmbFontSize.toolTip = +bbb.chat.messageList = +bbb.chat.minimizeBtn.accessibilityName = +bbb.chat.maximizeRestoreBtn.accessibilityName = +bbb.chat.closeBtn.accessibilityName = +bbb.chat.chatTabs.accessibleNotice = +bbb.chat.chatMessage.systemMessage = +bbb.chat.chatMessage.stringRespresentation = +bbb.chat.chatMessage.tooLong = +bbb.publishVideo.changeCameraBtn.labelText = +bbb.publishVideo.changeCameraBtn.toolTip = +bbb.publishVideo.cmbResolution.tooltip = +bbb.publishVideo.startPublishBtn.labelText = +bbb.publishVideo.startPublishBtn.toolTip = +bbb.publishVideo.startPublishBtn.errorName = +bbb.webcamPermissions.chrome.title = +bbb.webcamPermissions.chrome.message = +bbb.videodock.title = +bbb.videodock.quickLink.label = +bbb.video.minimizeBtn.accessibilityName = +bbb.video.maximizeRestoreBtn.accessibilityName = +bbb.video.controls.muteButton.toolTip = +bbb.video.controls.switchPresenter.toolTip = +bbb.video.controls.ejectUserBtn.toolTip = +bbb.video.controls.privateChatBtn.toolTip = +bbb.video.publish.hint.noCamera = +bbb.video.publish.hint.cantOpenCamera = +bbb.video.publish.hint.waitingApproval = +bbb.video.publish.hint.videoPreview = +bbb.video.publish.hint.openingCamera = +bbb.video.publish.hint.cameraDenied = +bbb.video.publish.hint.cameraIsBeingUsed = +bbb.video.publish.hint.publishing = +bbb.video.publish.closeBtn.accessName = +bbb.video.publish.closeBtn.label = +bbb.video.publish.titleBar = +bbb.video.streamClose.toolTip = +bbb.video.message.browserhttp = +bbb.screensharePublish.title = +bbb.screensharePublish.pause.tooltip = +bbb.screensharePublish.pause.label = +bbb.screensharePublish.restart.tooltip = +bbb.screensharePublish.restart.label = +bbb.screensharePublish.maximizeRestoreBtn.toolTip = +bbb.screensharePublish.closeBtn.toolTip = +bbb.screensharePublish.closeBtn.accessibilityName = +bbb.screensharePublish.minimizeBtn.toolTip = +bbb.screensharePublish.minimizeBtn.accessibilityName = +bbb.screensharePublish.maximizeRestoreBtn.accessibilityName = +bbb.screensharePublish.commonHelpText.text = +bbb.screensharePublish.helpButton.toolTip = +bbb.screensharePublish.helpButton.accessibilityName = +bbb.screensharePublish.helpText.PCIE1 = +bbb.screensharePublish.helpText.PCIE2 = +bbb.screensharePublish.helpText.PCIE3 = +bbb.screensharePublish.helpText.PCFirefox1 = +bbb.screensharePublish.helpText.PCFirefox2 = +bbb.screensharePublish.helpText.PCFirefox3 = +bbb.screensharePublish.helpText.PCChrome1 = +bbb.screensharePublish.helpText.PCChrome2 = +bbb.screensharePublish.helpText.PCChrome3 = +bbb.screensharePublish.helpText.MacSafari1 = +bbb.screensharePublish.helpText.MacSafari2 = +bbb.screensharePublish.helpText.MacSafari3 = +bbb.screensharePublish.helpText.MacSafari4 = +bbb.screensharePublish.helpText.MacFirefox1 = +bbb.screensharePublish.helpText.MacFirefox2 = +bbb.screensharePublish.helpText.MacFirefox3 = +bbb.screensharePublish.helpText.MacFirefox4 = +bbb.screensharePublish.helpText.MacChrome1 = +bbb.screensharePublish.helpText.MacChrome2 = +bbb.screensharePublish.helpText.MacChrome3 = +bbb.screensharePublish.helpText.MacChrome4 = +bbb.screensharePublish.helpText.LinuxFirefox1 = +bbb.screensharePublish.helpText.LinuxFirefox2 = +bbb.screensharePublish.helpText.LinuxFirefox3 = +bbb.screensharePublish.helpText.LinuxChrome1 = +bbb.screensharePublish.helpText.LinuxChrome2 = +bbb.screensharePublish.helpText.LinuxChrome3 = +bbb.screensharePublish.shareTypeLabel.text = +bbb.screensharePublish.shareType.fullScreen = +bbb.screensharePublish.shareType.region = +bbb.screensharePublish.pauseMessage.label = +bbb.screensharePublish.startFailed.label = +bbb.screensharePublish.restartFailed.label = +bbb.screensharePublish.jwsCrashed.label = +bbb.screensharePublish.commonErrorMessage.label = +bbb.screensharePublish.tunnelingErrorMessage.one = +bbb.screensharePublish.tunnelingErrorMessage.two = +bbb.screensharePublish.cancelButton.label = +bbb.screensharePublish.startButton.label = +bbb.screensharePublish.stopButton.label = +bbb.screensharePublish.stopButton.toolTip = +bbb.screensharePublish.WebRTCChromeExtensionMissing.label = +bbb.screensharePublish.WebRTCRetryExtensionInstallation.label = +bbb.screensharePublish.WebRTCExtensionFailFallback.label = +bbb.screensharePublish.WebRTCPrivateBrowsingWarning.label = +bbb.screensharePublish.WebRTCExtensionInstallButton.label = +bbb.screensharePublish.WebRTCUseJavaButton.label = +bbb.screensharePublish.WebRTCVideoLoading.label = +bbb.screensharePublish.sharingMessage= +bbb.screenshareView.title = +bbb.screenshareView.fitToWindow = +bbb.screenshareView.actualSize = +bbb.screenshareView.minimizeBtn.accessibilityName = +bbb.screenshareView.maximizeRestoreBtn.accessibilityName = +bbb.screenshareView.closeBtn.accessibilityName = +bbb.toolbar.phone.toolTip.start = +bbb.toolbar.phone.toolTip.stop = +bbb.toolbar.phone.toolTip.mute = +bbb.toolbar.phone.toolTip.unmute = +bbb.toolbar.phone.toolTip.nomic = +bbb.toolbar.deskshare.toolTip.start = +bbb.toolbar.deskshare.toolTip.stop = +bbb.toolbar.sharednotes.toolTip = +bbb.toolbar.video.toolTip.start = +bbb.toolbar.video.toolTip.stop = +bbb.layout.addButton.label = +bbb.layout.addButton.toolTip = +bbb.layout.overwriteLayoutName.title = +bbb.layout.overwriteLayoutName.text = +bbb.layout.broadcastButton.toolTip = +bbb.layout.combo.toolTip = +bbb.layout.loadButton.toolTip = +bbb.layout.saveButton.toolTip = +bbb.layout.lockButton.toolTip = +bbb.layout.combo.prompt = +bbb.layout.combo.custom = +bbb.layout.combo.customName = +bbb.layout.combo.remote = +bbb.layout.window.name = +bbb.layout.window.close.tooltip = +bbb.layout.window.close.accessibilityName = +bbb.layout.save.complete = +bbb.layout.save.ioerror = +bbb.layout.load.complete = +bbb.layout.load.failed = +bbb.layout.sync = +bbb.layout.name.defaultlayout = +bbb.layout.name.closedcaption = +bbb.layout.name.videochat = +bbb.layout.name.webcamsfocus = +bbb.layout.name.presentfocus = +bbb.layout.name.presentandusers = +bbb.layout.name.lectureassistant = +bbb.layout.name.lecture = +bbb.layout.name.sharednotes = +bbb.layout.addCurrentToFileWindow.title = +bbb.layout.addCurrentToFileWindow.text = +bbb.layout.denyAddToFile.toolTip = +bbb.layout.confirmAddToFile.toolTip = +bbb.highlighter.toolbar.pencil = +bbb.highlighter.toolbar.pencil.accessibilityName = +bbb.highlighter.toolbar.ellipse = +bbb.highlighter.toolbar.ellipse.accessibilityName = +bbb.highlighter.toolbar.rectangle = +bbb.highlighter.toolbar.rectangle.accessibilityName = +bbb.highlighter.toolbar.panzoom = +bbb.highlighter.toolbar.panzoom.accessibilityName = +bbb.highlighter.toolbar.clear = +bbb.highlighter.toolbar.clear.accessibilityName = +bbb.highlighter.toolbar.undo = +bbb.highlighter.toolbar.undo.accessibilityName = +bbb.highlighter.toolbar.color = +bbb.highlighter.toolbar.color.accessibilityName = +bbb.highlighter.toolbar.thickness = +bbb.highlighter.toolbar.thickness.accessibilityName = +bbb.highlighter.toolbar.multiuser = +bbb.logout.button.label = +bbb.logout.appshutdown = +bbb.logout.asyncerror = +bbb.logout.connectionclosed = +bbb.logout.connectionfailed = +bbb.logout.rejected = +bbb.logout.invalidapp = +bbb.logout.unknown = +bbb.logout.guestkickedout = +bbb.logout.usercommand = +bbb.logour.breakoutRoomClose = +bbb.logout.ejectedFromMeeting = +bbb.logout.refresh.message = +bbb.logout.refresh.label = +bbb.logout.feedback.hint = +bbb.logout.feedback.label = +bbb.settings.title = +bbb.settings.ok = +bbb.settings.cancel = +bbb.settings.btn.toolTip = +bbb.logout.confirm.title = +bbb.logout.confirm.message = +bbb.logout.confirm.endMeeting = +bbb.logout.confirm.yes = +bbb.logout.confirm.no = +bbb.endSession.confirm.title = +bbb.endSession.confirm.message = +bbb.connection.failure= +bbb.connection.reconnecting= +bbb.connection.reestablished= +bbb.connection.bigbluebutton= +bbb.connection.sip= +bbb.connection.video= +bbb.connection.deskshare= +bbb.notes.title = +bbb.notes.cmpColorPicker.toolTip = +bbb.notes.saveBtn = +bbb.notes.saveBtn.toolTip = +bbb.sharedNotes.title = +bbb.sharedNotes.quickLink.label = +bbb.sharedNotes.createNoteWindow.label = +bbb.sharedNotes.createNoteWindow.close.tooltip = +bbb.sharedNotes.createNoteWindow.close.accessibilityName = +bbb.sharedNotes.typing.single = +bbb.sharedNotes.typing.double = +bbb.sharedNotes.typing.multiple = +bbb.sharedNotes.save.toolTip = +bbb.sharedNotes.save.complete = +bbb.sharedNotes.save.ioerror = +bbb.sharedNotes.save.htmlLabel = +bbb.sharedNotes.save.txtLabel = +bbb.sharedNotes.new.label = +bbb.sharedNotes.new.toolTip = +bbb.sharedNotes.limit.label = +bbb.sharedNotes.clear.label = +bbb.sharedNotes.undo.toolTip = +bbb.sharedNotes.redo.toolTip = +bbb.sharedNotes.toolbar.toolTip = +bbb.sharedNotes.settings.toolTip = +bbb.sharedNotes.clearWarning.title = +bbb.sharedNotes.clearWarning.message = +bbb.sharedNotes.additionalNotes.closeWarning.title = +bbb.sharedNotes.additionalNotes.closeWarning.message = +bbb.sharedNotes.messageLengthWarning.title = +bbb.sharedNotes.messageLengthWarning.text = +bbb.sharedNotes.remaining.tooltip = +bbb.sharedNotes.full.tooltip = +bbb.settings.deskshare.instructions = +bbb.settings.deskshare.start = +bbb.settings.voice.volume = +bbb.settings.java.label = +bbb.settings.java.text = +bbb.settings.java.command = +bbb.settings.flash.label = +bbb.settings.flash.text = +bbb.settings.flash.command = +bbb.settings.isight.label = +bbb.settings.isight.text = +bbb.settings.isight.command = +bbb.settings.warning.label = +bbb.settings.warning.close = +bbb.settings.noissues = +bbb.settings.instructions = +bbb.bwmonitor.title = +bbb.bwmonitor.upload = +bbb.bwmonitor.upload.short = +bbb.bwmonitor.download = +bbb.bwmonitor.download.short = +bbb.bwmonitor.total = +bbb.bwmonitor.current = +bbb.bwmonitor.available = +bbb.bwmonitor.latency = +ltbcustom.bbb.highlighter.toolbar.triangle = +ltbcustom.bbb.highlighter.toolbar.triangle.accessibilityName = +ltbcustom.bbb.highlighter.toolbar.line = +ltbcustom.bbb.highlighter.toolbar.line.accessibilityName = +ltbcustom.bbb.highlighter.toolbar.text = +ltbcustom.bbb.highlighter.toolbar.text.accessibilityName = +ltbcustom.bbb.highlighter.texttoolbar.textColorPicker = +ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = +bbb.caption.window.title = +bbb.caption.quickLink.label = +bbb.caption.window.titleBar = +bbb.caption.window.minimizeBtn.accessibilityName = +bbb.caption.window.maximizeRestoreBtn.accessibilityName = +bbb.caption.transcript.noowner = +bbb.caption.transcript.youowner = +bbb.caption.transcript.pastewarning.title = +bbb.caption.transcript.pastewarning.text = +bbb.caption.transcript.inputArea.toolTip = +bbb.caption.transcript.outputArea.toolTip = +bbb.caption.option.label = +bbb.caption.option.language = +bbb.caption.option.language.tooltip = +bbb.caption.option.language.accessibilityName = +bbb.caption.option.takeowner = +bbb.caption.option.takeowner.tooltip = +bbb.caption.option.fontfamily = +bbb.caption.option.fontfamily.tooltip = +bbb.caption.option.fontsize = +bbb.caption.option.fontsize.tooltip = +bbb.caption.option.backcolor = +bbb.caption.option.backcolor.tooltip = +bbb.caption.option.textcolor = +bbb.caption.option.textcolor.tooltip = + + +bbb.accessibility.clientReady = + +bbb.accessibility.chat.chatBox.reachedFirst = +bbb.accessibility.chat.chatBox.reachedLatest = +bbb.accessibility.chat.chatBox.navigatedFirst = +bbb.accessibility.chat.chatBox.navigatedLatest = +bbb.accessibility.chat.chatBox.navigatedLatestRead = +bbb.accessibility.chat.chatwindow.input = +bbb.accessibility.chat.chatwindow.audibleChatNotification = +bbb.accessibility.chat.chatwindow.publicChatOptions = +bbb.accessibility.chat.initialDescription = + +bbb.accessibility.notes.notesview.input = + +bbb.shortcuthelp.title = +bbb.shortcuthelp.titleBar = +bbb.shortcuthelp.minimizeBtn.accessibilityName = +bbb.shortcuthelp.maximizeRestoreBtn.accessibilityName = +bbb.shortcuthelp.closeBtn.accessibilityName = +bbb.shortcuthelp.dropdown.accessibilityName = +bbb.shortcuthelp.dropdown.general = +bbb.shortcuthelp.dropdown.presentation = +bbb.shortcuthelp.dropdown.chat = +bbb.shortcuthelp.dropdown.users = +bbb.shortcuthelp.dropdown.caption = +bbb.shortcuthelp.browserWarning.text = +bbb.shortcuthelp.headers.shortcut = +bbb.shortcuthelp.headers.function = + +bbb.shortcutkey.general.minimize = +bbb.shortcutkey.general.minimize.function = +bbb.shortcutkey.general.maximize = +bbb.shortcutkey.general.maximize.function = + +bbb.shortcutkey.flash.exit = +bbb.shortcutkey.flash.exit.function = +bbb.shortcutkey.users.muteme = +bbb.shortcutkey.users.muteme.function = +bbb.shortcutkey.chat.chatinput = +bbb.shortcutkey.chat.chatinput.function = +bbb.shortcutkey.present.focusslide = +bbb.shortcutkey.present.focusslide.function = +bbb.shortcutkey.whiteboard.undo = +bbb.shortcutkey.whiteboard.undo.function = + +bbb.shortcutkey.focus.users = +bbb.shortcutkey.focus.users.function = +bbb.shortcutkey.focus.video = +bbb.shortcutkey.focus.video.function = +bbb.shortcutkey.focus.presentation = +bbb.shortcutkey.focus.presentation.function = +bbb.shortcutkey.focus.chat = +bbb.shortcutkey.focus.chat.function = +bbb.shortcutkey.focus.caption = +bbb.shortcutkey.focus.caption.function = + +bbb.shortcutkey.share.desktop = +bbb.shortcutkey.share.desktop.function = +bbb.shortcutkey.share.webcam = +bbb.shortcutkey.share.webcam.function = + +bbb.shortcutkey.shortcutWindow = +bbb.shortcutkey.shortcutWindow.function = +bbb.shortcutkey.logout = +bbb.shortcutkey.logout.function = +bbb.shortcutkey.raiseHand = +bbb.shortcutkey.raiseHand.function = + +bbb.shortcutkey.present.upload = +bbb.shortcutkey.present.upload.function = +bbb.shortcutkey.present.previous = +bbb.shortcutkey.present.previous.function = +bbb.shortcutkey.present.select = +bbb.shortcutkey.present.select.function = +bbb.shortcutkey.present.next = +bbb.shortcutkey.present.next.function = +bbb.shortcutkey.present.fitWidth = +bbb.shortcutkey.present.fitWidth.function = +bbb.shortcutkey.present.fitPage = +bbb.shortcutkey.present.fitPage.function = + +bbb.shortcutkey.users.makePresenter = +bbb.shortcutkey.users.makePresenter.function = +bbb.shortcutkey.users.kick = +bbb.shortcutkey.users.kick.function = +bbb.shortcutkey.users.mute = +bbb.shortcutkey.users.mute.function = +bbb.shortcutkey.users.muteall = +bbb.shortcutkey.users.muteall.function = +bbb.shortcutkey.users.muteAllButPres = +bbb.shortcutkey.users.muteAllButPres.function = +bbb.shortcutkey.users.breakoutRooms = +bbb.shortcutkey.users.breakoutRooms.function = +bbb.shortcutkey.users.focusBreakoutRooms = +bbb.shortcutkey.users.focusBreakoutRooms.function = +bbb.shortcutkey.users.listenToBreakoutRoom = +bbb.shortcutkey.users.listenToBreakoutRoom.function = +bbb.shortcutkey.users.joinBreakoutRoom = +bbb.shortcutkey.users.joinBreakoutRoom.function = + +bbb.shortcutkey.chat.focusTabs = +bbb.shortcutkey.chat.focusTabs.function = +bbb.shortcutkey.chat.focusBox = +bbb.shortcutkey.chat.focusBox.function = +bbb.shortcutkey.chat.changeColour = +bbb.shortcutkey.chat.changeColour.function = +bbb.shortcutkey.chat.sendMessage = +bbb.shortcutkey.chat.sendMessage.function = +bbb.shortcutkey.chat.closePrivate = +bbb.shortcutkey.chat.closePrivate.function = +bbb.shortcutkey.chat.explanation = +bbb.shortcutkey.chat.explanation.function = + +bbb.shortcutkey.chat.chatbox.advance = +bbb.shortcutkey.chat.chatbox.advance.function = +bbb.shortcutkey.chat.chatbox.goback = +bbb.shortcutkey.chat.chatbox.goback.function = +bbb.shortcutkey.chat.chatbox.repeat = +bbb.shortcutkey.chat.chatbox.repeat.function = +bbb.shortcutkey.chat.chatbox.golatest = +bbb.shortcutkey.chat.chatbox.golatest.function = +bbb.shortcutkey.chat.chatbox.gofirst = +bbb.shortcutkey.chat.chatbox.gofirst.function = +bbb.shortcutkey.chat.chatbox.goread = +bbb.shortcutkey.chat.chatbox.goread.function = +bbb.shortcutkey.chat.chatbox.debug = +bbb.shortcutkey.chat.chatbox.debug.function = + +bbb.shortcutkey.caption.takeOwnership = +bbb.shortcutkey.caption.takeOwnership.function = + +bbb.polling.startButton.tooltip = +bbb.polling.startButton.label = +bbb.polling.publishButton.label = +bbb.polling.closeButton.label = +bbb.polling.customPollOption.label = +bbb.polling.pollModal.title = +bbb.polling.pollModal.hint = +bbb.polling.customChoices.title = +bbb.polling.respondersLabel.novotes = +bbb.polling.respondersLabel.text = +bbb.polling.respondersLabel.finished = +bbb.polling.answer.Yes = +bbb.polling.answer.No = +bbb.polling.answer.True = +bbb.polling.answer.False = +bbb.polling.answer.A = +bbb.polling.answer.B = +bbb.polling.answer.C = +bbb.polling.answer.D = +bbb.polling.answer.E = +bbb.polling.answer.F = +bbb.polling.answer.G = +bbb.polling.results.accessible.header = +bbb.polling.results.accessible.answer = + +bbb.publishVideo.startPublishBtn.labelText = +bbb.publishVideo.changeCameraBtn.labelText = + +bbb.accessibility.alerts.madePresenter = +bbb.accessibility.alerts.madeViewer = + +bbb.shortcutkey.specialKeys.space = +bbb.shortcutkey.specialKeys.left = +bbb.shortcutkey.specialKeys.right = +bbb.shortcutkey.specialKeys.up = +bbb.shortcutkey.specialKeys.down = +bbb.shortcutkey.specialKeys.plus = +bbb.shortcutkey.specialKeys.minus = + +bbb.toolbar.videodock.toolTip.closeAllVideos = +bbb.users.settings.lockAll = +bbb.users.settings.lockAllExcept = +bbb.users.settings.lockSettings = +bbb.users.settings.breakoutRooms = +bbb.users.settings.sendBreakoutRoomsInvitations = +bbb.users.settings.unlockAll = +bbb.users.settings.roomIsLocked = +bbb.users.settings.roomIsMuted = + +bbb.lockSettings.save = +bbb.lockSettings.save.tooltip = +bbb.lockSettings.cancel = +bbb.lockSettings.cancel.toolTip = + +bbb.lockSettings.hint = +bbb.lockSettings.moderatorLocking = +bbb.lockSettings.privateChat = +bbb.lockSettings.publicChat = +bbb.lockSettings.webcam = +bbb.lockSettings.webcamsOnlyForModerator = +bbb.lockSettings.microphone = +bbb.lockSettings.layout = +bbb.lockSettings.title= +bbb.lockSettings.feature= +bbb.lockSettings.locked= +bbb.lockSettings.lockOnJoin= + +bbb.users.breakout.breakoutRooms = +bbb.users.breakout.updateBreakoutRooms = +bbb.users.breakout.timerForRoom.toolTip = +bbb.users.breakout.timer.toolTip = +bbb.users.breakout.calculatingRemainingTime = +bbb.users.breakout.closing = +bbb.users.breakout.closewarning.text = +bbb.users.breakout.rooms = +bbb.users.breakout.roomsCombo.accessibilityName = +bbb.users.breakout.room = +bbb.users.breakout.timeLimit = +bbb.users.breakout.durationStepper.accessibilityName = +bbb.users.breakout.minutes = +bbb.users.breakout.record = +bbb.users.breakout.recordCheckbox.accessibilityName = +bbb.users.breakout.notAssigned = +bbb.users.breakout.dragAndDropToolTip = +bbb.users.breakout.start = +bbb.users.breakout.invite = +bbb.users.breakout.close = +bbb.users.breakout.closeAllRooms = +bbb.users.breakout.insufficientUsers = +bbb.users.breakout.confirm = +bbb.users.breakout.invited = +bbb.users.breakout.accept = +bbb.users.breakout.joinSession = +bbb.users.breakout.joinSession.accessibilityName = +bbb.users.breakout.joinSession.close.tooltip = +bbb.users.breakout.joinSession.close.accessibilityName = +bbb.users.breakout.youareinroom = +bbb.users.roomsGrid.room = +bbb.users.roomsGrid.users = +bbb.users.roomsGrid.action = +bbb.users.roomsGrid.transfer = +bbb.users.roomsGrid.join = +bbb.users.roomsGrid.noUsers = + +bbb.langSelector.default= + +bbb.alert.cancel = +bbb.alert.ok = +bbb.alert.no = +bbb.alert.yes = diff --git a/bigbluebutton-client/locale/hu_HU/bbbResources.properties b/bigbluebutton-client/locale/hu_HU/bbbResources.properties index 76252cf73498824b79f22999d6f6aed04408f739..3be12b93db558bfe7740ca527e2704e444ba4a14 100644 --- a/bigbluebutton-client/locale/hu_HU/bbbResources.properties +++ b/bigbluebutton-client/locale/hu_HU/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Csatlakozás a szerverhez bbb.mainshell.statusProgress.loading = Töltés bbb.mainshell.statusProgress.cannotConnectServer = Sajnos nem sikerült csatlakozni a szerverhez. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = (c) 2018 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) bbb.mainshell.logBtn.toolTip = Naplózási ablak megnyitása bbb.mainshell.meetingNotFound = ElÅ‘adás nem található bbb.mainshell.invalidAuthToken = Érvénytelen hitelesÃtési token @@ -140,7 +140,7 @@ bbb.clientstatus.title = ÉrtesÃtési beállÃtások bbb.clientstatus.notification = Olvasatlan értesÃtések bbb.clientstatus.close = Bezárás bbb.clientstatus.tunneling.title = Tűzfal -bbb.clientstatus.tunneling.message = Jelenleg fűzfal akadályozza, hogy kliense közvetlenül az 1935-ös porton csatlakozzon a szerverhez. Javasoljuk, hogy stabilabb kapcsolat érdekében kevésbé korlátozott hálózatról csatlakozzon. +bbb.clientstatus.tunneling.message = A tűzfal megakadályozza kliense közvetlenül kapcsolódását a távoli szerverhez. Hogy kapcsolata stabilabb legyen, csatlakozzon egy kevésbé szigorú hálózatból. bbb.clientstatus.browser.title = BöngészÅ‘jének verziója bbb.clientstatus.browser.message = BöngészÅ‘je ({0}) nem naprakész. Javasoljuk, hogy frissÃtsen a legújabb verzióra. bbb.clientstatus.flash.title = Flash Player @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = Közzététel bbb.polling.closeButton.label = Bezárás bbb.polling.customPollOption.label = Egyéni szavazás... bbb.polling.pollModal.title = Szavazás jelenlegi állása -bbb.polling.pollModal.hint = Hagyja nyitva ezt az ablakot, hogy a résztvevÅ‘k leadhassák szavazatukat. A szavazás befejezéséhez válassza a Közzététel vagy a Bezárás gombot. +bbb.polling.pollModal.hint = Hagyja nyitva ezt az ablakot, hogy a többiek leadhassák szavazatukat. A Közzététel vagy a Bezárás gombbal véget vet a szavazásnak. bbb.polling.customChoices.title = Adja meg a szavazási lehetÅ‘ségeket bbb.polling.respondersLabel.novotes = Válaszokra várakozás bbb.polling.respondersLabel.text = {0} felhasználó válaszolt @@ -818,7 +818,7 @@ bbb.lockSettings.moderatorLocking = Moderátor zárolása bbb.lockSettings.privateChat = Privát üzenetek bbb.lockSettings.publicChat = Nyilvános üzenetek bbb.lockSettings.webcam = Webkamera -bbb.lockSettings.webcamsOnlyForModerator = Többiek webkamerájának elrejtése +bbb.lockSettings.webcamsOnlyForModerator = Többiek webkamerájának megtekintése bbb.lockSettings.microphone = Mikrofon bbb.lockSettings.layout = Elrendezés bbb.lockSettings.title=RésztvevÅ‘k zárolása diff --git a/bigbluebutton-client/locale/id_ID/bbbResources.properties b/bigbluebutton-client/locale/id_ID/bbbResources.properties index b802c5ba4a88035b63a2f221924c3126c95c495b..879826cf6cc865eec30aec686efdd5b04b550d11 100644 --- a/bigbluebutton-client/locale/id_ID/bbbResources.properties +++ b/bigbluebutton-client/locale/id_ID/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Sedang menghubungi server bbb.mainshell.statusProgress.loading = bbb.mainshell.statusProgress.cannotConnectServer = Maaf, tidak dapat terhubung ke server. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = Buka Jendela Log bbb.mainshell.meetingNotFound = Pertemuan Tidak Ditemukan bbb.mainshell.invalidAuthToken = Token Otentikasi Tidak Valid @@ -140,7 +140,7 @@ bbb.clientstatus.title = Konfigurasi Notifikasi bbb.clientstatus.notification = Notifikasi Belum Dibaca bbb.clientstatus.close = Tutup bbb.clientstatus.tunneling.title = Firewall -bbb.clientstatus.tunneling.message = Firewall menghalangi klien Anda terhubung secara langsung ke port 1935 pada server remote. Kami merekomendasikan untuk menggunakan jaringan komputer yang pengaturannya tidak terlalu ketat untuk koneksi yang lebih stabil +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Versi Peramban bbb.clientstatus.browser.message = Peramban Anda ({0}) tidak up-to-date. Kami merekomendasikan untuk memperbaharui ke versi terakhir. bbb.clientstatus.flash.title = Player Flash diff --git a/bigbluebutton-client/locale/it_IT/bbbResources.properties b/bigbluebutton-client/locale/it_IT/bbbResources.properties index 6442584db7611973c4336da7098842edcb49c5c3..aa2662576aeecc92acec0d56f045f94754bc7007 100644 --- a/bigbluebutton-client/locale/it_IT/bbbResources.properties +++ b/bigbluebutton-client/locale/it_IT/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Connessione alla conferenza in corso... bbb.mainshell.statusProgress.loading = Caricamento in corso bbb.mainshell.statusProgress.cannotConnectServer = Errore di connessione. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = (c) 2018 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) bbb.mainshell.logBtn.toolTip = Apri finestra di Log bbb.mainshell.meetingNotFound = Conferenza non trovata bbb.mainshell.invalidAuthToken = Codice di autenticazione non valido @@ -140,7 +140,7 @@ bbb.clientstatus.title = Configurazione notifiche bbb.clientstatus.notification = Notifiche non lette bbb.clientstatus.close = Chiudi bbb.clientstatus.tunneling.title = Firewall -bbb.clientstatus.tunneling.message = Un firewall impedisce al vostro terminale di connettersi direttamente sulla porta 1935 del server remoto. Si consiglia di utilizzare una rete senza restrizioni, per una connessione più stabile. +bbb.clientstatus.tunneling.message = Un firewall impedisce al client di connettersi direttamente al server remoto. Si consiglia utilizzare una rete meno restrittiva per una connessione più stabile bbb.clientstatus.browser.title = Versione del browser bbb.clientstatus.browser.message = Il tuo browser ({0}) non è aggiornato. Si raccomanda l'aggiornamento alla versione più recente. bbb.clientstatus.flash.title = Flash Player @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = Pubblica la valutazione bbb.polling.closeButton.label = Chiudi la valutazione bbb.polling.customPollOption.label = Impostazioni personalizzate della valutazione bbb.polling.pollModal.title = Risultati della valutazione in tempo reale -bbb.polling.pollModal.hint = Lasciare questa finestra aperta per consentire ai partecipanti di rispondere al sondaggio. La selezione del pulsante Pubblica o Chiudi chiude il sondaggio. +bbb.polling.pollModal.hint = Lascia questa finestra aperta per consentire ad altri di rispondere al sondaggio. Con il pulsante Pubblica o Chiudi si concluderà il sondaggio. bbb.polling.customChoices.title = Inserisci le valutazioni bbb.polling.respondersLabel.novotes = In attesa delle risposte bbb.polling.respondersLabel.text = {0} Risposte degli utenti @@ -813,12 +813,12 @@ bbb.lockSettings.save.tooltip = Applica il blocco delle impostazioni. bbb.lockSettings.cancel = Cancella bbb.lockSettings.cancel.toolTip = Chiudi la finestra senza salvare -bbb.lockSettings.hint = +bbb.lockSettings.hint = Queste opzioni ti consentono di limitare alcune funzioni disponibili ai partecipanti, ad esempio escludendo la possibilità di utilizzare la chat privata. (Queste restrizioni non si applicano ai moderatori) bbb.lockSettings.moderatorLocking = Moderatore bloccato bbb.lockSettings.privateChat = Chat privata bbb.lockSettings.publicChat = Chat pubblica bbb.lockSettings.webcam = Videocamera -bbb.lockSettings.webcamsOnlyForModerator = +bbb.lockSettings.webcamsOnlyForModerator = Guarda le webcam degli altri partecipanti. bbb.lockSettings.microphone = Microfono bbb.lockSettings.layout = Layout bbb.lockSettings.title=Blocca le impostazioni dei partecipanti diff --git a/bigbluebutton-client/locale/ja_JP/bbbResources.properties b/bigbluebutton-client/locale/ja_JP/bbbResources.properties index f20361cc0f5b403cbf2c093e73e7004eff2194e3..ffe45701e70b986529156e7719713f1e296431e3 100644 --- a/bigbluebutton-client/locale/ja_JP/bbbResources.properties +++ b/bigbluebutton-client/locale/ja_JP/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = サーãƒã¸ã®æŽ¥ç¶š bbb.mainshell.statusProgress.loading = bbb.mainshell.statusProgress.cannotConnectServer = サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。 -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = ãƒã‚°ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‹ã bbb.mainshell.meetingNotFound = 会è°ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ bbb.mainshell.invalidAuthToken = 無効ãªèªè¨¼ãƒˆãƒ¼ã‚¯ãƒ³ @@ -140,7 +140,7 @@ bbb.clientstatus.title = 通知è¨å®š bbb.clientstatus.notification = 未èªã®é€šçŸ¥ bbb.clientstatus.close = é–‰ã˜ã‚‹ bbb.clientstatus.tunneling.title = ファイヤーウォール -bbb.clientstatus.tunneling.message = ファイヤーウォールãŒãƒªãƒ¢ãƒ¼ãƒˆã‚µãƒ¼ãƒãƒ¼ã¸ã®è²´æ–¹ã®ãƒãƒ¼ãƒˆ1935ã¸ã®æŽ¥ç¶šã‚’除外ã—ãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚より安定ã—ãŸãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§ã®å†æŽ¥ç¶šã‚’検討ã—ã¦ãã ã•ã„ +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = ブラウザーãƒãƒ¼ã‚¸ãƒ§ãƒ³ bbb.clientstatus.browser.message = ã‚ãªãŸã®ãƒ–ラウザー ({0}) ã¯æ—§ç‰ˆã§ã™ã€‚æœ€æ–°ç‰ˆã¸æ›´æ–°ã—ã¦ãã ã•ã„ bbb.clientstatus.flash.title = Flash Player diff --git a/bigbluebutton-client/locale/ka_GE/bbbResources.properties b/bigbluebutton-client/locale/ka_GE/bbbResources.properties index 7c3a893401b136cf5ba46cd3acd980df8456831f..d28e3a9dfdd8b2afeb8eddc248d2b9ef8c7b7575 100644 --- a/bigbluebutton-client/locale/ka_GE/bbbResources.properties +++ b/bigbluebutton-client/locale/ka_GE/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = სერვერთáƒáƒœ დáƒáƒ™áƒáƒ•შირებრbbb.mainshell.statusProgress.loading = დáƒáƒšáƒáƒ“ებრbbb.mainshell.statusProgress.cannotConnectServer = უკáƒáƒªáƒ áƒáƒ•áƒáƒ“, ჩვენ ვერვუკáƒáƒ•შირდებით სერვერს -bbb.mainshell.copyrightLabel2 = (c) 2017<a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a>(build {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = გáƒáƒ®áƒ¡áƒ”ნი Log ფáƒáƒœáƒ¯áƒáƒ რbbb.mainshell.meetingNotFound = bbb.mainshell.invalidAuthToken = diff --git a/bigbluebutton-client/locale/km_KH/bbbResources.properties b/bigbluebutton-client/locale/km_KH/bbbResources.properties index bd3bd602f38b63619a11462ad5d16500cd7dbe69..e9037ebf1bf52e45fcd2a2270128a8498149d622 100644 --- a/bigbluebutton-client/locale/km_KH/bbbResources.properties +++ b/bigbluebutton-client/locale/km_KH/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = កំពុង​ភ្ជាប់​ទៅ​ម៉ាស៊ីន​បម្រើ "Server" bbb.mainshell.statusProgress.loading = កំពុងដំណើរការ bbb.mainshell.statusProgress.cannotConnectServer = សូមអភáŸáž™áž‘ោស! យើង​មិន​អាច​ភ្ជាប់​ទៅ​កាន់​ម៉ាស៊ីន​បម្រើ​បាន​ទáŸáŸ” -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a>(build {0}) +bbb.mainshell.copyrightLabel2 = (c) 2018 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc. </u></a>​ (កំណែ {0}) bbb.mainshell.logBtn.toolTip = បើកផ្ទាំងចូល bbb.mainshell.meetingNotFound = រកមិនឃើញ​ការប្រជុំទ០bbb.mainshell.invalidAuthToken = Authentication Token មិនážáŸ’រឹមážáŸ’រូវ @@ -66,7 +66,7 @@ bbb.micSettings.webrtc.waitingforice = កំពុង​ភ្ជាប់​ bbb.micSettings.webrtc.transferring = កំពុង​បញ្ជូន bbb.micSettings.webrtc.endingecho = កំពុងភ្ជាប់សម្លáŸáž„ bbb.micSettings.webrtc.endedecho = ការសាកល្បងអáŸáž€áž¼áž”ានបញ្ចប់។ -bbb.micPermissions.message.browserhttp = +bbb.micPermissions.message.browserhttp = ម៉ាស៊ីនបម្រើ​នáŸáŸ‡áž˜áž·áž“ážáŸ’រូវបានážáŸ†áž¡áž¾áž„ជាមួយ SSL áž‘áŸáŸ” ជាលទ្ធផល {0} បិទការចែករំលែកមីក្រូហ្វូនរបស់អ្នក។ bbb.micPermissions.firefox.title = សិទ្ធិប្រើម៉ីក្រូហ្វូនក្នុង Firefox bbb.micPermissions.firefox.message = ចុច Allow ដើម្បីឲ្យ Firefox អាចប្រើម៉ីក្រូហ្វូនរបស់អ្នក bbb.micPermissions.chrome.title = សិទ្ធិប្រើម៉ីក្រូហ្វូនក្នុង Chrome @@ -140,7 +140,7 @@ bbb.clientstatus.title = ដំណឹង​អំពីការកំណážáŸ‹ bbb.clientstatus.notification = ដំណឹងដែលមិនទាន់​បានអាន bbb.clientstatus.close = បិទ bbb.clientstatus.tunneling.title = របាំងរារាំង -bbb.clientstatus.tunneling.message = របាំងរារាំងកំពុងទប់ស្កាážáŸ‹áž˜áŸ‰áž¶ážŸáŸŠáž¸áž“មáŸáž˜áž·áž“ឲ្យភ្ជាប់ដោយ​ផ្ទាល់ážáž¶áž˜ port 1935 ជាមួយ​ម៉ាស៊ីនបម្រើ​ពីចម្ងាយ។ សូមចូលរូមដោយប្រើបណ្ážáž¶áž‰ážŠáŸ‚លមិនសូវមានកំហិážážáŸ’លាំងដើម្បីការភ្ជាប់ážáŸážšáŸ” +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = ជំនាន់របស់កម្មវិធីរុករក bbb.clientstatus.browser.message = កម្មវិធីរុករក​របស់​អ្នក​ ({0}) មិនទាន់​សមáŸáž™áž‘áŸâ€‹. សូមធ្វើបច្ចុប្បន្នភាពទៅកាន់ជំនាន់ážáŸ’មី។ bbb.clientstatus.flash.title = កម្មវិធីបើក Flash @@ -215,7 +215,7 @@ bbb.users.usersGrid.mediaItemRenderer.pushToTalk = ឈប់បិទសម្ bbb.users.usersGrid.mediaItemRenderer.pushToMute = បិទសម្លáŸáž„{0} bbb.users.usersGrid.mediaItemRenderer.pushToLock = ចាក់សោរ{0}​ bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = បើកសោរ{0} -bbb.users.usersGrid.mediaItemRenderer.kickUser = +bbb.users.usersGrid.mediaItemRenderer.kickUser = ដកចáŸáž‰ {0} bbb.users.usersGrid.mediaItemRenderer.webcam = កំពុងចែករំលែកវáŸáž”ážáŸáž˜ bbb.users.usersGrid.mediaItemRenderer.micOff = មីក្រូហ្វូនបិទ bbb.users.usersGrid.mediaItemRenderer.micOn = មីក្រូហ្វូន​បើក @@ -512,11 +512,11 @@ bbb.logout.unknown = ម៉ាស៊ីនភ្ញៀវ​របស់អ្ bbb.logout.guestkickedout = អ្នកសម្របសម្រួល​មិន​អនុញ្ញាážâ€‹áž²áŸ’យ​អ្នក​ចូល​រួម​ការប្រជុំ​នáŸáŸ‡áž‘áŸâ€‹ bbb.logout.usercommand = អ្នកបានចáŸáž‰áž–ីសន្និសិទ bbb.logour.breakoutRoomClose = ផ្ទាំង​នៃ​កម្មវិធីរុករក​របស់អ្នក​នឹង​ážáŸ’រូវ​បិទ​ -bbb.logout.ejectedFromMeeting = +bbb.logout.ejectedFromMeeting = អ្នកážáŸ’រូវបានដកចáŸáž‰áž–ីការប្រជុំ។ bbb.logout.refresh.message = ប្រសិន​បើ​អ្នក​មិន​បាន​រំពឹង​ការ​ចាក​ចáŸáž‰â€‹áž“áŸáŸ‡â€‹áž‘០សូម​ចុច​ប៊ូážáž»áž„​ážáž¶áž„​ក្រោម​ដើម្បី​ភ្ជាប់​​ម្ážáž„​ទៀážáŸ” bbb.logout.refresh.label = ភ្ជាប់​ម្ážáž„​ទៀហ-bbb.logout.feedback.hint = -bbb.logout.feedback.label = +bbb.logout.feedback.hint = ážáž¾áž™áž¾áž„អាចធ្វើឱ្យ BigBlueButton ប្រសើរជាងមុនយ៉ាងដូចម្ážáŸáž…? +bbb.logout.feedback.label = យើងចង់ដឹងពីបទពិសោធនáŸážšáž”ស់អ្នកជាមួយនឹង BigBlueButton (ស្រáŸáž…áž…áž·ážáŸ’áž) bbb.settings.title = ការកំណážáŸ‹ bbb.settings.ok = ព្រម bbb.settings.cancel = បោះបង់ @@ -712,7 +712,7 @@ bbb.shortcutkey.present.fitPage.function = ដាក់ស្លាយឲ្យ bbb.shortcutkey.users.makePresenter = 89 bbb.shortcutkey.users.makePresenter.function = ឲ្យអ្នកដែលបានជ្រើសធ្វើ​ជាអ្នកធ្វើបទបង្ហាញ bbb.shortcutkey.users.kick = 69 -bbb.shortcutkey.users.kick.function = +bbb.shortcutkey.users.kick.function = ដកអ្នកដែលážáŸ’រូវបានជ្រើសចáŸáž‰áž–ីការប្រជុំ bbb.shortcutkey.users.mute = 83 bbb.shortcutkey.users.mute.function = បិទសម្លáŸáž„ ឬមិនបិទសម្លáŸáž„អ្នកប្រើដែលបានជ្រើស bbb.shortcutkey.users.muteall = 65 @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = ដាក់ប្រកាស bbb.polling.closeButton.label = បិទ bbb.polling.customPollOption.label = ការស្ទង់​មážáž·â€‹ážáž¶áž˜áž…áž·ážáŸ’áž... bbb.polling.pollModal.title = លទ្ធផល​ស្ទង់​មážáž·â€‹â€‹áž•្ទាល់​ -bbb.polling.pollModal.hint = ទុកឱ្យ​ផ្ទាំង​នáŸáŸ‡áž”ើកដូច្នáŸáŸ‡ ដើម្បីឱ្យសិស្សឆ្លើយážáž”ទៅនឹងការស្ទង់មážáž·áŸ” ចុចលើប៊ូážáž»áž„ ដាក់ប្រកាស ឬ បិទ ដើម្បីបញ្ចប់ការបោះឆ្នោážáŸ” +bbb.polling.pollModal.hint = ទុក​ផ្ទាំង​នáŸáŸ‡â€‹áž²áŸ’យនៅបើកដើម្បីឲ្យអ្នកដទៃឆ្លើយការស្ទង់មážáž·áŸ” ជ្រើសប៊ូážáž»áž„ "ដាក់ប្រកាស" ឬ "បិទ" នឹងបញ្ចប់ការស្ទង់មážáž·áŸ” bbb.polling.customChoices.title = បញ្ចូលជម្រើសសម្រាប់ស្ទង់​មážáž·â€‹ bbb.polling.respondersLabel.novotes = រង់ចាំចម្លើយ bbb.polling.respondersLabel.text = {0} នាក់បានឆ្លើយ @@ -813,12 +813,12 @@ bbb.lockSettings.save.tooltip = អនុវážáŸ’ážâ€‹â€‹áž€áž¶ážšáž€áŸ†ážŽáž bbb.lockSettings.cancel = បោះបង់ bbb.lockSettings.cancel.toolTip = បិទ​ផ្ទាំង​នáŸáŸ‡â€‹ážŠáŸ„យមិន​រក្សា​ទុក​ -bbb.lockSettings.hint = +bbb.lockSettings.hint = ជម្រើសទាំងនáŸáŸ‡áž¢áž“ុញ្ញាážáž±áŸ’យអ្នកដាក់កម្រិážáž›áž¾áž˜áž»ážáž„ារមួយចំនួនដែលអ្នកមើលអាចប្រើបានដូចជាការដកលទ្ធភាពរបស់ពួកគáŸáž€áŸ’នុងការប្រើការជជែកឯកជន។ (ការដាក់កម្រិážáž‘ាំងនáŸáŸ‡áž˜áž·áž“អនុវážáŸ’ážáž…ំពោះអ្នកសម្របសម្រួលទáŸ) bbb.lockSettings.moderatorLocking = ការចាក់សោ​អ្នកសម្របសម្រួល bbb.lockSettings.privateChat = ជជែកឯកជន bbb.lockSettings.publicChat = ជជែកសាធារណៈ bbb.lockSettings.webcam = ážœáŸáž”ážáŸáž˜ -bbb.lockSettings.webcamsOnlyForModerator = +bbb.lockSettings.webcamsOnlyForModerator = មើលវáŸáž”ážáŸ‚មរបស់អ្នកមើលដទៃទៀហbbb.lockSettings.microphone = មីក្រូហ្វូន bbb.lockSettings.layout = ប្លង់ bbb.lockSettings.title=ចាក់សោអ្នកមើល @@ -832,7 +832,7 @@ bbb.users.breakout.timerForRoom.toolTip = áž–áŸáž›ážœáŸáž›áž¶â€‹áž“ៅសល bbb.users.breakout.timer.toolTip = áž–áŸáž›ážœáŸáž›áž¶â€‹áž“ៅសល់សម្រាប់​​បន្ទប់​បំបែក​ bbb.users.breakout.calculatingRemainingTime = កំពុងគណនា​ពáŸáž›ážœáŸáž›áž¶â€‹áž“ៅសល់... bbb.users.breakout.closing = កំពុងបិទ -bbb.users.breakout.closewarning.text = +bbb.users.breakout.closewarning.text = បន្ទប់​​បំបែក​​នឹងážáŸ’រូវបានបិទក្នុងពáŸáž›áž”ន្ážáž·áž…ទៀážáŸ” bbb.users.breakout.rooms = បន្ទប់ bbb.users.breakout.roomsCombo.accessibilityName = ចំនួនបន្ទប់ážáŸ’រូវ​បង្កើážâ€‹ bbb.users.breakout.room = បន្ទប់ diff --git a/bigbluebutton-client/locale/lv_LV/bbbResources.properties b/bigbluebutton-client/locale/lv_LV/bbbResources.properties index 070037d9c2ad0ab1a9c61a4c180534ccabb107b8..136f607db7dc6d8479e5db476d39f5c5ae89369f 100644 --- a/bigbluebutton-client/locale/lv_LV/bbbResources.properties +++ b/bigbluebutton-client/locale/lv_LV/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Pievienojas serverim bbb.mainshell.statusProgress.loading = bbb.mainshell.statusProgress.cannotConnectServer = Atvainojiet, pieslÄ“gties serverim neizdevÄs. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = AtvÄ“rt logus bbb.mainshell.meetingNotFound = TikÅ¡anÄs netika atrasta bbb.mainshell.invalidAuthToken = Nepareiza autorizÄcijas atslÄ“ga @@ -140,7 +140,7 @@ bbb.clientstatus.title = KonfigurÄcijas notifikÄcijas bbb.clientstatus.notification = NelasÄ«tÄs notifikÄcijas bbb.clientstatus.close = AizvÄ“rt bbb.clientstatus.tunneling.title = UgunsmÅ«ris -bbb.clientstatus.tunneling.message = UgunsmÅ«ris neļauj jÅ«su klientam pievienoties izmantojot tieÅ¡o portu 1935. IesakÄm nomainÄ«t tÄ«kla pieslÄ“gumu, lai iegÅ«tu stabilÄku savienojumu. +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = PÄrlÅ«ka versija bbb.clientstatus.browser.message = Tavs pÄrlÅ«ks ({0}) nav atjaunots. IesakÄm atjaunot uz jaunÄko versiju. bbb.clientstatus.flash.title = Flash atskaņotÄjs diff --git a/bigbluebutton-client/locale/mk_MK/bbbResources.properties b/bigbluebutton-client/locale/mk_MK/bbbResources.properties index 6b9fb20ddf3ccda3165c15298cca3d61c8d1721f..d3327700d0b96ffe5a2990156aaebb2f859ea408 100644 --- a/bigbluebutton-client/locale/mk_MK/bbbResources.properties +++ b/bigbluebutton-client/locale/mk_MK/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = КонфигурациÑко извеÑтување bbb.clientstatus.notification = Ðепрочитани извеÑтувања bbb.clientstatus.close = bbb.clientstatus.tunneling.title = Firewall -bbb.clientstatus.tunneling.message = Firewall Ñпречува вашиот клиент директно да Ñе поврзи на порта 1935 до далечинÑкиот Ñервер. Препорачано е приклучување на помала реÑтриктивна мрежа за поÑтабилна конекција. +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Верзија на пребарувач bbb.clientstatus.browser.message = Вашиот пребарувач ({0}) не е актуелен. Препорачано е ажурирање до најновата верзија. bbb.clientstatus.flash.title = Flash Player diff --git a/bigbluebutton-client/locale/mn_MN/bbbResources.properties b/bigbluebutton-client/locale/mn_MN/bbbResources.properties index 4b379a7b763eb609ea6e32f6b89631fc47a0324b..a7aede6921cd7676083dde857207ffc8f1b2d602 100644 --- a/bigbluebutton-client/locale/mn_MN/bbbResources.properties +++ b/bigbluebutton-client/locale/mn_MN/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = МÑдÑгдлүүдийн тохиргоо bbb.clientstatus.notification = Уншаагүй мÑдÑгдÑл bbb.clientstatus.close = bbb.clientstatus.tunneling.title = Галт хана -bbb.clientstatus.tunneling.message = Галт хана Ñервер лүү холбогдох 1935 портыг хааж байна. Галт ханы тохиргоог Ñнзлах ÑÑвÑл Ó©Ó©Ñ€ ÑүлжÑÑнÑÑÑ Ñ…Ð¾Ð»Ð±Ð¾Ð³Ð´Ð¾Ð¶ үзÑхийг Ñанал болгож байна +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Ð’Ñб хөтөчийн хувилбар bbb.clientstatus.browser.message = Таны вÑб хөтөч ({0}) шинÑчлÑгдÑÑгүй байна. Сүүлийн хувилбарыг татахыг Ñанал болгож байна. bbb.clientstatus.flash.title = Flash Player diff --git a/bigbluebutton-client/locale/ms_MY/bbbResources.properties b/bigbluebutton-client/locale/ms_MY/bbbResources.properties index 056c11a98443f36edb32c7bd540521738e319953..3feb2bcef2ce745aff3a5655c7eb9155382527b1 100644 --- a/bigbluebutton-client/locale/ms_MY/bbbResources.properties +++ b/bigbluebutton-client/locale/ms_MY/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Penyambungan kepada server bbb.mainshell.statusProgress.loading = bbb.mainshell.statusProgress.cannotConnectServer = Maaf, server tidak dapat disambungkan. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = Buka Log Window bbb.mainshell.meetingNotFound = perkumpulan tidak ditemui bbb.mainshell.invalidAuthToken = Pengesahan Token Tidak sah diff --git a/bigbluebutton-client/locale/nl_NL/bbbResources.properties b/bigbluebutton-client/locale/nl_NL/bbbResources.properties index 0d3428a4b503293663906c565fa375d945367292..8b255ba3e0b352bc897593b953bd79c2f4fdae25 100644 --- a/bigbluebutton-client/locale/nl_NL/bbbResources.properties +++ b/bigbluebutton-client/locale/nl_NL/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = Configuratie berichten bbb.clientstatus.notification = Ongelezen berichten bbb.clientstatus.close = bbb.clientstatus.tunneling.title = Firewall -bbb.clientstatus.tunneling.message = Een firewall zorgt ervoor dat je client geen verbinding kan maken met de externe server op poort 1935. We adviseren een minder afgescherm netwerk voor een stabielere verbinding +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Internet browser versie bbb.clientstatus.browser.message = Je Internet browser ({0}) is niet up to date. We adviseren om hiervan de laatste versie te gebruiken. bbb.clientstatus.flash.title = Flash Player diff --git a/bigbluebutton-client/locale/oc/bbbResources.properties b/bigbluebutton-client/locale/oc/bbbResources.properties index d20c2b4b9b6bae8a4935eb5974255219a14f0b62..734b6e55fd3875a5df756d600228d91088e5fb32 100644 --- a/bigbluebutton-client/locale/oc/bbbResources.properties +++ b/bigbluebutton-client/locale/oc/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Connexion al servidor bbb.mainshell.statusProgress.loading = bbb.mainshell.statusProgress.cannotConnectServer = O planhèm, impossible d'establir una connexion al servidor. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (version {0}) +bbb.mainshell.copyrightLabel2 = bbb.mainshell.logBtn.toolTip = Dobrir la fenèstra de log bbb.mainshell.meetingNotFound = Conferéncia pas trobada bbb.mainshell.invalidAuthToken = Geton d'autentificacion invalid @@ -140,7 +140,7 @@ bbb.clientstatus.title = Configuracion de las notificacions bbb.clientstatus.notification = Notificacions pas legidas bbb.clientstatus.close = Tampar bbb.clientstatus.tunneling.title = Parafuòc -bbb.clientstatus.tunneling.message = Un parafuòc empacha vòstre client de se connectar dirèctament al pòrt 1935 del servidor distant. Es recomandat de se connectar a una ret mens restrictiva per obténer una connexion mai establa. +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Version del navigador bbb.clientstatus.browser.message = Vòstre navigador ({0}) es pas a jorn. Es recomandat d'installar la darrièra version. bbb.clientstatus.flash.title = Flash Player diff --git a/bigbluebutton-client/locale/pl_PL/bbbResources.properties b/bigbluebutton-client/locale/pl_PL/bbbResources.properties index cbbfa04f62875c672020a612368126917d1bc282..ecb3aca56bba201188c1255cdfd3fc581df2ae37 100644 --- a/bigbluebutton-client/locale/pl_PL/bbbResources.properties +++ b/bigbluebutton-client/locale/pl_PL/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = Konfiguracja powiadomieÅ„ bbb.clientstatus.notification = Powiadomienie o nieprzeczytaniu bbb.clientstatus.close = Zamknij bbb.clientstatus.tunneling.title = Zapora ogniowa -bbb.clientstatus.tunneling.message = Firewall uniemożliwia połączenie klienta bezpoÅ›rednio do portu 1935 na serwerze. Zalecane jest użycie mniej restrykcyjnej sieci w celu uzyskania stabilniejszego połączenia +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Wersja przeglÄ…darki bbb.clientstatus.browser.message = Twoja przeglÄ…darka ({0}) jest nieaktualna. Zalecana jest aktualizacja do najnowszej wersji. bbb.clientstatus.flash.title = Flash Player diff --git a/bigbluebutton-client/locale/pt_BR/bbbResources.properties b/bigbluebutton-client/locale/pt_BR/bbbResources.properties index 12ae03e19e3d2201c3f413b2e15ff0b8ebe29fbe..ab82d7a571825a04b21e5deea965d6a2cb41db91 100644 --- a/bigbluebutton-client/locale/pt_BR/bbbResources.properties +++ b/bigbluebutton-client/locale/pt_BR/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Conectando ao servidor bbb.mainshell.statusProgress.loading = Carregando bbb.mainshell.statusProgress.cannotConnectServer = Desculpe, não foi possÃvel conectar ao servidor. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = (c) 2018 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) bbb.mainshell.logBtn.toolTip = Abrir janela de log bbb.mainshell.meetingNotFound = Sala não encontrada bbb.mainshell.invalidAuthToken = Token de autenticação inválido @@ -140,7 +140,7 @@ bbb.clientstatus.title = Configuração de Notificações bbb.clientstatus.notification = Notificações não lidas bbb.clientstatus.close = Fechar bbb.clientstatus.tunneling.title = Firewall -bbb.clientstatus.tunneling.message = Um firewall está impedindo que seu cliente se conecte diretamente na porta 1935 do servidor. Recomenda-se que seja utilizada uma rede menos restritiva para uma conexão mais estável +bbb.clientstatus.tunneling.message = Um firewall está impedindo o seu cliente de se conectar diretamente ao servidor. Recomenda-se que seja utilizada uma rede menos restritiva para tornar a conexão mais estável. bbb.clientstatus.browser.title = Versão do navegador bbb.clientstatus.browser.message = Seu navegador ({0}) está desatualizado. Recomenda-se a atualização para a versão mais recente. bbb.clientstatus.flash.title = Flash Player @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = Publicar bbb.polling.closeButton.label = Cancelar bbb.polling.customPollOption.label = Enquete personalizada... bbb.polling.pollModal.title = Resultados da enquete em tempo real -bbb.polling.pollModal.hint = Deixe esta janela aberta para permitir que os alunos respondam à enquete. Clicar no botão Publicar ou Fechar finalizará a enquete. +bbb.polling.pollModal.hint = Deixe esta janela aberta para aguardar as respostas dos participantes. Depois de clicar em Publicar ou Fechar, a pesquisa termina. bbb.polling.customChoices.title = Entre com as opções da enquete bbb.polling.respondersLabel.novotes = Aguardando respostas bbb.polling.respondersLabel.text = {0} usuários responderam @@ -813,12 +813,12 @@ bbb.lockSettings.save.tooltip = Aplicar configurações de restrição bbb.lockSettings.cancel = Cancelar bbb.lockSettings.cancel.toolTip = Fecha esta janela sem aplicar -bbb.lockSettings.hint = +bbb.lockSettings.hint = Essas opções permitem restringir certas funções para os espectadores, por exemplo, o uso do bate-papo privado. (Estas restrições não se aplicam aos moderadores) bbb.lockSettings.moderatorLocking = Bloqueio de moderador bbb.lockSettings.privateChat = Chat privado bbb.lockSettings.publicChat = Chat público bbb.lockSettings.webcam = Câmera -bbb.lockSettings.webcamsOnlyForModerator = +bbb.lockSettings.webcamsOnlyForModerator = Veja as webcams de outros participantes bbb.lockSettings.microphone = Microfone bbb.lockSettings.layout = Layout bbb.lockSettings.title=Restringir participantes diff --git a/bigbluebutton-client/locale/ro_RO/bbbResources.properties b/bigbluebutton-client/locale/ro_RO/bbbResources.properties index 8cbc6d162d4fde2ee1069eec31859d39c8844fd1..2b6232f3971f493b767c7eafe12393fc344f8553 100644 --- a/bigbluebutton-client/locale/ro_RO/bbbResources.properties +++ b/bigbluebutton-client/locale/ro_RO/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = Configurare notificări bbb.clientstatus.notification = Notificări necitite bbb.clientstatus.close = ÃŽnchide bbb.clientstatus.tunneling.title = Firewall -bbb.clientstatus.tunneling.message = Un firewall nu permite conexiunea direct pe portul 1935 +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Versiunea browser-ului bbb.clientstatus.browser.message = Versiunea browser-ului ({0}) nu este actualizată. Se recomandă folosirea ultimei versiuni. bbb.clientstatus.flash.title = Flash Player diff --git a/bigbluebutton-client/locale/ru_RU/bbbResources.properties b/bigbluebutton-client/locale/ru_RU/bbbResources.properties index 56f7e18aa62c35cb1ff4570a3b6a90170832dda2..33a7a4d86d11387b5a67875edd3a23f6605df58a 100755 --- a/bigbluebutton-client/locale/ru_RU/bbbResources.properties +++ b/bigbluebutton-client/locale/ru_RU/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Подключение к Ñерверу... bbb.mainshell.statusProgress.loading = Загрузка bbb.mainshell.statusProgress.cannotConnectServer = К Ñожалению, мы не можем подключитьÑÑ Ðº Ñерверу. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = (c) 2018 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) bbb.mainshell.logBtn.toolTip = Открыть окно журнала bbb.mainshell.meetingNotFound = ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ð½Ðµ найдена bbb.mainshell.invalidAuthToken = Ðеверный ключ аутентификации @@ -140,7 +140,7 @@ bbb.clientstatus.title = Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ конфигурации bbb.clientstatus.notification = Ðепрочитанные ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ bbb.clientstatus.close = Закрыть bbb.clientstatus.tunneling.title = Файервол -bbb.clientstatus.tunneling.message = Файервол (брандмауÑÑ€) Ñ Ð’Ð°ÑˆÐµÐ¹ Ñтороны препÑÑ‚Ñтвует попыткам клиента приÑоединитьÑÑ Ð½Ð°Ð¿Ñ€Ñмую к порту 1935 удалённого Ñервера. Рекомендуем приÑоединитьÑÑ Ðº менее ограниченной Ñети Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ ÑтабильноÑти ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = ВерÑÐ¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð° bbb.clientstatus.browser.message = Ваш браузер ({0}) уÑтарел. Рекомендуем обновить его до наиболее Ñвежей Ñтабильной верÑии. bbb.clientstatus.flash.title = Flash Player @@ -215,7 +215,7 @@ bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Включить микроф bbb.users.usersGrid.mediaItemRenderer.pushToMute = Выключить микрофон {0} bbb.users.usersGrid.mediaItemRenderer.pushToLock = Заблокировать {0} bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Разблокировать {0} -bbb.users.usersGrid.mediaItemRenderer.kickUser = +bbb.users.usersGrid.mediaItemRenderer.kickUser = ИÑключить {0} bbb.users.usersGrid.mediaItemRenderer.webcam = Веб-камера включена bbb.users.usersGrid.mediaItemRenderer.micOff = Микрофон выключен bbb.users.usersGrid.mediaItemRenderer.micOn = Микрофон включен @@ -512,11 +512,11 @@ bbb.logout.unknown = Ваш клиент потерÑл Ñоединение Ñ bbb.logout.guestkickedout = Модератор не разрешил Вам подключение к Ñтой конференции bbb.logout.usercommand = Ð’Ñ‹ вышли из конференции bbb.logour.breakoutRoomClose = Ваше окно браузера будет закрыто -bbb.logout.ejectedFromMeeting = +bbb.logout.ejectedFromMeeting = Ð’Ñ‹ были иÑключены из конференции. bbb.logout.refresh.message = ЕÑли Ñтот выход был неожиданным нажмите на кнопку ниже, чтобы воÑÑтановить подключение. bbb.logout.refresh.label = Повторное подключение -bbb.logout.feedback.hint = -bbb.logout.feedback.label = +bbb.logout.feedback.hint = Как мы можем Ñделать BigBlueButton лучше? +bbb.logout.feedback.label = Мы Ñ ÑƒÐ´Ð¾Ð²Ð¾Ð»ÑŒÑтвием узнаем о вашем опыте работы Ñ BigBlueButton (необÑзательно) bbb.settings.title = ÐаÑтройки bbb.settings.ok = OK bbb.settings.cancel = Отменить @@ -712,7 +712,7 @@ bbb.shortcutkey.present.fitPage.function = Подогнать Ñлайды по bbb.shortcutkey.users.makePresenter = 89 bbb.shortcutkey.users.makePresenter.function = Сделать выбранного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð²ÐµÐ´ÑƒÑ‰Ð¸Ð¼ bbb.shortcutkey.users.kick = 69 -bbb.shortcutkey.users.kick.function = +bbb.shortcutkey.users.kick.function = ИÑключить выбранного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· конференции bbb.shortcutkey.users.mute = 83 bbb.shortcutkey.users.mute.function = Выкл./Вкл. мик. у выбранного учаÑтника bbb.shortcutkey.users.muteall = 65 @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = Опубликовать bbb.polling.closeButton.label = Закрыть bbb.polling.customPollOption.label = СобÑтвенное голоÑование bbb.polling.pollModal.title = Текущие результаты опроÑа -bbb.polling.pollModal.hint = ОÑтавьте Ñто окно открытым, чтобы дать возможноÑть учаÑтникам ответить на опроÑ. Ðажатие на кнопку "Опубликовать" или "Закрыть" завершит опроÑ. +bbb.polling.pollModal.hint = bbb.polling.customChoices.title = ВвеÑти варианты Ð´Ð»Ñ Ð¾Ð¿Ñ€Ð¾Ñа bbb.polling.respondersLabel.novotes = Ожидание ответа bbb.polling.respondersLabel.text = {0} Пользователей откликнулиÑÑŒ @@ -818,7 +818,7 @@ bbb.lockSettings.moderatorLocking = Заблокировано модерато bbb.lockSettings.privateChat = Приватные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ bbb.lockSettings.publicChat = Публичный чат bbb.lockSettings.webcam = Веб-камера -bbb.lockSettings.webcamsOnlyForModerator = +bbb.lockSettings.webcamsOnlyForModerator = Смотрите веб-камеры других учаÑтников bbb.lockSettings.microphone = Микрофон bbb.lockSettings.layout = Схема раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ¾Ð½ bbb.lockSettings.title=Блокировать зрителей diff --git a/bigbluebutton-client/locale/sq/bbbResources.properties b/bigbluebutton-client/locale/sq/bbbResources.properties index d374ba88b5c2ee0fcfd4004363c8185e2c861c80..5c096bf8d5a7a8d3c193a8312a13f715ac687273 100644 --- a/bigbluebutton-client/locale/sq/bbbResources.properties +++ b/bigbluebutton-client/locale/sq/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = Njoftimet per konfigurimet bbb.clientstatus.notification = Njoftimet e palexuara bbb.clientstatus.close = bbb.clientstatus.tunneling.title = -bbb.clientstatus.tunneling.message = Firewall pengon klientin tuaj qe te lidhet direkt ne porten 1935 te serverit remote. Rekomandohet qe te lidhet ne nje rrjet me pak strikt per nje lidhje me stabel. +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Versioni i browserit bbb.clientstatus.browser.message = bbb.clientstatus.flash.title = diff --git a/bigbluebutton-client/locale/sr_RS/bbbResources.properties b/bigbluebutton-client/locale/sr_RS/bbbResources.properties index 3bef40ade2d21602e75977521b5c64158184002b..3be024c9fb331ccbbf316cd4f3b2c03c01a18930 100644 --- a/bigbluebutton-client/locale/sr_RS/bbbResources.properties +++ b/bigbluebutton-client/locale/sr_RS/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = ObaveÅ¡tenja o konfiguraciji bbb.clientstatus.notification = NeproÄitana obaveÅ¡tenja bbb.clientstatus.close = Zatvori bbb.clientstatus.tunneling.title = Firewall -bbb.clientstatus.tunneling.message = Firewall spreÄava da se korisnik direktno poveže sa 1935 sa udaljenim serverom. PreporuÄuje se prikljuÄivanje manje restriktivnoj mreži zbog stabilnije konekcije +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Verzija pretraživaÄa bbb.clientstatus.browser.message = VaÅ¡ pretraživaÄ ({0}) nije ažuriran. PreporuÄuje se ažuriranje na najnoviju verziju. bbb.clientstatus.flash.title = Flash Player diff --git a/bigbluebutton-client/locale/tr_TR/bbbResources.properties b/bigbluebutton-client/locale/tr_TR/bbbResources.properties index 31561540c790bf1a2b8a377e9603243881c922ae..de5dd9016bbda236615a6a471d4830202b873e13 100644 --- a/bigbluebutton-client/locale/tr_TR/bbbResources.properties +++ b/bigbluebutton-client/locale/tr_TR/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Sunucuya baÄŸlanıyor bbb.mainshell.statusProgress.loading = Yükleniyor bbb.mainshell.statusProgress.cannotConnectServer = Üzgünüz, sunucuya baÄŸlanamıyoruz. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (sürüm {0}) +bbb.mainshell.copyrightLabel2 = (c) 2018 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (sürüm{0}) bbb.mainshell.logBtn.toolTip = Sistem Kayıtlarını Aç bbb.mainshell.meetingNotFound = Görüşme Bulunamadı bbb.mainshell.invalidAuthToken = Kimlik DoÄŸrulama Dizesi Hatalı @@ -140,7 +140,7 @@ bbb.clientstatus.title = Uyarı Ayarları bbb.clientstatus.notification = Okunmamış uyarılar bbb.clientstatus.close = Kapat bbb.clientstatus.tunneling.title = Güvenlik Duvarı -bbb.clientstatus.tunneling.message = Güvenlik duvarı bilgisayarınızın doÄŸrudan 1935 portu üzerinden sunucuya baÄŸlanmasını engellemektedir. +bbb.clientstatus.tunneling.message = Güvenlik duvarı bilgisayarınızın doÄŸrudan sunucuya baÄŸlanmasını engellemektedir. SaÄŸlıklı bir baÄŸlantı için kısıtlaması daha az olan farklı bir aÄŸdan baÄŸlanmanızı öneririz. bbb.clientstatus.browser.title = Tarayıcı Sürümü bbb.clientstatus.browser.message = Tarayıcınız ({0}) güncel deÄŸil. Son sürüme güncellemeniz önerilmektedir. bbb.clientstatus.flash.title = Flash Oynatıcı @@ -421,10 +421,10 @@ bbb.screensharePublish.restartFailed.label = .ekran paylaşımının tekrar baÅŸ bbb.screensharePublish.jwsCrashed.label = Ekran paylaşım uygulaması beklenmedik bir ÅŸekilde kapandı. bbb.screensharePublish.commonErrorMessage.label = "İptal"i seçin ve tekrar deneyin. bbb.screensharePublish.tunnelingErrorMessage.one = Ekran Paylaşımı çalıştırılamıyor. -bbb.screensharePublish.tunnelingErrorMessage.two = Kullanıcıyı yenilemeyi deneyin (tarayıcıdaki yenile butonuna tıklayın). EÄŸer yeniledikten sonra kullancıının saÄŸ alt köşesinde hala '[BaÄŸlantı Köprüleniyor]' ifadesini görüyorsanız, baÅŸka bir aÄŸdan baÄŸlanmayı deneyin. +bbb.screensharePublish.tunnelingErrorMessage.two = Tarayıcınızı yenilemeyi (yenile butonuna tıklamayı) deneyin . EÄŸer yeniledikten sonra saÄŸ alt köşede hala '[ Tunneling ]' ifadesini görüyorsanız, baÅŸka bir aÄŸdan baÄŸlanmayı deneyin. bbb.screensharePublish.cancelButton.label = Vazgeç bbb.screensharePublish.startButton.label = BaÅŸlat -bbb.screensharePublish.stopButton.label = Durdur +bbb.screensharePublish.stopButton.label = Kapat bbb.screensharePublish.stopButton.toolTip = Ekran paylaşımını durdur bbb.screensharePublish.WebRTCChromeExtensionMissing.label = Chrome'un son versiyonunu kullanıyorsunuz fakat ekran paylaşımı eklentisi yüklü deÄŸil. bbb.screensharePublish.WebRTCRetryExtensionInstallation.label = ekran paylaşım eklentisini yükledikten sonra, "Yeniden Dene" butonuna tıklayınız. @@ -585,10 +585,10 @@ bbb.settings.warning.close = Bu Uyarıyı kapat bbb.settings.noissues = ÇözümlenmemiÅŸ soruna rastlanmadı. bbb.settings.instructions = Flash'ın kamera kullanım izni isteÄŸini onaylayın. EÄŸer kendinizi görebiliyor ve duyabiliyorsanız tarayıcınız düzgün bir ÅŸekilde ayarlanmıştır. DiÄŸer potansiyel sorunlar aÅŸağıda sıralanmıştır. Olası çözümleri bulabilmek için her birine tıklayın. bbb.bwmonitor.title = AÄŸ izleme -bbb.bwmonitor.upload = Yükle -bbb.bwmonitor.upload.short = Yukarı -bbb.bwmonitor.download = İndir -bbb.bwmonitor.download.short = AÅŸağı +bbb.bwmonitor.upload = Yükleme +bbb.bwmonitor.upload.short = Yükleme +bbb.bwmonitor.download = İndirme +bbb.bwmonitor.download.short = İndirme bbb.bwmonitor.total = Toplam bbb.bwmonitor.current = Mevcut bbb.bwmonitor.available = Müsait @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = Yayımla bbb.polling.closeButton.label = Kapat bbb.polling.customPollOption.label = Özel Oylama bbb.polling.pollModal.title = Canlı Oylama Sonuçları -bbb.polling.pollModal.hint = Öğrencilerin oylamaya katılabilmeleri için bu pencereyi açık bırakın. Yayınla ya da Kapat tıklarsanız oylama sonlanacaktır. +bbb.polling.pollModal.hint = DiÄŸer kullanıcıların oylama yapabilmeleri için bu pencereyi açık bırakıp. Yayınla ya da Kapat tuÅŸlamanız halinde oylama son bulacaktır. bbb.polling.customChoices.title = Oylama Seçeneklerini Girin bbb.polling.respondersLabel.novotes = Cevaplar bekleniyor bbb.polling.respondersLabel.text = {0} Kullanıcı Cevapladı @@ -818,7 +818,7 @@ bbb.lockSettings.moderatorLocking = Moderatör kilidi bbb.lockSettings.privateChat = Özel Sohbet bbb.lockSettings.publicChat = Genel Sohbet bbb.lockSettings.webcam = Kamera -bbb.lockSettings.webcamsOnlyForModerator = DiÄŸer izleyicilerin kameralarını gizle +bbb.lockSettings.webcamsOnlyForModerator = DiÄŸer izleyicilerin kameralarını gör bbb.lockSettings.microphone = Mikrofon bbb.lockSettings.layout = Görünüm bbb.lockSettings.title=Izleyicileri Kilitle diff --git a/bigbluebutton-client/locale/uk_UA/bbbResources.properties b/bigbluebutton-client/locale/uk_UA/bbbResources.properties index a8f3926c4d4b65b461d803eec7bec0cb8e55993b..e72d22ac7c0282468b3801e87fbb846aa6863240 100644 --- a/bigbluebutton-client/locale/uk_UA/bbbResources.properties +++ b/bigbluebutton-client/locale/uk_UA/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.9.0 bbb.mainshell.statusProgress.connecting = Під'єднуюÑÑŒ до Ñервера bbb.mainshell.statusProgress.loading = Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ bbb.mainshell.statusProgress.cannotConnectServer = Ðа жаль, ми не можемо з'єднатиÑÑ Ð· Ñервером. -bbb.mainshell.copyrightLabel2 = (c) 2017 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) +bbb.mainshell.copyrightLabel2 = (c) 2018 <a href='event:http://www.bigbluebutton.org/' target='_blank'><u>BigBlueButton Inc.</u></a> (build {0}) bbb.mainshell.logBtn.toolTip = Відкрити вікно журналу bbb.mainshell.meetingNotFound = ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ñ–Ñ Ð½Ðµ знайдена bbb.mainshell.invalidAuthToken = Ðевірний ключ аутентифікації @@ -140,7 +140,7 @@ bbb.clientstatus.title = ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ конфігураці bbb.clientstatus.notification = Ðепрочитані Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ bbb.clientstatus.close = Закрити bbb.clientstatus.tunneling.title = Файрвол -bbb.clientstatus.tunneling.message = Файервол (брандмауер) з Вашого боку перешкоджає Ñпробам клієнта приєднатиÑÑ Ð±ÐµÐ·Ð¿Ð¾Ñередньо до порту 1935 віддаленого Ñервера. Рекомендуємо приєднатиÑÑ Ð´Ð¾ менш обмеженої мережі Ð´Ð»Ñ Ð±Ñ–Ð»ÑŒÑˆÐ¾Ñ— ÑтабільноÑті з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = ВерÑÑ–Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð° bbb.clientstatus.browser.message = Ваш браузер ({0}) заÑтарів. Рекомендуємо оновити його до найбільш Ñвіжої Ñтабільної верÑÑ–Ñ—. bbb.clientstatus.flash.title = Flash Player @@ -215,7 +215,7 @@ bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Увімкнути мікро bbb.users.usersGrid.mediaItemRenderer.pushToMute = Вимкнути мікрофон {0} bbb.users.usersGrid.mediaItemRenderer.pushToLock = Заблокувати {0} bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Розблокувати {0} -bbb.users.usersGrid.mediaItemRenderer.kickUser = +bbb.users.usersGrid.mediaItemRenderer.kickUser = Виключити {0} bbb.users.usersGrid.mediaItemRenderer.webcam = Веб-камера увімкнена bbb.users.usersGrid.mediaItemRenderer.micOff = Вимкнути мікрофон bbb.users.usersGrid.mediaItemRenderer.micOn = Увімкнути мікрофон @@ -512,11 +512,11 @@ bbb.logout.unknown = Ваш клієнт втратив зв'Ñзок з Ñер bbb.logout.guestkickedout = Модератор не дозволив вам приєднатиÑÑŒ до зуÑтрічі bbb.logout.usercommand = Ви вийшли із конференції bbb.logour.breakoutRoomClose = Вікно вашого браузеру буде закрите -bbb.logout.ejectedFromMeeting = +bbb.logout.ejectedFromMeeting = Ви були виключені з конференції. bbb.logout.refresh.message = Якщо цей вихід був неÑподіваним натиÑніть на кнопку нижче, щоб відновити підключеннÑ. bbb.logout.refresh.label = Повторне Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ -bbb.logout.feedback.hint = -bbb.logout.feedback.label = +bbb.logout.feedback.hint = Як ми можемо зробити BigBlueButton краще? +bbb.logout.feedback.label = Ми хотіли б почути про ваш доÑвід роботи з BigBlueButton (необов'Ñзково) bbb.settings.title = ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ bbb.settings.ok = ОК bbb.settings.cancel = Відмінити @@ -712,7 +712,7 @@ bbb.shortcutkey.present.fitPage.function = Підігнати Ñлайди по bbb.shortcutkey.users.makePresenter = 89 bbb.shortcutkey.users.makePresenter.function = Зробити вибраного учаÑника ведучим bbb.shortcutkey.users.kick = 69 -bbb.shortcutkey.users.kick.function = +bbb.shortcutkey.users.kick.function = Виключити вибраного учаÑника з конференції bbb.shortcutkey.users.mute = 83 bbb.shortcutkey.users.mute.function = Вимк./Увімк. мік. у вибраного учаÑника bbb.shortcutkey.users.muteall = 65 @@ -765,7 +765,7 @@ bbb.polling.publishButton.label = Публікувати bbb.polling.closeButton.label = Закрити bbb.polling.customPollOption.label = ВлаÑне Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ bbb.polling.pollModal.title = Поточні результати голоÑÑƒÐ²Ð°Ð½Ð½Ñ -bbb.polling.pollModal.hint = Залиште це вікно відкритим, щоб Ñтуденти могли відповіÑти на опитуваннÑ. Вибравши кнопку "Опублікувати" або "Закрити", Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ завершене. +bbb.polling.pollModal.hint = bbb.polling.customChoices.title = ВвеÑти варіанти вибору bbb.polling.respondersLabel.novotes = ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ– bbb.polling.respondersLabel.text = {0} КориÑтувачів відповіли @@ -818,7 +818,7 @@ bbb.lockSettings.moderatorLocking = Заблоковано модераторо bbb.lockSettings.privateChat = Приватний чат bbb.lockSettings.publicChat = Публічний чат bbb.lockSettings.webcam = Веб-камера -bbb.lockSettings.webcamsOnlyForModerator = +bbb.lockSettings.webcamsOnlyForModerator = ПереглÑдайте веб-камери інших учаÑників bbb.lockSettings.microphone = Мікрофон bbb.lockSettings.layout = Схема Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½ bbb.lockSettings.title=Блокувати глÑдачів diff --git a/bigbluebutton-client/locale/vi_VN/bbbResources.properties b/bigbluebutton-client/locale/vi_VN/bbbResources.properties index a61ae23b4f12051a5589a322a533162462f0b661..c3bf6c12f3759ff866e91f7ff555f512123ccefc 100644 --- a/bigbluebutton-client/locale/vi_VN/bbbResources.properties +++ b/bigbluebutton-client/locale/vi_VN/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = Các thông báo cấu hình bbb.clientstatus.notification = Các thông báo chưa Ä‘á»c bbb.clientstatus.close = Äóng bbb.clientstatus.tunneling.title = Tưá»ng lá»a -bbb.clientstatus.tunneling.message = Tưá»ng lá»a ngăn không cho ngưá»i dùng kết nối trá»±c tiếp và o cổng 1935 đến server. Khuyến cáo mở cổng sá» dụng trên mạng để kết nối ổn định hÆ¡n +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = Phiên bản trình duyệt bbb.clientstatus.browser.message = Trình duyệt ({0}) cá»§a bạn không phải là má»›i nhất. Khuyến nghị nên cáºp nháºt phiên bản má»›i nhất. bbb.clientstatus.flash.title = Máy trình chiếu Flash diff --git a/bigbluebutton-client/locale/zh_TW/bbbResources.properties b/bigbluebutton-client/locale/zh_TW/bbbResources.properties index f5b1daa07fccc3a76c03a6f3939f6b4c8e2f0e56..08f908df41920c7b8247a43b867a1ebc0159cfc1 100644 --- a/bigbluebutton-client/locale/zh_TW/bbbResources.properties +++ b/bigbluebutton-client/locale/zh_TW/bbbResources.properties @@ -140,7 +140,7 @@ bbb.clientstatus.title = 組態通知 bbb.clientstatus.notification = 未讀å–通知 bbb.clientstatus.close = 關閉 bbb.clientstatus.tunneling.title = 防ç«ç‰† -bbb.clientstatus.tunneling.message = A firewall is preventing your client from connecting directly on port 1935 to the remote server. Recommend joining a less restrictive network for a more stable connection +bbb.clientstatus.tunneling.message = bbb.clientstatus.browser.title = ç€è¦½å™¨ç‰ˆæœ¬ bbb.clientstatus.browser.message = ä½ çš„ç€è¦½å™¨ ({0}) æœªæ›´æ–°ï¼Œå»ºè°æ›´æ–°åˆ°æœ€æ–°ç‰ˆæœ¬ã€‚ bbb.clientstatus.flash.title = Flash 撥放器 diff --git a/bigbluebutton-client/resources/prod/BigBlueButton.html b/bigbluebutton-client/resources/prod/BigBlueButton.html index 8291bb4a72c6e946b406b2ba6442c093840df2b3..e492db6ead1338a2233f73fa0b5287b00f55a93b 100755 --- a/bigbluebutton-client/resources/prod/BigBlueButton.html +++ b/bigbluebutton-client/resources/prod/BigBlueButton.html @@ -5,6 +5,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <style type="text/css" media="screen"> html, body, #content { height:100%; width: 100%; } + .hiddenContent { display: none; } body { margin:0; padding:0; overflow:hidden; } #altContent { /* style alt content */ } .visually-hidden { @@ -175,12 +176,18 @@ if ((iOS || android) && !puffin) { redirectToHtml5(); + } else { + showContent(); } if (document.getElementById('html5Section')) { document.getElementById('html5Section').style.display = 'inherit'; } + } else { + showContent(); } + }).fail(function(data) { + showContent(); }); if (fillContent) fillContent(); @@ -189,6 +196,10 @@ function redirectToHtml5 () { document.location.pathname = '/html5client/join'; } + + function showContent () { + $('#content').removeClass('hiddenContent'); + } </script> </head> @@ -201,7 +212,7 @@ </div> <div id="accessibile-progress" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" class="visually-hidden">0 %</div> <button id="enterFlash" type="button" class="visually-hidden" onclick="startFlashFocus();">Set focus to client</button> - <div id="content" > + <div id="content" class="hiddenContent"> <div id="altFlash" style="width:50%; margin-left: auto; margin-right: auto; font-family: sans-serif; text-align: center;"> <p style="font-weight: bold;">You need Adobe Flash installed and enabled in order to use this client.</p> <br/> diff --git a/bigbluebutton-config/bin/bbb-conf b/bigbluebutton-config/bin/bbb-conf index 62e4c02f0d956342b7748e6de42b1695cc6cc5e0..e792c123dafd2abd709bcd04ddeac706093115cf 100755 --- a/bigbluebutton-config/bin/bbb-conf +++ b/bigbluebutton-config/bin/bbb-conf @@ -150,7 +150,7 @@ if LANG=c ifconfig | grep -q 'venet0:0'; then IP=$(ifconfig | grep -v '127.0.0.1' | grep -E "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | tail -1 | cut -d: -f2 | awk '{ print $1}') else # IP detection for et* and en* networks -IP=$(echo "$(LANG=c ifconfig | awk -v RS="" '{gsub (/\n[ ]*inet /," ")}1' | grep ^et.* | grep addr: | head -n1 | sed 's/.*addr://g' | sed 's/ .*//g')$(LANG=c ifconfig | awk -v RS="" '{gsub (/\n[ ]*inet /," ")}1' | grep ^en.* | grep addr: | head -n1 | sed 's/.*addr://g' | sed 's/ .*//g')$(LANG=c ifconfig | awk -v RS="" '{gsub (/\n[ ]*inet /," ")}1' | grep ^wl.* | grep addr: | head -n1 | sed 's/.*addr://g' | sed 's/ .*//g')$(LANG=c ifconfig | awk -v RS="" '{gsub (/\n[ ]*inet /," ")}1' | grep ^bo.* | grep addr: | head -n1 | sed 's/.*addr://g' | sed 's/ .*//g')" | head -n1) +IP=$(echo "$(LANG=c ifconfig | awk -v RS="" '{gsub (/\n[ ]*inet /," ")}1' | grep ^et.* | grep addr: | head -n1 | sed 's/.*addr://g' | sed 's/ .*//g')$(LANG=c ifconfig | awk -v RS="" '{gsub (/\n[ ]*inet /," ")}1' | grep ^en.* | grep addr: | head -n1 | sed 's/.*addr://g' | sed 's/ .*//g')$(LANG=c ifconfig | awk -v RS="" '{gsub (/\n[ ]*inet /," ")}1' | grep ^wl.* | grep addr: | head -n1 | sed 's/.*addr://g' | sed 's/ .*//g')$(LANG=c ifconfig | awk -v RS="" '{gsub (/\n[ ]*inet /," ")}1' | grep ^bo.* | grep addr: | head -n1 | sed 's/.*addr://g' | sed 's/ .*//g')$(LANG=c ifconfig | awk -v RS="" '{gsub (/\n[ ]*inet /," ")}1' | grep ^em.* | grep addr: | head -n1 | sed 's/.*addr://g' | sed 's/ .*//g')$(LANG=c ifconfig | awk -v RS="" '{gsub (/\n[ ]*inet /," ")}1' | grep ^p.p.* | grep addr: | head -n1 | sed 's/.*addr://g' | sed 's/ .*//g')" | head -n1) fi if [ -z "$IP" ]; then @@ -891,7 +891,7 @@ check_configuration() { BBB_SECRET=$(cat ${SERVLET_DIR}/bigbluebutton/WEB-INF/classes/bigbluebutton.properties | grep -v '#' | tr -d '\r' | sed -n '/securitySalt/{s/.*=//;p}') NGINX_IP=$(cat /etc/nginx/sites-available/bigbluebutton | grep -v '#' | sed -n '/server_name/{s/.*server_name[ ]*//;s/;//;p}' | cut -d' ' -f1) - if [ -f /usr/local/bigbluebutton/bbb-webhooks/config_local.coffee ]; then + if [ -f /usr/lib/systemd/system/bbb-webhooks.service ]; then WEBHOOKS_SECRET=$(cat /usr/local/bigbluebutton/bbb-webhooks/config_local.coffee | grep '^[ \t]*config.bbb.sharedSecret[ =]*' | cut -d '"' -f2) if [ "$BBB_SECRET" != "$WEBHOOKS_SECRET" ]; then diff --git a/bigbluebutton-html5/client/compatibility/adjust-videos.js b/bigbluebutton-html5/client/compatibility/adjust-videos.js index c2042eb725c954c7721b48e451c4f5bb240efbac..5e1c2dcb57a017a89b046c2a8564b86a8a787e49 100644 --- a/bigbluebutton-html5/client/compatibility/adjust-videos.js +++ b/bigbluebutton-html5/client/compatibility/adjust-videos.js @@ -60,6 +60,7 @@ const y = e.outerHeight() - 1; const videos = $("#" + tagId + " > div:visible"); + const isPortrait = ( $(document).width() < $(document).height() ); if (isPortrait) { diff --git a/bigbluebutton-html5/imports/api/acl/Acl.js b/bigbluebutton-html5/imports/api/acl/Acl.js index 7c2102e16a6c1b205a87728e86f7d4512ccbefbe..b5fcf8b91b6bfc01057f5a2e91d041bded544c3c 100644 --- a/bigbluebutton-html5/imports/api/acl/Acl.js +++ b/bigbluebutton-html5/imports/api/acl/Acl.js @@ -27,9 +27,9 @@ export default class Acl { userId, authToken, validated: true, - // TODO: We cant check for approved until we move subscription logif out of <Base /> - // approved: true, connectionStatus: 'online', + // TODO: We cant check for approved until we move subscription login out of <Base /> + // approved: true, }); return !!User; // if he found a user means the meeting/user/token is valid diff --git a/bigbluebutton-html5/imports/api/log-client/server/methods/logClient.js b/bigbluebutton-html5/imports/api/log-client/server/methods/logClient.js index d187c3e0e2af2085888da8dc8c518217e8a01312..22c5f6af9a121b44a1741a79fc6ac7ee8dfe0281 100644 --- a/bigbluebutton-html5/imports/api/log-client/server/methods/logClient.js +++ b/bigbluebutton-html5/imports/api/log-client/server/methods/logClient.js @@ -1,7 +1,11 @@ import Logger from '/imports/startup/server/logger'; const logClient = (type, log, ...args) => { - Logger.log(type, `CLIENT LOG: ${log}\n`, ...args); + if (typeof log === 'string' || log instanceof String) { + Logger.log(type, `CLIENT LOG: ${log}\n`, ...args); + } else { + Logger.log(type, `CLIENT LOG: ${JSON.stringify(log)}\n`, ...args); + } }; export default logClient; diff --git a/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js b/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js index 37c33abb8b5503e9710dc40559101c3870c43cc3..78cfd231e3e5b4e66edab9aa1f6afaef4b8bed7d 100644 --- a/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js +++ b/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js @@ -53,6 +53,7 @@ export default function handleValidateAuthToken({ body }, meetingId) { // Publish user join message if (valid && !waitForApproval) { + Logger.info('User=', JSON.stringify(User)); userJoin(meetingId, userId, User.authToken); } diff --git a/bigbluebutton-html5/imports/api/users/server/methods/userJoin.js b/bigbluebutton-html5/imports/api/users/server/methods/userJoin.js index b182fff2c0c8920efdcfe3146299dfcde80bc061..83b8b2766f0d2d04b6a0df3bc2df477b32733b39 100644 --- a/bigbluebutton-html5/imports/api/users/server/methods/userJoin.js +++ b/bigbluebutton-html5/imports/api/users/server/methods/userJoin.js @@ -8,6 +8,8 @@ export default function userJoin(meetingId, userId, authToken) { const CHANNEL = REDIS_CONFIG.channels.toAkkaApps; const EVENT_NAME = 'UserJoinMeetingReqMsg'; + Logger.info(`User='${userId}' is joining meeting='${meetingId}' authToken='${authToken}' pt1`); + check(meetingId, String); check(userId, String); check(authToken, String); @@ -17,7 +19,7 @@ export default function userJoin(meetingId, userId, authToken) { authToken, }; - Logger.info(`User '${userId}' is joining meeting '${meetingId}'`); + Logger.info(`User='${userId}' is joining meeting='${meetingId}' authToken='${authToken}' pt2`); return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, userId, payload); } diff --git a/bigbluebutton-html5/imports/api/users/server/publishers.js b/bigbluebutton-html5/imports/api/users/server/publishers.js index 81babf80bfb4ac0ed9c56fb84d8b0f881426f714..51e78ac4fd536e03808478ba89577bb0f781dac5 100644 --- a/bigbluebutton-html5/imports/api/users/server/publishers.js +++ b/bigbluebutton-html5/imports/api/users/server/publishers.js @@ -1,3 +1,4 @@ +import _ from 'lodash'; import Users from '/imports/api/users'; import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; @@ -6,9 +7,20 @@ import mapToAcl from '/imports/startup/mapToAcl'; import userLeaving from './methods/userLeaving'; -Meteor.publish('current-user', (credentials) => { +Meteor.publish('current-user', function currentUserPub(credentials) { const { meetingId, requesterUserId, requesterToken } = credentials; + const connectionId = this.connection.id; + const onCloseConnection = Meteor.bindEnvironment(() => { + try { + userLeaving(credentials, requesterUserId, connectionId); + } catch (e) { + Logger.error(`Exception while executing userLeaving: ${e}`); + } + }); + + this._session.socket.on('close', _.debounce(onCloseConnection, 100)); + check(meetingId, String); check(requesterUserId, String); check(requesterToken, String); @@ -39,14 +51,6 @@ function users(credentials) { check(requesterUserId, String); check(requesterToken, String); - this.onStop(() => { - try { - userLeaving(credentials, requesterUserId, this.connection.id); - } catch (e) { - Logger.error(`Exception while executing userLeaving: ${e}`); - } - }); - const selector = { meetingId, }; diff --git a/bigbluebutton-html5/imports/startup/client/base.jsx b/bigbluebutton-html5/imports/startup/client/base.jsx index 25471a3e3f92ce07baaa3a321360093d039d7c10..27e7ae493708e1888bea417a65d8c078eb34cbe7 100644 --- a/bigbluebutton-html5/imports/startup/client/base.jsx +++ b/bigbluebutton-html5/imports/startup/client/base.jsx @@ -100,12 +100,15 @@ const SUBSCRIPTIONS_NAME = [ const BaseContainer = withRouter(withTracker(({ params, router }) => { if (params.errorCode) return params; - if (!Auth.loggedIn) { - return router.push('/logout'); - } - - const { credentials } = Auth; + const { locale } = Settings.application; + const { credentials, loggedIn } = Auth; + if (!loggedIn) { + return { + locale, + subscriptionsReady: false, + }; + } const subscriptionErrorHandler = { onError: (error) => { @@ -117,9 +120,8 @@ const BaseContainer = withRouter(withTracker(({ params, router }) => { const subscriptionsHandlers = SUBSCRIPTIONS_NAME.map(name => Meteor.subscribe(name, credentials, subscriptionErrorHandler)); - return { - locale: Settings.application.locale, + locale, subscriptionsReady: subscriptionsHandlers.every(handler => handler.ready()), }; })(Base)); diff --git a/bigbluebutton-html5/imports/startup/server/index.js b/bigbluebutton-html5/imports/startup/server/index.js index 41ffed6aace191fd27a0fd0edfc08899abb68b51..5339ed23266c55d84165124c039d90cfc069ea88 100644 --- a/bigbluebutton-html5/imports/startup/server/index.js +++ b/bigbluebutton-html5/imports/startup/server/index.js @@ -6,7 +6,8 @@ import Redis from './redis'; Meteor.startup(() => { const APP_CONFIG = Meteor.settings.public.app; - Logger.info(`SERVER STARTED. DEV_ENV=${Meteor.isDevelopment} PROD_ENV=${Meteor.isProduction}`, APP_CONFIG); + const env = Meteor.isDevelopment ? 'development' : 'production'; + Logger.warn(`SERVER STARTED. ENV=${env}, nodejs version=${process.version}`, APP_CONFIG); }); WebApp.connectHandlers.use('/check', (req, res) => { diff --git a/bigbluebutton-html5/imports/startup/server/redis.js b/bigbluebutton-html5/imports/startup/server/redis.js index 0314b3ce6c8541174339a53275aabccf35288972..043cb76b8e9dc23709fc65502271b0708523f502 100644 --- a/bigbluebutton-html5/imports/startup/server/redis.js +++ b/bigbluebutton-html5/imports/startup/server/redis.js @@ -70,7 +70,7 @@ class MettingMessageQueue { }; try { - this.debug(`${eventName} emitted`); + this.debug(`${JSON.stringify(data.parsedMessage.core)} emitted`); if (isAsync) { callNext(); diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx index c433564a601caa68b9d5e2cc7c30d7b1136b316d..45338e8270c793e17b7aca07b60c7f1460ac0017 100644 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx @@ -4,7 +4,7 @@ import { styles } from './styles.scss'; import EmojiSelect from './emoji-select/component'; import ActionsDropdown from './actions-dropdown/component'; import AudioControlsContainer from '../audio/audio-controls/container'; -import JoinVideoOptionsContainer from '../video-dock/video-menu/container'; +import JoinVideoOptionsContainer from '../video-provider/video-menu/container'; class ActionsBar extends React.PureComponent { render() { diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx index 5ba1a03183d53e4498db9c85d047066177ae3647..ca2f85b1c1a5f6a6ba9688fdb452254e9f6375e8 100644 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { withTracker } from 'meteor/react-meteor-data'; import ActionsBar from './component'; import Service from './service'; -import VideoService from '../video-dock/service'; +import VideoService from '../video-provider/service'; import { shareScreen, unshareScreen, isVideoBroadcasting } from '../screenshare/service'; const ActionsBarContainer = props => <ActionsBar {...props} />; 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 b8635661bc8b4ada85a9155c9edd4db2d455469c..778200dab5b1773b1f1a4260feeb8781bfc63218 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/component.jsx @@ -24,6 +24,12 @@ const propTypes = { isConnected: PropTypes.bool.isRequired, inputDeviceId: PropTypes.string, outputDeviceId: PropTypes.string, + showPermissionsOvelay: PropTypes.bool.isRequired, + listenOnlyMode: PropTypes.bool.isRequired, + skipCheck: PropTypes.bool.isRequired, + joinFullAudioImmediately: PropTypes.bool.isRequired, + joinFullAudioEchoTest: PropTypes.bool.isRequired, + forceListenOnlyAttendee: PropTypes.bool.isRequired, }; const defaultProps = { @@ -76,12 +82,12 @@ class AudioModal extends Component { this.state = { content: null, + hasError: false, }; const { intl, closeModal, - joinListenOnly, joinEchoTest, exitAudio, leaveEchoTest, @@ -94,6 +100,7 @@ class AudioModal extends Component { this.handleGoToEchoTest = this.handleGoToEchoTest.bind(this); this.handleJoinMicrophone = this.handleJoinMicrophone.bind(this); this.handleJoinListenOnly = this.handleJoinListenOnly.bind(this); + this.skipAudioOptions = this.skipAudioOptions.bind(this); this.closeModal = closeModal; this.joinEchoTest = joinEchoTest; this.exitAudio = exitAudio; @@ -117,6 +124,26 @@ class AudioModal extends Component { }; } + componentWillMount() { + const { + joinFullAudioImmediately, + joinFullAudioEchoTest, + forceListenOnlyAttendee, + } = this.props; + + if (joinFullAudioImmediately) { + this.handleJoinMicrophone(); + } + + if (joinFullAudioEchoTest) { + this.handleGoToEchoTest(); + } + + if (forceListenOnlyAttendee) { + this.handleJoinListenOnly(); + } + } + componentWillUnmount() { const { isEchoTest, @@ -130,6 +157,7 @@ class AudioModal extends Component { handleGoToAudioOptions() { this.setState({ content: null, + hasError: true, }); } @@ -147,6 +175,10 @@ class AudioModal extends Component { outputDeviceId, } = this.props; + this.setState({ + hasError: false, + }); + return this.joinEchoTest().then(() => { console.log(inputDeviceId, outputDeviceId); this.setState({ @@ -180,48 +212,78 @@ class AudioModal extends Component { joinMicrophone, } = this.props; + this.setState({ + hasError: false, + }); + joinMicrophone().catch(this.handleGoToAudioOptions); } + skipAudioOptions() { + const { + isConnecting, + joinFullAudioImmediately, + joinFullAudioEchoTest, + forceListenOnlyAttendee, + } = this.props; + + const { + content, + hasError, + } = this.state; + + + return ( + isConnecting || + forceListenOnlyAttendee || + joinFullAudioImmediately || + joinFullAudioEchoTest + ) && !content && !hasError; + } + renderAudioOptions() { const { intl, + listenOnlyMode, + forceListenOnlyAttendee, + skipCheck, } = this.props; return ( <span className={styles.audioOptions}> - <Button - className={styles.audioBtn} - label={intl.formatMessage(intlMessages.microphoneLabel)} - icon="unmute" - circle - size="jumbo" - onClick={this.handleGoToEchoTest} - /> - <Button - className={styles.audioBtn} - label={intl.formatMessage(intlMessages.listenOnlyLabel)} - icon="listen" - circle - size="jumbo" - onClick={this.handleJoinListenOnly} - /> + {!forceListenOnlyAttendee ? + <Button + className={styles.audioBtn} + label={intl.formatMessage(intlMessages.microphoneLabel)} + icon="unmute" + circle + size="jumbo" + onClick={skipCheck ? this.handleJoinMicrophone : this.handleGoToEchoTest} + /> + : null} + {listenOnlyMode ? + <Button + className={styles.audioBtn} + label={intl.formatMessage(intlMessages.listenOnlyLabel)} + icon="listen" + circle + size="jumbo" + onClick={this.handleJoinListenOnly} + /> + : null} </span> ); } renderContent() { const { - isConnecting, isEchoTest, intl, } = this.props; - const { - content, - } = this.state; + const { content } = this.state; - if (isConnecting) { + if (this.skipAudioOptions()) { return ( <span className={styles.connecting}> { !isEchoTest ? @@ -235,15 +297,8 @@ class AudioModal extends Component { } renderEchoTest() { - const { - isConnecting, - } = this.props; - return ( <EchoTest - isConnecting={isConnecting} - joinEchoTest={this.joinEchoTest} - leaveEchoTest={this.leaveEchoTest} handleNo={this.handleGoToAudioSettings} handleYes={this.handleJoinMicrophone} /> @@ -287,13 +342,10 @@ class AudioModal extends Component { render() { const { intl, - isConnecting, showPermissionsOvelay, } = this.props; - const { - content, - } = this.state; + const { content } = this.state; return ( <span> @@ -303,26 +355,27 @@ class AudioModal extends Component { className={styles.modal} onRequestClose={this.closeModal} > - { isConnecting ? null : - <header - data-test="audioModalHeader" - className={styles.header} - > - <h3 className={styles.title}> - { content ? - this.contents[content].title : - intl.formatMessage(intlMessages.audioChoiceLabel)} - </h3> - <Button - data-test="modalBaseCloseButton" - className={styles.closeBtn} - label={intl.formatMessage(intlMessages.closeLabel)} - icon="close" - size="md" - hideLabel - onClick={this.closeModal} - /> - </header> + { !this.skipAudioOptions() ? + <header + data-test="audioModalHeader" + className={styles.header} + > + <h3 className={styles.title}> + { content ? + this.contents[content].title : + intl.formatMessage(intlMessages.audioChoiceLabel)} + </h3> + <Button + data-test="modalBaseCloseButton" + className={styles.closeBtn} + label={intl.formatMessage(intlMessages.closeLabel)} + icon="close" + size="md" + hideLabel + onClick={this.closeModal} + /> + </header> + : null } <div className={styles.content}> { this.renderContent() } diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx index b69051954fc5d59eed6d171846025cd7cd5ff111..24c367b1a0a87b2d732e5705b68e33f772c2c6e3 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx @@ -6,21 +6,33 @@ import Service from '../service'; const AudioModalContainer = props => <AudioModal {...props} />; +const APP_CONFIG = Meteor.settings.public.app; + +const { listenOnlyMode, forceListenOnly, skipCheck } = APP_CONFIG; + export default withModalMounter(withTracker(({ mountModal }) => ({ closeModal: () => { if (!Service.isConnecting()) mountModal(null); }, - joinMicrophone: () => - new Promise((resolve, reject) => { - Service.transferCall().then(() => { - mountModal(null); - resolve(); - }).catch(() => { + joinMicrophone: () => { + const call = new Promise((resolve, reject) => { + if (skipCheck) { + resolve(Service.joinMicrophone()); + } else { + resolve(Service.transferCall()); + } + reject(() => { Service.exitAudio(); - reject(); - }); - }), + }) + }); + + return call.then(() => { + mountModal(null); + }).catch((error) => { + throw error; + }); + }, joinListenOnly: () => Service.joinListenOnly().then(() => mountModal(null)), leaveEchoTest: () => { if (!Service.isEchoTest()) { @@ -38,4 +50,9 @@ export default withModalMounter(withTracker(({ mountModal }) => inputDeviceId: Service.inputDeviceId(), outputDeviceId: Service.outputDeviceId(), showPermissionsOvelay: Service.isWaitingPermissions(), + listenOnlyMode, + skipCheck, + joinFullAudioImmediately: !listenOnlyMode && skipCheck, + joinFullAudioEchoTest: !listenOnlyMode && !skipCheck, + forceListenOnlyAttendee: listenOnlyMode && forceListenOnly && !Service.isUserModerator(), }))(AudioModalContainer)); diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/styles.scss b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/styles.scss index 606dbad0eb2e5d6aaf44943b0b9f2f4d597bbcd6..290ec97ba42e7845e1e14a95648331aee2b0073d 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/styles.scss @@ -24,6 +24,9 @@ margin-right: 1rem; } } + .audioBtn:only-child { + margin-right: 0; + } } .audioOptions { diff --git a/bigbluebutton-html5/imports/ui/components/audio/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/container.jsx index b950b9dca99b8f222f53b8b480486b95f9c18108..893f6b507a2df504571060cac6b3b30f0df493fc 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/container.jsx @@ -63,7 +63,7 @@ let didMountAutoJoin = false; export default withModalMounter(injectIntl(withTracker(({ mountModal, intl }) => { const APP_CONFIG = Meteor.settings.public.app; - const { autoJoinAudio } = APP_CONFIG; + const { autoJoin } = APP_CONFIG; const openAudioModal = mountModal.bind( null, <AudioModalContainer />, @@ -94,7 +94,7 @@ export default withModalMounter(injectIntl(withTracker(({ mountModal, intl }) => init: () => { Service.init(messages); Service.changeOutputDevice(document.querySelector('#remote-media').sinkId); - if (!autoJoinAudio || didMountAutoJoin) return; + if (!autoJoin || didMountAutoJoin) return; openAudioModal(); didMountAutoJoin = true; }, diff --git a/bigbluebutton-html5/imports/ui/components/audio/echo-test/component.jsx b/bigbluebutton-html5/imports/ui/components/audio/echo-test/component.jsx index 3cb2c70f4e511e047d621486f7c743f9e45f553f..e8a37027fdfe4860f29300f94e2d07e126214ea3 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/echo-test/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/echo-test/component.jsx @@ -39,19 +39,19 @@ class EchoTest extends Component { <Button className={styles.button} label={intl.formatMessage(intlMessages.yes)} - icon={'thumbs_up'} + icon="thumbs_up" circle - color={'success'} - size={'jumbo'} + color="success" + size="jumbo" onClick={this.handleYes} /> <Button className={styles.button} label={intl.formatMessage(intlMessages.no)} - icon={'thumbs_down'} + icon="thumbs_down" circle - color={'danger'} - size={'jumbo'} + color="danger" + size="jumbo" onClick={this.handleNo} /> </span> diff --git a/bigbluebutton-html5/imports/ui/components/audio/service.js b/bigbluebutton-html5/imports/ui/components/audio/service.js index 8628984225f68a18a20c1e48f026fd323c66cbdd..d585664458fa76c433af9ec210c9c63c27d42db1 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/service.js +++ b/bigbluebutton-html5/imports/ui/components/audio/service.js @@ -8,7 +8,7 @@ const init = (messages) => { if (AudioManager.initialized) return; const meetingId = Auth.meetingID; const userId = Auth.userID; - const sessionToken = Auth.sessionToken; + const { sessionToken } = Auth; const User = Users.findOne({ userId }); const username = User.name; const Meeting = Meetings.findOne({ meetingId: User.meetingId }); @@ -53,4 +53,5 @@ export default { outputDeviceId: () => AudioManager.outputDeviceId, isEchoTest: () => AudioManager.isEchoTest, error: () => AudioManager.error, + isUserModerator: () => Users.findOne({ userId: Auth.userID }).moderator, }; diff --git a/bigbluebutton-html5/imports/ui/components/dropdown/list/component.jsx b/bigbluebutton-html5/imports/ui/components/dropdown/list/component.jsx old mode 100644 new mode 100755 index 6d824b289e6200047af5f5052f9b0606b8cf674b..c5d8cc762054fc9ef9d994b7fd3d74a4a7802c82 --- a/bigbluebutton-html5/imports/ui/components/dropdown/list/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/dropdown/list/component.jsx @@ -22,6 +22,12 @@ const propTypes = { } return true; }).isRequired, + + horizontal: PropTypes.bool, +}; + +const defaultProps = { + horizontal: false, }; export default class DropdownList extends Component { @@ -59,8 +65,17 @@ export default class DropdownList extends Component { handleItemKeyDown(event, callback) { const { getDropdownMenuParent } = this.props; let nextFocusedIndex = this.state.focusedIndex; - - if (KEY_CODES.ARROW_UP === event.which) { + const isHorizontal = this.props.horizontal; + const navigationKeys = { + previous: KEY_CODES[`ARROW_${isHorizontal ? 'LEFT' : 'UP'}`], + next: KEY_CODES[`ARROW_${isHorizontal ? 'RIGHT' : 'DOWN'}`], + click: isHorizontal ? [KEY_CODES.ENTER] : [KEY_CODES.ENTER, KEY_CODES.ARROW_RIGHT], + close: [KEY_CODES.ESCAPE, + KEY_CODES.TAB, + KEY_CODES[`ARROW_${isHorizontal ? 'DOWN' : 'LEFT'}`]], + }; + + if (navigationKeys.previous === event.which) { event.stopPropagation(); nextFocusedIndex -= 1; @@ -72,7 +87,7 @@ export default class DropdownList extends Component { } } - if ([KEY_CODES.ARROW_DOWN].includes(event.keyCode)) { + if ([navigationKeys.next].includes(event.keyCode)) { event.stopPropagation(); nextFocusedIndex += 1; @@ -82,12 +97,12 @@ export default class DropdownList extends Component { } } - if ([KEY_CODES.ENTER, KEY_CODES.ARROW_RIGHT].includes(event.keyCode)) { + if (navigationKeys.click.includes(event.keyCode)) { event.stopPropagation(); document.activeElement.firstChild.click(); } - if ([KEY_CODES.ESCAPE, KEY_CODES.TAB, KEY_CODES.ARROW_LEFT].includes(event.keyCode)) { + if (navigationKeys.close.includes(event.keyCode)) { const { dropdownHide } = this.props; event.stopPropagation(); @@ -151,10 +166,11 @@ export default class DropdownList extends Component { }); }); + const listDirection = this.props.horizontal ? styles.horizontalList : styles.verticalList; return ( <ul style={style} - className={cx(styles.list, className)} + className={cx(listDirection, className)} role="menu" ref={(menu) => { this._menu = menu; @@ -168,3 +184,4 @@ export default class DropdownList extends Component { } DropdownList.propTypes = propTypes; +DropdownList.defaultProps = defaultProps; diff --git a/bigbluebutton-html5/imports/ui/components/dropdown/list/styles.scss b/bigbluebutton-html5/imports/ui/components/dropdown/list/styles.scss old mode 100644 new mode 100755 index 17a7005996f69bf55b13c85011a7871b26783b00..2715196f05c1619b4487ffa9eaafbbc868d79e24 --- a/bigbluebutton-html5/imports/ui/components/dropdown/list/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/dropdown/list/styles.scss @@ -3,7 +3,7 @@ $item-bg-focus: $color-blue-lightest; $item-border-focus: $color-blue-lighter; -.list { +%list { list-style: none; font-size: $font-size-base; margin: 0; @@ -12,7 +12,6 @@ $item-border-focus: $color-blue-lighter; color: $color-gray-dark; padding: ($line-height-computed / 2); display: flex; - flex-direction: column; @include mq($small-only) { font-size: $font-size-large * 1.1; @@ -20,6 +19,20 @@ $item-border-focus: $color-blue-lighter; } } +.verticalList { + @extend %list; + flex-direction: column; +} + +.horizontalList { + @extend %list; + padding: 0; + flex-direction: row; + @include mq($small-only) { + flex-direction: column; + } +} + .title { @extend %text-elipsis; color: $color-gray; @@ -42,7 +55,6 @@ $item-border-focus: $color-blue-lighter; display: flex; flex: 1 1 100%; padding: ($line-height-computed / 3) 0; - padding-left: ($line-height-computed / 3); &:focus { outline: none; diff --git a/bigbluebutton-html5/imports/ui/components/logout-confirmation/component.jsx b/bigbluebutton-html5/imports/ui/components/logout-confirmation/component.jsx index d1aa2092a4f88652d498ccf942fc6fb8a620b39e..bb0065c612ac514a9e1d541563400b33c9e04a51 100644 --- a/bigbluebutton-html5/imports/ui/components/logout-confirmation/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/logout-confirmation/component.jsx @@ -44,6 +44,10 @@ const intlMessages = defineMessages({ id: 'app.leaveConfirmation.endMeetingLabel', description: 'End meeting button label', }, + endMeetingAriaLabel: { + id: 'app.leaveConfirmation.endMeetingAriaLabel', + description: 'End meeting button aria label', + }, endMeetingDesc: { id: 'app.leaveConfirmation.endMeetingDesc', description: 'adds context to end meeting option', diff --git a/bigbluebutton-html5/imports/ui/components/media/container.jsx b/bigbluebutton-html5/imports/ui/components/media/container.jsx index b560609f9dae5d3783af1d4241170344e1fbc507..36fcea28490a1da7b1bc22744aba337eced1d055 100644 --- a/bigbluebutton-html5/imports/ui/components/media/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/media/container.jsx @@ -3,10 +3,12 @@ import { withTracker } from 'meteor/react-meteor-data'; import Settings from '/imports/ui/services/settings'; import Meetings from '/imports/api/meetings/'; import Auth from '/imports/ui/services/auth'; +import { defineMessages, injectIntl } from 'react-intl'; +import { notify } from '/imports/ui/services/notification'; import Media from './component'; import MediaService from './service'; import PresentationAreaContainer from '../presentation/container'; -import VideoDockContainer from '../video-dock/container'; +import VideoProviderContainer from '../video-provider/container'; import ScreenshareContainer from '../screenshare/container'; import DefaultContent from '../presentation/default-content/component'; @@ -16,6 +18,17 @@ const defaultProps = { defaultContent: <DefaultContent />, }; +const intlMessages = defineMessages({ + screenshareStarted: { + id: 'app.media.screenshare.start', + description: 'toast to show when a screenshare has started', + }, + screenshareEnded: { + id: 'app.media.screenshare.end', + description: 'toast to show when a screenshare has ended', + }, +}); + class MediaContainer extends Component { constructor(props) { super(props); @@ -30,6 +43,19 @@ class MediaContainer extends Component { } componentWillReceiveProps(nextProps) { + const { + isScreensharing, + intl, + } = this.props; + + if (isScreensharing !== nextProps.isScreensharing) { + if (nextProps.isScreensharing) { + notify(intl.formatMessage(intlMessages.screenshareStarted), 'info', 'desktop'); + } else { + notify(intl.formatMessage(intlMessages.screenshareEnded), 'info', 'desktop'); + } + } + if (nextProps.current_presentation !== this.props.current_presentation) { if (nextProps.current_presentation) { this.setState({ content: this.props.content }); @@ -54,7 +80,7 @@ MediaContainer.defaultProps = defaultProps; export default withTracker(() => { const { dataSaving } = Settings; - const { viewParticipantsWebcams: viewVideoDock, viewScreenshare } = dataSaving; + const { viewParticipantsWebcams, viewScreenshare } = dataSaving; const data = {}; data.currentPresentation = MediaService.getPresentationInfo(); @@ -72,9 +98,11 @@ export default withTracker(() => { data.content = <ScreenshareContainer />; } - if (MediaService.shouldShowOverlay() && viewVideoDock && !webcamOnlyModerator) { - data.overlay = <VideoDockContainer />; + if (MediaService.shouldShowOverlay() && viewParticipantsWebcams && !webcamOnlyModerator) { + data.overlay = <VideoProviderContainer />; } + data.isScreensharing = MediaService.isVideoBroadcasting(); + return data; -})(MediaContainer); +})(injectIntl(MediaContainer)); diff --git a/bigbluebutton-html5/imports/ui/components/media/service.js b/bigbluebutton-html5/imports/ui/components/media/service.js index d697ee637f80fdcdd54caa6c530c9a928541373b..ef68ebcae4f2d6622233e140190c836d0ccaa954 100644 --- a/bigbluebutton-html5/imports/ui/components/media/service.js +++ b/bigbluebutton-html5/imports/ui/components/media/service.js @@ -34,4 +34,5 @@ export default { shouldShowScreenshare, shouldShowOverlay, isUserPresenter, + isVideoBroadcasting, }; diff --git a/bigbluebutton-html5/imports/ui/components/modal/base/component.jsx b/bigbluebutton-html5/imports/ui/components/modal/base/component.jsx index ba3170e06f08509762eb71ea3724635f6a8c8ddd..2547e5c75b7b3772bd627a0652bc89ce37a86b5b 100644 --- a/bigbluebutton-html5/imports/ui/components/modal/base/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/modal/base/component.jsx @@ -20,6 +20,8 @@ const defaultProps = { export default class ModalBase extends Component { render() { + if (!this.props.isOpen) return null; + return ( <ReactModal {...this.props}> {this.props.children} diff --git a/bigbluebutton-html5/imports/ui/components/polling/component.jsx b/bigbluebutton-html5/imports/ui/components/polling/component.jsx index 1ec189e4302a38f3b43c911fdade35a3d3ad15d6..7d18e4b563e9e433a48a925fca210710e6dd32b1 100644 --- a/bigbluebutton-html5/imports/ui/components/polling/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/polling/component.jsx @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import Button from '/imports/ui/components/button/component'; import { defineMessages, injectIntl } from 'react-intl'; import injectWbResizeEvent from '/imports/ui/components/presentation/resize-wrapper/component'; +import Tooltip from '/imports/ui/components/tooltip/component'; import { styles } from './styles.scss'; const intlMessages = defineMessages({ @@ -13,7 +14,6 @@ const intlMessages = defineMessages({ }); class PollingComponent extends Component { - getStyles() { const number = this.props.poll.answers.length + 1; const buttonStyle = @@ -32,7 +32,7 @@ class PollingComponent extends Component { const { intl } = this.props; return ( - <div className={styles.pollingContainer}> + <div className={styles.pollingContainer} role="alert"> <div className={styles.pollingTitle}> <p> {intl.formatMessage(intlMessages.pollingTitleLabel)} @@ -44,15 +44,19 @@ class PollingComponent extends Component { style={calculatedStyles} className={styles.pollButtonWrapper} > - <Button - className={styles.pollingButton} - label={pollAnswer.key} - size="lg" - color="primary" - onClick={() => this.props.handleVote(poll.pollId, pollAnswer)} - aria-labelledby={`pollAnswerLabel${pollAnswer.key}`} - aria-describedby={`pollAnswerDesc${pollAnswer.key}`} - /> + <Tooltip + title={pollAnswer.key} + > + <Button + className={styles.pollingButton} + size="lg" + color="primary" + label={pollAnswer.key} + onClick={() => this.props.handleVote(poll.pollId, pollAnswer)} + aria-labelledby={`pollAnswerLabel${pollAnswer.key}`} + aria-describedby={`pollAnswerDesc${pollAnswer.key}`} + /> + </Tooltip> <div className={styles.hidden} id={`pollAnswerLabel${pollAnswer.key}`} @@ -65,8 +69,7 @@ class PollingComponent extends Component { > {`Select this option to vote for ${pollAnswer.key}`} </div> - </div>), - )} + </div>))} </div> ); } @@ -81,11 +84,9 @@ PollingComponent.propTypes = { handleVote: PropTypes.func.isRequired, poll: PropTypes.shape({ pollId: PropTypes.string.isRequired, - answers: PropTypes.arrayOf( - PropTypes.shape({ - id: PropTypes.number.isRequired, - key: PropTypes.string.isRequired, - }).isRequired, - ).isRequired, + answers: PropTypes.arrayOf(PropTypes.shape({ + id: PropTypes.number.isRequired, + key: PropTypes.string.isRequired, + }).isRequired).isRequired, }).isRequired, }; diff --git a/bigbluebutton-html5/imports/ui/components/polling/styles.scss b/bigbluebutton-html5/imports/ui/components/polling/styles.scss index 02e4abd6fbb4d01f54c19b2b3fdb9db6e756d8ce..d45e769c6daeaaa6407cf85534347887391bf3a0 100644 --- a/bigbluebutton-html5/imports/ui/components/polling/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/polling/styles.scss @@ -13,6 +13,9 @@ .pollingButton { width: 100%; height: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .pollingTitle { diff --git a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/component.jsx b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/component.jsx index 951246efc2e0bfbeb0e687bc133a738ad40567e0..e013c296f6d98fb7f13b08c9e7c097c6f606a8e8 100644 --- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/component.jsx @@ -193,7 +193,7 @@ class PresentationToolbar extends Component { aria-relevant="all" value={currentSlideNum} onChange={actions.skipToSlideHandler} - className={styles.skipSlide} + className={styles.skipSlideSelect} > {this.renderSkipSlideOpts(numberOfSlides)} </select> @@ -208,6 +208,7 @@ class PresentationToolbar extends Component { onClick={actions.nextSlideHandler} label={intl.formatMessage(intlMessages.nextSlideLabel)} hideLabel + className={styles.skipSlide} /> {/* Fit to width button diff --git a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/styles.scss b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/styles.scss index b20f7a7d980388942af52da02b672d8ae0f0f7f6..9a0d494164766ecd883b1ef546c52f78e0162fa4 100644 --- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/styles.scss @@ -33,7 +33,7 @@ $controls-background: #F0F2F6 !default; background-color: $controls-background; color: $controls-color; border-top: 0; - border-right: $color-gray-light 2px solid; + border-right: $color-gray-light $border-size solid; border-bottom: 0; border-left: 0; border-radius: 0; @@ -58,12 +58,14 @@ $controls-background: #F0F2F6 !default; border-right: 0 !important; } +.skipSlide, .prevSlide { - border-radius: 5px 0 0 5px; + border: none !important; } -.skipSlide { +.skipSlideSelect { padding: 0 0.8%; + border-left: $border-size solid $color-gray-light !important; } .zoomSlider { diff --git a/bigbluebutton-html5/imports/ui/components/screenshare/component.jsx b/bigbluebutton-html5/imports/ui/components/screenshare/component.jsx old mode 100644 new mode 100755 index 9845cd3584ca801afea00b49c6a43ce41beb0872..1367fe85538a80313854d0586d4bb6823226f96b --- a/bigbluebutton-html5/imports/ui/components/screenshare/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/screenshare/component.jsx @@ -4,6 +4,14 @@ export default class ScreenshareComponent extends React.Component { componentDidMount() { this.props.presenterScreenshareHasStarted(); } + componentWillReceiveProps(nextProps) { + if (this.props.isPresenter && !nextProps.isPresenter) { + this.props.unshareScreen(); + } + } + componentWillUnmount() { + this.props.presenterScreenshareHasEnded(); + } render() { return ( diff --git a/bigbluebutton-html5/imports/ui/components/screenshare/container.jsx b/bigbluebutton-html5/imports/ui/components/screenshare/container.jsx old mode 100644 new mode 100755 index b10659a3dbb169acb2bc2f5a27f8d35b6001796b..169fd0eb237a5904eae20c6be5a414ef5a7ee59e --- a/bigbluebutton-html5/imports/ui/components/screenshare/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/screenshare/container.jsx @@ -1,14 +1,13 @@ import React from 'react'; import { withTracker } from 'meteor/react-meteor-data'; -import { isVideoBroadcasting, presenterScreenshareHasEnded, +import Users from '/imports/api/users/'; +import Auth from '/imports/ui/services/auth'; +import mapUser from '/imports/ui/services/user/mapUser'; +import { isVideoBroadcasting, presenterScreenshareHasEnded, unshareScreen, presenterScreenshareHasStarted } from './service'; import ScreenshareComponent from './component'; class ScreenshareContainer extends React.Component { - componentWillUnmount() { - this.props.presenterScreenshareHasEnded(); - } - render() { if (this.props.isVideoBroadcasting()) { return <ScreenshareComponent {...this.props} />; @@ -18,9 +17,14 @@ class ScreenshareContainer extends React.Component { } } -export default withTracker(() => ({ - isVideoBroadcasting, - presenterScreenshareHasStarted, - presenterScreenshareHasEnded, -}))(ScreenshareContainer); - +export default withTracker(() => { + const user = Users.findOne({ userId: Auth.userID }); + const MappedUser = mapUser(user); + return { + isPresenter: MappedUser.isPresenter, + unshareScreen, + isVideoBroadcasting, + presenterScreenshareHasStarted, + presenterScreenshareHasEnded, + }; +})(ScreenshareContainer); diff --git a/bigbluebutton-html5/imports/ui/components/settings/component.jsx b/bigbluebutton-html5/imports/ui/components/settings/component.jsx index 130aded284308ecb105be42e4904a1ad4d86e70c..7cb8ac1160129bf710876d4370f92a3f6592e119 100644 --- a/bigbluebutton-html5/imports/ui/components/settings/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/settings/component.jsx @@ -217,7 +217,6 @@ class Settings extends Component { title={intl.formatMessage(intlMessages.SettingsLabel)} confirm={{ callback: () => { - this.props.mountModal(null); if (location.pathname.includes('/users')) { router.push('/'); } @@ -227,9 +226,7 @@ class Settings extends Component { description: intl.formatMessage(intlMessages.SaveLabelDesc), }} dismiss={{ - callback: () => { - Settings.setHtmlFontSize(this.state.saved.application.fontSize); - }, + callback: () => Settings.setHtmlFontSize(this.state.saved.application.fontSize), label: intl.formatMessage(intlMessages.CancelLabel), description: intl.formatMessage(intlMessages.CancelLabelDesc), }} diff --git a/bigbluebutton-html5/imports/ui/components/switch/component.jsx b/bigbluebutton-html5/imports/ui/components/switch/component.jsx index d5862c9fe301b81b709f0fc43b41c4aee54ea613..3f250374d5921c6db2d6226e033d46585999b8a2 100644 --- a/bigbluebutton-html5/imports/ui/components/switch/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/switch/component.jsx @@ -1,17 +1,30 @@ import React from 'react'; import Toggle from 'react-toggle'; import classNames from 'classnames'; +import { defineMessages, injectIntl } from 'react-intl'; -export default class Switch extends Toggle { +const intlMessages = defineMessages({ + on: { + id: 'app.switch.onLabel', + description: 'label for toggle switch on state', + }, + off: { + id: 'app.switch.offLabel', + description: 'label for toggle switch off state', + }, +}); + +class Switch extends Toggle { render() { const { + intl, className, icons: _icons, ariaLabelledBy, ariaDescribedBy, ariaLabel, ariaDesc, - ...inputProps, + ...inputProps } = this.props; const classes = classNames('react-toggle', { @@ -21,33 +34,38 @@ export default class Switch extends Toggle { }, className); return ( - <div className={classes} + <div + className={classes} onClick={this.handleClick} onTouchStart={this.handleTouchStart} onTouchMove={this.handleTouchMove} - onTouchEnd={this.handleTouchEnd}> - <div className='react-toggle-track' aria-hidden="true"> - <div className='react-toggle-track-check'> - ON + onTouchEnd={this.handleTouchEnd} + > + <div className="react-toggle-track" aria-hidden="true"> + <div className="react-toggle-track-check"> + {intl.formatMessage(intlMessages.on)} </div> - <div className='react-toggle-track-x'> - OFF + <div className="react-toggle-track-x"> + {intl.formatMessage(intlMessages.off)} </div> </div> - <div className='react-toggle-thumb' /> + <div className="react-toggle-thumb" /> <input {...inputProps} - ref={ref => { this.input = ref; }} + ref={(ref) => { this.input = ref; }} onFocus={this.handleFocus} onBlur={this.handleBlur} - className='react-toggle-screenreader-only' - type='checkbox' - tabIndex='0' + className="react-toggle-screenreader-only" + type="checkbox" + tabIndex="0" aria-label={ariaLabel} - aria-describedby={ariaDescribedBy}/> - <div id={ariaDescribedBy} hidden>{ariaDesc}</div> + aria-describedby={ariaDescribedBy} + /> + <div id={ariaDescribedBy} hidden>{ariaDesc}</div> </div> ); } -}; +} + +export default injectIntl(Switch); diff --git a/bigbluebutton-html5/imports/ui/components/toast/component.jsx b/bigbluebutton-html5/imports/ui/components/toast/component.jsx index e3adfcdbc02bbc56a6f33fc53e6338d3f7cce786..64b98edd19fd2a8d80ec090b66d0584f4bc492d4 100644 --- a/bigbluebutton-html5/imports/ui/components/toast/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/toast/component.jsx @@ -24,7 +24,7 @@ const defaultIcons = { }; const Toast = ({ icon, type, message }) => ( - <div className={styles[type]}> + <div className={styles[type]} role="alert"> <div className={styles.icon}><Icon iconName={icon || defaultIcons[type]} /></div> <div className={styles.message}> <span>{message}</span> diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/component.jsx index 5eaa767db058da255cf164fcd53b17750d367ebb..96a4f5772c36cebb4acfa16213e8e97faae2df70 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/component.jsx @@ -249,7 +249,7 @@ class UserParticipants extends Component { } <div className={styles.scrollableList} - role="tabpanel" + role="list" tabIndex={0} ref={(ref) => { this.refScrollContainer = ref; }} > diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-list-content/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-list-content/component.jsx index fbb4ab9ced7a1cd199bce5502d7896abdaf39ab6..12ad8b998e9c294e929887f2c85325e40d3b8cb5 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-list-content/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-list-content/component.jsx @@ -241,6 +241,7 @@ class UserListContent extends Component { intl={intl} meeting={meeting} isMeetingLocked={isMeetingLocked} + userAriaLabel={userAriaLabel} />} {<UserIcons user={user} diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-name/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-name/component.jsx index 4b67eb7770f3f9b9653b7f7449166c0190beaa86..f4554ac11a64a135ff50b16e3a04d9d1502c8bfc 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-name/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-name/component.jsx @@ -4,7 +4,6 @@ import { defineMessages } from 'react-intl'; import Icon from '/imports/ui/components/icon/component'; import { styles } from './styles'; - const messages = defineMessages({ presenter: { id: 'app.userList.presenter', @@ -31,6 +30,7 @@ const messages = defineMessages({ description: 'aria label for each user in the userlist', }, }); + const propTypes = { user: PropTypes.shape({ name: PropTypes.string.isRequired, @@ -45,6 +45,7 @@ const propTypes = { }).isRequired, meeting: PropTypes.shape({}).isRequired, isMeetingLocked: PropTypes.func.isRequired, + userAriaLabel: PropTypes.string.isRequired, }; const UserName = (props) => { @@ -54,6 +55,7 @@ const UserName = (props) => { compact, isMeetingLocked, meeting, + userAriaLabel, } = props; if (compact) { @@ -77,9 +79,8 @@ const UserName = (props) => { userNameSub.push(intl.formatMessage(messages.guest)); } - return ( - <div className={styles.userName}> + <div className={styles.userName} role="button" aria-label={userAriaLabel}> <span className={styles.userNameMain}> {user.name} <i>{(user.isCurrent) ? `(${intl.formatMessage(messages.you)})` : ''}</i> </span> diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/component.jsx b/bigbluebutton-html5/imports/ui/components/video-dock/component.jsx deleted file mode 100755 index be743709b97c554b9ae26414a7680b3f5f4f99e5..0000000000000000000000000000000000000000 --- a/bigbluebutton-html5/imports/ui/components/video-dock/component.jsx +++ /dev/null @@ -1,692 +0,0 @@ -import React, { Component } from 'react'; -import { styles } from './styles'; -import { defineMessages, injectIntl } from 'react-intl'; -import VideoService from './service'; -import { log } from '/imports/ui/services/api'; -import { notify } from '/imports/ui/services/notification'; -import { toast } from 'react-toastify'; -import { styles as mediaStyles } from '/imports/ui/components/media/styles'; -import Toast from '/imports/ui/components/toast/component'; -import _ from 'lodash'; - -const intlMessages = defineMessages({ - iceCandidateError: { - id: 'app.video.iceCandidateError', - description: 'Error message for ice candidate fail', - }, - permissionError: { - id: 'app.video.permissionError', - description: 'Error message for webcam permission', - }, - sharingError: { - id: 'app.video.sharingError', - description: 'Error on sharing webcam', - }, - chromeExtensionError: { - id: 'app.video.chromeExtensionError', - description: 'Error message for Chrome Extension not installed', - }, - chromeExtensionErrorLink: { - id: 'app.video.chromeExtensionErrorLink', - description: 'Error message for Chrome Extension not installed', - }, -}); - -const RECONNECT_WAIT_TIME = 5000; -const INITIAL_SHARE_WAIT_TIME = 2000; -const CAMERA_SHARE_FAILED_WAIT_TIME = 10000; - -class VideoElement extends Component { - constructor(props) { - super(props); - } - - render() { - let cssClass; - if (this.props.shared || !this.props.localCamera) { - cssClass = styles.sharedWebcamVideoLocal; - } else { - cssClass = styles.sharedWebcamVideo; - } - return ( - <div className={`${styles.videoContainer} ${cssClass}`} > - { this.props.localCamera ? - <video id="shareWebcam" muted autoPlay playsInline /> - : - <video id={`video-elem-${this.props.videoId}`} autoPlay playsInline /> - } - <div className={styles.videoText}> - <div className={styles.userName}>{this.props.name}</div> - {/* <Button - label="" - className={styles.pauseButton} - icon={'unmute'} - size={'sm'} - circle - onClick={() => {}} - /> */} - </div> - </div> - ); - } - - componentDidMount() { - if (typeof this.props.onMount === 'function' && !this.props.localCamera) { - this.props.onMount(this.props.videoId, false); - } - } -} - -class VideoDock extends Component { - constructor(props) { - super(props); - - // Set a valid bbb-webrtc-sfu application server socket in the settings - this.ws = new ReconnectingWebSocket(Meteor.settings.public.kurento.wsUrl); - this.wsQueue = []; - this.webRtcPeers = {}; - this.reconnectWebcam = false; - this.reconnectList = []; - this.cameraTimeouts = {}; - - this.state = { - videos: {}, - sharedWebcam: false, - userNames: {}, - }; - - this.unshareWebcam = this.unshareWebcam.bind(this); - this.shareWebcam = this.shareWebcam.bind(this); - - this.onWsOpen = this.onWsOpen.bind(this); - this.onWsClose = this.onWsClose.bind(this); - this.onWsMessage = this.onWsMessage.bind(this); - } - - setupReconnectVideos() { - for (id in this.webRtcPeers) { - this.disconnected(id); - this.stop(id); - } - } - - reconnectVideos() { - for (i in this.reconnectList) { - const id = this.reconnectList[i]; - - // TODO: base this on BBB API users instead of using memory - if (id != this.myId) { - setTimeout(() => { - log('debug', ` [camera] Trying to reconnect camera ${id}`); - this.start(id, false); - }, RECONNECT_WAIT_TIME); - } - } - - if (this.reconnectWebcam) { - log('debug', ` [camera] Trying to re-share ${this.myId} after reconnect.`); - this.start(this.myId, true); - } - - this.reconnectWebcam = false; - this.reconnectList = []; - } - - componentDidMount() { - const ws = this.ws; - const { users, userId } = this.props; - - users.forEach((user) => { - if (user.has_stream && user.userId !== userId) { - // FIX: Really ugly hack, but sometimes the ICE candidates aren't - // generated properly when we send videos right after componentDidMount - setTimeout(() => { - this.start(user.userId, false); - }, INITIAL_SHARE_WAIT_TIME); - } - }); - - document.addEventListener('joinVideo', this.shareWebcam.bind(this)); // TODO find a better way to do this - document.addEventListener('exitVideo', this.unshareWebcam.bind(this)); - document.addEventListener('installChromeExtension', this.installChromeExtension.bind(this)); - - window.addEventListener('resize', this.adjustVideos); - window.addEventListener('orientationchange', this.adjustVideos); - - ws.addEventListener('message', this.onWsMessage); - } - - componentWillMount() { - this.ws.addEventListener('open', this.onWsOpen); - this.ws.addEventListener('close', this.onWsClose); - - window.addEventListener('online', this.ws.open.bind(this.ws)); - window.addEventListener('offline', this.onWsClose); - } - - componentWillUpdate(nextProps) { - const { isLocked } = nextProps; - if (isLocked && VideoService.isConnected()) { - this.unshareWebcam(); - } - } - - componentWillUnmount() { - document.removeEventListener('joinVideo', this.shareWebcam); - document.removeEventListener('exitVideo', this.unshareWebcam); - document.removeEventListener('installChromeExtension', this.installChromeExtension); - window.removeEventListener('resize', this.adjustVideos); - window.removeEventListener('orientationchange', this.adjustVideos); - - this.ws.removeEventListener('message', this.onWsMessage); - this.ws.removeEventListener('open', this.onWsOpen); - this.ws.removeEventListener('close', this.onWsClose); - - window.removeEventListener('online', this.ws.open.bind(this.ws)); - window.removeEventListener('offline', this.onWsClose); - - // Unshare user webcam - if (this.state.sharedWebcam) { - this.unshareWebcam(); - this.stop(this.props.userId); - } - - Object.keys(this.webRtcPeers).forEach((id) => { - this.destroyWebRTCPeer(id); - }); - // Close websocket connection to prevent multiple reconnects from happening - this.ws.close(); - } - - adjustVideos() { - setTimeout(() => { - window.adjustVideos('webcamArea', true, mediaStyles.moreThan4Videos, mediaStyles.container, mediaStyles.overlayWrapper, 'presentationAreaData', 'screenshareVideo'); - }, 0); - } - - onWsOpen() { - log('debug', '------ Websocket connection opened.'); - - // -- Resend queued messages that happened when socket was not connected - while (this.wsQueue.length > 0) { - this.sendMessage(this.wsQueue.pop()); - } - - this.reconnectVideos(); - } - - onWsClose(error) { - log('debug', '------ Websocket connection closed.'); - - this.setupReconnectVideos(); - } - - onWsMessage(msg) { - const { intl } = this.props; - const parsedMessage = JSON.parse(msg.data); - - console.log('Received message new ws message: '); - console.log(parsedMessage); - - switch (parsedMessage.id) { - case 'startResponse': - this.startResponse(parsedMessage); - break; - - case 'playStart': - this.handlePlayStart(parsedMessage); - break; - - case 'playStop': - this.handlePlayStop(parsedMessage); - - break; - - case 'iceCandidate': - const webRtcPeer = this.webRtcPeers[parsedMessage.cameraId]; - - if (webRtcPeer) { - if (webRtcPeer.didSDPAnswered) { - webRtcPeer.addIceCandidate(parsedMessage.candidate, (err) => { - if (err) { - this.notifyError(intl.formatMessage(intlMessages.iceCandidateError)); - return log('error', `Error adding candidate: ${err}`); - } - }); - } else { - webRtcPeer.iceQueue.push(parsedMessage.candidate); - } - } else { - log('error', ' [ICE] Message arrived after the peer was already thrown out, discarding it...'); - } - break; - - case 'error': - default: - this.handleError(parsedMessage); - break; - } - } - - start(id, shareWebcam) { - const { users } = this.props; - const that = this; - const { intl } = this.props; - - console.log(`Starting video call for video: ${id} with ${shareWebcam}`); - const userNames = this.state.userNames; - users.forEach((user) => { - if (user.userId === id) { - userNames[id] = user.name; - } - }); - this.setState({ userNames }); - - this.cameraTimeouts[id] = setTimeout(() => { - log('error', `Camera share has not suceeded in ${CAMERA_SHARE_FAILED_WAIT_TIME}`); - if (that.myId == id) { - that.notifyError(intl.formatMessage(intlMessages.sharingError)); - that.unshareWebcam(); - } else { - that.stop(id); - that.start(id, shareWebcam); - } - }, CAMERA_SHARE_FAILED_WAIT_TIME); - - if (shareWebcam) { - VideoService.joiningVideo(); - this.setState({ sharedWebcam: true }); - this.myId = id; - this.initWebRTC(id, true); - } else { - // initWebRTC with shareWebcam false will be called after react mounts the element - this.createVideoTag(id); - } - } - - initWebRTC(id, shareWebcam) { - const that = this; - const { intl } = this.props; - - const onIceCandidate = function (candidate) { - const message = { - type: 'video', - role: shareWebcam ? 'share' : 'viewer', - id: 'onIceCandidate', - candidate, - cameraId: id, - }; - that.sendMessage(message); - }; - - let videoConstraints = {}; - if (navigator.userAgent.match(/Version\/[\d\.]+.*Safari/)) { - // Custom constraints for Safari - videoConstraints = { - width: { - min: 320, - max: 640, - }, - height: { - min: 240, - max: 480, - }, - }; - } else { - videoConstraints = { - width: { - min: 320, - ideal: 640, - }, - height: { - min: 240, - ideal: 480, - }, - frameRate: { - min: 5, - ideal: 10, - }, - }; - } - - const options = { - mediaConstraints: { - audio: false, - video: videoConstraints, - }, - onicecandidate: onIceCandidate, - }; - - let peerObj; - if (shareWebcam) { - options.localVideo = document.getElementById('shareWebcam'); - peerObj = kurentoUtils.WebRtcPeer.WebRtcPeerSendonly; - } else { - peerObj = kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly; - options.remoteVideo = document.getElementById(`video-elem-${id}`); - } - - const webRtcPeer = new peerObj(options, function (error) { - if (error) { - log('error', ' WebRTC peerObj create error'); - log('error', error); - that.notifyError(intl.formatMessage(intlMessages.permissionError)); - /* This notification error is displayed considering kurento-utils - * returned the error 'The request is not allowed by the user agent - * or the platform in the current context.', but there are other - * errors that could be returned. */ - - that.destroyWebRTCPeer(id); - that.destroyVideoTag(id); - VideoService.resetState(); - return log('error', error); - } - - this.didSDPAnswered = false; - this.iceQueue = []; - - that.webRtcPeers[id] = webRtcPeer; - if (shareWebcam) { - that.sharedWebcam = webRtcPeer; - } - - this.generateOffer((error, offerSdp) => { - if (error) { - log('error', ' WebRtc generate offer error'); - - that.destroyWebRTCPeer(id); - that.destroyVideoTag(id); - - return log('error', error); - } - - console.log(`Invoking SDP offer callback function ${location.host}`); - const message = { - type: 'video', - role: shareWebcam ? 'share' : 'viewer', - id: 'start', - sdpOffer: offerSdp, - cameraId: id, - }; - that.sendMessage(message); - }); - while (this.iceQueue.length) { - const candidate = this.iceQueue.shift(); - this.addIceCandidate(candidate, (err) => { - if (err) { - this.notifyError(intl.formatMessage(intlMessages.iceCandidateError)); - return console.error(`Error adding candidate: ${err}`); - } - }); - } - this.didSDPAnswered = true; - }); - } - - disconnected(id) { - if (this.sharedWebcam) { - log('debug', ' [camera] Webcam disconnected, will try re-share webcam later.'); - this.reconnectWebcam = true; - } else { - this.reconnectList.push(id); - - log('debug', ` [camera] ${id} disconnected, will try re-subscribe later.`); - } - } - - stop(id) { - const { userId } = this.props; - this.sendMessage({ - type: 'video', - role: id == userId ? 'share' : 'viewer', - id: 'stop', - cameraId: id, - }); - - if (id === userId) { - VideoService.exitedVideo(); - } - - this.destroyWebRTCPeer(id); - this.destroyVideoTag(id); - } - - createVideoTag(id) { - const videos = this.state.videos; - - videos[id] = true; - this.setState({ videos }); - } - - destroyVideoTag(id) { - const { videos, userNames } = this.state; - - this.setState({ - videos: _.omit(videos, id), - userNames: _.omit(userNames, id), - }); - if (id == this.myId) { - this.setState({ sharedWebcam: false }); - } - } - - destroyWebRTCPeer(id) { - const webRtcPeer = this.webRtcPeers[id]; - - // Clear the shared camera fail timeout when destroying - clearTimeout(this.cameraTimeouts[id]); - this.cameraTimeouts[id] = null; - - if (webRtcPeer) { - log('info', 'Stopping WebRTC peer'); - - if (id == this.myId && this.sharedWebcam) { - this.sharedWebcam.dispose(); - this.sharedWebcam = null; - } - - webRtcPeer.dispose(); - delete this.webRtcPeers[id]; - } else { - log('info', 'No WebRTC peer to stop (not an error)'); - } - } - - shareWebcam() { - const { users, userId } = this.props; - - if (this.connectedToMediaServer()) { - this.start(userId, true); - } else { - log('error', 'Not connected to media server'); - } - } - - unshareWebcam() { - log('info', 'Unsharing webcam'); - const { userId } = this.props; - VideoService.sendUserUnshareWebcam(userId); - this.stop(userId); - } - - startResponse(message) { - const id = message.cameraId; - const webRtcPeer = this.webRtcPeers[id]; - - if (message.sdpAnswer == null) { - return log('debug', 'Null sdp answer. Camera unplugged?'); - } - - if (webRtcPeer == null) { - return log('debug', 'Null webrtc peer ????'); - } - - log('info', 'SDP answer received from server. Processing ...'); - - webRtcPeer.processAnswer(message.sdpAnswer, (error) => { - if (error) { - return log('error', error); - } - - if (message.cameraId == this.props.userId) { - log('info', 'camera id sendusershare ', id); - VideoService.sendUserShareWebcam(id); - } - }); - } - - sendMessage(message) { - const ws = this.ws; - - if (this.connectedToMediaServer()) { - const jsonMessage = JSON.stringify(message); - console.log(`Sending message: ${jsonMessage}`); - ws.send(jsonMessage, (error) => { - if (error) { - console.error(`client: Websocket error "${error}" on message "${jsonMessage.id}"`); - } - }); - } else { - // No need to queue video stop messages - if (message.id != 'stop') { - this.wsQueue.push(message); - } - } - } - - connectedToMediaServer() { - return this.ws.readyState === WebSocket.OPEN; - } - - connectionStatus() { - return this.ws.readyState; - } - - handlePlayStop(message) { - log('info', 'Handle play stop <--------------------'); - log('error', message); - - if (message.cameraId == this.props.userId) { - this.unshareWebcam(); - } else { - this.stop(message.cameraId); - } - } - - handlePlayStart(message) { - log('info', 'Handle play start <==================='); - - // Clear camera shared timeout when camera succesfully starts - clearTimeout(this.cameraTimeouts[message.cameraId]); - this.cameraTimeouts[message.cameraId] = null; - - if (message.cameraId == this.props.userId) { - VideoService.joinedVideo(); - } - } - - handleError(message) { - const { intl, userId } = this.props; - - if (message.cameraId == userId) { - this.notifyError(intl.formatMessage(intlMessages.sharingError)); - this.unshareWebcam(); - } else { - this.stop(message.cameraId); - } - - console.error(' Handle error --------------------->'); - log('debug', message.message); - } - - notifyError(message) { - notify(message, 'error', 'video'); - } - - installChromeExtension() { - const { intl } = this.props; - const CHROME_EXTENSION_LINK = Meteor.settings.public.kurento.chromeExtensionLink; - - this.notifyError(<div> - {intl.formatMessage(intlMessages.chromeExtensionError)}{' '} - <a href={CHROME_EXTENSION_LINK} target="_blank"> - {intl.formatMessage(intlMessages.chromeExtensionErrorLink)} - </a> - </div>); - } - - componentDidUpdate() { - this.adjustVideos(); - } - - render() { - return ( - <div className={styles.videoDock}> - <div id="webcamArea" className={styles.webcamArea}> - {Object.keys(this.state.videos).map(id => ( - <VideoElement videoId={id} key={id} name={this.state.userNames[id]} localCamera={false} onMount={this.initWebRTC.bind(this)} /> - ))} - <VideoElement shared={this.state.sharedWebcam} name={this.state.userNames[this.myId]} localCamera /> - </div> - </div> - ); - } - - shouldComponentUpdate(nextProps, nextState) { - const { userId } = this.props; - const currentUsers = this.props.users || {}; - const nextUsers = nextProps.users; - - const users = {}; - const present = {}; - - if (!currentUsers) { return false; } - - // Map user objectos to an object in the form {userId: has_stream} - currentUsers.forEach((user) => { - users[user.userId] = user.has_stream; - }); - - // Keep instances where the flag has changed or next user adds it - nextUsers.forEach((user) => { - const id = user.userId; - // The case when a user exists and stream status has not changed - if (users[id] === user.has_stream) { - delete users[id]; - } else { - // Case when a user has been added to the list - users[id] = user.has_stream; - } - - // Mark the ids which are present in nextUsers - present[id] = true; - }); - - const userIds = Object.keys(users); - - for (let i = 0; i < userIds.length; i++) { - const id = userIds[i]; - - // If a userId is not present in nextUsers let's stop it - if (!present[id]) { - this.stop(id); - continue; - } - - console.log(`User ${users[id] ? '' : 'un'}shared webcam ${id}`); - - // If a user stream is true, changed and was shared by other - // user we'll start it. If it is false and changed we stop it - if (users[id]) { - if (userId !== id) { - this.start(id, false); - } - } else { - this.stop(id); - } - } - return true; - } -} - -export default injectIntl(VideoDock); diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/component.jsx b/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/component.jsx deleted file mode 100644 index 5f1dab02b4e26a4908c623fbd823f7bbe1cda75c..0000000000000000000000000000000000000000 --- a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/component.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import Button from '/imports/ui/components/button/component'; -import { defineMessages, injectIntl, intlShape } from 'react-intl'; -import { styles } from './styles'; - -const intlMessages = defineMessages({ - joinVideo: { - id: 'app.video.joinVideo', - description: 'Join video button label', - }, - leaveVideo: { - id: 'app.video.leaveVideo', - description: 'Leave video button label', - }, -}); - -class JoinVideoOptions extends React.Component { - render() { - const { - intl, - isWaitingResponse, - isConnected, - isSharingVideo, - handleJoinVideo, - handleCloseVideo, - isLocked, - enableShare, - } = this.props; - - if (isSharingVideo) { - return ( - <span className={styles.container}> - <Button - onClick={handleCloseVideo} - label={intl.formatMessage(intlMessages.leaveVideo)} - hideLabel - aria-label={intl.formatMessage(intlMessages.leaveVideo)} - color="danger" - icon="video_off" - size="lg" - circle - disabled={isLocked || isWaitingResponse} - /> - </span> - ); - } - - return ( - <span className={styles.container}> - <Button - className={styles.button} - onClick={handleJoinVideo} - label={intl.formatMessage(intlMessages.joinVideo)} - hideLabel - aria-label={intl.formatMessage(intlMessages.joinVideo)} - color="primary" - icon="video" - size="lg" - circle - disabled={isLocked || isWaitingResponse || (!isSharingVideo && isConnected) || enableShare} - /> - </span> - ); - } -} - -export default injectIntl(JoinVideoOptions); diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/container.jsx b/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/container.jsx deleted file mode 100644 index 5e598eabac56f87502d2f7f1919a9e59c5052df6..0000000000000000000000000000000000000000 --- a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/container.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import { withTracker } from 'meteor/react-meteor-data'; -import Settings from '/imports/ui/services/settings'; -import mapUser from '/imports/ui/services/user/mapUser'; -import Auth from '/imports/ui/services/auth'; -import Meetings from '/imports/api/meetings/'; -import Users from '/imports/api/users/'; -import JoinVideoOptions from './component'; -import VideoMenuService from './service'; -import VideoService from '../service'; - -const JoinVideoOptionsContainer = props => <JoinVideoOptions {...props} />; - -export default withTracker((params) => { - const isSharingVideo = VideoMenuService.isSharingVideo(); - const isWaitingResponse = VideoService.isWaitingResponse(); - const isConnected = VideoService.isConnected(); - - const videoSettings = Settings.dataSaving; - const enableShare = !videoSettings.viewParticipantsWebcams; - const meeting = Meetings.findOne({ meetingId: Auth.meetingID }); - const LockCam = meeting.lockSettingsProp ? meeting.lockSettingsProp.disableCam : false; - const webcamOnlyModerator = meeting.usersProp.webcamsOnlyForModerator; - - const user = Users.findOne({ userId: Auth.userID }); - const userLocked = mapUser(user).isLocked; - - return { - isSharingVideo, - isWaitingResponse, - isConnected, - enableShare, - handleJoinVideo: params.handleJoinVideo, - handleCloseVideo: params.handleCloseVideo, - isLocked: (LockCam && userLocked) || webcamOnlyModerator, - }; -})(JoinVideoOptionsContainer); diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/service.js b/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/service.js deleted file mode 100644 index 92a58cd21afc50dac0196a3d19d325fea668e125..0000000000000000000000000000000000000000 --- a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/service.js +++ /dev/null @@ -1,12 +0,0 @@ -import Users from '/imports/api/users'; -import Auth from '/imports/ui/services/auth/index'; - -const isSharingVideo = () => { - const userId = Auth.userID; - const user = Users.findOne({ userId: userId }); - return user.has_stream ? true : false; -}; - -export default { - isSharingVideo -}; diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/styles.scss b/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/styles.scss deleted file mode 100644 index d96d5b04cb239b7ba3059b86aaa292c89392e84d..0000000000000000000000000000000000000000 --- a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/styles.scss +++ /dev/null @@ -1,15 +0,0 @@ -.container { - - span:first-child{ - box-shadow: 0 2px 5px 0 rgb(0, 0, 0); - } - -} - -.button { - - &:focus { - outline: none !important; - } - -} diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/component.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/component.jsx new file mode 100644 index 0000000000000000000000000000000000000000..3c26359ea1570b7f9c9a7fa8ec19264948293a25 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/video-provider/component.jsx @@ -0,0 +1,446 @@ +import React, { Component } from 'react'; +import { styles } from './styles'; +import { defineMessages, injectIntl } from 'react-intl'; +import { log } from '/imports/ui/services/api'; +import { notify } from '/imports/ui/services/notification'; +import { toast } from 'react-toastify'; +import Toast from '/imports/ui/components/toast/component'; +import _ from 'lodash'; + +import VideoService from './service'; +import VideoDockContainer from './video-dock/container'; + +const intlMessages = defineMessages({ + iceCandidateError: { + id: 'app.video.iceCandidateError', + description: 'Error message for ice candidate fail', + }, + permissionError: { + id: 'app.video.permissionError', + description: 'Error message for webcam permission', + }, + sharingError: { + id: 'app.video.sharingError', + description: 'Error on sharing webcam', + }, + chromeExtensionError: { + id: 'app.video.chromeExtensionError', + description: 'Error message for Chrome Extension not installed', + }, + chromeExtensionErrorLink: { + id: 'app.video.chromeExtensionErrorLink', + description: 'Error message for Chrome Extension not installed', + }, +}); + +const RECONNECT_WAIT_TIME = 5000; +const CAMERA_SHARE_FAILED_WAIT_TIME = 10000; + +class VideoProvider extends Component { + constructor(props) { + super(props); + + this.state = { + sharedWebcam: false, + socketOpen: false, + }; + + // Set a valid bbb-webrtc-sfu application server socket in the settings + this.ws = new ReconnectingWebSocket(Meteor.settings.public.kurento.wsUrl); + this.wsQueue = []; + + this.reconnectWebcam = false; + this.cameraTimeouts = {}; + this.webRtcPeers = {}; + + this.onWsOpen = this.onWsOpen.bind(this); + this.onWsClose = this.onWsClose.bind(this); + this.onWsMessage = this.onWsMessage.bind(this); + + this.unshareWebcam = this.unshareWebcam.bind(this); + this.shareWebcam = this.shareWebcam.bind(this); + } + + componentWillMount() { + this.ws.addEventListener('open', this.onWsOpen); + this.ws.addEventListener('close', this.onWsClose); + + window.addEventListener('online', this.ws.open.bind(this.ws)); + window.addEventListener('offline', this.onWsClose); + } + + componentDidMount() { + document.addEventListener('joinVideo', this.shareWebcam.bind(this)); // TODO find a better way to do this + document.addEventListener('exitVideo', this.unshareWebcam.bind(this)); + + this.ws.addEventListener('message', this.onWsMessage); + } + + componentWillUnmount() { + document.removeEventListener('joinVideo', this.shareWebcam); + document.removeEventListener('exitVideo', this.unshareWebcam); + + this.ws.removeEventListener('message', this.onWsMessage); + this.ws.removeEventListener('open', this.onWsOpen); + this.ws.removeEventListener('close', this.onWsClose); + + window.removeEventListener('online', this.ws.open.bind(this.ws)); + window.removeEventListener('offline', this.onWsClose); + + // Unshare user webcam + if (this.state.sharedWebcam) { + this.unshareWebcam(); + this.stop(this.props.userId); + } + + Object.keys(this.webRtcPeers).forEach((id) => { + this.destroyWebRTCPeer(id); + }); + + // Close websocket connection to prevent multiple reconnects from happening + this.ws.close(); + } + + onWsOpen() { + log('debug', '------ Websocket connection opened.'); + + // -- Resend queued messages that happened when socket was not connected + while (this.wsQueue.length > 0) { + this.sendMessage(this.wsQueue.pop()); + } + + this.setState({ socketOpen: true }); + } + + onWsClose(error) { + log('debug', '------ Websocket connection closed.'); + + this.unshareWebcam(); + VideoService.exitedVideo(); + + this.setState({ socketOpen: false }); + } + + disconnected(id) { + this.reconnectList.push(id); + + log('debug', ` [camera] ${id} disconnected, will try re-subscribe later.`); + } + + onWsMessage(msg) { + const { intl } = this.props; + const parsedMessage = JSON.parse(msg.data); + + console.log('Received message new ws message: '); + console.log(parsedMessage); + + switch (parsedMessage.id) { + case 'startResponse': + this.startResponse(parsedMessage); + break; + + case 'playStart': + this.handlePlayStart(parsedMessage); + break; + + case 'playStop': + this.handlePlayStop(parsedMessage); + + break; + + case 'iceCandidate': + this.handleIceCandidate(parsedMessage); + break; + + case 'error': + default: + this.handleError(parsedMessage); + break; + } + } + + sendMessage(message) { + const ws = this.ws; + + if (this.connectedToMediaServer()) { + const jsonMessage = JSON.stringify(message); + console.log(`Sending message: ${jsonMessage}`); + ws.send(jsonMessage, (error) => { + if (error) { + console.error(`client: Websocket error "${error}" on message "${jsonMessage.id}"`); + } + }); + } else { + // No need to queue video stop messages + if (message.id != 'stop') { + this.wsQueue.push(message); + } + } + } + + connectedToMediaServer() { + return this.ws.readyState === WebSocket.OPEN; + } + + startResponse(message) { + const id = message.cameraId; + const webRtcPeer = this.webRtcPeers[id]; + + if (message.sdpAnswer == null || webRtcPeer == null) { + return log('debug', 'Null sdp answer or null webrtcpeer'); + } + + log('info', 'SDP answer received from server. Processing ...'); + + webRtcPeer.processAnswer(message.sdpAnswer, (error) => { + if (error) { + return log('error', error); + } + + if (message.cameraId == this.props.userId) { + log('info', 'camera id sendusershare ', id); + VideoService.sendUserShareWebcam(id); + } + }); + } + + handleIceCandidate(message) { + const { intl } = this.props; + const webRtcPeer = this.webRtcPeers[message.cameraId]; + + if (webRtcPeer) { + if (webRtcPeer.didSDPAnswered) { + webRtcPeer.addIceCandidate(message.candidate, (err) => { + if (err) { + this.notifyError(intl.formatMessage(intlMessages.iceCandidateError)); + return log('error', `Error adding candidate: ${err}`); + } + }); + } else { + webRtcPeer.iceQueue.push(message.candidate); + } + } else { + log('error', ' [ICE] Message arrived after the peer was already thrown out, discarding it...'); + } + } + + destroyWebRTCPeer(id) { + const webRtcPeer = this.webRtcPeers[id]; + + // Clear the shared camera fail timeout when destroying + clearTimeout(this.cameraTimeouts[id]); + this.cameraTimeouts[id] = null; + + if (webRtcPeer) { + log('info', 'Stopping WebRTC peer'); + + if (id == this.props.userId && this.state.sharedWebcam) { + this.setState({ sharedWebcam: false }); + } + + webRtcPeer.dispose(); + delete this.webRtcPeers[id]; + } else { + log('info', 'No WebRTC peer to stop (not an error)'); + } + } + + initWebRTC(id, shareWebcam, videoOptions, tag) { + const that = this; + const { intl, meetingId } = this.props; + + const options = { + mediaConstraints: { + audio: false, + video: videoOptions, + }, + onicecandidate: this.getOnIceCandidateCallback(id, shareWebcam), + }; + + let peerObj; + if (shareWebcam) { + peerObj = kurentoUtils.WebRtcPeer.WebRtcPeerSendonly; + options.localVideo = tag; + } else { + peerObj = kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly; + options.remoteVideo = tag; + } + + this.cameraTimeouts[id] = setTimeout(() => { + log('error', `Camera share has not suceeded in ${CAMERA_SHARE_FAILED_WAIT_TIME}`); + if (this.props.userId == id) { + this.notifyError(intl.formatMessage(intlMessages.sharingError)); + this.unshareWebcam(); + } else { + this.stop(id); + this.initWebRTC(id, shareWebcam, videoOptions, tag); + } + }, CAMERA_SHARE_FAILED_WAIT_TIME); + + const webRtcPeer = new peerObj(options, function (error) { + if (error) { + log('error', ' WebRTC peerObj create error'); + log('error', error); + that.notifyError(intl.formatMessage(intlMessages.permissionError)); + /* This notification error is displayed considering kurento-utils + * returned the error 'The request is not allowed by the user agent + * or the platform in the current context.', but there are other + * errors that could be returned. */ + + that.destroyWebRTCPeer(id); + + if (shareWebcam) { + VideoService.exitVideo(); + VideoService.exitedVideo(); + that.unshareWebcam(); + } + return log('error', error); + } + + this.didSDPAnswered = false; + this.iceQueue = []; + + that.webRtcPeers[id] = webRtcPeer; + if (shareWebcam) { + that.sharedWebcam = webRtcPeer; + } + + this.generateOffer((error, offerSdp) => { + if (error) { + log('error', ' WebRtc generate offer error'); + + that.destroyWebRTCPeer(id); + return log('error', error); + } + + console.log(`Invoking SDP offer callback function ${location.host}`); + const message = { + type: 'video', + role: shareWebcam ? 'share' : 'viewer', + id: 'start', + sdpOffer: offerSdp, + cameraId: id, + meetingId, + }; + that.sendMessage(message); + }); + while (this.iceQueue.length) { + const candidate = this.iceQueue.shift(); + this.addIceCandidate(candidate, (err) => { + if (err) { + this.notifyError(intl.formatMessage(intlMessages.iceCandidateError)); + return console.error(`Error adding candidate: ${err}`); + } + }); + } + this.didSDPAnswered = true; + }); + } + + getOnIceCandidateCallback(id, shareWebcam) { + const that = this; + + return function (candidate) { + const message = { + type: 'video', + role: shareWebcam ? 'share' : 'viewer', + id: 'onIceCandidate', + candidate, + cameraId: id, + }; + that.sendMessage(message); + }; + } + + stop(id) { + const userId = this.props.userId; + + if (id === userId) { + this.sendMessage({ + type: 'video', + role: id == userId ? 'share' : 'viewer', + id: 'stop', + cameraId: id, + }); + + this.unshareWebcam(); + VideoService.exitedVideo(); + } + + this.destroyWebRTCPeer(id); + } + + handlePlayStop(message) { + const id = message.cameraId; + log('info', 'Handle play stop <--------------------'); + log('error', message); + + this.stop(id); + } + + handlePlayStart(message) { + log('info', 'Handle play start <==================='); + + // Clear camera shared timeout when camera succesfully starts + clearTimeout(this.cameraTimeouts[message.cameraId]); + this.cameraTimeouts[message.cameraId] = null; + + if (message.cameraId == this.props.userId) { + VideoService.joinedVideo(); + } + } + + handleError(message) { + const { intl } = this.props; + const userId = this.props.userId; + + if (message.cameraId == userId) { + this.unshareWebcam(); + this.notifyError(intl.formatMessage(intlMessages.sharingError)); + } else { + this.stop(message.cameraId); + } + + console.error(' Handle error --------------------->'); + log('debug', message.message); + } + + notifyError(message) { + notify(message, 'error', 'video'); + } + + shareWebcam() { + let { intl } = this.props; + log('info', 'Sharing webcam'); + + if (this.connectedToMediaServer()) { + this.setState({ sharedWebcam: true }); + VideoService.joiningVideo(); + } else { + this.notifyError(intl.formatMessage(intlMessages.sharingError)); + } + } + + unshareWebcam() { + log('info', 'Unsharing webcam'); + + this.setState({ ...this.state, sharedWebcam: false }); + + VideoService.sendUserUnshareWebcam(this.props.userId); + } + + render() { + return ( + <VideoDockContainer + onStart={this.initWebRTC.bind(this)} + onStop={this.stop.bind(this)} + sharedWebcam={this.state.sharedWebcam} + onShareWebcam={this.shareWebcam.bind(this)} + socketOpen={this.state.socketOpen} + isLocked={this.props.isLocked} + /> + ); + } +} + +export default injectIntl(VideoProvider); diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/container.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/container.jsx new file mode 100644 index 0000000000000000000000000000000000000000..3826341cd8a30f7e137d8fe45a01bb8996175432 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/video-provider/container.jsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { withTracker } from 'meteor/react-meteor-data'; +import VideoProvider from './component'; +import VideoService from './service'; + +const VideoProviderContainer = ({ children, ...props }) => <VideoProvider {...props}>{children}</VideoProvider>; + +export default withTracker(() => ({ + isLocked: VideoService.isLocked(), + meetingId: VideoService.meetingId(), + userId: VideoService.userId(), +}))(VideoProviderContainer); diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/service.js b/bigbluebutton-html5/imports/ui/components/video-provider/service.js similarity index 73% rename from bigbluebutton-html5/imports/ui/components/video-dock/service.js rename to bigbluebutton-html5/imports/ui/components/video-provider/service.js index c6cdaddd11cca8b10f2504574583d0cfe5b2bccc..5d98a27769bba529c811191894434bcdd63e3b6b 100644 --- a/bigbluebutton-html5/imports/ui/components/video-dock/service.js +++ b/bigbluebutton-html5/imports/ui/components/video-provider/service.js @@ -1,6 +1,7 @@ import { Tracker } from 'meteor/tracker'; import { makeCall } from '/imports/ui/services/api'; import Users from '/imports/api/users'; +import Meetings from '/imports/api/meetings/'; import Auth from '/imports/ui/services/auth'; class VideoService { @@ -33,7 +34,7 @@ class VideoService { } joinVideo() { - var joinVideoEvent = new Event('joinVideo'); + const joinVideoEvent = new Event('joinVideo'); document.dispatchEvent(joinVideoEvent); } @@ -47,7 +48,7 @@ class VideoService { } exitVideo() { - var exitVideoEvent = new Event('exitVideo'); + const exitVideoEvent = new Event('exitVideo'); document.dispatchEvent(exitVideoEvent); } @@ -56,11 +57,6 @@ class VideoService { this.isConnected = false; } - resetState() { - this.isWaitingResponse = false; - this.isConnected = false; - } - sendUserShareWebcam(stream) { makeCall('userShareWebcam', stream); } @@ -74,10 +70,24 @@ class VideoService { return Users.find().fetch(); } + webcamOnlyModerator() { + const m = Meetings.findOne({meetingId: Auth.meetingID}); + return m.usersProp.webcamsOnlyForModerator; + } + + isLocked() { + const m = Meetings.findOne({meetingId: Auth.meetingID}); + return m.lockSettingsProp ? m.lockSettingsProp.disableCam : false; + } + userId() { return Auth.userID; } + meetingId() { + return Auth.meetingID; + } + isConnected() { return this.isConnected; } @@ -94,13 +104,15 @@ export default { exitingVideo: () => videoService.exitingVideo(), exitedVideo: () => videoService.exitedVideo(), getAllUsers: () => videoService.getAllUsers(), + webcamOnlyModerator: () => videoService.webcamOnlyModerator(), + isLocked: () => videoService.isLocked(), isConnected: () => videoService.isConnected, isWaitingResponse: () => videoService.isWaitingResponse, joinVideo: () => videoService.joinVideo(), joiningVideo: () => videoService.joiningVideo(), joinedVideo: () => videoService.joinedVideo(), - resetState: () => videoService.resetState(), - sendUserShareWebcam: (stream) => videoService.sendUserShareWebcam(stream), - sendUserUnshareWebcam: (stream) => videoService.sendUserUnshareWebcam(stream), + sendUserShareWebcam: stream => videoService.sendUserShareWebcam(stream), + sendUserUnshareWebcam: stream => videoService.sendUserUnshareWebcam(stream), userId: () => videoService.userId(), + meetingId: () => videoService.meetingId(), }; diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/styles.scss b/bigbluebutton-html5/imports/ui/components/video-provider/styles.scss similarity index 100% rename from bigbluebutton-html5/imports/ui/components/video-dock/styles.scss rename to bigbluebutton-html5/imports/ui/components/video-provider/styles.scss diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/video-dock/component.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/video-dock/component.jsx new file mode 100755 index 0000000000000000000000000000000000000000..fb9335de360be7b1dd209779410cb1529af75ba4 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-dock/component.jsx @@ -0,0 +1,105 @@ +import React, { Component } from 'react'; +import { styles } from '../styles'; +import { defineMessages, injectIntl } from 'react-intl'; +import { log } from '/imports/ui/services/api'; +import { notify } from '/imports/ui/services/notification'; +import { toast } from 'react-toastify'; +import { styles as mediaStyles } from '/imports/ui/components/media/styles'; +import Toast from '/imports/ui/components/toast/component'; +import _ from 'lodash'; + +import VideoElement from '../video-element/component'; + +const intlMessages = defineMessages({ + chromeExtensionError: { + id: 'app.video.chromeExtensionError', + description: 'Error message for Chrome Extension not installed', + }, + chromeExtensionErrorLink: { + id: 'app.video.chromeExtensionErrorLink', + description: 'Error message for Chrome Extension not installed', + }, +}); + +class VideoDock extends Component { + constructor(props) { + super(props); + + this.state = {}; + } + + componentDidMount() { + const { users, userId } = this.props; + + document.addEventListener('installChromeExtension', this.installChromeExtension.bind(this)); + + window.addEventListener('resize', this.adjustVideos); + window.addEventListener('orientationchange', this.adjustVideos); + } + + componentWillUnmount() { + window.removeEventListener('resize', this.adjustVideos); + window.removeEventListener('orientationchange', this.adjustVideos); + document.removeEventListener('installChromeExtension', this.installChromeExtension.bind(this)); + } + + componentDidUpdate() { + this.adjustVideos(); + } + + notifyError(message) { + notify(message, 'error', 'video'); + } + + installChromeExtension() { + console.log(intlMessages); + const { intl } = this.props; + const CHROME_EXTENSION_LINK = Meteor.settings.public.kurento.chromeExtensionLink; + + this.notifyError(<div> + {intl.formatMessage(intlMessages.chromeExtensionError)}{' '} + <a href={CHROME_EXTENSION_LINK} target="_blank"> + {intl.formatMessage(intlMessages.chromeExtensionErrorLink)} + </a> + </div>); + } + + // TODO + // Find a better place to put this piece of code + adjustVideos() { + setTimeout(() => { + window.adjustVideos('webcamArea', true, mediaStyles.moreThan4Videos, mediaStyles.container, mediaStyles.overlayWrapper, 'presentationAreaData', 'screenshareVideo'); + }, 0); + } + + render() { + if (!this.props.socketOpen) { + // TODO: return something when disconnected + return null; + } + + const id = this.props.userId; + const sharedWebcam = this.props.sharedWebcam; + + return ( + <div className={styles.videoDock} id={this.props.sharedWebcam.toString()}> + <div id="webcamArea" className={styles.webcamArea}> + {this.props.users.map(user => ( + <VideoElement + shared={id === user.userId && sharedWebcam} + videoId={user.userId} + key={user.userId} + name={user.name} + localCamera={id === user.userId} + onShareWebcam={this.props.onShareWebcam.bind(this)} + onMount={this.props.onStart.bind(this)} + onUnmount={this.props.onStop.bind(this)} + /> + ))} + </div> + </div> + ); + } +} + +export default injectIntl(VideoDock); diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/container.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/video-dock/container.jsx similarity index 51% rename from bigbluebutton-html5/imports/ui/components/video-dock/container.jsx rename to bigbluebutton-html5/imports/ui/components/video-provider/video-dock/container.jsx index 313b06b743374136e34e804d1213517bc5d76a5c..1f23af5bbe73ec003a8400fd37a9de1d95b1baef 100644 --- a/bigbluebutton-html5/imports/ui/components/video-dock/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-dock/container.jsx @@ -1,23 +1,34 @@ import React from 'react'; import { withTracker } from 'meteor/react-meteor-data'; import Auth from '/imports/ui/services/auth'; -import mapUser from '../../services/user/mapUser'; +import mapUser from '../../../services/user/mapUser'; import Meetings from '/imports/api/meetings/'; import Users from '/imports/api/users/'; import VideoDock from './component'; -import VideoService from './service'; +import VideoService from '../service'; const VideoDockContainer = ({ children, ...props }) => <VideoDock {...props}>{children}</VideoDock>; -export default withTracker(() => { +export default withTracker(({sharedWebcam}) => { const meeting = Meetings.findOne({ meetingId: Auth.meetingID }); const lockCam = meeting.lockSettingsProp ? meeting.lockSettingsProp.disableCam : false; - const user = Users.findOne({ userId: Auth.userID }); + const userId = Auth.userID; + const user = Users.findOne({ userId }); const userLocked = mapUser(user).isLocked; + const withActiveStreams = (users) => { + const activeFilter = (user) => { + const isLocked = lockCam && user.locked; + return !isLocked && (user.has_stream || (sharedWebcam && user.userId == userId)); + }; + + return users.filter(activeFilter); + } + + const users = withActiveStreams(VideoService.getAllUsers()); + return { - users: VideoService.getAllUsers(), - userId: VideoService.userId(), - isLocked: userLocked && lockCam, + users, + userId }; })(VideoDockContainer); diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/video-element/component.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/video-element/component.jsx new file mode 100644 index 0000000000000000000000000000000000000000..2fe8e6ba5ecebf5fb5bf86c9e8e09b61538e8c44 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-element/component.jsx @@ -0,0 +1,68 @@ +import React, { Component } from 'react'; +import cx from 'classnames'; +import { styles } from '../styles'; + +class VideoElement extends Component { + constructor(props) { + super(props); + } + + render() { + const tagId = this.props.localCamera ? 'shareWebcam' : `video-elem-${this.props.videoId}`; + + return ( + <div className={cx({ + [styles.videoContainer]: true, + [styles.sharedWebcamVideo]: !this.props.shared && this.props.localCamera, + [styles.sharedWebcamVideoLocal]: this.props.shared || !this.props.localCamera })}> + + <video id={tagId} muted={this.props.localCamera} autoPlay playsInline /> + <div className={styles.videoText}> + <div className={styles.userName}>{this.props.name}</div> + </div> + </div> + ); + } + + componentDidMount() { + const { videoId, localCamera } = this.props; + + const tagId = localCamera ? 'shareWebcam' : `video-elem-${videoId}`; + const tag = document.getElementById(tagId); + + if (localCamera && this.props.onShareWebcam === 'function') { + this.props.onShareWebcam(); + } + + if (typeof this.props.onMount === 'function') { + this.props.onMount(videoId, localCamera, this.getVideoConstraints(), tag); + } + } + + componentWillUnmount() { + if (typeof this.props.onUnmount === 'function') { + this.props.onUnmount(this.props.videoId); + } + } + + getVideoConstraints() { + let videoConstraints = { + width: { + min: 320, + max: 640, + }, + height: { + min: 240, + max: 480, + }, + }; + + if (!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/)) { + videoConstraints.frameRate = { min: 5, ideal: 10, }; + } + + return videoConstraints; + } +} + +export default VideoElement; diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/component.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/component.jsx new file mode 100755 index 0000000000000000000000000000000000000000..48d263e92e8c996a4339dca63d7e8cbe63b68f71 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/component.jsx @@ -0,0 +1,76 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import _ from 'lodash'; +import Button from '/imports/ui/components/button/component'; +import { defineMessages, injectIntl, intlShape } from 'react-intl'; +import Dropdown from '/imports/ui/components/dropdown/component'; +import DropdownTrigger from '/imports/ui/components/dropdown/trigger/component'; +import DropdownContent from '/imports/ui/components/dropdown/content/component'; +import DropdownList from '/imports/ui/components/dropdown/list/component'; +import DropdownListItem from '/imports/ui/components/dropdown/list/item/component'; +import { styles } from './styles'; + +const intlMessages = defineMessages({ + videoMenu: { + id: 'app.video.videoMenu', + description: 'video menu label', + }, + videoMenuDesc: { + id: 'app.video.videoMenuDesc', + description: 'video menu description', + }, +}); + + +const propTypes = { + intl: intlShape.isRequired, + isSharingVideo: PropTypes.bool.isRequired, + videoItems: PropTypes.arrayOf(PropTypes.object).isRequired, +}; + +const JoinVideoOptions = ({ + intl, + isSharingVideo, + videoItems, +}) => { + const menuItems = videoItems + .filter(item => !item.disabled) + .map(item => + ( + <DropdownListItem + key={_.uniqueId('video-menu-')} + className={styles.item} + description={item.description} + onClick={item.click} + tabIndex={-1} + > + <img src={item.iconPath} className={styles.imageSize} alt="video menu icon" /> + <span className={styles.label}>{item.label}</span> + </DropdownListItem> + )); + return ( + <Dropdown + autoFocus + > + <DropdownTrigger tabIndex={0}> + <Button + label={intl.formatMessage(intlMessages.videoMenu)} + onClick={() => null} + hideLabel + aria-label={intl.formatMessage(intlMessages.videoMenuDesc)} + color={isSharingVideo ? 'danger' : 'primary'} + icon={isSharingVideo ? 'video_off' : 'video'} + size="lg" + circle + /> + </DropdownTrigger> + <DropdownContent placement="top" > + <DropdownList horizontal> + {menuItems} + </DropdownList> + </DropdownContent> + </Dropdown> + ); +}; +JoinVideoOptions.propTypes = propTypes; +export default injectIntl(JoinVideoOptions); diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/container.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/container.jsx new file mode 100755 index 0000000000000000000000000000000000000000..36ded78826585bf2cfa3597c90e653d2f69f9a3b --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/container.jsx @@ -0,0 +1,68 @@ +import React from 'react'; +import { withTracker } from 'meteor/react-meteor-data'; +import { defineMessages, injectIntl } from 'react-intl'; +import JoinVideoOptions from './component'; +import VideoMenuService from './service'; + +const intlMessages = defineMessages({ + joinVideo: { + id: 'app.video.joinVideo', + description: 'Join video button label', + }, + leaveVideo: { + id: 'app.video.leaveVideo', + description: 'Leave video button label', + }, + swapCam: { + id: 'app.video.swapCam', + description: 'Swap cam button label', + }, + swapCamDesc: { + id: 'app.video.swapCamDesc', + description: 'Swap cam button description', + }, +}); + +const JoinVideoOptionsContainer = (props) => { + const { + isSharingVideo, + isDisabled, + handleJoinVideo, + handleCloseVideo, + baseName, + intl, + ...restProps + } = props; + + const videoItems = [ + { + iconPath: `${baseName}/resources/images/video-menu/icon-swap.svg`, + description: intl.formatMessage(intlMessages.swapCamDesc), + label: intl.formatMessage(intlMessages.swapCam), + disabled: false, + click: () => {}, + }, + { + iconPath: `${baseName}/resources/images/video-menu/icon-webcam-off.svg`, + description: intl.formatMessage(intlMessages[isSharingVideo ? 'leaveVideo' : 'joinVideo']), + label: intl.formatMessage(intlMessages[isSharingVideo ? 'leaveVideo' : 'joinVideo']), + disabled: isDisabled, + click: isSharingVideo ? handleCloseVideo : handleJoinVideo, + }, + ]; + + return <JoinVideoOptions {...{ videoItems, isSharingVideo, ...restProps }} />; +}; + +export default injectIntl(withTracker(({ + intl, + handleJoinVideo, + handleCloseVideo, +}) => ({ + baseName: VideoMenuService.baseName, + isSharingVideo: VideoMenuService.isSharingVideo(), + isDisabled: VideoMenuService.isDisabled(), + handleJoinVideo, + handleCloseVideo, + intl, +}))(JoinVideoOptionsContainer)); diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/service.js b/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/service.js new file mode 100755 index 0000000000000000000000000000000000000000..474c13168bd7b1396509aa30c200519223790d8b --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/service.js @@ -0,0 +1,39 @@ +import Settings from '/imports/ui/services/settings'; +import mapUser from '/imports/ui/services/user/mapUser'; +import Auth from '/imports/ui/services/auth'; +import Users from '/imports/api/users/'; +import VideoService from '../service'; + +const baseName = Meteor.settings.public.app.basename; + +const isSharingVideo = () => { + const userId = Auth.userID; + const user = Users.findOne({ userId }); + return !!user.has_stream; +}; + +const isDisabled = () => { + const isWaitingResponse = VideoService.isWaitingResponse(); + const isConnected = VideoService.isConnected(); + + const videoSettings = Settings.dataSaving; + const enableShare = !videoSettings.viewParticipantsWebcams; + const LockCam = VideoService.isLocked() + const webcamOnlyModerator = VideoService.webcamOnlyModerator(); + const user = Users.findOne({ userId: Auth.userID }); + const userLocked = mapUser(user).isLocked; + + const isConnecting = (!isSharingVideo && isConnected); + const isLocked = (LockCam && userLocked) || webcamOnlyModerator; + + return isLocked + || isWaitingResponse + || isConnecting + || enableShare; +}; + +export default { + isSharingVideo, + isDisabled, + baseName, +}; diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/styles.scss b/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/styles.scss new file mode 100755 index 0000000000000000000000000000000000000000..cdb5f1c8d4d274db1445dd8d2962d2c302d5a31b --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-menu/styles.scss @@ -0,0 +1,48 @@ +@import "/imports/ui/stylesheets/variables/_all"; + +.container { + + span:first-child{ + box-shadow: 0 2px 5px 0 rgb(0, 0, 0); + } + +} + +.button { + + &:focus { + outline: none !important; + } + +} + +.imageSize { + height: 4rem; + @include mq($small-only) { + margin: auto 1rem; + }; +} + +.label { + font-size: $font-size-small; + white-space: nowrap; + margin-top: .5rem; + color: $color-gray; + @include mq($small-only) { + margin-top: 0; + color: #06172A; + font-size: 90%; + }; +} + +.item { + padding-left: 0; + display: flex; + justify-content: flex-start; + flex-direction: column; + align-items: center; + margin: auto 0.25rem; + @include mq($small-only) { + flex-direction: row; + }; +} diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/component.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/component.jsx old mode 100644 new mode 100755 index bbe79fb38470efde1716394c0aece1d5b3a9a428..22cd0fce1b633e128892c0db2678113fdab1243c --- a/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/component.jsx @@ -24,10 +24,18 @@ const intlMessages = defineMessages({ id: 'app.whiteboard.toolbar.thickness', description: 'Whiteboard toolbar thickness menu', }, + toolbarLineThicknessDisabled: { + id: 'app.whiteboard.toolbar.thicknessDisabled', + description: 'Whiteboard toolbar thickness menu', + }, toolbarLineColor: { id: 'app.whiteboard.toolbar.color', description: 'Whiteboard toolbar colors menu', }, + toolbarLineColorDisabled: { + id: 'app.whiteboard.toolbar.colorDisabled', + description: 'Whiteboard toolbar colors menu', + }, toolbarUndoAnnotation: { id: 'app.whiteboard.toolbar.undo', description: 'Whiteboard toolbar tools menu', @@ -364,13 +372,15 @@ class WhiteboardToolbar extends Component { renderThicknessItem() { const { intl } = this.props; - + const isDisabled = this.state.annotationSelected.value === 'hand'; return ( <ToolbarMenuItem - disabled={this.state.annotationSelected.value === 'hand'} - label={intl.formatMessage(intlMessages.toolbarLineThickness)} + disabled={isDisabled} + label={isDisabled ? + intl.formatMessage(intlMessages.toolbarLineThicknessDisabled) + : intl.formatMessage(intlMessages.toolbarLineThickness)} onItemClick={this.displaySubMenu} - objectToReturn={'thicknessList'} + objectToReturn="thicknessList" onBlur={this.closeSubMenu} className={cx(styles.toolbarButton, this.state.currentSubmenuOpen === 'thicknessList' ? '' : styles.notActive)} customIcon={this.renderThicknessItemIcon()} @@ -430,13 +440,15 @@ class WhiteboardToolbar extends Component { renderColorItem() { const { intl } = this.props; - + const isDisabled = this.state.annotationSelected.value === 'hand'; return ( <ToolbarMenuItem - disabled={this.state.annotationSelected.value === 'hand'} - label={intl.formatMessage(intlMessages.toolbarLineColor)} + disabled={isDisabled} + label={isDisabled ? + intl.formatMessage(intlMessages.toolbarLineColorDisabled) + : intl.formatMessage(intlMessages.toolbarLineColor)} onItemClick={this.displaySubMenu} - objectToReturn={'colorList'} + objectToReturn="colorList" onBlur={this.closeSubMenu} className={cx(styles.toolbarButton, this.state.currentSubmenuOpen === 'colorList' ? '' : styles.notActive)} customIcon={this.renderColorItemIcon()} @@ -467,7 +479,7 @@ class WhiteboardToolbar extends Component { attributeType="XML" from={this.state.prevColorSelected.value} to={this.state.colorSelected.value} - begin={'indefinite'} + begin="indefinite" dur={TRANSITION_DURATION} repeatCount="0" fill="freeze" diff --git a/bigbluebutton-html5/imports/ui/services/auth/index.js b/bigbluebutton-html5/imports/ui/services/auth/index.js index 49f576eac4856399953661aa6204ac2f67830812..08d639ca577cfcca617a6a916b2a5340562ec92f 100644 --- a/bigbluebutton-html5/imports/ui/services/auth/index.js +++ b/bigbluebutton-html5/imports/ui/services/auth/index.js @@ -125,13 +125,14 @@ class Auth { }); } - return this.validateAuthToken(); + this.loggedIn = false; + return this.validateAuthToken() + .then(() => { this.loggedIn = true; }); } validateAuthToken() { return new Promise((resolve, reject) => { Meteor.connection.setUserId(`${this.meetingID}-${this.userID}`); - let computation = null; const validationTimeout = setTimeout(() => { @@ -144,9 +145,7 @@ class Auth { Tracker.autorun((c) => { computation = c; - const subscription = Meteor.subscribe('current-user', this.credentials); - - if (!subscription.ready()) return; + Meteor.subscribe('current-user', this.credentials); const selector = { meetingId: this.meetingID, userId: this.userID }; const User = Users.findOne(selector); @@ -155,8 +154,6 @@ class Auth { if (!User || !('intId' in User)) return; if (User.ejected) { - this.loggedIn = false; - reject({ error: 401, description: 'User has been ejected.', @@ -164,11 +161,11 @@ class Auth { return; } - if (User.validated === true) { + if (User.validated === true && User.connectionStatus === 'online') { computation.stop(); clearTimeout(validationTimeout); - this.loggedIn = true; - resolve(); + // setTimeout to prevent race-conditions with subscription + setTimeout(resolve, 100); } }); diff --git a/bigbluebutton-html5/private/config/settings-development.json b/bigbluebutton-html5/private/config/settings-development.json old mode 100644 new mode 100755 index 722e93b17e0af9e0280fc8656e15e4968312cd03..c71de862148b314b2a67f3f907b0dcef30eabe63 --- a/bigbluebutton-html5/private/config/settings-development.json +++ b/bigbluebutton-html5/private/config/settings-development.json @@ -5,8 +5,9 @@ "mobileFont": 16, "desktopFont": 14, "audioChatNotification": false, - "autoJoinAudio": true, - "listenOnly": false, + "autoJoin": true, + "listenOnlyMode": true, + "forceListenOnly": false, "skipCheck": false, "appName": "BigBlueButton HTML5 Client", "bbbServerVersion": "2.0-rc", diff --git a/bigbluebutton-html5/private/config/settings-production.json b/bigbluebutton-html5/private/config/settings-production.json index 09385bef721a142daa1c2a36f763e4fe5afc01be..f2d763b18133614a8651054faedf97c68ed37c09 100644 --- a/bigbluebutton-html5/private/config/settings-production.json +++ b/bigbluebutton-html5/private/config/settings-production.json @@ -5,8 +5,9 @@ "mobileFont": 16, "desktopFont": 14, "audioChatNotification": false, - "autoJoinAudio": true, - "listenOnly": false, + "autoJoin": true, + "listenOnlyMode": true, + "forceListenOnly": false, "skipCheck": false, "appName": "BigBlueButton HTML5 Client", "bbbServerVersion": "2.0-rc", diff --git a/bigbluebutton-html5/private/locales/de.json b/bigbluebutton-html5/private/locales/de.json index 6c9fa5a87e757e15a653d4d80dd05c310372c6de..aa63759224d6a696911d0e3c48d57350b974bd0a 100644 --- a/bigbluebutton-html5/private/locales/de.json +++ b/bigbluebutton-html5/private/locales/de.json @@ -40,8 +40,8 @@ "app.userList.menu.promoteUser.label": "{0} zum Moderator machen", "app.userList.menu.demoteUser.label": "{0} zum Zuschauer zurückstufen", "app.media.label": "Media", - "app.meeting.ended":"Diese Konferenz wurde beendet", - "app.meeting.endedMessage":"Sie werden zum Startbildschirm weitergeleitet", + "app.meeting.ended": "Diese Konferenz wurde beendet", + "app.meeting.endedMessage": "Sie werden zum Startbildschirm weitergeleitet", "app.presentation.presentationToolbar.prevSlideLabel": "Vorherige Folie", "app.presentation.presentationToolbar.prevSlideDesc": "Präsentation zur vorherigen Folie wechseln", "app.presentation.presentationToolbar.nextSlideLabel": "Nächste Folie", @@ -54,7 +54,7 @@ "app.presentation.presentationToolbar.fitScreenDesc": "Gesamte Folie darstellen", "app.presentation.presentationToolbar.zoomLabel": "Vergrößerungsgrad", "app.presentation.presentationToolbar.zoomDesc": "Vergrößerungsstufe der Präsentation ändern", - "app.presentation.presentationToolbar.goToSlide":"Folie {0}", + "app.presentation.presentationToolbar.goToSlide": "Folie {0}", "app.presentationUploder.title": "Präsentation", "app.presentationUploder.message": "Als Präsentator haben Sie in BigBlueButton die Möglichkeit, jegliche Office-Dokumente oder PDF-Dateien hochzuladen. Die beste Qualität erzielen Sie mit PDF-Dateien.", "app.presentationUploder.confirmLabel": "Start", @@ -91,7 +91,11 @@ "app.navBar.settingsDropdown.leaveSessionDesc": "Konferenz verlassen", "app.navBar.settingsDropdown.exitFullscreenDesc": "Vollbildmodus beenden", "app.navBar.userListToggleBtnLabel": "Teilnehmerliste umschalten", + "app.navBar.toggleUserList.ariaLabel": "Nutzer / Gespräche-Umschaltung", "app.navBar.toggleUserList.newMessages": "mit Benachrichtigung für neue Nachrichten", + "app.navBar.recording": "Diese Konferenz wird aufgezeichnet", + "app.navBar.recording.on": "Aufzeichnung läuft", + "app.navBar.recording.off": "Keine Aufnahme", "app.leaveConfirmation.title": "Konferenz verlassen", "app.leaveConfirmation.message": "Wollen Sie die Konferenz verlassen?", "app.leaveConfirmation.confirmLabel": "Verlassen", @@ -171,6 +175,12 @@ "app.settings.main.cancel.label.description": "Verwirft die Änderungen und schließt das Einstellungsmenü", "app.settings.main.save.label": "Speichern", "app.settings.main.save.label.description": "Speichert die Einstellungen und schließt das Einstellungsmenü", + "app.settings.dataSavingTab.label": "Dateneinsparung", + "app.settings.dataSavingTab.webcam": "Webcams ausschalten", + "app.settings.dataSavingTab.screenShare": "Bildschirmfreigabe ausschalten", + "app.settings.dataSavingTab.description": "Um Datentransfervolumen zu sparen, können Sie hier einstellen, was angezeigt wird.", + "app.switch.onLabel": "AN", + "app.switch.offLabel": "AUS", "app.actionsBar.actionsDropdown.actionsLabel": "Aktionen", "app.actionsBar.actionsDropdown.presentationLabel": "Eine Präsentation hochladen", "app.actionsBar.actionsDropdown.initPollLabel": "Eine Umfrage starten", @@ -180,6 +190,8 @@ "app.actionsBar.actionsDropdown.initPollDesc": "Eine Umfrage starten", "app.actionsBar.actionsDropdown.desktopShareDesc": "Ihren Bildschirm mit anderen teilen", "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Bildschirmfreigabe beenden mit", + "app.actionsBar.actionsDropdown.startRecording": "Aufnahme starten", + "app.actionsBar.actionsDropdown.stopRecording": "Aufnahme beenden", "app.actionsBar.emojiMenu.statusTriggerLabel": "Status", "app.actionsBar.emojiMenu.awayLabel": "Abwesend", "app.actionsBar.emojiMenu.awayDesc": "Ihren Status auf abwesend setzen", @@ -240,7 +252,7 @@ "app.audioModal.connectingEchoTest": "Verbinde zum Echotest", "app.audioManager.joinedAudio": "Sie sind der Konferenz beigetreten", "app.audioManager.joinedEcho": "Der Echotest wurde gestartet", - "app.audioManager.leftAudio": "Sie haben die Konferenz verlassen", + "app.audioManager.leftAudio": "Sie haben die Audiokonferenz verlassen", "app.audioManager.genericError": "Fehler: Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut", "app.audioManager.connectionError": "Fehler: Verbindungsfehler", "app.audioManager.requestTimeout": "Fehler: Zeitüberschreitung beim Aufruf", @@ -271,10 +283,10 @@ "app.error.leaveLabel": "Erneut einloggen", "app.guest.waiting": "Warte auf Erlaubnis zur Konferenzteilnahme", "app.toast.breakoutRoomEnded": "Breakout Raum wurde beendet. Bitte klicken Sie aufs Mikrofon-Icon um wieder der Audiokonferenz im Hauptraum beizutreten", - "app.toast.chat.singular":"Sie haben {0} neue Nachricht in {1}", - "app.toast.chat.plural":"Sie haben {0} neue Nachrichten in {1}", - "app.notification.recordingStart": "Die Sitzung wird jetzt aufgezeichnet", - "app.notification.recordingStop": "Die Sitzung wird nicht mehr aufgezeichnet", + "app.toast.chat.singular": "Sie haben {0} neue Nachricht in {1}", + "app.toast.chat.plural": "Sie haben {0} neue Nachrichten in {1}", + "app.notification.recordingStart": "Die Konferenz wird jetzt aufgezeichnet", + "app.notification.recordingStop": "Die Konferenz wird nicht mehr aufgezeichnet", "app.video.joinVideo": "Webcam freigeben", "app.video.leaveVideo": "Webcam stoppen", "app.video.iceCandidateError": "Fehler beim Hinzufügen vom ice candidate", diff --git a/bigbluebutton-html5/private/locales/en.json b/bigbluebutton-html5/private/locales/en.json index 4fdb9edd0969f794c5cbac8b02f9294dacc86557..e09bbf8eadf20722ebe8c8ebe5fcb9945f8b7779 100755 --- a/bigbluebutton-html5/private/locales/en.json +++ b/bigbluebutton-html5/private/locales/en.json @@ -40,6 +40,8 @@ "app.userList.menu.promoteUser.label": "Promote {0} to moderator", "app.userList.menu.demoteUser.label": "Demote {0} to viewer", "app.media.label": "Media", + "app.media.screenshare.start": "Screenshare has started", + "app.media.screenshare.end": "Screenshare has ended", "app.meeting.ended": "This session has ended", "app.meeting.endedMessage": "You will be forwarded back to the home screen", "app.presentation.presentationToolbar.prevSlideLabel": "Previous slide", @@ -103,6 +105,7 @@ "app.leaveConfirmation.dismissLabel": "Cancel", "app.leaveConfirmation.dismissDesc": "Closes and rejects the leave confirmation", "app.leaveConfirmation.endMeetingLabel": "Yes and close the session", + "app.leaveConfirmation.endMeetingAriaLabel": "Leave and end the session", "app.leaveConfirmation.endMeetingDesc": "Closes and end meeting confirmation", "app.about.title": "About", "app.about.version": "Client Build:", @@ -179,6 +182,8 @@ "app.settings.dataSavingTab.webcam": "Disable Webcams", "app.settings.dataSavingTab.screenShare": "Disable Desktop Sharing", "app.settings.dataSavingTab.description": "To save your bandwidth adjust what's currently being displayed.", + "app.switch.onLabel": "ON", + "app.switch.offLabel": "OFF", "app.actionsBar.actionsDropdown.actionsLabel": "Actions", "app.actionsBar.actionsDropdown.presentationLabel": "Upload a presentation", "app.actionsBar.actionsDropdown.initPollLabel": "Initiate a poll", @@ -290,6 +295,10 @@ "app.video.iceCandidateError": "Error on adding ice candidate", "app.video.permissionError": "Error on sharing webcam. Please check permissions", "app.video.sharingError": "Error on sharing webcam", + "app.video.swapCam": "Swap", + "app.video.swapCamDesc": "swap the direction of webcams", + "app.video.videoMenu": "Video menu", + "app.video.videoMenuDesc": "Open video menu dropdown", "app.video.chromeExtensionError": "You must install", "app.video.chromeExtensionErrorLink": "this Chrome Extension", "app.meeting.endNotification.ok.label": "OK", @@ -301,8 +310,10 @@ "app.whiteboard.toolbar.tools.ellipse": "Ellipse", "app.whiteboard.toolbar.tools.line": "Line", "app.whiteboard.toolbar.tools.text": "Text", - "app.whiteboard.toolbar.thickness": "Thickness List", - "app.whiteboard.toolbar.color": "Color List", + "app.whiteboard.toolbar.thickness": "Drawing Thickness", + "app.whiteboard.toolbar.thicknessDisabled": "Drawing Thickness is Disabled", + "app.whiteboard.toolbar.color": "Colors", + "app.whiteboard.toolbar.colorDisabled": "Colors is Disabled", "app.whiteboard.toolbar.color.black": "Black", "app.whiteboard.toolbar.color.white": "White", "app.whiteboard.toolbar.color.red": "Red", diff --git a/bigbluebutton-html5/private/locales/fr.json b/bigbluebutton-html5/private/locales/fr.json index ca0dbb6a3e8bf37d230d6e4762c96250a832704c..84f827222b75735d7c7e117eeeda487f9b4dd206 100644 --- a/bigbluebutton-html5/private/locales/fr.json +++ b/bigbluebutton-html5/private/locales/fr.json @@ -93,8 +93,8 @@ "app.error.500": "Oups, quelque chose s'est mal passé", "app.error.404": "Non trouvé", "app.error.403": "Interdit", - "app.toast.chat.singular":"vous avez {0} nouveau message dans {1}", - "app.toast.chat.plural":"vous avez {0} nouveaux messages dans {1}", + "app.toast.chat.singular": "vous avez {0} nouveau message dans {1}", + "app.toast.chat.plural": "vous avez {0} nouveaux messages dans {1}", "app.notification.recordingStart": "Cette session est maintenant enregistrée", "app.notification.recordingStop": "Cette session n'est maintenant plus enregistrée" diff --git a/bigbluebutton-html5/private/locales/km.json b/bigbluebutton-html5/private/locales/km.json index 7d674fffc9a99c53e6e7228e3c5b3f989d519153..ce91d81c8d0484f8059bbb1b2cab507f7734436b 100644 --- a/bigbluebutton-html5/private/locales/km.json +++ b/bigbluebutton-html5/private/locales/km.json @@ -1,6 +1,8 @@ { "app.home.greeting": "សូមស្វាគមន០{0}! បទ​បង្ហាញ​របស់​អ្នក​នឹង​ចាប់ផ្ážáž¾áž˜â€‹áž”ន្ážáž·áž…​ទៀážâ€‹áž“áŸáŸ‡", "app.chat.submitLabel": "ផ្ញើ​សារ", + "app.chat.errorMinMessageLength": "សារ​នáŸáŸ‡â€‹áž“ៅ​ážáŸ’វះ {0} ážáž½â€‹áž¢áž€áŸ’សរ​ទៀáž", + "app.chat.errorMaxMessageLength": "សារ​នáŸáŸ‡â€‹áž›áž¾ážŸ {0} ážáž½â€‹áž¢áž€áŸ’សរ", "app.chat.inputLabel": "ការ​បញ្ចូល​សារ​សម្រាប់​ការ​ជជែក {0}", "app.chat.inputPlaceholder": "សារ {0}", "app.chat.titlePublic": "ជជែក​សាធារណៈ", diff --git a/bigbluebutton-html5/private/locales/pt_BR.json b/bigbluebutton-html5/private/locales/pt_BR.json index b295d4c1d4a0ba9a3e9dfcab3a0f51fe7c3460a4..59567165c170f5dfe209fbac71a2a81807d8e9c9 100644 --- a/bigbluebutton-html5/private/locales/pt_BR.json +++ b/bigbluebutton-html5/private/locales/pt_BR.json @@ -33,12 +33,15 @@ "app.userList.menu.chat.label": "Bate-papo", "app.userList.menu.clearStatus.label": "Limpar status", "app.userList.menu.makePresenter.label": "Torná-lo apresentador", + "app.userList.menu.removeUser.label": "Remover usuário", "app.userList.menu.muteUserAudio.label": "Silenciar usuário", "app.userList.menu.unmuteUserAudio.label": "Desbloquear microfone do usuário", "app.userList.userAriaLabel": "Usuário : {0} Papel: {1} Pessoa: {2} Status: {3}", "app.userList.menu.promoteUser.label": "Transforme {0} em moderador", "app.userList.menu.demoteUser.label": "Transforme {0} em espectador", "app.media.label": "MÃdia", + "app.meeting.ended": "Esta reunião terminou", + "app.meeting.endedMessage": "Você será redirecionado para a tela inicial", "app.presentation.presentationToolbar.prevSlideLabel": "Slide anterior", "app.presentation.presentationToolbar.prevSlideDesc": "Mudar a apresentação para o slide anterior", "app.presentation.presentationToolbar.nextSlideLabel": "Próximo slide", @@ -51,7 +54,7 @@ "app.presentation.presentationToolbar.fitScreenDesc": "Exibir todo o slide", "app.presentation.presentationToolbar.zoomLabel": "Zoom", "app.presentation.presentationToolbar.zoomDesc": "Alterar o nÃvel de zoom da apresentação", - "app.presentation.presentationToolbar.goToSlide":"Slide {0}", + "app.presentation.presentationToolbar.goToSlide": "Slide {0}", "app.presentationUploder.title": "Apresentação", "app.presentationUploder.message": "Como apresentador no BigBlueButton, você tem a capacidade de carregar qualquer documento do Office ou arquivo PDF. Para melhores resultados, recomendamos que se carregue arquivos em PDF.", "app.presentationUploder.confirmLabel": "Iniciar", @@ -89,7 +92,7 @@ "app.navBar.settingsDropdown.exitFullscreenDesc": "Sair do modo de tela cheia", "app.navBar.userListToggleBtnLabel": "Alternar lista de usuários", "app.navBar.toggleUserList.newMessages": "com notificação para novas mensagens", - "app.leaveConfirmation.title": "Deixar a sessão", + "app.leaveConfirmation.title": "Deixar a reunião", "app.leaveConfirmation.message": "Você quer sair desta reunião?", "app.leaveConfirmation.confirmLabel": "Sair", "app.leaveConfirmation.confirmDesc": "Desconecta da reunião", @@ -172,9 +175,11 @@ "app.actionsBar.actionsDropdown.presentationLabel": "Carregar uma apresentação", "app.actionsBar.actionsDropdown.initPollLabel": "Iniciar uma enquete", "app.actionsBar.actionsDropdown.desktopShareLabel": "Compartilhar sua tela", + "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Parar compartilhamento de tela", "app.actionsBar.actionsDropdown.presentationDesc": "Carregar sua apresentação", "app.actionsBar.actionsDropdown.initPollDesc": "Iniciar uma enquete", "app.actionsBar.actionsDropdown.desktopShareDesc": "Compartilhar sua tela com os outros", + "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Pare o compartilhamento de tela com", "app.actionsBar.emojiMenu.statusTriggerLabel": "Status", "app.actionsBar.emojiMenu.awayLabel": "Ausente", "app.actionsBar.emojiMenu.awayDesc": "Mudar seu status para ausente", @@ -256,6 +261,7 @@ "app.audio.listenOnly.closeLabel": "Fechar", "app.audio.permissionsOverlay.title": "Permitir que o BigBlueButton acesse seus dispositivos de mÃdia", "app.audio.permissionsOverlay.hint": "Precisamos que você nos permita acessar seus dispositivos de mÃdia para participar da conferência por voz :)", + "app.error.removed": "Você foi removido da conferência", "app.error.meeting.ended": "Você saiu da conferência", "app.dropdown.close": "Fechar", "app.error.500": "Ops, algo deu errado", @@ -264,10 +270,46 @@ "app.error.403": "Proibido", "app.error.leaveLabel": "Faça o login novamente", "app.guest.waiting": "Esperando aprovação para participar", - "app.toast.chat.singular":"você tem {0} nova mensagem em {1}", - "app.toast.chat.plural":"você tem {0} novas mensagens em {1}", - "app.notification.recordingStart": "Esta sessão está sendo gravada", - "app.notification.recordingStop": "Esta sessão não está mais sendo gravada" + "app.toast.breakoutRoomEnded": "A sala de apoio terminou. Clique no Ãcone do microfone para reingressar a conferência de áudio na sala principal", + "app.toast.chat.singular": "você tem {0} nova mensagem em {1}", + "app.toast.chat.plural": "você tem {0} novas mensagens em {1}", + "app.notification.recordingStart": "Esta reunião está sendo gravada", + "app.notification.recordingStop": "Esta reunião não está mais sendo gravada", + "app.video.joinVideo": "Ativar Webcam", + "app.video.leaveVideo": "Pare a Webcam", + "app.video.iceCandidateError": "Erro ao adicionar o candidato ICE", + "app.video.permissionError": "Erro ao compartilhar a webcam. Verifique as permissões", + "app.video.sharingError": "Erro ao compartilhar a webcam", + "app.video.chromeExtensionError": "Você deve instalar o seguinte:", + "app.video.chromeExtensionErrorLink": "esta extensão do Chrome", + "app.meeting.endNotification.ok.label": "OK", + "app.whiteboard.toolbar.tools": "Ferramentas", + "app.whiteboard.toolbar.tools.hand": "Mão", + "app.whiteboard.toolbar.tools.pencil": "Lápis", + "app.whiteboard.toolbar.tools.rectangle": "Retângulo", + "app.whiteboard.toolbar.tools.triangle": "Triângulo", + "app.whiteboard.toolbar.tools.ellipse": "Elipse", + "app.whiteboard.toolbar.tools.line": "Linha", + "app.whiteboard.toolbar.tools.text": "Texto", + "app.whiteboard.toolbar.thickness": "Lista de espessura", + "app.whiteboard.toolbar.color": "Lista de cores", + "app.whiteboard.toolbar.color.black": "Preto", + "app.whiteboard.toolbar.color.white": "Branco", + "app.whiteboard.toolbar.color.red": "Vermelho", + "app.whiteboard.toolbar.color.orange": "Laranja", + "app.whiteboard.toolbar.color.eletricLime": "Verde limão", + "app.whiteboard.toolbar.color.lime": "Verde", + "app.whiteboard.toolbar.color.cyan": "Ciano", + "app.whiteboard.toolbar.color.dodgerBlue": "Azul Dodger", + "app.whiteboard.toolbar.color.blue": "Azul", + "app.whiteboard.toolbar.color.violet": "Violeta", + "app.whiteboard.toolbar.color.magenta": "Magenta", + "app.whiteboard.toolbar.color.silver": "Prata", + "app.whiteboard.toolbar.undo": "Desfazer Anotação", + "app.whiteboard.toolbar.clear": "Limpar todas as anotações", + "app.whiteboard.toolbar.multiUserOn": "Iniciar o modo multiusuário", + "app.whiteboard.toolbar.multiUserOff": "Sair do modo multiusuário", + "app.whiteboard.toolbar.fontSize": "Lista de tamanhos de fonte" } diff --git a/bigbluebutton-html5/private/locales/tr_TR.json b/bigbluebutton-html5/private/locales/tr_TR.json index 67c4a4a300af718232ee74be36702ffbef0857d2..6fd6e342ec2800390477637879a7fee861450d89 100644 --- a/bigbluebutton-html5/private/locales/tr_TR.json +++ b/bigbluebutton-html5/private/locales/tr_TR.json @@ -33,12 +33,15 @@ "app.userList.menu.chat.label": "Sohbet", "app.userList.menu.clearStatus.label": "Durum Temizle", "app.userList.menu.makePresenter.label": "Sunucu Yap", + "app.userList.menu.removeUser.label": "Kullanıcı uzaklaÅŸtır", "app.userList.menu.muteUserAudio.label": "Kullanıcıyı sustur", "app.userList.menu.unmuteUserAudio.label": "Kullanıcıyı konuÅŸtur", "app.userList.userAriaLabel": "Kullanıcı : {0} Rol: {1} KiÅŸi: {2} Durum: {3}", "app.userList.menu.promoteUser.label": "{0} kullanıcısını moderatör yap", "app.userList.menu.demoteUser.label": "{0} kullanıcısını izleyici yap", "app.media.label": "Medya", + "app.meeting.ended": "Oturum sonlandı", + "app.meeting.endedMessage": "Ana ekrana geri yönlendirileceksiniz", "app.presentation.presentationToolbar.prevSlideLabel": "Önceki slayt", "app.presentation.presentationToolbar.prevSlideDesc": "Sunumu önceki slayda deÄŸiÅŸtir", "app.presentation.presentationToolbar.nextSlideLabel": "Sonraki slayt", @@ -51,7 +54,7 @@ "app.presentation.presentationToolbar.fitScreenDesc": "Tüm slaydı göster", "app.presentation.presentationToolbar.zoomLabel": "Odak", "app.presentation.presentationToolbar.zoomDesc": "Sunumun odak seviyesini deÄŸiÅŸtir", - "app.presentation.presentationToolbar.goToSlide":"Slayt {0}", + "app.presentation.presentationToolbar.goToSlide": "Slayt {0}", "app.presentationUploder.title": "Sunum", "app.presentationUploder.message": "BigBlueButton'da sunucu olarak herhangi bir ofis belgesini ya da PDF dosyasını yükleyebilirsiniz. En iyi sonuç için PDF dosyası yüklemenizi tavsiye ederiz.", "app.presentationUploder.confirmLabel": "BaÅŸlat", @@ -88,6 +91,7 @@ "app.navBar.settingsDropdown.leaveSessionDesc": "Görüşmeden ayrıl", "app.navBar.settingsDropdown.exitFullscreenDesc": "Tam ekran modundan çık", "app.navBar.userListToggleBtnLabel": "Kullanıcı Listesini DeÄŸiÅŸtir", + "app.navBar.toggleUserList.ariaLabel": "Kullanıcılar / KonuÅŸmalar DeÄŸiÅŸtir", "app.navBar.toggleUserList.newMessages": "yeni mesaj bildirimiyle", "app.leaveConfirmation.title": "Oturumdan Ayrıl", "app.leaveConfirmation.message": "Görüşmeden ayrılmak istiyor musunuz?", @@ -168,13 +172,19 @@ "app.settings.main.cancel.label.description": "DeÄŸiÅŸiklikleri geri alır ve ayarlar menüsünü kapatır", "app.settings.main.save.label": "Kaydet", "app.settings.main.save.label.description": "DeÄŸiÅŸiklikleri kaydeder ve ayarlar menüsünü kapatır", + "app.settings.dataSavingTab.label": "Veri Kazancı", + "app.settings.dataSavingTab.webcam": "Kameraları Devre Dışı Bırak", + "app.settings.dataSavingTab.screenShare": "Masaüstü Paylaşımını Devre Dışı Bırak", + "app.settings.dataSavingTab.description": "Bant geniÅŸliÄŸinden tasarruf etmek için mevcut gösterimi ayarlayın.", "app.actionsBar.actionsDropdown.actionsLabel": "Eylemler", "app.actionsBar.actionsDropdown.presentationLabel": "Bir sunum yükle", "app.actionsBar.actionsDropdown.initPollLabel": "Oylama baÅŸlat", "app.actionsBar.actionsDropdown.desktopShareLabel": "Ekranını paylaÅŸ", + "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Ekran paylaşımını sonlandır", "app.actionsBar.actionsDropdown.presentationDesc": "Sunumunuzu yükleyin", "app.actionsBar.actionsDropdown.initPollDesc": "Oylama baÅŸlat", "app.actionsBar.actionsDropdown.desktopShareDesc": "Ekranını diÄŸerleriyle paylaÅŸ", + "app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Ekran geniÅŸliÄŸi paylaşımını sonlandır", "app.actionsBar.emojiMenu.statusTriggerLabel": "Durum", "app.actionsBar.emojiMenu.awayLabel": "Dışarıda", "app.actionsBar.emojiMenu.awayDesc": "Durumunu dışarıda yap", @@ -256,6 +266,7 @@ "app.audio.listenOnly.closeLabel": "Kapat", "app.audio.permissionsOverlay.title": "BigBlueButton'un Medya Cihazlarınızı kullanmasına izin verin", "app.audio.permissionsOverlay.hint": "Sizi sesli görüşmeye katabilmemiz için Medya Cihazlarınıza eriÅŸimimize izin vermeniz gerekir :)", + "app.error.removed": "Konferanstan uzaklaÅŸtırıldınız", "app.error.meeting.ended": "Konferanstan ayrıldınız", "app.dropdown.close": "Kapat", "app.error.500": "Hops, birÅŸeyler ters gitti", @@ -264,10 +275,46 @@ "app.error.403": "Yasaklı", "app.error.leaveLabel": "Tekrar giriÅŸ yap", "app.guest.waiting": "Katılım onayı bekleniyor", - "app.toast.chat.singular":"{1} için {0} yeni mesajınız var", - "app.toast.chat.plural":"{1} için {0} yeni mesajınız var", + "app.toast.breakoutRoomEnded": "Özel sonlandı. Lütfen sesli görüşmeye yeniden katılın.", + "app.toast.chat.singular": "{1} için {0} yeni mesajınız var", + "app.toast.chat.plural": "{1} için {0} yeni mesajınız var", "app.notification.recordingStart": "Bu oturum ÅŸu anda kaydediliyor", - "app.notification.recordingStop": "Bu oturum artık kaydedilmiyor" + "app.notification.recordingStop": "Bu oturum artık kaydedilmiyor", + "app.video.joinVideo": "Kamera PaylaÅŸ", + "app.video.leaveVideo": "Kamera PaylaÅŸma", + "app.video.iceCandidateError": "ICE adayı ekleme hatası", + "app.video.permissionError": "Kamera paylaşımı hatası. Lütfen izinleri kontrol edin.", + "app.video.sharingError": "Kamera paylaşımı hatası", + "app.video.chromeExtensionError": "Yüklemeniz gerekiyor", + "app.video.chromeExtensionErrorLink": "Chrome Uzantısı", + "app.meeting.endNotification.ok.label": "TAMAM", + "app.whiteboard.toolbar.tools": "Araçlar", + "app.whiteboard.toolbar.tools.hand": "El", + "app.whiteboard.toolbar.tools.pencil": "Kalem", + "app.whiteboard.toolbar.tools.rectangle": "Dikdörtgen", + "app.whiteboard.toolbar.tools.triangle": "Üçgen", + "app.whiteboard.toolbar.tools.ellipse": "Elips", + "app.whiteboard.toolbar.tools.line": "Çizgi", + "app.whiteboard.toolbar.tools.text": "Metin", + "app.whiteboard.toolbar.thickness": "Kalınlık Listesi", + "app.whiteboard.toolbar.color": "Renk Listesi", + "app.whiteboard.toolbar.color.black": "Siyah", + "app.whiteboard.toolbar.color.white": "Beyaz", + "app.whiteboard.toolbar.color.red": "Kırmızı", + "app.whiteboard.toolbar.color.orange": "Turuncu", + "app.whiteboard.toolbar.color.eletricLime": "Parlak YeÅŸil", + "app.whiteboard.toolbar.color.lime": "Açık YeÅŸil", + "app.whiteboard.toolbar.color.cyan": "Cam GöbeÄŸi", + "app.whiteboard.toolbar.color.dodgerBlue": "Hile Mavisi", + "app.whiteboard.toolbar.color.blue": "Mavi", + "app.whiteboard.toolbar.color.violet": "MenekÅŸe", + "app.whiteboard.toolbar.color.magenta": "FuÅŸya", + "app.whiteboard.toolbar.color.silver": "Gümüş", + "app.whiteboard.toolbar.undo": "Ek Açıklamayı Geri Al", + "app.whiteboard.toolbar.clear": "Tüm Ek Açıklamaları Temizle", + "app.whiteboard.toolbar.multiUserOn": "Çoklu kullanıcı modunu aç", + "app.whiteboard.toolbar.multiUserOff": "Çoklu kullanıcı modunu kapat", + "app.whiteboard.toolbar.fontSize": "Yazı Tipi Büyüklüğü Listesi" } diff --git a/bigbluebutton-html5/public/resources/images/video-menu/icon-swap.svg b/bigbluebutton-html5/public/resources/images/video-menu/icon-swap.svg new file mode 100755 index 0000000000000000000000000000000000000000..5a5dba8ce8859f13da8699f35f9daedfa7622d54 --- /dev/null +++ b/bigbluebutton-html5/public/resources/images/video-menu/icon-swap.svg @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="64px" height="40px" viewBox="0 0 64 40" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch --> + <title>icon-swap</title> + <desc>Created with Sketch.</desc> + <defs> + <polygon id="path-1" points="0.437577197 0.52125 10.8119 0.52125 10.8119 14.8655357 0.437577197 14.8655357"></polygon> + </defs> + <g id="Video-Exploration" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon-swap"> + <rect id="Rectangle-14" fill="#DFE7F0" x="0" y="0" width="64" height="40" rx="2"></rect> + <rect id="Rectangle-14" fill="#8BA2BB" x="7" y="0" width="50" height="32"></rect> + <g id="Page-1" transform="translate(24.000000, 8.000000)"> + <path d="M3.56961165,16 L0.2104787,12.4507487 C0.076876821,12.3095853 2.72426615e-06,12.1107241 2.72426615e-06,11.9040206 C-0.000527441918,11.6967569 0.0763466549,11.4967754 0.2104787,11.3550518 C0.48828578,11.0620817 0.969676676,11.0620817 1.24695359,11.3550518 L2.77436237,12.968908 L2.77436237,8.33124205 C2.77436237,4.54839892 5.56568733,1.33020941 9.12840409,1.00362899 C9.35425489,0.981222105 9.57639452,1.06356742 9.74233653,1.22321651 C9.90562772,1.38174526 9.9999973,1.6069345 9.9999973,1.84108649 C10.0010576,2.27409963 9.68985008,2.64045228 9.29275561,2.67574313 C6.52899929,2.91549685 4.36486092,5.39930055 4.36486092,8.33124205 L4.36486092,12.968908 L5.8922697,11.3550518 C6.16954661,11.0620817 6.65093751,11.0620817 6.92874459,11.3550518 C7.06711797,11.5012568 7.14293173,11.6950763 7.14293173,11.9029002 C7.14293173,12.1084835 7.06764813,12.3023031 6.93033509,12.4490682 L3.56961165,16 Z" id="Fill-1" fill="#FEFEFE"></path> + <g id="Group-5" transform="translate(9.000000, 0.000000)"> + <mask id="mask-2" fill="white"> + <use xlink:href="#path-1"></use> + </mask> + <g id="Clip-4"></g> + <path d="M1.26918,14.8655357 C1.06128,14.8655357 0.85943,14.7894643 0.70543,14.6528571 C0.53548,14.5007143 0.43758,14.2858929 0.43758,14.0619643 C0.43648,13.6478571 0.75933,13.2969643 1.17128,13.26375 C4.03843,13.0344643 6.28353,10.6585714 6.28353,7.85517857 L6.28353,3.42 L4.69898,4.96339286 C4.41133,5.24357143 3.91193,5.24357143 3.62373,4.96339286 C3.48073,4.82357143 3.40153,4.63767857 3.40153,4.43946429 C3.40153,4.24285714 3.48018,4.05696429 3.62208,3.91714286 L7.10853,0.52125 L10.59333,3.91553571 C10.73193,4.05053571 10.81223,4.24071429 10.81223,4.43839286 C10.81278,4.63607143 10.73248,4.82785714 10.59333,4.96339286 C10.30568,5.24357143 9.80573,5.24357143 9.51808,4.96339286 L7.93353,3.42 L7.93353,7.85517857 C7.93353,11.4728571 5.03833,14.5505357 1.34178,14.8623214 C1.31758,14.8644643 1.29338,14.8655357 1.26918,14.8655357" id="Fill-3" fill="#FEFEFE" mask="url(#mask-2)"></path> + </g> + </g> + <rect id="Rectangle-14" x="0" y="0" width="64" height="40" rx="2"></rect> + <g id="Group" transform="translate(24.000000, 34.000000)" fill="#8BA2BB"> + <circle id="Oval" cx="2" cy="2" r="2"></circle> + <circle id="Oval-Copy" cx="8" cy="2" r="2"></circle> + <circle id="Oval-Copy-2" cx="14" cy="2" r="2"></circle> + </g> + <rect id="Rectangle-14-Copy-4" fill="#8BA2BB" x="54" y="33" width="8" height="5"></rect> + </g> + </g> +</svg> \ No newline at end of file diff --git a/bigbluebutton-html5/public/resources/images/video-menu/icon-webcam-off.svg b/bigbluebutton-html5/public/resources/images/video-menu/icon-webcam-off.svg new file mode 100755 index 0000000000000000000000000000000000000000..46a74e6e98d241d7e1b4ec77843feeb23e0536b1 --- /dev/null +++ b/bigbluebutton-html5/public/resources/images/video-menu/icon-webcam-off.svg @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="64px" height="40px" viewBox="0 0 64 40" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch --> + <title>icon-webcam-off</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Video-Exploration" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon-webcam-off"> + <rect id="Rectangle-14-Copy-15" fill="#DFE7F0" x="0" y="0" width="64" height="40" rx="2"></rect> + <rect id="Rectangle-14-Copy-16" fill="#8BA2BB" x="7" y="0" width="50" height="32"></rect> + <path d="M23.2059929,21.8093305 L33.7940071,21.8093305 L33.7940071,13.1906695 L23.2059929,13.1906695 L23.2059929,21.8093305 Z M34.3970036,23 L22.6029964,23 C22.2695394,23 22,22.7338854 22,22.4046653 L22,12.5953347 C22,12.26671 22.2695394,12 22.6029964,12 L34.3970036,12 C34.7298576,12 35,12.26671 35,12.5953347 L35,22.4046653 C35,22.7338854 34.7298576,23 34.3970036,23 Z" id="Fill-1" fill="#FFFFFF"></path> + <path d="M40.602925,21.0265445 L37.2408478,19.5331841 L37.2408478,17.0682399 L40.602925,15.5748796 L40.602925,21.0265445 Z M41.56148,14.1001319 C41.3852796,13.9859739 41.1625474,13.9679816 40.9714568,14.0536001 L36.3685318,16.0978969 C36.1439383,16.1971648 36,16.4192765 36,16.6649644 L36,19.9364597 C36,20.1821476 36.1439383,20.4042593 36.3685318,20.5035271 L40.9714568,22.5478239 C41.0521119,22.5838085 41.1377304,22.6011804 41.2233489,22.6011804 C41.3412295,22.6011804 41.45911,22.5670571 41.56148,22.5012921 C41.7376803,22.3865137 41.8437728,22.1910802 41.8437728,21.9807565 L41.8437728,14.6206676 C41.8437728,14.4103439 41.7376803,14.2149104 41.56148,14.1001319 Z" id="Fill-1" fill="#FFFFFF"></path> + <g id="Group-Copy" transform="translate(24.000000, 34.000000)" fill="#8BA2BB"> + <circle id="Oval" cx="2" cy="2" r="2"></circle> + <circle id="Oval-Copy" cx="8" cy="2" r="2"></circle> + <circle id="Oval-Copy-2" cx="14" cy="2" r="2"></circle> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/labs/bbb-webrtc-sfu/config/default.example.yml b/labs/bbb-webrtc-sfu/config/default.example.yml index 7817a8d1ccb0e288ea867b9b54ab1e195ccf2713..4895109f0cbf216ddd7fe974026f70843d1b2541 100644 --- a/labs/bbb-webrtc-sfu/config/default.example.yml +++ b/labs/bbb-webrtc-sfu/config/default.example.yml @@ -14,6 +14,7 @@ from-video: "from-video-sfu" to-video: "to-video-sfu" from-audio: "from-audio-sfu" to-audio: "to-audio-sfu" +to-akka: "to-akka-apps-redis-channel" log: filename: '/var/log/bigbluebutton/bbb-webrtc-sfu/bbb-webrtc-sfu.log' diff --git a/labs/bbb-webrtc-sfu/lib/bbb/messages/Constants.js b/labs/bbb-webrtc-sfu/lib/bbb/messages/Constants.js index 3b2a77052aefe4154435efb76a485935e4ee9e43..dec25bb7a5e42479ad8a5c3ee7a1fd7a06439cab 100644 --- a/labs/bbb-webrtc-sfu/lib/bbb/messages/Constants.js +++ b/labs/bbb-webrtc-sfu/lib/bbb/messages/Constants.js @@ -25,6 +25,7 @@ const config = require('config'); TO_VIDEO: config.get('to-video'), FROM_AUDIO: config.get('from-audio'), TO_AUDIO: config.get('to-audio'), + TO_AKKA_APPS: config.get('to-akka'), // RedisWrapper events REDIS_MESSAGE : "redis_message", @@ -47,6 +48,8 @@ const config = require('config'); STOP_TRANSCODER_REQ_2x: "StopTranscoderSysReqMsg", STOP_TRANSCODER_RESP_2x: "StopTranscoderSysRespMsg", + USER_CAM_BROADCAST_STOPPED_2x: "UserBroadcastCamStopMsg", + // Redis messages fields // Transcoder 1x USER_ID : "user_id", diff --git a/labs/bbb-webrtc-sfu/lib/bbb/messages/Messaging.js b/labs/bbb-webrtc-sfu/lib/bbb/messages/Messaging.js index a352acf1e5f8cfd736e48011316209995bf2a87d..3cf3f3a908a9bdda914c1203eea3430f391704bd 100644 --- a/labs/bbb-webrtc-sfu/lib/bbb/messages/Messaging.js +++ b/labs/bbb-webrtc-sfu/lib/bbb/messages/Messaging.js @@ -20,11 +20,12 @@ let ScreenshareRTMPBroadcastStartedEventMessage2x = require('./screenshare/ScreenshareRTMPBroadcastStartedEventMessage2x.js')(Constants); let ScreenshareRTMPBroadcastStoppedEventMessage2x = require('./screenshare/ScreenshareRTMPBroadcastStoppedEventMessage2x.js')(Constants); - +let UserCamBroadcastStoppedEventMessage2x = + require('./video/UserCamBroadcastStoppedEventMessage2x.js')(Constants); /** * @classdesc - * Messaging utils to assemble JSON/Redis BigBlueButton messages + * Messaging utils to assemble JSON/Redis BigBlueButton messages * @constructor */ function Messaging() {} @@ -65,4 +66,10 @@ Messaging.prototype.generateScreenshareRTMPBroadcastStoppedEvent2x = return stodrbem.toJson(); } +Messaging.prototype.generateUserCamBroadcastStoppedEventMessage2x = + function(meetingId, userId, streamUrl) { + let stodrbem = new UserCamBroadcastStoppedEventMessage2x(meetingId, userId, streamUrl); + return stodrbem.toJson(); +} + module.exports = new Messaging(); diff --git a/labs/bbb-webrtc-sfu/lib/bbb/messages/video/UserCamBroadcastStoppedEventMessage2x.js b/labs/bbb-webrtc-sfu/lib/bbb/messages/video/UserCamBroadcastStoppedEventMessage2x.js new file mode 100644 index 0000000000000000000000000000000000000000..a4a320250011ab7d836a1f540e5a2db75e50dc26 --- /dev/null +++ b/labs/bbb-webrtc-sfu/lib/bbb/messages/video/UserCamBroadcastStoppedEventMessage2x.js @@ -0,0 +1,18 @@ +/* + * + */ + +var inherits = require('inherits'); +var OutMessage2x = require('../OutMessage2x'); + +module.exports = function (C) { + function UserCamBroadcastStoppedEventMessage2x (meetingId, userId, stream) { + UserCamBroadcastStoppedEventMessage2x.super_.call(this, C.USER_CAM_BROADCAST_STOPPED_2x, {sender: 'bbb-webrtc-sfu'}, {meetingId, userId}); + + this.core.body = {}; + this.core.body[C.STREAM_URL] = stream; + }; + + inherits(UserCamBroadcastStoppedEventMessage2x, OutMessage2x); + return UserCamBroadcastStoppedEventMessage2x; +} diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/media-server.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/media-server.js index d70a7bbffed5b0663313873633af893b5d268f19..1d5c6593aada90545be334a9379c1f94187640a2 100644 --- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/media-server.js +++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/media-server.js @@ -113,7 +113,7 @@ module.exports = class MediaServer extends EventEmitter { if (source && sink) { return new Promise((resolve, reject) => { switch (type) { - case 'ALL': + case 'ALL': source.connect(sink, (error) => { if (error) { error = this._handleError(error); @@ -156,6 +156,7 @@ module.exports = class MediaServer extends EventEmitter { Logger.info("[mcs-media] Releasing endpoint", elementId, "from room", room); let mediaElement = this._mediaElements[elementId]; let pipeline = this._mediaPipelines[room]; + if (mediaElement && typeof mediaElement.release === 'function') { pipeline.activeElements--; diff --git a/labs/bbb-webrtc-sfu/lib/video/VideoManager.js b/labs/bbb-webrtc-sfu/lib/video/VideoManager.js index 718593aa466201a583eb633ef953f867023276d8..ea007f23b733fa7b92d73dc1ccd07cd7d79daccd 100755 --- a/labs/bbb-webrtc-sfu/lib/video/VideoManager.js +++ b/labs/bbb-webrtc-sfu/lib/video/VideoManager.js @@ -64,7 +64,7 @@ let _onMessage = async function (_message) { Logger.info('[VideoManager] Received message [' + message.id + '] from connection ' + sessionId); Logger.debug('[VideoManager] Message =>', JSON.stringify(message, null, 2)); - video = new Video(bbbGW, message.cameraId, shared, message.connectionId); + video = new Video(bbbGW, message.meetingId, message.cameraId, shared, message.connectionId); // Empty ice queue after starting video if (iceQueue) { @@ -164,7 +164,9 @@ let stopVideo = async function(sessionId, role, cameraId) { if (sharedVideo) { Logger.info('[VideoManager] Stopping sharer [', sessionId, '][', cameraId,']'); await sharedVideo.stop(); - delete sessions[sessionId][cameraId+'-shared']; + if (sessions[sessionId][cameraId+'-shared']) { + delete sessions[sessionId][cameraId+'-shared']; + } } } else if (role === 'viewer') { @@ -175,6 +177,9 @@ let stopVideo = async function(sessionId, role, cameraId) { delete sessions[sessionId][cameraId]; } } + if (sessions[sessionId]) { + delete sessions[sessionId]; + } } catch (err) { Logger.error("[VideoManager] Stop error => ", err); diff --git a/labs/bbb-webrtc-sfu/lib/video/video.js b/labs/bbb-webrtc-sfu/lib/video/video.js index 67ff0029e60937e98aeab4be47b53d1822df3b21..030515bd89875bc124154365bff304199e10ed4a 100644 --- a/labs/bbb-webrtc-sfu/lib/video/video.js +++ b/labs/bbb-webrtc-sfu/lib/video/video.js @@ -5,16 +5,18 @@ const kurentoUrl = config.get('kurentoUrl'); const MCSApi = require('../mcs-core/lib/media/MCSApiStub'); const C = require('../bbb/messages/Constants'); const Logger = require('../utils/Logger'); +const Messaging = require('../bbb/messages/Messaging'); +const h264_sdp = require('../h264-sdp'); var sharedWebcams = {}; module.exports = class Video { - constructor(_bbbGW, _id, _shared, _sessionId) { + constructor(_bbbGW, _meetingId, _id, _shared, _sessionId) { this.mcs = new MCSApi(); this.bbbGW = _bbbGW; this.id = _id; this.sessionId = _sessionId; - this.meetingId = _id; + this.meetingId = _meetingId; this.shared = _shared; this.role = this.shared? 'share' : 'view' this.mediaId = null; @@ -82,13 +84,12 @@ module.exports = class Video { Logger.warn("Setting up a timeout for " + this.sessionId + " camera " + this.id); if (!this.notFlowingTimeout) { this.notFlowingTimeout = setTimeout(() => { - this.bbbGW.publish(JSON.stringify({ - connectionId: this.sessionId, - type: 'video', - role: this.role, - id : 'playStop', - cameraId: this.id, - }), C.FROM_VIDEO); + + if (this.shared) { + let userCamEvent = + Messaging.generateUserCamBroadcastStoppedEventMessage2x(this.meetingId, this.id, this.id); + this.bbbGW.publish(userCamEvent, C.TO_AKKA_APPS, function(error) {}); + } }, config.get('mediaFlowTimeoutDuration')); } } @@ -118,6 +119,9 @@ module.exports = class Video { Logger.info("[video] Starting video instance for", this.id); let sdpAnswer; + // Force H264 + sdpOffer = h264_sdp.transform(sdpOffer); + try { this.userId = await this.mcs.join(this.meetingId, 'SFU', {}); Logger.info("[video] MCS join for", this.id, "returned", this.userId);