diff --git a/.github/workflows/ci.build.prerelease.yml b/.github/workflows/ci.build.prerelease.yml
index 8d959a0cda..0cd662a5e9 100644
--- a/.github/workflows/ci.build.prerelease.yml
+++ b/.github/workflows/ci.build.prerelease.yml
@@ -1,5 +1,5 @@
env:
- RUBY_VERSION: 3.1
+ RUBY_VERSION: 3.3
name: CI Build Pre-Release
on:
diff --git a/.github/workflows/ci.build.push.yml b/.github/workflows/ci.build.push.yml
index ed102702a9..c44230bdf4 100644
--- a/.github/workflows/ci.build.push.yml
+++ b/.github/workflows/ci.build.push.yml
@@ -1,5 +1,5 @@
env:
- RUBY_VERSION: 3.1
+ RUBY_VERSION: 3.3
name: CI Build Push
on:
diff --git a/.github/workflows/ci.build.release.yml b/.github/workflows/ci.build.release.yml
index 64616d00c6..4f95bbae0d 100644
--- a/.github/workflows/ci.build.release.yml
+++ b/.github/workflows/ci.build.release.yml
@@ -1,5 +1,5 @@
env:
- RUBY_VERSION: 3.1
+ RUBY_VERSION: 3.3
name: CI Build Release
on:
@@ -13,7 +13,7 @@ jobs:
DOCKER_REPOSITORY: ${{ secrets.DOCKER_REPOSITORY }}
DOCKER_BUILD_ENABLED: ${{ secrets.DOCKER_BUILD_ENABLED }}
DOCKER_BUILD_ALTERNATE_ENABLED: ${{ secrets.DOCKER_BUILD_ALTERNATE_ENABLED }}
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- name: Checkout
if: contains(env.DOCKER_BUILD_ENABLED, 'true')
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f0262ffacf..c10e475cef 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,5 +1,5 @@
env:
- RUBY_VERSION: 3.1.0
+ RUBY_VERSION: 3.3
DATABASE_URL: postgres://postgres:postgres@localhost/greenlight-actions
RAILS_ENV: test
@@ -11,7 +11,7 @@ on:
jobs:
test:
name: Rubocop + RSpec + ESLint + License Header Check
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
services:
postgres:
@@ -37,6 +37,9 @@ jobs:
with:
ruby-version: ${{ env.RUBY_VERSION }}
+ - name: Install imagemagick
+ run: sudo apt-get install -y imagemagick
+
- name: Bundle cache
uses: actions/cache@v2
with:
diff --git a/.rubocop.yml b/.rubocop.yml
index a2f21d57c0..3a19619f6f 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -14,7 +14,7 @@ AllCops:
- 'vendor/bundle/**/*'
- 'config/routes.rb'
DisabledByDefault: false
- TargetRubyVersion: 3.1
+ TargetRubyVersion: 3.3
NewCops: enable
# Document classes and non-namespace modules.
@@ -73,7 +73,7 @@ Metrics/ClassLength:
# A calculated magnitude based on number of assignments,
# branches, and conditions.
Metrics/AbcSize:
- Max: 85
+ Max: 95
Metrics/ParameterLists:
CountKeywordArgs: false
@@ -82,10 +82,10 @@ RSpec/AnyInstance:
Enabled: false
Metrics/CyclomaticComplexity:
- Max: 18
+ Max: 25
Metrics/PerceivedComplexity:
- Max: 18
+ Max: 25
Rails/Exit:
Exclude:
diff --git a/.ruby-version b/.ruby-version
deleted file mode 100644
index fd2a01863f..0000000000
--- a/.ruby-version
+++ /dev/null
@@ -1 +0,0 @@
-3.1.0
diff --git a/Dockerfile b/Dockerfile
index f7687b5fed..6de22ea155 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM ruby:alpine3.17 AS base
+FROM ruby:3.3-alpine3.20 AS base
ARG RAILS_ROOT=/usr/src/app
ENV RAILS_ROOT=${RAILS_ROOT}
diff --git a/Gemfile b/Gemfile
index 9e19b81431..c5357c8bde 100644
--- a/Gemfile
+++ b/Gemfile
@@ -3,35 +3,35 @@
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
-ruby '>= 3.0'
+ruby '>= 3.3'
-gem 'active_model_serializers', '>= 0.10.14'
-gem 'active_storage_validations', '>= 1.1.0'
+gem 'active_model_serializers', '>= 0.10.15'
+gem 'active_storage_validations', '>= 1.3.4'
gem 'aws-sdk-s3', require: false
gem 'bcrypt', '~> 3.1.7'
gem 'bigbluebutton-api-ruby', '1.9.1'
gem 'bootsnap', require: false
gem 'clamby', '~> 1.6.10'
gem 'cssbundling-rails', '>= 1.3.3'
-gem 'data_migrate', '>= 9.4.0'
+gem 'data_migrate', '>= 11.2'
gem 'dotenv-rails'
gem 'google-cloud-storage', '~> 1.44', require: false
gem 'hcaptcha'
-gem 'hiredis', '~> 0.6.0'
gem 'i18n-language-mapping'
gem 'image_processing', '~> 1.2'
-gem 'jbuilder'
+gem 'jbuilder', '>= 2.12'
gem 'jsbundling-rails', '>= 1.2.2'
gem 'jwt'
gem 'mini_magick', '>= 4.9.5'
+gem 'nkf', '~> 0.2.0'
gem 'omniauth', '~> 2.1.2'
gem 'omniauth_openid_connect', '>= 0.6.1'
gem 'omniauth-rails_csrf_protection', '~> 1.0.2'
gem 'pagy', '~> 6.0', '>= 6.0.0'
gem 'pg'
-gem 'puma', '~> 5.6'
-gem 'rails', '~> 7.1.3', '>= 7.1.3.3'
-gem 'redis', '~> 4.0'
+gem 'puma', '~> 6.4'
+gem 'rails', '~> 7.2.2'
+gem 'redis', '~> 4.8.0'
gem 'sprockets-rails', '>= 3.5.0'
gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby]
@@ -54,11 +54,11 @@ group :test do
gem 'factory_bot', '>= 6.4.1'
gem 'factory_bot_rails', '>= 6.4.3'
gem 'faker'
- gem 'rspec-rails', '>= 6.0.4'
+ gem 'rspec-rails', '~> 7.1'
gem 'selenium-webdriver'
gem 'shoulda-matchers', '~> 5.0'
gem 'webdrivers'
- gem 'webmock'
+ gem 'webmock', '>= 3.23.1'
end
group :production do
diff --git a/Gemfile.lock b/Gemfile.lock
index 86bfec749b..be878cc1b3 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,90 +1,88 @@
GEM
remote: https://rubygems.org/
specs:
- actioncable (7.1.3.4)
- actionpack (= 7.1.3.4)
- activesupport (= 7.1.3.4)
+ actioncable (7.2.2.1)
+ actionpack (= 7.2.2.1)
+ activesupport (= 7.2.2.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
- actionmailbox (7.1.3.4)
- actionpack (= 7.1.3.4)
- activejob (= 7.1.3.4)
- activerecord (= 7.1.3.4)
- activestorage (= 7.1.3.4)
- activesupport (= 7.1.3.4)
- mail (>= 2.7.1)
- net-imap
- net-pop
- net-smtp
- actionmailer (7.1.3.4)
- actionpack (= 7.1.3.4)
- actionview (= 7.1.3.4)
- activejob (= 7.1.3.4)
- activesupport (= 7.1.3.4)
- mail (~> 2.5, >= 2.5.4)
- net-imap
- net-pop
- net-smtp
+ actionmailbox (7.2.2.1)
+ actionpack (= 7.2.2.1)
+ activejob (= 7.2.2.1)
+ activerecord (= 7.2.2.1)
+ activestorage (= 7.2.2.1)
+ activesupport (= 7.2.2.1)
+ mail (>= 2.8.0)
+ actionmailer (7.2.2.1)
+ actionpack (= 7.2.2.1)
+ actionview (= 7.2.2.1)
+ activejob (= 7.2.2.1)
+ activesupport (= 7.2.2.1)
+ mail (>= 2.8.0)
rails-dom-testing (~> 2.2)
- actionpack (7.1.3.4)
- actionview (= 7.1.3.4)
- activesupport (= 7.1.3.4)
+ actionpack (7.2.2.1)
+ actionview (= 7.2.2.1)
+ activesupport (= 7.2.2.1)
nokogiri (>= 1.8.5)
racc
- rack (>= 2.2.4)
+ rack (>= 2.2.4, < 3.2)
rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
- actiontext (7.1.3.4)
- actionpack (= 7.1.3.4)
- activerecord (= 7.1.3.4)
- activestorage (= 7.1.3.4)
- activesupport (= 7.1.3.4)
+ useragent (~> 0.16)
+ actiontext (7.2.2.1)
+ actionpack (= 7.2.2.1)
+ activerecord (= 7.2.2.1)
+ activestorage (= 7.2.2.1)
+ activesupport (= 7.2.2.1)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
- actionview (7.1.3.4)
- activesupport (= 7.1.3.4)
+ actionview (7.2.2.1)
+ activesupport (= 7.2.2.1)
builder (~> 3.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
- active_model_serializers (0.10.14)
+ active_model_serializers (0.10.15)
actionpack (>= 4.1)
activemodel (>= 4.1)
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
- active_storage_validations (1.1.0)
- activejob (>= 5.2.0)
- activemodel (>= 5.2.0)
- activestorage (>= 5.2.0)
- activesupport (>= 5.2.0)
- activejob (7.1.3.4)
- activesupport (= 7.1.3.4)
+ active_storage_validations (1.3.5)
+ activejob (>= 6.1.4)
+ activemodel (>= 6.1.4)
+ activestorage (>= 6.1.4)
+ activesupport (>= 6.1.4)
+ marcel (>= 1.0.3)
+ activejob (7.2.2.1)
+ activesupport (= 7.2.2.1)
globalid (>= 0.3.6)
- activemodel (7.1.3.4)
- activesupport (= 7.1.3.4)
- activerecord (7.1.3.4)
- activemodel (= 7.1.3.4)
- activesupport (= 7.1.3.4)
+ activemodel (7.2.2.1)
+ activesupport (= 7.2.2.1)
+ activerecord (7.2.2.1)
+ activemodel (= 7.2.2.1)
+ activesupport (= 7.2.2.1)
timeout (>= 0.4.0)
- activestorage (7.1.3.4)
- actionpack (= 7.1.3.4)
- activejob (= 7.1.3.4)
- activerecord (= 7.1.3.4)
- activesupport (= 7.1.3.4)
+ activestorage (7.2.2.1)
+ actionpack (= 7.2.2.1)
+ activejob (= 7.2.2.1)
+ activerecord (= 7.2.2.1)
+ activesupport (= 7.2.2.1)
marcel (~> 1.0)
- activesupport (7.1.3.4)
+ activesupport (7.2.2.1)
base64
+ benchmark (>= 0.3)
bigdecimal
- concurrent-ruby (~> 1.0, >= 1.0.2)
+ concurrent-ruby (~> 1.0, >= 1.3.1)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
+ logger (>= 1.4.2)
minitest (>= 5.1)
- mutex_m
- tzinfo (~> 2.0)
+ securerandom (>= 0.3)
+ tzinfo (~> 2.0, >= 2.0.5)
addressable (2.8.1)
public_suffix (>= 2.0.2, < 6.0)
aes_key_wrap (1.1.0)
@@ -106,8 +104,9 @@ GEM
aws-sigv4 (~> 1.4)
aws-sigv4 (1.5.2)
aws-eventstream (~> 1, >= 1.0.2)
- base64 (0.1.1)
+ base64 (0.1.2)
bcrypt (3.1.18)
+ benchmark (0.4.0)
bigbluebutton-api-ruby (1.9.1)
childprocess (>= 1.0.1)
ffi (>= 1.9.24)
@@ -135,14 +134,15 @@ GEM
activesupport
childprocess (4.1.0)
clamby (1.6.10)
- concurrent-ruby (1.3.3)
+ concurrent-ruby (1.3.4)
connection_pool (2.4.1)
- crack (0.4.5)
+ crack (1.0.0)
+ bigdecimal
rexml
crass (1.0.6)
cssbundling-rails (1.3.3)
railties (>= 6.0.0)
- data_migrate (9.4.0)
+ data_migrate (11.2.0)
activerecord (>= 6.1)
railties (>= 6.1)
date (3.3.4)
@@ -150,7 +150,7 @@ GEM
irb (>= 1.5.0)
reline (>= 0.3.1)
declarative (0.0.20)
- diff-lcs (1.5.0)
+ diff-lcs (1.5.1)
digest-crc (0.6.5)
rake (>= 12.0.0, < 14.0.0)
dotenv (2.8.1)
@@ -158,7 +158,7 @@ GEM
dotenv (= 2.8.1)
railties (>= 3.2)
drb (2.2.1)
- erubi (1.12.0)
+ erubi (1.13.0)
factory_bot (6.4.5)
activesupport (>= 5.0.0)
factory_bot_rails (6.4.3)
@@ -209,23 +209,22 @@ GEM
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
- hashdiff (1.0.1)
+ hashdiff (1.1.2)
hashie (5.0.0)
hcaptcha (7.1.0)
json
- hiredis (0.6.3)
httpclient (2.8.3)
- i18n (1.14.5)
+ i18n (1.14.6)
concurrent-ruby (~> 1.0)
i18n-language-mapping (0.1.3.1)
image_processing (1.12.2)
mini_magick (>= 4.9.5, < 5)
ruby-vips (>= 2.0.17, < 3)
io-console (0.7.2)
- irb (1.13.1)
+ irb (1.14.1)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
- jbuilder (2.11.5)
+ jbuilder (2.13.0)
actionview (>= 5.0.0)
activesupport (>= 5.0.0)
jmespath (1.6.2)
@@ -242,6 +241,7 @@ GEM
jsonapi-renderer (0.2.2)
jwt (2.7.0)
language_server-protocol (3.17.0.3)
+ logger (1.6.2)
lograge (0.14.0)
actionpack (>= 4)
activesupport (>= 4)
@@ -261,13 +261,12 @@ GEM
mini_magick (4.12.0)
mini_mime (1.1.5)
mini_portile2 (2.8.7)
- minitest (5.23.1)
+ minitest (5.25.1)
msgpack (1.6.0)
multi_json (1.15.0)
- mutex_m (0.2.0)
net-http (0.4.1)
uri
- net-imap (0.4.12)
+ net-imap (0.4.17)
date
net-protocol
net-pop (0.1.2)
@@ -277,10 +276,11 @@ GEM
net-smtp (0.5.0)
net-protocol
nio4r (2.7.3)
- nokogiri (1.16.5)
+ nkf (0.2.0)
+ nokogiri (1.16.7)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
- nokogiri (1.16.5-x86_64-linux)
+ nokogiri (1.16.7-x86_64-linux)
racc (~> 1.4)
omniauth (2.1.2)
hashie (>= 3.4.6)
@@ -315,10 +315,10 @@ GEM
psych (5.1.2)
stringio
public_suffix (5.0.3)
- puma (5.6.8)
+ puma (6.5.0)
nio4r (~> 2.0)
- racc (1.8.0)
- rack (2.2.9)
+ racc (1.8.1)
+ rack (2.2.10)
rack-oauth2 (2.2.0)
activesupport
attr_required
@@ -336,20 +336,20 @@ GEM
rackup (1.0.0)
rack (< 3)
webrick
- rails (7.1.3.4)
- actioncable (= 7.1.3.4)
- actionmailbox (= 7.1.3.4)
- actionmailer (= 7.1.3.4)
- actionpack (= 7.1.3.4)
- actiontext (= 7.1.3.4)
- actionview (= 7.1.3.4)
- activejob (= 7.1.3.4)
- activemodel (= 7.1.3.4)
- activerecord (= 7.1.3.4)
- activestorage (= 7.1.3.4)
- activesupport (= 7.1.3.4)
+ rails (7.2.2.1)
+ actioncable (= 7.2.2.1)
+ actionmailbox (= 7.2.2.1)
+ actionmailer (= 7.2.2.1)
+ actionpack (= 7.2.2.1)
+ actiontext (= 7.2.2.1)
+ actionview (= 7.2.2.1)
+ activejob (= 7.2.2.1)
+ activemodel (= 7.2.2.1)
+ activerecord (= 7.2.2.1)
+ activestorage (= 7.2.2.1)
+ activesupport (= 7.2.2.1)
bundler (>= 1.15.0)
- railties (= 7.1.3.4)
+ railties (= 7.2.2.1)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
@@ -357,10 +357,10 @@ GEM
rails-html-sanitizer (1.6.0)
loofah (~> 2.21)
nokogiri (~> 1.14)
- railties (7.1.3.4)
- actionpack (= 7.1.3.4)
- activesupport (= 7.1.3.4)
- irb
+ railties (7.2.2.1)
+ actionpack (= 7.2.2.1)
+ activesupport (= 7.2.2.1)
+ irb (~> 1.13)
rackup (>= 1.0.0)
rake (>= 12.2)
thor (~> 1.0, >= 1.2.2)
@@ -371,7 +371,7 @@ GEM
psych (>= 4.0.0)
redis (4.8.0)
regexp_parser (2.8.1)
- reline (0.5.9)
+ reline (0.5.10)
io-console (~> 0.5)
remote_syslog_logger (1.0.4)
syslog_protocol
@@ -382,24 +382,24 @@ GEM
request_store (1.5.1)
rack (>= 1.4)
retriable (3.1.2)
- rexml (3.2.6)
- rspec-core (3.12.2)
- rspec-support (~> 3.12.0)
- rspec-expectations (3.12.3)
+ rexml (3.3.9)
+ rspec-core (3.13.2)
+ rspec-support (~> 3.13.0)
+ rspec-expectations (3.13.3)
diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.12.0)
- rspec-mocks (3.12.6)
+ rspec-support (~> 3.13.0)
+ rspec-mocks (3.13.2)
diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.12.0)
- rspec-rails (6.1.0)
- actionpack (>= 6.1)
- activesupport (>= 6.1)
- railties (>= 6.1)
- rspec-core (~> 3.12)
- rspec-expectations (~> 3.12)
- rspec-mocks (~> 3.12)
- rspec-support (~> 3.12)
- rspec-support (3.12.1)
+ rspec-support (~> 3.13.0)
+ rspec-rails (7.1.0)
+ actionpack (>= 7.0)
+ activesupport (>= 7.0)
+ railties (>= 7.0)
+ rspec-core (~> 3.13)
+ rspec-expectations (~> 3.13)
+ rspec-mocks (~> 3.13)
+ rspec-support (~> 3.13)
+ rspec-support (3.13.2)
rubocop (1.56.1)
base64 (~> 0.1.1)
json (~> 2.3)
@@ -431,6 +431,7 @@ GEM
ruby-vips (2.1.4)
ffi (~> 1.12)
rubyzip (2.3.2)
+ securerandom (0.4.0)
selenium-webdriver (4.8.0)
rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0)
@@ -449,14 +450,14 @@ GEM
actionpack (>= 6.1)
activesupport (>= 6.1)
sprockets (>= 3.0.0)
- stringio (3.1.0)
+ stringio (3.1.1)
swd (2.0.2)
activesupport (>= 3)
attr_required (>= 0.0.5)
faraday (~> 2.0)
faraday-follow_redirects
syslog_protocol (0.9.2)
- thor (1.3.1)
+ thor (1.3.2)
timeout (0.4.1)
trailblazer-option (0.1.2)
tzinfo (2.0.6)
@@ -464,6 +465,7 @@ GEM
uber (0.1.0)
unicode-display_width (2.4.2)
uri (0.13.0)
+ useragent (0.16.11)
validate_email (0.1.6)
activemodel (>= 3.0)
mail (>= 2.2.5)
@@ -483,11 +485,11 @@ GEM
activesupport
faraday (~> 2.0)
faraday-follow_redirects
- webmock (3.18.1)
+ webmock (3.24.0)
addressable (>= 2.8.0)
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
- webrick (1.8.1)
+ webrick (1.8.2)
websocket (1.2.9)
websocket-driver (0.7.6)
websocket-extensions (>= 0.1.0)
@@ -496,15 +498,15 @@ GEM
rexml
xpath (3.2.0)
nokogiri (~> 1.8)
- zeitwerk (2.6.15)
+ zeitwerk (2.6.18)
PLATFORMS
ruby
x86_64-linux
DEPENDENCIES
- active_model_serializers (>= 0.10.14)
- active_storage_validations (>= 1.1.0)
+ active_model_serializers (>= 0.10.15)
+ active_storage_validations (>= 1.3.4)
aws-sdk-s3
bcrypt (~> 3.1.7)
bigbluebutton-api-ruby (= 1.9.1)
@@ -512,7 +514,7 @@ DEPENDENCIES
capybara
clamby (~> 1.6.10)
cssbundling-rails (>= 1.3.3)
- data_migrate (>= 9.4.0)
+ data_migrate (>= 11.2)
debug
dotenv-rails
factory_bot (>= 6.4.1)
@@ -520,24 +522,24 @@ DEPENDENCIES
faker
google-cloud-storage (~> 1.44)
hcaptcha
- hiredis (~> 0.6.0)
i18n-language-mapping
image_processing (~> 1.2)
- jbuilder
+ jbuilder (>= 2.12)
jsbundling-rails (>= 1.2.2)
jwt
lograge (~> 0.14.0)
mini_magick (>= 4.9.5)
+ nkf (~> 0.2.0)
omniauth (~> 2.1.2)
omniauth-rails_csrf_protection (~> 1.0.2)
omniauth_openid_connect (>= 0.6.1)
pagy (~> 6.0, >= 6.0.0)
pg
- puma (~> 5.6)
- rails (~> 7.1.3, >= 7.1.3.3)
- redis (~> 4.0)
+ puma (~> 6.4)
+ rails (~> 7.2.2)
+ redis (~> 4.8.0)
remote_syslog_logger
- rspec-rails (>= 6.0.4)
+ rspec-rails (~> 7.1)
rubocop (~> 1.26)
rubocop-capybara (~> 2.19.0)
rubocop-factory_bot (~> 2.24.0)
@@ -550,4 +552,4 @@ DEPENDENCIES
tzinfo-data
web-console (>= 4.2.1)
webdrivers
- webmock
+ webmock (>= 3.23.1)
diff --git a/app/assets/locales/fr.json b/app/assets/locales/fr.json
index ae585974d1..b2a996448b 100644
--- a/app/assets/locales/fr.json
+++ b/app/assets/locales/fr.json
@@ -164,6 +164,10 @@
"wrong_access_code": "Code d'accès erroné",
"generate_viewers_access_code": "Générer un code d'accès pour les auditeurs",
"generate_mods_access_code": "Générer un code d'accès pour les modérateurs",
+ "server_tag": "Choisir un type de serveur pour cette salle",
+ "default_tag_name": "Par défaut",
+ "server_tag_desired": "Demandé",
+ "server_tag_required": "Exigé",
"are_you_sure_delete_room": "Êtes vous sur de vouloir supprimer cette salle?"
}
},
@@ -178,7 +182,7 @@
"formats": "Lecture",
"published": "Publiée",
"unpublished": "Non publiée",
- "protected": "Protégée",
+ "protected": "Protégé",
"public": "Public",
"public_protected": "Public/Protégé",
"length_in_minutes": "{{recording.length}} min.",
@@ -303,7 +307,7 @@
"registration": {
"registration": "Inscription",
"role_mapping_by_email": "Configuration des rôles par courriel",
- "role_mapping_by_email_description": "Configurer le rôle d'un utilisateur en se servant de son courriel. Doit être au format suivant: rôle1=courriel1, rôle2=courriel2",
+ "role_mapping_by_email_description": "Configurer le rôle d'un utilisateur en se servant de son courriel. Doit être au format suivant: role1=email1, role2=email2",
"enter_role_mapping_rule": "Saisir une règle de configuration des rôles",
"resync_on_login": "Resynchroniser les données utilisateur à chaque authentification",
"resync_on_login_description": "Resynchroniser les données utilisateur de Greenlight à chacune de ses connexions, afin qu'elles correspondent toujours avec celles du service d'authentification",
@@ -315,7 +319,10 @@
"open": "Inscription libre",
"invite": "Rejoindre sur invitation",
"approval": "Approuver/Refuser"
- }
+ },
+ "allowed_domains": "Domaines de courriels autorisés",
+ "allowed_domains_signup_description": "Pour les connexions, autoriser des domaines de courriels spécifiques",
+ "enter_allowed_domains_rule" : "Saisissez les domaines autorisés"
}
},
"room_configuration": {
@@ -413,10 +420,11 @@
"brand_color_updated": "La couleur de la marque a été mise à jour.",
"brand_image_updated": "L'image de marque a été actualisée.",
"brand_image_deleted": "L'image de marque a été supprimée.",
- "privacy_policy_updated": "La politique de confidentialité a été mise à jour.",
+ "privacy_policy_updated": "Les règles de confidentialité ont été mises à jour",
"helpcenter_updated": "Le lien vers le centre d'aide a été mis à jour",
"terms_of_service_updated": "Les conditions de service ont été mises à jour.",
- "maintenance_updated": "Le bandeau de maintenance a été mis à jour"
+ "maintenance_updated": "Le bandeau de maintenance a été mis à jour",
+ "allowed_domains_signup_updated": "Les noms de domaines autorisés ont été mis à jour"
},
"recording": {
"recording_visibility_updated": "La visibilité de l'enregistrement a été mise à jour.",
@@ -437,6 +445,7 @@
},
"error": {
"problem_completing_action": "L'action que vous voulez réaliser n'aboutit pas. Veuillez réessayer",
+ "server_type_unavailable": "Le type de serveur demandé n'est pas disponible. Veuillez choisir un type de serveur différent dans les paramètres de la salle.",
"file_type_not_supported": "Ce type de fichier n'est pas pris en charge",
"file_size_too_large": "La taille du fichier est trop importante",
"file_upload_error": "Le fichier ne peut pas être téléversé",
@@ -533,6 +542,11 @@
},
"url": {
"invalid": "URL non valide"
+ },
+ "text_form": {
+ "value": {
+ "required": "Veuillez saisir un message"
+ }
}
},
"room": {
diff --git a/app/assets/locales/gl.json b/app/assets/locales/gl.json
index 49e2a9cbe9..a37ef4aed5 100644
--- a/app/assets/locales/gl.json
+++ b/app/assets/locales/gl.json
@@ -14,6 +14,7 @@
"report": "Informar",
"share": "Compartir",
"cancel": "Cancelar",
+ "reset": "Restabelecer",
"close": "Pechar",
"delete": "Eliminar",
"copy": "Copiar a ligazón para unirse",
@@ -163,6 +164,10 @@
"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",
+ "server_tag": "Seleccione un tipo de servidor para esta sala",
+ "default_tag_name": "Predeterminado",
+ "server_tag_desired": "Desexado",
+ "server_tag_required": "Obrigatorio",
"are_you_sure_delete_room": "Confirma que quere eliminar esta sala?"
}
},
@@ -229,7 +234,8 @@
"empty_invited_users_subtext": "Cando o estado dun usuario cambia a convidado, aparece aquí.",
"invited": {
"time_sent": "Hora de envío",
- "valid": "Valida"
+ "valid": "Valida",
+ "revoke": "Revogar"
}
},
"server_rooms": {
@@ -272,8 +278,8 @@
"administration": {
"administration": "Administración",
"terms": "Terms & Conditions",
- "privacy": "Directiva de privacidade",
- "privacy_policy": "Directiva de privacidade",
+ "privacy": "Aviso de privacidade",
+ "privacy_policy": "Aviso 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",
"helpcenter": "Centro de axuda",
@@ -301,7 +307,7 @@
"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",
+ "role_mapping_by_email_description": "Asigne o usuario a un rol usando o seu correo-e. 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",
@@ -313,7 +319,10 @@
"open": "Rexistro aberto",
"invite": "Unirse por convite",
"approval": "Aceptar/declinar"
- }
+ },
+ "allowed_domains": "Dominios de correo-e permitidos",
+ "allowed_domains_signup_description": "Permitir o rexistro con dominios de correo-e específicos. O formato debe ser: @proba.com,dominio.com",
+ "enter_allowed_domains_rule" : "Introduza os dominios permitidos"
}
},
"room_configuration": {
@@ -411,10 +420,11 @@
"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.",
+ "privacy_policy_updated": "O aviso de pivacidade foi actualizado.",
"helpcenter_updated": "Actualizouse a ligazón do centro de axuda.",
"terms_of_service_updated": "Actualizáronse as condicións do servizo.",
- "maintenance_updated": "Actualizouse o báner de mantemento."
+ "maintenance_updated": "Actualizouse o báner de mantemento.",
+ "allowed_domains_signup_updated": "Foron actualizados os dominios de correo-e permitidos."
},
"recording": {
"recording_visibility_updated": "Foi actualizada a visibilidade da gravación.",
@@ -429,11 +439,13 @@
"role_permission_updated": "Foron actualizados os permisos de rol."
},
"invitations": {
- "invitation_sent": "Enviouse un convite"
+ "invitation_sent": "Enviouse un convite",
+ "invitation_revoked": "Foi revogado un convite"
}
},
"error": {
"problem_completing_action": "Non é posíbel completar a acción.\n Tenteo de novo.",
+ "server_type_unavailable": "O tipo de servidor requirido non está dispoñíbel. Seleccione un tipo diferente nos axustes da sala.",
"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.",
@@ -530,6 +542,11 @@
},
"url": {
"invalid": "URL incorrecto"
+ },
+ "text_form": {
+ "value": {
+ "required": "Introduza algunha mensaxe"
+ }
}
},
"room": {
diff --git a/app/assets/locales/hu.json b/app/assets/locales/hu.json
index 9a5bec5926..225a0267de 100644
--- a/app/assets/locales/hu.json
+++ b/app/assets/locales/hu.json
@@ -14,6 +14,7 @@
"report": "Jelentés",
"share": "Megosztás",
"cancel": "Mégse",
+ "reset": "Reszetelés",
"close": "Bezárás",
"delete": "Törlés",
"copy": "Másolás",
@@ -163,6 +164,10 @@
"wrong_access_code": "Hibás hozzáférési kód",
"generate_viewers_access_code": "Hozzáférési kód előállítása a látogatók számára",
"generate_mods_access_code": "Hozzáférési kód előállítása a moderátorok számára",
+ "server_tag": "Válasszon szervertípust a szobához",
+ "default_tag_name": "Alapértelmezett",
+ "server_tag_desired": "Kívánt",
+ "server_tag_required": "Kötelező",
"are_you_sure_delete_room": "Biztos, hogy törli ezt a szobát?"
}
},
@@ -229,7 +234,8 @@
"empty_invited_users_subtext": "Ha egy felhasználó állapota meghívottá válik, akkor itt fog megjelenni.",
"invited": {
"time_sent": "Küldési idő",
- "valid": "Érvényes"
+ "valid": "Érvényes",
+ "revoke": "Visszavonás"
}
},
"server_rooms": {
@@ -272,13 +278,17 @@
"administration": {
"administration": "Üzemeltetés",
"terms": "Felhasználási feltételek",
- "privacy": "Adatvédelmi nyilatkozat",
- "privacy_policy": "Adatvédelmi nyilatkozat",
+ "privacy": "Adatvédelmi közlemény",
+ "privacy_policy": "Adatvédelmi közlemény",
"change_term_links": "A lap alján megjelenő felhasználási feltételek hivatkozásának módosítása",
"change_privacy_link": "A lap alján megjelenő adatvédelmi hivatkozás módosítása",
"helpcenter": "Súgóközpont",
"change_helpcenter_link": "A profil legördülő alatt megjelenő Súgóközpont link módosítsa",
+ "maintenance": "Karbantartási szalaghirdetés",
+ "change_maintenance_text": "A fejlécben megjelenő karbantartási szalaghirdetés szövegének módosítása.",
"change_url": "Webcím módosítása",
+ "set_text": "Szöveg beállítása",
+ "clear_banner": "Szalaghirdetés törlése",
"enter_link": "Itt adja meg a hivatkozást"
},
"settings": {
@@ -288,7 +298,11 @@
"allow_users_to_preupload_presentation": "A felhasználók előre feltöltheti a bemutatójukat",
"allow_users_to_preupload_presentation_description": "A felhasználók előre feltöltheti a használandó bemutatójukat az adott szoba alapértelmezett bemutatójaként",
"default_visibility": "Felvétel alapértelmezett láthatósága",
- "default_visibility_description": "Alapértelmezés szerint minden újonnan létrehozott felvételnél ez lesz a láthatóság"
+ "default_visibility_description": "Alapértelmezés szerint minden újonnan létrehozott felvételnél ez lesz a láthatóság",
+ "session_timeout": "Munkamenet időtúllépése",
+ "session_timeout_description": "A munkamenet időtúllépését az alapértelmezett 1 napos vagy a kiterjesztett 7 napos munkamenet sütire konfigurálhatja",
+ "default_session_timeout": "Alapértelmezett (1 nap)",
+ "extended_session_timeout": "Kiterjesztett (7 nap)"
},
"registration": {
"registration": "Regisztráció",
@@ -305,7 +319,10 @@
"open": "Nyílt regisztráció",
"invite": "Csatlakozás meghívással",
"approval": "Engedélyezés/elutasítás"
- }
+ },
+ "allowed_domains": "Engedélyezett e-mail domainek",
+ "allowed_domains_signup_description": "Meghatározott e-mail domainek regisztrációjának engedélyezése. A helyes formátum: @test.hu, domain.hu",
+ "enter_allowed_domains_rule" : "Adja meg az engedélyezett domaineket"
}
},
"room_configuration": {
@@ -403,9 +420,11 @@
"brand_color_updated": "A márkaszín sikerese módosította.",
"brand_image_updated": "A márkaképet sikeresen módosította.",
"brand_image_deleted": "A márkakép sikeresen törölte.",
- "privacy_policy_updated": "Adatvédelmi nyilatkozat frissítve.",
+ "privacy_policy_updated": "Az adatvédelmi közleményt frissítették.",
"helpcenter_updated": "A Súgóközpont linkjét sikeresen módosította.",
- "terms_of_service_updated": "A szolgáltatási feltételek frissítésre kerültek."
+ "terms_of_service_updated": "A szolgáltatási feltételek frissítésre kerültek.",
+ "maintenance_updated": "A karbantartási szalaghirdetést frissítettük.",
+ "allowed_domains_signup_updated": "Az engedélyezett email domaineket sikeresen módosította."
},
"recording": {
"recording_visibility_updated": "Felvétel láthatósága frissítve.",
@@ -420,11 +439,13 @@
"role_permission_updated": "Szerepkör jogosultsága frissítve"
},
"invitations": {
- "invitation_sent": "Meghívó elküldve"
+ "invitation_sent": "Meghívó elküldve",
+ "invitation_revoked": "A meghívást visszautasították"
}
},
"error": {
"problem_completing_action": "Probléma lépett fel a művelet befejezése során. \n Próbálja újra.",
+ "server_type_unavailable": "A kiválasztott szervertípus nem érhető el. Kérem, válasszon másikat.",
"file_type_not_supported": "A fájltípus nem támogatott.",
"file_size_too_large": "A fájl túl nagy.",
"file_upload_error": "A fájlt nem sikerült feltölteni.",
@@ -521,6 +542,11 @@
},
"url": {
"invalid": "Érvénytelen webcím"
+ },
+ "text_form": {
+ "value": {
+ "required": "Írjon egy üzenetet"
+ }
}
},
"room": {
@@ -676,7 +702,8 @@
"site_settings": {
"fields": {
"value": {
- "placeholder": "Adja meg a hivatkozást itt…"
+ "placeholder": "Adja meg a hivatkozást itt…",
+ "text_placeholder": "Ide írjon..."
}
}
},
diff --git a/app/assets/locales/ja.json b/app/assets/locales/ja.json
index 41f1604f09..b54c5fb072 100644
--- a/app/assets/locales/ja.json
+++ b/app/assets/locales/ja.json
@@ -312,7 +312,7 @@
"resync_on_login": "サインインごとにユーザーのデーターを再同期",
"resync_on_login_description": "サインインのたびにユーザーの情報を再同期し、外部の承認提供者の情報とGreenlightの情報とを常に一致させます",
"default_role": "標準の役割",
- "default_role_description": "新しく作成されたユーザーに自動的に割り当てられる役割です",
+ "default_role_description": "新しく作成されたユーザーにはこの役割が自動的に割り当てられます",
"registration_method": "登録方法",
"registration_method_description": "ユーザーがこのサイトに登録する方法を変更します",
"registration_methods" : {
diff --git a/app/assets/locales/ko_KR.json b/app/assets/locales/ko_KR.json
index 2ab8b0cef4..2cbe00fcec 100644
--- a/app/assets/locales/ko_KR.json
+++ b/app/assets/locales/ko_KR.json
@@ -14,15 +14,20 @@
"report": "보고서",
"share": "공유",
"cancel": "취소",
+ "reset": "리셋",
"close": "닫기",
"delete": "삭제",
"copy": "참여 링크 복사",
+ "copy_viewer_code": "뷰어 코드 복사",
+ "copy_moderator_code": "모데라토 코드 복사",
"or": "또는",
"online": "온라인",
"help_center": "도움말 센터",
"are_you_sure": "확실합니까?",
"return_home": "홈으로 돌아가기",
"created_at": "에서 생성",
+ "view_recordings": "레코딩 보기",
+ "join_session": "세션에 참여",
"no_result_search_input": "\"{{ searchInput }}\"에 대한 결과를 찾을 수 없습니다.",
"action_permanent": "이 작업은 실행 취소할 수 없습니다.",
"homepage": {
@@ -79,6 +84,7 @@
"account_info": "계정 정보",
"delete_account": "계정 삭제",
"change_password": "패스워드 변경",
+ "set_password": "새로운 패스워드 설정",
"reset_password": "패스워드 초기화",
"update_account_info": "계정 정보 업데이트",
"current_password": "현재 패스워드",
@@ -127,6 +133,7 @@
"click_to_upload": "업로드하려면 클릭하세요.",
"drag_and_drop": "또는 드래그 앤 드롭",
"upload_description": "사무실 문서 또는 PDF 파일({{size}}이하)을 업로드합니다. 파일 크기에 따라 파일을 사용하려면 업로드하는 데 추가 시간이 필요할 수 있습니다",
+ "delete_presentation": "프레젠테이션 삭제",
"are_you_sure_delete_presentation": "이 프레젠테이션을 삭제하시겠습니까?"
},
"shared_access": {
@@ -157,12 +164,17 @@
"wrong_access_code": "잘못된 액세스 코드입니다.",
"generate_viewers_access_code": "참여자용 액세스 코드 생성",
"generate_mods_access_code": "진행자용 액세스 코드 생성",
+ "server_tag": "이 방에 대한 서버 유형 선택",
+ "default_tag_name": "기본",
+ "server_tag_desired": "요청",
+ "server_tag_required": "필수",
"are_you_sure_delete_room": "이 Room을 삭제 하시겠습니까?"
}
},
"recording": {
"recording": "녹화",
"recordings": "녹화",
+ "processing": "레코딩 처리 중...",
"name": "이름",
"length": "길이",
"users": "사용자",
@@ -171,11 +183,15 @@
"published": "게시됨",
"unpublished": "게시되지 않음",
"protected": "보호",
+ "public": "공개",
+ "public_protected": "공개/보호",
"length_in_minutes": "{{recording.length}} 분.",
"processing_recording": "녹화를 인코딩 중입니다. 몇 분 정도 걸릴 수 있습니다...",
"copy_recording_urls": "녹화 Url(S) 복사",
"recordings_list_empty": "아직 녹화되지 않았습니다!",
+ "public_recordings_list_empty": "아직 공개된 녹음이 없습니다!",
"recordings_list_empty_description": "미팅을 중 녹화된 기록이 여기에 나타납니다.",
+ "public_recordings_list_empty_description": "사용 가능할 때 녹음이 여기에 나타납니다.",
"delete_recording": "녹화 삭제",
"are_you_sure_delete_recording": "이 녹화를 삭제하시겠습니까?",
"search_not_found": "녹화된 기록을 찾을 수 없음"
@@ -218,7 +234,8 @@
"empty_invited_users_subtext": "사용자의 상태가 초대됨으로 변경되면 여기에 나타납니다.",
"invited": {
"time_sent": "보낸 시간",
- "valid": "유효한"
+ "valid": "유효한",
+ "revoke": "취소"
}
},
"server_rooms": {
@@ -265,7 +282,13 @@
"privacy_policy": "개인 정보 보호 정책",
"change_term_links": "페이지 하단에 나타나는 용어 링크 변경",
"change_privacy_link": "페이지 하단에 나타나는 용어 링크 변경",
+ "helpcenter": "도움말 센터",
+ "change_helpcenter_link": "프로필 드롭다운 아래에 표시되는 도움말 센터 링크 변경",
+ "maintenance": "유지 관리 배너",
+ "change_maintenance_text": "헤더에 표시되는 유지 관리 배너 텍스트 변경",
"change_url": "URL 변경",
+ "set_text": "텍스트 설정",
+ "clear_banner": "배너 삭제",
"enter_link": "링크 입력"
},
"settings": {
@@ -273,7 +296,13 @@
"allow_users_to_share_rooms": "사용자의 Room 공유 허용",
"allow_users_to_share_rooms_description": "사용 불가능으로 설정하면 Room 선택사항 드롭다운 메뉴에서 버튼이 제거되어 사용자가 Room을 공유할 수 없습니다",
"allow_users_to_preupload_presentation": "사용자에게 프레젠테이션 발표자료 사전 업로드 허용",
- "allow_users_to_preupload_presentation_description": "사용자는 특정 Room에서 발표자료로 사용할 프리젠테이션을 미리 업로드할 수 있습니다"
+ "allow_users_to_preupload_presentation_description": "사용자는 특정 Room에서 발표자료로 사용할 프리젠테이션을 미리 업로드할 수 있습니다",
+ "default_visibility": "기본 녹음 가시성",
+ "default_visibility_description": "새로 생성된 모든 녹음은 기본적으로 이 가시성을 갖습니다.",
+ "session_timeout": "세션 타임아웃",
+ "session_timeout_description": "기본 쿠키 1일 또는 확장 세션 쿠키 7일로 세션 타임아웃을 구성할 수 있습니다",
+ "default_session_timeout": "기본 (1일)",
+ "extended_session_timeout": "확장 (7일)"
},
"registration": {
"registration": "등록",
@@ -290,7 +319,10 @@
"open": "공개 등록",
"invite": "초대로 참여",
"approval": "승인/거부"
- }
+ },
+ "allowed_domains": "허용된 이메일 도메인",
+ "allowed_domains_signup_description": "특정 이메일 도메인이 가입할 수 있도록 허용합니다. 형식은 @test.com,domain.com 이어야 합니다",
+ "enter_allowed_domains_rule" : "허용된 도메인을 입력하세요"
}
},
"room_configuration": {
@@ -341,7 +373,9 @@
"manage_site_settings": "이 역할을 가진 사용자에게 사이트 설정 관리 허용",
"manage_roles": "이 역할을 가진 사용자가 다른 역할을 편집하도록 허용",
"shared_list": "Room 공유 드롭다운 메뉴에 이 역할을 가진 사용자 포함",
- "room_limit": "Room 제한"
+ "room_limit": "Room 제한",
+ "email_on_signup": "새 사용자가 가입하면 이메일을 받습니다.",
+ "allowed_recording_visibility": "허용된 녹음 가시성"
}
}
},
@@ -352,6 +386,7 @@
"user_updated": "사용자가 업데이트되었습니다.",
"user_deleted": "사용자가 삭제되었습니다.",
"avatar_updated": "아바타가 업데이트되었습니다.",
+ "password_changed": "비밀번호가 성공적으로 업데이트되었습니다. 다시 로그인하십시오.",
"password_updated": "암호가 업데이트되었습니다.",
"account_activated": "계정이 활성화되었습니다.",
"activation_email_sent": "계정을 활성화하기 위한 지침이 포함된 이메일이 전송되었습니다.",
@@ -376,7 +411,9 @@
"access_code_copied": "액세스 코드가 복사되었습니다.",
"access_code_generated": "새 액세스 코드가 생성되었습니다.",
"access_code_deleted": "액세스 코드가 삭제되었습니다.",
- "copied_meeting_url": "미팅 URL이 복사되었습니다. 링크를 통하여 미팅에 참여할 수 있습니다."
+ "copied_meeting_url": "미팅 URL이 복사되었습니다. 링크를 통하여 미팅에 참여할 수 있습니다.",
+ "copied_viewer_code": "뷰어 액세스 코드가 복사되었습니다.",
+ "copied_moderator_code": "모데라토의 액세스 코드가 복사되었습니다."
},
"site_settings": {
"site_setting_updated": "사이트 설정이 업데이트되었습니다.",
@@ -384,7 +421,10 @@
"brand_image_updated": "브랜드 이미지가 업데이트되었습니다.",
"brand_image_deleted": "브랜드 이미지가 삭제되었습니다.",
"privacy_policy_updated": "개인 정보 보호 정책이 업데이트되었습니다.",
- "terms_of_service_updated": "서비스 약관이 업데이트되었습니다."
+ "helpcenter_updated": "도움말 센터 링크가 업데이트되었습니다.",
+ "terms_of_service_updated": "서비스 약관이 업데이트되었습니다.",
+ "maintenance_updated": "유지 관리 배너가 업데이트되었습니다.",
+ "allowed_domains_signup_updated": "허용된 이메일 도메인이 업데이트되었습니다."
},
"recording": {
"recording_visibility_updated": "녹화 가시성이 업데이트되었습니다.",
@@ -399,15 +439,18 @@
"role_permission_updated": "역할의 권한이 업데이트되었습니다."
},
"invitations": {
- "invitation_sent": "초대장을 보냈습니다."
+ "invitation_sent": "초대장을 보냈습니다.",
+ "invitation_revoked": "초대가 취소되었습니다."
}
},
"error": {
"problem_completing_action": "작업을 완료할 수 없습니다. \n다시 시도하십시오.",
+ "server_type_unavailable": "요구된 서버 유형을 사용할 수 없습니다. room 설정에서 다른 유형을 선택하십시오.",
"file_type_not_supported": "파일 형식이 지원되지 않습니다.",
"file_size_too_large": "파일 크기가 너무 큽니다.",
"file_upload_error": "파일을 업로드할 수 없습니다.",
"signin_required": "이 페이지에 액세스하려면 로그인해야 합니다.",
+ "malware_detected": "악성 소프트웨어가 감지됨! 업로드한 파일에 악성 소프트웨어가 포함될 수 있습니다. 파일을 확인하고 다시 시도하십시오.",
"roles": {
"role_assigned": "이 역할은 적어도 한 명의 사용자에게 할당되어 있으므로 삭제할 수 없습니다."
},
@@ -499,6 +542,11 @@
},
"url": {
"invalid": "잘못된 URL"
+ },
+ "text_form": {
+ "value": {
+ "required": "메시지를 입력해주세요"
+ }
}
},
"room": {
@@ -654,7 +702,8 @@
"site_settings": {
"fields": {
"value": {
- "placeholder": "링크 입력..."
+ "placeholder": "링크 입력...",
+ "text_placeholder": "여기에 텍스트를 입력하세요."
}
}
},
diff --git a/app/assets/locales/ru.json b/app/assets/locales/ru.json
index a5da2be4a9..dcb62ff136 100644
--- a/app/assets/locales/ru.json
+++ b/app/assets/locales/ru.json
@@ -14,9 +14,12 @@
"report": "Отчет",
"share": "Предоставить доступ",
"cancel": "Отмена",
+ "reset": "Сбросить",
"close": "Закрыть",
"delete": "Удалить",
"copy": "Скопировать ссылку",
+ "copy_viewer_code": "Скопировать код участника",
+ "copy_moderator_code": "Скопировать код модератора",
"or": "Или",
"online": "Онлайн",
"help_center": "Центр поддержки",
@@ -161,6 +164,10 @@
"wrong_access_code": "Неверный код доступа",
"generate_viewers_access_code": "Код доступа для участников",
"generate_mods_access_code": "Код доступа для модераторов",
+ "server_tag": "Выберите тип сервера для этой комнаты",
+ "default_tag_name": "По умолчанию",
+ "server_tag_desired": "Желаемый",
+ "server_tag_required": "Обязательный",
"are_you_sure_delete_room": "Вы уверены, что хотите удалить эту комнату?"
}
},
@@ -227,7 +234,8 @@
"empty_invited_users_subtext": "Когда статус пользователя изменится на «приглашенный», он появится здесь.",
"invited": {
"time_sent": "Время отправки",
- "valid": "Действителен"
+ "valid": "Действителен",
+ "revoke": "Отозвать"
}
},
"server_rooms": {
@@ -276,7 +284,11 @@
"change_privacy_link": "Изменить ссылку на политику конфиденциальности, которая появляется внизу страницы",
"helpcenter": "Справочный центр",
"change_helpcenter_link": "Измените ссылку Справочного центра, которая появляется под раскрывающимся списком профиля",
+ "maintenance": "Баннер технического обслуживания",
+ "change_maintenance_text": "Измените текст баннера технического обслуживания, который отображается в заголовке",
"change_url": "Изменить URL",
+ "set_text": "Задать текст",
+ "clear_banner": "Очистить баннер",
"enter_link": "Введите ссылку здесь"
},
"settings": {
@@ -286,7 +298,11 @@
"allow_users_to_preupload_presentation": "Разрешить пользователям предварительно загружать презентации",
"allow_users_to_preupload_presentation_description": "Пользователи могут предварительно загрузить презентацию, которая будет использоваться в качестве презентации по умолчанию для этой комнаты",
"default_visibility": "Статус видимости записи по умолчанию",
- "default_visibility_description": "Все вновь созданные записи будут иметь этот статус видимости по умолчанию."
+ "default_visibility_description": "Все вновь созданные записи будут иметь этот статус видимости по умолчанию.",
+ "session_timeout": "Время ожидания сеанса",
+ "session_timeout_description": "Вы можете настроить время ожидания сеанса с помощью стандартного куки на 1 день или расширенного куки сеанса на 7 дней",
+ "default_session_timeout": "Стандартный (1 день)",
+ "extended_session_timeout": "Расширенный (7 дней)"
},
"registration": {
"registration": "Регистрация",
@@ -303,7 +319,10 @@
"open": "Открытая регистрация",
"invite": "Вход по приглашению",
"approval": "Одобрить/отклонить"
- }
+ },
+ "allowed_domains": "Разрешенные домены электронной почты",
+ "allowed_domains_signup_description": "Разрешить определенные домены электронной почты для регистрации. Формат должен быть: @test.com,domain.com",
+ "enter_allowed_domains_rule" : "Введите разрешенные домены"
}
},
"room_configuration": {
@@ -392,7 +411,9 @@
"access_code_copied": "Код доступа скопирован.",
"access_code_generated": "Код доступа создан.",
"access_code_deleted": "Код доступа удален.",
- "copied_meeting_url": "Ссылка встречи скопирована. Ссылку можно использовать для присоединения к встрече."
+ "copied_meeting_url": "Ссылка встречи скопирована. Ссылку можно использовать для присоединения к встрече.",
+ "copied_viewer_code": "Код доступа участника вебинара был скопирован.",
+ "copied_moderator_code": "Код доступа модератора вебинара был скопирован."
},
"site_settings": {
"site_setting_updated": "Настройки сайта обновлены.",
@@ -401,7 +422,9 @@
"brand_image_deleted": "Фирменное изображение удалено.",
"privacy_policy_updated": "Политика конфиденциальности обновлена.",
"helpcenter_updated": "Ссылка на Справочный центр обновлена",
- "terms_of_service_updated": "Условия использования обновлены."
+ "terms_of_service_updated": "Условия использования обновлены.",
+ "maintenance_updated": "Баннер технического обслуживания обновлен.",
+ "allowed_domains_signup_updated": "Разрешенные домены электронной почты были обновлены"
},
"recording": {
"recording_visibility_updated": "Видимость записи обновлена.",
@@ -416,15 +439,18 @@
"role_permission_updated": "Права роли обновлены."
},
"invitations": {
- "invitation_sent": "Выслать приглашение"
+ "invitation_sent": "Выслать приглашение",
+ "invitation_revoked": "Приглашение было отозвано"
}
},
"error": {
"problem_completing_action": "Не удалось завершить данное действие. \n Пожалуйста, попробуйте еще раз.",
+ "server_type_unavailable": "Требуемый тип сервера недоступен. Пожалуйста, выберите другой тип в настройках комнаты",
"file_type_not_supported": "Тип файла не поддерживается",
"file_size_too_large": "Размер файла слишком большой",
"file_upload_error": "Файл не может быть загружен.",
"signin_required": "Для доступа к странице вы должны авторизоваться в системе. ",
+ "malware_detected": "Обнаружена вредоносная программа! Файл, который вы загрузили, может содержать вредоносное ПО. Пожалуйста, проверьте ваш файл и попробуйте снова.",
"roles": {
"role_assigned": "Эту роль нельзя удалить, т.к. она назначена как минимум одному пользователю."
},
@@ -516,6 +542,11 @@
},
"url": {
"invalid": "Неверная ссылка"
+ },
+ "text_form": {
+ "value": {
+ "required": "Пожалуйста, введите сообщение"
+ }
}
},
"room": {
@@ -671,7 +702,8 @@
"site_settings": {
"fields": {
"value": {
- "placeholder": "Введите ссылку сюда..."
+ "placeholder": "Введите ссылку сюда...",
+ "text_placeholder": "Введите текст здесь..."
}
}
},
diff --git a/app/assets/locales/tr.json b/app/assets/locales/tr.json
index e55ac85b1c..1b4889e472 100644
--- a/app/assets/locales/tr.json
+++ b/app/assets/locales/tr.json
@@ -319,7 +319,10 @@
"open": "Serbest hesap açma",
"invite": "Çağrı ile katılma",
"approval": "Onayla/Reddet"
- }
+ },
+ "allowed_domains": "İzin verilen e-posta etki alanları",
+ "allowed_domains_signup_description": "Belirli e-posta etki alanlarından hesap açılmasına izin verir. Şu biçimde yazılmalıdır: @deneme.com,etkialani.com",
+ "enter_allowed_domains_rule" : "İzin verilen etki alanlarını yazın"
}
},
"room_configuration": {
@@ -420,7 +423,8 @@
"privacy_policy_updated": "Gizlilik bildirimi güncellendi.",
"helpcenter_updated": "Yardım merkezi bağlantısı güncellendi.",
"terms_of_service_updated": "Hizmet koşulları güncellendi.",
- "maintenance_updated": "Bakım duyurusu güncellendi."
+ "maintenance_updated": "Bakım duyurusu güncellendi.",
+ "allowed_domains_signup_updated": "İzin verilen e-posta etki alanları güncellendi."
},
"recording": {
"recording_visibility_updated": "Kayıt görünürlüğü güncellendi.",
diff --git a/app/controllers/api/v1/users_controller.rb b/app/controllers/api/v1/users_controller.rb
index 6661d71a91..15ad2f57c4 100644
--- a/app/controllers/api/v1/users_controller.rb
+++ b/app/controllers/api/v1/users_controller.rb
@@ -35,7 +35,7 @@ def show
render_data data: user, status: :ok
end
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
+ # rubocop:disable Metrics/AbcSize
# POST /api/v1/users.json
# Creates and saves a new user record in the database with the provided parameters
def create
@@ -62,7 +62,7 @@ def create
create_user_params[:language] = current_user&.language || I18n.default_locale if create_user_params[:language].blank?
# renders an error if the user is signing up with an invalid domain based off site settings
- return render_error errors: Rails.configuration.custom_error_msgs[:unauthorized], status: :forbidden unless valid_domain?
+ return render_error errors: Rails.configuration.custom_error_msgs[:banned_user], status: :forbidden unless valid_domain?
user = UserCreator.new(user_params: create_user_params.except(:invite_token), provider: current_provider, role: default_role).call
@@ -97,7 +97,7 @@ def create
render_error errors: Rails.configuration.custom_error_msgs[:record_invalid], status: :bad_request
end
end
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
+ # rubocop:enable Metrics/AbcSize
# PATCH /api/v1/users/:id.json
# Updates the values of a user
@@ -169,11 +169,7 @@ def create_user_params
end
def update_user_params
- @update_user_params ||= if external_auth?
- params.require(:user).permit(:password, :avatar, :language, :role_id, :invite_token)
- else
- params.require(:user).permit(:name, :password, :avatar, :language, :role_id, :invite_token)
- end
+ @update_user_params ||= params.require(:user).permit(permitted_params)
end
def change_password_params
@@ -198,6 +194,14 @@ def valid_domain?
end
false
end
+
+ def permitted_params
+ is_admin = PermissionsChecker.new(current_user:, permission_names: 'ManageUsers', current_provider:).call
+
+ return %i[password avatar language role_id invite_token] if external_auth? && !is_admin
+
+ %i[name password avatar language role_id invite_token]
+ end
end
end
end
diff --git a/app/controllers/external_controller.rb b/app/controllers/external_controller.rb
index ec57eb1006..d552dae03a 100644
--- a/app/controllers/external_controller.rb
+++ b/app/controllers/external_controller.rb
@@ -32,6 +32,13 @@ def create_user
user = User.find_by(external_id: credentials['uid'], provider:)
+ # Fallback mechanism to search by email
+ if user.blank? && ENV.fetch('USE_EMAIL_AS_EXTERNAL_ID_FALLBACK', 'false') == 'true'
+ user = User.find_by(email: credentials['info']['email'], provider:)
+ # Update the user's external id to the latest value to avoid using the fallback
+ user.update(external_id: credentials['uid']) if user.present? && credentials['uid'].present?
+ end
+
new_user = user.blank?
registration_method = SettingGetter.new(setting_name: 'RegistrationMethod', provider: current_provider).call
@@ -41,9 +48,10 @@ def create_user
return redirect_to root_path(error: Rails.configuration.custom_error_msgs[:invite_token_invalid])
end
- return render_error status: :forbidden unless valid_domain?(user_info[:email])
+ # Redirect to root if the user doesn't exist and has an invalid domain
+ return redirect_to root_path(error: Rails.configuration.custom_error_msgs[:banned_user]) if new_user && !valid_domain?(user_info[:email])
- # Create the user if they dont exist
+ # Create the user if they don't exist
if new_user
user = UserCreator.new(user_params: user_info, provider: current_provider, role: default_role).call
user.save!
@@ -106,6 +114,8 @@ def recording_ready
RecordingCreator.new(recording:, first_creation: true).call
render json: {}, status: :ok
+ rescue JWT::DecodeError
+ render json: {}, status: :unauthorized
end
# GET /meeting_ended
diff --git a/app/javascript/components/admin/site_settings/registration/Registration.jsx b/app/javascript/components/admin/site_settings/registration/Registration.jsx
index 7d9029666f..764e5b00f5 100644
--- a/app/javascript/components/admin/site_settings/registration/Registration.jsx
+++ b/app/javascript/components/admin/site_settings/registration/Registration.jsx
@@ -108,6 +108,7 @@ export default function Registration() {