diff --git a/.dockerignore b/.dockerignore index 494a3569..5da345a5 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,6 +3,7 @@ .gitignore README.md SECURITY.md +.github # Rails .env @@ -24,6 +25,5 @@ vendor/bundle Dockerfile .gitlab-ci.yml .rubocop.yml -.travis.yml spec test \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..1095877a --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ + + + + +## Description + + +## Testing Steps + + +## Screenshots (if appropriate): + diff --git a/.github/workflows/ci.build.prerelease.yml b/.github/workflows/ci.build.prerelease.yml new file mode 100644 index 00000000..2122fa1c --- /dev/null +++ b/.github/workflows/ci.build.prerelease.yml @@ -0,0 +1,95 @@ +env: + RUBY_VERSION: 2.7 + +name: CI Build Pre-Release +on: + release: + types: [prereleased] + +jobs: + main: + name: Build Docker Image + env: + 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 + steps: + - name: Checkout + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: actions/checkout@v2 + + - name: Set up Docker Buildx + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: docker/setup-buildx-action@v1 + + - name: Cache Docker layers + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + + - name: Login to DockerHub + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract Docker Repository + id: ci_docker_repository + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + shell: bash + run: echo "##[set-output name=repository;]$(echo ${DOCKER_REPOSITORY:-$GITHUB_REPOSITORY})" + + - name: Extract Tag Release + id: ci_tag_release_version + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + shell: bash + run: echo "##[set-output name=tag;]$(echo ${GITHUB_REF#refs/tags/} | cut -c 9-)" + + - name: Build and Push + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: docker/build-push-action@v2 + with: + push: true + tags: | + "${{ steps.ci_docker_repository.outputs.repository }}:v${{ steps.ci_tag_release_version.outputs.tag }}" + build-args: "version_code=release-${{ steps.ci_tag_release_version.outputs.tag }}" + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + + # Alternate Images with alpine + - name: Alternate Alpine Build and Push + if: contains(env.DOCKER_BUILD_ENABLED, 'true') && contains(env.DOCKER_BUILD_ALTERNATE_ENABLED, 'true') + uses: docker/build-push-action@v2 + with: + file: dockerfiles/v2/alpine + push: true + tags: | + "${{ steps.ci_docker_repository.outputs.repository }}:v${{ steps.ci_tag_release_version.outputs.tag }}-alpine" + build-args: "version_code=release-${{ steps.ci_tag_release_version.outputs.tag }}" + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + + # Alternate Images with amazonlinux + - name: Alternate Amazon Linux Build and Push + if: contains(env.DOCKER_BUILD_ENABLED, 'true') && contains(env.DOCKER_BUILD_ALTERNATE_ENABLED, 'true') + uses: docker/build-push-action@v2 + with: + file: dockerfiles/v2/amazonlinux + push: true + tags: | + "${{ steps.ci_docker_repository.outputs.repository }}:v${{ steps.ci_tag_release_version.outputs.tag }}-amazonlinux" + build-args: "version_code=release-${{ steps.ci_tag_release_version.outputs.tag }}" + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + + - name: Move cache + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + run: | + rm -rf /tmp/.buildx-cache + mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/.github/workflows/ci.build.push.yml b/.github/workflows/ci.build.push.yml new file mode 100644 index 00000000..5197daf3 --- /dev/null +++ b/.github/workflows/ci.build.push.yml @@ -0,0 +1,101 @@ +env: + RUBY_VERSION: 2.7 + +name: CI Build Push +on: + push: + branches: "*" + +jobs: + main: + name: Build Docker Image + env: + 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 + steps: + - name: Checkout + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: actions/checkout@v2 + + - name: Set up Docker Buildx + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: docker/setup-buildx-action@v1 + + - name: Cache Docker layers + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + + - name: Login to DockerHub + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract Docker Repository + id: ci_docker_repository + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + shell: bash + run: echo "##[set-output name=repository;]$(echo ${DOCKER_REPOSITORY:-$GITHUB_REPOSITORY})" + + - name: Extract Branch Name + id: ci_branch_name + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + shell: bash + run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" + + - name: Extract Commit Short SHA + id: ci_commit_short_sha + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + shell: bash + run: echo "##[set-output name=short_sha;]$(echo ${GITHUB_SHA} | cut -c1-7)" + + - name: Build and Push + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: docker/build-push-action@v2 + with: + push: true + tags: | + "${{ steps.ci_docker_repository.outputs.repository }}:${{ steps.ci_branch_name.outputs.branch }}" + build-args: "version_code=${{ steps.ci_branch_name.outputs.branch }}-${{ steps.ci_commit_short_sha.outputs.short_sha }}" + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + + # Alternate Image with alpine + - name: Alternate Alpine Build and Push + if: contains(env.DOCKER_BUILD_ENABLED, 'true') && contains(env.DOCKER_BUILD_ALTERNATE_ENABLED, 'true') + uses: docker/build-push-action@v2 + with: + file: dockerfiles/v2/alpine + push: true + tags: | + "${{ steps.ci_docker_repository.outputs.repository }}:${{ steps.ci_branch_name.outputs.branch }}-alpine" + build-args: "version_code=${{ steps.ci_branch_name.outputs.branch }}-${{ steps.ci_commit_short_sha.outputs.short_sha }}" + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + + # Alternate Images for bbb-bionic-230 with amazonlinux + - name: Alternate Amazon Linux Build and Push + if: contains(env.DOCKER_BUILD_ENABLED, 'true') && contains(env.DOCKER_BUILD_ALTERNATE_ENABLED, 'true') + uses: docker/build-push-action@v2 + with: + file: dockerfiles/v2/amazonlinux + push: true + tags: | + "${{ steps.ci_docker_repository.outputs.repository }}:${{ steps.ci_branch_name.outputs.branch }}-amazonlinux" + build-args: "version_code=${{ steps.ci_branch_name.outputs.branch }}-${{ steps.ci_commit_short_sha.outputs.short_sha }}" + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + + - name: Move cache + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + run: | + rm -rf /tmp/.buildx-cache + mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/.github/workflows/ci.build.release.yml b/.github/workflows/ci.build.release.yml new file mode 100644 index 00000000..f4afb0b4 --- /dev/null +++ b/.github/workflows/ci.build.release.yml @@ -0,0 +1,110 @@ +env: + RUBY_VERSION: 2.7 + +name: CI Build Release +on: + release: + types: [released] + +jobs: + main: + name: Build Docker Image + env: + 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 + steps: + - name: Checkout + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: actions/checkout@v2 + + - name: Set up Docker Buildx + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: docker/setup-buildx-action@v1 + + - name: Cache Docker layers + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + + - name: Login to DockerHub + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract Docker Repository + id: ci_docker_repository + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + shell: bash + run: echo "##[set-output name=repository;]$(echo ${DOCKER_REPOSITORY:-$GITHUB_REPOSITORY})" + + - name: Extract Tag Release + id: ci_tag_release + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + shell: bash + run: echo "##[set-output name=tag;]$(echo ${GITHUB_REF#refs/tags/})" + + - name: Extract Tag Release Major + id: ci_tag_release_major + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + shell: bash + run: echo "##[set-output name=tag;]$(echo ${{steps.ci_tag_release.outputs.tag}} | cut -c 9- | cut -f1-1 -d'.')" + + - name: Extract Tag Release Minor + id: ci_tag_release_minor + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + shell: bash + run: echo "##[set-output name=tag;]$(echo ${{steps.ci_tag_release.outputs.tag}} | cut -c 9- | cut -f1-2 -d'.')" + + - name: Build and Push + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + uses: docker/build-push-action@v2 + with: + push: true + tags: | + "${{ steps.ci_docker_repository.outputs.repository }}:${{ steps.ci_tag_release.outputs.tag }}" + "${{ steps.ci_docker_repository.outputs.repository }}:v${{ steps.ci_tag_release_major.outputs.tag }}" + "${{ steps.ci_docker_repository.outputs.repository }}:v${{ steps.ci_tag_release_minor.outputs.tag }}" + "${{ steps.ci_docker_repository.outputs.repository }}:latest" + build-args: "version_code=${{ steps.ci_tag_release_revision.outputs.tag }}" + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + + # Alternate Image with alpine + - name: Alternate Alpine Build and Push + if: contains(env.DOCKER_BUILD_ENABLED, 'true') && contains(env.DOCKER_BUILD_ALTERNATE_ENABLED, 'true') + uses: docker/build-push-action@v2 + with: + file: dockerfiles/v2/alpine + push: true + tags: | + "${{ steps.ci_docker_repository.outputs.repository }}:${{ steps.ci_tag_release.outputs.tag }}-alpine" + build-args: "version_code=${{ steps.ci_tag_release_revision.outputs.tag }}" + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + + # Alternate Image with amazonlinux + - name: Alternate Amazon Linux Build and Push + if: contains(env.DOCKER_BUILD_ENABLED, 'true') && contains(env.DOCKER_BUILD_ALTERNATE_ENABLED, 'true') + uses: docker/build-push-action@v2 + with: + file: dockerfiles/v2/amazonlinux + push: true + tags: | + "${{ steps.ci_docker_repository.outputs.repository }}:${{ steps.ci_tag_release.outputs.tag }}-amazonlinux" + build-args: "version_code=${{ steps.ci_tag_release_revision.outputs.tag }}" + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + + - name: Move cache + if: contains(env.DOCKER_BUILD_ENABLED, 'true') + run: | + rm -rf /tmp/.buildx-cache + mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..90a337e0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,68 @@ +env: + RUBY_VERSION: 2.7 + DB_ADAPTER: postgresql + DB_HOST: localhost + DB_NAME: postgres + DB_USERNAME: postgres + DB_PASSWORD: postgres + DB_PORT: 5432 + +name: CI +on: + push: + branches-ignore: "master" + pull_request: + branches: "*" + +jobs: + test: + name: Rubocop + RSpec + runs-on: ubuntu-18.04 + + services: + postgres: + image: postgres:13.2-alpine + env: + POSTGRES_DB: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + ports: + - 5432:5432 + # Health checks to wait until postgres is ready + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Install Ruby ${{ env.RUBY_VERSION }} + uses: actions/setup-ruby@v1 + with: + ruby-version: ${{ env.RUBY_VERSION }} + + - name: Bundle cache + uses: actions/cache@v2 + with: + path: vendor/bundle + key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} + restore-keys: | + ${{ runner.os }}-gems- + + - name: Bundle install + run: | + bundle config path vendor/bundle + bundle install --jobs 4 --retry 3 + + - name: Setup database + run: | + bundler exec rails db:create RAILS_ENV=test + bundler exec rails db:migrate RAILS_ENV=test + + - name: Run Rubocop + run: bundle exec rubocop --parallel --fail-level F + + - name: Run RSpec + run: bundle exec rspec diff --git a/.gitignore b/.gitignore index d8d3ef6c..29f6d370 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ # Ignore bundler config. /.bundle -vendor/bundle # Ignore the default SQLite database. /db/*.sqlite3 diff --git a/.rubocop.yml b/.rubocop.yml index 0e7a2d4f..9d14d92c 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -3,11 +3,9 @@ AllCops: - 'db/schema.rb' - 'vendor/**/*' DisabledByDefault: false - TargetRubyVersion: 2.5 + TargetRubyVersion: 2.7 -# Gems within groups in the Gemfile should be alphabetically sorted. -Bundler/OrderedGems: - Enabled: false + NewCops: enable Style/BlockDelimiters: Enabled: false @@ -138,7 +136,7 @@ Metrics/AbcSize: # A complexity metric that is strongly correlated to the number # of test cases needed to validate a method. Metrics/CyclomaticComplexity: - Max: 17 + Max: 20 # Checks for method parameter names that contain capital letters, end in numbers, or do not meet a minimal length. Naming/MethodParameterName: @@ -176,4 +174,18 @@ Style/HashTransformValues: Style/SlicingWithRange: Enabled: true - \ No newline at end of file + +Style/OptionalBooleanParameter: + Enabled: false + +Lint/DuplicateBranch: + Enabled: false + +Lint/ConstantDefinitionInBlock: + Enabled: false + +Lint/EmptyBlock: + Enabled: false + +Style/HashLikeCase: + Enabled: false diff --git a/.ruby-version b/.ruby-version index 73462a5a..37c2961c 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.5.1 +2.7.2 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 1d90c80b..00000000 --- a/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -sudo: required -language: ruby -cache: bundler -rvm: -- 2.5.1 -jobs: - include: - - stage: test - name: rubocop - script: bundle exec rubocop - if: env(CD_TEST_IGNORE) IS NOT present - - stage: test - name: rspec - script: gem install bundler & bundle exec rspec - if: env(CD_TEST_IGNORE) IS NOT present - - stage: build - name: build docker image - script: bash scripts/image_build.sh $TRAVIS_REPO_SLUG $TRAVIS_BRANCH - if: env(CD_BUILD_IGNORE) IS NOT present AND type NOT IN (pull_request) AND env(CD_DOCKER_USERNAME) - IS present AND env(CD_DOCKER_PASSWORD) IS present -notifications: - email: false - slack: - secure: T64A1ut/3LdnUpPfsywNkjbyR2AIRlm99SM40xnLmXjM6Q0EtcFJ4luymC0EQB2q86WmFiK3AyPNm/EKGw8ZmjgeJIUkhMm8zZOLnYLsqMZeYmNNlDtV4zbhQ0HO3uvBqGVCSD2LTcGhCU/9VAplWpa9VnWUsWeRfklQ1yJ4y9oKtzEuiFHrILbDfqF47SlkQqbhS/Bl/oGHVVXijAmomJGG4wa9UI0PlSOUL2sJxxMhti+fptSwKo+TgKS8Vtjeu3C10QfRlcSmoDS0vaQgm7fggm/GrQ8zkSC/SKzOes/+hhRBE+TERWkx26azEy2kmI6xIkNf2BqFjDtQkjKN9yJLdJ1Kyry0uk7Eco67klEN/WoJ38NBuHVkq7p2CWWawFMg3OCS/3D9DStvYJBTBFrv7LMGKfhB4UdOgr/aSRlCTiF2grxqaXmDp0p/1J3uHIfDxbXiwx2ySjJFSC9e0/nTkJprPCQxVoZO+OFk0y2ElHMrX5L0qA2kZ4tQaPf04pQNguCgEsTnBtivVVMxCn9+ymgcHAnzGZmQmQ52NoZBQpa2FjBfhfxGOqHWJm6Kuk3p5yrGZTqlkf3GlTIlFNL8y9/5w6QaxQJbZLYSBbxAtJNvMWN/1cUwdbRTE4D0QTThASTgN6TtPKfWwIRrfj5+G9cAWo6DunmNhzATZ9g= diff --git a/Dockerfile b/Dockerfile index d2fbe32e..c350ef87 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:2.5.1-alpine AS base +FROM ruby:2.7.2-alpine AS base # Set a variable for the install location. ARG RAILS_ROOT=/usr/src/app @@ -23,10 +23,12 @@ COPY Gemfile* ./ COPY Gemfile Gemfile.lock $RAILS_ROOT/ RUN bundle config --global frozen 1 \ - && bundle install --deployment --without development:test:assets -j4 --path=vendor/bundle \ - && rm -rf vendor/bundle/ruby/2.5.0/cache/*.gem \ - && find vendor/bundle/ruby/2.5.0/gems/ -name "*.c" -delete \ - && find vendor/bundle/ruby/2.5.0/gems/ -name "*.o" -delete + && bundle config set deployment 'true' \ + && bundle config set without 'development:test:assets' \ + && bundle install -j4 --path=vendor/bundle \ + && rm -rf vendor/bundle/ruby/2.7.0/cache/*.gem \ + && find vendor/bundle/ruby/2.7.0/gems/ -name "*.c" -delete \ + && find vendor/bundle/ruby/2.7.0/gems/ -name "*.o" -delete # Adding project files. COPY . . @@ -36,7 +38,7 @@ RUN rm -rf tmp/cache spec ############### Build step done ############### -FROM ruby:2.5.1-alpine +FROM ruby:2.7.2-alpine # Set a variable for the install location. ARG RAILS_ROOT=/usr/src/app @@ -61,5 +63,12 @@ EXPOSE 80 ARG version_code ENV VERSION_CODE=$version_code +# Set executable permission to start file +RUN chmod +x bin/start + +# FIXME / to remove / https://github.com/nahi/httpclient/issues/445 +RUN cat /etc/ssl/certs/ca-certificates.crt \ + >/usr/src/app/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/lib/httpclient/cacert.pem + # Start the application. CMD ["bin/start"] diff --git a/Gemfile b/Gemfile index eb85a08a..10ea0e46 100644 --- a/Gemfile +++ b/Gemfile @@ -8,136 +8,72 @@ git_source(:github) do |repo_name| end # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 5.2.4.4' - -# Use Puma as the app server -gem 'puma', '~> 3.12' - -# Use SCSS for stylesheets -gem 'sassc-rails' - -# Use Uglifier as compressor for JavaScript assets -gem 'uglifier', '>= 1.3.0' - -# Use CoffeeScript for .coffee assets and views -gem 'coffee-rails', '~> 4.2' - -# See https://github.com/rails/execjs#readme for more supported runtimes -# gem 'mini_racer', platforms: :ruby - -# Use jquery as the JavaScript library -gem 'jquery-rails', '~> 4.4' -gem 'jquery-ui-rails' - -# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks -gem 'turbolinks', '~> 5' - -# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -gem 'jbuilder', '~> 2.5' - -# Use Redis adapter to run Action Cable in production -# gem 'redis', '~> 3.0' - -# Use ActiveModel has_secure_password +gem 'aws-sdk-s3', '~> 1.88.1' gem 'bcrypt', '~> 3.1.7' - -# Reduces boot times through caching; required in config/boot.rb -gem 'bootsnap', '>= 1.1.0', require: false - -gem 'sprockets', '< 4.0.0' - -# Authentication. -gem 'omniauth' -gem 'omniauth-twitter' -gem 'omniauth-google-oauth2' -gem 'omniauth_openid_connect' -gem 'omniauth-bn-launcher', '~> 0.1.3' -gem 'net-ldap' -gem 'bn-ldap-authentication', '~> 0.1.4' -gem 'omniauth-bn-office365', '~> 0.1.1' - -# BigBlueButton API wrapper. gem 'bigbluebutton-api-ruby', git: 'https://github.com/mconf/bigbluebutton-api-ruby.git', branch: 'master' - -# Front-end. +gem 'bn-ldap-authentication', '~> 0.1.4' +gem 'bootsnap', '~> 1.7.2', require: false gem 'bootstrap', '~> 4.3.1' -gem 'tabler-rubygem', git: 'https://github.com/blindsidenetworks/tabler-rubygem.git', tag: '0.1.4.1' -gem 'pagy' +gem 'cancancan', '~> 2.3.0' +gem 'coveralls', '~> 0.8.23', require: false gem 'font-awesome-sass', '~> 5.9.0' - -# For detecting the users preferred language. -gem 'http_accept_language' - -# Use Capistrano for deployment -# gem 'capistrano-rails', group: :development - -# Markdown parsing. -gem 'redcarpet' - -# For limiting access based on user roles -gem 'cancancan', '~> 2.0' - -# Active Storage gems -gem 'aws-sdk-s3', '~> 1.75' -gem 'google-cloud-storage', '~> 1.26' - +gem 'google-cloud-storage', '~> 1.30.0' +gem 'http_accept_language', '~> 2.1.1' +gem 'i18n-language-mapping', '~> 0.1.3.1' +gem 'jbuilder', '~> 2.11.2' +gem 'jquery-rails', '~> 4.4.0' +gem 'jquery-ui-rails', '~> 6.0.1' +gem 'local_time', '~> 2.1.0' +gem 'net-ldap', '~> 0.17.0' +gem 'omniauth', '~> 1.9.1' +gem 'omniauth-bn-launcher', '~> 0.1.3' +gem 'omniauth-bn-office365', '~> 0.1.1' +gem 'omniauth-google-oauth2', '~> 0.7.0' +gem 'omniauth_openid_connect', '~> 0.3.5' +gem 'omniauth-twitter', '~> 1.4.0' +gem 'pagy', '~> 3.11.0' gem 'pluck_to_hash', '~> 1.0.2' +gem 'puma', '~> 4.3.8' +gem 'rails', '~> 5.2.6' +gem 'random_password', '~> 0.1.1' +gem "recaptcha", '~> 5.7.0' +gem 'redcarpet', '~> 3.5.1' +gem 'remote_syslog_logger', '~> 1.0.4' +gem 'rubocop', '~> 1.10.0' +gem 'sassc-rails', '~> 2.1.2' +gem 'sprockets', '~> 3.7.2' +gem 'sqlite3', '~> 1.3.6' +gem 'tabler-rubygem', git: 'https://github.com/blindsidenetworks/tabler-rubygem.git', tag: '0.1.4.1' +gem 'turbolinks', '~> 5.2.1' +gem 'tzinfo-data', '~> 1.2021.1' +gem 'uglifier', '~> 4.2.0' group :production do - # Use a postgres database in production. + gem 'hiredis', '~> 0.6.3' + gem "lograge", '~> 0.11.2' gem 'pg', '~> 0.18' - gem 'sequel' - - # For a better logging library in production - gem "lograge" - - # Use for the cache store in production - gem 'redis' - gem 'hiredis' + gem 'redis', '~> 4.2.5' + gem 'sequel', '~> 5.41.0' end -# Ruby linting. -gem 'rubocop' - group :development, :test do - # Call 'byebug' anywhere in the code to stop execution and get a debugger console - gem 'byebug', platform: :mri - # Environment configuration. - gem 'dotenv-rails' - # Use a sqlite database in test and development. - gem 'sqlite3', '~> 1.3.6' + gem 'byebug', '~> 11.1', platform: :mri + gem 'dotenv-rails', '~> 2.7' end group :test do - # Include Rspec and other testing utilities. + gem 'action-cable-testing', '~> 0.6' + gem "factory_bot_rails", '~> 6.1' + gem 'faker', '~> 2.16' + gem 'rails-controller-testing', '~> 1.0' gem 'rspec-rails', '~> 3.7' - gem 'action-cable-testing' - gem 'rails-controller-testing' gem 'shoulda-matchers', '~> 3.1' - gem 'faker' - gem "factory_bot_rails" - gem 'webmock' + gem 'webmock', '~> 3.11' end group :development do - # Access an IRB console on exception pages or by using <%= console %> anywhere in the code. - gem 'web-console', '>= 3.3.0' - gem 'listen', '~> 3.0.5' - # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring - gem 'spring' - gem 'spring-watcher-listen', '~> 2.0.0' + gem 'listen', '~> 3.0' + gem 'spring', '~> 2.1' + gem 'spring-watcher-listen', '~> 2.0' + gem 'web-console', '~> 3.7' end - -gem 'remote_syslog_logger' - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data' - -gem 'coveralls', require: false - -gem 'random_password' - -# Adds helpers for the Google reCAPTCHA API -gem "recaptcha" - -gem 'i18n-language-mapping', '~> 0.1.1' diff --git a/Gemfile.lock b/Gemfile.lock index 237cb49a..39d4ec6f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -25,77 +25,77 @@ GEM specs: action-cable-testing (0.6.1) actioncable (>= 5.0) - actioncable (5.2.4.4) - actionpack (= 5.2.4.4) + actioncable (5.2.6) + actionpack (= 5.2.6) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailer (5.2.4.4) - actionpack (= 5.2.4.4) - actionview (= 5.2.4.4) - activejob (= 5.2.4.4) + actionmailer (5.2.6) + actionpack (= 5.2.6) + actionview (= 5.2.6) + activejob (= 5.2.6) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.2.4.4) - actionview (= 5.2.4.4) - activesupport (= 5.2.4.4) + actionpack (5.2.6) + actionview (= 5.2.6) + activesupport (= 5.2.6) rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.4.4) - activesupport (= 5.2.4.4) + actionview (5.2.6) + activesupport (= 5.2.6) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (5.2.4.4) - activesupport (= 5.2.4.4) + activejob (5.2.6) + activesupport (= 5.2.6) globalid (>= 0.3.6) - activemodel (5.2.4.4) - activesupport (= 5.2.4.4) - activerecord (5.2.4.4) - activemodel (= 5.2.4.4) - activesupport (= 5.2.4.4) + activemodel (5.2.6) + activesupport (= 5.2.6) + activerecord (5.2.6) + activemodel (= 5.2.6) + activesupport (= 5.2.6) arel (>= 9.0) - activestorage (5.2.4.4) - actionpack (= 5.2.4.4) - activerecord (= 5.2.4.4) - marcel (~> 0.3.1) - activesupport (5.2.4.4) + activestorage (5.2.6) + actionpack (= 5.2.6) + activerecord (= 5.2.6) + marcel (~> 1.0.0) + activesupport (5.2.6) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - addressable (2.7.0) + addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) aes_key_wrap (1.1.0) arel (9.0.0) - ast (2.4.0) + ast (2.4.2) attr_required (1.0.1) - autoprefixer-rails (9.7.6) + autoprefixer-rails (10.2.4.0) execjs - aws-eventstream (1.1.0) - aws-partitions (1.343.0) - aws-sdk-core (3.104.1) + aws-eventstream (1.1.1) + aws-partitions (1.435.0) + aws-sdk-core (3.113.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.36.0) - aws-sdk-core (~> 3, >= 3.99.0) + aws-sdk-kms (1.43.0) + aws-sdk-core (~> 3, >= 3.112.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.75.0) - aws-sdk-core (~> 3, >= 3.104.1) + aws-sdk-s3 (1.88.2) + aws-sdk-core (~> 3, >= 3.112.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.1) + aws-sigv4 (1.2.3) aws-eventstream (~> 1, >= 1.0.2) - bcrypt (3.1.13) - bindata (2.4.8) + bcrypt (3.1.16) + bindata (2.4.10) bindex (0.8.1) bn-ldap-authentication (0.1.4) net-ldap (~> 0) - bootsnap (1.4.6) + bootsnap (1.7.3) msgpack (~> 1.0) bootstrap (4.3.1) autoprefixer-rails (>= 9.1.0) @@ -105,71 +105,74 @@ GEM byebug (11.1.3) cancancan (2.3.0) childprocess (4.0.0) - coffee-rails (4.2.2) - coffee-script (>= 2.2.0) - railties (>= 4.0.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.12.2) - concurrent-ruby (1.1.7) + concurrent-ruby (1.1.8) coveralls (0.8.23) json (>= 1.8, < 3) simplecov (~> 0.16.1) term-ansicolor (~> 1.3) thor (>= 0.19.4, < 2.0) tins (~> 1.6) - crack (0.4.3) - safe_yaml (~> 1.0.0) + crack (0.4.5) + rexml crass (1.0.6) declarative (0.0.20) declarative-option (0.1.0) - diff-lcs (1.3) - digest-crc (0.6.1) - rake (~> 13.0) - docile (1.3.2) - dotenv (2.7.5) - dotenv-rails (2.7.5) - dotenv (= 2.7.5) - railties (>= 3.2, < 6.1) - erubi (1.9.0) + diff-lcs (1.4.4) + digest-crc (0.6.3) + rake (>= 12.0.0, < 14.0.0) + docile (1.3.5) + dotenv (2.7.6) + dotenv-rails (2.7.6) + dotenv (= 2.7.6) + railties (>= 3.2) + erubi (1.10.0) execjs (2.7.0) - factory_bot (5.2.0) - activesupport (>= 4.2.0) - factory_bot_rails (5.2.0) - factory_bot (~> 5.2.0) - railties (>= 4.2.0) - faker (2.11.0) + factory_bot (6.1.0) + activesupport (>= 5.0.0) + factory_bot_rails (6.1.0) + factory_bot (~> 6.1.0) + railties (>= 5.0.0) + faker (2.17.0) i18n (>= 1.6, < 2) - faraday (1.0.1) + faraday (1.3.0) + faraday-net_http (~> 1.0) multipart-post (>= 1.2, < 3) - ffi (1.12.2) + ruby2_keywords + faraday-net_http (1.0.1) + ffi (1.15.0) font-awesome-sass (5.9.0) sassc (>= 1.11) globalid (0.4.2) activesupport (>= 4.2.0) - google-api-client (0.42.1) + google-apis-core (0.3.0) addressable (~> 2.5, >= 2.5.1) - googleauth (~> 0.9) + googleauth (~> 0.14) httpclient (>= 2.8.1, < 3.0) mini_mime (~> 1.0) representable (~> 3.0) retriable (>= 2.0, < 4.0) - signet (~> 0.12) - google-cloud-core (1.5.0) + rexml + signet (~> 0.14) + webrick + google-apis-iamcredentials_v1 (0.2.0) + google-apis-core (~> 0.1) + google-apis-storage_v1 (0.3.0) + google-apis-core (~> 0.1) + google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) - google-cloud-env (1.3.3) + google-cloud-env (1.5.0) faraday (>= 0.17.3, < 2.0) - google-cloud-errors (1.0.1) - google-cloud-storage (1.26.2) + google-cloud-errors (1.1.0) + google-cloud-storage (1.30.0) addressable (~> 2.5) digest-crc (~> 0.4) - google-api-client (~> 0.33) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.1) google-cloud-core (~> 1.2) googleauth (~> 0.9) mini_mime (~> 1.0) - googleauth (0.13.0) + googleauth (0.16.0) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) @@ -181,10 +184,10 @@ GEM hiredis (0.6.3) http_accept_language (2.1.1) httpclient (2.8.3) - i18n (1.8.5) + i18n (1.8.10) concurrent-ruby (~> 1.0) - i18n-language-mapping (0.1.2) - jbuilder (2.10.0) + i18n-language-mapping (0.1.3.1) + jbuilder (2.11.2) activesupport (>= 5.0.0) jmespath (1.4.0) jquery-rails (4.4.0) @@ -193,44 +196,43 @@ GEM thor (>= 0.14, < 2.0) jquery-ui-rails (6.0.1) railties (>= 3.2.16) - json (2.3.0) + json (2.5.1) json-jwt (1.13.0) activesupport (>= 4.2) aes_key_wrap bindata - jwt (2.2.1) - listen (3.0.8) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) + jwt (2.2.2) + listen (3.5.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + local_time (2.1.0) lograge (0.11.2) actionpack (>= 4) activesupport (>= 4) railties (>= 4) request_store (~> 1.0) - loofah (2.7.0) + loofah (2.9.1) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) mini_mime (>= 0.1.1) - marcel (0.3.3) - mimemagic (~> 0.3.2) + marcel (1.0.1) memoist (0.16.2) method_source (1.0.0) - mimemagic (0.3.5) - mini_mime (1.0.2) - mini_portile2 (2.5.0) - minitest (5.14.2) - msgpack (1.3.3) - multi_json (1.14.1) + mini_mime (1.1.0) + mini_portile2 (2.6.1) + minitest (5.14.4) + msgpack (1.4.2) + multi_json (1.15.0) multi_xml (0.6.0) multipart-post (2.1.1) - net-ldap (0.16.2) - nio4r (2.5.4) - nokogiri (1.11.1) - mini_portile2 (~> 2.5.0) + net-ldap (0.17.0) + nio4r (2.5.7) + nokogiri (1.12.5) + mini_portile2 (~> 2.6.1) racc (~> 1.4) - oauth (0.5.4) - oauth2 (1.4.4) + oauth (0.5.5) + oauth2 (1.4.7) faraday (>= 0.8, < 2.0) jwt (>= 1.0, < 3.0) multi_json (~> 1.3) @@ -249,9 +251,9 @@ GEM jwt (>= 2.0) omniauth (>= 1.1.1) omniauth-oauth2 (>= 1.5) - omniauth-oauth (1.1.0) + omniauth-oauth (1.2.0) oauth - omniauth (~> 1.0) + omniauth (>= 1.0, < 3) omniauth-oauth2 (1.5.0) oauth2 (~> 1.1) omniauth (~> 1.2) @@ -272,18 +274,19 @@ GEM validate_email validate_url webfinger (>= 1.0.1) - os (1.1.0) - pagy (3.8.1) - parallel (1.19.1) - parser (2.7.1.3) - ast (~> 2.4.0) + os (1.1.1) + pagy (3.11.0) + parallel (1.20.1) + parser (3.0.0.0) + ast (~> 2.4.1) pg (0.21.0) pluck_to_hash (1.0.2) activerecord (>= 4.0.2) activesupport (>= 4.0.2) popper_js (1.16.0) - public_suffix (4.0.5) - puma (3.12.6) + public_suffix (4.0.6) + puma (4.3.8) + nio4r (~> 2.0) racc (1.5.2) rack (2.2.3) rack-oauth2 (1.16.0) @@ -294,44 +297,45 @@ GEM rack (>= 2.1.0) rack-test (1.1.0) rack (>= 1.0, < 3) - rails (5.2.4.4) - actioncable (= 5.2.4.4) - actionmailer (= 5.2.4.4) - actionpack (= 5.2.4.4) - actionview (= 5.2.4.4) - activejob (= 5.2.4.4) - activemodel (= 5.2.4.4) - activerecord (= 5.2.4.4) - activestorage (= 5.2.4.4) - activesupport (= 5.2.4.4) + rails (5.2.6) + actioncable (= 5.2.6) + actionmailer (= 5.2.6) + actionpack (= 5.2.6) + actionview (= 5.2.6) + activejob (= 5.2.6) + activemodel (= 5.2.6) + activerecord (= 5.2.6) + activestorage (= 5.2.6) + activesupport (= 5.2.6) bundler (>= 1.3.0) - railties (= 5.2.4.4) + railties (= 5.2.6) sprockets-rails (>= 2.0.0) - rails-controller-testing (1.0.4) - actionpack (>= 5.0.1.x) - actionview (>= 5.0.1.x) - activesupport (>= 5.0.1.x) + rails-controller-testing (1.0.5) + actionpack (>= 5.0.1.rc1) + actionview (>= 5.0.1.rc1) + activesupport (>= 5.0.1.rc1) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) rails-html-sanitizer (1.3.0) loofah (~> 2.3) - railties (5.2.4.4) - actionpack (= 5.2.4.4) - activesupport (= 5.2.4.4) + railties (5.2.6) + actionpack (= 5.2.6) + activesupport (= 5.2.6) method_source rake (>= 0.8.7) thor (>= 0.19.0, < 2.0) rainbow (3.0.0) - rake (13.0.1) + rake (13.0.3) random_password (0.1.1) rb-fsevent (0.10.4) rb-inotify (0.10.1) ffi (~> 1.0) - recaptcha (5.5.0) + recaptcha (5.7.0) json - redcarpet (3.5.0) - redis (4.1.4) + redcarpet (3.5.1) + redis (4.2.5) + regexp_parser (2.1.1) remote_syslog_logger (1.0.4) syslog_protocol representable (3.0.4) @@ -341,10 +345,10 @@ GEM request_store (1.5.0) rack (>= 1.4) retriable (3.1.2) - rexml (3.2.4) - rspec-core (3.9.2) + rexml (3.2.5) + rspec-core (3.9.3) rspec-support (~> 3.9.3) - rspec-expectations (3.9.2) + rspec-expectations (3.9.4) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.9.0) rspec-mocks (3.9.1) @@ -358,21 +362,22 @@ GEM rspec-expectations (~> 3.9.0) rspec-mocks (~> 3.9.0) rspec-support (~> 3.9.0) - rspec-support (3.9.3) - rubocop (0.84.0) + rspec-support (3.9.4) + rubocop (1.10.0) parallel (~> 1.10) - parser (>= 2.7.0.1) + parser (>= 3.0.0.0) rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) rexml - rubocop-ast (>= 0.0.3) + rubocop-ast (>= 1.2.0, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 2.0) - rubocop-ast (0.0.3) - parser (>= 2.7.0.1) - ruby-progressbar (1.10.1) + unicode-display_width (>= 1.4.0, < 3.0) + rubocop-ast (1.4.1) + parser (>= 2.7.1.5) + ruby-progressbar (1.11.0) + ruby2_keywords (0.0.4) rubyzip (2.3.0) - safe_yaml (1.0.5) - sassc (2.3.0) + sassc (2.4.0) ffi (~> 1.9) sassc-rails (2.1.2) railties (>= 4.0.0) @@ -380,10 +385,10 @@ GEM sprockets (> 3.0) sprockets-rails tilt - sequel (5.32.0) + sequel (5.41.0) shoulda-matchers (3.1.3) activesupport (>= 4.0.0) - signet (0.14.0) + signet (0.15.0) addressable (~> 2.3) faraday (>= 0.17.3, < 2.0) jwt (>= 1.5, < 3.0) @@ -393,7 +398,7 @@ GEM json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.2) - spring (2.1.0) + spring (2.1.1) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) @@ -413,22 +418,22 @@ GEM syslog_protocol (0.9.2) term-ansicolor (1.7.1) tins (~> 1.0) - thor (1.0.1) + thor (1.1.0) thread_safe (0.3.6) tilt (2.0.10) - tins (1.25.0) + tins (1.28.0) sync turbolinks (5.2.1) turbolinks-source (~> 5.2) turbolinks-source (5.2.0) - tzinfo (1.2.7) + tzinfo (1.2.9) thread_safe (~> 0.1) - tzinfo-data (1.2020.1) + tzinfo-data (1.2021.1) tzinfo (>= 1.0.0) uber (0.1.0) uglifier (4.2.0) execjs (>= 0.3.0, < 3) - unicode-display_width (1.7.0) + unicode-display_width (2.0.0) validate_email (0.1.6) activemodel (>= 3.0) mail (>= 2.2.5) @@ -443,73 +448,74 @@ GEM webfinger (1.1.0) activesupport httpclient (>= 2.4) - webmock (3.8.3) + webmock (3.12.1) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) + webrick (1.7.0) websocket-driver (0.7.3) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - xml-simple (1.1.5) + xml-simple (1.1.8) PLATFORMS ruby DEPENDENCIES - action-cable-testing - aws-sdk-s3 (~> 1.75) + action-cable-testing (~> 0.6) + aws-sdk-s3 (~> 1.88.1) bcrypt (~> 3.1.7) bigbluebutton-api-ruby! bn-ldap-authentication (~> 0.1.4) - bootsnap (>= 1.1.0) + bootsnap (~> 1.7.2) bootstrap (~> 4.3.1) - byebug - cancancan (~> 2.0) - coffee-rails (~> 4.2) - coveralls - dotenv-rails - factory_bot_rails - faker + byebug (~> 11.1) + cancancan (~> 2.3.0) + coveralls (~> 0.8.23) + dotenv-rails (~> 2.7) + factory_bot_rails (~> 6.1) + faker (~> 2.16) font-awesome-sass (~> 5.9.0) - google-cloud-storage (~> 1.26) - hiredis - http_accept_language - i18n-language-mapping (~> 0.1.1) - jbuilder (~> 2.5) - jquery-rails (~> 4.4) - jquery-ui-rails - listen (~> 3.0.5) - lograge - net-ldap - omniauth + google-cloud-storage (~> 1.30.0) + hiredis (~> 0.6.3) + http_accept_language (~> 2.1.1) + i18n-language-mapping (~> 0.1.3.1) + jbuilder (~> 2.11.2) + jquery-rails (~> 4.4.0) + jquery-ui-rails (~> 6.0.1) + listen (~> 3.0) + local_time (~> 2.1.0) + lograge (~> 0.11.2) + net-ldap (~> 0.17.0) + omniauth (~> 1.9.1) omniauth-bn-launcher (~> 0.1.3) omniauth-bn-office365 (~> 0.1.1) - omniauth-google-oauth2 - omniauth-twitter - omniauth_openid_connect - pagy + omniauth-google-oauth2 (~> 0.7.0) + omniauth-twitter (~> 1.4.0) + omniauth_openid_connect (~> 0.3.5) + pagy (~> 3.11.0) pg (~> 0.18) pluck_to_hash (~> 1.0.2) - puma (~> 3.12) - rails (~> 5.2.4.4) - rails-controller-testing - random_password - recaptcha - redcarpet - redis - remote_syslog_logger + puma (~> 4.3.8) + rails (~> 5.2.6) + rails-controller-testing (~> 1.0) + random_password (~> 0.1.1) + recaptcha (~> 5.7.0) + redcarpet (~> 3.5.1) + redis (~> 4.2.5) + remote_syslog_logger (~> 1.0.4) rspec-rails (~> 3.7) - rubocop - sassc-rails - sequel + rubocop (~> 1.10.0) + sassc-rails (~> 2.1.2) + sequel (~> 5.41.0) shoulda-matchers (~> 3.1) - spring - spring-watcher-listen (~> 2.0.0) - sprockets (< 4.0.0) + spring (~> 2.1) + spring-watcher-listen (~> 2.0) + sprockets (~> 3.7.2) sqlite3 (~> 1.3.6) tabler-rubygem! - turbolinks (~> 5) - tzinfo-data - uglifier (>= 1.3.0) - web-console (>= 3.3.0) - webmock + turbolinks (~> 5.2.1) + tzinfo-data (~> 1.2021.1) + uglifier (~> 4.2.0) + web-console (~> 3.7) + webmock (~> 3.11) diff --git a/README.md b/README.md index 454102cc..f94a8966 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Greenlight -![Travis CI](https://travis-ci.org/bigbluebutton/greenlight.svg?branch=master) ![Coverage !Status](https://coveralls.io/repos/github/bigbluebutton/greenlight/badge.svg?branch=master) ![Docker Pulls](https://img.shields.io/docker/pulls/bigbluebutton/greenlight.svg) @@ -33,4 +32,6 @@ Greenlight is built using Ruby on Rails. Many developers already know Rails well We invite you to build upon Greenlight and help make it better. See [Contributing to BigBlueButton](http://docs.bigbluebutton.org/support/faq.html#contributing-to-bigbluebutton). -We invite your feedback, questions, and suggests about Greenlight too. Please post them to the [developer mailing list](https://groups.google.com/forum/#!forum/bigbluebutton-dev). +We invite your feedback, questions, and suggests about Greenlight too. Please post them to the [Greenlight mailing list](https://groups.google.com/forum/#!forum/bigbluebutton-greenlight). + +To help with organization and consistency, we have implemented a Pull Request template that must be used for all Pull Requests. This template helps ensure that the project maintainers can review all PRs in a timely manner. When creating a Pull Request, please provide as much information as possible. \ No newline at end of file diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 72c83bb7..dd678843 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -35,4 +35,5 @@ //= require jquery-ui/widgets/sortable //= require pickr.min.js //= require bootstrap-select.min.js +//= require local-time //= require_tree . diff --git a/app/assets/javascripts/room.js b/app/assets/javascripts/room.js index 8ed1cddb..e0f9e7ec 100644 --- a/app/assets/javascripts/room.js +++ b/app/assets/javascripts/room.js @@ -46,10 +46,16 @@ $(document).on('turbolinks:load', function(){ showUpdateRoom(this) }) + // share room pop up accessibility + manageAccessAccessibility(); + $(".delete-room").click(function() { showDeleteRoom(this) }) + // For keyboard users to be able to generate access code + generateAccessCodeAccessibility() + $('.selectpicker').selectpicker({ liveSearchPlaceholder: getLocalizedString('javascript.search.start') }); @@ -59,6 +65,7 @@ $(document).on('turbolinks:load', function(){ $(".share-room").click(function() { // Update the path of save button $("#save-access").attr("data-path", $(this).data("path")) + $("#room-owner-uid").val($(this).data("owner")) // Get list of users shared with and display them displaySharedUsers($(this).data("users-path")) @@ -82,7 +89,7 @@ $(document).on('turbolinks:load', function(){ $(".bs-searchbox").siblings().hide() } else { // Manually populate the dropdown - $.get($("#share-room-select").data("path"), { search: $(".bs-searchbox input").val() }, function(users) { + $.get($("#share-room-select").data("path"), { search: $(".bs-searchbox input").val(), owner_uid: $("#room-owner-uid").val() }, function(users) { $(".select-options").remove() if (users.length > 0) { users.forEach(function(user) { @@ -183,17 +190,19 @@ function copyInvite() { } } -function copyAccess() { - $('#copy-code').attr("type", "text") - $('#copy-code').select() +function copyAccess(target) { + input = target ? $("#copy-" + target + "-code") : $("#copy-code") + input.attr("type", "text") + input.select() if (document.execCommand("copy")) { - $('#copy-code').attr("type", "hidden") - copy = $("#copy-access") + input.attr("type", "hidden") + copy = target ? $("#copy-" + target + "-access") : $("#copy-access") copy.addClass('btn-success'); copy.html("" + getLocalizedString("copied")) setTimeout(function(){ copy.removeClass('btn-success'); - copy.html("" + getLocalizedString("room.copy_access")) + originalString = target ? getLocalizedString("room.copy_" + target + "_access") : getLocalizedString("room.copy_access") + copy.html("" + originalString) }, 1000) } } @@ -201,7 +210,9 @@ function copyAccess() { function showCreateRoom(target) { $("#create-room-name").val("") $("#create-room-access-code").text(getLocalizedString("modal.create_room.access_code_placeholder")) + $("#create-room-moderator-access-code").text(getLocalizedString("modal.create_room.moderator_access_code_placeholder")) $("#room_access_code").val(null) + $("#room_moderator_access_code").val(null) $("#createRoomModal form").attr("action", $("body").data('relative-root')) $("#room_mute_on_join").prop("checked", $("#room_mute_on_join").data("default")) @@ -253,6 +264,16 @@ function showUpdateRoom(target) { $("#create-room-access-code").text(getLocalizedString("modal.create_room.access_code_placeholder")) $("#room_access_code").val(null) } + + var moderatorAccessCode = modal.closest(".room-block").data("room-moderator-access-code") + + if(moderatorAccessCode){ + $("#create-room-moderator-access-code").text(getLocalizedString("modal.create_room.moderator_access_code") + ": " + moderatorAccessCode) + $("#room_moderator_access_code").val(moderatorAccessCode) + } else { + $("#create-room-moderator-access-code").text(getLocalizedString("modal.create_room.moderator_access_code_placeholder")) + $("#room_moderator_access_code").val(null) + } } function showDeleteRoom(target) { @@ -290,6 +311,24 @@ function ResetAccessCode(){ $("#room_access_code").val(null) } +function generateModeratorAccessCode(){ + const accessCodeLength = 6 + var validCharacters = "abcdefghijklmopqrstuvwxyz" + var accessCode = "" + + for( var i = 0; i < accessCodeLength; i++){ + accessCode += validCharacters.charAt(Math.floor(Math.random() * validCharacters.length)); + } + + $("#create-room-moderator-access-code").text(getLocalizedString("modal.create_room.moderator_access_code") + ": " + accessCode) + $("#room_moderator_access_code").val(accessCode) +} + +function ResetModeratorAccessCode(){ + $("#create-room-moderator-access-code").text(getLocalizedString("modal.create_room.moderator_access_code_placeholder")) + $("#room_moderator_access_code").val(null) +} + function saveAccessChanges() { let listItemsToAdd = $("#user-list li:not(.remove-shared)").toArray().map(user => $(user).data("uid")) @@ -397,3 +436,67 @@ function clearRoomSearch() { $('#room-search').val(''); filterRooms() } + +function manageAccessAccessibility() { + // share room pop up accessibility + var holdModal = false; + $("#shareRoomModal").on("show.bs.modal", function() { + // for screen reader to be able to read results + $("#shareRoomModal .form-control").attr("aria-atomic", true); + $("#shareRoomModal .dropdown-menu div.inner").attr("role", "alert"); + $("#shareRoomModal ul.dropdown-menu").attr("role", "listbox"); + $("#shareRoomModal div.dropdown-menu").find("*").keyup(function(event) { + $("#shareRoomModal ul.dropdown-menu li").attr("aria-selected", false); + $("#shareRoomModal ul.dropdown-menu li.active").attr("aria-selected", true); + $("#shareRoomModal ul.dropdown-menu li.active a").attr("aria-selected", true); + }); + // for keyboard support + // so that it can escape / close search user without closing the modal + $("#shareRoomModal div.dropdown-menu input").keydown(function(event) { + if (event.keyCode === 27) { + holdModal = true; + } + }); + }); + + // reset escape button if the search is closed / done + $("#shareRoomModal").on("hide.bs.modal", function(e) { + if (holdModal) { + holdModal = false; + e.stopPropagation(); + return false; + } + }); +} + +function generateAccessCodeAccessibility() { + // For keyboard users to be able to generate access code + $("#generate-room-access-code").keyup(function(event) { + if (event.keyCode === 13 || event.keyCode === 32) { + generateAccessCode(); + } + }) + + // For keyboard users to be able to reset access code + $("#reset-access-code").keyup(function(event) { + if (event.keyCode === 13 || event.keyCode === 32) { + ResetAccessCode(); + } + }) + + // For keyboard users to be able to generate access code + // for moderator + $("#generate-moderator-room-access-code").keyup(function(event) { + if (event.keyCode === 13 || event.keyCode === 32) { + generateModeratorAccessCode(); + } + }) + + // For keyboard users to be able to reset access code + // for moderator + $("#reset-moderator-access-code").keyup(function(event) { + if (event.keyCode === 13 || event.keyCode === 32) { + ResetModeratorAccessCode(); + } + }) +} diff --git a/app/assets/stylesheets/admins.scss b/app/assets/stylesheets/admins.scss index 65036144..7b93539a 100644 --- a/app/assets/stylesheets/admins.scss +++ b/app/assets/stylesheets/admins.scss @@ -99,3 +99,7 @@ .admin-tabs { justify-content: space-around; } + +#rooms-table-div { + overflow: visible; +} \ No newline at end of file diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 13b0c128..fb85489f 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -187,3 +187,7 @@ table { .btn i { transition: all .15s; } + +.nav-icon i { + width: 35px; +} diff --git a/app/assets/stylesheets/rooms.scss b/app/assets/stylesheets/rooms.scss index 26709952..573ec5c4 100644 --- a/app/assets/stylesheets/rooms.scss +++ b/app/assets/stylesheets/rooms.scss @@ -32,8 +32,8 @@ font-size: 20px !important; } -.join-input { - height: 48px; +.moderator-code-label { + margin-top: 150px !important; } .home-indicator { diff --git a/app/controllers/account_activations_controller.rb b/app/controllers/account_activations_controller.rb index 0de5e776..7fa4f1dc 100644 --- a/app/controllers/account_activations_controller.rb +++ b/app/controllers/account_activations_controller.rb @@ -41,7 +41,7 @@ class AccountActivationsController < ApplicationController flash: { success: I18n.t("registration.approval.signup") } if @user.has_role?(:pending) # Redirect user to sign in path with success flash - redirect_to signin_path, flash: { success: I18n.t("verify.activated") + " " + I18n.t("verify.signin") } + redirect_to signin_path, flash: { success: "#{I18n.t('verify.activated')} #{I18n.t('verify.signin')}" } else redirect_to root_path, flash: { alert: I18n.t("verify.invalid") } end diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb index d51aeca0..ce752999 100644 --- a/app/controllers/admins_controller.rb +++ b/app/controllers/admins_controller.rb @@ -56,12 +56,19 @@ class AdminsController < ApplicationController # GET /admins/server_recordings def server_recordings - server_rooms = rooms_list_for_recordings + @search = params[:search] || "" - @search, @order_column, @order_direction, recs = - all_recordings(server_rooms, params.permit(:search, :column, :direction), true, true) + if @search.present? + if @search.include? "@" + user_email = @search + else + room_uid = @search + end + else + @latest = true + end - @pagy, @recordings = pagy_array(recs) + @pagy, @recordings = pagy_array(recordings_to_show(user_email, room_uid)) end # GET /admins/rooms @@ -138,10 +145,11 @@ class AdminsController < ApplicationController emails.each do |email| invitation = create_or_update_invite(email) - send_invitation_email(current_user.name, email, invitation.invite_token) + send_invitation_email(current_user.name, email, invitation) end - redirect_back fallback_location: admins_path + redirect_back fallback_location: admins_path, + flash: { success: I18n.t("administrator.flash.invite", email: emails.join(", ")) } end # GET /admins/reset @@ -202,13 +210,12 @@ class AdminsController < ApplicationController initial_list = User.without_role(:super_admin) .where.not(uid: current_user.uid) .merge_list_search(params[:search]) - .pluck_to_hash(:uid, :name, :email) initial_list = initial_list.where(provider: @user_domain) if Rails.configuration.loadbalanced_configuration # Respond with JSON object of users respond_to do |format| - format.json { render body: initial_list.to_json } + format.json { render body: initial_list.pluck_to_hash(:uid, :name, :email).to_json } end end @@ -222,7 +229,7 @@ class AdminsController < ApplicationController flash_message = I18n.t("administrator.flash.settings") if params[:value] == "Default Recording Visibility" - flash_message += ". " + I18n.t("administrator.site_settings.recording_visibility.warning") + flash_message += ". #{I18n.t('administrator.site_settings.recording_visibility.warning')}" end redirect_to admin_site_settings_path(tab: tab), flash: { success: flash_message } diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f3cb5248..65caa139 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -29,13 +29,11 @@ class ApplicationController < ActionController::Base def current_user @current_user ||= User.includes(:role, :main_room).find_by(id: session[:user_id]) - if Rails.configuration.loadbalanced_configuration - if @current_user && !@current_user.has_role?(:super_admin) && - @current_user.provider != @user_domain + if Rails.configuration.loadbalanced_configuration && (@current_user && !@current_user.has_role?(:super_admin) && + @current_user.provider != @user_domain) @current_user = nil session.clear end - end @current_user end @@ -86,8 +84,8 @@ class ApplicationController < ActionController::Base end maintenance_string = @settings.get_value("Maintenance Banner").presence || Rails.configuration.maintenance_window - if maintenance_string.present? - flash.now[:maintenance] = maintenance_string unless cookies[:maintenance_window] == maintenance_string + if maintenance_string.present? && cookies[:maintenance_window] != maintenance_string + flash.now[:maintenance] = maintenance_string end end @@ -96,14 +94,18 @@ class ApplicationController < ActionController::Base render :migration_error, status: 500 unless ENV["DB_MIGRATE_FAILED"].blank? end - # Sets the appropriate locale. - def user_locale(user = current_user) - locale = if user && user.language != 'default' + # Determines proper locale to be used by calling user_locale with params based on if room owner exists + def determine_locale(user) + if user && user.language != 'default' user.language else Rails.configuration.default_locale.presence || http_accept_language.language_region_compatible_from(I18n.available_locales) end + end + # Sets the appropriate locale. + def user_locale(user = current_user) + locale = determine_locale(user) begin I18n.locale = locale.tr('-', '_') unless locale.nil? rescue @@ -112,6 +114,7 @@ class ApplicationController < ActionController::Base I18n.locale = "en" end end + helper_method :user_locale # Checks to make sure that the admin has changed his password from the default def check_admin_password @@ -182,12 +185,18 @@ class ApplicationController < ActionController::Base end helper_method :shared_access_allowed - # Indicates whether users are allowed to share rooms + # Indicates whether users should consent recoding when joining rooms def recording_consent_required? @settings.get_value("Require Recording Consent") == "true" end helper_method :recording_consent_required? + # Indicates whether users are allowed to add moderator access codes to rooms + def moderator_code_allowed? + @settings.get_value("Room Configuration Moderator Access Codes") == "optional" + end + helper_method :moderator_code_allowed? + # Returns a list of allowed file types def allowed_file_types Rails.configuration.allowed_file_types @@ -268,17 +277,18 @@ class ApplicationController < ActionController::Base rescue => e logger.error "Error in retrieve provider info: #{e}" @hide_signin = true - if e.message.eql? "No user with that id exists" + case e.message + when "No user with that id exists" set_default_settings render "errors/greenlight_error", locals: { message: I18n.t("errors.not_found.user_not_found.message"), help: I18n.t("errors.not_found.user_not_found.help") } - elsif e.message.eql? "Provider not included." + when "Provider not included." set_default_settings render "errors/greenlight_error", locals: { message: I18n.t("errors.not_found.user_missing.message"), help: I18n.t("errors.not_found.user_missing.help") } - elsif e.message.eql? "That user has no configured provider." + when "That user has no configured provider." if Setting.exists?(provider: @user_domain) # Keep the branding @settings = Setting.find_by(provider: @user_domain) diff --git a/app/controllers/concerns/authenticator.rb b/app/controllers/concerns/authenticator.rb index 8b1e27b3..10b1eee6 100644 --- a/app/controllers/concerns/authenticator.rb +++ b/app/controllers/concerns/authenticator.rb @@ -45,6 +45,11 @@ module Authenticator # Dont redirect to any of these urls dont_redirect_to = [root_url, signin_url, ldap_signin_url, ldap_callback_url, signup_url, unauthorized_url, internal_error_url, not_found_url] + + unless ENV['OAUTH2_REDIRECT'].nil? + dont_redirect_to.push(File.join(ENV['OAUTH2_REDIRECT'], "auth", "openid_connect", "callback")) + end + url = if cookies[:return_to] && !dont_redirect_to.include?(cookies[:return_to]) cookies[:return_to] elsif user.role.get_permission("can_create_rooms") @@ -58,7 +63,9 @@ module Authenticator redirect_to url else - redirect_to resend_path + session[:user_id] = nil + user.create_activation_token + redirect_to account_activation_path(digest: user.activation_digest) end end @@ -106,7 +113,7 @@ module Authenticator old_user.rooms.each do |room| room.owner = user - room.name = "Old " + room.name if room.id == old_user.main_room.id + room.name = "Old #{room.name}" if room.id == old_user.main_room.id room.save! end diff --git a/app/controllers/concerns/bbb_server.rb b/app/controllers/concerns/bbb_server.rb index ab49c9ba..26d9ea2d 100644 --- a/app/controllers/concerns/bbb_server.rb +++ b/app/controllers/concerns/bbb_server.rb @@ -54,6 +54,8 @@ module BbbServer join_opts = {} join_opts[:userID] = uid if uid join_opts[:join_via_html5] = true + join_opts[:avatarURL] = options[:avatarURL] if options[:avatarURL].present? + join_opts[:createTime] = room.last_session.to_datetime.strftime("%Q") if room.last_session bbb_server.join_meeting_url(room.bbb_id, name, password, join_opts) end @@ -88,7 +90,7 @@ module BbbServer end unless meeting[:messageKey] == 'duplicateWarning' - room.update_attributes(sessions: room.sessions + 1, last_session: DateTime.now) + room.update_attributes(sessions: room.sessions + 1, last_session: DateTime.strptime(meeting[:createTime].to_s, "%Q")) end rescue BigBlueButton::BigBlueButtonException => e puts "BigBlueButton failed on create: #{e.key}: #{e.message}" @@ -107,6 +109,30 @@ module BbbServer bbb_server.send_api_request("updateRecordings", meta) end + # Update a recording from a room + def publish_recording(record_id) + bbb_server.publish_recordings(record_id, true) + end + + # Update a recording from a room + def unpublish_recording(record_id) + bbb_server.publish_recordings(record_id, false) + end + + # Protect a recording + def protect_recording(record_id, meta = {}) + meta[:recordID] = record_id + meta[:protect] = true + bbb_server.send_api_request("updateRecordings", meta) + end + + # Unprotect a recording + def unprotect_recording(record_id, meta = {}) + meta[:recordID] = record_id + meta[:protect] = false + bbb_server.send_api_request("updateRecordings", meta) + end + # Deletes a recording from a room. def delete_recording(record_id) bbb_server.delete_recordings(record_id) diff --git a/app/controllers/concerns/emailer.rb b/app/controllers/concerns/emailer.rb index aeb48b1d..bd87287c 100644 --- a/app/controllers/concerns/emailer.rb +++ b/app/controllers/concerns/emailer.rb @@ -70,16 +70,14 @@ module Emailer end # Sends inivitation to join - def send_invitation_email(name, email, token) + def send_invitation_email(name, email, invite) begin return unless Rails.configuration.enable_email_verification - UserMailer.invite_email(name, email, invitation_link(token), @settings).deliver_now + UserMailer.invite_email(name, email, invite.updated_at, invitation_link(invite.invite_token), @settings).deliver_now rescue => e logger.error "Support: Error in email delivery: #{e}" flash[:alert] = I18n.t(params[:message], default: I18n.t("delivery_error")) - else - flash[:success] = I18n.t("administrator.flash.invite", email: email) end end diff --git a/app/controllers/concerns/joiner.rb b/app/controllers/concerns/joiner.rb index 96958c05..a54b48c9 100644 --- a/app/controllers/concerns/joiner.rb +++ b/app/controllers/concerns/joiner.rb @@ -47,18 +47,30 @@ module Joiner end end + def valid_avatar?(url) + return false if URI.regexp(['http', 'https']).match(url).nil? + uri = URI(url) + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = true if uri.scheme == 'https' + response = http.request_head(uri) + return false if response.code != "200" + return response['content-length'].to_i < Rails.configuration.max_avatar_size + end + def join_room(opts) @room_settings = JSON.parse(@room[:room_settings]) - if room_running?(@room.bbb_id) || @room.owned_by?(current_user) || room_setting_with_config("anyoneCanStart") + moderator_privileges = @room.owned_by?(current_user) || valid_moderator_access_code(session[:moderator_access_code]) + if room_running?(@room.bbb_id) || room_setting_with_config("anyoneCanStart") || moderator_privileges # Determine if the user needs to join as a moderator. - opts[:user_is_moderator] = @room.owned_by?(current_user) || room_setting_with_config("joinModerator") || @shared_room + opts[:user_is_moderator] = room_setting_with_config("joinModerator") || @shared_room || moderator_privileges opts[:record] = record_meeting opts[:require_moderator_approval] = room_setting_with_config("requireModeratorApproval") opts[:mute_on_start] = room_setting_with_config("muteOnStart") if current_user + opts[:avatarURL] = current_user.image if current_user.image.present? && valid_avatar?(current_user.image) redirect_to join_path(@room, current_user.name, opts, current_user.uid) else join_name = params[:join_name] || params[@room.invite_path][:join_name] @@ -83,11 +95,12 @@ module Joiner # Default, unconfigured meeting options. def default_meeting_options - invite_msg = I18n.t("invite_message") + moderator_message = "#{I18n.t('invite_message')}
#{request.base_url + room_path(@room)}" + moderator_message += "
#{I18n.t('modal.create_room.access_code')}: #{@room.access_code}" if @room.access_code.present? { user_is_moderator: false, meeting_logout_url: request.base_url + logout_room_path(@room), - moderator_message: "#{invite_msg}
#{request.base_url + room_path(@room)}", + moderator_message: moderator_message, host: request.host, recording_default_visibility: @settings.get_value("Default Recording Visibility") == "public" } diff --git a/app/controllers/concerns/populator.rb b/app/controllers/concerns/populator.rb index b7865462..b3ee7293 100644 --- a/app/controllers/concerns/populator.rb +++ b/app/controllers/concerns/populator.rb @@ -56,12 +56,22 @@ module Populator end end - # Returns list of rooms needed to get the recordings on the server - def rooms_list_for_recordings - if Rails.configuration.loadbalanced_configuration - Room.includes(:owner).where(users: { provider: @user_domain }).pluck(:bbb_id) + # Returns the correct recordings based on the users inputs + def recordings_to_show(user = nil, room = nil) + if user.present? + # Find user and get his recordings + rooms = User.find_by(email: user)&.rooms&.pluck(:bbb_id) + return all_recordings(rooms) if user.present? && !rooms.nil? + + [] # return no recs if room not found + elsif room.present? + # Find room and get its recordings + room = Room.find_by(uid: room)&.bbb_id + return all_recordings([room]) if room.present? + + [] else - Room.pluck(:bbb_id) + latest_recordings end end @@ -75,4 +85,37 @@ module Populator list.admins_search(@search).order(updated_at: :desc) end + + private + + # Returns exactly 1 page of the latest recordings + def latest_recordings + return_length = Rails.configuration.pagination_rows + number_of_rooms = Rails.configuration.pagination_number + recordings = [] + counter = 0 + + # Manually paginate through the rooms + while recordings.length < return_length + rooms = if Rails.configuration.loadbalanced_configuration + Room.includes(:owner) + .where(users: { provider: @user_domain }) + .order(last_session: :desc) + .limit(number_of_rooms) + .offset(counter * number_of_rooms) + .pluck(:bbb_id) + else + Room.order(last_session: :desc) + .limit(return_length) + .offset(counter * return_length) + .pluck(:bbb_id) + end + + break if rooms.blank? + counter += 1 + recordings.push(*all_recordings(rooms)) + end + + recordings[0..return_length] + end end diff --git a/app/controllers/concerns/rolify.rb b/app/controllers/concerns/rolify.rb index f580ed2f..868cd87e 100644 --- a/app/controllers/concerns/rolify.rb +++ b/app/controllers/concerns/rolify.rb @@ -120,12 +120,13 @@ module Rolify role_params = params.require(:role).permit(:name) permission_params = params.require(:role).permit(:can_create_rooms, :send_promoted_email, :send_demoted_email, :can_edit_site_settings, :can_edit_roles, :can_manage_users, - :can_manage_rooms_recordings, :can_appear_in_share_list, :colour) + :can_launch_recording, :can_manage_rooms_recordings, :can_appear_in_share_list, :colour) permission_params.transform_values! do |v| - if v == "0" + case v + when "0" "false" - elsif v == "1" + when "1" "true" else v diff --git a/app/controllers/health_check_controller.rb b/app/controllers/health_check_controller.rb index 0c2fbb2d..8ecc0414 100644 --- a/app/controllers/health_check_controller.rb +++ b/app/controllers/health_check_controller.rb @@ -47,9 +47,7 @@ class HealthCheckController < ApplicationController end def database_check - if defined?(ActiveRecord) - raise "Database not responding" unless ActiveRecord::Migrator.current_version - end + raise "Database not responding" if defined?(ActiveRecord) && !ActiveRecord::Migrator.current_version raise "Pending migrations" unless ActiveRecord::Migration.check_pending!.nil? end @@ -61,9 +59,7 @@ class HealthCheckController < ApplicationController settings = ActionMailer::Base.smtp_settings smtp = Net::SMTP.new(settings[:address], settings[:port]) - if settings[:enable_starttls_auto] == "true" - smtp.enable_starttls_auto if smtp.respond_to?(:enable_starttls_auto) - end + smtp.enable_starttls_auto if settings[:enable_starttls_auto] == ("true") && smtp.respond_to?(:enable_starttls_auto) if settings[:authentication].present? && settings[:authentication] != "none" smtp.start(settings[:domain]) do |s| diff --git a/app/controllers/password_resets_controller.rb b/app/controllers/password_resets_controller.rb index 73ea364a..cd95b13c 100644 --- a/app/controllers/password_resets_controller.rb +++ b/app/controllers/password_resets_controller.rb @@ -23,22 +23,22 @@ class PasswordResetsController < ApplicationController before_action :find_user, only: [:edit, :update] before_action :check_expiration, only: [:edit, :update] - # POST /password_resets/new + # GET /password_resets/new def new end # POST /password_resets def create - begin - # Check if user exists and throw an error if he doesn't - @user = User.find_by!(email: params[:password_reset][:email].downcase, provider: @user_domain) + return redirect_to new_password_reset_path, flash: { alert: I18n.t("reset_password.captcha") } unless valid_captcha - send_password_reset_email(@user, @user.create_reset_digest) - redirect_to root_path - rescue - # User doesn't exist - redirect_to root_path, flash: { success: I18n.t("email_sent", email_type: t("reset_password.subtitle")) } - end + # Check if user exists and throw an error if he doesn't + @user = User.find_by!(email: params[:password_reset][:email].downcase, provider: @user_domain) + + send_password_reset_email(@user, @user.create_reset_digest) + redirect_to root_path + rescue + # User doesn't exist + redirect_to root_path, flash: { success: I18n.t("email_sent", email_type: t("reset_password.subtitle")) } end # GET /password_resets/:id/edit @@ -84,4 +84,10 @@ class PasswordResetsController < ApplicationController def disable_password_reset redirect_to '/404' end + + # Checks that the captcha passed is valid + def valid_captcha + return true unless Rails.configuration.recaptcha_enabled + verify_recaptcha + end end diff --git a/app/controllers/recordings_controller.rb b/app/controllers/recordings_controller.rb index 93912b46..54b9d784 100644 --- a/app/controllers/recordings_controller.rb +++ b/app/controllers/recordings_controller.rb @@ -28,6 +28,18 @@ class RecordingsController < ApplicationController "meta_#{META_LISTED}" => (params[:state] == "public"), } + if params[:state] == "protected" + protect_recording(params[:record_id]) + else + unprotect_recording(params[:record_id]) + end + + if params[:state] == "inaccessible" + unpublish_recording(params[:record_id]) + else + publish_recording(params[:record_id]) + end + res = update_recording(params[:record_id], meta) # Redirects to the page that made the initial request diff --git a/app/controllers/rooms_controller.rb b/app/controllers/rooms_controller.rb index 8c27ea17..debf2511 100644 --- a/app/controllers/rooms_controller.rb +++ b/app/controllers/rooms_controller.rb @@ -44,7 +44,9 @@ class RoomsController < ApplicationController return redirect_to current_user.main_room, flash: { alert: I18n.t("room.room_limit") } if room_limit_exceeded # Create room - @room = Room.new(name: room_params[:name], access_code: room_params[:access_code]) + @room = Room.new(name: room_params[:name], + access_code: room_params[:access_code], + moderator_access_code: room_params[:moderator_access_code]) @room.owner = current_user @room.room_settings = create_room_settings_string(room_params) @@ -109,8 +111,9 @@ class RoomsController < ApplicationController @shared_room = room_shared_with_user unless @room.owned_by?(current_user) || @shared_room - # Don't allow users to join unless they have a valid access code or the room doesn't have an access code - if @room.access_code && !@room.access_code.empty? && @room.access_code != session[:access_code] + # Don't allow users to join unless they have a valid access code or the room doesn't have an access codes + valid_access_code = !@room.access_code.present? || @room.access_code == session[:access_code] + if !valid_access_code && !valid_moderator_access_code(session[:moderator_access_code]) return redirect_to room_path(room_uid: params[:room_uid]), flash: { alert: I18n.t("room.access_code_required") } end @@ -177,6 +180,7 @@ class RoomsController < ApplicationController opts[:mute_on_start] = room_setting_with_config("muteOnStart") opts[:require_moderator_approval] = room_setting_with_config("requireModeratorApproval") opts[:record] = record_meeting + opts[:avatarURL] = current_user.image if current_user.image.present? && valid_avatar?(current_user.image) begin redirect_to join_path(@room, current_user.name, opts, current_user.uid) @@ -200,11 +204,17 @@ class RoomsController < ApplicationController # Update the rooms values room_settings_string = create_room_settings_string(options) - @room.update_attributes( + attributes = { name: options[:name], - room_settings: room_settings_string, - access_code: options[:access_code] - ) + } + + unless params[:setting] == "rename_header" + attributes[:room_settings] = room_settings_string + attributes[:access_code] = options[:access_code] + attributes[:moderator_access_code] = options[:moderator_access_code] + end + + @room.update(attributes) flash[:success] = I18n.t("room.update_settings_success") rescue => e @@ -299,7 +309,7 @@ class RoomsController < ApplicationController def shared_users # Respond with JSON object of users that have access to the room respond_to do |format| - format.json { render body: @room.shared_users.to_json } + format.json { render body: @room.shared_users.pluck_to_hash(:uid, :name, :image).to_json } end end @@ -321,9 +331,16 @@ class RoomsController < ApplicationController # POST /:room_uid/login def login - session[:access_code] = room_params[:access_code] + # use same form for access_code and moderator_access_code + if valid_moderator_access_code(room_params[:access_code]) + session[:moderator_access_code] = room_params[:access_code] + else + session[:access_code] = room_params[:access_code] + end - flash[:alert] = I18n.t("room.access_code_required") if session[:access_code] != @room.access_code + if session[:access_code] != @room.access_code && !valid_moderator_access_code(session[:moderator_access_code]) + flash[:alert] = I18n.t("room.access_code_required") + end redirect_to room_path(@room.uid) end @@ -332,11 +349,11 @@ class RoomsController < ApplicationController def create_room_settings_string(options) room_settings = { - "muteOnStart": options[:mute_on_join] == "1", - "requireModeratorApproval": options[:require_moderator_approval] == "1", - "anyoneCanStart": options[:anyone_can_start] == "1", - "joinModerator": options[:all_join_moderator] == "1", - "recording": options[:recording] == "1", + muteOnStart: options[:mute_on_join] == "1", + requireModeratorApproval: options[:require_moderator_approval] == "1", + anyoneCanStart: options[:anyone_can_start] == "1", + joinModerator: options[:all_join_moderator] == "1", + recording: options[:recording] == "1", } room_settings.to_json @@ -345,7 +362,7 @@ class RoomsController < ApplicationController def room_params params.require(:room).permit(:name, :auto_join, :mute_on_join, :access_code, :require_moderator_approval, :anyone_can_start, :all_join_moderator, - :recording, :presentation) + :recording, :presentation, :moderator_access_code) end # Find the room from the uid. @@ -412,12 +429,18 @@ class RoomsController < ApplicationController end helper_method :room_limit_exceeded + def valid_moderator_access_code(code) + code == @room.moderator_access_code && !@room.moderator_access_code.blank? && moderator_code_allowed? + end + helper_method :valid_moderator_access_code + def record_meeting # If the require consent setting is checked, then check the room setting, else, set to true + user = current_user || @room.owner if recording_consent_required? - room_setting_with_config("recording") + room_setting_with_config("recording") && user&.role&.get_permission("can_launch_recording") else - true + user&.role&.get_permission("can_launch_recording") end end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index dcf014f2..dec17481 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -79,8 +79,11 @@ class SessionsController < ApplicationController return switch_account_to_local(user) if !is_super_admin && auth_changed_to_local?(user) # Check correct password was entered - return redirect_to(signin_path, alert: I18n.t("invalid_credentials")) unless user.try(:authenticate, - session_params[:password]) + unless user.try(:authenticate, session_params[:password]) + logger.info "Support: #{session_params[:email]} login failed." + return redirect_to(signin_path, alert: I18n.t("invalid_credentials")) + end + # Check that the user is not deleted return redirect_to root_path, flash: { alert: I18n.t("registration.banned.fail") } if user.deleted? @@ -88,7 +91,10 @@ class SessionsController < ApplicationController # Check that the user is a Greenlight account return redirect_to(root_path, alert: I18n.t("invalid_login_method")) unless user.greenlight_account? # Check that the user has verified their account - return redirect_to(account_activation_path(digest: user.activation_digest)) unless user.activated? + unless user.activated? + user.create_activation_token if user.activation_digest.nil? + return redirect_to(account_activation_path(digest: user.activation_digest)) + end end login(user) @@ -125,13 +131,14 @@ class SessionsController < ApplicationController def ldap ldap_config = {} ldap_config[:host] = ENV['LDAP_SERVER'] - ldap_config[:port] = ENV['LDAP_PORT'].to_i != 0 ? ENV['LDAP_PORT'].to_i : 389 + ldap_config[:port] = ENV['LDAP_PORT'].to_i.zero? ? 389 : ENV['LDAP_PORT'].to_i ldap_config[:bind_dn] = ENV['LDAP_BIND_DN'] ldap_config[:password] = ENV['LDAP_PASSWORD'] ldap_config[:auth_method] = ENV['LDAP_AUTH'] - ldap_config[:encryption] = if ENV['LDAP_METHOD'] == 'ssl' + ldap_config[:encryption] = case ENV['LDAP_METHOD'] + when 'ssl' 'simple_tls' - elsif ENV['LDAP_METHOD'] == 'tls' + when 'tls' 'start_tls' end ldap_config[:base] = ENV['LDAP_BASE'] @@ -139,12 +146,12 @@ class SessionsController < ApplicationController ldap_config[:uid] = ENV['LDAP_UID'] if params[:session][:username].blank? || session_params[:password].blank? - return redirect_to(ldap_signin_path, alert: I18n.t("invalid_credentials")) + return redirect_to(ldap_signin_path, alert: I18n.t("invalid_credentials_external")) end result = send_ldap_request(params[:session], ldap_config) - return redirect_to(ldap_signin_path, alert: I18n.t("invalid_credentials")) unless result + return redirect_to(ldap_signin_path, alert: I18n.t("invalid_credentials_external")) unless result @auth = parse_auth(result.first, ENV['LDAP_ROLE_FIELD'], ENV['LDAP_ATTRIBUTE_MAPPING']) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 98db31e0..c2d7d2d2 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -79,6 +79,7 @@ class UsersController < ApplicationController # GET /u/:user_uid/delete_account def delete_account + redirect_to signin_path unless current_user end # POST /u/:user_uid/edit @@ -209,16 +210,15 @@ class UsersController < ApplicationController roles_can_appear << role.name if role.get_permission("can_appear_in_share_list") && role.priority >= 0 end - initial_list = User.where.not(uid: current_user.uid) + initial_list = User.where.not(uid: params[:owner_uid]) .with_role(roles_can_appear) .shared_list_search(params[:search]) - .pluck_to_hash(:uid, :name) initial_list = initial_list.where(provider: @user_domain) if Rails.configuration.loadbalanced_configuration # Respond with JSON object of users respond_to do |format| - format.json { render body: initial_list.to_json } + format.json { render body: initial_list.pluck_to_hash(:uid, :name).to_json } end end diff --git a/app/helpers/admins_helper.rb b/app/helpers/admins_helper.rb index b3058ce0..f21f877b 100644 --- a/app/helpers/admins_helper.rb +++ b/app/helpers/admins_helper.rb @@ -31,13 +31,6 @@ module AdminsHelper @running_room_bbb_ids.include?(id) end - # Returns a more friendly/readable date time object - def friendly_time(date) - return "" if date.nil? # Handle invalid dates - - I18n.l date, format: "%B %d, %Y %H:%M UTC" - end - # Site Settings def admin_invite_registration @@ -96,6 +89,14 @@ module AdminsHelper end end + def moderator_codes_string + if @settings.get_value("Moderator Access Codes") == "true" + I18n.t("administrator.site_settings.moderator_codes.enabled") + else + I18n.t("administrator.site_settings.moderator_codes.disabled") + end + end + def log_level_string case Rails.logger.level when 0 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 61abfded..550c71a2 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -58,30 +58,24 @@ module ApplicationHelper # Returns 'active' if the current page is the users home page (used to style header) def active_home home_actions = %w[show cant_create_rooms] - return "active" if params[:controller] == "admins" && params[:action] == "index" && current_user.has_role?(:super_admin) - return "active" if params[:controller] == "rooms" && home_actions.include?(params[:action]) + return "active" if controller_name == "admins" && action_name == "index" && current_user.has_role?(:super_admin) + return "active" if controller_name == "rooms" && home_actions.include?(action_name) "" end - # Returns the action method of the current page - def active_page - route = Rails.application.routes.recognize_path(request.env['PATH_INFO']) - - route[:action] - end - def role_colour(role) role.colour || Rails.configuration.primary_color_default end def translated_role_name(role) - if role.name == "denied" + case role.name + when "denied" I18n.t("roles.banned") - elsif role.name == "pending" + when "pending" I18n.t("roles.pending") - elsif role.name == "admin" + when "admin" I18n.t("roles.admin") - elsif role.name == "user" + when "user" I18n.t("roles.user") else role.name @@ -109,6 +103,8 @@ module ApplicationHelper # Make a GET request and validate content type http = Net::HTTP.new(url.host, url.port) http.use_ssl = (url.scheme == "https") + http.read_timeout = 10 + http.open_timeout = 10 http.start do |web| response = web.head(url.request_uri) @@ -135,4 +131,25 @@ module ApplicationHelper def show_signin !@hide_signin.present? end + + # Returns a more friendly/readable date time object + def view_date(date) + return "" if date.nil? # Handle invalid dates + local_time(date, :default) + end + + # Returns true if the user is allowed to record meetings + def perm_to_record_meeting + if recording_consent_required? + @settings.get_value("Room Configuration Recording") != "disabled" && + current_user&.role&.get_permission("can_launch_recording") + else + current_user&.role&.get_permission("can_launch_recording") + end + end + + # Returns true if protected recordings is enabled on BigBlueButton/Scalelite server + def protected_recording?(rec) + !rec[:protected].nil? + end end diff --git a/app/helpers/recordings_helper.rb b/app/helpers/recordings_helper.rb index 2cc2dc82..30784485 100644 --- a/app/helpers/recordings_helper.rb +++ b/app/helpers/recordings_helper.rb @@ -17,11 +17,6 @@ # with BigBlueButton; if not, see . module RecordingsHelper - # Helper for converting BigBlueButton dates into the desired format. - def recording_date(date) - I18n.l date, format: "%B %d, %Y" - end - # Helper for converting BigBlueButton dates into a nice length string. def recording_length(playbacks) # Looping through playbacks array and returning first non-zero length value diff --git a/app/helpers/rooms_helper.rb b/app/helpers/rooms_helper.rb index c14b57eb..229577ca 100644 --- a/app/helpers/rooms_helper.rb +++ b/app/helpers/rooms_helper.rb @@ -59,4 +59,11 @@ module RoomsHelper def hidden_format_public ENV.fetch("HIDDEN_FORMATS_PUBLIC", "").split(",") end + + # Returns the total number of visibile rooms for the current user + def total_room_count(user) + total = user.rooms.length + total += user.shared_rooms.length if shared_access_allowed + total + end end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 1d691d49..30b1640e 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -44,12 +44,16 @@ module UsersHelper # Returns language selection options for user edit def language_options locales = I18n.available_locales - language_opts = [['<<<< ' + t("language_default") + ' >>>>', "default"]] + languages = [["<<<< #{t('language_default')} >>>>", "default"]] + language_opts = [] + locales.each do |locale| language_mapping = I18n::Language::Mapping.language_mapping_list[locale.to_s.gsub("_", "-")] language_opts.push([language_mapping["nativeName"], locale.to_s]) end - language_opts.sort + language_opts.sort_by!(&:last) + + languages + language_opts end # Returns a list of roles that the user can have diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index f7ac797a..c8470e14 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -43,7 +43,7 @@ class UserMailer < ApplicationMailer def user_promoted(user, role, url, settings) @settings = settings @url = url - @admin_url = url + "admins" + @admin_url = "#{url}admins" @image = logo_image @color = user_color @role = translated_role_name(role) @@ -64,13 +64,14 @@ class UserMailer < ApplicationMailer mail to: user.email, subject: t('mailer.user.demoted.subtitle', role: translated_role_name(role)) end - def invite_email(name, email, url, settings) + def invite_email(name, email, invite_date, url, settings) @settings = settings @name = name @email = email @url = url @image = logo_image @color = user_color + @date = "#{(invite_date + 2.days).strftime('%b %d, %Y %-I:%M%P')} UTC" mail to: email, subject: t('mailer.user.invite.subject') end diff --git a/app/models/role.rb b/app/models/role.rb index b9af4b89..c0d8bac3 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -34,17 +34,17 @@ class Role < ApplicationRecord def self.create_default_roles(provider) Role.create(name: "user", provider: provider, priority: 1, colour: "#868e96") - .update_all_role_permissions(can_create_rooms: true) + .update_all_role_permissions(can_create_rooms: true, can_launch_recording: true) Role.create(name: "admin", provider: provider, priority: 0, colour: "#f1c40f") .update_all_role_permissions(can_create_rooms: true, send_promoted_email: true, send_demoted_email: true, can_edit_site_settings: true, can_manage_rooms_recordings: true, - can_edit_roles: true, can_manage_users: true) + can_launch_recording: true, can_edit_roles: true, can_manage_users: true) Role.create(name: "pending", provider: provider, priority: -1, colour: "#17a2b8").update_all_role_permissions Role.create(name: "denied", provider: provider, priority: -2, colour: "#343a40").update_all_role_permissions Role.create(name: "super_admin", provider: provider, priority: -3, colour: "#cd201f") - .update_all_role_permissions(can_create_rooms: true, - send_promoted_email: true, send_demoted_email: true, can_edit_site_settings: true, - can_edit_roles: true, can_manage_users: true, can_manage_rooms_recordings: true) + .update_all_role_permissions(can_create_rooms: true, send_promoted_email: true, + send_demoted_email: true, can_edit_site_settings: true, can_manage_rooms_recordings: true, + can_launch_recording: true, can_edit_roles: true, can_manage_users: true) end def self.create_new_role(role_name, provider) @@ -72,6 +72,7 @@ class Role < ApplicationRecord update_permission("can_manage_users", permissions[:can_manage_users].to_s) update_permission("can_manage_rooms_recordings", permissions[:can_manage_rooms_recordings].to_s) update_permission("can_appear_in_share_list", permissions[:can_appear_in_share_list].to_s) + update_permission("can_launch_recording", permissions[:can_launch_recording].to_s) end # Updates the value of the permission and enables it diff --git a/app/models/room.rb b/app/models/room.rb index 1d9abf5b..ec8f9d2e 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -51,7 +51,7 @@ class Room < ApplicationRecord # Rely on manual ordering if trying to sort by status return order_by_status(table, running_ids) if column == "status" - return table.order("COALESCE(rooms.last_session,rooms.created_at) DESC") if column == "created_at" + return table.order(Arel.sql("COALESCE(rooms.last_session,rooms.created_at) DESC")) if column == "created_at" return table.order(Arel.sql("rooms.#{column} #{direction}")) if table.column_names.include?(column) diff --git a/app/models/setting.rb b/app/models/setting.rb index 1ee18192..69ec3995 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -66,6 +66,8 @@ class Setting < ApplicationRecord Rails.configuration.shared_access_default when "Preupload Presentation" Rails.configuration.preupload_presentation_default + when "Room Configuration Moderator Access Codes" + Rails.configuration.moderator_codes_default when "Room Configuration Mute On Join" room_config_setting("mute-on-join") when "Room Configuration Require Moderator" diff --git a/app/models/user.rb b/app/models/user.rb index 66f6fc31..5c6e32c5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -39,9 +39,10 @@ class User < ApplicationRecord format: { without: %r{https?://}i } validates :provider, presence: true validate :check_if_email_can_be_blank + validate :check_domain, if: :greenlight_account?, on: :create validates :email, length: { maximum: 256 }, allow_blank: true, uniqueness: { case_sensitive: false, scope: :provider }, - format: { with: /\A[\w+\-\'.]+@[a-z\d\-.]+\.[a-z]+\z/i } + format: { with: /\A[\w+\-'.]+@[a-z\d\-.]+\.[a-z]+\z/i } validates :password, length: { minimum: 6 }, confirmation: true, if: :greenlight_account?, on: :create @@ -158,7 +159,7 @@ class User < ApplicationRecord def name_chunk charset = ("a".."z").to_a - %w(b i l o s) + ("2".."9").to_a - %w(5 8) - chunk = name.parameterize[0...3] + chunk = name.parameterize(separator: "")[0...3] if chunk.empty? chunk + (0...3).map { charset.to_a[rand(charset.size)] }.join elsif chunk.length == 1 @@ -234,6 +235,13 @@ class User < ApplicationRecord Role.create_default_roles(role_provider) if Role.where(provider: role_provider).count.zero? end + def check_domain + if Rails.configuration.require_email_domain.any? && !email.end_with?(*Rails.configuration.require_email_domain) + errors.add(:email, I18n.t("errors.messages.domain", + email_domain: Rails.configuration.require_email_domain.join("\" #{I18n.t('modal.login.or')} \""))) + end + end + def check_if_email_can_be_blank if email.blank? if Rails.configuration.loadbalanced_configuration && greenlight_account? diff --git a/app/views/admins/components/_invited_users_table.html.erb b/app/views/admins/components/_invited_users_table.html.erb index dc0b2671..bb2ecd32 100644 --- a/app/views/admins/components/_invited_users_table.html.erb +++ b/app/views/admins/components/_invited_users_table.html.erb @@ -24,7 +24,7 @@
<%= user.email %>
-
<%= friendly_time(user.updated_at) %>
+
<%= view_date(user.updated_at) %>
diff --git a/app/views/admins/components/_manage_users_table.html.erb b/app/views/admins/components/_manage_users_table.html.erb index f4d00db3..77947c78 100644 --- a/app/views/admins/components/_manage_users_table.html.erb +++ b/app/views/admins/components/_manage_users_table.html.erb @@ -48,7 +48,7 @@
<%= user.name %>
-
<%= [t("administrator.users.table.created"), ": ", user.created_at].join %>
+
<%= [t("administrator.users.table.created"), ": ", view_date(user.created_at)].join.html_safe %>
<%= user.email && user.email != "" ? user.email : user.username%> <%= user.provider %> @@ -90,6 +90,11 @@ + <% unless user.rooms.length.zero? %> + <%= link_to admin_recordings_path(search: user.email), class: "dropdown-item" do %> + <%= t("administrator.rooms.table.recordings") %> + <% end %> + <% end %> <%= button_to admin_ban_path(user_uid: user.uid), class: "dropdown-item", "data-disable": "" do %> <%= t("administrator.users.settings.ban") %> <% end %> diff --git a/app/views/admins/components/_menu_buttons.html.erb b/app/views/admins/components/_menu_buttons.html.erb index 858a1bf7..d4c0e4dd 100644 --- a/app/views/admins/components/_menu_buttons.html.erb +++ b/app/views/admins/components/_menu_buttons.html.erb @@ -17,29 +17,29 @@ <% highest_role = current_user.role %> <% highest_role.name %> <% if highest_role.get_permission("can_manage_users") || highest_role.name == "super_admin" %> - <%= link_to admins_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "index"}" do %> - <%= t("administrator.users.title") %> + <%= link_to admins_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if action_name == "index"}" do %> + <%= t("administrator.users.title") %> <% end %> <% end %> <% if highest_role.get_permission("can_manage_rooms_recordings") || highest_role.name == "super_admin" %> - <%= link_to admin_rooms_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "server_rooms"}" do %> - <%= t("administrator.rooms.title") %> + <%= link_to admin_rooms_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if action_name == "server_rooms"}" do %> + <%= t("administrator.rooms.title") %> <% end %> - <%= link_to admin_recordings_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "server_recordings"}" do %> - <%= t("administrator.recordings.title") %> + <%= link_to admin_recordings_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if action_name == "server_recordings"}" do %> + <%= t("administrator.recordings.title") %> <% end %> <% end %> <% if highest_role.get_permission("can_edit_site_settings") || highest_role.name == "super_admin" %> - <%= link_to admin_site_settings_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "site_settings"}" do %> - <%= t("administrator.site_settings.title") %> + <%= link_to admin_site_settings_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if action_name == "site_settings"}" do %> + <%= t("administrator.site_settings.title") %> <% end %> - <%= link_to admin_room_configuration_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "room_configuration"}" do %> - <%= t("administrator.room_configuration.title") %> + <%= link_to admin_room_configuration_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if action_name == "room_configuration"}" do %> + <%= t("administrator.room_configuration.title") %> <% end %> <% end %> <% if highest_role.get_permission("can_edit_roles") || highest_role.name == "super_admin" %> - <%= link_to admin_roles_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "roles"}" do %> - <%= t("administrator.roles.title") %> + <%= link_to admin_roles_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if action_name == "roles"}" do %> + <%= t("administrator.roles.title") %> <% end %> <% end %>
\ No newline at end of file diff --git a/app/views/admins/components/_recordings.html.erb b/app/views/admins/components/_recordings.html.erb index 8d890fef..9c0de542 100644 --- a/app/views/admins/components/_recordings.html.erb +++ b/app/views/admins/components/_recordings.html.erb @@ -19,45 +19,20 @@ - - - - - @@ -93,7 +68,7 @@ <% end %>
"> + <%= t("recording.table.name") %> - <% if @order_column == "name" && @order_direction == "desc" %> - ↓ - <% elsif @order_column == "name" && @order_direction == "asc" %> - ↑ - <% end %> "> + <%= t("recording.table.length") %> - <% if @order_column == "length" && @order_direction == "desc" %> - ↓ - <% elsif @order_column == "length" && @order_direction == "asc" %> - ↑ - <% end %> "> + <%= t("recording.table.users") %> - <% if @order_column == "users" && @order_direction == "desc" %> - ↓ - <% elsif @order_column == "users" && @order_direction == "asc" %> - ↑ - <% end %> "> + <%= t("recording.table.visibility") %> - <% if @order_column == "visibility" && @order_direction == "desc" %> - ↓ - <% elsif @order_column == "visibility" && @order_direction == "asc" %> - ↑ - <% end %> "> + <%= t("recording.table.formats") %> - <% if @order_column == "formats" && @order_direction == "desc" %> - ↓ - <% elsif @order_column == "formats" && @order_direction == "asc" %> - ↑ - <% end %>
- <% if !@recordings.empty?%> + <% if !@recordings.empty? && !@latest%>
<%== pagy_bootstrap_nav(@pagy) %>
diff --git a/app/views/admins/components/_roles.html.erb b/app/views/admins/components/_roles.html.erb index a622bff6..dcfb7b1b 100644 --- a/app/views/admins/components/_roles.html.erb +++ b/app/views/admins/components/_roles.html.erb @@ -20,8 +20,8 @@
<% @roles.each do |role| %> - <%= link_to admin_roles_path(selected_role: role.id), - class: "#{"sort-disabled" if role.name == "user" || role.name == "admin" || role.priority <= current_role.priority } dropdown-item list-group-item list-group-item-action #{"active" if @selected_role.id == role.id}", + <%= link_to admin_roles_path(selected_role: role.id), + class: "#{"sort-disabled" if role.name == "user" || role.name == "admin" || role.priority <= current_role.priority } dropdown-item list-group-item list-group-item-action #{"active" if @selected_role.id == role.id}", id: dom_id(role) do %> <%= translated_role_name(role) %> <% end %> @@ -36,7 +36,7 @@ <%= form_with model: @selected_role, url: admin_update_role_path(@selected_role.id), method: :post do |f| %> <%= f.label :name, t('administrator.roles.name'), class: "form-label" %> <%= f.text_field :name, class: 'form-control mb-3', value: translated_role_name(@selected_role), readonly: edit_disabled || @selected_role.name == "user" || @selected_role.name == "admin", required: true %> - + <%= f.hidden_field :colour, id: "role-colour", value: role_colour(@selected_role) %>
@@ -58,6 +58,11 @@ <%= f.check_box :can_manage_users, checked: @selected_role.get_permission("can_manage_users"), class: "custom-switch-input", disabled: edit_disabled || !current_role.get_permission("can_manage_users") %> +
<% end %> +
+
+
+ + + +
+
+
diff --git a/app/views/admins/components/_rooms.html.erb b/app/views/admins/components/_rooms.html.erb index 39259229..c0be9a12 100644 --- a/app/views/admins/components/_rooms.html.erb +++ b/app/views/admins/components/_rooms.html.erb @@ -15,7 +15,7 @@
-
+
diff --git a/app/views/admins/components/_server_recording_row.html.erb b/app/views/admins/components/_server_recording_row.html.erb index 47632ce1..6041191b 100644 --- a/app/views/admins/components/_server_recording_row.html.erb +++ b/app/views/admins/components/_server_recording_row.html.erb @@ -26,7 +26,7 @@
- <%= t("recording.recorded_on", date: recording_date(recording[:startTime])) %> + <%= t("recording.recorded_on", date: view_date(recording[:startTime])).html_safe %>
<%= recording_owner_email(recording[:meetingID]) %> @@ -42,6 +42,8 @@
data-room-access-code="<%= room.access_code %>"> + data-room-access-code="<%= room.access_code %>" data-room-moderator-access-code="<%= room.moderator_access_code %>"> @@ -65,13 +65,16 @@ <%= t("room.settings") %> + <%= link_to admin_recordings_path(search: room.uid), class: "dropdown-item" do %> + <%= t("administrator.rooms.table.recordings") %> + <% end %> <% if preupload_allowed? %> <%= t("room.add_presentation") %> <% end %> <% if shared_access_allowed %> - <% end %> diff --git a/app/views/admins/components/_setting_view.html.erb b/app/views/admins/components/_setting_view.html.erb index 1b2eb6ec..df7dffe1 100644 --- a/app/views/admins/components/_setting_view.html.erb +++ b/app/views/admins/components/_setting_view.html.erb @@ -17,7 +17,7 @@
- <%= render "shared/components/subtitle", subtitle: setting_title, search: search %> + <%= render "shared/components/subtitle", subtitle: setting_title, search: search, search_info: defined?(search_info) ? search_info : "" %>
diff --git a/app/views/admins/components/site_settings/_settings.html.erb b/app/views/admins/components/site_settings/_settings.html.erb index a6f666a5..464d3088 100644 --- a/app/views/admins/components/site_settings/_settings.html.erb +++ b/app/views/admins/components/site_settings/_settings.html.erb @@ -188,14 +188,5 @@
-
-
-
- - - <%= button_to t("administrator.site_settings.clear_auth.button"), admin_clear_auth_path, class: "btn btn-primary" %> -
-
-
<% end %> \ No newline at end of file diff --git a/app/views/admins/server_recordings.html.erb b/app/views/admins/server_recordings.html.erb index b2732e08..a3292771 100644 --- a/app/views/admins/server_recordings.html.erb +++ b/app/views/admins/server_recordings.html.erb @@ -21,7 +21,7 @@ <%= render "admins/components/menu_buttons" %>
- <%= render "admins/components/setting_view", setting_id: "recordings", setting_title: t("administrator.recordings.title"), search: true %> + <%= render "admins/components/setting_view", setting_id: "recordings", setting_title: t("administrator.recordings.latest"), search: true, search_info: t("administrator.recordings.search_info") %>
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 520ec36c..44aed9c5 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -31,6 +31,7 @@ <%= yield(:page_title).present? ? yield(:page_title) : t("bigbluebutton") %>" /> + /> " /> @@ -59,7 +60,7 @@ - "> + "> <%= render "shared/header" %>
diff --git a/app/views/password_resets/new.html.erb b/app/views/password_resets/new.html.erb index 69a703a8..285d9d34 100644 --- a/app/views/password_resets/new.html.erb +++ b/app/views/password_resets/new.html.erb @@ -25,6 +25,12 @@ <%= f.label :email, t("forgot_password.email"), class: "form-label" %> <%= f.email_field :email, class: "form-control" %>
+ + <% if recaptcha_enabled? %> +
+ <%= recaptcha_tags %> +
+ <% end %> <%= f.submit t("forgot_password.submit"), class: "btn btn-primary" %> <% end %> diff --git a/app/views/rooms/components/_enter_access_code_form.html.erb b/app/views/rooms/components/_enter_access_code_form.html.erb new file mode 100644 index 00000000..6588fc2a --- /dev/null +++ b/app/views/rooms/components/_enter_access_code_form.html.erb @@ -0,0 +1,29 @@ +<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + +<%= form_for :room, url: login_room_path(@room.uid) do |f| %> +
+ <%= f.text_field :access_code, + required: true, + class: "form-control join-form", + placeholder: access_code_type == 'moderator' ? t("room.enter_the_moderator_access_code") : t("room.enter_the_access_code"), + value: "" , + autofocus: true, + maxlength: 26 %> + + <%= f.button t("room.login"), type: :submit, class: "btn btn-primary btn-sm px-7 form-control join-form" %> + +
+<% end %> diff --git a/app/views/rooms/components/_room_block.html.erb b/app/views/rooms/components/_room_block.html.erb index 7e140585..d2a9baf2 100644 --- a/app/views/rooms/components/_room_block.html.erb +++ b/app/views/rooms/components/_room_block.html.erb @@ -13,7 +13,7 @@ # with BigBlueButton; if not, see . %> -
+
- <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %> - <% sorted_formats.each do |p| %> - <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %> + <% if recording[:published] %> + <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %> + <% sorted_formats.each do |p| %> + <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %> + <% end %> <% end %> diff --git a/app/views/admins/components/_server_room_row.html.erb b/app/views/admins/components/_server_room_row.html.erb index 34d9a06f..83e575b2 100644 --- a/app/views/admins/components/_server_room_row.html.erb +++ b/app/views/admins/components/_server_room_row.html.erb @@ -13,7 +13,7 @@ # with BigBlueButton; if not, see . %> -
<% if room.id == room.owner.room_id %> @@ -26,11 +26,11 @@
<% running = room_is_running(room.bbb_id) %> <% if running %> - <%= t("administrator.rooms.table.started", session: friendly_time(room.last_session)) %> + <%= t("administrator.rooms.table.started", session: view_date(room.last_session)).html_safe %> <% elsif room.last_session.present? %> - <%= t("administrator.rooms.table.ended", session: friendly_time(room.last_session)) %> + <%= t("administrator.rooms.table.ended", session: view_date(room.last_session)).html_safe %> <% else %> - <%= [t("administrator.users.table.created"), ": ", friendly_time(room.created_at)].join %> + <%= [t("administrator.users.table.created"), ": ", view_date(room.created_at)].join.html_safe %> <% end %>
@@ -28,14 +28,14 @@ <% if recordings.empty? %> @@ -86,7 +86,7 @@ <% if user_recordings %> <%= t("recording.no_user_recordings") %> <% else %> - <%= t("recording.no_recordings", inject: only_public ? t("recording.visibility.public").downcase + " " : "") %> + <%= only_public ? t("recording.no_public_recordings") : t("recording.no_recordings", inject: "") %> <% end %> diff --git a/app/views/shared/components/_cookie_warning.html.erb b/app/views/shared/components/_cookie_warning.html.erb index c3d4d516..bdd269df 100644 --- a/app/views/shared/components/_cookie_warning.html.erb +++ b/app/views/shared/components/_cookie_warning.html.erb @@ -18,6 +18,7 @@
<%= t("cookies.cookie_info") %> + <%= t("cookies.policy", privacy_link: privpolicy_url).html_safe if privpolicy_url.present? %> diff --git a/app/views/shared/components/_public_recording_row.html.erb b/app/views/shared/components/_public_recording_row.html.erb index 1966cb92..1daa2f28 100644 --- a/app/views/shared/components/_public_recording_row.html.erb +++ b/app/views/shared/components/_public_recording_row.html.erb @@ -26,7 +26,7 @@
- <%= t("recording.recorded_on", date: recording_date(recording[:startTime])) %> + <%= t("recording.recorded_on", date: view_date(recording[:startTime])).html_safe %>
<% if recording_thumbnails? %> diff --git a/app/views/shared/components/_recording_row.html.erb b/app/views/shared/components/_recording_row.html.erb index 986b87a4..091fbc15 100644 --- a/app/views/shared/components/_recording_row.html.erb +++ b/app/views/shared/components/_recording_row.html.erb @@ -27,15 +27,17 @@
- <%= t("recording.recorded_on", date: recording_date(recording[:startTime])) %> + <%= t("recording.recorded_on", date: view_date(recording[:startTime])).html_safe %>
<% if recording_thumbnails? %> @@ -50,6 +52,10 @@
-

<%= room.name %>

+

<%= room.name %>

<% if room.sessions > 0 %> - <%= t("room.last_session", session: recording_date(room.last_session)) %> + <%= t("room.last_session", session: view_date(room.last_session)).html_safe %> <% else %> <%= t("room.no_sessions") %> <% end %> @@ -56,7 +56,7 @@ <% end %> <% if shared_access_allowed %> - <% end %> diff --git a/app/views/rooms/join.html.erb b/app/views/rooms/join.html.erb index cac7a022..49e1b016 100644 --- a/app/views/rooms/join.html.erb +++ b/app/views/rooms/join.html.erb @@ -15,23 +15,16 @@ <% content_for(:page_desc) { t("room.invitation_description", name: @room.name) } %> -<% valid_access_code = @room.access_code.nil? || @room.access_code.empty? || @room.access_code == session[:access_code] %> -<%= render 'rooms/components/room_event', render_recordings: valid_access_code do %> +<% access_code_set = @room.access_code.present? %> +<% valid_access_code = access_code_set && @room.access_code == session[:access_code] %> +<% moderator_access_code_set = @room.moderator_access_code.present? && moderator_code_allowed? %> +<% valid_moderator_access_code = valid_moderator_access_code(session[:moderator_access_code]) %> +<% authorized = valid_access_code || valid_moderator_access_code || !access_code_set %> + +<%= render 'rooms/components/room_event', render_recordings: authorized do %> <% if room_authentication_required %>

<%= t("administrator.site_settings.authentication.user-info") %>

- <% elsif !valid_access_code %> - <%= form_for :room, url: login_room_path(@room.uid) do |f| %> -
- <%= f.text_field :access_code, - required: true, - class: "form-control join-form", - placeholder: t("room.enter_the_access_code"), - value: "" , - autofocus: true %> - <%= f.submit t("room.login"), class: "btn btn-primary btn-sm col-sm-3 form-control join-form" %> -
- <% end %> - <% else %> + <% elsif authorized %> <%= form_for room_path(@room), method: :post do |f| %>
<%= f.hidden_field(:search, :value => params[:search])%> @@ -59,5 +52,12 @@ <% end %> <% end %> + <% if moderator_access_code_set && !valid_moderator_access_code %> + + + <%= render "rooms/components/enter_access_code_form", access_code_type: 'moderator' %> + <% end %> + <% else %> + <%= render "rooms/components/enter_access_code_form", access_code_type: 'standard_access' %> <% end %> <% end %> diff --git a/app/views/rooms/show.html.erb b/app/views/rooms/show.html.erb index 759fafdc..ab190452 100644 --- a/app/views/rooms/show.html.erb +++ b/app/views/rooms/show.html.erb @@ -24,7 +24,7 @@
diff --git a/app/views/sessions/new.html.erb b/app/views/sessions/new.html.erb index 3cea851f..189f796b 100644 --- a/app/views/sessions/new.html.erb +++ b/app/views/sessions/new.html.erb @@ -41,22 +41,22 @@ <%= form_for @user, url: create_user_path, method: :post do |f| %>
<%= f.label :name, t("settings.account.fullname"), class: "form-label" %> - <%= f.text_field :name, class: "form-control #{form_is_invalid?(@user, :name)}", placeholder: t("settings.account.fullname") %> + <%= f.text_field :name, class: "form-control #{form_is_invalid?(@user, :name)}", placeholder: t("settings.account.fullname"), autofocus: "", required: "" %>
<%= @user.errors.full_messages_for(:name).first %>
<%= f.label :email, t("email"), class: "form-label" %> - <%= f.email_field :email, class: "form-control #{form_is_invalid?(@user, :email)}", placeholder: t("email") %> + <%= f.email_field :email, class: "form-control #{form_is_invalid?(@user, :email)}", placeholder: t("email"), required: "" %>
<%= @user.errors.full_messages_for(:email).first %>
<%= f.label :password, t("password"), class: "form-label" %> - <%= f.password_field :password, class: "form-control #{form_is_invalid?(@user, :password)}", placeholder: t("password") %> + <%= f.password_field :password, class: "form-control #{form_is_invalid?(@user, :password)}", placeholder: t("password"), required: "" %>
<%= @user.errors.full_messages_for(:password).first %>
<%= f.label :password_confirmation, t("signup.password_confirm"), class: "form-label" %> - <%= f.password_field :password_confirmation, class: "form-control #{form_is_invalid?(@user, :password_confirmation)}", placeholder: t("signup.password_confirm") %> + <%= f.password_field :password_confirmation, class: "form-control #{form_is_invalid?(@user, :password_confirmation)}", placeholder: t("signup.password_confirm"), required: "" %>
<%= @user.errors.full_messages_for(:password_confirmation).first %>
<% if Rails.configuration.terms %> diff --git a/app/views/sessions/signin.html.erb b/app/views/sessions/signin.html.erb index cb089911..364bdbae 100644 --- a/app/views/sessions/signin.html.erb +++ b/app/views/sessions/signin.html.erb @@ -44,7 +44,7 @@ - <%= f.email_field :email, class: "form-control", placeholder: t("email"), value: "" %> + <%= f.email_field :email, class: "form-control", placeholder: t("email"), value: "", autofocus: "", required: "" %>
@@ -52,7 +52,7 @@ - <%= f.password_field :password, class: "form-control", placeholder: t("password"), value: "" %> + <%= f.password_field :password, class: "form-control", placeholder: t("password"), value: "", required: "" %>
<% if Rails.configuration.enable_email_verification %> diff --git a/app/views/shared/_flash_messages.html.erb b/app/views/shared/_flash_messages.html.erb index 5eb3d706..87de48b7 100644 --- a/app/views/shared/_flash_messages.html.erb +++ b/app/views/shared/_flash_messages.html.erb @@ -27,7 +27,7 @@ <% elsif key.eql? "maintenance" %>
<%= value %> - +
<% elsif key.eql? "info" %>
diff --git a/app/views/shared/_header.html.erb b/app/views/shared/_header.html.erb index 21ffaaf8..c0c6a01f 100755 --- a/app/views/shared/_header.html.erb +++ b/app/views/shared/_header.html.erb @@ -32,7 +32,7 @@ <% end %> <% if current_user.role.get_permission("can_create_rooms") && !current_user.has_role?(:super_admin) && !hide_recording_tables %> - <% all_rec_page = params[:controller] == "users" && params[:action] == "recordings" ? "active" : "" %> + <% all_rec_page = controller_name == "users" && action_name == "recordings" ? "active" : "" %> <%= link_to get_user_recordings_path(current_user), class: "px-3 mx-1 mt-1 header-nav #{all_rec_page}" do %> <%= t("header.all_recordings") %> <% end %> diff --git a/app/views/shared/_sessions.html.erb b/app/views/shared/_sessions.html.erb index cba1fb27..0ed561d6 100644 --- a/app/views/shared/_sessions.html.erb +++ b/app/views/shared/_sessions.html.erb @@ -77,7 +77,7 @@
- <% p = recording[:playbacks].find do |p| p.key?(:preview) end %> - <% if p %> - <% safe_recording_images(p[:preview][:images][:image]).each do |img| %> - <%= image_tag(img[:content].strip, class: "thumbnail px-2") %> + <% if recording[:published] %> + <% p = recording[:playbacks].find do |p| p.key?(:preview) end %> + <% if p %> + <% safe_recording_images(p[:preview][:images][:image]).each do |img| %> + <%= image_tag(img[:content].strip, class: "thumbnail px-2") %> + <% end %> <% end %> <% end %> - <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %> - <% sorted_formats.each do |p| %> - <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %> + <% if recording[:published] %> + <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %> + <% sorted_formats.each do |p| %> + <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %> + <% end %> <% end %> diff --git a/app/views/shared/components/_subtitle.html.erb b/app/views/shared/components/_subtitle.html.erb index 43acd90a..56fd8fc7 100644 --- a/app/views/shared/components/_subtitle.html.erb +++ b/app/views/shared/components/_subtitle.html.erb @@ -35,6 +35,14 @@ + <% if defined?(search_info) && search_info.present? %> +
+ + + <%= search_info %> + +
+ <% end %> <% else %>
diff --git a/app/views/shared/modals/_create_room_modal.html.erb b/app/views/shared/modals/_create_room_modal.html.erb index cab6f6b4..ec105e4c 100644 --- a/app/views/shared/modals/_create_room_modal.html.erb +++ b/app/views/shared/modals/_create_room_modal.html.erb @@ -33,21 +33,34 @@
- + - <%= f.label :access_code, t("modal.create_room.access_code_placeholder"), id: "create-room-access-code", class: "form-control" %> + <%= f.label :access_code, t("modal.create_room.access_code_placeholder"), id: "create-room-access-code", class: "form-control", role: "log" %> <%= f.hidden_field :access_code %> - +
+ <% if moderator_code_allowed? %> +
+ + + + <%= f.label :moderator_access_code, t("modal.create_room.moderator_access_code_placeholder"), id: "create-room-moderator-access-code", class: "form-control", role: "log" %> + <%= f.hidden_field :moderator_access_code %> + + + +
+ <% end %> + <% mute = room_configuration("Room Configuration Mute On Join") %> <% if mute != "disabled" %> <% end %> @@ -56,16 +69,16 @@ <% if require_approval != "disabled" %> <% end %> - + <% any_start = room_configuration("Room Configuration Allow Any Start") %> <% if any_start != "disabled" %> <% end %> @@ -73,15 +86,15 @@ <% if moderator != "disabled" %> <% end %> <% recording = room_configuration("Room Configuration Recording") %> - <% if recording_consent_required? && recording != "disabled" %> + <% if recording_consent_required? && recording != "disabled" && perm_to_record_meeting %> <% end %> diff --git a/app/views/shared/modals/_invite_user_modal.html.erb b/app/views/shared/modals/_invite_user_modal.html.erb index b7680877..b8e5a768 100644 --- a/app/views/shared/modals/_invite_user_modal.html.erb +++ b/app/views/shared/modals/_invite_user_modal.html.erb @@ -1,44 +1,44 @@ -<% -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see . -%> - - +<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + + diff --git a/app/views/shared/modals/_share_room_modal.html.erb b/app/views/shared/modals/_share_room_modal.html.erb index 5426b557..038917e1 100644 --- a/app/views/shared/modals/_share_room_modal.html.erb +++ b/app/views/shared/modals/_share_room_modal.html.erb @@ -1,42 +1,43 @@ -<% -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see . -%> - - +<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + + diff --git a/app/views/user_mailer/invite_email.html.erb b/app/views/user_mailer/invite_email.html.erb index 6f7c6505..feaa7d9c 100644 --- a/app/views/user_mailer/invite_email.html.erb +++ b/app/views/user_mailer/invite_email.html.erb @@ -1,43 +1,47 @@ -<% -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). -# -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see . -%> - -
-
- <%= image_tag(@image, height: '70') %> - -

- <%= t('mailer.user.invite.subject') %> -

- -

- <%= t('mailer.user.invite.info', name: @name) %> -

- -

- <%= t('mailer.user.invite.username', email: @email) %> -

- -

- <%= t('mailer.user.invite.signup_info') %> -

- - - <%= t('mailer.user.invite.signup_link') %> - -
-
+<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + +
+
+ <%= image_tag(@image, height: '70') %> + +

+ <%= t('mailer.user.invite.subject') %> +

+ +

+ <%= t('mailer.user.invite.info', name: @name) %> +

+ +

+ <%= t('mailer.user.invite.username', email: @email) %> +

+ +

+ <%= t('mailer.user.invite.signup_info') %> +

+ +

+ <%= t('mailer.user.invite.valid', date: @date) %> +

+ + + <%= t('mailer.user.invite.signup_link') %> + +
+
diff --git a/app/views/user_mailer/invite_email.text.erb b/app/views/user_mailer/invite_email.text.erb index 0cef70c2..f5f259d1 100644 --- a/app/views/user_mailer/invite_email.text.erb +++ b/app/views/user_mailer/invite_email.text.erb @@ -1,27 +1,27 @@ -<% -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). -# -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see . -%> - -<%= t('mailer.user.invite.subject') %> - -<%= t('mailer.user.invite.info', name: @name) %> - -<%= t('mailer.user.invite.username', email: @email) %> - -<%= t('mailer.user.invite.signup_info') %> - -<%= @url %> +<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + +<%= t('mailer.user.invite.subject') %> + +<%= t('mailer.user.invite.info', name: @name) %> + +<%= t('mailer.user.invite.username', email: @email) %> + +<%= t('mailer.user.invite.signup_info') %> + +<%= @url %> diff --git a/app/views/users/components/_menu_buttons.html.erb b/app/views/users/components/_menu_buttons.html.erb index d6c3e266..561884ac 100644 --- a/app/views/users/components/_menu_buttons.html.erb +++ b/app/views/users/components/_menu_buttons.html.erb @@ -14,15 +14,15 @@ %>
- <%= link_to edit_user_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "edit"}" do %> + <%= link_to edit_user_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if action_name == "edit"}" do %> <%= t("settings.account.title") %> <% end %> <% if current_user.greenlight_account? %> - <%= link_to change_password_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "change_password"}" do %> + <%= link_to change_password_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if action_name == "change_password"}" do %> <%= t("settings.password.title") %> <% end %> <% end %> - <%= link_to delete_account_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "delete_account"}" do %> + <%= link_to delete_account_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if action_name == "delete_account"}" do %> <%= t("settings.delete.title") %> <% end %>
\ No newline at end of file diff --git a/config/application.rb b/config/application.rb index e47e7543..a4937383 100644 --- a/config/application.rb +++ b/config/application.rb @@ -33,6 +33,11 @@ module Greenlight # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. + def parse_bool(val, default = false) + val = ActiveModel::Type::Boolean.new.cast(val) + val.nil? ? default : val + end + # Use custom error routes. config.exceptions_app = routes @@ -87,16 +92,19 @@ module Greenlight config.smtp_sender = ENV['SMTP_SENDER'] || "notifications@example.com" # Determine if GreenLight should enable email verification - config.enable_email_verification = (ENV['ALLOW_MAIL_NOTIFICATIONS'] == "true") + config.enable_email_verification = parse_bool(ENV['ALLOW_MAIL_NOTIFICATIONS']) + + # Determine if GreenLight should require a certain mail-domain + config.require_email_domain = ENV["GREENLIGHT_ACCOUNT_HD"].to_s.split(",") # Determine if GreenLight should allow non-omniauth signup/login. - config.allow_user_signup = (ENV['ALLOW_GREENLIGHT_ACCOUNTS'] == "true") + config.allow_user_signup = parse_bool(ENV['ALLOW_GREENLIGHT_ACCOUNTS']) # Configure custom banner message. config.banner_message = ENV['BANNER_MESSAGE'] # Enable/disable recording thumbnails. - config.recording_thumbnails = (ENV['RECORDING_THUMBNAILS'] != "false") + config.recording_thumbnails = parse_bool(ENV['RECORDING_THUMBNAILS'], true) # Configure which settings are available to user on room creation/edit after creation config.room_features = ENV['ROOM_FEATURES'] || "" @@ -111,7 +119,7 @@ module Greenlight config.recaptcha_enabled = ENV['RECAPTCHA_SITE_KEY'].present? && ENV['RECAPTCHA_SECRET_KEY'].present? # Show/hide "Add to Google Calendar" button in the room page - config.enable_google_calendar_button = (ENV['ENABLE_GOOGLE_CALENDAR_BUTTON'] == "true") + config.enable_google_calendar_button = parse_bool(ENV['ENABLE_GOOGLE_CALENDAR_BUTTON']) # Enum containing the different possible registration methods config.registration_methods = { open: "0", invite: "1", approval: "2" } @@ -119,11 +127,11 @@ module Greenlight config.google_analytics = ENV["GOOGLE_ANALYTICS_TRACKING_ID"].present? # Will always be true unless explicitly set to false - config.enable_cache = ENV["ENABLE_CACHED_PROVIDER"] != "false" + config.enable_cache = parse_bool(ENV["ENABLE_CACHED_PROVIDER"], true) # MAINTENANCE config.maintenance_window = ENV["MAINTENANCE_WINDOW"] - config.maintenance_mode = ENV["MAINTENANCE_MODE"] == "true" + config.maintenance_mode = parse_bool(ENV["MAINTENANCE_MODE"]) config.report_issue_url = ENV["REPORT_ISSUE_URL"] config.help_url = ENV["HELP_URL"].nil? ? "https://docs.bigbluebutton.org/greenlight/gl-overview.html" : ENV["HELP_URL"] @@ -149,9 +157,10 @@ module Greenlight config.primary_color_darken_default = "#316cbe" # Default registration method if the user does not specify one - config.registration_method_default = if ENV["DEFAULT_REGISTRATION"] == "invite" + config.registration_method_default = case ENV["DEFAULT_REGISTRATION"] + when "invite" config.registration_methods[:invite] - elsif ENV["DEFAULT_REGISTRATION"] == "approval" + when "approval" config.registration_methods[:approval] else config.registration_methods[:open] @@ -169,7 +178,13 @@ module Greenlight # Don't allow users to preupload presentations by default config.preupload_presentation_default = "false" + # Don't show option to generate moderator access codes + config.moderator_codes_default = "disabled" + # Default admin password config.admin_password_default = ENV['ADMIN_PASSWORD'] || 'administrator' + + # Max avatar image size + config.max_avatar_size = ENV['MAX_AVATAR_SIZE'].to_i.zero? ? 100000 : ENV['MAX_AVATAR_SIZE'].to_i end end diff --git a/config/database.yml b/config/database.yml index 7c55d757..073153c1 100644 --- a/config/database.yml +++ b/config/database.yml @@ -21,3 +21,6 @@ production: database: <%= ENV['DB_NAME'] || 'db/production/production.sqlite3' %> username: <%= ENV['DB_USERNAME'] %> password: <%= ENV['DB_PASSWORD'] %> + pool: <%= ENV['DB_POOL_SIZE'] || '9' %> + connect_timeout: <%= ENV['DB_CONNECT_TIMEOUT'] || '5' %> + read_timeout: <%= ENV['DB_READ_TIMEOUT'] || '120' %> diff --git a/config/environments/production.rb b/config/environments/production.rb index 07a3251b..c55c70c1 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -63,6 +63,8 @@ Rails.application.configure do # Store uploaded files on the local file system (see config/storage.yml for options) config.active_storage.service = if ENV["AWS_ACCESS_KEY_ID"].present? :amazon + elsif ENV["S3_ACCESS_KEY_ID"].present? + :s3 elsif ENV["GCS_PRIVATE_KEY_ID"].present? :google else @@ -107,6 +109,9 @@ Rails.application.configure do } end + # enable SMTPS: SMTP over direct TLS connection + ActionMailer::Base.smtp_settings[:tls] = true if ENV['SMTP_TLS'].present? && ENV['SMTP_TLS'] != "false" + # If configured to 'none' don't check the smtp servers certificate ActionMailer::Base.smtp_settings[:openssl_verify_mode] = ENV['SMTP_OPENSSL_VERIFY_MODE'] if ENV['SMTP_OPENSSL_VERIFY_MODE'].present? @@ -119,13 +124,12 @@ Rails.application.configure do # config.active_job.queue_name_prefix = "greenlight-2_0_#{Rails.env}" config.action_mailer.perform_caching = false - # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. - # config.action_mailer.raise_delivery_errors = false - # Send deprecation notices to registered listeners. config.active_support.deprecation = :notify + # Specify the log level + config.log_level = ENV["RAILS_LOG_LEVEL"].present? ? ENV['RAILS_LOG_LEVEL'].to_sym : :info + # Use Lograge for logging config.lograge.enabled = true @@ -142,13 +146,11 @@ Rails.application.configure do "#{time} - #{severity}: #{msg} \n" end - config.log_level = :info - # Prepend all log lines with the following tags. - config.log_tags = [:request_id] + config.log_tags = [:request_id, :remote_ip] if ENV["RAILS_LOG_TO_STDOUT"] == "true" - logger = ActiveSupport::Logger.new(STDOUT) + logger = ActiveSupport::Logger.new($stdout) logger.formatter = config.log_formatter config.logger = ActiveSupport::TaggedLogging.new(logger) elsif ENV["RAILS_LOG_REMOTE_NAME"] && ENV["RAILS_LOG_REMOTE_PORT"] diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb index 576de5cc..7e88d380 100644 --- a/config/initializers/omniauth.rb +++ b/config/initializers/omniauth.rb @@ -67,24 +67,6 @@ Rails.application.config.middleware.use OmniAuth::Builder do redirect = ENV['OAUTH2_REDIRECT'].present? ? File.join(ENV['OAUTH2_REDIRECT'], "auth", "openid_connect", "callback") : nil - provider :openid_connect, - issuer: ENV["OPENID_CONNECT_ISSUER"], - discovery: true, - scope: [:email, :profile], - response_type: :code, - uid_field: ENV["OPENID_CONNECT_UID_FIELD"] || "preferred_username", - client_options: { - identifier: ENV['OPENID_CONNECT_CLIENT_ID'], - secret: ENV['OPENID_CONNECT_CLIENT_SECRET'], - redirect_uri: redirect - }, - setup: SETUP_PROC - end - if Rails.configuration.omniauth_openid_connect - Rails.application.config.providers << :openid_connect - - redirect = ENV['OAUTH2_REDIRECT'].present? ? File.join(ENV['OAUTH2_REDIRECT'], "auth", "openid_connect", "callback") : nil - provider :openid_connect, issuer: ENV["OPENID_CONNECT_ISSUER"], discovery: true, diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 729d09c8..94ed75b6 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -36,12 +36,25 @@ ar: enabled: مفعل info: السماح للمستخدمين المصادق عليهم فقط بالانضمام إلى غرفة title: طلب مصادقة للغرف - user-info: يجب تسجيل الدخول للانضمام إلى هذه الغرفة + user-info: يجب عليك تسجيل الدخول أعلاه للانضمام إلى هذه الغرفة. branding: change: تغيير الصورة info: تغيير صورة العلامة التجارية التي تظهر في الزاوية العلوية اليمنى placeholder: رابط الصورة... title: صورة العلامة التجارية + invalid: URL غير صالح + legal: + change: تغيير URL + info: قم بتغيير رابط الشروط الذي يظهر في أسفل الصفحة + placeholder: عنوان URL الشروط ... + title: الشروط + invalid: URL غير صالح + privpolicy: + change: تغيير URL + info: غيّر رابط سياسة الخصوصية الذي يظهر أسفل الصفحة + placeholder: URL سياسة الخصوصية... + title: سياسة الخصوصية + invalid: URL غير صالح cache: info: مسح ذاكرة التخزين المؤقت الخاصة بالمزود الذي يؤدي إلى طلب جديد للمعلومات المحدثة title: مسح ذاكرة التخزين المؤقت لمزود الخدمة @@ -56,6 +69,10 @@ ar: regular: الأساسي lighten: الفاتح darken: معتم + email_mapping: + info: تعيين دور المستخدم باستعمال بريده الإلكتروني. يجب أن يكون بالتنسيق email1 = role1 ، email2 = role2 + title: تعيين الدور بالبريد الإلكتروني + update: log_level: title: مستوى السجل information: تغيير مستوى السجل للنشر بأكمله @@ -69,6 +86,18 @@ ar: info: ضبط الظهور الافتراضي للتسجيلات الجديدة title: تسجيل الظهور الافتراضي warning: سيتم تطبيق هذه الإعدادات فقط على الغرف التي لا تعمل حاليا + require_consent: + info: يتيح هذا الإعداد إعداد الغرفة الذي يسمح لمالكي الغرفة بتحديد الغرف التي يمكن تسجيلها. يجب على المستخدمين الذين ينضمون إلى غرفة مسجلة الموافقة قبل الانضمام. + title: تتطلب موافقة مالك الغرفة والمنضم على التسجيل + maintenance_banner: + info: يعرض لافتة لإعلام المستخدم بالصيانة المجدولة + title: لافتة الصيانة + display: ضبط + clear: مسح + time: "مثال: التحديث مجدول في 13 ديسمبر @ 23:00 بالتوقيت الشرقي. قد يواجه المستخدمون مشاكل في تسجيل الدخول." + preupload: + info: يمكن للمستخدمين تحميل عرض تقديمي مسبق لاستخدامه كعرض تقديمي افتراضي لتلك الغرفة المحددة + title: السماح للمستخدمين بتحميل العروض التقديمية مسبقًا registration: info: تغيير طريقة تسجيل المستخدمين على الموقع title: طريقة التسجيل @@ -83,6 +112,11 @@ ar: info: سيؤدي التعطيل إلى إزالة الأيقونة من القائمة المنسدلة لخيارات الغرفة، وبذلك لن يتمكن المستخدمون من مشاركة الغرف title: السماح للمستخدمين بمشاركة الغرف subtitle: تخصيص Greenlight + tabs: + appearance: المظهر + administration: الادارة + registration: التسجيل + settings: إعدادات title: إعدادات الموقع flash: approved: تمت الموافقة على المستخدم بنجاح. @@ -93,21 +127,25 @@ ar: demoted: تم خفض رتبة المستخدم بنجاح invite: "تم إرسال الدعوة بنجاح إلى %{email}" invite_email_verification: يجب تمكين رسائل البريد الإلكتروني من أجل استخدام هذه الطريقة. الرجاء الاتصال بمسؤول النظام. - merge_fail: هناك مشكلة في دمج حسابات المستخدمين. يرجى التحقق من المستخدمين الذين تم اختيارهم والمحاولة مرة أخرى + merge_fail: هناك مشكلة في دمج حسابات المستخدمين. يرجى التحقق من المستخدمين الذين تم اختيارهم والمحاولة مرة أخرى merge_success: دمج حسابات المستخدمين بنجاح perm_deleted: تم حذف المستخدم نهائيًا promoted: تم ترقية المستخدم بنجاح registration_method_updated: تم تحديث طريقة التسجيل بنجاح reset_password: تم إرسال بريد الكتروني للمستخدم لإعادة ضبط كلمة المرور الخاصة به (نأمل مراجعة مجلد البريد المزعج في حال عدم وصوله إلى صندوق الوارد) restored: تمت استعادة المستخدم بنجاح + room_configuration: تم تغيير إعدادات الغرفة بنجاح settings: تم تغيير إعدادات الموقع بنجاح unauthorized: غير مصرح لك بتنفيذ إجراءات على هذا المستخدم recordings: + latest: أحدث التسجيلات title: تسجيلات الخادم no_recordings: الخادم لا يحتوي على أي تسجيلات + search_info: أدخل البريد الإلكتروني الكامل للمستخدم أو معرّف الغرفة roles: appear_in_share_list: تضمين المستخدمين الذين يتمتعون بهذا الدور في القائمة المنسدلة لمشاركة الغرف can_create_rooms: يمكن إنشاء غرف + can_launch_recording: السماح للمستخدمين الذين لديهم هذا الدور بتسجيل اجتماعاتهم delete: حذف الدور invalid_create: حدثت مشكلة عند إنشاء دور جديد. الرجاء التحقق من قيم الدور والمحاولة مرة أخرى invalid_order: حدثت مشكلة في تحديث أولوية الدور. الرجاء التحقق من القيم والمحاولة مرة أخرى @@ -122,16 +160,39 @@ ar: edit_site_settings: السماح للمستخدمين المنتمين لهذا الدور بتحرير اعدادت الموقع edit_roles: السماح للمستخدمين المنتمين لهذا الدور بتحرير بقية الأدوار manage_users: السماح للمستخدمين المنتمين لهذا الدور بإدارة المستخدمين الآخرين - invalid_assignment: حدثت مشكلة عند تعيين الأدوار للمستخدم. الرجاء التحقق من القيم والمحاولة مرة أخرى + invalid_assignment: حدثت مشكلة عند تعيين الأدوار للمستخدم. الرجاء التحقق من القيم والمحاولة مرة أخرى colour: title: لون الدور info: تعيين اللون الذي سيرتبط بالدور + room_configuration: + title: إعدادات الغرفة + mute: + info: كتم صوت المستخدم تلقائيًا عند انضمامه إلى اجتماع BigBlueButton + require_moderator: + info: ينبه مشرف اجتماع BigBlueButton عندما يحاول المستخدم الانضمام. إذا تمت الموافقة على المستخدم ، فسيتمكن من الانضمام إلى الاجتماع. + allow_any: + info: يسمح لأي مستخدم ببدء الاجتماع في أي وقت. بشكل افتراضي ، يمكن لمالك الغرفة فقط بدء الاجتماع. + all_moderator: + info: يمنح جميع المستخدمين امتيازات المشرف في BigBlueButton عند انضمامهم إلى الاجتماع. + recordings: + info: يسمح لمالكي الغرفة بتحديد ما إذا كانوا يريدون خيار تسجيل غرفة أم لا. في حالة التمكين ، لا يزال يتعين على المشرف النقر على الزر "تسجيل" بمجرد بدء الاجتماع. + moderator_codes: + info: يسمح لمالكي الغرفة بإنشاء رمز وسيط اختياري يسمح للمستخدمين الآخرين بالانضمام مباشرة كمشرفين. + title: رمز دخول المشرف + options: + disabled: معطل + enabled: ممكّن دائمًا + optional: اختياري rooms: + timeout: "نظرًا لانتهاء مهلة طلب الخادم %{server} ، فقد لا تكون معلومات الحالة والمشاركين دقيقة" title: غرف الخادم table: + ended: "انتهت: %{session}" id: المعرف not_running: لا يعمل + participants: المشاركون running: يعمل + started: "بدأت: %{session}" status: حالة view: عرض title: إعدادات المؤسسة @@ -146,18 +207,21 @@ ar: delete: حذف edit: تحرير edit_roles: تعديل أدوار المستخدم + merge: دمج perm_delete: حذف بشكل دائم unban: إلغاء حظر المستخدم undelete: تراجع عن الحذف table: authenticator: المصادق created: انشاء + time: وقت الإرسال name: الاسم not_found: لا يوجد مستخدم يطابق بحثك no_users: لم يتم العثور على أي مستخدمين role: الدور uid: معرف المستخدم username: اسم المستخدم + valid: صالح title: إدارة المستخدمين add_to_google_calendar: "إضافة إلى تقويم Google" bigbluebutton: BigBlueButton @@ -166,20 +230,21 @@ ar: cookies: cookie_info: ملفات تعريف الارتباط تساعدنا على تقديم خدماتنا. باستخدام خدماتنا ، أنت توافق على استخدامنا لملفات تعريف الارتباط. cookie_button: أنا موافق + policy: "لمزيد من المعلومات ، راجع موقعنا سياسة خاصة." copied: تم النسخ copy: نسخ date: month_names: [~, يناير, فبراير, مارس, أبريل, مايو, يونيو, يوليو, أغسطس, سبتمبر, أكتوبر, نوفمبر, ديسمبر] - default_admin: لازلت تستخدم كلمة المرور الافتراضية لهذا المستخدم، فضلا أنقر هنا لتغييرها + default_admin: "لازلت تستخدم كلمة المرور الافتراضية لهذا المستخدم، فضلا أنقر هنا لتغييرها" delete: حذف delivery_error: حدث خطأ أثناء تسليم البريد الإلكتروني. يرجى الاتصال بمسؤول! docs: الوثائق email: البريد الإلكتروني - email_sent: "تم إرسال البريد الإلكتروني الخاص بك% {email_type} ! (يرجى التحقق من مجلد البريد المزعج إذا لم تكن قد تلقيت ذلك)" + email_sent: "تم إرسال البريد الإلكتروني الخاص بك %{email_type} (يرجى التحقق من مجلد البريد المزعج إذا لم تكن قد تلقيت ذلك)" enter_your_name: أدخل أسمك! errors: bigbluebutton: - help: يرجى التأكد من اتخاذ الخطوات المناسبة + help: "يرجى التأكد من اتخاذ الخطوات المناسبة. للمزيد" message: نقطة النهاية والسرية BigBlueButton غير صالحة title: خطأ في الخادم internal: @@ -204,6 +269,7 @@ ar: accepted: يجب أن تكون مقبولة confirmation: "لا يتطابق مع %{attribute}" inclusion: غير مدرج في القائمة + domain: "يجب أن ينتهي بـ \"%{email_domain}\"" no_provider: message: لم يتم تمكين الموقع الذي تحاول الوصول إليه help: الرجاء الاتصال بمسؤول النظام لإعداد Greenlight @@ -228,6 +294,8 @@ ar: designs: تصاميم مخصصة authentication: مصادقة المستخدم footer: + legal: الشروط + privpolicy: سياسة الخصوصية powered_by: "مشغل بواسطة%{href}." forgot_password: subtitle: هل نسيت كلمة المرور @@ -246,6 +314,7 @@ ar: home_room: غرفة الإستقبال info_update_success: تحديث المعلومات بنجاح. invalid_credentials: لم تتطابق رسالة البريد الإلكتروني وكلمة المرور التي أدخلتها مع سجلاتنا. حاول مرة أخرى أو انقر فوق نسيت كلمة المرور لإعادة تعيين كلمة المرور الخاصة بك. + invalid_credentials_external: البريد الإلكتروني وكلمة المرور اللذان أدخلتهما لا يتطابقان مع سجلاتنا. حاول مرة اخرى. invalid_login_method: فشل تسجيل الدخول بسبب عدم تطابق الحساب. تحتاج إلى تسجيل الدخول مع omniauth. invite_message: "لدعوة شخص ما إلى الاجتماع ، أرسل لهم هذا الرابط:" javascript: @@ -287,9 +356,10 @@ ar: root_link: تسجيل الدخول subtitle: "%{role} الحقوق الملغاة" invite: - info: "لقد تمت دعوتك إلى الفضاء الشخصي الخاص بك بواسطة %{name}" + info: "لقد تمت دعوتك إلى فضائك الشخصي بواسطة %{name}" signup_info: للاشتراك باستخدام بريدك الإلكتروني، انقر على الزر أدناه واتبع الخطوات. signup_link: التسجيل + valid: "الدعوة صالحة حتى: %{date}" signup: info: المستخدم المدعو قام بتسجيل الدخول لاستخدام Greenlight. admins_link: زيارة صفحة المؤسسة @@ -310,15 +380,13 @@ ar: more-info: "لاستعراض مؤهلاتك الجديدة، يرجى زيارة %{url}." subtitle: "%{role} الحقوق الممنوحة" verify_email: - welcome: "مرحبا بكم في الفضاء الشخصي الخاص بك، ٪{name}!" + welcome: "مرحبا بكم في فضاءك الشخصي ، %{name}" success: "الاستفادة من %{bigbluebutton}، يمكنك إنشاء غرف خاصة بك لاستضافة الجلسات والتعاون مع الآخرين." username: "اسم المستخدم الخاص بك هو %{email}." verify: للتحقق من حسابك ، أنقر على الزر أدناه. verify_text: 'للتحقق من حسابك ، اتبع هذا الرابط بالنقر عليه: %{url}' verify_link: التحقق من الحساب thanks: شكرا لانضمامك ونتمنى لك يوماً موفقاً. - maintenance: - window_alert: "نافذة الصيانة المجدولة لـ %{date}" max_concurrent: وصلت إلى الحد الأقصى لعدد الجلسات المتزامنة المسموح بها! merged: المدمجة modal: @@ -330,7 +398,9 @@ ar: title: "إنشاء دور جديد " create_room: access_code: رمز الوصول + moderator_access_code: رمز المشرف access_code_placeholder: إنشاء رمز وصول اختياري للغرفة + moderator_access_code_placeholder: قم بإنشاء رمز اختياري للمشرفين auto_join: الانضمام التلقائي إلى الغرفة create: إنشاء غرفة free_delete: سيكون لك مطلق الحرية في حذف هذه الغرفة في أي وقت. @@ -340,9 +410,13 @@ ar: delete_account: confirm: هل تريد بالتأكيد حذف هذا الحساب؟ delete: أنا متأكد، قم بحذف هذا الحساب. - keep: في الواقع ، سأحافظ عليه. + keep: في الواقع ، سأحتفظ به. delete_warning: سيؤدي ذلك إلى إلغاء تنشيط حساب المستخدم. يمكن العثور على جميع المستخدمين غير النشطين تحت علامة تبويب المحذوفات. warning: هذا القرار نهائي.لن تكون قادرًا على استعادة البيانات المرتبطة. + delete_rec: + delete: أنا متأكد ، احذف هذا التسجيل. + header: هل أنت متأكد أنك تريد حذف هذا التسجيل؟ + warning: لن تتمكن من استعادة هذا التسجيل delete_room: confirm: "هل أنت متأكد أنك تريد حذف %{room}؟" delete: أنا متأكد قم بحذف هذه الغرفة. @@ -350,7 +424,7 @@ ar: warning: لن تكون قادراً على استعادة هذه الغرفة recording_warning: "أو أي من التسجيلات المرتبطة بـ %{recordings_num} الخاصة به." invite_user: - email_placeholder: أدخل عناوين البريد لالكتروني للمستخدمين (استخدم الفاصلة للفصل بينها) + email_placeholder: أدخل عناوين البريد الإلكتروني للمستخدمين (مفصولة بالفارزة) footer: سوف يتلقى المستخدم رسالة بريد إلكتروني مع تعليمات حول كيفية الاشتراك send: إرسال دعوة title: دعوة المستخدم @@ -358,6 +432,14 @@ ar: or: أو with: "الدخول بـ %{provider}" forgot_password: هل نسيت كلمة المرور؟ + preupload: + change: استبدال العرض التقديمي + choose: اختر ملف... + current: "العرض التقديمي الحالي:" + footer: اعتمادًا على حجم العرض التقديمي ، قد يتطلب تحميله وقتًا إضافيًا قبل استخدامه. + invalid: حجم / نوع الملف غير صالح. يرجى الاطلاع على القيود أدناه. + title: أضف العرض التقديمي + use: استخدم العرض التقديمي rename_recording: remove_shared: title: هل أنت متأكد من رغبتك في إزالة هذه الغرفة من قائمة الغرف الخاصة بك؟ @@ -372,6 +454,7 @@ ar: require_approval: يلزم موافقة المشرف قبل الانضمام start: السماح لأي مستخدم ببدء اللقاء footer_text: يمكن إجراء التعديل على غرفتك في أي وقت. + recording: السماح بتسجيل الغرفة rename_room: name_placeholder: أدخل اسم غرفة جديدة ... share_access: @@ -406,6 +489,7 @@ ar: office365: أوفيس 365 twitter: تويتر ldap: LDAP + openid_connect: الاتصال OpenID recaptcha: errors: recaptcha_unreachable: عفوا، فشلنا في التحقق من صحة ردك reCAPTCHA. الرجاء المحاولة مرة أخرى. @@ -413,10 +497,12 @@ ar: recording: all_recordings: كافة التسجيلات email: " البريد الإلكتروني للتسجيل" - error: "حدث خطأ في استرداد %{count} تسجيل/تسجيلات" - no_recordings: "لا تحتوي هذه الغرفة على أي %{inject} تسجيلات.." + error: "هناك خطأ في استرداد %{count} التسجيل (التسجيلات)" + no_public_recordings: هذه الغرفة ليس لديها تسجيلات عامة. + no_recordings: هذه الغرفة ليس لديها تسجيلات. no_user_recordings: ليس لديك حاليًا أي تسجيلات. - no_matched_recordings: "لا يوجد تسجيلات %{inject} تطابق بحثك." + no_matched_pub_recordings: لا توجد تسجيلات عامة تطابق بحثك. + no_matched_recordings: لا تسجيلات تطابق بحثك. recorded_on: "تم التسجيل في %{date}" table: name: الاسم @@ -426,6 +512,7 @@ ar: visibility: الظهور formats: الصيغة visibility: + inaccessible: يتعذر الوصول إليه public: عامة unlisted: غير مدرج format: @@ -439,7 +526,7 @@ ar: fail: لم تتم الموافقة على حسابك بعد. إذا كنت قد قمت بالاشتراك منذ عدة أيام ، الرجاء الاتصال بالمسؤول. signup: تم إنشاء حسابك بنجاح. تم إرساله إلى المسؤول للموافقة عليه. banned: - fail: ليس لديك حق الوصول إلى هذا التطبيق. إذا كنت تعتقد أن هذا خطأ، يرجى الاتصال بالمسؤول. + fail: ليس لديك حق الوصول إلى هذا التطبيق. إذا كنت تعتقد أن هذا خطأ، يرجى الاتصال بالمسؤول. deprecated: new_signin: حدد طريقة تسجيل دخول جديدة لحسابك. سيتم ترحيل جميع الغرف الخاصة بك من حسابك القديم إلى الحساب الجديد twitter_signin: "تم إلغاء الدخول عبر تويتر وسيتم إزالته في الإصدار التالي. انقر هنا لنقل حسابك إلى طريقة مصادقة جديدة" @@ -451,6 +538,8 @@ ar: remove: إزالة rename: إعادة تسمية reset_password: + captcha: فشل التحقق من reCAPTCHA، الرجاء المحاولة مرة أخرى. + invalid_token: رمز إعادة تعيين كلمة المرور غير صالح. يرجى محاولة إعادة تعيين كلمة المرور الخاصة بك مرة أخرى. subtitle: إعادة تعيين كلمة المرور password: كلمة المرور الجديدة confirm: تأكيد كلمة المرور الجديدة @@ -462,9 +551,13 @@ ar: banned: محظور deleted: محذوف pending: معلق + invited: مدعو user: مستخدم room: access_code_required: الرجاء إدخال رمز وصول ساري المفعول للانضمام إلى الغرفة + add_presentation: أضف العرض التقديمي + copy_access: نسخ رمز الوصول + copy_moderator_access: نسخ رمز المشرف create_room: إنشاء غرفة create_room_error: حدث خطأ أثناء إنشاء الغرفة create_room_success: تم إنشاء الغرفة بنجاح @@ -473,8 +566,12 @@ ar: success: تم حذف الغرفة بنجاح fail: "فشل في حذف الغرفة (%{error})" enter_the_access_code: أدخل رمز الوصول لهذه الغرفة + enter_the_moderator_access_code: أدخل رمز مشرف الغرفة! + optional_moderator_access_code: "رمز الوسيط الاختياري:" invalid_provider: لقد أدخلت رابطًا غير صالح. يرجى التحقق من عنوان URL والمحاولة مرة أخرى. + invitation_description: "لقد تمت دعوتك للانضمام إلى %{name} باستخدام BigBlueButton. \nللانضمام ، انقر فوق الرابط أعلاه وأدخل اسمك." invited: لقد تمت دعوتك للانضمام + recording_present: أقر بأنه سيتم تسجيل هذه الجلسة. قد يشمل ذلك صوتي وفيديو إذا تم تمكينه. invite_participants: دعوة المشاركين join: انضم last_session: "الجلسة الأخيرة في %{session}" @@ -491,9 +588,13 @@ ar: recent_rooms: الانتقال إلى الغرفة التي تم الانضمام إليها مؤخرًا title: الانضمام إلى الغرفة no_sessions: ما زالت هذه الغرفة لا تحتوي على جلسات. + preupload_success: تمت إضافة العرض بنجاح + preupload_error: حدث خطأ أثناء تحديث عرض الغرفة + preupload_remove_success: تمت إزالة العرض التقديمي بنجاح + preupload_remove_error: حدث خطأ أثناء إزالة عرض الغرفة recordings: التسجيلات الخاصة بالغرفة room_limit: وصلت إلى الحد الأقصى لعدد الغرف المسموح بها - room_limit_exceeded: "لقد تجاوزت عدد الغرف المسموح بها. يرجى حذف %{difference} غرفة للدخول إلى هذه الغرفة." + room_limit_exceeded: "لقد تجاوزت عدد الغرف المسموح بها. يرجى حذف %{difference} غرفة (غرف) للدخول إلى هذه الغرفة." sessions: جلسات settings: إعدادات الغرفة share: إدارة الوصول @@ -503,6 +604,7 @@ ar: shared_access_success: تمت مشاركة الغرفة بنجاح shared_access_error: هناك خطأ في مشاركة الغرفة start: بداية + search: البحث عن غرفة ... unavailable: هذه الغرفة غير متاح حاليًا نظرًا لعدم التحقق من البريد الإلكتروني للمالك. update_settings_error: حدث خطأ أثناء تحديث إعدادات الغرفة update_settings_success: تم تحديث إعدادات الغرفة بنجاح @@ -511,14 +613,15 @@ ar: auto: ستنضم تلقائيًا عندما يبدأ الاجتماع. settings: account: - fullname: الاسم كاملاً + fullname: الاسم الكامل language: لغة provider: مزود image: صورة image_url: عنوان URL لصورة الملف الشخصي - roles: أدوار المستخدم + roles: دور المستخدم subtitle: قم بتحديث معلومات حسابك title: معلومات الحساب + reset_password: إعادة تعيين كلمة مرور المستخدم delete: button: نعم ، أرغب في حذف حسابي. disclaimer: إذا اخترت حذف حسابك . لا يمكن استرداده. ستتم إزالة جميع المعلومات المتعلقة بحسابك ، بما في ذلك الإعدادات والغرف والتسجيل. @@ -543,6 +646,9 @@ ar: title: الشروط والأحكام test_install: > يستخدم هذا النشر خادم اختبار تمت تهيئته مسبقًا ، ويجب استبداله بخادمك الشخصي. لمزيد من التفاصيل ، اطلع على%{href} . + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: تحديث verify: accept: تحقق diff --git a/config/locales/ar_IQ.yml b/config/locales/ar_IQ.yml new file mode 100644 index 00000000..66db8789 --- /dev/null +++ b/config/locales/ar_IQ.yml @@ -0,0 +1,662 @@ +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . + +# Locale. + +ar_IQ: + activerecord: + attributes: + user: + accepted_terms: "الأحكام والشروط" + email: البريد الإلكتروني + name: الاسم + password: كلمة السر + password_confirmation: تأكيد كلمة السر + errors: + models: + user: + confirmation: لا يتطابق مع كلمة السر + administrator: + site_settings: + authentication: + disabled: معطل + enabled: مفعل + info: السماح للمستخدمين المصادق عليهم فقط بالانضمام إلى غرفة + title: طلب مصادقة للغرف + user-info: يجب عليك تسجيل الدخول أعلاه للانضمام إلى هذه الغرفة. + branding: + change: تغيير الصورة + info: تغيير صورة العلامة التجارية التي تظهر في الزاوية العلوية اليمنى + placeholder: رابط الصورة... + title: صورة العلامة التجارية + invalid: URL غير صالح + legal: + change: تغيير URL + info: قم بتغيير رابط الشروط الذي يظهر في أسفل الصفحة + placeholder: عنوان URL الشروط ... + title: الشروط + invalid: URL غير صالح + privpolicy: + change: تغيير URL + info: غيّر رابط سياسة الخصوصية الذي يظهر أسفل الصفحة + placeholder: URL سياسة الخصوصية... + title: سياسة الخصوصية + invalid: URL غير صالح + cache: + info: مسح ذاكرة التخزين المؤقت الخاصة بالمزود الذي يؤدي إلى طلب جديد للمعلومات المحدثة + title: مسح ذاكرة التخزين المؤقت لمزود الخدمة + button: مسح ذاكرة التخزين المؤقت + clear_auth: + info: مسح المصادق الحالي للمستخدمين مما يسمح لهم بتسجيل الدخول مرة أخرى باستخدام أسلوب مصادقة مختلف + title: مسح المصادق الحالي + button: مسح المصادق + color: + info: تغيير اللون الأساسي سوف يغير كلا من الفاتح والداكن. يمكن بعد ذلك تغيير الفتح والداكن بشكل فردي + title: اللون الأساسي + regular: الأساسي + lighten: الفاتح + darken: معتم + email_mapping: + info: تعيين دور المستخدم باستعمال بريده الإلكتروني. يجب أن يكون بالتنسيق email1 = role1 ، email2 = role2 + title: تعيين الدور بالبريد الإلكتروني + update: + log_level: + title: مستوى السجل + information: تغيير مستوى السجل للنشر بأكمله + debug: تصحيح + info: معلومات + warn: يحذر + error: خطأ + fatal: فادح + unknown: غير معروف + recording_visibility: + info: ضبط الظهور الافتراضي للتسجيلات الجديدة + title: تسجيل الظهور الافتراضي + warning: سيتم تطبيق هذه الإعدادات فقط على الغرف التي لا تعمل حاليا + require_consent: + info: يتيح هذا الإعداد إعداد الغرفة الذي يسمح لمالكي الغرفة بتحديد الغرف التي يمكن تسجيلها. يجب على المستخدمين الذين ينضمون إلى غرفة مسجلة الموافقة قبل الانضمام. + title: تتطلب موافقة مالك الغرفة والمنضم على التسجيل + maintenance_banner: + info: يعرض لافتة لإعلام المستخدم بالصيانة المجدولة + title: لافتة الصيانة + display: ضبط + clear: مسح + time: "مثال: التحديث مجدول في 13 ديسمبر @ 23:00 بالتوقيت الشرقي. قد يواجه المستخدمون مشاكل في تسجيل الدخول." + preupload: + info: يمكن للمستخدمين تحميل عرض تقديمي مسبق لاستخدامه كعرض تقديمي افتراضي لتلك الغرفة المحددة + title: السماح للمستخدمين بتحميل العروض التقديمية مسبقًا + registration: + info: تغيير طريقة تسجيل المستخدمين على الموقع + title: طريقة التسجيل + methods: + approval: الموافقة/الرفض + invite: الانضمام عن طريق دعوة + open: تسجيل مفتوح + rooms: + info: يحد من عدد الغرف التي يمكن للمستخدم الحصول عليها (بما في ذلك غرفة الاستقبال). لا ينطبق هذا الإعداد على المسؤولين. + title: عدد الغرف لكل مستخدم + shared_access: + info: سيؤدي التعطيل إلى إزالة الأيقونة من القائمة المنسدلة لخيارات الغرفة، وبذلك لن يتمكن المستخدمون من مشاركة الغرف + title: السماح للمستخدمين بمشاركة الغرف + subtitle: تخصيص Greenlight + tabs: + appearance: المظهر + administration: الادارة + registration: التسجيل + settings: إعدادات + title: إعدادات الموقع + flash: + approved: تمت الموافقة على المستخدم بنجاح. + banned: تم حظر المستخدم بنجاح. + unbanned: تم إلغاء حظر المستخدم بنجاح. + delete: تم حذف المستخدم بنجاح. + delete_fail: فشل حذف المستخدم + demoted: تم خفض رتبة المستخدم بنجاح + invite: "تم إرسال الدعوة بنجاح إلى %{email}" + invite_email_verification: يجب تمكين رسائل البريد الإلكتروني من أجل استخدام هذه الطريقة. الرجاء الاتصال بمسؤول النظام. + merge_fail: هناك مشكلة في دمج حسابات المستخدمين. يرجى التحقق من المستخدمين الذين تم اختيارهم والمحاولة مرة أخرى + merge_success: دمج حسابات المستخدمين بنجاح + perm_deleted: تم حذف المستخدم نهائيًا + promoted: تم ترقية المستخدم بنجاح + registration_method_updated: تم تحديث طريقة التسجيل بنجاح + reset_password: تم إرسال بريد الكتروني للمستخدم لإعادة ضبط كلمة المرور الخاصة به (نأمل مراجعة مجلد البريد المزعج في حال عدم وصوله إلى صندوق الوارد) + restored: تمت استعادة المستخدم بنجاح + room_configuration: تم تغيير إعدادات الغرفة بنجاح + settings: تم تغيير إعدادات الموقع بنجاح + unauthorized: غير مصرح لك بتنفيذ إجراءات على هذا المستخدم + recordings: + latest: أحدث التسجيلات + title: تسجيلات الخادم + no_recordings: الخادم لا يحتوي على أي تسجيلات + search_info: أدخل البريد الإلكتروني الكامل للمستخدم أو معرّف الغرفة + roles: + appear_in_share_list: تضمين المستخدمين الذين يتمتعون بهذا الدور في القائمة المنسدلة لمشاركة الغرف + can_create_rooms: يمكن إنشاء غرف + can_launch_recording: السماح للمستخدمين الذين لديهم هذا الدور بتسجيل اجتماعاتهم + delete: حذف الدور + invalid_create: حدثت مشكلة عند إنشاء دور جديد. الرجاء التحقق من قيم الدور والمحاولة مرة أخرى + invalid_order: حدثت مشكلة في تحديث أولوية الدور. الرجاء التحقق من القيم والمحاولة مرة أخرى + invalid_update: حدثت مشكلة في تحديث أذونات الدور. الرجاء التحقق من القيم والمحاولة مرة أخرى + manage_rooms_recordings: السماح للمستخدمين الذين يتمتعون بهذا الدور بإدارة غرف الخادم والتسجيلات + name: اسم الدور + new_role: إنشاء دور جديد + role_has_users: "هذا الدور تم تعيينه لـ %{user_count} حساب. فضلا قم بحذف كافة الحسابات من هذا الدور قبل حذفه " + title: أدوار + promote_email: إرسال بريد الكتروني إلى المستخدمين عند تعيين هذا الدور لهم + demote_email: إرسال بريد الكتروني إلى المستخدمين عند إزالتهم من هذا الدور + edit_site_settings: السماح للمستخدمين المنتمين لهذا الدور بتحرير اعدادت الموقع + edit_roles: السماح للمستخدمين المنتمين لهذا الدور بتحرير بقية الأدوار + manage_users: السماح للمستخدمين المنتمين لهذا الدور بإدارة المستخدمين الآخرين + invalid_assignment: حدثت مشكلة عند تعيين الأدوار للمستخدم. الرجاء التحقق من القيم والمحاولة مرة أخرى + colour: + title: لون الدور + info: تعيين اللون الذي سيرتبط بالدور + room_configuration: + title: إعدادات الغرفة + mute: + info: كتم صوت المستخدم تلقائيًا عند انضمامه إلى اجتماع BigBlueButton + require_moderator: + info: ينبه مشرف اجتماع BigBlueButton عندما يحاول المستخدم الانضمام. إذا تمت الموافقة على المستخدم ، فسيتمكن من الانضمام إلى الاجتماع. + allow_any: + info: يسمح لأي مستخدم ببدء الاجتماع في أي وقت. بشكل افتراضي ، يمكن لمالك الغرفة فقط بدء الاجتماع. + all_moderator: + info: يمنح جميع المستخدمين امتيازات المشرف في BigBlueButton عند انضمامهم إلى الاجتماع. + recordings: + info: يسمح لمالكي الغرفة بتحديد ما إذا كانوا يريدون خيار تسجيل غرفة أم لا. في حالة التمكين ، لا يزال يتعين على المشرف النقر على الزر "تسجيل" بمجرد بدء الاجتماع. + moderator_codes: + info: يسمح لمالكي الغرفة بإنشاء رمز وسيط اختياري يسمح للمستخدمين الآخرين بالانضمام مباشرة كمشرفين. + title: رمز دخول المشرف + options: + disabled: معطل + enabled: ممكّن دائمًا + optional: اختياري + rooms: + timeout: "نظرًا لانتهاء مهلة طلب الخادم %{server} ، فقد لا تكون معلومات الحالة والمشاركين دقيقة" + title: غرف الخادم + table: + ended: "انتهت: %{session}" + id: المعرف + not_running: لا يعمل + participants: المشاركون + running: يعمل + started: "بدأت: %{session}" + status: حالة + view: عرض + title: إعدادات المؤسسة + users: + invite: دعوة المستخدم + edit: + title: تحرير تفاصيل المستخدم + settings: + approve: الموافقة + decline: الرفض + ban: حظر المستخدم + delete: حذف + edit: تحرير + edit_roles: تعديل أدوار المستخدم + merge: دمج + perm_delete: حذف بشكل دائم + unban: إلغاء حظر المستخدم + undelete: تراجع عن الحذف + table: + authenticator: المصادق + created: انشاء + time: وقت الإرسال + name: الاسم + not_found: لا يوجد مستخدم يطابق بحثك + no_users: لم يتم العثور على أي مستخدمين + role: الدور + uid: معرف المستخدم + username: اسم المستخدم + valid: صالح + title: إدارة المستخدمين + add_to_google_calendar: "إضافة إلى تقويم Google" + bigbluebutton: BigBlueButton + bigbluebutton_exception: عفوًا ، حدث خطأ عند بدء الاجتماع + cancel: إلغاء + cookies: + cookie_info: ملفات تعريف الارتباط تساعدنا على تقديم خدماتنا. باستخدام خدماتنا ، أنت توافق على استخدامنا لملفات تعريف الارتباط. + cookie_button: أنا موافق + policy: "لمزيد من المعلومات ، راجع موقعنا سياسة خاصة." + copied: تم النسخ + copy: نسخ + date: + month_names: [~, يناير, فبراير, مارس, أبريل, مايو, يونيو, يوليو, أغسطس, سبتمبر, أكتوبر, نوفمبر, ديسمبر] + default_admin: "لازلت تستخدم كلمة المرور الافتراضية لهذا المستخدم، فضلا أنقر هنا لتغييرها" + delete: حذف + delivery_error: حدث خطأ أثناء تسليم البريد الإلكتروني. يرجى الاتصال بمسؤول! + docs: الوثائق + email: البريد الإلكتروني + email_sent: "تم إرسال البريد الإلكتروني الخاص بك %{email_type} (يرجى التحقق من مجلد البريد المزعج إذا لم تكن قد تلقيت ذلك)" + enter_your_name: أدخل أسمك! + errors: + bigbluebutton: + help: "يرجى التأكد من اتخاذ الخطوات المناسبة. للمزيد" + message: نقطة النهاية والسرية BigBlueButton غير صالحة + title: خطأ في الخادم + internal: + message: يبدو أن هناك خطأ ما من جانبنا. + help: لقد تم تسجيل الخطأ ، سنلقي نظرة! + report: الإبلاغ عن مشكة + maintenance: + message: المعذرة، نحن متوقفون لأجل الصيانة + help: سنعود في الحال + migration_error: + contact_admin: إذا لم تكن مسؤولاً ، الرجاء الاتصال بأحد المسؤولين. + continue: أود أن أستمر في استخدام 1.0. + notice: > + واجه Greenlight خطأ في ترحيل قاعدة البيانات.
قد يكون هذا بسبب عدم تحديثك إلى Greenlight 2.0. + upgrade: أرني كيفية الترقية إلى 2.0! + version: لقد أصدرنا إصدارًا جديدًا من Greenlight ، لكن قاعدة البيانات غير متوافقة. + messages: + blank: لا يمكن أن تكون فارغة + too_short: قصيرة جدا + invalid: غير صالح + taken: تم اختيارها مسبقا + accepted: يجب أن تكون مقبولة + confirmation: "لا يتطابق مع %{attribute}" + inclusion: غير مدرج في القائمة + domain: "يجب أن ينتهي بـ \"%{email_domain}\"" + no_provider: + message: لم يتم تمكين الموقع الذي تحاول الوصول إليه + help: الرجاء الاتصال بمسؤول النظام لإعداد Greenlight + not_found: + message: معذرة! الصفحة التي تبحث عنها غير موجودة. + help: هل من الممكن حذفه؟ + user_not_found: + help: الرجاء الاتصال بمسؤول. + message: عذراً، هذا المستخدم غير مسجل. + user_missing: + help: الرجاء التحقق من الرابط والمحاولة مرة أخرى + message: الرابط الذي أدخلته غير صالح. + title: أخطاء + unauthorized: + message: ليس لديك حق الوصول إلى هذا التطبيق + help: إذا كنت تعتقد أن هذا خطأ، يرجى الاتصال بمسؤول النظام. + expired_reset_token: انتهت صلاحية رابط إعادة تعيين كلمة المرور! + features: + title: المميزات + rooms: غرف مخصصة + recordings: إدارة التسجيل + designs: تصاميم مخصصة + authentication: مصادقة المستخدم + footer: + legal: الشروط + privpolicy: سياسة الخصوصية + powered_by: "مشغل بواسطة%{href}." + forgot_password: + subtitle: هل نسيت كلمة المرور + email: البريد الإلكتروني + submit: إرسال + go_back: عودة + greenlight: Greenlight + header: + all_recordings: كافة التسجيلات + dropdown: + account_settings: المؤسسة + help: تحتاج مساعدة؟ + home: الإستقبال + settings: ملف التعريف + signout: خروج + home_room: غرفة الإستقبال + info_update_success: تحديث المعلومات بنجاح. + invalid_credentials: لم تتطابق رسالة البريد الإلكتروني وكلمة المرور التي أدخلتها مع سجلاتنا. حاول مرة أخرى أو انقر فوق نسيت كلمة المرور لإعادة تعيين كلمة المرور الخاصة بك. + invalid_credentials_external: البريد الإلكتروني وكلمة المرور اللذان أدخلتهما لا يتطابقان مع سجلاتنا. حاول مرة اخرى. + invalid_login_method: فشل تسجيل الدخول بسبب عدم تطابق الحساب. تحتاج إلى تسجيل الدخول مع omniauth. + invite_message: "لدعوة شخص ما إلى الاجتماع ، أرسل لهم هذا الرابط:" + javascript: + room: + mailer: + subject: 'لقد تمت دعوتك لمشاهدة تسجيل.' + body: 'لمشاهدة التسجيل ، اتبع الرابط أدناه:' + autogenerated: 'يتم إنشاء هذا البريد الإلكتروني تلقائيًا بواسطة BigBlueButton.' + footer: 'BigBlueButton هو نظام مؤتمرات ويب مفتوح المصدر. لمزيد من المعلومات حول BigBlueButton ، راجع https://bigbluebutton.org/.' + search: + start: بدء البحث... + landing: + about: "%{href} هو واجهة أمامية بسيطة لخادم مؤتمرات الويب المفتوح المصدر BigBlueButton الخاص بك. يمكنك إنشاء غرف خاصة بك لاستضافة الجلسات، أو الانضمام إلى الآخرين باستخدام رابط قصير ومريح. " + welcome: مرحبًا بك في BigBlueButton + video: شاهد برنامجنا التعليمي حول استخدام Greenlight + upgrade: أرني كيفية الترقية إلى 2.0! + version: لقد أصدرنا إصدارًا جديدًا من Greenlight ، لكن قاعدة البيانات غير متوافقة. + language_default: الافتراضي (لغة المتصفح) + ldap_error: غير قادر على الاتصال بخادم LDAP. يرجى التحقق من تكوين LDAP في ملف env والتأكد من تشغيل خادمك. + login: تسجيل الدخول + login_title: تسجيل الدخول إلى حسابك + mailer: + user: + approve: + info: تمت الموافقة على حسابك. + signin: للوصول إلى غرفك الشخصية، انقر على الزر أدناه وسجّل الدخول. + signin_link: تسجيل الدخول + signup: + info: قام مستخدم جديد بالتسجيل لاستخدام Greenlight. + more-info: للسماح لهذا المستخدم بالوصول إلى Greenlight يجب أن توافق على حسابه في إعدادات المؤسسة. + admins_link: زيارة صفحة المؤسسة + subject: جديد Greenlight مستخدم تسجيل + username: "سجل المستخدم باسم %{name} والبريد الإلكتروني %{email}." + subject: الحساب معتمد + username: "اسم المستخدم الخاص بك هو %{email}." + demoted: + info: "لم تعد %{role} على%{url}." + more-info: لديك الآن الامتيازات ذاتها + root_link: تسجيل الدخول + subtitle: "%{role} الحقوق الملغاة" + invite: + info: "لقد تمت دعوتك إلى فضائك الشخصي بواسطة %{name}" + signup_info: للاشتراك باستخدام بريدك الإلكتروني، انقر على الزر أدناه واتبع الخطوات. + signup_link: التسجيل + valid: "الدعوة صالحة حتى: %{date}" + signup: + info: المستخدم المدعو قام بتسجيل الدخول لاستخدام Greenlight. + admins_link: زيارة صفحة المؤسسة + subject: تسجيل مستخدم Greenlight جديد + username: "سجل المستخدم باسم %{name} والبريد الإلكتروني %{email}." + subject: دعوة للانضمام إلى BigBlueButton + username: "اسم المستخدم الخاص بك هو %{email}." + password_reset: + title: 'إعادة تعيين كلمة المرور' + welcome: "تم طلب إعادة تعيين كلمة المرور للبريد الإلكتروني %{email}" + message: 'إذا طلبت إعادة التعيين هذه، يرجى النقر على الرابط أدناه لإعادة تعيين كلمة المرور الخاصة بك:' + reset_link: إعادة تعيين كلمة المرور + expire: سوف ينتهي هذا الرابط خلال ساعتين. + ignore: يمكنك تجاهل هذا البريد الإلكتروني بأمان إذا لم تقم بهذا الطلب. + promoted: + admins_link: زيارة صفحة المؤسسة + info: "أنت الآن %{role} على %{url}." + more-info: "لاستعراض مؤهلاتك الجديدة، يرجى زيارة %{url}." + subtitle: "%{role} الحقوق الممنوحة" + verify_email: + welcome: "مرحبا بكم في فضاءك الشخصي ، %{name}" + success: "الاستفادة من %{bigbluebutton}، يمكنك إنشاء غرف خاصة بك لاستضافة الجلسات والتعاون مع الآخرين." + username: "اسم المستخدم الخاص بك هو %{email}." + verify: للتحقق من حسابك ، أنقر على الزر أدناه. + verify_text: 'للتحقق من حسابك ، اتبع هذا الرابط بالنقر عليه: %{url}' + verify_link: التحقق من الحساب + thanks: شكرا لانضمامك ونتمنى لك يوماً موفقاً. + max_concurrent: وصلت إلى الحد الأقصى لعدد الجلسات المتزامنة المسموح بها! + merged: المدمجة + modal: + create_role: + create: "إنشاء دور جديد " + footer_text: يمكنك تحرير الأذونات الفردية لهذا الدور بعد إنشائه + name_placeholder: أدخل اسم الدور... + not_blank: اسم الدور لا يمكن أن يكون فارغاً + title: "إنشاء دور جديد " + create_room: + access_code: رمز الوصول + moderator_access_code: رمز المشرف + access_code_placeholder: إنشاء رمز وصول اختياري للغرفة + moderator_access_code_placeholder: قم بإنشاء رمز اختياري للمشرفين + auto_join: الانضمام التلقائي إلى الغرفة + create: إنشاء غرفة + free_delete: سيكون لك مطلق الحرية في حذف هذه الغرفة في أي وقت. + name_placeholder: أدخل اسم الغرفة ... + not_blank: لا يمكن ترك اسم الغرفة فارغًا. + title: إنشاء غرفة جديدة + delete_account: + confirm: هل تريد بالتأكيد حذف هذا الحساب؟ + delete: أنا متأكد، قم بحذف هذا الحساب. + keep: في الواقع ، سأحتفظ به. + delete_warning: سيؤدي ذلك إلى إلغاء تنشيط حساب المستخدم. يمكن العثور على جميع المستخدمين غير النشطين تحت علامة تبويب المحذوفات. + warning: هذا القرار نهائي.لن تكون قادرًا على استعادة البيانات المرتبطة. + delete_rec: + delete: أنا متأكد ، احذف هذا التسجيل. + header: هل أنت متأكد أنك تريد حذف هذا التسجيل؟ + warning: لن تتمكن من استعادة هذا التسجيل + delete_room: + confirm: "هل أنت متأكد أنك تريد حذف %{room}؟" + delete: أنا متأكد قم بحذف هذه الغرفة. + keep: بعد التفكير ثانية، سأحتفظ به. + warning: لن تكون قادراً على استعادة هذه الغرفة + recording_warning: "أو أي من التسجيلات المرتبطة بـ %{recordings_num} الخاصة به." + invite_user: + email_placeholder: أدخل عناوين البريد الإلكتروني للمستخدمين (مفصولة بالفارزة) + footer: سوف يتلقى المستخدم رسالة بريد إلكتروني مع تعليمات حول كيفية الاشتراك + send: إرسال دعوة + title: دعوة المستخدم + login: + or: أو + with: "الدخول بـ %{provider}" + forgot_password: هل نسيت كلمة المرور؟ + preupload: + change: استبدال العرض التقديمي + choose: اختر ملف... + current: "العرض التقديمي الحالي:" + footer: اعتمادًا على حجم العرض التقديمي ، قد يتطلب تحميله وقتًا إضافيًا قبل استخدامه. + invalid: حجم / نوع الملف غير صالح. يرجى الاطلاع على القيود أدناه. + title: أضف العرض التقديمي + use: استخدم العرض التقديمي + rename_recording: + remove_shared: + title: هل أنت متأكد من رغبتك في إزالة هذه الغرفة من قائمة الغرف الخاصة بك؟ + delete: أنا متأكد من رغبتي في إزالة هذه الغرفة + warning: أنت سوف لنتتمكن من الوصول إلى هذه الغرفة بعد الآن. + room_settings: + title: إعدادات الغرفة + update: تحديث الغرفة + client: اختر نوع العميل + join_moderator: انضم جميع المستخدمين كمشرفين + mute: كتم المستخدمين عند الانضمام + require_approval: يلزم موافقة المشرف قبل الانضمام + start: السماح لأي مستخدم ببدء اللقاء + footer_text: يمكن إجراء التعديل على غرفتك في أي وقت. + recording: السماح بتسجيل الغرفة + rename_room: + name_placeholder: أدخل اسم غرفة جديدة ... + share_access: + footer: مشاركة غرفة مع مستخدمين تسمح لهم ببدء تشغيل الغرفة وعرض تسجيلاتها + list: المشاركة مع + title: مشاركة الوصول إلى الغرفة + save: حفظ التغييرات + cancel_changes: إلغاء التغييرات + select: اختيار المستخدم + merge_user: + cancel: إلغاء + from: الحساب المراد دمجه + title: دمج حسابات المستخدم + to: الحساب الأساسي + save: دمج + footer: سيتم تحويل غرف الحساب المراد دمجه إلى قائمة غرفة الحساب الأساسي ثم يتم حذف الحساب. + name_update_success: تم تغيير اسم الغرفة بنجاح! + no_user_email_exists: لا يوجد مستخدم مسجل بهذا البريد الإلكتروني . يرجى التأكد من كتابته بشكل صحيح. + omniauth_error: حدث خطأ أثناء المصادقة مع omniauth. يرجى المحاولة مرة أخرى أو الاتصال بمسؤول! + omniauth_specific_error: "%{error}وقعت أثناء المصادقة مع omniauth. الرجاء المحاولة مرة أخرى أو الاتصال بالمسؤول" + pagy: + nav: + prev: "› السابق" + next: "التالي ‹" + gap: "…" + password: كلمة المرور + password_empty_notice: لا يمكن أن تكون كلمة المرور فارغة. + password_reset_success: تم إعادة تعيين كلمة المرور. + password_different_notice: تأكيد كلمة المرور غير متطابق. + provider: + google: Google + office365: أوفيس 365 + twitter: تويتر + ldap: LDAP + openid_connect: الاتصال OpenID + recaptcha: + errors: + recaptcha_unreachable: عفوا، فشلنا في التحقق من صحة ردك reCAPTCHA. الرجاء المحاولة مرة أخرى. + verification_failed: فشل التحقق من reCAPTCHA، الرجاء المحاولة مرة أخرى. + recording: + all_recordings: كافة التسجيلات + email: " البريد الإلكتروني للتسجيل" + error: "هناك خطأ في استرداد %{count} التسجيل (التسجيلات)" + no_public_recordings: هذه الغرفة ليس لديها تسجيلات عامة. + no_recordings: هذه الغرفة ليس لديها تسجيلات. + no_user_recordings: ليس لديك حاليًا أي تسجيلات. + no_matched_pub_recordings: لا توجد تسجيلات عامة تطابق بحثك. + no_matched_recordings: لا تسجيلات تطابق بحثك. + recorded_on: "تم التسجيل في %{date}" + table: + name: الاسم + thumbnails: الصورة المصغرة + length: الطول + users: المستخدمين + visibility: الظهور + formats: الصيغة + visibility: + inaccessible: يتعذر الوصول إليها + public: عامة + unlisted: غير مدرج + format: + notes: ملاحظات + podcast: تدوين صوتي + presentation: العرض التقديمي + statistics: الاحصائيات + video: فيديو + registration: + approval: + fail: لم تتم الموافقة على حسابك بعد. إذا كنت قد قمت بالاشتراك منذ عدة أيام ، الرجاء الاتصال بالمسؤول. + signup: تم إنشاء حسابك بنجاح. تم إرساله إلى المسؤول للموافقة عليه. + banned: + fail: ليس لديك حق الوصول إلى هذا التطبيق. إذا كنت تعتقد أن هذا خطأ، يرجى الاتصال بالمسؤول. + deprecated: + new_signin: حدد طريقة تسجيل دخول جديدة لحسابك. سيتم ترحيل جميع الغرف الخاصة بك من حسابك القديم إلى الحساب الجديد + twitter_signin: "تم إلغاء الدخول عبر تويتر وسيتم إزالته في الإصدار التالي. انقر هنا لنقل حسابك إلى طريقة مصادقة جديدة" + twitter_signup: تم إلغاء التسجيل عبر تويتر. الرجاء استخدام طريقة تسجيل مختلفة + merge_success: نجح دمج حساب تويتر الخاص بك مع حسابك الجديد. وتم حذف حساب تويتر القديم الخاص بك + invite: + fail: الرمز المميز الخاص بك إما غير صالح أو انتهت صلاحيته. إذا كنت تعتقد أن هذا خطأ، يرجى الاتصال بالمسؤول. + no_invite: ليس لديك دعوة للانضمام. الرجاء الاتصال بالمسؤول للحصول على الدعوة. + remove: إزالة + rename: إعادة تسمية + reset_password: + captcha: فشل التحقق من reCAPTCHA، الرجاء المحاولة مرة أخرى. + invalid_token: رمز إعادة تعيين كلمة المرور غير صالح. يرجى محاولة إعادة تعيين كلمة المرور الخاصة بك مرة أخرى. + subtitle: إعادة تعيين كلمة المرور + password: كلمة المرور الجديدة + confirm: تأكيد كلمة المرور الجديدة + update: تحديث كلمة المرور + auth_change: تم تغيير أسلوب المصادقة. يرجى التحقق من البريد الإلكتروني الخاص بك لتعيين كلمة المرور الخاصة بك. + roles: + active: نشط + admin: مشرف + banned: محظور + deleted: محذوف + pending: معلق + invited: مدعو + user: مستخدم + room: + access_code_required: الرجاء إدخال رمز وصول ساري المفعول للانضمام إلى الغرفة + add_presentation: أضف العرض التقديمي + copy_access: نسخ رمز الوصول + copy_moderator_access: نسخ رمز المشرف + create_room: إنشاء غرفة + create_room_error: حدث خطأ أثناء إنشاء الغرفة + create_room_success: تم إنشاء الغرفة بنجاح + delete: + home_room: لا يمكن حذف غرفة الاستقبال لهذا المستخدم + success: تم حذف الغرفة بنجاح + fail: "فشل في حذف الغرفة (%{error})" + enter_the_access_code: أدخل رمز الوصول لهذه الغرفة + enter_the_moderator_access_code: أدخل رمز مشرف الغرفة! + optional_moderator_access_code: "رمز الوسيط الاختياري:" + invalid_provider: لقد أدخلت رابطًا غير صالح. يرجى التحقق من عنوان URL والمحاولة مرة أخرى. + invitation_description: "لقد تمت دعوتك للانضمام إلى %{name} باستخدام BigBlueButton. \nللانضمام ، انقر فوق الرابط أعلاه وأدخل اسمك." + invited: لقد تمت دعوتك للانضمام + recording_present: أقر بأنه سيتم تسجيل هذه الجلسة. قد يشمل ذلك صوتي وفيديو إذا تم تمكينه. + invite_participants: دعوة المشاركين + join: انضم + last_session: "الجلسة الأخيرة في %{session}" + login: أدخل + owner: مالك + owner_banned: هذه الغرفة غير متوفرة حالياً + no_room: + description: للانضمام إلى الغرفة أدخل عنوان URL أو المعرف الخاص بها. + edit_profile: تحرير ملف تعريف المستخدم + go_to: الذهاب إلى الغرفة + invalid_room_uid: رابط عنوان الغرفة أو المعرف الذي أدخلته غير صالحة. + placeholder: رابط/معرف الغرفة + no_recent_rooms: لم تنضم إلى أي غرفة مؤخراً + recent_rooms: الانتقال إلى الغرفة التي تم الانضمام إليها مؤخرًا + title: الانضمام إلى الغرفة + no_sessions: ما زالت هذه الغرفة لا تحتوي على جلسات. + preupload_success: تمت إضافة العرض بنجاح + preupload_error: حدث خطأ أثناء تحديث عرض الغرفة + preupload_remove_success: تمت إزالة العرض التقديمي بنجاح + preupload_remove_error: حدث خطأ أثناء إزالة عرض الغرفة + recordings: التسجيلات الخاصة بالغرفة + room_limit: وصلت إلى الحد الأقصى لعدد الغرف المسموح بها + room_limit_exceeded: "لقد تجاوزت عدد الغرف المسموح بها. يرجى حذف %{difference} غرفة (غرف) للدخول إلى هذه الغرفة." + sessions: جلسات + settings: إعدادات الغرفة + share: إدارة الوصول + shared_by: "نشر بواسطة %{email}" + remove_shared_access_success: تمت إزالة الغرفة المشتركة بنجاح من قائمة الغرف الخاصة بك + remove_shared_access_error: حدث خطأ في إزالة الغرفة المشتركة من قائمتك + shared_access_success: تمت مشاركة الغرفة بنجاح + shared_access_error: هناك خطأ في مشاركة الغرفة + start: بداية + search: البحث عن غرفة ... + unavailable: هذه الغرفة غير متاح حاليًا نظرًا لعدم التحقق من البريد الإلكتروني للمالك. + update_settings_error: حدث خطأ أثناء تحديث إعدادات الغرفة + update_settings_success: تم تحديث إعدادات الغرفة بنجاح + wait: + message: الإجتماع لم يبدأ بعد. + auto: ستنضم تلقائيًا عندما يبدأ الاجتماع. + settings: + account: + fullname: الاسم الكامل + language: لغة + provider: مزود + image: صورة + image_url: عنوان URL لصورة الملف الشخصي + roles: دور المستخدم + subtitle: قم بتحديث معلومات حسابك + title: معلومات الحساب + reset_password: إعادة تعيين كلمة مرور المستخدم + delete: + button: نعم ، أرغب في حذف حسابي. + disclaimer: إذا اخترت حذف حسابك . لا يمكن استرداده. ستتم إزالة جميع المعلومات المتعلقة بحسابك ، بما في ذلك الإعدادات والغرف والتسجيل. + subtitle: "حذف حسابك بشكل دائم " + title: حذف الحساب + password: + confirmation: تأكيد كلمة المرور الجديدة + new: كلمة المرور الجديدة + old: كلمة المرور القديمة + subtitle: تغيير كلمة المرور الخاصة بك + title: كلمة المرور + title: الملف الشخصي + search: البحث + signup: + password_confirm: تأكيد كلمة المرور + subtitle: انشئ حساب + title: اشتراك + with: "اشترك عن طريق %{provider}" + terms: + accept: "أوافق على %{href}" + accept_existing: أوافق على الشروط والأحكام + title: الشروط والأحكام + test_install: > + يستخدم هذا النشر خادم اختبار تمت تهيئته مسبقًا ، ويجب استبداله بخادمك الشخصي. لمزيد من التفاصيل ، اطلع على%{href} . + time: + formats: + default: "b %d, %Y %-I:%M%P%" + update: تحديث + verify: + accept: تحقق + activated: تم التحقق من الحساب! + already_verified: تم التحقق من الحساب بالفعل + invalid: رابط التحقق غير صحيح + not_verified: لم يتم التحقق من حسابك بعد. + resend: إعادة ارسال بريد التحقق + signin: الرجاء تسجيل الدخول للوصول إلى حسابك. + title: قم بتأكيد بريدك الالكتروني + verification: التحقق diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 82c00445..3719ad4e 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -32,13 +32,13 @@ ca: administrator: site_settings: authentication: - disabled: Deshabilitada + disabled: Inhabilitada enabled: Habilitada info: Permetre només a usuaris autenticats unir-se a una sala title: Requerir autenticació per a utilitzar les sales - user-info: Cal registrar-se a la part superior pare a accedir a aquesta sala + user-info: Cal registrar-se a la part superior per a accedir a aquesta sala branding: - change: Canviar imatge + change: Canvia la imatge info: Canviar la imatge personalitzada que es mostra a la cantonada superior esquerra placeholder: Enllaç de la imatge... title: Imatge personalitzada @@ -57,102 +57,109 @@ ca: invalid: Enllaç no vàlid cache: info: "Neteja la memòria cau de proveïdors emmagatzemats, el que força una petició de la informació actualitzada" - title: Netejar memòria cau de proveïdor - button: Netejar memòria cau + title: Neteja memòria cau de proveïdor + button: Neteja memòria cau clear_auth: info: "Esborra l'autenticador actual pels usuaris, permetent-els tornar a iniciar sessió amb un mètode d'autenticació diferent" - title: Netejar l'autenticador actual - button: Netejar autenticació + title: Neteja l'autenticador actual + button: Neteja l'autenticació color: - info: Netejar el color regular cambiarà tant el color clar como el fosc. Els valors d'Aclarir i Enfosquir es poden canviar individualment + info: Netejar el color normal canviarà tant el color clar com el fosc. Els valors clar i fosc es poden canviar individualment title: Color principal - regular: Regular - lighten: Aclarir - darken: Enfosquir + regular: Normal + lighten: Clar + darken: Fosc + email_mapping: + info: "Indica com han d'acabar les adreces de correu que vulguis donar-lis un rol pre-existent, amb aquesta sintaxi: @elmeudomini.com=Nom de rol,@unaltredomini.org=Un altre rol" + title: Rols per defecte per a certes adreces de correu (o dominis de correu) d'usuaris que es registrin + update: log_level: title: Nivell de registre - information: Canviar el nivell de registre per a toda la implementació - debug: Depurar + information: Canvia el nivell de registre per a toda la implementació + debug: Depuració info: Informació warn: Advertència error: Error fatal: Fatal unknown: Desconegut recording_visibility: - info: Establir la visibilitat per defecte de les noves gravacions - title: Visibilitat per defecte de gravacions - warning: Aquesta configuració només serà aplicada a les noves sessiones + info: Estableix la visibilitat predeterminada dels nous enregistraments + title: Visibilitat per defecte dels enregistraments + warning: Aquesta configuració només s'aplicarà a les sales que no s'està executant require_consent: - info: "Aquesta configuració habilita una configuració de sala, que permet als propietaris de sales especificar quines sales poden ser gravades. Els usuaris que accedeixen a una sala amb gravació han de donar el seu consentiment abans d'unir-se." - title: Requerir el consentiment del propietari de la sala i la persona que accedeix per a realitzar la gravació + info: "Aquesta configuració habilita una configuració de sala, que permet als propietaris de sales especificar quines sales poden ser enregistrades. Els usuaris que accedeixen a una sala amb enregistrament han de donar el seu consentiment abans d'unir-s'hi." + title: Requereix el consentiment del propietari de la sala i la persona que accedeix per a realitzar l'enregistrament maintenance_banner: - info: Mostra un banner per a informar a l'usuari d'un manteniment programat - title: Banner de manteniment + info: Mostra un bàner per a informar a l'usuari d'un manteniment programat + title: Bàner de manteniment display: Estableix clear: Neteja - time: "Exemple: actualització programada pel 13 de desembre a las 23:00h. Els usuaris poden experimentar problemes per a iniciar sessió." + time: "Exemple: actualització programada pel 13 de desembre a les 23:00h. Els usuaris poden experimentar problemes per a iniciar sessió." preupload: info: Els usuaris poden carregar prèviament una presentació per a utilitzar-la com a presentació predeterminada per a aquesta sala específica - title: Permetre als usuaris carregar prèviament presentacions + title: Permet als usuaris carregar prèviament presentacions registration: - info: Canviar la forma de registre d'usuaris + info: Canvia la forma de registre d'usuaris title: Mètode de registre methods: - approval: Autoritzar/Denegar + approval: Autoritza o denega invite: Registre per invitació open: Registre obert rooms: info: Estableix el límit de sales que un usuari pot tenir (incloent la sala principal). Aquesta configuració no s'aplica als administradors. title: Número de sales per usuari shared_access: - info: "Si s'estableix en deshabilitat, s'eliminarà el botó del menú desplegable d'opcions de sala, el que evitarà que els usuaris comparteixin sales" - title: Permetre els usuaris compartir sales - subtitle: Personalitzar Greenlight + info: "Si s'estableix en inhabilitat, s'eliminarà el botó del menú desplegable d'opcions de sala, el que evitarà que els usuaris comparteixin sales" + title: Permet que els usuaris comparteixin sales + subtitle: Personalitza Greenlight tabs: appearance: Apariència administration: Administració + registration: Registrar-se settings: Configuració title: Configuració del lloc web flash: - approved: L'usuari ha estat autoritzat - banned: L'usuari ha estat bloquejat. - unbanned: L'usuari ha estat desbloquejat. - delete: L'usuari ha estat eliminat. - delete_fail: L'usuari no s'ha pogut eliminar. - demoted: L'usuari ha estat degradat. - invite: "Invitació enviada correctament a %{email}" - invite_email_verification: "L'enviament de correus electrònics ha d'estar habilitat per a poder fer ús d'aquest mètode de registre. Si us plau, contacta amb l'administrador del sistema." - merge_fail: S'ha produït un problema al fusionar els comptes d'usuari. Comprova els usuaris seleccionats i torna a provar-ho + approved: S'ha autoritzat l'usuari correctament. + banned: S'ha blocat l'usuari correctament. + unbanned: S'ha desblocat l'usuari correctament. + delete: S'ha eliminat l'usuari correctament. + delete_fail: No s'ha pogut eliminar l'usuari. + demoted: S'ha degradat l'usuari correctament. + invite: "La Invitació s'ha enviat correctament a %{email}" + invite_email_verification: L'enviament de correus electrònics ha d'estar habilitat per a poder fer ús d'aquest mètode de registre. Contacteu amb l'administrador del sistema. + merge_fail: S'ha produït un problema en fusionar els comptes d'usuari. Comproveu els usuaris seleccionats i torneu a provar-ho merge_success: Els comptes d'usuari s'han fusionat correctament - perm_deleted: L'usuari ha estat eliminat permanentement + perm_deleted: S'ha eliminat l'usuari permanentment promoted: L'usuari ha estat promogut. registration_method_updated: Mètode de registre actualitzat - reset_password: S'ha enviat a l'usuari un missatge de correu per a recuperar la contrasenya. (Demana-li revisar la carpeta de correu brossa si no l'ha rebut) - restored: L'usuari ha estat recuperat amb èxit + reset_password: S'ha enviat a l'usuari un missatge de correu per a recuperar la contrasenya. (Demaneu-li revisar la carpeta de correu brossa si no l'ha rebut) + restored: S'ha recuperat l'usuari amb èxit room_configuration: La configuració de la sala s'ha modificat correctament - settings: La configuració de sistema ha estat actualitzada - unauthorized: No està autoritzat per a executar operacions sobre aquest usuari. + settings: S'ha actualitzat la configuració de sistema correctament + unauthorized: No esteu autoritzat per a executar operacions sobre aquest usuari. recordings: - title: Gravacions - no_recordings: Aquest servidor no te gravacions. + latest: Darrers enregistraments + title: Servidor d'enregistraments + no_recordings: Aquest servidor no té cap enregistrament. + search_info: "Escriviu l'adreça de correu completa d'un usuari o el UID d'una sala (ex.: cao-k2t-xhf)" roles: - appear_in_share_list: Aquest servidor no te gravacions + appear_in_share_list: Inclou els usuaris amb aquest rol en el desplegable per a compartir sales can_create_rooms: Pot crear sales - delete: Eliminar rol - invalid_create: Ha hagut un error al crear el nou rol. Verifica els valors assignats i torna a intentar-ho - invalid_order: Ha hagut un error a l'actualitzar la prioritat del rol. Verifica els valors assignats i torna a intentar-ho - invalid_update: Ha hagut un error a l'actualitzar els permissos del rol. Verifica els valors assignats i torna a intentar-ho - manage_rooms_recordings: Permetre que els usuaris amb aquest rol administrin servidors de sala i gravacions + delete: Elimina el rol + invalid_create: S'ha produït un error en crear el nou rol. Verifiqueu els valors assignats i torneu a intentar-ho + invalid_order: S'ha produït un error en actualitzar la prioritat del rol. Verifiqueu els valors assignats i torneu a intentar-ho + invalid_update: S'ha produït un error en actualitzar els permisos del rol. Verifiqueu els valors assignats i torneu a intentar-ho + manage_rooms_recordings: Permet que els usuaris amb aquest rol administrin servidors de sala i enregistraments name: Nom del rol new_role: Crea un nou rol - role_has_users: "Aquest rol es troba assignado a %{user_count} comptes d'usuari. Cal esborrar tots els comptes associats a aquest rol abans d'eliminar-lo." + role_has_users: "Aquest rol es troba assignat a %{user_count} comptes d'usuari. Cal esborrar tots els comptes associats a aquest rol abans d'eliminar-lo." title: Rols - promote_email: Enviar un missatge als usuaris als que s'hagi assignat aquest rol - demote_email: Enviar un missatge als usuaris als que s'hagi eliminat aquest rol - edit_site_settings: Permetre als usuaris amb aquest rol editar configuracions - edit_roles: Permetre als usuaris amb aquest rol editar altres rols - manage_users: Permetre als usuaris amb aquest rol gestionar altres usuaris - invalid_assignment: Ha hagut un error a l'assignar el rol o els rols a l'usuari. Verifica els valors assignats i torna a provar + promote_email: Envia un missatge als usuaris a qui s'hagi assignat aquest rol + demote_email: Envia un missatge als usuaris a qui s'hagi eliminat aquest rol + edit_site_settings: Permet als usuaris amb aquest rol editar configuracions + edit_roles: Permet als usuaris amb aquest rol editar altres rols + manage_users: Permet als usuaris amb aquest rol gestionar altres usuaris + invalid_assignment: S'ha produït un error en assignar el rol o els rols a l'usuari. Verifiqueu els valors assignats i torneu a provar colour: title: Color del rol info: Defineix el color que s'associarà al rol @@ -165,11 +172,11 @@ ca: allow_any: info: "Permet a qualsevol usuari iniciar la reunió en qualsevol moment. De forma predeterminada, només el propietari de la sala pot iniciar la reunió." all_moderator: - info: Otorga a tots els usuaris els privilegis d'usuari moderador a BigBlueButton quan s'uneixen a la reunió. + info: Atorga a tots els usuaris els privilegis d'usuari moderador a BigBlueButton quan s'uneixen a la reunió. recordings: - info: "Permet als propietaris de sales especificar si desitgen l'opció de gravar una sala o no. Si está habilitada, el moderador encara ha de fer hacer clic al botó \"Grava\" una vegada hagi començat la reunió." + info: "Permet als propietaris de sales especificar si desitgen l'opció d'enregistrar una sala o no. Si està habilitada, el moderador encara ha de fer clic en el botó «Enregsitra» una vegada hagi començat la reunió." options: - disabled: Deshabilitada + disabled: Inhabilitada enabled: Sempre habilitada optional: Opcional rooms: @@ -183,67 +190,67 @@ ca: running: En funcionamient started: "Iniciada: %{session}" status: Estat - view: Mostrar + view: Mostra title: Configuració de l'organització users: - invite: Convidar usuari + invite: Convida un usuari edit: - title: Editar detalls d'usuari + title: Edita detalls de l'usuari settings: - approve: Autoritzar - decline: Denegar - ban: Bloquejar usuari - delete: Eliminar - edit: Editar - edit_roles: Editar els rols d'usuari - merge: Fusionar - perm_delete: Eliminar permanentment - unban: Desbloquejar usuari - undelete: Recuperar + approve: Autoritza + decline: Denega + ban: Bloca l'usuari + delete: Elimina + edit: Edita + edit_roles: Edita els rols d'usuari + merge: Fusiona + perm_delete: Elimina permanentment + unban: Desbloca l'usuari + undelete: Recupera table: authenticator: Verificador created: Creat time: Temps enviat name: Nom - not_found: No s'han trobat usuaris amb aquest criteri - no_users: No s'han trobat usuaris + not_found: No s'ha trobat cap usuari amb aquest criteri + no_users: No s'ha trobat cap usuari role: Rol uid: Identificador d'usuari username: Nom d'usuari - valid: Valid - title: Administrar usuaris - add_to_google_calendar: "Afegir al Calendari de Google" + valid: Vàlid + title: Administrar els usuaris + add_to_google_calendar: "Afegeix al Calendari de Google" bigbluebutton: BigBlueButton - bigbluebutton_exception: Os pedrer! Ha hagut un error a l'iniciar la sessió. - cancel: Cancel·lar + bigbluebutton_exception: Os pedrer! S'ha produït un error en iniciar la sessió. + cancel: Cancel·la cookies: - cookie_info: "Les cookies (galetes) ens ajuden a proveir els nostres serveis. En utilitzar els nostres serveis, aceptes la nostra utlització de les cookies." + cookie_info: "Les galetes ens ajuden a proveir els nostres serveis. En utilitzar els nostres serveis, accepteu l'ús que fem de les galetes." cookie_button: Accepto - copied: Copiada - copy: Copiar + copied: S'ha copiat + copy: Copia date: - month_names: [~, Gener, Febrer, Març, Abril, Maig, Juny, Juliol, Agost, Setembre, Octubre, Novembre, Decembre] - default_admin: "Estàs utilitzant la contrasenya per defecte per aquest compte d'usuari. Fes clic aquí per a canviar-la" - delete: Eliminar - delivery_error: "Ha hagut un error durant l'enviament de correu electrònic. Si us plau, contacta amb un administrador." + month_names: [~, Gener, Febrer, Març, Abril, Maig, Juny, Juliol, Agost, Setembre, Octubre, Novembre, Desembre] + default_admin: "Esteu utilitzant la contrasenya per defecte d'aquest compte d'usuari. Feu clic aquí per a canviar-la" + delete: Elimina + delivery_error: S'ha produït un error durant l'enviament de correu electrònic. Contacteu amb un administrador. docs: Documentació email: Compte de correu - email_sent: "El seu %{email_type} correu electrònic ha estat enviat. (Revisa la teva carpeta de correu brossa si no l'has rebut)" - enter_your_name: Introdueix el teu nom + email_sent: "S'ha enviat el vostre %{email_type} correu electrònic. (Reviseu la carpeta de correu brossa si no l'heu rebut)" + enter_your_name: Indiqueu el vostre nom! errors: bigbluebutton: - help: "Assegura't de que has seguit els passos correctament. Més informació" - message: La URL o clau secreta del servidor BigBlueButton no són vàlids + help: "Assegureu-vos que heu seguit els passos correctament. Més informació" + message: L'URL o clau secreta del servidor BigBlueButton no són vàlids title: Error del servidor internal: message: Sembla que alguna cosa ha fallat del nostre costat. - help: "L'error ha estat registrat, el revisarem en breu." - report: Reportar problema + help: "S'ha enregistrat l'error, el revisarem aviat." + report: Reporta un problema maintenance: message: El sistema es troba en manteniment. - help: Tornarem aviat. + help: Tornarem aviat! migration_error: - contact_admin: "Si no ets administrador, si us plau, contacta amb un d'ells." + contact_admin: "Si no sou administrador, contacteu amb un d'ells." continue: M'agradaria continuar utilitzant la versió 1.0 notice: > Greenlight ha trobat un error al migrar la base de dades.
Això pot estar provocat perquè no ha actualitzat Greenlight a la versió 2.0 @@ -254,236 +261,237 @@ ca: too_short: és massa curta invalid: es invàlida taken: ja existeix - accepted: ha de ser aceptat + accepted: ha de ser acceptat confirmation: "no coincideix %{attribute}" inclusion: no està inclòs a la lista no_provider: message: El lloc al que està intentant accedir no es troba actiu - help: "Si us plau, contacta amb l'administrador del sistema per a configurar Greenlight" + help: Contacteu amb l'administrador del sistema per a configurar Greenlight not_found: - message: "Ens sap greu, la pàgina que estàs buscant no existe." - help: "¿És possible que hagi estat eliminada?" + message: "Ens sap greu, la pàgina que esteu cercant no existeix." + help: "És possible que s'hagi eliminat?" user_not_found: - help: "Si us plau, contacta amb l'administrador." + help: Contacteu amb l'administrador. message: "Ens sap greu, aquest usuari no està registrat." user_missing: - help: "Si us plau, verifica l'enllaç i torna a provar." + help: Verifiqueu l'enllaç i torneu a provar. message: L'enllaç que introduït no és vàlid. title: Errors unauthorized: - message: No te accés a aquesta aplicació - help: "Si creus que és un error, si us plau, contacta amb l'administrador del sistema." + message: No té accés a aquesta aplicació + help: "Si penseu que és un error, contacteu amb l'administrador del sistema." expired_reset_token: L'enllaç per a recuperar la contrasenya ha caducat. features: title: Funcions rooms: Sales personalitzades - recordings: Administració de gravacions + recordings: Administració d'enregistraments designs: Diseny personalitzat authentication: Autenticació d'usuari footer: - legal: Termes legales + legal: Termes legals privpolicy: Política de privacitat powered_by: "Funciona amb %{href}" forgot_password: subtitle: He oblidat la contrasenya email: Compte de correu - submit: Enviar - go_back: Enrera + submit: Envia + go_back: Enrere greenlight: Greenlight header: - all_recordings: Totes les gravacions + all_recordings: Tots els enregistraments dropdown: account_settings: Organització - help: "Necessites ajuda?" + help: "Us cal ajuda?" home: Inici settings: Perfil d'usuari - signout: Sortir + signout: Surt home_room: Sala principal info_update_success: Informació actualitzada amb èxit. - invalid_credentials: El correu electrònic i contrasenya introduïts no coincideixen amb els registres. Inténtelo de nou o haga clic en recuperar contrasenya. - invalid_login_method: L'inici de sessió ha fallat per la falta de coincidència de compte. Necessites iniciar sessió amb un dels proveïdors. - invite_message: "Per a convidar a algú a la sessió, envia-li aquest enllaç:" + invalid_credentials: El correu electrònic i contrasenya introduïts no coincideixen amb els registres. Torneu a intentar o feu clic a «Recupera la contrasenya». + invalid_login_method: L'inici de sessió ha fallat per la falta de coincidència de compte. Cal que inicieu sessió amb un dels proveïdors. + invite_message: "Per a convidar a algú a la sessió, enveu-li aquest enllaç:" javascript: room: mailer: - subject: 'convidat a veure una gravació.' - body: 'Fes clic a enllaç per a veure la gravació:' - autogenerated: 'Aquest correu electrònic s ha generat automàticament per BigBlueButton' - footer: 'BigBlueButton és un sistema open source, basat en web, per a videoconferència. Per a més informació, visita https://bigbluebutton.org/.' + subject: 'us ha convidat a veure un enregistrament.' + body: 'Feu clic a enllaç per a veure l''enregistrament:' + autogenerated: 'Aquest correu electrònic s''ha generat automàticament per BigBlueButton' + footer: 'BigBlueButton és un sistema de codi obert, basat en web, per a videoconferència. Per a més informació, visiteu https://bigbluebutton.org/.' search: - start: Començar la cerca... + start: Comença la cerca... landing: - about: "%{href} és una interfície web per al teu servidor de conferències de codi obert BigBlueButton. Pots crear les teves pròpies sales per a ser anfitrió de sessions o unir-te a altres utilitzant un enllaç curt adequat." + about: "%{href} és una interfície web per al vostre servidor de conferències de codi obert BigBlueButton. Podeu crear les vostres pròpies sales per a ser amfitrió de sessions o unir-vos a altres utilitzant un enllaç curt adequat." welcome: Benvingut a Greenlight. - video: Mira el nostre tutorial sobre com utilizar Greenlight + video: Mireu el nostre tutorial sobre com utilitzar Greenlight upgrade: Mostra'm com actualitzar a la versió 2.0 - version: "Hem publicat una nova versió de Greenlight, però la teva base de dades no és compatible." - language_default: Per omissió (idioma del navegador) - ldap_error: No es pot connectar al servidor LDAP. Comprova la configuració de LDAP a l'arxiu "env" i assegurat de que el teu servidor s'està executant. - login: Iniciar sessió - login_title: Iniciar sessió al teu compte + version: "Hem publicat una nova versió de Greenlight, però la vostra base de dades no és compatible." + language_default: Per omissió (llengua del navegador) + ldap_error: No es pot connectar al servidor LDAP. Comproveu la configuració de LDAP en el fitxer «env» i assegureu-vos que el vostre servidor s'està executant. + login: Inicia sessió + login_title: Inicieu sessió al vostre compte mailer: user: approve: - info: El teu compte ha estat autoritzat. - signin: "Per accedir a les teves sales personals, fes clic al botó inferior i inicia sessió." - signin_link: Iniciar sessió + info: El vostre compte ha estat autoritzat. + signin: "Per a accedir a les vostres sales personals, feu clic al botó inferior i inicieu sessió." + signin_link: Inicia sessió signup: - info: S'ha registrat un nou usuari. - more-info: Per a permetre l'accés d'aquest usuari has d'aprovar el seu compte d'usuari a través de la configuració de l'organització. - admins_link: Anar a la pàgina de l'organització - subject: Registre d'usuari nou + info: S'ha enregistrat un nou usuari. + more-info: Per a permetre l'accés d'aquest usuari heu d'aprovar-ne el compte d'usuari a través de la configuració de l'organització. + admins_link: Vés a la pàgina de l'organització + subject: Registre d'usuari Greenlight nou username: "L'usuari s'ha registrat com a %{name} amb el correu electrònic %{email}." subject: Compte d'usuari autoritzat - username: "El teu nom d'usuari és %{email}." + username: "El vostre nom d'usuari és %{email}." demoted: - info: "Ja no ets %{role} a %{url}." - more-info: Des d'aquest moment tens els mateixos privilegis que un usuari regular. - root_link: Iniciar sessió + info: "Ja no sou %{role} a %{url}." + more-info: Des d'aquest moment teniu els mateixos privilegis que un usuari normal. + root_link: Inicia sessió subtitle: "Permís de %{role} eliminat" invite: - info: "Has estat convidat a tenir el teu espai personal amb %{name}" - signup_info: "Per a registrar-te utilizant el teu compte de correu, fes clic al botó inferior i segueix els passos indicats." - signup_link: Registrar-se + info: "Heu estat convidat a tenir el vostre espai personal amb %{name}" + signup_info: "Per a registrar-vos utilizant el vostre compte de correu, feu clic al botó inferior i seguiu els passos indicats." + signup_link: Registre signup: info: Un usuari que va ser convidat a registrar-se ha completat el seu registre. - admins_link: Anar a la pàgina de l'organització - subject: Registre d'usuari nou - username: "L'usuari s'ha registrado com a %{name} amb el correu electrònic %{email}. " + admins_link: Vés a la pàgina de l'organització + subject: Registre d'usuari Greenlight nou + username: "L'usuari s'ha registrat com a %{name} amb el correu electrònic %{email}. " subject: Invitació per a unir-se a BigBlueButton - username: "El teu nom d'usuari és %{email}." + username: "El vostre nom d'usuari és %{email}." password_reset: - title: 'La contrasenya ha estat reiniciada' - welcome: "S'ha sol·licitat un canvi de contrasenya pel correu electrònic %{email}" - message: 'Si vas fer una sol·licitud per a reiniciar la teva contrasenya, fes clic a aquest enllaç per a iniciar el procés.' - reset_link: Reiniciar la contrasenya + title: 'S''ha restablert la contrasenya' + welcome: "S'ha sol·licitat un canvi de contrasenya per al correu electrònic %{email}" + message: 'Si vau fer una sol·licitud per a restablir la contrasenya, feu clic en aquest enllaç per a iniciar el procés.' + reset_link: Restablir la contrasenya expire: Aquest enllaç caduca en dues hores - ignore: Pots ignorar aquest missatge sense problemes si no has estat tu qui va sol·licitar el canvi de contrasenya. + ignore: Podeu ignorar aquest missatge sense problemes si no sou qui heu sol·licitat el canvi de contrasenya. promoted: - admins_link: Anar a la pàgina de l'organització - info: "El teu rol ha canviat a %{role} a %{url}." - more-info: "Per a veure les noves funcions que se t'han activat visita %{url}" + admins_link: Vés a la pàgina de l'organització + info: "El vostre rol ha canviat a %{role} a %{url}." + more-info: "Per a veure les noves funcions que se us han activat visiteu %{url}" subtitle: "Permisos de %{role} assignats" verify_email: - welcome: "Benvingut al teu espa personal %{name}" - success: "Fent ús de %{bigbluebutton}, pots crear les teves pròpies sales per a realitzar reunions i col·laborar amb altres." - username: "El teu nom d'usuari és %{email}" - verify: "Per a verificar el compte, fes clic al botó inferior." - verify_text: 'Utiliza aquest enllaç per a verificar el teu compte: %{url}' - verify_link: Verificar el compte d'usuari - thanks: Gràcies per unir-te i que tinguis bon dia! - max_concurrent: S'ha arribat al número màxim de sessions permeses + welcome: "Benvingut al vostre espai personal %{name}" + success: "Fent ús de %{bigbluebutton}, podeu crear les vostres pròpies sales per a fer reunions i col·laborar amb altres usuaris." + username: "El vostre nom d'usuari és %{email}" + verify: "Per a verificar el compte, feu clic al botó inferior." + verify_text: 'Utilitzeu aquest enllaç per a verificar el vostre compte: %{url}' + verify_link: Verifica el compte d'usuari + thanks: Gràcies per unir-vos i que tingueu bon dia! + max_concurrent: S'ha arribat al nombre màxim de sessions permeses merged: Fusionat modal: create_role: - create: Crear un nou rol - footer_text: Pots modificar els permisos per a aquest rol de manera individual una vez que haya estat creado - name_placeholder: Introdueix el nom del rol + create: Crea un nou rol + footer_text: Podeu modificar els permisos per a aquest rol de manera individual una vegada que l'hàgiu creat + name_placeholder: Introduïu el nom del rol not_blank: El nom de rol no pot estar buit - title: Crear un nou rol + title: Crea un nou rol create_room: access_code: Codi d'accés - access_code_placeholder: Generar un nou codi d'accés + access_code_placeholder: Genera un nou codi d'accés auto_join: Envia'm a la sala automàticament quan comenci la sessió - create: Crea sala - free_delete: Podràs eliminar la sala en el moment que vulguis - name_placeholder: Introdueix un nom per a la sala + create: Crea una sala + free_delete: Podreu eliminar la sala en el moment que vulgueu + name_placeholder: Introduïu un nom per a la sala not_blank: El nom de la sala no pot estar buit - title: Crear una sala nova + title: Crea una sala nova delete_account: - confirm: "Estàs segur d'eliminar aquest compte d'usuari?" + confirm: "Esteu segur de voler eliminar aquest compte d'usuari?" delete: Estic segur d'eliminar aquest compte keep: "De fet, la mantindré" - delete_warning: Aquesta acció desactiva el compte d'usuari. Tos els usuaris desactivats es mostren a la pestanya d'eliminats. - warning: "Aquesta decisió és irrevesible, No podràs recuperar la informació associada" + delete_warning: Aquesta acció desactiva el compte d'usuari. Tots els usuaris desactivats es mostren a la pestanya d'eliminats. + warning: "Aquesta decisió és irreversible, No podreu recuperar la informació associada" delete_rec: - delete: "Estic segur, elimina aquesta gravació." - header: "Estàs segur de voler eliminar aquesta gravació?" - warning: No podràs recuperar aquesta gravació + delete: "N'estic segur, elimina aquest enregistrament." + header: "Esteu segur de voler eliminar aquest enregistrament?" + warning: No podreu recuperar aquest enregistrament delete_room: - confirm: "Estàs segur de voler eliminar %{room}?" + confirm: "Esteu segur de voler eliminar %{room}?" delete: "Estc segur, elimina aquesta sala" keep: "He canviat de parer, la mantindré" - warning: No podràs recuperar aquesta sala - recording_warning: "o qualsevol de les teves %{recordings_num} gravacions associades." + warning: No podreu recuperar aquesta sala + recording_warning: "o qualsevol dels vostres %{recordings_num} enregistraments associats." invite_user: - email_placeholder: Introdueix els correus electrònics d'usuari (separats per coma) + email_placeholder: Introduïu els correus electrònics d'usuari (separats per coma) footer: L'usuari rebrà un correu electrònic amb instruccions de com registrar-se - send: Enviar invitació - title: Convidar usuari + send: Envia la invitació + title: Convida l'usuari login: or: o - with: "Iniciar sessió amb %{provider}" - forgot_password: "Has oblidat la teva contrasenya?" + with: "Inicia sessió amb %{provider}" + forgot_password: "Heu oblidat la contrasenya?" preupload: change: Substitueix la presentació - choose: Selecciona un arxiu + choose: Trieu un fitxer... current: "Presentació actual:" footer: "En funció de la mida de la presentació, és possible que es necessiti més temps per a carregar-la abans de poder utilitzar-la." - invalid: "Mida o tipus d'arxiu no vàlids. Si us plau, consulta les restriccions a continuación." - title: Afegir presentació - use: Utilitzar presentació + invalid: Mida o tipus de fitxer no vàlids. Consulteu les restriccions a continuació. + title: Afegir una presentació + use: Utilitza una presentació rename_recording: remove_shared: - title: "Estàs segur de voler eliminar aquesta sala de la teva llista de sales?" + title: "Esteu segur de voler eliminar aquesta sala de la llista de sales?" delete: "Estic segur, elimina aquesta sala." - warning: NO podràs accedir a aquesta sala en el futur. + warning: NO podreu accedir a aquesta sala en el futur. room_settings: title: Configuració de la sala - update: Actualitzar la sala - client: Seleccionar el tipus de client + update: Actualitza la sala + client: Seleccioneu el tipus de client join_moderator: Tots els usuaris s'uneixen com a moderadors - mute: Deshabilitar micròfon d'usuaris al entrar - require_approval: Requerir aprovació del moderador abans de unir-se a la sessió - start: Permetre als usuaris iniciar aquesta sessió - footer_text: Pots fer canvis a la teva sala en qualsevol moment - recording: Permetre a aquesta sala ser gravada + mute: Desactiva micròfon d'usuaris a l'entrar + require_approval: Requereix l'aprovació del moderador abans d'unir-se a la sessió + start: Permet als usuaris iniciar aquesta sessió + footer_text: Podeu fer canvis a la sala en qualsevol moment + recording: Permet l'enregistrament d'aquesta sala rename_room: - name_placeholder: Introdueix un nou nom per a la sala... + name_placeholder: Introduïu un nou nom per a la sala... share_access: - footer: Compartir una sala amb un usuari permet que iniciï la sala i veure les gravacions de la sala. + footer: Compartir una sala amb un usuari permet que iniciï la sala i veure els enregistraments de la sala. list: Compartit amb - title: Compartir accés a la sala - save: Guardar canvis - cancel_changes: Cancel·lar canvis - select: Seleccionar usuari + title: Comparteix l'accés a la sala + save: Desa els canvis + cancel_changes: Cancel·la els canvis + select: Seleccioneu un usuari merge_user: - cancel: Cancel·lar - from: Compte per a ser fusionada - title: Fusionar comptes d'usuari + cancel: Cancel·la + from: Compte per a ser fusionat + title: Fusiona els comptes d'usuari to: Compte principal - save: Fusionar + save: Fusiona footer: Les sales del compte que es fusionarà es transferiran a la llista de sales del compte principal i posteriorment s'eliminarà el compte. - name_update_success: El nom de la sala ha estat actualitzat correctament - no_user_email_exists: "No hi ha cap usuari existent amb el correu electrònic especificat. Si us plau, assegura't de que l'has escrit correctament." - omniauth_error: "Ha hagut un error a l'intentar autenticar utilitzant OmniAuth. Si us plau, torna a intentar-ho o contacta amb un administrador!" - omniauth_specific_error: "Error %{error} a l'intentar autenticar utilitzant OmniAuth. Si us plau, torna a intentar-ho o contacta amb un administrador!" + name_update_success: El nom de la sala s'ha actualitzat correctament + no_user_email_exists: No hi ha cap usuari existent amb el correu electrònic especificat. Assegureu-vos que l'heu escrit correctament. + omniauth_error: S'ha produït un error en intentar autenticar utilitzant OmniAuth. Torneu a intentar-ho o contacteu amb un administrador! + omniauth_specific_error: "Error %{error} en intentar autenticar utilitzant OmniAuth. Torneu a intentar-ho o contacteu amb un administrador!" pagy: nav: - prev: "‹ Anterior" - next: "Següent ›" + prev: "‹ Enrere" + next: "Endavant ›" gap: "…" password: Contrasenya password_empty_notice: La contrasenya no pot estar buida - password_reset_success: La contrasenya ha estat canviada - password_different_notice: La contrasenyes introduïdes no coincideix + password_reset_success: S'ha canviat la contrasenya. + password_different_notice: Les contrasenyes introduïdes no coincideixen provider: google: Google office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: - recaptcha_unreachable: Os pedrer! La resposta del teu reCAPTCHA ha fallat. Torna a intentar-ho. - verification_failed: "La verificació reCAPTCHA ha fallat, torna a intentar-ho." + recaptcha_unreachable: Os pedrer! La resposta del reCAPTCHA ha fallat. Torneu a intentar-ho. + verification_failed: "La verificació reCAPTCHA ha fallat, torneu a intentar-ho." recording: - all_recordings: Totes les gravacions - email: Enviar correu electrònic amb la gravació - error: "Ha hagut un error al recuperar %{count} gravació(ns)." - no_recordings: "Aquesta sala no te gravacions %{inject}" - no_user_recordings: No tens gravacions - no_matched_recordings: "No hi ha %{inject} gravacions que coincideixin amb la teva cerca." - recorded_on: "Gravada el %{date}" + all_recordings: Tots els enregistraments + email: Envia un correu electrònic amb l'enregistrament + error: "S'ha produït un error en recuperar %{count} enregsitrament(s)." + no_recordings: "Aquesta sala no té cap registrament %{inject}." + no_user_recordings: No teniu cap enregisrament + no_matched_recordings: "No hi ha %{inject} enregistraments que coincideixin amb la cerca." + recorded_on: "Enregsitrada el %{date}" table: name: Nom thumbnails: Miniatures d'imatge @@ -502,27 +510,28 @@ ca: video: Vídeo registration: approval: - fail: "El teu compte d'usuari encara no ha estat autorizat. Si han passat varis dies des del teu registre, et recomanem contactar amb l'administrador." - signup: El teu compte d'usuari ha estat creat i se li ha enviat una notificació a l'administrador per a la seva autorització. + fail: "El vostre compte d'usuari encara no ha estat autoritzat. Si han passat alguns dies des del vostre registre, us recomanem contactar amb l'administrador." + signup: El vostre compte d'usuari ha estat creat i se li ha enviat una notificació a l'administrador per a la seva autorització. banned: - fail: "No tens accés a aquesta aplicació. Si creus que es tracta d'un error, contacta l'administrador del sistema." + fail: "No teniu accés a aquesta aplicació. Si penseu que es tracta d'un error, contacteu amb l'administrador del sistema." deprecated: - new_signin: Selecciona un nou mètode de autenticació. Todes les sales vinculades al teu compte anterior seran migrades al nou compte - twitter_signin: "L'accés a través de Twitter és obsolet i serà eliminat a la següent versió. Fes clic aquí per a moure el teu compte d'usuari i el seu contingut a un compte vinculat a un altre mètode d'autenticació" - twitter_signup: "El registre de nous comptes amb Twitter és obsolet. Si us plau, utiliza un mètode d'autenticació diferent per a registrar-te." - merge_success: El teu compte vinculat a Twitter s'ha fusionat correctament amb el teu nou compte. El compte vinculat amb Twitter ha estat eliminat. + new_signin: Seleccioneu un nou mètode d'autenticació. Totes les sales vinculades al vostre compte anterior es migraran al compte nou + twitter_signin: "L'accés a través de Twitter és obsolet i serà eliminat a la següent versió. Feu clic aquí per a moure el vostre compte d'usuari i el seu contingut a un compte vinculat a un altre mètode d'autenticació" + twitter_signup: El registre de nous comptes amb Twitter és obsolet. Utilitzeu un mètode d'autenticació diferent per a registrar-vos + merge_success: El vostre compte vinculat a Twitter s'ha fusionat correctament amb el compte nou. El compte vinculat amb Twitter ha estat eliminat. invite: - fail: "El teu codi ha caducat o no és vàlid. Si creus que es tracta d'un error, contacta amb l'administrador del sistema." - no_invite: No tens una invitació per a ingresar. Contacta amb l'administrador del sistema per a obtenir-ne una. - remove: Eliminar - rename: Canviar nom + fail: "El codi ha caducat o no és vàlid. Si penseu que es tracta d'un error, contacteu amb l'administrador del sistema." + no_invite: No teniu una invitació per a ingressar. Contacteu amb l'administrador del sistema per a obtenir-ne una. + remove: Elimina + rename: Canvia el nom reset_password: - invalid_token: El token de restabliment de contrasenya no és vàlid. Intenta restablir la teva contrasenya de nou. - subtitle: Reiniciar contrasenya - password: Nova contrasenya - confirm: Confirmació de nova contrasenya - update: Actualitzar contrasenya - auth_change: "El mètode d'autenticación ha canviat. Si us plau, consulta el teu correu electrònic per a configurar la teva contrasenya." + captcha: "La verificació reCAPTCHA ha fallat, torneu a intentar-ho." + invalid_token: El token de restabliment de contrasenya no és vàlid. Intenteu restablir la contrasenya de nou. + subtitle: Restableix la contrasenya + password: Contrasenya nova + confirm: Confirmació de la contrasenya nova + update: Actualitza la contrasenya + auth_change: El mètode d'autenticació ha canviat. Consulteu el correu electrònic per a configurar la contrasenya. roles: active: Actiu admin: Administrador @@ -531,102 +540,103 @@ ca: pending: Pendent user: Usuari room: - access_code_required: Introdueix un codi d'accés vàlid per a unir-te a la sala - add_presentation: Afegir presentació + access_code_required: Introduïu un codi d'accés vàlid per a unir-vos a la sala + add_presentation: Afegeix una presentació copy_access: Copia el codi d'accés - create_room: Crear una sala - create_room_error: Ha hagut un error al crear la sala + create_room: Crea una sala + create_room_error: S'ha produït un error en crear la sala create_room_success: La sala s'ha creat correctament delete: home_room: No és possible eliminar la sala principal - success: Sala eliminada correctament - fail: "S'ha produït un error a l'eliminar la sala (%{error})" - enter_the_access_code: Introdueix el codi d'accés de la sala - invalid_provider: L'enllaç introduït no és vàlid. Comprova'l i torna a intentar-ho. - invitation_description: "Ha estat convidat a unir-te a %{name} utilitzant BigBlueButton. Per a unir-te, fes clic a l'enllaç superior i introdueix el teu nom." - invited: Ha estat convidat a unir-te - recording_present: Reconec que aquesta sessió es gravarà. Això pot incloure la meva veu i el meu vídeo si està activat. - invite_participants: Convidar participants - join: Entrar + success: S'ha eliminat la sala correctament + fail: "S'ha produït un error en eliminar la sala (%{error})" + enter_the_access_code: Introduïu el codi d'accés de la sala + invalid_provider: L'enllaç introduït no és vàlid. Comproveu-lo i torneu a intentar-ho. + invitation_description: "Heu estat convidat a unir-vos a %{name} utilitzant BigBlueButton. Per a unir-vos-hi, feu clic a l'enllaç superior i introduïu el vostre nom." + invited: Heu estat convidat a unir-vos + recording_present: Reconec que aquesta sessió s'enregistrarà. Això pot incloure la meva veu i el meu vídeo si està activat. + invite_participants: Convida participants + join: Entra last_session: "Última sessió a %{session}" - login: Entrar + login: Entra owner: Propietari owner_banned: Aquesta sala no és accessible actualment no_room: - description: Introdueix l'enllaç o ID de la sala a la que vols unir-te. + description: Introduïu l'enllaç o ID de la sala a la qual voleu unir-vos. edit_profile: Edita el perfil d'usuari - go_to: Anar a sala - invalid_room_uid: L'enllaç o UID que has introduït no és vàlid. + go_to: Vés a la sala + invalid_room_uid: L'enllaç o UID que heu introduït no és vàlid. placeholder: Enllaç/uid de la sala - no_recent_rooms: No has utilitzat cap sala recientement - recent_rooms: Ves a Sales utilizadas recentement - title: Uneix-te a una Sala - no_sessions: Aquesta sala encara no te sessions - preupload_success: Presentació afegida correctament - preupload_error: Ha hagut un error actualitzant la presentació de la sala + no_recent_rooms: No heu utilitzat cap sala recientement + recent_rooms: Vés a les sales utilitzades recentment + title: Uneix-te a una sala + no_sessions: Aquesta sala encara no té cap sessió + preupload_success: La presentació s'ha afegit correctament + preupload_error: S'ha produït un error en actualitzar la presentació de la sala preupload_remove_success: Eliminació de presentació correcta - preupload_remove_error: Ha hagut un error eliminant la presentació de la sala - recordings: Gravacions de sala - room_limit: Has arribat al número límit de sales permeses - room_limit_exceeded: "Has arribat al número límit de sales permeses. Si us plau, elimina %{difference} sala(es) per poder accedir a aquesta." + preupload_remove_error: S'ha produït un error en eliminar la presentació de la sala + recordings: Enregistraments de sala + room_limit: Heu arribat al nombre límit de sales permeses + room_limit_exceeded: "Heu superat el nombre de sales permeses. Elimineu %{difference} sales per a poder accedir a aquesta." sessions: Sessions settings: Configuració de sala - share: Gestionar accés + share: Gestiona l'accés shared_by: "Compartit per %{email}" - remove_shared_access_success: S'ha eliminat correctament la sala compartida de la teva llista de sales - remove_shared_access_error: Ha hagut un error eliminant la sala compartida de la teva llista de sales + remove_shared_access_success: S'ha eliminat correctament la sala compartida de la llista de sales + remove_shared_access_error: S'ha produït un error en eliminar la sala compartida de la llista de sales shared_access_success: Sala compartida correctament - shared_access_error: Ha hagut un error compartint la sala + shared_access_error: S'ha produït un error en compartir la sala start: Inicia - unavailable: Aquesta sala no es troba disponible perquè el compte de correu del seu propietari no ha estat verificat. - update_settings_error: Ha hagut un error a l'actualitzar la configuració de la sala + search: Cerca sala... + unavailable: Aquesta sala no es troba disponible perquè el compte de correu del seu propietari no s'ha verificat. + update_settings_error: S'ha produït un error en actualitzar la configuració de la sala update_settings_success: La configuració de la sala ha estat actualitzada correctament wait: message: La sessió encara no ha començat. - auto: Seràs enviat a la sala automàticament quan comenci la sessió + auto: Se us enviarà cap a la sala automàticament quan comenci la sessió settings: account: fullname: Nom complet - language: Idioma + language: Llengua provider: Proveïdor image: Imatge image_url: Enllaç a la imatge de perfil roles: Rol d'usuari - subtitle: Actualitzar informació d'usuari + subtitle: Actualitzeu la vostra informació d'usuari title: Informació del compte - reset_password: Restablir contrasenya d'usuari + reset_password: Restableix la contrasenya d'usuari delete: button: "Sí, m'agradaria eliminar el meu compte d'usuari." - disclaimer: "Si tries eliminar el teu compte d'usuari, no podrà recuperar-se. Tota la informació relacionada amb el teu compte, incloses configuració, sales y gravacions, serà eliminada." + disclaimer: "Si trieu eliminar el vostre compte d'usuari, no podrà recuperar-se. Tota la informació relacionada amb el compte, incloses la configuració, sales i enregistraments, s'eliminarà." subtitle: Eliminar el compte de forma permanent - title: Eliminar compte + title: Elimina el compte password: confirmation: Confirmació de contrasenya nova new: Contrasenya nova old: Contrasenya anterior - subtitle: Canviar la teva contrasenya + subtitle: Canvia la contrasenya title: Contrasenya title: Perfil d'usuari search: Cerca signup: password_confirm: Confirmació de contrasenya - subtitle: Crear un compte - title: Registrar-se - with: "Registrar-se utilitzant %{provider}" + subtitle: Crea un compte + title: Registre + with: "Registre amb %{provider}" terms: - accept: Accepto els termes y condicions d'ús + accept: "Accepto els %{href}" accept_existing: Accepto els termes y condicions d'ús - title: Termes y condicions d'ús + title: Termes i condicions d'ús test_install: > - Aquesta instal·lació està utilitzant el servidor de proves pre-configurat. Hauria de ser substituït amb el teu propi servidor. Per a més detalls consulta %{href}. + Aquesta instal·lació està utilitzant el servidor de proves pre-configurat. Hauria de ser substituït amb el vostre propi servidor. Per a més detalls consulta %{href}. update: Actualitza verify: accept: Verifica - activated: Compte de correu verificada. - already_verified: Compte de correu verificada amb anterioritat + activated: Compte verificat. + already_verified: El compte ja s'ha verificat invalid: Enllaç de verificació no vàlid - not_verified: El teu compte de correu no ha estat verificat - resend: Reenviar enllaç per a verificació de compte de correu - signin: "Inicia sessió per a tenir accés al teu compte " - title: Verifica el teu compte de correu + not_verified: El compte encara no s'ha verificat + resend: Torna a enviar l'enllaç de verificació + signin: "Inicieu sessió per a tenir accés al vostre compte " + title: Verifiqueu l'adreça electrònica verification: Verificació diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 37800b06..4a4e4c30 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -69,6 +69,10 @@ cs: regular: Hlavní barva lighten: Světlá barva darken: Tmavá barva + email_mapping: + info: "Přiřaď uživateli roli podle e-mailu. Musí být ve formátu: email1=role1,email2=role2" + title: Mapování rolí podle e-mailu + update: log_level: title: Úroveň logování information: "Změní úroveň pro celý server " @@ -90,7 +94,7 @@ cs: title: Informace o údržbě display: Nastavit clear: Vyčistit - time: "Příklad: Údržba systému je naplánovaná na 13. prosince ve 23:00.\nUživatelé mohou mít potíže s přihlášením do systému." + time: "Příklad: Údržba systému je naplánovaná na 13. prosince ve 23:00.\nUživatelé mohou mít potíže s přihlášením do systému." preupload: info: "Uživatelé mohou nahrát prezentaci, která bude použita jako výchozí prezentace pro vybranou místnost." title: Povolit uživatelům nahrát výchozí prezentaci @@ -111,6 +115,7 @@ cs: tabs: appearance: Vzhled administration: Administrace + registration: Registrace settings: Nastavení title: Nastavení serveru flash: @@ -133,8 +138,10 @@ cs: settings: Nastavení serveru úspěšně změněno unauthorized: Nemáte dostatečná oprávnění k provedení akce. recordings: + latest: Poslední nahrávky title: Uložené nahrávky no_recordings: Na serveru dosud nejsou uloženy žádné nahrávky + search_info: Vložte uživatelův e-mail nebo identifikátor místnosti roles: appear_in_share_list: Uživatelé s touto rolí mohou sdílet místnost. can_create_rooms: Uživatel může vytvářet místnosti @@ -168,6 +175,9 @@ cs: info: Přiděl práva moderátora všem uživatelům ihned po připojení. recordings: info: "Povolit vlastníkům místnosti určit, zda chtějí mít volbu nahrávat místnost nebo nikoliv. Pokud je zapnuto, přesto musí moderátor kliknout na tlačítko \"Zahájit nahrávání\"." + moderator_codes: + info: "Povol vlastníkovi generovat pin moderátora, který umožňuje ostatním uživatelům se připojit přímo jako moderátor." + title: Přístupový pin moderátora options: disabled: Vypnuto enabled: Vždy zapnuto @@ -219,6 +229,7 @@ cs: cookies: cookie_info: Cookies nám pomáhají poskytovat naše služby. Používáním našich služeb souhlasíte s jejich použitím. cookie_button: Souhlasím + policy: "Více informací najdete v zásadách ochrany osobních údajů." copied: Zkopírováno copy: Kopírovat date: @@ -345,6 +356,7 @@ cs: info: " Byl jste pozván do Vašeho osobního prostoru uživatelem %{name}" signup_info: "Pro registraci Vaším emailem, klikněte na tlačítko níže a postupujte podle předepsaných kroků." signup_link: Registrace + valid: "Pozvánka je platná do: %{date}" signup: info: Pozvaný Greenlight uživatel se zaregistroval. admins_link: Navštivte stránku Organizace @@ -383,7 +395,9 @@ cs: title: Vytvořit novou roli create_room: access_code: Přístupový kód + moderator_access_code: PIN moderátora access_code_placeholder: Vygenerovat volitelný přístupový kód + moderator_access_code_placeholder: Generuj pin moderátora. auto_join: Připojit mne automaticky do místnosti create: Vytvořit místnost free_delete: Tuto místnost můžete kdykoliv odstranit. @@ -472,6 +486,7 @@ cs: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: Nepodařilo se nám ověřit Vaši odpověď na reCAPTCHA. Zkuste to prosím znovu. @@ -517,6 +532,7 @@ cs: remove: Odstranit rename: Přejmenovat reset_password: + captcha: "Ověření reCAPTCHA selhalo, zkuste to prosím znovu." invalid_token: Token resetu hesla je neplatný. Prosím proveďte reset svého hesla ještě jednou. subtitle: Resetovat heslo password: Nové heslo @@ -529,11 +545,13 @@ cs: banned: Zablokovaní deleted: Smazaní pending: Čekající + invited: Pozván user: Uživatel room: access_code_required: Prosím zadejte platný přístupový kód pro vstup do místnosti add_presentation: Přidat prezentaci copy_access: Zkopíruj přístupový kód + copy_moderator_access: Zkopíruj pin moderátora create_room: Vytvořit místnost create_room_error: Při vytváření místnosti nastala chyba create_room_success: Místnost byla úspěšně vytvořena @@ -542,8 +560,10 @@ cs: success: Místnost byla smazána fail: "Nepodařilo se smazat místnost (%{error})" enter_the_access_code: Vložte přístupový kód do místnosti + enter_the_moderator_access_code: Vlož pin moderátora k místnosti! + optional_moderator_access_code: "Volitelný pin moderátora" invalid_provider: Vložili jste neplatné url. Prosím zkontrolujte url a zkuste to znovu. - invitation_description: "Byl jste pozván na videokonferenci%{name} v BigBlueButton. K připojení do místnosti klikněte na odkaz výše a zadejte svoje jméno." + invitation_description: "Byl jste pozván na videokonferenci%{name} v BigBlueButton. K připojení do místnosti klikněte na odkaz výše a zadejte svoje jméno." invited: Byl jste pozván na konferenci v místnosti recording_present: Souhlasím s nahráváním sezení v místnosti včetně mého hlasu a web kamery pokud jsou zapnuté. invite_participants: Pozvánka pro účastníky diff --git a/config/locales/da.yml b/config/locales/da.yml index 999854a5..621e7635 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -69,6 +69,10 @@ da: regular: Almindelig lighten: Lysere darken: Mørkere + email_mapping: + info: "Giv brugeren en rolle ved hjælp af deres e-mail. Skal være i formatet email1 = rolle1, email2 = rolle2\n " + title: Giv Roller via Email + update: log_level: title: Log Niveau information: Skift Log Niveau for hele systemet @@ -90,7 +94,7 @@ da: title: Vedligeholdelses Banner display: Sæt clear: Ryd - time: "Eksempel: Opdatering planlagt 13. december @ 23:00 ET. Brugere kan have problemer med at logge ind." + time: "Eksempel: Opdatering planlagt 13. december @ 23:00 ET. Brugere kan have problemer med at logge ind." preupload: info: "Brugere kan forhåndsindlæse en præsentation, der skal bruges som standardpræsentation for det specifikke rum" title: Tillad Brugere at Forhåndsindlæse Præsentationer @@ -111,6 +115,7 @@ da: tabs: appearance: Udseende administration: Administration + registration: Registrering settings: Indstillinger title: Side Indstillinger flash: @@ -133,8 +138,10 @@ da: settings: Sidens indstillinger er blevet ændret med succes unauthorized: Du er ikke godkendt til at lave denne handling på brugeren recordings: + latest: Sidste nye Optagelser title: Server Optagelser no_recordings: Denne server har ingen optagelser. + search_info: Indtast en brugers fulde e-mail eller et rums uid roles: appear_in_share_list: Inkluder brugere med denne rolle i rullemenuen for delte rum can_create_rooms: Kan oprette rum @@ -168,12 +175,15 @@ da: info: "Giver alle brugernes moderatorrettigheder i BigBlueButton, når de deltager i mødet." recordings: info: "Tillader rum ejere at specificere, om de vil have muligheden for at optage et værelse eller ej. Hvis aktiveret, skal moderatoren stadig klikke på \"Optag\" -knappen, når mødet er startet." + moderator_codes: + info: "Giver rum ejere mulighed for valgfrit at generere en moderator-pin, som giver andre brugere mulighed for at deltage direkte som moderatorer." + title: Moderator Adgangskode options: disabled: Deaktiver enabled: Altid Aktiveret optional: Valgfri rooms: - timeout: " \nPå grund af %{server} Serveren fik timeout for serveranmodning, oplysningerne om status og deltagere er muligvis ikke korrekte" + timeout: "På grund af %{server} Serveren fik timeout for serveranmodning, oplysningerne om status og deltagere er muligvis ikke korrekte" title: Server Rum table: ended: "Sluttede: %{session}" @@ -219,6 +229,7 @@ da: cookies: cookie_info: "Cookies hjælper os med at levere vores service. Ved at bruge vores system, godkender du samtidigt vores brug af cookies." cookie_button: Jeg er enig + policy: "For mere information, læs voresprivatlivs politik." copied: Kopiret copy: Kopier date: @@ -257,6 +268,7 @@ da: accepted: skal accepteres confirmation: "passer ikke til %{attribute}" inclusion: er ikke inkluderet i listen + domain: "skal ende med \"%{email_domain}\"" no_provider: message: Siden du prøver at få adgang til er ikke slået til help: Kontakt venligst din system administrator for at indstille Greenlight @@ -301,6 +313,7 @@ da: home_room: Hjemme Rum info_update_success: Informationerne er opdateret med succes. invalid_credentials: "Den indtastede email og adgangskode, passer ikke på det vi har stående i vores system. Prøv igen, eller klik på Glemt Adgangskode, for at nulstille denne. " + invalid_credentials_external: "Den email og adgangskode du indtastede, matchede ikke i vores system. Prøv venligst igen." invalid_login_method: "Dit login forsøg fejlede da der var en fejl med kontoen.\nDu bliver nødt til at logge ind med omniauth." invite_message: "For at invitere nogen til et møde, skal du sende dem dette link:" javascript: @@ -345,6 +358,7 @@ da: info: "Du er blevet inviteret til dit eget personlige rum af %{name}" signup_info: "For at oprette dig med din email, klik på knappen nedenunder og følg vejledningen." signup_link: Opret Konto + valid: "Invitationen er gyldig indtil: %{date}" signup: info: En bruger der var inviteret har oprette sig på Greenlight. admins_link: Besøg Indstillings Siden @@ -383,7 +397,9 @@ da: title: Opret Ny Rolle create_room: access_code: Adgangs Kode + moderator_access_code: Moderator Adgangskode access_code_placeholder: Generer en adgangskode til rummet. Valgfrit. + moderator_access_code_placeholder: Generer en valgfri adgangskode til moderatorer auto_join: Tilslut mig automatisk i rummet. create: Opret Rum free_delete: Du vil kunne slette dette rum på et hvilket som helst tidspunkt. @@ -398,7 +414,7 @@ da: warning: Denne beslutning er afgørende. Du vil ikke kunne genskabe data igen. delete_rec: delete: "Jeg er sikker, slet denne optagelse." - header: " \nEr du sikker på, at du vil slette denne optagelse?" + header: "Er du sikker på, at du vil slette denne optagelse?" warning: Du vil ikke have mulighed for at genskabe denne optagelse delete_room: confirm: "Er du sikker på du vil slette %{room}?" @@ -472,6 +488,7 @@ da: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: "Årh nej, vi kunne ikke bekræfte din reCAPTCHA forbindelse. Prøv venligst igen." @@ -492,6 +509,7 @@ da: visibility: Synlighed formats: Formater visibility: + inaccessible: Utilgængelig public: Synlig unlisted: Skjult format: @@ -517,6 +535,7 @@ da: remove: Fjern rename: Omdøb reset_password: + captcha: "reCAPTCHA verifikation fejlede, prøv venligst igen." invalid_token: Token til nulstilling af adgangskode er ugyldigt. Prøv at nulstille din adgangskode igen. subtitle: Nulstil Adgangskode password: Ny Adgangskode @@ -529,11 +548,13 @@ da: banned: Bortvist deleted: Slettet pending: Afventer + invited: Inviteret user: Bruger room: access_code_required: Indtast venligst en gyldig adgangskode for at deltage i rummet add_presentation: Tilføj Præsentation copy_access: Kopier Adgangskode + copy_moderator_access: Kopier Moderator Adgangskode create_room: Opret et Rum create_room_error: Der var en fejl ved oprettelsen af rummet create_room_success: Rummet blev oprettet med succes @@ -542,8 +563,10 @@ da: success: Rummet blev slettet med succes fail: "Kunne ikke slette rummet (%{error})" enter_the_access_code: Indtast rummets adgangskode + enter_the_moderator_access_code: Indtast rummets moderator adgangskode! + optional_moderator_access_code: "Valgfri Moderator Adgangskode:" invalid_provider: Du har indtastet en forkert url. Tjek venligst adressen og prøv igen. - invitation_description: "Du er blevet inviteret til at deltage %{name} ved hjælp af BigBlueButton. For at deltage skal du klikke på linket ovenfor og indtaste dit navn." + invitation_description: "Du er blevet inviteret til at deltage %{name} ved hjælp af BigBlueButton. For at deltage skal du klikke på linket ovenfor og indtaste dit navn." invited: Du er blevet inviteret til at deltage recording_present: "Jeg anerkender, at denne session vil blive optaget. Dette kan omfatte min stemme og video, hvis det er aktiveret." invite_participants: Inviter Deltagere @@ -578,6 +601,7 @@ da: shared_access_success: Rummet blev delt med succes shared_access_error: Der var en fejl ved deling af rummet start: Start + search: Søg efter rum... unavailable: Dette rum er i øjeblikket ikke tilgængeligt på grund af ejerens e-mail ikke er blevet bekræftet. update_settings_error: Der var en fejl ved opdateringen af indstillingerne for rummet update_settings_success: Indstillingerne for rummet blev opdateret med succes. @@ -586,7 +610,7 @@ da: auto: Du vil automatisk blive tilsluttet når mødet starter. settings: account: - fullname: Fulde navn + fullname: Fulde Navn language: Sprog provider: Udbyder image: Billede @@ -619,6 +643,9 @@ da: title: Regler og Betingelser test_install: > Denne installation bruger en forudkonfigureret testserver, du skal erstatte denne med din egen. For detaljer, se %{href}. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Opdater verify: accept: Bekræft diff --git a/config/locales/de_DE.yml b/config/locales/de_DE.yml index f7afa395..414b7ad1 100644 --- a/config/locales/de_DE.yml +++ b/config/locales/de_DE.yml @@ -40,7 +40,7 @@ de_DE: branding: change: Bild ändern info: Das in der linken oberen Ecke dargestellte Logo ändern - placeholder: Bild URL... + placeholder: Bild-URL... title: Logo invalid: Ungültige URL legal: @@ -72,7 +72,7 @@ de_DE: email_mapping: info: "Ordnen Sie den Nutzer anhand seiner E-Mail einer Rolle zu. Muss im Format email1=Rolle1,email2=Rolle2 erfolgen" title: Rollenzuordnung per E-Mail - update: + update: log_level: title: Log-Level information: Log-Level für die gesamte Anwendung ändern @@ -94,7 +94,7 @@ de_DE: title: Banner für Wartungsarbeiten display: Setzen clear: Löschen - time: "Beispiel: Aktualisierung geplant am 13. Dezember um 23:00 Uhr MEZ. Nutzer könnten Probleme bei der Anmeldung haben." + time: "Beispiel: Aktualisierung geplant am 13. Dezember um 23:00 Uhr MEZ. Nutzer könnten Probleme bei der Anmeldung haben." preupload: info: "Nutzer können eine Präsentation vorab hochladen, die als Standardpräsentation für diesen speziellen Raum verwendet werden soll" title: "Nutzern erlauben, Präsentationen vorab hochzuladen" @@ -138,11 +138,14 @@ de_DE: settings: Grundeinstellungen erfolgreich geändert unauthorized: "Sie haben nicht die notwendigen Rechte, um diese Änderung bei diesem Teilnehmer vorzunehmen." recordings: + latest: Aktuelle Aufzeichnungen title: Serveraufzeichnungen no_recordings: Keine Aufzeichnungen vorhanden. + search_info: Geben Sie die vollständige E-Mail eines Nutzers oder die Raum-ID ein roles: appear_in_share_list: Nutzer mit dieser Rolle im Dropdown-Menü zum Teilen von Räumen einschließen can_create_rooms: Kann Räume erstellen + can_launch_recording: "Nutzern mit dieser Rolle erlauben, ihre Konferenzen aufzuzeichnen" delete: Rolle löschen invalid_create: Es kam zu einem Problem beim Erzeugen einer neuen Rolle. Bitte prüfen Sie die Rollenwerte und versuchen Sie es erneut invalid_order: Es kam zu einem Problem beim Aktualisieren der Rollenpriorität. Bitte prüfen Sie die Werte und versuchen Sie es erneut @@ -173,6 +176,9 @@ de_DE: info: "Gewährt allen Teilnehmern Moderatorenrechte in BigBlueButton, wenn sie an der Konferenz teilnehmen." recordings: info: "Ermöglicht Rauminitiatoren die Festlegung, ob sie die Option zum Aufzeichnen eines Raums wünschen oder nicht. Wenn diese Option aktiviert ist, muss der Moderator auch nach Beginn der Konferenz auf den Button \"Aufzeichnen\" klicken." + moderator_codes: + info: "Ermöglicht es Rauminitiatoren, optional einen Moderatoren-PIN zu generieren, der es anderen Teilnehmern ermöglicht, direkt als Moderator beizutreten." + title: Moderatoren-Zugangscode options: disabled: Deaktiviert enabled: Immer aktiviert @@ -224,6 +230,7 @@ de_DE: cookies: cookie_info: Cookies helfen uns bei der Bereitstellung unserer Dienste. Durch die Nutzung der Dienste stimmen Sie der Nutzung von Cookies zu. cookie_button: Ich stimme zu + policy: "Weitere Informationen finden Sie in unserer Datenschutzerklärung." copied: Kopiert copy: Kopieren date: @@ -262,6 +269,7 @@ de_DE: accepted: muss akzeptiert werden confirmation: "passt nicht zu %{attribute}" inclusion: ist nicht Teil der Liste + domain: "muss mit \"%{email_domain}\" enden" no_provider: message: "Die Seite, auf die Sie zugreifen möchten, ist nicht aktiviert." help: "Bitte kontaktieren Sie Ihren Systemadministrator, damit er Greenlight einrichtet." @@ -306,6 +314,7 @@ de_DE: home_room: Startraum info_update_success: Information erfolgreich aktualisiert. invalid_credentials: "Die eingegebene E-Mail und das Passwort sind nicht richtig. Bitte versuchen Sie es erneut oder wählen Sie die Option Ihr Passwort zurückzusetzen, falls Sie es vergessen haben." + invalid_credentials_external: Die eingegebene E-Mail und das Passwort sind nicht richtig. Bitte versuchen Sie es erneut. invalid_login_method: Die Anmeldung scheiterte aufgrund einer Unstimmigkeit mit dem Konto. Sie müssen sich mit Omniauth anmelden. invite_message: "Um jemanden zur Konferenz einzuladen, schicken Sie ihm diesen Link:" javascript: @@ -350,6 +359,7 @@ de_DE: info: "Sie wurden von %{name} in Ihren persönlichen Bereich eingeladen" signup_info: "Um sich mit Ihrer E-Mail anzumelden, klicken Sie den untenstehenden Button und folgen Sie den Schritten." signup_link: Registrieren + valid: "Die Einladung ist gültig bis: %{date}" signup: info: Ein eingeladener Nutzer hat sich bei Greenlight registriert. admins_link: Organisationsseite besuchen @@ -388,7 +398,11 @@ de_DE: title: Neue Rolle erstellen create_room: access_code: Zugangscode + moderator_access_code: Moderatorencode access_code_placeholder: Generieren eines optionalen Raumzugangscodes + reset_access_code: Zurücksetzen des optionalen Raumzugangscodes + moderator_access_code_placeholder: Optionalen Code für Moderatoren generieren + reset_moderator_access_code: Zurücksetzen des optionalen Codes für Moderatoren auto_join: Automatisch dem Raum beitreten create: Raum erstellen free_delete: Sie können den Raum jederzeit wieder löschen. @@ -486,9 +500,11 @@ de_DE: all_recordings: Alle Aufzeichnungen email: Aufzeichnungslink per E-Mail error: "Beim Abruf von %{count} Aufzeichnung(en) ist ein Fehler aufgetreten." - no_recordings: "Dieser Raum hat keine %{inject} Aufzeichnungen." + no_public_recordings: Dieser Raum hat keine öffentlichen Aufzeichnungen. + no_recordings: Dieser Raum hat keine Aufzeichnungen. no_user_recordings: Momentan sind keine Aufzeichnungen verfügbar. - no_matched_recordings: "Keine %{inject} Aufzeichnungen passen zu Ihrer Suche." + no_matched_pub_recordings: Keine öffentlichen Aufzeichnungen passen zu Ihrer Suche. + no_matched_recordings: Keine Aufzeichnungen passen zu Ihrer Suche. recorded_on: "Aufgezeichnet am %{date}" table: name: Name @@ -498,6 +514,7 @@ de_DE: visibility: Sichtbarkeit formats: Formate visibility: + inaccessible: Nicht verfügbar public: Öffentlich unlisted: Nicht gelistet format: @@ -523,6 +540,7 @@ de_DE: remove: Entfernen rename: Umbenennen reset_password: + captcha: "reCAPTCHA Verifikation fehlgeschlagen, bitte nochmals versuchen." invalid_token: "Der Token zum Zurücksetzen des Passworts ist ungültig. Bitte versuchen Sie erneut, Ihr Passwort zurückzusetzen." subtitle: Passwort zurücksetzen password: Neues Passwort @@ -535,11 +553,13 @@ de_DE: banned: Gesperrt deleted: Gelöscht pending: Wartend + invited: Eingeladen user: Nutzer room: access_code_required: "Bitte geben Sie einen gültigen Zugangscode ein, um den Raum zu betreten" add_presentation: Präsentation hinzufügen copy_access: Zugangscode kopieren + copy_moderator_access: Moderatoren-Code kopieren create_room: Raum erstellen create_room_error: Bei der Erstellung des Raums ist ein Fehler aufgetreten create_room_success: Raum erfolgreich erstellt @@ -548,10 +568,12 @@ de_DE: success: Raum erfolgreich gelöscht fail: "Raum konnte nicht gelöscht werden (%{error})" enter_the_access_code: Raumzugangscode bitte eingeben + enter_the_moderator_access_code: Geben Sie den Moderatoren-Code des Raums ein! + optional_moderator_access_code: "Optionaler Moderatoren-Code:" invalid_provider: "Sie haben eine ungültige URL eingegeben, bitte überprüfen Sie die URL und versuchen Sie es erneut." - invitation_description: "Sie wurden zu %{name} über BigBlueButton zur Teilnahme eingeladen. Um beizutreten, klicken Sie auf den obigen Link und geben Sie Ihren Namen ein." + invitation_description: "Sie wurden zu %{name} über BigBlueButton zur Teilnahme eingeladen. Um beizutreten, klicken Sie auf den obigen Link und geben Sie Ihren Namen ein." invited: Sie wurden zur Teilnahme eingeladen - recording_present: "Ich bestätige, dass diese Sitzung aufgezeichnet wird. Dies kann meine Sprach- und Videoaufnahmen beinhalten, wenn diese geteilt werden." + recording_present: "Ich bin damit einverstanden, dass diese Sitzung aufgezeichnet wird. Die Aufzeichnung kann Sprach- und Videoaufnahmen von mir beinhalten. Bitte beachten Sie, dass die Aufnahme im Anschluss geteilt werden kann." invite_participants: Teilnehmer einladen join: Teilnehmen last_session: "Letzte Konferenz am %{session}" @@ -626,6 +648,9 @@ de_DE: title: Allgemeine Nutzungsbedingungen test_install: > Diese Installation verwendet einen vorkonfigurierten Testserver. Sie sollten diesen durch Ihren eigenen Server ersetzen. Weitere Informationen dazu unter %{href}. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Aktualisieren verify: accept: Verifizieren diff --git a/config/locales/en.yml b/config/locales/en.yml index 9987acec..855fbb2b 100755 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -138,11 +138,14 @@ en: settings: Site Settings successfully changed unauthorized: You are not authorized to perform actions on this user recordings: + latest: Latest Recordings title: Server Recordings no_recordings: This server has no recordings. + search_info: Enter a user's full email or a room's uid roles: appear_in_share_list: Include users with this role in the dropdown for sharing rooms can_create_rooms: Can create rooms + can_launch_recording: Allow users with this role to record their meetings delete: Delete the role invalid_create: There was a problem creating a new role. Please check the role values and try again invalid_order: There was a problem updating the priority of the role. Please check the values and try again @@ -173,6 +176,9 @@ en: info: Gives all users moderator privileges in BigBlueButton when they join the meeting. recordings: info: Allows room owners to specify whether they want the option to record a room or not. If enabled, the moderator must still click the "Record" button once the meeting has started. + moderator_codes: + info: Allows room owners to optionally generate a moderator pin which allows other users to join directly as moderators. + title: Moderator Access Code options: disabled: Disabled enabled: Always Enabled @@ -224,6 +230,7 @@ en: cookies: cookie_info: Cookies help us deliver our services. By using our services, you agree to our use of cookies. cookie_button: I Agree + policy: For more infomation, see our privacy policy. copied: Copied copy: Copy date: @@ -263,6 +270,7 @@ en: accepted: must be accepted confirmation: doesn't match %{attribute} inclusion: is not included in the list + domain: must end with "%{email_domain}" no_provider: message: The site you are trying to access is not enabled help: Please contact your system administrator to setup Greenlight @@ -307,6 +315,7 @@ en: home_room: Home Room info_update_success: Information successfully updated. invalid_credentials: The email and password you entered did not match our records. Try again or click Forgot Password to reset your password. + invalid_credentials_external: The email and password you entered did not match our records. Please try again. invalid_login_method: Login failed due to account mismatch. You need to log in with omniauth. invite_message: "To invite someone to the meeting, send them this link:" javascript: @@ -351,6 +360,7 @@ en: info: You have been invited to your own personal space by %{name} signup_info: To signup using your email, click the button below and follow the steps. signup_link: Sign Up + valid: "The invite is valid until: %{date}" signup: info: A user that was invited has signed up to use Greenlight. admins_link: Visit the Organization Page @@ -389,7 +399,11 @@ en: title: Create New Role create_room: access_code: Access Code + moderator_access_code: Moderator Code access_code_placeholder: Generate an optional room access code + reset_access_code: Reset the optional room access code + moderator_access_code_placeholder: Generate an optional code for moderators + reset_moderator_access_code: Reset the optional code for moderators auto_join: Automatically join me into the room create: Create Room free_delete: You will be free to delete this room at any time. @@ -487,9 +501,11 @@ en: all_recordings: All Recordings email: Email Recording error: There was an error retrieving %{count} recording(s) - no_recordings: This room has no %{inject}recordings. + no_public_recordings: This room has no public recordings. + no_recordings: This room has no recordings. no_user_recordings: You currently have no recordings. - no_matched_recordings: No %{inject} recordings match your search. + no_matched_pub_recordings: No public recordings match your search. + no_matched_recordings: No recordings match your search. recorded_on: Recorded on %{date} table: name: Name @@ -499,6 +515,7 @@ en: visibility: Visibility formats: Formats visibility: + inaccessible: Inaccessible public: Public unlisted: Unlisted format: @@ -524,6 +541,7 @@ en: remove: Remove rename: Rename reset_password: + captcha: reCAPTCHA verification failed, please try again. invalid_token: Password reset token is invalid. Please try resetting your password again. subtitle: Reset Password password: New Password @@ -536,11 +554,13 @@ en: banned: Banned deleted: Deleted pending: Pending + invited: Invited user: User room: access_code_required: Please enter a valid access code to join the room add_presentation: Add Presentation copy_access: Copy Access Code + copy_moderator_access: Copy Moderator Code create_room: Create a Room create_room_error: There was an error creating the room create_room_success: Room created successfully @@ -549,6 +569,8 @@ en: success: Room deleted successfully fail: Failed to delete room (%{error}) enter_the_access_code: Enter the room's access code + enter_the_moderator_access_code: Enter the room's moderator code! + optional_moderator_access_code: "Optional Moderator Code:" invalid_provider: You have entered an invalid url. Please check the url and try again. invitation_description: You have been invited to join %{name} using BigBlueButton. To join, click the link above and enter your name. invited: You have been invited to join @@ -628,6 +650,9 @@ en: test_install: > This deployment is using a pre-configured testing server, you should replace this with your own. For details, see the %{href}. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Update verify: accept: Verify diff --git a/config/locales/es.yml b/config/locales/es.yml index 74666145..c4eefe68 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -69,6 +69,10 @@ es: regular: Regular lighten: Aclarar darken: Oscurecer + email_mapping: + info: "Asigna al usuario a un rol usando su correo electrónico. Debe estar en el formato email1=rol1,email2=rol2" + title: "Asignación de rol por correo electrónico " + update: log_level: title: Nivel de registro information: Cambiar el nivel de registro para toda la implementación @@ -90,7 +94,7 @@ es: title: Banner de mantenimiento display: Establece clear: Limpia - time: "Ejemplo: actualización programada para el 13 de diciembre a las 23:00h. Los usuarios pueden experimentar problemas para iniciar sesión." + time: "Ejemplo: actualización programada para el 13 de diciembre a las 23:00h. Los usuarios pueden experimentar problemas para iniciar sesión." preupload: info: Los usuarios pueden cargar previamente una presentación para usarla como presentación predeterminada para esa sala específica title: Permitir a los usuarios cargar previamente presentaciones @@ -106,11 +110,12 @@ es: title: Número de salas por usuario shared_access: info: "Si se establece en deshabilitado, se eliminará el botón del menú desplegable de opciones de sala, lo que evitará que los usuarios compartan salas" - title: Permitir a los usuarios compartir habitaciones + title: Permitir a los usuarios compartir salas subtitle: Personalizar Greenlight tabs: appearance: Apariencia administration: Administración + registration: Registro settings: Configuración title: Configuración del sitio web flash: @@ -133,8 +138,10 @@ es: settings: La configuración de sistema ha sido actualizada unauthorized: No está autorizado para ejecutar operaciones sobre este usuario. recordings: + latest: Grabación más reciente title: Grabaciones no_recordings: Este servidor no tiene grabaciones. + search_info: Introduce un email o un identificador de sala. roles: appear_in_share_list: Incluir usuarios con este rol en el menú desplegable para compartir salas can_create_rooms: Puede crear salas @@ -168,6 +175,9 @@ es: info: Otorga a todos los usuarios los privilegios de usuario moderador en BigBlueButton cuando se unen a la reunión. recordings: info: "Permite a los propietarios de salas especificar si desean la opción de grabar una sala o no. Si está habilitada, el moderador aún debe hacer clic en el botón \"Grabar\" una vez que haya comenzado la reunión." + moderator_codes: + info: Permite a los propietarios de salas generar opcionalmente un pin de moderador que permite a otros usuarios unirse directamente como moderadores. + title: Código de acceso como moderador options: disabled: Deshabilitada enabled: Siempre habilitada @@ -219,6 +229,7 @@ es: cookies: cookie_info: "Las cookies nos ayudan a proveer nuestros servicios. Al utilizar nuestros servicios, usted acepta nuestro uso de las cookies." cookie_button: Acepto + policy: "Para más información, consulte nuestra política de privacidad." copied: Copiada copy: Copiar date: @@ -228,12 +239,12 @@ es: delivery_error: "Ocurrió un error durante el envío de correo electrónico. Por favor, contacte con un administrador." docs: Documentación email: Cuenta de correo - email_sent: "Su %{email_type} correo electrónico ha sido enviado. (Revise su carpeta de Spam si no los ha recibido)" + email_sent: "Su %{email_type} correo electrónico ha sido enviado. (Revise su carpeta de Spam si no lo ha recibido)" enter_your_name: Introduzca su nombre errors: bigbluebutton: help: "Asegúrese de que los pasos han sido seguidos correctamente. Saber más" - message: La URL o clave secreta del servidor BigBlueButton son inválidos + message: La URL o clave secreta del servidor BigBlueButton no son válidas title: Error del servidor internal: message: Parece que algo salió mal de nuestro lado. @@ -252,11 +263,12 @@ es: messages: blank: el valor no puede estar vacío too_short: es demasiado corta - invalid: es inválida + invalid: no es válida taken: ya existe accepted: debe ser aceptado confirmation: "no coincide %{attribute}" inclusion: no está incluido en la lista + domain: "debe terminar con \"%{email_domain}\"" no_provider: message: El sitio al que está intentando acceder no se encuentra activo help: "Por favor, contacte con el administrador del sistema para configurar Greenlight" @@ -300,7 +312,8 @@ es: signout: Salir home_room: Sala principal info_update_success: Información actualizada con éxito. - invalid_credentials: El correo electrónico y contraseña introducidos no coinciden con los registros. Inténtelo de nuevo o haga clic en recuperar contraseña. + invalid_credentials: El correo electrónico y la contraseña introducidos no coinciden con los registros. Inténtelo de nuevo o haga clic en recuperar contraseña. + invalid_credentials_external: El correo electrónico y la contraseña introducidos no coinciden con los registros. Inténtelo de nuevo. invalid_login_method: El inicio de sesión falló debido a la falta de coincidencia de cuenta. Necesitas iniciar sesión con uno de los proveedores. invite_message: "Para invitar a alguien a la sesión, envíele este enlace:" javascript: @@ -342,14 +355,15 @@ es: root_link: Iniciar sesión subtitle: "Permiso de %{role} eliminado" invite: - info: "Hás sido invitado a contar con tu espacio personal por %{name}" + info: "Has sido invitado a contar con tu espacio personal por %{name}" signup_info: "Para registrarte utilizando tu cuenta de correo, haz click en el botón de abajo y sigue los pasos que se indican." signup_link: Registrarse + valid: "La invitación es válida hasta: %{date}" signup: info: Un usuario que fue invitado a registrarse ha completado su registro. admins_link: Ir a la página de la organización subject: Registro de usuario nuevo - username: "El usuario se ha registrado como%{name} con el correo electrónico %{email}. " + username: "El usuario se ha registrado como %{name} con el correo electrónico %{email}. " subject: Invitación para unirse a BigBlueButton username: "Tu nombre de usuario es %{email}." password_reset: @@ -358,7 +372,7 @@ es: message: 'Sí hiciste una solicitud para reiniciar tu contraseña, haz click en este enlace para iniciar el proceso.' reset_link: Reiniciar la contraseña expire: Este enlace expira en dos horas - ignore: Puedes ignorar este mensaje sin preocupaciones sí no haz sido tu quien solicito el cambio de contraseña. + ignore: Puedes ignorar este mensaje sin preocupaciones si no has sido tú quien solicitó el cambio de contraseña. promoted: admins_link: Ir a la página de la organización info: "Tu rol ha cambiado a %{role} en %{url}." @@ -383,7 +397,9 @@ es: title: Crear un rol nuevo create_room: access_code: Código de acceso + moderator_access_code: Código de Moderador access_code_placeholder: Generar un nuevo código de acceso + moderator_access_code_placeholder: Generar un código opcional para los moderadores auto_join: Envíame a la sala automáticamente cuando empiece ls sesión create: Crear sala free_delete: Podrás eliminar la sala en el momento que quieras @@ -391,11 +407,11 @@ es: not_blank: El nombre de la sala no puede estar vacío title: Crear una sala nueva delete_account: - confirm: "¿Estas seguro de querer eliminar esta cuenta de usuario?" + confirm: "¿Estás seguro de querer eliminar esta cuenta de usuario?" delete: Estoy seguro de eliminar ésta cuenta - keep: "De hecho, la conserbaré" + keep: "De hecho, la conservaré" delete_warning: Esta acción desactiva la cuenta de usuario. Todos los usuarios desactivados son listados en la pestaña de eliminados. - warning: "Esta decisión es final, No podrás recuperar la información asociada" + warning: "Esta decisión es definitiva, No podrás recuperar la información asociada" delete_rec: delete: "Estoy seguro, elimina esta grabación" header: "¿Estás seguro de eliminar esta grabación?" @@ -441,7 +457,7 @@ es: rename_room: name_placeholder: Introduce un nuevo nombre para la sala... share_access: - footer: Compartir una sala con un usuario Lesser permite iniciar la sala y ver las grabaciones de la sala. + footer: Compartir una sala con un usuario permite iniciar la sala y ver las grabaciones de la sala. list: Compartido con title: Compartir acceso a sala save: Guardar cambios @@ -454,7 +470,7 @@ es: to: Cuenta principal save: Fusionar footer: Las salas de la cuenta que se fusionará se transferirán a la lista de salas de la cuenta principal y luego se eliminará la cuenta. - name_update_success: El nombre de la sala ha sido actualizado exitósamente + name_update_success: El nombre de la sala ha sido actualizado correctamente no_user_email_exists: "No hay ningún usuario existente con el correo electrónico especificado. Por favor, asegúrese de que lo escribió correctamente." omniauth_error: Ocurrió un error al intentar autentificar usando OmniAuth. ¡Inténtelo de nuevo o contacte con un administrador! omniauth_specific_error: "Error %{error} al intentar autenticación usand OmniAuth. ¡Inténtelo de nuevo o contacte con un administrador!" @@ -472,6 +488,7 @@ es: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: Oh no! La respuesta de tu reCAPTCHA falló. Intentalo de nuevo. @@ -486,12 +503,13 @@ es: recorded_on: "Grabada el %{date}" table: name: Nombre - thumbnails: Imagenes miniatura + thumbnails: Miniaturas length: Duración users: Usuarios visibility: Visibilidad formats: Formatos visibility: + inaccessible: Inaccesible public: Pública unlisted: No listada format: @@ -512,12 +530,13 @@ es: twitter_signup: El registro de nuevas cuentas con Twitter es obsoleto. Por favor utiliza un método de autenticación diferente para registrarte. merge_success: Tu cuenta vinculada a Twitter se fusionó correctamente con tu cuenta nueva. La cuenta vinculada con Twitter ha sido eliminada. invite: - fail: "Tu código ha expirado o es invalido. Sí tu crees que este es un error, contacta al administrador del sistema." - no_invite: No tienes una invitación para ingresar. Contacta al administrador del sistema para obtener una. + fail: "Tu código ha expirado o no es valido. Sí crees que se trata de un error, contacta al administrador del sistema." + no_invite: No tienes una invitación para unirte. Contacta al administrador del sistema para obtener una. remove: Eliminar rename: Cambiar nombre reset_password: - invalid_token: El token de restablecimiento de contraseña no es válido. Intente restablecer su contraseña nuevamente. + captcha: "La verificación reCAPTCHA ha fallado, intentalo de nuevo." + invalid_token: El token de restablecimiento de contraseña no es válido. Intente restablecer su contraseña de nuevo. subtitle: Reiniciar contraseña password: Nueva contraseña confirm: Confirmación de nueva contraseña @@ -529,11 +548,13 @@ es: banned: Bloqueado deleted: Eliminado pending: Pendiente + invited: Invitado user: Usuario room: access_code_required: Introduce un código de acceso válido para unirse a la sala add_presentation: Añadir presentación copy_access: Copiar código de acceso + copy_moderator_access: Copiar código de moderador create_room: Crear una sala create_room_error: Ocurrió un error al crear la sala create_room_success: La sala fue creada exitósamente @@ -542,8 +563,10 @@ es: success: Sala eliminada correctamente fail: "Se ha producido un error al eliminar la sala (%{error})" enter_the_access_code: Introduce el código de acceso de la sala + enter_the_moderator_access_code: ¡Introduzca el código de moderador de la sala! + optional_moderator_access_code: "Código opcional de moderador:" invalid_provider: El enlace introducido no es válido. Revísalo e inténtalo de nuevo. - invitation_description: "Ha sido invitado a unirse a %{name} usando BigBlueButton. Para unirse, haga clic en el enlace superior e introduzca su nombre." + invitation_description: "Ha sido invitado a unirse a %{name} usando BigBlueButton. Para unirse, haga clic en el enlace superior e introduzca su nombre." invited: Ha sido invitado a unirse recording_present: Reconozco que esta sesión se va a grabar. Esto puede incluir mi voz y vídeo si está habilitado. invite_participants: Invitar participantes @@ -567,8 +590,8 @@ es: preupload_remove_success: Eliminación de presenación correcta preupload_remove_error: Ha habido un error eliminando la presentación de la sala recordings: Grabaciones de sala - room_limit: Haz alcanzado el número límite de salas permitidas - room_limit_exceeded: "Haz alcanzado el número límite de salas permitidas. Por favor elimina %{difference} sala(s) para poder acceder a ésta." + room_limit: Has alcanzado el número límite de salas permitidas + room_limit_exceeded: "Has alcanzado el número límite de salas permitidas. Por favor elimina %{difference} sala(s) para poder acceder a ésta." sessions: Sesiones settings: Configuración de sala share: Gestionar acceso @@ -578,13 +601,13 @@ es: shared_access_success: Sala compartida correctamente shared_access_error: Ha habido un error compartiendo la sala start: Iniciar - search: Buscar por grupo... - unavailable: Esta sala no se encuentra disponible debido a que la cuenta de correo de su propietario no ha sido verificado. + search: Buscar por sala... + unavailable: Esta sala no se encuentra disponible debido a que la cuenta de correo de su propietario no ha sido verificado. update_settings_error: Ocurrió un error al actualizar la configuración de la sala update_settings_success: La configuración de la sala fue actualizada exitósamente wait: message: La sesión todavía no ha comenzado. - auto: Serás enviado a la sala automáticamente cuando empiece ls sesión + auto: Serás enviado a la sala automáticamente cuando empiece la sesión settings: account: fullname: Nombre completo @@ -597,7 +620,7 @@ es: title: Información de la cuenta reset_password: Restablecer contraseña de usuario delete: - button: "Si, me gustaría eleiminar mi cuenta de usuario." + button: "Sí, me gustaría eliminar mi cuenta de usuario." disclaimer: "Sí elijes eliminar tu cuenta de usuario, NO podrá ser recuperada. Toda la información relacionada con tu cuenta, incluyendo configuración, salas y grabaciones, será eliminada." subtitle: Eliminar la cuenta de forma permanente title: Eliminar cuenta @@ -620,6 +643,9 @@ es: title: Términos y condiciones test_install: > Esta instalación esta haciendo uso del servidor para pruebas que viene pre-configurado. Debería ser substituido con tu propio servidor. Para más detalles vea %{href}. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Actualizar verify: accept: Verificar diff --git a/config/locales/fa_IR.yml b/config/locales/fa_IR.yml index 246064d2..c5a65d73 100644 --- a/config/locales/fa_IR.yml +++ b/config/locales/fa_IR.yml @@ -40,7 +40,7 @@ fa_IR: branding: change: تغییر تصویر info: تغییر تصویر شخصی سازی که در گوشه بالای سمت چپ به نمایش در می آید - placeholder: ادرس تصویر ... + placeholder: آدرس تصویر ... title: تصویر شخصی سازی invalid: نشانی وب نامعتبر است legal: @@ -56,66 +56,71 @@ fa_IR: title: سیاست حریم خصوصی invalid: نشانی وب نامعتبر است cache: - info: کش ارائه دهنده ذخیره شده را حذف می کند تا اجبار به یک درخواست جدید برای اطلاعات به روز رسانی شده کند - title: پاک کردن کش ارائه دهنده - button: پاک کردن کش + info: حافظه نهان ارائه دهنده ذخیره شده را حذف می کند تا اجبار به یک درخواست جدید برای اطلاعات به روز رسانی شده کند + title: پاک کردن حافظه نهان ارائه دهنده + button: پاک کردن حافظه نهان clear_auth: info: احراز هویت کننده کنونی را پاک می کند تا به کاربران مجوز ورود مجدد با روش احراز هویت دیگری را بدهد title: پاک کردن احراز هویت کننده button: "پاک کردن احراز هویت " color: - info: تغییر مرتب رنگ هم میزان روشنایی و هم میزان تاریکی را تغییر می دهد. روشنایی و تاریکی به صورت مجزا می توانند تغییرکنند. + info: تغییر مرتب رنگ هم میزان روشنایی و هم میزان تاریکی را تغییر می دهد. روشنایی و تاریکی به صورت مجزا می توانند تغییر کنند. title: رنگ اصلی - regular: منظم + regular: معمولی lighten: روشن تر - darken: تیره + darken: تیره تر + email_mapping: + info: "بر اساس قالب ایمیل کاربران، نقشی را به آن‌ها بدهید. باید در قالب email1=role1,email2=role2 باشد." + title: دادن نقش براساس قالب ایمیل + update: log_level: - title: سطح لاگ گیری - information: تغییر سطح لاگ گیری برای همه نصب ها - debug: دیباگ + title: سطح گزارش گیری + information: تغییر سطح گزارش گیری برای همه نصب ها + debug: عیب یابی info: اطلاع رسانی - warn: سطح خطای متوسط + warn: هشدار error: خطا fatal: خطای بحرانی - unknown: نا مشخص + unknown: نامشخص recording_visibility: info: اعمال وضعیت نمایش جلسات ضبط شده جدید title: وضعیت نمایش پبش فرض جلسات ضبط شده - warning: این تنظیم تنها به جلساتی که در حال اجرا نیستند اعمال خواهد شد + warning: این تنظیم تنها بر جلساتی که در حال اجرا نیستند اعمال خواهد شد require_consent: info: این تنظیم، یک تنظیم به تنظم اتاق اضافه می‌کند تا مالک‌های اتاق مشخص کنند کدام یک از اتاق‌ها قابلیت ضبط دارند. کاربرانی که به یک اتاق در حال ضبط اضافه می‌شوند، باید قبل از ورود رضایت بدهند. - title: برای ضبط نیاز به رضایت مالک و اعضا هست + title: برای ضبط نیاز به رضایت مالک و اعضا است maintenance_banner: - info: نمایش یک بنر برای اطلاع دادن کاربران از یک تعمیراز قبل برنامه‌ریزی شده - title: بنر تعمیر + info: نمایش یک آگهی برای اطلاع کاربران از یک تعمیر از قبل برنامه‌ریزی شده + title: آگهی تعمیر display: تنظیم clear: پاک کردن - time: "برای نمونه: یک به‌روزرسانی در تاریخ ۲۳ آذر ساعت ۲۳:۰۰ قرار است رخ بدهد. کاربران ممکن است در ورود به سایت دچار اختلال شوند." + time: "برای نمونه: یک به‌روزرسانی در تاریخ ۲۳ آذر ساعت ۲۳:۰۰ قرار است رخ بدهد. کاربران ممکن است در ورود به سایت دچار اختلال شوند." preupload: info: کاربران می‌توانند برای یک اتاق مشخص، از قبل یک ارائه بارگذاری کنند به عنوان ارئه پیشفرض title: به کاربران اجازه بده تا ارائه‌های خود را از پیش بارگذاری کنند registration: - info: تغییر روشی که کاربران در وب سایت ثبت نام میکنند - title: روش تبت نام + info: تغییر روشی که کاربران در وبگاه ثبت نام می کنند. + title: روش ثبت نام methods: approval: تایید/رد - invite: پیوستن توسط دعوت نامه + invite: عضویت با دعوت نامه open: باز کردن ثبت نام rooms: info: ایجاد محدودیت برای تعداد اتاق هایی که یک کاربر می تواند داشته باشد (شامل اتاق خانه). این تنظیم به مدیران اعمال نخواهد شد. - title: تعداد اتاق ها به ازاء کاربر + title: تعداد اتاق ها به ازای کاربر shared_access: - info: تنظیمات غیر فعال سازی، دکمه انتخاب گرینه ها را از اتاق حذف می کند تا کاربران را از به اشتراک گذازی اتاق ها منع کند + info: تنظیمات غیر فعال سازی، دکمه انتخاب گزینه ها را از اتاق حذف می کند تا کاربران را از به اشتراک گذازی اتاق ها منع کند title: امکان اشتراک گذاری اتاق ها به کاربران عادی subtitle: شخصی سازی گرینلایت tabs: appearance: ظاهر administration: مدیریت + registration: ثبت‌ نام settings: تنظیم‌ها title: تنظیمات سایت flash: - approved: کاربر با موفقیت تایید شد - banned: کاربر با موفقیت منع شد + approved: کاربر با موفقیت تایید شد. + banned: کاربر با موفقیت منع شد. unbanned: کاربر با موفقیت رفع ممنوعیت شد. delete: کاربر با موفقیت حذف شد delete_fail: حذف کاربر با خطا مواجه شد @@ -127,17 +132,20 @@ fa_IR: perm_deleted: کاربر به صورت کامل حذف شد promoted: کاربر با موفقیت ارتقا نقش داده شد registration_method_updated: روش ثبت نام با موفقیت به روز رسانی شد - reset_password: ایمیلی به منظور بازیابی رمز عبور ارسال شد. (لطفا از کاربران بخواهید در صورت عدم دریافت ایمیل پوشه اسپم خود را در چک کنند) + reset_password: ایمیلی به منظور بازیابی رمز عبور ارسال شد. (لطفا از کاربران بخواهید در صورت عدم دریافت ایمیل پوشه هرزنامه خود را بررسی کنند) restored: کاربربا موفقیت بازیابی شد room_configuration: پیکربندی اتاق با موفقیت تغییر یافت settings: تنظیمات سایت با موفقیت تغییر یافت unauthorized: شما مجاز به انجام این عمل روی این کاربر نیستید recordings: + latest: آخرین جلسه‌های ضبط شده title: جلسات ضبط شده سرور no_recordings: در سرور جلسه ضبط شده ای وجود ندارد. + search_info: ایمیل کامل کاربر یا شناسه اتاق را وارد کنید roles: appear_in_share_list: دادن مجوز اشتراک اتاق ها به کاربرانی که این نقش را دارند can_create_rooms: امکان ایجاد اتاق برای کاربر + can_launch_recording: به کاربران دارای این نقش اجازه بده جلساتشان را ضبط کنند delete: حذف نقش کاربری invalid_create: خطایی در ایجاد نقش جدید رخ داد. لطفا مقادیر نقش ها را بررسی کرده و دوباره تلاش کنید invalid_order: خطایی در به روز رسانی اولویت نقش رخ داد، لطفا مقادیر را بررسی کرده و دوباره تلاش کنید @@ -145,10 +153,10 @@ fa_IR: manage_rooms_recordings: دادن مجوز برای مدیریت اتاق های سرور و رکورد ها به کاربرانی که این نقش را دارند name: نام نقش new_role: ایجاد نقش جدید - role_has_users: "این نقش به حساب های کاربری %{user_count} داده شد. لطفا از حذف همه حساب های کاربری از این نقش، قبل از حذف آن اطمینان حاصل کیند" + role_has_users: "این نقش به حساب های کاربری %{user_count} داده شد. لطفا از حذف همه حساب های کاربری از این نقش، قبل از حذف آن اطمینان حاصل کنید." title: نقش ها - promote_email: ارسال ایمیل به کاربران زمانیکه این نقش به آنها داده می شود - demote_email: ارسال ایمیل به کاربران، زمانیکه این نقش از آنها گرفته می شود + promote_email: ارسال ایمیل به کاربران زمانی که این نقش به آنها داده می شود + demote_email: ارسال ایمیل به کاربران، زمانی که این نقش از آنها گرفته می شود edit_site_settings: دادن مجوز ویرایش تنظیمات به کاربرانی که این نقش را دارند edit_roles: دادن مجوز ویرایش سایر نقش ها به کاربرانی که این نقش را دارند manage_users: دادن مجوز مدیریت کاربران به کاربرانی که این نقش را دارند @@ -168,16 +176,20 @@ fa_IR: info: همه کاربران در هنگام پیوستن به جلسه، تمام دسترسی‌های مدیر را در بیگ بلو باتن داده می‌شود. recordings: info: به مالک‌های اتاق‌ این قابلیت را می‌دهد تا مشخص کنند آیا گزینه‌ی ضبط اتاق را می‌خواهند یا نه.اگر فعال باشد، ناظم همچنان باید روی دکمه‌ی «ضبط» کلیک کند وقتی جلسه شروع شد. + moderator_codes: + info: به مالکین اتاق‌های این اجازه داده می‌شود تا به صورت دلخواه یک پین تولید کنند تا بتوانند به بقیه کاربرها این اجازه را بدهند که به صورت مستقیم به عنوان مدیر جلسه وارد شوند. + title: کد دسترسی مدیر options: - disabled: غیرفعال شده - enabled: همیشه فعال شود + disabled: غیر فعال + enabled: همیشه فعال optional: اختیاری rooms: + timeout: "به علت وقفه در درخواست خدمتگزار %{server}، ممکن است اطلاعات وضعیت و شرکت کنندگان دقیق نباشد" title: اتاق های سرور table: ended: "به پایان رسید: %{session}" id: شناسه - not_running: در حال اجرا نبودن + not_running: در حال اجرا نیست participants: شركت كنندگان running: در حال اجرا started: "شروع شده: %{session}" @@ -201,62 +213,66 @@ fa_IR: undelete: لغو پاک کردن table: authenticator: احراز کننده هویت - created: ایجاد شده + created: زمان ایجاد + time: زمان ارسال name: نام not_found: کاربری متناسب با جستجوی شما یافت نشد no_users: کاربری یافت نشد role: نقش uid: شناسه کاربری username: نام کاربری + valid: معتبر title: مدیریت کاربران add_to_google_calendar: "افزودن تقویم گوگل" bigbluebutton: بیگ بلو باتن - bigbluebutton_exception: اوپس، خطایی در هنگام شروع جلسه رخ داده است! + bigbluebutton_exception: آه، خطایی در هنگام شروع جلسه رخ داده است! cancel: لغو cookies: cookie_info: کوکی ها به ما کمک میکنند تا خدمات خود را ارائه دهیم. با استفاده از این خدمات، شما با استفاده از کوکی های ما موافقت میکنید. cookie_button: موافق هستم - copied: کپی شد - copy: کپی + policy: "برای اطلاعات بیشتر سیاست حریم خصوصی ما را ببینید." + copied: رونوشت شد + copy: رونوشت date: - month_names: [~, ژانویه, فوریه, مارچ, اوریل, می, ژوئن, جولای, آگوست, سپتامبر, اکتبر, نوامبر, دسامبر] + month_names: [~, ژانویه, فوریه, مارس, آپریل, می, ژوئن, جولای, آگوست, سپتامبر, اکتبر, نوامبر, دسامبر] default_admin: "شما هنوز از رمز عبور پیش فرض استفاده میکنید. لطفا برای تغییر آن اینجا را کلیک کنید" delete: حذف delivery_error: خطایی در هنگام تحویل ایمیل رخ داده است، لطفا با مدیر تماس بگیرید! docs: مستند سازی email: ایمیل - email_sent: "%{email_type} ایمیل شما ارسال شد! (لطفا در صورت عدم دریافت آن پوشه اسپم خود را بررسی کنید)" + email_sent: "%{email_type} ایمیل شما ارسال شد! (لطفا در صورت عدم دریافت آن پوشه هرزنامه خود را بررسی کنید)" enter_your_name: نام خود را وارد کنید! errors: bigbluebutton: help: "لطفا مطمئن شوید که قدم های درست برداشته شده اند. بیشتر بیاموزید" - message: ادرس و رمز نادرست بیگ بلو باتن + message: آدرس و رمز نادرست بیگ بلو باتن title: خطای سرور internal: message: به نظر می رسد چیزی سمت ما به مشکل بر خورده است help: خطا لاگ شده است، ما نگاهی به آن خواهیم انداخت! report: گزارش خرابی maintenance: - message: متاسفانه بابت نگهداشت سیستم در دسترس نیست - help: به زودی بر میگردیم + message: سامانه در دست تعمیر است. + help: به زودی برمی‌گردیم migration_error: contact_admin: اگر شما مدیر نیستید، لطفا با یک مدیر تماس بگیرید. - continue: ما تمایل به ماندن در نسخه 1.0 را دارم. + continue: تمایل به ماندن در نسخه 1.0 را دارم. notice: > - خطایی در انتقال دیتابیس گرین لایت رخ داده است.
این ممکن است به دلیل این باشد که شما به نسخه 2.0 گرین لایت به روز رسانی نکرده اید. + خطایی در انتقال پایگاه داده گرین لایت رخ داده است.
علت می تواند این باشد که شما به نسخه 2.0 گرین لایت به‌روزرسانی نکرده اید. upgrade: به من نشان بده چگونه به نسخه 2.0 به روز رسانی کنم! version: ما یک نسخه جدید از گرین لایت را منتشر کرده ایم، اما پایگاه داده شما با آن سازگاری ندارد. messages: - blank: نمیتواند خالی باشد + blank: نمی‌تواند خالی باشد too_short: بسیار کوتاه است invalid: معتبر نیست taken: از قبل گرفته شده است - accepted: میبایست تایید شود + accepted: می‌بایست تایید شود confirmation: "با %{attribute} تطابق ندارد" inclusion: در لیست قرار داده نشده است + domain: "باید به «%{email_domain}» ختم شود" no_provider: - message: سایتی که شما تلاش به دسترسی به آن را دارید فعال نیست - help: لطفا برای پیکربندی برنامه با مدیر سیستم تماس بگیرید + message: سایتی که می‌خواهید به آن دسترسی داشته باشید فعال نیست + help: لطفا برای پیکربندی برنامه با مدیر سامانه تماس بگیرید not_found: message: متاسفانه، صفحه ای که دنبال آن میگردید وجود ندارد. help: آیا ممکن است حذف شده باشد؟ @@ -265,7 +281,7 @@ fa_IR: message: متاسفانه، این کاربر ثبت نام نکرده است user_missing: help: لطفا لینک ارسال شده را تایید و دوباره تلاش کنید - message: ادرسی که شما وارد کرده اید معتبر نیست + message: آدرسی که شما وارد کرده اید معتبر نیست title: خطاها unauthorized: message: شما امکان دسترسی به این برنامه را ندارید @@ -293,55 +309,57 @@ fa_IR: account_settings: سازمان help: نیاز به کمک دارید؟ home: خانه - settings: پروفایل + settings: نمایه signout: خروج home_room: اتاق خانه - info_update_success: اطلاعات با موفقیت بارگزاری شد - invalid_credentials: ایمیل و رمز عبوری که وارد کرده اید با سیستم ما انطباق ندارد، دوباره تلاش کنید یا روی بازیابی رمز عبور کلیک کنید تا رمز عبورتان را زیست کنید + info_update_success: اطلاعات با موفقیت بارگذاری شد. + invalid_credentials: ایمیل یا رمز عبوری که وارد کرده اید اشتباهند. دوباره تلاش کنید یا روی بازیابی رمز عبور کلیک و رمز عبورتان را عوض کنید. + invalid_credentials_external: ایمیل و کلمه عبوری که وارد کرده‌اید اشتباهند. لطفا بعدا دوباره تلاش کنید. invalid_login_method: ورود به دلیل عدم تطابق حساب کاربری با خطا مواجه شد. شما می بایست توسط مکانیزم omniauth وارد شوید. - invite_message: "برای دعوت کسی به جلسه، این ادرس را برای آنها بفرستید" + invite_message: "برای دعوت دیگران به جلسه، این آدرس را برای آنها بفرستید:" javascript: room: mailer: subject: 'شما را برای مشاهده جلسه ضبط شده دعوت کرده است.' - body: 'برای مشاهده ضبط جلسات، از ادرس زیر استفاده کنید' - autogenerated: 'این ایمیل به صورت خودکار توسط بیگ بلو باتن تولید شده است' - footer: 'بیگ بلو باتن یک برنامه کنفرانس وبی متن باز است، برای اطلاعات بیشتر به بیگ بلو باتن در ادرس https://bigbluebutton.org/ مراجعه کنید.' + body: 'برای مشاهده ضبط جلسات، از آدرس زیر استفاده کنید:' + autogenerated: 'این ایمیل به صورت خودکار توسط بیگ بلو باتن تولید شده است.' + footer: 'بیگ بلو باتن یک برنامه نشست وبی متن باز است، برای اطلاعات بیشتر به بیگ بلو باتن به آدرس https://bigbluebutton.org مراجعه کنید.' search: - start: در حال جستجو... + start: آغاز جستجو ... landing: - about: "%{href} یک واسط کاربری ساده برای استفاده از سرور کنفرانس وبی متن باز بیگ بلو باتن است. شما می توانید اتاق هایی برای میزبانی جلسات خود یا پیوستن به جلسات دیگران از طریق ادرس آنها، ایجاد کنید." - welcome: به بیگ بلو باتن خوش آمدید - video: ویدئوی آموزشی ما را در مورد استفاده از گرین لایت مشاهده کنید + about: "%{href} یک واسط کاربری ساده برای استفاده از برنامه نشست وبی متن باز بیگ بلو باتن است. شما می توانید اتاق هایی برای میزبانی جلسات ایجاد کنید یا با یک پیوند کوتاه به جلسات دیگر بپیوندید." + welcome: به بیگ بلو باتن خوش آمدید. + video: ویدیوی آموزشی ما را در مورد استفاده از گرین لایت مشاهده کنید upgrade: به من نشان بده چگونه به نسخه 2.0 به روز رسانی کنم! version: ما یک نسخه جدید از گرین لایت را منتشر کرده ایم، اما پایگاه داده شما با آن سازگاری ندارد. language_default: پیشفرض (زبان مرورگر) ldap_error: امکان دسترسی به سرور LDAP وجود ندارد. لطفا تنظیمات LDAP خود را در فایل env بررسی کرده و مطمئن شوید سرور در حال اجرا است. login: ورود - login_title: به حساب کاربری تان وارد شوید + login_title: به حساب خود وارد شوید mailer: user: approve: info: حساب کاربری شما تایید شده است. - signin: برای دسترسی به اتاق های شخصی خود، روی دگمه زیر کلیک کرده و وارد شوید. + signin: برای دسترسی به اتاق های شخصی خود، روی دکمه زیر کلیک کرده و وارد شوید. signin_link: ورود signup: - info: یک کاربر جدید در گرین لایت ثبت نامه کرده است + info: یک کاربر جدید در گرین لایت ثبت نام کرده است. more-info: برای داشتن مجوز دسترسی برای این کاربر به گرین لایت، شما می بایست حساب کاربری آن ها را در تنظیمات سازمان تایید کنید. admins_link: مشاهده صفحه سازمان subject: ثبت نام کاربر جدید گرین لایت - username: "کاربر با نام %{name} و ادرس ایمیل %{email} ثبت نام کرده است." + username: "کاربر با نام %{name} و آدرس ایمیل %{email} ثبت نام کرده است." subject: حساب کاربری تایید شد username: "نام کاربری شما %{email} است." demoted: - info: "شما دیگر یک %{role} برای %{url} نیستید" + info: "شما دیگر یک %{role} برای %{url} نیستید." more-info: شما در حال حاضر مجوزات یک کاربر عادی را دارید root_link: ورود subtitle: "مجوزات %{role} گرفته شد" invite: info: "شما به فضای شخصی خود توسط %{name} دعوت شده اید" - signup_info: برای ثبت نام از طریق ادرس ایمیلتان، روی دکمه زیر کلیک کرده و مراحل را انجام دهید. + signup_info: برای ثبت نام از طریق آدرس ایمیلتان، روی دکمه زیر کلیک کرده و مراحل را انجام دهید. signup_link: ثبت نام + valid: "این دعوت تا %{date} معتبر خواهد بود." signup: info: کاربری که دعوت کرده بودید برای استفاده از گرین لایت ثبت نام کرده است. admins_link: صفحه سازمان را مشاهده کنید @@ -352,91 +370,97 @@ fa_IR: password_reset: title: 'بازنشانی رمز عبور' welcome: "درخواست تغییر رمز عبور برای ایمیل %{email} داده شده است" - message: 'اگر شما درخواست تغیر رمز عبور داده اید، پس لطفا روی لینک زیر برای تغییر رمز عبور کلیک کنید' + message: 'اگر شما درخواست تغییر رمز عبور داده اید، پس لطفا روی پیوند زیر برای تغییر رمز عبور کلیک کنید:' reset_link: رمز عبور را بازنشانی کن - expire: این ادرس در دو ساعت آینده خاتمه خواهد یافت. - ignore: اگر شما این درخواست را نداده اید، می توانید این ایمیل را نادیده بگیرید + expire: این آدرس در دو ساعت آینده منقضی خواهد شد. + ignore: اگر شما این درخواست را نداده اید، می توانید این ایمیل را نادیده بگیرید. promoted: admins_link: مشاهده صفحه شرکت - info: "شما الان %{role} برای %{url} هستید" + info: "شما الان %{role} برای %{url} هستید." more-info: "برای مشاهده توانایی هایتان لطفا %{url} را مشاهده کنید" subtitle: "دسترسی های %{role} داده شد" verify_email: welcome: "%{name}! به فضای شخصی خود خوش آمده اید." success: "با استفاده از %{bigbluebutton}، شما میتوانید اتاق های شخصی برای میزبابی جلسات و همکاری با دیگران برای خود ایجاد کنید." username: "نام کاربری شما %{email} است." - verify: برای تایید حساب کاربری خود، تنها کافی است روی دگمه زیر کلیک کنید. + verify: برای تایید حساب کاربری خود، تنها کافی است روی دکمه زیر کلیک کنید. verify_text: 'برای تایید حساب کاربری خود، تنها کافی است از زیر استفاده کنید: %{url}' verify_link: حساب کاربری را تایید کنید thanks: با تشکر از پیوستن شما و روز خوبی داشته باشید! - max_concurrent: به سقف مجاز تعداد بیشینه جلسات همزمان رسیده اید! + max_concurrent: به سقف بیشینه تعداد جلسات همزمان رسیده اید! merged: ادغام شده modal: create_role: create: ایجاد یک نقش جدید footer_text: شما می توانید مجوزات این نقش را بعد از ایجاد ویرایش کنید name_placeholder: وارد کردن نام یک نقش - not_blank: نام نقش نمیتواند خالی باشد + not_blank: نام نقش نمی‌تواند خالی باشد title: ایجاد یک نقش جدید create_room: access_code: کد دسترسی + moderator_access_code: کد مدیر جلسه access_code_placeholder: ایجاد کد دسترسی اختیاری برای جلسه + moderator_access_code_placeholder: ایجاد کد اختیاری برای مدیران جلسه auto_join: به صورت خودکار من را وارد جلسه کن create: ایجاد اتاق - free_delete: شما به صورت دلخواه مجاز به حذف این اتاق در هر زمانی هستید. - name_placeholder: نام یک اتاق را وارد کنید... + free_delete: می توانید هر موقع این اتاق را حذف کنید. + name_placeholder: یک نام برای اتاق وارد کنید... not_blank: نام اتاق نمی تواند خالی باشد. title: ایجاد اتاق جدید delete_account: confirm: آیا مطمئنید که می خواهید این حساب کاربری را حذف کنید؟ delete: من مطمئنم، این حساب کاربری را حذف کن. - keep: در واقع، ترجیح میدم نگهش دارم. - delete_warning: این حساب کاربری را غیرفعال می کند. لیست تمام کاربرات غیر فعال را می توانید در تب حذف شده ها مشاهده کنید - warning: این تصمیم نهایی است. شما امکان بازیابی داده های مرتبط را نخواهید داشت + keep: در واقع، ترجیح می‌دهم آن را نگه دارم. + delete_warning: این حساب کاربری را غیرفعال خواهد کرد. لیست تمام کاربران غیر فعال را می توانید در سربرگ حذف شده ها مشاهده کنید. + warning: این تصمیم نهایی است. شما امکان بازیابی داده های مرتبط را نخواهید داشت . + delete_rec: + delete: بلی اطمینان دارم، این جلسه ضبط شده را حذف کن. + header: آیا از حذف این جلسه‌ی ضبط شده اطمینان دارید؟ + warning: امکان بازیابی این ضبط وجود نخواهد داشت delete_room: confirm: "آیا شما مطمئنید که می خواهید اتاق %{room} را حذف کنید؟" delete: من مطمئنم، این اتاق را حذف کن. - keep: با فکر کردن مجدد، من نگهش میدارم. + keep: نظرم عوض شد، آن را نگه می دارم. warning: شما قادر به بازیابی جلسه نخواهید بود recording_warning: "یا هر کدام از %{recordings_num} جلسات مربوطه" invite_user: email_placeholder: ایمیل کاربران را وارد کنید (توسط کاما از هم جدا شده) - footer: کاربر ایمیلی شامل دستورالعمل چگونگی ثبت نام را دریافت خواهد کرد + footer: کاربر، ایمیلی شامل دستورالعمل چگونگی ثبت نام را دریافت خواهد کرد send: ارسال دعوت نامه title: دعوت کاربر login: or: یا with: "ورود با %{provider}" - forgot_password: رمز عبور خود را فراموش کرده اید؟ + forgot_password: رمز عبور خود را فراموش کرده‌اید؟ preupload: change: تعویض ارائه - choose: یک فایل انتخاب کنید... + choose: یک پرونده انتخاب کنید... current: "ارائه فعلی:" - footer: با توجه به سایز ارائه ممکن است زمان بیشتری برای بارگذاری صرف شود تا قابل استفاده شود. - invalid: سایز یا نوع فایل اشتباه است. لطفا محدودیت‌های زیر را مشاهده کنید. + footer: با توجه به حجم ارائه ممکن است زمان بیشتری برای بارگذاری صرف شود تا قابل استفاده شود. + invalid: حجم یا نوع فایل اشتباه است. لطفا محدودیت‌های زیر را ببینید. title: اضافه کردن ارائه use: از ارائه استفاده بکن rename_recording: remove_shared: title: آیا مطمئنید که می خواهید این اتاق را از لیست اتاق هایتان حذف کنید؟ - delete: من مطمئنم، این اتاق را حذف کن + delete: من مطمئنم، این اتاق را حذف کن. warning: شما دیگر امکان دسترسی به این اتاق را نخواهید داشت room_settings: title: تنظیمات اتاق - update: به روز رسانی اتاق - client: انتخاب نوع کلاینت - join_moderator: تمام کاربران به عنوان مدیر وارد می شوند - mute: کاربران هنگام ورود به صورت بی صدا وارد شدند - require_approval: نیازمند موافقت مدیر قبل از ورود می باشد + update: به‌روزرسانی اتاق + client: انتخاب نوع مشتری + join_moderator: تمام کاربران به عنوان مدیر وارد شوند + mute: کاربران هنگام پیوستن به صورت بی‌صدا وارد شوند + require_approval: به موافقت مدیر قبل از ورود نیاز است start: هر کاربری اجازه شروع این جلسه را دارد - footer_text: تنظیمات مربوط به اتاق شما در هر زمانی قابل انجام خواهد بود. + footer_text: تنظیمات اتاق شما در هر زمانی قابل انجام است. recording: اجازه می‌دهم اتاق ضبط شود rename_room: - name_placeholder: وارد کردن نام اتاق جدید... + name_placeholder: یک نام جدید برای اتاق وارد کنید... share_access: - footer: اشتراک گذاری یک اتاق با یک کاربر به آن اجازه می دهد تا جلسه را شروع کرده و رکورد های اتاق را مشاهده کند. - list: اشتراک گذاری شده با - title: اشتراک دسترسی های اتاق + footer: اشتراک اتاق با یک کاربر به او اجازه می دهد تا جلسه را شروع و ضبط های آن را مشاهده کند. + list: اشتراک‌گذاری شده با + title: اشتراک دسترسی‌های اتاق save: ذخیره تغییرات cancel_changes: لغو تغییرات select: انتخاب کاربر @@ -448,9 +472,9 @@ fa_IR: save: ادغام footer: اتاق های حساب کاری که با آن ادغام می شود، به حساب کاربری حساب اولیه منتقل شده و سپس حساب کاربری حذف می شود. name_update_success: نام اتاق با موفقیت تغییر یافت! - no_user_email_exists: کاربری با ایمیل مشخص شده وجود ندارد. لطفا مطمئن شوید آن را درست تایپ کرده اید. + no_user_email_exists: کاربری با ایمیل مشخص شده وجود ندارد. لطفا مطمئن شوید آن را درست نوشته اید. omniauth_error: خطایی در هنگام احراز هویت با مکانیزم omniauth به وجود آمده است. لطفا دوباره تلاش کنید یا با مدیر تماس بگیرید! - omniauth_specific_error: "خطای %{error} هنگام احراز هویت با omniauth رخ داده است، لطفا دوباره تلاش کنید تا با مدیر سیستم تماس بگیرید" + omniauth_specific_error: "خطای %{error} هنگام احراز هویت با omniauth رخ داده است، لطفا دوباره تلاش کنید تا با مدیر سامانه تماس بگیرید!" pagy: nav: prev: "‹ قبلی" @@ -462,82 +486,92 @@ fa_IR: password_different_notice: تاییدیه رمز عبور با رمز ارائه شده مطابقت ندارد. provider: google: گوگل - office365: افیس 365 + office365: آفیس ۳۶۵ twitter: توییتر ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: - recaptcha_unreachable: اوپس، ما در دریافت پاسخ احراز هویت از reCAPTCHA به مشکل بر خوردیم. لطفا دوباره تلاش کنید. + recaptcha_unreachable: آه، ما در دریافت پاسخ احراز هویت از reCAPTCHA به مشکل برخوردیم. لطفا دوباره تلاش کنید. verification_failed: احراز هویت reCAPTCHA به مشکل برخورده است، لطفا دوباره تلاش کنید. recording: all_recordings: تمام جلسات ضبط شده - email: ارسال جلسات ضبط شده توسط ایمیل - error: "خطایی در هنگام بازیابی لیست رکورد(های) %{count} به وجود امده است" - no_recordings: "این اتاق مورد ضبط شده ای %{inject} ندارد." - no_user_recordings: شما در حال حاظر هیچ جلسه ی ضبط شده ای ندارید. - no_matched_recordings: "هیج %{inject} مورد ضبط شده ای مطابق با جستجوی شما یافت نشد." + email: ایمیل کردن ضبط + error: "خطایی در هنگام بازیابی ضبط(های) %{count} رخ داده است" + no_public_recordings: این اتاق هیچ ضبط عمومی ندارد. + no_recordings: این اتاق ضبط نشده است. + no_user_recordings: شما فعلا هیچ ضبطی ندارید. + no_matched_pub_recordings: هیچ ضبط عمومی با جستجوی شما مطابقت ندارد. + no_matched_recordings: هیچ ضبطی با جستجوی شما مطابقت ندارد. recorded_on: "ضبط شده در %{date}" table: name: نام - thumbnails: تصاویر کوچک + thumbnails: بندانگشتی‌ها length: طول users: کاربران - visibility: حالت نمایش + visibility: قابلیت دید formats: قالب ها visibility: + inaccessible: عدم دسترسی public: عمومی - unlisted: لیست نشده + unlisted: فهرست نشده format: - notes: یادداشت ها - podcast: پادکست - presentation: ارائه - statistics: امار - video: ویدئو + notes: یادداشت‌ها + podcast: پادپخش + presentation: ارایه + statistics: آمار + video: ویدیو registration: approval: fail: حساب کاربری شما هنوز تایید نشده است. اگر چند روز از ثبت نام شما گذشته است، لطفا با مدیر خود تماس بگیرید. signup: حساب کاربری شما با موفقیت ایجاد شد و برای تایید به مدیر ارسال شد. banned: - fail: شما دسترسی به این برنامه ندارید. اگر فکر میکنید این اشتباه است، لطفا با مدیر سیستم خود تماس بگیرید + fail: شما دسترسی به این برنامه ندارید. اگر فکر می‌کنید این اشتباه است، لطفا با مدیر سامانه تماس بگیرید. deprecated: new_signin: یک روش ورود جدید برای حساب کاربری خود انتخاب کنید. تمام اتاق ها از حساب کاربری قدیمی به حساب جدید منتقل خواهند شد. - twitter_signin: "لاگین توسط حساب کاربری توییتر قدیمی شده است و دیگر در نسخه بعدی غیر فعال خواهد شد. اینحا را کلیک کنید تا حساب کاربری خود را به یک روش احراز هویت جدید منتقل کنید" - twitter_signup: ثبت نام توسط توییتر قدیمی شده است، لطفا روش ثبت نام دیگری انتخاب کنید - merge_success: حساب کاربری توییتر شما با موفقیت به حساب کاربری جدید شما منتقل شد. حساب کاربری قدیمی توییتتر شما حذف شد + twitter_signin: "ورود با حساب کاربری توییتر دور انداخته شده است و در نسخه های بعدی حذف خواهد شد. اینحا کلیک کنید تا حساب کاربری خود را به یک روش احراز هویت جدید منتقل کنید" + twitter_signup: ثبت نام توسط توییتر دور انداخته شده است، لطفا روش ثبت نام دیگری انتخاب کنید + merge_success: حساب کاربری توییتر شما با موفقیت به حساب کاربری جدید شما منتقل شد. حساب کاربری قدیمی توییتر شما حذف شد invite: - fail: توکن شما به اتمام رسیده یا اشتباه است. اگر فک میکنید این اشتباه است، لطفا با مدیر سیستم خود تماس بگیرید + fail: بلیط شما منقضی شده یا اشتباه است. اگر فکر می‌کنید مشکلی هست، لطفا با مدیر سامانه تماس بگیرید. no_invite: شما دعوت نامه ای برای ورود ندارید، لطفا برای دریافت آن با مدیر تماس بگیرید. remove: حذف rename: تغییر نام reset_password: - invalid_token: توکن تنظیم مجدد رمزعبور نامعتبر است. لطفا دوباره رمزعبور را دوباره تنظیم کنید. + captcha: احراز هویت reCAPTCHA به مشکل برخورده است، لطفا دوباره تلاش کنید. + invalid_token: بلیط تنظیم مجدد رمز عبور نامعتبر است. لطفا دوباره رمز عبور را تنظیم کنید. subtitle: بازنشانی رمز عبور password: رمز عبور جدید confirm: تایید رمز عبور جدید - update: به روز رسانی رمز عبور - auth_change: روش احراز هویت تغییر کرده است. لطفا ایمیل خود را برای ست کردن رمز عبور بررسی کنید + update: به‌روزرسانی رمز عبور + auth_change: روش احراز هویت تغییر کرده است. لطفا ایمیل خود را برای تنظیم رمز عبور بررسی کنید. roles: active: فعال admin: مدیر banned: منع شده - deleted: حذف شد + deleted: حذف شده pending: در انتظار تایید + invited: دعوت شده user: کاربر room: - access_code_required: لطفا کد دسترسی معتبر برای ورود به جلسه را وارد کنید - add_presentation: اضافه کردن ارائه + access_code_required: لطفا یک کد دسترسی برای ورود به جلسه وارد کنید + add_presentation: اضافه کردن ارایه + copy_access: رونوشت کد دسترسی + copy_moderator_access: رونوشت کد مدیر create_room: ایجاد یک اتاق - create_room_error: خطایی در هنگام ایجاد اتاق به وجود آمده است + create_room_error: خطایی در هنگام ایجاد اتاق رخ داده است create_room_success: اتاق با موفقیت ایجاد شد delete: home_room: امکان حذف اتاق خانه کاربر وجود ندارد success: اتاق با موفقیت حذف شد fail: "خطا در حذف اتاق (%{error})" enter_the_access_code: کد دسترسی به اتاق را وارد کنید - invalid_provider: شما ادرس نامعتبری را وارد کرده اید، لطفا ادرس را بررسی کرده و دوباره تلاش کنید - invitation_description: "با استفاده از بیگ بلو باتن از شما دعوت شده است تا به %{name} بپیوندید. برای پیوستن، لینک زیر را کلیک کنید و نام خود را درج کنید." - invited: شما برای ملحق شدن دعوت شده اید - recording_present: من متوجه هستم که این جلسه قرار است ضبظ شود. این موضوع شامل صدا و تصویر من در صورت فعال بودن می‌باشد. + enter_the_moderator_access_code: کد مدیر اتاق را وارد کنید! + optional_moderator_access_code: "کد مدیر (اختیاری):" + invalid_provider: شما آدرس نامعتبری را وارد کرده اید، لطفا آدرس را بررسی و دوباره تلاش کنید. + invitation_description: "با استفاده از بیگ بلو باتن از شما دعوت شده است تا به %{name} بپیوندید. برای پیوستن، پیوند زیر را کلیک کنید و نام خود را درج کنید." + invited: شما برای پیوستن دعوت شده اید + recording_present: من متوجه هستم که این جلسه قرار است ضبط شود. این موضوع شامل صدا و تصویر من در صورت فعال بودن است. invite_participants: دعوت شرکت کنندگان join: پیوستن last_session: "آخرین جلسه در %{session}" @@ -545,13 +579,13 @@ fa_IR: owner: مالک owner_banned: این اتاق درحال حاضر در دسترس نیست no_room: - description: لطفا ادرس یا شناسه اتاقی که می خواهید وارد آن شوید را وارد کنید - edit_profile: ویرایش پروفایل کاربری + description: لطفا آدرس یا شناسه اتاقی که می خواهید وارد آن شوید را وارد کنید + edit_profile: ویرایش نمایه کاربری go_to: رفتن به اتاق - invalid_room_uid: شناسه/ادرسی که وارد کردید نامعتبر است - placeholder: ادرس/شناسه اتاق + invalid_room_uid: شناسه/آدرسی که وارد کردید نامعتبر است. + placeholder: آدرس/شناسه اتاق no_recent_rooms: شما اخیرا وارد جلسه ای نشده اید - recent_rooms: رفتن به اتاقی که اخیرا وارد شده اید + recent_rooms: رفتن به اتاقی که اخیرا وارد آن شده اید title: وارد شدن به جلسه no_sessions: این اتاق هنوز جلسه ای ندارد! preupload_success: ارئه با موفقیت اضافه شد @@ -559,38 +593,39 @@ fa_IR: preupload_remove_success: ارائه با موفقیت پاک شد preupload_remove_error: مشکلی در پاک کردن ارائه رخ داده است recordings: موارد ضبط شده اتاق - room_limit: شما به تعداد ماکسیمم اتاق های مجاز رسیدید. - room_limit_exceeded: "شما به ماکسیمم تعداد اتاق های مجاز رسیده اید، لطفا %{difference} اتاق (ها) حذف کنید تا به این اتاق وارید شوید." + room_limit: شما به بیشینه تعداد اتاق های مجاز رسیدید. + room_limit_exceeded: "شما به بیشینه تعداد اتاق های مجاز رسیده اید، لطفا %{difference} اتاق (ها) حذف کنید تا به این اتاق وارید شوید." sessions: جلسات settings: تنظیمات اتاق share: مدیریت دسترسی ها - shared_by: "اشتراک گذاری شده بوسیله %{email}" + shared_by: "اشتراک گذاری شده با %{email}" remove_shared_access_success: اتاق اشتراکی از لیست اتاق های شما با موفقیت حذف شد remove_shared_access_error: خطایی در حذف اتاق اشتراکی از لیست شما رخ داده است shared_access_success: اتاق با موفقیت به اشتراک گذاشته شد shared_access_error: خطایی در اشتراک اتاق رخ داد start: آغاز + search: جستجو برای اتاق... unavailable: این اتاق به دلیل اینکه ایمیل صاحب آن هنوز تایید نشده است در دسترس نیست. update_settings_error: خطایی در به روز رسانی تنظیمات اتاق رخ داده است update_settings_success: اطلاعات اتاق با موفقیت به روز رسانی شد wait: message: این جلسه هنوز شروع نشده است - auto: شما هنگامی که جلسه شروع شود، به صورت خودکار به جلسه ملحق خواهید شد. + auto: هنگامی که جلسه شروع شود، به صورت خودکار به جلسه ملحق خواهید شد. settings: account: - fullname: نام کامل + fullname: نام و نام خانوادگی language: زبان - provider: ارائه کننده + provider: ارایه کننده image: تصویر - image_url: آدرس تصویر پروفایل + image_url: آدرس تصویر نمایه roles: نقش کاربر - subtitle: به روز رسانی اطلاعات حساب کاربری + subtitle: به‌روزرسانی اطلاعات حساب کاربری title: اطلاعات حساب کاربری reset_password: بازنشانی رمز عبور کاربر delete: button: بله، من مایل به حذف حساب کاربری خود هستم. - disclaimer: اگر شما انتخاب کنید که می خواهید حساب کاربری خود را پاک کنید، دیگر امکان بازگشت وجود نخواهد داشت . تمام اطلاعات شامل حساب کاربری شما، تنظیمات مربوطه، اتاق ها و جلسات ضبط شده حذف خواهند شد. - subtitle: حذف کامل حساب کاربری تان + disclaimer: اگر حساب کاربری خود را پاک کنید، امکان بازیابی اطلاعات وجود نخواهد داشت. تمام اطلاعات حساب شما، شامل تنظیمات، اتاق ها و جلسات ضبط شده حذف خواهند شد. + subtitle: حذف کامل حساب شما title: حذف حساب کاربری password: confirmation: تاییدیه رمز عبور @@ -598,7 +633,7 @@ fa_IR: old: رمز عبور قدیمی subtitle: تغییر رمز عبور شما title: رمز عبور - title: پروفایل + title: نمایه search: جستجو signup: password_confirm: تایید رمز عبور @@ -610,13 +645,16 @@ fa_IR: accept_existing: من شرایط و قوانین را می پذیرم title: شرایط و قوانین test_install: > - این پیاده سازی از سرور تستی پیش فرض استفاده میکند، شما می بایست آن را با تنظیمات خود جایگزین کنید. برای جزئیات %{href} را مشاهده کنید. + این پیاده سازی از سرور آزمایشی پیش‌فرض استفاده می‌کند، شما می بایست آن را با تنظیمات خود جایگزین کنید. برای جزئیات %{href} را مشاهده کنید. + time: + formats: + default: "%b %d، %Y %-I:%M%P" update: به‌روزرسانی verify: accept: تاییدیه activated: حساب کاربری تایید شد! already_verified: حساب کاربری قبلا تایید شده است - invalid: ادرس تاییدیه غیر معتبر + invalid: آدرس تاییدیه غیر معتبر not_verified: حساب کاربری شما هنوز تایید نشده است. resend: ارسال مجدد ایمیل تاییدیه signin: لطفا به منظور دسترسی به حساب کاربری خود وارد شوید. diff --git a/config/locales/fr.yml b/config/locales/fr.yml index db464382..8ba03bb9 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -20,7 +20,7 @@ fr: activerecord: attributes: user: - accepted_terms: "Termes et Conditions" + accepted_terms: "Conditions générales d'utilisation" email: Adresse électronique name: Nom password: Mot de passe @@ -69,11 +69,15 @@ fr: regular: Base lighten: Plus clair darken: Plus sombre + email_mapping: + info: "Associez l'utilisateur à un role en utilisant son adresse électronique. Doit être au format email1=role1,email2=role2" + title: Mapping des rôles par adresse électronique + update: log_level: title: Verbosité du journal information: Changer la verbosité du journal pour tout le déploiement debug: Déboguage - info: Infos + info: Information warn: Attention error: Erreur fatal: Erreur fatale @@ -90,7 +94,7 @@ fr: title: Bannière de maintenance display: Définir clear: Effacer - time: "Exemple : Mise à jour prévue le 13 décembre à 23:00. Les utilisateurs peuvent rencontrer des problèmes pour se connecter." + time: "Exemple : Mise à jour prévue le 13 décembre à 23:00. Les utilisateurs peuvent rencontrer des problèmes pour se connecter." preupload: info: Les utilisateurs peuvent précharger une présentation qui sera utilisée comme présentation par défaut pour cette salle spécifique title: Permettre aux utilisateurs de précharger des présentations @@ -111,6 +115,7 @@ fr: tabs: appearance: Apparence administration: Administration + registration: Inscription settings: "Paramètres " title: Paramètres du site flash: @@ -133,11 +138,14 @@ fr: settings: Les paramètres du site ont bien été modifiés unauthorized: Vous n'êtes pas autorisé à effectuer cette action sur cet utilisateur. recordings: + latest: Derniers enregistrements title: Enregistrements du serveur no_recordings: Ce serveur n'a pas d'enregistrement. + search_info: Saisissez l'adresse électronique complète d'un utilisateur ou l'identifiant d'une salle roles: appear_in_share_list: Inclure les utilisateurs ayant ce rôle dans la liste déroulante de partage des salons can_create_rooms: Peut créer des salles + can_launch_recording: Autoriser les utilisateurs ayant ce rôle d'enregistrer leurs réunions delete: Supprimer le rôle invalid_create: Il y a eu un problème lors de la création du nouveau rôle. Veuillez vérifier les valeurs entrées et réessayer. invalid_order: Il y a eu un problème lors de la mise à jour de la priorité du rôle. Veuillez vérifier les valeurs et réessayer. @@ -168,11 +176,15 @@ fr: info: Donne à tous les utilisateurs les droits de modérateur dans BigBlueButton lors de la connexion à une conférence. recordings: info: "Permet aux propriétaires d'une salle de préciser s'ils souhaitent ou non avoir la possibilité de l'enregistrer. Si cette option est activée, le modérateur doit toujours cliquer sur le bouton « Enregistrer » une fois que la réunion a commencé." + moderator_codes: + info: Autoriser les propriétaires de salles la possibilité de générer un code qui permet aux autres utilisateurs de rejoindre directement en tant que modérateur + title: Code d'accès modérateur options: disabled: Désactivé enabled: Toujours activé optional: Facultatif rooms: + timeout: "En raison du délai de %{server} du serveur, les informations relatives au statut et aux participants peuvent ne pas être exactes" title: Serveur des salons table: ended: "Terminé:%{session}" @@ -218,6 +230,7 @@ fr: cookies: cookie_info: "Les cookies nous aident à fournir nos services. En utilisant nos services, vous acceptez notre utilisation des cookies." cookie_button: Je suis d'accord + policy: "Pour plus d'informations, voir notre politique de confidentialité." copied: Copié copy: Copier date: @@ -256,6 +269,7 @@ fr: accepted: doit être accepté confirmation: "ne correspond pas à %{attribute}" inclusion: n'est pas inclus dans la liste + domain: "doit terminer avec \"%{email_domain}\"" no_provider: message: Le site auquel vous essayez d'accéder n'est pas activé help: Veuillez contacter votre administrateur système pour installer GreenLight @@ -300,6 +314,7 @@ fr: home_room: Salle d’Accueil info_update_success: Informations mises à jour avec succès. invalid_credentials: "Les informations d'identification que vous avez indiquées sont erronées. Veuillez réessayer ou cliquez sur « Mot de passe oublié ? » pour réinitialiser votre mot de passe." + invalid_credentials_external: "L'adresse email et le mot de passe renseignés ne correspondent pas à nos informations. Merci de réessayer. " invalid_login_method: La connexion a échoué en raison d'une incompatibilité de compte. Vous devez vous connecter avec omniauth. invite_message: "Pour inviter quelqu'un à la réunion, envoyez-lui ce lien :" javascript: @@ -344,6 +359,7 @@ fr: info: "Vous avez été invité dans votre espace personnel par %{name}" signup_info: "Pour vous inscrire utilisez votre e-mail, cliquez sur le bouton ci-dessous et suivez les étapes." signup_link: Inscription + valid: "L'invitation est valable jusqu'à: %{date}" signup: info: Un utilisateur invité s'est inscrit pour utiliser Greenlight. admins_link: Visitez la page "Organisation" @@ -382,7 +398,9 @@ fr: title: Créer un nouveau rôle create_room: access_code: Code d'accès + moderator_access_code: Code modérateur access_code_placeholder: Générer un code d'accès au salon - optionnel + moderator_access_code_placeholder: "Générer un code optionnel pour les modérateurs " auto_join: Me rejoindre automatiquement dans le salon create: Créer une salle free_delete: Vous serez libre de supprimer cette salle à tout moment. @@ -471,6 +489,7 @@ fr: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: "Oups, nous n'avons pas réussi à valider votre réponse reCAPTCHA. Veuillez réessayer." @@ -478,10 +497,12 @@ fr: recording: all_recordings: Tous les enregistrements email: Envoyer l'enregistrement par courriel - error: "Il y a eu une erreur lors de la récupération de %{count} enregistrement(s)" - no_recordings: "Ce salon n'a pas d'enregistrement %{inject}." + error: "Il y a eu une erreur lors de la récupération de %{count} enregistrement(s)" + no_public_recordings: Ce salon n'a pas d'enregistrement public. + no_recordings: Ce salon n'a pas d'enregistrement. no_user_recordings: "Actuellement, vous n'avez aucun enregistrement." - no_matched_recordings: "Aucun enregistrement %{inject} ne correspond à votre recherche." + no_matched_pub_recordings: Aucun enregistrement public ne correspond à votre recherche. + no_matched_recordings: Aucun enregistrement ne correspond à votre recherche. recorded_on: "Enregistré le %{date}" table: name: Nom @@ -491,6 +512,7 @@ fr: visibility: Visibilité formats: Formats visibility: + inaccessible: Inaccessible public: Public unlisted: Non Listé format: @@ -516,6 +538,7 @@ fr: remove: Enlever rename: Renommer reset_password: + captcha: "La vérification de reCAPTCHA a échoué, veuillez réessayer." invalid_token: Le jeton de réinitialisation du mot de passe n'est pas valide. Veuillez essayer de réinitialiser votre mot de passe à nouveau. subtitle: Réinitialiser le mot de passe password: Nouveau mot de passe @@ -528,11 +551,13 @@ fr: banned: Banni deleted: Supprimé pending: En attente + invited: Invité user: Utilisateur room: access_code_required: Veuillez introduire un code d'accès valide afin de rejoindre la salle add_presentation: Ajouter présentation copy_access: Copier le code d'accès + copy_moderator_access: Copier le code modérateur create_room: Créer un salon create_room_error: Une erreur s'est produite lors de la création du salon create_room_success: Salon créé avec succès @@ -541,8 +566,10 @@ fr: success: Salle supprimée fail: "Erreur lors de la suppression de la salle (%{error})" enter_the_access_code: Veuillez introduire le code d'accès de la salle + enter_the_moderator_access_code: Saisissez le code modérateur ! + optional_moderator_access_code: "Code modérateur optionnel:" invalid_provider: Vous avez introduit une url non valide. Veuillez vérifier l'url et essayez à nouveau. - invitation_description: "Vous avez été invité à rejoindre 1%{name} en utilisant le BigBlueButton. Pour le faire, cliquez sur le lien ci-dessus et saisissez votre nom." + invitation_description: "Vous avez été invité à rejoindre 1%{name} en utilisant le BigBlueButton. Pour le faire, cliquez sur le lien ci-dessus et saisissez votre nom." invited: Vous avez été invité à rejoindre recording_present: Je reconnais que cette session va être enregistrée. Cela peut inclure ma voix et la vidéo si elle est activée. invite_participants: Inviter des participants @@ -565,7 +592,7 @@ fr: preupload_error: Erreur lors du chargement de la présentation preupload_remove_success: Présentation supprimée avec succès preupload_remove_error: "Erreur lors de la suppression de la présentation " - recordings: Enregistrements du salon + recordings: Enregistrements de salon room_limit: Vous avez atteint le nombre maximum de salles autorisé room_limit_exceeded: "Vous avez dépassé le nombre de salles autorisé. Veuillez en supprimer %{difference}pour pouvoir accéder à cette salle." sessions: Sessions @@ -577,7 +604,8 @@ fr: shared_access_success: Salle partagée avec succès shared_access_error: Il y a eu une erreur lors du partage de la salle start: Démarrer - unavailable: Ce salon est actuellement indisponible car le courrier électronique du propriétaire n'a pas été vérifié. + search: Rechercher une salle... + unavailable: Ce salon est actuellement indisponible car l'adresse électronique du propriétaire n'a pas été vérifié. update_settings_error: Une erreur s'est produite lors de la mise à jour des paramètres du salon. update_settings_success: Paramètres du salon mis à jour avec succès wait: @@ -589,7 +617,7 @@ fr: language: Langue provider: Fournisseur image: Image - image_url: URL de l'image profil + image_url: URL de l'image du profil roles: Rôle de l'utilisateur subtitle: Mettre à jour les informations de votre compte title: Informations de compte @@ -603,21 +631,24 @@ fr: confirmation: Confirmation du nouveau mot de passe new: Nouveau Mot de passe old: Ancien Mot de passe - subtitle: Changer votre Mot de passe + subtitle: Modifier votre mot de passe title: Mot de passe title: Profil search: Chercher signup: - password_confirm: Confirmation Mot de passe + password_confirm: Confirmation du mot de passe subtitle: Créer un Compte title: S’inscrire with: "S'inscrire via %{provider}" terms: accept: "J'accepte les %{href}" - accept_existing: J'accepte les termes et conditions - title: Termes et Conditions + accept_existing: J'accepte les conditions générales d'utilisation + title: Conditions générales d'utilisation test_install: > Ce déploiement utilise un serveur de test pré-configuré, vous devez le remplacer par le vôtre. Pour plus de détails, voir le %{href}. + time: + formats: + default: "%a %d %b %Y %H:%M" update: Mise à jour verify: accept: Vérifier @@ -625,7 +656,7 @@ fr: already_verified: Le compte a déjà été vérifié invalid: Lien de vérification invalide not_verified: Votre compte n'a pas encore été vérifié. - resend: Renvoyer l'e-mail de vérification + resend: Renvoyer le courriel de vérification signin: Veuillez vous connecter pour accéder à votre compte. - title: Vérifiez votre e-mail + title: Vérifiez votre adresse électronique verification: Vérification diff --git a/config/locales/gl.yml b/config/locales/gl.yml index da509910..259877bc 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -72,7 +72,7 @@ gl: email_mapping: info: "Asignar o usuario a un rol usando o seu correo-e. Debe ter o formato email1=rol1,email2=rol2" title: Asignación de roles por correo-e - update: + update: log_level: title: Nivel de rexistro information: Cambiar o nivel de rexistro para o despregamento completo @@ -94,7 +94,7 @@ gl: title: Cartel de mantemento display: Estabelecer clear: Limpar - time: "Exemplo: Actualización programada para o 13 de decembro ás 23:00 ET. Os usuarios poden ter problemas para iniciar sesión." + time: "Exemplo: Actualización programada para o 13 de decembro ás 23:00 ET. Os usuarios poden ter problemas para iniciar sesión." preupload: info: Os usuarios poden cargar previamente unha presentación para que a utilicen como presentación predeterminada para esa sala específica title: Permitirlle aos usuarios precargar as presentacións @@ -138,11 +138,14 @@ gl: settings: Os axustes do sitio foron cambiados correctamente unauthorized: Non está autorizado para executar accións sobre este usuario recordings: + latest: Últimas gravacións title: Gravacións do servidor no_recordings: Este servidor non ten gravacións. + search_info: Introduza o correo-e completo dun usuario ou o UID dunha sala roles: appear_in_share_list: Incluír usuarios con este rol no menú despregábel para compartir salas can_create_rooms: Pode crear salas + can_launch_recording: Permitir os usuarios con este rol para gravar estas reunións delete: Eliminar o rol invalid_create: Produciuse un problema ao crear un novo rol. Comprobe os valores dos roles e ténteo de novo invalid_order: Produciuse un problema ao actualizar a prioridade do rol. Comprobe os valores dos roles e ténteo de novo @@ -173,6 +176,9 @@ gl: info: Dárlle a todos os usuarios os privilexios de moderador en BigBlueButton cando se unen á xuntanza. recordings: info: "Permitirlle aos propietarios de salas especificar se queren a opción para gravar unha sala ou non. Se está activado, o moderador aínda debe premer no botón «Gravar» unha vez iniciada a xuntanza." + moderator_codes: + info: Permitir aos propietarios de salas xerar opcionalmente un pin de moderador que permita a outros usuarios unirse directamente como moderadores. + title: Código de acceso do moderador options: disabled: Desactivado enabled: Activado sempre @@ -224,6 +230,7 @@ gl: cookies: cookie_info: "As cookies axúdanos a prestar os nosos servizos. Ao usar os nosos servizos, acepta o noso uso de cookies." cookie_button: " Acepto" + policy: "Para obter máis información, consulte a nosa directiva de privacidade." copied: Copiado copy: Copiar date: @@ -262,6 +269,7 @@ gl: accepted: ten que ser aceptado confirmation: "%{attribute} non coincide" inclusion: non está incluído na lista + domain: "debe rematar con «%{email_domain}»" no_provider: message: O sitio ao que está tentando acceder non está activo help: Póñase en contacto co administrador do sistema para configurar Greenlight @@ -306,6 +314,7 @@ gl: home_room: Sala principal info_update_success: Actualizouse correctamente a información invalid_credentials: O correo e o contrasinal que introduciu non coinciden cos nosos rexistros. Tenteo de novo ou prema en «Esquecín o contrasinal» para restabelecer o seu contrasinal. + invalid_credentials_external: O correo e o contrasinal que introduciu non coinciden cos nosos rexistros. Tenteo de novo. invalid_login_method: Produciuse un fallo no acceso por mor da non coincidencia da conta. Debe acceder con omniauth. invite_message: "Para convidar a alguén á xuntanza, envíelle esta ligazón:" javascript: @@ -350,6 +359,7 @@ gl: info: "Foi convidado ao seu propio espazo persoal por %{name}" signup_info: "Para rexistrarse usando o seu correo-e, prema no seguinte botón e siga os pasos." signup_link: Rexistrarse + valid: "O convite é valido ata: %{date}" signup: info: Un usuario que foi convidado rexistrouse para usar Greenlight. admins_link: Visite a páxina da organización @@ -388,7 +398,9 @@ gl: title: Crear un novo rol create_room: access_code: Código de acceso + moderator_access_code: Código do moderador access_code_placeholder: Xerar un código de acceso á sala opcional + moderator_access_code_placeholder: Xera un código opcional para os moderadores auto_join: Unirse automaticamente comigo na sala create: Crear unha sala free_delete: Será libre de eliminar esta sala en calquera momento. @@ -477,6 +489,7 @@ gl: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: Conectar con OpenID recaptcha: errors: recaptcha_unreachable: Ouh! non podemos validar a resposta de reCAPTCHA. Tenteo de novo. @@ -485,9 +498,11 @@ gl: all_recordings: Todas as gravacións email: " Enviar correo coa gravación" error: "Produciuse un erro ao recuperar %{count} gravación(s)" - no_recordings: "Esta sala non ten gravacións %{inject}." + no_public_recordings: Esta sala non ten gravacións públicas. + no_recordings: Esta sala non ten gravacións. no_user_recordings: Non ten gravacións. - no_matched_recordings: "Non hai gravacións %{inject} que coincidan coa súa busca." + no_matched_pub_recordings: Non hai gravacións públicas que coincidan coa túa busca. + no_matched_recordings: Non hai gravacións que coincidan coa túa busca. recorded_on: "Gravada o %{date}" table: name: Nome @@ -497,6 +512,7 @@ gl: visibility: Visibilidade formats: Formatos visibility: + inaccessible: Inaccesíbel public: Pública unlisted: Sen listar format: @@ -522,6 +538,7 @@ gl: remove: Retirar rename: Renomear reset_password: + captcha: "Produciuse un fallo na verificación de reCAPTCHA, ténteo de novo." invalid_token: O testemuño de restablecemento de contrasinal non é válido. Tente restabelecer o seu contrasinal de novo. subtitle: Restabelecer o contrasinal password: Novo contrasinal @@ -534,11 +551,13 @@ gl: banned: Expulsado deleted: Eliminado pending: Pendente + invited: Convidado user: Usuario room: access_code_required: Introduza un código de acceso válido para unirse á sala add_presentation: Engadir presentación copy_access: Copiar o código de acceso + copy_moderator_access: Copiar o código de moderador create_room: Crear unha sala create_room_error: Produciuse un erro ao crear a sala create_room_success: Creouse correctamente a sala @@ -547,8 +566,10 @@ gl: success: Eliminouse correctamente a sala fail: "Non foi posíbel eliminar a sala (%{error})" enter_the_access_code: Introduza o código de acceso á sala + enter_the_moderator_access_code: Introduza o código de moderador da sala. + optional_moderator_access_code: "Código de moderador opcional:" invalid_provider: Introduciu un URL non válido. Comprobe o URL e ténteo de novo. - invitation_description: "Foi convidado a unirse a %{name} empregando BigBlueButton. Para unirse, prema na ligazón superior e escriba o seu nome." + invitation_description: "Foi convidado a unirse a %{name} empregando BigBlueButton. Para unirse, prema na ligazón superior e escriba o seu nome." invited: Foi convidado a unirse a recording_present: Declaro ser coñecedor de que se vai gravar esta sesión. Isto pode incluír a miña voz e imaxe de vídeo se están activados. invite_participants: Convidar a participantes @@ -625,6 +646,9 @@ gl: title: Termos e condicións test_install: > Esta instalación está a usar un servidor para probas preconfigurado. Debe substituílo polo seu propio servidor. Para obter máis detalles, consulte %{href}. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Actualizar verify: accept: Verificar diff --git a/config/locales/it.yml b/config/locales/it.yml index 2cb64e3c..8644c796 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -69,6 +69,10 @@ it: regular: Colore di base lighten: Chiaro darken: Scuro + email_mapping: + info: "Associa un ruolo all'utente usando la sua email. Deve essere nel formato email1=ruolo1,email2=ruolo2" + title: Associazione del ruolo con email + update: log_level: title: Livello di Log information: Modifica il livello di Log per l'intera installazione @@ -90,7 +94,7 @@ it: title: Banner Manutenzione display: Imposta clear: Pulisci - time: "Esempio: Aggiornamento schedulato il 13 Dicembre @ 23:00 ET. Gli utenti potrebbero riscontrare problemi nel loggare." + time: "Esempio: Aggiornamento schedulato il 13 Dicembre @ 23:00 ET. Gli utenti potrebbero riscontrare problemi nel loggare." preupload: info: Gli utenti possono precaricare una presentazione per essere usata come presentazione di default per una stanza specifica title: Permetti agli Utenti di precaricare le Presentazioni @@ -105,26 +109,27 @@ it: info: Limita il numero di stanze che un utente può avere (inclusa la stanza Home). Questa impostazione non si applica agli utenti Amministratori title: Numero di stanze per utente shared_access: - info: "Impostando su disabilitato, verra' rimossa l'opzione dal menu a discesa delle Opzioni Stanza, impedendo agli utenti di condividere le Stanze" + info: "Impostando su disabilitato, verrà rimossa l'opzione dal menu a discesa delle Opzioni Stanza, impedendo agli utenti di condividere le Stanze" title: Consenti agli Utenti di condividere Stanze subtitle: Personalizza Greenlight tabs: appearance: Aspetto administration: Amministrazione + registration: Registrazione settings: Impostazioni title: Impostazioni Sito flash: approved: L'utente è stato approvato con successo banned: L'utente è stato bannato. - unbanned: E' stato rimosso il blocco utente. + unbanned: È stato rimosso il blocco utente. delete: L'utente è stato eliminato con successo delete_fail: Errore nell'eliminazione utente demoted: L'utente è stato declassato invite: "L'invito è stato inviato a %{email}" invite_email_verification: L'email deve essere abilitata per poter usare questo metodo. Prego contatta il tuo amministratore di sistema - merge_fail: Si e' verificato un problema in fase di accorpamento degli accounts utente. Per favore verifica gli utenti selezionati e riprova. + merge_fail: Si è verificato un problema in fase di accorpamento degli account utente. Per favore verifica gli utenti selezionati e riprova. merge_success: Accounts utente accorpati con successo - perm_deleted: L'utente e' stato eliminato definitivamente + perm_deleted: L'utente è stato eliminato definitivamente promoted: L'utente è stato promosso registration_method_updated: Il metodo di registrazione è stato aggiornato con successo reset_password: Agli utenti è stata inviata una mail per procedere con il reset della password (Prego avvisali di controllare anche la loro cartella di spam se non dovessero ricevere tale mail) @@ -133,17 +138,20 @@ it: settings: Le impostazioni web sono state modificate con successo unauthorized: Non sei autorizzato ad effettuare modifiche sull'utente recordings: + latest: Ultime registrazioni title: Registrazioni video sul server no_recordings: Il server non ha registrazioni video + search_info: Inserisci l'email completa di un utente oppure l'uid di una stanza roles: appear_in_share_list: Includi utenti con questo ruolo nel menu a discesa per la condivisione Stanze can_create_rooms: Non posso creare la stanza + can_launch_recording: Permetti agli utenti con questo ruolo di registrare i loro meeting delete: Cancella il ruolo - invalid_create: Si e' verificato un problema creando il nuovo ruolo. Per favore verifica i valori assegnati e riprova - invalid_order: Si e' verificato un problema aggiornando la priorita' del ruolo. Per favore verifica i valori e riprova - invalid_update: Si e' verificato un problema aggiornando i permessi del ruolo. Per favore verifica i valori e riprova. + invalid_create: Si è verificato un problema creando il nuovo ruolo. Per favore verifica i valori assegnati e riprova + invalid_order: Si è verificato un problema aggiornando la priorità del ruolo. Per favore verifica i valori e riprova + invalid_update: Si è verificato un problema aggiornando i permessi del ruolo. Per favore verifica i valori e riprova. manage_rooms_recordings: Consenti agli utenti con questo ruolo di gestire le Stanze e le Registrazioni - name: Nome del Ruolo + name: Nome del ruolo new_role: Crea un nuovo ruolo role_has_users: "Questo ruolo è ancora assegnato a %{user_count} utenti. Prego rimuovi tutti gli utenti con quel ruolo prima di eliminare il ruolo stesso" title: Ruoli @@ -152,7 +160,7 @@ it: edit_site_settings: Consenti agli Utenti con questo ruolo di modificare le impostazioni del sito edit_roles: Consenti agli Utenti con questo ruolo di modificare altri ruoli manage_users: Consenti agli Utenti di questo ruolo di gestire il profilo di altri utenti - invalid_assignment: Si e' verificato un problema assegnando il ruolo all'utente. Per favore verifica i valori e riprova + invalid_assignment: Si è verificato un problema assegnando il ruolo all'utente. Per favore verifica i valori e riprova colour: title: Colore associato al ruolo info: Imposta il colore che sarà associato al ruolo @@ -168,11 +176,15 @@ it: info: Dà a tutti gli utenti i privilegi di moderatore su BigBlueButton quando entrano nel meeting. recordings: info: "Permetti ai proprietari delle stanze di specificare se vogliono poter registrare la stanza o meno. Se abilitata, il moderatore deve comunque cliccare il pulsante \"Registra\" una volta avviato il meeting." + moderator_codes: + info: Permette ai proprietari di una stanza di generare facoltativamente un pin moderatore che permette agli altri utenti di entrare direttamente come moderatori. + title: Codice accesso moderatore options: disabled: Disabilitato enabled: Sempre Abilitata optional: Opzionale rooms: + timeout: "A causa del timeout della richiesta sul server 1%{server}, le informazioni riguardanti lo stato e i partecipanti potrebbero non essere accurate" title: Stanze table: ended: "Terminata: %{session}" @@ -202,12 +214,14 @@ it: table: authenticator: Gestore di autenticazione created: Creato + time: Tempo d'invio name: Nome not_found: Nessun utente corrisponde alla ricerca no_users: Nessun utente trovato role: Ruolo uid: ID Utente username: Nome utente + valid: Valido title: Gestisci utenti add_to_google_calendar: "Aggiungi a Google Calendar" bigbluebutton: BigBlueButton @@ -216,6 +230,7 @@ it: cookies: cookie_info: "I Cookies aiutano a fornire i servizi personalizzati. Usando i nostri servizi, accetti di usare i nostri Cookies." cookie_button: Accetto + policy: "Per ulteriori informazioni, consulta la nostra normativa sulla privacy." copied: Copiato copy: Copia date: @@ -243,9 +258,9 @@ it: contact_admin: "Non sei un amministratore, dovresti contattarne uno serio." continue: Voglio restare con la versione 1.0. notice: > - Si è verificato un errore nella migrazione del database di GreenLight.
Questo può essere perché non hai aggiornato alla versione 2.0. + Si è verificato un errore nella migrazione del database di Greenlight.
Questo può essere perché non hai aggiornato alla versione 2.0. upgrade: Mostrami come aggiornare alla versione 2.0! - version: Abbiamo rilasciato una nuova versione di GreenLight ma il tuo database non sembra essere compatibile. + version: Abbiamo rilasciato una nuova versione di Greenlight ma il tuo database non sembra essere compatibile. messages: blank: non può essere vuoto too_short: è troppo corto @@ -254,6 +269,7 @@ it: accepted: devono essere accettati confirmation: "non corrisponde a %{attribute}" inclusion: non è nella lista + domain: "deve terminare con \"%{email_domain}\"" no_provider: message: Il sito a cui stai provando ad accedere non è abilitato help: Prego contatta l'amministratore di sistema affinché configuri Greenlight @@ -298,6 +314,7 @@ it: home_room: Stanza principale info_update_success: Le informazioni sono state aggiornate. invalid_credentials: L'email e/o la password che hai fornito non hanno riscontro in archivio. Prova ancora o clicca su "Ho dimenticato la password" per resettare e reimpostare la tua password attuale + invalid_credentials_external: L’indirizzo email e la password che hai inserito non corrispondono ai nostri archivi. Prova di nuovo. invalid_login_method: "Accesso fallito: account non corretto. Devi effettuare l'accesso con omniauth." invite_message: "Per invitare qualcuno a partecipare, inviagli questo link: " javascript: @@ -312,9 +329,9 @@ it: landing: about: "%{href} è una semplice interfaccia per il software di video-conferenza open source BigBlueButton. Puoi creare Stanze per ospitare i meeting, o partecipare ad altri meeting utilizzando pratici collegamenti brevi." welcome: Benvenuti su BigBlueButton. - video: Guarda il tutorial sull'utilizzo di GreenLight + video: Guarda il tutorial sull'utilizzo di Greenlight upgrade: Mostrami come aggiornare alla versione 2.0! - version: "E' stata rilasciata una nuova versione di GreenLight, ma il tuo database non è compatibile." + version: "È stata rilasciata una nuova versione di GreenLight, ma il tuo database non è compatibile." language_default: Predefinito (linguaggio del browser) ldap_error: Impossibile collegarsi al server LDAP. Controlla la configurazione LDAP nel file env e assicurati che il server sia attivo. login: Entra @@ -334,7 +351,7 @@ it: subject: Account Approvato username: "Il tuo nome utente è %{email}." demoted: - info: "Non sei piu' un %{role} su %{url} ." + info: "Non sei più un %{role} su %{url} ." more-info: Disponi ora degli stessi privilegi di un utente normale. root_link: Entra subtitle: "Diritti di %{role} revocati." @@ -342,8 +359,9 @@ it: info: "Sei stato invitato sul tuo spazio personale da %{name}" signup_info: "Per accedere utilizzando la tua email, clicca il pulsante e segui i passaggi seguenti." signup_link: Accesso + valid: "L'invito è valido fino al: %{date}" signup: - info: Un utente che e' stato invitato ha avuto accesso a Greenlight. + info: Un utente che è stato invitato ha avuto accesso a Greenlight. admins_link: Visita la pagina Organizzazione subject: Accesso nuovo Utente Greenlight username: "L'utente ha avuto accesso con il nome %{name} e l'email %{email} ." @@ -351,7 +369,7 @@ it: username: "Il tuo nome utente è %{email}." password_reset: title: 'Reimposta password' - welcome: "E' stata fatta una richiesta di reset password a nome dell'email %{email}" + welcome: "È stata fatta una richiesta di reset password a nome dell'email %{email}" message: 'Se sei tu ad aver eseguito la richiesta, per favore clicca il link seguente per resettare la password:' reset_link: Reimposta Password expire: Questo link scadrà tra 2 ore. @@ -369,18 +387,20 @@ it: verify_text: 'Per verificare il tuo account, visita questo indirizzo: %{url}' verify_link: Verifica Account thanks: "Grazie per aver participato, buona giornata!" - max_concurrent: E' stato raggiunto il massimo numero di sessioni contemporanee! + max_concurrent: È stato raggiunto il massimo numero di sessioni contemporanee! merged: Accorpato modal: create_role: create: Crea nuovo Ruolo footer_text: Potrai modificare i singoli permessi per questo ruolo dopo la sua creazione name_placeholder: Inserisci un nome per il ruolo... - not_blank: Il nome del ruolo non puo' rimanere vuoto. + not_blank: Il nome del ruolo non può rimanere vuoto. title: Crea Nuovo Ruolo create_room: access_code: Codice Accesso + moderator_access_code: Codice moderatore access_code_placeholder: Genera un codice opzionale di accesso + moderator_access_code_placeholder: Genera un codice facoltativo per moderatori auto_join: Aggiungimi automaticamente alla stanza create: Crea Stanza free_delete: Puoi eliminare la stanza in qualsiasi momento. @@ -391,7 +411,7 @@ it: confirm: "Sicuro di voler eliminare questo account?" delete: Sono sicuro. Elimina questo account. keep: "mmmh no dai, NON eliminarlo." - delete_warning: Questo disabilitera' l'account utente. Tutti gli account utente disabilitati si trovano sotto il tab cancellati. + delete_warning: Questo disabiliterà l'account utente. Tutti gli account utente disabilitati si trovano sotto il tab cancellati. warning: Questa è la tua ultima possibilità. Non sarai in grado di recuperare i dati associati. delete_rec: delete: "Sono sicuro, elimina questa registrazione." @@ -401,11 +421,11 @@ it: confirm: "Sicuro di voler eliminare %{room}?" delete: "Sono sicuro, elimina la stanza." keep: "Ripensandoci, penso che la terrò." - warning: Nonc'e' modo di recuperare questa stanza + warning: Nonc'è modo di recuperare questa stanza recording_warning: "o ciascuna delle sue %{recordings_num} relative registrazioni." invite_user: email_placeholder: Inserisci le email degli utenti (separate da virgola) - footer: L'utente ricevera' un'email contenente le istruzioni per accedere + footer: L'utente riceverà un'email contenente le istruzioni per accedere send: Spedisci Invito title: Invita utente login: @@ -424,14 +444,14 @@ it: remove_shared: title: "Confermi di voler rimuovere questa stanza dalla tua lista stanze?" delete: "Confermo, rimuovi questa stanza." - warning: Non potrai piu' accedere a questa stanza. + warning: Non potrai più accedere a questa stanza. room_settings: title: Impostazioni della stanza update: Aggiorna Stanza client: Seleziona il tipo di interfaccia join_moderator: Tutti gli utenti accedono come moderatori mute: Silenzia utenti quando entrano nella stanza - require_approval: E' richiesta l'approvazione del moderatore per accedere + require_approval: È richiesta l'approvazione del moderatore per accedere start: Consenti a qualsiasi utente di avviare questo meeting footer_text: Le impostazioni della stanza possono essere cambiate in qualsiasi momento. recording: Permetti la registrazione della stanza @@ -450,7 +470,7 @@ it: title: Incorpora Accounts Utenti to: Account Primario save: Incorpora - footer: "Le stanze dell'account da incorporare saranno trasferite alla lista stanze dell'Account Primario, dopo di che l'account da incorporare verra' eliminato." + footer: "Le stanze dell'account da incorporare saranno trasferite alla lista stanze dell'Account Primario, dopo di che l'account da incorporare verrà eliminato." name_update_success: Il nome della stanza è stato cambiato con successo! no_user_email_exists: Non esistono utenti con la email specificata. Controlla di averla inserita correttamente. omniauth_error: Si è verificato un errore con l'autenticazione omniauth. Prova ancora o contatta un amministratore! @@ -469,6 +489,7 @@ it: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: Collegati con OpenID recaptcha: errors: recaptcha_unreachable: "Accidenti, la verifica reCAPTCHA è fallita. Riprova." @@ -476,10 +497,12 @@ it: recording: all_recordings: Tutte le registrazioni email: Registrazioni Email - error: "Si e' verificato un errore durante il recupero di %{count} registrazione/i" - no_recordings: "Questa stanza non ha %{inject} registrazioni." + error: "Si è verificato un errore durante il recupero di %{count} registrazione/i" + no_public_recordings: Questa stanza non ha registrazioni video pubbliche. + no_recordings: Questa stanza non ha registrazioni video. no_user_recordings: Non ci sono registrazioni al momento. - no_matched_recordings: Nessuna registrazione corrisponde alla tua ricerca. + no_matched_pub_recordings: Nessuna registrazione video pubblica corrisponde alla tua ricerca. + no_matched_recordings: Nessuna registrazione video corrisponde alla tua ricerca. recorded_on: "Registrato il %{date}" table: name: Nome @@ -489,6 +512,7 @@ it: visibility: Visibilità formats: Formati visibility: + inaccessible: Inaccessibile public: Pubblica unlisted: Non in elenco format: @@ -499,37 +523,41 @@ it: video: Video registration: approval: - fail: "Il tuo account non e' ancora stato approvato. Se sono passati diversi giorni da quando ti sei registrato, contatta per favore il tuo amministratore." - signup: Il tuo account e' stato creato con successo. E' stato inviato ad un amministratore per l'approvazione. + fail: "Il tuo account non è ancora stato approvato. Se sono passati diversi giorni da quando ti sei registrato, contatta per favore il tuo amministratore." + signup: Il tuo account è stato creato con successo. È stato inviato ad un amministratore per l'approvazione. banned: fail: "Non hai accesso a questa applicazione. Se ritieni si tratti di un errore, contatta per favore il tuo amministratore." deprecated: new_signin: Seleziona un metodo per l'accesso al tuo account. Tutte le stanze collegate al tuo vecchio account saranno migrate al nuovo account. - twitter_signin: "L'accesso via Twitter e' deprecato e verra' rimosso nella prossima release. Clicca qui per consentire al tuo account un nuovo metodo di autenticazione" - twitter_signup: L'accesso via Twitter e' deprecato. Per favore utilizza un altro metodo di autenticazione - merge_success: Il tuo account Twitter e' stato accorpato con successo al tuo nuovo account. Il tuo vecchio account Twitter e' stato rimosso + twitter_signin: "L'accesso via Twitter è deprecato e verrà rimosso nella prossima release. Clicca qui per consentire al tuo account un nuovo metodo di autenticazione" + twitter_signup: L'accesso via Twitter è deprecato. Per favore utilizza un altro metodo di autenticazione + merge_success: Il tuo account Twitter è stato accorpato con successo al tuo nuovo account. Il tuo vecchio account Twitter è stato rimosso invite: - fail: "Il tuo token e' invalido o e' scaduto. Se ritieni si tratti di un errore, per favore contatta il tuo amministratore." + fail: "Il tuo token non è valido o è scaduto. Se ritieni si tratti di un errore, per favore contatta il tuo amministratore." no_invite: Non disponi di un invito per partecipare. Contatta il tuo amministratore per riceverne uno. remove: Elimina rename: Rinomina reset_password: + captcha: "Accidenti, la verifica reCAPTCHA è fallita. Riprova." invalid_token: Il token di reset della password non è valido. Riprova a richiedere il reset nuovamente. subtitle: Reimposta password password: Nuova password confirm: Conferma nuova password update: Aggiorna password - auth_change: Il metodo di autenticazione e' cambiato. Per favore controlla la tua email per impostare la tua password. + auth_change: Il metodo di autenticazione è cambiato. Per favore controlla la tua email per impostare la tua password. roles: active: Attivo admin: Amministratore banned: Bloccato deleted: Eliminato pending: In attesa + invited: Invitato user: Utente room: access_code_required: Prego immettere un codice valido per entrare nella stanza add_presentation: Aggiungi Presentazione + copy_access: Copia codice di accesso + copy_moderator_access: Copia codice moderatore create_room: Crea una stanza create_room_error: Si è verificato un errore nella creazione della stanza create_room_success: La stanza è stata creata correttamente @@ -538,8 +566,10 @@ it: success: Stanza eliminata con successo fail: "Stanza non eliminata a causa dell'errore seguente: %{error}" enter_the_access_code: Immetti il codice di accesso alla stanza + enter_the_moderator_access_code: Inserire il codice moderatore della stanza! + optional_moderator_access_code: "Codice moderatore facoltativo:" invalid_provider: Hai inserito una url non valida. Per favore verifica e riprova. - invitation_description: "Sei stato invitato ad entrare in %{name} usando BigBlueButton. Per entrare, clicca sul link sopra e inserisci il tuo nome." + invitation_description: "Sei stato invitato ad entrare in %{name} usando BigBlueButton. Per entrare, clicca sul link sopra e inserisci il tuo nome." invited: Hai ricevuto un invito per partecipare recording_present: Accetto che questa sessione verrà registrata. Questo può includere la mia voce e il video se abilitati. invite_participants: Invita partecipanti @@ -547,12 +577,12 @@ it: last_session: "Ultima sessione: %{session}" login: Accedi owner: Proprietario - owner_banned: Questa stanza non e' al momento disponibile + owner_banned: Questa stanza non è al momento disponibile no_room: description: Inserisci l'url o l'id della stanza a cui desideri accedere. edit_profile: Modifica Profilo Utente go_to: Vai alla Stanza - invalid_room_uid: l'url/uid inserito non e' valido. + invalid_room_uid: L'url/uid della stanza inserito non è valido. placeholder: url/uid Stanza no_recent_rooms: Non sei entrato di recente in alcuna stanza recent_rooms: Entra in una stanza visitata recentemente @@ -570,10 +600,11 @@ it: share: Gestione Accesso shared_by: "Condiviso da %{email}" remove_shared_access_success: Stanza condivisa rimossa con successo dal tuo elenco stanze - remove_shared_access_error: Si e' verificato un errore rimuovendo la stanza condivisa dal tuo elenco + remove_shared_access_error: Si è verificato un errore rimuovendo la stanza condivisa dal tuo elenco shared_access_success: Stanza condivisa con successo - shared_access_error: Si e' verificato un errore condividendo la stanza + shared_access_error: Si è verificato un errore condividendo la stanza start: Avvia + search: Ricerca della stanza… unavailable: La stanza non è disponibile finché il proprietario non verifica il suo indirizzo email. update_settings_error: Si è verificato un errore nell'aggiornamento dei dettagli della stanza update_settings_success: Impostazioni della stanza aggiornate correttamente @@ -592,7 +623,7 @@ it: title: Informazioni account reset_password: Reimposta password dell'utente delete: - button: "Si, voglio eliminare il mio account." + button: "Sì, voglio eliminare il mio account." disclaimer: "Se scegli di eliminare il tuo account, NON sarà possibile recuperarlo. Tutte le informazioni riguardo l'account, incluse impostazioni, stanze e registrazioni, verranno eliminate." subtitle: Elimina definitivamente l'account title: Elimina account @@ -615,6 +646,9 @@ it: title: Termini e Condizioni test_install: > Questa versione usa un server di test pre-configurato, dovresti rimpiazzarlo con il tuo. Per i dettagli, visita %{href}. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Aggiorna verify: accept: Verifica diff --git a/config/locales/ja_JP.yml b/config/locales/ja_JP.yml index 4c17c7f9..b4ffab19 100644 --- a/config/locales/ja_JP.yml +++ b/config/locales/ja_JP.yml @@ -34,8 +34,8 @@ ja_JP: authentication: disabled: 無効 enabled: 有効 - info: サインインしたユーザのみが会議に参加できるようにします - title: 入室を認証ユーザに限定 + info: サインインしたユーザーのみが会議に参加できるようにします + title: 入室を認証ユーザーに限定 user-info: この会議室に入るにはサインインが必要になります branding: change: 画像の変更 @@ -60,7 +60,7 @@ ja_JP: title: サービス提供元キャッシュのクリア button: キャッシュのクリア clear_auth: - info: ユーザの現在の認証システムをクリアして別の認証方法でサインインできるようにします + info: ユーザーの現在の認証システムをクリアして別の認証方法でサインインできるようにします title: 現在の認証システムをクリア button: 認証のクリア color: @@ -70,46 +70,46 @@ ja_JP: lighten: 明色 darken: 暗色 email_mapping: - info: "メールアドレスを使用してユーザに役割を割り当てる。メールアドレス1=役割1,メールアドレス2=役割2の形式で記述する必要があります" + info: "メールアドレスを使用してユーザーに役割を割り当てる。「メール1=役割1,メール2=役割2」の形式で記述する必要があります" title: メールアドレスによる役割の割り当て - update: + update: log_level: title: ログレベル information: 配置されたすべてのログレベルを変更する debug: デバッグ - info: 情報 + info: 情報収集 warn: 警告 error: エラー fatal: 致命的 unknown: 不明 recording_visibility: info: 新しい録画の標準の公開方法を設定する - title: 標準の録画公開度 + title: 録画の標準公開度 warning: この設定は実行していない会議室にのみ適用されます require_consent: - info: これにより、会議室のオーナーが、部屋ごとの録画の可否を設定できるようになります。録画される会議に参加するユーザからは、同意を得る必要があります。 + info: これにより、会議室のオーナーが、部屋ごとの録画の可否を設定できるようになります。録画される会議に参加するユーザーからは、同意を得る必要があります。 title: 会議室のオーナーと参加者に、録画への同意を求める maintenance_banner: - info: メンテナンスの予定をユーザに通知するバナーを表示します + info: メンテナンスの予定をユーザーに通知するバナーを表示します title: メンテナンスバナー display: セットする clear: 消去する - time: "例: アップデートが日本時間の12月13日23:00から予定されています。その間サインインがうまくできない可能性があります。" + time: "例: アップデートが日本時間の12月13日23:00から予定されています。その間サインインがうまくできない可能性があります。" preupload: - info: ユーザがプレゼン資料を事前にアップロードできるようになります。この資料は、会議室固有の標準資料として使用されます。 + info: ユーザーがプレゼン資料を事前にアップロードできるようになります。この資料は、会議室固有の標準資料として使用されます。 title: プレゼン資料の事前アップロードを許可 registration: - info: ユーザがWebサイトに登録する方法を変更する + info: ユーザーがWebサイトに登録する方法を変更します title: 登録方法 methods: approval: 承認制 invite: 招待制 open: 自由登録 rooms: - info: ユーザが所有できる会議室の数を制限します(メイン会議室を含む)。 この設定は管理者には適用されません。 - title: ユーザあたりの会議室数 + info: ユーザーが所有できる会議室の数を制限します(主会議室を含む)。 この設定は管理者には適用されません。 + title: ユーザーあたりの会議室数 shared_access: - info: 無効に設定すると、各会議室のドロップダウンから「アクセス管理」ボタンが削除され、ユーザが会議室を共有できなくなります + info: 無効に設定すると、各会議室のドロップダウンから「アクセス管理」ボタンが削除され、ユーザーが会議室を共有できなくなります title: 会議室の共有を許可 subtitle: Greenlightのカスタマイズ tabs: @@ -119,60 +119,66 @@ ja_JP: settings: 設定 title: サイトの設定 flash: - approved: ユーザが承認されました。 - banned: ユーザがロックされました。 - unbanned: ユーザのロックが解除されました。 - delete: ユーザが削除されました - delete_fail: ユーザを削除できませんでした - demoted: ユーザが降格されました + approved: ユーザーが承認されました。 + banned: ユーザーがロックされました。 + unbanned: ユーザーのロックが解除されました。 + delete: ユーザーが削除されました + delete_fail: ユーザーを削除できませんでした + demoted: ユーザーが降格されました invite: "%{email} に招待状を送信しました" invite_email_verification: この方法を使用するには、メールを有効にする必要があります。 システム管理者にお問い合わせください。 - merge_fail: ユーザアカウントのマージ中に問題が発生しました。 選択したユーザを確認して、もう一度お試しください - merge_success: ユーザアカウントがマージされました - perm_deleted: ユーザが完全に削除されました - promoted: ユーザが昇格しました + merge_fail: ユーザーアカウントのマージ中に問題が発生しました。 選択したユーザーを確認して、もう一度お試しください + merge_success: ユーザーアカウントがマージされました + perm_deleted: ユーザーが完全に削除されました + promoted: ユーザーが昇格しました registration_method_updated: 登録方法が更新されました - reset_password: パスワードをリセットするためのメールがユーザに送信されました。 (受信していない場合は、迷惑メールフォルダを確認してみてください) - restored: ユーザが復元されました + reset_password: パスワードをリセットするためのメールがユーザーに送信されました。 (受信していない場合は、迷惑メールフォルダを確認してみてください) + restored: ユーザーが復元されました room_configuration: 会議室の設定が変更されました。 settings: サイト設定が変更されました - unauthorized: このユーザにアクションを実行する権限がありません + unauthorized: このユーザーにアクションを実行する権限がありません recordings: + latest: 最近の録画 title: すべての録画 no_recordings: このサーバには録画がありません。 + search_info: ユーザーの電子メールアドレスか、会議室のIDを入力して下さい。 roles: - appear_in_share_list: 会議室共有のドロップダウンにこの役割を割り当てられたユーザを含める + appear_in_share_list: 会議室共有のドロップダウンに含める can_create_rooms: 会議室の作成権 + can_launch_recording: 会議を録画する権限 delete: 役割の削除 invalid_create: 新しい役割の作成中に問題が発生しました。 設定を確認して再度お試しください invalid_order: 役割の優先度を更新中に問題が発生しました。 設定を確認して再度お試しください invalid_update: 役割の権限を更新中に問題が発生しました。 設定を確認して再度お試しください - manage_rooms_recordings: サーバに存在する全ての会議室と録画の管理権を許可 + manage_rooms_recordings: 会議室と録画を管理する権限 name: 役割の名前 new_role: 新しい役割を作成する role_has_users: "この役割は %{user_count} アカウントに割り当てられています。 削除する前に、この役割からすべてのアカウントを削除してください。" title: 役割 - promote_email: ユーザにこの役割が割り当てられたときにメールを送信する - demote_email: ユーザがこの役割を解除されたときにメールを送信する + promote_email: この役割が割り当てられたときにはメールで知らせる + demote_email: この役割を解除されたときはメールで知らせる edit_site_settings: サイト設定の編集権 edit_roles: 役割の編集権 - manage_users: ユーザの管理権 - invalid_assignment: ユーザへの役割設定中に問題が発生しました。 設定を確認して再度お試しください + manage_users: ユーザーの管理権 + invalid_assignment: ユーザーへの役割設定中に問題が発生しました。 設定を確認して再度お試しください colour: title: 役割の色 info: 役割に関連付ける色を設定します room_configuration: title: 会議室の設定 mute: - info: ユーザが会議に参加した時、自動的にミュートします。 + info: ユーザーが会議に参加した時、自動的にミュートします。 require_moderator: - info: ユーザが会議に参加しようとした時、モデレータに問い合わせが行きます。許可が得られればユーザは参加できます。 + info: ユーザーが会議に参加しようとした時、モデレータに問い合わせが行きます。許可が得られればユーザーは参加できます。 allow_any: - info: 全てのユーザがいつでも会議を開始することを許可します。通常は会議室のオーナーだけが会議を開始できます。 + info: 全てのユーザーがいつでも会議を開始することを許可します。通常は会議室のオーナーだけが会議を開始できます。 all_moderator: - info: すべてのユーザに、会議に参加した時点で司会者の権限をあたえます。 + info: すべてのユーザーに、会議に参加した時点で司会者の権限をあたえます。 recordings: info: 会議室のオーナーが、会議を録画させるかどうかの選択肢を提供できるようになります。これをオンにしたとしても、録画を開始するためには、司会者は"録画"ボタンを押す必要があります。 + moderator_codes: + info: 会議室の所有者に、モデレーターPINコードの発行を許可します。このコードがあれば、他のユーザーが直接モデレーターとして会議に参加できます。 + title: モデレーターPINコード options: disabled: 常に無効 enabled: 常に有効 @@ -188,35 +194,35 @@ ja_JP: running: 会議中 started: "会議開始: %{session}" status: 状況 - view: 表示 + view: 見る title: 設定 users: - invite: ユーザを招待する + invite: ユーザーを招待する edit: - title: ユーザ詳細の編集 + title: ユーザーの詳細情報を編集 settings: approve: 承認する decline: 却下する - ban: ユーザをロックする + ban: ユーザーをロックする delete: 削除する edit: 編集する - edit_roles: ユーザの役割を編集する + edit_roles: ユーザーの役割を編集する merge: マージ perm_delete: 完全に削除する - unban: ユーザのロックを解除 + unban: ユーザーのロックを解除 undelete: 削除の取消 table: authenticator: 認証元 created: 作成 time: 送付時刻 name: 名前 - not_found: 検索に一致するユーザはいません - no_users: ユーザが見つかりません + not_found: 検索条件に一致するユーザーはいません + no_users: ユーザーが見つかりません role: 役割 - uid: ユーザID - username: ユーザ名 + uid: ユーザーID + username: ユーザー名 valid: 有効 - title: ユーザ管理 + title: ユーザー管理 add_to_google_calendar: "Googleカレンダーに追加" bigbluebutton: BigBlueButton bigbluebutton_exception: 会議を開始するときにエラーが発生しました! @@ -224,6 +230,7 @@ ja_JP: cookies: cookie_info: Cookieはこのサービスの提供に使われています。 このサービスの利用によりCookieの使用に同意したことになります。 cookie_button: 同意する + policy: "詳しくは私たちの プライバシーポリシーをご覧ください。" copied: コピー済み copy: コピー date: @@ -262,6 +269,7 @@ ja_JP: accepted: 受け入れる必要があります confirmation: "%{attribute} と一致しません" inclusion: リストに含まれていません + domain: "\"%{email_domain}\"で終わる必要があります" no_provider: message: アクセスしようとしているサイトは有効になっていません help: Greenlightの設定については、システム管理者にお問い合わせください。 @@ -270,7 +278,7 @@ ja_JP: help: 削除されている可能性はありませんか? user_not_found: help: 管理者にお問い合わせください。 - message: このユーザは登録されていません。 + message: このユーザーは登録されていません。 user_missing: help: URLを確認して再度お試しください message: 入力されたURLは無効です。 @@ -284,7 +292,7 @@ ja_JP: rooms: 会議室の作成 recordings: 録画の管理 designs: デザインの調整 - authentication: ユーザの認証 + authentication: ユーザーの認証 footer: legal: 利用規約 privpolicy: プライバシーポリシー @@ -303,9 +311,10 @@ ja_JP: home: ホーム settings: プロフィール signout: サインアウト - home_room: メイン会議室 + home_room: 主会議室 info_update_success: 情報を更新しました。 invalid_credentials: 入力されたメールアドレスとパスワードが登録内容と一致しませんでした。 もう一度試すか[パスワードを忘れた場合]をクリックしてパスワードをリセットしてください。 + invalid_credentials_external: 入力したEメールアドレスとパスワードがこちらの記録と違っています。もう一度入力してみてください。 invalid_login_method: アカウントが一致しないため、ログインに失敗しました。 Omniauthでログインする必要があります。 invite_message: "誰かを会議に招待するには、このリンクを送信します:" javascript: @@ -318,7 +327,7 @@ ja_JP: search: start: 検索開始... landing: - about: "%{href}は、オープンソースWeb会議サーバ BigBlueButton のシンプルなフロントエンドです。 自分の会議室を作成してセッションを主催したり、簡単なリンクを使用して他のユーザが参加したりできます。" + about: "%{href}は、オープンソースWeb会議サーバ BigBlueButton のシンプルなフロントエンドです。 自分の会議室を作成してセッションを主催したり、簡単なリンクを使用して他のユーザーを招待したりできます。" welcome: BigBlueButton へようこそ video: Greenlightの使い方に関するチュートリアルを見る upgrade: 2.0にアップグレードする方法を教えて! @@ -334,29 +343,30 @@ ja_JP: signin: パーソナル会議室にアクセスするには、下のボタンをクリックしてサインインしてください。 signin_link: サインイン signup: - info: 新しいユーザがGreenlightを利用するためにサインアップしました。 - more-info: このユーザがGreenlightにアクセスできるようにするには、[構成の設定]でアカウントを承認する必要があります。 + info: 新しいユーザーがGreenlightを利用するためにサインアップしました。 + more-info: このユーザーがGreenlightにアクセスできるようにするには、「構成の設定」でアカウントを承認する必要があります。 admins_link: 構成ページを見る - subject: 新しいGreenlightユーザのサインアップ - username: "ユーザは名前 %{name} とメールアドレス %{email} でサインアップしました。" + subject: 新しいGreenlightユーザーのサインアップ + username: "このユーザーは名前 %{name} とメールアドレス %{email} でサインアップしました。" subject: アカウントが承認されました - username: "あなたのユーザ名は %{email} です。" + username: "あなたのユーザー名は %{email} です。" demoted: info: "あなたは %{url} の %{role} ではなくなりました。" - more-info: これで通常のユーザと同じ権限が与えられるようになりました。 + more-info: これであなたに通常のユーザーと同じ権限が与えられました。 root_link: サインイン subtitle: "%{role} の権限が取り消されました" invite: - info: "%{name} があなたのパーソナルスペースに招待されました" + info: "%{name} があなたをパーソナルスペースに招待しました" signup_info: メールを使ってサインアップするには、以下のボタンをクリックして、手順に従ってください。 signup_link: サインアップ + valid: "招待の有効期限: %{date}" signup: - info: 招待されたユーザがGreenlightを使用するためにサインアップしました。 + info: 招待されたユーザーがGreenlightを使用するためにサインアップしました。 admins_link: 構成ページにアクセス - subject: 新しいGreenlightユーザのサインアップ - username: "ユーザは名前 %{name} とメールアドレス %{email} でサインアップしました。" + subject: 新しいGreenlightユーザーのサインアップ + username: "このユーザーは %{name} という名前と %{email} というメールアドレスでサインアップしました。" subject: BigBlueButtonへの招待 - username: "あなたのユーザ名は %{email} です。" + username: "あなたのユーザー名は %{email} です。" password_reset: title: 'パスワードのリセット' welcome: "メールアドレス %{email} のパスワードリセットが要求されました。" @@ -371,8 +381,8 @@ ja_JP: subtitle: "%{role} 権限の付与" verify_email: welcome: "%{name}さん パーソナルスペースへようこそ!" - success: "%{bigbluebutton} を活用して、自分の会議室を作成したり、セッションをホストしたり、他のユーザと共同作業したりできます。" - username: "あなたのユーザ名は %{email} です。" + success: "%{bigbluebutton} を活用して、自分の会議室を作成したり、セッションをホストしたり、他のユーザーと共同作業したりできます。" + username: "あなたのユーザー名は %{email} です。" verify: アカウントを確認するには、下のボタンをクリックしてください。 verify_text: 'アカウントを確認するには、次のリンクにアクセスしてください: %{url}' verify_link: アカウントを確認 @@ -388,7 +398,11 @@ ja_JP: title: 新しい役割を作成 create_room: access_code: アクセスコード + moderator_access_code: モデレーターコード access_code_placeholder: 会議室のアクセスコードを生成する + reset_access_code: 会議室のアクセスコードをリセットする + moderator_access_code_placeholder: モデレーターコードを作成する + reset_moderator_access_code: モデレーターコードをリセットする auto_join: 会議に自動的に参加する create: 会議室の作成 free_delete: この会議室はいつでも自由に削除できます。 @@ -399,7 +413,7 @@ ja_JP: confirm: このアカウントを削除してもよろしいですか? delete: このアカウントを削除します。 keep: やっぱり残します。 - delete_warning: これによりユーザのアカウントが無効になります。 無効化されたすべてのユーザは[削除]タブに表示されます。 + delete_warning: これによりユーザーのアカウントが無効になります。 無効化されたすべてのユーザーは[削除]タブに表示されます。 warning: この決定は最終的なものです。 関連するデータを回復することは二度とできません。 delete_rec: delete: はい、削除します。 @@ -412,10 +426,10 @@ ja_JP: warning: この会議室を復活させることはできません  recording_warning: "また、これに関連した  %{recordings_num} 個の録画も同様です。" invite_user: - email_placeholder: ユーザのメールアドレスを入力してください(複数の場合はコンマ区切り) - footer: ユーザには、サインアップ方法の説明が記載されたメールが届きます + email_placeholder: ユーザーのメールアドレスを入力してください(複数の場合は半角コンマ区切り) + footer: ユーザーには、サインアップ方法の説明が記載されたメールが届きます send: 招待状を送る - title: ユーザを招待 + title: ユーザーを招待 login: or: あるいは with: "%{provider} でサインイン" @@ -437,30 +451,30 @@ ja_JP: title: 会議室の設定 update: 会議室の更新 client: クライアントの種類を選択 - join_moderator: すべてのユーザがモデレータとして参加 - mute: 参加時にユーザをミュート + join_moderator: すべてのユーザーがモデレータとして参加 + mute: 参加時にユーザーをミュート require_approval: 会議参加にモデレータの承認を必要とする - start: すべてのユーザに会議の開始を許可 + start: すべてのユーザーに会議の開始を許可 footer_text: 会議室の設定はいつでも変更可能です。 recording: 会議室の録画を許可 rename_room: name_placeholder: 新しい会議室名を入力してください... share_access: - footer: ユーザと会議室を共有すると、 ユーザは会議を開始したり会議の録画を表示したりできます - list: 共有するユーザ + footer: 会議室アクセスを共有すると、 ユーザーでも会議を開始したり録画リストをみたりできます + list: 共有するユーザー title: 会議室アクセスの共有 save: 変更を保存 cancel_changes: 変更をキャンセル - select: ユーザの選択 + select: ユーザーの選択 merge_user: cancel: キャンセル from: マージするアカウント - title: ユーザアカウントのマージ + title: ユーザーアカウントのマージ to: プライマリアカウント save: マージ footer: マージされるアカウントの会議室は、アカウント削除前にプライマリアカウントの会議室一覧に転送されます。 name_update_success: 会議室名が変更されました! - no_user_email_exists: 指定されたメールアドレスを持つ既存のユーザはいません。 入力内容を確認してください。 + no_user_email_exists: 指定されたメールアドレスを持つユーザーは存在しません。 入力内容を確認してください。 omniauth_error: OmniAuthで認証中にエラーが発生しました。 再試行するか、管理者に連絡してください! omniauth_specific_error: "OmniAuthで認証中に %{error} が発生しました。再試行するか、管理者に連絡してください!" pagy: @@ -477,6 +491,7 @@ ja_JP: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID接続 recaptcha: errors: recaptcha_unreachable: reCAPTCHA応答の検証に失敗しました。 もう一度お試しください。 @@ -485,9 +500,11 @@ ja_JP: all_recordings: すべての録画 email: 録画情報をメールする error: "%{count} 件の録画取得中にエラーが発生しました" - no_recordings: "この会議室には %{inject} 録画はありません。" + no_public_recordings: この会議室では録画の公開はありません。 + no_recordings: この会議室には録画がありません。 no_user_recordings: 現在、録画はありません。 - no_matched_recordings: "検索に一致する %{inject} 録画はありません。" + no_matched_pub_recordings: 公開された録画には、検索条件に一致するものはありません。 + no_matched_recordings: 検索条件に一致する録画はありません。 recorded_on: "録画日は %{date} です" table: name: 名前 @@ -497,6 +514,7 @@ ja_JP: visibility: 公開度 formats: 再生フォーマット visibility: + inaccessible: 閲覧不可 public: 公開 unlisted: 限定公開 format: @@ -522,6 +540,7 @@ ja_JP: remove: 削除 rename: 名前の変更 reset_password: + captcha: reCAPTCHAの検証に失敗しました。 もう一度お試しください。 invalid_token: パスワードの再設定トークンが正しくありません。パスワードの再設定をもう一度行ってみてください。 subtitle: パスワードを再設定する password: 新しいパスワード @@ -534,32 +553,36 @@ ja_JP: banned: ロック deleted: 削除 pending: 保留 - user: ユーザ + invited: 招待 + user: ユーザー room: access_code_required: 会議に参加するには、有効なアクセスコードを入力してください add_presentation: プレゼン資料を追加 copy_access: アクセスコードをコピー + copy_moderator_access: モデレーターコードをコピーする create_room: 会議室の作成 create_room_error: 会議室の作成中にエラーが発生しました create_room_success: 会議室が作成されました delete: - home_room: メイン会議室は削除できません + home_room: 主会議室は削除できません success: 会議室を削除しました fail: "会議室の削除に失敗しました(%{error})" enter_the_access_code: 会議室のアクセスコードを入力してください + enter_the_moderator_access_code: モデレーターコードを使用して会議室に入室する + optional_moderator_access_code: "予備のモデレーターコード" invalid_provider: 無効なURLを入力しました。 URLを確認して、もう一度試してみてください。 - invitation_description: "BigBlueButtonを使用して%{name}に参加するよう招待されました。参加するためには下のリンクをクリックし、名前を入力してください。" + invitation_description: "BigBlueButtonを使用して%{name}に参加するよう招待されました。参加するためには下のリンクをクリックし、名前を入力してください。" invited: 招待されています recording_present: このセッションが録画されるかもしれないこと、その場合自分の声や動画が録画に含まれうることを承知しています。 - invite_participants: 参加者を招待 + invite_participants: 参加者を招待する join: 参加する - last_session: "%{session} :最後のセッション" + last_session: "最後のセッション:%{session}" login: 入力 owner: オーナー owner_banned: この会議室は現在利用できません no_room: description: 参加する会議室のURLまたはIDを入力します。 - edit_profile: ユーザプロファイルの編集 + edit_profile: ユーザープロファイルの編集 go_to: 会議室へ invalid_room_uid: 入力された会議室の URL/UID は無効です placeholder: 会議室の URL/UID @@ -567,11 +590,11 @@ ja_JP: recent_rooms: 最近参加した会議室に移動 title: 会議に参加 no_sessions: まだ会議は一度も開催されていません! - preupload_success: プレゼン資料の追加に成功 + preupload_success: プレゼン資料を追加しました preupload_error: 会議室のプレゼン資料をアップデートする際にエラーが起こりました - preupload_remove_success: プレゼン資料の消去に成功 + preupload_remove_success: プレゼン資料を消去しました preupload_remove_error: 会議室のプレゼン資料を消去する際にエラーが起こりました - recordings: 録画 + recordings: 会議室の録画 room_limit: 許可された会議室数の上限に達しました room_limit_exceeded: "許可された会議室数を超えています。 この会議室にアクセスするには、会議室を %{difference} 個削除してください。" sessions: セッション @@ -582,7 +605,7 @@ ja_JP: remove_shared_access_error: リストから共有会議室を削除中にエラーが発生しました shared_access_success: 会議室を共有しました shared_access_error: 会議室の共有設定中にエラーが発生しました - start: 開始 + start: 会議を始める search: 会議室を探す... unavailable: この会議室はオーナーのメールが確認されていないため、現在利用できません。 update_settings_error: 会議室の設定更新中にエラーが発生しました @@ -597,10 +620,10 @@ ja_JP: provider: 認証元 image: プロフィール画像 image_url: プロフィール画像のURL - roles: ユーザの役割 + roles: ユーザーの役割 subtitle: アカウント情報を更新する title: アカウント情報 - reset_password: ユーザのパスワードを再設定する + reset_password: ユーザーのパスワードを再設定する delete: button: はい、アカウントを削除します disclaimer: アカウントを削除した場合、アカウントを回復することはできません。 設定、会議室、録画など、アカウントに関するすべての情報が削除されます。 @@ -625,6 +648,9 @@ ja_JP: title: 利用規約 test_install: > この構成では、事前に構成されたテストサーバを使用しています。これを独自のものに置き換える必要があります。 詳細については %{href} をご覧ください。 + time: + formats: + default: "%Y年%b%d日 %-I:%M%P" update: 更新 verify: accept: 確認 diff --git a/config/locales/ko_KR.yml b/config/locales/ko_KR.yml index 07394c3a..80428799 100644 --- a/config/locales/ko_KR.yml +++ b/config/locales/ko_KR.yml @@ -69,6 +69,10 @@ ko_KR: regular: 정규색 lighten: 밝게 darken: 어둡게 + email_mapping: + info: "이메일을 사용하여 사용자를 역할에 매핑합니다. email1 = role1, email2 = role2 형식이어야합니다." + title: 이메일로 역할 매핑 + update: log_level: title: 로그 레벨 information: 전체 배포 로그 수준 변경 @@ -90,7 +94,7 @@ ko_KR: title: 유지보수 배너 display: Set clear: Clear - time: "예: 12월 13일 업데이트 예정 @ 23:00 ET. 사용자는 로그인하는 데 문제가 발생할 수 있다." + time: "예: 12월 13일 업데이트 예정 @ 23:00 ET. 사용자는 로그인하는 데 문제가 발생할 수 있다." preupload: info: 사용자는 프리젠테이션을 해당 ROOM의 기본 프리젠테이션으로 사용할 수 있음 title: 사용자가 프레젠테이션을 미리 업로드하도록 허용 @@ -111,6 +115,7 @@ ko_KR: tabs: appearance: 외관 administration: 관리자 + registration: 등록 settings: 설정 title: 사이트 설정 flash: @@ -133,8 +138,10 @@ ko_KR: settings: 사이트 설정이 변경되었습니다. unauthorized: 이 사용자에 대해 작업을 수행 할 권한이 없습니다. recordings: + latest: 최신 녹화 title: 서버 레코딩 no_recordings: 이 서버에는 레코딩이 없습니다. + search_info: 사용자의 전체 이메일 또는 room의 uid를 입력하십시오. roles: appear_in_share_list: 공유 ROOM의 드롭다운에 이 역할을 가진 사용자 포함 can_create_rooms: ROOM을 생성 @@ -168,11 +175,15 @@ ko_KR: info: 미팅에 참여할 때 모든 사용자에게 BigBlueButton의 관리자 권한을 부여합니다. recordings: info: ROOM 소유자가 옵션에서 ROOM을 레코딩할지 여부를 지정할 수 있습니다. 활성화 된 경우에도 미팅 주관자는 회의 또는 강의가 시작된 후에 "녹화"버튼을 클릭해야합니다. + moderator_codes: + info: room 소유자가 선택적으로 다른 사용자가 중재자로 직접 참여할 수 있도록 중재자 pin을 생성 할 수 있습니다. + title: 중재자 액세스 코드 options: disabled: 비활성 enabled: 언제나 활성 optional: 선택사항 rooms: + timeout: "%{server} 서버 요청 시간 초과로 인해 상태 및 참가자에 대한 정보가 정확하지 않을 수 있습니다." title: 서버 ROOM들 table: ended: "종료: %{session}" @@ -202,12 +213,14 @@ ko_KR: table: authenticator: 인증자 created: 생성 + time: 보낸 시간 name: 이름 not_found: 검색과 일치하는 사용자가 없습니다. no_users: 사용자가 없습니다. role: Role uid: 사용자 ID username: 사용자명 + valid: 유효한 title: 사용자 관리 add_to_google_calendar: "Google Calendar 추가" bigbluebutton: BigBlueButton @@ -216,6 +229,7 @@ ko_KR: cookies: cookie_info: Cookies는 본서비스를 제공하는 데 도움이됩니다. 본서비스를 사용함으로써 귀하는 Cookies 사용에 동의하게됩니다. cookie_button: 동의함 + policy: "자세한 내용은 개인 정보 보호 정책 을 참조하십시오." copied: 복사됨 copy: 복사 date: @@ -310,7 +324,7 @@ ko_KR: search: start: 검색 시작 ... landing: - about: "%{href}는 당신의 BigBlueButton 오픈 소스 웹 레퍼런스 서버를 위한 간단한 프론트엔드 입니다. 당신은 당신만의 Room을 만들어 세션을 주최하거나 짧고 편리한 링크를 사용하여 다른 사람과 함께 할 수 있다." + about: "%{href}는 BigBlueButton 오픈 소스 웹 레퍼런스 서버를 위한 간단한 프론트엔드 입니다. 자신만의 Room을 만들어 세션을 주최하거나 짧고 편리한 링크를 사용하여 다른 사람과 함께 할 수 있습니다." welcome: BigBlueButton에 오신 것을 환영합니다. video: Greenlight 사용에 대한 자습서보기 upgrade: 2.0으로 업그레이드하는 방법을 보여주세요! @@ -342,6 +356,7 @@ ko_KR: info: "%{name}가 사용자 자신의 개인 공간에 초대하였습니다." signup_info: 이메일을 사용하여 가입하려면 아래 버튼을 클릭하고 단계를 따르십시오. signup_link: 가입하기 + valid: "초대는 %{date}까지 유효합니다." signup: info: 초대 된 사용자가 Greenlight를 사용하도록 등록했습니다. admins_link: 조직 페이지 방문 @@ -380,7 +395,9 @@ ko_KR: title: 새 Role 생성 create_room: access_code: 액세스 코드 + moderator_access_code: 중재자 코드 access_code_placeholder: 선택적 room 액세스 코드 생성 + moderator_access_code_placeholder: 중재자를위한 선택적 코드 생성 auto_join: 자동으로 room에 참여 create: Room 만들기 free_delete: 이 room은 언제든지 삭제할 수 있습니다. @@ -393,6 +410,10 @@ ko_KR: keep: 보관합니다. delete_warning: 사용자 계정이 비활성화됩니다. 비활성화 된 모든 사용자는 삭제 된 탭에서 찾을 수 있습니다. warning: 이 결정은 최종적입니다. 이 아니라 관련 데이터를 복구할 수 없습니다. + delete_rec: + delete: 이 녹음을 삭제하겠습니다. + header: "이 녹음을 삭제 하시겠습니까?" + warning: 이 기록을 복구 할 수 없습니다. delete_room: confirm: "%{room}을 삭제하시겠습니까?" delete: 이 room을 삭제하겠습니다. @@ -427,8 +448,8 @@ ko_KR: client: 클라이언트 유형 선택 join_moderator: 모든 사용자가 중재자로 참여합니다. mute: 사용자가 참여할 때 음소거 - require_approval: 가입하기 전에 중재자 승인 필요 - start: 모든 사용자가 이 미팅을 시작하도록 허용 + require_approval: 참여하기 전에 중재자 승인 필요 + start: 모든 사용자가 미팅을 시작할 수 있도록 허용 footer_text: room 조정은 언제든지 가능합니다. recording: room에서 레코딩이 되도록 허가 rename_room: @@ -465,6 +486,7 @@ ko_KR: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID 연결 recaptcha: errors: recaptcha_unreachable: reCAPTCHA에서 유효성을 확인하지 못했습니다. 다시 시도하십시오. @@ -510,6 +532,7 @@ ko_KR: remove: 삭제 rename: 이름 변경 reset_password: + captcha: reCAPTCHA 확인 실패. 다시 시도하십시오. invalid_token: 암호 재설정 토큰이 잘못되었습니다. 암호를 다시 설정해 보십시오. subtitle: 암호 재설정 password: 새로운 패스워드 @@ -522,10 +545,13 @@ ko_KR: banned: 금지 deleted: 삭제 pending: 보류 + invited: 초대 됨 user: 사용자 room: access_code_required: room에 가입하려면 유효한 액세스 코드를 입력하십시오. add_presentation: 프레젠테이션 추가 + copy_access: 액세스 코드 복사 + copy_moderator_access: 중재자 코드 복사 create_room: Room 생성 create_room_error: room을 만드는 동안 오류가 발생함 create_room_success: Room이 성공적으로 생성됨 @@ -534,8 +560,10 @@ ko_KR: success: Room이 성공적으로 삭제됨 fail: "룸 삭제 실패(%{error})" enter_the_access_code: Room의 접근 코드 입력 + enter_the_moderator_access_code: room의 운영자 코드를 입력하세요. + optional_moderator_access_code: "선택적 중재자 코드 :" invalid_provider: 잘못된 URL을 입력하셨습니다. URL을 확인한 후 다시 시도하십시오. - invitation_description: "BigBlueButton을 통하여 %{name}에 가입하도록 초대받으셨습니다. 가입하려면 위의 링크를 클릭하고 이름을 입력하십시오." + invitation_description: "BigBlueButton을 통하여 %{name}에 가입하도록 초대받으셨습니다. 가입하려면 위의 링크를 클릭하고 이름을 입력하십시오." invited: 귀하는 초대를 받았습니다. recording_present: 나는 이 세션이 레코딩 될 것이라는 것을 인지하고 있습니다. 활성화할 경우 내 음성 및 비디오가 포함될 수 있습니다. invite_participants: 참가자 초대 @@ -570,6 +598,7 @@ ko_KR: shared_access_success: room 공유 성공 shared_access_error: room을 공유하는 동안 오류가 발생함 start: 시작 + search: room 검색 unavailable: 이 room은 현재 소유자의 이메일이 확인되지 않아 사용할 수 없습니다. update_settings_error: room 설정을 업데이트하는 동안 오류가 발생함 update_settings_success: Room 설정이 성공적으로 업데이트 됨 @@ -578,7 +607,7 @@ ko_KR: auto: 미팅이 시작되면 자동으로 참여하십시오. settings: account: - fullname: 풀네임 + fullname: 성명 language: 언어 provider: 제공자 image: 이미지 diff --git a/config/locales/mn_MN.yml b/config/locales/mn_MN.yml new file mode 100644 index 00000000..d6502bec --- /dev/null +++ b/config/locales/mn_MN.yml @@ -0,0 +1,662 @@ +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . + +# Locale. + +mn_MN: + activerecord: + attributes: + user: + accepted_terms: "Нөхцлүүд" + email: Цахим шуудан + name: Нэр + password: Нууц үг + password_confirmation: Нууц үг баталгаажуулах + errors: + models: + user: + confirmation: Нууц үг тохирохгүй байна + administrator: + site_settings: + authentication: + disabled: Идэвхгүй болгосон + enabled: Идэвхжүүлсэн + info: Зөвхөн баталгаажсан хэрэглэгчдийг өрөөнд нэгдэхийг зөвшөөрнө + title: Өрөөнүүдийн баталгаажуулалтыг шаардах + user-info: Энэхүү өрөөнд нэгдэхийн тулд дээрх дээр нэвтэрч орох ёстой. + branding: + change: Зургийг өөрчлөх + info: Зүүн дээд өнцөгт харагдах брэндингийн зургийг өөрчлөх + placeholder: Зургийн Url... + title: Брэндингийн зураг + invalid: Хүчингүй URL + legal: + change: URL-г өөрчлөх + info: Хуудасны доор харагдах Нөхцлүүдийн холбоосыг өөрчлөх + placeholder: Нөхцлүүдийн URL... + title: Нөхцлүүд + invalid: Хүчингүй URL + privpolicy: + change: URL-г өөрчлөх + info: Хуудасны доор харагдах Нууцлалын бодлогын холбоосыг өөрчлөх + placeholder: Нууцлалын бодлогын URL... + title: Нууцлалын бодлого + invalid: Хүчингүй URL + cache: + info: Шинэчилсэн мэдээлэл авах шинэ хүсэлтийг хүчээр үүсгэдэг үйлчилгээ үзүүлэгчийн хадгалсан кэшийг арилгана + title: Үйлчилгээ үзүүлэгчийн кэшийг арилгах + button: Кэшийг арилгах + clear_auth: + info: Өөр баталгаажуулах арга ашиглахдаа эргэн нэвтрэх боломж олгох хэрэглэгчдийн одоогийн баталгаажуулагчийг устгана + title: Одоогийн баталгаажуулагчийн устгах + button: Баталгааг арилгах + color: + info: "Ердийн өнгийг өөрчилснөөр Цайруулах, Харлуулахын аль алиныг өөрчилнө. Улмаар Цайруулах, Харлуулахыг тус тусад нь өөрчилнө." + title: Үндсэн өнгө + regular: Ердийн + lighten: Цайруулах + darken: Харлуулах + email_mapping: + info: "Хэрэглэгчийн цахим шууданг ашиглан үүрэг хариуцлагыг зураглах. email1=role1,email2=role2 гэсэн форматтай байна." + title: Цахим шуудангаар үүрэг хариуцлагыг зураглах + update: + log_level: + title: Бүртгэлийн түвшин + information: Бүрэн хуваарилалтын Бүртгэлийн түвшинг өөрчлөх + debug: Алдаа засах + info: Мэдээлэл + warn: Анхааруулах + error: Алдаа + fatal: Хортой + unknown: Үл мэдэгдэх + recording_visibility: + info: Шинэ бичлэг дээр бичлэгийн үндсэн харагдах байдлыг тохируулах + title: Бичлэгийн үндсэн харагдах байдал + warning: Ажиллахгүй байгаа өрөөнүүдэд зөвхөн энэхүү тохиргоог ашиглана + require_consent: + info: Аль өрөөнд бичлэг хийж болохыг тодорхойлох боломжтой болгох өрөөний тохиргоог энэхүү тохиргоогоор олгоно. Бичлэг хийх өрөөнд холбогдож буй хэрэглэгчид холбогдохоос өмнө үүнийг зөвшөөрнө. + title: "Өрөө эзэмшигч, холбогдогч нараар бичлэг хийхийг зөвшөөрүүлэх шаардлагатай" + maintenance_banner: + info: Хуваарь засвар үйлчилгээний талаар хэрэглэгчид мэдээлэх Самбар харуулна + title: Засвар үйлчилгээний самбар + display: Тохируулах + clear: Арилгах + time: "Жишээ: 12 дугаар сарын 13-ны өдрийн 23:00 ET-д хуваарьтай арга хэмжээг шинэчлэх. Хэрэглэгчид нэвтрэх үедээ асуудалтай тулгарч болно." + preupload: + info: Хэрэглэгчид тухайн өрөөд зориулсан үндсэн презентаци болгон аливаа презентацийг урьдчилан байрлуулж болно + title: Хэрэглэгчдэд презентацийг урьдчилан байрлуулах боломж олгох + registration: + info: Хэрэглэгчдийн вэбсайтад бүртгүүлэх арга замыг өөрчлөх + title: Бүртгүүлэх арга + methods: + approval: Батлах/Татгалзах + invite: Урилгаар Холбогдох + open: Бүртгэлийг нээх + rooms: + info: Хэрэглэгчийн эзэмшиж болох өрөөний тоог хязгаарлана (Үндсэн өрөөг оруулан). Энэхүү тохиргоо администраторуудад хамаараахгүй. + title: Хэрэглэгч бүрт ногдох Өрөөний тоо + shared_access: + info: Идэвхгүйд зориулсан тохиргоогоор Өрөөний сонголтын доош урсдаг цэснээс товчийг арилгаж хэрэглэгчдийг өрөөг хуваалцах боломжгүй болгоно. + title: Хэрэглэгчдэд Өрөө хуваалцах боломж олгох + subtitle: Ногоон гэрлийг тохируулах + tabs: + appearance: Харагдах байдал + administration: "Удирдлага " + registration: Бүртгэл + settings: Тохиргоо + title: Сайтын тохиргоо + flash: + approved: Хэрэглэгчийг амжилттай баталлаа. + banned: Хэрэглэгчийг амжилттай хориглолоо. + unbanned: Хэрэглэгчийн хоригийг амжилттай цуцаллаа. + delete: Хэрэглэгчийг амжилттай устгалаа + delete_fail: Хэрэглэгчийг устгаж чадсангүй + demoted: Хэрэглэгчийн зэрэглэлийг амжилттай буурууллаа + invite: "Урилгыг %{email}руу амжилттай илгээлээ" + invite_email_verification: Энэхүү аргыг ашиглахын тулд цахим шууданг идэвхжүүлэх ёстой. Системийн администратортойгоо холбоо барина уу. + merge_fail: Хэрэглэгчийн бүртгэлийг нэгтгэх явцад асуудал үүслээ. Сонгосон хэрэглэгчийг шалгаад дахин оролдоно уу + merge_success: Хэрглэгчийн бүртгэлийг амжилттай нэгтгэлээ + perm_deleted: Хэрэглэгчийг бүрмөсөн устгалаа + promoted: Хэрэглэгчийн зэрэглэлийг амжилттай нэмэгдүүллээ + registration_method_updated: Бүртгэлийн аргыг амжилттай шинэчиллээ + reset_password: Нууц үгээ дахин тохируулах цахим шууданг хэрэглэгч рүү илгээлээ. (Цахим шуудан хүлээж аваагүй бол спам хавтасаа шалгахыг түүнээс хүснэ үү) + restored: Хэрэглэгчийг амжилттай сэргээлээ + room_configuration: Өрөөний тохиргоог амжилттай өөрчиллөө + settings: Сайтын тохиргоог амжилттай өөрчиллөө + unauthorized: Энэхүү хэрэглэгч дээр үйлдэл гүйцэтгэх эрхийг танд өгөөгүй + recordings: + latest: Сүүлийн бичлэг + title: Серверийн бичлэг + no_recordings: Энэхүү сервер дээр бичлэг хийгээгүй байна. + search_info: "Хэрэглэгчийн бүрэн цахим шууданг, эсвэл өрөөний uid-г оруулна уу" + roles: + appear_in_share_list: Хуваалцах өрөөнд зориулсан доош урсах цэсэн дээрх энэхүү үүрэг бүхий хэрэглэгчдийг оруулах + can_create_rooms: Өрөө үүсгэж болно + can_launch_recording: Энэхүү үүрэг бүхий хэрэглэгчдэд хурлаа бичих боломж олгох + delete: Үүрэг хариуцлага устгах + invalid_create: Шинэ үүрэг хариуцлага үүсгэхэд асуудал гарлаа. Үүрэг хариуцлагын утгыг шалгаад дахин оролдоно уу + invalid_order: Үүрэг хариуцлагын ач холбогдлыг шинэчлэхэд асуудал гарлаа. Утгыг шалгаад дахин оролдоно уу + invalid_update: Үүрэг хариуцлагын зөвшөөрлийг шинэчлэхэд асуудал гарлаа. Утгыг шалгаад дахин оролдоно уу + manage_rooms_recordings: "Энэхүү үүрэг бүхий хэрэглэгчдэд серверийн өрөө, бичлэг удирдах боломж олгох" + name: Үүрэг хариуцлагын нэр + new_role: Шинэ үүрэг хариуцлага үүсгэх + role_has_users: "Энэхүү үүрэг хариуцлагыг %{user_count}бүртгэл рүү оноолоо. Энэхүү үүргийг устгахаас өмнө түүнтэй холбоотой бүх бүртгэлийг устгана уу." + title: Үүрэг хариуцлагууд + promote_email: Хэрэглэгчдэд энэхүү үүргийг ногдуулахдаа тэдгээрт цахим шуудан илгээх + demote_email: Хэрэглэгчдээс энэхүү үүргийг арилгахдаа тэдгээрт цахим шуудан илгээх + edit_site_settings: Энэхүү үүрэг бүхий хэрэглэгчдэд сайтын тохиргоог засах боломж олгох + edit_roles: Энэхүү үүрэг бүхий хэрэглэгчдэд бусад үүргийг засах боломж олгох + manage_users: Энэхүү үүрэг бүхий хэрэглэгчдэд хэрэглэгчдийн удирдах боломж олгох + invalid_assignment: Хэрэглэгчид үүрэг хариуцлага ногдуулахад асуудал гарлаа. Утгыг шалгаад дахин оролдоно уу + colour: + title: Үүрэг хариуцлагын өнгө + info: Үүрэг хариуцлагатай холбоотой өнгийг тохируулах + room_configuration: + title: Өрөөний тохиргоо + mute: + info: BigBlueButton хуралд холбогдох үед хэрэглэгчийн дууг автоматаар хаах + require_moderator: + info: "Хэрэглэгч холбогдохоор оролдох үед BigBlueButton хурлын чиглүүлэгчид сануулна. Хэрэглэгчийг баталбал, тэд хуралд холбогдох боломжтой болно." + allow_any: + info: Ямар ч үед хурал эхлүүлэхийг бүх хэрэглэгчид зөвшөөрнө. Үндсэн тохиргоогоор өрөө эзэмшигч зөвхөн хурлыг эхлүүлэх боломжтой. + all_moderator: + info: Хэрэглэгчид хуралд холбогдох үед BigBlueButton дээр тэдгээрийн бүгдэд чиглүүлэгчийн эрхийг өгөх + recordings: + info: Өрөөнд бичлэг хийх эсэхийг сонгохыг хүсэж байгаа эсэхийг тодруулах боломжийг өрөө эзэмшигчдэд олгоно. Идэвхжүүлсэн үед хурал эхлэнгүүт чиглүүлэгч "Бичих" товчийг дарах ёстой. + moderator_codes: + info: "Бусад хэрэглэгчдийг чиглүүлэгчээр хуралд шууд холбогдох боломж олгох чиглүүлэгч зүү үүсгэхийг сонголттойгоор өрөө эзэмшигчдэд олгоно. " + title: Чиглүүлэгчийн нэвтрэх код + options: + disabled: Идэвхгүй болгосон + enabled: Үргэлж идэвхжүүлсэн + optional: Сонголтот + rooms: + timeout: "%{server}Серверийн хүсэлт удсанаас болж, төлөв, оролцогчдын мэдээлэл үнэн зөв биш байж болно" + title: Серверийн өрөөнүүд + table: + ended: "Дууссан: %{session}" + id: Үнэмлэх + not_running: Ажиллахгүй байна + participants: Оролцогчид + running: Ажиллаж байна + started: "Эхэлсэн: %{session}" + status: Төлөв + view: Харагдац + title: Зохион байгуулалтын тохиргоо + users: + invite: Хэрэглэгч урих + edit: + title: Хэрэглэгчийн мэдээллийг засах + settings: + approve: Батлах + decline: Татгалзах + ban: Хэрэглэгч хорих + delete: Устгах + edit: Засварлах + edit_roles: Хэрэглэгчийн үүрэг хариуцлагыг засах + merge: Нэгтгэх + perm_delete: Бүрмөсөн устгах + unban: Хэрэглэгчийн хориог буцаах + undelete: Устгасныг буцаах + table: + authenticator: Баталгаажуулагч + created: Үүсгэсэн + time: Илгээсэн цаг + name: Нэр + not_found: Таны хайлттай тохирох хэрэглэгч алга + no_users: Ямар ч хэрэглэгч олдсонгүй + role: Үүрэг хариуцлага + uid: Хэрэглэгчийн ID + username: Хэрэглэгчийн нэр + valid: Хүчинтэй + title: Хэрэглэгчдийн удирдах + add_to_google_calendar: "Гүүгл хуанлид нэмэх" + bigbluebutton: BigBlueButton + bigbluebutton_exception: "Өө, хурал эхлэх үед алдаа гарлаа." + cancel: Цуцлах + cookies: + cookie_info: "Үйлчилгээ үзүүлэхэд күүкийз бидэнд тусалдаг. " + cookie_button: Би зөвшөөрч байна + policy: "Дэлгэрэнгүй мэдээллийг нууцлалын бодлого-с үзнэ үү." + copied: Хуулбарласан + copy: Хуулбар + date: + month_names: [~, 1-р сар, 2-р сар, 3-р сар, 4-р сар, 5-р сар, 6-р сар, 7-р сар, 8-р сар, 9-р сар, 10-р сар, 11-р сар, 12-р сар] + default_admin: "Та энэхүү бүртгэл дээр үндсэн нууц үгийг ашигласан хэвээр байна. Үүнийг өөрчлөхдөө энддарна уу." + delete: Устгах + delivery_error: Цахим шуудан илгээх явцад алдаа гарлаа. Администратортой холбоо барина уу. + docs: Баримт бичиг + email: Цахим шуудан + email_sent: "Таны %{email_type}цахим шууданг илгээлээ! (Та үүнийг хүлээж аваагүй бол Спам файлаа шалгана уу)" + enter_your_name: Нэрээ оруулна уу! + errors: + bigbluebutton: + help: "Зохих арга хэмжээг авахуулахад анхаарна уу. Дэлгэрэнгүй үзэх" + message: "Хүчингүй BigBlueButton төгсгөлийн цэг, нууц" + title: Серверийн алдаа + internal: + message: Манай хэсэг дээр ямар нэг алдаа гарсан юм шиг байна. + help: "Алдаа бүртгэлээ, бид шалгах болно!" + report: Асуудлыг мэдээлэх + maintenance: + message: "Уучлаарай, бид засвар үйлчилгээ хийхээр түр зогссон байна." + help: Бид удахгүй эргэн ажиллах болно! + migration_error: + contact_admin: "Та администратор биш бол, администратортой холбоо барина уу." + continue: Би 1.0-г хэрэглэсэн хэвээр үлдмээр байна. + notice: > + Greenlight өгөгдлийн сан нүүлгэх алдаатай учирлаа.
Та Greenlight 2.0 болгож шинэчлээгүйтэй энэ алдаа холбоотой байж болно. + upgrade: Хэрхэн 2.0 болгож шинэчлэхийг надад харуулна уу! + version: "Бид Greenlight-н шинэ хувилбарыг гаргасан боловч, таны өгөгдлийн сан үүнтэй тохирохгүй байна." + messages: + blank: хоосон байж болохгүй + too_short: хэт богино байна + invalid: хүчингүй байна + taken: -г аль хэдийнэ өөр хүн авсан байна + accepted: хүлээн зөвшөөрөх ёстой + confirmation: "%{attribute}-тай тохирохгүй байна" + inclusion: жагсаалтад ороогүй байна + domain: "\"%{email_domain}\"-р төгсөх ёстой" + no_provider: + message: Таны нэвтрэхийг оролдож буй сайтыг идэвхжүүлээгүй байна + help: Greenlight-г тохируулахын тулд системийн администратортойгоо холбоо барина уу + not_found: + message: Уучлаарай! Таны хайж буй хуудас оршин байхгүй байна. + help: "Үүнийг устгасан байх боломжтой юу? " + user_not_found: + help: Администратортой холбоо барина уу + message: "Уучлаарай, энэхүү хэрэглэгчийг бүртгээгүй байна." + user_missing: + help: "URL-г шалгаад, дахин оролдоно уу" + message: Таны оруулсан URL хүчингүй байна + title: Алдаанууд + unauthorized: + message: Энэхүү аппликэйшнд нэвтрэх эрх танд байхгүй байна + help: "Үүнийг алдаа гэж үзвэл, системийн администратортойгоо холбоо барина уу." + expired_reset_token: Нууц үг дахин тохируулах холбоосын хугацаа дуусчээ! + features: + title: Шинж чанарууд + rooms: Хувь хүнд тохируулсан өрөөнүүд + recordings: Бичлэгийн удирдлага + designs: Тохируулсан дизайнууд + authentication: Хэрэглэгчийн баталгаа + footer: + legal: Нөхцлүүд + privpolicy: Нууцлалын бодлого + powered_by: "%{href}-р хүч оруулсан" + forgot_password: + subtitle: Нууц үгээ мартсан + email: Цахим шуудан + submit: Хүргүүлэх + go_back: Буцах + greenlight: Greenlight + header: + all_recordings: Бүх бичлэгүүд + dropdown: + account_settings: Зохион байгуулалт + help: "Тусламж хэрэгтэй юу?" + home: Нүүр + settings: Хувийн мэдээлэл + signout: Гарах + home_room: Үндсэн өрөө + info_update_success: Мэдээллийг амжилттай шинэчиллээ + invalid_credentials: "Таны оруулсан цахим шуудан, нууц үг манай бүртгэлтэй тохирсонгүй. Нууц үгээ дахин тохируулахын тулд дахин оролдох, эсвэл Нууц үг мартсан дээр дарна уу." + invalid_credentials_external: "Таны оруулсан цахим шуудан, нууц үг манай бүртгэлтэй тохирсонгүй. Дахин оролдоно уу." + invalid_login_method: Бүртгэл тохироогүй тул нэвтэрч чадсангүй. Та omniauth руу нэвтрэх шаардлагатай. + invite_message: "Хуралд хэн нэгнийг урихын тулд, энэхүү холбоосыг тэдэнд илгээнэ үү:" + javascript: + room: + mailer: + subject: 'бичлэг үзүүлэхийн тулд таныг урилаа.' + body: 'Бичлэгийг харахын тулд, доорх холбоосыг дагана уу:' + autogenerated: 'Энэхүү цахим шууданг BigBlueButton-с автоматаар үүсгэсэн.' + footer: 'BigBlueButton бол нээлттэй эхийн вэб хурлын систем юм. BigBlueButton-н талаар дэлгэрэнгүй мэдээлэл авахын тулд, https://bigbluebutton.org/-г үзнэ үү.' + search: + start: Хайж эхлэх... + landing: + about: "%{href} бол BigBlueButton нээлттэй эхийн вэб хурлын серверийн хэрэглэгч талын энгийн шийдэл. Та хурал удирдахын тулд өөрийн өрөөг үүсгэж болох, эсвэл богино, ашиглахад хялбар холбоос ашиглан бусдыг оролцуулж болно. " + welcome: BigBlueButton-д тавтай морилно уу. + video: Greenlight ашиглах тухай манай хичээлийг үзэх + upgrade: Хэрхэн 2.0 болгож шинэчлэхийг надад харуулна уу! + version: "Бид Greenlight-н шинэ хувилбарыг гаргасан боловч, таны өгөгдлийн сан үүнтэй тохирохгүй байна." + language_default: Үндсэн (интернэт хөтчийн хэл) + ldap_error: LDAP сервер рүү холбогдож чадсангүй. env файл дээрх LDAP тохиргоогоо шалгаж сервер ажиллаж байгаа эсэхийг баталгаажуулна уу. + login: Нэвтэрч орох + login_title: Бүртгэл рүүгээ нэвтэрч орох + mailer: + user: + approve: + info: Таны бүртгэлийг баталгаажууллаа. + signin: "Өөрийн хувийн өрөөнд нэвтрэхийн тулд, доорх товчийг дарж, нэвтэрнэ үү." + signin_link: Нэвтэрч орох + signup: + info: Greenlight-г ашиглахаар шинэ хэрэглэгч бүртгүүллээ. + more-info: "Greenlight-д нэвтрэхийг энэхүү хэрэглэгчид зөвшөөрөхийн тулд, та зохион байгуулалтын тохиргоон дээр түүний бүртгэлийг батлах ёстой." + admins_link: Зохион байгуулалтын хуудсанд зочлох + subject: Greenlight-н шинэ хэрэглэгчийн бүртгэл + username: "Хэрэглэгч %{name}нэр, %{email}цахим шуудангаар бүртгүүллээ." + subject: Бүртгэлийг баталлаа + username: "Таны хэрэглэгчийн нэр %{email}." + demoted: + info: "Та %{url}дээрх %{role}байхаа больсон." + more-info: "Та одоо ердийн хэрэглэгчийн адил эрхтэй болсон. " + root_link: Нэвтэрч орох + subtitle: "%{role}эрхийг хүчингүй болгосон" + invite: + info: "Таныг %{name}-н үүсгэсэн өөрийн хувийн орон зай руу урьж байна." + signup_info: "Өөрийн цахим шуудангаа ашиглан бүртгүүлэхийн тулд, доорх товч дээр дарж, алхамуудыг дагана уу." + signup_link: Бүртгүүлэх + valid: "Урилга дараах өдөр хүртэл хүчинтэй байна: %{date}" + signup: + info: "Таны урьсан хэрэглэгч Greenlight-г ашиглахаар бүртгүүллээ. " + admins_link: Зохион байгуулалтын хуудсанд зочлох + subject: Greenlight-н шинэ хэрэглэгчийн бүртгэл + username: "Хэрэглэгч %{name}нэр, %{email}цахим шуудангаар бүртгүүллээ." + subject: BigBlueButton руу орох урилга + username: "Таны хэрэглэгчийн нэр %{email}." + password_reset: + title: 'Нууц үг дахин тохируулах' + welcome: "%{email}цахим шуудан дээр нууц үг дахин тохируулах хүсэлт гаргалаа" + message: 'Та дахин тохируулах хүсэлт гаргасан бол, нууц үгээ дахин тохируулахын тулд доорх холбоос дээр дарна уу.' + reset_link: Нууц үг дахин тохируулах + expire: Холбоосын хугацаа хоёр цагийн дотор дуусна. + ignore: Та энэхүү хүсэлтийг гаргаагүй бол энэхүү цахим шууданг аюулгүй хүрээнд тоохгүй байж болно. + promoted: + admins_link: Зохион байгуулалтын хуудсанд зочлох + info: "Та одоо %{url}дээрх %{role}болсон." + more-info: "Өөрийн шинэ чадвараа харахын тулд %{url}руу зочилно уу." + subtitle: "%{role}эрхийг олголоо" + verify_email: + welcome: "Өөрийн хувийн орон зайдаа тавтай морилно уу, %{name}!" + success: "%{bigbluebutton}-г хөшүүрэг болгон, та хурал удирдах, бусад хамтран ажиллахын тулд өөрийн өрөөгөө үүсгэж болно." + username: "Таны хэрэглэгчийн нэр %{email}." + verify: "Бүртгэлээ баталгаажуулахын тулд, доорх товчийг дарна уу." + verify_text: 'Бүртгэлээ баталгаажуулахын тулд, доорх холбоосыг дагана уу:%{url}' + verify_link: Бүртгэлээ баталгаажуулах + thanks: "Бүртгүүлсэнд баярлалаа, өдрийг сайхан өнгөрүүлээрэй!" + max_concurrent: "Давхардсан хурлуудын зөвшөөрсөн хамгийн их тоонд хүрлээ! " + merged: Нэгтгэсэн + modal: + create_role: + create: Шинэ Үүрэг хариуцлага үүсгэх + footer_text: Үүрэг хариуцлагаа үүсгэсний дараа үүнд өгсөн тухайн зөвшөөрлийг засварлаж болно + name_placeholder: Үүрэг хариуцлагын нэрийг оруулах... + not_blank: Үүрэг хариуцлагын нэр хоосон байж болохгүй + title: Шинэ Үүрэг хариуцлага үүсгэх + create_room: + access_code: Нэвтрэх код + moderator_access_code: Чиглүүлэгчийн код + access_code_placeholder: Өрөөний сонголтот нэвтрэх кодыг үүсгэх + moderator_access_code_placeholder: Чиглүүлэгчид зориулан сонголтот кодыг үүсгэх + auto_join: Намайг өрөөнд автоматаар нэвтрүүлэх + create: Өрөө үүсгэх + free_delete: Та ямар ч үед энэхүү өрөөг чөлөөтэй устгаж болно. + name_placeholder: Өрөөний нэрийг оруулах... + not_blank: Өрөөний нэр хоосон байж болохгүй. + title: Шинэ өрөө үүсгэх + delete_account: + confirm: "Та энэхүү бүртгэлийг устгахыг хүсэж байгаадаа итгэлтэй байна уу?" + delete: "Би итгэлтэй байна, энэхүү бүртгэлийг устга." + keep: "Үнэндээ, би үүнийг устгамааргүй байна." + delete_warning: "Ингэснээр хэрэглэгчийн бүртгэлийг идэвхгүйжүүлнэ. Бүх идэвхгүй болгосон хэрэглэгчдийг устгасан таб дээрээс олж болно. " + warning: Энэхүү шийдвэр эцсийн байх болно. Та холбогдох өгөгдлийг сэргээх боломжгүй болно. + delete_rec: + delete: "Би итгэлтэй байна, энэхүү бичлэгийг устга." + header: "Та энэхүү бичлэгийг устгахыг хүсэж байгаадаа итгэлтэй байна уу?" + warning: Та энэхүү бичлэгийг сэргээх боломжгүй болно. + delete_room: + confirm: "Та %{room}-г устгахыг хүсэж байгаадаа итгэлтэй байна уу?" + delete: "Би итгэлтэй байна, энэхүү өрөөг устга." + keep: "Хоёр дахин бодоод, би үүнийг устгамааргүй байна." + warning: Та энэхүү өрөөг сэргээх боломжгүй болно. + recording_warning: "эсвэл үүний аливаа %{recordings_num}холбогдох бичлэгийг сэргээх боломжгүй." + invite_user: + email_placeholder: Хэрэглэгчийн цахим шууданг оруулах (таслалаар тусгаарласан) + footer: Хэрхэн бүртгүүлэх талаарх заавар бүхий цахим шууданг хэрэглэгч хүлээн авах болно + send: Урилга илгээх + title: Хэрэглэгч урих + login: + or: эсвэл + with: "%{provider}-р нэвтрэн орох" + forgot_password: "Нууц үгээ мартсан уу?" + preupload: + change: Презентацийг солих + choose: Файл сонгох... + current: "Одоогийн презентаци:" + footer: "Презентацийн хэмжээнээс хамаарч, үүнийг ашиглахаас өмнө байрлуулахад нэмэлт хугацаа хэрэгтэй болж магадгүй." + invalid: Хүчингүй файлын хэмжээ/төрөл байна. Доорх хязгаарлалтыг үзнэ үү. + title: Презентацийг нэмэх + use: Презентацийг ашиглах + rename_recording: + remove_shared: + title: "Та энэхүү өрөөг өрөөний жагсаалтаасаа устгахыг хүсэж байгаадаа итгэлтэй байна уу?" + delete: "Би итгэлтэй байна, энэхүү өрөөг устга." + warning: Та энэхүү өрөөнд дахин нэвтрэх боломжгүй болно. + room_settings: + title: Өрөөний тохиргоо + update: Өрөө шинэчлэх + client: Түншийн төрлийг сонгох + join_moderator: Бүх хэрэглэгч чиглүүлэгчээр нэвтэрлээ + mute: Хэрэглэгчид нэвтрэх үед тэдгээрийн дууг хаах + require_approval: Нэвтрэхээс өмнө чиглүүлэгчийн зөвшөөрлийг шаардана + start: Энэхүү хурал эхлүүлэхийг бүх хэрэглэгчид зөвшөөрөх + footer_text: "Таны өрөөний тохиргоог ямар ч үед хийж болно. " + recording: Өрөөнд бичлэг хийхийг зөвшөөрөх + rename_room: + name_placeholder: Өрөөний шинэ нэрийг оруулах... + share_access: + footer: "Хэрэглэгчтэй өрөөгөө хуваалцсанаар тэдгээрт өрөөг эхлүүлж, өрөөний бичлэгийг харах боломж олгоно." + list: -тай хуваалцах + title: Өрөөний нэвтрэлтийг хуваалцах + save: Өөрчлөлтийг хадгалах + cancel_changes: Өөрчлөлтийг цуцлах + select: Хэрэглэгчийг сонгох + merge_user: + cancel: Цуцлах + from: Нэгтгэх бүртгэл + title: Хэрэглэгчийн бүртгэл нэгтгэх + to: Үндсэн бүртгэл + save: Нэгтгэх + footer: Нэгтгэх бүртгэлд хамаарах өрөөг Үндсэн бүртгэлийн өрөөний жагсаалт руу шилжүүлж улмаар бүртгэлийг устгах болно. + name_update_success: Өрөөний нэрийг амжилттай устгалаа! + no_user_email_exists: Заасан цахим шуудан бүхий хэрэглэгч оршин байхгүй байна. Та үүнийг зөв бичсэн эсэхээ шалгана уу. + omniauth_error: omniauth-р баталгаажуулах явцад алдаа гарлаа. Дахин оролдох эсвэл администратортой холбоо барина уу. + omniauth_specific_error: "omniauth-р баталгаажуулж байх зуур %{error} гарлаа. Дахин оролдох эсвэл администратортой холбоо барина уу." + pagy: + nav: + prev: "‹ Өмнөх" + next: "Дараах ›" + gap: "…" + password: Нууц үг + password_empty_notice: Нууц үг хоосон байж болохгүй + password_reset_success: Нууц үг дахин тохируулсан + password_different_notice: Нууц үгийн баталгаажуулалт тохирохгүй байна + provider: + google: Google + office365: Office 365 + twitter: Twitter + ldap: LDAP + openid_connect: OpenID холбох + recaptcha: + errors: + recaptcha_unreachable: "Өө, бид таны reCAPTCHA хариуг баталгаажуулж чадсангүй. Дахин оролдоно уу." + verification_failed: "reCAPTCHA баталгаажуулалт бүтэлгүйтлээ, дахин оролдоно уу." + recording: + all_recordings: Бүх бичлэгүүд + email: Цахим шуудангийн бичлэг + error: "%{count}бичлэг (үүд)-ийг татах явцад алдаа гарлаа." + no_public_recordings: Энэхүү өрөөнд нийтийн бичлэг хийгдээгүй байна. + no_recordings: Энэхүү өрөөн дээр бичлэг хийгээгүй байна. + no_user_recordings: Танд одоогоор бичлэг байхгүй байна. + no_matched_pub_recordings: Таны хайлттай тохирох нийтийн бичлэг алга + no_matched_recordings: Таны хайлттай тохирох ямар ч бичлэг алга + recorded_on: "%{date}дээр бичлэг хийсэн" + table: + name: Нэр + thumbnails: Товчлол + length: Урт + users: Хэрэглэгчид + visibility: Харагдац + formats: Формат + visibility: + inaccessible: Нэвтрэх боломжгүй + public: Олон нийтийн + unlisted: Жагсаалтад ороогүй + format: + notes: Тэмдэглэлүүд + podcast: Подкаст + presentation: Презентаци + statistics: Статистик + video: Видео + registration: + approval: + fail: "Таны бүртгэлийг хараахан батлаагүй байна. Таныг бүртгүүлснээс хойш хэдэн өдөр өнгөрсөн бол, администратортойгоо холбоо барина уу." + signup: "Таны бүртгэлийг амжилттай үүсгэлээ. Үүнийг администратороор батлуулахаар илгээлээ. " + banned: + fail: "Танд энэхүү аппликэйшнд нэвтрэх эрх байхгүй байна. Үүнийг алдаа гэж үзвэл, системийн администратортойгоо холбоо барина уу." + deprecated: + new_signin: Бүртгэлдээ зориулан шинэ нэвтрэх аргыг сонгоно уу. Таны хуучин бүртгэлийн бүх өрөөнүүдийг шинэ бүртгэл рүү шилжүүлэх болно + twitter_signin: "Twitter-р дамжуулж нэвтрэн орох хуучирсан бөгөөд дараагийн удаад үүнийг устгах болно. Таны бүртгэлийг шинэ баталгаажуулах арга руу шилжүүлэхийн тулд энддарна уу" + twitter_signup: Twitter-р дамжуулж бүртгүүлэх хуучирсан байна. Өөр бүртгүүлэх арга ашиглана уу + merge_success: Таны twitter бүртгэлийг шинэ бүртгэлтэй тань амжилттай нэгтгэлээ. Таны twitter хуучин бүртгэлийг устгалаа + invite: + fail: "Таны токен нэг бол хүчингүй, эсвэл хугацаа нь дууссан байна. Үүнийг алдаа гэж үзвэл, администратортойгоо холбоо барина уу." + no_invite: Танд энэхүү аппликэйшнд нэвтрэх урилга байхгүй байна. Урилга авахын тулд администратортойгоо холбоо барина уу. + remove: Устгах + rename: Шинэ нэр өгөх + reset_password: + captcha: "reCAPTCHA баталгаажуулалт бүтэлгүйтлээ, дахин оролдоно уу." + invalid_token: Нууц үг дахин тохируулах токен хүчингүй байна. Нууц үгээ дахин тохируулахаар оролдоно уу. + subtitle: Нууц үг дахин тохируулах + password: Шинэ нууц үг + confirm: Шинэ нууц үг баталгаажуулах + update: Нууц үгээ шинэчлэх + auth_change: Баталгаажуулах арга өөрчлөгдсөн. Нууц үгээ тохируулахын тулд цахим шуудангаа шалгана уу. + roles: + active: Идэвхтэй + admin: Админ + banned: Хорьсон + deleted: Устгасан + pending: Хүлээгдэж буй + invited: Урьсан + user: Хэрэглэгч + room: + access_code_required: Өрөөнд холбогдохын тулд хүчинтэй нэвтрэх код оруулна уу + add_presentation: Презентацийг нэмэх + copy_access: Нэвтрэх кодыг хуулбарлах + copy_moderator_access: Чиглүүлэгчийн кодыг хуулбарлах + create_room: Нэг өрөө үүсгэх + create_room_error: Өрөө үүсгэх үед алдаа гарлаа. + create_room_success: Өрөөг амжилттай үүсгэлээ + delete: + home_room: Хэрэглэгчийн Үндсэн өрөөг устгаж чадсангүй + success: Өрөөг амжилттай устгалаа + fail: "Өрөө (%{error})-г устгаж чадсангүй" + enter_the_access_code: Өрөөний нэвтрэх кодыг оруулах + enter_the_moderator_access_code: Өрөөний чиглүүлэгчийн кодыг оруулах + optional_moderator_access_code: "Чиглүүлэгчийн сонголтот код" + invalid_provider: Та хүчингүй url оруулсан байна. Url-г шалгаад дахин оролдоно уу. + invitation_description: "BigBlueButton ашиглан %{name}-д нэгдэх урилгыг танд өгсөн байна. Нэгдэхийн тулд, дээрх холбоос дээр дарж, нэрээ оруулна уу." + invited: "Таныг нэгдэхийг урьсан байна. " + recording_present: "Энэхүү хурал дээр бичлгэ хийнэ гэдгийг би зөвшөөрч байна. Үүнд миний дуу хоолой, видео идэвхижсэн үед орж болно." + invite_participants: Оролцогчдыг урих + join: Нэгдэх + last_session: "%{session}дээрх сүүлийн хурал" + login: Оруулах + owner: Эзэмшигч + owner_banned: Энэхүү өрөөг одоогоор ашиглах боломжгүй байна + no_room: + description: "Таны нэгдэхийг хүсэж буй өрөөндөө зориулан өрөөний url, эсвэл өрөөний id-г оруулна уу. " + edit_profile: Хэрэглэгчийн мэдээллийг засах + go_to: Өрөө рүү орох + invalid_room_uid: Таны оруулсан url/uid хүчингүй байна. + placeholder: Өрөөний url/uid + no_recent_rooms: Танд одоогоор нэгдсэн ямар ч өрөө байхгүй байна + recent_rooms: Одоогоор нэгдсэн өрөө рүү нэвтрэх + title: Өрөөнд нэгдэх + no_sessions: Энэ өрөөнд ямарваа хурал явагдаагүй байна! + preupload_success: Презентацийг амжилттай нэмлээ + preupload_error: Өрөөний презентацийг шинэчлэх үед алдаа гарлаа + preupload_remove_success: Презентацийг амжилттай устгалаа + preupload_remove_error: Өрөөний презентацийг устгах үед алдаа гарлаа + recordings: Өрөөний бичлэгүүд + room_limit: Та зөвшөөрсөн хамгийн их өрөөний тоонд хүрсэн байна + room_limit_exceeded: "Та зөвшөөрсөн хамгийн их өрөөний тооноос хэтэрсэн байна. Энэхүү өрөөнд нэвтрэхийн тулд %{difference} өрөө (нүүд)-ийг устгана уу." + sessions: Хурлууд + settings: Өрөөний тохиргоо + share: Нэвтрэлтийг удирдах + shared_by: "%{email}-н хуваалцсан" + remove_shared_access_success: Таны өрөөний жагсаалтаас хуваалцсан өрөөг амжилттай устгалаа + remove_shared_access_error: Таны жагсаалтаас хуваалцсан өрөөг устгахад алдаа гарлаа + shared_access_success: Өрөөг амжилттай хуваалцлаа + shared_access_error: Өрөө хуваалцах үед алдаа гарлаа + start: Эхлэх + search: Өрөөг хайх... + unavailable: Эзэмшигчийн цахим шууданг баталгаажуулаагүй тул энэхүү өрөөг одоогоор ашиглах боломжгүй байна. + update_settings_error: Өрөөний тохиргоог шинэчлэх үед алдаа гарлаа + update_settings_success: Өрөөний тохиргоог амжилттай шинэчиллээ + wait: + message: Хурал хараахан эхлээгүй байна. + auto: Хурал эхлэх үед та автоматаар нэгдэх болно. + settings: + account: + fullname: Овог нэр + language: Хэл + provider: Үйлчилгээ үзүүлэгч + image: Зураг + image_url: Үндсэн зургийн URL + roles: Хэрэглэгчийн үүрэг хариуцлага + subtitle: Бүртгэлийн мэдээллээ шинэчлэх + title: Бүртгэлийн мэдээлэл + reset_password: Хэрэглэгчийн нууц үгийг дахин тохируулах + delete: + button: "Тийм ээ, би өөрийн бүртгэлийг устгахыг хүсэж байна." + disclaimer: "Та бүртгэлээ устгах сонголт хийсэн бол, энэ нь нөхөн сэргээгдэх БОЛОМЖГҮЙболно. Тохиргоо, өрөө, бичлэг зэрэг таны бүртгэлийн талаарх мэдээллийг устгах болно." + subtitle: Таны бүртгэлийг бүрмөсөн устгах + title: Бүртгэл устгах + password: + confirmation: Шинэ нууц үг баталгаажуулах + new: Шинэ нууц үг + old: Хуучин нууц үг + subtitle: Нууц үгээ өөрчлөх + title: Нууц үг + title: Хувийн мэдээлэл + search: Хайх + signup: + password_confirm: Нууц үг баталгаажуулах + subtitle: Бүртгэл үүсгэх + title: Бүртгүүлэх + with: "%{provider}-р бүртгүүлэх" + terms: + accept: "Би %{href}-г хүлээн зөвшөөрч байна" + accept_existing: Би нөхцлүүдийг хүлээн зөвшөөрч байна + title: Нөхцлүүд + test_install: > + Энэхүү хуваарилалт дээр урьдчилан тохируулсан туршилтын серверийг ашиглаж байгаа ба та үүнийг өөрийнхтэйгөө солих хэрэгтэй. Дэлгэрэнгүй мэдээллийг %{href}-с үзнэ үү. + time: + formats: + default: "%b %d, %Y %-I:%M%P" + update: Шинэчлэх + verify: + accept: Баталгаажуулах + activated: Бүртгэлийг баталгаажуулсан! + already_verified: Бүртгэлийг аль хэдийнэ баталгаажуулсан + invalid: Хүчингүй баталгаажуулах холбоос + not_verified: Таны бүртгэлийг хараахан баталгаажуулаагүй байна. + resend: Баталгаажуулах цахим шууданг дахин илгээх + signin: Таны бүртгэлд хандахын тулд нэвтэрч орно уу. + title: Цахим шуудангаа баталгаажуулах + verification: Баталгаажуулалт diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 248de239..f0f59e36 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -72,7 +72,7 @@ nl: email_mapping: info: "Wijs de gebruiker een rol toe met behulp van zijn e-mailadres. Moet de indeling email1=rol1,email2=rol2 hebben" title: Roltoewijzing via e-mail - update: + update: log_level: title: Log Niveau information: Wijzig het Log Niveau voor de hele installatie @@ -94,7 +94,7 @@ nl: title: Onderhoudsbanner display: Aan clear: Uit - time: "Voorbeeld: update gepland op 13 december om 23:00 ET. Gebruikers kunnen problemen ondervinden bij het inloggen." + time: "Voorbeeld: update gepland op 13 december om 23:00 ET. Gebruikers kunnen problemen ondervinden bij het inloggen." preupload: info: Gebruikers kunnen een presentatie vooraf uploaden om als standaardpresentatie voor die specifieke ruimte te gebruiken title: Sta gebruikers toe presentaties vooraf te uploaden @@ -138,11 +138,14 @@ nl: settings: Site-instellingen succesvol gewijzigd unauthorized: U bent niet gemachtigd om acties uit te voeren op deze gebruiker recordings: + latest: Nieuwste opnames title: Serveropnames no_recordings: Deze server heeft geen opnames. + search_info: Voer het volledige e-mailadres van een gebruiker of het uid van een kamer in roles: appear_in_share_list: Neem gebruikers met deze rol op in de keuzelijst voor het delen van kamers can_create_rooms: Kan kamers maken + can_launch_recording: Gebruikers met deze rol toestaan hun vergaderingen op te nemen delete: Verwijder de rol invalid_create: Er is een probleem opgetreden bij het maken van een nieuwe rol. Controleer de rolwaarden en probeer het opnieuw invalid_order: Er is een probleem opgetreden bij het bijwerken van de prioriteit van de rol. Controleer de waarden en probeer het opnieuw @@ -173,6 +176,9 @@ nl: info: Geeft alle gebruikers moderatorrechten in BigBlueButton wanneer ze deelnemen aan de vergadering. recordings: info: "Hiermee kunnen kamereigenaren aangeven of ze de optie willen om een kamer op te nemen of niet. Indien ingeschakeld, moet de moderator nog steeds op de knop \"Opnemen\" klikken nadat de vergadering is begonnen." + moderator_codes: + info: Zorgt ervoor dat kamer eigenaars optioneel een moderator pin code kunnen genereren waarmee andere gebruikers direct als moderator kunnen deelnemen. + title: Moderator Toegangscode options: disabled: Uitgeschakeld enabled: Altijd ingeschakeld @@ -224,6 +230,7 @@ nl: cookies: cookie_info: "Cookies helpen ons onze diensten te leveren. Door onze services te gebruiken, gaat u akkoord met ons gebruik van cookies." cookie_button: Daar ben ik het mee eens + policy: "Voor meer information, consulteer onze privacy policy." copied: Gekopieerd copy: Kopiëren date: @@ -262,6 +269,7 @@ nl: accepted: moet worden geaccepteerd confirmation: "komt niet overeen met %{attribute}" inclusion: is niet opgenomen in de lijst + domain: "moet eindigen op \"%{email_domain}\"" no_provider: message: "De site die u probeert te openen, is niet ingeschakeld" help: Neem contact op met uw systeembeheerder om Greenlight in te stellen @@ -306,6 +314,7 @@ nl: home_room: Begin kamer info_update_success: Informatie succesvol bijgewerkt. invalid_credentials: "Het e-mailadres en wachtwoord dat u heeft ingevoerd, komt niet overeen met onze gegevens. Probeer het opnieuw of klik op Wachtwoord vergeten om uw wachtwoord opnieuw in te stellen." + invalid_credentials_external: "Het e-mailadres en het wachtwoord dat je ingegeven hebt, kennen we niet. Probeer opnieuw." invalid_login_method: Inloggen mislukt vanwege niet-overeenkomende account. U moet inloggen met omniauth. invite_message: "Stuur iemand deze link om iemand uit te nodigen voor de vergadering:" javascript: @@ -350,6 +359,7 @@ nl: info: "Je bent uitgenodigd voor je eigen persoonlijke ruimte door %{name}" signup_info: Klik op de onderstaande knop om u aan te melden met uw e-mail en volg de stappen. signup_link: Registreren + valid: "De uitnodiging is geldig tot: %{date}" signup: info: Een uitgenodigde gebruiker heeft zich aangemeld om Greenlight te gebruiken. admins_link: Bezoek de organisatiepagina @@ -388,7 +398,9 @@ nl: title: Nieuwe rol maken create_room: access_code: Toegangscode + moderator_access_code: Moderator Code access_code_placeholder: Genereer een optionele toegangscode voor de kamer + moderator_access_code_placeholder: Genereer een optionele code voor moderatoren auto_join: Ga automatisch mee naar binnen create: Ruimte creëren free_delete: U kunt deze ruimte op elk gewenst moment verwijderen. @@ -477,6 +489,7 @@ nl: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: "Oeps, we hebben uw reCAPTCHA-antwoord niet kunnen valideren. Probeer het opnieuw." @@ -485,9 +498,11 @@ nl: all_recordings: Alle opnames email: Email opname error: "Er is een fout opgetreden bij het ophalen van %{count} opname(s)" - no_recordings: "Deze kamer heeft geen %{inject} opnames." + no_public_recordings: Deze kamer heeft geen publieke opnames + no_recordings: Deze kamer heeft geen opnames. no_user_recordings: U heeft momenteel geen opnames. - no_matched_recordings: "Geen %{inject} opnames komen overeen met uw zoekopdracht." + no_matched_pub_recordings: Er komen geen publieke opnames overeen met uw zoekopdracht. + no_matched_recordings: Er komen geen opnames overeen met uw zoekopdracht. recorded_on: "Geregistreerd op %{date}" table: name: Naam @@ -497,6 +512,7 @@ nl: visibility: Zichtbaarheid formats: Formaten visibility: + inaccessible: Ontoegankelijk public: Openbaar unlisted: Niet-genoteerd format: @@ -522,6 +538,7 @@ nl: remove: Verwijder rename: Hernoem reset_password: + captcha: "reCAPTCHA-verificatie is mislukt, probeer het opnieuw." invalid_token: Token voor wachtwoordherstel is ongeldig. Probeer je wachtwoord opnieuw in te stellen. subtitle: Reset wachtwoord password: Nieuw wachtwoord @@ -534,11 +551,13 @@ nl: banned: Verbannen deleted: Verwijderd pending: In afwachting + invited: Uitgenodigd user: Gebruiker room: access_code_required: Voer een geldige toegangscode in om toegang te krijgen tot de kamer add_presentation: Presentatie toevoegen copy_access: Kopieer Toegangscode + copy_moderator_access: "Kopieer Moderator Code " create_room: Maak een kamer create_room_error: Er is een fout opgetreden bij het maken van de kamer create_room_success: Kamer met succes gemaakt @@ -547,8 +566,10 @@ nl: success: Kamer succesvol verwijderd fail: "Kan kamer niet verwijderen (%{error})" enter_the_access_code: Voer de toegangscode van de kamer in + enter_the_moderator_access_code: Vul de moderator code van de kamer in! + optional_moderator_access_code: "Optionele Moderator Code" invalid_provider: U heeft een ongeldige URL ingevoerd. Controleer de URL en probeer het opnieuw. - invitation_description: "Je bent uitgenodigd om deel te nemen aan %{name} via BigBlueButton. Klik op bovenstaande link en voert u uw naam in om te beginnen." + invitation_description: "Je bent uitgenodigd om deel te nemen aan %{name} via BigBlueButton. Klik op bovenstaande link en voert u uw naam in om te beginnen." invited: Je bent uitgenodigd om lid te worden recording_present: Ik erken dat deze sessie zal worden opgenomen. Deze opname kan mijn stem en video bevatten indien dit is ingeschakeld. invite_participants: Deelnemers uitnodigen @@ -625,6 +646,9 @@ nl: title: Voorwaarden test_install: >- Deze implementatie maakt gebruik van een vooraf geconfigureerde testserver, deze moet u vervangen door uw eigen. Zie de %{href} voor meer informatie. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Bijwerken verify: accept: Verifiëren diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml index 9c995f96..83d3240a 100644 --- a/config/locales/pt_BR.yml +++ b/config/locales/pt_BR.yml @@ -36,7 +36,7 @@ pt_BR: enabled: Habilitado info: Permita que apenas usuários autenticados se juntem a uma sala title: Exija autenticação para salas - user-info: Você precisa se autenticar no Greenlight para se juntar a essa sala + user-info: Você precisa se autenticar para entrar na sala. branding: change: Alterar Imagem info: Altera a imagem da marca que aparece no canto superior esquerdo @@ -45,9 +45,9 @@ pt_BR: invalid: URL inválida legal: change: Alterar URL - info: Altere o link legal que aparece na parte inferior da página - placeholder: Legal URL... - title: Legal + info: Altere o link para os Termos de Uso que aparece na parte inferior da página + placeholder: URL Termos de Uso + title: Termos de Uso invalid: URL inválida privpolicy: change: Alterar URL @@ -69,6 +69,10 @@ pt_BR: regular: Regular lighten: Iluminada darken: Escuro + email_mapping: + info: "Mapear usuário por papel usando E-mail. Precisa estar no formato email1=papel1,email2=papel2" + title: Mapeamento de papel por E-mail + update: log_level: title: Nível de log information: Alterar o nível de log para toda a implantação @@ -82,6 +86,18 @@ pt_BR: info: Configura a visibilidade padrão para novas gravações title: Visibilidade padrão da gravação warning: Essa configuração só será aplicada em salas que não estão abertas + require_consent: + info: Esta configuração permite uma configuração de sala da qual permite que os donos de sala especificar quais as salas podem ser gravadas. Os usuários que entram em uma sala gravada devem consentir antes de entrar. + title: Requer consentimento do Dono da sala e participante para gravar + maintenance_banner: + info: Exibir um banner para informar ao usuário sobre a manutenção programada + title: Banner de Manutenção + display: Definir + clear: Limpar + time: "Exemplo: Atualização programada em 13 de Dezembro as 23:00 GMT. Os usuários podem ter problemas para entrar." + preupload: + info: Usuários podem pré-carregar a apresentação para ser utilizada como apresentação padrão para essa sala especifica. + title: Permitir que os usuários enviem apresentações antecipadamente registration: info: Altera a maneira com a qual os usuários se registram no site title: Método de Registro @@ -96,6 +112,11 @@ pt_BR: info: "Se esta opção estiver desativada, o botão é removido das opções da sala e impede que os usuários compartilhem salas" title: Permitir que os usuários compartilhem salas subtitle: Personalizar Greenlight + tabs: + appearance: Aparência + administration: Administração + registration: Inscrição + settings: Configurações title: Configurações do Site flash: approved: Usuário foi aprovado com sucesso. @@ -106,7 +127,7 @@ pt_BR: demoted: Usuário foi rebaixado com sucesso. invite: "Convite enviado para %{email} com sucesso" invite_email_verification: "E-mails precisam estar habilitados para poder utilizar esse método. Por favor, contate o seu administrador do sistema." - merge_fail: Ocorreu um problema ao mesclar as contas de usuário. Verifique os usuários selecionados e tente novamente + merge_fail: Ocorreu um problema ao mesclar as contas de usuário. Verifique os usuários selecionados e tente novamente merge_success: Contas de usuário mescladas com sucesso perm_deleted: Usuário foi permanentemente apagado promoted: Usuário foi promovido com sucesso. @@ -117,11 +138,14 @@ pt_BR: settings: Configurações do Site alteradas com sucesso. unauthorized: Você não possui permissão para realizar ações nesse usuário. recordings: + latest: Últimas Gravações title: Gravações do servidor no_recordings: Esse servidor não possui gravações + search_info: Digite o e-mail completo do usuário ou uid da sala roles: appear_in_share_list: Incluir usuários com esse papel na lista para o compartilhamento de salas can_create_rooms: Pode criar salas + can_launch_recording: Permitir usuários com este papel à gravar suas reuniões delete: Remover o papel invalid_create: Ocorreu um erro ao criar um novo papel. Por favor verifique os valores inseridos e tente novamente invalid_order: Ocorreu um erro ao atualizar a prioridade do papel. Por favor verifique os valores inseridos e tente novamente @@ -136,7 +160,7 @@ pt_BR: edit_site_settings: Permitir que usuários com este papel editem configurações do site edit_roles: Permitir que usuários com este papel editem outros papéis manage_users: Permitir que usuários com este papel gerenciem usuários - invalid_assignment: Ocorreu um erro ao atribuir os papéis ao usuário. Por favor verifique os valores inseridos e tente novamente + invalid_assignment: Ocorreu um erro ao atribuir os papéis ao usuário. Por favor verifique os valores inseridos e tente novamente colour: title: Cor do papel info: Configura a cor associada a um papel @@ -150,11 +174,17 @@ pt_BR: info: "Permite que qualquer usuário inicie a reunião a qualquer momento. Por padrão, apenas o proprietário da sala pode iniciar a reunião." all_moderator: info: Concede a todos os usuários privilégios de moderador quando ingressam na reunião. + recordings: + info: "Permite aos donos de sala especificar se querem ter a opção de gravar ou não a sala. Se ativado, o moderador ainda precisa clicar no botão \"Gravar\" assim que a reunião iniciar." + moderator_codes: + info: Permite aos donos de sala opcionalmente gerar uma chave de moderador da qual permite outros usuários ingressarem diretamente como moderadores. + title: Código de acesso do moderador options: disabled: Desabilitado enabled: Sempre ativado optional: Opcional rooms: + timeout: "Devido à requisição do servidor %{server}ter atingido tempo limite, as informações de estado e participantes podem não exatas" title: Salas de servidores table: ended: "Finalizado: %{session}" @@ -184,12 +214,14 @@ pt_BR: table: authenticator: Autenticador created: Criado + time: Tempo enviado name: Nome not_found: Nenhum usuário corresponde a sua pesquisa no_users: Nenhum usuário encontrado role: Função uid: ID de Usuário username: Identificação + valid: Válido title: Administrar Usuários add_to_google_calendar: "Adicionar ao Google Calendar" bigbluebutton: BigBlueButton @@ -198,6 +230,7 @@ pt_BR: cookies: cookie_info: "Cookies nos ajudam a fornecer nossos serviços. Por utilizar nossos serviços, você aceita o nosso uso de cookies." cookie_button: Eu concordo + policy: "Para mais informações, veja nossa política de privacidade ." copied: Copiado copy: Copiar date: @@ -236,6 +269,7 @@ pt_BR: accepted: precisa ser aceitado confirmation: "não corresponde %{attribute}" inclusion: não está incluso na lista + domain: "precisa terminar com \"%{email_domain}\"" no_provider: message: O site que você está tentando acessar não está ativado help: Por favor contate o administrador do sistema @@ -260,7 +294,7 @@ pt_BR: designs: Designs personalizados authentication: Autenticação de usuário footer: - legal: Legal + legal: Termos de Uso privpolicy: Política de Privacidade powered_by: "Powered by %{href}." forgot_password: @@ -274,12 +308,13 @@ pt_BR: dropdown: account_settings: Organização help: "Precisa de ajuda?" - home: Sala inicial + home: Sala Inicial settings: Perfil signout: Sair - home_room: Sala inicial + home_room: Sala Inicial info_update_success: Informações atualizadas com sucesso. - invalid_credentials: E-mail ou senha inválidos. Tente novamente ou clicke em Esqueci minha senha. + invalid_credentials: E-mail ou senha inválidos. Tente novamente ou click em Esqueci minha senha. + invalid_credentials_external: "O e-mail e a senha que você inseriu não correspondem aos nossos registros. Por favor, tente novamente." invalid_login_method: O login falhou porque sua conta foi criada utilizando login social. Selecione a opção de login social para continuar. invite_message: "Para convidar alguém para a reunião, envie este link:" javascript: @@ -324,6 +359,7 @@ pt_BR: info: "Você foi convidado para possuir um espaço pessoal por %{name}" signup_info: "Para se cadastrar utilizado o seu e-mail, clique no botão abaixo e siga os passos." signup_link: Cadastrar-se + valid: "O convite é válido até: %{date}" signup: info: Um usuário que foi convidado se cadastrou para utilizar o Greenlight. admins_link: Visite a página da Organização. @@ -351,8 +387,6 @@ pt_BR: verify_text: 'Para verificar sua conta, siga esse link: %{url}' verify_link: Verificar Conta thanks: "Obrigado por se juntar a nós, tenha um ótimo dia!" - maintenance: - window_alert: "Janela de manutenção agendada para %{date}" max_concurrent: O número máximo de sessões simultâneas foi alcançado. merged: Mesclado modal: @@ -364,7 +398,9 @@ pt_BR: title: Criar novo papel create_room: access_code: Código de acesso + moderator_access_code: Código do moderador access_code_placeholder: Gerar um código de acesso opcional para a sala + moderator_access_code_placeholder: Gerar um código opcional para moderadores auto_join: Entrar na sala automaticamente. create: Criar Sala free_delete: Você poderá apagar esta sala a qualquer momento. @@ -377,6 +413,10 @@ pt_BR: keep: "Não, irei mantê-la." delete_warning: Isto irá desativar a conta do usuário. Todos os usuários desativados poderão ser visualizados na aba Apagados warning: Esta é uma decisão final. Você não será capaz de recuperar os dados associados. + delete_rec: + delete: "Estou certo, exclua essa gravação." + header: "Você esta certo que deseja excluir essa gravação ?" + warning: Você nãopoderá recuperar essa gravação delete_room: confirm: "Você tem certeza de que deseja apagar %{room}?" delete: "Sim, apagar esta sala." @@ -392,6 +432,14 @@ pt_BR: or: ou with: "Entrar com %{provider}" forgot_password: "Esqueceu a senha?" + preupload: + change: Substituir Apresentação + choose: Escolha um arquivo... + current: "Apresentação Atual:" + footer: "Dependendo do tamanho da apresentação, pode ser requerido um tempo adicional para carrega-la antes de poder usa-la." + invalid: Tamanho/tipo do arquivo inválido. Favor consulte as restrições abaixo. + title: Adicionar Apresentação + use: Usar Apresentação rename_recording: remove_shared: title: "Tem certeza de que deseja remover esta sala da sua lista?" @@ -406,6 +454,7 @@ pt_BR: require_approval: Solicitar aprovação do moderador antes de entrar na sala start: Permitir que qualquer usuário inicie esta sala footer_text: Você pode editar as configurações da sala a qualquer momento. + recording: Permitir que a sala seja gravada rename_room: name_placeholder: Digite o novo nome da sala... share_access: @@ -440,6 +489,7 @@ pt_BR: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: Conectar OpenID recaptcha: errors: recaptcha_unreachable: "Oops, não conseguimos validar seu reCAPTCHA. Por favor, tente novamente." @@ -448,9 +498,11 @@ pt_BR: all_recordings: Gravações email: Enviar link da gravação por e-mail error: "Ocorreu um erro ao recuperar %{count} gravações" - no_recordings: "Esta sala não possui %{inject} gravações." + no_public_recordings: Essa sala não possui gravações públicas. + no_recordings: Essa sala não possui gravações. no_user_recordings: Você não possui gravações. - no_matched_recordings: "Nenhuma gravação corresponde à sua busca %{inject}." + no_matched_pub_recordings: Nenhuma gravação pública corresponde à sua pesquisa. + no_matched_recordings: Nenhuma gravação corresponde à sua pesquisa. recorded_on: "Gravado em %{date}" table: name: Nome @@ -460,6 +512,7 @@ pt_BR: visibility: Visibilidade formats: Formatos visibility: + inaccessible: Inacessível public: Público unlisted: Não listado format: @@ -473,7 +526,7 @@ pt_BR: fail: "Sua conta ainda não foi aprovada. Se vários dias se passaram desde que você se cadastrou, por favor, contate o seu administrador." signup: Sua conta foi criada com sucesso. Ela foi enviada para um administrador para aprovação. banned: - fail: "Você não possui permissão para visualizar essa página. Se você acredita que isso seja um engano, por favor, contate o seu administrador." + fail: "Você não possui permissão para visualizar essa página. Se você acredita que isso seja um engano, por favor, contate o seu administrador." deprecated: new_signin: Selecione um novo método de login para a sua conta. Todas as salas de sua antiga conta serão migradas para a nova conta. twitter_signin: "Entrar pelo Twitter foi descontinuado e será removido na próxima versão. Clique aqui para mover a sua conta para um novo método de autenticação." @@ -485,6 +538,7 @@ pt_BR: remove: Remover rename: Renomear reset_password: + captcha: "Verificação do reCAPTCHA falhou, por favor, tente novamente." invalid_token: "O token de redefinição de senha é inválido. Por favor, tente redefinir sua senha novamente." subtitle: Resetar senha password: Nova senha @@ -497,9 +551,13 @@ pt_BR: banned: Banido deleted: Apagados pending: Pendente + invited: Convidado user: Usuário room: access_code_required: Por favor insira o código de acesso para entrar na sala + add_presentation: Adicionar Apresentação + copy_access: Copiar Código de Acesso + copy_moderator_access: Copiar Código do Moderador create_room: Criar uma sala create_room_error: Ocorreu um erro ao criar a sala create_room_success: Sala criada com sucesso @@ -508,8 +566,12 @@ pt_BR: success: Sala excluída com sucesso fail: "Falha ao excluir a sala (%{error})" enter_the_access_code: Insira o código de acesso da sala + enter_the_moderator_access_code: Digite o código de moderador dessa sala! + optional_moderator_access_code: "Código opcional do moderador:" invalid_provider: Você inseriu uma URL inválida. Por favor verifique a URL e tente novamente + invitation_description: "Você foi convidado para se juntar ao %{name}usando BigBlueButton. Para participar, clique no endereço acima e digite seu nome." invited: Você foi convidado a participar da sala + recording_present: "Eu estou ciente que essa sessão será gravada. Isto pode incluir minha voz ou vídeo, se ativado." invite_participants: Convidar participantes join: Participar last_session: "Última sessão em %{session}" @@ -526,6 +588,10 @@ pt_BR: recent_rooms: Ir para uma sala recente title: Entrar na sala no_sessions: Nenhuma sessão foi realizada nesta sala. + preupload_success: Apresentação adicionada com sucesso + preupload_error: Ocorreu um erro ao atualizar a apresentação da sala + preupload_remove_success: Apresentação removida com sucesso + preupload_remove_error: Ocorreu um erro ao remover a apresentação da sala recordings: Gravações da sala room_limit: Você atingiu o número máximo de salas permitido room_limit_exceeded: "Você excedeu o número de salas permitido. Por favor, delete %{difference} sala(s) para acessar essa sala." @@ -538,6 +604,7 @@ pt_BR: shared_access_success: Sala compartilhada com sucesso shared_access_error: Ocorreu um erro ao compartilhar a sala start: Iniciar + search: Pesquisar sala... unavailable: Esta sala não está disponível pois o e-mail do dono da sala ainda não foi verificado. update_settings_error: Ocorreu um erro ao atualizar as configurações da sala update_settings_success: Configurações da sala atualizadas com sucesso @@ -579,6 +646,9 @@ pt_BR: title: Termos e condições test_install: > Esta implantação está usando um servidor de teste pré-configurado, você deve substitui-lo pelo seu próprio. Para detalhes, veja o %{href}. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Atualizar verify: accept: Verificar diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 304d2bb2..c2f99db2 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -36,18 +36,18 @@ ru: enabled: Включено info: Только аутентифицированные пользователи смогут присоединиться к комнате title: Требовать аутентификации для подключения к комнатам - user-info: Вы должны войти в Greenlight для присоединения к этой комнате + user-info: Вы должны авторизоваться в системе чтобы присоединиться к этой комнате. branding: change: Сменить изображение info: "Сменить фирменное изображение, размещенное в левом верхнем углу" - placeholder: Url изображения... + placeholder: Ссылка на изображение... title: Фирменное изображение invalid: Неверная ссылка legal: change: Измените ссылку - info: "Изменить ссылку на Соглашение, которая появляется внизу страницы" - placeholder: Ссылка на Соглашение - title: Соглашение + info: "Изменить ссылку Правила, которая отображается в нижней части страницы" + placeholder: Ссылка на Правила... + title: Правила invalid: Неверная ссылка privpolicy: change: Измените ссылку @@ -69,6 +69,10 @@ ru: regular: Основной lighten: Светлый darken: Темный + email_mapping: + info: "Сопоставьте пользователя с ролью, используя его электронную почту. Должно быть в формате: email1=role1,email2=role2" + title: Сопоставление ролей по электронной почте + update: log_level: title: Уровень журналирования information: Изменение общего уровня журналирования @@ -82,6 +86,18 @@ ru: info: "Устанавливает уровень доступности по умолчанию, для новых записей" title: Доступность по умолчанию для записей warning: "Данная настройка не применится к комнатам, которые уже запущены." + require_consent: + info: "Эта настройка активирует настройку комнаты, в которой владелец может настроить, может ли вестись запись вебинара в его комнате. Присоединяющиеся пользователи должны дать своё согласие на запись перед присоединением." + title: Требуется согласие владельца комнаты и присоединяющегося пользователя для включения записи + maintenance_banner: + info: Отображает пользователю баннер о техническом обслуживании + title: Баннер о техническом обслуживании + display: Установить + clear: Очистить + time: "Например: Обновление запланировано на 13 декабря, 23:00 во восточному времени. У пользователей могут возникнуть проблемы при входе в систему." + preupload: + info: "Пользователи могут предварительно загрузить презентацию, которая будет использоваться в качестве презентации по умолчанию для этой комнаты." + title: Разрешить пользователям предварительно загружать презентации registration: info: Смена способа регистрации пользователей на сайте title: Метод регистрации @@ -96,6 +112,11 @@ ru: info: Отключение опции удалит кнопку из выпадающего меню опций Комнаты и запретит пользователям совместное использование комнат title: Разрешить пользователям совместное использование комнат subtitle: Изменить настройки интерфейса Greenlight + tabs: + appearance: Внешний вид + administration: Администрирование + registration: Регистрация + settings: Настройки title: Настройки сайта flash: approved: Пользователь одобрен. @@ -106,22 +127,25 @@ ru: demoted: Роль пользователя понижена invite: "Приглашение успешно отправлено на адрес %{email}" invite_email_verification: Для использования этого метода работа с почтовыми уведомлениями должна быть активирована. Обратитесь к вашему системному администратору. - merge_fail: Произошла ошибка объединения пользовательских аккаунтов. Проверьте выбранных пользователей и попробуйте снова + merge_fail: Произошла ошибка объединения пользовательских аккаунтов. Проверьте выбранных пользователей и попробуйте снова merge_success: Пользовательские аккаунты успешно объединены perm_deleted: Пользователь удален без возможности восстановления promoted: Роль пользователя повышена registration_method_updated: Метод регистрации обновлен reset_password: "Пользователю был отправлен email для сброса его пароля. (Если пользователь ничего не получил, попросите его проверить папку \"Спам\") в его почтовом ящике" restored: Пользователь успешно восстановлен - room_configuration: Настройки Комнаты успешно изменены + room_configuration: Настройки комнат успешно изменены settings: Настройки сайта изменены unauthorized: У вас недостаточно прав для выполнения действий с этим пользователем recordings: + latest: Последние записи title: Записи сервера no_recordings: На данном сервере нет записей. + search_info: Введите адрес электронной почты пользователя или id комнаты roles: appear_in_share_list: Показывать пользователей с этой ролью в меню совместного использования комнат can_create_rooms: Создание комнат + can_launch_recording: Разрешить пользователям с этой ролью записывать свои конференции delete: Удаление роли invalid_create: Возникла проблема при создании новой роли. Пожалуйста проверьте значения и попробуйте снова. invalid_order: Возникла проблема при обновлении приоритета роли. Пожалуйста проверьте значения и попробуйте снова. @@ -136,12 +160,12 @@ ru: edit_site_settings: Разрешить польователям с этой ролью редактировать настройки сайта edit_roles: Разрешить пользователям с этой ролью редактировать другие роли manage_users: Разрешить пользователям с этой ролью управлять пользователями - invalid_assignment: Возникла проблема при назначении роли пользователю. Пожалуйста проверьте значения и попробуйте снова. + invalid_assignment: Возникла проблема при назначении роли пользователю. Пожалуйста проверьте значения и попробуйте снова. colour: title: Цвет роли info: "Задайте цвет, который будет применен для этой роли" room_configuration: - title: Настройки Комнаты + title: Настройки комнат mute: info: "Автоматически отключает микрофон пользователю, присоединяющемуся к конференции" require_moderator: @@ -150,11 +174,17 @@ ru: info: "Позволить любому пользователю начать конференцию в любое время. По-умолчанию, только влелец комнаты может начинать конференцию." all_moderator: info: "Дать всем пользователям права модератора, когда они подключаются к конференции" + recordings: + info: "Разрешает владельцам комнат настраивать, хотят ли они вести запись в комнате. Если включено, модератор все равно должен нажать \"Начать запись\" после начала вебинара." + moderator_codes: + info: "Позволяет владельцам комнат генерировать PIN-код модератора, который позволит другим пользователям присоединиться в роли модератора." + title: Код доступа модератора options: disabled: Отключено enabled: Всегда Включено optional: Необязательный rooms: + timeout: "Из-за %{server} Время ожидания ответа от сервера истекло, информация о статусе и участниках может быть не точной." title: Комнаты сервера table: ended: "Закончена: %{session}" @@ -184,12 +214,14 @@ ru: table: authenticator: Аутентификатор created: Создано + time: Время отправки name: Имя not_found: По вашему запросу пользователи не найдены no_users: Пользователи не найдены role: Роль uid: ID пользователя username: Имя пользователя + valid: Действительно title: Управление пользователями add_to_google_calendar: "Добавить в мой Google Calendar" bigbluebutton: BigBlueButton @@ -198,6 +230,7 @@ ru: cookies: cookie_info: Cookies помогают нам в предоставлении наших сервисов. Используя наши сервисы Вы соглашаетесь с использованием cookies. cookie_button: Я согласен + policy: "Для подробной информации посмотрите политику конфиденциальности." copied: Скопировано copy: Копировать date: @@ -236,6 +269,7 @@ ru: accepted: подходит confirmation: "не совпадает с %{attribute}" inclusion: не входит в список + domain: "Должно заканчиваться на \"%{email_domain}\"" no_provider: message: "Сайт, к которому вы пытаетесь получить доступ, не включен" help: Пожалуйста обратитесь к вашему системному администратору для установки Greenlight @@ -260,7 +294,7 @@ ru: designs: Изменение внешнего вида authentication: Аутентификация пользователей footer: - legal: Соглашение + legal: Правила privpolicy: Политика Конфиденциальности powered_by: "Работает под управлением %{href}." forgot_password: @@ -280,6 +314,7 @@ ru: home_room: Личная комната info_update_success: Информация успешно обновлена. invalid_credentials: Введенные email и пароль не найдены. Попробуйте снова или пройдите по ссылке "Забыли пароль" для восстановления пароля. + invalid_credentials_external: "Введенный вами адрес электронной почты и пароль не найдены в базе данных сервера. Пожалуйста, попробуйте еще раз." invalid_login_method: Ошибка входа в систему из-за несоответствия аккаунта. Вы должны войти в систему с помощью omniauth. invite_message: "Чтобы пригласить собеседника, отправьте ему эту ссылку:" javascript: @@ -324,6 +359,7 @@ ru: info: "Вы приглашены пользователем %{name} в ваш аккаунт" signup_info: "Для входа используйте ваш email, нажмите на кнопку ниже и следуйте инструкциям." signup_link: Регистрация + valid: "Приглашение действительно до: %{date}" signup: info: "Пользователь, который был приглашен зарегистрироваться в Greenlight." admins_link: Посетить страничку орагнизации @@ -351,8 +387,6 @@ ru: verify_text: 'Для подтверждения вашего аккаунта, пройдите по ссылке: %{url}' verify_link: Подтверждение аккаунта thanks: Спасибо за присоединение и хорошего дня! - maintenance: - window_alert: "Время обслуживания запланировано на %{date}" max_concurrent: Достигнуто максимальное количество одновременно разрешенных сессий! merged: Объединен modal: @@ -364,7 +398,11 @@ ru: title: Создать новую роль create_room: access_code: Код доступа + moderator_access_code: Код модератора access_code_placeholder: Генерация дополнительного кода доступа в комнату + reset_access_code: Сбросить дополнительный код доступа для комнаты + moderator_access_code_placeholder: Генерация кода для модераторов + reset_moderator_access_code: Сбросить дополнительный код доступа для модераторов auto_join: Автоматически подключать меня к комнате create: Создать комнату free_delete: Вы можете удалить эту комнату в любое время. @@ -377,6 +415,10 @@ ru: keep: "Пожалуй, оставлю." delete_warning: Данное действие отключит пользовательский аккаунт. Все отключенные пользователи находятся на вкладе "Удаленые". warning: Это решение является окончательным. Вы не сможете восстановить связанные с пользователем данные. + delete_rec: + delete: "Я уверен, удалите эту запись" + header: "Вы уверены, что хотите удалить эту запись?" + warning: Выне можете восстановить эту запись delete_room: confirm: "Вы уверены, что хотите удалить \"%{room}\"?" delete: "Я уверен, удалить комнату." @@ -392,6 +434,14 @@ ru: or: или with: "Войти с помощью %{provider}" forgot_password: "Забыли пароль?" + preupload: + change: Заменить презентацию + choose: Выберите файл... + current: "Текущая презентация:" + footer: "В зависимости от размера презентации может потребоваться дополнительное время для загрузки, прежде чем её можно будет использовать." + invalid: "Недопустимый размер/тип файла. Пожалуйста, ознакомьтесь с приведенными ниже требованиями к файлам." + title: Добавить презентацию + use: Использовать презентацию rename_recording: remove_shared: title: "Вы уверенны что хотите удалить данную комнату из вашего списка комнат?" @@ -406,6 +456,7 @@ ru: require_approval: Требуется одобрение модератора перед подключением start: Любой пользователь может начать данную встречу footer_text: Настройки вашей комнаты можно изменять в любое время. + recording: Разрешить запись в этой комнате rename_room: name_placeholder: Введите название комнаты... share_access: @@ -440,6 +491,7 @@ ru: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: Соединение через OpenID recaptcha: errors: recaptcha_unreachable: "Упс, мы не смогли подтвердить ваш ответ reCAPTCHA. Пожалуйста попробуйте еще раз." @@ -448,18 +500,21 @@ ru: all_recordings: Все записи email: Отправить запись (ссылку) на e-mail error: "Произошла ошибка при получении %{count} записи(ей)" - no_recordings: "В этой комнате нет %{inject} записей." + no_public_recordings: В этой комнате нет публичных записей. + no_recordings: В этой комнате нет записей. no_user_recordings: В настоящее время у вас нет записей. - no_matched_recordings: "Нет %{inject} записей удовлетворяющих поиску." + no_matched_pub_recordings: По вашему запросу не найдено публичных записей. + no_matched_recordings: По вашему запросу не найдено записей. recorded_on: "Записано %{date}" table: name: Название thumbnails: Эскиз length: Продолжительность - users: Пользователи + users: Юзеры visibility: Доступность formats: Формат visibility: + inaccessible: Недоступно public: Публичная unlisted: Личная format: @@ -473,7 +528,7 @@ ru: fail: "Ваш аккаунт еще не одобрен. Если прошло уже несколько дней после регистрации, свяжитесь с Вашим администратором." signup: Ваш аккаунт успешно создан. Уведомление отправлено администратору для одобрения. banned: - fail: "У Вас нет доступа к приложению. Если вы уверены, что это ошибка, пожалуйста свяжитесь с Вашим администратором." + fail: "У Вас нет доступа к приложению. Если вы уверены, что это ошибка, пожалуйста свяжитесь с Вашим администратором." deprecated: new_signin: Выберите новый метод входа для Вашего аккаунта. Все комнаты старого аккаунта будут перенесены в новый аккаунт. twitter_signin: "Вход через Twitter устарел и будет удален в следующей версии. Перейдите сюда для изменения метода проверки подлинности в Вашем аккаунте." @@ -485,6 +540,7 @@ ru: remove: Удалить rename: Переименовать reset_password: + captcha: "Проверка reCAPTCHA неудачна, пожалуйста, попробуйте еще." invalid_token: Ключ для сброса пароля неверный. Попробуйте сбросить пароль еще раз. subtitle: Сброс пароля password: Новый пароль @@ -497,9 +553,13 @@ ru: banned: Забанен deleted: Удален pending: В ожидании + invited: Приглашен user: Пользователь room: access_code_required: Пожалуйста введите правильный код для входа в комнату. + add_presentation: Добавить презентацию + copy_access: Копировать код доступа + copy_moderator_access: Копировать код модератора create_room: Создать комнату create_room_error: Произошла ошибка при создании комнаты create_room_success: Комната успешно создана @@ -508,8 +568,12 @@ ru: success: Комната удалена fail: "Ошибка удаления комнаты (%{error})" enter_the_access_code: Введите код доступа комнаты + enter_the_moderator_access_code: Введите код модератора! + optional_moderator_access_code: "Дополнительный код модератора:" invalid_provider: Вы указали не верный url. Пожалуйста проверьте url и попробуйте снова. + invitation_description: "Вас пригласили присоединиться к %{name} с помощью BigBlueButton. Чтобы присоединиться, нажмите на ссылку выше и введите свое имя." invited: Вы приглашены присоединиться + recording_present: "Я подтверждаю, что этот вебинар будет записан. Запись может включать мой голос и видео, если они были включены." invite_participants: Пригласить участников join: Присоединиться last_session: "Последняя сессия: %{session}" @@ -526,6 +590,10 @@ ru: recent_rooms: " Перейти к недавно посещенным комнатам" title: Подключиться к комнате no_sessions: В этой комнате еще не было сеансов! + preupload_success: Презентация добавлена успешно + preupload_error: Произошла ошибка при изменении презентации для комнаты + preupload_remove_success: Презентация удалена успешно + preupload_remove_error: Произошла ошибка при удалении презентации для комнаты recordings: Записи комнаты room_limit: Вы превысили максимальное число разрешенных комнат room_limit_exceeded: "Вы достигли лимита разрешенных комнат. Пожалуйста удалите %{difference} комнат(у) для доступа в эту комнату." @@ -538,6 +606,7 @@ ru: shared_access_success: Предоставлен совместный доступ к комнате shared_access_error: Произошла ошибка предоставления совместного доступа к комнате start: Старт + search: Поиск комнаты... unavailable: "В данный момент комната недоступна, поскольку email владельца не подтвержден." update_settings_error: Произошла ошибка при обновлении настроек комнаты update_settings_success: Настройки комнаты успешно обновлены @@ -579,6 +648,9 @@ ru: title: Правила и условия test_install: > "В этом развертывании используется предварительно настроенный тестовый сервер, его следует заменить своим. Для получения дополнительной информации см. %{href}." + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Обновить verify: accept: Подтвердить diff --git a/config/locales/sk_SK.yml b/config/locales/sk_SK.yml index 5022f846..30a121b6 100644 --- a/config/locales/sk_SK.yml +++ b/config/locales/sk_SK.yml @@ -20,7 +20,7 @@ sk_SK: activerecord: attributes: user: - accepted_terms: "Podmienky" + accepted_terms: "Podmienky používania" email: Email name: Meno password: Heslo @@ -32,25 +32,25 @@ sk_SK: administrator: site_settings: authentication: - disabled: Nevyžadované - enabled: Nutné - info: Zmena nutnosti prihlásenia užívateľa pre vstup do miestnosti + disabled: Vypnuté + enabled: Zapnuté + info: Nutnosť prihlásenia užívateľa pre vstup do miestnosti title: Prihlasovanie do miestnosti - user-info: Musíte byť prihlásený užívateľ pre vstup do tejto miestnosti + user-info: Na vstup do miestnosti sa musíte prihlásiť. branding: - change: Zmena loga - info: "Zmena obrazového loga, ktoré sa zobrazuje v ľavom hornom rohu obrazovky" - placeholder: Odkaz na obrázok... + change: Zmeniť URL odkaz + info: "Zmeňte obrazové logo, ktoré sa zobrazuje v ľavom hornom rohu obrazovky" + placeholder: URL odkaz na obrázok... title: Obrázok loga invalid: Neplatný URL odkaz legal: - change: Zmeňte URL odkaz - info: "Zmeňte URL odkaz na registračné údaje firmy, ktoré sa zobrazujú na spodnom okraji stránky" - placeholder: URL odkaz na registračné údaje firmy - title: Registračné údaje firmy + change: Zmeniť URL odkaz + info: Zmeniť odkaz na Podmienky používania na spodnom okraji stránky + placeholder: URL na Podmienky používania + title: Podmienky používania invalid: Neplatný URL odkaz privpolicy: - change: Zmeňte URL odkaz + change: Zmeniť URL odkaz info: "Zmeňte URL odkaz na pravidlá pre ochranu osobných údajov, ktoré sa zobrazujú na spodnom okraji stránky" placeholder: URL odkaz na pravidlá pre ochranu osobných údajov title: Pravidlá pre ochranu osobných údajov @@ -69,6 +69,10 @@ sk_SK: regular: Základná lighten: Svetlá darken: Tmavá + email_mapping: + info: "Spárujte používateľa s rolou pomocou emailu. Musí byť vo formáte email1=role1,email2=role2" + title: Párovanie rolí podľa Emailu + update: log_level: title: Úroveň logovania information: Zmeňte úroveň logovania pre celý systém @@ -82,6 +86,18 @@ sk_SK: info: Zmena štandardnej viditeľnosti pre nové nahrávky title: Štandardná viditeľnosť nahrávok warning: "Toto nastavenie bude aplikované na miestnosti, v ktorých práve neprebieha konferencia" + require_consent: + info: "Toto nastavenie umožňuje vlastníkom miestnosti určiť, ktoré miestnosti sa môžu nahrávať. Používatelia pred prvým vstupom do nahrávanej miestnosti musia udeliť súhlas." + title: Vyžadovať od vlastníka a členov súhlas s nahrávaním + maintenance_banner: + info: Zobraziť oznam s informáciami o plánovanej údržbe + title: Oznam o údržbe + display: Nastaviť + clear: Vyčistiť + time: "Príklad: Dňa 13. decembra o 23:00 ET bude plánovaná aktualizácia. Používatelia môžu mať problémy s prihlásením." + preupload: + info: "Používatelia môžu dopredu načítať prezentáciu, ktorá sa bude používať ako predvolená prezentácia v určitej miestnosti" + title: Umožňuje používateľom dopredu načítat prezentácie registration: info: Zmena spôsobu registrácie na tomto servri title: Spôsob registrácie @@ -93,9 +109,14 @@ sk_SK: info: Zmena celkového počtu miestností užívateľa (vrátane Domovskej). Toto nastavenie sa nevzťahuje na administrátorov. title: Počet miestností na užívateľa shared_access: - info: Nastavenie na "Zakázané" odstráni tlačítko z nastavení miestností a zabráni užívateľom zdieľanie miestností + info: Nastavenie na "Vypnuté" odstráni tlačítko z nastavení miestností a zabráni užívateľom zdieľanie miestností title: Povoliť užívateľom zdieľanie miestností subtitle: Nastavenia servra + tabs: + appearance: Vzhľad + administration: Administrácia + registration: Registrácia + settings: Nastavenie title: Nastavenia servra flash: approved: Užívateľ bol úspešne schválený. @@ -106,7 +127,7 @@ sk_SK: demoted: Užívateľ bol úspešne degradovaný invite: "Pozvánka úspešne odoslaná na %{email}" invite_email_verification: Zasielanie emailov musí byť povolené pre použitie tejto metódy. Kontaktujte prosím Vášho systémového administrátora. - merge_fail: Pri pokuse o zlúčenie užívateľských účtov nastal problém. Skontrolujte prosím vybrané účty a skúste to znova + merge_fail: Pri pokuse o zlúčenie užívateľských účtov nastal problém. Skontrolujte prosím vybrané účty a skúste to znova merge_success: Užívateľské účty boli úspešne zlúčené perm_deleted: Užívateľ bol permanentne zmazaný promoted: Užívateľ bol úspešne povýšený @@ -117,8 +138,10 @@ sk_SK: settings: Nastavenia servra úspešne zmenené unauthorized: Nie ste autorizovaný na vykonávanie zmien na tomto užívateľovi recordings: + latest: Najnovšie záznamy title: Nahrávky servra no_recordings: Tento server nemá nahrávky. + search_info: Vložte email používateľa alebo uid miestnosti roles: appear_in_share_list: Užívateľov s touto rolou zaradiť do zoznamu pre zdieľanie miestností can_create_rooms: Môže vytvárať miestnosti @@ -126,43 +149,49 @@ sk_SK: invalid_create: Nastal problém pri vytváraní novej role. Skontrolujte prosím vstupné údaje a skúste to znova invalid_order: Rola user musí mať najnižšiu prioritu a rola admin musí mať najvyššiu prioritu invalid_update: "Nemôžete prideliť roli vyššiu prioritu, ako je Vaša vlastná" - manage_rooms_recordings: Užívateľom s touto rolou povoliť prístup do manažmentu miestností a nahrávok + manage_rooms_recordings: Užívateľom s touto rolou povoliť prístup do správy miestností a nahrávok name: Názov role new_role: Vytvoriť novú rolu role_has_users: "Táto rola je pridelená k %{user_count} účtom. Prosím odstráňte z role všetky účty pred jej zmazaním." - title: Role + title: Správa rolí promote_email: "Odoslať email užívateľom, keď im je pridelená táto rola" demote_email: "Odoslať email užívateľom, keď im je odobratá táto rola" edit_site_settings: Povoliť užívateľom s touto rolou meniť nastavenia servra edit_roles: Povoliť užívateľom s touto rolou meniť iné role - manage_users: Povoliť užívateľom s touto rolou manažovať užívateľov - invalid_assignment: "Nemôžete užívateľom prideliť rolu s vyššiu prioritou, ako je Vaša vlastná" + manage_users: Povoliť užívateľom s touto rolou prístup do správy užívateľov + invalid_assignment: "Nemôžete užívateľom prideliť rolu s vyššiu prioritou, ako je Vaša vlastná" colour: title: Farba role info: "Nastaviť farbu, ktorá bude pridelená roli" room_configuration: title: Nastavenia miestností mute: - info: "Automaticky stlmiť užívateľov, keď vstupujú do audio konferencie" + info: "Automaticky stlmiť užívateľov, keď vstupujú do audio konferencie." require_moderator: - info: "Žiadať moderátora konferencie o potvrdenie, keď sa užívateľ pokúša pripojiť. Ak bude prístup potvrdený, úžívateľ sa môže pripojiť ku konferencii." + info: "Žiadať moderátora konferencie o povolenie, keď sa užívateľ pokúša pripojiť. Ak bude prístup povolený, úžívateľ sa môže pripojiť ku konferencii." allow_any: - info: Povoliť každému užívateľovi začať konferenciu kedykoľvek. Obvykle môže začať konferenciu iba majiteľ miestnosti. + info: Povoliť každému užívateľovi začať kedykoľvek konferenciu. Obvykle môže začať konferenciu iba majiteľ miestnosti. all_moderator: info: "Prideliť práva moderátora každému užívateľovi, ktorý sa pripojí do konferencie." + recordings: + info: "Umožňuje vlastníkom miestnosti určiť, či chcú mať možnosť nahrávania miestnosti alebo nie. Ak je zapnuté, moderátor stále musí stlačiť tlačidlo \"Nahrávanie\", keď sa stretnutie začne." + moderator_codes: + info: "Dáva vlastníkom miestnosti možnosť vygenerovať pin pre moderátora, ktorý umožní iným používateľom pripojiť sa priamo ako moderátor." + title: Prístupový kód moderátora options: - disabled: Nevyžadované - enabled: Vždy Povolené + disabled: Vypnuté + enabled: Zapnuté (vždy) optional: Voliteľné rooms: + timeout: "Kvôli uplynutiu časového limitu požiadavky %{server}nemusia byť informácie o stave a účastníkoch presné." title: Miestnosti servra table: - ended: "Ukončených: %{session}" + ended: "Koniec: %{session}" id: ID - not_running: Neprebieha + not_running: Prázdna participants: Účastníkov - running: Prebieha - started: "Ukončených: %{session}" + running: Obsadená + started: "Začiatok: %{session}" status: Stav view: Prezrieť title: Nastavenia organizácie @@ -183,14 +212,16 @@ sk_SK: undelete: Obnoviť table: authenticator: Overovaný cez - created: Vytvorený + created: Vytvorenie + time: Čas odoslania name: Celé meno not_found: Vášmu hľadaniu nevyhovujú žiadni užívatelia no_users: Užívatelia nenájdení role: Rola uid: ID Užívateľa username: Prihlasovacie meno - title: Manažment užívateľov + valid: Platné + title: Správa užívateľov add_to_google_calendar: "Pridaj do Google Kalendára" bigbluebutton: BigBlueButton bigbluebutton_exception: "Oops, pri štarte konferencie nastala chyba!" @@ -212,7 +243,7 @@ sk_SK: errors: bigbluebutton: help: "Prosím ubezpečte sa, že ste postupovali podľa návodu. Learn more" - message: Neplatný BigBlueButton Endpoint a(lebo) Secret + message: Neplatný BigBlueButton Endpoint alebo Secret title: Chyba Servra internal: message: "Zdá sa, že nastala chyba na strane servra." @@ -246,8 +277,8 @@ sk_SK: help: Prosím kontaktujte Vášho administrátora. message: "Prepáčte, tento užívateľ nie je registrovaný." user_missing: - help: Prosím skontrolujte odkaz a skúste to znova - message: Zadaný odkaz nie je platný. + help: Prosím skontrolujte URL odkaz a skúste to znova + message: Zadaný URL odkaz nie je platný. title: Chyby unauthorized: message: Nemáte prístup k tejto aplikácii @@ -260,7 +291,7 @@ sk_SK: designs: Zákaznícky dizajn authentication: Overovanie užívateľov footer: - legal: Registračné údaje firmy + legal: Podmienky používania privpolicy: Zásady ochrany osobných údajov powered_by: "Powered by %{href}." forgot_password: @@ -324,6 +355,7 @@ sk_SK: info: "Boli ste pozvaný do Vášho osobného priestoru užívateľom %{name}" signup_info: "Pre registráciu Vaším emailom, kliknite na tlačítko nižšie a postupujte podľa predpísaných krokov." signup_link: Registrácia + valid: "Pozvánka je platná do: %{date}" signup: info: Pozvaný Greenlight užívateľ sa zaregistroval. admins_link: Navštívte stránku Organizácia @@ -351,8 +383,6 @@ sk_SK: verify_text: 'Pre overenie Vášho účtu len nasledujte tento odkaz: %{url}' verify_link: Overenie účtu thanks: "Ďakujeme, že ste sa k nám pridali a prajeme pekný deň!" - maintenance: - window_alert: "Údržba bola naplánovaná na %{date}" max_concurrent: Bol dosiahnutý maximálny povolený počet súčasne aktívnych pripojení! merged: Zlúčených modal: @@ -364,7 +394,9 @@ sk_SK: title: Vytvoriť novú rolu create_room: access_code: Prístupový kód + moderator_access_code: Kód moderátora access_code_placeholder: Vygenerovať voliteľný prístupový kód + moderator_access_code_placeholder: Vygenerovať voliteľný kód pre moderátorov auto_join: Chcem sa automaticky pripájať do tejto miestnosti create: Vytvoriť miestnosť free_delete: Túto miestnosť môžete kedykoľvek zmazať. @@ -377,6 +409,10 @@ sk_SK: keep: "Zmenil som názor, účet chcem zachovať." delete_warning: Týmto bude deaktivovaný užívateľov účet. Všetky deaktivované účty nájdete v záložke Zmazaní. warning: Toto rozhodnutie je konečné. Už nebude možné obnoviť žiadne súvisiace dáta. + delete_rec: + delete: "Áno, chcem zmazať túto nahrávku." + header: "Určite chcete zmazať túto nahrávku?" + warning: Túto nahrávku užnebude možné obnoviť delete_room: confirm: "Určite chcete zmazať miestnosť %{room}?" delete: "Som si istý, miestnosť chcem zmazať." @@ -392,6 +428,14 @@ sk_SK: or: alebo with: "Prihlásenie cez %{provider}" forgot_password: "Zabudnuté heslo?" + preupload: + change: Vymeniť prezentáciu + choose: Zvoľte súbor... + current: "Aktuálna prezentácia:" + footer: V závislosti na veľkosti prezentácie môže byť pred začiatkom používania potrebný dlhší čas na načítanie. + invalid: Naplatná veľkosť/typ súboru. Prezrite si obmedzenia uvedené nižšie. + title: Pridať prezentáciu + use: Použiť prezentáciu rename_recording: remove_shared: title: "Určite chcete odstrániť túto miestnosť z vášho zoznamu miestností?" @@ -403,13 +447,14 @@ sk_SK: client: Vyberte typ klienta join_moderator: Všetci užívatelia sa pripoja ako moderátor mute: Stlmiť zvuk užívateľov pri pripojení - require_approval: Požadovať povolenie moderátora pred pripojením + require_approval: Vyžadovať povolenie moderátora pred pripojením start: Povoliť každému užívateľovi začať konferenciu - footer_text: Nastavenia Vašej miestnosti môžete zmeniť kedykoľvek. + footer_text: Nastavenia miestnosti môžete zmeniť kedykoľvek. + recording: Umožniť nahrávanie miestnosti rename_room: name_placeholder: Zadajte nový názov miestnosti... share_access: - footer: Zdieľaním miestnosti s iným užívateľom mu povolíte začínať konferenie a sledovať nahrávky miestnosti. + footer: Zdieľaním miestnosti s iným užívateľom mu povolíte začínať konferencie a sledovať nahrávky miestnosti. list: "Zdieľaná s " title: Zdieľať prístup k miestnosti save: Uložiť zmeny @@ -429,7 +474,7 @@ sk_SK: pagy: nav: prev: "‹ Predchádzajúci" - next: "Nasledovný ›" + next: "Nasledujúci ›" gap: "…" password: Heslo password_empty_notice: Heslo nemôže byť prázdne. @@ -440,6 +485,7 @@ sk_SK: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: "Oops, nepodarilo sa nám overiť Vašu odpoveď na reCAPTCHA. Skúste to prosím znova." @@ -473,7 +519,7 @@ sk_SK: fail: "Váš účet zatiaľ nebol overený. Ak od Vašej registrácie už ubehlo niekoľko dní, kontaktujte prosím Vášho administrátora." signup: Váš účet bol úspešne vytvorený. Bol odoslaný administrátorovi na overenie. banned: - fail: "Váš prístup k tejto aplikácii bol zakázaný. Ak si myslíte, že ide o omyl, kontaktujte prosím Vášho administrátora." + fail: "Váš prístup k tejto aplikácii bol zakázaný. Ak si myslíte, že ide o omyl, kontaktujte prosím Vášho administrátora." deprecated: new_signin: Vyberte si nový spôsob prihlasovania pre Váš účet. Všetky miestnosti Vášho starého účtu budú presunuté do nového účtu twitter_signin: "Prihlasovanie cez Twitter bolo pozastavené a bude odstránené v ďalšej verzii. Kliknite sem pre presun Vášho účtu na nový spôsob prihlasovania" @@ -485,6 +531,7 @@ sk_SK: remove: Odstrániť rename: Premenovať reset_password: + captcha: "Overenie reCAPTCHA zlyhalo, skúste to prosím znova." invalid_token: Značka pre reset hesla je neplatná. Prosím skúste resetnúť svoje heslo znova. subtitle: Reset hesla password: Nové heslo @@ -500,6 +547,9 @@ sk_SK: user: Užívateľ room: access_code_required: Prosím zadajte platný prístupový kód pre vstup do miestnosti + add_presentation: Pridať prezentáciu + copy_access: Skopírovať prístupový kód + copy_moderator_access: Skopírovať kód moderátora create_room: Vytvoriť miestnosť create_room_error: Pri vytváraní miestnosti nastala chyba create_room_success: Miestnosť bola úspešne vytvorená @@ -508,8 +558,12 @@ sk_SK: success: Miestnosť bola úspešne vymazaná fail: "Nastala chyba pri mazaní miestnosti (%{error})" enter_the_access_code: zadajte prístupový kód miestnoti + enter_the_moderator_access_code: Vložte moderátorský kód miestnosti! + optional_moderator_access_code: "Voliteľný kód moderátora:" invalid_provider: Zadali ste neplatný odkaz. Prosím skontrolujte odkaz a skúste to znova. + invitation_description: "Toto je pozvánka na pripojenie k %{name} pomocou BigBlueButton. Ak sa chcete pripojiť, kliknite na vyššie uvedený odkaz a napíšte vaše meno." invited: Boli ste pozvaný(á) na konferenciu v miestnosti + recording_present: "Beriem na vedomie, že táto relácia bude zaznamenaná. Môže to zahŕňať môj hlas a video, ak sú povolené." invite_participants: Pozvánka pre účastníkov join: Pripojiť sa last_session: "Posledná konferencia dňa %{session}" @@ -526,18 +580,23 @@ sk_SK: recent_rooms: Vstúpiť do poslednej navštívenej miestosti title: Vstup do miestnosti no_sessions: Táto miestnosť nemá zatiaľ žiadne konferencie! + preupload_success: Prezentácia úspešne pridaná + preupload_error: Pri aktualizácii prezentácie v miestnosti nastala chyba + preupload_remove_success: Prezentácia bola úspešne odstránená + preupload_remove_error: Pri odstraňovaní prezentácie v miestnosti nastala chyba recordings: Nahrávky room_limit: Dosiahli ste maximálny povolený počet miestností room_limit_exceeded: "Prekročili ste maximálny povolený počet miestností. Prosím zmažte %{difference} miestnost(i) pre vstup do tejto miestnosti." sessions: Konferencie settings: Nastavenia miestnosti - share: Manažovať prístup + share: Spravovať prístup shared_by: "Zdieľaná s %{email}" remove_shared_access_success: Zdieľaná miestnosť bola úspešne odstránená z Vášho zoznamu miestností remove_shared_access_error: Nastala chyba pri pokuse o odstránenie zdieľanej miestnosti z Vášho zoznamu miestností shared_access_success: Miestnosť je úspešne zdieľaná shared_access_error: Nastala chyba pri pokuse o zdieľanie miestnosti start: Začať konferenciu + search: Hľadá sa miestnosť... unavailable: "Táto miestnosť je momentálne nedostupná, pretože majiteľov email nebol overený." update_settings_error: Pri aktualizácii nastavení miestnosti nastala chyba update_settings_success: Nastavenia miestnosti boli úspešne zmenené diff --git a/config/locales/tr_TR.yml b/config/locales/tr_TR.yml index 231ddc87..f390044b 100644 --- a/config/locales/tr_TR.yml +++ b/config/locales/tr_TR.yml @@ -22,7 +22,7 @@ tr_TR: user: accepted_terms: "Şartlar ve Koşullar" email: E-posta - name: İsim + name: Ad password: Parola password_confirmation: Parola Onayı errors: @@ -32,16 +32,28 @@ tr_TR: administrator: site_settings: authentication: - disabled: Devre dışı + disabled: Devre Dışı enabled: Etkin info: Yalnızca kimliği doğrulanmış kullanıcıların bir oturuma katılmalarına izin ver title: Oturumlar için Kimlik Doğrulama Gerektir - user-info: Bunun için giriş yapmalısınız + user-info: Bu odaya katılmak için giriş yapmış olmanız gerekmektedir. branding: change: Resmi Değiştir - info: Sol üst köşedeki marka logosunu değiştirin - placeholder: Resim Url... - title: Marka Resmi + info: Sol üst köşedeki logoyu değiştirin + placeholder: Resim URL'si... + title: Kuruluş Logosu + invalid: Geçersiz URL + legal: + change: URL'yi Değiştir + info: Sayfanın altında bulunan Kullanım Koşulları bağlantısını değiştirin + placeholder: Kullanım Koşulları URL'si + title: Kullanım Koşulları + invalid: Geçersiz URL + privpolicy: + change: URL'yi Değiştir + info: Sayfanın altında bulunan Gizlilik İlkesi bağlantısını değiştirin + placeholder: Gizlilik İlkesi URL'si + title: Gizlilik İlkesi invalid: Geçersiz URL cache: info: Güncellenmiş bilgiler için yeni bir istekte bulunan depolanmış sağlayıcı önbelleğini temizler @@ -52,63 +64,88 @@ tr_TR: title: Geçerli Kimlik Doğrulayıcıyı Temizle button: Yetkilendirme color: - info: "Normal Rengi değiştirmek , hem Açıklaştır hem de Koyulaştırır. Açıklaştır ve Koyulaştır sonra ayrı ayrı değiştirilebilir." + info: "Doğal rengi değiştirmek, hem Açık hem de Koyu rengi değiştirecektir. Açık ve Koyu rengi sonradan ayrı ayrı değiştirebilirsiniz." title: Ana Renk - regular: Düzenli - lighten: Rengi aç - darken: Koyult + regular: Doğal + lighten: Açık + darken: Koyu + email_mapping: + info: "Kullanıcıyı e-postasını kullanarak bir role eşleyin. email1=rol1,email2=role2 biçiminde olmalıdır" + title: E-posta ile Rol Eşleme + update: log_level: - title: Oturum açma düzeyi - information: Tüm dağıtım için oturum açma düzeyini değiştir - debug: Hata ayıkla + title: Log Tutma Düzeyi + information: Tüm dağıtım için log tutma düzeyini değiştir + debug: Hata Ayıkla info: Bilgi - warn: Uyar + warn: Uyarı error: Hata - fatal: Onulmaz + fatal: Ölümcül unknown: Bilinmeyen recording_visibility: - info: Yeni kayıtlar için varsayılan kayıt görünürlüğünü ayarlama - title: Varsayılan Görünürlük Kaydı - warning: Bu ayar yalnızca çalışmayan odalara uygulanır + info: Yeni kayıtlar için varsayılan kayıt görünürlüğünü ayarlayın + title: Varsayılan Kayıt Görünürlüğü + warning: Bu ayar yalnızca şu an için etkin olmayan odalara uygulanacaktır + require_consent: + info: "Bu ayar, oda sahiplerinin hangi odaların kaydedilebileceğini belirlemesine olanak tanıyan bir oda ayarını etkinleştirir. Kayıtlı bir odaya katılan kullanıcılar, katılmadan önce onay vermelidir." + title: Kayıt için Oda Sahibi İzni İsteyin + maintenance_banner: + info: Kullanıcılara planlanmış bir bakım konusunda bilgilendirmek için bir başlık görüntüler + title: Bakım Açıklaması + display: Ayarla + clear: Temizle + time: "Örnek: 29 Şubat Saat 23:00'da bakım çalışması yapılacaktır. Kullanıcılar oturum açmada sorun yaşayabilir." + preupload: + info: "Kullanıcılar, söz konusu oda için varsayılan sunum olarak kullanılacak bir sunumu önceden yükleyebilir" + title: Kullanıcıların sunularını önceden yüklemelerine izin ver registration: info: Kullanıcıların web sitesine kayıt olma şeklini değiştirin title: Kayıt Yöntemi methods: approval: Onayla/Reddet invite: Davete Katıl - open: Kaydı Aç + open: Kayıt Olmayı Aç rooms: - info: Kullanıcının sahip olabileceği oda sayısını kısıtlar (Ana oda dahil). Bu ayar adminlere uygulanamaz. + info: Kullanıcının sahip olabileceği oda sayısını kısıtlar (Ana Oda dahil). Bu ayar yöneticilere uygulanamaz. title: Kullanıcı Başına Oda Sayısı shared_access: info: "Devre dışı ayarını seçmek oda seçenekleri düğmesini kaldırır, kullanıcıların odaları paylaşmasını önler" - title: Kullanıcıların odaları paylaşmasına olanak verir - subtitle: Greenlight'ı Özelleştir + title: Kullanıcıların Oda Paylaşmasına İzin Ver + subtitle: Özelleştir + tabs: + appearance: Görünüm + administration: Yönetim + registration: Kayıt + settings: Ayarlar title: Site Ayarları flash: approved: Kullanıcı Başarıyla Onaylandı - banned: Kullanıcı Başarıyla Yasaklandı + banned: Kullanıcı başarıyla engellendi. unbanned: Kullanıcının Yasağı Başarıyla Kaldırıldı delete: Kullanıcı Başarıyla Silindi delete_fail: Kullanıcı Silinemedi demoted: Kullanıcı başarıyla indirgendi - invite: "Davet başarıyla gönderildi %{email}" + invite: "Davet %{email} adresine başarıyla gönderildi" invite_email_verification: Bu yöntemi kullanabilmek için e-postaların etkinleştirilmesi gerekir. Lütfen sistem yöneticinize başvurun. - merge_fail: Kullanılıcıları birleştirirken bir hata oluştu. Lütfen seçili kullanıcıları kontrol edin ve yeniden deneyin. + merge_fail: Kullanılıcıları birleştirirken bir hata oluştu. Lütfen seçili kullanıcıları kontrol edin ve yeniden deneyin. merge_success: Kullanıcılar başarılı şekilde birleştirildi perm_deleted: Kullanıcı kalıcı olarak silindi promoted: Kullanıcı başarıyla terfi etti registration_method_updated: Kayıt yöntemi başarıyla güncellendi - reset_password: Kullanıcıya şifresini değiştirmesi için e-posta gönderildi. (Eğer e-posta alınmadıysa lütfen spam kutusunu kontrol etmelerini isteyiniz) + reset_password: Kullanıcıya parolasını değiştirmesi için e-posta gönderildi. (Eğer e-posta alınmadıysa lütfen spam kutusunu kontrol etmelerini isteyiniz) restored: Kullanıcı başarıyla geri yüklendi + room_configuration: Oda Ayarları başarıyla değiştirildi settings: Site ayarları başarıyla değiştirildi unauthorized: Bu kullanıcı üzerinde işlem yapma yetkiniz yok recordings: - title: Sunucu Kayıtları + latest: Son Kayıtlar + title: Kayıtlar no_recordings: Bu sunucuda kayıt yok + search_info: Bir kullanıcının tam e-posta adresini veya bir odanın kullanıcı kimliğini (uid) girin roles: appear_in_share_list: Kullanıcıları odaları paylaşmaları için bu rolle açılır listeye ekleyin - can_create_rooms: Odalar oluşturulabilir + can_create_rooms: Oda oluşturulabilir + can_launch_recording: Bu role sahip kullanıcıların toplantılarını kaydetmesine izin ver delete: Rolü sil invalid_create: Rol oluşturulurken hata oldu. Lütfen rol değerlerini yeniden kontrol ediniz. invalid_order: Rol önceliğini güncellerken hata oluştu. Lütfen değerleri kontrol edip yeniden deneyiniz. @@ -123,19 +160,42 @@ tr_TR: edit_site_settings: Bu roldeki kullanıcıların site ayarlarını düzenlemesine izin ver edit_roles: Bu roldeki kullanıcıların site ayarlarını düzenlemesine izin ver manage_users: Bu roldeki kullanıcıların kullanıcıları yönetmesine izin ver - invalid_assignment: Kullanıcıya rolün atanmasında hata oluştu. Lütfen değerleri kontrol edip yeniden deneyiniz. + invalid_assignment: Kullanıcıya rolün atanmasında hata oluştu. Lütfen değerleri kontrol edip yeniden deneyiniz. colour: title: Rol rengi info: Rolle ilişkilendirilecek rengi ayarlama + room_configuration: + title: Oda Ayarları + mute: + info: Görüşmeye katıldığında kullanıcıyı otomatik olarak susturur + require_moderator: + info: Bir kullanıcı katılmaya çalıştığında moderatör uyarılır. Kullanıcı onaylanırsa toplantıya katılabilir. + allow_any: + info: "Herhangi bir kullanıcının herhangi bir zamanda toplantıyı başlatmasına izin verir. Varsayılan olarak, yalnızca oda sahibi toplantıyı başlatabilir." + all_moderator: + info: Toplantıya katıldıklarında tüm kullanıcılara BigBlueButton'da moderatör ayrıcalıkları verir. + recordings: + info: "Oda sahiplerinin, bir oda kaydetme seçeneğini isteyip istemediklerini belirtmelerine olanak tanır. Etkinleştirilirse, toplantı başladıktan sonra moderatör yine de \"Kaydet\" düğmesini tıklamalıdır." + moderator_codes: + info: Oda sahiplerinin isteğe bağlı olarak diğer kullanıcıların doğrudan moderatör olarak katılmasına olanak tanıyan bir moderatör pini oluşturmasına olanak tanır. + title: Moderatör Giriş Kodu + options: + disabled: Devre Dışı + enabled: Daima Etkin + optional: İsteğe Bağlı rooms: - title: Sunucu Odaları + timeout: "%{server}sunucusu isteğinin zaman aşımına uğraması nedeniyle durum ve katılımcılara ilişkin bilgiler doğru olmayabilir." + title: Odalar table: - id: Kimlik bilgisi + ended: "Bitti: %{session}" + id: Kimlik Bilgisi (ID) not_running: Çalışmıyor + participants: Katılımcılar running: Çalışıyor + started: "Başladı: %{session}" status: Durum view: Görünüm - title: Organizasyon ayarları + title: Organizasyon Ayarları users: invite: Kullanıcıyı davet et edit: @@ -143,55 +203,59 @@ tr_TR: settings: approve: Onayla decline: Reddet - ban: Kullanıcıyı yasakla + ban: Kullanıcıyı Engelle delete: Sil edit: Düzenle edit_roles: Kullanıcı rollerini düzenleyin - perm_delete: Kalıcı olarak sil + merge: Birleştir + perm_delete: Kalıcı Olarak Sil unban: Kullanıcı Yasağını Kaldır undelete: Geri al table: - authenticator: Kimlik denetleyicisi - created: Düzenlendi - name: İsim + authenticator: Kimlik Denetleyicisi + created: Oluşturuldu + time: Gönderilen Zaman + name: Ad Soyad not_found: Aramanızla eşleşen kullanıcı yok no_users: Kullanıcı bulunamadı role: Rol - uid: Kullanıcı kimliği - username: Kullanıcı adı - title: Kullanıcıları Yönet - add_to_google_calendar: "Kullanıcıları Yönet" + uid: Kullanıcı Kimliği (ID) + username: Kullanıcı Adı + valid: Geçerli + title: Kullanıcılar + add_to_google_calendar: "Google Takvim'e ekle" bigbluebutton: BigBlueButton - bigbluebutton_exception: Hata! Toplantıya başlarken bir hata oluştu! + bigbluebutton_exception: "Hay aksi, toplantıya başlarken bir hata oluştu!" cancel: İptal cookies: - cookie_info: Çerezler hizmetlerimizi sunmamıza yardım etmektedir. Hizmetleri kullanırken çerezlerin kullanılmasını kabul etmektesiniz. - cookie_button: Katılıyorum - copied: Kopyalanan + cookie_info: "Çerezler, hizmetlerimizi sunmamıza yardımcı olur. Hizmetlerimizi kullanarak, çerez kullanımımızı kabul etmiş olursunuz." + cookie_button: Kabul Ediyorum + policy: "Dah fazla bilgi için gizlik politakamızabakınız." + copied: Kopyalandı copy: Kopya date: month_names: [~, Ocak, Şubat, Mart, Nisan, Mayıs, Haziran, Temmuz, Ağustos, Eylül, Ekim, Kasım, Aralık] - default_admin: "Bu hesap halen için varsayılan şifreyi kullanıyorsunuz. Değiştirmek için lütfen burayı tıklayınız." + default_admin: "Bu hesap için varsayılan parolayı kullanıyorsunuz. Değiştirmek için lütfen buraya tıklayınız." delete: Sil delivery_error: E-Posta gönderilirken bir hata oluştu. Lütfen sistem yöneticisi ile iletişime geçiniz! docs: Dokümantasyon email: E-posta email_sent: "E postanız %{email_type} gönderildi! (Eğer e-posta alınmadıysa lütfen spam kutusunu kontrol etmelerini isteyiniz)" - enter_your_name: Adınızı giriniz! + enter_your_name: Ad soyad giriniz! errors: bigbluebutton: help: "Lütfen doğru adımların yürütüldüğünden emin olun Daha fazla" - message: Geçersiz BigBlueButton bitiş noktası ve gizli - title: Sunucu hatası + message: Geçersiz BigBlueButton URL ve anahtarı + title: Sunucu Hatası internal: message: Bir şeyler ters gitti gibi görünüyor. help: "Hata kaydedildi, bir göz atacağız!" - report: Rapor bildir + report: Sorun Bildir maintenance: - message: "Üzgünüz, bakım için kapalıyız." - help: Yakında döneceğim! + message: "Üzgünüz, bakım nedeniyle kapalıyız." + help: Yakında döneceğiz! migration_error: - contact_admin: "Yönetici değilseniz, lütfen bir tanesine başvurun." + contact_admin: "Yönetici değilseniz, lütfen bir yöneticiyle iletişim kurunuz." continue: 1.0 kullanarak kalmak istiyorum. notice: > Greenlight veri tabanı aktarımı hatası verdi.
Greenlight 2.0. güncelleme yapmadığınız için gerçekleşmiş olabilir @@ -205,6 +269,7 @@ tr_TR: accepted: kabul edildi confirmation: "eşleşmiyor% {Özelliği}" inclusion: Listeye dahil edilmedi + domain: "\"%{email_domain}\" ile bitmeli" no_provider: message: Erişmeye çalıştığınız site etkin değil help: Lütfen Greenlight'ı kurmak için sistem yöneticinize başvurun. @@ -221,32 +286,35 @@ tr_TR: unauthorized: message: Bu uygulamaya erişiminiz yok help: "Bunun bir hata olduğunu düşünüyorsanız, lütfen sistem yöneticinize başvurun." - expired_reset_token: Şifre sıfırlama bağlantısının süresi doldu! + expired_reset_token: Parola sıfırlama bağlantısının süresi doldu! features: title: Özellikler rooms: Kişiselleştirilmiş Odalar recordings: Kayıt Yönetimi - designs: Özel tasarımlar - authentication: Kullanıcı doğrulama + designs: Özel Tasarımlar + authentication: Kullanıcı Doğrulama footer: - powered_by: "Powered by %{href}." + legal: Kullanım Koşulları + privpolicy: Gizlilik İlkesi + powered_by: "%{href} tarafından desteklenmektedir." forgot_password: subtitle: Parolanızı mı unuttunuz - email: E-mail + email: E-posta submit: Gönder go_back: Geri dön greenlight: Greenlight header: - all_recordings: Tüm Kayıtlar + all_recordings: Kayıtlar dropdown: - account_settings: organizasyon + account_settings: Organizasyon help: "Yardıma mı ihtiyacınız var?" - home: Ev - settings: profil + home: Ana Sayfa + settings: Profil signout: Oturumu Kapat - home_room: Ev Odası + home_room: Ana Oda info_update_success: Bilgi başarıyla güncellendi. - invalid_credentials: "Girdiğiniz e-posta ve şifre kayıtlarımızla eşleşmedi. Parolanızı sıfırlamak için tekrar deneyin veya Parolanızı mı unuttunuz?" + invalid_credentials: Girdiğiniz e-posta ve parola kayıtlarımızla eşleşmedi. Lütfen tekrar deneyin ya da Parolamı Unuttum bağlantısına tıklayarak parolanınızı sıfırlayın. + invalid_credentials_external: "Girdiğiniz e-posta ve parola kayıtlarımızla eşleşmedi. Lütfen tekrar deneyin " invalid_login_method: Hesap uyumsuzluğu nedeniyle giriş yapılamadı. OmniAuth ile giriş yapmalısınız invite_message: "Birisini toplantıya davet etmek için onlara şu bağlantıyı gönderin:" javascript: @@ -257,23 +325,23 @@ tr_TR: autogenerated: 'Bu e-posta BigBlueButton tarafından otomatik olarak oluşturulmuştur.' footer: 'BigBlueButton bir açık kaynak web konferans sistemidir. BigBlueButton hakkında daha fazla bilgi için, https://bigbluebutton.org/.' search: - start: Armaya başla + start: Aramaya başla... landing: - about: "%{href} BigBlueButton açık kaynak web konferans sunucusu için basit bir ön yüzdür. Oturumlar düzenlemek için kendi odalarınızı oluşturabilir veya kısa bir bağlantı göndererek katılmalarını sağlayabilirsiniz." - welcome: BigBlueButton'a hoş geldiniz. - video: Greenlight'ı kullanma hakkındaki eğitimimizi izleyin + about: "BigBlueButton açık kaynak kodlu bir web konferans sunucusudur. Oturumlar düzenlemek için kendi odalarınızı oluşturabilir, kısa bir bağlantı göndererek katılmalarını sağlayabilirsiniz." + welcome: BigBlueButton'a Hoş Geldiniz. + video: Sistem kullanım videosunu izleyin upgrade: 2.0'a nasıl yükselteceğimi göster! version: "Greenlight'ın yeni bir versiyonunu yayınladık, ancak veritabanınız uyumlu değil." language_default: Varsayılan (tarayıcı dili) ldap_error: LDAP sunucusuna bağlanılamadı. Lütfen env dosyasındaki LDAP konfigürasyonunuzu kontrol ediniz ve sunucunuzun çalıştığından emin olunuz - login: oturum aç - login_title: hesabınıza giriş yapın + login: Giriş Yap + login_title: Hesabınıza Giriş Yapın mailer: user: approve: info: Hesabınız onaylandı. - signin: Kişisel odalarınıza erişmek için aşağıdaki butona tıklayın ve giriş yapın. - signin_link: Oturum aç + signin: Kişisel odalarınıza erişmek için aşağıdaki düğmeye tıklayın ve giriş yapın. + signin_link: Giriş Yap signup: info: Greenlight'ı kullanmak için yeni bir kullanıcı kayıt oldu. more-info: Kullanıcıların Greenlight a ulaşabilmeleri için organizasyon ayarlarında kullanıcının hesabını onaylamalısınız @@ -285,24 +353,25 @@ tr_TR: demoted: info: "%{url}bağlantısındaki %{role}rolünde değilsiniz" more-info: Artık normal bir kullanıcıyla aynı ayrıcalıklara sahipsiniz. - root_link: Oturum aç + root_link: Giriş Yap subtitle: "%{role}Hakları geçersiz kılındı" invite: info: "Kişisel alanınıza %{name} tarafından davet edildiniz." - signup_info: E-postanızı kullanarak kaydolmak için aşağıdaki butona tıklayın ve adımları izleyin. - signup_link: Kaydol + signup_info: E-postanızı kullanarak kayıt olmak için aşağıdaki düğmeye tıklayın ve adımları izleyin. + signup_link: Kayıt Ol + valid: "Davet geçerlilik tarihi: %{date}" signup: info: Davet edilen bir kullanıcı Greenlight'ı kullanmak için kaydoldu. admins_link: Organizasyon Sayfasını Ziyaret Edin subject: Yeni Greenlight Kullanıcısı Kayıt Ol - username: "Kullanıcı %{name} ismi ve %{email} e-posta adresi ile oturum açtı" - subject: BigBlueButton'a katılma davetiyesi + username: "Kullanıcı %{name}adı ve %{email} e-posta adresi ile oturum açtı" + subject: BigBlueButton'a Katılma Davetiyesi username: "Kullanıcı adınız%{email}" password_reset: title: 'Parola sıfırlama' welcome: " %{email}e-posta adresi için parola sıfırlaması istenildi" - message: 'Bu sıfırlamayı talep ettiyseniz, şifrenizi sıfırlamak için lütfen aşağıdaki bağlantıyı tıklayın:' - reset_link: Şifreyi yenile + message: 'Bu sıfırlamayı talep ettiyseniz, parolayı sıfırlamak için lütfen aşağıdaki bağlantıyı tıklayın:' + reset_link: Parolayı Sıfırla expire: Bu bağlantı iki saat içinde sona erecek. ignore: "Bu isteği yapmadıysanız, bu e-postayı güvenle yok sayabilirsiniz." promoted: @@ -314,12 +383,10 @@ tr_TR: welcome: " %{name}kişisel alanına hoş geldin!" success: " %{bigbluebutton}kullanarak başkanlarıyla görüşmek için kendi odalarınızı oluşturabilir ve birlikte çalışabilirsiniz" username: "Kullanıcı adını% {Email}" - verify: Hesabınızı doğrulamak için aşağıdaki butona tıklamanız yeterli. + verify: Hesabınızı doğrulamak için aşağıdaki düğmeye tıklamanız yeterli. verify_text: 'Hesabınızı doğrulamak için %{url}linkine tıklayınız' verify_link: Hesabı Doğrula thanks: Katıldığınız için teşekkür ederiz ve iyi günler! - maintenance: - window_alert: " %{date} için bakım penceresi takvimlendi" max_concurrent: İzin verilen maksimum eşzamanlı oturum sayısına ulaşıldı! merged: Birleştirildi modal: @@ -330,63 +397,80 @@ tr_TR: not_blank: Rol adı boş bırakılamaz. title: Yeni Rol Oluştur create_room: - access_code: Giriş kodu - access_code_placeholder: İsteğe bağlı oda erişim kodu oluşturun - auto_join: Otomatik olarak odaya katıl - create: Oda yarat - free_delete: Bu odayı istediğiniz zaman silmekte özgür olacaksınız. - name_placeholder: Bir oda adı girin ... + access_code: Giriş Kodu + moderator_access_code: Moderatör Kodu + access_code_placeholder: Giriş kodu üret... + reset_access_code: Giriş kodunu yenile + moderator_access_code_placeholder: Moderatör için isteğe bağlı bir kod oluşturun + reset_moderator_access_code: Moderatör giriş kodunu yenile + auto_join: Odaya otomatik olarak katıl + create: Oda Oluştur + free_delete: Bu odayı istediğiniz zaman silebilirsiniz. + name_placeholder: Bir oda adı giriniz... not_blank: Oda adı boş bırakılamaz. title: Yeni Oda Oluştur delete_account: confirm: "Bu hesabı silmek istediğinize emin misiniz?" - delete: Eminim bu hesabı sil. - keep: Aslında bunu saklayacağım. + delete: Evet + keep: Hayır delete_warning: Bu işlem kullanıcının hesabını etkinsizleştirir. Tüm etkinsizleştirilmiş kullanıcılar silinmiş sekmesi altında bulunabilir. warning: Bu son karardır. İlgili verileri asla geri kurtaramayacaksınız. + delete_rec: + delete: Evet + header: "Bu kaydı silmek istediğinize emin misiniz?" + warning: Silindikten sonra kaydı geri getirmek mümkün değildir! delete_room: confirm: " %{room} odasını silmek istediğinizden emin misiniz?" - delete: "Eminim, bu odayı silin." - keep: "İkinci kez düşününce, tutmaya karar verdim." - warning: Bu odası asla geri alamazsınız - recording_warning: "veya %{recordings_num} kaydı ile ilişkili kayıtların tümü" + delete: Evet + keep: Hayır + warning: "Bu işlemi asla geri alamazsınız," + recording_warning: "ayrıca %{recordings_num} ilgili kayıtları geri getiremezsiniz." invite_user: - email_placeholder: Kullanıcıların e-postalarını girin (virgülle ayrılmış) + email_placeholder: Kullanıcıların e-posta adreslerini girin (virgülle ayrılmış şekilde) footer: Kullanıcı nasıl giriş yapacağına ilişkin bir e-posta alacak send: Davetiye gönder title: Kullanıcıyı davet et login: or: veya - with: " %{provider} ile giriş yap" + with: " %{provider} ile Giriş Yap" forgot_password: "Parolanızı mı unuttunuz?" + preupload: + change: Sunuyu Değiştir + choose: Bir dosya seçin... + current: "Mevcut Sunu:" + footer: "Sununun boyutuna bağlı olarak, kullanılmadan önce yüklenmesi için ek süre gerekebilir." + invalid: Geçersiz boyut/dosya türü. Lütfen aşağıdaki kısıtlamalara bakın. + title: Sunu Ekle + use: Sunu Kullan rename_recording: remove_shared: title: "Bu odayı oda listenizden kaldırmak istediğinize emin misiniz?" - delete: "Eminim, odayı sil." + delete: Evet warning: Bu odaya asla tekrar ulaşamayacaksınız room_settings: - title: Oda ayarları - update: Oda Güncelleme + title: Oda Ayarları + update: Odayı Güncelle client: Kullanıcı türünü seçin - join_moderator: Tüm kullanıcılar moderatör olarak katılır - mute: Katıldıklarında kullanıcıları sustur - require_approval: Katılmadan önce moderatör onayı iste - start: Herhangi bir kullanıcının bu toplantıyı başlatmasına izin ver - footer_text: Odanızın ayarlarını herhangi bir zamanda yapabilrisiniz + join_moderator: Tüm kullanıcıları moderatör olarak ata + mute: Kullanıcıları sustur + require_approval: Moderatör onayı iste + start: Kullanıcının bu toplantıyı başlatmasına izin ver + footer_text: Oda ayarlarını herhangi bir zamanda yapabilirsiniz. + recording: Odanın video kaydına izin ver rename_room: - name_placeholder: Yeni bir oda adı girin ... + name_placeholder: Yeni bir oda adı giriniz... share_access: - footer: "Bir kullanıcı ile odayı paylaşmak, odayı başlatabilmelerine ve odanın kayıtlarını görüntüleyebilmelerine izin verir" - list: ile paylaşılan - title: Odaya ulaşımı paylaş - save: Değişiklikleri kaydet - cancel_changes: Değişikliklerden vazgeç - select: Kullanıcıyı seç + footer: "Oda paylaşımı, kullanıcının oturum başlatmasına ve kayıtları görüntüleyebilmesine izin verir." + list: "Paylaşılan:" + title: Odayı Paylaş + save: Kaydet + cancel_changes: Vazgeç + select: Kullanıcıyı Seç merge_user: cancel: Vazgeç - from: Birleştirilecek hesap - title: Kullanıcı hesaplarını birleştir - to: birincil hesap + from: Birleştirilecek Hesap + title: Kullanıcı Hesaplarını Birleştir + to: Birincil Hesap save: Birleştir footer: Odada birleştirilecek olan hesaplar Birincil Hesabın oda listesi üzerinden transfer edilecek ve daha sonra hesap silinecektir. name_update_success: Oda adı başarıyla değiştirildi! @@ -398,37 +482,41 @@ tr_TR: prev: "‹ Önceki" next: "Sonraki ›" gap: "…" - password: Kelime - password_empty_notice: Şifre boş olamaz. - password_reset_success: Şifre sıfırlandı. + password: Parola + password_empty_notice: Parola boş olamaz. + password_reset_success: Parola sıfırlandı. password_different_notice: Parola Onayı eşleşmiyor. provider: google: Google office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID ile Bağlan recaptcha: errors: recaptcha_unreachable: "Üzgünüz, reCAPTCHA cevabınızı doğrulayamadık. Lütfen yeniden deneyiniz." - verification_failed: "reCAPTCHA vdoğrulaması yapılamadı, lütfen yeniden deneyiniz." + verification_failed: "reCAPTCHA doğrulaması yapılamadı, lütfen yeniden deneyiniz." recording: - all_recordings: Tüm Kayıtlar - email: E-posta Kaydı - error: " %{count} kayıt(lar)ı okunurken bir hata oluştu" - no_recordings: "Bu odada %{inject}kaydı bulunmamaktadır." + all_recordings: Kayıtlar + email: E-posta ile Gönder + error: " %{count}kayıtları okunurken bir hata oluştu" + no_public_recordings: Bu odada kayıt bulunmamaktadır. + no_recordings: Bu odaya ait kayıt bulunmamaktadır. no_user_recordings: Şu anda hiç kaydınız yok. - no_matched_recordings: "Aramanızla eşleşen %{inject} kaydı bulunamadı" - recorded_on: " %{date}üzerine kaydedildi" + no_matched_pub_recordings: Aramanızla eşleşen herkese açık kayıt bulunamadı. + no_matched_recordings: Aramanızla eşleşen kayıt bulunamadı. + recorded_on: " %{date}" table: - name: İsim - thumbnails: Küçük resimler + name: Kayıt Adı + thumbnails: Küçük Resimler length: Uzunluk users: Kullanıcılar visibility: Görünürlük - formats: Biçimleri + formats: Biçimler visibility: - public: açık - unlisted: Liste dışı + inaccessible: Erişilemez + public: Açık + unlisted: Liste Dışı format: notes: Notlar podcast: Podcast @@ -440,7 +528,7 @@ tr_TR: fail: Kullanıcı hesabını henüz onaylanmadı. Kayıt olduktan sonra bir kaç gün geçmiş ise lütfen sistem yöneticiniz ile iletişime geçiniz. signup: Hesabınız başarıyla oluşturuldu. Sistem yöneticisi onayı bekleniyor. banned: - fail: "Bu uygulamaya giriş izniniz bulunmamaktadır. Bunun bir hata olduğunu düşünüyorsanız, lütfen sistem yöneticinize başvurun." + fail: "Bu uygulamaya giriş izniniz bulunmamaktadır. Bunun bir hata olduğunu düşünüyorsanız, lütfen sistem yöneticinize başvurun." deprecated: new_signin: "Hesabınıza giriş için yeni bir yöntem seçin. Eski hesabınıza ait tüm odalar yeni hesabınıza aktarılacaktır. " twitter_signin: "Twitter aracılığıyla girişler yeni sürümde kaldırılacaktır. Yeni hesap doğrulama yöntemi için buraya tıklayınız." @@ -450,53 +538,67 @@ tr_TR: fail: "Token geçersiz veya tarihi geçmiş. Bunun bir hata olduğunu düşünüyorsanız, lütfen sistem yöneticinize başvurun." no_invite: "Katılmak için davetiyeniz bulunmamaktadır. Bunun bir hata olduğunu düşünüyorsanız, lütfen sistem yöneticinize başvurun." remove: Kaldır - rename: İsmi değiştir + rename: İsmi Değiştir reset_password: - subtitle: Şifreyi yenile - password: Yeni Şifre - confirm: Yeni parola onayı - update: Şifre güncelle + captcha: "reCAPTCHA doğrulaması yapılamadı, lütfen yeniden deneyiniz." + invalid_token: Parola değiştirme işleminiz geçersiz görülmüştür. Lütfen tekrar deneyiniz. + subtitle: Parolayı Sıfırla + password: Yeni Parola + confirm: Yeni Parola Onayı + update: Parolayı Güncelle auth_change: Doğrulama yöntemi değişti. Parolanızı oluşturmak için e-postanızı kontrol edin. roles: active: Aktif admin: Yönetici - banned: Yasaklı - deleted: Silindi - pending: Beklemede - user: Kullanıcı + banned: Engellenen + deleted: Silinen + pending: Bekleyen + invited: Davet Edilmiş + user: Genel room: access_code_required: Lütfen odaya katılmak için geçerli bir erişim kodu girin + add_presentation: Sunu Ekle + copy_access: Giriş Kodunu Kopyala + copy_moderator_access: Moderatör Kodunu Kopyala create_room: Oda Oluştur create_room_error: Oda oluşturulurken bir hata oluştu - create_room_success: Oda başarıyla oluşturuldu + create_room_success: Oda başarıyla oluşturuldu. delete: home_room: Kullanıcının ana odası silinemiyor success: Oda başarıyla silindi fail: "(%{error}) odası silinemedi" - enter_the_access_code: Odanın erişim kodunu girin + enter_the_access_code: Oda erişim kodu giriniz... + enter_the_moderator_access_code: Odanın moderatör kodunu giriniz! + optional_moderator_access_code: "İsteğe Bağlı Moderatör Kodu" invalid_provider: Geçersiz bir URL girdiniz. Lütfen URL’yi kontrol edip tekrar deneyin. - invited: Katılmaya davet edildiniz + invitation_description: "%{name} konferansına katılmak için davet edildiniz. Katılmak için yukarıdaki bağlantıya tıklayın ve isminizi girin." + invited: Katılım için davet edildiniz! + recording_present: Bu oturumun kaydedileceğini kabul ediyorum. Aktif edilirse sesimi ve görüntümü içerebilir. invite_participants: Katılımcıları Davet Et join: Katıl - last_session: "%{session} da son oturum" - login: Gir - owner: Toplantı sahibi - owner_banned: bu oda şu anda uygun değil + last_session: "%{session}- son oturum" + login: Giriş + owner: Sahip + owner_banned: Bu oda şu anda uygun değil no_room: description: Katılmak istediğiniz oda adını veya URL sini giriniz edit_profile: Kullanıcı Profilini Düzenle - go_to: Odaya git + go_to: Odaya Git invalid_room_uid: Girdiğiniz oda url'si / kullanıcı kimliği geçersizdi. - placeholder: Oda URL'si / kullanıcı kimliği + placeholder: Oda URL/ID no_recent_rooms: Yakın zamanda katıldığınız odanız yok recent_rooms: Yeni Katılan Bir Odaya Git title: Bir Odaya Katılın no_sessions: Bu odada henüz bir oturum yok! - recordings: Oda kayıtları + preupload_success: Sunu başarıyla eklendi + preupload_error: Oda sunusu değiştirilirken bir hata oluştu + preupload_remove_success: Sunu başarıyla kaldırıldı + preupload_remove_error: Oda sunusu kaldırılırken bir hata oluştu + recordings: Oda Kaydı room_limit: İzin verilen maksimum oda sayısına ulaştınız room_limit_exceeded: "İzin verilen maksimum oda sayısını aştınız. Bu odaya(lara) girebilmek için %{difference} lütfen siliniz" - sessions: Oturumlar - settings: Oda ayarları + sessions: Oturum + settings: Oda Ayarları share: Girişi Yönet shared_by: "%{email} tarafından paylaşıldı" remove_shared_access_success: Paylaşılan oda listenizden başarıyla silindi @@ -504,6 +606,7 @@ tr_TR: shared_access_success: Oda başarıyla paylaşıldı shared_access_error: Oda paylaşılırken bir hata oluştu start: Başla + search: Oda ara... unavailable: Oda sahibinin e-postası doğrulanamadığından bu oda şimdilik kapalıdır update_settings_error: Oda ayarları güncellenirken bir hata oluştu update_settings_success: Oda ayarları başarıyla güncellendi @@ -512,41 +615,45 @@ tr_TR: auto: Toplantı başladığında otomatik olarak katılacaksınız. settings: account: - fullname: Reklam alanı + fullname: Ad Soyad language: Dil provider: Sağlayıcı - image: Görüntü + image: Resim image_url: Profil Resmi URL'si - roles: Kullanıcı rolleri + roles: Kullanıcı Rolü subtitle: Hesap Bilgilerinizi Güncelleyin - title: Hesap bilgisi + title: Hesap Bilgisi + reset_password: Kullanıcı parolasını sıfırla delete: button: "Evet, hesabımı silmek istiyorum." disclaimer: "Hesabınızı silerseniz asla geri alamazsınız. Hesabınıza ilişkin tüm bilgiler, ayarlar, odalar ve kayıtlar silinecektir." subtitle: Hesabı Kalıcı Olarak Sil - title: Hesabı sil + title: Hesabı Sil password: - confirmation: Yeni parola onayı - new: Yeni Şifre - old: Eski Şifre - subtitle: Şifreni değiştir - title: Kelime - title: profil + confirmation: Yeni Parola Onayı + new: Yeni Parola + old: Eski Parola + subtitle: Parolanızı Değiştirin + title: Parola + title: Profil search: Ara signup: - password_confirm: Şifre onayı - subtitle: Hesap oluştur - title: Hesap oluştur + password_confirm: Parola Onayı + subtitle: Hesabını Oluştur + title: Kayıt Ol with: " %{provider} ile giriş yap" terms: accept: "%{href} i kabul ediyorum" accept_existing: Şartları ve Koşulları Kabul Ediyorum - title: Şartlar ve koşullar + title: Şartlar ve Koşullar test_install: > Bu dağıtım önceden konfigüre edilmiş bir test sunucusu kullanmaktadır, bunu kendi sunucunuzla değiştirmelisiniz. Detaylar için , bakınız %{href}. - update: Güncelleştirme + time: + formats: + default: "%b %d, %Y %-I:%M%P" + update: Güncelle verify: - accept: Doğrulayın + accept: Doğrula activated: Hesap doğrulandı! already_verified: Hesap zaten doğrulandı invalid: Geçersiz doğrulama bağlantısı diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml index 0d281275..028a8e77 100644 --- a/config/locales/zh_TW.yml +++ b/config/locales/zh_TW.yml @@ -43,6 +43,18 @@ zh_TW: placeholder: 品牌形象URL地址 title: 網站標誌 invalid: 無效的網址 + legal: + change: 修改網址 + info: 變更頁面底部顯示的條款連結 + placeholder: 條款 URL... + title: 條款 + invalid: 無效的網址 + privpolicy: + change: 修改網址 + info: 變更頁面底部顯示的隱私政策連結 + placeholder: 隱私政策 URL... + title: 隱私政策 + invalid: 無效的網址 cache: info: 清除快取,用以強制更新資訊 title: 清除網站快取 @@ -57,6 +69,10 @@ zh_TW: regular: 常規 lighten: 亮色 darken: 暗色 + email_mapping: + info: "使用電子郵件將使用者映射到角色。必須採用格式 email1=role1,email2=role2" + title: 透過電子郵件進行角色映射 + update: log_level: title: 日誌級別 information: 更改整個部署的日誌級別 @@ -67,9 +83,21 @@ zh_TW: fatal: 致命 unknown: 未知 recording_visibility: - info: 設定新錄製錄影的可見性(預設) + info: 設定新錄製錄影的預設可見性 title: 錄影預設可見性 warning: 此設定將僅應用於未執行的會議。 + require_consent: + info: 此設定允許會議室設置,允許會議室擁有者指定哪些會議室可以錄製。加入錄製會議室的使用者在加入前必須徵得同意。 + title: 要求會議室擁有者與加入者同意錄製 + maintenance_banner: + info: 顯示橫幅,通知使用者維護計畫 + title: 維護橫幅 + display: 設定 + clear: 清除 + time: "範例:系統更新定於 12 月 13 日 23:00。使用者登入時可能會遇到問題!" + preupload: + info: 使用者可以預先上傳簡報文件,用作該特定會議室的預設簡報文件 + title: 允許使用者預先上傳簡報文件 registration: info: 更改使用者在網站註冊的方式 title: 註冊方式 @@ -84,6 +112,11 @@ zh_TW: info: 設定為“禁用”將從“會議室選項”下拉清單中刪除按鈕,以防止使用者共用會議室 title: 允許使用者共用會議室 subtitle: 自訂Greenlight + tabs: + appearance: 外觀 + administration: 管理 + registration: 註冊 + settings: 設定 title: 網站設定 flash: approved: 已成功批准使用者 @@ -94,21 +127,25 @@ zh_TW: demoted: 使用者已成功降級 invite: "邀請已成功寄送到 %{email}" invite_email_verification: 必須啟用電子郵件才能使用此方法,請與系統管理員聯繫。 - merge_fail: 合併使用者帳戶時出現問題,請檢查選定的使用者並重試。 + merge_fail: 合併使用者帳戶時出現問題,請檢查選定的使用者並重試。 merge_success: 使用者帳戶成功合併 perm_deleted: 使用者已被永久刪除 promoted: 使用者已成功升級 registration_method_updated: 註冊方法已成功更新 reset_password: 已向使用者發送電子郵件以重置其密碼。(如果他們還沒有收到郵件,請讓他們檢查他們的垃圾郵件資料夾) restored: 使用者已成功還原 + room_configuration: 會議室組態修改成功 settings: 已成功更改網站設定 unauthorized: 您無權對此使用者執行操作 recordings: + latest: 最新錄影 title: 伺服器錄影 no_recordings: 此伺服器沒有錄影。 + search_info: 輸入使用者的完整電子郵件或會議室的 uid roles: appear_in_share_list: 在共享會議室的下拉列表中,包含具有此角色的使用者 can_create_rooms: 可以創建會議室 + can_launch_recording: 允許具有此角色的使用者錄影其會議 delete: 刪除角色 invalid_create: 創建新角色時出現問題。請檢查角色賦值並重試。 invalid_order: 更新角色的優先順序時出現問題。請檢查賦值並重試。 @@ -123,16 +160,39 @@ zh_TW: edit_site_settings: 允許具有此角色的使用者編輯網站設定 edit_roles: 允許具有此角色的使用者編輯其他角色 manage_users: 允許具有此角色的使用者管理使用者 - invalid_assignment: 將角色分配給使用者時出現問題,請檢查賦值並重試。 + invalid_assignment: 將角色分配給使用者時出現問題,請檢查賦值並重試。 colour: title: 角色代表顏色 info: 設定將與角色關聯的顏色 + room_configuration: + title: 會議室組態 + mute: + info: 使用者加入BigBlueButton會議時自動使其靜音 + require_moderator: + info: 當使用者嘗試提出以主持人身份加入會議時。如果使用者獲得批准,他們將能夠加入會議。 + allow_any: + info: 允許任何使用者隨時開始會議。預設情況下,只有會議室擁有者才能開始會議。 + all_moderator: + info: 當所有使用者加入會議時,一律給予其主持人身份。 + recordings: + info: 允許會議室擁有者調整是否啟用錄影功能。如果啟用,會議開始後主持人仍必須按下「錄影」按鈕才會錄製。 + moderator_codes: + info: 允許會議室擁有者可選擇地產生主持人代碼,允許其他使用者直接加入作為主持人。 + title: 主持人存取代碼 + options: + disabled: 停用 + enabled: 總是啟用 + optional: 選擇性的 rooms: + timeout: "由於 %{server} 伺服器請求逾時, 與會者的狀態及資訊可能不準確" title: 伺服器所有會議室 table: + ended: "已結束: %{session}" id: ID not_running: 沒有運行 + participants: 與會者 running: 運行中 + started: "已開始: %{session}" status: 狀態 view: 查看 title: 網站管理 @@ -147,18 +207,21 @@ zh_TW: delete: 刪除 edit: 編輯 edit_roles: 編輯使用者角色 + merge: 合併 perm_delete: 永久刪除 unban: 取消禁止使用者 undelete: 撤銷刪除 table: authenticator: 認證方式 created: 創建於 + time: 傳送時間 name: 名字 not_found: 沒有與您的搜尋相符的使用者 no_users: 沒有找到使用者 role: 角色 uid: 使用者ID username: 使用者帳號 + valid: 有效 title: 管理使用者 add_to_google_calendar: "添加到Google日曆" bigbluebutton: BigBlueButton @@ -167,6 +230,7 @@ zh_TW: cookies: cookie_info: Cookies可讓我們提供您服務,因此您同意我們使用cookies,才能使用這些服務! cookie_button: 我同意 + policy: "欲瞭解更多資訊,請參閱我們的隱私政策." copied: Copied copy: 複製 date: @@ -177,7 +241,7 @@ zh_TW: docs: 文檔 email: Email email_sent: "您的 %{email_type} 郵件已經發送!(如果您沒有收到郵件,請檢查您的垃圾郵件資料夾)" - enter_your_name: 輸入您的名字! + enter_your_name: 請在此輸入您的名稱 errors: bigbluebutton: help: "請確保採取了正確的步驟. 瞭解更多資訊" @@ -205,6 +269,7 @@ zh_TW: accepted: 必須同意 confirmation: "不相符%{attribute}" inclusion: 列表中不存在 + domain: "必須以 \"%{email_domain}\" 結尾" no_provider: message: 您嘗試訪問的網站未啟用 help: 請與系統管理員聯繫以設定Greenlight @@ -229,6 +294,8 @@ zh_TW: designs: 定制設計 authentication: 使用者認證 footer: + legal: 條款 + privpolicy: 隱私政策 powered_by: "Powered by%{href}" forgot_password: subtitle: 忘記密碼 @@ -247,6 +314,7 @@ zh_TW: home_room: 主會議室 info_update_success: 資訊更新成功。 invalid_credentials: 您輸入的電子郵件和密碼與我們的記錄不相符,請重試或按下「忘記密碼」重置密碼。 + invalid_credentials_external: 您輸入的電子郵件和密碼與我們的記錄不符。請重試。 invalid_login_method: 由於帳戶不相符,登錄失敗。您需要使用Omniauth登錄。 invite_message: "邀請他人參加會議,請發送以下連結:" javascript: @@ -291,6 +359,7 @@ zh_TW: info: "您被%{name}邀請到您自己的私人空間 " signup_info: 若要使用電子郵件註冊,請按一下下面的按鈕並按照步驟操作。 signup_link: 註冊 + valid: "邀請有效至: %{date}" signup: info: 被邀請的使用者已註冊使用greenlight。 admins_link: 訪問網站管理頁面 @@ -318,8 +387,6 @@ zh_TW: verify_text: '要驗證您的帳戶,只需點擊以下連結:%{url}' verify_link: 驗證帳戶 thanks: 感謝您的加入,祝您擁有美好的一天! - maintenance: - window_alert: "計畫的維護時段 %{date}" max_concurrent: 已達到允許的最大併發會話數! merged: 已合併 modal: @@ -331,7 +398,9 @@ zh_TW: title: 創建新角色 create_room: access_code: 會議密碼 - access_code_placeholder: 產生會議密碼(可選用) + moderator_access_code: 主持人密碼 + access_code_placeholder: 選擇性的產生會議密碼 + moderator_access_code_placeholder: 選擇性的產生主持人密碼 auto_join: 自動進入會議室 create: 創建會議室 free_delete: 任何時候都可以刪除這個會議室 @@ -344,6 +413,10 @@ zh_TW: keep: 我還是留著吧。 delete_warning: 這將停用使用者的帳戶。在“已刪除”選項卡下可以找到所有未啟動的使用者。 warning: 這是最終決定,您將無法恢復相關資料。 + delete_rec: + delete: 我確定要刪除此錄影。 + header: 您確定要刪除此錄影嗎? + warning: 您將無法 恢復這個錄影 delete_room: confirm: "確定要刪除%{room}嗎?" delete: 我確定刪除這個會議室 @@ -359,6 +432,14 @@ zh_TW: or: 或 with: "通過 %{provider}登錄" forgot_password: 忘記密碼? + preupload: + change: 取代簡報 + choose: 選擇檔案... + current: "目前簡報:" + footer: 根據簡報的大小,可能需要更多的時間來上傳才能使用。 + invalid: 大小/檔案類型無效。請參閱以下限制。 + title: 新增簡報 + use: 使用簡報 rename_recording: remove_shared: title: 確實要從您的會議室列表中刪除此會議室嗎? @@ -373,6 +454,7 @@ zh_TW: require_approval: 加入前需要主持人批准 start: 允許任何使用者啟動此會議 footer_text: 您可以隨時調整會議室設定 + recording: 允許會議室進行錄影 rename_room: name_placeholder: 請輸入新會議室名稱 share_access: @@ -407,6 +489,7 @@ zh_TW: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: 哎呀,我們未能驗證您的reCAPTCHA回應,請再試一次。 @@ -415,9 +498,11 @@ zh_TW: all_recordings: 所有錄影 email: 通過Email發送錄影 error: "檢索 %{count} 錄影(s)時出錯。" - no_recordings: "這個會議室沒有%{inject}錄影" + no_public_recordings: 此會議室沒有公開錄影。 + no_recordings: 此會議室沒有錄影。 no_user_recordings: 您當前沒有錄影。 - no_matched_recordings: "沒有搜尋到 %{inject} 錄影" + no_matched_pub_recordings: 沒有公開錄影與您的搜尋相匹配。 + no_matched_recordings: 沒有錄影與您的搜尋相匹配。 recorded_on: "錄製於%{date}" table: name: 名字 @@ -427,7 +512,8 @@ zh_TW: visibility: 可見性 formats: 格式 visibility: - public: 公開的 + inaccessible: 無法存取 + public: 公開 unlisted: 隱藏 format: notes: 筆記 @@ -440,7 +526,7 @@ zh_TW: fail: 您的帳戶尚未批准,如果您註冊後已過多天,請與管理員聯繫。 signup: 您的帳戶創建完成,稍後管理員會審批。 banned: - fail: 您沒有訪問此應用程式的許可權。如果您認為這是一個錯誤,請聯繫您的管理員。 + fail: 您沒有訪問此應用程式的許可權。如果您認為這是一個錯誤,請聯繫您的管理員。 deprecated: new_signin: 為您的帳戶選擇新的登錄方法。舊帳戶中的所有會議室都將遷移到新帳戶。 twitter_signin: "通過Twitter登錄已被棄用並將在下一版本中刪除。 點擊 這裡 將您的帳戶移動到新的身份驗證方法。" @@ -452,6 +538,8 @@ zh_TW: remove: 刪除 rename: 重命名 reset_password: + captcha: reCAPTCHA 驗證失敗,請再試一次。 + invalid_token: 密碼重置 token 無效。請嘗試再次重置密碼。 subtitle: 重置密碼 password: 新密碼 confirm: 確認新密碼 @@ -463,9 +551,13 @@ zh_TW: banned: 已禁用 deleted: 已刪除 pending: 待定 + invited: 已邀請 user: 使用者 room: access_code_required: 請輸入有效的會議密碼以加入會議 + add_presentation: 新增投影片 + copy_access: 複製存取密碼 + copy_moderator_access: 複製主持人密碼 create_room: 創建會議室 create_room_error: 創建會議室出錯 create_room_success: 會議室創建成功 @@ -473,10 +565,14 @@ zh_TW: home_room: 不能刪除使用者的主會議室 success: 會議室刪除成功 fail: "會議室(%{error})刪除失敗" - enter_the_access_code: 輸入會議室的會議密碼 + enter_the_access_code: 請輸入會議密碼 + enter_the_moderator_access_code: 輸入會議室的主持人密碼! + optional_moderator_access_code: "選擇主持人密碼:" invalid_provider: 您輸入的URL無效。請檢查URL並重試。 + invitation_description: "您已被邀請加入 %{name} 會議。要加入,請按下上面的連結並輸入您的姓名。" invited: 您已被邀請加入 - invite_participants: 邀請參與者的連結 + recording_present: 我已知悉這次會議將被錄影下來。啟用錄影後將包括我的聲音和影像。 + invite_participants: 邀請與會者的連結 join: 加入 last_session: "上一次會議%{session}" login: 加入 @@ -492,6 +588,10 @@ zh_TW: recent_rooms: 進入最近加入過的會議室 title: 加入一個會議室 no_sessions: 會議室從未使用! + preupload_success: 新增投影片成功 + preupload_error: 更新投影片時發生錯誤 + preupload_remove_success: 刪除投影片成功 + preupload_remove_error: 刪除投影片時發生錯誤 recordings: 會議錄影 room_limit: 您已達到允許的最大會議室數量 room_limit_exceeded: "您已擁有超過允許的會議室數量。 請刪除%{difference} 會議室(s)以訪問這個會議室。" @@ -504,6 +604,7 @@ zh_TW: shared_access_success: 會議室共用成功 shared_access_error: 共用會議室出錯 start: 開始 + search: 搜尋會議室… unavailable: 由於未驗證所有者的電子郵件,此會議室當前不可用。 update_settings_error: 修改會議室設定出錯 update_settings_success: 會議室設定修改成功 @@ -520,6 +621,7 @@ zh_TW: roles: 使用者角色 subtitle: 更新帳號資訊 title: 帳號資訊 + reset_password: 重置使用者密碼 delete: button: 我確定要刪除我的帳戶 disclaimer: 刪除帳戶後無法恢復。帳戶所有相關資訊都會被移除,包括設定、會議室和錄影。 @@ -544,6 +646,9 @@ zh_TW: title: 協議和條款 test_install: > 此部署使用的是預先配置的測試伺服器,您應該將其替換為自己的,詳細資訊請看 %{href}。 + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: 更新 verify: accept: 驗證 diff --git a/config/puma.rb b/config/puma.rb index 44bed0b5..8c27eac3 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -6,16 +6,16 @@ # the maximum value specified for Puma. Default is set to 5 threads for minimum # and maximum; this matches the default thread size of Active Record. # -threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads_count = ENV.fetch("RAILS_MAX_THREADS", 5) threads threads_count, threads_count # Specifies the `port` that Puma will listen on to receive requests; default is 3000. # -port ENV.fetch("PORT") { 80 } +port ENV.fetch("PORT", 80) # Specifies the `environment` that Puma will run in. # -environment ENV.fetch("RAILS_ENV") { "development" } +environment ENV.fetch("RAILS_ENV", "development") # Specifies the number of `workers` to boot in clustered mode. # Workers are forked webserver processes. If using threads and workers together @@ -23,7 +23,7 @@ environment ENV.fetch("RAILS_ENV") { "development" } # Workers do not work on JRuby or Windows (both of which do not support # processes). # -workers ENV.fetch("WEB_CONCURRENCY") { 1 } +workers ENV.fetch("WEB_CONCURRENCY", 1) # Use the `preload_app!` method when specifying a `workers` number. # This directive tells Puma to first boot the application and load code diff --git a/config/routes.rb b/config/routes.rb index 15ce2e7a..dba1a55a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -123,7 +123,6 @@ Rails.application.routes.draw do # Extended room routes. scope '/:room_uid' do post '/', to: 'rooms#join' - patch '/', to: 'rooms#update', as: :update_room get '/room_settings', to: 'rooms#room_settings' post '/update_settings', to: 'rooms#update_settings' get '/current_presentation', to: 'rooms#current_presentation' diff --git a/config/storage.yml b/config/storage.yml index 1c872b81..520c99e0 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -13,6 +13,13 @@ amazon: secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %> region: <%= ENV['AWS_REGION'] %> bucket: <%= ENV['AWS_BUCKET'] %> +s3: + service: S3 + endpoint: <%= ENV['S3_ENDPOINT'] %> + access_key_id: <%= ENV['S3_ACCESS_KEY_ID'] %> + secret_access_key: <%= ENV['S3_SECRET_ACCESS_KEY'] %> + region: <%= ENV['S3_REGION'] %> + bucket: <%= ENV['S3_BUCKET'] %> # Remember not to checkin your GCS keyfile to a repository google: diff --git a/db/migrate/20190726153012_add_custom_roles.rb b/db/migrate/20190726153012_add_custom_roles.rb index 1c0b1fd6..2d82e3e5 100644 --- a/db/migrate/20190726153012_add_custom_roles.rb +++ b/db/migrate/20190726153012_add_custom_roles.rb @@ -12,15 +12,16 @@ class AddCustomRoles < ActiveRecord::Migration[5.2] # Determine what ids corresponded to what roles in the old table old_roles.each do |role| - if role["name"] == "super_admin" + case role["name"] + when "super_admin" super_admin_id = role["id"] - elsif role["name"] == "user" + when "user" user_id = role["id"] - elsif role["name"] == "admin" + when "admin" admin_id = role["id"] - elsif role["name"] == "denied" + when "denied" denied_id = role["id"] - elsif role["name"] == "pending" + when "pending" pending_id = role["id"] end end diff --git a/db/migrate/20210108032132_add_moderator_access_code_to_rooms.rb b/db/migrate/20210108032132_add_moderator_access_code_to_rooms.rb new file mode 100644 index 00000000..8da6eb14 --- /dev/null +++ b/db/migrate/20210108032132_add_moderator_access_code_to_rooms.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddModeratorAccessCodeToRooms < ActiveRecord::Migration[5.2] + def change + add_column :rooms, :moderator_access_code, :string, null: true, default: nil + end +end diff --git a/db/migrate/20210319160827_add_can_launch_recording_to_permissions.rb b/db/migrate/20210319160827_add_can_launch_recording_to_permissions.rb new file mode 100644 index 00000000..e4e2e31c --- /dev/null +++ b/db/migrate/20210319160827_add_can_launch_recording_to_permissions.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class MigrationProduct < ActiveRecord::Base + self.table_name = :roles +end + +class SubMigrationProduct < ActiveRecord::Base + self.table_name = :role_permissions +end + +class AddCanLaunchRecordingToPermissions < ActiveRecord::Migration[5.2] + def change + reversible do |dir| + dir.up do + MigrationProduct.all.each do |role| + SubMigrationProduct.create(role_id: role.id, name: "can_launch_recording", value: 'true', enabled: true) + end + end + end + end +end diff --git a/db/schema.rb b/db/schema.rb index dbc2924a..bfd4abc3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_12_14_232153) do +ActiveRecord::Schema.define(version: 2021_03_19_160827) do create_table "active_storage_attachments", force: :cascade do |t| t.string "name", null: false @@ -96,6 +96,7 @@ ActiveRecord::Schema.define(version: 2020_12_14_232153) do t.string "attendee_pw" t.string "access_code" t.boolean "deleted", default: false, null: false + t.string "moderator_access_code" t.index ["bbb_id"], name: "index_rooms_on_bbb_id" t.index ["deleted"], name: "index_rooms_on_deleted" t.index ["last_session"], name: "index_rooms_on_last_session" diff --git a/docker-compose.yml b/docker-compose.yml index d334c9ee..e6a4b4bf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,7 +24,7 @@ services: links: - db db: - image: postgres:9.5 + image: postgres:13.2-alpine restart: unless-stopped ports: - 127.0.0.1:5432:5432 diff --git a/dockerfiles/v2/alpine b/dockerfiles/v2/alpine new file mode 100644 index 00000000..1fd766f4 --- /dev/null +++ b/dockerfiles/v2/alpine @@ -0,0 +1,55 @@ +FROM alpine:3.13 AS alpine + +ARG RAILS_ROOT=/usr/src/app +ENV RAILS_ROOT=${RAILS_ROOT} + +FROM alpine AS base +WORKDIR $RAILS_ROOT +RUN apk add --no-cache \ + libpq \ + libxml2 \ + libxslt \ + ruby \ + ruby-irb \ + ruby-bigdecimal \ + ruby-bundler \ + ruby-json \ + tzdata \ + shared-mime-info + +FROM base as builder +RUN apk add --no-cache \ + build-base \ + curl-dev \ + git \ + libxml2-dev \ + libxslt-dev \ + pkgconf \ + postgresql-dev \ + sqlite-libs \ + sqlite-dev \ + ruby-dev \ + yaml-dev \ + zlib-dev \ + nodejs \ + yarn \ + && ( echo 'install: --no-document' ; echo 'update: --no-document' ) >>/etc/gemrc +COPY Gemfile* ./ +RUN bundle config build.nokogiri --use-system-libraries \ + && bundle config set --local deployment 'true' without 'development:test' \ + && bundle install -j4 \ + && rm -rf vendor/bundle/ruby/*/cache \ + && find vendor/bundle/ruby/*/gems/ \( -name '*.c' -o -name '*.o' \) -delete +COPY . ./ + +FROM base +ENV RAILS_ENV=production RAILS_LOG_TO_STDOUT=true + +ARG VERSION_CODE +ENV VERSION_CODE=${VERSION_CODE} + +COPY --from=builder $RAILS_ROOT $RAILS_ROOT + +EXPOSE 80 +RUN chmod +x bin/start +CMD [ "bin/start" ] diff --git a/dockerfiles/v2/amazonlinux b/dockerfiles/v2/amazonlinux new file mode 100644 index 00000000..e618aaa8 --- /dev/null +++ b/dockerfiles/v2/amazonlinux @@ -0,0 +1,46 @@ +FROM amazonlinux:2.0.20210813.1 AS amazonlinux + +ARG RAILS_ROOT=/usr/src/app +ENV RAILS_ROOT=${RAILS_ROOT} + +FROM amazonlinux AS amazonlinux-base +ENV TINI_VERSION v0.19.0 +ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /sbin/tini +ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini.asc /tini.asc +RUN gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 +RUN gpg --batch --verify /tini.asc /sbin/tini +RUN chmod +x /sbin/tini +RUN yum -y install redhat-rpm-config + +FROM amazonlinux-base AS base +WORKDIR $RAILS_ROOT +# Install Node.js (needed for yarn) +RUN yum -y install gcc-c++ make +RUN curl -sL https://rpm.nodesource.com/setup_16.x | bash - +RUN yum -y install nodejs +# Install Ruby & Rails +RUN curl -sL -o /etc/yum.repos.d/yarn.repo https://dl.yarnpkg.com/rpm/yarn.repo +RUN amazon-linux-extras enable ruby2.6 \ + && yum -y install git tar gzip yarn shared-mime-info libxslt zlib-devel sqlite-devel mariadb-devel postgresql-devel ruby-devel rubygems-devel rubygem-bundler rubygem-io-console rubygem-irb rubygem-json rubygem-minitest rubygem-net-http-persistent rubygem-net-telnet rubygem-power_assert rubygem-rake rubygem-test-unit rubygem-thor rubygem-xmlrpc rubygem-bigdecimal \ + && gem install rails +RUN yum -y install python3 python3-pip shadow-utils + +FROM base as builder +COPY Gemfile* ./ +RUN bundle config build.nokogiri --use-system-libraries \ + && bundle install --deployment --without development:test -j4 \ + && rm -rf vendor/bundle/ruby/*/cache \ + && find vendor/bundle/ruby/*/gems/ \( -name '*.c' -o -name '*.o' \) -delete +COPY . ./ + +FROM base +ENV RAILS_ENV=production RAILS_LOG_TO_STDOUT=true + +ARG VERSION_CODE +ENV VERSION_CODE=${VERSION_CODE} + +COPY --from=builder $RAILS_ROOT $RAILS_ROOT + +EXPOSE 80 +RUN chmod +x bin/start +CMD [ "bin/start" ] diff --git a/lib/bbb_api.rb b/lib/bbb_api.rb index dedfdd88..29938c5b 100644 --- a/lib/bbb_api.rb +++ b/lib/bbb_api.rb @@ -33,7 +33,7 @@ module BbbApi # Build the URI. uri = encode_bbb_url( - Rails.configuration.loadbalancer_endpoint + api + '/', + "#{Rails.configuration.loadbalancer_endpoint}#{api}/", Rails.configuration.loadbalancer_secret, { name: provider }, route diff --git a/lib/omniauth_options.rb b/lib/omniauth_options.rb index 43b80aa1..61996ecd 100644 --- a/lib/omniauth_options.rb +++ b/lib/omniauth_options.rb @@ -20,11 +20,11 @@ module OmniauthOptions module_function def omniauth_options(env) - if env['omniauth.strategy'].options[:name] == "bn_launcher" + case env['omniauth.strategy'].options[:name] + when "bn_launcher" protocol = Rails.env.production? ? "https" : env["rack.url_scheme"] - customer_redirect_url = protocol + "://" + env["SERVER_NAME"] + ":" + - env["SERVER_PORT"] + customer_redirect_url = "#{protocol}://#{env['SERVER_NAME']}:#{env['SERVER_PORT']}" user_domain = parse_user_domain(env["SERVER_NAME"]) env['omniauth.strategy'].options[:customer] = user_domain env['omniauth.strategy'].options[:customer_redirect_url] = customer_redirect_url @@ -33,11 +33,11 @@ module OmniauthOptions # This is only used in the old launcher and should eventually be removed env['omniauth.strategy'].options[:checksum] = generate_checksum(user_domain, customer_redirect_url, Rails.configuration.launcher_secret) - elsif env['omniauth.strategy'].options[:name] == "google" + when "google" set_hd(env, ENV['GOOGLE_OAUTH2_HD']) - elsif env['omniauth.strategy'].options[:name] == "office365" + when "office365" set_hd(env, ENV['OFFICE365_HD']) - elsif env['omniauth.strategy'].options[:name] == "openid_connect" + when "openid_connect" set_hd(env, ENV['OPENID_CONNECT_HD']) end end diff --git a/lib/tasks/liveness.rake b/lib/tasks/liveness.rake new file mode 100644 index 00000000..dd1a7b31 --- /dev/null +++ b/lib/tasks/liveness.rake @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +desc('livenessProbe') +task liveness: :environment do + puts "success" +end diff --git a/lib/tasks/migrate_old_office365_users.rake b/lib/tasks/migrate_old_office365_users.rake index aaf3cdbc..a0a6d60b 100644 --- a/lib/tasks/migrate_old_office365_users.rake +++ b/lib/tasks/migrate_old_office365_users.rake @@ -20,7 +20,7 @@ namespace :office365 do old_user.save! else old_main_room = old_user.main_room - old_main_room.name = "Old " + old_main_room.name + old_main_room.name = "Old #{old_main_room.name}" old_main_room.save! new_user.rooms << old_user.rooms diff --git a/lib/tasks/room.rake b/lib/tasks/room.rake index 7deec6a9..b5d900e9 100644 --- a/lib/tasks/room.rake +++ b/lib/tasks/room.rake @@ -39,7 +39,7 @@ namespace :room do next if room.uid.split("-").length > 3 begin - new_uid = room.uid + "-" + SecureRandom.alphanumeric(3).downcase + new_uid = "#{room.uid}-#{SecureRandom.alphanumeric(3).downcase}" puts "Updating #{room.uid} to #{new_uid}" room.update_attributes(uid: new_uid) rescue => e diff --git a/lib/tasks/user.rake b/lib/tasks/user.rake index 21b8ecea..1220f51c 100644 --- a/lib/tasks/user.rake +++ b/lib/tasks/user.rake @@ -35,7 +35,10 @@ namespace :user do u[:email].prepend "superadmin-" if args[:role] == "super_admin" # Create account if it doesn't exist - if !User.exists?(email: u[:email], provider: u[:provider]) + if User.exists?(email: u[:email], provider: u[:provider]) + puts "Account with that email already exists" + puts "Email: #{u[:email]}" + else user = User.create(name: u[:name], email: u[:email], password: u[:password], provider: u[:provider], email_verified: true, accepted_terms: true) @@ -52,9 +55,16 @@ namespace :user do puts "Password: #{u[:password]}" puts "Role: #{u[:role]}" puts "PLEASE CHANGE YOUR PASSWORD IMMEDIATELY" if u[:password] == Rails.configuration.admin_password_default - else - puts "Account with that email already exists" - puts "Email: #{u[:email]}" + end + end + + task :social_uid, [:provider] => :environment do |_task, args| + args.with_defaults(provider: "greenlight") + + User.where(provider: args[:provider]).each do |user| + if user.update(social_uid: "#{args[:provider]}:#{user.email}") + puts "Updated #{user.email} to #{args[:provider]}:#{user.email}" + end end end end diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 84ff5d34..00000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/sample.env b/sample.env index f036ebc8..2c10cbcc 100644 --- a/sample.env +++ b/sample.env @@ -105,6 +105,12 @@ LDAP_ATTRIBUTE_MAPPING= # ALLOW_GREENLIGHT_ACCOUNTS=true +# "hosted domain" part of the Email-Address required for signup for a greenlight account +# domain.com matches also mail.domain.com +# @domain.com does NOT match @mail.domain.com +# multiple domains can be separated by comma (with no whitespace!) +#GREENLIGHT_ACCOUNT_HD=@domain.com,subdomain-allowed.net + # To enable reCaptcha on the user sign up, define these 2 keys # You can obtain these keys by registering your domain using the following url: # @@ -135,6 +141,9 @@ GOOGLE_ANALYTICS_TRACKING_ID= # SMTP_AUTH=plain # SMTP_STARTTLS_AUTO=true # +# enable SMTPS: SMTP over direct TLS connection; usually port 465 +# SMTP_TLS=true +# # If your mail server has a self-signed certificate, you'll also need to include the line below. # Please note that enable this presents its own security risks and should not be done unless necessary. # SMTP_OPENSSL_VERIFY_MODE=none @@ -256,10 +265,15 @@ ENABLE_SSL=true # RAILS_LOG_REMOTE_PORT=9999 # RAILS_LOG_REMOTE_TAG=greenlight +# Specify the log level +# Allowed values are: debug|info|warn|error|fatal|unknown +# For details, see: https://docs.ruby-lang.org/en/master/Logger.html +#RAILS_LOG_LEVEL=info + # Database settings # # Greenlight may work out of the box with sqlite3, but for production it is recommended to use postgresql. -# In such case, these variables must be included. +# In such case, these variables must be included: # # DB_ADAPTER=postgresql # DB_HOST=postgres.example.com @@ -268,6 +282,19 @@ ENABLE_SSL=true # DB_USERNAME=postgres # DB_PASSWORD=password # +# The ActionCable-Workers require 4 connections. So, when using postgres as the CABLE_ADAPTER +# make sure the Database can handle the overall connection count calculated as follows: +# ( RAILS_MAX_THREADS + 4 ) * WEB_CONCURRENCY +# So DB_POOL_SIZE should be set to RAILS_MAX_THREADS + 4 +# +# DB_POOL_SIZE=9 +# +# Additionally, there may be cases where the database has errors so the old db connections became stale. +# In order to overcome the lost of connections, it is recommended to add a timeout. +# +# DB_CONNECT_TIMEOUT=5 +# DB_READ_TIMEOUT=120 +# # For deployments based on the docker-compose script also included, the HOST should be set with the Docker container id. # DB_ADAPTER=postgresql @@ -299,6 +326,13 @@ DEFAULT_REGISTRATION=open # AWS_REGION= # AWS_BUCKET= # +# For S3-compatible API: +# S3_ENDPOINT= +# S3_ACCESS_KEY_ID= +# S3_SECRET_ACCESS_KEY= +# S3_REGION= +# S3_BUCKET= +# # For GCS Storage: # GCS_PROJECT_ID= # GCS_PRIVATE_KEY_ID= @@ -314,9 +348,15 @@ DEFAULT_REGISTRATION=open # The size of the thread pool per worker used by Greenlight's web server. # For details, see: https://github.com/puma/puma#thread-pool # Default: 5 +# +# If you change this value please correct the DB_POOL_SIZE to RAILS_MAX_THREADS + 4 (ActionCable-Workers) #RAILS_MAX_THREADS=5 # The amount of workers (separate processes) used by the web server. # For details, see: https://github.com/puma/puma#clustered-mode # Default: 1 #WEB_CONCURRENCY=1 + +# Max avatar image size (bytes) +# Default: 100000 +MAX_AVATAR_SIZE=100000 diff --git a/scripts/greenlight-auto-deployer.service b/scripts/greenlight-auto-deployer.service index ccab73d9..2be2ad53 100644 --- a/scripts/greenlight-auto-deployer.service +++ b/scripts/greenlight-auto-deployer.service @@ -1,5 +1,10 @@ [Unit] Description=Greenlight Auto Deployer +After=network-online.target +Wants=network-online.target [Service] ExecStart=/bin/bash /usr/local/bin/greenlight-deploy + +[Install] +WantedBy=greenlight.target diff --git a/scripts/image_build.sh b/scripts/image_build.sh index 47566a43..1cba0377 100755 --- a/scripts/image_build.sh +++ b/scripts/image_build.sh @@ -55,13 +55,6 @@ if [ "$CD_REF_NAME" != "master" ] && [[ "$CD_REF_NAME" != *"release"* ]] && [[ " exit 0 fi -# Include sqlite for production -sqliteCount="$(grep "gem 'sqlite3'" Gemfile | wc -l)" - -if [ $sqliteCount -lt 2 ]; then - sed -i "/^group :production do/a\ \ gem 'sqlite3', '~> 1.3.6'" Gemfile -fi - # Set the version tag when it is a release or the commit sha was included. if [[ "$CD_REF_NAME" == *"release"* ]]; then export CD_VERSION_CODE=${CD_REF_NAME:8} diff --git a/spec/concerns/bbb_server_spec.rb b/spec/concerns/bbb_server_spec.rb index 350bcee0..b6cb2375 100644 --- a/spec/concerns/bbb_server_spec.rb +++ b/spec/concerns/bbb_server_spec.rb @@ -43,7 +43,8 @@ describe BbbServer do context "#start_session" do it "should update latest session info" do allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:create_meeting).and_return( - messageKey: "" + messageKey: "", + createTime: "1611793449622" ) expect do @@ -57,17 +58,22 @@ describe BbbServer do context "#join_path" do it "should return correct join URL for user" do allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:get_meeting_info).and_return( - attendeePW: @room.attendee_pw + attendeePW: @room.attendee_pw, + ) + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:create_meeting).and_return( + messageKey: "", + createTime: "1611793449622" ) endpoint = Rails.configuration.bigbluebutton_endpoint secret = Rails.configuration.bigbluebutton_secret - fullname = "fullName=Example" + fullname = "&fullName=Example" join_via_html5 = "&join_via_html5=true" meeting_id = "&meetingID=#{@room.bbb_id}" password = "&password=#{@room.attendee_pw}" + time = "createTime=1611793449622" - query = fullname + join_via_html5 + meeting_id + password + query = time + fullname + join_via_html5 + meeting_id + password checksum_string = "join#{query + secret}" checksum = OpenSSL::Digest.digest('sha1', checksum_string).unpack1("H*") @@ -76,6 +82,24 @@ describe BbbServer do end context "#recordings" do + it "publishes a recording" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:publish_recordings).and_return( + returncode: true, published: true + ) + + expect(publish_recording(Faker::IDNumber.valid)) + .to contain_exactly([:returncode, true], [:published, true]) + end + + it "unpublishes a recording" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:publish_recordings).and_return( + returncode: true, published: false + ) + + expect(unpublish_recording(Faker::IDNumber.valid)) + .to contain_exactly([:returncode, true], [:published, false]) + end + it "deletes the recording" do allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:delete_recordings).and_return( returncode: true, deleted: true diff --git a/spec/concerns/joiner_spec.rb b/spec/concerns/joiner_spec.rb new file mode 100644 index 00000000..9b4b2acd --- /dev/null +++ b/spec/concerns/joiner_spec.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . + +require "rails_helper" + +describe Joiner do + let(:controller) { FakesController.new } + + before do + class FakesController < ApplicationController + include Joiner + def init(room) + @room = room + @settings = Setting.all + end + end + @user = create(:user) + @room = @user.main_room + @room.uid = 'xxxx' + controller.init @room + controller.request = ActionController::TestRequest.create(FakesController) + end + + after do + Object.send :remove_const, :FakesController + end + + it "should properly configure moderator message with nil access code" do + expect(controller.default_meeting_options[:moderator_message]).not_to include('Access Code:') + end + + it "should properly configure moderator message with empty access code" do + @room.access_code = "" + expect(controller.default_meeting_options[:moderator_message]).not_to include('Access Code:') + end + + it "should properly configure moderator message with access code" do + @room.access_code = "1234" + expect(controller.default_meeting_options).to include(moderator_message: include('Access Code: 1234')) + end +end diff --git a/spec/controllers/admins_controller_spec.rb b/spec/controllers/admins_controller_spec.rb index a172ea89..3d009f21 100644 --- a/spec/controllers/admins_controller_spec.rb +++ b/spec/controllers/admins_controller_spec.rb @@ -28,6 +28,26 @@ describe AdminsController, type: :controller do @admin.set_role :admin end + describe "Server Recordings" do + it "renders the server_recordings page" do + @request.session[:user_id] = @admin.id + + get :server_recordings + + expect(response).to render_template(:server_recordings) + end + end + + describe "Server Rooms" do + it "renders the server_rooms page" do + @request.session[:user_id] = @admin.id + + get :server_rooms + + expect(response).to render_template(:server_rooms) + end + end + describe "User Roles" do before do allow(Rails.configuration).to receive(:enable_email_verification).and_return(true) diff --git a/spec/controllers/password_resets_controller_spec.rb b/spec/controllers/password_resets_controller_spec.rb index 429b993b..e18dc1db 100644 --- a/spec/controllers/password_resets_controller_spec.rb +++ b/spec/controllers/password_resets_controller_spec.rb @@ -71,6 +71,43 @@ describe PasswordResetsController, type: :controller do expect(response).to redirect_to("/404") end end + + context "reCAPTCHA enabled" do + before do + allow(Rails.configuration).to receive(:enable_email_verification).and_return(true) + allow(Rails.configuration).to receive(:recaptcha_enabled).and_return(true) + end + + it "sends a reset email if the recaptcha was passed" do + allow(controller).to receive(:valid_captcha).and_return(true) + + user = create(:user, provider: "greenlight") + + params = { + password_reset: { + email: user.email, + }, + } + + expect { post :create, params: params }.to change { ActionMailer::Base.deliveries.count }.by(1) + end + + it "doesn't send an email if the recaptcha was failed" do + allow(controller).to receive(:valid_captcha).and_return(false) + + user = create(:user) + + params = { + password_reset: { + email: user.email, + }, + } + + post :create, params: params + expect(response).to redirect_to(new_password_reset_path) + expect(flash[:alert]).to be_present + end + end end describe "PATCH #update" do diff --git a/spec/controllers/rooms_controller_spec.rb b/spec/controllers/rooms_controller_spec.rb index d019954b..4733cd49 100644 --- a/spec/controllers/rooms_controller_spec.rb +++ b/spec/controllers/rooms_controller_spec.rb @@ -182,8 +182,8 @@ describe RoomsController, type: :controller do @request.session[:user_id] = @owner.id name = Faker::Games::Pokemon.name - room_params = { name: name, "mute_on_join": "1", - "require_moderator_approval": "1", "anyone_can_start": "1", "all_join_moderator": "1" } + room_params = { name: name, mute_on_join: "1", + require_moderator_approval: "1", anyone_can_start: "1", all_join_moderator: "1" } json_room_settings = "{\"muteOnStart\":true,\"requireModeratorApproval\":true," \ "\"anyoneCanStart\":true,\"joinModerator\":true,\"recording\":false}" @@ -199,8 +199,8 @@ describe RoomsController, type: :controller do it "should respond with JSON object of the room_settings" do @request.session[:user_id] = @owner.id - @owner.main_room.update_attribute(:room_settings, { "muteOnStart": true, "requireModeratorApproval": true, - "anyoneCanStart": true, "joinModerator": true }.to_json) + @owner.main_room.update_attribute(:room_settings, { muteOnStart: true, requireModeratorApproval: true, + anyoneCanStart: true, joinModerator: true }.to_json) json_room_settings = { "anyoneCanStart" => true, "joinModerator" => true, @@ -224,7 +224,7 @@ describe RoomsController, type: :controller do it "should redirect back to main room with error if it fails" do @request.session[:user_id] = @owner.id - room_params = { name: "", "mute_on_join": "1" } + room_params = { name: "", mute_on_join: "1" } post :create, params: { room: room_params } @@ -237,7 +237,7 @@ describe RoomsController, type: :controller do @request.session[:user_id] = @owner.id - room_params = { name: Faker::Games::Pokemon.name, "mute_on_join": "1" } + room_params = { name: Faker::Games::Pokemon.name, mute_on_join: "1" } post :create, params: { room: room_params } @@ -251,6 +251,10 @@ describe RoomsController, type: :controller do @user = create(:user) @owner = create(:user) @room = @owner.main_room + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:create_meeting).and_return( + messageKey: "", + createTime: "1611793449622" + ) end it "should use account name if user is logged in and meeting running" do @@ -269,6 +273,22 @@ describe RoomsController, type: :controller do expect(response).to redirect_to(join_path(@owner.main_room, "Join Name", {}, response.cookies["guest_id"])) end + it "should use join name if user is not logged in and meeting running and moderator access code is enabled and set" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(true) + allow_any_instance_of(Setting).to receive(:get_value).and_call_original + allow_any_instance_of(Setting).to receive(:get_value) + .with("Room Configuration Moderator Access Codes").and_return("optional") + + room = Room.new(name: "test", moderator_access_code: "abcdef") + room.room_settings = "{ }" + room.owner = @owner + room.save + + post :join, params: { room_uid: room, join_name: "Join Name" }, session: { moderator_access_code: "abcdef" } + + expect(response).to redirect_to(join_path(room, "Join Name", { user_is_moderator: true }, response.cookies["guest_id"])) + end + it "should render wait if meeting isn't running" do allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(false) @@ -394,6 +414,64 @@ describe RoomsController, type: :controller do expect(response).to redirect_to room_path(protected_room.uid) end + it "should join the room as moderator if the user has the moderator_access code (and regular access code is not set)" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(true) + allow_any_instance_of(Setting).to receive(:get_value).and_call_original + allow_any_instance_of(Setting).to receive(:get_value) + .with("Room Configuration Moderator Access Codes").and_return("optional") + + room = Room.new(name: "test", moderator_access_code: "abcdef") + room.room_settings = "{ }" + room.owner = @owner + room.save + + post :join, params: { room_uid: room, join_name: "Join Name" }, session: { moderator_access_code: "abcdef" } + + expect(response).to redirect_to(join_path(room, "Join Name", { user_is_moderator: true }, response.cookies["guest_id"])) + end + + it "should join the room as moderator if the user has the moderator_access code (and regular access code is set)" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(true) + allow_any_instance_of(Setting).to receive(:get_value).and_call_original + allow_any_instance_of(Setting).to receive(:get_value) + .with("Room Configuration Moderator Access Codes").and_return("optional") + + room = Room.new(name: "test", access_code: "123456", moderator_access_code: "abcdef") + room.room_settings = "{ }" + room.owner = @owner + room.save + + post :join, params: { room_uid: room, join_name: "Join Name" }, session: { moderator_access_code: "abcdef" } + + expect(response).to redirect_to(join_path(room, "Join Name", { user_is_moderator: true }, response.cookies["guest_id"])) + end + + it "should redirect to login if a wrong moderator access code is supplied" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(true) + + room = Room.new(name: "test", access_code: "123456", moderator_access_code: "abcdef") + room.room_settings = "{ }" + room.owner = @owner + room.save + + post :join, params: { room_uid: room, join_name: "Join Name" }, session: { moderator_access_code: "abcdee" } + + expect(response).to redirect_to room_path(room.uid) + end + + it "should redirect to login if a 'empty' moderator access code is supplied and moderator code is not set" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(true) + + room = Room.new(name: "test", access_code: "123456") + room.room_settings = "{ }" + room.owner = @owner + room.save + + post :join, params: { room_uid: room, join_name: "Join Name" }, session: { moderator_access_code: nil } + + expect(response).to redirect_to room_path(room.uid) + end + it "should join owner as moderator if meeting running" do allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(true) @@ -521,6 +599,10 @@ describe RoomsController, type: :controller do moderatorPW: "modpass", attendeePW: "attpass", ) + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:create_meeting).and_return( + messageKey: "", + createTime: "1611793449622" + ) end it "should redirect to join path if owner" do @@ -575,7 +657,7 @@ describe RoomsController, type: :controller do @request.session[:user_id] = @user.id name = Faker::Name.first_name - room_params = { room_uid: @secondary_room.uid, room: { "name": name } } + room_params = { room_uid: @secondary_room.uid, room: { name: name } } expect { post :update_settings, params: room_params }.to change { @secondary_room.reload.name } .from(@secondary_room.name).to(name) @@ -585,7 +667,7 @@ describe RoomsController, type: :controller do it "properly updates room settings through the room settings modal and redirects to current page" do @request.session[:user_id] = @user.id - room_params = { "mute_on_join": "1", "name": @secondary_room.name, "recording": "1" } + room_params = { mute_on_join: "1", name: @secondary_room.name, recording: "1" } formatted_room_params = "{\"muteOnStart\":true,\"requireModeratorApproval\":false," \ "\"anyoneCanStart\":false,\"joinModerator\":false,\"recording\":true}" # JSON string format @@ -608,7 +690,7 @@ describe RoomsController, type: :controller do @admin.set_role :admin @request.session[:user_id] = @admin.id - room_params = { "mute_on_join": "1", "name": @secondary_room.name } + room_params = { mute_on_join: "1", name: @secondary_room.name } formatted_room_params = "{\"muteOnStart\":true,\"requireModeratorApproval\":false," \ "\"anyoneCanStart\":false,\"joinModerator\":false,\"recording\":false}" # JSON string format @@ -624,7 +706,7 @@ describe RoomsController, type: :controller do @admin.set_role :admin @request.session[:user_id] = @admin.id - room_params = { "mute_on_join": "1", "name": @secondary_room.name } + room_params = { mute_on_join: "1", name: @secondary_room.name } expect { post :update_settings, params: { room_uid: @secondary_room.uid, room: room_params } } .not_to change { @secondary_room.reload.room_settings } @@ -663,12 +745,50 @@ describe RoomsController, type: :controller do expect(flash[:alert]).to be_nil end + it "should redirect to show with valid moderator_access_code as regular access_code" do + allow_any_instance_of(Setting).to receive(:get_value).and_call_original + allow_any_instance_of(Setting).to receive(:get_value) + .with("Room Configuration Moderator Access Codes").and_return("optional") + + @room.moderator_access_code = "abcdef" + @room.save + + post :login, params: { room_uid: @room.uid, room: { access_code: "abcdef" } } + + expect(response).to redirect_to room_path(@room.uid) + expect(flash[:alert]).to be_nil + expect(session[:moderator_access_code]).to eq("abcdef") + end + it "should redirect to show with and notify user of invalid access code" do post :login, params: { room_uid: @room.uid, room: { access_code: "123455" } } expect(response).to redirect_to room_path(@room.uid) expect(flash[:alert]).to eq(I18n.t("room.access_code_required")) end + + it "should redirect to show and notify user of invalid moderator access code" do + @room.moderator_access_code = "abcdef" + @room.save + + post :login, params: { room_uid: @room.uid, room: { moderator_access_code: "abcdee" } } + + expect(response).to redirect_to room_path(@room.uid) + expect(flash[:alert]).to eq(I18n.t("room.access_code_required")) + end + + it "it should redirect to show with valid moderator access code and disabled moderator codes setting" do + allow_any_instance_of(Setting).to receive(:get_value).and_call_original + allow_any_instance_of(Setting).to receive(:get_value).with("Moderator Access Codes").and_return("false") + + @room.moderator_access_code = "abcdef" + @room.save + + post :join, params: { room_uid: @room, join_name: "Join Name" }, session: { moderator_access_code: "abcdef" } + + expect(response).to redirect_to room_path(@room.uid) + expect(flash[:alert]).to eq(I18n.t("room.access_code_required")) + end end describe "POST join_specific_room" do diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb index 79376fb9..9d16adb4 100644 --- a/spec/controllers/sessions_controller_spec.rb +++ b/spec/controllers/sessions_controller_spec.rb @@ -658,7 +658,7 @@ describe SessionsController, type: :controller do } expect(response).to redirect_to(ldap_signin_path) - expect(flash[:alert]).to eq(I18n.t("invalid_credentials")) + expect(flash[:alert]).to eq(I18n.t("invalid_credentials_external")) end it "redirects to signin if no password provided" do @@ -672,7 +672,7 @@ describe SessionsController, type: :controller do } expect(response).to redirect_to(ldap_signin_path) - expect(flash[:alert]).to eq(I18n.t("invalid_credentials")) + expect(flash[:alert]).to eq(I18n.t("invalid_credentials_external")) end it "redirects to signin if no username provided" do @@ -686,7 +686,7 @@ describe SessionsController, type: :controller do } expect(response).to redirect_to(ldap_signin_path) - expect(flash[:alert]).to eq(I18n.t("invalid_credentials")) + expect(flash[:alert]).to eq(I18n.t("invalid_credentials_external")) end end end diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index 9b37d5a9..feabd28c 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -416,7 +416,7 @@ describe UsersController, type: :controller do tmp_role1.update_permission("send_promoted_email", "true") params = random_valid_user_params - params = params.merge!(user_uid: user, user: { role_id: tmp_role1.id.to_s }) + params.merge!(user_uid: user, user: { role_id: tmp_role1.id.to_s }) expect { post :update, params: params }.to change { ActionMailer::Base.deliveries.count }.by(1) @@ -440,7 +440,7 @@ describe UsersController, type: :controller do @request.session[:user_id] = admin.id params = random_valid_user_params - params = params.merge!(user_uid: user, user: { role_id: new_role.id.to_s }) + params.merge!(user_uid: user, user: { role_id: new_role.id.to_s }) expect(user.role.name).to eq("test1") expect(user.main_room).to be_nil @@ -503,7 +503,7 @@ describe UsersController, type: :controller do user: { password: "incorrect_password", new_password: @password, - password_confirmation: @password + "_random_string", + password_confirmation: "#{@password}_random_string", } } post :update_password, params: params.merge!(user_uid: @user) diff --git a/spec/helpers/recordings_helper_spec.rb b/spec/helpers/recordings_helper_spec.rb index ac8690c8..5a8f343f 100644 --- a/spec/helpers/recordings_helper_spec.rb +++ b/spec/helpers/recordings_helper_spec.rb @@ -19,13 +19,6 @@ require "rails_helper" describe RecordingsHelper do - describe "#recording_date" do - it "formats the date" do - date = DateTime.parse("2019-03-28 19:35:15 UTC") - expect(helper.recording_date(date)).to eql("March 28, 2019") - end - end - describe "#recording_length" do it "returns the time if length > 60" do playbacks = [{ type: "test", length: 85 }] diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index c8c43a17..efc0cfb4 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -54,27 +54,27 @@ RSpec.configure do |config| .with( headers: { - 'Accept': '*/*', + Accept: '*/*', 'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent': 'Ruby', } ) .to_return(status: 200, body: "", headers: {}) - stub_request(:any, /#{ENV['LOADBALANCER_ENDPOINT'] + 'api'}/) + stub_request(:any, /#{"#{ENV['LOADBALANCER_ENDPOINT']}api"}/) .with( headers: { - 'Accept': '*/*', + Accept: '*/*', 'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent': 'Ruby', } ) .to_return(status: 200, body: "", headers: {}) if ENV['LOADBALANCER_ENDPOINT'] - stub_request(:any, /#{ENV['LOADBALANCER_ENDPOINT'] + 'api\/getUser'}/) + stub_request(:any, /#{"#{ENV['LOADBALANCER_ENDPOINT']}api\\/getUser"}/) .with( headers: { - 'Accept': '*/*', + Accept: '*/*', 'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent': 'Ruby', } @@ -90,11 +90,11 @@ RSpec.configure do |config| secret ", headers: {}) if ENV['LOADBALANCER_ENDPOINT'] - stub_request(:any, /#{ENV['LOADBALANCER_ENDPOINT'] + 'api2\/getUserGreenlightCredentials'}/) + stub_request(:any, /#{"#{ENV['LOADBALANCER_ENDPOINT']}api2\\/getUserGreenlightCredentials"}/) .with( headers: { - 'Accept': '*/*', + Accept: '*/*', 'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent': 'Ruby', } diff --git a/test/mailers/previews/user_mailer_preview.rb b/test/mailers/previews/user_mailer_preview.rb index ae8d1d33..99705ec0 100644 --- a/test/mailers/previews/user_mailer_preview.rb +++ b/test/mailers/previews/user_mailer_preview.rb @@ -2,8 +2,8 @@ class UserMailerPreview < ActionMailer::Preview def initialize(_params) - @logo = "https://raw.githubusercontent.com/bigbluebutton/greenlight/master/app/assets/images/logo_with_text.png" - @color = "#467fcf" + super + @settings = Setting.find_by(provider: "greenlight") end # Preview this email at @@ -11,7 +11,7 @@ class UserMailerPreview < ActionMailer::Preview def password_reset user = User.first user.reset_token = User.new_token - url = "http://example.com" + "/password_resets/" + user.reset_token + "/edit?email=" + user.email + url = "http://example.com/password_resets/#{user.reset_token}/edit?email=#{user.email}" UserMailer.password_reset(user, url, @logo, @color) end @@ -19,14 +19,14 @@ class UserMailerPreview < ActionMailer::Preview # http://localhost:3000/rails/mailers/user_mailer/verify_email def verify_email user = User.first - url = "http://example.com" + "/u/verify/confirm/" + user.uid + url = "http://example.com/u/verify/confirm/#{user.uid}" UserMailer.verify_email(user, url, @logo, @color) end # Preview this email at # http://localhost:3000/rails/mailers/user_mailer/invite_email def invite_email - UserMailer.invite_email("Example User", "from@example.com", "http://example.com/signup", @logo, @color) + UserMailer.invite_email("Example User", "from@example.com", DateTime.now, "http://example.com/signup", @settings) end # Preview this email at diff --git a/test/test_helper.rb b/test/test_helper.rb deleted file mode 100644 index e69de29b..00000000