diff --git a/.github/workflows/ci.build.push.yml b/.github/workflows/ci.build.push.yml index 06f68a2f76..cb894d4ceb 100644 --- a/.github/workflows/ci.build.push.yml +++ b/.github/workflows/ci.build.push.yml @@ -9,6 +9,8 @@ on: - v2 - v3 - translations* + - snyk* + - dependabot* jobs: main: diff --git a/.rubocop.yml b/.rubocop.yml index 0b5ffffe5c..9f6ae1c9eb 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -95,3 +95,6 @@ Rails/Output: Rails/RootPathnameMethods: Enabled: false +Rails/ThreeStateBooleanColumn: + Enabled: false + diff --git a/Gemfile b/Gemfile index f65bef9190..58d2376371 100644 --- a/Gemfile +++ b/Gemfile @@ -5,14 +5,14 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '>= 3.0' -gem 'active_model_serializers' +gem 'active_model_serializers', '>= 0.10.14' gem 'active_storage_validations', '>= 1.0.4' gem 'aws-sdk-s3', require: false gem 'bcrypt', '~> 3.1.7' gem 'bigbluebutton-api-ruby', '1.9.1' gem 'bootsnap', require: false -gem 'cssbundling-rails', '>= 1.2.0' -gem 'data_migrate', '>= 9.0.0' +gem 'cssbundling-rails', '>= 1.3.3' +gem 'data_migrate', '>= 9.2.0' gem 'dotenv-rails' gem 'google-cloud-storage', '~> 1.44', require: false gem 'hcaptcha' @@ -20,16 +20,16 @@ gem 'hiredis', '~> 0.6.0' gem 'i18n-language-mapping' gem 'image_processing', '~> 1.2' gem 'jbuilder' -gem 'jsbundling-rails', '>= 1.1.2' +gem 'jsbundling-rails', '>= 1.2.1' gem 'jwt' gem 'mini_magick', '>= 4.9.5' gem 'omniauth', '~> 2.1.0' -gem 'omniauth_openid_connect' +gem 'omniauth_openid_connect', '>= 0.6.1' gem 'omniauth-rails_csrf_protection', '~> 1.0.1' -gem 'pagy', '~> 5.10', '>= 5.10.1' +gem 'pagy', '~> 6.0', '>= 6.0.0' gem 'pg' -gem 'puma', '~> 5.0' -gem 'rails', '~> 7.0.5', '>= 7.0.5.1' +gem 'puma', '~> 5.6' +gem 'rails', '~> 7.1.0' gem 'redis', '~> 4.0' gem 'sprockets-rails' gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] @@ -41,9 +41,9 @@ end group :development do gem 'rubocop', '~> 1.26', require: false gem 'rubocop-performance', '~> 1.13', require: false - gem 'rubocop-rails', '~> 2.17', '>= 2.17.4', require: false + gem 'rubocop-rails', '~> 2.18', '>= 2.18.0', require: false gem 'rubocop-rspec', '~> 2.9.0', require: false - gem 'web-console' + gem 'web-console', '>= 4.2.1' end group :test do @@ -58,6 +58,6 @@ group :test do end group :production do - gem 'lograge', '~> 0.13.0' + gem 'lograge', '~> 0.14.0' gem 'remote_syslog_logger' end diff --git a/Gemfile.lock b/Gemfile.lock index c4e637b8b7..efff185711 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,54 +1,57 @@ GEM remote: https://rubygems.org/ specs: - actioncable (7.0.5.1) - actionpack (= 7.0.5.1) - activesupport (= 7.0.5.1) + actioncable (7.1.0) + actionpack (= 7.1.0) + activesupport (= 7.1.0) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (7.0.5.1) - actionpack (= 7.0.5.1) - activejob (= 7.0.5.1) - activerecord (= 7.0.5.1) - activestorage (= 7.0.5.1) - activesupport (= 7.0.5.1) + zeitwerk (~> 2.6) + actionmailbox (7.1.0) + actionpack (= 7.1.0) + activejob (= 7.1.0) + activerecord (= 7.1.0) + activestorage (= 7.1.0) + activesupport (= 7.1.0) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.0.5.1) - actionpack (= 7.0.5.1) - actionview (= 7.0.5.1) - activejob (= 7.0.5.1) - activesupport (= 7.0.5.1) + actionmailer (7.1.0) + actionpack (= 7.1.0) + actionview (= 7.1.0) + activejob (= 7.1.0) + activesupport (= 7.1.0) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp - rails-dom-testing (~> 2.0) - actionpack (7.0.5.1) - actionview (= 7.0.5.1) - activesupport (= 7.0.5.1) - rack (~> 2.0, >= 2.2.4) + rails-dom-testing (~> 2.2) + actionpack (7.1.0) + actionview (= 7.1.0) + activesupport (= 7.1.0) + nokogiri (>= 1.8.5) + rack (>= 2.2.4) + rack-session (>= 1.0.1) rack-test (>= 0.6.3) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (7.0.5.1) - actionpack (= 7.0.5.1) - activerecord (= 7.0.5.1) - activestorage (= 7.0.5.1) - activesupport (= 7.0.5.1) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + actiontext (7.1.0) + actionpack (= 7.1.0) + activerecord (= 7.1.0) + activestorage (= 7.1.0) + activesupport (= 7.1.0) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.0.5.1) - activesupport (= 7.0.5.1) + actionview (7.1.0) + activesupport (= 7.1.0) builder (~> 3.1) - erubi (~> 1.4) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.1, >= 1.2.0) - active_model_serializers (0.10.13) - actionpack (>= 4.1, < 7.1) - activemodel (>= 4.1, < 7.1) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + active_model_serializers (0.10.14) + actionpack (>= 4.1) + activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) active_storage_validations (1.0.4) @@ -56,25 +59,30 @@ GEM activemodel (>= 5.2.0) activestorage (>= 5.2.0) activesupport (>= 5.2.0) - activejob (7.0.5.1) - activesupport (= 7.0.5.1) + activejob (7.1.0) + activesupport (= 7.1.0) globalid (>= 0.3.6) - activemodel (7.0.5.1) - activesupport (= 7.0.5.1) - activerecord (7.0.5.1) - activemodel (= 7.0.5.1) - activesupport (= 7.0.5.1) - activestorage (7.0.5.1) - actionpack (= 7.0.5.1) - activejob (= 7.0.5.1) - activerecord (= 7.0.5.1) - activesupport (= 7.0.5.1) + activemodel (7.1.0) + activesupport (= 7.1.0) + activerecord (7.1.0) + activemodel (= 7.1.0) + activesupport (= 7.1.0) + timeout (>= 0.4.0) + activestorage (7.1.0) + actionpack (= 7.1.0) + activejob (= 7.1.0) + activerecord (= 7.1.0) + activesupport (= 7.1.0) marcel (~> 1.0) - mini_mime (>= 1.1.0) - activesupport (7.0.5.1) + activesupport (7.1.0) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) minitest (>= 5.1) + mutex_m tzinfo (~> 2.0) addressable (2.8.1) public_suffix (>= 2.0.2, < 6.0) @@ -97,6 +105,7 @@ GEM aws-sigv4 (~> 1.4) aws-sigv4 (1.5.2) aws-eventstream (~> 1, >= 1.0.2) + base64 (0.1.1) bcrypt (3.1.18) bigbluebutton-api-ruby (1.9.1) childprocess (>= 1.0.1) @@ -106,6 +115,7 @@ GEM rack (>= 1.6.11) rubyzip (>= 1.3.0) xml-simple (~> 1.1) + bigdecimal (3.1.4) bindata (2.4.15) bindex (0.8.1) bootsnap (1.16.0) @@ -124,14 +134,15 @@ GEM activesupport childprocess (4.1.0) concurrent-ruby (1.2.2) + connection_pool (2.4.1) crack (0.4.5) rexml crass (1.0.6) - cssbundling-rails (1.2.0) + cssbundling-rails (1.3.3) railties (>= 6.0.0) - data_migrate (9.0.0) - activerecord (>= 6.0) - railties (>= 6.0) + data_migrate (9.2.0) + activerecord (>= 6.1) + railties (>= 6.1) date (3.3.3) debug (1.7.1) irb (>= 1.5.0) @@ -144,6 +155,8 @@ GEM dotenv-rails (2.8.1) dotenv (= 2.8.1) railties (>= 3.2) + drb (2.1.1) + ruby2_keywords erubi (1.12.0) factory_bot (6.2.1) activesupport (>= 5.0.0) @@ -152,15 +165,15 @@ GEM railties (>= 5.0.0) faker (3.1.1) i18n (>= 1.8.11, < 2) - faraday (2.7.4) + faraday (2.7.10) faraday-net_http (>= 2.0, < 3.1) ruby2_keywords (>= 0.0.4) faraday-follow_redirects (0.3.0) faraday (>= 1, < 3) faraday-net_http (3.0.2) ffi (1.15.5) - globalid (1.1.0) - activesupport (>= 5.0) + globalid (1.2.1) + activesupport (>= 6.1) google-apis-core (0.11.0) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) @@ -214,7 +227,7 @@ GEM actionview (>= 5.0.0) activesupport (>= 5.0.0) jmespath (1.6.2) - jsbundling-rails (1.1.2) + jsbundling-rails (1.2.1) railties (>= 6.0.0) json (2.6.3) json-jwt (1.16.3) @@ -225,12 +238,13 @@ GEM faraday-follow_redirects jsonapi-renderer (0.2.2) jwt (2.7.0) - lograge (0.13.0) + language_server-protocol (3.17.0.3) + lograge (0.14.0) actionpack (>= 4) activesupport (>= 4) railties (>= 4) request_store (~> 1.0) - loofah (2.21.3) + loofah (2.21.4) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -241,27 +255,27 @@ GEM marcel (1.0.2) matrix (0.4.2) memoist (0.16.2) - method_source (1.0.0) mini_magick (4.12.0) - mini_mime (1.1.2) + mini_mime (1.1.5) mini_portile2 (2.8.4) - minitest (5.19.0) + minitest (5.20.0) msgpack (1.6.0) multi_json (1.15.0) - net-imap (0.3.6) + mutex_m (0.1.2) + net-imap (0.4.1) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.1) timeout - net-smtp (0.3.3) + net-smtp (0.4.0) net-protocol nio4r (2.5.9) - nokogiri (1.15.3) + nokogiri (1.15.4) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.15.3-x86_64-linux) + nokogiri (1.15.4-x86_64-linux) racc (~> 1.4) omniauth (2.1.1) hashie (>= 3.4.6) @@ -270,74 +284,83 @@ GEM omniauth-rails_csrf_protection (1.0.1) actionpack (>= 4.2) omniauth (~> 2.0) - omniauth_openid_connect (0.6.0) + omniauth_openid_connect (0.7.1) omniauth (>= 1.9, < 3) - openid_connect (~> 1.1) - openid_connect (1.4.2) + openid_connect (~> 2.2) + openid_connect (2.2.0) activemodel attr_required (>= 1.0.0) - json-jwt (>= 1.15.0) + faraday (~> 2.0) + faraday-follow_redirects + json-jwt (>= 1.16) net-smtp - rack-oauth2 (~> 1.21) - swd (~> 1.3) + rack-oauth2 (~> 2.2) + swd (~> 2.0) tzinfo validate_email validate_url - webfinger (~> 1.2) + webfinger (~> 2.0) os (1.1.4) - pagy (5.10.1) - activesupport - parallel (1.22.1) - parser (3.2.0.0) + pagy (6.0.4) + parallel (1.23.0) + parser (3.2.2.3) ast (~> 2.4.1) + racc pg (1.4.5) - public_suffix (5.0.1) - puma (5.6.5) + public_suffix (5.0.3) + puma (5.6.7) nio4r (~> 2.0) racc (1.7.1) - rack (2.2.7) - rack-oauth2 (1.21.3) + rack (2.2.8) + rack-oauth2 (2.2.0) activesupport attr_required - httpclient + faraday (~> 2.0) + faraday-follow_redirects json-jwt (>= 1.11.0) rack (>= 2.1.0) - rack-protection (3.0.5) - rack + rack-protection (3.1.0) + rack (~> 2.2, >= 2.2.4) + rack-session (1.0.1) + rack (< 3) rack-test (2.1.0) rack (>= 1.3) - rails (7.0.5.1) - actioncable (= 7.0.5.1) - actionmailbox (= 7.0.5.1) - actionmailer (= 7.0.5.1) - actionpack (= 7.0.5.1) - actiontext (= 7.0.5.1) - actionview (= 7.0.5.1) - activejob (= 7.0.5.1) - activemodel (= 7.0.5.1) - activerecord (= 7.0.5.1) - activestorage (= 7.0.5.1) - activesupport (= 7.0.5.1) + rackup (1.0.0) + rack (< 3) + webrick + rails (7.1.0) + actioncable (= 7.1.0) + actionmailbox (= 7.1.0) + actionmailer (= 7.1.0) + actionpack (= 7.1.0) + actiontext (= 7.1.0) + actionview (= 7.1.0) + activejob (= 7.1.0) + activemodel (= 7.1.0) + activerecord (= 7.1.0) + activestorage (= 7.1.0) + activesupport (= 7.1.0) bundler (>= 1.15.0) - railties (= 7.0.5.1) - rails-dom-testing (2.1.1) + railties (= 7.1.0) + rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.0.5.1) - actionpack (= 7.0.5.1) - activesupport (= 7.0.5.1) - method_source + railties (7.1.0) + actionpack (= 7.1.0) + activesupport (= 7.1.0) + irb + rackup (>= 1.0.0) rake (>= 12.2) - thor (~> 1.0) - zeitwerk (~> 2.5) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) rainbow (3.1.1) rake (13.0.6) redis (4.8.0) - regexp_parser (2.7.0) + regexp_parser (2.8.1) reline (0.3.2) io-console (~> 0.5) remote_syslog_logger (1.0.4) @@ -349,7 +372,7 @@ GEM request_store (1.5.1) rack (>= 1.4) retriable (3.1.2) - rexml (3.2.5) + rexml (3.2.6) rspec-core (3.12.2) rspec-support (~> 3.12.0) rspec-expectations (3.12.3) @@ -367,28 +390,30 @@ GEM rspec-mocks (~> 3.12) rspec-support (~> 3.12) rspec-support (3.12.1) - rubocop (1.45.1) + rubocop (1.56.1) + base64 (~> 0.1.1) json (~> 2.3) + language_server-protocol (>= 3.17.0) parallel (~> 1.10) - parser (>= 3.2.0.0) + parser (>= 3.2.2.3) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.24.1, < 2.0) + rubocop-ast (>= 1.28.1, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.24.1) - parser (>= 3.1.1.0) + rubocop-ast (1.29.0) + parser (>= 3.2.1.0) rubocop-performance (1.16.0) rubocop (>= 1.7.0, < 2.0) rubocop-ast (>= 0.4.0) - rubocop-rails (2.17.4) + rubocop-rails (2.20.2) activesupport (>= 4.2.0) rack (>= 1.1) rubocop (>= 1.33.0, < 2.0) rubocop-rspec (2.9.0) rubocop (~> 1.19) - ruby-progressbar (1.11.0) + ruby-progressbar (1.13.0) ruby-vips (2.1.4) ffi (~> 1.12) ruby2_keywords (0.0.5) @@ -411,10 +436,11 @@ GEM actionpack (>= 5.2) activesupport (>= 5.2) sprockets (>= 3.0.0) - swd (1.3.0) + swd (2.0.2) activesupport (>= 3) attr_required (>= 0.0.5) - httpclient (>= 2.4) + faraday (~> 2.0) + faraday-follow_redirects syslog_protocol (0.9.2) thor (1.2.2) timeout (0.4.0) @@ -429,7 +455,7 @@ GEM validate_url (1.0.15) activemodel (>= 3.0.0) public_suffix - web-console (4.2.0) + web-console (4.2.1) actionview (>= 6.0.0) activemodel (>= 6.0.0) bindex (>= 0.4.0) @@ -438,38 +464,39 @@ GEM nokogiri (~> 1.6) rubyzip (>= 1.3.0) selenium-webdriver (~> 4.0) - webfinger (1.2.0) + webfinger (2.1.2) activesupport - httpclient (>= 2.4) + faraday (~> 2.0) + faraday-follow_redirects webmock (3.18.1) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) webrick (1.8.1) websocket (1.2.9) - websocket-driver (0.7.5) + websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) xml-simple (1.1.9) rexml xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.9) + zeitwerk (2.6.12) PLATFORMS ruby x86_64-linux DEPENDENCIES - active_model_serializers + active_model_serializers (>= 0.10.14) active_storage_validations (>= 1.0.4) aws-sdk-s3 bcrypt (~> 3.1.7) bigbluebutton-api-ruby (= 1.9.1) bootsnap capybara - cssbundling-rails (>= 1.2.0) - data_migrate (>= 9.0.0) + cssbundling-rails (>= 1.3.3) + data_migrate (>= 9.2.0) debug dotenv-rails factory_bot_rails @@ -480,29 +507,29 @@ DEPENDENCIES i18n-language-mapping image_processing (~> 1.2) jbuilder - jsbundling-rails (>= 1.1.2) + jsbundling-rails (>= 1.2.1) jwt - lograge (~> 0.13.0) + lograge (~> 0.14.0) mini_magick (>= 4.9.5) omniauth (~> 2.1.0) omniauth-rails_csrf_protection (~> 1.0.1) - omniauth_openid_connect - pagy (~> 5.10, >= 5.10.1) + omniauth_openid_connect (>= 0.6.1) + pagy (~> 6.0, >= 6.0.0) pg - puma (~> 5.0) - rails (~> 7.0.5, >= 7.0.5.1) + puma (~> 5.6) + rails (~> 7.1.0) redis (~> 4.0) remote_syslog_logger rspec-rails (>= 6.0.2) rubocop (~> 1.26) rubocop-performance (~> 1.13) - rubocop-rails (~> 2.17, >= 2.17.4) + rubocop-rails (~> 2.18, >= 2.18.0) rubocop-rspec (~> 2.9.0) selenium-webdriver shoulda-matchers (~> 5.0) sprockets-rails tzinfo-data - web-console + web-console (>= 4.2.1) webdrivers webmock diff --git a/app/assets/locales/de.json b/app/assets/locales/de.json index a9c841524e..0fbf5c1fcf 100644 --- a/app/assets/locales/de.json +++ b/app/assets/locales/de.json @@ -186,9 +186,9 @@ "processing_recording": "Aufzeichnung wird erstellt, dies kann einige Minuten dauern...", "copy_recording_urls": "Kopiere die URL(s) der Aufzeichnungen", "recordings_list_empty": "Keine Aufzeichnung gefunden!", - "public_recordings_list_empty": "Bisher gibt es keine geteilten Aufzeichnungen!", + "public_recordings_list_empty": "Bisher gibt es keine öffentlichen Aufzeichnungen!", "recordings_list_empty_description": "Aufzeichnungen werden hier angezeigt, nachdem du eine Besprechung gestartet und aufgezeichnet hast.", - "public_recordings_list_empty_description": "Die Aufzeichnungen werden hier angezeigt, sobald die Dozent:in sie geteilt hat.", + "public_recordings_list_empty_description": "Hier werden Aufzeichnungen angezeigt,sobald sie verfügbar sind.", "delete_recording": "Aufzeichnung löschen", "are_you_sure_delete_recording": "Diese Aufzeichnung wirklich löschen?", "search_not_found": "Keine Aufzeichnungen gefunden" diff --git a/app/assets/locales/el.json b/app/assets/locales/el.json index bbe33a7962..2f4a8dda91 100644 --- a/app/assets/locales/el.json +++ b/app/assets/locales/el.json @@ -28,7 +28,7 @@ "no_result_search_input": "Δε βρέθηκαν αποτελέσματα για \"{{ searchInput }}\"", "action_permanent": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", "homepage": { - "welcome_bbb": "Καλώς ήρθατε στο BigBlueButton.", + "welcome_bbb": "Καλώς ορίσατε στο BigBlueButton.", "bigbluebutton_description": "Το BigBlueButton είναι ένα σύστημα διαδικτυακής διάσκεψης ανοιχτού κώδικα για διαδικτυακά μαθήματα. Η πλατφόρμα μεγιστοποιεί τον χρόνο για εφαρμοσμένη μάθηση δίνοντας τη δυνατότητα στους μαθητές να συνεργάζονται και να λαμβάνουν σχόλια σε πραγματικό χρόνο.", "greenlight_description": "Δημιουργήστε τις δικές σας αίθουσες για να φιλοξενήσετε διασκέψεις ή συμμετάσχετε σε άλλες χρησιμοποιώντας έναν σύντομο και βολικό σύνδεσμο.", "learn_more": "Μάθετε περισσότερα για το BigBlueButton", @@ -36,7 +36,7 @@ "meeting_title": "Ξεκινήστε μια διάσκεψη", "meeting_description": "Ξεκινήστε μια εικονική τάξη με βίντεο, ήχο, κοινή χρήση οθόνης, συνομιλία και όλα τα εργαλεία που απαιτούνται για την εφαρμοσμένη εκπαίδευση.", "recording_title": "Καταγράψτε τις διασκέψεις σας", - "recording_description": "Καταγράψτε τις διασκέψεις του BigBlueButton και μοιραστείτε τις με τους μαθητές για να αναθεωρήσουν και να προβληματιστούν σχετικά με το υλικό.", + "recording_description": "Καταγράψτε τις διασκέψεις του BigBlueButton και μοιραστείτε τις με άλλους για να αναθεωρήσουν και να προβληματιστούν σχετικά με το υλικό.", "settings_title": "Διαχειριστείτε τις αίθουσες σας", "settings_description": "Διαμορφώστε τις παραμέτρους των αιθουσών και των διασκέψεων για να έχετε τον έλεγχο μιας αποτελεσματικής τάξης.", "and_more_title": "Και ακόμη περισσότερα!", @@ -126,9 +126,9 @@ }, "presentation": { "presentation": "Παρουσίαση", - "click_to_upload": "Κάντε κλικ για μεταφόρτωση", + "click_to_upload": "Κάντε κλικ για μεταφόρτωση ", "drag_and_drop": "ή σύρετε και αποθέστε το αρχείο", - "upload_description": "Μεταφόρτωση οποιουδήποτε εγγράφου ή αρχείου PDF (όχι μεγαλύτερο από {{size}}). Ανάλογα με το μέγεθος του αρχείου, απαιτείται χρόνος για τη μεταφόρτωση πριν τη χρήση του", + "upload_description": "Μεταφόρτωση εγγράφου ή αρχείου PDF (έως {{size}}). Ανάλογα με το μέγεθος του αρχείου, απαιτείται χρόνος για τη μεταφόρτωση πριν τη χρήση του", "are_you_sure_delete_presentation": "Θέλετε σίγουρα να διαγράψετε αυτή την παρουσίαση;" }, "shared_access": { @@ -148,7 +148,7 @@ "require_signed_in": "Οι χρήστες απαιτείται να έχουν συνδεθεί πριν συμμετάσχουν", "require_signed_in_message": "Πρέπει να συνδεθείτε για συμμετοχή σε αυτή την αίθουσα διάσκεψης.", "require_mod_approval": "Απαιτείται έγκριση από συντονιστή πριν τη συμμετοχή", - "allow_any_user_to_start": "Όλοι οι χρήστες μπορούν να ξεκινήσουν αυτή τη διάσκεψη", + "allow_any_user_to_start": "Όλοι οι χρήστες μπορούν να ξεκινήσουν τη διάσκεψη", "all_users_join_as_mods": "Όλοι οι χρήστες συμμετέχουν ως συντονιστές", "mute_users_on_join": "Σίγαση των χρηστών μόλις συνδεθούν", "generate": "Δημιουργία", @@ -259,9 +259,9 @@ "regular": "Κανονικό", "lighten": "Φωτεινό", "brand_image": "Εικόνα επωνυμίας", - "click_to_upload": "Κάντε κλικ για μεταφόρτωση", - "drag_and_drop": "ή σύρετε και αποθέστε", - "upload_brand_image_description": "Μεταφόρτωση οποιουδήποτε αρχείου PNG, JPG ή SVG (όχι μεγαλύτερο από {{size}}). Ανάλογα με το μέγεθος του αρχείου, απαιτείται χρόνος για τη μεταφόρτωση πριν τη χρήση του", + "click_to_upload": "Κάντε κλικ για μεταφόρτωση ", + "drag_and_drop": "ή σύρετε και αποθέστε το αρχείο", + "upload_brand_image_description": "Μεταφόρτωση αρχείου PNG, JPG ή SVG (έως {{size}}). Ανάλογα με το μέγεθος του αρχείου, απαιτείται χρόνος για τη μεταφόρτωση πριν τη χρήση του", "remove_branding_image": "Αφαίρεση της εικόνας επωνυμίας" }, "administration": { diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json index bd8a515c10..d7f341f902 100644 --- a/app/assets/locales/en.json +++ b/app/assets/locales/en.json @@ -111,7 +111,7 @@ "delete_room": "Delete Room", "create_new_room": "Create New Room", "enter_room_name": "Enter the room name", - "shared_by": "shared by ", + "shared_by": "shared by", "last_session": "Last Session: {{ localizedTime }}", "no_last_session": "No previous session created", "search_not_found": "No Rooms Found", diff --git a/app/assets/locales/fr.json b/app/assets/locales/fr.json index c10641d283..966c237d7e 100644 --- a/app/assets/locales/fr.json +++ b/app/assets/locales/fr.json @@ -23,6 +23,8 @@ "are_you_sure": "Etes-vous sûr?", "return_home": "Retourner à l'accueil", "created_at": "Créé à", + "view_recordings": "Voir les enregistrements", + "join_session": "Rejoindre une session.", "no_result_search_input": "Aucun résultat trouvé pour {{ searchInput }}", "action_permanent": "Cette action ne peut être annulée", "homepage": { @@ -120,13 +122,13 @@ "meeting_invitation": "Vous avez été invité à rejoindre la réunion", "meeting_not_started": "La réunion n'a pas encore commencé.", "join_meeting_automatically": "Vous rejoindrez automatiquement la réunion quand elle débutera", - "recording_consent": "J'admets être informé que cette session pourrait être enregistrée. Le cas échéant ma voix et mon image vidéo feront partie de la captation." + "recording_consent": "Je reconnais savoir que cette session peut être enregistrée. Le cas échéant ma voix et mon image vidéo pourront apparaître lors de la captation." }, "presentation": { "presentation": "Documents", "click_to_upload": "Cliquez pour téléverser", "drag_and_drop": "ou glissez-déposez", - "upload_description": "Téléversez n'importe quel document Office ou fichier pdf. Le temps nécessaire au téléversement dépend du volume du fichier.", + "upload_description": "Téléverser tout document Office ou fichier PDF (d'un volume inférieur à {{size}}). Le délai avant de pouvoir utiliser le fichier varie en fonction de son volume.", "are_you_sure_delete_presentation": "Etes-vous sûr de vouloir supprimer cet enregistrement ?" }, "shared_access": { @@ -171,11 +173,15 @@ "published": "Publiée", "unpublished": "Non publiée", "protected": "Protégée", + "public": "Public", + "public_protected": "Public/Protégé", "length_in_minutes": "{{recording.length}} min.", "processing_recording": "L'enregistrement est en cours de traitement, cela peu prendre quelques minutes...", "copy_recording_urls": "Copier l'URL de l'enregistrement", "recordings_list_empty": "Vous n'avez pas encore d'enregistrements!", + "public_recordings_list_empty": "Il n'y pas encore d'enregistrements publics !", "recordings_list_empty_description": "Les enregistrements apparaîtront ici dès que vous aurez réalisé la captation d'une réunion", + "public_recordings_list_empty_description": "Les enregistrements apparaitront ici dès qu'ils seront disponibles.", "delete_recording": "Effacer l'enregistrement", "are_you_sure_delete_recording": "Etes-vous sûr·e de vouloir supprimer cet enregistrement ?", "search_not_found": "Aucun enregistrement trouvé" @@ -255,7 +261,7 @@ "brand_image": "Logo", "click_to_upload": "Cliquez pour téléverser", "drag_and_drop": "ou glissez-déposez", - "upload_brand_image_description": "Téléverser un fichier PNG, JPG ou SVG. Selon le volume du fichier, il se peut que le téléversement prenne plus de temps avant d'être opérationnel.", + "upload_brand_image_description": "Téléversez tout fichier PNG, JPG ou SVG (d'un volume inférieur à {{size}}). Le délai avant de pouvoir utiliser le fichier varie en fonction de son volume.", "remove_branding_image": "Retirer le logo" }, "administration": { @@ -492,6 +498,11 @@ "min": "Le nom doit comporter 2 caractères au minimum " } }, + "room_join": { + "name": { + "required": "Veuillez saisir votre nom." + } + }, "url": { "invalid": "URL non valide" } @@ -504,6 +515,21 @@ } } }, + "room_join": { + "fields": { + "name": { + "label": "Nom", + "placeholder": "Saisissez votre nom" + }, + "access_code": { + "label": "Code d'accès", + "placeholder": "Saisissez le code d'accès" + }, + "recording_consent": { + "label": "Je reconnais savoir que cette session peut être enregistrée. Le cas échéant ma voix et mon image vidéo pourront apparaître lors de la captation." + } + } + }, "user": { "signup": { "fields": { diff --git a/app/assets/locales/gl.json b/app/assets/locales/gl.json new file mode 100644 index 0000000000..4732cc120d --- /dev/null +++ b/app/assets/locales/gl.json @@ -0,0 +1,677 @@ +{ + "start": "Comezar", + "search": "Buscar", + "home": "Inicio", + "previous": "Anterior", + "back": "Atrás", + "next": "Seguinte", + "view": "Ver", + "join": "Unirse", + "edit": "Editar", + "save": "Gardar", + "save_changes": "Gardar os cambios", + "update": "Actualizar", + "report": "Informar", + "share": "Compartir", + "cancel": "Cancelar", + "close": "Pechar", + "delete": "Eliminar", + "copy": "Copiar a ligazón para unirse", + "or": "Ou", + "online": "En liña", + "help_center": "Centro de axuda", + "are_you_sure": "Confirma isto?", + "return_home": "Volver ao inicio", + "created_at": "Creado en", + "view_recordings": "Ver as gravacións", + "join_session": "Únase á sesión", + "no_result_search_input": "Non foi posíbel atopar ningún resultado para «{{ searchInput }}»", + "action_permanent": "Esta acción non se pode desfacer.", + "homepage": { + "welcome_bbb": "Dámoslle a benvida a BigBlueButton!", + "bigbluebutton_description": "BigBlueButton é un sistema de conferencias web de código aberto para clases en liña. A plataforma maximiza o tempo para a aprendizaxe aplicada ao permitir que o alumnado colabore e reciba comentarios en tempo real.", + "greenlight_description": "Cree as súas propias salas para organizar sesións ou xúntese con outras persoas mediante unha ligazón breve e cómoda.", + "learn_more": "Saiba máis sobre BigBlueButton", + "explore_features": "Coñeza as nosas características", + "meeting_title": "Inicie unha xuntanza", + "meeting_description": "Inicie unha clase virtual con vídeo, son, pantalla compartida, parola e todas as ferramentas necesarias para a aprendizaxe aplicada.", + "recording_title": "Grave as súas xuntanzas", + "recording_description": "Grave as xuntanzas de BigBlueButton e compártaas co alumnado para revisar e reflexionar sobre o material.", + "settings_title": "Xestione as súas salas", + "settings_description": "Configure as súas salas e o os axustes das xuntanzas para estar a cargo dunha aula eficaz.", + "and_more_title": "E máis!", + "and_more_description": "BigBlueButton ofrece ferramentas integradas para a aprendizaxe aplicada e está deseñada para aforrarlle tempo durante as clases.", + "enter_meeting_url": "Introduza o URL da xuntanza", + "enter_meeting_url_instruction": "Introduza o URL da súa xuntanza en BigBlueButton no campo seguinte." + }, + "authentication": { + "sign_in": "Acceder", + "sign_up": "Rexistrarse", + "sign_out": "Saír", + "email": "Correo-e", + "password": "Contrasinal", + "confirm_password": "Confirme o contrasinal", + "enter_email": "Introduza o seu correo-e", + "enter_name": "Introduza o seu nome", + "remember_me": "Lembrarme", + "forgot_password": "Esqueceu o contrasinal?", + "dont_have_account": "Non ten unha conta?", + "create_account": "Cree unha conta", + "create_an_account": "Crear unha conta", + "already_have_account": "Xa ten unha conta?" + }, + "user": { + "user": "Usuario", + "users": "Usuarios", + "name": "Nome", + "email_address": "Enderezo de correo-e", + "authenticator": "Autenticador", + "full_name": "Nome completo", + "no_user_found": "Non se atopou ningún usuario", + "type_three_characters": "Escriba tres (3) caracteres ou máis para amosar os outros usuarios.", + "search_not_found": "Non se atopou ningún usuario", + "profile": { + "profile": "Perfil", + "language": "Idioma", + "role": "Rol", + "administrator": "Administrador", + "guest": "Convidado" + }, + "account": { + "account_info": "Información da conta", + "delete_account": "Eliminar a conta", + "change_password": "Cambiar o contrasinal", + "reset_password": "Restabelecer o contrasinal", + "update_account_info": "Actualizar a información da conta", + "current_password": "Contrasinal actual", + "new_password": "Novo contrasinal", + "confirm_password": "Confirmar o contrasinal", + "permanently_delete_account": "Eliminar definitivamente a súa conta", + "delete_account_description": "Se decide eliminar a súa conta, NON será recuperábel. \n Eliminarase toda a información relativa á súa conta, incluídos os axustes, as salas e as gravacións.", + "delete_account_confirmation": "Si, quero eliminar a miña conta", + "are_you_sure_delete_account": "Confirma que quere eliminar a súa conta?" + }, + "avatar": { + "upload_avatar": "Enviar o avatar", + "delete_avatar": "Eliminar o avatar", + "crop_avatar": "Recortar o seu avatar" + }, + "pending": { + "title": "Agardando polo rexistro", + "message": "Grazas por rexistrarse! A súa conta está pendente da aprobación por un administrador." + } + }, + "room": { + "room": "Sala", + "rooms": "Salas", + "room_name": "Nome da sala", + "add_new_room": "+ Nova sala", + "create_room": "Crear unha sala", + "delete_room": "Eliminar a sala", + "create_new_room": "Crear unha nova sala", + "enter_room_name": "Introduza o nome da sala", + "shared_by": "compartida por ", + "last_session": "Última sesión: {{ localizedTime }}", + "no_last_session": "Non foi creada creou ningunha sesión anterior", + "search_not_found": "Non se atopou ningunha sala", + "rooms_list_is_empty": "Vde. aínda non ten salas!", + "rooms_list_empty_create_room": "Cree a súa primeira sala premendo no botón de embaixo e introducindo o nome da sala.", + "meeting": { + "start_meeting": "Comezar a xuntanza", + "join_meeting": "Unirse á xuntanza", + "meeting_invitation": "Convidárono a unirse", + "meeting_not_started": "A xuntanza aínda non comezou", + "join_meeting_automatically": "Unirase automaticamente cando comece a xuntanza", + "recording_consent": "Recoñezo que esta sesión pode ser gravada. Isto pode incluír a miña voz e vídeo se está activado." + }, + "presentation": { + "presentation": "Presentación", + "click_to_upload": "Prema para enviar", + "drag_and_drop": " ou arrastre e solte", + "upload_description": "Envíe calquera documento de oficina ou ficheiro PDF (non maior que {{size}}). Dependendo do tamaño do ficheiro, pode requirir un tempo adicional para envialo antes de poder utilizalo", + "are_you_sure_delete_presentation": "Confirma que quere eliminar esta presentación?" + }, + "shared_access": { + "access": "Acceso", + "add_share_access": "+ Compartir o acceso", + "share_room_access": "Compartir o acceso á sala", + "add_some_users": "É o momento de engadir algúns usuarios!", + "add_some_users_description": "Para engadir novos usuarios, prema no botón de embaixo e busque ou seleccione os usuarios cos que quere compartir esta sala.", + "delete_shared_access": "Eliminar o acceso compartido", + "are_you_sure_delete_shared_access": "Confirma que quere eliminar este acceso compartido?" + }, + "settings": { + "settings": "Axustes", + "room_name": "Nome da sala", + "user_settings": "Axustes de usuario", + "allow_room_to_be_recorded": "Permitir que se grave a sala", + "require_signed_in": "Precisar que os usuarios se autentiquen antes de unirse", + "require_signed_in_message": "Ten que autenticarse para unirse a esta sala.", + "require_mod_approval": "Precisar a aprobación do moderador antes de unirse", + "allow_any_user_to_start": "Permitir que calquera usuario inicie esta xuntanza", + "all_users_join_as_mods": "Todos os usuarios únense como moderadores", + "mute_users_on_join": "Silenciar os usuarios cando se unan", + "generate": "Xerar", + "access_code": "Código de acceso", + "mod_access_code": "Código de acceso de moderador", + "mod_access_code_optional": "Código de acceso de moderador (opcional)", + "access_code_required": "Introduza o código de acceso", + "wrong_access_code": "Código de acceso incorrecto", + "generate_viewers_access_code": "Xerar un código de acceso para os espectadores", + "generate_mods_access_code": "Xerar un código de acceso para os moderadores", + "are_you_sure_delete_room": "Confirma que quere eliminar esta sala?" + } + }, + "recording": { + "recording": "Gravación", + "recordings": "Gravacións", + "name": "Nome", + "length": "Duración", + "users": "Usuarios", + "visibility": "Visibilidade", + "formats": "Formatos", + "published": "Publicada", + "unpublished": "Sen publicar", + "protected": "Protexida", + "public": "Publica", + "public_protected": "Publica/protexida", + "length_in_minutes": "{{recording.length}} min.", + "processing_recording": "Procesando a gravación, isto pode levar varios minutos…", + "copy_recording_urls": "Copiar o(s) URL da(s) gravación(s)", + "recordings_list_empty": "Vde. aínda non ten ningunha gravación!", + "public_recordings_list_empty": "Aínda non hai gravacións públicas!", + "recordings_list_empty_description": "As gravacións aparecerán aquí após iniciar unha xuntanza e gravala.", + "public_recordings_list_empty_description": "As gravacións aparecerán aquí cando estean dispoñíbeis.", + "delete_recording": "Eliminar a gravación", + "are_you_sure_delete_recording": "Confirma que quere eliminar esta gravación?", + "search_not_found": "Non se atopou ningunha gravación" + }, + "admin": { + "admin_panel": "Panel de administración", + "manage_users": { + "manage_users": "Xestionar os usuarios", + "active": "Activo", + "approve": "Aprobar", + "decline": "Declinar", + "pending": "Pendente", + "banned": "Expulsado", + "ban": "Expulsar", + "unban": "Anular a expulsión", + "deleted": "Eliminado", + "invited_tab": "Convidado", + "invite_user": "Convidar a usuario", + "send_invitation": "Enviar convite", + "enter_user_email": "Introduza o correo do usuario", + "new_user": "Novo usuario", + "add_new_user": "Novo usuario", + "create_new_user": "Crear un novo usuario", + "edit_user": "Editar o usuario", + "delete_user": "Eliminar o usuario", + "users_edit_path": "Usuarios/editar", + "create_account": "Cree unha conta", + "create_room": "Crear unha sala", + "create_new_room": "Crear unha nova sala", + "user_created_at": "Creada: {{localizedTime}}", + "are_you_sure_delete_account": "Confirma que quere eliminar a conta de {{user.name}}?", + "delete_account_warning": "Se decide eliminar esta conta, NON será recuperábel.", + "empty_active_users": "Aínda non hai usuarios activos neste servidor!", + "empty_active_users_subtext": "Cando o estado dun usuario cambia a activo, aparece aquí.", + "empty_pending_users": "Aínda non hai usuarios pendentes neste servidor!", + "empty_pending_users_subtext": "Cando o estado dun usuario cambia a pendente, aparece aquí.", + "empty_banned_users": "Aínda non hai usuarios expulsados neste servidor!", + "empty_banned_users_subtext": "Cando o estado dun usuario cambia a expulsado, aparece aquí.", + "empty_invited_users": "Aínda non hai usuarios convidados neste servidor!", + "empty_invited_users_subtext": "Cando o estado dun usuario cambia a convidado, aparece aquí.", + "invited": { + "time_sent": "Hora de envío", + "valid": "Valida" + } + }, + "server_rooms": { + "server_rooms": "Salas no servidor", + "name": "Nome", + "owner": "Propietario", + "room_id": "ID da sala", + "participants": "Participantes", + "status": "Estado", + "running": "En progreso", + "not_running": "Sen actividade", + "active": "Activa", + "current_session": "Sesión actual: {{lastSession}}", + "last_session": "Última sesión: {{localizedTime}}", + "no_meeting_yet": "Aínda non hai xuntanzas.", + "delete_server_rooms": "Eliminar a sala do servidor", + "resync_recordings": "Volver sincronizar as gravacións", + "empty_room_list": "Aínda non hai salas no servidor!", + "empty_room_list_subtext": "As salas aparecerán aquí após crear a súa primeira sala." + }, + "server_recordings": { + "server_recordings": "Gravacións no servidor", + "latest_recordings": "Últimas gravacións", + "no_recordings_found": "Non se atopou ningunha gravación" + }, + "site_settings": { + "site_settings": "Axustes do sitio", + "customize_greenlight": "Personalizar Greenlight", + "appearance": { + "appearance": "Aparencia", + "brand_color": "Cor corporativa", + "regular": "Normal", + "lighten": "Claro", + "brand_image": "Imaxe corporativa", + "click_to_upload": "Prema para enviar", + "drag_and_drop": " ou arrastre e solte", + "upload_brand_image_description": "Envíe calquera ficheiro PNG, JPG, ou SVG (non maior que {{size}}). Dependendo do tamaño do ficheiro, pode requirir un tempo adicional para envialo antes de poder utilizalo", + "remove_branding_image": "Retirar a imaxe corporativa" + }, + "administration": { + "administration": "Administración", + "terms": "Terms & Conditions", + "privacy": "Directiva de privacidade", + "privacy_policy": "Directiva de privacidade", + "change_term_links": "Cambiar as ligazóns das condicións que aparecen na parte inferior da páxina", + "change_privacy_link": "Cambiar a ligazón de privacidade que aparece na parte inferior da páxina", + "change_url": "Cambiar o URL", + "enter_link": "Introduza aquí a ligazón" + }, + "settings": { + "settings": "Axustes", + "allow_users_to_share_rooms": "Permitir aos usuarios compartir salas", + "allow_users_to_share_rooms_description": "Se o axusta como desactivado, o botón desaparecerá do menú despregábel de opcións de sala, o que impedirá que os usuarios compartan salas", + "allow_users_to_preupload_presentation": "Permitir aos usuarios enviar previamente presentacións", + "allow_users_to_preupload_presentation_description": "Os usuarios poden enviar previamente unha presentación para utilizala como presentación predeterminada para esa sala específica" + }, + "registration": { + "registration": "Rexistro", + "role_mapping_by_email": "Asignación de roles por correo", + "role_mapping_by_email_description": "Asigne o usuario a un rol usando o seu correo electrónico. Debe ter o formato: rol1=correo-e1, rol2=correo-e2", + "enter_role_mapping_rule": "Introduza unha regra de asignación de roles", + "resync_on_login": "Volver sincronizar os datos do usuario en cada acceso", + "resync_on_login_description": "Volver sincronizar a información dun usuario cada vez que acceda, facendo que o provedor de autenticación externo coincida sempre coa información en Greenlight", + "default_role": "Rol predeterminado", + "default_role_description": "O rol predeterminado que se asignará aos usuarios que vén de crear", + "registration_method": "Método de rexistro", + "registration_method_description": "Cambiar o xeito no que os usuarios se rexistran no sitio web", + "registration_methods" : { + "open": "Rexistro aberto", + "invite": "Unirse por convite", + "approval": "Aceptar/declinar" + } + } + }, + "room_configuration": { + "room_configuration": "Configuración da sala", + "default": "Opcional (predeterminado: activado)", + "optional": "Opcional (predeterminado: desactivado)", + "enabled": "Forzar a activado", + "disabled": "Desactivado", + "configurations": { + "allow_room_to_be_recorded": "Permitir que se grave a sala", + "allow_room_to_be_recorded_description": "Permite aos propietarios das salas especificar se queren a opción de gravar unha sala ou non. Se está activado, o moderador aínda debe premer no botón «Gravar» unha vez que comece a xuntanza.", + "require_user_signed_in": "Precisar que os usuarios se autentiquen antes de unirse", + "require_user_signed_in_description": "Só permite que os usuarios cunha conta Greenlight se unan á reunión. Se non se autenticaron, serán redirixidos á páxina de acceso cando tenten unirse a unha sala.", + "require_mod_approval": "Precisar a aprobación do moderador antes de unirse", + "require_mod_approval_description": "Avisar ao moderador da xuntanza de BigBlueButton cando un usuario tenta unirse. Se o usuario é aprobado, poderá unirse á reunión.", + "allow_any_user_to_start_meeting": "Permitir que calquera usuario inicie unha xuntanza", + "allow_any_user_to_start_meeting_description": "Permitir que calquera usuario inicie a xuntanza en calquera momento. De xeito predeterminado, só o propietario da sala pode iniciar a xuntanza.", + "allow_users_to_join_as_mods": "Todos os usuarios únense como moderadores", + "allow_users_to_join_as_mods_description": "Concede a todos os usuarios os privilexios de moderador en BigBlueButton cando se unen á xuntanza", + "mute_users_on_join": "Silenciar os usuarios cando se unan", + "mute_users_on_join_description": "Silenciar automaticamente ao usuario cando se une á xuntanza de BigBlueButton", + "viewer_access_code": "Código de acceso de espectador", + "viewer_access_code_description": "Permite aos propietarios das salas ter un código alfanumérico ao chou que poden compartir cos usuarios. O código, se se xera, será necesario para que os usuarios se unan ás xuntanzas da sala.", + "mod_access_code": "Código de acceso de moderador", + "mod_access_code_description": "Permite aos propietarios das salas ter un código alfanumérico ao chou que poden compartir cos usuarios. O código, se se xera, non será necesario para unirse e, cando se use en calquera xuntanza da sala, o usuario será promovido a moderador." + } + }, + "roles": { + "role": "Rol", + "roles": "Roles", + "administrator": "Administrador", + "guest": "Convidado", + "manage_roles": "Xestionar os roles", + "delete_role": "Eliminar o rol", + "are_you_sure_delete_role": "Confirma que quere eliminar este rol?", + "enter_role_name": "Introduza un nome de rol", + "add_role": "+ Crear un rol", + "create_role": "Crear un rol", + "create_new_role": "Crear un novo rol", + "no_role_found": "Non se atopou ningún rol", + "search_not_found": "Non se atopou ningún rol", + "edit": { + "create_room": "Permitir que os usuarios con este rol creen salas", + "record": "Permitir que os usuarios con este rol graven as súas xuntanzas", + "manage_users": "Permitir que usuarios con este rol xestionen os usuarios", + "manage_rooms": "Permitir que os usuarios con este rol xestionen salas de servidores", + "manage_recordings": "Permitir que os usuarios con este rol xestionen as gravacións do servidor", + "manage_site_settings": "Permitir que os usuarios con este rol xestionen os axustes do sitio", + "manage_roles": "Permitir que os usuarios con este rol editen outros roles", + "shared_list": "Incluir os usuarios con este rol no menú despregábel para compartir salas", + "room_limit": "Límite de salas" + } + } + }, + "toast": { + "success": { + "user": { + "user_created": "Creouse un novo usuario.", + "user_updated": "O usuario foi actualizado.", + "user_deleted": "O usuario foi eliminado.", + "avatar_updated": "O avatar foi actualizado.", + "password_updated": "O contrasinal foi actualizado.", + "account_activated": "A súa conta foi activada.", + "activation_email_sent": "Enviouse un correo que contén as instrucións para activar a súa conta.", + "reset_pwd_email_sent": "Enviouse un correo que contén as instrucións para restabelecer o seu contrasinal." + }, + "session": { + "signed_out": "Vde. saíu da sesión." + }, + "room": { + "room_created": "Creouse unha nova sala.", + "room_updated": "A sala foi actualizada", + "room_deleted": "A sala foi eliminada.", + "room_shared": "A sala foi compartida", + "room_unshared": "A sala non está compartida", + "recordings_synced": "Sincronizáronse as gravacións da sala.", + "room_configuration_updated": "Foi actualizada a configuración da sala.", + "room_setting_updated": "Foron actualizados os axustes da sala. ", + "presentation_updated": "Foi actualizada a presentación", + "presentation_deleted": "A presentación foi eliminada", + "joining_meeting": "Uníndose á xuntanza…", + "meeting_started": "Comezou a xuntanza", + "access_code_copied": "O código de acceso foi copiado.", + "access_code_generated": "Xerouse un novo código de acceso.", + "access_code_deleted": "O código de acceso foi eliminado.", + "copied_meeting_url": "Copiouse o URL da xuntanza. Pódese empregar a ligazón para unirse á xuntanza." + }, + "site_settings": { + "site_setting_updated": "Foron actualizados os axustes do sitio.", + "brand_color_updated": "A cor corporativa foi actualizada.", + "brand_image_updated": "A imaxe corporativa foi actualizada.", + "brand_image_deleted": "A imaxe corporativa foi eliminada.", + "privacy_policy_updated": "A directiva de pivacidade foi actualizada.", + "terms_of_service_updated": "Actualizáronse as condicións do servizo." + }, + "recording": { + "recording_visibility_updated": "Foi actualizada a visibilidade da gravación.", + "recording_name_updated": "Foi actualizado o nome da gravación.", + "recording_deleted": "A gravación foi eliminada.", + "copied_urls": "Copiáronse os URL das gravacións." + }, + "role": { + "role_created": "Creouse un novo rol", + "role_updated": "O rol foi actualizado.", + "role_deleted": "O rol foi eliminado.", + "role_permission_updated": "Foron actualizados os permisos de rol." + }, + "invitations": { + "invitation_sent": "Enviouse un convite" + } + }, + "error": { + "problem_completing_action": "Non é posíbel completar a acción.\n Tenteo de novo.", + "file_type_not_supported": "O tipo de ficheiro non é compatible.", + "file_size_too_large": "O ficheiro é demasiado grande.", + "file_upload_error": "Non é posíbel enviar o ficheiro.", + "signin_required": "Ten que autenticarse para acceder a esta páxina.", + "roles": { + "role_assigned": "Non é posíbel eliminar este rol porque está asignado a polo menos un usuario." + }, + "users": { + "signup_error": "Non é posíbel autenticalo. Póñase en contacto coa administración do sitio.", + "invalid_invite": "O seu testemuño de convite non é válido ou é incorrecto. Póñase en contacto coa administración do sitio para recibir un novo testemuño.", + "email_exists": "Xa existe unha conta con este correo Ténteo de novo con outro correo.", + "old_password": "O contrasinal que introduciu non é correcto.", + "pending": "O seu rexistro está pendente da aprobación pola administración. Volva tentalo máis adiante.", + "banned": "Non ten acceso a esta aplicación. Póñase en contacto coa administración do sitio se cree que se trata dun erro." + }, + "rooms": { + "room_limit": "Non é posíbel crear a sala porque se alcanzou o límite de salas." + }, + "session": { + "invalid_credentials": "Ou o nome de usuario ou o contrasinal non é válido. Verifique as súas credenciais e ténteo de novo." + } + } + }, + "global_error_page": { + "title": "Erro", + "message": "Sentímolo, algo foi mal. Se o incidente ocorre de novo, póñase en contacto coa administración do sitio." + }, + "not_found_error_page": { + "title": "Non se atopou a páxina", + "message": "Sentímolo, non é posíbel atopar a páxina á que está tentando acceder." + }, + "account_activation_page": { + "title": "Activación da conta", + "account_unverified": "A súa conta aínda non foi verificada.", + "message": "Para usar Greenlight, verifique a súa conta seguindo as instrucións do correo de activación que se lle enviou.", + "resend_activation_link": "Se non recibiu un correo de activación ou ten problemas para usalo, prema no botón de embaixo para solicitar un novo correo de activación.", + "resend_btn_lbl": "Volver enviar a verificación" + }, + "forms": { + "validations": { + "full_name": { + "required": "Introduza un nome completo", + "min": "O nome debe ter polo menos 2 caracteres", + "max": "O nome pode ter como máximo 255 caracteres" + }, + "email": { + "required": "Introduza un correo", + "email": "O valor introducido non coincide co formato de correo-e", + "min": "O correo electrónico debe ter polo menos 6 caracteres", + "max": "O nome correo ter como máximo 255 caracteres" + }, + "password": { + "required": "Introduza un contrasinal", + "match": "O contrasinal debe ter polo menos:", + "min": "– Oito caracteres", + "lower": "– Unha letra minúscula", + "upper": "– Unha letra maiúscula", + "digit": "– Un número", + "symbol": "– Un símbolo", + "max": "O contrasinal pode ter como máximo 255 caracteres" + }, + "password_confirmation": { + "required": "Introduza unha confirmación do contrasinal", + "match": "Os contrasinais non coinciden" + }, + "emails": { + "required": "Introduza polo menos un correo-e válido", + "list": "Forneza unha lista de correos válidos separados por comas (usuario@usuarios.com, usuario1@usuarios.com, usuario2@usuarios.com)" + }, + "role_name": { + "required": "Introduza o nome do rol" + }, + "role": { + "limit": { + "required": "Introduza o límite do número de salas", + "min": "O mínimo permitido é 0", + "max": "O máximo permitido é 100" + }, + "type": { + "error": "Debes especificar un número" + } + }, + "room": { + "name": { + "required": "Introduza o nome da sala.", + "min": "O nome debe ter polo menos 2 caracteres" + } + }, + "room_join": { + "name": { + "required": "Introduza o seu nome." + } + }, + "url": { + "invalid": "URL incorrecto" + } + }, + "room": { + "fields": { + "name": { + "label": "Nome da sala", + "placeholder": "Introduza un nome de sala…" + } + } + }, + "room_join": { + "fields": { + "name": { + "label": "Nome", + "placeholder": "Introduza o seu nome" + }, + "access_code": { + "label": "Código de acceso", + "placeholder": "Introduza o código de acceso" + }, + "recording_consent": { + "label": "Recoñezo que esta sesión pode ser gravada. Isto pode incluír a miña voz e vídeo se está activado." + } + } + }, + "user": { + "signup": { + "fields": { + "full_name": { + "label": "Nome completo", + "placeholder": "Introduza o seu nome completo" + }, + "email": { + "label": "Correo-e", + "placeholder": "Introduza o seu correo-e" + }, + "password": { + "label": "Contrasinal", + "placeholder": "Crear un contrasinal" + }, + "password_confirmation": { + "label": "Confirmar o contrasinal", + "placeholder": "Confirmar o contrasinal" + } + } + }, + "signin": { + "fields": { + "email": { + "label": "Correo-e", + "placeholder": "Correo-e" + }, + "password": { + "label": "Contrasinal", + "placeholder": "Contrasinal" + }, + "remember_me": { + "label": "Lembrarme" + } + } + }, + "change_password": { + "fields": { + "old_password": { + "label": "Contrasinal actual", + "placeholder": "Introduza o seu contrasinal" + }, + "new_password": { + "label": "Novo contrasinal", + "placeholder": "Introduza o seu contrasinal" + }, + "password_confirmation": { + "label": "Confirmar o contrasinal", + "placeholder": "Confirmar o seu novo contrasinal" + } + }, + "validations": { + "old_password": { + "required": "Introduza o seu contrasinal actual" + } + } + }, + "forget_password": { + "fields": { + "email": { + "label": "Correo-e", + "placeholder": "Introduza o correo da conta" + } + }, + "validations": { + "email": { + "required": "Introduza o correo da conta" + } + } + }, + "reset_password": { + "fields": { + "new_password": { + "label": "Novo contrasinal", + "placeholder": "Introduza o seu novo contrasinal" + }, + "password_confirmation": { + "label": "Confirmar o contrasinal", + "placeholder": "Confirmar o seu novo contrasinal" + } + } + }, + "update_user": { + "fields": { + "full_name": { + "label": "Nome completo" + }, + "email": { + "label": "Correo-e" + }, + "language": { + "label": "Idioma" + }, + "role": { + "label": "Rol" + } + } + } + }, + "admin": { + "createUser": { + "fields": { + "full_name": { + "label": "Nome completo", + "placeholder": "Introduza o nome completo do usuario" + }, + "email": { + "label": "Correo-e", + "placeholder": "Introduza o correo do usuario" + }, + "password": { + "label": "Contrasinal", + "placeholder": "Introduza o contrasinal do usuario" + }, + "password_confirmation": { + "label": "Confirmar o contrasinal", + "placeholder": "Confirmar o contrasinal" + } + } + }, + "invite_user": { + "fields": { + "emails": { + "label": "Correos-e" + } + } + }, + "site_settings": { + "fields": { + "value": { + "placeholder": "Introduza aquí a ligazón…" + } + } + }, + "roles": { + "fields": { + "name": { + "label": "Nome do rol", + "placeholder": "Introduza un nome de rol…" + } + } + } + } + } +} diff --git a/app/assets/locales/hu.json b/app/assets/locales/hu.json index 4fef53d68e..f73b1042be 100644 --- a/app/assets/locales/hu.json +++ b/app/assets/locales/hu.json @@ -23,6 +23,8 @@ "are_you_sure": "Biztos benne?", "return_home": "Vissza a kezdőlapra", "created_at": "Létrehozva:", + "view_recordings": "Felvételek megtekintése", + "join_session": "Csatlakozás a munkamenethez", "no_result_search_input": "Nincs találat a következőre: „{{ searchInput }}”", "action_permanent": "Ez a művelet nem vonható vissza.", "homepage": { @@ -126,7 +128,7 @@ "presentation": "Bemutató", "click_to_upload": "Kattintson a feltöltéshez", "drag_and_drop": "vagy húzza és ejtse ide", - "upload_description": "Tetszőleges irodai dokumentum vagy PDF-fájl feltöltése. A fájl méretétől függően több időre lehet szükség, mielőtt használható lesz.", + "upload_description": "Tetszőleges dokumentum- vagy PDF-fájl (nem nagyobb, mint {{size}}). A használata előtt a fájl méretétől függően idő szükséges a feltöltéséhez.", "are_you_sure_delete_presentation": "Biztos, hogy törli ezt a bemutatót?" }, "shared_access": { @@ -171,11 +173,15 @@ "published": "Közzétéve", "unpublished": "Nincs közzétéve", "protected": "Védett", + "public": "Nyilvános", + "public_protected": "Nyilvános /Védett", "length_in_minutes": "{{recording.length}} perc", "processing_recording": "A felvétel feldolgozása néhány percig eltarthat...", "copy_recording_urls": "Felvételek webcímének másolása", "recordings_list_empty": "Még nincs egy felvétele sem.", + "public_recordings_list_empty": "Még egy nyilvános felvétel sincs!", "recordings_list_empty_description": "A felvételek itt fognak megjelenni, ha indít és felvesz egy találkozót.", + "public_recordings_list_empty_description": "Az elérhető felvételek itt jelennek meg.", "delete_recording": "Felvétel törlése", "are_you_sure_delete_recording": "Biztos, hogy törli ezt a felvételt?", "search_not_found": "Nem található felvétel" @@ -255,7 +261,7 @@ "brand_image": "Márkakép", "click_to_upload": "Kattintson a feltöltéshez", "drag_and_drop": "vagy húzza és ejtse ide", - "upload_brand_image_description": "Töltsön fel egy tetszőleges PNG, JPG vagy SVG-fájlt. A fájl méretétől függően több időre lehet szükség, mielőtt használható lesz.", + "upload_brand_image_description": "Tetszőleges PNG, JPG, vagy SVG fájl (nem nagyobb, mint {{size}}). A használata előtt a fájl méretétől függően idő szükséges a feltöltéséhez.", "remove_branding_image": "Márkakép eltávolítása" }, "administration": { @@ -492,6 +498,11 @@ "min": "A névnek legalább 2 karakteresnek kell lennie" } }, + "room_join": { + "name": { + "required": "Adja meg a nevét." + } + }, "url": { "invalid": "Érvénytelen webcím" } @@ -504,6 +515,21 @@ } } }, + "room_join": { + "fields": { + "name": { + "label": "Név", + "placeholder": "Adja meg a nevét" + }, + "access_code": { + "label": "Hozzáférési kód", + "placeholder": "Adja meg a hozzáférési kódot" + }, + "recording_consent": { + "label": "Tudomásul veszem, hogy ez a munkamenet rögzíthető. Ez vonatkozik a hangomra és a videómra, ha be van kapcsolva." + } + } + }, "user": { "signup": { "fields": { diff --git a/app/assets/locales/tr.json b/app/assets/locales/tr.json index fe5466df51..caa315b28f 100644 --- a/app/assets/locales/tr.json +++ b/app/assets/locales/tr.json @@ -18,7 +18,7 @@ "delete": "Sil", "copy": "Kopyala", "or": "Veya", - "online": "Çevrimiçi", + "online": "Çevrim içi", "help_center": "Yardım merkezi", "are_you_sure": "Emin misiniz?", "return_home": "Girişe dön", @@ -29,7 +29,7 @@ "action_permanent": "Bu işlem geri alınamaz.", "homepage": { "welcome_bbb": "BigBlueButton uygulamasına hoş geldiniz.", - "bigbluebutton_description": "BigBlueButton, çevrimiçi sınıflar için açık kaynaklı bir web konferans sistemidir. Platform, öğrencilerin gerçek zamanlı olarak işbirliği yapmalarını ve geri bildirim almalarını sağlayarak uygulamalı öğrenme zamanının en iyi şekilde kullanılmasını sağlar.", + "bigbluebutton_description": "BigBlueButton, çevrim içi sınıflar için açık kaynaklı bir internet konferansı sistemidir. Platform, öğrencilerin gerçek zamanlı olarak işbirliği yapmalarını ve geri bildirim almalarını sağlayarak uygulamalı öğrenme zamanının en iyi şekilde kullanılmasını sağlar.", "greenlight_description": "Oturumları başlatmak için kendi odalarınızı oluşturun ya da kısa ve kullanışlı bir bağlantı ile başkalarının odalarına katılın.", "learn_more": "BigBlueButton hakkında ayrıntılı bilgi alın", "explore_features": "Özelliklerimizi keşfedin", @@ -291,7 +291,7 @@ "default_role": "Varsayılan rol", "default_role_description": "Yeni eklenen kullanıcılara atanacak varsayılan rol", "registration_method": "Hesap açma yöntemi", - "registration_method_description": "Kullanıcıların web sitesinde hesap açma yöntemini değiştirin", + "registration_method_description": "Kullanıcıların sitede hesap açma yöntemini değiştirin", "registration_methods" : { "open": "Serbest hesap açma", "invite": "Çağrı ile katılma", @@ -477,7 +477,7 @@ }, "emails": { "required": "Lütfen en az bir geçerli e-posta adresi yazın", - "list": "Lütfen virgül ile ayırarak e-posta adresleri listesini yazın (kullanici@websitesi.com,kullanici1@websitesi.com,kullanici2@websitesi.com)" + "list": "Lütfen virgül ile ayırarak e-posta adresleri listesini yazın (kullanici@site.com,kullanici1@site.com,kullanici2@site.com)" }, "role_name": { "required": "Lütfen rolün adını yazın" diff --git a/app/controllers/api/v1/admin/server_rooms_controller.rb b/app/controllers/api/v1/admin/server_rooms_controller.rb index c45fdc15ca..f509982642 100644 --- a/app/controllers/api/v1/admin/server_rooms_controller.rb +++ b/app/controllers/api/v1/admin/server_rooms_controller.rb @@ -36,7 +36,7 @@ def index pagy, paged_rooms = pagy(rooms) - RunningMeetingChecker.new(rooms: paged_rooms.select(&:online)).call if paged_rooms.select(&:online).any? + RunningMeetingChecker.new(rooms: paged_rooms.select(&:online)).call if paged_rooms.any?(&:online) render_data data: paged_rooms, meta: pagy_metadata(pagy), serializer: ServerRoomSerializer, status: :ok end diff --git a/app/controllers/api/v1/migrations/external_controller.rb b/app/controllers/api/v1/migrations/external_controller.rb index 923f657a8d..f9d39c1537 100644 --- a/app/controllers/api/v1/migrations/external_controller.rb +++ b/app/controllers/api/v1/migrations/external_controller.rb @@ -231,7 +231,8 @@ def user_params def room_params decrypted_params.require(:room).permit(:name, :friendly_id, :meeting_id, :last_session, :owner_email, :provider, shared_users_emails: [], - room_settings: %w[record muteOnStart guestPolicy glAnyoneCanStart glAnyoneJoinAsModerator]) + room_settings: %w[record muteOnStart guestPolicy glAnyoneCanStart glAnyoneJoinAsModerator + glViewerAccessCode glModeratorAccessCode]) end def settings_params diff --git a/app/controllers/api/v1/rooms_configurations_controller.rb b/app/controllers/api/v1/rooms_configurations_controller.rb index 66524eb4a8..1b20935426 100644 --- a/app/controllers/api/v1/rooms_configurations_controller.rb +++ b/app/controllers/api/v1/rooms_configurations_controller.rb @@ -45,7 +45,7 @@ def show render_data data: config_value, status: :ok rescue StandardError - return render_error status: :not_found unless config_value + render_error status: :not_found unless config_value end end end diff --git a/app/controllers/api/v1/rooms_controller.rb b/app/controllers/api/v1/rooms_controller.rb index 0d8682ee8c..585c96a4c5 100644 --- a/app/controllers/api/v1/rooms_controller.rb +++ b/app/controllers/api/v1/rooms_controller.rb @@ -51,7 +51,7 @@ def index room.shared = true if room.user_id != current_user.id end - RunningMeetingChecker.new(rooms: rooms.select(&:online)).call if rooms.select(&:online).any? + RunningMeetingChecker.new(rooms: rooms.select(&:online)).call if rooms.any?(&:online) render_data data: rooms, status: :ok end diff --git a/app/controllers/api/v1/sessions_controller.rb b/app/controllers/api/v1/sessions_controller.rb index e51896137b..d764ad97f0 100644 --- a/app/controllers/api/v1/sessions_controller.rb +++ b/app/controllers/api/v1/sessions_controller.rb @@ -26,7 +26,7 @@ class SessionsController < ApiController def index return render_data data: current_user, serializer: CurrentUserSerializer, status: :ok if current_user - render_data data: { signed_in: false }, status: :ok + render_data data: { signed_in: false, default_locale: ENV.fetch('DEFAULT_LOCALE', nil) }, status: :ok end # POST /api/v1/sessions diff --git a/app/controllers/api/v1/verify_account_controller.rb b/app/controllers/api/v1/verify_account_controller.rb index 8be2b92f61..a0e4430ad5 100644 --- a/app/controllers/api/v1/verify_account_controller.rb +++ b/app/controllers/api/v1/verify_account_controller.rb @@ -62,7 +62,7 @@ def find_user_and_authorize return render_error status: :bad_request unless params[:user] @user = User.find_by id: params[:user][:id] - return render_data status: :ok unless @user && !@user.verified? + render_data status: :ok unless @user && !@user.verified? end end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 69093e9be1..69795c8d4c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -78,6 +78,7 @@ def append_info_to_payload(payload) def invalid_session?(user) return true if user&.session_token != session[:session_token] return true if user&.session_expiry && DateTime.now > user&.session_expiry + return true if !user.super_admin? && user.provider != current_provider false end diff --git a/app/controllers/concerns/authorizable.rb b/app/controllers/concerns/authorizable.rb index 5de6097dda..cea926b72b 100644 --- a/app/controllers/concerns/authorizable.rb +++ b/app/controllers/concerns/authorizable.rb @@ -21,17 +21,17 @@ module Authorizable # Unless the request format is explicitly json Rails will mitigate the responsibility to CSR to handle it. def ensure_valid_request - return render 'components/index' if !Rails.env.development? && !valid_api_request? + render 'components/index' if !Rails.env.development? && !valid_api_request? end # Ensures that the user is logged in def ensure_authenticated - return render_error status: :unauthorized unless current_user + render_error status: :unauthorized unless current_user end # PermissionsChecker service will return a true or false depending on whether the current_user's role has the provided permission_name def ensure_authorized(permission_names, user_id: nil, friendly_id: nil, record_id: nil) - return render_error status: :forbidden unless PermissionsChecker.new( + render_error status: :forbidden unless PermissionsChecker.new( current_user:, permission_names:, user_id:, @@ -42,7 +42,7 @@ def ensure_authorized(permission_names, user_id: nil, friendly_id: nil, record_i end def ensure_super_admin - return render_error status: :forbidden unless current_user.super_admin? + render_error status: :forbidden unless current_user.super_admin? end private diff --git a/app/controllers/concerns/presentable.rb b/app/controllers/concerns/presentable.rb index 6ab661f5d2..06a59f201e 100644 --- a/app/controllers/concerns/presentable.rb +++ b/app/controllers/concerns/presentable.rb @@ -20,7 +20,7 @@ module Presentable extend ActiveSupport::Concern def presentation_file_name(room) - return room.presentation.filename if room.presentation.attached? + room.presentation.filename if room.presentation.attached? end def presentation_thumbnail(room) diff --git a/app/javascript/RootBoundary.jsx b/app/javascript/RootBoundary.jsx index be9777c084..82ff69fb94 100644 --- a/app/javascript/RootBoundary.jsx +++ b/app/javascript/RootBoundary.jsx @@ -18,6 +18,7 @@ import React from 'react'; import { useRouteError } from 'react-router-dom'; import DefaultErrorPage from './components/errors/DefaultErrorPage'; import NotFoundPage from './components/errors/NotFoundPage'; +import ForbiddenRouter from './routes/ForbiddenRouter'; export default function RootBoundary() { const error = useRouteError(); @@ -26,6 +27,8 @@ export default function RootBoundary() { switch (status) { case 404: return ; + case 403: + return ; default: return ; } diff --git a/app/javascript/components/recordings/RecordingRow.jsx b/app/javascript/components/recordings/RecordingRow.jsx index 048906011c..a465a27ded 100644 --- a/app/javascript/components/recordings/RecordingRow.jsx +++ b/app/javascript/components/recordings/RecordingRow.jsx @@ -181,13 +181,14 @@ export default function RecordingRow({ )} } + modalButton={} body={( - { t('room.shared_by')} + { t('room.shared_by')} {' '} { ownerName } diff --git a/app/javascript/components/rooms/room/join/JoinCard.jsx b/app/javascript/components/rooms/room/join/JoinCard.jsx index 8862a1b29f..41ac6ac491 100644 --- a/app/javascript/components/rooms/room/join/JoinCard.jsx +++ b/app/javascript/components/rooms/room/join/JoinCard.jsx @@ -48,9 +48,10 @@ export default function JoinCard() { const currentUser = useAuth(); const { friendlyId } = useParams(); const [hasStarted, setHasStarted] = useState(false); + const [joinInterval, setJoinInterval] = useState(); const publicRoom = usePublicRoom(friendlyId); - const roomStatusAPI = useRoomStatus(friendlyId); + const roomStatusAPI = useRoomStatus(friendlyId, joinInterval); const { data: env } = useEnv(); @@ -76,6 +77,8 @@ export default function JoinCard() { } roomStatusAPI.mutate(data); + const interval = setInterval(() => roomStatusAPI.mutate(data), 5000); + setJoinInterval(interval); }; const reset = () => { setHasStarted(false); };// Reset pipeline; @@ -102,6 +105,8 @@ export default function JoinCard() { // Play a sound and displays a toast when the meeting starts if the user was in a waiting queue const notifyMeetingStarted = () => { + clearInterval(joinInterval); + const audio = new Audio(`${process.env.RELATIVE_URL_ROOT}/audios/notify.mp3`); audio.play() .catch((err) => { diff --git a/app/javascript/components/rooms/room/public_recordings/PublicRecordingRow.jsx b/app/javascript/components/rooms/room/public_recordings/PublicRecordingRow.jsx index 8850e6135b..28cd9ac8f4 100644 --- a/app/javascript/components/rooms/room/public_recordings/PublicRecordingRow.jsx +++ b/app/javascript/components/rooms/room/public_recordings/PublicRecordingRow.jsx @@ -73,6 +73,7 @@ export default function PublicRecordingRow({