diff --git a/.dockerignore b/.dockerignore index 78765505cc..5da345a5b7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,31 +4,26 @@ README.md SECURITY.md .github -.gitlab-ci.yml -.rvmrc # Rails -.env* +.env *.rbc capybara-*.html .rspec -**/.bundle/ -*.dev -.rubocop.yml -log/* -tmp/* -storage/* +log +tmp /db/**/*.sqlite3 /db/**/*.sqlite3-journal /db/production /db/production-postgres -public/**/assets/ +public/assets +public/b coverage/ -vendor/* -Dockerfile* -spec/ -test/ -**/node_modules/ -app/assets/builds/* -dockerfiles/ -!**/.keep +.rvmrc +vendor/bundle +.bundle +Dockerfile +.gitlab-ci.yml +.rubocop.yml +spec +test \ No newline at end of file diff --git a/.eslintrc.yml b/.eslintrc.yml deleted file mode 100644 index d678106efc..0000000000 --- a/.eslintrc.yml +++ /dev/null @@ -1,20 +0,0 @@ -env: - browser: true - es2021: true -extends: - - plugin:react/recommended - - airbnb -parserOptions: - ecmaFeatures: - jsx: true - ecmaVersion: latest - sourceType: module -plugins: - - react -rules: - react/jsx-one-expression-per-line: "off" - no-nested-ternary: "off" - max-len: - - 'error' - - code: 150 - jsx-a11y/control-has-associated-label: "off" diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 31eeee0b6a..0000000000 --- a/.gitattributes +++ /dev/null @@ -1,7 +0,0 @@ -# See https://git-scm.com/docs/gitattributes for more about git attribute files. - -# Mark the database schema as having been generated. -db/schema.rb linguist-generated - -# Mark any vendored files as having been vendored. -vendor/* linguist-vendored diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..74bee889fe --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ + + + + +## Description + + +## Testing Steps + + +## Screenshots (if appropriate): + diff --git a/.github/workflows/.mirror.yml b/.github/workflows/.mirror.yml deleted file mode 100644 index 36105489ba..0000000000 --- a/.github/workflows/.mirror.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Mirroring - -on: [push, delete] - -jobs: - to_codecommit: - runs-on: ubuntu-latest - env: - CODECOMMIT_MIRROR_ENABLED: ${{ secrets.CODECOMMIT_MIRROR_ENABLED }} - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - - name: CodeCommit Mirroring - if: contains(env.CODECOMMIT_MIRROR_ENABLED, 'true') - uses: pixta-dev/repository-mirroring-action@v1 - with: - target_repo_url: - ${{ secrets.CODECOMMIT_TARGET_REPO_URL }} - ssh_private_key: - ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }} - ssh_username: - ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY_ID }} - diff --git a/.github/workflows/build.push.yml b/.github/workflows/build.push.yml new file mode 100644 index 0000000000..3f05b81963 --- /dev/null +++ b/.github/workflows/build.push.yml @@ -0,0 +1,41 @@ +env: + RUBY_VERSION: 2.7.2 + + +name: Build Push +on: + push: + branches: "master" + +jobs: + main: + name: Build Docker Image + runs-on: ubuntu-18.04 + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to Github Container Registry + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Compute Short SHA + uses: farhatahmad/short-sha@v1.2 + id: short-sha + with: + length: 7 + + - name: Get Branch Name + uses: farhatahmad/branch-names@v2 + id: branch-name + + - name: Build and Push latest + uses: docker/build-push-action@v2 + with: + push: true + tags: | + bigbluebutton/greenlight:master + bigbluebutton/greenlight:latest + build-args: version_code=${{ steps.branch-name.outputs.ref_branch }} (${{ steps.short-sha.outputs.sha }}) \ No newline at end of file diff --git a/.github/workflows/build.release.yml b/.github/workflows/build.release.yml new file mode 100644 index 0000000000..46cecd08d3 --- /dev/null +++ b/.github/workflows/build.release.yml @@ -0,0 +1,32 @@ +env: + RUBY_VERSION: 2.7.2 + + +name: Build Release +on: + release: + types: [released] + +jobs: + main: + name: Build Docker Image + runs-on: ubuntu-18.04 + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to Github Container Registry + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and Push release + uses: docker/build-push-action@v2 + with: + push: true + tags: | + bigbluebutton/greenlight:latest + bigbluebutton/greenlight:v2 + bigbluebutton/greenlight:${{ github.event.release.tag_name }} + build-args: version_code=${{ github.event.release.tag_name }} diff --git a/.github/workflows/ci.build.prerelease.yml b/.github/workflows/ci.build.prerelease.yml deleted file mode 100644 index a3c431dfb9..0000000000 --- a/.github/workflows/ci.build.prerelease.yml +++ /dev/null @@ -1,95 +0,0 @@ -env: - RUBY_VERSION: 3.3 - -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-24.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@v2 - - - name: Cache Docker layers - if: contains(env.DOCKER_BUILD_ENABLED, 'true') - uses: actions/cache@v4 - 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@v2 - 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@v3 - with: - push: true - tags: | - "${{ steps.ci_docker_repository.outputs.repository }}:v${{ steps.ci_tag_release_version.outputs.tag }}" - build-args: "VERSION_TAG=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@v3 - with: - file: dockerfiles/v3/alpine - push: true - tags: | - "${{ steps.ci_docker_repository.outputs.repository }}:v${{ steps.ci_tag_release_version.outputs.tag }}-alpine" - build-args: "VERSION_TAG=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@v3 - with: - file: dockerfiles/v3/amazonlinux - push: true - tags: | - "${{ steps.ci_docker_repository.outputs.repository }}:v${{ steps.ci_tag_release_version.outputs.tag }}-amazonlinux" - build-args: "VERSION_TAG=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 deleted file mode 100644 index 431f72e62d..0000000000 --- a/.github/workflows/ci.build.push.yml +++ /dev/null @@ -1,102 +0,0 @@ -env: - RUBY_VERSION: 3.3 - -name: CI Build Push -on: - push: - branches: - - master - -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-24.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@v2 - - - name: Cache Docker layers - if: contains(env.DOCKER_BUILD_ENABLED, 'true') - uses: actions/cache@v4 - 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@v2 - 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@v3 - with: - push: true - tags: | - "${{ steps.ci_docker_repository.outputs.repository }}:${{ steps.ci_branch_name.outputs.branch }}" - build-args: "VERSION_TAG=${{ 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') && github.ref != 'refs/heads/master' - uses: docker/build-push-action@v3 - with: - file: dockerfiles/v3/alpine - push: true - tags: | - "${{ steps.ci_docker_repository.outputs.repository }}:${{ steps.ci_branch_name.outputs.branch }}-alpine" - build-args: "VERSION_TAG=${{ 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 with amazonlinux - - name: Alternate Amazon Linux Build and Push - if: contains(env.DOCKER_BUILD_ENABLED, 'true') && contains(env.DOCKER_BUILD_ALTERNATE_ENABLED, 'true') && github.ref != 'refs/heads/master' - uses: docker/build-push-action@v3 - with: - file: dockerfiles/v3/amazonlinux - push: true - tags: | - "${{ steps.ci_docker_repository.outputs.repository }}:${{ steps.ci_branch_name.outputs.branch }}-amazonlinux" - build-args: "VERSION_TAG=${{ 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 deleted file mode 100644 index e8de4394d8..0000000000 --- a/.github/workflows/ci.build.release.yml +++ /dev/null @@ -1,110 +0,0 @@ -env: - RUBY_VERSION: 3.3 - -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-24.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@v2 - - - name: Cache Docker layers - if: contains(env.DOCKER_BUILD_ENABLED, 'true') - uses: actions/cache@v4 - 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@v2 - 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 Version - id: ci_tag_release_version - if: contains(env.DOCKER_BUILD_ENABLED, 'true') - shell: bash - run: echo "##[set-output name=tag;]$(echo ${{github.ref_name}} | cut -c 9-)" - - - 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_version.outputs.tag}} | cut -f 1-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_version.outputs.tag}} | cut -f 1-2 -d '.')" - - - name: Build and Push - if: contains(env.DOCKER_BUILD_ENABLED, 'true') - uses: docker/build-push-action@v3 - with: - push: true - tags: | - "${{ steps.ci_docker_repository.outputs.repository }}:v${{ steps.ci_tag_release_version.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_TAG=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 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@v3 - with: - file: dockerfiles/v3/alpine - push: true - tags: | - "${{ steps.ci_docker_repository.outputs.repository }}:v${{ steps.ci_tag_release_version.outputs.tag }}-alpine" - build-args: "VERSION_TAG=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 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@v3 - with: - file: dockerfiles/v3/amazonlinux - push: true - tags: | - "${{ steps.ci_docker_repository.outputs.repository }}:v${{ steps.ci_tag_release_version.outputs.tag }}-amazonlinux" - build-args: "VERSION_TAG=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.yml b/.github/workflows/main.yml similarity index 57% rename from .github/workflows/ci.yml rename to .github/workflows/main.yml index 0307e36fc4..933eb72579 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/main.yml @@ -1,7 +1,11 @@ env: - RUBY_VERSION: 3.3 - DATABASE_URL: postgres://postgres:postgres@localhost/greenlight-actions - RAILS_ENV: test + RUBY_VERSION: 2.7.2 + DB_ADAPTER: postgresql + DB_HOST: localhost + DB_NAME: postgres + DB_USERNAME: postgres + DB_PASSWORD: postgres + DB_PORT: 5432 name: CI on: @@ -10,12 +14,12 @@ on: jobs: test: - name: Rubocop + RSpec + ESLint + License Header Check - runs-on: ubuntu-24.04 + name: Rubocop + RSpec + runs-on: ubuntu-18.04 services: postgres: - image: postgres:13-alpine + image: postgres:13.2-alpine env: POSTGRES_DB: postgres POSTGRES_PASSWORD: postgres @@ -32,16 +36,13 @@ jobs: - name: Checkout uses: actions/checkout@v2 - - name: Install Ruby ${{ env.RUBY_VERSION }} + - name: Ruby Setup uses: ruby/setup-ruby@v1 with: ruby-version: ${{ env.RUBY_VERSION }} - - name: Install imagemagick - run: sudo apt-get clean && sudo apt-get update && sudo apt-get install -y imagemagick - - name: Bundle cache - uses: actions/cache@v4 + uses: actions/cache@v2 with: path: vendor/bundle key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} @@ -53,22 +54,12 @@ jobs: bundle config path vendor/bundle bundle install --jobs 4 --retry 3 - - name: NPM install - run: npm install - - name: Setup database - run: | - bundler exec rails db:create - bundler exec rails db:migrate - + 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 + run: bundle exec rubocop --parallel --fail-level F - name: Run RSpec run: bundle exec rspec - - - name: Run ESLint - run: npx eslint app/javascript/* --ext .js,.jsx - - - name: Fix License Header - uses: apache/skywalking-eyes/header@main diff --git a/.gitignore b/.gitignore index b6e046be3a..29f6d37020 100644 --- a/.gitignore +++ b/.gitignore @@ -9,46 +9,42 @@ # Ignore the default SQLite database. /db/*.sqlite3 -/db/*.sqlite3-* +/db/*.sqlite3-journal -# Ignore all logfiles and tempfiles. -/log/* -/tmp/* -!/log/.keep -!/tmp/.keep +# Ignore static assets. +/public/system/** +/public/assets/** +/public/b/** -# Ignore pidfiles, but keep the directory. -/tmp/pids/* -!/tmp/pids/ -!/tmp/pids/.keep +# Ignore uploaded files +/storage -# Ignore uploaded files in development. -/storage/* -!/storage/.keep -/tmp/storage/* -!/tmp/storage/ -!/tmp/storage/.keep +# Ignore production paths. +/db/production +/db/production-postgres -/public/assets +# Ignore all logfiles and tempfiles. +/log/* +/tmp +!/log/.keep -# Ignore master key for decrypting credentials and more. -/config/master.key +# Ignore Byebug command history file. +.byebug_history -/app/assets/builds/* -!/app/assets/builds/.keep +# Ignore environment configuration. +.env +env +# Ignore yarn configs /node_modules # IDEs .idea -/.idea/ .idea/** .vscode -/.vscode/ .vscode/** -# Ignore dev settings. -.ruby-version +config/terms.md +coverage* -# Ignore environment configuration. -.env* +/atom-sftp-sync.json diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000..95b712ad34 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,71 @@ +stages: + - test + - build + - deploy + +cache: + paths: + - /cache + +before_script: + +test: + stage: test + image: ruby:2.5 + script: + - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs + - bundle install --path /cache + - bundle exec rake db:create RAILS_ENV=test + - bundle exec rake test & bundle exec rspec & bundle exec rubocop + except: + variables: + - $CD_TEST_IGNORE + +build: + stage: build + image: docker:stable + services: + - docker:dind + script: + # Install bash, curl, git for deployment script + - apk update && apk add --no-cache bash curl git + # Install CA certs, openssl to https downloads, python for gcloud sdk + - apk add --update make ca-certificates openssl python + - update-ca-certificates + # Build. + - ./scripts/image_build.sh $CI_PROJECT_PATH $CI_COMMIT_REF_NAME $CI_COMMIT_SHA + only: + refs: + - branches + - tags + variables: + - $CD_DOCKER_USERNAME + - $CD_DOCKER_PASSWORD + except: + variables: + - $CD_BUILD_IGNORE + +deploy: + stage: deploy + image: docker:stable + services: + - docker:dind + script: + # Install bash, curl, git for deployment script + - apk update && apk add --no-cache bash curl git + # Install CA certs, openssl to https downloads, python for gcloud sdk + - apk add --update make ca-certificates openssl python + - update-ca-certificates + # Deploy. + - ./scripts/image_deploy.sh $CI_PROJECT_PATH $CI_COMMIT_REF_NAME $CI_COMMIT_SHA $CI_COMMIT_BEFORE_SHA + only: + refs: + - branches + - tags + variables: + - $CD_DOCKER_USERNAME + - $CD_DOCKER_PASSWORD + - $CD_DEPLOY_SCRIPT + except: + variables: + - $CD_DEPLOY_IGNORE diff --git a/.licenserc.yaml b/.licenserc.yaml deleted file mode 100644 index 1860915d30..0000000000 --- a/.licenserc.yaml +++ /dev/null @@ -1,59 +0,0 @@ -header: - license: - copyright-owner: BigBlueButton Inc. - copyright-year: '2023' - software-name: greenlight-v3 - content: | - BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. - - Copyright (c) 2022 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. - - Greenlight 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 Greenlight; if not, see . - - paths: - - 'app' - - 'config' - - 'spec' - - paths-ignore: - - 'app/assets/locales/*.json' - - '**/.keep' - - 'config/credentials.yml.enc' - - 'app/views' - - 'spec/fixtures' - - comment: on-failure - - language: - Ruby: - extensions: - - ".rb" - comment_style_id: Hashtag - Javascript: - extensions: - - ".js" - - ".jsx" - comment_style_id: DoubleSlash - YAML: - extensions: - - ".yml" - - ".yaml" - comment_style_id: Hashtag - JSON: - extensions: - - ".json" - comment_style_id: DoubleSlash - SCSS: - extensions: - - ".scss" - comment_style_id: DoubleSlash diff --git a/.rake_tasks~ b/.rake_tasks~ new file mode 100644 index 0000000000..c55c6c914e --- /dev/null +++ b/.rake_tasks~ @@ -0,0 +1,42 @@ +about +app:template +app:update +assets:clean[keep] +assets:clobber +assets:environment +assets:precompile +autoprefixer:info +cache_digests:dependencies +cache_digests:nested_dependencies +conf:check +db:create +db:drop +db:environment:set +db:fixtures:load +db:migrate +db:migrate:status +db:rollback +db:schema:cache:clear +db:schema:cache:dump +db:schema:dump +db:schema:load +db:seed +db:setup +db:structure:dump +db:structure:load +db:version +dev:cache +initializers +log:clear +middleware +notes +notes:custom +restart +routes +secret +stats +test +test:db +time:zones[country_or_offset] +tmp:clear +tmp:create diff --git a/.rspec b/.rspec index c99d2e7396..7a2cc1a6e0 100644 --- a/.rspec +++ b/.rspec @@ -1 +1,3 @@ --require spec_helper +--format documentation +--color diff --git a/.rubocop.yml b/.rubocop.yml index f91c649926..9d14d92cf4 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,110 +1,191 @@ -require: - - rubocop-performance - - rubocop-rspec - - rubocop-factory_bot - - rubocop-capybara - -plugins: - - rubocop-rails - AllCops: Exclude: - - 'bin/**/*' - - 'db/schema.rb' - - 'db/data_schema.rb' - - 'vendor/**/*' - - 'vendor/bundle/**/*' - - 'config/routes.rb' + - 'db/schema.rb' + - 'vendor/**/*' DisabledByDefault: false - TargetRubyVersion: 3.3 + TargetRubyVersion: 2.7 + NewCops: enable +Style/BlockDelimiters: + Enabled: false + +# Checks if uses of quotes match the configured preference. +Style/StringLiterals: + Enabled: false + # Document classes and non-namespace modules. Style/Documentation: Enabled: false -RSpec/ContextWording: +# Check for conditionals that can be replaced with guard clauses +Style/GuardClause: Enabled: false -# Enable having multiple expectations per example in a spec. -RSpec/MultipleExpectations: +# Checks the formatting of empty method definitions. +Style/EmptyMethod: Enabled: false -# Enable having long examples -RSpec/ExampleLength: +# Checks for trailing comma in hash literals. +Style/TrailingCommaInHashLiteral: Enabled: false -# Enable having arbitrary Spec path i.e. Api::V1::Controller. -RSpec/FilePath: +# Checks for trailing comma in argument lists. +Style/TrailingCommaInArguments: Enabled: false -RSpec/LetSetup: +# Checks that `include`, `extend` and `prepend` exists at the top level. +Style/MixinUsage: Enabled: false -RSpec/MessageSpies: +# Use %i or %I for arrays of symbols. +Style/SymbolArray: Enabled: false -RSpec/MultipleMemoizedHelpers: +# Don't use begin blocks when they are not needed. +Style/RedundantBegin: Enabled: false -RSpec/NestedGroups: - Max: 7 +# Use `%`-literal delimiters consistently +Style/PercentLiteralDelimiters: + Enabled: false -RSpec/StubbedMock: +# Only use if/unless modifiers on single line statements. +Style/MultilineIfModifier: Enabled: false -# Enable having lines with up to 150 charachters in length. -Layout/LineLength: - Max: 150 +# Checks for trailing comma in array literals. +Style/TrailingCommaInArrayLiteral: + Enabled: false -# Avoid methods longer than 10 lines of code. -Metrics/MethodLength: +# Use `expand_path(__dir__)` instead of `expand_path('..', __FILE__)`. +Style/ExpandPathArguments: + Enabled: false + +# Do not assign mutable objects to constants. +Style/MutableConstant: + Enabled: false + +# Avoid rescuing without specifying an error class. +Style/RescueStandardError: + Enabled: false + +# Align the elements of a hash literal if they span more than one line. +Layout/HashAlignment: + Enabled: false + +# Align the parameters of a method definition if they span more than one line. +Layout/ParameterAlignment: + Enabled: false + +# Align ends corresponding to defs correctly. +Layout/EndAlignment: + Enabled: false + +# Align elses and elsifs correctly. +Layout/ElseAlignment: + Enabled: false + +# Add empty line after guard clause. +Layout/EmptyLineAfterGuardClause: + Enabled: false + +# Align the arguments of a method call if they span more than one line. +Layout/ArgumentAlignment: + Enabled: false + +# +Layout/IndentationWidth: + Enabled: false + +Layout/CaseIndentation: + Enabled: false + +# Checks for ambiguous block association with method when param passed without parentheses. +Lint/AmbiguousBlockAssociation: Enabled: false # Avoid long blocks with many lines. Metrics/BlockLength: - AllowedMethods: [ 'describe', 'context', 'xdescribe', 'xcontext', 'FactoryBot.define' ] - Exclude: - - 'config/routes.rb' - - 'config/environments/production.rb' - Max: 70 + Enabled: false +# A complexity metric geared towards measuring complexity for a human reader. +Metrics/PerceivedComplexity: + Max: 17 + +# Avoid classes longer than 100 lines of code. Metrics/ClassLength: - Max: 150 + Enabled: false -# A calculated magnitude based on number of assignments, -# branches, and conditions. -Metrics/AbcSize: - Max: 110 +# Limit lines to 80 characters. +Layout/LineLength: + Max: 130 -Metrics/ParameterLists: - CountKeywordArgs: false +# Avoid methods longer than 10 lines of code. +Metrics/MethodLength: + Enabled: false -RSpec/AnyInstance: +Metrics/ModuleLength: Enabled: false +# A calculated magnitude based on number of assignments, +# branches, and conditions. +Metrics/AbcSize: + Max: 60 + +# A complexity metric that is strongly correlated to the number +# of test cases needed to validate a method. Metrics/CyclomaticComplexity: - Max: 25 + Max: 20 -Metrics/PerceivedComplexity: - Max: 25 +# Checks for method parameter names that contain capital letters, end in numbers, or do not meet a minimal length. +Naming/MethodParameterName: + Enabled: false -Rails/Exit: - Exclude: - - 'lib/tasks/task_helpers.rb' +Lint/LiteralInInterpolation: + Enabled: false -Rails/Output: - Exclude: - - 'lib/tasks/task_helpers.rb' +Layout/EmptyLinesAroundAttributeAccessor: + Enabled: true + +Layout/SpaceAroundMethodCallOperator: + Enabled: true + +Lint/DeprecatedOpenSSLConstant: + Enabled: true + +Lint/RaiseException: + Enabled: true + +Lint/StructNewOverride: + Enabled: true + +Style/ExponentialNotation: + Enabled: true + +Style/HashEachMethods: + Enabled: true + +Style/HashTransformKeys: + Enabled: true + +Style/HashTransformValues: + Enabled: true + +Style/SlicingWithRange: + Enabled: true + +Style/OptionalBooleanParameter: + Enabled: false -Rails/RootPathnameMethods: +Lint/DuplicateBranch: Enabled: false -Rails/ThreeStateBooleanColumn: +Lint/ConstantDefinitionInBlock: Enabled: false -Naming/PredicateMethod: +Lint/EmptyBlock: Enabled: false -Style/SafeNavigationChainLength: - Enabled: false \ No newline at end of file +Style/HashLikeCase: + Enabled: false diff --git a/.ruby-version b/.ruby-version index 9c25013dbb..37c2961c24 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.3.6 +2.7.2 diff --git a/Dockerfile b/Dockerfile index 5aad89e934..ad0a5e2e21 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,45 +1,65 @@ -FROM ruby:3.3.6-alpine3.20 AS base +FROM ruby:2.7.2-alpine AS base +# Set a variable for the install location. ARG RAILS_ROOT=/usr/src/app -ENV RAILS_ROOT=${RAILS_ROOT} -ARG RAILS_ENV -ENV RAILS_ENV=${RAILS_ENV:-production} -ARG NODE_ENV -ENV NODE_ENV=${RAILS_ENV} -ARG RAILS_LOG_TO_STDOUT -ENV RAILS_LOG_TO_STDOUT=${RAILS_LOG_TO_STDOUT:-true} -ARG RAILS_SERVE_STATIC_FILES -ENV RAILS_SERVE_STATIC_FILES=${RAILS_SERVE_STATIC_FILES:-true} -ARG PORT -ENV PORT=${PORT:-3000} -ARG VERSION_TAG -ENV VERSION_TAG=$VERSION_TAG -ENV PATH=$PATH:$RAILS_ROOT/bin +# Set Rails environment. +ENV RAILS_ENV production +ENV BUNDLE_APP_CONFIG="$RAILS_ROOT/.bundle" + +# Make the directory and set as working. +RUN mkdir -p $RAILS_ROOT WORKDIR $RAILS_ROOT -RUN bundle config --local deployment 'true' \ - && bundle config --local without 'development:test' -FROM base AS build +ARG BUILD_PACKAGES="build-base curl-dev git" +ARG DEV_PACKAGES="postgresql-dev sqlite-libs sqlite-dev yaml-dev zlib-dev nodejs yarn" +ARG RUBY_PACKAGES="tzdata" -ARG PACKAGES='alpine-sdk libpq-dev' -COPY Gemfile Gemfile.lock ./ +# Install app dependencies. RUN apk update \ - && apk add --update --no-cache ${PACKAGES} \ - && bundle install --no-cache \ - && bundle doctor + && apk upgrade \ + && apk add --update --no-cache $BUILD_PACKAGES $DEV_PACKAGES $RUBY_PACKAGES -FROM base AS prod +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.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 . . + +# Remove folders not needed in resulting image +RUN rm -rf tmp/cache spec + +############### Build step done ############### + +FROM ruby:2.7.2-alpine + +# Set a variable for the install location. +ARG RAILS_ROOT=/usr/src/app +ARG PACKAGES="tzdata curl postgresql-client sqlite-libs yarn nodejs bash" + +ENV RAILS_ENV=production +ENV BUNDLE_APP_CONFIG="$RAILS_ROOT/.bundle" + +WORKDIR $RAILS_ROOT -ARG PACKAGES='postgresql16-client libpq-dev tzdata imagemagick yarn bash jpeg-dev' -COPY --from=build $RAILS_ROOT/vendor/bundle ./vendor/bundle -COPY package.json yarn.lock ./ -RUN apk update \ - && apk add --update --no-cache ${PACKAGES} \ - && yarn install --production --frozen-lockfile \ - && yarn cache clean -COPY . ./ RUN apk update \ - && apk upgrade + && apk upgrade \ + && apk add --update --no-cache $PACKAGES + + +COPY --from=base $RAILS_ROOT $RAILS_ROOT + +# Expose port 80. +EXPOSE 80 + +# Sets the footer of greenlight application with current build version +ARG version_code +ENV VERSION_CODE=$version_code -EXPOSE ${PORT} -ENTRYPOINT [ "./bin/start" ] +# Start the application. +CMD ["bin/start"] diff --git a/Dockerfile.dev b/Dockerfile.dev deleted file mode 100644 index 554385cfea..0000000000 --- a/Dockerfile.dev +++ /dev/null @@ -1,75 +0,0 @@ -FROM alpine:3.17 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 \ - bash \ - shared-mime-info - -FROM base as builder -RUN apk add --no-cache \ - build-base \ - curl-dev \ - git \ - libxml2-dev \ - libxslt-dev \ - pkgconf \ - postgresql-dev \ - ruby-dev \ - nodejs \ - yarn \ - yaml-dev \ - zlib-dev \ - && ( 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' -RUN bundle install --deployment -j4 \ - && yarn install -RUN rm -rf vendor/bundle/ruby/*/cache -COPY . ./ - -FROM base -RUN apk add --no-cache \ - build-base \ - curl-dev \ - libxml2-dev \ - libxslt-dev \ - pkgconf \ - postgresql-dev \ - ruby-dev \ - nodejs \ - yarn \ - yaml-dev \ - zlib-dev \ - && ( echo 'install: --no-document' ; echo 'update: --no-document' ) >>/etc/gemrc -#USER greenlight:greenlight - -ARG RAILS_ENV -ENV RAILS_ENV=${RAILS_ENV:-production} -ARG RAILS_LOG_TO_STDOUT -ENV RAILS_LOG_TO_STDOUT=${RAILS_LOG_TO_STDOUT:-true} - -ARG VERSION_CODE -ENV VERSION_CODE=$VERSION_CODE - -RUN pwd -COPY --from=builder $RAILS_ROOT $RAILS_ROOT -RUN ls -al - -EXPOSE 3000 -CMD [ "./bin/start" ] -#ENTRYPOINT [ "./bin/start" ] - diff --git a/Gemfile b/Gemfile index 8f0887deb7..7bef8d15d2 100644 --- a/Gemfile +++ b/Gemfile @@ -1,67 +1,79 @@ # frozen_string_literal: true source 'https://rubygems.org' -git_source(:github) { |repo| "https://github.com/#{repo}.git" } -ruby '>= 3.3' +git_source(:github) do |repo_name| + repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") + "https://github.com/#{repo_name}.git" +end -gem 'active_model_serializers', '>= 0.10.15' -gem 'active_storage_validations', '>= 1.4.0' -gem 'aws-sdk-s3', require: false +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'aws-sdk-s3', '~> 1.88.1' gem 'bcrypt', '~> 3.1.7' -gem 'bigbluebutton-api-ruby', '2.0.0' -gem 'bootsnap', require: false -gem 'clamby', '~> 1.6.10' -gem 'cssbundling-rails', '>= 1.4.0' -gem 'data_migrate', '>= 11.3.0' -gem 'dotenv-rails', '>= 3.0.0' -gem 'google-cloud-storage', '~> 1.44', require: false -gem 'hcaptcha' -gem 'i18n-language-mapping' -gem 'image_processing', '~> 1.2' -gem 'jbuilder', '>= 2.12' -gem 'jsbundling-rails', '>= 1.3.0' -gem 'jwt' -gem 'mini_magick', '>= 4.9.5' -gem 'nkf', '~> 0.2.0' -gem 'omniauth', '~> 2.1.3' -gem 'omniauth_openid_connect', '>= 0.8.0' -gem 'omniauth-rails_csrf_protection', '~> 2.0.0' -gem 'pagy', '~> 6.0', '>= 6.0.0' -gem 'pg' -gem 'puma', '~> 6.4' -gem 'rails', '~> 7.2.3' -gem 'redis', '~> 4.8.0' -gem 'sprockets-rails', '>= 3.5.1' -gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] +gem 'bigbluebutton-api-ruby', git: 'https://github.com/mconf/bigbluebutton-api-ruby.git', branch: 'master' +gem 'bn-ldap-authentication', '~> 0.1.4' +gem 'bootsnap', '~> 1.7.2', require: false +gem 'bootstrap', '~> 4.3.1' +gem 'cancancan', '~> 2.3.0' +gem 'coveralls', '~> 0.8.23', require: false +gem 'font-awesome-sass', '~> 5.9.0' +gem 'google-cloud-storage', '~> 1.30.0' +gem 'http_accept_language', '~> 2.1.1' +gem 'i18n-language-mapping', '~> 0.1.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 :development, :test do - gem 'debug', platforms: %i[mri mingw x64_mingw] +group :production do + gem 'hiredis', '~> 0.6.3' + gem "lograge", '~> 0.11.2' + gem 'pg', '~> 0.18' + gem 'redis', '~> 4.2.5' + gem 'sequel', '~> 5.41.0' end -group :development do - gem 'rubocop', '~> 1.26', require: false - gem 'rubocop-capybara', '~> 2.19.0', require: false - gem 'rubocop-factory_bot', '~> 2.24.0', require: false - gem 'rubocop-performance', '~> 1.13', require: false - gem 'rubocop-rails', '~> 2.21', '>= 2.21.0', require: false - gem 'rubocop-rspec', '~> 2.9.0', require: false - gem 'web-console', '>= 4.2.1' +group :development, :test do + gem 'byebug', '~> 11.1', platform: :mri + gem 'dotenv-rails', '~> 2.7' end group :test do - gem 'capybara', '>= 3.39.0' - gem 'factory_bot', '>= 6.4.1' - gem 'factory_bot_rails', '>= 6.4.4' - gem 'faker' - gem 'rspec-rails', '~> 7.1', '>= 7.1.1' - gem 'selenium-webdriver' - gem 'shoulda-matchers', '~> 5.0' - gem 'webdrivers' - gem 'webmock', '>= 3.23.1' + 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 'shoulda-matchers', '~> 3.1' + gem 'webmock', '~> 3.11' end -group :production do - gem 'lograge', '~> 0.14.0' - gem 'remote_syslog_logger' +group :development do + gem 'listen', '~> 3.0' + gem 'spring', '~> 2.1' + gem 'spring-watcher-listen', '~> 2.0' + gem 'web-console', '~> 3.7' end diff --git a/Gemfile.lock b/Gemfile.lock index f3c88a7611..a77a0bfbc6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,578 +1,521 @@ +GIT + remote: https://github.com/blindsidenetworks/tabler-rubygem.git + revision: 4c16e6dc930f6b92dec093abaf9652d768b46d97 + tag: 0.1.4.1 + specs: + tabler-rubygem (0.1.4.1) + autoprefixer-rails (>= 6.0.3) + +GIT + remote: https://github.com/mconf/bigbluebutton-api-ruby.git + revision: 91dc495324a6b7e162773227ec3650f8a5b39c50 + branch: master + specs: + bigbluebutton-api-ruby (1.7.0) + childprocess (>= 1.0.1) + ffi (>= 1.9.24) + json (>= 1.8.6) + nokogiri (>= 1.10.4) + rack (>= 1.6.11) + rubyzip (>= 1.3.0) + xml-simple (~> 1.1) + GEM remote: https://rubygems.org/ specs: - actioncable (7.2.3) - actionpack (= 7.2.3) - activesupport (= 7.2.3) + action-cable-testing (0.6.1) + actioncable (>= 5.0) + actioncable (5.2.6) + actionpack (= 5.2.6) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - zeitwerk (~> 2.6) - actionmailbox (7.2.3) - actionpack (= 7.2.3) - activejob (= 7.2.3) - activerecord (= 7.2.3) - activestorage (= 7.2.3) - activesupport (= 7.2.3) - mail (>= 2.8.0) - actionmailer (7.2.3) - actionpack (= 7.2.3) - actionview (= 7.2.3) - activejob (= 7.2.3) - activesupport (= 7.2.3) - mail (>= 2.8.0) - rails-dom-testing (~> 2.2) - actionpack (7.2.3) - actionview (= 7.2.3) - activesupport (= 7.2.3) - cgi - nokogiri (>= 1.8.5) - racc - rack (>= 2.2.4, < 3.3) - rack-session (>= 1.0.1) + 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.6) + actionview (= 5.2.6) + activesupport (= 5.2.6) + rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) - rails-dom-testing (~> 2.2) - rails-html-sanitizer (~> 1.6) - useragent (~> 0.16) - actiontext (7.2.3) - actionpack (= 7.2.3) - activerecord (= 7.2.3) - activestorage (= 7.2.3) - activesupport (= 7.2.3) - globalid (>= 0.6.0) - nokogiri (>= 1.8.5) - actionview (7.2.3) - activesupport (= 7.2.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.2.6) + activesupport (= 5.2.6) builder (~> 3.1) - cgi - erubi (~> 1.11) - rails-dom-testing (~> 2.2) - rails-html-sanitizer (~> 1.6) - active_model_serializers (0.10.15) - actionpack (>= 4.1) - activemodel (>= 4.1) - case_transform (>= 0.2) - jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - active_storage_validations (3.0.2) - activejob (>= 6.1.4) - activemodel (>= 6.1.4) - activestorage (>= 6.1.4) - activesupport (>= 6.1.4) - marcel (>= 1.0.3) - activejob (7.2.3) - activesupport (= 7.2.3) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.2.6) + activesupport (= 5.2.6) globalid (>= 0.3.6) - activemodel (7.2.3) - activesupport (= 7.2.3) - activerecord (7.2.3) - activemodel (= 7.2.3) - activesupport (= 7.2.3) - timeout (>= 0.4.0) - activestorage (7.2.3) - actionpack (= 7.2.3) - activejob (= 7.2.3) - activerecord (= 7.2.3) - activesupport (= 7.2.3) - marcel (~> 1.0) - activesupport (7.2.3) - base64 - benchmark (>= 0.3) - bigdecimal - concurrent-ruby (~> 1.0, >= 1.3.1) - connection_pool (>= 2.2.5) - drb - i18n (>= 1.6, < 2) - logger (>= 1.4.2) - minitest (>= 5.1) - securerandom (>= 0.3) - tzinfo (~> 2.0, >= 2.0.5) - addressable (2.8.8) - public_suffix (>= 2.0.2, < 8.0) + 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.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) + public_suffix (>= 2.0.2, < 5.0) aes_key_wrap (1.1.0) - ast (2.4.3) - attr_required (1.0.2) - aws-eventstream (1.2.0) - aws-partitions (1.708.0) - aws-sdk-core (3.170.0) + arel (9.0.0) + ast (2.4.2) + attr_required (1.0.1) + autoprefixer-rails (10.2.4.0) + execjs + 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.651.0) - aws-sigv4 (~> 1.5) - jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.62.0) - aws-sdk-core (~> 3, >= 3.165.0) + aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.119.0) - aws-sdk-core (~> 3, >= 3.165.0) + jmespath (~> 1.0) + aws-sdk-kms (1.43.0) + aws-sdk-core (~> 3, >= 3.112.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.88.2) + aws-sdk-core (~> 3, >= 3.112.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.4) - aws-sigv4 (1.5.2) + aws-sigv4 (~> 1.1) + aws-sigv4 (1.2.3) aws-eventstream (~> 1, >= 1.0.2) - base64 (0.3.0) - bcrypt (3.1.18) - benchmark (0.5.0) - bigbluebutton-api-ruby (2.0.0) - base64 (>= 0.1.0) - xml-simple (~> 1.1) - bigdecimal (3.3.1) - bindata (2.5.1) + bcrypt (3.1.16) + bindata (2.4.8) bindex (0.8.1) - bootsnap (1.16.0) - msgpack (~> 1.2) - builder (3.3.0) - capybara (3.40.0) - addressable - matrix - mini_mime (>= 0.1.3) - nokogiri (~> 1.11) - rack (>= 1.6.0) - rack-test (>= 0.6.3) - regexp_parser (>= 1.5, < 3.0) - xpath (~> 3.2) - case_transform (0.2) - activesupport - cgi (0.5.0) - clamby (1.6.10) - concurrent-ruby (1.3.5) - connection_pool (2.5.5) - crack (1.0.0) - bigdecimal + bn-ldap-authentication (0.1.4) + net-ldap (~> 0) + bootsnap (1.7.3) + msgpack (~> 1.0) + bootstrap (4.3.1) + autoprefixer-rails (>= 9.1.0) + popper_js (>= 1.14.3, < 2) + sassc-rails (>= 2.0.0) + builder (3.2.4) + byebug (11.1.3) + cancancan (2.3.0) + childprocess (4.0.0) + 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.5) rexml crass (1.0.6) - cssbundling-rails (1.4.3) - railties (>= 6.0.0) - data_migrate (11.3.1) - activerecord (>= 6.1) - railties (>= 6.1) - date (3.5.0) - debug (1.11.0) - irb (~> 1.10) - reline (>= 0.3.8) declarative (0.0.20) - diff-lcs (1.6.2) - digest-crc (0.6.5) + declarative-option (0.1.0) + diff-lcs (1.4.4) + digest-crc (0.6.3) rake (>= 12.0.0, < 14.0.0) - dotenv (3.2.0) - dotenv-rails (3.2.0) - dotenv (= 3.2.0) - railties (>= 6.1) - drb (2.2.3) - email_validator (2.2.4) - activemodel - erb (6.0.0) - erubi (1.13.1) - factory_bot (6.5.6) - activesupport (>= 6.1.0) - factory_bot_rails (6.5.1) - factory_bot (~> 6.5) - railties (>= 6.1.0) - faker (3.1.1) - i18n (>= 1.8.11, < 2) - faraday (2.14.0) - faraday-net_http (>= 2.0, < 3.5) - json - logger - faraday-follow_redirects (0.4.0) - faraday (>= 1, < 3) - faraday-net_http (3.4.2) - net-http (~> 0.5) - ffi (1.17.2) - ffi (1.17.2-x86_64-linux-gnu) - globalid (1.3.0) - activesupport (>= 6.1) - google-apis-core (0.11.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 (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.3.0) + faraday-net_http (~> 1.0) + multipart-post (>= 1.2, < 3) + 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-apis-core (0.3.0) addressable (~> 2.5, >= 2.5.1) - googleauth (>= 0.16.2, < 2.a) - httpclient (>= 2.8.1, < 3.a) + googleauth (~> 0.14) + httpclient (>= 2.8.1, < 3.0) mini_mime (~> 1.0) representable (~> 3.0) - retriable (>= 2.0, < 4.a) + retriable (>= 2.0, < 4.0) rexml + signet (~> 0.14) webrick - google-apis-iamcredentials_v1 (0.17.0) - google-apis-core (>= 0.11.0, < 2.a) - google-apis-storage_v1 (0.19.0) - google-apis-core (>= 0.9.0, < 2.a) + 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.6.0) - faraday (>= 0.17.3, < 3.0) - google-cloud-errors (1.3.1) - google-cloud-storage (1.44.0) - addressable (~> 2.8) + google-cloud-env (1.5.0) + faraday (>= 0.17.3, < 2.0) + google-cloud-errors (1.1.0) + google-cloud-storage (1.30.0) + addressable (~> 2.5) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.19.0) - google-cloud-core (~> 1.6) - googleauth (>= 0.16.2, < 2.a) + google-apis-storage_v1 (~> 0.1) + google-cloud-core (~> 1.2) + googleauth (~> 0.9) mini_mime (~> 1.0) - googleauth (1.6.0) - faraday (>= 0.17.3, < 3.a) + googleauth (0.16.0) + faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) - signet (>= 0.16, < 2.a) - hashdiff (1.1.2) - hashie (5.0.0) - hcaptcha (7.1.0) - json - httpclient (2.9.0) - mutex_m - i18n (1.14.7) + signet (~> 0.14) + hashdiff (1.0.1) + hashie (4.1.0) + hiredis (0.6.3) + http_accept_language (2.1.1) + httpclient (2.8.3) + i18n (1.8.10) concurrent-ruby (~> 1.0) - i18n-language-mapping (0.1.3.1) - image_processing (1.12.2) - mini_magick (>= 4.9.5, < 5) - ruby-vips (>= 2.0.17, < 3) - io-console (0.8.1) - irb (1.15.3) - pp (>= 0.6.0) - rdoc (>= 4.0.0) - reline (>= 0.4.2) - jbuilder (2.13.0) - actionview (>= 5.0.0) + i18n-language-mapping (0.1.2) + jbuilder (2.11.2) activesupport (>= 5.0.0) - jmespath (1.6.2) - jsbundling-rails (1.3.1) - railties (>= 6.0.0) - json (2.17.0) - json-jwt (1.17.0) + jmespath (1.4.0) + jquery-rails (4.4.0) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + jquery-ui-rails (6.0.1) + railties (>= 3.2.16) + json (2.5.1) + json-jwt (1.13.0) activesupport (>= 4.2) aes_key_wrap - base64 bindata - faraday (~> 2.0) - faraday-follow_redirects - jsonapi-renderer (0.2.2) - jwt (2.7.0) - language_server-protocol (3.17.0.5) - lint_roller (1.1.0) - logger (1.7.0) - lograge (0.14.0) + 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.24.1) + loofah (2.9.1) crass (~> 1.0.2) - nokogiri (>= 1.12.0) - mail (2.9.0) - logger + nokogiri (>= 1.5.9) + mail (2.7.1) mini_mime (>= 0.1.1) - net-imap - net-pop - net-smtp - marcel (1.1.0) - matrix (0.4.3) + marcel (1.0.1) memoist (0.16.2) - mini_magick (4.12.0) - mini_mime (1.1.5) - mini_portile2 (2.8.9) - minitest (5.26.2) - msgpack (1.6.0) + method_source (1.0.0) + mini_mime (1.1.0) + mini_portile2 (2.5.1) + minitest (5.14.4) + msgpack (1.4.2) multi_json (1.15.0) - mutex_m (0.3.0) - net-http (0.8.0) - uri (>= 0.11.1) - net-imap (0.5.12) - date - net-protocol - net-pop (0.1.2) - net-protocol - net-protocol (0.2.2) - timeout - net-smtp (0.5.1) - net-protocol - nio4r (2.7.5) - nkf (0.2.0) - nokogiri (1.18.10) - mini_portile2 (~> 2.8.2) + multi_xml (0.6.0) + multipart-post (2.1.1) + net-ldap (0.17.0) + nio4r (2.5.7) + nokogiri (1.11.4) + mini_portile2 (~> 2.5.0) racc (~> 1.4) - nokogiri (1.18.10-x86_64-linux-gnu) - racc (~> 1.4) - omniauth (2.1.4) + oauth (0.5.5) + oauth2 (1.4.7) + faraday (>= 0.8, < 2.0) + jwt (>= 1.0, < 3.0) + multi_json (~> 1.3) + multi_xml (~> 0.5) + rack (>= 1.2, < 3) + omniauth (1.9.1) hashie (>= 3.4.6) - logger - rack (>= 2.2.3) - rack-protection - omniauth-rails_csrf_protection (2.0.0) - actionpack (>= 4.2) - omniauth (~> 2.0) - omniauth_openid_connect (0.8.0) - omniauth (>= 1.9, < 3) - openid_connect (~> 2.2) - openid_connect (2.3.1) + rack (>= 1.6.2, < 3) + omniauth-bn-launcher (0.1.3) + omniauth (~> 1.3, >= 1.3.2) + omniauth-oauth2 (= 1.5.0) + omniauth-bn-office365 (0.1.1) + omniauth (>= 1.3.2) + omniauth-oauth2 (>= 1.5.0) + omniauth-google-oauth2 (0.7.0) + jwt (>= 2.0) + omniauth (>= 1.1.1) + omniauth-oauth2 (>= 1.5) + omniauth-oauth (1.2.0) + oauth + omniauth (>= 1.0, < 3) + omniauth-oauth2 (1.5.0) + oauth2 (~> 1.1) + omniauth (~> 1.2) + omniauth-twitter (1.4.0) + omniauth-oauth (~> 1.1) + rack + omniauth_openid_connect (0.3.5) + addressable (~> 2.5) + omniauth (~> 1.9) + openid_connect (~> 1.1) + openid_connect (1.2.0) activemodel attr_required (>= 1.0.0) - email_validator - faraday (~> 2.0) - faraday-follow_redirects - json-jwt (>= 1.16) - mail - rack-oauth2 (~> 2.2) - swd (~> 2.0) + json-jwt (>= 1.5.0) + rack-oauth2 (>= 1.6.1) + swd (>= 1.0.0) tzinfo + validate_email validate_url - webfinger (~> 2.0) - os (1.1.4) - pagy (6.0.4) - parallel (1.27.0) - parser (3.3.10.0) + webfinger (>= 1.0.1) + os (1.1.1) + pagy (3.11.0) + parallel (1.20.1) + parser (3.0.0.0) ast (~> 2.4.1) - racc - pg (1.4.5) - pp (0.6.3) - prettyprint - prettyprint (0.2.0) - prism (1.6.0) - psych (5.2.6) - date - stringio - public_suffix (7.0.0) - puma (6.5.0) + 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.6) + puma (4.3.8) nio4r (~> 2.0) - racc (1.8.1) - rack (3.2.4) - rack-oauth2 (2.3.0) + racc (1.5.2) + rack (2.2.3) + rack-oauth2 (1.16.0) activesupport attr_required - faraday (~> 2.0) - faraday-follow_redirects + httpclient json-jwt (>= 1.11.0) rack (>= 2.1.0) - rack-protection (4.2.1) - base64 (>= 0.1.0) - logger (>= 1.6.0) - rack (>= 3.0.0, < 4) - rack-session (2.1.1) - base64 (>= 0.1.0) - rack (>= 3.0.0) - rack-test (2.2.0) - rack (>= 1.3) - rackup (2.2.1) - rack (>= 3) - rails (7.2.3) - actioncable (= 7.2.3) - actionmailbox (= 7.2.3) - actionmailer (= 7.2.3) - actionpack (= 7.2.3) - actiontext (= 7.2.3) - actionview (= 7.2.3) - activejob (= 7.2.3) - activemodel (= 7.2.3) - activerecord (= 7.2.3) - activestorage (= 7.2.3) - activesupport (= 7.2.3) - bundler (>= 1.15.0) - railties (= 7.2.3) - rails-dom-testing (2.3.0) - activesupport (>= 5.0.0) - minitest + rack-test (1.1.0) + rack (>= 1.0, < 3) + 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.6) + sprockets-rails (>= 2.0.0) + 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.6.2) - loofah (~> 2.21) - nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (7.2.3) - actionpack (= 7.2.3) - activesupport (= 7.2.3) - cgi - irb (~> 1.13) - rackup (>= 1.0.0) - rake (>= 12.2) - thor (~> 1.0, >= 1.2.2) - tsort (>= 0.2) - zeitwerk (~> 2.6) - rainbow (3.1.1) - rake (13.3.1) - rdoc (6.16.1) - erb - psych (>= 4.0.0) - tsort - redis (4.8.0) - regexp_parser (2.11.3) - reline (0.6.3) - io-console (~> 0.5) + rails-html-sanitizer (1.3.0) + loofah (~> 2.3) + 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.3) + random_password (0.1.1) + rb-fsevent (0.10.4) + rb-inotify (0.10.1) + ffi (~> 1.0) + recaptcha (5.7.0) + json + redcarpet (3.5.1) + redis (4.2.5) + regexp_parser (2.1.1) remote_syslog_logger (1.0.4) syslog_protocol - representable (3.2.0) + representable (3.0.4) declarative (< 0.1.0) - trailblazer-option (>= 0.1.1, < 0.2.0) + declarative-option (< 0.2.0) uber (< 0.2.0) - request_store (1.5.1) + request_store (1.5.0) rack (>= 1.4) retriable (3.1.2) - rexml (3.4.4) - rspec-core (3.13.6) - rspec-support (~> 3.13.0) - rspec-expectations (3.13.5) + rexml (3.2.5) + rspec-core (3.9.3) + rspec-support (~> 3.9.3) + rspec-expectations (3.9.4) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.13.0) - rspec-mocks (3.13.7) + rspec-support (~> 3.9.0) + rspec-mocks (3.9.1) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.13.0) - rspec-rails (7.1.1) - actionpack (>= 7.0) - activesupport (>= 7.0) - railties (>= 7.0) - rspec-core (~> 3.13) - rspec-expectations (~> 3.13) - rspec-mocks (~> 3.13) - rspec-support (~> 3.13) - rspec-support (3.13.6) - rubocop (1.81.7) - json (~> 2.3) - language_server-protocol (~> 3.17.0.2) - lint_roller (~> 1.1.0) + rspec-support (~> 3.9.0) + rspec-rails (3.9.1) + actionpack (>= 3.0) + activesupport (>= 3.0) + railties (>= 3.0) + rspec-core (~> 3.9.0) + rspec-expectations (~> 3.9.0) + rspec-mocks (~> 3.9.0) + rspec-support (~> 3.9.0) + rspec-support (3.9.4) + rubocop (1.10.0) parallel (~> 1.10) - parser (>= 3.3.0.2) + parser (>= 3.0.0.0) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 2.9.3, < 3.0) - rubocop-ast (>= 1.47.1, < 2.0) + regexp_parser (>= 1.8, < 3.0) + rexml + rubocop-ast (>= 1.2.0, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.48.0) - parser (>= 3.3.7.2) - prism (~> 1.4) - rubocop-capybara (2.19.0) - rubocop (~> 1.41) - rubocop-factory_bot (2.24.0) - rubocop (~> 1.33) - rubocop-performance (1.16.0) - rubocop (>= 1.7.0, < 2.0) - rubocop-ast (>= 0.4.0) - rubocop-rails (2.34.2) - activesupport (>= 4.2.0) - lint_roller (~> 1.1) - rack (>= 1.1) - rubocop (>= 1.75.0, < 2.0) - rubocop-ast (>= 1.44.0, < 2.0) - rubocop-rspec (2.9.0) - rubocop (~> 1.19) - ruby-progressbar (1.13.0) - ruby-vips (2.1.4) - ffi (~> 1.12) - rubyzip (2.4.1) - securerandom (0.4.1) - selenium-webdriver (4.8.0) - rexml (~> 3.2, >= 3.2.5) - rubyzip (>= 1.2.2, < 3.0) - websocket (~> 1.0) - shoulda-matchers (5.3.0) - activesupport (>= 5.2.0) - signet (0.17.0) - addressable (~> 2.8) - faraday (>= 0.17.5, < 3.a) + 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) + sassc (2.4.0) + ffi (~> 1.9) + sassc-rails (2.1.2) + railties (>= 4.0.0) + sassc (>= 2.0) + sprockets (> 3.0) + sprockets-rails + tilt + sequel (5.41.0) + shoulda-matchers (3.1.3) + activesupport (>= 4.0.0) + signet (0.15.0) + addressable (~> 2.3) + faraday (>= 0.17.3, < 2.0) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - sprockets (4.2.2) + simplecov (0.16.1) + docile (~> 1.1) + json (>= 1.8, < 3) + simplecov-html (~> 0.10.0) + simplecov-html (0.10.2) + spring (2.1.1) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (3.7.2) concurrent-ruby (~> 1.0) - logger - rack (>= 2.2.4, < 4) - sprockets-rails (3.5.2) - actionpack (>= 6.1) - activesupport (>= 6.1) + rack (> 1, < 3) + sprockets-rails (3.2.2) + actionpack (>= 4.0) + activesupport (>= 4.0) sprockets (>= 3.0.0) - stringio (3.1.9) - swd (2.0.3) + sqlite3 (1.3.13) + swd (1.2.0) activesupport (>= 3) attr_required (>= 0.0.5) - faraday (~> 2.0) - faraday-follow_redirects + httpclient (>= 2.4) + sync (0.5.0) syslog_protocol (0.9.2) - thor (1.4.0) - timeout (0.4.4) - trailblazer-option (0.1.2) - tsort (0.2.0) - tzinfo (2.0.6) - concurrent-ruby (~> 1.0) + term-ansicolor (1.7.1) + tins (~> 1.0) + thor (1.1.0) + thread_safe (0.3.6) + tilt (2.0.10) + tins (1.28.0) + sync + turbolinks (5.2.1) + turbolinks-source (~> 5.2) + turbolinks-source (5.2.0) + tzinfo (1.2.9) + thread_safe (~> 0.1) + tzinfo-data (1.2021.1) + tzinfo (>= 1.0.0) uber (0.1.0) - unicode-display_width (3.2.0) - unicode-emoji (~> 4.1) - unicode-emoji (4.1.0) - uri (1.1.1) - useragent (0.16.11) - validate_url (1.0.15) + uglifier (4.2.0) + execjs (>= 0.3.0, < 3) + unicode-display_width (2.0.0) + validate_email (0.1.6) + activemodel (>= 3.0) + mail (>= 2.2.5) + validate_url (1.0.13) activemodel (>= 3.0.0) public_suffix - web-console (4.2.1) - actionview (>= 6.0.0) - activemodel (>= 6.0.0) + web-console (3.7.0) + actionview (>= 5.0) + activemodel (>= 5.0) bindex (>= 0.4.0) - railties (>= 6.0.0) - webdrivers (5.2.0) - nokogiri (~> 1.6) - rubyzip (>= 1.3.0) - selenium-webdriver (~> 4.0) - webfinger (2.1.3) + railties (>= 5.0) + webfinger (1.1.0) activesupport - faraday (~> 2.0) - faraday-follow_redirects - webmock (3.24.0) - addressable (>= 2.8.0) + httpclient (>= 2.4) + webmock (3.12.1) + addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - webrick (1.8.2) - websocket (1.2.9) - websocket-driver (0.8.0) - base64 + webrick (1.7.0) + websocket-driver (0.7.3) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - xml-simple (1.1.9) - rexml - xpath (3.2.0) - nokogiri (~> 1.8) - zeitwerk (2.7.3) + xml-simple (1.1.8) PLATFORMS ruby - x86_64-linux DEPENDENCIES - active_model_serializers (>= 0.10.15) - active_storage_validations (>= 1.4.0) - aws-sdk-s3 + action-cable-testing (~> 0.6) + aws-sdk-s3 (~> 1.88.1) bcrypt (~> 3.1.7) - bigbluebutton-api-ruby (= 2.0.0) - bootsnap - capybara (>= 3.39.0) - clamby (~> 1.6.10) - cssbundling-rails (>= 1.4.0) - data_migrate (>= 11.3.0) - debug - dotenv-rails (>= 3.0.0) - factory_bot (>= 6.4.1) - factory_bot_rails (>= 6.4.4) - faker - google-cloud-storage (~> 1.44) - hcaptcha - i18n-language-mapping - image_processing (~> 1.2) - jbuilder (>= 2.12) - jsbundling-rails (>= 1.3.0) - jwt - lograge (~> 0.14.0) - mini_magick (>= 4.9.5) - nkf (~> 0.2.0) - omniauth (~> 2.1.3) - omniauth-rails_csrf_protection (~> 2.0.0) - omniauth_openid_connect (>= 0.8.0) - pagy (~> 6.0, >= 6.0.0) - pg - puma (~> 6.4) - rails (~> 7.2.3) - redis (~> 4.8.0) - remote_syslog_logger - rspec-rails (~> 7.1, >= 7.1.1) - rubocop (~> 1.26) - rubocop-capybara (~> 2.19.0) - rubocop-factory_bot (~> 2.24.0) - rubocop-performance (~> 1.13) - rubocop-rails (~> 2.21, >= 2.21.0) - rubocop-rspec (~> 2.9.0) - selenium-webdriver - shoulda-matchers (~> 5.0) - sprockets-rails (>= 3.5.1) - tzinfo-data - web-console (>= 4.2.1) - webdrivers - webmock (>= 3.23.1) + bigbluebutton-api-ruby! + bn-ldap-authentication (~> 0.1.4) + bootsnap (~> 1.7.2) + bootstrap (~> 4.3.1) + 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.30.0) + hiredis (~> 0.6.3) + http_accept_language (~> 2.1.1) + i18n-language-mapping (~> 0.1.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 (~> 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 (~> 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 (~> 1.10.0) + sassc-rails (~> 2.1.2) + sequel (~> 5.41.0) + shoulda-matchers (~> 3.1) + spring (~> 2.1) + spring-watcher-listen (~> 2.0) + sprockets (~> 3.7.2) + sqlite3 (~> 1.3.6) + tabler-rubygem! + turbolinks (~> 5.2.1) + tzinfo-data (~> 1.2021.1) + uglifier (~> 4.2.0) + web-console (~> 3.7) + webmock (~> 3.11) diff --git a/LICENSE b/LICENSE index 153d416dc8..0a041280bd 100644 --- a/LICENSE +++ b/LICENSE @@ -162,4 +162,4 @@ General Public License ever published by the Free Software Foundation. whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the -Library. \ No newline at end of file +Library. diff --git a/Procfile.dev b/Procfile.dev deleted file mode 100644 index dd4cd2117d..0000000000 --- a/Procfile.dev +++ /dev/null @@ -1,3 +0,0 @@ -web: bin/rails server -p $PORT -js: yarn build:development -css: yarn build:development:css --watch \ No newline at end of file diff --git a/README.md b/README.md index a9f043f087..f94a8966f9 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,37 @@ -bbb-greenlight-banner - # Greenlight +![Coverage +!Status](https://coveralls.io/repos/github/bigbluebutton/greenlight/badge.svg?branch=master) ![Docker Pulls](https://img.shields.io/docker/pulls/bigbluebutton/greenlight.svg) -Greenlight is an open-source, LGPL-3.0 licensed web application that allows organizations to quickly set up a complete web conferencing platform using their existing BigBlueButton server. It is user-friendly for both regular and advanced users. +Greenlight is a simple front-end interface for your BigBlueButton server. At its heart, Greenlight provides a minimalistic web-based application that allows users to: + + * Signup/Login with Google, Office365, OpenID Connect, or through the application itself. + * Manage your account settings and user preferences. + * Create and manage your own personal rooms ([BigBlueButton](https://github.com/bigbluebutton/bigbluebutton) sessions). + * Invite others to your room using a simple URL. + * View recordings and share them with others. + +Interested? Try Greenlight out on our [demo server](https://demo.bigbluebutton.org/gl)! -Greenlight v3, the latest version, is constructed with the cutting-edge versions of Ruby on Rails and React - a robust technology stack adopted by millions of projects and trusted by major corporations worldwide. +Greenlight is also completely configurable. This means you can turn on/off features to make Greenlight fit your specific use case. For more information on Greenlight and its features, see our [documentation](http://docs.bigbluebutton.org/greenlight/gl-install.html). -Interested? Try Greenlight v3 out on our [demo server](https://demo.bigbluebutton.org/)! +For a overview of how Greenlight works, checkout our Introduction to Greenlight Video: -## Installation +[![GreenLight Overview](https://img.youtube.com/vi/Hso8yLzkqj8/0.jpg)](https://youtu.be/Hso8yLzkqj8) -To install and configure Greenlight v3, please follow the instructions [here](https://docs.bigbluebutton.org/greenlight/v3/install). +## Installation on a BigBlueButton Server + +Greenlight is designed to work on a [BigBlueButton 2.0](https://github.com/bigbluebutton/bigbluebutton) (or later) server. + +For information on installing Greenlight, checkout our [Installing Greenlight on a BigBlueButton Server](http://docs.bigbluebutton.org/greenlight/gl-install.html#installing-on-a-bigbluebutton-server) documentation. ## Source Code & Contributing +Greenlight is built using Ruby on Rails. Many developers already know Rails well, and we wanted to create both a full front-end to BigBlueButton but also a reference implementation of how to fully leverage the [BigBlueButton API](http://docs.bigbluebutton.org/dev/api.html). + 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 [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. +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/Rakefile b/Rakefile index 488c551fee..92772ad02b 100644 --- a/Rakefile +++ b/Rakefile @@ -4,5 +4,12 @@ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require_relative 'config/application' +require 'rake/testtask' + +Rake::TestTask.new do |t| + t.libs << "test" + t.test_files = FileList['test/test*.rb'] + t.verbose = true +end Rails.application.load_tasks diff --git a/SECURITY.md b/SECURITY.md index af2480caf9..84a6e13aad 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,23 +2,10 @@ ## Supported Versions -We actively support Greenlight through the community forums and through security updates. - -| Version | Supported | -|---------| ------------------ | -| v1.x | :x: | -| v2.x | :x: | -| v3.x | :white_check_mark: | -| > v3.x | :x: | - -Since we released v3 to the community all our support efforts are now transitioned to the subsequent releases v3.x. - -All the releases are managed as a Cloud version where release tags are used only as a reference. As such, we highly recommend that all administrators deploy the latest available release. +We support only the latest version of this project. ## Reporting a Vulnerability -If you believe you have found a security vulnerability in BigBlueButton or Greenlight, we ask that you do a [responsible disclosure](https://en.wikipedia.org/wiki/Responsible_disclosure) and e-mail us directly at `security@bigbluebutton.org` with as much detail as possible. +If you think you’ve found a security issue with BigBlueButton or Greenlight, we ask that you do a [responsible disclosure](https://en.wikipedia.org/wiki/Responsible_disclosure) and e-mail us directly at security@bigbluebutton.org. We will respond to you quickly, work with you to examine the scope of the issue, and give priority to fixing it as soon as possible. - -Regards,... BigBlueButton Team diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js index adfb864c27..a199a9af68 100644 --- a/app/assets/config/manifest.js +++ b/app/assets/config/manifest.js @@ -1,19 +1,19 @@ // BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. // -// Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +// 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. // -// Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +// 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 Greenlight; if not, see . +// with BigBlueButton; if not, see . //= link_tree ../images -//= link_tree ../builds -//= link_tree ../locales +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css diff --git a/app/assets/fonts/Inter-Black.ttf b/app/assets/fonts/Inter-Black.ttf deleted file mode 100644 index 5aecf7dc41..0000000000 Binary files a/app/assets/fonts/Inter-Black.ttf and /dev/null differ diff --git a/app/assets/fonts/Inter-Bold.ttf b/app/assets/fonts/Inter-Bold.ttf deleted file mode 100644 index 8e82c70d10..0000000000 Binary files a/app/assets/fonts/Inter-Bold.ttf and /dev/null differ diff --git a/app/assets/fonts/Inter-ExtraBold.ttf b/app/assets/fonts/Inter-ExtraBold.ttf deleted file mode 100644 index cb4b8217fc..0000000000 Binary files a/app/assets/fonts/Inter-ExtraBold.ttf and /dev/null differ diff --git a/app/assets/fonts/Inter-ExtraLight.ttf b/app/assets/fonts/Inter-ExtraLight.ttf deleted file mode 100644 index 64aee30a4e..0000000000 Binary files a/app/assets/fonts/Inter-ExtraLight.ttf and /dev/null differ diff --git a/app/assets/fonts/Inter-Light.ttf b/app/assets/fonts/Inter-Light.ttf deleted file mode 100644 index 9e265d8905..0000000000 Binary files a/app/assets/fonts/Inter-Light.ttf and /dev/null differ diff --git a/app/assets/fonts/Inter-Medium.ttf b/app/assets/fonts/Inter-Medium.ttf deleted file mode 100644 index b53fb1c4ac..0000000000 Binary files a/app/assets/fonts/Inter-Medium.ttf and /dev/null differ diff --git a/app/assets/fonts/Inter-Regular.ttf b/app/assets/fonts/Inter-Regular.ttf deleted file mode 100644 index 8d4eebf206..0000000000 Binary files a/app/assets/fonts/Inter-Regular.ttf and /dev/null differ diff --git a/app/assets/fonts/Inter-SemiBold.ttf b/app/assets/fonts/Inter-SemiBold.ttf deleted file mode 100644 index c6aeeb16a6..0000000000 Binary files a/app/assets/fonts/Inter-SemiBold.ttf and /dev/null differ diff --git a/app/assets/fonts/Inter-Thin.ttf b/app/assets/fonts/Inter-Thin.ttf deleted file mode 100644 index 7aed55d560..0000000000 Binary files a/app/assets/fonts/Inter-Thin.ttf and /dev/null differ diff --git a/app/assets/fonts/SourceSansPro/OFL.txt b/app/assets/fonts/SourceSansPro/OFL.txt new file mode 100644 index 0000000000..72d81ab3b8 --- /dev/null +++ b/app/assets/fonts/SourceSansPro/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012, 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name ‘Source’. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/app/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf b/app/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf new file mode 100644 index 0000000000..1f430e2383 Binary files /dev/null and b/app/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf differ diff --git a/app/assets/fonts/SourceSansPro/SourceSansPro-BoldItalic.ttf b/app/assets/fonts/SourceSansPro/SourceSansPro-BoldItalic.ttf new file mode 100644 index 0000000000..98089fd351 Binary files /dev/null and b/app/assets/fonts/SourceSansPro/SourceSansPro-BoldItalic.ttf differ diff --git a/app/assets/fonts/SourceSansPro/SourceSansPro-Italic.ttf b/app/assets/fonts/SourceSansPro/SourceSansPro-Italic.ttf new file mode 100644 index 0000000000..e7b9182d17 Binary files /dev/null and b/app/assets/fonts/SourceSansPro/SourceSansPro-Italic.ttf differ diff --git a/app/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf b/app/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf new file mode 100644 index 0000000000..348871ac6b Binary files /dev/null and b/app/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf differ diff --git a/app/assets/fonts/SourceSansPro/SourceSansPro-LightItalic.ttf b/app/assets/fonts/SourceSansPro/SourceSansPro-LightItalic.ttf new file mode 100644 index 0000000000..989dc8e8f1 Binary files /dev/null and b/app/assets/fonts/SourceSansPro/SourceSansPro-LightItalic.ttf differ diff --git a/app/assets/fonts/SourceSansPro/SourceSansPro-Regular.ttf b/app/assets/fonts/SourceSansPro/SourceSansPro-Regular.ttf new file mode 100644 index 0000000000..b422bf4322 Binary files /dev/null and b/app/assets/fonts/SourceSansPro/SourceSansPro-Regular.ttf differ diff --git a/app/assets/fonts/SourceSansPro/SourceSansPro-SemiBold.ttf b/app/assets/fonts/SourceSansPro/SourceSansPro-SemiBold.ttf new file mode 100644 index 0000000000..2908e0d782 Binary files /dev/null and b/app/assets/fonts/SourceSansPro/SourceSansPro-SemiBold.ttf differ diff --git a/app/assets/fonts/SourceSansPro/SourceSansPro-SemiBoldItalic.ttf b/app/assets/fonts/SourceSansPro/SourceSansPro-SemiBoldItalic.ttf new file mode 100644 index 0000000000..990cf910cf Binary files /dev/null and b/app/assets/fonts/SourceSansPro/SourceSansPro-SemiBoldItalic.ttf differ diff --git a/app/assets/images/background.png b/app/assets/images/background.png new file mode 100644 index 0000000000..4fadde1f21 Binary files /dev/null and b/app/assets/images/background.png differ diff --git a/app/assets/images/bbb_logo.png b/app/assets/images/bbb_logo.png index 6fa57f4f33..90f684a0ad 100644 Binary files a/app/assets/images/bbb_logo.png and b/app/assets/images/bbb_logo.png differ diff --git a/app/assets/images/default-avatar.png b/app/assets/images/default-avatar.png deleted file mode 100644 index cd01860187..0000000000 Binary files a/app/assets/images/default-avatar.png and /dev/null differ diff --git a/public/favicon.ico b/app/assets/images/favicon.ico similarity index 100% rename from public/favicon.ico rename to app/assets/images/favicon.ico diff --git a/app/assets/images/google-logo.png b/app/assets/images/google-logo.png new file mode 100644 index 0000000000..aa00573300 Binary files /dev/null and b/app/assets/images/google-logo.png differ diff --git a/app/assets/images/landing/bbb.png b/app/assets/images/landing/bbb.png new file mode 100644 index 0000000000..5812f26b25 Binary files /dev/null and b/app/assets/images/landing/bbb.png differ diff --git a/app/assets/images/landing/mobile.png b/app/assets/images/landing/mobile.png new file mode 100644 index 0000000000..2cb3b8bb25 Binary files /dev/null and b/app/assets/images/landing/mobile.png differ diff --git a/app/assets/images/landing/world.png b/app/assets/images/landing/world.png new file mode 100644 index 0000000000..66f31d9941 Binary files /dev/null and b/app/assets/images/landing/world.png differ diff --git a/app/assets/images/ldap-logo.png b/app/assets/images/ldap-logo.png new file mode 100644 index 0000000000..f11320ef02 Binary files /dev/null and b/app/assets/images/ldap-logo.png differ diff --git a/app/assets/images/logo_with_text.png b/app/assets/images/logo_with_text.png new file mode 100644 index 0000000000..6fa57f4f33 Binary files /dev/null and b/app/assets/images/logo_with_text.png differ diff --git a/app/assets/images/office365-logo.jpeg b/app/assets/images/office365-logo.jpeg new file mode 100644 index 0000000000..e020ddbfc6 Binary files /dev/null and b/app/assets/images/office365-logo.jpeg differ diff --git a/app/assets/images/openid-logo.png b/app/assets/images/openid-logo.png new file mode 100644 index 0000000000..154fb9bbba Binary files /dev/null and b/app/assets/images/openid-logo.png differ diff --git a/app/assets/images/placeholder-user.jpg b/app/assets/images/placeholder-user.jpg new file mode 100644 index 0000000000..a1ec342436 Binary files /dev/null and b/app/assets/images/placeholder-user.jpg differ diff --git a/app/assets/images/twitter-logo.png b/app/assets/images/twitter-logo.png new file mode 100644 index 0000000000..c5446fac5b Binary files /dev/null and b/app/assets/images/twitter-logo.png differ diff --git a/app/assets/images/windows-logo.png b/app/assets/images/windows-logo.png new file mode 100644 index 0000000000..7c68685ba0 Binary files /dev/null and b/app/assets/images/windows-logo.png differ diff --git a/app/assets/javascripts/admins.js b/app/assets/javascripts/admins.js new file mode 100644 index 0000000000..abd34f26c1 --- /dev/null +++ b/app/assets/javascripts/admins.js @@ -0,0 +1,340 @@ +// 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 . + +$(document).on('turbolinks:load', function(){ + var controller = $("body").data('controller'); + var action = $("body").data('action'); + + // Only run on the admins page. + if (controller == "admins") { + if(action == "index") { + //clear the role filter if user clicks on the x + $(".clear-role").click(function() { + var search = new URL(location.href).searchParams.get('search') + + var url = window.location.pathname + "?page=1" + + if (search) { + url += "&search=" + search + } + + window.location.replace(url); + }) + + // Handle selected user tags + $(".manage-users-tab").click(function() { + $(".manage-users-tab").removeClass("selected") + $(this).addClass("selected") + + updateTabParams(this.id) + }) + + $('.selectpicker').selectpicker({ + liveSearchPlaceholder: getLocalizedString('javascript.search.start') + }); + // Fixes turbolinks issue with bootstrap select + $(window).trigger('load.bs.select.data-api'); + + // Display merge accounts modal with correct info + $(".merge-user").click(function() { + // Update the path of save button + $("#merge-save-access").attr("data-path", $(this).data("path")) + let userInfo = $(this).data("info") + $("#merge-to").html("") // Clear current inputs + + let spanName = document.createElement("span"), + spanEmail = document.createElement("span"), + spanUid = document.createElement("span"); + spanName.innerText = userInfo.name + spanEmail.setAttribute('class', 'text-muted d-block') + spanEmail.innerText = userInfo.email + spanUid.setAttribute('class', 'text-muted d-block') + spanUid.innerText = userInfo.uid + + $("#merge-to").append(spanName, spanEmail, spanUid) + }) + + $("#mergeUserModal").on("show.bs.modal", function() { + $(".selectpicker").selectpicker('val','') + }) + + $(".bootstrap-select").on("click", function() { + $(".bs-searchbox").siblings().hide() + }) + + $("#merge-user-select ~ button").on("click", function() { + $(".bs-searchbox").siblings().hide() + }) + + $(".bs-searchbox input").on("input", function() { + if ($(".bs-searchbox input").val() == '' || $(".bs-searchbox input").val().length < 3) { + $(".select-options").remove() + $(".bs-searchbox").siblings().hide() + } else { + // Manually populate the dropdown + $.get($("#merge-user-select").data("path"), { search: $(".bs-searchbox input").val() }, function(users) { + $(".select-options").remove() + if (users.length > 0) { + users.forEach(function(user) { + let opt = document.createElement("option") + $(opt).val(JSON.stringify({uid: user.uid, email: user.email, name: user.name})) + $(opt).text(user.name) + $(opt).addClass("select-options") + $(opt).attr("data-subtext", user.email) + $("#merge-user-select").append(opt) + }) + // Only refresh the select dropdown if there are results to show + $('#merge-user-select').selectpicker('refresh'); + } + $(".bs-searchbox").siblings().show() + }) + } + }) + + // User selects an option from the Room Access dropdown + $(".bootstrap-select").on("changed.bs.select", function(){ + // Get the uid of the selected user + let user = $(".selectpicker").selectpicker('val') + if (user != "") { + let userInfo = JSON.parse(user) + $("#merge-from").html("") // Clear current input + + let spanName = document.createElement("span"), + spanEmail = document.createElement("span"), + spanUid = document.createElement("span"); + spanName.innerText = userInfo.name + spanEmail.setAttribute('class', 'text-muted d-block') + spanEmail.innerText = userInfo.email + spanUid.setAttribute('class', 'text-muted d-block') + spanUid.id = 'from-uid' + spanUid.innerText = userInfo.uid + + $("#merge-from").append(spanName, spanEmail, spanUid) + } + }) + } + else if(action == "site_settings"){ + var urlParams = new URLSearchParams(window.location.search); + // Only load the colour selectors if on the appearance tab + if (urlParams.get("tab") == null || urlParams.get("tab") == "appearance") { + loadColourSelectors() + } + } + else if (action == "roles"){ + // Refreshes the new role modal + $("#newRoleButton").click(function(){ + $("#createRoleName").val("") + }) + + // Updates the colour picker to the correct colour + let role_colour = $("#role-colorinput-regular").data("colour") + $("#role-colorinput-regular").css("background-color", role_colour); + $("#role-colorinput-regular").css("border-color", role_colour); + + loadRoleColourSelector(role_colour, $("#role-colorinput-regular").data("disabled")); + + // Loads the jquery sortable so users can manually sort roles + $("#rolesSelect").sortable({ + items: "a:not(.sort-disabled)", + update: function() { + $.ajax({ + url: $(this).data("url"), + type: 'PATCH', + data: $(this).sortable('serialize') + }); + } + }); + } + } +}); + +// Change the branding image to the image provided +function changeBrandingImage(path) { + var url = $("#branding-url").val() + $.post(path, {value: url, tab: "appearance"}) +} + +// Change the Legal URL to the one provided +function changeLegalURL(path) { + var url = $("#legal-url").val() + $.post(path, {value: url, tab: "administration"}) +} + +// Change the Privacy Policy URL to the one provided +function changePrivacyPolicyURL(path) { + var url = $("#privpolicy-url").val() + $.post(path, {value: url, tab: "administration"}) +} + +// Display the maintenance Banner +function displayMaintenanceBanner(path) { + var message = $("#maintenance-banner").val() + $.post(path, {value: message, tab: "administration"}) +} + +// Clear the maintenance Banner +function clearMaintenanceBanner(path) { + $.post(path, {value: "", tab: "administration"}) +} + +// Change the email mapping to the string provided +function changeEmailMapping(path) { + var url = $("#email-mapping").val() + $.post(path, {value: url, tab: "registration"}) +} + +function mergeUsers() { + let userToMerge = $("#from-uid").text() + $.post($("#merge-save-access").data("path"), {merge: userToMerge}) +} + +// Filters by role +function filterRole(role) { + var search = new URL(location.href).searchParams.get('search') + + var url = window.location.pathname + "?page=1" + "&role=" + role + + if (search) { + url += "&search=" + search + } + + window.location.replace(url); +} + +function updateTabParams(tab) { + var search_params = new URLSearchParams(window.location.search) + + if (window.location.href.includes("tab=")) { + search_params.set("tab", tab) + } else { + search_params.append("tab", tab) + } + + search_params.delete("page") + + window.location.search = search_params.toString() +} + +function loadColourSelectors() { + const pickrRegular = new Pickr({ + el: '#colorinput-regular', + theme: 'monolith', + useAsButton: true, + lockOpacity: true, + defaultRepresentation: 'HEX', + closeWithKey: 'Enter', + default: $("#colorinput-regular").css("background-color"), + + components: { + palette: true, + preview: true, + hue: true, + interaction: { + input: true, + save: true, + }, + }, + }); + + const pickrLighten = new Pickr({ + el: '#colorinput-lighten', + theme: 'monolith', + useAsButton: true, + lockOpacity: true, + defaultRepresentation: 'HEX', + closeWithKey: 'Enter', + default: $("#colorinput-lighten").css("background-color"), + + components: { + palette: true, + preview: true, + hue: true, + interaction: { + input: true, + save: true, + }, + }, + }); + + const pickrDarken = new Pickr({ + el: '#colorinput-darken', + theme: 'monolith', + useAsButton: true, + lockOpacity: true, + defaultRepresentation: 'HEX', + closeWithKey: 'Enter', + default: $("#colorinput-darken").css("background-color"), + + components: { + palette: true, + preview: true, + hue: true, + interaction: { + input: true, + save: true, + }, + }, + }); + + pickrRegular.on("save", (color, instance) => { + $.post($("#coloring-path-regular").val(), {value: color.toHEXA().toString()}).done(function() { + location.reload() + }); + }) + + pickrLighten.on("save", (color, instance) => { + $.post($("#coloring-path-lighten").val(), {value: color.toHEXA().toString(), tab: "appearance"}).done(function() { + location.reload() + }); + }) + + pickrDarken.on("save", (color, instance) => { + $.post($("#coloring-path-darken").val(), {value: color.toHEXA().toString(), tab: "appearance"}).done(function() { + location.reload() + }); + }) +} + +function loadRoleColourSelector(role_colour, disabled) { + if (!disabled) { + const pickrRoleRegular = new Pickr({ + el: '#role-colorinput-regular', + theme: 'monolith', + useAsButton: true, + lockOpacity: true, + defaultRepresentation: 'HEX', + closeWithKey: 'Enter', + default: role_colour, + + components: { + palette: true, + preview: true, + hue: true, + interaction: { + input: true, + save: true, + }, + }, + }); + + // On save update the colour input's background colour and update the role colour input + pickrRoleRegular.on("save", (color, instance) => { + $("#role-colorinput-regular").css("background-color", color.toHEXA().toString()); + $("#role-colorinput-regular").css("border-color", color.toHEXA().toString()); + $("#role-colour").val(color.toHEXA().toString()); + }); + } +} diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 0000000000..dd678843ee --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,39 @@ +// 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 . + +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, +// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. JavaScript code in this file should be added after the last require_* statement. +// +// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details +// about supported directives. +// +//= require turbolinks +//= require jquery3 +//= require tabler +//= require tabler.plugins +//= require jquery_ujs +//= require jquery-ui/widget +//= require jquery-ui/widgets/sortable +//= require pickr.min.js +//= require bootstrap-select.min.js +//= require local-time +//= require_tree . diff --git a/app/javascript/channels/consumer.jsx b/app/assets/javascripts/cable.js similarity index 53% rename from app/javascript/channels/consumer.jsx rename to app/assets/javascripts/cable.js index e1d523c541..d41f78351d 100644 --- a/app/javascript/channels/consumer.jsx +++ b/app/assets/javascripts/cable.js @@ -1,22 +1,32 @@ // BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. // -// Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +// 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. // -// Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +// 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 Greenlight; if not, see . +// with BigBlueButton; if not, see . // Action Cable provides the framework to deal with WebSockets in Rails. -// You can generate new channels where WebSocket features live using the `bin/rails generate channel` command. +// You can generate new channels where WebSocket features live using the rails generate channel command. +// +//= require action_cable +//= require_self +//= require_tree ./channels + +(function() { + var protocol = (window.location.protocol === "https:" ? "wss://" : "ws://"); + var host = window.GreenLight.WEBSOCKET_HOST || window.location.host + window.GreenLight.RELATIVE_ROOT; + var url = protocol + host + '/cable'; -import { createConsumer } from '@rails/actioncable'; + this.App || (this.App = {}); -export default createConsumer(`${process.env.RELATIVE_URL_ROOT}/cable`); + App.cable = ActionCable.createConsumer(url); +}).call(this); diff --git a/app/assets/builds/.keep b/app/assets/javascripts/channels/.keep similarity index 100% rename from app/assets/builds/.keep rename to app/assets/javascripts/channels/.keep diff --git a/app/assets/javascripts/cookies.js b/app/assets/javascripts/cookies.js new file mode 100644 index 0000000000..912ba412bc --- /dev/null +++ b/app/assets/javascripts/cookies.js @@ -0,0 +1,37 @@ +// 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 . + +$(document).on('turbolinks:load', function(){ + $("#cookies-agree-button").click(function() { + //create a cookie that lasts 1 year + var cookieDate = new Date(); + cookieDate.setFullYear(cookieDate.getFullYear() + 1); //1 year from now + document.cookie = "cookie_consented=true; path=/; expires=" + cookieDate.toUTCString() + ";" + + //hide the banner at the bottom + $(".cookies-banner").attr("style","display:none !important") + }) + + $("#maintenance-close").click(function(event) { + //create a cookie that lasts 1 day + + var cookieDate = new Date() + cookieDate.setDate(cookieDate.getDate() + 1) //1 day from now + console.log("maintenance_window=" + $(event.target).data("date") + "; path=/; expires=" + cookieDate.toUTCString() + ";") + + document.cookie = "maintenance_window=" + $(event.target).data("date") + "; path=/; expires=" + cookieDate.toUTCString() + ";" + }) +}) diff --git a/app/assets/javascripts/delete.js b/app/assets/javascripts/delete.js new file mode 100644 index 0000000000..1b8ef55683 --- /dev/null +++ b/app/assets/javascripts/delete.js @@ -0,0 +1,57 @@ +// 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 . + +$(document).on('turbolinks:load', function(){ + var controller = $("body").data('controller'); + var action = $("body").data('action'); + + // Only run on the admins page. + if (controller == "admins" && action == "index") { + // show the modal with the correct form action url + $(".delete-user").click(function(){ + $("#delete-confirm").parent().attr("action", $(this).data("path")) + + if ($(this).data("delete") == "temp-delete") { + $("#perm-delete").hide() + $("#delete-warning").show() + } else { + $("#perm-delete").show() + $("#delete-warning").hide() + } + }) + } + + $(".delete-user").click(function(data){ + document.getElementById("delete-checkbox").checked = false + $("#delete-confirm").prop("disabled", "disabled") + + if ($(data.target).data("delete") == "temp-delete") { + $("#perm-delete").hide() + $("#delete-warning").show() + } else { + $("#perm-delete").show() + $("#delete-warning").hide() + } + }) + + $("#delete-checkbox").click(function(data){ + if (document.getElementById("delete-checkbox").checked) { + $("#delete-confirm").removeAttr("disabled") + } else { + $("#delete-confirm").prop("disabled", "disabled") + } + }) +}) diff --git a/app/assets/javascripts/header.js b/app/assets/javascripts/header.js new file mode 100644 index 0000000000..a32f611a81 --- /dev/null +++ b/app/assets/javascripts/header.js @@ -0,0 +1,36 @@ +// 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 . + +$(document).on('turbolinks:load', function(){ + // Stores the current url when the user clicks the sign in button + $(".sign-in-button").click(function(){ + var url = location.href + // Add the slash at the end if it's missing + url += url.endsWith("/") ? "" : "/" + document.cookie ="return_to=" + url + }) + + // Checks to see if the user provided an image url and displays it if they did + $("#user-image") + .on("load", function() { + $("#user-image").show() + $("#user-avatar").hide() + }) + .on("error", function() { + $("#user-image").hide() + $("#user-avatar").show() + }) +}) diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js new file mode 100644 index 0000000000..9132c93ca5 --- /dev/null +++ b/app/assets/javascripts/main.js @@ -0,0 +1,51 @@ +// 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 . + +$(document).on('turbolinks:load', function(){ + $.rails.refreshCSRFTokens(); +}) + +document.addEventListener("turbolinks:before-cache", function() { + $(".alert").remove() +}) + +// Gets the localized string +function getLocalizedString(key) { + var keyArr = key.split(".") + var translated = I18n + + // Search current language for the key + try { + keyArr.forEach(function(k) { + translated = translated[k] + }) + } catch (e) { + // Key is missing in selected language so default to english + translated = undefined; + } + + + // If key is not found, search the fallback language for the key + if (translated === null || translated === undefined) { + translated = I18nFallback + + keyArr.forEach(function(k) { + translated = translated[k] + }) + } + + return translated +} \ No newline at end of file diff --git a/app/assets/javascripts/recording.js b/app/assets/javascripts/recording.js new file mode 100644 index 0000000000..f097cda402 --- /dev/null +++ b/app/assets/javascripts/recording.js @@ -0,0 +1,48 @@ +// 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 . + +// Handle changing of settings tabs. +$(document).on('turbolinks:load', function(){ + var controller = $("body").data('controller'); + var action = $("body").data('action'); + + if (controller == "rooms" && action == "show" + || controller == "rooms" && action == "update" + || controller == "users" && action == "recordings" + || controller == "admins" && action == "server_recordings"){ + // Handle recording emails. + $('.email-link').each(function(){ + $(this).click(function(){ + var subject = $(".username").text() + " " + getLocalizedString('javascript.room.mailer.subject'); + var body = getLocalizedString('javascript.room.mailer.body') + "\n\n" + $(this).attr("data-pres-link"); + var autogenerated = getLocalizedString('javascript.room.mailer.autogenerated') + "\n"; + var footer = getLocalizedString('javascript.room.mailer.footer'); + + var url = "mailto:?subject=" + encodeURIComponent(subject) + "&body=" + encodeURIComponent(body) + encodeURIComponent(autogenerated) + encodeURIComponent(footer); + var win = window.open(url, '_blank'); + + win.focus(); + }); + }); + + // Handle recording delete modal + $(".delete-rec").click(function() { + $("#delete-rec-confirm").parent().attr("action", $(this).data("path")) + }) + + + } +}); \ No newline at end of file diff --git a/app/assets/javascripts/rename.js b/app/assets/javascripts/rename.js new file mode 100644 index 0000000000..95c531112f --- /dev/null +++ b/app/assets/javascripts/rename.js @@ -0,0 +1,162 @@ +// 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 . + +$(document).on('turbolinks:load', function(){ + var controller = $("body").data('controller'); + var action = $("body").data('action'); + + if(controller == "rooms" && action == "show" + || controller == "rooms" && action == "update" + || controller == "users" && action == "recordings" + || controller == "admins" && action == "server_recordings"){ + + // Set a room header rename event + var configure_room_header = function(room_title){ + + function register_room_title_event(e){ + // Remove current window events + $(window).off('mousedown keydown'); + + if(e.type == 'focusout'){ + submit_rename_request(room_title); + return; + } + + room_title.addClass("dotted_underline"); + room_title.find('#user-text').fadeTo('medium', 0.7); + room_title.find('#user-text').attr("contenteditable", true); + room_title.find('#user-text').focus(); + + // Stop automatic refresh + e.preventDefault(); + + register_window_event(room_title, 'user-text', '#edit-room', 'edit-room'); + } + + room_title.find('#user-text').on('dblclick focusout', function(e){ + if(room_title.find('#edit-room').length){ + register_room_title_event(e); + } + }); + + room_title.find('.fa-edit').on('click', function(e){ + register_room_title_event(e); + }); + } + + // Set a recording row rename event + var configure_recording_row = function(recording_title){ + + function register_recording_title_event(e){ + // Remove current window events + $(window).off('mousedown keydown'); + + if(e.type == 'focusout'){ + submit_rename_request(recording_title); + return; + } + + recording_title.addClass("dotted_underline"); + recording_title.fadeTo('medium', 0.7); + recording_title.find('span').attr("contenteditable", true); + recording_title.find('span').focus(); + + // Stop automatic refresh + e.preventDefault(); + + register_window_event(recording_title, 'recording-text', '#edit-record', 'edit-recordid'); + } + + recording_title.find('a').on('click focusout', function(e){ + register_recording_title_event(e); + }); + + recording_title.find('#recording-text').on('dblclick focusout', function(e){ + register_recording_title_event(e); + }); + } + + // Register window event to submit new name + // upon click or upon pressing the enter key + var register_window_event = function(element, textfield_id, edit_button_id, edit_button_data){ + $(window).on('mousedown keydown', function(clickEvent){ + + // Return if the text is clicked + if(clickEvent.type == "mousedown" && clickEvent.target.id == textfield_id){ + return; + } + + // Return if the edit icon is clicked + if(clickEvent.type == "mousedown" && $(clickEvent.target).is(edit_button_id) && + $(clickEvent.target).data(edit_button_data) === element.find(edit_button_id).data(edit_button_data)){ + return; + } + + // Check if event is keydown and enter key is not pressed + if(clickEvent.type == "keydown" && clickEvent.which !== 13){ + return; + } + + clickEvent.preventDefault(); + submit_rename_request(element); + + // Remove window event when ajax call to update name is submitted + $(window).off('mousedown keydown'); + }); + } + + // Apply ajax request depending on the element that triggered the event + var submit_rename_request = function(element){ + if(element.is('#room-title')){ + submit_update_request({ + setting: "rename_header", + name: element.find('#user-text').text(), + }, element.data('path'), "POST"); + } + else if(element.is('#recording-title')){ + submit_update_request({ + setting: "rename_recording", + record_id: element.data('recordid'), + record_name: element.find('span').text(), + room_uid: element.data('room-uid'), + }, element.data('path'), "PATCH"); + } + } + + // Helper for submitting ajax requests + var submit_update_request = function(data, path, action){ + // Send ajax request for update + $.ajax({ + url: path, + type: action, + data: data, + }); + } + + // Elements that can be renamed + var room_title = $('#room-title'); + var recording_rows = $('#recording-table').find('tr'); + + // Configure renaming for room header + configure_room_header(room_title); + + // Configure renaming for recording rows + recording_rows.each(function(){ + var recording_title = $(this).find('#recording-title'); + configure_recording_row(recording_title); + }); + } +}); diff --git a/app/assets/javascripts/room.js b/app/assets/javascripts/room.js new file mode 100644 index 0000000000..d953f613bf --- /dev/null +++ b/app/assets/javascripts/room.js @@ -0,0 +1,432 @@ +// 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 . + +// Room specific js for copy button and email link. +$(document).on('turbolinks:load', function(){ + var controller = $("body").data('controller'); + var action = $("body").data('action'); + + // highlight current room + $('.room-block').removeClass('current'); + $('a[href="' + window.location.pathname + '"] .room-block').addClass('current'); + + // Only run on room pages. + if (controller == "rooms" && action == "show"){ + // Display and update all fields related to creating a room in the createRoomModal + $("#create-room-block").click(function(){ + showCreateRoom(this) + }) + + checkIfAutoJoin() + } + + // Autofocus on the Room Name label when creating a room only + $('#createRoomModal').on('shown.bs.modal', function (){ + if ($(".create-only").css("display") == "block"){ + $('#create-room-name').focus() + } + }) + + if (controller == "rooms" && action == "show" || controller == "admins" && action == "server_rooms"){ + // Display and update all fields related to creating a room in the createRoomModal + $(".update-room").click(function(){ + showUpdateRoom(this) + }) + + $(".delete-room").click(function() { + showDeleteRoom(this) + }) + + $('.selectpicker').selectpicker({ + liveSearchPlaceholder: getLocalizedString('javascript.search.start') + }); + // Fixes turbolinks issue with bootstrap select + $(window).trigger('load.bs.select.data-api'); + + $(".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")) + }) + + $("#shareRoomModal").on("show.bs.modal", function() { + $(".selectpicker").selectpicker('val','') + }) + + $(".bootstrap-select").on("click", function() { + $(".bs-searchbox").siblings().hide() + }) + + $("#share-room-select ~ button").on("click", function() { + $(".bs-searchbox").siblings().hide() + }) + + $(".bs-searchbox input").on("input", function() { + if ($(".bs-searchbox input").val() == '' || $(".bs-searchbox input").val().length < 3) { + $(".select-options").remove() + $(".bs-searchbox").siblings().hide() + } else { + // Manually populate the dropdown + $.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) { + let opt = document.createElement("option") + $(opt).val(user.uid) + $(opt).text(user.name) + $(opt).addClass("select-options") + $(opt).attr("data-subtext", user.uid) + $("#share-room-select").append(opt) + }) + // Only refresh the select dropdown if there are results to show + $('#share-room-select').selectpicker('refresh'); + } + $(".bs-searchbox").siblings().show() + }) + } + }) + + $(".remove-share-room").click(function() { + $("#remove-shared-confirm").parent().attr("action", $(this).data("path")) + }) + + // User selects an option from the Room Access dropdown + $(".bootstrap-select").on("changed.bs.select", function(){ + // Get the uid of the selected user + let uid = $(".selectpicker").selectpicker('val') + + // If the value was changed to blank, ignore it + if (uid == "") return + + let currentListItems = $("#user-list li").toArray().map(user => $(user).data("uid")) + + // Check to make sure that the user is not already there + if (!currentListItems.includes(uid)) { + // Create the faded list item and display it + let option = $("option[value='" + uid + "']") + + let listItem = document.createElement("li") + listItem.setAttribute('class', 'list-group-item text-left not-saved add-access'); + listItem.setAttribute("data-uid", uid) + + let spanItemAvatar = document.createElement("span"), + spanItemName = document.createElement("span"), + spanItemUser = document.createElement("span"); + spanItemAvatar.setAttribute('class', 'avatar float-left mr-2'); + spanItemAvatar.innerText = option.text().charAt(0); + spanItemName.setAttribute('class', 'shared-user'); + spanItemName.innerText = option.text(); + spanItemUser.setAttribute('class', 'text-muted'); + spanItemUser.innerText = option.data('subtext'); + spanItemName.append(spanItemUser); + + listItem.innerHTML = "" + listItem.prepend(spanItemName); + listItem.prepend(spanItemAvatar); + + $("#user-list").append(listItem) + } + }) + + $("#presentation-upload").change(function(data) { + var file = data.target.files[0] + + // Check file type and size to make sure they aren't over the limit + if (validFileUpload(file)) { + $("#presentation-upload-label").text(file.name) + } else { + $("#invalid-file-type").show() + $("#presentation-upload").val("") + $("#presentation-upload-label").text($("#presentation-upload-label").data("placeholder")) + } + }) + + $(".preupload-room").click(function() { + updatePreuploadPresentationModal(this) + }) + + $("#remove-presentation").click(function(data) { + removePreuploadPresentation($(this).data("remove")) + }) + + // trigger initial room filter + filterRooms(); + } +}); + +function copyInvite() { + $('#invite-url').select() + if (document.execCommand("copy")) { + $('#invite-url').blur(); + copy = $("#copy-invite") + copy.addClass('btn-success'); + copy.html("" + getLocalizedString("copied")) + setTimeout(function(){ + copy.removeClass('btn-success'); + copy.html("" + getLocalizedString("copy")) + }, 1000) + } +} + +function copyAccess(target) { + input = target ? $("#copy-" + target + "-code") : $("#copy-code") + input.attr("type", "text") + input.select() + if (document.execCommand("copy")) { + 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'); + originalString = target ? getLocalizedString("room.copy_" + target + "_access") : getLocalizedString("room.copy_access") + copy.html("" + originalString) + }, 1000) + } +} + +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")) + $("#room_require_moderator_approval").prop("checked", $("#room_require_moderator_approval").data("default")) + $("#room_anyone_can_start").prop("checked", $("#room_anyone_can_start").data("default")) + $("#room_all_join_moderator").prop("checked", $("#room_all_join_moderator").data("default")) + $("#room_recording").prop("checked", $("#room_recording").data("default")) + + //show all elements & their children with a create-only class + $(".create-only").each(function() { + $(this).show() + if($(this).children().length > 0) { $(this).children().show() } + }) + + //hide all elements & their children with a update-only class + $(".update-only").each(function() { + $(this).attr('style',"display:none !important") + if($(this).children().length > 0) { $(this).children().attr('style',"display:none !important") } + }) +} + +function showUpdateRoom(target) { + var modal = $(target) + var update_path = modal.closest(".room-block").data("path") + var settings_path = modal.data("settings-path") + $("#create-room-name").val(modal.closest(".room-block").find(".room-name-text").text().trim()) + $("#createRoomModal form").attr("action", update_path) + + //show all elements & their children with a update-only class + $(".update-only").each(function() { + $(this).show() + if($(this).children().length > 0) { $(this).children().show() } + }) + + //hide all elements & their children with a create-only class + $(".create-only").each(function() { + $(this).attr('style',"display:none !important") + if($(this).children().length > 0) { $(this).children().attr('style',"display:none !important") } + }) + + updateCurrentSettings(settings_path) + + var accessCode = modal.closest(".room-block").data("room-access-code") + + if(accessCode){ + $("#create-room-access-code").text(getLocalizedString("modal.create_room.access_code") + ": " + accessCode) + $("#room_access_code").val(accessCode) + } else { + $("#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) { + $("#delete-header").text(getLocalizedString("modal.delete_room.confirm").replace("%{room}", $(target).data("name"))) + $("#delete-confirm").parent().attr("action", $(target).data("path")) +} + +//Update the createRoomModal to show the correct current settings +function updateCurrentSettings(settings_path){ + // Get current room settings and set checkbox + $.get(settings_path, function(settings) { + $("#room_mute_on_join").prop("checked", $("#room_mute_on_join").data("default") || settings.muteOnStart) + $("#room_require_moderator_approval").prop("checked", $("#room_require_moderator_approval").data("default") || settings.requireModeratorApproval) + $("#room_anyone_can_start").prop("checked", $("#room_anyone_can_start").data("default") || settings.anyoneCanStart) + $("#room_all_join_moderator").prop("checked", $("#room_all_join_moderator").data("default") || settings.joinModerator) + $("#room_recording").prop("checked", $("#room_recording").data("default") || Boolean(settings.recording)) + }) +} + +function generateAccessCode(){ + const accessCodeLength = 6 + var validCharacters = "0123456789" + var accessCode = "" + + for( var i = 0; i < accessCodeLength; i++){ + accessCode += validCharacters.charAt(Math.floor(Math.random() * validCharacters.length)); + } + + $("#create-room-access-code").text(getLocalizedString("modal.create_room.access_code") + ": " + accessCode) + $("#room_access_code").val(accessCode) +} + +function ResetAccessCode(){ + $("#create-room-access-code").text(getLocalizedString("modal.create_room.access_code_placeholder")) + $("#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")) + + $.post($("#save-access").data("path"), {add: listItemsToAdd}) +} + +// Get list of users shared with and display them +function displaySharedUsers(path) { + $.get(path, function(users) { + // Create list element and add to user list + var user_list_html = "" + + users.forEach(function(user) { + user_list_html += "
  • " + + if (user.image) { + user_list_html += "" + } else { + user_list_html += "" + user.name.charAt(0) + "" + } + user_list_html += "" + user.name + "" + user.uid + "" + user_list_html += "" + user_list_html += "
  • " + }) + + $("#user-list").html(user_list_html) + }); +} + +// Removes the user from the list of shared users +function removeSharedUser(target) { + let parentLI = target.closest("li") + + if (parentLI.classList.contains("not-saved")) { + parentLI.parentNode.removeChild(parentLI) + } else { + parentLI.removeChild(target) + parentLI.classList.add("remove-shared") + } +} + +function updatePreuploadPresentationModal(target) { + $.get($(target).data("settings-path"), function(presentation) { + if(presentation.attached) { + $("#current-presentation").show() + $("#presentation-name").text(presentation.name) + $("#change-pres").show() + $("#use-pres").hide() + } else { + $("#current-presentation").hide() + $("#change-pres").hide() + $("#use-pres").show() + } + }); + + $("#preuploadPresentationModal form").attr("action", $(target).data("path")) + $("#remove-presentation").data("remove", $(target).data("remove")) + + // Reset values to original to prevent confusion + $("#presentation-upload").val("") + $("#presentation-upload-label").text($("#presentation-upload-label").data("placeholder")) + $("#invalid-file-type").hide() +} + +function removePreuploadPresentation(path) { + $.post(path, {}) +} + +function validFileUpload(file) { + return file.size/1024/1024 <= 30 +} + +// Automatically click the join button if this is an action cable reload +function checkIfAutoJoin() { + var url = new URL(window.location.href) + + if (url.searchParams.get("reload") == "true") { + $("#joiner-consent").click() + $("#room-join").click() + } +} + +function filterRooms() { + let search = $('#room-search').val() + + if (search == undefined) { return } + + let search_term = search.toLowerCase(), + rooms = $('#room_block_container > div:not(:last-child)'); + clear_room_search = $('#clear-room-search'); + + if (search_term) { + clear_room_search.show(); + } else { + clear_room_search.hide(); + } + + rooms.each(function(i, room) { + let text = $(this).find('h4').text(); + room.style.display = (text.toLowerCase().indexOf(search_term) < 0) ? 'none' : 'block'; + }) +} + +function clearRoomSearch() { + $('#room-search').val(''); + filterRooms() +} diff --git a/app/assets/javascripts/search.js b/app/assets/javascripts/search.js new file mode 100644 index 0000000000..b4ecbe4726 --- /dev/null +++ b/app/assets/javascripts/search.js @@ -0,0 +1,103 @@ +// 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 . + +$(document).on('turbolinks:load', function(){ + var controller = $("body").data('controller'); + var action = $("body").data('action'); + + if ((controller == "admins" && action == "index") || + (controller == "rooms" && action == "show") || + (controller == "rooms" && action == "update") || + (controller == "rooms" && action == "join") || + (controller == "users" && action == "recordings") || + (controller == "admins" && action == "server_recordings") || + (controller == "admins" && action == "server_rooms")) { + // Submit search if the user hits enter + $("#search-input").keypress(function(key) { + if (key.which == 13) { + searchPage() + } + }) + + // Add listeners for sort + $("th[data-order]").click(function(data){ + var header_elem = $(data.target) + + if(header_elem.data('order') === 'asc'){ // asc + header_elem.data('order', 'desc'); + } + else if(header_elem.data('order') === 'desc'){ // desc + header_elem.data('order', 'none'); + } + else{ // none + header_elem.data('order', 'asc'); + } + + var search = $("#search-input").val(); + + var url = window.location.pathname + "?page=1&search=" + search + "&column=" + header_elem.data("header") + + "&direction=" + header_elem.data('order') + + window.location.replace(addRecordingTable(url)) + }) + + if(controller === "rooms" && action === "show"){ + $(".page-item > a").each(function(){ + if(!$(this).attr('href').endsWith("#")){ + $(this).attr('href', $(this).attr('href') + "#recordings-table") + } + }) + } + } +}) + +// Searches the user table for the given string +function searchPage() { + var search = $("#search-input").val(); + + // Check if the user filtered by role + var role = new URL(location.href).searchParams.get('role') + var tab = new URL(location.href).searchParams.get('tab') + + var url = window.location.pathname + "?page=1&search=" + search + + if (role) { url += "&role=" + role } + if (tab) { url += "&tab=" + tab } + + window.location.replace(addRecordingTable(url)); +} + +// Clears the search bar +function clearSearch() { + var role = new URL(location.href).searchParams.get('role') + var tab = new URL(location.href).searchParams.get('tab') + + var url = window.location.pathname + "?page=1" + + if (role) { url += "&role=" + role } + if (tab) { url += "&tab=" + tab } + + window.location.replace(addRecordingTable(url)); + + var search_params = new URLSearchParams(window.location.search) +} + +function addRecordingTable(url) { + if($("body").data('controller') === "rooms" && $("body").data('action') === "show") { + url += "#recordings-table" + } + return url +} diff --git a/app/assets/javascripts/settings.js b/app/assets/javascripts/settings.js new file mode 100644 index 0000000000..42b7418e4c --- /dev/null +++ b/app/assets/javascripts/settings.js @@ -0,0 +1,42 @@ +// 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 . + +// Handle changing of settings tabs. +$(document).on('turbolinks:load', function(){ + var controller = $("body").data('controller'); + var action = $("body").data('action'); + + // Only run on the settings page. + if ((controller == "users" && action == "edit") || (controller == "users" && action == "update")){ + var settingsButtons = $('.setting-btn'); + var settingsViews = $('.setting-view'); + + settingsButtons.each(function(i, btn) { + if(!$(btn).hasClass("active")){ $(settingsViews[i]).hide(); } + $(btn).click(function(){ + $(btn).addClass("active"); + settingsViews.each(function(i, view){ + if($(view).attr("id") == $(btn).attr("id")){ + $(view).show(); + } else { + $(settingsButtons[i]).removeClass("active"); + $(view).hide(); + } + }); + }); + }); + } +}); diff --git a/app/assets/javascripts/sort.js b/app/assets/javascripts/sort.js new file mode 100644 index 0000000000..124868143c --- /dev/null +++ b/app/assets/javascripts/sort.js @@ -0,0 +1,105 @@ +// 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 . + +$(document).on('turbolinks:load', function(){ + var controller = $("body").data('controller'); + var action = $("body").data('action'); + + if(controller == "rooms" && action == "show" + || controller == "rooms" && action == "update" + || controller == "users" && action == "recordings" + || controller == "admins" && action == "server_recordings"){ + + // Choose active header + // (Name, Length or Users) + $('th').each(function(){ + if($(this).data("header")){ + $(this).on('click', function(){ + set_active_header($(this).data("header")); + sort_by($(this).data("header"), $(this).data('order')); + }); + } + }); + + // Based on the header (Name, Length or Users) clicked, + // Modify the ui for the tables + var set_active_header = function(active_header){ + $('th').each(function(){ + if($(this).data("header") == active_header){ + configure_order($(this)); + } + else{ + $(this).text($(this).data("header")); + $(this).data('order', 'none'); + } + }); + } + + // Based on the header (Name, Length or Users) clicked, + // Modify the ui for the tables + var configure_order = function(header_elem){ + if(header_elem.data('order') === 'asc'){ // asc + header_elem.data('order', 'desc'); + } + else if(header_elem.data('order') === 'desc'){ // desc + header_elem.data('order', 'none'); + } + else{ // none + header_elem.data('order', 'asc'); + } + } + + // Given a label and an order, sort recordings by order + // under a given label + var sort_by = function(label, order){ + var recording_list_tbody = $('.table-responsive').find('tbody'); + if(label === "Name"){ + sort_recordings(recording_list_tbody, order, "#recording-title"); + } + else if(label === "Length"){ + sort_recordings(recording_list_tbody, order, "#recording-length"); + } + else if(label === "Users"){ + sort_recordings(recording_list_tbody, order, "#recording-users"); + } + } + + // Generalized function for sorting recordings + var sort_recordings = function(recording_list_tbody, order, recording_id){ + recording_list_tbody.find('tr').sort(function(a, b){ + var a_val, b_val; + if (recording_id == "#recording-length") { + a_val = $.trim($(a).find(recording_id).data("full-length")); + b_val = $.trim($(b).find(recording_id).data("full-length")); + } else { + a_val = $.trim($(a).find(recording_id).text()); + b_val = $.trim($(b).find(recording_id).text()); + } + + if(order === "asc"){ + return a_val.localeCompare(b_val); + } + else if(order === "desc"){ + return b_val.localeCompare(a_val); + } else { + return undefined; + } + + + }).appendTo(recording_list_tbody); + } + } +}); diff --git a/app/assets/javascripts/user_edit.js b/app/assets/javascripts/user_edit.js new file mode 100644 index 0000000000..706e92f86f --- /dev/null +++ b/app/assets/javascripts/user_edit.js @@ -0,0 +1,46 @@ +// 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 . + +$(document).on('turbolinks:load', function(){ + var controller = $("body").data('controller'); + var action = $("body").data('action'); + if ((controller == "admins" && action == "edit_user") || (controller == "users" && action == "edit")) { + // Hack to make it play nice with turbolinks + if ($("#role-dropdown:visible").length == 0){ + $(window).trigger('load.bs.select.data-api') + } + + // Check to see if the role dropdown was set up + if ($("#role-dropdown").length != 0){ + $("#role-dropdown").selectpicker('val', $("#user_role_id").val()) + } + + // Update hidden field with new value + $("#role-dropdown").on("changed.bs.select", function(){ + $("#user_role_id").val($("#role-dropdown").selectpicker('val')) + }) + + // Update hidden field with new value + // $("#language-dropdown").on("show.bs.select", function(){ + // $("#language-dropdown").selectpicker('val', $("#user_language").val()) + // }) + + // Update hidden field with new value + $("#language-dropdown").on("changed.bs.select", function(){ + $("#user_language").val($("#language-dropdown").selectpicker('val')) + }) + } +}) \ No newline at end of file diff --git a/app/assets/javascripts/wait.js b/app/assets/javascripts/wait.js new file mode 100644 index 0000000000..dd659c9793 --- /dev/null +++ b/app/assets/javascripts/wait.js @@ -0,0 +1,67 @@ +// 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 . + +// Handle client request to join when meeting starts. +$(document).on("turbolinks:load", function(){ + var controller = $("body").data('controller'); + var action = $("body").data('action'); + + if(controller == "rooms" && action == "join"){ + App.waiting = App.cable.subscriptions.create({ + channel: "WaitingChannel", + roomuid: $(".background").attr("room"), + useruid: $(".background").attr("user") + }, { + connected: function() { + console.log("connected"); + setTimeout(startRefreshTimeout, 120000); + }, + + disconnected: function(data) { + console.log("disconnected"); + console.log(data); + }, + + rejected: function() { + console.log("rejected"); + }, + + received: function(data){ + console.log(data); + if(data.action == "started"){ + request_to_join_meeting(); + } + } + }); + } +}); + +var join_attempts = 0; + +function request_to_join_meeting() { + $.post(window.location.pathname, { join_name: $(".background").attr("join-name") }, function() { + //Successful post - set up retry incase + if(join_attempts < 4){ setTimeout(request_to_join_meeting, 10000); } + join_attempts++; + }) +} + +// Refresh the page after 2 mins and attempt to reconnect to ActionCable +function startRefreshTimeout() { + var url = new URL(window.location.href) + url.searchParams.set("reload","true") + window.location.href = url.href +} diff --git a/app/assets/locales/ca.json b/app/assets/locales/ca.json deleted file mode 100644 index 3ebfea06e6..0000000000 --- a/app/assets/locales/ca.json +++ /dev/null @@ -1,703 +0,0 @@ -{ - "start": "Inici", - "search": "Cerca", - "home": "Inici", - "previous": "Anterior", - "back": "Enrere", - "next": "Següent", - "view": "Veure", - "join": "Entra", - "edit": "Edita", - "save": "Desa", - "save_changes": "Desa els canvis", - "update": "Actualitza", - "report": "Informe", - "share": "Comparteix", - "cancel": "Cancel·la", - "close": "Tanca", - "delete": "Suprimeix", - "copy": "Copia enllaç d'entrada", - "copy_viewer_code": "Copia codi de visualitzador", - "copy_moderator_code": "Copia codi de moderador", - "or": "O", - "online": "Connectat", - "help_center": "Centre d'ajuda", - "are_you_sure": "Estàs segur?", - "return_home": "Torna a l'inici", - "created_at": "Creat el", - "view_recordings": "Veure enregistraments", - "join_session": "Entra a la sessió", - "no_result_search_input": "No s'han trobat resultats per a \"{{ searchInput }}\"", - "action_permanent": "Aquesta acció no es pot desfer.", - "homepage": { - "welcome_bbb": "Benvinguda a BigBlueButton.", - "bigbluebutton_description": "BigBlueButton és un sistema de conferències web de codi obert per a classes en línia. La plataforma maximitza el temps per a l'aprenentatge aplicat, permetent als estudiants col·laborar i rebre retroalimentació en temps real.", - "greenlight_description": "Crea les teves pròpies sales per organitzar sessions, o entra a altres utilitzant un enllaç curt i convenient.", - "learn_more": "Aprèn més sobre BigBlueButton", - "explore_features": "Explora les nostres funcionalitats", - "meeting_title": "Llança una reunió", - "meeting_description": "Llança una classe virtual amb vídeo, àudio, compartició de pantalla, xat i totes les eines requerides per a l'aprenentatge aplicat.", - "recording_title": "Enregistra les teves reunions", - "recording_description": "Enregistra les reunions de BigBlueButton i comparteix-les amb els estudiants per revisar i reflexionar sobre el material.", - "settings_title": "Gestiona les teves sales", - "settings_description": "Configura els paràmetres de sales i reunions per estar al càrrec d'una aula efectiva.", - "and_more_title": "I més!", - "and_more_description": "BigBlueButton ofereix eines integrades per a l'aprenentatge aplicat i està dissenyat per estalviar-te temps durant la classe.", - "enter_meeting_url": "Introdueix l'URL de la reunió", - "enter_meeting_url_instruction": "Si us plau, introdueix l'URL de la teva reunió de BigBlueButton al camp de sota." - }, - "authentication": { - "sign_in": "Inicia la sessió", - "sign_up": "Registre", - "sign_out": "Tanca la sessió", - "email": "Correu electrònic", - "password": "Contrasenya", - "confirm_password": "Confirma contrasenya", - "enter_email": "Introdueix el teu correu electrònic", - "enter_name": "Introdueix el teu nom", - "remember_me": "Recorda'm", - "forgot_password": "Has oblidat la contrasenya?", - "dont_have_account": "No tens un compte?", - "create_account": "Crea un compte", - "create_an_account": "Crea un compte", - "already_have_account": "Ja tens un compte?" - }, - "user": { - "user": "Usuari", - "users": "Usuaris", - "name": "Nom", - "email_address": "Adreça de correu electrònic", - "authenticator": "Autenticador", - "full_name": "Nom complet", - "no_user_found": "No s'ha trobat cap usuari", - "type_three_characters": "Si us plau, escriu tres (3) caràcters o més per mostrar els altres usuaris.", - "search_not_found": "No s'han trobat usuaris", - "profile": { - "profile": "Perfil", - "language": "Idioma", - "role": "Rol", - "administrator": "Administrador", - "guest": "Convidat" - }, - "account": { - "account_info": "Informació del compte", - "delete_account": "Suprimeix compte", - "change_password": "Canvia contrasenya", - "set_password": "Estableix la teva nova contrasenya", - "reset_password": "Restableix contrasenya", - "update_account_info": "Actualitza informació del compte", - "current_password": "Contrasenya actual", - "new_password": "Nova contrasenya", - "confirm_password": "Confirma contrasenya", - "permanently_delete_account": "Elimina permanentment el teu compte", - "delete_account_description": "Si decideixes suprimir el teu compte, NO es podrà recuperar. \n Tota la informació relacionada amb el teu compte, incloent configuracions, sales i enregistraments serà eliminada.", - "delete_account_confirmation": "Sí, vull suprimir el meu compte", - "are_you_sure_delete_account": "Estàs segur que vols suprimir el teu compte?" - }, - "avatar": { - "upload_avatar": "Puja Avatar", - "delete_avatar": "Suprimeix Avatar", - "crop_avatar": "Retalla el teu Avatar" - }, - "pending": { - "title": "Registre Pendent", - "message": "Gràcies per registrar-te! El teu compte està pendent d'aprovació per part d'un administrador." - } - }, - "room": { - "room": "Sala", - "rooms": "Sales", - "room_name": "Nom de la Sala", - "add_new_room": "+ Nova Sala", - "create_room": "Crea Sala", - "delete_room": "Suprimeix Sala", - "create_new_room": "Crear Nova Sala", - "enter_room_name": "Introdueix el nom de la sala", - "shared_by": "compartit per", - "last_session": "Última Sessió: {{ localizedTime }}", - "no_last_session": "No s'ha creat cap sessió anterior", - "search_not_found": "No s'han trobat Sales", - "rooms_list_is_empty": "Encara no tens cap sala!", - "rooms_list_empty_create_room": "Crea la teva primera sala fent clic al botó de sota i introduint un nom de sala.", - "meeting": { - "start_meeting": "Inicia Reunió", - "join_meeting": "Unir-se a la Reunió", - "meeting_invitation": "Has estat convidat a unir-te", - "meeting_not_started": "La reunió encara no ha començat", - "join_meeting_automatically": "T'uniràs automàticament quan la reunió comenci", - "recording_consent": "Reconec que aquesta sessió pot ser gravada. Això pot incloure la meva veu i vídeo si està activat." - }, - "presentation": { - "presentation": "Presentació", - "click_to_upload": "Fes clic per pujar", - "drag_and_drop": " o arrossega i deixa anar", - "upload_description": "Puja qualsevol document d'oficina o fitxer PDF (no més gran de {{size}}). Depenent de la mida del fitxer, pot requerir temps addicional per pujar abans que pugui ser utilitzat", - "delete_presentation": "Suprimeix Presentació", - "are_you_sure_delete_presentation": "Estàs segur que vols eliminar aquesta presentació?" - }, - "shared_access": { - "access": "Accés", - "add_share_access": "+ Comparteix Accés", - "share_room_access": "Comparteix Accés a la Sala", - "add_some_users": "Hora d'afegir alguns usuaris!", - "add_some_users_description": "Per afegir nous usuaris, fes clic al botó de sota i busca o selecciona els usuaris amb els quals vols compartir aquesta sala.", - "delete_shared_access": "Suprimeix Accés Compartit", - "are_you_sure_delete_shared_access": "Estàs segur que vols suprimir aquest Accés Compartit?" - }, - "settings": { - "settings": "Paràmetres", - "room_name": "Nom de la sala", - "user_settings": "Paràmetres d'Usuari", - "allow_room_to_be_recorded": "Permetre que la sala sigui enregistrada", - "require_signed_in": "Requereix que els usuaris iniciïn sessió abans d'unir-se", - "require_signed_in_message": "Has d'estar registrat per unir-te a aquesta sala.", - "require_mod_approval": "Requereix aprovació del moderador abans d'unir-se", - "allow_any_user_to_start": "Permetre a qualsevol usuari començar aquesta reunió", - "all_users_join_as_mods": "Tots els usuaris s'uneixen com a moderadors", - "mute_users_on_join": "Silencia els usuaris quan s'uneixen", - "generate": "Genera", - "access_code": "Codi d'Accés", - "mod_access_code": "Codi d'Accés de Moderador", - "mod_access_code_optional": "Codi d'Accés de Moderador (opcional)", - "access_code_required": "Si us plau, introdueix el codi d'accés", - "wrong_access_code": "Codi d'Accés Incorrecte", - "generate_viewers_access_code": "Genera codi d'accés per a espectadors", - "generate_mods_access_code": "Genera codi d'accés per a moderadors", - "are_you_sure_delete_room": "Estàs segur que vols suprimir aquesta sala?" - } - }, - "recording": { - "recording": "Enregistrament", - "recordings": "Enregistraments", - "processing": "Processant Enregistraments...", - "name": "Nom", - "length": "Durada", - "users": "Usuaris", - "visibility": "Visibilitat", - "formats": "Formats", - "published": "Publicat", - "unpublished": "No Publicat", - "protected": "Protegit", - "public": "Públic", - "public_protected": "Públic/Protegit", - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "Processant enregistrament, això pot trigar diversos minuts...", - "copy_recording_urls": "Copia URL(s) d'Enregistrament", - "recordings_list_empty": "Encara no tens cap enregistrament!", - "public_recordings_list_empty": "Encara no hi ha enregistraments públics!", - "recordings_list_empty_description": "Els enregistraments apareixeran aquí després que comencis una reunió i la registres.", - "public_recordings_list_empty_description": "Els enregistraments apareixeran aquí quan estiguin disponibles.", - "delete_recording": "Suprimeix Enregistrament", - "are_you_sure_delete_recording": "Estàs segur que vols suprimir aquest enregistrament?", - "search_not_found": "No s'han trobat Enregistraments" - }, - "admin": { - "admin_panel": "Panell d'Administrador", - "manage_users": { - "manage_users": "Gestiona Usuaris", - "active": "Actiu", - "approve": "Aprova", - "decline": "Declina", - "pending": "Pendent", - "banned": "Vetat", - "ban": "Veta", - "unban": "Treu el vet", - "deleted": "Suprimit", - "invited_tab": "Convidat", - "invite_user": "Convida Usuari", - "send_invitation": "Envia Invitació", - "enter_user_email": "Introdueix correu electrònic de l'usuari", - "new_user": "Nou Usuari", - "add_new_user": "Nou Usuari", - "create_new_user": "Crea Nou Usuari", - "edit_user": "Edita Usuari", - "delete_user": "Suprimeix Usuari", - "users_edit_path": "Usuaris/Editar", - "create_account": "Crea Compte", - "create_room": "Crea Sala", - "create_new_room": "Crea Nova Sala", - "user_created_at": "Creat: {{localizedTime}}", - "are_you_sure_delete_account": "Estàs segur que vols suprimir el compte de {{user.name}}?", - "delete_account_warning": "Si decideixes suprimir aquest compte, NO podrà ser recuperat.", - "empty_active_users": "Encara no hi ha usuaris actius en aquest servidor!", - "empty_active_users_subtext": "Quan l'estat d'un usuari canviï a actiu, apareixerà aquí.", - "empty_pending_users": "Encara no hi ha usuaris pendents en aquest servidor!", - "empty_pending_users_subtext": "Quan l'estat d'un usuari canviï a pendent, apareixerà aquí.", - "empty_banned_users": "Encara no hi ha usuaris prohibits en aquest servidor!", - "empty_banned_users_subtext": "Quan l'estat d'un usuari canviï a prohibit, apareixerà aquí.", - "empty_invited_users": "Encara no hi ha usuaris convidats en aquest servidor!", - "empty_invited_users_subtext": "Quan l'estat d'un usuari canviï a convidat, apareixerà aquí.", - "invited": { - "time_sent": "Hora d'Enviaments", - "valid": "Vàlid" - } - }, - "server_rooms": { - "server_rooms": "Sales del Servidor", - "name": "Nom", - "owner": "Propietari", - "room_id": "ID de la Sala", - "participants": "Participants", - "status": "Estat", - "running": "En marxa", - "not_running": "No en marxa", - "active": "Actiu", - "current_session": "Sessió actual: {{lastSession}}", - "last_session": "Última sessió: {{localizedTime}}", - "no_meeting_yet": "Encara no hi ha reunions.", - "delete_server_rooms": "Suprimeix Sala del Servidor", - "resync_recordings": "Re-sincronitzar Enregistraments", - "empty_room_list": "Encara no hi ha sales del servidor!", - "empty_room_list_subtext": "Les sales apareixeran aquí després de crear la teva primera sala." - }, - "server_recordings": { - "server_recordings": "Enregistraments del Servidor", - "latest_recordings": "Últims Enregistraments", - "no_recordings_found": "No s'han trobat enregistraments." - }, - "site_settings": { - "site_settings": "Paràmetres del Lloc", - "customize_greenlight": "Personalitzar Greenlight", - "appearance": { - "appearance": "Aparença", - "brand_color": "Color de Marca", - "regular": "Normal", - "lighten": "Aclareix", - "brand_image": "Imatge de Marca", - "click_to_upload": "Fes clic per pujada", - "drag_and_drop": " o arrossega i deixa anar", - "upload_brand_image_description": "Puja qualsevol fitxer PNG, JPG o SVG (no més gran de {{size}}). Depenent de la mida del fitxer, pot requerir temps addicional per pujar abans que pugui ser utilitzat", - "remove_branding_image": "Elimina Imatge de Marca" - }, - "administration": { - "administration": "Administració", - "terms": "Termes i Condicions", - "privacy": "Política de Privacitat", - "privacy_policy": "Política de Privacitat", - "change_term_links": "Canvia els enllaços de termes que apareixen al peu de pàgina", - "change_privacy_link": "Canvia l'enllaç de privacitat que apareix al peu de pàgina", - "helpcenter": "Centre d'Ajuda", - "change_helpcenter_link": "Canvia l'enllaç del centre d'ajuda que apareix sota el desplegable del perfil", - "maintenance": "Anunci de Manteniment", - "change_maintenance_text": "Canvia el text de l'anunci de manteniment que apareix a la capçalera", - "change_url": "Canvia URL", - "set_text": "Estableix Text", - "clear_banner": "Neteja Anunci", - "enter_link": "Introdueix enllaç aquí" - }, - "settings": { - "settings": "Paràmetres", - "allow_users_to_share_rooms": "Permetre als Usuaris Compartir Sales", - "allow_users_to_share_rooms_description": "Desactivar aquesta opció eliminarà el botó de les opcions de sala del desplegable, prevenint que els usuaris puguin compartir sales", - "allow_users_to_preupload_presentation": "Permetre als Usuaris Pujar Presentacions Prèviament", - "allow_users_to_preupload_presentation_description": "Els usuaris poden pujar una presentació prèviament per utilitzar-la com a presentació per defecte per a aquella sala específica", - "default_visibility": "Visibilitat d'Enregistrament per Defecte", - "default_visibility_description": "Tots els enregistraments creats de nou tindran aquesta visibilitat per defecte", - "session_timeout": "Temps d'Espera de la Sessió", - "session_timeout_description": "Pots configurar el temps d'espera de la sessió amb una cookie per defecte d'1 dia o una cookie de sessió ampliada de 7 dies", - "default_session_timeout": "Per defecte (1 dia)", - "extended_session_timeout": "Ampliat (7 dies)" - }, - "registration": { - "registration": "Registre", - "role_mapping_by_email": "Assignació de Rols per Correu Electrònic", - "role_mapping_by_email_description": "Assigna l'usuari a un rol utilitzant el seu correu electrònic. Ha d'estar en el format: rol1=correu1, rol2=correu2", - "enter_role_mapping_rule": "Introdueix una regla d'assignació de rols", - "resync_on_login": "Resincronitza Dades de l'Usuari a Cada Inici de Sessió", - "resync_on_login_description": "Resincronitza la informació d'un usuari cada vegada que inicien sessió, fent que el proveïdor d'autenticació extern sempre coincideixi amb la informació a Greenlight", - "default_role": "Rol per Defecte", - "default_role_description": "El rol per defecte que s'assignarà als usuaris de nova creació", - "registration_method": "Mètode de Registre", - "registration_method_description": "Canvia la manera en què els usuaris es registren al lloc web", - "registration_methods" : { - "open": "Registre Obert", - "invite": "Unir-se per Invitació", - "approval": "Aprova/Declina" - } - } - }, - "room_configuration": { - "room_configuration": "Configuració de la Sala", - "default": "Opcional (per defecte: activat)", - "optional": "Opcional (per defecte: desactivat)", - "enabled": "Força Activat", - "disabled": "Desactivat", - "configurations": { - "allow_room_to_be_recorded": "Permetre que la sala sigui enregistrada", - "allow_room_to_be_recorded_description": "Permet als propietaris de la sala especificar si volen l'opció d'enregistrar una sala o no. Si està activat, el moderador encara haurà de prémer el botó 'Enregistrar' una vegada hagi començat la reunió.", - "require_user_signed_in": "Requereix que els usuaris estiguin registrats abans de unir-se", - "require_user_signed_in_description": "Només permet als usuaris amb un compte de Greenlight unir-se a la reunió. Si no estan registrats, seran redirigits a la pàgina d'inici de sessió quan intentin unir-se a una sala.", - "require_mod_approval": "Requereix l'aprovació del moderador abans de unir-se", - "require_mod_approval_description": "Sol·licita al moderador de la reunió de BigBlueButton quan un usuari intenta unir-se. Si l'usuari és aprovat, podrà unir-se a la reunió.", - "allow_any_user_to_start_meeting": "Permetre a qualsevol usuari començar una reunió", - "allow_any_user_to_start_meeting_description": "Permet a qualsevol usuari començar la reunió en qualsevol moment. Per defecte, només el propietari de la sala pot començar la reunió.", - "allow_users_to_join_as_mods": "Tots els usuaris s'uneixen com a moderadors", - "allow_users_to_join_as_mods_description": "Dóna a tots els usuaris els privilegis de moderador a BigBlueButton quan s'uneixen a la reunió.", - "mute_users_on_join": "Silencia els usuaris quan s'uneixen", - "mute_users_on_join_description": "Silencia automàticament l'usuari quan s'uneix a la reunió de BigBlueButton.", - "viewer_access_code": "Codi d'Accés de Visualitzador", - "viewer_access_code_description": "Permet als propietaris de la sala tenir un codi alfanumèric aleatori que pot ser compartit amb els usuaris. El codi, si es genera, serà requerit perquè els usuaris puguin unir-se a les reunions de la sala.", - "mod_access_code": "Codi d'Accés de Moderador", - "mod_access_code_description": "Permet als propietaris de la sala tenir un codi alfanumèric aleatori que pot ser compartit amb els usuaris. El codi, si es genera, no serà requerit i quan s'utilitzi en qualsevol reunió de la sala unirà l'usuari com a moderador." - } - }, - "roles": { - "role": "Rol", - "roles": "Rols", - "administrator": "Administrador", - "guest": "Convidat", - "manage_roles": "Gestiona Rols", - "delete_role": "Suprimeix Rol", - "are_you_sure_delete_role": "Estàs segur que vols suprimir aquest rol?", - "enter_role_name": "Introdueix un nom de rol", - "add_role": "+ Crea Rol", - "create_role": "Crea Rol", - "create_new_role": "Crea un nou rol", - "no_role_found": "No s'ha trobat cap rol.", - "search_not_found": "No s'han Trobat Rols", - "edit": { - "create_room": "Permet als usuaris amb aquest rol crear sales", - "record": "Permet que els usuaris amb aquest rol enregistrin les seves reunions", - "manage_users": "Permet als usuaris amb aquest rol gestionar usuaris", - "manage_rooms": "Permet als usuaris amb aquest rol gestionar sales de servidors", - "manage_recordings": "Permet als usuaris amb aquest rol gestionar els enregistraments del servidor", - "manage_site_settings": "Permet als usuaris amb aquest rol gestionar els paràmetres del lloc", - "manage_roles": "Permet als usuaris amb aquest rol editar altres funcions", - "shared_list": "Inclou els usuaris amb aquest rol al menú desplegable per compartir sales", - "room_limit": "Límit d'habitació", - "email_on_signup": "Rebre un correu electrònic quan es registra un usuari nou", - "allowed_recording_visibility": "Visibilitats d'enregistrament permeses" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "S'ha creat un nou usuari.", - "user_updated": "L'usuari s'ha actualitzat.", - "user_deleted": "L'usuari s'ha suprimit.", - "avatar_updated": "L'avatar s'ha actualitzat.", - "password_changed": "S'ha actualitzat la contrasenya amb èxit. Si us plau, inicia sessió de nou.", - "password_updated": "La contrasenya s'ha actualitzat.", - "account_activated": "El teu compte s'ha activat.", - "activation_email_sent": "S'ha enviat un correu electrònic amb les instruccions per activar el teu compte.", - "reset_pwd_email_sent": "S'ha enviat un correu electrònic amb les instruccions per restablir la teva contrasenya." - }, - "session": { - "signed_out": "Has tancat la sessió." - }, - "room": { - "room_created": "S'ha creat una nova sala.", - "room_updated": "La sala s'ha actualitzat.", - "room_deleted": "La sala s'ha suprimit.", - "room_shared": "La sala s'ha compartit.", - "room_unshared": "La sala ha deixat de compartir-se.", - "recordings_synced": "Els enregistraments de la sala s'han sincronitzat.", - "room_configuration_updated": "La configuració de la sala s'ha actualitzat.", - "room_setting_updated": "Els paràmetres de la sala s'han actualitzat.", - "presentation_updated": "La presentació s'ha actualitzat.", - "presentation_deleted": "La presentació s'ha suprimit.", - "joining_meeting": "Unint-se a la reunió...", - "meeting_started": "Reunió iniciada.", - "access_code_copied": "El codi d'accés s'ha copiat.", - "access_code_generated": "S'ha generat un nou codi d'accés.", - "access_code_deleted": "El codi d'accés s'ha suprimit.", - "copied_meeting_url": "L'URL de la reunió s'ha copiat. L'enllaç es pot utilitzar per unir-se a la reunió.", - "copied_viewer_code": "El codi d'accés de visualització s'ha copiat.", - "copied_moderator_code": "El codi d'accés de moderador s'ha copiat." - }, - "site_settings": { - "site_setting_updated": "Els paràmetres del lloc s'han actualitzat.", - "brand_color_updated": "El color de la marca s'ha actualitzat.", - "brand_image_updated": "La imatge de la marca s'ha actualitzat.", - "brand_image_deleted": "La imatge de la marca s'ha suprimit.", - "privacy_policy_updated": "La política de privacitat s'ha actualitzat.", - "helpcenter_updated": "L'enllaç del centre d'ajuda s'ha actualitzat.", - "terms_of_service_updated": "Els termes del servei s'han actualitzat.", - "maintenance_updated": "L'anunci de manteniment s'ha actualitzat." - }, - "recording": { - "recording_visibility_updated": "La visibilitat dels enregistraments s'ha actualitzat.", - "recording_name_updated": "El nom dels enregistrament s'ha actualitzat.", - "recording_deleted": "L'enregistrament s'ha suprimit.", - "copied_urls": "Les URL de l'enregistrament s'ha copiat." - }, - "role": { - "role_created": "S'ha creat un nou rol.", - "role_updated": "El rol s'ha actualitzat.", - "role_deleted": "El rol s'ha suprimit.", - "role_permission_updated": "El permís del rol s'ha actualitzat." - }, - "invitations": { - "invitation_sent": "S'ha enviat una invitació." - } - }, - "error": { - "problem_completing_action": "L'acció no es pot completar. \n Si us plau, intenta-ho de nou.", - "file_type_not_supported": "El tipus de fitxer no és compatible.", - "file_size_too_large": "La mida del fitxer és massa gran.", - "file_upload_error": "El fitxer no es pot pujar.", - "signin_required": "Has d'estar registrat per accedir a aquesta pàgina.", - "malware_detected": "S'ha detectat programari maliciós! El fitxer que has pujat podria contenir programari maliciós. Si us plau, revisa el teu fitxer i intenta-ho de nou.", - "roles": { - "role_assigned": "Aquest rol no es pot suprimit perquè està assignat a almenys un usuari." - }, - "users": { - "signup_error": "No pots ser autenticat. Si us plau, contacta amb el teu administrador.", - "invalid_invite": "El teu testimoni d'invitació és invàlid o incorrecte. Si us plau, contacta amb el teu administrador per rebre un nou testimoni.", - "email_exists": "Ja existeix un compte amb aquest correu electrònic. Si us plau, intenta-ho de nou amb un altre correu electrònic.", - "old_password": "La contrasenya que has introduït és incorrecta.", - "pending": "La teva inscripció està pendent de l'aprovació de l'administrador. Si us plau, intenta-ho més tard.", - "banned": "No tens accés a aquesta aplicació. Si us plau, contacta amb el teu administrador si creus que això és un error." - }, - "rooms": { - "room_limit": "La sala no es pot crear perquè s'ha assolit el límit de sales." - }, - "session": { - "invalid_credentials": "El nom d'usuari o la contrasenya són invàlids. Si us plau, verifica les teves credencials i intenta-ho de nou." - } - } - }, - "global_error_page": { - "title": "Error", - "message": "Ho sentim, alguna cosa ha anat malament. Si l'incident es repeteix, si us plau, contacta amb l'administrador." - }, - "not_found_error_page": { - "title": "Pàgina No Trobada", - "message": "Ho sentim, la pàgina que estàs intentant accedir no es pot trobar." - }, - "account_activation_page": { - "title": "Activació del Compte", - "account_unverified": "El teu compte encara no ha estat verificat.", - "message": "Per utilitzar Greenlight, si us plau verifica el teu compte seguint les instruccions del correu electrònic d'activació que t'hem enviat.", - "resend_activation_link": "Si no has rebut un correu electrònic d'activació o si tens algun problema utilitzant-lo, fes clic al botó de sota per sol·licitar un nou correu electrònic d'activació.", - "resend_btn_lbl": "Reenvia Verificació" - }, - "forms": { - "validations": { - "full_name": { - "required": "Si us plau, introdueix un nom complet", - "min": "El nom ha de tenir almenys 2 caràcters", - "max": "El nom ha de tenir com a màxim 255 caràcters" - }, - "email": { - "required": "Si us plau, introdueix un correu electrònic", - "email": "El valor introduït no coincideix amb el format d'un correu electrònic", - "min": "El correu electrònic ha de tenir almenys 6 caràcters", - "max": "El correu electrònic ha de tenir com a màxim 255 caràcters" - }, - "password": { - "required": "Si us plau, introdueix una contrasenya", - "match": "La contrasenya ha de tenir almenys:", - "min": "- Vuit caràcters", - "lower": "- Una lletra minúscula", - "upper": "- Una lletra majúscula", - "digit": "- Un dígit", - "symbol": "- Un símbol", - "max": "La contrasenya ha de tenir com a màxim 255 caràcters" - }, - "password_confirmation": { - "required": "Si us plau, introdueix una confirmació de la contrasenya", - "match": "Les contrasenyes no coincideixen" - }, - "emails": { - "required": "Si us plau, introdueix almenys un correu electrònic vàlid", - "list": "Si us plau, proporciona una llista separada per comes de correus electrònics vàlids (usuari@usuaris.com,usuari1@usuaris.com,usuari2@usuaris.com)" - }, - "role_name": { - "required": "Si us plau, introdueix el nom del rol" - }, - "role": { - "limit": { - "required": "Si us plau, introdueix el límit de comptador de la sala", - "min": "El mínim permès és 0", - "max": "El màxim permès és 100" - }, - "type": { - "error": "Has d'especificar un número" - } - }, - "room": { - "name": { - "required": "Si us plau, introdueix el nom de la sala.", - "min": "El nom ha de tenir almenys 2 caràcters" - } - }, - "room_join": { - "name": { - "required": "Si us plau, introdueix el teu nom." - } - }, - "url": { - "invalid": "URL no vàlida" - } - }, - "room": { - "fields": { - "name": { - "label": "Nom de la Sala", - "placeholder": "Introdueix un nom per a la sala..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Nom", - "placeholder": "Introdueix el teu nom" - }, - "access_code": { - "label": "Codi d'Accés", - "placeholder": "Introdueix el codi d'accés" - }, - "recording_consent": { - "label": "Reconec que aquesta sessió pot ser enregistrada. Això pot incloure la meva veu i vídeo si està activat." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Nom complet", - "placeholder": "Introdueix el teu nom complet" - }, - "email": { - "label": "Correu electrònic", - "placeholder": "Introdueix el teu correu electrònic" - }, - "password": { - "label": "Contrasenya", - "placeholder": "Crea una contrasenya" - }, - "password_confirmation": { - "label": "Confirma la Contrasenya", - "placeholder": "Confirma la contrasenya" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Correu electrònic", - "placeholder": "Correu electrònic" - }, - "password": { - "label": "Contrasenya", - "placeholder": "Contrasenya" - }, - "remember_me": { - "label": "Recorda'm" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Contrasenya actual", - "placeholder": "Introdueix la teva contrasenya" - }, - "new_password": { - "label": "Nova contrasenya", - "placeholder": "Introdueix la teva nova contrasenya" - }, - "password_confirmation": { - "label": "Confirma la contrasenya", - "placeholder": "Confirma la teva nova contrasenya" - } - }, - "validations": { - "old_password": { - "required": "Si us plau, introdueix la teva contrasenya actual" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Correu electrònic", - "placeholder": "Introdueix el correu electrònic del compte" - } - }, - "validations": { - "email": { - "required": "Si us plau, introdueix el correu electrònic del compte" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Nova contrasenya", - "placeholder": "Introdueix la teva nova contrasenya" - }, - "password_confirmation": { - "label": "Confirma la contrasenya", - "placeholder": "Confirma la teva nova contrasenya" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Nom complet" - }, - "email": { - "label": "Correu electrònic" - }, - "language": { - "label": "Idioma" - }, - "role": { - "label": "Rol" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Nom complet", - "placeholder": "Introdueix el nom complet de l'usuari" - }, - "email": { - "label": "Correu electrònic", - "placeholder": "Introdueix el correu electrònic de l'usuari" - }, - "password": { - "label": "Contrasenya", - "placeholder": "Introdueix la contrasenya de l'usuari" - }, - "password_confirmation": { - "label": "Confirma Contrasenya", - "placeholder": "Confirma la contrasenya" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Correus electrònics" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Introdueix l'enllaç aquí...", - "text_placeholder": "Introdueix el text aquí..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Nom del rol", - "placeholder": "Introdueix un nom de rol..." - } - } - } - } - } -} diff --git a/app/assets/locales/cs.json b/app/assets/locales/cs.json deleted file mode 100644 index 857d91d221..0000000000 --- a/app/assets/locales/cs.json +++ /dev/null @@ -1,375 +0,0 @@ -{ - "start": "Start", - "search": "Hledat", - "previous": "Předchozí", - "back": "Zpět", - "next": "Následující", - "view": "Nahlédnout do místnosti", - "join": "Připojit se", - "edit": "Upravit", - "save": "Uložit", - "save_changes": "Uložit změny", - "update": "Aktualizovat", - "report": "Nahlásit", - "share": "Sdílet", - "cancel": "Zrušit", - "close": "Zavřít", - "delete": "Smazat", - "copy": "Kopírovat", - "or": "Nebo", - "online": "Online", - "need_help": "Potřebujete pomoci?", - "are_you_sure": "Jste si jist/á?", - "return_home": "Návrat domů", - "created_at": "Vytvořeno v", - "homepage": { - "welcome_bbb": "Vítejte v BigBlueButtonu.", - "greenlight_description": "Greenlight je jednoduché webové rozhraní k BigBlueButtonu web videokonferenčnímu řešení. Můžete si vytvářet vlastní místnosti nebo se připojit k existujícím pomocí krátkého odkazu." - }, - "authentication": { - "sign_in": "Přihlásit", - "sign_up": "Registrace", - "sign_out": "Odhlásit", - "email": "Email", - "password": "Heslo", - "confirm_password": "Potvrdit heslo", - "enter_email": "Vložte Váš email", - "enter_name": "Vložte Vaše jméno", - "remember_me": "Zapamatovat si mě", - "forgot_password": "Zapomenuté heslo?", - "dont_have_account": "Nemáte účet?", - "create_account": "Vytvořit účet", - "create_an_account": "Vytvořit účet", - "already_have_account": "Máte už účet?" - }, - "user": { - "user": "Uživatel", - "users": "Uživatelé", - "name": "Jméno", - "email_address": "Emailová adresa", - "authenticator": "Ověřen přes", - "full_name": "Celé jméno", - "no_user_found": "Uživatel nenalezen", - "type_three_characters": "Prosím napište alespoň (3) znaků.", - "profile": { - "profile": "Profile", - "language": "Jazyk", - "role": "Role", - "administrator": "Administrátor", - "guest": "Host" - }, - "account": { - "account_info": "Informace o účtu", - "delete_account": "Smazat účet", - "change_password": "Změnit heslo", - "reset_password": "Reset hesla", - "update_account_info": "Aktualizovat informace o účtu", - "current_password": "Stávající heslo", - "new_password": "Nové heslo", - "confirm_password": "Potvrdit heslo", - "permanently_delete_account": "Permanentně smazat Váš účet", - "delete_account_description": "Pokud zvolíte smazat Váš účet. Je to nevratný proces.\nVšechny informace vztahující se k Vašemu účtu budou smazány, včetně nastavení, místností a nahrávek.", - "delete_account_confirmation": "Ano, rád bych smazal svůj účet", - "are_you_sure_delete_account": "Opravdu chcete smazat Váš účet?" - }, - "avatar": { - "upload_avatar": "Nahrát ikonku (avatar)", - "delete_avatar": "Smazat ikonku (avatar)", - "crop_avatar": "Oříznout ikonku (avatar)" - } - }, - "room": { - "room": "Místnost", - "rooms": "Místnosti", - "room_name": "Název místnosti", - "add_new_room": "+ Nová místnost", - "create_room": "Vytvořit místnost", - "delete_room": "Smazat místnost", - "create_new_room": "Vytvořit novou místnost", - "enter_room_name": "Vložte jméno místnosti", - "shared_by": "sdíleno s", - "last_session": "Poslední setkání: {{ localizedTime }}", - "no_last_session": "Žádné", - "no_rooms_found": "Žádná místnost nenalezena", - "meeting": { - "start_meeting": "Začátek setkání", - "join_meeting": "Připojit k setkání", - "meeting_invitation": "Byl jste pozván připojit se", - "meeting_not_started": "Setkání zatím nezačalo", - "join_meeting_automatically": "Budete automaticky připojen, jakmile setkání začne", - "recording_consent": "Souhlasím, že setkání může být nahráváno včetně hlasu a videa." - }, - "presentation": { - "presentation": "Prezentace", - "click_to_upload": "Nahrát", - "drag_and_drop": "nebo soubor přetáhněte sem", - "upload_description": "Nahrajte office nebo PDF dokument. Záleží na velikosti dokumentu, zpracování může chvíli trvat než bude dostupný.", - "are_you_sure_delete_presentation": "Opravdu chcete smazat tuto prezentaci?" - }, - "shared_access": { - "access": "Přístup", - "add_share_access": "+ Přidat přístup", - "share_room_access": "Sdílet přístup do místnosti", - "add_some_users": "Čas přidat nějaké uživatele!", - "add_some_users_description": "Pro přidání nových uživatelů, klikněte níže, hledejte a vyberte uživatele se kterými chcete sdílet místnost." - }, - "settings": { - "settings": "Nastavení", - "room_name": "Název místnosti", - "user_settings": "Nastavení uživatel", - "allow_room_to_be_recorded": "Povolit záznam místnosti", - "require_signed_in": "Vyžadovat přihlášení než se uživatelé mohou připojit.", - "require_signed_in_message": "Pro připojení do této místnosti musíte být přihlášen", - "require_mod_approval": "Připojení vyžaduje schválení moderátorem", - "allow_any_user_to_start": "Povolit komukoliv zahájit setkání", - "all_users_join_as_mods": "Všichni uživatelé budou mít roli moderátor", - "mute_users_on_join": "Ztlumit uživatele po připojení", - "generate": "Generovat", - "access_code": "Přístupový kód", - "mod_access_code": "Přístupový kód moderátora", - "mod_access_code_optional": "Přístupový kód moderátora (volitelný)", - "access_code_required": "Prosím vložte přístupový kód", - "wrong_access_code": "Neplatný přístupový kód", - "generate_viewers_access_code": "Generovat přístupový kód pro účastníky", - "generate_mods_access_code": "Generovat přístupový kód pro moderátory" - } - }, - "recording": { - "recording": "Nahrává se", - "recordings": "Nahrávky", - "name": "Název", - "length": "Délka", - "users": "Uživatelé", - "visibility": "Viditelnost", - "formats": "Formáty", - "published": "Zveřejněno", - "unpublished": "Nezveřejněno", - "protected": "Chráněno", - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "Zpracovávání záznamu...", - "copy_recording_urls": "Zkopírovat odkaz záznamu", - "no_recording_found": "Záznam nenalezen", - "are_you_sure_delete_recording": "Opravdu chcete smazat záznam?" - }, - "admin": { - "admin_panel": "Panel administrátora", - "manage_users": { - "manage_users": "Spravovat uživatele", - "active": "Aktivní", - "approve": "Schválit", - "decline": "Zamítnout", - "pending": "Čekající", - "banned": "Zakázaný", - "ban": "Zakázat", - "unban": "Povolit", - "deleted": "Smazaní", - "invited_tab": "Pozvaní", - "invite_user": "Pozvat uživatele", - "send_invitation": "Poslat pozvánku", - "new_user": "Nový uživatel", - "add_new_user": "Nový uživatel", - "create_new_user": "Vytvořit uživatele", - "edit_user": "Upravit uživatele", - "delete_user": "Odstranit uživatele", - "users_edit_path": "Uživatelé/Úprava", - "create_account": "Vytvořit účet", - "create_room": "Vytvořit místnost", - "create_new_room": "Vytvořit novou místnost", - "user_created_at": "Vytvořeno: {{user.created_at}}", - "enter_user_email": "Vložte email", - "enter_user_name": "Vložte jméno", - "are_you_sure_delete_account": "Opravdu chcete smazat účet {{user.name}}?", - "delete_account_warning": "Pokud účet smažete, nelze účet obnovit.", - "invited": { - "time_sent": "Čas odeslání", - "valid": "Platný" - } - }, - "server_rooms": { - "server_rooms": "Místnosti", - "name": "Název", - "owner": "Vlastník", - "room_id": "ID místnosti", - "participants": "Účastníci", - "status": "Stav", - "running": "Aktivní", - "not_running": "Neaktivní", - "active": "Aktivní", - "current_session": "Aktuální setkání: {{lastSession}}", - "last_session": "Poslední setkání: {{lastSession}}", - "no_meeting_yet": "Zatím setkání neprobíhá.", - "delete_server_rooms": "Smazat místnost", - "resync_recordings": "Sesynchronizovat nahrávky" - }, - "server_recordings": { - "server_recordings": "Nahrávky", - "latest_recordings": "Poslední nahrávky", - "no_recordings_found": "Žádné nahrávky" - }, - "site_settings": { - "site_settings": "Nastavení serveru", - "customize_greenlight": "Přizpůsobit Greenlight", - "appearance": { - "appearance": "Vzhled", - "brand_color": "Firemní barva", - "regular": "Regular", - "lighten": "Světlý", - "brand_image": "Firemní obrázek", - "click_to_upload": "Nahrát", - "drag_and_drop": "nebo přetáhnout soubor sem", - "upload_brand_image_description": "Nahrát obrázek (PNG, JPG, SVG). Nahrání obrázku může chvíli trvat než bude k dispozici" - }, - "administration": { - "administration": "Administrace", - "terms": "Podmínky užití", - "privacy": "Soukromý", - "privacy_policy": "Zásady soukromý", - "change_term_links": "Nastavit odkaz na podmínky užití (v patičce stránky)", - "change_privacy_link": "Nastavte odkaz na zásady soukromý (v patičce stránky)", - "change_url": "Nastavit URL", - "enter_link": "Vložte odkaz zde" - }, - "settings": { - "allow_users_to_share_rooms": "Povolit uživatelům sdílet místnosti", - "allow_users_to_share_rooms_description": "Nastavení na vypnuto zabrání uživatelům vybrat možnost sdílet místnost.", - "allow_users_to_preupload_presentation": "Umožnit uživatelům nahrát prezentace dopředu", - "allow_users_to_preupload_presentation_description": "Uživatelé mohou nahrát prezentaci jako výchozí pro konkrétní místnost" - }, - "registration": { - "registration": "Registrace", - "role_mapping_by_email": "Mapování rolí podle emailu", - "role_mapping_by_email_description": "Mapovat uživatele na role podle emailu. Dle formátu: role1=email1, role2=email2", - "enter_role_mapping_rule": "Vložit pravidlo mapování rolí", - "resync_on_login": "Synchronizovat uživatelská data po každém přihlášení", - "resync_on_login_description": "Synchronizovaní údajů o uživateli při každém přihlášení, převzetí údajů z externího poskytovatele identit do Greenlight", - "default_role": "Výchozí role", - "default_role_description": "Výchozí role je přidělena nově vytvořeným uživatelům", - "registration_method": "Metoda registrace", - "registration_method_description": "Nastavit způsob registrace uživatelů", - "registration_methods" : { - "open": "Otevřená registrace", - "invite": "Registrace na pozvánku", - "approval": "Schvalování registrace" - } - } - }, - "room_configuration": { - "room_configuration": "Nastavení místnosti", - "optional": "Volitelný", - "enabled": "Zapnuto", - "disabled": "Vypnuto", - "configurations": { - "allow_room_to_be_recorded": "Povolit záznam místnosti", - "allow_room_to_be_recorded_description": "Umožnit vlastníku místnosti povolit záznam. Záznam spouští moderátor pří setkání.", - "require_user_signed_in": "Připojení vyžaduje přihlášení uživatelů", - "require_user_signed_in_description": "Pouze přihlášení uživatelé se mohou připojit. Ostatní budou přesměrováni na přihlašovací stránku.", - "require_mod_approval": "Připojení vyžaduje schválení moderátorem", - "require_mod_approval_description": "Moderátor byl vyzván, aby schválil vpuštění uživatelů do místnosti.", - "allow_any_user_to_start_meeting": "Umožnit komukoliv zahájit setkání", - "allow_any_user_to_start_meeting_description": "Umožnit komukoliv a kdykoliv zahájit setkání. Ve výchozím stavu muže zahájit setkání pouze vlastník místnosti.", - "allow_users_to_join_as_mods": "Umožnit uživatelům se připojit jako moderátoři", - "allow_users_to_join_as_mods_description": "Přidat všem uživatelům práva moderátora ihned po připojení do místnosti.", - "mute_users_on_join": "Ztlumit uživatele po připojení", - "mute_users_on_join_description": "Automatické ztlumení mikrofonu uživatelům ihned po připojení do místnosti", - "viewer_access_code": "Přístupový kód účastníka", - "viewer_access_code_description": "Umožnit vlastníkům mít náhodný přístupový kód, který vlastník sdílí s účastníky. Účastník bez kódu se nepřipojí do místnosti.", - "mod_access_code": "Přístupový kód moderátora", - "mod_access_code_description": "Umožnit vlastníkům mít náhodný přístupový kód sdílený s účastníky. Uživatel s tímto kódem se stává moderátorem." - } - }, - "roles": { - "role": "Role", - "roles": "Role", - "administrator": "Administrátor", - "guest": "Host", - "manage_roles": "Správa rolí", - "delete_role": "Smazat roli", - "are_you_sure_delete_role": "Opravdu chcete smazat tuto roli?", - "enter_role_name": "Vložte název role", - "add_role": "+ Vytvořit roli", - "create_role": "Vytvořit roli", - "create_new_role": "Vytvořit novou roli", - "no_role_found": "Role nenalezena." - } - }, - "toast": { - "success": { - "user": { - "user_updated": "Úspěšně aktualizováno", - "user_deleted": "Uživatel odstraněn", - "avatar_updated": "Ikonka (avatar) aktualizována.", - "password_updated": "Heslo aktualizováno.", - "account_activated": "Účet aktivován", - "activation_email_sent": "Aktivační email odeslán" - }, - "session": { - "signed_out": "Úspěšně odhlášen." - }, - "room": { - "room_created": "Místnost vytvořena", - "room_updated": "Nastavení místnosti aktualizováno.", - "room_deleted": "Místnost smazána.", - "room_shared": "Místnost sdílena", - "room_unshared": "Místnost odsdílena", - "recordings_synced": "Nahrávky u místnosti jsou synchronizované", - "server_room_deleted": "Místnost odstraněna", - "room_configuration_updated": "Aktualizováno nastavení místnosti.", - "room_setting_updated": "Aktualizováno nastavení místnosti.", - "presentation_updated": "Prezentace aktualizována.", - "presentation_deleted": "Prezentace odstraněna.", - "joining_meeting": "Připojování...", - "meeting_started": "Setkání započalo.", - "access_code_copied": "Přístupový kód zkopírován.", - "access_code_generated": "Přístupový kód vygenerován.", - "access_code_removed": "Přístupový kód odstraněn." - }, - "site_settings": { - "site_setting_updated": "Nastavení server aktualizováno." - }, - "recording": { - "recording_visibility_updated": "Nastavení viditelnosti nahrávky aktualizováno.", - "recording_name_updated": "Název nahrávky aktualizován.", - "recording_deleted": "Nahrávka odstraněna" - }, - "role": { - "role_created": "Role vytvořena.", - "role_updated": "Role aktualizována.", - "role_deleted": "Role odstraněna.", - "role_permission_updated": "Oprávnění role aktualizováno." - }, - "invitations": { - "invitation_sent": "Pozvánka odeslána" - } - }, - "error": { - "problem_completing_action": "Akce se nepodařila dokončit\nProsím zkuste ještě jednou.", - "file_type_not_supported": "Nepodporovaný typ souboru.", - "file_size_too_large": "Překročena velikost souboru.", - "signin_required": "Musíte být přihlášen pro přístup k této stránce", - "roles": { - "role_assigned": "Roli nelze odstranit, jelikož je přidělena alespoň jednomu uživateli." - }, - "users": { - "invalid_invite": "Token z pozvánky je neplatný. Prosím kontaktujte administrátora." - }, - "rooms": { - "room_limit": "Nová místnost nebude vytvořena, jelikož byl dosažen limit povolených místností." - } - } - }, - "global_error_page": { - "title": "Chyba", - "message": "Něco se pokazilo. Pokud se bude chyba opakovat, tak prosím kontaktujte administrátora." - }, - "not_found_error_page": { - "title": "Nenalezeno", - "message": "Stránka nenalezena." - }, - "account_activation_page": { - "title": "Aktivace účtu", - "account_unverified": "Účet zatím nebyl ověřen.", - "message": "Prosím dodržte postup ověření účtu, který Vám byl poslán v aktivačním emailu.", - "resend_activation_link": "V případě, že Vám aktivační email nedorazil, klikněte prosím na tlačítko \"Přeposlat ověření\" .", - "resend_btn_lbl": "Přeposlat ověření" - } -} diff --git a/app/assets/locales/de.json b/app/assets/locales/de.json deleted file mode 100644 index 9be0b1cc9b..0000000000 --- a/app/assets/locales/de.json +++ /dev/null @@ -1,728 +0,0 @@ -{ - "start": "Starten", - "search": "Suche", - "home": "Startseite", - "previous": "Zurück", - "back": "Zurück", - "next": "Weiter", - "view": "Anzeigen", - "join": "Teilnehmen", - "edit": "Ändern", - "save": "Speichern", - "save_changes": "Änderungen speichern", - "update": "Aktualisieren", - "report": "Bericht", - "share": "Teilen", - "cancel": "Abbrechen", - "reset": "Zurücksetzen", - "close": "Schließen", - "delete": "Löschen", - "copy": "Einladungslink kopieren", - "copy_viewer_code": "Zugangscode für Zuhörerende kopieren", - "copy_moderator_code": "Zugangscode für Moderation kopieren", - "or": "oder", - "online": "Online", - "help_center": "Hilfe", - "are_you_sure": "Wirklich sicher?", - "return_home": "Zurück zur Startseite", - "created_at": "Erstellt am", - "view_recordings": "Aufzeichnungen anzeigen", - "join_session": "Sitzung beitreten", - "no_result_search_input": "Es konnten keine Ergebnisse für \"{{ searchInput }}\" gefunden werden", - "action_permanent": "Diese Aktion kann nicht rückgängig gemacht werden.", - "homepage": { - "welcome_bbb": "Willkommen in BigBlueButton.", - "bigbluebutton_description": "BigBlueButton ist ein Open-Source-Webkonferenzsystem für Online-Kurse. Die Plattform optimiert das Lernen, indem sie es ermöglicht, zusammenzuarbeiten und Feedback in Echtzeit zu erhalten.", - "greenlight_description": "Erstelle mit ihr eigene Räume, um Konferenzen abzuhalten, oder tritt über einen kurzen und bequemen Link einer bestehenden bei.", - "learn_more": "Erfahre mehr über BigBlueButton", - "explore_features": "Entdecke unsere Features", - "meeting_title": "Konferenzen starten", - "meeting_description": "Starten Sie einen virtuellen Kurs mit Video, Audio, Bildschirmfreigabe, Chat und allen Tools, die für angewandtes Lernen erforderlich sind.", - "recording_title": "Konferenzen aufzeichnen", - "recording_description": "Zeichne die Konferenzen auf und gebe sie an die Lernenden weiter, um den Inhalt zu besprechen und zu reflektieren.", - "settings_title": "Räume verwalten", - "settings_description": "Konfiguriere Räume und Konferenzeinstellungen, um einen effizienten Online-Kurs einzurichten.", - "and_more_title": "Und mehr!", - "and_more_description": "BigBlueButton bietet Tools für angewandtes Lernen und ist so konzipiert, dass du im Kurs Zeit sparst.", - "enter_meeting_url": "Konferenz-URL eingeben", - "enter_meeting_url_instruction": "Bitte geben Sie die URL Ihres BigBlueButton-Meetings in das unten stehende Feld ein." - }, - "authentication": { - "sign_in": "Anmelden", - "sign_up": "Registrieren", - "sign_out": "Abmelden", - "email": "E-Mail", - "password": "Passwort", - "confirm_password": "Passwort bestätigen", - "enter_email": "Mail eingeben", - "enter_name": "Namen eingeben", - "remember_me": "Eingeloggt bleiben", - "forgot_password": "Passwort zurücksetzen", - "dont_have_account": "Noch kein Konto?", - "create_account": "Konto erstellen", - "create_an_account": "Neues Konto erstellen", - "already_have_account": "Konto bereits vorhanden?" - }, - "user": { - "user": "Nutzer", - "users": "Nutzende", - "name": "Name", - "email_address": "E-Mail-Adresse", - "authenticator": "Authentifizierungsanbieter", - "full_name": "Vollständiger Name", - "no_user_found": "Keine Nutzenden gefunden", - "type_three_characters": "Bitte gib mindestens drei (3) Zeichen ein, um andere Nutzende anzuzeigen.", - "search_not_found": "Keine Nutzenden gefunden", - "profile": { - "profile": "Profil", - "language": "Sprache", - "role": "Rolle", - "administrator": "Administrator", - "guest": "Gast" - }, - "account": { - "account_info": "Kontoinformation", - "delete_account": "Konto löschen", - "change_password": "Passwort ändern", - "set_password": "Setzen Sie Ihr neues Passwort", - "reset_password": "Passwort zurücksetzen", - "update_account_info": "Konto aktualisieren", - "current_password": "Aktuelles Passwort", - "new_password": "Neues Passwort", - "confirm_password": "Passwort bestätigen", - "permanently_delete_account": "Konto endgültig löschen", - "delete_account_description": "Wenn das Konto gelöscht wird, kann es NICHT wiederhergestellt werden.\nAlle Daten des Kontos einschließlich Einstellungen, Räume und Aufzeichnungen werden gelöscht.", - "delete_account_confirmation": "Ja, ich möchte mein Konto löschen.", - "are_you_sure_delete_account": "Konto wirklich löschen?" - }, - "avatar": { - "upload_avatar": "Avatar hochladen", - "delete_avatar": "Avatar löschen", - "crop_avatar": "Avatar zurechtschneiden" - }, - "pending": { - "title": "Ausstehende Registrierung", - "message": "Vielen Dank für Ihre Registrierung! Ihr Konto muss derzeit noch von einem Administrator genehmigt werden." - } - }, - "room": { - "room": "Raum", - "rooms": "Räume", - "room_name": "Raumname", - "add_new_room": "+ Neuer Raum", - "create_room": "Raum erstellen", - "delete_room": "Raum löschen", - "create_new_room": "Neuen Raum erstellen", - "enter_room_name": "Raumname eingeben", - "shared_by": "geteilt von", - "last_session": "Letzte Sitzung: {{localizedTime}}", - "no_last_session": "Es existiert keine vorhergehende Sitzung", - "search_not_found": "Keine Räume gefunden", - "rooms_list_is_empty": "Du hast noch keine Räume!", - "rooms_list_empty_create_room": "Erstelle deinen ersten Raum, indem du auf die Schaltfläche unten klickst und einen Raumnamen eingibst.", - "meeting": { - "start_meeting": "Konferenz starten", - "join_meeting": "Konferenz beitreten", - "meeting_invitation": "Du wurdest zur Teilnahme eingeladen", - "meeting_not_started": "Die Konferenz hat noch nicht begonnen", - "join_meeting_automatically": "Beitritt erfolgt automatisch, sobald die Konferenz beginnt", - "recording_consent": "Ich nehme zur Kenntnis, dass die Sitzung aufgezeichnet werden kann. Dies wird meine Stimme und mein Bild einschließen, wenn dies aktiviert ist." - }, - "presentation": { - "presentation": "Präsentation", - "click_to_upload": "Klicken zum Hochladen", - "drag_and_drop": " oder Datei per Drag & Drop hier ablegen.", - "upload_description": "Ein Office-Dokument oder eine PDF-Datei hochladen (nicht größer als {{size}}). Abhängig von der Größe kann das eine gewisse Zeit dauern.", - "delete_presentation": "Präsentation löschen", - "are_you_sure_delete_presentation": "Diese Präsentation wirklich löschen?" - }, - "shared_access": { - "access": "Zugriff", - "add_share_access": "Zugriff teilen", - "share_room_access": "Teile Raumzugriff", - "add_some_users": "Füge jetzt ein paar Nutzende hinzu!", - "add_some_users_description": "Um jemanden hinzuzufügen, klicke den Knopf unten und suche beziehungsweise wähle aus, mit wem du den Raum teilen möchtest.", - "delete_shared_access": "Freigegebenen Raumzugriff löschen", - "are_you_sure_delete_shared_access": "Freigegebenen Raumzugriff wirklich löschen?" - }, - "settings": { - "settings": "Einstellungen", - "room_name": "Raumname", - "user_settings": "Nutzer-Einstellungen", - "allow_room_to_be_recorded": "Raum darf aufgezeichnet werden", - "require_signed_in": "Nutzende müssen vor dem Beitritt eingeloggt sein", - "require_signed_in_message": "Login erforderlich um beizutreten.", - "require_mod_approval": "Moderation muss dem Beitritt zustimmen", - "allow_any_user_to_start": "Alle Nutzenden können die Konferenz starten", - "all_users_join_as_mods": "Alle Nutzenden nehmen als Moderation teil", - "mute_users_on_join": "Nutzende anfangs stummschalten", - "generate": "Generieren", - "access_code": "Zugangscode", - "mod_access_code": "Zugangscode für Moderation", - "mod_access_code_optional": "Zugangscode für Moderation (optional)", - "access_code_required": "Bitte den Zugangscode eingeben", - "wrong_access_code": "Falscher Zugangscode", - "generate_viewers_access_code": "Zugangscode für Zuhörende generieren", - "generate_mods_access_code": "Zugangscode für die Moderation generieren", - "server_tag": "Einen Servertyp für diesen Raum auswählen", - "default_tag_name": "Standard", - "server_tag_desired": "Erwünscht", - "server_tag_required": "Notwendig", - "are_you_sure_delete_room": "Diesen Raum wirklich löschen?" - } - }, - "recording": { - "recording": "Aufzeichnung", - "recordings": "Aufzeichnungen", - "processing": "Aufzeichnungen werden erstellt...", - "name": "Name", - "length": "Länge", - "users": "Nutzende", - "visibility": "Sichtbarkeit", - "formats": "Formate", - "published": "Veröffentlicht", - "unpublished": "Unveröffentlicht", - "protected": "Geschützt", - "public": "Öffentlich", - "public_protected": "Öffentlich/Geschützt", - "length_in_minutes": "{{recording.length}} Minuten", - "processing_recording": "Aufzeichnung wird erstellt, dies kann einige Minuten dauern...", - "copy_recording_urls": "Kopiere die URL(s) der Aufzeichnungen", - "recordings_list_empty": "Keine Aufzeichnung gefunden!", - "public_recordings_list_empty": "Bisher gibt es keine öffentlichen Aufzeichnungen!", - "recordings_list_empty_description": "Aufzeichnungen werden hier angezeigt, nachdem du eine Besprechung gestartet und aufgezeichnet hast.", - "public_recordings_list_empty_description": "Hier werden Aufzeichnungen angezeigt,sobald sie verfügbar sind.", - "delete_recording": "Aufzeichnung löschen", - "are_you_sure_delete_recording": "Diese Aufzeichnung wirklich löschen?", - "search_not_found": "Keine Aufzeichnungen gefunden" - }, - "admin": { - "admin_panel": "Administration", - "manage_users": { - "manage_users": "Nutzende verwalten", - "active": "Aktiv", - "approve": "Zulassen", - "decline": "Ablehnen", - "pending": "Wartend", - "banned": "Gesperrt", - "ban": "Sperren", - "unban": "Entsperren", - "unverified": "Unverifiziert", - "verify": "Verifizieren", - "deleted": "Gelöscht", - "invited_tab": "Eingeladen", - "invite_user": "Nutzende einladen", - "send_invitation": "Einladung senden", - "enter_user_email": "E-Mail eingeben", - "new_user": "Neue Nutzer:in", - "add_new_user": "Neue Nutzer:in", - "create_new_user": "Neue Nutzer:in erstellen", - "edit_user": "Nutzer:in ändern", - "delete_user": "Nutzer:in löschen", - "users_edit_path": "Nutzer/Bearbeiten", - "create_account": "Konto erstellen", - "create_room": "Raum erstellen", - "create_new_room": "Neuen Raum erstellen", - "user_created_at": "Erstellt am: {{localizedTime}}", - "are_you_sure_delete_account": "Wirklich das Konto von {{user.name}} löschen?", - "delete_account_warning": "Wenn dieses Konto gelöscht wird, kann es NICHT wiederhergestellt werden.", - "empty_active_users": "Es gibt noch keine aktiven Nutzenden auf diesem Server!", - "empty_active_users_subtext": "Wenn der Status eines Nutzers/einer Nutzerin auf \"aktiv\" geändert wird, wird er hier angezeigt.", - "empty_pending_users": "Es sind noch keine freizugebenden Nutzenden auf diesem Server!", - "empty_pending_users_subtext": "Wenn der Status eines Nutzers/einer Nutzerin auf \"ausstehend\" geändert wird, erscheint er hier.", - "empty_banned_users": "Es gibt noch keine gesperrten Nutzenden auf diesem Server!", - "empty_banned_users_subtext": "Wenn der Status eines Nutzers/einer Nutzerin auf \"gesperrt\" geändert wird, erscheint er hier.", - "empty_unverified_users": "Auf dieser Instanz sind keine unverifizierten Nutzende vorhanden!", - "empty_unverified_users_subtext": "Alle unverifizierte Nutzende werden hier erscheinen.", - "empty_invited_users": "Es sind noch keine eingeladenen Nutzenden auf diesem Server!", - "empty_invited_users_subtext": "Wenn der Status eines Nutzers/einer Nutzerin auf \"eingeladen\" geändert wird, erscheint er hier.", - "invited": { - "time_sent": "Sendezeitpunkt", - "valid": "Gültig", - "revoke": "Widerrufen" - } - }, - "server_rooms": { - "server_rooms": "alle Räume", - "name": "Name", - "owner": "Besitzer:in", - "room_id": "Raum-ID", - "participants": "Teilnehmende", - "status": "Status", - "running": "Laufend", - "not_running": "Nicht laufend", - "active": "Aktiv", - "current_session": "Aktuelle Sitzung: {{lastSession}}", - "last_session": "Letzte Sitzung: {{localizedTime}}", - "no_meeting_yet": "Bisher keine Konferenz.", - "delete_server_rooms": "Raum löschen", - "resync_recordings": "Aufzeichnungen resynchronisieren", - "empty_room_list": "Es gibt noch keine Räume auf diesem Server!", - "empty_room_list_subtext": "Die Räume erscheinen hier, nachdem du deinen ersten Raum erstellt hast." - }, - "server_recordings": { - "server_recordings": "alle Aufzeichnungen", - "latest_recordings": "alle Aufzeichnungen", - "no_recordings_found": "Keine Aufzeichnungen gefunden." - }, - "site_settings": { - "site_settings": "Grundeinstellungen", - "customize_greenlight": "Greenlight anpassen", - "appearance": { - "appearance": "Darstellung", - "brand_color": "Primäre Farbe", - "regular": "Regulär", - "lighten": "Heller", - "brand_image": "Logo", - "click_to_upload": "Klicken zum Hochladen", - "drag_and_drop": " oder per Drag & Drop", - "upload_brand_image_description": "Eine PNG-, JPG- oder SVG-Datei hochladen (nicht größer als {{size}}). Abhängig von der Größe kann das eine gewisse Zeit dauern.", - "remove_branding_image": "Logo entfernen" - }, - "administration": { - "administration": "Administration", - "terms": "Impressum", - "privacy": "Datenschutzerklärung", - "privacy_policy": "Datenschutzerklärung", - "accessibility_statement": "Barrierefreiheitserklärung", - "change_term_links": "Ändere den Link zum Impressum, der unten auf der Seite erscheint.", - "change_privacy_link": "Ändere den Link zur Datenschutzerklärung, der unten auf der Seite erscheint.", - "change_accessibility_statement_link": "Ändere den Link zur Barrierefreiheitserklärung, der unten auf der Seite erscheint.", - "helpcenter": "Hilfeseite", - "change_helpcenter_link": "Ändern Sie den Link zur Hilfeseite, der unter dem Profil-Dropdown erscheint", - "maintenance": "Wartungshinweis", - "change_maintenance_text": "Ändern Sie den Text des Wartungshinweises, der in der Kopfzeile erscheint", - "change_url": "URL ändern", - "set_text": "Text eingeben", - "clear_banner": "Banner entfernen", - "enter_link": "Link eingeben" - }, - "settings": { - "settings": "Einstellungen", - "allow_users_to_share_rooms": "Räume können geteilt werden", - "allow_users_to_share_rooms_description": "Wenn dies deaktiviert ist, dann wird der Knopf zum Teilen eines Raums von den Raumeinstellungen entfernt.", - "allow_users_to_preupload_presentation": "Präsentationen können hochgeladen werden", - "allow_users_to_preupload_presentation_description": "Nutzende können eine Präsentation im Voraus hochladen, die dann als Standard für diesen Raum genutzt wird.", - "show_sign_in_on_room_join": "Zeige Login-Link wenn Raum betreten wird", - "show_sign_in_on_room_join_description": "Wenn die Nutzer:in nicht eingeloggt ist wird ein Login-Link angezeigt", - "default_visibility": "Standard-Sichtbarkeit der Aufnahmen", - "default_visibility_description": "Alle neu erstellten Aufnahmen haben standardmäßig diese Sichtbarkeit", - "session_timeout": "Timeout der Sitzung", - "session_timeout_description": "Sie können das Sitzungs-Timeout mit einem Standard-Cookie von 1 Tag oder einem erweiterten Sitzungs-Cookie von 7 Tagen konfigurieren", - "default_session_timeout": "Standard (1 Tag)", - "extended_session_timeout": "Erweitert (7 Tage)" - }, - "registration": { - "registration": "Registrierung", - "role_mapping_by_email": "Rollenzuordnung anhand von Email-Adressen", - "role_mapping_by_email_description": "Rollen anhand der Mail-Adresse zuordnen, Angabe im Format: rolle1=email1,rolle2=email2", - "enter_role_mapping_rule": "Eine Regel für Rollenzuordnung eingeben", - "resync_on_login": "Daten bei jedem Login aktualisieren", - "resync_on_login_description": "Daten bei jedem Login aktualisieren, so dass Greenlight immer dieselben Informationen hat, wie der externe Authentifizierungsanbieter", - "default_role": "Standard-Rolle", - "default_role_description": "Standard-Rolle, die neuen Nutzenden zugeteilt wird", - "registration_method": "Registrierungs-Methode", - "registration_method_description": "Registrierungs-Methoden ändern", - "registration_methods" : { - "open": "Offene Registrierung", - "invite": "Per Einladung teilnehmen", - "approval": "Zulassen/Ablehnen" - }, - "allowed_domains": "Erlaubte Email-Domains", - "allowed_domains_signup_description": "Lasse nur spezifische Email-Domains zur Anmeldung zu. Angabe in folgendem Format: @test.com,domain.com", - "enter_allowed_domains_rule" : "Erlaubte Domains eingeben" - } - }, - "room_configuration": { - "room_configuration": "Raum-Konfiguration", - "default": "Optional (Standard: Aktiviert)", - "optional": "Optional (Standard: Deaktiviert)", - "enabled": "Aktiviert", - "disabled": "Deaktiviert", - "configurations": { - "allow_room_to_be_recorded": "Raum kann aufgezeichnet werden", - "allow_room_to_be_recorded_description": "Aufzeichnungen erlauben. Wenn aktiviert, muss die Moderation immer noch den \"Aufnahme\"-Knopf drücken, nachdem die Konferenz begonnen hat.", - "require_user_signed_in": "Nutzende müssen eingeloggt sein, um teilzunehmen", - "require_user_signed_in_description": "Teilnahme an der Konferenz ist nur mit einem Konto in Greenlight möglich. Wer nicht eingeloggt ist, wird auf die Login-Seite weitergeleitet.", - "require_mod_approval": "Moderation muss der Teilnahme zustimmen", - "require_mod_approval_description": "Fragt die Moderation der Konferenz an, wenn eine Nutzer:in teilnehmen möchte. Wenn die Moderation das erlaubt, kann die Nutzer:in teilnehmen.", - "allow_any_user_to_start_meeting": "Alle Nutzenden die Konferenz starten", - "allow_any_user_to_start_meeting_description": "Erlaubt Nutzenden die Konferenz jederzeit zu starten. Standardmäßig können nur Raumbesitzende die Konferenz starten.", - "allow_users_to_join_as_mods": "Alle Nutzenden können moderieren", - "allow_users_to_join_as_mods_description": "Gibt allen Moderationsrechte, wenn sie der Konferenz beitreten.", - "mute_users_on_join": "Nutzende anfangs stummschalten", - "mute_users_on_join_description": "Automatisch stummenschalten, wenn man die Konferenz betritt.", - "viewer_access_code": "Zugriffscode für Zuhörende", - "viewer_access_code_description": "Erlaubt Raumbesitzenden einen zufälligen alphanumerischen Zugriffscode zu generieren, der mit Nutzenden geteilt werden kann. Falls ein solcher Zugriffscode generiert wird, ist dieser notwendig damit Nutzende an der Konferenz teilnehmen können.", - "mod_access_code": "Zugangscode für Moderation", - "mod_access_code_description": "Erlaubt Raumbesitzenden einen zufälligen alphanumerischen Zugriffscode zu generieren, der mit Nutzenden geteilt werden kann. Falls ein solcher Zugriffscode generiert wird, ist dieser nicht notwendig damit Nutzende an der Konferenz teilnehmen können - wird er benutzt, wird die Nutzer:in zur Moderation." - } - }, - "roles": { - "role": "Rolle", - "roles": "Rollen", - "administrator": "Administration", - "guest": "Gast", - "manage_roles": "Rollen verwalten", - "delete_role": "Rolle löschen", - "are_you_sure_delete_role": "Diese Rolle wirklich löschen?", - "enter_role_name": "Rollenname eingeben", - "add_role": "+ Rolle erstellen", - "create_role": "Rolle erstellen", - "create_new_role": "Eine neue Rolle erstellen", - "no_role_found": "Keine Rolle gefunden.", - "search_not_found": "Keine Rollen gefunden", - "edit": { - "create_room": "Nutzende mit dieser Rolle das Anlegen von Räumen gestatten", - "record": "Nutzenden mit dieser Rolle die Aufzeichnung ihrer Konferenzen ermöglichen", - "manage_users": "Nutzenden mit dieser Rolle erlauben, Benutzer zu verwalten", - "manage_rooms": "Nutzenden mit dieser Rolle erlauben, Serverräumen zu verwalten", - "manage_recordings": "Nutzenden mit dieser Rolle erlauben, Aufzeichnungen zu verwalten", - "manage_site_settings": "Nutzende mit dieser Rolle erlauben, die Webseiteneinstellungen zu verwalten", - "manage_roles": "Nutzende mit dieser Rolle erlauben, andere Rollen zu bearbeiten", - "shared_list": "Nutzende mit dieser Rolle in die Auswahlliste für die gemeinsame Nutzung von Räumen aufnehmen", - "room_limit": "Raumlimit", - "email_on_signup": "Bei Anmeldung neuer Nutzer E-Mail erhalten", - "allowed_recording_visibility": "Erlaubte Sichtbarkeit der Aufnahmen" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Nutzer:in erstellt.", - "user_updated": "Nutzer:in aktualisiert.", - "user_deleted": "Nutzer:in gelöscht.", - "avatar_updated": "Avatar aktualisiert.", - "password_changed": "Passwort erfolgreich aktualisiert. Bitte erneut anmelden.", - "password_updated": "Passwort aktualisiert.", - "account_activated": "Konto erfolgreich aktiviert. Bitte melden Sie sich in Ihrem Konto an.", - "activation_email_sent": "E-Mail zur Aktivierung wurde gesendet", - "reset_pwd_email_sent": "E-Mail zum Zurücksetzen des Passworts sollte verschickt worden sein, überprüfen Sie bitte Ihren Posteingang" - }, - "session": { - "signed_out": "Sie haben sich erfolgreich abgemeldet." - }, - "room": { - "room_created": "Raum erstellt.", - "room_updated": "Raum aktualisiert.", - "room_deleted": "Raum gelöscht.", - "room_shared": "Raum geteilt", - "room_unshared": "Raum nicht mehr geteilt", - "recordings_synced": "Raumaufzeichnungen sind nun synchronisiert.", - "room_configuration_updated": "Raumkonfiguration aktualisiert.", - "room_setting_updated": "Raumeinstellungen aktualisiert.", - "presentation_updated": "Präsentation aktualisiert.", - "presentation_deleted": "Präsentation gelöscht.", - "joining_meeting": "Trete der Konferenz bei...", - "meeting_started": "Konferenz gestartet.", - "access_code_copied": "Zugangscode kopiert.", - "access_code_generated": "Zugangscode generiert.", - "access_code_deleted": "Zugriffcode wurde gelöscht.", - "copied_meeting_url": "Die URL der Konferenz wurde kopiert. Der Link kann verwendet werden, um an der Konferenz teilzunehmen.", - "copied_viewer_code": "Zugangscode für Zuhörende wurde in die Zwischenablage kopiert.", - "copied_moderator_code": "Zugangscode für Moderation wurde in die Zwischenablage kopiert." - }, - "site_settings": { - "site_setting_updated": "Grundeinstellungen aktualisiert.", - "brand_color_updated": "Die Markenfarbe wurde aktualisiert.", - "brand_image_updated": "Das Logo wurde aktualisiert.", - "brand_image_deleted": "Das Logo wurde entfernt.", - "privacy_policy_updated": "Die Datenschutzerklärung wurde aktualisiert.", - "helpcenter_updated": "Der Link zur Hilfeseite wurde aktualisiert.", - "terms_of_service_updated": "Die Nutzungsbedingungen wurden aktualisiert.", - "maintenance_updated": "Der Wartungshinweis wurde aktualisiert.", - "allowed_domains_signup_updated": "Die erlaubten Email-Domains wurden aktualisiert" - }, - "recording": { - "recording_visibility_updated": "Aufzeichnungssichtbarkeit aktualisiert.", - "recording_name_updated": "Aufzeichnungsname aktualisiert.", - "recording_deleted": "Aufzeichnung gelöscht.", - "copied_urls": "Die Aufzeichnungs-URLs wurden kopiert." - }, - "role": { - "role_created": "Rolle erstellt.", - "role_updated": "Rolle aktualisiert.", - "role_deleted": "Rolle gelöscht.", - "role_permission_updated": "Rollenberechtigung aktualisiert." - }, - "invitations": { - "invitation_sent": "Einladung versendet", - "invitation_revoked": "Eine Einladung wurde widerrufen" - } - }, - "error": { - "problem_completing_action": "Hier hat etwas nicht funktioniert.\nBitte nochmal probieren.", - "server_type_unavailable": "Der verlangte Servertyp ist nicht verfügbar, bitte einen anderen Typ in den Raumeinstellungen wählen.", - "file_type_not_supported": "Dateityp wird nicht unterstützt.", - "file_size_too_large": "Datei ist zu groß.", - "file_upload_error": "Die Datei kann nicht hochgeladen werden.", - "signin_required": "Bitte einloggen um diese Seite anzuzeigen.", - "malware_detected": "Schadsoftware gefunden! Die Datei, die Sie hochgeladen haben, könnte Schadsoftware enthalten. Bitte überprüfen Sie Ihre Datei und versuchen Sie es erneut.", - "roles": { - "role_assigned": "Diese Rolle kann nicht gelöscht werden, da sie mindestens einer Person zugeordnet ist." - }, - "users": { - "signup_error": "Du kannst nicht authentifiziert werden. Bitte kontaktiere den Administrator.", - "invalid_invite": "Das Einladungs-Token ist ungültig. Bitte die Administration kontaktieren um einen neuen zu erhalten.", - "email_exists": "Ein Konto mit dieser E-Mail-Adresse existiert bereits.", - "old_password": "Das eingegebene Passwort ist falsch.", - "pending": "Deine Anmeldung muss noch vom Administrator genehmigt werden. Bitte versuche es später noch einmal.", - "banned": "Du hast keinen Zugriff auf diese Anwendung. Bitte wende dich sich an den Administrator, wenn du glaubst, dass dies ein Fehler ist." - }, - "rooms": { - "room_limit": "Raum kann nicht erstellt werden, da das Raumlimit erreicht ist." - }, - "session": { - "invalid_credentials": "Der Benutzername oder das Passwort ist ungültig. Bitte überprüfe deine Anmeldedaten und versuche es erneut." - } - } - }, - "global_error_page": { - "title": "Fehler", - "message": "Upsi! Hier ist etwas schiefgegangen. Falls das nochmals passiert kontaktiere bitte die Administration." - }, - "not_found_error_page": { - "title": "404", - "message": "Oh je! Diese Seite existiert nicht." - }, - "account_activation_page": { - "title": "Kontoaktivierung", - "account_unverified": "Konto wurde noch nicht verifiziert.", - "message": "Um Greenlight zu benutzen, verifiziere das Konto bitte anhand der Anleitung, die in der Aktivierungs-Email geschickt wurde.", - "resend_activation_link": "Wenn noch keine Aktivierungs-Email angekommen ist, oder es Probleme mit ihr gibt, dann fordere bitte eine neue an.", - "resend_btn_lbl": "Bestätigungsmail erneut senden" - }, - "forms": { - "validations": { - "full_name": { - "required": "Bitte gib einen vollständigen Namen ein", - "min": "Der Name muss mindestens 2 Zeichen lang sein", - "max": "Der Name darf maximal 255 Zeichen lang sein " - }, - "email": { - "required": "Bitte eine E-Mail-Adresse ein", - "email": "Eingegebener Wert stimmt nicht mit E-Mail-Format überein", - "min": "Die E-Mail muss mindestens 6 Zeichen lang sein", - "max": "Die E-Mail darf maximal 255 Zeichen lang sein" - }, - "password": { - "required": "Bitte gib ein Passwort ein", - "match": "Passwort muss mindestens haben:", - "min": "- Acht Zeichen", - "lower": "- Ein Kleinbuchstaben", - "upper": "- Ein Großbuchstaben", - "digit": "- Eine Zahl", - "symbol": "- Ein Sonderzeichen", - "max": "Passwort darf maximal 255 Zeichen lang sein" - }, - "password_confirmation": { - "required": "Bitte Passwort bestätigen", - "match": "Passwörter stimmen nicht überein" - }, - "emails": { - "required": "Bitte gib mindestens eine gültige E-Mail-Adresse ein", - "list": "Bitte gib eine durch Kommata getrennte Liste gültiger E-Mails an (user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "Bitte den Rollennamen eingeben" - }, - "role": { - "limit": { - "required": "Bitte die Höchstzahl der Räume angeben", - "min": "Zulässiger Mindestwert ist 0", - "max": "Zulässiger Höchstwert ist 100" - }, - "type": { - "error": "Bitte eine Zahl angeben" - } - }, - "room": { - "name": { - "required": "Bitte den Raumnamen eingeben.", - "min": "Der Name muss mindestens 2 Zeichen lang sein" - } - }, - "room_join": { - "name": { - "required": "Bitte Namen eingeben." - } - }, - "url": { - "invalid": "Ungültige URL" - }, - "text_form": { - "value": { - "required": "Bitte eine Nachricht eingeben" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Raumname", - "placeholder": "Raumname eingeben..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Name", - "placeholder": "Namen eingeben" - }, - "access_code": { - "label": "Zugangscode", - "placeholder": "Zugangscode eingeben" - }, - "recording_consent": { - "label": "Ich nehme zur Kenntnis, dass die Sitzung aufgezeichnet werden kann. Dies wird meine Stimme und mein Bild einschließen, wenn dies aktiviert ist." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Vollständiger Name", - "placeholder": "Vollständigen Namen eingeben" - }, - "email": { - "label": "E-Mail", - "placeholder": "Mail eingeben" - }, - "password": { - "label": "Passwort", - "placeholder": "Passwort eingeben" - }, - "password_confirmation": { - "label": "Passwort bestätigen", - "placeholder": "Passwort bestätigen" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "E-Mail", - "placeholder": "E-Mail eingeben" - }, - "password": { - "label": "Passwort", - "placeholder": "Passwort eingeben" - }, - "remember_me": { - "label": "Eingeloggt bleiben" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Aktuelles Passwort", - "placeholder": "Aktuelles Passwort eingeben" - }, - "new_password": { - "label": "Neues Passwort", - "placeholder": "Neues Passwort eingeben" - }, - "password_confirmation": { - "label": "Passwort bestätigen", - "placeholder": "Neues Passwort bestätigen" - } - }, - "validations": { - "old_password": { - "required": "Bitte das aktuelle Passwort eingeben" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "E-Mail", - "placeholder": "E-Mail-Adresse des Benutzerkontos eingeben" - } - }, - "validations": { - "email": { - "required": "Bitte die E-Mail-Adresse des Benutzerkontos eingeben" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Neues Passwort", - "placeholder": "Neues Passwort eingeben" - }, - "password_confirmation": { - "label": "Passwort bestätigen", - "placeholder": "Neues Passwort bestätigen" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Vollständiger Name" - }, - "email": { - "label": "E-Mail" - }, - "language": { - "label": "Sprache" - }, - "role": { - "label": "Rolle" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Vollständiger Name", - "placeholder": "Vollständigen Namen eingeben" - }, - "email": { - "label": "E-Mail", - "placeholder": "E-Mail-Adresse eingeben" - }, - "password": { - "label": "Passwort", - "placeholder": "Passwort eingeben" - }, - "password_confirmation": { - "label": "Passwort bestätigen", - "placeholder": "Passwort bestätigen" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "E-Mails" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Link eingeben...", - "text_placeholder": "Text eingeben..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Rollenname", - "placeholder": "Rollenname eingeben..." - } - } - } - } - } -} diff --git a/app/assets/locales/el.json b/app/assets/locales/el.json deleted file mode 100644 index 7f465c67d7..0000000000 --- a/app/assets/locales/el.json +++ /dev/null @@ -1,726 +0,0 @@ -{ - "start": "Έναρξη", - "search": "Αναζήτηση", - "home": "Αρχική", - "previous": "Προηγούμενο", - "back": "Πίσω", - "next": "Επόμενο", - "view": "Προβολή", - "join": "Εγγραφή", - "edit": "Επεξεργασία", - "save": "Αποθήκευση", - "save_changes": "Αποθήκευση αλλαγών", - "update": "Ενημέρωση", - "report": "Αναφορά", - "share": "Κοινή χρήση", - "cancel": "Ακύρωση", - "reset": "Επαναφορά", - "close": "Κλείσιμο", - "delete": "Διαγραφή", - "copy": "Αντιγραφή συνδέσμου εγγραφής", - "copy_viewer_code": "Αντιγραφή κωδικού πρόσβασης θεατή", - "copy_moderator_code": "Αντιγραφή κωδικού πρόσβασης συντονιστή", - "or": "Ή", - "online": "Σε σύνδεση", - "help_center": "Κέντρο βοήθειας", - "are_you_sure": "Είστε σίγουρος/η;", - "return_home": "Επιστροφή στην αρχική", - "created_at": "Δημιουργήθηκε", - "view_recordings": "Προβολή καταγραφών", - "join_session": "Συμμετοχή στη συνεδρία", - "no_result_search_input": "Δε βρέθηκαν αποτελέσματα για \"{{ searchInput }}\"", - "action_permanent": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", - "homepage": { - "welcome_bbb": "Καλώς ορίσατε στο BigBlueButton.", - "bigbluebutton_description": "Το BigBlueButton είναι ένα σύστημα διαδικτυακής διάσκεψης ανοιχτού κώδικα για διαδικτυακά μαθήματα. Η πλατφόρμα μεγιστοποιεί τον χρόνο για εφαρμοσμένη μάθηση δίνοντας τη δυνατότητα στους μαθητές να συνεργάζονται και να λαμβάνουν σχόλια σε πραγματικό χρόνο.", - "greenlight_description": "Δημιουργήστε τις δικές σας αίθουσες για να φιλοξενήσετε διασκέψεις ή συμμετάσχετε σε άλλες χρησιμοποιώντας έναν σύντομο και βολικό σύνδεσμο.", - "learn_more": "Μάθετε περισσότερα για το BigBlueButton", - "explore_features": "Εξερευνήστε τις δυνατότητές μας", - "meeting_title": "Ξεκινήστε μια διάσκεψη", - "meeting_description": "Ξεκινήστε μια εικονική τάξη με βίντεο, ήχο, κοινή χρήση οθόνης, συνομιλία και όλα τα εργαλεία που απαιτούνται για την εφαρμοσμένη εκπαίδευση.", - "recording_title": "Καταγράψτε τις διασκέψεις σας", - "recording_description": "Καταγράψτε τις διασκέψεις του BigBlueButton και μοιραστείτε τις με άλλους για να αναθεωρήσουν και να προβληματιστούν σχετικά με το υλικό.", - "settings_title": "Διαχειριστείτε τις αίθουσες σας", - "settings_description": "Διαμορφώστε τις παραμέτρους των αιθουσών και των διασκέψεων για να έχετε τον έλεγχο μιας αποτελεσματικής τάξης.", - "and_more_title": "Και ακόμη περισσότερα!", - "and_more_description": "Το BigBlueButton προσφέρει ενσωματωμένα εργαλεία για εφαρμοσμένη εκπαίδευση και έχει σχεδιαστεί για να σας εξοικονομεί χρόνο κατά τη διάρκεια του μαθήματος.", - "enter_meeting_url": "Παρακαλούμε εισαγάγετε τη διεύθυνση URL της διάσκεψης σας στο BigBlueButton στο παρακάτω πεδίο.", - "enter_meeting_url_instruction": "Παρακαλούμε εισαγάγετε τη διεύθυνση URL της διάσκεψης σας στο BigBlueButton στο παρακάτω πεδίο." - }, - "authentication": { - "sign_in": "Σύνδεση", - "sign_up": "Εγγραφή", - "sign_out": "Αποσύνδεση", - "email": "Email", - "password": "Κωδικός πρόσβασης", - "confirm_password": "Επιβεβαίωση κωδικού πρόσβασης", - "enter_email": "Εισαγάγετε το email σας", - "enter_name": "Εισαγάγετε το όνομά σας", - "remember_me": "Να με θυμάσαι", - "forgot_password": "Ξεχάσατε τον κωδικό πρόσβασης;", - "dont_have_account": "Δεν έχετε λογαριασμό;", - "create_account": "Δημιουργία λογαριασμού", - "create_an_account": "Δημιουργήστε ένα λογαριασμό", - "already_have_account": "Έχετε ήδη λογαριασμό;" - }, - "user": { - "user": "Χρήστης", - "users": "Χρήστες", - "name": "Όνομα", - "email_address": "Διεύθυνση email", - "authenticator": "Επαληθευτής", - "full_name": "Πλήρες όνομα", - "no_user_found": "Ο χρήστης δε βρέθηκε", - "type_three_characters": "Παρακαλούμε πληκτρολογήστε τρεις (3) ή περισσότερους χαρακτήρες για εμφάνιση των χρηστών.", - "search_not_found": "Δε βρέθηκαν χρήστες", - "profile": { - "profile": "Προφίλ", - "language": "Γλώσσα", - "role": "Ρόλος", - "administrator": "Διαχειριστής", - "guest": "Επισκέπτης" - }, - "account": { - "account_info": "Πληροφορίες λογαριασμού", - "delete_account": "Διαγραφή λογαριασμού", - "change_password": "Αλλαγή κωδικού πρόσβασης", - "set_password": "Ορίστε τον νέο κωδικό πρόσβασής σας", - "reset_password": "Επαναφορά κωδικού πρόσβασης", - "update_account_info": "Ενημέρωση πληροφοριών λογαριασμού", - "current_password": "Τρέχων κωδικός πρόσβασης", - "new_password": "Νέος κωδικός πρόσβασης", - "confirm_password": "Επιβεβαίωση κωδικού πρόσβασης", - "permanently_delete_account": "Μόνιμη διαγραφή του λογαριασμού σας", - "delete_account_description": "Εάν επιλέξετε μόνιμη διαγραφή του λογαριασμού σας, δε θα είναι δυνατή η επαναφορά του.\nΌλες οι πληροφορίες του λογαριασμού σας, οι ρυθμίσεις σας, οι αίθουσες διάσκεψης σας και οι καταγραφές σας θα διαγραφούν.", - "delete_account_confirmation": "Ναι, επιθυμώ τη διαγραφή του λογαριασμού μου", - "are_you_sure_delete_account": "Είστε σίγουροι ότι θέλετε τη διαγραφή του λογαριασμού σας;" - }, - "avatar": { - "upload_avatar": "Μεταφόρτωση άβαταρ", - "delete_avatar": "Διαγραφή άβαταρ", - "crop_avatar": "Περικοπή του άβατάρ σας" - }, - "pending": { - "title": "Εκκρεμεί εγγραφή", - "message": "Σας ευχαριστούμε για την εγγραφή σας! Ο λογαριασμός σας εκκρεμεί και είναι προς έγκριση από έναν διαχειριστή." - } - }, - "room": { - "room": "Αίθουσα διάσκεψης", - "rooms": "Αίθουσες διάσκεψης", - "room_name": "Όνομα αίθουσας", - "add_new_room": "+ Νέα αίθουσα", - "create_room": "Δημιουργία αίθουσας", - "delete_room": "Διαγραφή αίθουσας", - "create_new_room": "Δημιουργία νέας αίθουσας", - "enter_room_name": "Εισαγάγετε το όνομα της αίθουσας", - "shared_by": "σε κοινή χρήση από", - "last_session": "Τελευταία συνεδρία: {{ localizedTime }}", - "no_last_session": "Δε δημιουργήθηκε προηγούμενη συνεδρία", - "search_not_found": "Δε βρέθηκαν αίθουσες", - "rooms_list_is_empty": "Δεν έχετε καμία αίθουσα ακόμη!", - "rooms_list_empty_create_room": "Δημιουργήστε την πρώτη σας αίθουσα κάνοντας κλικ στο παρακάτω κουμπί και εισαγάγοντας ένα όνομα.", - "meeting": { - "start_meeting": "Έναρξη διάσκεψης", - "join_meeting": "Συμμετοχή στη διάσκεψη", - "meeting_invitation": "Έχετε προσκληθεί να συμμετάσχετε", - "meeting_not_started": "Η διάσκεψη δεν ξεκίνησε ακόμη", - "join_meeting_automatically": "Θα συνδεθείτε αυτόματα μόλις ξεκινήσει η διάσκεψη", - "recording_consent": "Κατανοώ ότι αυτή η συνεδρία ίσως καταγραφεί. Αυτό πιθανός θα συμπεριλαμβάνει τη φωνή μου και το βίντεο εάν είναι ενεργοποιημένα." - }, - "presentation": { - "presentation": "Παρουσίαση", - "click_to_upload": "Κάντε κλικ για μεταφόρτωση ", - "drag_and_drop": "ή σύρετε και αποθέστε το αρχείο", - "upload_description": "Μεταφόρτωση εγγράφου ή αρχείου PDF (έως {{size}}). Ανάλογα με το μέγεθος του αρχείου, απαιτείται χρόνος για τη μεταφόρτωση πριν τη χρήση του", - "delete_presentation": "Διαγραφή παρουσίασης", - "are_you_sure_delete_presentation": "Θέλετε σίγουρα να διαγράψετε αυτή την παρουσίαση;" - }, - "shared_access": { - "access": "Πρόσβαση", - "add_share_access": "+ Κοινόχρηστη πρόσβαση", - "share_room_access": "Κοινοποίηση πρόσβασης της αίθουσας διάσκεψης", - "add_some_users": "Ώρα για προσθήκη χρηστών!", - "add_some_users_description": "Για προσθήκη νέων χρηστών, κάντε κλικ στο παρακάτω κουμπί και αναζητήστε ή επιλέξτε τους χρήστες που επιθυμείτε για να κοινοποιήσετε αυτή την αίθουσα διάσκεψης.", - "delete_shared_access": "Διαγραφή κοινόχρηστης πρόσβασης", - "are_you_sure_delete_shared_access": "Θέλετε σίγουρα να διαγράψετε αυτή την κοινόχρηστη πρόσβαση;" - }, - "settings": { - "settings": "Ρυθμίσεις", - "room_name": "Όνομα αίθουσας διάσκεψης", - "user_settings": "Ρυθμίσεις χρήστη", - "allow_room_to_be_recorded": "Να επιτρέπεται η καταγραφή της αίθουσας διάσκεψης", - "require_signed_in": "Οι χρήστες απαιτείται να έχουν συνδεθεί πριν συμμετάσχουν", - "require_signed_in_message": "Πρέπει να συνδεθείτε για συμμετοχή σε αυτή την αίθουσα διάσκεψης.", - "require_mod_approval": "Απαιτείται έγκριση από συντονιστή πριν τη συμμετοχή", - "allow_any_user_to_start": "Όλοι οι χρήστες μπορούν να ξεκινήσουν τη διάσκεψη", - "all_users_join_as_mods": "Όλοι οι χρήστες συμμετέχουν ως συντονιστές", - "mute_users_on_join": "Σίγαση των χρηστών μόλις συνδεθούν", - "generate": "Δημιουργία", - "access_code": "Κωδικός πρόσβασης", - "mod_access_code": "Κωδικός πρόσβασης συντονιστή", - "mod_access_code_optional": "Κωδικός πρόσβασης συντονιστή (προαιρετικό)", - "access_code_required": "Παρακαλούμε εισαγάγετε τον κωδικό πρόσβασης", - "wrong_access_code": "Λάθος κωδικός πρόσβασης", - "generate_viewers_access_code": "Δημιουργία κωδικού πρόσβασης για θεατές", - "generate_mods_access_code": "Δημιουργία κωδικού πρόσβασης για συντονιστές", - "server_tag": "Επιλέξτε ένα τύπο διακομιστή για αυτή την αίθουσα", - "default_tag_name": "Προεπιλογή", - "server_tag_desired": "Επιθυμητό", - "server_tag_required": "Απαιτείται", - "are_you_sure_delete_room": "Θέλετε σίγουρα να διαγράψετε αυτή την αίθουσα;" - } - }, - "recording": { - "recording": "Καταγραφή", - "recordings": "Καταγραφές", - "processing": "Επεξεργασία καταγραφών... ", - "name": "Όνομα", - "length": "Μήκος", - "users": "Χρήστες", - "visibility": "Εμφάνιση", - "formats": "Μορφές", - "published": "Δημοσιευμένο", - "unpublished": "Μη δημοσιευμένο", - "protected": "Προστατευμένο", - "public": "Δημόσιο", - "public_protected": "Δημόσιο/προστατευμένο", - "length_in_minutes": "{{recording.length}} λεπτό.", - "processing_recording": "Προετοιμασία καταγραφής, ίσως χρειαστεί λίγος χρόνος…", - "copy_recording_urls": "Αντιγραφή διευθύνσεων Url", - "recordings_list_empty": "Δεν υπάρχουν καταγραφές!", - "public_recordings_list_empty": "Δεν υπάρχουν κοινόχρηστες καταγραφές ακόμη!", - "recordings_list_empty_description": "Οι καταγραφές θα εμφανιστούν εδώ μετά την έναρξη και καταγραφή μιας διάσκεψης.", - "public_recordings_list_empty_description": "Οι καταγραφές θα εμφανιστούν εδώ όταν θα είναι διαθέσιμες.", - "delete_recording": "Διαγραφή καταγραφών", - "are_you_sure_delete_recording": "Θέλετε σίγουρα να διαγράψετε αυτή την καταγραφή;", - "search_not_found": "Δε βρέθηκαν καταγραφές" - }, - "admin": { - "admin_panel": "Πίνακας διαχειριστή", - "manage_users": { - "manage_users": "Διαχείριση χρηστών", - "active": "Ενεργό", - "approve": "Έγκριση", - "decline": "Απόρριψη", - "pending": "Σε επεξεργασία", - "banned": "Αποκλεισμένος", - "ban": "Αποκλεισμός", - "unban": "Άρση αποκλεισμού", - "unverified": "Μη επιβεβαιωμένος", - "verify": "Επιβεβαιωμένος", - "deleted": "Διαγραμμένος", - "invited_tab": "Έχει προσκληθεί", - "invite_user": "Πρόσκληση χρήστη", - "send_invitation": "Αποστολή πρόσκλησης", - "enter_user_email": "Εισαγάγετε email χρήστη", - "new_user": "Νέος χρήστης", - "add_new_user": "Νέος χρήστης", - "create_new_user": "Δημιουργία νέου χρήστη", - "edit_user": "Επεξεργασία χρήστη", - "delete_user": "Διαγραφή χρήστη", - "users_edit_path": "Χρήστες/Επεξεργασία", - "create_account": "Δημιουργία λογαριασμού", - "create_room": "Δημιουργία αίθουσας διασκέψεων", - "create_new_room": "Δημιουργία νέας αίθουσας διασκέψεων", - "user_created_at": "Δημιουργήθηκε: {{localizedTime}}", - "are_you_sure_delete_account": "Είστε σίγουροι ότι θέλετε τη διαγραφή του λογαριασμού {{user.name}};", - "delete_account_warning": "Εάν επιλέξετε τη διαγραφή αυτού του λογαριασμού, ΔΕΝ θα είναι δυνατή η επαναφορά του.", - "empty_active_users": "Δεν υπάρχουν ενεργοί χρήστες στον διακομιστή!", - "empty_active_users_subtext": "Μόλις η κατάσταση του χρήστη αλλάξει σε ενεργός, θα εμφανιστεί εδώ.", - "empty_pending_users": "Δεν υπάρχουν χρήστες σε εκκρεμότητα στον διακομιστή!", - "empty_pending_users_subtext": "Μόλις η κατάσταση του χρήστη αλλάξει σε εκκρεμότητα, θα εμφανιστεί εδώ.", - "empty_banned_users": "Δεν υπάρχουν αποκλεισμένοι χρήστες στον διακομιστή!", - "empty_banned_users_subtext": "Μόλις η κατάσταση του χρήστη αλλάξει σε αποκλεισμένος, θα εμφανιστεί εδώ.", - "empty_unverified_users": "Δεν υπάρχουν μη επιβεβαιωμένοι χρήστες σε αυτόν τον διακομιστή ακόμη!", - "empty_unverified_users_subtext": "Οι μη επιβεβαιωμένοι χρήστες θα εμφανίζονται εδώ.", - "empty_invited_users": "Δεν υπάρχουν προσκλήσεις για χρήστες στον διακομιστή!", - "empty_invited_users_subtext": "Μόλις η κατάσταση του χρήστη αλλάξει σε προσκεκλημένος, θα εμφανιστεί εδώ.", - "invited": { - "time_sent": "Ώρα αποστολής", - "valid": "Έγκυρο", - "revoke": "Ανάκληση" - } - }, - "server_rooms": { - "server_rooms": "Αίθουσες διασκέψεων διακομιστή", - "name": "Όνομα", - "owner": "Κάτοχος", - "room_id": "Ταυτότητα αίθουσας διασκέψεων", - "participants": "Συμμετέχοντες", - "status": "Κατάσταση", - "running": "Σε εκτέλεση", - "not_running": "Δεν εκτελείται", - "active": "Ενεργό", - "current_session": "Τρέχουσα συνεδρία: {{lastSession}}", - "last_session": "Τελευταία συνεδρία: {{localizedTime}}", - "no_meeting_yet": "Καμία διάσκεψη ακόμα.", - "delete_server_rooms": "Διαγραφή αίθουσας διάσκεψης διακομιστή", - "resync_recordings": "Επανασυγχρονισμός καταγραφών", - "empty_room_list": "Δεν υπάρχουν ακόμη αίθουσες στον διακομιστή!", - "empty_room_list_subtext": "Οι αίθουσες θα εμφανιστούν εδώ μόλις δημιουργήσετε την πρώτη αίθουσα." - }, - "server_recordings": { - "server_recordings": "Καταγραφές διακομιστή", - "latest_recordings": "Πρόσφατες καταγραφές", - "no_recordings_found": "Δε βρέθηκαν καταγραφές." - }, - "site_settings": { - "site_settings": "Ρυθμίσεις ιστοτόπου", - "customize_greenlight": "Προσαρμογή Greenlight", - "appearance": { - "appearance": "Εμφάνιση", - "brand_color": "Χρώμα επωνυμίας", - "regular": "Κανονικό", - "lighten": "Φωτεινό", - "brand_image": "Εικόνα επωνυμίας", - "click_to_upload": "Κάντε κλικ για μεταφόρτωση ", - "drag_and_drop": "ή σύρετε και αποθέστε το αρχείο", - "upload_brand_image_description": "Μεταφόρτωση αρχείου PNG, JPG ή SVG (έως {{size}}). Ανάλογα με το μέγεθος του αρχείου, απαιτείται χρόνος για τη μεταφόρτωση πριν τη χρήση του", - "remove_branding_image": "Αφαίρεση της εικόνας επωνυμίας" - }, - "administration": { - "administration": "Διαχείριση", - "terms": "Όροι και Προϋποθέσεις", - "privacy": "Πολιτική Απορρήτου", - "privacy_policy": "Πολιτική Απορρήτου", - "change_term_links": "Αλλαγή των συνδέσμων για τους όρους χρήσης που εμφανίζονται στο κάτω μέρος της σελίδας", - "change_privacy_link": "Αλλαγή του συνδέσμου για το απόρρητο που εμφανίζεται στο κάτω μέρος της σελίδας", - "helpcenter": "Κέντρο Βοήθειας", - "change_helpcenter_link": "Αλλαγή του συνδέσμου για το Κέντρο βοήθειας που εμφανίζεται κάτω από το προφίλ. ", - "maintenance": "Μήνυμα κατάστασης συντήρησης", - "change_maintenance_text": "Αλλάξτε το κείμενο του μηνύματος κατάστασης συντήρησης που εμφανίζεται στην κεφαλίδα", - "change_url": "Αλλαγή URL", - "set_text": "Ορισμός κειμένου", - "clear_banner": "Διαγραφή μηνύματος", - "enter_link": "Εισαγάγετε εδώ το σύνδεσμο" - }, - "settings": { - "settings": "Ρυθμίσεις", - "allow_users_to_share_rooms": "Να επιτρέπεται οι χρήστες να κοινοποιούν τις αίθουσες διασκέψεων", - "allow_users_to_share_rooms_description": "Η ρύθμιση σε «απενεργοποιημένο» θα καταργήσει το κουμπί από το αναπτυσσόμενο μενού επιλογών της αίθουσας διάσκεψης, εμποδίζοντας τους χρήστες να διαμοιράζονται αίθουσες διασκέψεων", - "allow_users_to_preupload_presentation": "Να επιτρέπεται στους χρήστες να μεταφορτώνουν παρουσιάσεις νωρίτερα", - "allow_users_to_preupload_presentation_description": "Οι χρήστες μπορούν να μεταφορτώνουν νωρίτερα μια παρουσίαση για χρήση όπως την προεπιλεγμένη για συγκεκριμένη αίθουσα διασκέψεων", - "show_sign_in_on_room_join": "Εμφάνιση συνδέσμου Σύνδεσης στην Αίθουσα σύνδεσης", - "show_sign_in_on_room_join_description": "Εάν ο χρήστης δεν έχει συνδεθεί, ένας σύνδεσμος για σύνδεση εμφανίζεται στο κάτω μέρος όταν εισέρχεται στην αίθουσα.", - "default_visibility": "Προεπιλεγμένη ορατότητα καταγραφής", - "default_visibility_description": "Όλες οι καταγραφές που δημιουργήθηκαν πρόσφατα θα έχουν αυτήν την ορατότητα από προεπιλογή", - "session_timeout": "Λήξη συνεδρίας", - "session_timeout_description": "Μπορείτε να ρυθμίσετε το χρονικό όριο της συνεδρίας με ένα προεπιλεγμένο cookie διάρκειας 1 ημέρας ή με ένα επεκτεινόμενης συνεδρίας 7 ημερών.", - "default_session_timeout": "Προεπιλογή (1 ημέρα)", - "extended_session_timeout": "Επέκταση (7 ημέρες)" - }, - "registration": { - "registration": "Εγγραφή", - "role_mapping_by_email": "Εκχώρηση ρόλου με email", - "role_mapping_by_email_description": "Κατανείμετε το ρόλο χρήστη σύμφωνα με το email. Πρέπει να έχει τη μορφή role1=email1,role2=email2", - "enter_role_mapping_rule": "Εισαγάγετε ένα κανόνα εκχώρησης ρόλου", - "resync_on_login": "Συγχρονισμός δεδομένων χρήστη σε κάθε σύνδεση", - "resync_on_login_description": "Επανασυγχρονισμός των πληροφοριών χρήστη σε κάθε σύνδεση, υποχρεώνοντας τον εξωτερικό πάροχο αυθεντικοποίησης σε συνεχή επιβεβαίωση των πληροφοριών στο Greenlight", - "default_role": "Προεπιλεγμένος ρόλος", - "default_role_description": "Ο προεπιλεγμένος ρόλος που αποδίδεται σε νέους χρήστες", - "registration_method": "Μέθοδος εγγραφής", - "registration_method_description": "Αλλαγή του τρόπου εγγραφής των χρηστών στον ιστότοπο", - "registration_methods" : { - "open": "Ενεργοποίηση εγγραφών", - "invite": "Συμμετοχή με πρόσκληση", - "approval": "Έγκριση/Απόρριψη" - }, - "allowed_domains": "Επιτρέπονται τα email ονομάτων τομεα", - "allowed_domains_signup_description": "Επιτρέπονται συγκεκριμένα email ονομάτων τομεα για εγγραφή. Η μορφή πρέπει να είναι @test.com,domain.com", - "enter_allowed_domains_rule" : "Προσθηκη επιτρεπόμενου ονόματος τομέα " - } - }, - "room_configuration": { - "room_configuration": "Διαμόρφωση αίθουσας διασκέψεων", - "default": "Προαιρετικό (προεπιλογή: ενεργοποιημένο)", - "optional": "Προαιρετικό (προεπιλογή: απενεργοποιημένο)", - "enabled": "Αναγκαστική ενεργοποίηση", - "disabled": "Απενεργοποιήθηκε", - "configurations": { - "allow_room_to_be_recorded": "Να επιτρέπεται η καταγραφή της αίθουσας διάσκεψης", - "allow_room_to_be_recorded_description": "Επιτρέπει στους κατόχους της αίθουσας διάσκεψης να καθορίσουν εάν θέλουν την επιλογή καταγραφής ή όχι της αίθουσας. Εάν είναι ενεργοποιημένο, ο συντονιστής πρέπει να κάνει κλικ στο κουμπί «Εγγραφή» μόλις ξεκινήσει η διάσκεψη.", - "require_user_signed_in": "Οι χρήστες απαιτείται να έχουν συνδεθεί πριν συμμετάσχουν", - "require_user_signed_in_description": "Επιτρέπει μόνο σε χρήστες με λογαριασμό Greenlight να συμμετέχουν στη διάσκεψη. Εάν δεν είναι συνδεδεμένοι, θα ανακατευθυνθούν στη σελίδα σύνδεσης όταν επιχειρούν να συμμετάσχουν σε μια αίθουσα.", - "require_mod_approval": "Απαιτείται έγκριση από διαχειριστή πριν τη συμμετοχή", - "require_mod_approval_description": "Ενημερώνει τον συντονιστή της διάσκεψης BigBlueButton όταν ένας χρήστης προσπαθεί να συμμετάσχει. Εάν ο χρήστης εγκριθεί, θα μπορεί να συμμετάσχει στη διάσκεψη.", - "allow_any_user_to_start_meeting": "Να επιτρέπεται οι χρήστες να ξεκινήσουν τη διάσκεψη", - "allow_any_user_to_start_meeting_description": "Να επιτρέπεται σε οποιονδήποτε χρήστη να ξεκινήσει τη διάσκεψη ανά πάσα στιγμή. Από προεπιλογή, μόνο ο κάτοχος της αίθουσας μπορεί να ξεκινήσει τη διάσκεψη.", - "allow_users_to_join_as_mods": "Όλοι οι χρήστες συμμετέχουν ως συντονιστές", - "allow_users_to_join_as_mods_description": "Παρέχει σε όλους τους χρήστες τα δικαιώματα συντονιστή στο BigBlueButton όταν συμμετέχουν στη διάσκεψη", - "mute_users_on_join": "Σίγαση των χρηστών μόλις συνδεθούν", - "mute_users_on_join_description": "Πραγματοποιεί αυτόματη σίγαση του χρήστη όταν συμμετέχει στη διάσκεψη BigBlueButton", - "viewer_access_code": "Κωδικός πρόσβασης θεατή", - "viewer_access_code_description": "Επιτρέπει στους κατόχους αίθουσας να έχουν έναν τυχαίο αλφαριθμητικό κωδικό που μπορεί να μοιραστεί με τους χρήστες. Ο κωδικός, εάν δημιουργηθεί, θα απαιτείται για τη συμμετοχή των χρηστών στις διασκέψεις αιθουσών.", - "mod_access_code": "Κωδικός πρόσβασης συντονιστή", - "mod_access_code_description": "Επιτρέπει στους κατόχους αίθουσας να έχουν έναν τυχαίο αλφαριθμητικό κωδικό που μπορεί να μοιραστεί με τους χρήστες. Ο κωδικός, εάν δημιουργηθεί, δε θα απαιτείται και όταν χρησιμοποιείται σε οποιαδήποτε διάσκεψη αίθουσας, θα συμμετέχει ο χρήστης ως συντονιστής." - } - }, - "roles": { - "role": "Ρόλος", - "roles": "Ρόλοι", - "administrator": "Διαχειριστής", - "guest": "Επισκέπτης", - "manage_roles": "Διαχείριση ρόλων", - "delete_role": "Διαγραφή ρόλου", - "are_you_sure_delete_role": "Θέλετε σίγουρα να διαγράψετε αυτό το ρόλο;", - "enter_role_name": "Εισαγάγετε ένα όνομα ρόλου", - "add_role": "+ Δημιουργία ρόλου", - "create_role": "Δημιουργία ρόλου", - "create_new_role": "Δημιουργία ενός νέου ρόλου", - "no_role_found": "Δε βρέθηκε ρόλος.", - "search_not_found": "Δε βρέθηκαν ρόλοι", - "edit": { - "create_room": "Να επιτρέπεται στους χρήστες με αυτόν τον ρόλο να δημιουργούν αίθουσες", - "record": "Να επιτρέπεται στους χρήστες με αυτόν τον ρόλο να καταγράφουν διασκέψεις", - "manage_users": "Να επιτρέπεται στους χρήστες με αυτόν τον ρόλο να διαχειρίζονται τους χρήστες", - "manage_rooms": "Να επιτρέπεται στους χρήστες με αυτόν τον ρόλο να διαχειρίζονται τις αίθουσες του διακομιστή", - "manage_recordings": "Να επιτρέπεται στους χρήστες με αυτόν τον ρόλο να διαχειρίζονται τις καταγραφές του διακομιστή", - "manage_site_settings": "Να επιτρέπεται στους χρήστες με αυτόν τον ρόλο να διαχειρίζονται τις ρυθμίσεις του ιστοτόπου", - "manage_roles": "Να επιτρέπεται στους χρήστες με αυτόν τον ρόλο να επεξεργάζονται άλλους ρόλους", - "shared_list": "Να συμπεριλαμβάνονται χρήστες με αυτόν τον ρόλο στο αναπτυσσόμενο μενού για κοινή χρήση αιθουσών", - "room_limit": "Όριο αίθουσας", - "email_on_signup": "Λάβετε ένα email όταν εγγραφεί ένας νέος χρήστης", - "allowed_recording_visibility": "Επιτρεπόμενες ορατότητες καταγραφής" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Ο χρήστης δημιουργήθηκε.", - "user_updated": "Ο χρήστης ενημερώθηκε.", - "user_deleted": "Ο χρήστης διαγράφηκε.", - "avatar_updated": "Το άβαταρ ενημερώθηκε.", - "password_changed": "Επιτυχής ενημέρωση του κωδικού πρόσβασής σας. Παρακαλούμε συνδεθείτε ξανά.", - "password_updated": "Ο κωδικός πρόσβασης ενημερώθηκε.", - "account_activated": "Ο λογαριασμός ενεργοποιήθηκε επιτυχώς. Παρακαλούμε συνδεθείτε στον λογαριασμό σας.", - "activation_email_sent": "Το email επιβεβαίωσης στάλθηκε.", - "reset_pwd_email_sent": "Στάλθηκε ένα email επαναφοράς του κωδικού πρόσβασης, ελέγξτε τα εισερχόμενά σας" - }, - "session": { - "signed_out": "Αποσυνδεθήκατε επιτυχώς." - }, - "room": { - "room_created": "Η αίθουσα διασκέψεων δημιουργήθηκε.", - "room_updated": "Η αίθουσα διασκέψεων ενημερώθηκε.", - "room_deleted": "Η αίθουσα διασκέψεων διαγράφηκε.", - "room_shared": "Η αίθουσα διασκέψεων κοινοποιήθηκε", - "room_unshared": "Η αίθουσα διασκέψεων δεν είναι σε κοινή χρήση", - "recordings_synced": "Οι καταγραφές της αίθουσας διασκέψεων είναι τώρα συγχρονισμένες", - "room_configuration_updated": "Η διαμόρφωση της αίθουσας διασκέψεων ενημερώθηκε.", - "room_setting_updated": "Οι ρυθμίσεις της αίθουσας διασκέψεων ενημερώθηκαν.", - "presentation_updated": "Η παρουσίαση ενημερώθηκε.", - "presentation_deleted": "Η παρουσίαση διαγράφηκε.", - "joining_meeting": "Συμμετοχή στη διάσκεψη...", - "meeting_started": "Η διάσκεψη ξεκίνησε.", - "access_code_copied": "Ο κωδικός πρόσβασης αντιγράφηκε.", - "access_code_generated": "Ο κωδικός πρόσβασης δημιουργήθηκε.", - "access_code_deleted": "Ο κωδικός πρόσβασης διαγράφηκε.", - "copied_meeting_url": "Η διεύθυνση URL της διάσκεψης αντιγράφηκε. Ο σύνδεσμος μπορεί να χρησιμοποιηθεί για εγγραφή στη διάσκεψη.", - "copied_viewer_code": "Ο κωδικός πρόσβασης θεατή έχει αντιγραφεί.", - "copied_moderator_code": "Ο κωδικός πρόσβασης συντονιστή έχει αντιγραφεί." - }, - "site_settings": { - "site_setting_updated": "Οι ρυθμίσεις σελίδας ενημερώθηκαν.", - "brand_color_updated": "Το χρώμα επωνυμίας ενημερώθηκε.", - "brand_image_updated": "Η εικόνα επωνυμίας ενημερώθηκε.", - "brand_image_deleted": "Η εικόνα επωνυμίας διαγράφηκε.", - "privacy_policy_updated": "Η πολιτική απορρήτου ενημερώθηκε.", - "helpcenter_updated": "Ο σύνδεσμος για το Κέντρο βοήθειας ενημερώθηκε. ", - "terms_of_service_updated": "Οι όριο χρήσης ενημερώθηκαν.", - "maintenance_updated": "Το μήνυμα της λειτουργίας συντήρησης ενημερώθηκε.", - "allowed_domains_signup_updated": "Τα επιτρεπόμενα ονόματα τομέα ενημερώθηκαν" - }, - "recording": { - "recording_visibility_updated": "Η εμφάνιση καταγραφής ενημερώθηκε.", - "recording_name_updated": "Το όνομα καταγραφής ενημερώθηκε.", - "recording_deleted": "Η καταγραφή διαγράφηκε.", - "copied_urls": "Η διεύθυνση URL καταγραφής αντιγράφηκε." - }, - "role": { - "role_created": "Ο ρόλος δημιουργήθηκε.", - "role_updated": "Ο ρόλος ενημερώθηκε.", - "role_deleted": "Ο ρόλος διαγράφηκε.", - "role_permission_updated": "Τα δικαιώματα του ρόλου ενημερώθηκαν." - }, - "invitations": { - "invitation_sent": "Η πρόσκληση στάλθηκε", - "invitation_revoked": "Έχει γίνει ανάκληση μιας πρόσκλησης" - } - }, - "error": { - "problem_completing_action": "Παρουσιάστηκε πρόβλημα σε αυτή την ενέργεια.\nΠαρακαλούμε δοκιμάστε ξανά.", - "server_type_unavailable": "Ο επιθυμητός τύπος διακομιστή δεν είναι διαθέσιμος. Παρακαλούμε επιλέξτε διαφορετικό τύπο από τις ρυθμίσεις αίθουσας. ", - "file_type_not_supported": "Ο τύπος αρχείου δεν υποστηρίζεται.", - "file_size_too_large": "Το μέγεθος αρχείου είναι πολύ μεγάλο.", - "file_upload_error": "Το αρχείο δεν μπορεί να μεταφορτωθεί.", - "signin_required": "Πρέπει να συνδεθείτε για πρόσβαση σε αυτή τη σελίδα", - "malware_detected": "Εντοπίστηκε malware! Το αρχείο που ανεβάσατε ίσως περιέχει malware. Παρακαλούμε ελέγξτε το αρχείο σας και δοκιμάστε ξανά.", - "roles": { - "role_assigned": "Αυτός ο ρόλος δεν μπορεί να διαγραφεί καθώς έχει εκχωρηθεί σε τουλάχιστον έναν χρήστη." - }, - "users": { - "signup_error": "Δεν μπορεί να γίνει η πιστοποίησή σας. Παρακαλούμε επικοινωνήστε με τον διαχειριστή σας.", - "invalid_invite": "Το αναγνωριστικό πρόσκλησής σας δεν είναι έγκυρο ή είναι λανθασμένο. Παρακαλούμε επικοινωνήστε με τον διαχειριστή σας για να λάβετε νέο αναγνωριστικό.", - "email_exists": "Υπάρχει ήδη ένας λογαριασμός με αυτό το email. Παρακαλούμε δοκιμάστε ξανά με διαφορετικό email.", - "old_password": "Ο κωδικός πρόσβασης που εισαγάγατε δεν είναι σωστός", - "pending": "Η εγγραφή σας εκκρεμεί και είναι προς έγκριση από τον διαχειριστή. Παρακαλούμε δοκιμάστε αργότερα.", - "banned": "Δεν έχετε πρόσβαση σε αυτήν την εφαρμογή. Επικοινωνήστε με τον διαχειριστή εάν πιστεύετε ότι πρόκειται για λάθος" - }, - "rooms": { - "room_limit": "Δεν είναι δυνατή η δημιουργία αίθουσας διάσκεψης λόγω συμπλήρωσης του επιτρεπόμενου ορίου" - }, - "session": { - "invalid_credentials": "Μη έγκυρο όνομα χρήστη ή κωδικός πρόσβασης. Παρακαλούμε ελέγξτε τα στοιχεία σας και δοκιμάστε ξανά." - } - } - }, - "global_error_page": { - "title": "Σφάλμα", - "message": "Ωχ! Κάτι πήγε στραβά. Εάν το περιστατικό επαναληφθεί, παρακαλούμε επικοινωνήστε με τον διαχειριστή." - }, - "not_found_error_page": { - "title": "404", - "message": "Η σελίδα που προσπαθείτε να μεταβείτε δεν μπορεί να βρεθεί." - }, - "account_activation_page": { - "title": "Ενεργοποίηση λογαριασμού", - "account_unverified": "Ο λογαριασμός σας δεν έχει επιβεβαιωθεί.", - "message": "Για να χρησιμοποιήσετε το Greenlight, παρακαλούμε επιβεβαιώστε τον λογαριασμό σας ακολουθώντας τις οδηγίες στο email ενεργοποίησης που σας στάλθηκε.", - "resend_activation_link": "Εάν δε λάβατε το email ενεργοποίησης ή εάν αντιμετωπίζετε κάποιο πρόβλημα κατά τη χρήση του, κάντε κλικ στο κουμπί επανάληψης αποστολής για να αιτηθείτε ένα νέο email ενεργοποίησης.", - "resend_btn_lbl": "Επαναποστολή μηνύματος επιβεβαίωσης" - }, - "forms": { - "validations": { - "full_name": { - "required": "Παρακαλούμε εισαγάγετε πλήρες όνομα", - "min": "Το όνομα πρέπει να έχει τουλάχιστον 2 χαρακτήρες", - "max": "Το όνομα πρέπει να έχει μέχρι 255 χαρακτήρες" - }, - "email": { - "required": "Παρακαλούμε εισαγάγετε email", - "email": "Η τιμή που καταχωρήσατε δε συμφωνεί με μορφή email", - "min": "Το email πρέπει να έχει τουλάχιστον 6 χαρακτήρες", - "max": "Το email πρέπει να έχει μέχρι 255 χαρακτήρες" - }, - "password": { - "required": "Παρακαλούμε εισαγάγετε κωδικό πρόσβασης", - "match": "Ο κωδικός πρόσβασης πρέπει να έχει:", - "min": "- Οχτώ χαρακτήρες", - "lower": "- Ένα πεζό χαρακτήρα", - "upper": "Ένα κεφαλαίο χαρακτήρα", - "digit": "- Ένα νούμερο", - "symbol": "- Ένα σύμβολο", - "max": "Ο κωδικός πρόσβασης πρέπει να έχει μέχρι 255 χαρακτήρες" - }, - "password_confirmation": { - "required": "Παρακαλούμε επιβεβαιώστε τον κωδικό πρόσβασης", - "match": "Οι κωδικοί πρόσβασης δε συμφωνούν" - }, - "emails": { - "required": "Παρακαλούμε εισαγάγετε ένα έγκυρο email", - "list": "Παρακαλούμε καταχωρήστε κατάσταση διαχωρισμένη με κόμμα των έγκυρων email (user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "Παρακαλούμε εισαγάγετε το όνομα του ρόλου" - }, - "role": { - "limit": { - "required": "Παρακαλούμε εισαγάγετε το όριο της αίθουσας", - "min": "Επιτρέπεται το ελάχιστο 0", - "max": "Επιτρέπεται το μέγιστο 100" - }, - "type": { - "error": "Πρέπει να καθορίσετε έναν αριθμό" - } - }, - "room": { - "name": { - "required": "Παρακαλούμε εισαγάγετε το όνομα της αίθουσας.", - "min": "Το όνομα πρέπει να έχει τουλάχιστον 2 χαρακτήρες" - } - }, - "room_join": { - "name": { - "required": "Παρακαλούμε εισαγάγετε το όνομά σας." - } - }, - "url": { - "invalid": "Μη έγκυρο URL" - }, - "text_form": { - "value": { - "required": "Παρακαλούμε πληκτρολογήστε το μήνυμά σας" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Όνομα αίθουσας", - "placeholder": "Εισαγάγετε όνομα αίθουσας..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Όνομα", - "placeholder": "Εισαγάγετε το όνομά σας" - }, - "access_code": { - "label": "Κωδικός πρόσβασης", - "placeholder": "Εισαγάγετε τον κωδικό πρόσβασης" - }, - "recording_consent": { - "label": "Κατανοώ ότι αυτή η συνεδρία ίσως καταγραφεί. Αυτό πιθανός θα συμπεριλαμβάνει τη φωνή μου και το βίντεο εάν είναι ενεργοποιημένα." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Πλήρες όνομα", - "placeholder": "Εισαγάγετε το πλήρες όνομά σας" - }, - "email": { - "label": "Email", - "placeholder": "Εισαγάγετε το email σας" - }, - "password": { - "label": "Κωδικός πρόσβασης", - "placeholder": "Δημιουργία κωδικού πρόσβασης" - }, - "password_confirmation": { - "label": "Επιβεβαίωση κωδικού πρόσβασης", - "placeholder": "Επιβεβαίωση κωδικού πρόσβασης" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Email" - }, - "password": { - "label": "Κωδικός πρόσβασης", - "placeholder": "Κωδικός πρόσβασης" - }, - "remember_me": { - "label": "Να με θυμάσαι" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Τρέχων κωδικός πρόσβασης", - "placeholder": "Εισαγάγετε τον κωδικό πρόσβασης σας" - }, - "new_password": { - "label": "Νέος κωδικός πρόσβασης", - "placeholder": "Εισαγάγετε τον νέο κωδικό πρόσβασης σας" - }, - "password_confirmation": { - "label": "Επιβεβαίωση κωδικού πρόσβασης", - "placeholder": "Επιβεβαιώστε τον νέο κωδικό πρόσβασης σας" - } - }, - "validations": { - "old_password": { - "required": "Παρακαλούμε εισαγάγετε τον τρέχων κωδικό πρόσβασης σας" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Εισαγάγετε το email λογαριασμού" - } - }, - "validations": { - "email": { - "required": "Παρακαλούμε εισαγάγετε το email λογαριασμού" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Νέος κωδικός πρόσβασης", - "placeholder": "Εισαγάγετε τον νέο κωδικό πρόσβασης σας" - }, - "password_confirmation": { - "label": "Επιβεβαίωση κωδικού πρόσβασης", - "placeholder": "Επιβεβαιώστε τον νέο κωδικό πρόσβασης σας" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Πλήρες όνομα" - }, - "email": { - "label": "Email" - }, - "language": { - "label": "Γλώσσα" - }, - "role": { - "label": "Ρόλος" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Πλήρες όνομα", - "placeholder": "Εισαγάγετε το πλήρες όνομα χρήστη" - }, - "email": { - "label": "Email", - "placeholder": "Εισαγάγετε email χρήστη" - }, - "password": { - "label": "Κωδικός πρόσβασης", - "placeholder": "Εισαγάγετε τον κωδικό πρόσβασης χρήστη" - }, - "password_confirmation": { - "label": "Επιβεβαίωση κωδικού πρόσβασης", - "placeholder": "Επιβεβαίωση κωδικού πρόσβασης" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Emails" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Εισαγάγετε εδώ το σύνδεσμο...", - "text_placeholder": "Εισαγάγετε εδώ το κείμενο..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Όνομα ρόλου", - "placeholder": "Εισαγάγετε όνομα ρόλου..." - } - } - } - } - } -} diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json deleted file mode 100644 index dc4cd85df3..0000000000 --- a/app/assets/locales/en.json +++ /dev/null @@ -1,737 +0,0 @@ -{ - "start": "Start", - "search": "Search", - "home": "Home", - "previous": "Previous", - "back": "Back", - "next": "Next", - "view": "View", - "join": "Join", - "edit": "Edit", - "save": "Save", - "save_changes": "Save Changes", - "update": "Update", - "report": "Report", - "share": "Share", - "cancel": "Cancel", - "reset": "Reset", - "close": "Close", - "delete": "Delete", - "copy": "Copy Join Link", - "copy_viewer_code": "Copy Viewer Code", - "copy_moderator_code": "Copy Moderator Code", - "or": "Or", - "online": "Online", - "help_center": "Help Center", - "are_you_sure": "Are you sure?", - "return_home": "Return Home", - "created_at": "Created at", - "view_recordings": "View Recordings", - "join_session": "Join Session", - "no_result_search_input": "Could not find any results for \"{{ searchInput }}\"", - "action_permanent": "This action cannot be undone.", - "homepage": { - "welcome_bbb": "Welcome to BigBlueButton.", - "bigbluebutton_description": "BigBlueButton is an open source web conferencing system for online classes. The platform maximizes time for applied learning by enabling students to collaborate and receive feedback in real-time.", - "greenlight_description": "Create your own rooms to host sessions, or join others using a short and convenient link.", - "learn_more": "Learn more about BigBlueButton", - "explore_features": "Explore our features", - "meeting_title": "Launch a meeting", - "meeting_description": "Launch a virtual class with video, audio, screen sharing, chat, and all the tools required for applied learning.", - "recording_title": "Record your meetings", - "recording_description": "Record the BigBlueButton meetings and share them with the students to review and reflect on the material.", - "settings_title": "Manage your rooms", - "settings_description": "Configure your rooms and meeting settings to be in charge of an effective classroom.", - "and_more_title": "And more!", - "and_more_description": "BigBlueButton offers built-in tools for applied learning and is designed to save you time during class.", - "enter_meeting_url": "Enter Meeting URL", - "enter_meeting_url_instruction": "Please enter the URL of your BigBlueButton meeting in the field below." - }, - "authentication": { - "sign_in": "Sign In", - "sign_up": "Sign Up", - "sign_out": "Sign Out", - "email": "Email", - "password": "Password", - "confirm_password": "Confirm Password", - "enter_email": "Enter your email", - "enter_name": "Enter your name", - "remember_me": "Remember Me", - "forgot_password": "Forgot password?", - "dont_have_account": "Don't have an account?", - "create_account": "Create Account", - "create_an_account": "Create an Account", - "already_have_account": "Already have an account?" - }, - "user": { - "user": "User", - "users": "Users", - "name": "Name", - "email_address": "Email Address", - "authenticator": "Authenticator", - "full_name": "Full Name", - "no_user_found": "No user found", - "type_three_characters": "Please type three (3) characters or more to show the other users.", - "search_not_found": "No Users Found", - "profile": { - "profile": "Profile", - "language": "Language", - "role": "Role", - "administrator": "Administrator", - "guest": "Guest" - }, - "account": { - "account_info": "Account Info", - "delete_account": "Delete Account", - "change_password": "Change Password", - "set_password": "Set Your New Password", - "reset_password": "Reset Password", - "update_account_info": "Update Account Info", - "current_password": "Current Password", - "new_password": "New Password", - "confirm_password": "Confirm Password", - "permanently_delete_account": "Permanently Delete Your Account", - "delete_account_description": "If you choose to delete your account, it will NOT be recoverable. \n All information regarding your account, including settings, rooms, and recordings will be removed.", - "delete_account_confirmation": "Yes, I would like to delete my account", - "are_you_sure_delete_account": "Are you sure you want to delete your account?" - }, - "avatar": { - "upload_avatar": "Upload Avatar", - "delete_avatar": "Delete Avatar", - "crop_avatar": "Crop Your Avatar" - }, - "pending": { - "title": "Pending Registration", - "message": "Thank you for registering! Your account is currently pending approval by an administrator." - } - }, - "room": { - "room": "Room", - "rooms": "Rooms", - "room_name": "Room Name", - "add_new_room": "+ New Room", - "create_room": "Create Room", - "delete_room": "Delete Room", - "create_new_room": "Create New Room", - "enter_room_name": "Enter the room name", - "shared_by": "shared by", - "last_session": "Last Session: {{ localizedTime }}", - "no_last_session": "No previous session created", - "search_not_found": "No Rooms Found", - "rooms_list_is_empty": "You don't have any rooms yet!", - "rooms_list_empty_create_room": "Create your first room by clicking on the button below and entering a room name.", - "meeting": { - "start_meeting": "Start Meeting", - "join_meeting": "Join Meeting", - "meeting_invitation": "You have been invited to join", - "meeting_not_started": "The meeting has not started yet", - "join_meeting_automatically": "You will automatically join when the meeting starts", - "recording_consent": "I acknowledge that this session may be recorded. This may include my voice and video if enabled." - }, - "presentation": { - "presentation": "Presentation", - "click_to_upload": "Click to Upload", - "drag_and_drop": " or drag and drop", - "upload_description": "Upload any office document or PDF file (not larger than {{size}}). Depending on the size of the file, it may require additional time to upload before it can be used", - "delete_presentation": "Delete Presentation", - "are_you_sure_delete_presentation": "Are you sure you want to delete this presentation?" - }, - "shared_access": { - "access": "Access", - "add_share_access": "+ Share Access", - "share_room_access": "Share Room Access", - "add_some_users": "Time to add some users!", - "add_some_users_description": "To add new users, click the button below and search or select the users you want to share this room with.", - "delete_shared_access": "Delete Shared Access", - "are_you_sure_delete_shared_access": "Are you sure you want to delete this Shared Access?" - }, - "settings": { - "settings": "Settings", - "room_name": "Room Name", - "user_settings": "User Settings", - "allow_room_to_be_recorded": "Allow room to be recorded", - "require_signed_in": "Require users to be signed in before joining", - "require_signed_in_message": "You must be signed in to join this room.", - "require_mod_approval": "Require moderator approval before joining", - "allow_any_user_to_start": "Allow any user to start this meeting", - "all_users_join_as_mods": "All users join as moderators", - "mute_users_on_join": "Mute users when they join", - "generate": "Generate", - "access_code": "Access Code", - "mod_access_code": "Moderator Access Code", - "mod_access_code_optional": "Moderator Access Code (optional)", - "access_code_required": "Please enter the access code", - "wrong_access_code": "Wrong Access Code", - "generate_viewers_access_code": "Generate access code for viewers", - "generate_mods_access_code": "Generate access code for moderators", - "server_tag": "Select a server type for this room", - "default_tag_name": "Default", - "server_tag_desired": "Desired", - "server_tag_required": "Required", - "are_you_sure_delete_room": "Are you sure you want to delete this room?" - } - }, - "recording": { - "recording": "Recording", - "recordings": "Recordings", - "processing": "Recordings Processing...", - "name": "Name", - "length": "Length", - "users": "Users", - "visibility": "Visibility", - "formats": "Formats", - "published": "Published", - "unpublished": "Unpublished", - "protected": "Protected", - "public": "Public", - "public_protected": "Public/Protected", - "formats_help": "Displays the available playback formats. Selecting a format opens the BigBlueButton Recording in a new tab", - "visibility_help": { - "public_protected": "The recording is available on the Public Recordings page, accessible from the Room Join page. It can also be shared with others using a one-time access link", - "public": "The recording is available on the Public Recordings page, accessible from the Room Join page, and its link can be shared with anyone", - "protected": "The recording is accessible only to the room owner and can be shared with others using a one-time access link", - "published": "The recording is accessible to anyone who has the link", - "unpublished": "The recording is not accessible to anyone" - }, - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "Processing recording, this may take several minutes...", - "copy_recording_urls": "Copy Recording Url(s)", - "recordings_list_empty": "You don't have any recordings yet!", - "public_recordings_list_empty": "There are no public recordings yet!", - "recordings_list_empty_description": "Recordings will appear here after you start a meeting and record it.", - "public_recordings_list_empty_description": "Recordings will appear here when available.", - "delete_recording": "Delete Recording", - "are_you_sure_delete_recording": "Are you sure you want to delete this recording?", - "search_not_found": "No Recordings Found" - }, - "admin": { - "admin_panel": "Administrator Panel", - "manage_users": { - "manage_users": "Manage Users", - "active": "Active", - "approve": "Approve", - "decline": "Decline", - "pending": "Pending", - "banned": "Banned", - "ban": "Ban", - "unban": "Unban", - "unverified": "Unverified", - "verify": "Verify", - "deleted": "Deleted", - "invited_tab": "Invited", - "invite_user": "Invite User", - "send_invitation": "Send Invitation", - "enter_user_email": "Enter user's email", - "new_user": "New User", - "add_new_user": "New User", - "create_new_user": "Create New User", - "edit_user": "Edit User", - "delete_user": "Delete User", - "users_edit_path": "Users/Edit", - "create_account": "Create Account", - "create_room": "Create Room", - "create_new_room": "Create New Room", - "user_created_at": "Created: {{localizedTime}}", - "are_you_sure_delete_account": "Are you sure you want to delete {{user.name}}'s account?", - "delete_account_warning": "If you choose to delete this account, it will NOT be recoverable.", - "empty_active_users": "There are no active users on this server yet!", - "empty_active_users_subtext": "When a user's status gets changed to active, they will appear here.", - "empty_pending_users": "There are no pending users on this server yet!", - "empty_pending_users_subtext": "When a user's status gets changed to pending, they will appear here.", - "empty_banned_users": "There are no banned users on this server yet!", - "empty_banned_users_subtext": "When a user's status gets changed to banned, they will appear here.", - "empty_unverified_users": "There are no unverified users on this server yet!", - "empty_unverified_users_subtext": "Any unverified users will appear here.", - "empty_invited_users": "There are no invited users on this server yet!", - "empty_invited_users_subtext": "When a user's status gets changed to invited, they will appear here.", - "invited": { - "time_sent": "Time Sent", - "valid": "Valid", - "revoke": "Revoke" - } - }, - "server_rooms": { - "server_rooms": "Server Rooms", - "name": "Name", - "owner": "Owner", - "room_id": "Room ID", - "participants": "Participants", - "status": "Status", - "running": "Running", - "not_running": "Not Running", - "active": "Active", - "current_session": "Current Session: {{lastSession}}", - "last_session": "Last Session: {{localizedTime}}", - "no_meeting_yet": "No meeting yet.", - "delete_server_rooms": "Delete Server Room", - "resync_recordings": "Re-Sync Recordings", - "empty_room_list": "There are no server rooms yet!", - "empty_room_list_subtext": "Rooms will appear here after creating your first room." - }, - "server_recordings": { - "server_recordings": "Server Recordings", - "latest_recordings": "Latest Recordings", - "no_recordings_found": "No recordings found." - }, - "site_settings": { - "site_settings": "Site Settings", - "customize_greenlight": "Customize Greenlight", - "appearance": { - "appearance": "Appearance", - "brand_color": "Brand Color", - "regular": "Regular", - "lighten": "Lighten", - "brand_image": "Brand Image", - "click_to_upload": "Click to Upload", - "drag_and_drop": " or drag and drop", - "upload_brand_image_description": "Upload any PNG, JPG, or SVG file (not larger than {{size}}). Depending on the size of the file, it may require additional time to upload before it can be used", - "remove_branding_image": "Remove Branding Image" - }, - "administration": { - "administration": "Administration", - "terms": "Terms & Conditions", - "privacy": "Privacy Notice", - "privacy_policy": "Privacy Notice", - "accessibility_statement": "Accessibility Statement", - "change_term_links": "Change the terms links that appears at the bottom of the page", - "change_privacy_link": "Change the privacy link that appears at the bottom of the page", - "change_accessibility_statement_link": "Change the accessibility statement link that appears at the bottom of the page", - "helpcenter": "Help Center", - "change_helpcenter_link": "Change the help center link that appears under the profile dropdown", - "maintenance": "Maintenance Banner", - "change_maintenance_text": "Change the maintenance banner text that appears in the header", - "change_url": "Change URL", - "set_text": "Set Text", - "clear_banner": "Clear Banner", - "enter_link": "Enter link here" - }, - "settings": { - "settings": "Settings", - "allow_users_to_share_rooms": "Allow Users to Share Rooms", - "allow_users_to_share_rooms_description": "Setting to disabled will remove the button from the room options dropdown, preventing users from sharing rooms", - "allow_users_to_preupload_presentation": "Allow Users to Preupload Presentations", - "allow_users_to_preupload_presentation_description": "Users can preupload a presentation to be used as the default presentation for that specific room", - "show_sign_in_on_room_join": "Show Sign In Link on Room Join", - "show_sign_in_on_room_join_description": "If the user is not signed in, a sign-in link appears at the bottom of the card when entering a room", - "default_visibility": "Default Recording Visibility", - "default_visibility_description": "All newly created recordings will have this visibility by default", - "session_timeout": "Session Timeout", - "session_timeout_description": "You can configure the session timeout with a default cookie of 1 day or extended session cookie of 7 days", - "default_session_timeout": "Default (1 day)", - "extended_session_timeout": "Extended (7 days)" - }, - "registration": { - "registration": "Registration", - "role_mapping_by_email": "Role Mapping By Email", - "role_mapping_by_email_description": "Map the user to a role using their email. Must be in the format: role1=email1,role2=email2", - "enter_role_mapping_rule": "Enter a role mapping rule", - "resync_on_login": "Resync User Data On Every Sign In", - "resync_on_login_description": "Resync a user's information every time they sign in, making the external authentication provider always match the information in Greenlight", - "default_role": "Default Role", - "default_role_description": "The default role to be assigned to newly created users", - "registration_method": "Registration Method", - "registration_method_description": "Change the way that users register to the website", - "registration_methods" : { - "open": "Open Registration", - "invite": "Join by Invitation", - "approval": "Approve/Decline" - }, - "allowed_domains": "Allowed Email Domains", - "allowed_domains_signup_description": "Allow specific email domains to sign up. Format must be: @test.com,domain.com", - "enter_allowed_domains_rule" : "Enter the allowed domains" - } - }, - "room_configuration": { - "room_configuration": "Room Configuration", - "default": "Optional (default: enabled)", - "optional": "Optional (default: disabled)", - "enabled": "Force Enabled", - "disabled": "Disabled", - "configurations": { - "allow_room_to_be_recorded": "Allow Room to be recorded", - "allow_room_to_be_recorded_description": "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.", - "require_user_signed_in": "Require users to be signed in before joining", - "require_user_signed_in_description": "Only allows users with a Greenlight account to join the meeting. If they are not signed in, they will be redirected to the login page when attempting to join a room.", - "require_mod_approval": "Require moderator approval before joining", - "require_mod_approval_description": "Prompts the moderator of the BigBlueButton meeting when a user tries to join. If the user is approved, they will be able to join the meeting.", - "allow_any_user_to_start_meeting": "Allow any user to start a meeting", - "allow_any_user_to_start_meeting_description": "Allow any user to start the meeting at any time. By default, only the room owner can start the meeting.", - "allow_users_to_join_as_mods": "All users join as moderators", - "allow_users_to_join_as_mods_description": "Gives all users the moderator privileges in BigBlueButton when they join the meeting", - "mute_users_on_join": "Mute users when they join", - "mute_users_on_join_description": "Automatically mutes the user when they join the BigBlueButton meeting", - "viewer_access_code": "Viewer Access Code", - "viewer_access_code_description": "Allows room owners to have a random alphanumeric code that can be shared with users. The code, if generated, will be required for users to join the room meetings.", - "mod_access_code": "Moderator Access Code", - "mod_access_code_description": "Allows room owners to have a random alphanumeric code that can be shared with users. The code, if generated, will not be required and when used on any room meeting will join the user as a moderator." - } - }, - "roles": { - "role": "Role", - "roles": "Roles", - "administrator": "Administrator", - "guest": "Guest", - "manage_roles": "Manage Roles", - "delete_role": "Delete Role", - "are_you_sure_delete_role": "Are you sure you want to delete this role?", - "enter_role_name": "Enter a role name", - "add_role": "+ Create Role", - "create_role": "Create Role", - "create_new_role": "Create a new role", - "no_role_found": "No role found.", - "search_not_found": "No Roles Found", - "edit": { - "create_room": "Allow users with this role to create rooms", - "record": "Allow users with this role to record their meetings", - "manage_users": "Allow users with this role to manage users", - "manage_rooms": "Allow users with this role to manage server rooms", - "manage_recordings": "Allow users with this role to manage server recordings", - "manage_site_settings": "Allow users with this role to manage site settings", - "manage_roles": "Allow users with this role to edit other roles", - "shared_list": "Include users with this role in the dropdown for sharing rooms", - "room_limit": "Room Limit", - "email_on_signup": "Receive an email when a new user signs up", - "allowed_recording_visibility": "Allowed recording visibilities" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "A new user has been created.", - "user_updated": "The user has been updated.", - "user_deleted": "The user has been deleted.", - "avatar_updated": "The avatar has been updated.", - "password_changed": "Successfully updated your password. Please sign in again.", - "password_updated": "The password has been updated.", - "account_activated": "Your account has been activated.", - "activation_email_sent": "An email that contains the instructions to activate your account has been sent.", - "reset_pwd_email_sent": "An email that contains the instructions to reset your password has been sent." - }, - "session": { - "signed_out": "You have been signed out." - }, - "room": { - "room_created": "A new room has been created.", - "room_updated": "The room has been updated.", - "room_deleted": "The room has been deleted.", - "room_shared": "The room has been shared.", - "room_unshared": "The room has been unshared.", - "recordings_synced": "The room recordings have been synchronized.", - "room_configuration_updated": "The room configuration have been updated.", - "room_setting_updated": "The room setting has been updated.", - "presentation_updated": "The presentation has been updated.", - "presentation_deleted": "The presentation has been deleted.", - "joining_meeting": "Joining the meeting...", - "meeting_started": "Meeting started.", - "access_code_copied": "The access code has been copied.", - "access_code_generated": "A new access code has been generated.", - "access_code_deleted": "The access code has been deleted.", - "copied_meeting_url": "The meeting URL has been copied. The link can be used to join the meeting.", - "copied_viewer_code": "The viewer access code has been copied.", - "copied_moderator_code": "The moderator access code has been copied." - }, - "site_settings": { - "site_setting_updated": "The site setting has been updated.", - "brand_color_updated": "The brand color has been updated.", - "brand_image_updated": "The brand image has been updated.", - "brand_image_deleted": "The brand image has been deleted.", - "privacy_policy_updated": "The privacy notice has been updated.", - "helpcenter_updated": "The help center link has been updated.", - "terms_of_service_updated": "The terms of service have been updated.", - "maintenance_updated": "The maintenance banner has been updated.", - "allowed_domains_signup_updated": "The allowed email domains have been updated." - }, - "recording": { - "recording_visibility_updated": "The recording visibility has been updated.", - "recording_name_updated": "The recording name has been updated.", - "recording_deleted": "The recording has been deleted.", - "copied_urls": "The recording URL has been copied." - }, - "role": { - "role_created": "A new role has been created.", - "role_updated": "The role has been updated.", - "role_deleted": "The role has been deleted.", - "role_permission_updated": "The role permission has been updated." - }, - "invitations": { - "invitation_sent": "An invitation has been sent.", - "invitation_revoked": "An invitation has been revoked" - } - }, - "error": { - "problem_completing_action": "The action can't be completed. \n Please try again.", - "server_type_unavailable": "The required server type is unavailable. Please select a different type in the room settings.", - "file_type_not_supported": "The file type is not supported.", - "file_size_too_large": "The file size is too large.", - "file_upload_error": "The file can't be uploaded.", - "signin_required": "You must be signed in to access this page.", - "malware_detected": "Malware Detected! The file you uploaded may contain malware. Please check your file and try again.", - "roles": { - "role_assigned": "This role can't be deleted because it is assigned to at least one user." - }, - "users": { - "signup_error": "You can't be authenticated. Please contact your administrator.", - "invalid_invite": "Your invitation token is either invalid or incorrect. Please contact your administrator to receive a new token.", - "email_exists": "An account under this email already exists. Please try again with another email.", - "old_password": "The password you have entered is incorrect.", - "pending": "Your registration is pending approval from the administrator. Please try again later.", - "banned": "You do not have access to this application. Please contact your administrator if you believe this is a mistake.", - "hcaptcha_invalid": "The CAPTCHA verification failed. Please try again." - }, - "rooms": { - "room_limit": "The room can't be created due to reaching the room limit." - }, - "session": { - "invalid_credentials": "The username or password is invalid. Please verify your credentials and try again." - } - } - }, - "global_error_page": { - "title": "Error", - "message": "Sorry, something went wrong. If the incident occurs again, please contact the administrator." - }, - "not_found_error_page": { - "title": "Page Not Found", - "message": "Sorry, the page you are trying to access can't be found." - }, - "account_activation_page": { - "title": "Account Activation", - "account_unverified": "Your account has not been verified yet.", - "message": "In order to use Greenlight, please verify your account by following the instructions in the activation email that has been sent to you.", - "resend_activation_link": "If you haven't received an activation email or if you are having a problem using it, click on the button below to request a new activation email.", - "resend_btn_lbl": "Resend Verification" - }, - "forms": { - "validations": { - "full_name": { - "required": "Please enter a full name", - "min": "Name must be at least 2 characters long", - "max": "Name must be at most 255 characters long" - }, - "email": { - "required": "Please enter an email", - "email": "Entered value does not match email format", - "min": "Email must be at least 6 characters long", - "max": "Email must be at most 255 characters long" - }, - "password": { - "required": "Please enter a password", - "match": "Password must have at least:", - "min": "- Eight characters", - "lower": "- One lowercase letter", - "upper": "- One uppercase letter", - "digit": "- One digit", - "symbol": "- One symbol", - "max": "Password must be at most 255 characters long" - }, - "password_confirmation": { - "required": "Please enter a password confirmation", - "match": "The passwords do not match" - }, - "emails": { - "required": "Please enter at least one valid email", - "list": "Please provide a comma separated list of valid emails (user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "Please enter the role name" - }, - "role": { - "limit": { - "required": "Please enter the room count limit", - "min": "Allowed minimum is 0", - "max": "Allowed maximum is 100" - }, - "type": { - "error": "You must specify a number" - } - }, - "room": { - "name": { - "required": "Please enter the room name.", - "min": "Name must be at least 2 characters long" - } - }, - "room_join": { - "name": { - "required": "Please enter your name." - } - }, - "url": { - "invalid": "Invalid URL" - }, - "text_form": { - "value": { - "required": "Please enter some message" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Room Name", - "placeholder": "Enter a room name..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Name", - "placeholder": "Enter your name" - }, - "access_code": { - "label": "Access Code", - "placeholder": "Enter the access code" - }, - "recording_consent": { - "label": "I acknowledge that this session may be recorded. This may include my voice and video if enabled." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Full Name", - "placeholder": "Enter your full name" - }, - "email": { - "label": "Email", - "placeholder": "Enter your email" - }, - "password": { - "label": "Password", - "placeholder": "Create a password" - }, - "password_confirmation": { - "label": "Confirm Password", - "placeholder": "Confirm password" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Email" - }, - "password": { - "label": "Password", - "placeholder": "Password" - }, - "remember_me": { - "label": "Remember me" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Current Password", - "placeholder": "Enter your password" - }, - "new_password": { - "label": "New Password", - "placeholder": "Enter your new password" - }, - "password_confirmation": { - "label": "Confirm password", - "placeholder": "Confirm your new password" - } - }, - "validations": { - "old_password": { - "required": "Please enter your current password" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Enter the account email" - } - }, - "validations": { - "email": { - "required": "Please enter the account email" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "New Password", - "placeholder": "Enter your new password" - }, - "password_confirmation": { - "label": "Confirm password", - "placeholder": "Confirm your new password" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Full Name" - }, - "email": { - "label": "Email" - }, - "language": { - "label": "Language" - }, - "role": { - "label": "Role" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Full Name", - "placeholder": "Enter the user full name" - }, - "email": { - "label": "Email", - "placeholder": "Enter the user email" - }, - "password": { - "label": "Password", - "placeholder": "Enter the user password" - }, - "password_confirmation": { - "label": "Confirm Password", - "placeholder": "Confirm the password" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Emails" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Enter link here...", - "text_placeholder": "Enter text here..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Role Name", - "placeholder": "Enter a role name..." - } - } - } - } - } -} diff --git a/app/assets/locales/es.json b/app/assets/locales/es.json deleted file mode 100644 index 9c36f84cd3..0000000000 --- a/app/assets/locales/es.json +++ /dev/null @@ -1,726 +0,0 @@ -{ - "start": "Iniciar", - "search": "Buscar", - "home": "Inicio", - "previous": "Previo", - "back": "Regresar", - "next": "Próximo", - "view": "Ver", - "join": "Unirse", - "edit": "Editar", - "save": "Guardar", - "save_changes": "Guardar Cambios", - "update": "Actualizar", - "report": "Reportar", - "share": "Compartir", - "cancel": "Cancelar", - "reset": "Restablecer", - "close": "Cerrar", - "delete": "Borrar", - "copy": "Copiar enlace de reunión", - "copy_viewer_code": "Copiar código del espectador", - "copy_moderator_code": "Copiar código del moderador", - "or": "O", - "online": "En Línea", - "help_center": "Centro de Ayuda", - "are_you_sure": "¿Seguro?", - "return_home": "Volver al Inicio", - "created_at": "Creado en", - "view_recordings": "Ver grabaciones", - "join_session": "Unirse a la sesión", - "no_result_search_input": "No se encontraron resultados para \"{{ searchInput }}\"", - "action_permanent": "Esta acción no se puede deshacer.", - "homepage": { - "welcome_bbb": "Te damos la bienvenida a BigBlueButton.", - "bigbluebutton_description": "BigBlueButton es una plataforma digital de videoconferencias para reuniones virtuales y clases en línea, que maximiza la eficiencia al permitir que los participantes colaboren y reciban retroalimentación en tiempo real.", - "greenlight_description": "Cree sus propias salas para realizar sesiones o únase a otras utilizando un enlace corto y conveniente.", - "learn_more": "Aprende más sobre BigBlueButton", - "explore_features": "Explora nuestras características", - "meeting_title": "Iniciar una reunión", - "meeting_description": "Inicie una reunión o clase virtual con video, audio, pantalla compartida, chat y todas las herramientas necesarias para el aprendizaje práctico.", - "recording_title": "Grabe sus reuniones", - "recording_description": "Grabe las reuniones de BigBlueButton y compártalas con los participantes para que repasen el material.", - "settings_title": "Administre sus salas", - "settings_description": "Configure sus salas y los parámetros de las reuniones para manejarlas eficientemente.", - "and_more_title": "¡Y más!", - "and_more_description": "BigBlueButton ofrece herramientas para el aprendizaje práctico y está diseñado para ahorrar tiempo durante la sesión.", - "enter_meeting_url": "Ingrese el enlace de la reunión", - "enter_meeting_url_instruction": "Por favor, ingrese el enlace de su reunión de BigBlueButton en el campo de abajo." - }, - "authentication": { - "sign_in": "Iniciar Sesión", - "sign_up": "Registrarse", - "sign_out": "Cerrar Sesión", - "email": "Correo Electrónico", - "password": "Contraseña", - "confirm_password": "Confirmar contraseña", - "enter_email": "Ingrese su correo electrónico", - "enter_name": "Ingrese su nombre", - "remember_me": "Recordarme", - "forgot_password": "¿Olvidaste tu contraseña?", - "dont_have_account": "¿No tienes una cuenta?", - "create_account": "Crear Cuenta", - "create_an_account": "Crear una cuenta", - "already_have_account": "¿Ya tienes una cuenta?" - }, - "user": { - "user": "Usuario", - "users": "Usuarios", - "name": "Nombre", - "email_address": "Correo electrónico", - "authenticator": "Autenticador", - "full_name": "Nombre completo", - "no_user_found": "No se encontró ningún usuario", - "type_three_characters": "Por favor ingrese tres (3) caracteres o más para mostrar a los otros usuarios.", - "search_not_found": "No se encontraron usuarios", - "profile": { - "profile": "Perfil", - "language": "Idioma", - "role": "Rol", - "administrator": "Administrador", - "guest": "Invitado" - }, - "account": { - "account_info": "Información de la cuenta", - "delete_account": "Eliminar cuenta", - "change_password": "Cambiar contraseña", - "set_password": "Establezca su nueva contraseña", - "reset_password": "Restablecer contraseña", - "update_account_info": "Actualizar información de la cuenta", - "current_password": "Contraseña actual", - "new_password": "Nueva contraseña", - "confirm_password": "Confirmar contraseña", - "permanently_delete_account": "Eliminar permanentemente su cuenta", - "delete_account_description": "Si elige eliminar su cuenta, NO será recuperable. \n Se eliminará toda la información relacionada con su cuenta, incluidas configuraciones, salas y grabaciones.", - "delete_account_confirmation": "Sí, quiero eliminar mi cuenta", - "are_you_sure_delete_account": "¿Está seguro de que desea eliminar su cuenta?" - }, - "avatar": { - "upload_avatar": "Subir avatar", - "delete_avatar": "Eliminar avatar", - "crop_avatar": "Recortar su avatar" - }, - "pending": { - "title": "Registro pendiente", - "message": "¡Gracias por registrarse! Su cuenta está actualmente pendiente de aprobación por un administrador." - } - }, - "room": { - "room": "Sala", - "rooms": "Salas", - "room_name": "Nombre de la sala", - "add_new_room": "+ Nueva sala", - "create_room": "Crear sala", - "delete_room": "Eliminar sala", - "create_new_room": "Crear nueva sala", - "enter_room_name": "Ingrese el nombre de la sala", - "shared_by": "compartido por", - "last_session": "Última sesión: {{ localizedTime }}", - "no_last_session": "No se creó ninguna sesión anterior", - "search_not_found": "No se encontraron salas", - "rooms_list_is_empty": "¡Todavía no tiene ninguna sala!", - "rooms_list_empty_create_room": "Cree su primera sala haciendo clic en el botón de abajo e ingresando un nombre de sala.", - "meeting": { - "start_meeting": "Iniciar reunión", - "join_meeting": "Unirse a la reunión", - "meeting_invitation": "Ha sido invitado a unirse a", - "meeting_not_started": "La reunión aún no ha comenzado", - "join_meeting_automatically": "Se unirá automáticamente cuando comience la reunión", - "recording_consent": "Reconozco que esta sesión puede ser grabada. Esto puede incluir mi voz y video si está habilitado." - }, - "presentation": { - "presentation": "Presentación", - "click_to_upload": "Haz clic para subir", - "drag_and_drop": " o arrastra y suelta", - "upload_description": "Sube cualquier documento de Office o archivo PDF (que no supere los {{size}}). Dependiendo del tamaño del archivo, es posible que se requiera más tiempo para subirlo antes de que pueda utilizarse.", - "delete_presentation": "Eliminar presentación", - "are_you_sure_delete_presentation": "¿Seguro de que quieres eliminar esta presentación?" - }, - "shared_access": { - "access": "Acceso", - "add_share_access": "+ Compartir Acceso", - "share_room_access": "Compartir acceso a la sala", - "add_some_users": "¡Es hora de agregar algunos usuarios!", - "add_some_users_description": "Para agregar nuevos usuarios, haz clic en el botón a continuación y busca o selecciona los usuarios con los que quieres compartir esta sala.", - "delete_shared_access": "Eliminar acceso compartido", - "are_you_sure_delete_shared_access": "¿Estás seguro de que quieres eliminar este acceso compartido?" - }, - "settings": { - "settings": "Configuración", - "room_name": "Nombre de la Sala", - "user_settings": "Configuración del Usuario", - "allow_room_to_be_recorded": "Permitir que se grabe la sala", - "require_signed_in": "Requerir que los usuarios inicien sesión antes de unirse", - "require_signed_in_message": "Debe iniciar sesión para unirse a esta sala.", - "require_mod_approval": "Requerir aprobación del moderador antes de unirse", - "allow_any_user_to_start": "Permitir que cualquier usuario comience esta reunión", - "all_users_join_as_mods": "Todos los usuarios se unen como moderadores", - "mute_users_on_join": "Silenciar a los usuarios al unirse", - "generate": "Generar", - "access_code": "Código de acceso", - "mod_access_code": "Código de acceso de moderador", - "mod_access_code_optional": "Código de acceso de moderador (opcional)", - "access_code_required": "Ingresa el código de acceso por favor", - "wrong_access_code": "Código de acceso incorrecto", - "generate_viewers_access_code": "Generar código de acceso para espectadores", - "generate_mods_access_code": "Generar código de acceso para moderadores", - "server_tag": "Selecciona un tipo de servidor para esta sala.", - "default_tag_name": "Predeterminado", - "server_tag_desired": "Deseado", - "server_tag_required": "Obligatorio", - "are_you_sure_delete_room": "¿Seguro que quieres eliminar esta sala?" - } - }, - "recording": { - "recording": "Grabación", - "recordings": "Grabaciones", - "processing": "Procesando grabaciones...", - "name": "Nombre", - "length": "Duración", - "users": "Usuarios", - "visibility": "Visibilidad", - "formats": "Formatos", - "published": "Publicado", - "unpublished": "No publicado", - "protected": "Protegido", - "public": "Público", - "public_protected": "Público/Protegido", - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "Procesando grabación...", - "copy_recording_urls": "Copiar enlace(s) de la grabación", - "recordings_list_empty": "¡Todavía no tienes grabaciones!", - "public_recordings_list_empty": "¡Aún no hay grabaciones públicas!", - "recordings_list_empty_description": "Las grabaciones aparecerán aquí después de iniciar una reunión y grabarla.", - "public_recordings_list_empty_description": "Las grabaciones aparecerán aquí cuando estén disponibles.", - "delete_recording": "Eliminar grabación", - "are_you_sure_delete_recording": "¿Seguro de que quieres eliminar esta grabación?", - "search_not_found": "No se encontraron grabaciones" - }, - "admin": { - "admin_panel": "Panel de Administración", - "manage_users": { - "manage_users": "Gestionar Usuarios", - "active": "Activo", - "approve": "Aprobar", - "decline": "Rechazar", - "pending": "Pendiente", - "banned": "Prohibido", - "ban": "Prohibir", - "unban": "Desprohibir", - "unverified": "Sin verificar", - "verify": "Verificar", - "deleted": "Eliminado", - "invited_tab": "Invitado", - "invite_user": "Invitar Usuario", - "send_invitation": "Enviar Invitación", - "enter_user_email": "Introducir el Email del usuario", - "new_user": "Nuevo Usuario", - "add_new_user": "Agregar Nuevo Usuario", - "create_new_user": "Crear Nuevo Usuario", - "edit_user": "Editar Usuario", - "delete_user": "Eliminar Usuario", - "users_edit_path": "Usuarios/Editar", - "create_account": "Crear Cuenta", - "create_room": "Crear Sala", - "create_new_room": "Crear Nueva Sala", - "user_created_at": "Creado: {{localizedTime}}", - "are_you_sure_delete_account": "¿Seguro que quieres eliminar la cuenta de {{user.name}}?", - "delete_account_warning": "Si elige eliminar esta cuenta, NO podrá recuperarse.", - "empty_active_users": "¡Todavía no hay usuarios activos en este servidor!", - "empty_active_users_subtext": "Cuando el estado de un usuario se cambia a activo, aparecerán aquí.", - "empty_pending_users": "¡Todavía no hay usuarios pendientes en este servidor!", - "empty_pending_users_subtext": "Cuando el estado de un usuario se cambia a pendiente, aparecerán aquí.", - "empty_banned_users": "¡Todavía no hay usuarios prohibidos en este servidor!", - "empty_banned_users_subtext": "Cuando el estado de un usuario se cambia a prohibido, aparecerán aquí.", - "empty_unverified_users": "¡Aún no hay usuarios sin verificar en este servidor!", - "empty_unverified_users_subtext": "Los usuarios no verificados aparecerán aquí.", - "empty_invited_users": "¡Todavía no hay usuarios invitados en este servidor!", - "empty_invited_users_subtext": "Cuando el estado de un usuario se cambia a invitado, aparecerán aquí.", - "invited": { - "time_sent": "Hora de envío", - "valid": "Válido", - "revoke": "Revocar" - } - }, - "server_rooms": { - "server_rooms": "Salas del Servidor", - "name": "Nombre", - "owner": "Propietario", - "room_id": "ID de Sala", - "participants": "Participantes", - "status": "Estado", - "running": "Funcionando", - "not_running": "Sin Funcionar", - "active": "Activo", - "current_session": "Sesión Actual: {{lastSession}}", - "last_session": "Última Sesión: {{localizedTime}}", - "no_meeting_yet": "Todavía no hay reunión.", - "delete_server_rooms": "Eliminar sala del servidor", - "resync_recordings": "Volver a sincronizar grabaciones", - "empty_room_list": "¡Todavía no hay salas de servidor!", - "empty_room_list_subtext": "Las salas aparecerán aquí después de crear su primera sala." - }, - "server_recordings": { - "server_recordings": "Grabaciones del Servidor", - "latest_recordings": "Últimas Grabaciones", - "no_recordings_found": "No se encontraron grabaciones." - }, - "site_settings": { - "site_settings": "Configuración del sitio", - "customize_greenlight": "Personalizar Greenlight", - "appearance": { - "appearance": "Apariencia", - "brand_color": "Color de Marca", - "regular": "Regular", - "lighten": "Iluminado", - "brand_image": "Imagen de Marca", - "click_to_upload": "Haga clic para cargar", - "drag_and_drop": " o arrastrar y soltar", - "upload_brand_image_description": "Sube cualquier archivo PNG, JPG o SVG (que no supere los {{size}}). Dependiendo del tamaño del archivo, es posible que se requiera más tiempo para subirlo antes de que pueda utilizarse.", - "remove_branding_image": "Eliminar Imagen de Marca" - }, - "administration": { - "administration": "Administración", - "terms": "Términos y Condiciones", - "privacy": "Aviso de privacidad", - "privacy_policy": "Aviso de privacidad", - "change_term_links": "Cambiar los enlaces de los términos que aparecen en la parte inferior de la página", - "change_privacy_link": "Cambiar el enlace de privacidad que aparece en la parte inferior de la página", - "helpcenter": "Centro de ayuda", - "change_helpcenter_link": "Cambia el enlace del centro de ayuda que aparece debajo del menú desplegable del perfil.", - "maintenance": "Banner de mantenimiento", - "change_maintenance_text": "Cambiar el texto del banner de mantenimiento que aparece en el encabezado.", - "change_url": "Cambiar Enlace", - "set_text": "Establecer texto", - "clear_banner": "Retirar texto", - "enter_link": "Ingrese el enlace aquí" - }, - "settings": { - "settings": "Configuraciones", - "allow_users_to_share_rooms": "Permitir que los usuarios compartan salas", - "allow_users_to_share_rooms_description": "La configuración para deshabilitar eliminará el botón del menú desplegable de opciones de sala, evitando que los usuarios compartan salas.", - "allow_users_to_preupload_presentation": "Permitir que los usuarios carguen presentaciones de manera anticipada", - "allow_users_to_preupload_presentation_description": "Los usuarios pueden cargar presentaciones de manera anticipada para usarlas como presentación predeterminada para esa sala específica.", - "show_sign_in_on_room_join": "Mostrar enlace de inicio de sesión al entrar en la sala", - "show_sign_in_on_room_join_description": "Si el usuario no ha iniciado sesión, al entrar en una sala aparece un enlace de inicio de sesión en la parte inferior de la tarjeta.", - "default_visibility": "Visibilidad predeterminada de las grabaciones", - "default_visibility_description": "Todas las grabaciones recién creadas tendrán esta visibilidad de forma predeterminada.", - "session_timeout": "Tiempo de espera de la sesión", - "session_timeout_description": "Puede configurar el tiempo de espera de la sesión con una cookie predeterminada de 1 día o una cookie de sesión extendida de 7 días.", - "default_session_timeout": "Predeterminado (1 día)", - "extended_session_timeout": "Ampliado (7 días)" - }, - "registration": { - "registration": "Registro", - "role_mapping_by_email": "Mapeo de Roles por Email", - "role_mapping_by_email_description": "Asigna al usuario un rol utilizando su correo electrónico. Debe tener el siguiente formato: role1=email1,role2=email2", - "enter_role_mapping_rule": "Ingrese una regla de mapeo de roles", - "resync_on_login": "Sincronizar datos de usuario en cada inicio de sesión", - "resync_on_login_description": "Sincroniza la información del usuario cada vez que inician sesión, haciendo que el proveedor de autenticación externo siempre coincida con la información de Greenlight.", - "default_role": "Rol Predeterminado", - "default_role_description": "El rol predeterminado que se asignará a los usuarios recién creados", - "registration_method": "Método de Registro", - "registration_method_description": "Cambiar la forma en que los usuarios se registran en el sitio web", - "registration_methods" : { - "open": "Registro abierto", - "invite": "Unirse por invitación", - "approval": "Aprobar/Rechazar" - }, - "allowed_domains": "Dominios de correo electrónico permitidos", - "allowed_domains_signup_description": "Permitir que se registren dominios de correo electrónico específicos. El formato debe ser: @test.com,domain.com", - "enter_allowed_domains_rule" : "Introduzca los dominios permitidos" - } - }, - "room_configuration": { - "room_configuration": "Configuración de Sala", - "default": "Opcional (predeterminado: activado)", - "optional": "Opcional (predeterminado: desactivado)", - "enabled": "Forzar activado", - "disabled": "Desactivado", - "configurations": { - "allow_room_to_be_recorded": "Permitir que la sala sea grabada", - "allow_room_to_be_recorded_description": "Permite que los propietarios de la sala especifiquen si quieren o no la opción de grabar una sala. Si se habilita, el moderador aún debe hacer clic en el botón 'Grabar' una vez que haya comenzado la reunión.", - "require_user_signed_in": "Requerir que los usuarios inicien sesión antes de unirse", - "require_user_signed_in_description": "Solo permite que los usuarios con una cuenta de Greenlight se unan a la reunión. Si no han iniciado sesión, se les redirigirá a la página de inicio de sesión al intentar unirse a una sala.", - "require_mod_approval": "Requerir la aprobación del moderador antes de unirse", - "require_mod_approval_description": "Solicita al moderador de la reunión de BigBlueButton cuando un usuario intenta unirse. Si se aprueba al usuario, podrá unirse a la reunión.", - "allow_any_user_to_start_meeting": "Permitir que cualquier usuario inicie una reunión", - "allow_any_user_to_start_meeting_description": "Permitir que cualquier usuario inicie la reunión en cualquier momento. Por defecto, solo el propietario de la sala puede iniciar la reunión.", - "allow_users_to_join_as_mods": "Permitir que todos los usuarios se unan como moderadores", - "allow_users_to_join_as_mods_description": "Otorga a todos los usuarios los privilegios de moderador en BigBlueButton cuando se unen a la reunión", - "mute_users_on_join": "Silenciar a los usuarios cuando se unen", - "mute_users_on_join_description": "Silencia automáticamente al usuario cuando se une a la reunión de BigBlueButton", - "viewer_access_code": "Código de acceso del espectador", - "viewer_access_code_description": "Permite a los propietarios de la sala tener un código alfanumérico aleatorio que se puede compartir con los usuarios. El código, si se genera, será necesario para que los usuarios se unan a las reuniones de la sala.", - "mod_access_code": "Código de acceso del moderador", - "mod_access_code_description": "Permite a los propietarios de la sala tener un código alfanumérico aleatorio que se puede compartir con los usuarios. El código, si se genera, no será necesario y cuando se use en cualquier reunión de la sala se unirá al usuario como moderador." - } - }, - "roles": { - "role": "Rol", - "roles": "Roles", - "administrator": "Administrador", - "guest": "Invitado", - "manage_roles": "Gestionar Roles", - "delete_role": "Eliminar Rol", - "are_you_sure_delete_role": "¿Seguro que deseas eliminar este rol?", - "enter_role_name": "Introduce un nombre de rol", - "add_role": "+ Crear Rol", - "create_role": "Crear Role", - "create_new_role": "Crear un nuevo rol", - "no_role_found": "No se encontró ningún rol.", - "search_not_found": "No se encontraron roles", - "edit": { - "create_room": "Permitir a los usuarios con este rol crear salas", - "record": "Permitir a los usuarios con este rol grabar sus reuniones", - "manage_users": "Permitir a los usuarios con este rol administrar usuarios", - "manage_rooms": "Permitir a los usuarios con este rol administrar salas del servidor", - "manage_recordings": "Permitir a los usuarios con este rol administrar grabaciones del servidor", - "manage_site_settings": "Permitir a los usuarios con este rol administrar la configuración del sitio", - "manage_roles": "Permitir a los usuarios con este rol editar otros roles", - "shared_list": "Incluir a los usuarios con este rol en la lista desplegable para compartir salas", - "room_limit": "Límite de salas", - "email_on_signup": "Recibe un correo electrónico cuando se registre un nuevo usuario", - "allowed_recording_visibility": "Visibilidad de grabación permitida" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Se ha creado un nuevo usuario.", - "user_updated": "Se ha actualizado el usuario.", - "user_deleted": "Se ha eliminado el usuario.", - "avatar_updated": "Se ha actualizado el avatar.", - "password_changed": "Se ha actualizado correctamente su contraseña. Vuelva a iniciar sesión.", - "password_updated": "Se ha actualizado la contraseña.", - "account_activated": "Se ha activado tu cuenta.", - "activation_email_sent": "Se ha enviado un correo electrónico con las instrucciones para activar tu cuenta.", - "reset_pwd_email_sent": "Se ha enviado un correo electrónico con las instrucciones para restablecer tu contraseña." - }, - "session": { - "signed_out": "Has cerrado sesión." - }, - "room": { - "room_created": "Se ha creado una nueva sala.", - "room_updated": "Se ha actualizado la sala.", - "room_deleted": "Se ha eliminado la sala.", - "room_shared": "Se ha compartido la sala.", - "room_unshared": "Se ha dejado de compartir la sala.", - "recordings_synced": "Se han sincronizado las grabaciones de la sala.", - "room_configuration_updated": "Se ha actualizado la configuración de la sala.", - "room_setting_updated": "Se ha actualizado la configuración de la sala.", - "presentation_updated": "Se ha actualizado la presentación.", - "presentation_deleted": "Se ha eliminado la presentación.", - "joining_meeting": "Uniéndose a la reunión...", - "meeting_started": "La reunión ha comenzado.", - "access_code_copied": "Se ha copiado el código de acceso.", - "access_code_generated": "Se ha generado un nuevo código de acceso.", - "access_code_deleted": "Se ha eliminado el código de acceso.", - "copied_meeting_url": "Se ha copiado la URL de la reunión. El enlace se puede usar para unirse a la reunión.", - "copied_viewer_code": "Se ha copiado el código de acceso del espectador.", - "copied_moderator_code": "Se ha copiado el código de acceso del moderador." - }, - "site_settings": { - "site_setting_updated": "Se ha actualizado la configuración del sitio.", - "brand_color_updated": "Se ha actualizado el color de la marca.", - "brand_image_updated": "Se ha actualizado la imagen de la marca.", - "brand_image_deleted": "Se ha eliminado la imagen de marca.", - "privacy_policy_updated": "Se ha actualizado el aviso de privacidad.", - "helpcenter_updated": "Se ha actualizado el enlace del centro de ayuda.", - "terms_of_service_updated": "Los términos del servicio han sido actualizados.", - "maintenance_updated": "Se ha actualizado el banner de mantenimiento.", - "allowed_domains_signup_updated": "Se han actualizado los dominios de correo electrónico permitidos." - }, - "recording": { - "recording_visibility_updated": "La visibilidad de la grabación ha sido actualizada.", - "recording_name_updated": "El nombre de la grabación ha sido actualizado.", - "recording_deleted": "La grabación ha sido eliminada.", - "copied_urls": "Los URLs de la grabación han sido copiados." - }, - "role": { - "role_created": "Se ha creado un nuevo rol.", - "role_updated": "El rol ha sido actualizado.", - "role_deleted": "El rol ha sido eliminado.", - "role_permission_updated": "Los permisos del rol han sido actualizados." - }, - "invitations": { - "invitation_sent": "Se ha enviado una invitación.", - "invitation_revoked": "Se ha revocado una invitación" - } - }, - "error": { - "problem_completing_action": "No se puede completar la acción. \n Por favor intente de nuevo.", - "server_type_unavailable": "El tipo de servidor requerido no está disponible. Seleccione otro tipo en la configuración de la sala.", - "file_type_not_supported": "El tipo de archivo no es compatible.", - "file_size_too_large": "El tamaño del archivo es demasiado grande.", - "file_upload_error": "Este archivo no puede ser cargado", - "signin_required": "Debe iniciar sesión para acceder a esta página.", - "malware_detected": "¡Se ha detectado malware! El archivo que ha subido puede contener malware. Compruebe su archivo e inténtelo de nuevo.", - "roles": { - "role_assigned": "Este rol no puede ser eliminado porque ha sido asignado a al menos un usuario." - }, - "users": { - "signup_error": "No se puede autenticar. Por favor contacte a su administrador.", - "invalid_invite": "Su token de invitación es inválido o incorrecto. Por favor contacte a su administrador para recibir un nuevo token.", - "email_exists": "Ya existe una cuenta con este correo electrónico. Por favor intente de nuevo con otro correo electrónico.", - "old_password": "La contraseña que ha ingresado es incorrecta.", - "pending": "Su registro está pendiente de aprobación por parte del administrador. Por favor intente de nuevo más tarde.", - "banned": "No tiene acceso a esta aplicación. Por favor contacte a su administrador si cree que esto es un error." - }, - "rooms": { - "room_limit": "No se puede crear la sala debido a que se ha alcanzado el límite de salas." - }, - "session": { - "invalid_credentials": "El nombre de usuario o la contraseña son incorrectos. Por favor verifique sus credenciales e intente de nuevo." - } - } - }, - "global_error_page": { - "title": "Error", - "message": "Lo sentimos, algo ha salido mal. Si el incidente ocurre nuevamente, por favor contacte al administrador." - }, - "not_found_error_page": { - "title": "Página no encontrada", - "message": "Lo sentimos, no se puede encontrar la página que está intentando acceder." - }, - "account_activation_page": { - "title": "Activación de cuenta", - "account_unverified": "Su cuenta aún no ha sido verificada.", - "message": "Para usar Greenlight, por favor verifique su cuenta siguiendo las instrucciones en el correo electrónico de activación que ha sido enviado a usted.", - "resend_activation_link": "Si no ha recibido un correo electrónico de activación o si tiene problemas para usarlo, haga clic en el botón de abajo para solicitar un nuevo correo electrónico de activación.", - "resend_btn_lbl": "Reenviar Verificación" - }, - "forms": { - "validations": { - "full_name": { - "required": "Por favor, introduce un nombre completo", - "min": "El nombre debe tener al menos 2 caracteres", - "max": "El nombre debe tener como máximo 255 caracteres" - }, - "email": { - "required": "Por favor, introduce un correo electrónico", - "email": "El valor introducido no coincide con el formato de correo electrónico", - "min": "El correo electrónico debe tener al menos 6 caracteres", - "max": "El correo electrónico debe tener como máximo 255 caracteres" - }, - "password": { - "required": "Por favor, introduce una contraseña", - "match": "La contraseña debe tener al menos:", - "min": "- Ocho caracteres", - "lower": "- Una letra minúscula", - "upper": "- Una letra mayúscula", - "digit": "- Un dígito", - "symbol": "- Un símbolo", - "max": "La contraseña debe tener como máximo 255 caracteres" - }, - "password_confirmation": { - "required": "Por favor, confirma la contraseña", - "match": "Las contraseñas no coinciden" - }, - "emails": { - "required": "Por favor, introduce al menos un correo electrónico válido", - "list": "Por favor, proporciona una lista de correos electrónicos válidos separados por comas (usuario@usuarios.com,usuario1@usuarios.com,usuario2@usuarios.com)" - }, - "role_name": { - "required": "Por favor, introduce el nombre del rol" - }, - "role": { - "limit": { - "required": "Por favor, introduce el límite de cantidad de habitaciones", - "min": "El mínimo permitido es 0", - "max": "El máximo permitido es 100" - }, - "type": { - "error": "Debes especificar un número" - } - }, - "room": { - "name": { - "required": "Por favor, introduce el nombre de la sala.", - "min": "El nombre debe tener al menos 2 caracteres" - } - }, - "room_join": { - "name": { - "required": "Por favor, introduzca su nombre." - } - }, - "url": { - "invalid": "Enlace inválido" - }, - "text_form": { - "value": { - "required": "Por favor, introduzca algún mensaje" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Nombre de la sala", - "placeholder": "Introduce el nombre de la sala..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Nombre", - "placeholder": "Introduzca su nombre" - }, - "access_code": { - "label": "Código de acceso", - "placeholder": "Introduzca el código de acceso" - }, - "recording_consent": { - "label": "Reconozco que esta sesión puede ser grabada. Esto puede incluir mi voz y mi video si están habilitados." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Nombre Completo", - "placeholder": "Introduce tu nombre completo" - }, - "email": { - "label": "Email", - "placeholder": "Introduce tu email" - }, - "password": { - "label": "Contraseña", - "placeholder": "Crea una contraseña" - }, - "password_confirmation": { - "label": "Confirmar Contraseña", - "placeholder": "Confirma tu contraseña" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Email" - }, - "password": { - "label": "Contraseña", - "placeholder": "Crea una contraseña" - }, - "remember_me": { - "label": "Recordarme" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Contraseña Actual", - "placeholder": "Ingrese su contraseña" - }, - "new_password": { - "label": "Nueva Contraseña", - "placeholder": "Ingrese su nueva contraseña" - }, - "password_confirmation": { - "label": "Confirmar Contraseña", - "placeholder": "Confirme su nueva contraseña" - } - }, - "validations": { - "old_password": { - "required": "Ingrese su contraseña actual, por favor." - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Ingrese el email de su cuenta" - } - }, - "validations": { - "email": { - "required": "Ingrese el email de su cuenta, por favor" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Nueva Contraseña", - "placeholder": "Ingrese su nueva contraseña" - }, - "password_confirmation": { - "label": "Confirmar Contraseña", - "placeholder": "Confirme su nueva contraseña" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Nombre Completo" - }, - "email": { - "label": "Correo Electrónico" - }, - "language": { - "label": "Idioma" - }, - "role": { - "label": "Rol" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Nombre Completo", - "placeholder": "Ingrese el nombre completo del usuario" - }, - "email": { - "label": "Email", - "placeholder": "Ingrese el correo electrónico del usuario" - }, - "password": { - "label": "Contraseña", - "placeholder": "Ingrese la contraseña del usuario" - }, - "password_confirmation": { - "label": "Confirmar Contraseña", - "placeholder": "Confirme la contraseña" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Emails" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Ingrese el enlace aquí...", - "text_placeholder": "Introduzca aquí el texto..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Nombre del Rol", - "placeholder": "Ingrese un nombre de rol..." - } - } - } - } - } -} diff --git a/app/assets/locales/et.json b/app/assets/locales/et.json deleted file mode 100644 index 36a53c6b63..0000000000 --- a/app/assets/locales/et.json +++ /dev/null @@ -1,671 +0,0 @@ -{ - "start": "Alusta", - "search": "Otsing", - "home": "Kodu", - "previous": "Eelmine", - "back": "Tagasi", - "next": "Järgmine", - "view": "Vaata", - "join": "Liitu", - "edit": "Muuda", - "save": "Salvesta", - "save_changes": "Salvesta muudatused", - "update": "Uuenda", - "report": "Raporteeri", - "share": "Jaga", - "cancel": "Tühista", - "close": "Sulge", - "delete": "Kustuta", - "copy": "Kopeeri liitumislink", - "or": "või", - "online": "Online", - "help_center": "Abi", - "are_you_sure": "Oled kindel?", - "return_home": "Tagasi koju", - "created_at": "Loodud", - "no_result_search_input": "Otsingule \"{{ searchInput }}\" vastavaid tulemusi ei leitud", - "action_permanent": "Seda tegevust ei saa tagasi võtta.", - "homepage": { - "welcome_bbb": "Tere tulemast BigBlueButtonisse.", - "bigbluebutton_description": "BigBlueButton on avatud lähtekoodiga veebikonverentside süsteem veebiklasside jaoks. Platvorm maksimeerib rakendusliku õppe jaoks aega, võimaldades õpilastel teha koostööd ja saada reaalajas tagasisidet.", - "greenlight_description": "Looge seansside korraldamiseks oma ruume või liituge teistega lühikese ja mugava lingi abil.", - "learn_more": "Saa BigBlueButtoni kohta rohkem teada", - "explore_features": "Tutvuge meie funktsioonidega", - "meeting_title": "Käivitage koosolek", - "meeting_description": "Käivitage virtuaalne klass video, heli, ekraani jagamise, vestluse ja kõigi rakendusõppeks vajalike tööriistadega.", - "recording_title": "Salvestage oma koosolekud", - "recording_description": "Salvestage BigBlueButtoni koosolekud ja jagage neid õpilastega, et materjal üle vaadata ja selle üle järele mõelda.", - "settings_title": "Hallake oma ruume", - "settings_description": "Seadistage oma ruumid ja koosolekuseaded tõhusa klassiruumi jaoks.", - "and_more_title": "Ja rohkem!", - "and_more_description": "BigBlueButton pakub rakendusõppeks sisseehitatud tööriistu ja on loodud teie aja säästmiseks tunni ajal.", - "enter_meeting_url": "Sisesta koosoleku URL", - "enter_meeting_url_instruction": "Palun sisesta BigBlueButtoni koosoleku URL all olevasse välja." - }, - "authentication": { - "sign_in": "Logi sisse", - "sign_up": "Registreeri", - "sign_out": "Logi välja", - "email": "E-posti aadress", - "password": "Parool", - "confirm_password": "Kinnita parool", - "enter_email": "Sisesta oma e-posti aadress", - "enter_name": "Sisesta oma nimi", - "remember_me": "Jäta mind meelde", - "forgot_password": "Unustasid parooli?", - "dont_have_account": "Sul pole veel kontot?", - "create_account": "Loo konto", - "create_an_account": "Loo konto", - "already_have_account": "Sul juba on konto?" - }, - "user": { - "user": "Kasutaja", - "users": "Kasutajad", - "name": "Nimi", - "email_address": "E-posti aadress", - "authenticator": "Autentikaator", - "full_name": "Täisnimi", - "no_user_found": "Kasutajat ei leitud", - "type_three_characters": "Palun sisesta vähemalt kolm (3) või rohkem tähemärki, et teisi kasutajaid näha.", - "search_not_found": "Kasutajaid ei leitud", - "profile": { - "profile": "Profiil", - "language": "Keel", - "role": "Roll", - "administrator": "Administraator", - "guest": "Külaline" - }, - "account": { - "account_info": "Konto teave", - "delete_account": "Kustuta konto", - "change_password": "Muuda parooli", - "reset_password": "Lähtesta parool", - "update_account_info": "Uuenda konto teavet", - "current_password": "Praegune parool", - "new_password": "Uus parool", - "confirm_password": "Kinnita parool", - "permanently_delete_account": "Kustuta oma konto püsivalt", - "delete_account_description": "Kui sa otsustad oma konto kustutada, siis seda ei saa taastada. \nKogu kontoga seotud teave kustutatakse, kaasaarvatud seaded, ruumid ja salvestused.", - "delete_account_confirmation": "Jah, ma soovin oma konto kustutada", - "are_you_sure_delete_account": "Oled kindel, et tahad oma konto kustutada?" - }, - "avatar": { - "upload_avatar": "Lae üles profiilipilt", - "delete_avatar": "Kustuta profiilipilt", - "crop_avatar": "Lõika profiilipilti" - }, - "pending": { - "title": "Registreerimine on ootel", - "message": "Täname registreerimast! Sinu konto ootab hetkel administraatori heakskiitu." - } - }, - "room": { - "room": "Ruum", - "rooms": "Ruumid", - "room_name": "Ruumi nimi", - "add_new_room": "+ Uus ruum", - "create_room": "Loo ruum", - "delete_room": "Kustuta ruum", - "create_new_room": "Loo uus ruum", - "enter_room_name": "Sisesta ruumi nimi", - "shared_by": "jaganud", - "last_session": "Viimane sessioon: {{ localizedTime }}", - "no_last_session": "Varasemad sessioonid puuduvad", - "search_not_found": "Ruume ei leitud", - "rooms_list_is_empty": "Sul pole veel ühtegi ruumi!", - "rooms_list_empty_create_room": "Oma esimese ruumi loomiseks vajuta all olevat nuppu ning sisesta ruumi nimi.", - "meeting": { - "start_meeting": "Alusta koosolekuga", - "join_meeting": "Liitu koosolekuga", - "meeting_invitation": "Oled kutsutud liituma", - "meeting_not_started": "Koosolek pole veel alanud", - "join_meeting_automatically": "Liitud automaatselt, kui koosolek algab", - "recording_consent": "Ma võtan teadmiseks, et seda sessiooni võidakse salvestada. See võib sisaldada mu häält ja videot, kui need on sisse lülitatud." - }, - "presentation": { - "presentation": "Esitlus", - "click_to_upload": "Vajuta, et üles laadida", - "drag_and_drop": "või lohista siia", - "upload_description": "Laadige üles mis tahes kontoridokument või PDF-fail (mitte suurem kui {{size}}). Sõltuvalt faili suurusest võib selle üleslaadimiseks kuluda lisaaega, enne kui seda saab kasutada", - "are_you_sure_delete_presentation": "Oled kindel, et tahad seda esitlust kustutada?" - }, - "shared_access": { - "access": "Ligipääs", - "add_share_access": "+ Ligipääsu jagamine", - "share_room_access": "Ruumile ligipääsu jagamine", - "add_some_users": "Aeg mõned kasutajad lisada!", - "add_some_users_description": "Uute kasutajate lisamiseks vajuta all olevale nupule ja otsi või vali kasutajad, kellega tahad selle ruumi ligipääsu jagada.", - "delete_shared_access": "Kustuta jagatud ligipääs", - "are_you_sure_delete_shared_access": "Oled kindel, et tahad selle ligipääsu jagamise kustutada?" - }, - "settings": { - "settings": "Seaded", - "room_name": "Ruumi nimi", - "user_settings": "Kasutaja seaded", - "allow_room_to_be_recorded": "Luba ruumi salvestamine", - "require_signed_in": "Nõua kasutajatelt liitumiseelset sisselogimist", - "require_signed_in_message": "Pead olema sisse logitud, et selle ruumiga liituda.", - "require_mod_approval": "Nõua enne liitumist moderaatori heakskiitu", - "allow_any_user_to_start": "Luba kõigil kasutajatel selle koosoleku alustamine", - "all_users_join_as_mods": "Luba kasutajatel moderaatorina liitumine", - "mute_users_on_join": "Vaigista kasutajad liitumisel", - "generate": "Loo", - "access_code": "Ligipääsukood", - "mod_access_code": "Moderaatori ligipääsukood", - "mod_access_code_optional": "Moderaatori ligipääsukood (valikuline)", - "access_code_required": "Palun sisesta ligipääsukood", - "wrong_access_code": "Vale ligipääsukood", - "generate_viewers_access_code": "Loo ligipääsukood vaatajate jaoks", - "generate_mods_access_code": "Loo ligipääsukood moderaatorite jaoks", - "are_you_sure_delete_room": "Oled kindel, et tahad selle ruumi kustutada?" - } - }, - "recording": { - "recording": "Salvestus", - "recordings": "Salvestused", - "name": "Nimi", - "length": "Kestvus", - "users": "Kasutajad", - "visibility": "Nähtavus", - "formats": "Vormingud", - "published": "Avalikustatud", - "unpublished": "Mitteavalikustatud", - "protected": "Kaitstud", - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "Salvestuse töötlemine, see võib võtta mitmeid minuteid...", - "copy_recording_urls": "Kopeeri salvestuse Url(id)", - "recordings_list_empty": "Sul pole veel salvestusi!", - "recordings_list_empty_description": "Salvestused ilmuvad siia pärast koosoleku alustamist ja selle salvestamist.", - "delete_recording": "Kustuta salvestus", - "are_you_sure_delete_recording": "Oled kindel, et tahad selle salvestuse kustutada?", - "search_not_found": "Salvestusi ei leitud" - }, - "admin": { - "admin_panel": "Administraatori paneel", - "manage_users": { - "manage_users": "Kasutajate haldus", - "active": "Aktiivsed", - "approve": "Luba", - "decline": "Keeldu", - "pending": "Ootel", - "banned": "Ligipääsukeeld", - "ban": "Keela ligipääs", - "unban": "Luba ligipääs", - "deleted": "Kustutatud", - "invited_tab": "Kutsutud", - "invite_user": "Kutsu kasutaja", - "send_invitation": "Saada kutse", - "enter_user_email": "Sisesta kasutaja e-posti aadress", - "new_user": "Uus kasutaja", - "add_new_user": "Uus kasutaja", - "create_new_user": "Loo uus kasutaja", - "edit_user": "Muuda kasutajat", - "delete_user": "Kustuta kasutaja", - "users_edit_path": "Kasutajad/Muuda", - "create_account": "Loo konto", - "create_room": "Loo ruum", - "create_new_room": "Loo uus ruum", - "user_created_at": "Loodud: {{localizedTime}}", - "are_you_sure_delete_account": "Oled kindel, et tahad kasutaja {{user.name}} konto kustutada?", - "delete_account_warning": "Kui otsustad selle konto kustutada, siis seda ei saa taastada.", - "empty_active_users": "Selles serveris pole veel aktiivseid kasutajaid!", - "empty_active_users_subtext": "Kui kasutaja olek muutub aktiivseks, siis neid kuvatakse siin.", - "empty_pending_users": "Selles serveris pole veel ootel olevaid kasutajaid!", - "empty_pending_users_subtext": "Kui kasutaja olek muutub ootel olevaks, siis neid kuvatakse siin.", - "empty_banned_users": "Selles serveris pole veel ligipääsukeeluga kasutajaid!", - "empty_banned_users_subtext": "Kui kasutaja ligipääs keelatakse, siis neid kuvatakse siin.", - "empty_invited_users": "Selles serveris pole veel kutsutud kasutajaid!", - "empty_invited_users_subtext": "Kui kasutaja kutsutakse, siis neid kuvatakse siin.", - "invited": { - "time_sent": "Saatmise aeg", - "valid": "Kehtiv" - } - }, - "server_rooms": { - "server_rooms": "Serveri ruumid", - "name": "Nimi", - "owner": "Omanik", - "room_id": "Ruumi ID", - "participants": "Osalejaid", - "status": "Olek", - "running": "Käib", - "not_running": "Seisab", - "active": "Aktiivsed", - "current_session": "Praegune sessioon: {{lastSession}}", - "last_session": "Viimane sessioon: {{localizedTime}}", - "no_meeting_yet": "Koosolekut veel pole.", - "delete_server_rooms": "Kustuta serveri ruum", - "resync_recordings": "Salvestuste taassünkroniseerimine", - "empty_room_list": "Serveri ruume veel pole!", - "empty_room_list_subtext": "Ruumid ilmuvad siia pärast oma esimese ruumi loomist." - }, - "server_recordings": { - "server_recordings": "Serveri salvestused", - "latest_recordings": "Viimased salvestused", - "no_recordings_found": "Salvestusi ei leitud." - }, - "site_settings": { - "site_settings": "Saidi sätted", - "customize_greenlight": "Kohanda Greenlighti", - "appearance": { - "appearance": "Välimus", - "brand_color": "Brändi värv", - "regular": "Tavaline", - "lighten": "Heledam", - "brand_image": "Brändi pilt", - "click_to_upload": "Vajuta üleslaadimiseks", - "drag_and_drop": "või lohista siia", - "upload_brand_image_description": "Laadige üles mis tahes PNG-, JPG- või SVG-fail (mitte suurem kui {{size}}). Sõltuvalt faili suurusest võib selle üleslaadimiseks kuluda lisaaega, enne kui seda saab kasutada", - "remove_branding_image": "Eemalda brändi pilt" - }, - "administration": { - "administration": "Administreerimine", - "terms": "Kasutustingimused", - "privacy": "Privaatsuspoliitika", - "privacy_policy": "Privaatsuspoliitika", - "change_term_links": "Muutke lehe allosas kuvatavaid terminite linke", - "change_privacy_link": "Muutke lehe allosas kuvatavat privaatsuslinki", - "change_url": "Muuda URLi", - "enter_link": "Sisesta link siia" - }, - "settings": { - "settings": "Sätted", - "allow_users_to_share_rooms": "Luba kasutajatele ruumide jagamine", - "allow_users_to_share_rooms_description": "Keelatud oleku määramisel eemaldatakse nupp ruumivalikute rippmenüüst, takistades kasutajatel ruume jagada", - "allow_users_to_preupload_presentation": "Luba kasutajatel esitlusi eellaadida", - "allow_users_to_preupload_presentation_description": "Kasutajad saavad esitluse eelnevalt üles laadida, et kasutada seda konkreetse ruumi vaikeesitlusena" - }, - "registration": { - "registration": "Registreerimine", - "role_mapping_by_email": "Määra roll e-posti aadressi alusel", - "role_mapping_by_email_description": "Määra kasutajale roll e-posti aadressi alusel. Peab olema kujul: roll1=epost1, roll2=epost2", - "enter_role_mapping_rule": "Sisesta rolli määramise reegel", - "resync_on_login": "Sünkroniseeri kasutajate andmed igal sisselogimisel", - "resync_on_login_description": "Sünkroonige kasutaja teave uuesti iga kord, kui ta sisse logib, nii et väline autentimise pakkuja vastab alati Greenlighti teabele", - "default_role": "Vaikeroll", - "default_role_description": "Uutele kasutajatele vaikimisi määratav roll", - "registration_method": "Registreerimismeetod", - "registration_method_description": "Muuda kasutajate registreerimisviisi", - "registration_methods" : { - "open": "Avatud registreerimine", - "invite": "Kutsed", - "approval": "Kinnita/Keeldu" - } - } - }, - "room_configuration": { - "room_configuration": "Ruumi seadistus", - "default": "Valikuline (vaikimisi: sees)", - "optional": "Valikuline (vaikimisi: väljas)", - "enabled": "Jõuga lubatud", - "disabled": "Keelatud", - "configurations": { - "allow_room_to_be_recorded": "Luba ruumi salvestamine", - "allow_room_to_be_recorded_description": "Lubab ruumi omanikel määrata, kas ruumi võib salvestada või mitte. Kui see on lubatud, siis peab moderaator ikkagi 'Salvesta' nuppu vajutama, kui koosolek on alanud.", - "require_user_signed_in": "Nõua liitumiseks kasutaja sisselogimist", - "require_user_signed_in_description": "Luba ainult Greenlighti kontot omavatel kasutajatel koosolekuga liituda. Kui nad pole koosolekuga liitumisel sisse logitud, siis nad suunatakse sisselogimislehele.", - "require_mod_approval": "Nõua liitumiseks moderaatori heakskiitu", - "require_mod_approval_description": "Viipab moderaatorit, kui kasutaja proovib BigBlueButtoni koosolekuga liituda. Kui kasutaja heaks kiidetakse, saab ta koosolekuga liituda.", - "allow_any_user_to_start_meeting": "Iga kasutaja võib koosolekut alustada", - "allow_any_user_to_start_meeting_description": "Luba igal kasutajal igal ajal selle koosoleku alustamine. Vaikimisi saab koosolekut alustada vaid ruumi omanik.", - "allow_users_to_join_as_mods": "Kõik kasutajad on moderaatorid", - "allow_users_to_join_as_mods_description": "Annab kõigile kasutajatele moderaatori privileegid, kui nad BigBlueButtoni koosolekuga liituvad", - "mute_users_on_join": "Vaigista kasutajad liitumisel", - "mute_users_on_join_description": "Kasutajate automaatne vaigistamine, kui nad BigBlueButtoni koosolekuga liituvad", - "viewer_access_code": "Vaataja ligipääsukood", - "viewer_access_code_description": "Võimaldab ruumi omanikel tekitada koodi, mida saab kasutajatega jagada. Kui kood on loodud, siis on see ruumiga liitumiseks nõutud kõigilt kasutajatelt.", - "mod_access_code": "Moderaatori ligipääsukood", - "mod_access_code_description": "Võimaldab ruumide omanikel kasutada juhuslikku tähtnumbrilist koodi, mida saab kasutajatega jagada. Kui kood on loodud, siis seda ei nõuta ja kui seda kasutatakse ruumi koosolekul, liitub see kasutaja moderaatorina." - } - }, - "roles": { - "role": "Roll", - "roles": "Rollid", - "administrator": "Administraator", - "guest": "Külaline", - "manage_roles": "Rollide haldus", - "delete_role": "Kustuta roll", - "are_you_sure_delete_role": "Oled kindel, et tahad selle rolli kustutada?", - "enter_role_name": "Sisesta rolli nimi", - "add_role": "+ Loo roll", - "create_role": "Loo roll", - "create_new_role": "Loo uus roll", - "no_role_found": "Rolli ei leitud.", - "search_not_found": "Rolle ei leitud", - "edit": { - "create_room": "Luba selle rolliga kasutajatel ruume luua", - "record": "Luba selle rolliga kasutajatel oma koosolekuid salvestada", - "manage_users": "Luba selle rolliga kasutajatel kasutajaid hallata", - "manage_rooms": "Luba selle rolliga kasutajatel serveri ruume hallata", - "manage_recordings": "Luba selle rolliga kasutajatel server salvestusi hallata", - "manage_site_settings": "Luba selle rolliga kasutajatel saidi seadete haldus", - "manage_roles": "Luba selle rolliga kasutajatel teisi rolle muuta", - "shared_list": "Selle rolliga kasutajad ilmuvad ruumide jagamise rippmenüüs", - "room_limit": "Ruumide piirang" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Uus kasutaja on loodud.", - "user_updated": "Kasutaja on uuendatud.", - "user_deleted": "Kasutaja on kustutatud.", - "avatar_updated": "Profiilipilt uuendatud.", - "password_updated": "Parool uuendatud.", - "account_activated": "Su konto on aktiveeritud.", - "activation_email_sent": "Konto aktiveerimisjuhiseid sisaldav e-kiri on saadetud.", - "reset_pwd_email_sent": "Parooli lähtestamise juhiseid sisaldav e-kiri on saadetud." - }, - "session": { - "signed_out": "Oled välja logitud." - }, - "room": { - "room_created": "Uus ruum on loodud.", - "room_updated": "Ruum on uuendatud.", - "room_deleted": "Ruum on kustutatud.", - "room_shared": "Ruum on jagatud.", - "room_unshared": "Ruumi jagamine on lõpetatud.", - "recordings_synced": "Ruumi salvestused on sünkroniseeritud.", - "room_configuration_updated": "Ruumi seadistus on uuendatud.", - "room_setting_updated": "Ruumi säte on uuendatud.", - "presentation_updated": "Esitlus uuendatud", - "presentation_deleted": "Esitlus kustutatud", - "joining_meeting": "Koosolekuga liitumine...", - "meeting_started": "Koosolek algas.", - "access_code_copied": "Ligipääsukood on kopeeritud.", - "access_code_generated": "Uus ligipääsukood on loodud.", - "access_code_deleted": "Ligipääsukood on kustutatud.", - "copied_meeting_url": "Koosoleku URL on kopeeritud. Seda linki saab kasutada koosolekuga liitumiseks." - }, - "site_settings": { - "site_setting_updated": "Saidi säte on uuendatud.", - "brand_color_updated": "Brändi värv on uuendatud.", - "brand_image_updated": "Brändi pilt on uuendatud.", - "brand_image_deleted": "Brändi pilt on kustutatud.", - "privacy_policy_updated": "Privaatsuspoliitika on uuendatud.", - "terms_of_service_updated": "Teenustingimused on uuendatud." - }, - "recording": { - "recording_visibility_updated": "Salvestuse nähtavus on uuendatud.", - "recording_name_updated": "Salvestuse nimi on uuendatud.", - "recording_deleted": "Salvestus on kustutatud.", - "copied_urls": "Salvestuse URL on kopeeritud." - }, - "role": { - "role_created": "Uus roll on loodud.", - "role_updated": "Roll on uuendatud.", - "role_deleted": "Roll on kustutatud.", - "role_permission_updated": "Rolli õigused on uuendatud." - }, - "invitations": { - "invitation_sent": "Kutse on saadetud." - } - }, - "error": { - "problem_completing_action": "Tegevust ei saa lõule viia. \nPalun proovi uuesti.", - "file_type_not_supported": "Faili tüüp pole toetatud.", - "file_size_too_large": "Fail on liiga suur.", - "file_upload_error": "Faili ei saa üles laadida.", - "signin_required": "Pead olema sisse logitud, et sellele lehele pääseda.", - "roles": { - "role_assigned": "Seda rolli ei saa kustutada, sest see on määratud vähemalt ühele kasutajale." - }, - "users": { - "signup_error": "Autentimine ebaõnnestus. Palun võta ühendust administraatoriga.", - "invalid_invite": "Su kutse on aegunud või pole korrektne. Palun võta ühendust administraatoriga, et saada uus kutse.", - "email_exists": "Selle e-posti aadressiga konto on juba olemas. Palun proovi teise e-posti aadressiga uuesti.", - "old_password": "Sisestatud parool pole õige.", - "pending": "Sinu registreerimine ootab administraatori kinnitust. Palun proovi hiljem uuesti.", - "banned": "Sul puudub ligipääs sellele rakendusele. Palun võta ühendust administraatoriga, kui sa usud, et nii ei peaks olema." - }, - "rooms": { - "room_limit": "Ruumi ei saa luua ruumide piirangu tõttu." - }, - "session": { - "invalid_credentials": "Kasutajanimi või parool on vale. Palun kontrolli oma andmed üle ja proovi uuesti." - } - } - }, - "global_error_page": { - "title": "Viga", - "message": "Vabandust, midagi läks valesti. Kui intsident kordub, võta ühendust administraatoriga." - }, - "not_found_error_page": { - "title": "Lehte ei leitud", - "message": "Vabandust. Lehte, millele üritad ligi pääseda, ei leitud." - }, - "account_activation_page": { - "title": "Konto aktiveerimine", - "account_unverified": "Su konto pole veel kinnitatud.", - "message": "Greenlighti kasutamiseks kinnita oma konto järgides konto aktiveerimise juhiseid, mis on sulle saadetud e-kirjas.", - "resend_activation_link": "Kui sa pole konto aktiveerimise e-kirja saanud või sul on probleem selle kasutamisega, vajuta all olevat nuppu, et saada uus e-kiri. Või palka A-rühm.", - "resend_btn_lbl": "Saada kinnitus uuesti" - }, - "forms": { - "validations": { - "full_name": { - "required": "Palun sisesta täisnimi", - "min": "Nime pikkus peab olema vähemalt 2 tähemärki", - "max": "Nime maksimaalne pikkus on 255 tähemärki" - }, - "email": { - "required": "Palun sisesta e-posti aadress", - "email": "Sisestatud väärtus ei vasta e-posti aadressi vormingule", - "min": "E-posti aadressi pikkus peab olema vähemalt 6 tähemärki", - "max": "E-posti aadressi maksimaalne pikkus on 255 tähemärki" - }, - "password": { - "required": "Palun sisesta parool", - "match": "Minimaalsed nõuded paroolile:", - "min": "- kaheksa tähemärki", - "lower": "- üks väiketäht", - "upper": "- üks suurtäht", - "digit": "- üks number", - "symbol": "- üks sümbol", - "max": "Parooli maksimaalne pikkus on 255 tähemärki" - }, - "password_confirmation": { - "required": "Palun sisesta kinnituseks parool uuesti", - "match": "Paroolid ei kattu" - }, - "emails": { - "required": "Palun sisesta vähemalt üks korrektne e-posti aadress", - "list": "Palun sisesta komadega eraldatud nimekiri korrektsetest e-posti aadressidest (user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "Palun sisesta rolli nimi" - }, - "role": { - "limit": { - "required": "Palun sisesta ruumide piirangu arv", - "min": "Minimaalselt on lubatud 0", - "max": "Maksimaalselt on lubatud 100" - }, - "type": { - "error": "Pead sisestama numbri" - } - }, - "room": { - "name": { - "required": "Palun sisesta ruumi nimi.", - "min": "Ruumi nime pikkus peab olema vähemalt 2 tähemärki" - } - }, - "room_join": { - "name": { - "required": "Palun sisesta oma nimi." - } - }, - "url": { - "invalid": "Vigane URL" - } - }, - "room": { - "fields": { - "name": { - "label": "Ruumi nimi", - "placeholder": "Sisesta ruumi nimi..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Nimi", - "placeholder": "Sisesta oma nimi" - }, - "access_code": { - "label": "Ligipääsukood", - "placeholder": "Sisesta ligipääsukood" - }, - "recording_consent": { - "label": "Ma võtan teadmiseks, et seda sessiooni võidakse salvestada. See võib sisaldada mu häält ja videot, kui need on sisse lülitatud." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Täisnimi", - "placeholder": "Sisesta oma täisnimi" - }, - "email": { - "label": "E-posti aadress", - "placeholder": "Sisesta oma e-posti aadress" - }, - "password": { - "label": "Parool", - "placeholder": "Loo parool" - }, - "password_confirmation": { - "label": "Kinnita parool", - "placeholder": "Kinnita parool" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "E-posti aadress", - "placeholder": "E-posti aadress" - }, - "password": { - "label": "Parool", - "placeholder": "Parool" - }, - "remember_me": { - "label": "Jäta mind meelde" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Praegune parool", - "placeholder": "Sisesta oma parool" - }, - "new_password": { - "label": "Uus parool", - "placeholder": "Sisesta oma uus parool" - }, - "password_confirmation": { - "label": "Kinnita parool", - "placeholder": "Kinnita oma uus parool" - } - }, - "validations": { - "old_password": { - "required": "Palun sisesta oma praegune parool" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "E-posti aadress", - "placeholder": "Sisesta konto e-posti aadress" - } - }, - "validations": { - "email": { - "required": "Palun sisesta konto e-posti aadress" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Uus parool", - "placeholder": "Sisesta oma uus parool" - }, - "password_confirmation": { - "label": "Kinnita parool", - "placeholder": "Kinnita oma uus parool" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Täisnimi" - }, - "email": { - "label": "E-posti aadress" - }, - "language": { - "label": "Keel" - }, - "role": { - "label": "Roll" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Täisnimi", - "placeholder": "Sisesta kasutaja täisnimi" - }, - "email": { - "label": "E-posti aadress", - "placeholder": "Sisesta kasutaja e-posti aadress" - }, - "password": { - "label": "Parool", - "placeholder": "Sisesta kasutaja parool" - }, - "password_confirmation": { - "label": "Kinnita parool", - "placeholder": "Kinnita parool" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "E-posti aadressid" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Sisesta link siia" - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Rolli nimi", - "placeholder": "Sisesta rolli nimi..." - } - } - } - } - } -} diff --git a/app/assets/locales/eu.json b/app/assets/locales/eu.json deleted file mode 100644 index b9493f9e09..0000000000 --- a/app/assets/locales/eu.json +++ /dev/null @@ -1,726 +0,0 @@ -{ - "start": "Hasi", - "search": "Bilatu", - "home": "Hasiera", - "previous": "Aurrekoa", - "back": "Atzera", - "next": "Hurrengoa", - "view": "Ikusi", - "join": "Batu", - "edit": "Editatu", - "save": "Gorde", - "save_changes": "Gorde Aldaketak", - "update": "Eguneratu", - "report": "Jakinarazi", - "share": "Elkarbanatu", - "cancel": "Utzi", - "reset": "Berrezarri", - "close": "Itxi", - "delete": "Ezabatu", - "copy": "Kopiatu bileraren esteka", - "copy_viewer_code": "Kopiatu ikusle-kodea", - "copy_moderator_code": "Kopiatu moderatzaile-kodea", - "or": "Edo", - "online": "Linean", - "help_center": "Laguntza-gunea", - "are_you_sure": "Ziur?", - "return_home": "Itzuli Hasierara", - "created_at": "Noiz sortua:", - "view_recordings": "Ikusi grabaketak", - "join_session": "Hasi saioa", - "no_result_search_input": "Ez da emaitzarik aurkitu \"{{ searchInput }}\"(e)rentzat", - "action_permanent": "Ezin da ekintza hau desegin.", - "homepage": { - "welcome_bbb": "BigBlueButtonera ongietorria ematen dizugu.", - "bigbluebutton_description": "BigBlueButton, partehartzaileek denbora errealean elkarlagundu eta atzeraelikadura jasotzea ahalbidetuz eraginkortasuna maximizatzen duen lineako ikasketetarako eta bilera birtualetarako kode irekiko web-konferentzia sistema bat da.", - "greenlight_description": "Sortu zure aretoak saioak antolatu ahal izateko, edo batu beste batzuetara esteka labur eta egokia erabiliz.", - "learn_more": "Ikasi gehiago BigBlueButtoni buruz", - "explore_features": "Aztertu gure ezaugarriak", - "meeting_title": "Abiarazi bilera bat", - "meeting_description": "Abiarazi bilera edo ikasgela birtual bat bideoarekin, audioarekin, pantaila partekatuarekin, txatarekin eta ikaskuntza aplikaturako beharrezko tresna guztiekin.", - "recording_title": "Grabatu zure bilerak", - "recording_description": "Grabatu BigBlueButton bilerak eta partekatu partehartzaileekin materiala berrikusteko aukera izan dezaten.", - "settings_title": "Kudeatu zure aretoak", - "settings_description": "Konfiguratu zure aretoa eta bileren ezarpenak eraginkorki kudeatu ahal izateko.", - "and_more_title": "Eta gehiago!", - "and_more_description": "BigBlueButtonek ikaskuntza aplikaturako tresnak eskaintzen ditu, eta saioan zehar denbora aurrezteko diseinatuta dago.", - "enter_meeting_url": "Sartu bileraren esteka", - "enter_meeting_url_instruction": "Sartu zure BigBlueButtoneko bileraren esteka beheko eramuan." - }, - "authentication": { - "sign_in": "Hasi Saioa", - "sign_up": "Eman Izena", - "sign_out": "Itxi Saioa", - "email": "Eposta", - "password": "Pasahitza", - "confirm_password": "Berretsi Pasahitza", - "enter_email": "Idatzi zure eposta", - "enter_name": "Idatzi zure izena", - "remember_me": "Hartu Gogoan", - "forgot_password": "Pasahitza ahaztu zaizu?", - "dont_have_account": "Ez duzu konturik?", - "create_account": "Sortu Kontua", - "create_an_account": "Sortu kontu bat", - "already_have_account": "Baduzu kontua jada?" - }, - "user": { - "user": "Erabiltzailea", - "users": "Erabiltzaileak", - "name": "Izena", - "email_address": "Eposta helbidea", - "authenticator": "Egiaztatzailea", - "full_name": "Izen osoa", - "no_user_found": "Ez da erabiltzailerik aurkitu", - "type_three_characters": "Sartu hiru (3) karaktere edo gehiago beste erabiltzaileak erakusteko.", - "search_not_found": "Ez da erabiltzailerik aurkitu", - "profile": { - "profile": "Profila", - "language": "Hizkuntza", - "role": "Profila", - "administrator": "Kudeatzailea", - "guest": "Gonbidatua" - }, - "account": { - "account_info": "Kontuaren infomrazioa", - "delete_account": "Ezabatu kontua", - "change_password": "Aldatu pasahitza", - "set_password": "Ezarri zure pasahitz berria", - "reset_password": "Berrezarri pasahitza", - "update_account_info": "Eguneratu kontuaren informazioa", - "current_password": "Egungo pasahitza", - "new_password": "Pasahitz berria", - "confirm_password": "Berretsi pasahitza", - "permanently_delete_account": "Ezabatu kontua behin betiko", - "delete_account_description": "Kontua ezabatzea aukeratuz gero, EZIN IZANGO DA berreskuratu.\nZure kontuari buruzko informazio guztia ezabatuko da, ezarpenak, aretoak eta grabazioak barne.", - "delete_account_confirmation": "Bai, nere kontua ezabatu nahi dut", - "are_you_sure_delete_account": "Ziur zaude zure kontua ezabatu nahi duzula?" - }, - "avatar": { - "upload_avatar": "Kargatu profil-irudia", - "delete_avatar": "Ezabatu profil-irudia", - "crop_avatar": "Moztu zure profil-irudia" - }, - "pending": { - "title": "Izena emateko zain", - "message": "Eskerrik asko izena emateagatik. Zure kontua kudeatzaile batek onartzeko zain dago." - } - }, - "room": { - "room": "Aretoa", - "rooms": "Aretoak", - "room_name": "Aretoaren izena", - "add_new_room": "+ Areto Berria", - "create_room": "Sortu Aretoa", - "delete_room": "Ezabatu Aretoa", - "create_new_room": "Sortu Areto Berria", - "enter_room_name": "Sartu aretoaren izena", - "shared_by": "honek partekatua", - "last_session": "Azken saioa: {{ localizedTime }}", - "no_last_session": "Ez da aurreko saiorik sortu", - "search_not_found": "Ez da Aretorik Aurkitu", - "rooms_list_is_empty": "Oraindik ez duzu aretorik!", - "rooms_list_empty_create_room": "Sortu zure lehenengo aretoa beheko botoian klik eginez eta aretoaren izena sartuz.", - "meeting": { - "start_meeting": "Hasi bilera", - "join_meeting": "Batu bilerara", - "meeting_invitation": "Honek gonbidatu zaitu batzera: ", - "meeting_not_started": "Bilera ez da oraindik hasi", - "join_meeting_automatically": "Bilera hasterakoan automatikoki batuko zara", - "recording_consent": "Onartzen dut bilkura hau grabatua izan daitekeela. Honek nire ahotsa eta bideoa barne har ditzake, gaituta egonez gero." - }, - "presentation": { - "presentation": "Aurkezpena", - "click_to_upload": "Egin klik Kargatzeko", - "drag_and_drop": "edo arrastatu eta jaregin", - "upload_description": "Kargatu office edozein dokumentu edo PDF fitxategi (ez {{size}} baino handiagoa). Fitxategiaren tamainaren arabera, baliteke kargatzeko denbora gehiago behar izatea erabili aurretik", - "delete_presentation": "Ezabatu aurkezpena", - "are_you_sure_delete_presentation": "Ziur aurkezpen hau ezabatu nahi duzula?" - }, - "shared_access": { - "access": "Sarbidea", - "add_share_access": "+ Elkarbanatu Sarbidea", - "share_room_access": "Elkarbanatu Aretorako Sarbidea", - "add_some_users": "Zenbait erabiltzaile gehitzeko ordua da!", - "add_some_users_description": "Erabiltzaile berriak gehitzeko, egin klik ondorengo botoian eta bilatu edo aukeratu areto hau beraiekin elkarbanatu nahi dituzun erabiltzaileak", - "delete_shared_access": "Ezabatu Partekatutako Sarbidea", - "are_you_sure_delete_shared_access": "Ziur zaude Partekatutako Sarbide hau ezabatu nahi duzula?" - }, - "settings": { - "settings": "Ezarpenak", - "room_name": "Aretoaren Izena", - "user_settings": "Erabiltzaileen Ezarpenak", - "allow_room_to_be_recorded": "Ahalbidetu aretoa grabatu ahal izatea", - "require_signed_in": "Batu aurretik erabiltzaileek saioa hasi dezatela eskatu", - "require_signed_in_message": "Saioa hasi behar duzu areto honetara batzeko.", - "require_mod_approval": "Batu aurretik moderatzailearen onarpena eskatu", - "allow_any_user_to_start": "Ahalbidetu edozein erabiltzailek bilera hau hasteko aukera izatea", - "all_users_join_as_mods": "Erabiltzaile guztiak moderatzaile gisa batzen dira", - "mute_users_on_join": "Isildu erabiltzaileak batzen direnean", - "generate": "Sortu", - "access_code": "Sarbide-kodea", - "mod_access_code": "Moderatzailearen Sarbide-kodea", - "mod_access_code_optional": "Moderatzailearen Sarbide-kodea (hautazkoa)", - "access_code_required": "Sartu sarbide-kodea mesedez", - "wrong_access_code": "Sarbide-kode okerra", - "generate_viewers_access_code": "Sortu sarbide-kodea ikusleentzat", - "generate_mods_access_code": "Sortu sarbide-kodea moderatzaileentzat", - "server_tag": "Aukeratu zerbitzari mota bat gela honetarako", - "default_tag_name": "Lehenetsia", - "server_tag_desired": "Gogokoa", - "server_tag_required": "Beharrezkoa", - "are_you_sure_delete_room": "Ziur areto hau ezabatu nahi duzula?" - } - }, - "recording": { - "recording": "Grabaketa", - "recordings": "Grabaketak", - "processing": "Grabaketak prozesatzen...", - "name": "Izena", - "length": "Iraupena", - "users": "Erabiltzaileak", - "visibility": "Ikuspena", - "formats": "Formatuak", - "published": "Argitaratua", - "unpublished": "Argitaratu gabea", - "protected": "Babestua", - "public": "Publikoa", - "public_protected": "Publikoa/Babestua", - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "Grabaketa prozesatzen...", - "copy_recording_urls": "Kopiatu grabaketa esteka(k)", - "recordings_list_empty": "Oraindik ez duzu grabaketarik!", - "public_recordings_list_empty": "Oraindik ez dago grabaketa publikorik hemen!", - "recordings_list_empty_description": "Grabaketak hemen agertuko dira bilera bat hasi eta grabatu ondoren.", - "public_recordings_list_empty_description": "Grabaketak hemen agertuko dira eskuragarri daudenean.", - "delete_recording": "Ezabatu grabaketa", - "are_you_sure_delete_recording": "Ziur grabaketa ezabatu nahi duzula?", - "search_not_found": "Ez da grabaketarik aurkitu" - }, - "admin": { - "admin_panel": "Kudeaketa-panela", - "manage_users": { - "manage_users": "Kudeatu erabiltzaileak", - "active": "Gaitua", - "approve": "Onartu", - "decline": "Baztertu", - "pending": "Zain", - "banned": "Galerazia", - "ban": "Galerazi", - "unban": "Desgalerazi", - "unverified": "Egiaztatu gabe", - "verify": "Egiaztatuta", - "deleted": "Ezabatua", - "invited_tab": "Gonbidatua", - "invite_user": "Gonbidatu erabiltzailea", - "send_invitation": "Bidali gonbidapena", - "enter_user_email": "Sartu erabiltzailearen gonbidapena", - "new_user": "Erabiltzaile berria", - "add_new_user": "Erabiltzaile Berria", - "create_new_user": "Sortu Erabiltzaile Berria", - "edit_user": "Editatu erabiltzailea", - "delete_user": "Ezabatu erabiltzailea", - "users_edit_path": "Erabiltzaileak/Editatu", - "create_account": "Sortu Kontua", - "create_room": "Sortu Aretoa", - "create_new_room": "Sortu Areto Berria", - "user_created_at": "Sortua: {{localizedTime}}", - "are_you_sure_delete_account": "Ziur zaude {{user.name}} erabiltzailearen kontua ezabatu nahi duzula?", - "delete_account_warning": "Kontu hau ezabatzea aukeratzen baduzu, EZIN IZANGO DA berreskuratu.", - "empty_active_users": "Oraindik ez dago gaitutuako erabiltzailerik zerbitzari honetan!", - "empty_active_users_subtext": "Erabiltzaile bat gaitua egoerara pasatzen denean, hemen agertuko da.", - "empty_pending_users": "Oraindik ez dago zain dagoen erabiltzailerik zerbitzari honetan!", - "empty_pending_users_subtext": "Erabiltzaile bat zain egoerara pasatzen denean hemen agertuko da.", - "empty_banned_users": "Oraindiok ez dago galerazitako erabiltzailerik zerbitzari honetan!", - "empty_banned_users_subtext": "Erabiltzaile bat galerazia egoerara pasatzen denean hemen agertuko da.", - "empty_unverified_users": "Ez dago egiaztatu gabeko erabiltzailerik zerbitzari honetan!", - "empty_unverified_users_subtext": "Hemen agertuko dira egiaztatu gabeko erabiltzaileak.", - "empty_invited_users": "Oraindik ez dago gonbidatutako erabiltzailerik zerbitzari honetan!", - "empty_invited_users_subtext": "Erabiltzaile bat gonbidatua egoerara pasatzen denean hemen agertuko da.", - "invited": { - "time_sent": "Bidalketa-ordua", - "valid": "Baliagarria", - "revoke": "Baliogabetu" - } - }, - "server_rooms": { - "server_rooms": "Zerbitzariko Aretoak", - "name": "Izena", - "owner": "Jabea", - "room_id": "Aretoaren IDa", - "participants": "Partehartzaileak", - "status": "Egoera", - "running": "Abian", - "not_running": "Abiatu Gabe", - "active": "Gaitua", - "current_session": "Egungo Saioa: {{lastSession}}", - "last_session": "Azken Saioa: {{localizedTime}}", - "no_meeting_yet": "Oraindik ez dago bilerarik", - "delete_server_rooms": "Ezabatu Aretoa Zerbitzaritik", - "resync_recordings": "Grabaketak Bersinkronizatu", - "empty_room_list": "Oraindik ez dago zerbitzariko gelarik!", - "empty_room_list_subtext": "Aretoak hemen agertuko dira zure lehenengo aretoa sortu ondoren." - }, - "server_recordings": { - "server_recordings": "Zerbitzariko Grabaketak", - "latest_recordings": "Azken Grabaketak", - "no_recordings_found": "Ez da grabaketarik aurkitu." - }, - "site_settings": { - "site_settings": "Guneraren konfigurazioa", - "customize_greenlight": "Pertsonalizatu Greenlight", - "appearance": { - "appearance": "Itxura", - "brand_color": "Markaren Kolorea", - "regular": "Erregularra", - "lighten": "Argitsua", - "brand_image": "Markaren Irudia", - "click_to_upload": "Egin klik Kargatzeko", - "drag_and_drop": "edo arrastatu eta jaregin", - "upload_brand_image_description": "Kargatu edozein PNG, JPG edo SVG fitxategi ({{size}} baino handiagorik ez). Fitxategiaren tamainaren arabera, baliteke denbora gehiago behar izatea erabili aurretik igotzeko", - "remove_branding_image": "Ezabatu Markaren Irudia" - }, - "administration": { - "administration": "Kudeaketa", - "terms": "Baldintzak", - "privacy": "Pribatutasun Oharra", - "privacy_policy": "Pribatutasun Oharra", - "change_term_links": "Aldatu orrialdearen amaieran agertzen diren baldintzen estekak", - "change_privacy_link": " Aldatu orrialdearen amaieran agertzen diren pribatutasun esteka", - "helpcenter": "Laguntza Gunea", - "change_helpcenter_link": "Aldatu profileko goitibeherako menuan agertzen den laguntza-zentroaren esteka", - "maintenance": "Mantenu-lanetarako bannerra", - "change_maintenance_text": "Aldatu goiburuan agertzen den mantentze-lanen bannerraren testua", - "change_url": "Aldatu Esteka", - "set_text": "Idatzi testua", - "clear_banner": "Garbitu bannerra", - "enter_link": "Sartu esteka hemen" - }, - "settings": { - "settings": "Ezarpenak", - "allow_users_to_share_rooms": "Ahalbidetu Erabiltzaileak Aretoak Elkarbanatzera", - "allow_users_to_share_rooms_description": "Desgaitu gisa konfiguratzean botoia kenduko da goitibeherako menutik, erabiltzaileak aretoak elkarbanatzea sahiestuz", - "allow_users_to_preupload_presentation": "Ahalbidetu erabiltzaileak aurkezpenak aurrekargatzea", - "allow_users_to_preupload_presentation_description": "Erabiltzaileek aurkezpenak aurrekargatu ditzakete areto zehatz horretako lehenetsitako aurkezpen gisa erabiltzeko", - "show_sign_in_on_room_join": "Erakutsi Saioa Hasteko Esteka Gelan Sartzean", - "show_sign_in_on_room_join_description": "Erabiltzailea saioa hasi gabe badago, saioa hasteko esteka bat agertuko da txartelaren beheko aldean, gela batera sartzean.", - "default_visibility": "Grabazioaren ikusgaitasun lehenetsia", - "default_visibility_description": "Sortu berri diren grabazio guztiek izango dute ikusgaitasun hori lehenetsita", - "session_timeout": "Saioaren denbora-muga", - "session_timeout_description": "Saioaren denbora-muga konfigura dezakezu 1 eguneko cookie lehenetsi batekin edo 7 eguneko hedatutako cookie saio batekin.", - "default_session_timeout": "Lehenetsia (1 egun)", - "extended_session_timeout": "Hedatua (7 egun)" - }, - "registration": { - "registration": "Erregistratzea", - "role_mapping_by_email": "Profilen mapatzea Eposta bidez", - "role_mapping_by_email_description": "Erabiltzailea profil batera mapatu bere posta elektronikoa erabiliz. Formatua: role1=email1,role2=email2", - "enter_role_mapping_rule": "Sartu profilen mapatze arau bat", - "resync_on_login": "Saio hasiera bakoitzean erabiltzailearen datuan bersinkronizatu", - "resync_on_login_description": "Bersinkronizatu erabiltzaile baten informazioa izena ematen duen bakoitzean, kanpo-egiaztatze hornitzailea beti bat etorriz Greenlight-en informazioarekin.", - "default_role": "Profil Lehenetsia", - "default_role_description": "Erabiltzaile sortu berriei egokituko zaien profil lehenetsia", - "registration_method": "Erregistratze Modua", - "registration_method_description": "Aldatu erabiltzaileak webgunean izena ematen duten modua", - "registration_methods" : { - "open": "Erregistratze irekia", - "invite": "Batu gonbidapen bidez", - "approval": "Onartu/Baztertu" - }, - "allowed_domains": "Baimendutako e-posta domeinuak", - "allowed_domains_signup_description": "Posta elektronikoko domeinu zehatzei alta ematen baimendu. Formatua: @test.com,domain.com", - "enter_allowed_domains_rule" : "Sartu baimendutako domeinuak" - } - }, - "room_configuration": { - "room_configuration": "Aretoen Konfigurazioa", - "default": "Hautazkoa (lehenetsia: gaitua)", - "optional": "Hautazkoa (lehenetsia: desgaitua)", - "enabled": "Behartu gaitzea", - "disabled": "Desgaitua", - "configurations": { - "allow_room_to_be_recorded": "Ahalbidetu aretoa grabatzeko aukera izatea", - "allow_room_to_be_recorded_description": "Aretoaren jabeek areto bat grabatzeko aukera nahi duten edo ez zehaztea ahalbidetzea. Gaituz gero, moderatzaileak \"Grabatu\" botoian klik egin behar du bilera hasi ondoren.", - "require_user_signed_in": "Batu aurretik erabiltzaileak saioa hasi behar izatea eskatu", - "require_user_signed_in_description": "Greelight kontua duten erabiltzaileei uzten zaie soilik bilerara batzen. Saioa hasi ez badute, saio hasierako orrira berbideratuko dira aretora batzen saiatzerakoan.", - "require_mod_approval": "Moderatzailearen onarpena behar da batu aurretik", - "require_mod_approval_description": "BigBlueButtoneko bileraren moderatzailea ohartarazten du erabiltzaile bat batzen saiatzen denean. Erabiltzailea onartuz gero, bilerara batzeko aukera izango du.", - "allow_any_user_to_start_meeting": "Edozein erabiltzailek bilera bat hasi ahal izatea ahalbidetu", - "allow_any_user_to_start_meeting_description": "Edozein erabiltzailek noiznahi bilera hasi ahal izatea ahalbidetu. Besterik adierazi ezean, soilik aretoaren jabeak has dezake bilera.", - "allow_users_to_join_as_mods": "Erabiltzaile guztiak moderatzaile gisa batzea ahalbidetu", - "allow_users_to_join_as_mods_description": "Erabiltzaile guztiei BigBlueButtonen moderatzaile pribilegioak ematen zaizkie bilerara batzerakoan.", - "mute_users_on_join": "Isildu erabiltzaileak batzen direnean", - "mute_users_on_join_description": "Erabiltzailea automatikoki isiltzen du BigBlueButtoneko bilerara batzen denean", - "viewer_access_code": "Ikuslearen Sarbide-kodea", - "viewer_access_code_description": "Aretoaren jabeek erabiltzaileekin partekatu dezaketen ausazko kode alfanumeriko bat izan dezakete. Kodea, sortuz gero, erabiltzaileek beharrezkoa izango dute aretoko bileretara batu ahal izateko.", - "mod_access_code": "Moderatzailearen sarbide-kodea", - "mod_access_code_description": "Aretoaren jabeek erabiltzaileekin partekatu dezaketen ausazko kode alfanumeriko bat izan dezakete. Kodea, sortuz gero, ez da beharrezkoa izango eta aretoko edozein bileretan erabiltzean erabiltzailea moderatzaile gisa batuko da." - } - }, - "roles": { - "role": "Profila", - "roles": "Profilak", - "administrator": "Kudeatzailea", - "guest": "Gonbidatua", - "manage_roles": "Kudeatu Profilak", - "delete_role": "Ezabatu Profila", - "are_you_sure_delete_role": "Ziur profil hau ezabatu nahi duzula?", - "enter_role_name": "Sartu profilaren izen bat", - "add_role": "+ Sortu Profila", - "create_role": "Sortu Profila", - "create_new_role": "Sortu profil berri bat", - "no_role_found": "Ez da profilik aurkitu", - "search_not_found": "Ez da profilik aurkitu", - "edit": { - "create_room": "Profil hau duten erabiltzaileek aretoak sortzea ahalbidetu", - "record": "Profil hau duten erabiltzaileek beraien bilerak grabatzea ahalbidetu", - "manage_users": "Profil hau duten erabiltzaileek erabiltzaileak kudeatzea ahalbidetu", - "manage_rooms": "Profil hau duten erabiltzaileek zerbitzariko aretoak kudeatzea ahalbidetu", - "manage_recordings": "Profil hau duten erabiltzaileek zerbitzariko grabaketak kudeatzea ahalbidetu", - "manage_site_settings": "Profil hau duten erabiltzaileek guneraren ezarpenak kudeatzea ahalbidetu", - "manage_roles": "Profil hau duten erabiltzaileek beste profilak editatzea baimendu", - "shared_list": "Profil hau duten erabiltzaileak aretoak partekatzeko goitibeherako zerrendan sartu", - "room_limit": "Aretoen Muga", - "email_on_signup": "Mezu elektroniko bat jaso erabiltzaile berri batek alta ematen duenean", - "allowed_recording_visibility": "Grabazioen ikusgaitasun baimenduak" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Erabiltzaile berria sortu da.", - "user_updated": "Erabiltzailea eguneratu da.", - "user_deleted": "Erabiltzailea ezabatu da.", - "avatar_updated": "Profil-irudia eguneratu da.", - "password_changed": "Zure pasahitza ongi eguneratu da. Hasi saioa berriro mesedez.", - "password_updated": "Pasahitza eguneratu da.", - "account_activated": "Zure kontua gaitu da.", - "activation_email_sent": "Eposta mezu bat bidali da zure kontua gaitzeko argibideekin.", - "reset_pwd_email_sent": "Eposta mezu bat bidali da zure pasahitza berrezartzeko argibideekin." - }, - "session": { - "signed_out": "Saioa amaitu duzu." - }, - "room": { - "room_created": "Areto berri bat sortu da.", - "room_updated": "Aretoa eguneratu da.", - "room_deleted": "Aretoa ezabatu da.", - "room_shared": "Aretoa elkarbanatu da.", - "room_unshared": "Aretoa elkarbanatzeari utzi zaio.", - "recordings_synced": "Aretako grabaketak sinkronizatu dira.", - "room_configuration_updated": "Aretoaren konfigurazioa eguneratu da.", - "room_setting_updated": "Aretoaren konfigurazioa eguneratu da.", - "presentation_updated": "Aurkezpena eguneratu da.", - "presentation_deleted": "Aurkezpena ezabatu da.", - "joining_meeting": "Bilerara batzen...", - "meeting_started": "Bilera hasi da.", - "access_code_copied": "Sarbide-kodea kopiatu da.", - "access_code_generated": "Sarbide-kode berri bat sortu da.", - "access_code_deleted": "Sarbide-kodea ezabatu da.", - "copied_meeting_url": "Bilearen URLa kopiatu da. Esteka bilerara batzeko erabili daiteke.", - "copied_viewer_code": "Ikuslearen sarbide-kodea kopiatu egin da.", - "copied_moderator_code": "Moderatzailearen sarbide-kodea kopiatu da." - }, - "site_settings": { - "site_setting_updated": "Gunearen ezarpenak eguneratu dira.", - "brand_color_updated": "Markaren kolorea eguneratu da.", - "brand_image_updated": "Markaren irudia eguneratu da.", - "brand_image_deleted": "Markaren irudia ezabatu da.", - "privacy_policy_updated": "Pribatutasun oharra eguneratu da.", - "helpcenter_updated": "Laguntza-gunearen esteka eguneratu da.", - "terms_of_service_updated": "Zerbitzuaren baldintzak eguneratu dira.", - "maintenance_updated": "Mantentze-lanen bannerra eguneratu da.", - "allowed_domains_signup_updated": "Baimendutako e-posta domeinuak eguneratu dira." - }, - "recording": { - "recording_visibility_updated": "Grabaketaren ikuspena eguneratu da.", - "recording_name_updated": "Grabaketaren izena eguneratu da.", - "recording_deleted": "Grabaketa ezabatu da.", - "copied_urls": "Grabaketen URLak kopiatu dira." - }, - "role": { - "role_created": "Profil berri bat sortu da.", - "role_updated": "Profila eguneratu da.", - "role_deleted": "Profila ezabatu da.", - "role_permission_updated": "Profilaren baimenak eguneratu dira." - }, - "invitations": { - "invitation_sent": "Gonbidapen bat bidali da.", - "invitation_revoked": "Gonbidapen bat ezeztatu da" - } - }, - "error": { - "problem_completing_action": "Ezin da ekintza burutu. \nSaiatu berriro mesedez.", - "server_type_unavailable": "Eskatutako zerbitzari-mota ez dago erabilgarri. Mesedez, hautatu beste mota bat gelaren konfigurazioan.", - "file_type_not_supported": "Fitxategi mota ez da bateragarria.", - "file_size_too_large": "Fitxategiaren tamaina handiegia da.", - "file_upload_error": "Fitxategia ezin da kargatu.", - "signin_required": "Saioa hasi behar duzu orri honetara sartzeko.", - "malware_detected": "Malwarea detektatu da! Igo duzun fitxategiak malware bat izan dezake. Mesedez, berrikusi zure fitxategia eta saiatu berriro.", - "roles": { - "role_assigned": "Profil hau ezin da ezabatu gutxienez erabiltzaile bati egokitu bait zaio." - }, - "users": { - "signup_error": "Ezin zara egizatatua izan. Jarri harremanetan zure kudeatzailearekin.", - "invalid_invite": "Zure gonbidapen-fitxa baliogabea edo okerra da. Jarri harremanetan zure kudeatzailearekin fitxa berri bat jasotzeko.", - "email_exists": "Badago jada kontu bat eposta honekin. Saiatu berriro mesedez beste eposta batekin.", - "old_password": "Sartutako pasahitza okerra da.", - "pending": "Zure erregistroa kudeatzaileak onartzeko zain dago. Saiatu beranduago, mesedez.", - "banned": "Ez duzu aplikazio honetarako sarbiderik. Jarri kudeatzailearekin harremanetan akats bat dela uste izanez gero." - }, - "rooms": { - "room_limit": "Ezin da aretoa sortu aretoak sortzeko mugara iritsi bait da." - }, - "session": { - "invalid_credentials": "Erabiltzaile-izena edo pasahitza okerra da, Egiaztatu zure kredentzialak eta saiatu berriro." - } - } - }, - "global_error_page": { - "title": "Errorea", - "message": "Zerbait gaizki aatera da. Gertakaria errepikatuz gero, jarri kudeatzailearekin harremanetan." - }, - "not_found_error_page": { - "title": "Orria ez da aurkitu", - "message": "Sartzen saiatzen ari zaren orria ezin da aurkitu." - }, - "account_activation_page": { - "title": "Kontuaren gaitzea", - "account_unverified": "Zure kontua ez da oraindik egiaztatu.", - "message": "Greenlight erabiltzeko, egiaztatu zure kontua bidali zaizun gaitze-epostaren jarraibideei jarraituz.", - "resend_activation_link": "Ez baduzu gaitze-epostarik jaso edo erabiltzeko arazorik izanez gero, egin klik beheko botoian gaitze-eposta berri bat eskatzeko.", - "resend_btn_lbl": "Berbidali Egiaztatzea" - }, - "forms": { - "validations": { - "full_name": { - "required": "Zure izen osoa sartu, mesedez.", - "min": "Izenak gutxienez 2 karaktere izen behar ditu", - "max": "Izenak gehienez 255 karaktere izan behar ditu" - }, - "email": { - "required": "Sartu eposta helbide bat, mesedez", - "email": "Sartutako balioa ez dator bat epostaren formatuarekin", - "min": "Eposta helbideak gutxienez 6 karaktere izen behar ditu", - "max": "Eposta helbideak gehienez 255 karaktere izan behar ditu" - }, - "password": { - "required": "Sartu mesedez pasahitza", - "match": "Pasahitzak gutxienez izan behar ditu:", - "min": "- Zortzi karaktere", - "lower": "- Letra xehe bat", - "upper": "- Letra larri bat", - "digit": "- Zenbaki bat", - "symbol": "- Ikur bat", - "max": "Pasahitzak gehienez 255 karaktere izan behar ditu" - }, - "password_confirmation": { - "required": "Egiaztatu pasahitza, mesedez", - "match": "Pasahitzak ez datoz bat" - }, - "emails": { - "required": "Sartu gutxienez eposta baliagarri bat, mesedez", - "list": "Eman komaz bereizitako baliozko eposta zerrenda bat, mesedez (erabiltzailea@erabiltzaileak.com,erabiltzailea1@erabiltzaileak.com,erabiltzailea2@erabiltzaileak.com)" - }, - "role_name": { - "required": "Sartu profilaren izena, mesedez." - }, - "role": { - "limit": { - "required": "Sartu aretoen muga, mesedez", - "min": "Baimendutako gutxienekoa 0 da", - "max": "Baimendutako gehienezkoa 100 da" - }, - "type": { - "error": "Zenbaki bat zehaztu behar duzu" - } - }, - "room": { - "name": { - "required": "Sartu aretoaren izena, mesedez.", - "min": "Izenak gutxienez 2 karaktere izen behar ditu" - } - }, - "room_join": { - "name": { - "required": "Idatzi zure izena, mesedez." - } - }, - "url": { - "invalid": "Esteka baliogabea" - }, - "text_form": { - "value": { - "required": "Mezuren bat idatzi, mesedez" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Aretoaren izena", - "placeholder": "Sartu aretoaren izena..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Izena", - "placeholder": "Idatzi zure izena" - }, - "access_code": { - "label": "Sarbide kodea", - "placeholder": "Idatzi sarbide kodea" - }, - "recording_consent": { - "label": "Onartzen dut bilkura hau grabatua izan daitekeela. Honek nire ahotsa eta bideoa barne har ditzake, gaituta egonez gero." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Izen Osoa", - "placeholder": "Sartu zure izen osoa" - }, - "email": { - "label": "Eposta", - "placeholder": "Sartu zure eposta helbidea" - }, - "password": { - "label": "Pasahitza", - "placeholder": "Sortu pasahitza" - }, - "password_confirmation": { - "label": "Berretsi pasahitza", - "placeholder": "Berretsi zure pasahitza" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Eposta", - "placeholder": "Eposta" - }, - "password": { - "label": "Pasahitza", - "placeholder": "Sortu pasahitza" - }, - "remember_me": { - "label": "Gogoratu nazazu" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Egungo Pasahitza", - "placeholder": "Sartu zure pasahitza" - }, - "new_password": { - "label": "Pasahitz Berria", - "placeholder": "Sartu zure pasahitz berria" - }, - "password_confirmation": { - "label": "Berretsi Pasahitza", - "placeholder": "Berretsi zure pasahitz berria" - } - }, - "validations": { - "old_password": { - "required": "Sartu zure egingo pasahitza, mesedez." - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Eposta", - "placeholder": "Sartu zure kontuaren eposta" - } - }, - "validations": { - "email": { - "required": "Sartu zure kontuaren eposta, mesedez" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Pasahitz Berria", - "placeholder": "Sartu zure pasahitz berria" - }, - "password_confirmation": { - "label": "Berretsi Pasahitza", - "placeholder": "Berretsi zure pasahitz berria" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Izen Osoa" - }, - "email": { - "label": "Eposta" - }, - "language": { - "label": "Hizkuntza" - }, - "role": { - "label": "Profila" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Izen Osoa", - "placeholder": "Sartu erabiltzailearen izen osoa" - }, - "email": { - "label": "Eposta", - "placeholder": "Sartu erabiltzailearen eposta" - }, - "password": { - "label": "Pasahitza", - "placeholder": "Sartu erabiltzailearen pasahitza" - }, - "password_confirmation": { - "label": "Berretsi Pasahitza", - "placeholder": "Berretsi Pasahitza" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Epostak" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Sartu hemen esteka...", - "text_placeholder": "Sartu testua hemen..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Profilaren izena", - "placeholder": "Sartu profilarentzat izen bat..." - } - } - } - } - } -} diff --git a/app/assets/locales/fa.json b/app/assets/locales/fa.json deleted file mode 100644 index a7be754a4c..0000000000 --- a/app/assets/locales/fa.json +++ /dev/null @@ -1,677 +0,0 @@ -{ - "start": "شروع", - "search": "جستجو", - "home": "صفحهٔ خانه", - "previous": "قبلی", - "back": "بازگشت", - "next": "بعدی", - "view": "نمایش", - "join": "پیوستن", - "edit": "ویرایش", - "save": "ذخیره", - "save_changes": "ذخیرهٔ تغییرات", - "update": "به‌روزرسانی", - "report": "گزارش", - "share": "هم‌رسانی", - "cancel": "انصراف", - "close": "بستن", - "delete": "حذف", - "copy": "رونوشت پیوند عضویت", - "or": "یا", - "online": "آنلاین", - "help_center": "مرکز راهنمایی", - "are_you_sure": "آیا مطمئن هستید؟", - "return_home": "بازگشت به صفحهٔ خانه", - "created_at": "ایجادشده در", - "view_recordings": "مشاهدهٔ ضبط‌شده‌ها", - "join_session": "پیوستن به نشست", - "no_result_search_input": "هیچ نتیجه‌ای برای «{{ searchInput }}» یافت نشد", - "action_permanent": "این عمل قابل بازگردانی نیست.", - "homepage": { - "welcome_bbb": "به BigBlueButton خوش آمدید.", - "bigbluebutton_description": "BigBlueButton یک سیستم کنفرانس وب متن‌باز برای کلاس‌های آنلاین است. این سکو زمان یادگیری کاربردی را به حداکثر می‌رساند و به دانش‌اموزان امکاناتی ارائه می‌دهد تا با یک‌دیگر همکاری کنند و در لحظه بازخورد دریافت کنند.", - "greenlight_description": "اتاق‌های خود را برای میزبانی جلسات ایجاد کنید یا با استفاده از یک پیوند کوتاه و راحت به اتاق‌های دیگران بپیوندید.", - "learn_more": "دربارهٔ BigBlueButton بیشتر بدانید", - "explore_features": "کاوش ویژگی‌های ما", - "meeting_title": " راه‌اندازی یک جلسه", - "meeting_description": "یک کلاس مجازی به همراه ویدیو، صدا، اشتراک‌گذاری صفحه نمایش، گپ و تمام ابزارهای مورد نیاز برای یادگیری کاربردی راه‌اندازی کنید.", - "recording_title": "جلسات خود را ضبط کنید", - "recording_description": "جلسات BigBlueButton را ضبط کنید و آنها را با دانش‌آموزان هم‌رسانی کنید تا مطالب را بررسی و روی آن فکر کنند.", - "settings_title": "مدیریت اتاق‌های خود", - "settings_description": "تنظیمات اتاق‌ها و جلسه خود را به گونه‌ای پیکربندی کنید که در روند کلاسی تأثیر بهتری داشته باشد.", - "and_more_title": "و موارد بیشتر!", - "and_more_description": "BigBlueButton برای یادگیری کاربردی، ابزارهای درونی مختلفی را ارائه می‌کند و برای صرفه‌جویی در وقت شما در طول کلاس طراحی شده است.", - "enter_meeting_url": "نشانی اینترنتی جلسه را وارد کنید", - "enter_meeting_url_instruction": "لطفا نشانی اینترنتی جلسه BigBlueButton خود را در زمینهٔ متنی زیر وارد کنید." - }, - "authentication": { - "sign_in": "ورود", - "sign_up": "ثبت‌نام", - "sign_out": "خروج", - "email": "رایانامه", - "password": "گذرواژه", - "confirm_password": "تأیید گذرواژه", - "enter_email": "رایانامهٔ خود را وارد کنید", - "enter_name": "نام خود را وارد کنید", - "remember_me": "مرا به خاطر بسپار", - "forgot_password": "گذرواژه را فراموش کرده‌اید؟", - "dont_have_account": "حساب کاربری ندارید؟", - "create_account": "ایجاد حساب کاربری", - "create_an_account": "ایجاد یک حساب کاربری", - "already_have_account": "از قبل حساب کاربری دارید؟" - }, - "user": { - "user": "کاربر", - "users": "کاربران", - "name": "نام", - "email_address": "نشانی رایانامه", - "authenticator": "احرازگر هویت", - "full_name": "نام کامل", - "no_user_found": "هیچ کاربری پیدا نشد", - "type_three_characters": "لطفا سه «۳» نویسه یا بیشتر برای نمایش دیگر کاربران تایپ کنید.", - "search_not_found": "هیچ کاربری پیدا نشد", - "profile": { - "profile": "نمایه", - "language": "زبان", - "role": "نقش", - "administrator": "مدیر کل", - "guest": "مهمان" - }, - "account": { - "account_info": "اطلاعات حساب کاربری", - "delete_account": "حذف حساب کاربری", - "change_password": "تغییر گذرواژه", - "reset_password": "بازنشانی گذرواژه", - "update_account_info": "به‌روزرسانی اطلاعات حساب کاربری", - "current_password": "گذرواژهٔ فعلی", - "new_password": "گذرواژهٔ جدید", - "confirm_password": "تأیید گذرواژه", - "permanently_delete_account": "حساب کاربری خود را برای همیشه حذف کنید", - "delete_account_description": "اگر حساب کاربری خود را حذف کنید، قابل بازیابی نخواهد بود.\nتمام اطلاعات مربوط به حساب کاربری شما، از جمله تنظیمات، اتاق‌ها و موارد ضبط‌شده حذف خواهند شد.", - "delete_account_confirmation": "بله، من می‌خواهم حساب کاربریم را حذف کنم", - "are_you_sure_delete_account": "آیا مطمئن هستید که می‌خواهید حساب کاربری خود را حذف کنید؟" - }, - "avatar": { - "upload_avatar": "بارگذاری تصویر نمایه", - "delete_avatar": "حذف تصویر نمایه", - "crop_avatar": "برش تصویر نمایهٔ شما" - }, - "pending": { - "title": "در انتظار ثبت‌نام", - "message": "ممنون از این‌که ثبت‌نام کردید! حساب کاربری شما در حال حاضر در انتظار تأیید توسط یک مدیر کل است." - } - }, - "room": { - "room": "اتاق", - "rooms": "اتاق‌ها", - "room_name": "نام اتاق", - "add_new_room": "+ اتاق جدید", - "create_room": "ایجاد اتاق", - "delete_room": "حذف اتاق", - "create_new_room": "ایجاد اتاق جدید", - "enter_room_name": "نام اتاق را وارد کنید", - "shared_by": "هم‌رسانی‌شده توسط", - "last_session": "آخرین جلسه: {{ localizedTime }}", - "no_last_session": "هنوز هیچ جلسه‌ای از قبل ایجاد نشده است", - "search_not_found": "هیچ اتاقی پیدا نشد", - "rooms_list_is_empty": "شما هنوز هیچ اتاقی ندارید!", - "rooms_list_empty_create_room": "با کلیک بر روی دکمهٔ زیر و وارد کردن نام اتاق، اولین اتاق خود را ایجاد کنید.", - "meeting": { - "start_meeting": "شروع جلسه", - "join_meeting": "پیوستن به جلسه", - "meeting_invitation": "شما برای پیوستن به جلسه دعوت شده‌اید", - "meeting_not_started": "جلسه هنوز شروع نشده است", - "join_meeting_automatically": "با شروع جلسه، به طور خودکار به آن خواهید پیوست.", - "recording_consent": "من متوجه هستم که این جلسه ممکن است ضبط شود. این ممکن است شامل صدا و ویدیوی من در صورت فعال‌بودن نیز باشد." - }, - "presentation": { - "presentation": "ارائه", - "click_to_upload": "برای بارگذاری کلیک کنید", - "drag_and_drop": " یا بکشید و رها کنید", - "upload_description": "هر سند اداری یا پرونده PDF (بزرگتر از {{size}}) را بارگذاری کنید. بسته به اندازه پرونده، ممکن است به زمان بیشتری برای بارگذاری نیاز باشد تا بتوان از آن استفاده کرد.", - "are_you_sure_delete_presentation": "آیا مطمئن هستید که می‌خواهید این ارائه را حذف کنید؟" - }, - "shared_access": { - "access": "دسترسی", - "add_share_access": "+ هم‌رسانی دسترسی", - "share_room_access": "هم‌رسانی دسترسی به اتاق", - "add_some_users": "اکنون زمان افزودن چند کاربر است!", - "add_some_users_description": "برای افزودن کاربران جدید، روی دکمهٔ زیر کلیک کنید و کاربرانی را که می‌خواهید این اتاق را با آنها هم‌رسانی کنید، جستجو یا انتخاب کنید.", - "delete_shared_access": "حذف دسترسی هم‌رسانی‌شده", - "are_you_sure_delete_shared_access": "آیا مطمئن هستید که می‌خواهید این دسترسی هم‌رسانی‌شده را حذف کنید؟" - }, - "settings": { - "settings": "تنظیمات", - "room_name": "نام اتاق", - "user_settings": "تنظیمات کاربر", - "allow_room_to_be_recorded": "اجازه دهید اتاق ضبط شود", - "require_signed_in": "کاربران قبل از ورود به جلسه، نیازمند ورود به سیستم باشند", - "require_signed_in_message": "برای پیوستن به این اتاق باید وارد حساب کاربری خود شوید.", - "require_mod_approval": "قبل از پیوستن به جلسه نیاز به تأیید مدیر باشد", - "allow_any_user_to_start": "به هر کاربری اجازه دهید این جلسه را شروع کند", - "all_users_join_as_mods": "همه کاربران به عنوان مدیر عضو شوند", - "mute_users_on_join": "کاربران هنگام پیوستن بی‌صدا شوند", - "generate": "تولید کن", - "access_code": "کد دسترسی", - "mod_access_code": "کد دسترسی مدیر", - "mod_access_code_optional": "کد دسترسی مدیر (اختیاری)", - "access_code_required": "لطفا کد دسترسی را وارد کنید", - "wrong_access_code": "کد دسترسی اشتباه است", - "generate_viewers_access_code": "ایجاد کد دسترسی برای بینندگان", - "generate_mods_access_code": "ایجاد کد دسترسی برای مدیران", - "are_you_sure_delete_room": "آیا مطمئن هستید که می‌خواهید این اتاق را حذف کنید؟" - } - }, - "recording": { - "recording": "ضبط", - "recordings": "ضبط‌شده‌ها", - "name": "نام", - "length": "طول مدت", - "users": "کاربران", - "visibility": "قابلیت مشاهده", - "formats": "قالب‌ها", - "published": "منتشرشده", - "unpublished": "منتشرنشده", - "protected": "محافظت‌شده", - "public": "عمومی", - "public_protected": "عمومی/محافظت‌شده", - "length_in_minutes": "{{recording.length}} دقیقه.", - "processing_recording": "در حال پردازش ضبط؛ این‌کار ممکن است چند دقیقه طول بکشد...", - "copy_recording_urls": "رونوشت نشانی(های) ضبط", - "recordings_list_empty": "شما هنوز هیچ جلسهٔ ضبط‌شده‌ای ندارید!", - "public_recordings_list_empty": "هنوز هیچ ضبط عمومی‌ای وجود ندارد!", - "recordings_list_empty_description": "بعد از شروع جلسه و ضبط آن، موارد ضبط‌شده در این‌جا نمایان می‌شوند.", - "public_recordings_list_empty_description": "موارد ضبط‌شده هنگامی که موجود شوند در این‌جا پدیدار خواهند شد.", - "delete_recording": "حذف ضبط", - "are_you_sure_delete_recording": "آیا مطمئن هستید که می‌خواهید این ضبط را حذف کنید؟", - "search_not_found": "هیچ ضبطی یافت نشد" - }, - "admin": { - "admin_panel": "تابلوی مدیر کل", - "manage_users": { - "manage_users": "مدیریت کاربران", - "active": "فعال", - "approve": "تأیید", - "decline": "ردکردن", - "pending": "در انتظار", - "banned": "مسدودشده", - "ban": "مسدود", - "unban": "لغو مسدودیت", - "deleted": "حذف‌شده", - "invited_tab": "دعوت‌شده", - "invite_user": "دعوت از کاربر", - "send_invitation": "ارسال دعوت‌نامه", - "enter_user_email": "رایانامهٔ کاربر را وارد کنید", - "new_user": "کاربر جدید", - "add_new_user": "کاربر جدید", - "create_new_user": "ایجاد کاربر جدید", - "edit_user": "ویرایش کاربر", - "delete_user": "حذف کاربر", - "users_edit_path": "کاربران/ویرایش", - "create_account": "ایجاد حساب کاربری", - "create_room": "ایجاد اتاق", - "create_new_room": "ایجاد اتاق جدید", - "user_created_at": "ایجاد‌شده: {{user.created_at}}", - "are_you_sure_delete_account": "آیا مطمئن هستید که می‌خواهید حساب کاربری {{user.name}} را حذف کنید؟", - "delete_account_warning": "اگر این حساب کاربری را حذف کنید، قابل بازیابی نخواهد بود.", - "empty_active_users": "هنوز هیچ کاربر فعالی در این سرور وجود ندارد!", - "empty_active_users_subtext": "هنگامی که وضعیت یک کاربر به فعال تغییر می‌کند، در اینجا نمایان می‌شوند.", - "empty_pending_users": "هنوز هیچ کاربر درانتظار تأیید در این سرور وجود ندارد!", - "empty_pending_users_subtext": "هنگامی که وضعیت یک کاربر به در انتظارِ تأیید تغییر می‌کند، در اینجا نمایان می‌شوند.", - "empty_banned_users": "هنوز هیچ کاربر مسدودشده‌ای در این سرور وجود ندارد!", - "empty_banned_users_subtext": "هنگامی که وضعیت یک کاربر به مسدودشده تغییر می‌کند، در اینجا نمایان می‌شوند.", - "empty_invited_users": "هنوز هیچ کاربر دعوت‌شده‌ای در این سرور وجود ندارد!", - "empty_invited_users_subtext": "هنگامی که وضعیت یک کاربر به دعوت‌شده تغییر می‌کند، در اینجا نمایان می‌شوند.", - "invited": { - "time_sent": "زمان ارسال‌شده", - "valid": "معتبر" - } - }, - "server_rooms": { - "server_rooms": "اتاق‌های سرور", - "name": "نام", - "owner": "صاحب", - "room_id": "شناسه اتاق", - "participants": "شركت‌كنندگان", - "status": "وضعیت", - "running": "در حال اجرا", - "not_running": "در حال اجرا نیست", - "active": "فعال", - "current_session": "جلسهٔ کنونی: {{lastSession}}", - "last_session": "آخرین جلسه: {{localizedTime}}", - "no_meeting_yet": "هنوز هیچ جلسه‌ای وجود ندارد.", - "delete_server_rooms": "حذف اتاق سرور", - "resync_recordings": "همگام‌سازی مجدد ضبط‌شده‌ها", - "empty_room_list": "هنوز هیچ اتاق سروری وجود ندارد!", - "empty_room_list_subtext": "اتاق‌ها پس از این‌که اولین اتاق خود را ایجاد کنید در اینجا نمایان می‌شوند." - }, - "server_recordings": { - "server_recordings": "ضبط‌شده‌های سرور", - "latest_recordings": "آخرین ضبط‌شده‌ها", - "no_recordings_found": "هیچ ضبطی یافت نشد." - }, - "site_settings": { - "site_settings": "تنظیمات سایت", - "customize_greenlight": "شخصی‌سازی Greenlight", - "appearance": { - "appearance": "ظاهر", - "brand_color": "رنگ برند", - "regular": "عادی", - "lighten": "روشن", - "brand_image": "تصویر برند", - "click_to_upload": "برای بارگذاری کلیک کنید", - "drag_and_drop": " یا بکشید و رها کنید", - "upload_brand_image_description": "هر پرونده PNG، JPG یا SVG (بزرگتر از {{size}}) را می‌توانید بارگذاری کنید. بسته به اندازه پرونده، ممکن است به زمان بیشتری برای بارگذاری نیاز داشته باشد تا بتوانید از آن استفاده کنید", - "remove_branding_image": "حذف تصویر برند" - }, - "administration": { - "administration": "مدیریت", - "terms": "شرایط و ضوابط", - "privacy": "سیاست حفظ حریم خصوصی", - "privacy_policy": "سیاست حفظ حریم خصوصی", - "change_term_links": "تغییر پیوندهای مقررات که در پایین صفحه نمایان می‌شوند", - "change_privacy_link": "پیوند حریم خصوصی که در پایین صفحه نمایان می‌شود را تغییر دهید", - "change_url": "تغییر نشانی اینترنتی", - "enter_link": "پیوند را اینجا وارد کنید" - }, - "settings": { - "settings": "تنظیمات", - "allow_users_to_share_rooms": "به کاربران اجازه دهید اتاق‌ها را هم‌رسانی کنند", - "allow_users_to_share_rooms_description": "تنظیم برروی غیرفعال، دکمه را از فهرست کشویی گزینه‌های اتاق حذف می‌کند و از هم‌رسانی اتاق‌ها توسط کاربران جلوگیری می‌کند", - "allow_users_to_preupload_presentation": "به کاربران اجازه دهید تا ارائه‌ها را از قبل بارگذاری کنند", - "allow_users_to_preupload_presentation_description": "کاربران می‌توانند یک ارائه را از قبل بارگذاری کنند تا به عنوان ارائهٔ پیش‌فرض برای آن اتاق خاص استفاده شود" - }, - "registration": { - "registration": "ثبت‌نام", - "role_mapping_by_email": "سپردن نقش از طریق رایانامه", - "role_mapping_by_email_description": "با استفاده از رایانامهٔ کاربر نقشی به او بسپارید. باید در قالب: role1=email1, role2=email2 باشد", - "enter_role_mapping_rule": "یک قانون سپردن نقش را وارد کنید", - "resync_on_login": "همگام‌سازی مجدد داده‌های کاربر در هر بار ورود", - "resync_on_login_description": "هر بار که کاربر وارد سیستم می‌شود، اطلاعات کاربر را مجددا همگام‌سازی می‌کند و باعث می‌شود که ارائه‌دهندهٔ احراز هویت خارجی همیشه با اطلاعات موجود در Greenlight مطابقت داشته باشد.", - "default_role": "نقش پیش‌فرض", - "default_role_description": "نقش پیش‌فرضی که به کاربران تازهٔ ایجاد‌شده اختصاص داده می‌شود", - "registration_method": "روش ثبت‌نام", - "registration_method_description": "نحوه ثبت‌نام کاربران در وب‌سایت را تغییر دهید", - "registration_methods" : { - "open": "بازکردن ثبت‌نام", - "invite": "پیوستن با دعوت‌نامه", - "approval": "تأیید/رد" - } - } - }, - "room_configuration": { - "room_configuration": "پیکربندی اتاق", - "default": "اختیاری (پیش‌فرض: فعال‌شده)", - "optional": "اختیاری (پیش‌فرض: غیرفعال‌شده)", - "enabled": "اجباری فعال‌شده", - "disabled": "غیرفعال‌شده", - "configurations": { - "allow_room_to_be_recorded": "اجازه دهید اتاق ضبط شود", - "allow_room_to_be_recorded_description": "به صاحبان اتاق اجازه می‌دهد تعیین کنند که آیا می‌خواهند امکان ضبط اتاق را داشته باشند یا خیر. اگر فعال باشد، مدیر همچنان باید پس از شروع جلسه، روی دکمهٔ «ضبط» کلیک کند.", - "require_user_signed_in": "کاربران قبل از ورود به جلسه، نیازمند ورود به سیستم باشند", - "require_user_signed_in_description": "فقط به کاربرانی که دارای حساب کاربری در Greenlight هستند اجازه می‌دهد به جلسه بپیوندند. اگر وارد سیستم نشده باشند، هنگام تلاش برای پیوستن به اتاق، به صفحهٔ ورود هدایت می‌شوند.", - "require_mod_approval": "قبل از پیوستن به جلسه نیاز به تایید مدیر باشد", - "require_mod_approval_description": "هنگامی که یک کاربر سعی می‌کند به جلسه بپیوندد، از مدیر جلسه BigBlueButton درخواست می‌کند. در صورت تأییدشدن کاربر، می‌تواند به جلسه بپیوندد.", - "allow_any_user_to_start_meeting": "به هر کاربری اجازه دهید تا جلسه را شروع کند", - "allow_any_user_to_start_meeting_description": "به هر کاربری اجازه دهید جلسه را در هر زمانی که خواست شروع کند. به‌طور پیش‌فرض، فقط صاحب اتاق می‌تواند جلسه را شروع کند.", - "allow_users_to_join_as_mods": "همهٔ کاربران به عنوان مدیر بپیوندند", - "allow_users_to_join_as_mods_description": "به همهٔ کاربران هنگام پیوستن به جلسه، در BigBlueButton اختیارات مدیر را می‌دهد", - "mute_users_on_join": "کاربران هنگام پیوستن بی‌صدا شوند", - "mute_users_on_join_description": "هنگامی که کاربر به جلسهٔ BigBlueButton می‌پیوندد، به‌طور خودکار بی‌صدا می‌شود", - "viewer_access_code": "کد دسترسی بینندگان", - "viewer_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران هم‌رسانی شود. اگر کد تولید شده باشد، برای پیوستن کاربران به جلسات اتاق الزامی است.", - "mod_access_code": "کد دسترسی مدیر", - "mod_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران هم‌رسانی کنند. کد، در صورت تولید، مورد نیاز نخواهد بود و در صورت استفاده در هر جلسه اتاق، کاربر به عنوان مدیر به جلسه خواهد پیوست." - } - }, - "roles": { - "role": "نقش", - "roles": "نقش‌ها", - "administrator": "مدیر کل", - "guest": "مهمان", - "manage_roles": "مدیریت نقش‌ها", - "delete_role": "حذف نقش", - "are_you_sure_delete_role": "آیا مطمئن هستید که می‌خواهید این نقش را حذف کنید؟", - "enter_role_name": "نام نقش را وارد کنید", - "add_role": "+ ایجاد نقش", - "create_role": "ایجاد نقش", - "create_new_role": "ایجاد نقش جدید", - "no_role_found": "هیچ نقشی پیدا نشد.", - "search_not_found": "هیچ نقشی پیدا نشد", - "edit": { - "create_room": "به کاربران دارای این نقش اجازه دهید که اتاق ایجاد کنند", - "record": "به کاربران دارای این نقش اجازه دهید تا جلسات خود را ضبط کنند", - "manage_users": "به کاربران دارای این نقش اجازه دهید تا کاربران را مدیریت کنند", - "manage_rooms": "به کاربران دارای این نقش اجازه دهید تا اتاق‌های سرور را مدیریت کنند", - "manage_recordings": "به کاربران دارای این نقش اجازه دهید تا جلسات ضبط‌شدهٔ سرور را مدیریت کنند", - "manage_site_settings": "به کاربران دارای این نقش اجازه دهید تا تنظیمات سایت را مدیریت کنند", - "manage_roles": "به کاربران دارای این نقش اجازه دهید تا دیگر نقش‌ها را ویرایش کنند", - "shared_list": "کاربران دارای این نقش را در فهرست کشویی هم‌رسانی اتاق‌ها بگنجانید", - "room_limit": "محدودیت اتاق" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "یک کاربر جدید ایجاد شده‌است.", - "user_updated": "کاربر به‌روز شده‌است.", - "user_deleted": "کاربر حذف شده‌است.", - "avatar_updated": "تصویر نمایه به‌روز شده‌است.", - "password_updated": "گذرواژه به‌روز شده‌است.", - "account_activated": "حساب کاربری شما فعال شده‌است.", - "activation_email_sent": "رایانامه‌ای حاوی راهنماهای فعال‌سازی حساب کاربری شما ارسال شده‌است.", - "reset_pwd_email_sent": "رایانامه‌ای حاوی راهنماهای بازنشانی گذرواژه شما ارسال شده‌است." - }, - "session": { - "signed_out": "از سیستم خارج شده‌اید." - }, - "room": { - "room_created": "یک اتاق جدید ایجاد شده‌است.", - "room_updated": "اتاق به‌روز شده‌است.", - "room_deleted": "اتاق حذف شده‌است.", - "room_shared": "اتاق هم‌رسانی شده‌است.", - "room_unshared": "هم‌رسانی اتاق لغو شده‌است.", - "recordings_synced": "ضبط‌‌شده‌های اتاق همگام‌سازی شده‌اند.", - "room_configuration_updated": "پیکربندی اتاق به‌روز شده‌است.", - "room_setting_updated": "تنظیمات اتاق به‌روز شده‌است.", - "presentation_updated": "ارائه به‌روز شده‌است.", - "presentation_deleted": "ارائه حذف شده‌است.", - "joining_meeting": "در حال پیوستن به جلسه...", - "meeting_started": "جلسه شروع شد.", - "access_code_copied": "کد دسترسی رونوشت شده‌است.", - "access_code_generated": "کد دسترسی تولید شده‌است.", - "access_code_deleted": "کد دسترسی حذف شده‌است.", - "copied_meeting_url": "نشانی اینترنتی جلسه رونوشت شده‌است. این پیوند می‌تواند برای پیوستن به جلسه استفاده شود." - }, - "site_settings": { - "site_setting_updated": "تنظیمات سایت به‌روز شده‌اند.", - "brand_color_updated": "رنگ برند به‌روز شده‌است.", - "brand_image_updated": "تصویر برند به‌روز شده‌است.", - "brand_image_deleted": "تصویر برند حذف شده‌است.", - "privacy_policy_updated": "سیاست حفظ حریم خصوصی به‌روز شده‌است.", - "terms_of_service_updated": "شرایط خدمات به‌روز شده‌است." - }, - "recording": { - "recording_visibility_updated": "قابلیت مشاهدهٔ ضبط به‌روز شده‌است.", - "recording_name_updated": "نام جلسهٔ ضبط‌شده به‌روز شده‌است.", - "recording_deleted": "جلسهٔ ضبط‌شده حذف شده‌است.", - "copied_urls": "نشانی‌های اینترنتی جلسهٔ ضبط‌شده رونوشت شده‌است." - }, - "role": { - "role_created": "یک نقش جدید ایجاد شده‌است.", - "role_updated": "نقش به‌روز شده‌است.", - "role_deleted": "نقش حذف شده‌است.", - "role_permission_updated": "دسترسی نقش به‌روز شده‌است." - }, - "invitations": { - "invitation_sent": "دعوت‌نامه ارسال شده‌است." - } - }, - "error": { - "problem_completing_action": "این عمل نمی‌تواند تکمیل شود.\nلطفا دوباره تلاش کنید.", - "file_type_not_supported": "نوع پرونده پشتیبانی نمی‌شود.", - "file_size_too_large": "اندازهٔ پرونده خیلی بزرگ است.", - "file_upload_error": "پرونده نمی‌تواند بارگذاری شود.", - "signin_required": "برای دسترسی به این صفحه باید وارد سیستم شده باشید.", - "roles": { - "role_assigned": "این نقش نمی‌تواند حذف شود، زیرا به حداقل یک کاربر اختصاص داده شده‌است." - }, - "users": { - "signup_error": "شما نمی‌توانید احراز هویت شوید. لطفا با مدیریت تماس بگیرید.", - "invalid_invite": "ژتون دعوت‌نامهٔ شما یا نامعتبر است یا نادرست است. لطفا با مدیریت تماس بگیرید تا یک ژتون جدید دریافت کنید.", - "email_exists": "یک حساب کاربری با این رایانامه از قبل وجود دارد. لطفا با رایانامهٔ دیگری دوباره امتحان کنید.", - "old_password": "گذرواژه‌ای که وارد کرده‌اید اشتباه است.", - "pending": "ثبت‌نام شما در انتظار تأیید مدیر کل است. لطفا بعدا دوباره تلاش کنید.", - "banned": "شما به این برنامه دسترسی ندارید. اگف فکر می‌کنید که اشتباهی رخ داده است، لطفا با مدیریت تماس بگیرید." - }, - "rooms": { - "room_limit": "به دلیل رسیدن به سقف مجاز تعداد اتاق‌ها، نمی‌توانید اتاق ایجاد کنید." - }, - "session": { - "invalid_credentials": "نام‌کاربری یا گذرواژه نامعتبر است. لطفا اطلاعات کاربری خود را تأیید کنید و دوباره امتحان کنید." - } - } - }, - "global_error_page": { - "title": "خطا", - "message": "با عرض پوزش، مشکلی پیش آمد. اگر حادثه دوباره رخ داد، لطفا با مدیریت تماس بگیرید." - }, - "not_found_error_page": { - "title": "صفحه یافت نشد", - "message": "با عرض پوزش، صفحه‌ای که سعی می‌کنید به آن دسترسی پیدا کنید یافت نشد." - }, - "account_activation_page": { - "title": "فعال‌سازی حساب کاربری", - "account_unverified": "حساب کاربری شما هنوز تایید نشده است.", - "message": "برای استفاده از Greenlight، لطفا با دنبال‌کردن راهنماهای موجود در رایانامه فعال‌سازی که برای شما ارسال شده‌است، حساب کاربری خود را تأیید کنید.", - "resend_activation_link": "اگر رایانامه فعال‌سازی را دریافت نکرده‌اید یا در استفاده از آن مشکل دارید، روی دکمهٔ زیر کلیک کنید تا رایانامه فعال‌سازی جدیدی را درخواست دهید.", - "resend_btn_lbl": "ارسال مجدد تأییدیه" - }, - "forms": { - "validations": { - "full_name": { - "required": "لطفا یک نام کامل وارد کنید", - "min": "نام باید حداقل ۲ نویسه داشته باشد", - "max": "نام باید حداکثر ۲۵۵ نویسه داشته باشد" - }, - "email": { - "required": "لطفا یک رایانامه وارد کنید", - "email": "مقدار واردشده با قالب رایانامه مطابقت ندارد", - "min": "رایانامه باید حداقل ۶ نویسه داشته باشد", - "max": "رایانامه باید حداکثر ۲۵۵ نویسه داشته باشد" - }, - "password": { - "required": "لطفا یک گذرواژه وارد کنید", - "match": "گذرواژه باید حداقل این موارد را داشته باشد:", - "min": "- هشت نویسه", - "lower": "- یک حرف کوچک", - "upper": "- یک حرف بزرگ", - "digit": "- یک عدد", - "symbol": "- یک نماد", - "max": "گذرواژه باید حداکثر ۲۵۵ نویسه داشته باشد" - }, - "password_confirmation": { - "required": "لطفا تأیید گذرواژه را وارد کنید", - "match": "گذرواژه‌ها با هم یکسان نمی‌باشند" - }, - "emails": { - "required": "لطفا حداقل یک رایانامهٔ معتبر وارد کنید", - "list": "لطفا فهرستی از رایانامه‌های معتبر جداشده با ویرگول ارائه دهید (user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "لطفا نام نقش را وارد کنید" - }, - "role": { - "limit": { - "required": "لطفا محدودیت تعداد اتاق را وارد کنید", - "min": "حداقل مجاز ۰ است", - "max": "حداکثر مجاز ۱۰۰ است" - }, - "type": { - "error": "باید یک عدد مشخص کنید" - } - }, - "room": { - "name": { - "required": "لطفا نام اتاق را وارد کنید.", - "min": "نام باید حداقل ۲ نویسه داشته باشد" - } - }, - "room_join": { - "name": { - "required": "لطفا نام خود را وارد کنید." - } - }, - "url": { - "invalid": "نشانی اینترنتی معتبر نیست" - } - }, - "room": { - "fields": { - "name": { - "label": "نام اتاق", - "placeholder": "نام اتاق را وارد کنید..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "نام", - "placeholder": "نام خود را وارد کنید" - }, - "access_code": { - "label": "کد دسترسی", - "placeholder": "کد دسترسی را وارد کنید" - }, - "recording_consent": { - "label": "من متوجه هستم که این جلسه ممکن است ضبط شود. این ممکن است شامل صدا و ویدیوی من در صورت فعال‌بودن نیز باشد." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "نام کامل", - "placeholder": "نام کامل خود را وارد کنید" - }, - "email": { - "label": "رایانامه", - "placeholder": "رایانامهٔ خود را وارد کنید" - }, - "password": { - "label": "گذرواژه", - "placeholder": "ایجاد گذرواژه" - }, - "password_confirmation": { - "label": "تأیید گذرواژه", - "placeholder": "تأیید گذرواژه" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "رایانامه", - "placeholder": "رایانامه" - }, - "password": { - "label": "گذرواژه", - "placeholder": "گذرواژه" - }, - "remember_me": { - "label": "مرا به خاطر بسپار" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "گذرواژهٔ فعلی", - "placeholder": "گذرواژهٔ خود را وارد کنید" - }, - "new_password": { - "label": "گذرواژهٔ جدید", - "placeholder": "گذرواژهٔ جدید خود را وارد کنید" - }, - "password_confirmation": { - "label": "تأیید گذرواژه", - "placeholder": "گذرواژهٔ جدید خود را تأیید کنید" - } - }, - "validations": { - "old_password": { - "required": "لطفا گذرواژهٔ کنونی خود را وارد کنید" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "رایانامه", - "placeholder": "رایانامهٔ حساب کاربری را وارد کنید" - } - }, - "validations": { - "email": { - "required": "لطفا رایانامهٔ حساب کاربری را وارد کنید" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "گذرواژهٔ جدید", - "placeholder": "گذرواژهٔ جدید خود را وارد کنید" - }, - "password_confirmation": { - "label": "تأیید گذرواژه", - "placeholder": "گذرواژهٔ جدید خود را تأیید کنید" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "نام کامل" - }, - "email": { - "label": "رایانامه" - }, - "language": { - "label": "زبان" - }, - "role": { - "label": "نقش" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "نام کامل", - "placeholder": "نام کامل کاربر را وارد کنید" - }, - "email": { - "label": "رایانامه", - "placeholder": "رایانامهٔ کاربر را وارد کنید" - }, - "password": { - "label": "گذرواژه", - "placeholder": "گذرواژهٔ کاربر را وارد کنید" - }, - "password_confirmation": { - "label": "تأیید گذرواژه", - "placeholder": "تأیید گذرواژه" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "رایانامه‌ها" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "پیوند را اینجا وارد کنید..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "نام نقش", - "placeholder": "نام نقش را وارد کنید..." - } - } - } - } - } -} diff --git a/app/assets/locales/fa_IR.json b/app/assets/locales/fa_IR.json deleted file mode 100644 index f0e31b67ca..0000000000 --- a/app/assets/locales/fa_IR.json +++ /dev/null @@ -1,726 +0,0 @@ -{ - "start": "شروع", - "search": "جستجو", - "home": "صفحهٔ خانه", - "previous": "قبلی", - "back": "بازگشت", - "next": "بعدی", - "view": "نمایش", - "join": "پیوستن", - "edit": "ویرایش", - "save": "ذخیره", - "save_changes": "ذخیرهٔ تغییرات", - "update": "به‌روزرسانی", - "report": "گزارش", - "share": "هم‌رسانی", - "cancel": "انصراف", - "reset": "بازنشانی", - "close": "بستن", - "delete": "حذف", - "copy": "رونوشت پیوند عضویت", - "copy_viewer_code": "رونوشت کد بیننده", - "copy_moderator_code": "رونوشت کد مدیر", - "or": "یا", - "online": "آنلاین", - "help_center": "مرکز راهنمایی", - "are_you_sure": "آیا مطمئن هستید؟", - "return_home": "بازگشت به صفحهٔ خانه", - "created_at": "ایجادشده در", - "view_recordings": "مشاهدهٔ ضبط‌شده‌ها", - "join_session": "پیوستن به نشست", - "no_result_search_input": "هیچ نتیجه‌ای برای «{{ searchInput }}» یافت نشد", - "action_permanent": "این عمل قابل بازگردانی نیست.", - "homepage": { - "welcome_bbb": "به BigBlueButton خوش آمدید.", - "bigbluebutton_description": "BigBlueButton یک سیستم کنفرانس وب متن‌باز برای کلاس‌های آنلاین است. این سکو زمان یادگیری کاربردی را به حداکثر می‌رساند و به دانش‌اموزان امکاناتی ارائه می‌دهد تا با یک‌دیگر همکاری کنند و در لحظه بازخورد دریافت کنند.", - "greenlight_description": "اتاق‌های خود را برای میزبانی جلسات ایجاد کنید یا با استفاده از یک پیوند کوتاه و راحت به اتاق‌های دیگران بپیوندید.", - "learn_more": "دربارهٔ BigBlueButton بیشتر بدانید", - "explore_features": "کاوش ویژگی‌های ما", - "meeting_title": " راه‌اندازی یک جلسه", - "meeting_description": "یک کلاس مجازی به همراه ویدیو، صدا، اشتراک‌گذاری صفحه نمایش، گپ و تمام ابزارهای مورد نیاز برای یادگیری کاربردی راه‌اندازی کنید.", - "recording_title": "جلسات خود را ضبط کنید", - "recording_description": "جلسات BigBlueButton را ضبط کنید و آنها را با دانش‌آموزان هم‌رسانی کنید تا مطالب را بررسی و روی آن فکر کنند.", - "settings_title": "مدیریت اتاق‌های خود", - "settings_description": "تنظیمات اتاق‌ها و جلسه خود را به گونه‌ای پیکربندی کنید که در روند کلاسی تأثیر بهتری داشته باشد.", - "and_more_title": "و موارد بیشتر!", - "and_more_description": "BigBlueButton برای یادگیری کاربردی، ابزارهای درونی مختلفی را ارائه می‌کند و برای صرفه‌جویی در وقت شما در طول کلاس طراحی شده است.", - "enter_meeting_url": "نشانی اینترنتی جلسه را وارد کنید", - "enter_meeting_url_instruction": "لطفا نشانی اینترنتی جلسه BigBlueButton خود را در زمینهٔ متنی زیر وارد کنید." - }, - "authentication": { - "sign_in": "ورود", - "sign_up": "ثبت‌نام", - "sign_out": "خروج", - "email": "رایانامه", - "password": "گذرواژه", - "confirm_password": "تأیید گذرواژه", - "enter_email": "رایانامهٔ خود را وارد کنید", - "enter_name": "نام خود را وارد کنید", - "remember_me": "مرا به خاطر بسپار", - "forgot_password": "گذرواژه را فراموش کرده‌اید؟", - "dont_have_account": "حساب کاربری ندارید؟", - "create_account": "ایجاد حساب کاربری", - "create_an_account": "ایجاد یک حساب کاربری", - "already_have_account": "از قبل حساب کاربری دارید؟" - }, - "user": { - "user": "کاربر", - "users": "کاربران", - "name": "نام", - "email_address": "نشانی رایانامه", - "authenticator": "احرازگر هویت", - "full_name": "نام کامل", - "no_user_found": "هیچ کاربری پیدا نشد", - "type_three_characters": "لطفا سه «۳» نویسه یا بیشتر برای نمایش دیگر کاربران تایپ کنید.", - "search_not_found": "هیچ کاربری پیدا نشد", - "profile": { - "profile": "نمایه", - "language": "زبان", - "role": "نقش", - "administrator": "مدیر کل", - "guest": "مهمان" - }, - "account": { - "account_info": "اطلاعات حساب کاربری", - "delete_account": "حذف حساب کاربری", - "change_password": "تغییر گذرواژه", - "set_password": "گذرواژهٔ جدید خود را تنظیم کنید", - "reset_password": "بازنشانی گذرواژه", - "update_account_info": "به‌روزرسانی اطلاعات حساب کاربری", - "current_password": "گذرواژهٔ فعلی", - "new_password": "گذرواژهٔ جدید", - "confirm_password": "تأیید گذرواژه", - "permanently_delete_account": "حساب کاربری خود را برای همیشه حذف کنید", - "delete_account_description": "اگر حساب کاربری خود را حذف کنید، قابل بازیابی نخواهد بود.\nتمام اطلاعات مربوط به حساب کاربری شما، از جمله تنظیمات، اتاق‌ها و موارد ضبط‌شده حذف خواهند شد.", - "delete_account_confirmation": "بله، من می‌خواهم حساب کاربریم را حذف کنم", - "are_you_sure_delete_account": "آیا مطمئن هستید که می‌خواهید حساب کاربری خود را حذف کنید؟" - }, - "avatar": { - "upload_avatar": "بارگذاری تصویر نمایه", - "delete_avatar": "حذف تصویر نمایه", - "crop_avatar": "برش تصویر نمایهٔ شما" - }, - "pending": { - "title": "در انتظار ثبت‌نام", - "message": "ممنون از این‌که ثبت‌نام کردید! حساب کاربری شما در حال حاضر در انتظار تأیید توسط یک مدیر کل است." - } - }, - "room": { - "room": "اتاق", - "rooms": "اتاق‌ها", - "room_name": "نام اتاق", - "add_new_room": "+ اتاق جدید", - "create_room": "ایجاد اتاق", - "delete_room": "حذف اتاق", - "create_new_room": "ایجاد اتاق جدید", - "enter_room_name": "نام اتاق را وارد کنید", - "shared_by": "هم‌رسانی‌شده توسط", - "last_session": "آخرین جلسه: {{ localizedTime }}", - "no_last_session": "هنوز هیچ جلسه‌ای از قبل ایجاد نشده است", - "search_not_found": "هیچ اتاقی پیدا نشد", - "rooms_list_is_empty": "شما هنوز هیچ اتاقی ندارید!", - "rooms_list_empty_create_room": "با کلیک بر روی دکمهٔ زیر و وارد کردن نام اتاق، اولین اتاق خود را ایجاد کنید.", - "meeting": { - "start_meeting": "شروع جلسه", - "join_meeting": "پیوستن به جلسه", - "meeting_invitation": "شما برای پیوستن به جلسه دعوت شده‌اید", - "meeting_not_started": "جلسه هنوز شروع نشده است", - "join_meeting_automatically": "با شروع جلسه، به طور خودکار به آن خواهید پیوست.", - "recording_consent": "من متوجه هستم که این جلسه ممکن است ضبط شود. این ممکن است شامل صدا و ویدیوی من در صورت فعال‌بودن نیز باشد." - }, - "presentation": { - "presentation": "ارائه", - "click_to_upload": "برای بارگذاری کلیک کنید", - "drag_and_drop": " یا بکشید و رها کنید", - "upload_description": "هر سند اداری یا پرونده PDF (بزرگتر از {{size}}) را بارگذاری کنید. بسته به اندازه پرونده، ممکن است به زمان بیشتری برای بارگذاری نیاز باشد تا بتوان از آن استفاده کرد.", - "delete_presentation": "حذف ارائه", - "are_you_sure_delete_presentation": "آیا مطمئن هستید که می‌خواهید این ارائه را حذف کنید؟" - }, - "shared_access": { - "access": "دسترسی", - "add_share_access": "+ هم‌رسانی دسترسی", - "share_room_access": "هم‌رسانی دسترسی به اتاق", - "add_some_users": "اکنون زمان افزودن چند کاربر است!", - "add_some_users_description": "برای افزودن کاربران جدید، روی دکمهٔ زیر کلیک کنید و کاربرانی را که می‌خواهید این اتاق را با آنها هم‌رسانی کنید، جستجو یا انتخاب کنید.", - "delete_shared_access": "حذف دسترسی هم‌رسانی‌شده", - "are_you_sure_delete_shared_access": "آیا مطمئن هستید که می‌خواهید این دسترسی هم‌رسانی‌شده را حذف کنید؟" - }, - "settings": { - "settings": "تنظیمات", - "room_name": "نام اتاق", - "user_settings": "تنظیمات کاربر", - "allow_room_to_be_recorded": "اجازه دهید اتاق ضبط شود", - "require_signed_in": "کاربران قبل از ورود به جلسه، نیازمند ورود به سیستم باشند", - "require_signed_in_message": "برای پیوستن به این اتاق باید وارد حساب کاربری خود شوید.", - "require_mod_approval": "قبل از پیوستن به جلسه نیاز به تأیید مدیر باشد", - "allow_any_user_to_start": "به هر کاربری اجازه دهید این جلسه را شروع کند", - "all_users_join_as_mods": "همه کاربران به عنوان مدیر عضو شوند", - "mute_users_on_join": "کاربران هنگام پیوستن بی‌صدا شوند", - "generate": "تولید کن", - "access_code": "کد دسترسی", - "mod_access_code": "کد دسترسی مدیر", - "mod_access_code_optional": "کد دسترسی مدیر (اختیاری)", - "access_code_required": "لطفا کد دسترسی را وارد کنید", - "wrong_access_code": "کد دسترسی اشتباه است", - "generate_viewers_access_code": "ایجاد کد دسترسی برای بینندگان", - "generate_mods_access_code": "ایجاد کد دسترسی برای مدیران", - "server_tag": "نوع سرور برای این اتاق انتخاب کنید", - "default_tag_name": "پیش‌فرض", - "server_tag_desired": "دلخواه", - "server_tag_required": "الزامی است", - "are_you_sure_delete_room": "آیا مطمئن هستید که می‌خواهید این اتاق را حذف کنید؟" - } - }, - "recording": { - "recording": "ضبط", - "recordings": "ضبط‌شده‌ها", - "processing": "درحال پردازش ضبط‌ها", - "name": "نام", - "length": "طول مدت", - "users": "کاربران", - "visibility": "قابلیت مشاهده", - "formats": "قالب‌ها", - "published": "منتشرشده", - "unpublished": "منتشرنشده", - "protected": "محافظت‌شده", - "public": "عمومی", - "public_protected": "عمومی/محافظت‌شده", - "length_in_minutes": "{{recording.length}} دقیقه.", - "processing_recording": "در حال پردازش ضبط؛ این‌کار ممکن است چند دقیقه طول بکشد...", - "copy_recording_urls": "رونوشت نشانی(های) ضبط", - "recordings_list_empty": "شما هنوز هیچ جلسهٔ ضبط‌شده‌ای ندارید!", - "public_recordings_list_empty": "هنوز هیچ ضبط عمومی‌ای وجود ندارد!", - "recordings_list_empty_description": "بعد از شروع جلسه و ضبط آن، موارد ضبط‌شده در این‌جا نمایان می‌شوند.", - "public_recordings_list_empty_description": "موارد ضبط‌شده هنگامی که موجود شوند در این‌جا پدیدار خواهند شد.", - "delete_recording": "حذف ضبط", - "are_you_sure_delete_recording": "آیا مطمئن هستید که می‌خواهید این ضبط را حذف کنید؟", - "search_not_found": "هیچ ضبطی یافت نشد" - }, - "admin": { - "admin_panel": "تابلوی مدیر کل", - "manage_users": { - "manage_users": "مدیریت کاربران", - "active": "فعال", - "approve": "تأیید", - "decline": "ردکردن", - "pending": "در انتظار", - "banned": "مسدودشده", - "ban": "مسدود", - "unban": "لغو مسدودیت", - "unverified": "تاییدنشده", - "verify": "تایید کنید", - "deleted": "حذف‌شده", - "invited_tab": "دعوت‌شده", - "invite_user": "دعوت از کاربر", - "send_invitation": "ارسال دعوت‌نامه", - "enter_user_email": "رایانامهٔ کاربر را وارد کنید", - "new_user": "کاربر جدید", - "add_new_user": "کاربر جدید", - "create_new_user": "ایجاد کاربر جدید", - "edit_user": "ویرایش کاربر", - "delete_user": "حذف کاربر", - "users_edit_path": "کاربران/ویرایش", - "create_account": "ایجاد حساب کاربری", - "create_room": "ایجاد اتاق", - "create_new_room": "ایجاد اتاق جدید", - "user_created_at": "ایجاد‌شده: {{user.created_at}}", - "are_you_sure_delete_account": "آیا مطمئن هستید که می‌خواهید حساب کاربری {{user.name}} را حذف کنید؟", - "delete_account_warning": "اگر این حساب کاربری را حذف کنید، قابل بازیابی نخواهد بود.", - "empty_active_users": "هنوز هیچ کاربر فعالی در این سرور وجود ندارد!", - "empty_active_users_subtext": "هنگامی که وضعیت یک کاربر به فعال تغییر می‌کند، در اینجا نمایان می‌شوند.", - "empty_pending_users": "هنوز هیچ کاربر درانتظار تأیید در این سرور وجود ندارد!", - "empty_pending_users_subtext": "هنگامی که وضعیت یک کاربر به در انتظارِ تأیید تغییر می‌کند، در اینجا نمایان می‌شوند.", - "empty_banned_users": "هنوز هیچ کاربر مسدودشده‌ای در این سرور وجود ندارد!", - "empty_banned_users_subtext": "هنگامی که وضعیت یک کاربر به مسدودشده تغییر می‌کند، در اینجا نمایان می‌شوند.", - "empty_unverified_users": "هنوز هیچ کاربر تاییدنشده‌ای در این سرور وجود ندارد!", - "empty_unverified_users_subtext": "هر کاربر تاییدنشده‌ای در اینجا ظاهر خواهد شد.", - "empty_invited_users": "هنوز هیچ کاربر دعوت‌شده‌ای در این سرور وجود ندارد!", - "empty_invited_users_subtext": "هنگامی که وضعیت یک کاربر به دعوت‌شده تغییر می‌کند، در اینجا نمایان می‌شوند.", - "invited": { - "time_sent": "زمان ارسال‌شده", - "valid": "معتبر", - "revoke": "ابطال" - } - }, - "server_rooms": { - "server_rooms": "اتاق‌های سرور", - "name": "نام", - "owner": "صاحب", - "room_id": "شناسه اتاق", - "participants": "شركت‌كنندگان", - "status": "وضعیت", - "running": "در حال اجرا", - "not_running": "در حال اجرا نیست", - "active": "فعال", - "current_session": "جلسهٔ کنونی: {{lastSession}}", - "last_session": "آخرین جلسه: {{localizedTime}}", - "no_meeting_yet": "هنوز هیچ جلسه‌ای وجود ندارد.", - "delete_server_rooms": "حذف اتاق سرور", - "resync_recordings": "همگام‌سازی مجدد ضبط‌شده‌ها", - "empty_room_list": "هنوز هیچ اتاق سروری وجود ندارد!", - "empty_room_list_subtext": "اتاق‌ها پس از این‌که اولین اتاق خود را ایجاد کنید در اینجا نمایان می‌شوند." - }, - "server_recordings": { - "server_recordings": "ضبط‌شده‌های سرور", - "latest_recordings": "آخرین ضبط‌شده‌ها", - "no_recordings_found": "هیچ ضبطی یافت نشد." - }, - "site_settings": { - "site_settings": "تنظیمات سایت", - "customize_greenlight": "شخصی‌سازی Greenlight", - "appearance": { - "appearance": "ظاهر", - "brand_color": "رنگ برند", - "regular": "عادی", - "lighten": "روشن", - "brand_image": "تصویر برند", - "click_to_upload": "برای بارگذاری کلیک کنید", - "drag_and_drop": " یا بکشید و رها کنید", - "upload_brand_image_description": "هر پرونده PNG، JPG یا SVG (بزرگتر از {{size}}) را می‌توانید بارگذاری کنید. بسته به اندازه پرونده، ممکن است به زمان بیشتری برای بارگذاری نیاز داشته باشد تا بتوانید از آن استفاده کنید", - "remove_branding_image": "حذف تصویر برند" - }, - "administration": { - "administration": "مدیریت", - "terms": "شرایط و ضوابط", - "privacy": "اطلاعیه حفظ حریم خصوصی", - "privacy_policy": "اطلاعیه حفظ حریم خصوصی", - "change_term_links": "تغییر پیوندهای مقررات که در پایین صفحه نمایان می‌شوند", - "change_privacy_link": "پیوند حریم خصوصی که در پایین صفحه نمایان می‌شود را تغییر دهید", - "helpcenter": "مرکز راهنمایی", - "change_helpcenter_link": "پیوند مرکز راهنمایی را که در قسمت کشویی نمایه ظاهر می‌شود تغییر دهید", - "maintenance": "اعلامیهٔ حالت تعمیر", - "change_maintenance_text": "متن اعلامیهٔ حالت تعمیر که در سرصفحه نمایش داده می‌شود را تغییر دهید", - "change_url": "تغییر نشانی اینترنتی", - "set_text": "تنظیم متن", - "clear_banner": "پاک‌سازی اعلامیه", - "enter_link": "پیوند را این‌جا وارد کنید" - }, - "settings": { - "settings": "تنظیمات", - "allow_users_to_share_rooms": "به کاربران اجازه دهید اتاق‌ها را هم‌رسانی کنند", - "allow_users_to_share_rooms_description": "تنظیم برروی غیرفعال، دکمه را از فهرست کشویی گزینه‌های اتاق حذف می‌کند و از هم‌رسانی اتاق‌ها توسط کاربران جلوگیری می‌کند", - "allow_users_to_preupload_presentation": "به کاربران اجازه دهید تا ارائه‌ها را از قبل بارگذاری کنند", - "allow_users_to_preupload_presentation_description": "کاربران می‌توانند یک ارائه را از قبل بارگذاری کنند تا به عنوان ارائهٔ پیش‌فرض برای آن اتاق خاص استفاده شود", - "show_sign_in_on_room_join": "نمایش پیوند ورود هنگام پیوستن به اتاق", - "show_sign_in_on_room_join_description": "اگر کاربر وارد نشده باشد، یک پیوند ورود در پایین کارت هنگام ورود به اتاق ظاهر می‌شود", - "default_visibility": "قابلیت مشاهدهٔ پیش‌فرض ضبط‌شده‌ها", - "default_visibility_description": "همه ضبط‌هایی که به‌تازگی ایجاد شده، به طور پیش‌فرض این قابلیت مشاهده را خواهند داشت", - "session_timeout": "مهلت نشست", - "session_timeout_description": "می‌توانید مهلت نشست را با یک کوکی پیش‌فرض ۱ روزه یا کوکی نشست طولانی ۷ روزه پیکربندی کنید", - "default_session_timeout": "پیش‌فرض (۱ روز)", - "extended_session_timeout": "طولانی (۷ روز)" - }, - "registration": { - "registration": "ثبت‌نام", - "role_mapping_by_email": "سپردن نقش از طریق رایانامه", - "role_mapping_by_email_description": "با استفاده از رایانامهٔ کاربر نقشی به او بسپارید. باید در قالب: role1=email1, role2=email2 باشد", - "enter_role_mapping_rule": "یک قانون سپردن نقش را وارد کنید", - "resync_on_login": "همگام‌سازی مجدد داده‌های کاربر در هر بار ورود", - "resync_on_login_description": "هر بار که کاربر وارد سیستم می‌شود، اطلاعات کاربر را مجددا همگام‌سازی می‌کند و باعث می‌شود که ارائه‌دهندهٔ احراز هویت خارجی همیشه با اطلاعات موجود در Greenlight مطابقت داشته باشد.", - "default_role": "نقش پیش‌فرض", - "default_role_description": "نقش پیش‌فرضی که به کاربران تازهٔ ایجاد‌شده اختصاص داده می‌شود", - "registration_method": "روش ثبت‌نام", - "registration_method_description": "نحوه ثبت‌نام کاربران در وب‌سایت را تغییر دهید", - "registration_methods" : { - "open": "بازکردن ثبت‌نام", - "invite": "پیوستن با دعوت‌نامه", - "approval": "تأیید/رد" - }, - "allowed_domains": "دامنه‌های رایانامه مجاز", - "allowed_domains_signup_description": "به دامنه‌های رایانامه خاص اجازه دهید تا نام‌نویسی کنند. قالب باید به این صورت باشد: ‎@test.com,domain.com", - "enter_allowed_domains_rule" : "دامنه‌های مجاز را وارد کنید" - } - }, - "room_configuration": { - "room_configuration": "پیکربندی اتاق", - "default": "اختیاری (پیش‌فرض: فعال‌شده)", - "optional": "اختیاری (پیش‌فرض: غیرفعال‌شده)", - "enabled": "اجباری فعال‌شده", - "disabled": "غیرفعال‌شده", - "configurations": { - "allow_room_to_be_recorded": "اجازه دهید اتاق ضبط شود", - "allow_room_to_be_recorded_description": "به صاحبان اتاق اجازه می‌دهد تعیین کنند که آیا می‌خواهند امکان ضبط اتاق را داشته باشند یا خیر. اگر فعال باشد، مدیر همچنان باید پس از شروع جلسه، روی دکمهٔ «ضبط» کلیک کند.", - "require_user_signed_in": "کاربران قبل از ورود به جلسه، نیازمند ورود به سیستم باشند", - "require_user_signed_in_description": "فقط به کاربرانی که دارای حساب کاربری در Greenlight هستند اجازه می‌دهد به جلسه بپیوندند. اگر وارد سیستم نشده باشند، هنگام تلاش برای پیوستن به اتاق، به صفحهٔ ورود هدایت می‌شوند.", - "require_mod_approval": "قبل از پیوستن به جلسه نیاز به تایید مدیر باشد", - "require_mod_approval_description": "هنگامی که یک کاربر سعی می‌کند به جلسه بپیوندد، از مدیر جلسه BigBlueButton درخواست می‌کند. در صورت تأییدشدن کاربر، می‌تواند به جلسه بپیوندد.", - "allow_any_user_to_start_meeting": "به هر کاربری اجازه دهید تا جلسه را شروع کند", - "allow_any_user_to_start_meeting_description": "به هر کاربری اجازه دهید جلسه را در هر زمانی که خواست شروع کند. به‌طور پیش‌فرض، فقط صاحب اتاق می‌تواند جلسه را شروع کند.", - "allow_users_to_join_as_mods": "همهٔ کاربران به عنوان مدیر بپیوندند", - "allow_users_to_join_as_mods_description": "به همهٔ کاربران هنگام پیوستن به جلسه، در BigBlueButton اختیارات مدیر را می‌دهد", - "mute_users_on_join": "کاربران هنگام پیوستن بی‌صدا شوند", - "mute_users_on_join_description": "هنگامی که کاربر به جلسهٔ BigBlueButton می‌پیوندد، به‌طور خودکار بی‌صدا می‌شود", - "viewer_access_code": "کد دسترسی بینندگان", - "viewer_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران هم‌رسانی شود. اگر کد تولید شده باشد، برای پیوستن کاربران به جلسات اتاق الزامی است.", - "mod_access_code": "کد دسترسی مدیر", - "mod_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران هم‌رسانی کنند. کد، در صورت تولید، مورد نیاز نخواهد بود و در صورت استفاده در هر جلسه اتاق، کاربر به عنوان مدیر به جلسه خواهد پیوست." - } - }, - "roles": { - "role": "نقش", - "roles": "نقش‌ها", - "administrator": "مدیر کل", - "guest": "مهمان", - "manage_roles": "مدیریت نقش‌ها", - "delete_role": "حذف نقش", - "are_you_sure_delete_role": "آیا مطمئن هستید که می‌خواهید این نقش را حذف کنید؟", - "enter_role_name": "نام نقش را وارد کنید", - "add_role": "+ ایجاد نقش", - "create_role": "ایجاد نقش", - "create_new_role": "ایجاد نقش جدید", - "no_role_found": "هیچ نقشی پیدا نشد.", - "search_not_found": "هیچ نقشی پیدا نشد", - "edit": { - "create_room": "به کاربران دارای این نقش اجازه دهید که اتاق ایجاد کنند", - "record": "به کاربران دارای این نقش اجازه دهید تا جلسات خود را ضبط کنند", - "manage_users": "به کاربران دارای این نقش اجازه دهید تا کاربران را مدیریت کنند", - "manage_rooms": "به کاربران دارای این نقش اجازه دهید تا اتاق‌های سرور را مدیریت کنند", - "manage_recordings": "به کاربران دارای این نقش اجازه دهید تا جلسات ضبط‌شدهٔ سرور را مدیریت کنند", - "manage_site_settings": "به کاربران دارای این نقش اجازه دهید تا تنظیمات سایت را مدیریت کنند", - "manage_roles": "به کاربران دارای این نقش اجازه دهید تا دیگر نقش‌ها را ویرایش کنند", - "shared_list": "کاربران دارای این نقش را در فهرست کشویی هم‌رسانی اتاق‌ها بگنجانید", - "room_limit": "محدودیت اتاق", - "email_on_signup": "دریافت رایانامه زمانی که یک کاربر جدید ثبت نام می‌کند", - "allowed_recording_visibility": "گزینه‌های مجاز برای قابلیت مشاهدهٔ ضبط‌شده‌ها" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "یک کاربر جدید ایجاد شده‌است.", - "user_updated": "کاربر به‌روز شده‌است.", - "user_deleted": "کاربر حذف شده‌است.", - "avatar_updated": "تصویر نمایه به‌روز شده‌است.", - "password_changed": "گذرواژهٔ شما با موفقیت به‌روزرسانی شد. لطفا دوباره وارد شوید.", - "password_updated": "گذرواژه به‌روز شده‌است.", - "account_activated": "حساب کاربری شما فعال شده‌است.", - "activation_email_sent": "رایانامه‌ای حاوی راهنماهای فعال‌سازی حساب کاربری شما ارسال شده‌است.", - "reset_pwd_email_sent": "رایانامه‌ای حاوی راهنماهای بازنشانی گذرواژه شما ارسال شده‌است." - }, - "session": { - "signed_out": "از سیستم خارج شده‌اید." - }, - "room": { - "room_created": "یک اتاق جدید ایجاد شده‌است.", - "room_updated": "اتاق به‌روز شده‌است.", - "room_deleted": "اتاق حذف شده‌است.", - "room_shared": "اتاق هم‌رسانی شده‌است.", - "room_unshared": "هم‌رسانی اتاق لغو شده‌است.", - "recordings_synced": "ضبط‌‌شده‌های اتاق همگام‌سازی شده‌اند.", - "room_configuration_updated": "پیکربندی اتاق به‌روز شده‌است.", - "room_setting_updated": "تنظیمات اتاق به‌روز شده‌است.", - "presentation_updated": "ارائه به‌روز شده‌است.", - "presentation_deleted": "ارائه حذف شده‌است.", - "joining_meeting": "در حال پیوستن به جلسه...", - "meeting_started": "جلسه شروع شد.", - "access_code_copied": "کد دسترسی رونوشت شده‌است.", - "access_code_generated": "کد دسترسی تولید شده‌است.", - "access_code_deleted": "کد دسترسی حذف شده‌است.", - "copied_meeting_url": "نشانی اینترنتی جلسه رونوشت شده‌است. این پیوند می‌تواند برای پیوستن به جلسه استفاده شود.", - "copied_viewer_code": "کد دسترسی بیننده رونوشت شده است.", - "copied_moderator_code": "کد دسترسی مدیر رونوشت شده است." - }, - "site_settings": { - "site_setting_updated": "تنظیمات سایت به‌روز شده‌اند.", - "brand_color_updated": "رنگ برند به‌روز شده‌است.", - "brand_image_updated": "تصویر برند به‌روز شده‌است.", - "brand_image_deleted": "تصویر برند حذف شده‌است.", - "privacy_policy_updated": "اطلاعیه حفظ حریم خصوصی به‌روز شده است.", - "helpcenter_updated": "پیوند مرکز راهنمایی به‌روز شده است.", - "terms_of_service_updated": "شرایط خدمات به‌روز شده‌است.", - "maintenance_updated": "اعلامیهٔ حالت تعمیر به‌روز شده است.", - "allowed_domains_signup_updated": "دامنه‌های رایانامه مجاز به‌روزرسانی شده‌اند." - }, - "recording": { - "recording_visibility_updated": "قابلیت مشاهدهٔ ضبط به‌روز شده‌است.", - "recording_name_updated": "نام جلسهٔ ضبط‌شده به‌روز شده‌است.", - "recording_deleted": "جلسهٔ ضبط‌شده حذف شده‌است.", - "copied_urls": "نشانی‌های اینترنتی جلسهٔ ضبط‌شده رونوشت شده‌است." - }, - "role": { - "role_created": "یک نقش جدید ایجاد شده‌است.", - "role_updated": "نقش به‌روز شده‌است.", - "role_deleted": "نقش حذف شده‌است.", - "role_permission_updated": "دسترسی نقش به‌روز شده‌است." - }, - "invitations": { - "invitation_sent": "دعوت‌نامه ارسال شده‌است.", - "invitation_revoked": "یک دعوت‌نامه ابطال شده است" - } - }, - "error": { - "problem_completing_action": "این عمل نمی‌تواند تکمیل شود.\nلطفا دوباره تلاش کنید.", - "server_type_unavailable": "نوع سرور مورد نظر در دسترس نیست. لطفا نوع دیگری را در تنظیمات اتاق انتخاب کنید.", - "file_type_not_supported": "نوع پرونده پشتیبانی نمی‌شود.", - "file_size_too_large": "اندازهٔ پرونده خیلی بزرگ است.", - "file_upload_error": "پرونده نمی‌تواند بارگذاری شود.", - "signin_required": "برای دسترسی به این صفحه باید وارد سیستم شده باشید.", - "malware_detected": "بدافزار شناسایی شد! پرونده‌ای که بارگذاری کردید ممکن است حاوی بدافزار باشد. لطفا پروندهٔ خود را بررسی کنید و دوباره امتحان کنید.", - "roles": { - "role_assigned": "این نقش نمی‌تواند حذف شود، زیرا به حداقل یک کاربر اختصاص داده شده‌است." - }, - "users": { - "signup_error": "شما نمی‌توانید احراز هویت شوید. لطفا با مدیریت تماس بگیرید.", - "invalid_invite": "ژتون دعوت‌نامهٔ شما یا نامعتبر است یا نادرست است. لطفا با مدیریت تماس بگیرید تا یک ژتون جدید دریافت کنید.", - "email_exists": "یک حساب کاربری با این رایانامه از قبل وجود دارد. لطفا با رایانامهٔ دیگری دوباره امتحان کنید.", - "old_password": "گذرواژه‌ای که وارد کرده‌اید اشتباه است.", - "pending": "ثبت‌نام شما در انتظار تأیید مدیر کل است. لطفا بعدا دوباره تلاش کنید.", - "banned": "شما به این برنامه دسترسی ندارید. اگف فکر می‌کنید که اشتباهی رخ داده است، لطفا با مدیریت تماس بگیرید." - }, - "rooms": { - "room_limit": "به دلیل رسیدن به سقف مجاز تعداد اتاق‌ها، نمی‌توانید اتاق ایجاد کنید." - }, - "session": { - "invalid_credentials": "نام‌کاربری یا گذرواژه نامعتبر است. لطفا اطلاعات کاربری خود را تأیید کنید و دوباره امتحان کنید." - } - } - }, - "global_error_page": { - "title": "خطا", - "message": "با عرض پوزش، مشکلی پیش آمد. اگر حادثه دوباره رخ داد، لطفا با مدیریت تماس بگیرید." - }, - "not_found_error_page": { - "title": "صفحه یافت نشد", - "message": "با عرض پوزش، صفحه‌ای که سعی می‌کنید به آن دسترسی پیدا کنید یافت نشد." - }, - "account_activation_page": { - "title": "فعال‌سازی حساب کاربری", - "account_unverified": "حساب کاربری شما هنوز تایید نشده است.", - "message": "برای استفاده از Greenlight، لطفا با دنبال‌کردن راهنماهای موجود در رایانامه فعال‌سازی که برای شما ارسال شده‌است، حساب کاربری خود را تأیید کنید.", - "resend_activation_link": "اگر رایانامه فعال‌سازی را دریافت نکرده‌اید یا در استفاده از آن مشکل دارید، روی دکمهٔ زیر کلیک کنید تا رایانامه فعال‌سازی جدیدی را درخواست دهید.", - "resend_btn_lbl": "ارسال مجدد تأییدیه" - }, - "forms": { - "validations": { - "full_name": { - "required": "لطفا یک نام کامل وارد کنید", - "min": "نام باید حداقل ۲ نویسه داشته باشد", - "max": "نام باید حداکثر ۲۵۵ نویسه داشته باشد" - }, - "email": { - "required": "لطفا یک رایانامه وارد کنید", - "email": "مقدار واردشده با قالب رایانامه مطابقت ندارد", - "min": "رایانامه باید حداقل ۶ نویسه داشته باشد", - "max": "رایانامه باید حداکثر ۲۵۵ نویسه داشته باشد" - }, - "password": { - "required": "لطفا یک گذرواژه وارد کنید", - "match": "گذرواژه باید حداقل این موارد را داشته باشد:", - "min": "- هشت نویسه", - "lower": "- یک حرف کوچک", - "upper": "- یک حرف بزرگ", - "digit": "- یک عدد", - "symbol": "- یک نماد", - "max": "گذرواژه باید حداکثر ۲۵۵ نویسه داشته باشد" - }, - "password_confirmation": { - "required": "لطفا تأیید گذرواژه را وارد کنید", - "match": "گذرواژه‌ها با هم یکسان نمی‌باشند" - }, - "emails": { - "required": "لطفا حداقل یک رایانامهٔ معتبر وارد کنید", - "list": "لطفا فهرستی از رایانامه‌های معتبر جداشده با ویرگول ارائه دهید (user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "لطفا نام نقش را وارد کنید" - }, - "role": { - "limit": { - "required": "لطفا محدودیت تعداد اتاق را وارد کنید", - "min": "حداقل مجاز ۰ است", - "max": "حداکثر مجاز ۱۰۰ است" - }, - "type": { - "error": "باید یک عدد مشخص کنید" - } - }, - "room": { - "name": { - "required": "لطفا نام اتاق را وارد کنید.", - "min": "نام باید حداقل ۲ نویسه داشته باشد" - } - }, - "room_join": { - "name": { - "required": "لطفا نام خود را وارد کنید." - } - }, - "url": { - "invalid": "نشانی اینترنتی معتبر نیست" - }, - "text_form": { - "value": { - "required": "لطفا یک پیام وارد کنید" - } - } - }, - "room": { - "fields": { - "name": { - "label": "نام اتاق", - "placeholder": "نام اتاق را وارد کنید..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "نام", - "placeholder": "نام خود را وارد کنید" - }, - "access_code": { - "label": "کد دسترسی", - "placeholder": "کد دسترسی را وارد کنید" - }, - "recording_consent": { - "label": "من متوجه هستم که این جلسه ممکن است ضبط شود. این ممکن است شامل صدا و ویدیوی من در صورت فعال‌بودن نیز باشد." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "نام کامل", - "placeholder": "نام کامل خود را وارد کنید" - }, - "email": { - "label": "رایانامه", - "placeholder": "رایانامهٔ خود را وارد کنید" - }, - "password": { - "label": "گذرواژه", - "placeholder": "ایجاد گذرواژه" - }, - "password_confirmation": { - "label": "تأیید گذرواژه", - "placeholder": "تأیید گذرواژه" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "رایانامه", - "placeholder": "رایانامه" - }, - "password": { - "label": "گذرواژه", - "placeholder": "گذرواژه" - }, - "remember_me": { - "label": "مرا به خاطر بسپار" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "گذرواژهٔ فعلی", - "placeholder": "گذرواژهٔ خود را وارد کنید" - }, - "new_password": { - "label": "گذرواژهٔ جدید", - "placeholder": "گذرواژهٔ جدید خود را وارد کنید" - }, - "password_confirmation": { - "label": "تأیید گذرواژه", - "placeholder": "گذرواژهٔ جدید خود را تأیید کنید" - } - }, - "validations": { - "old_password": { - "required": "لطفا گذرواژهٔ کنونی خود را وارد کنید" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "رایانامه", - "placeholder": "رایانامهٔ حساب کاربری را وارد کنید" - } - }, - "validations": { - "email": { - "required": "لطفا رایانامهٔ حساب کاربری را وارد کنید" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "گذرواژهٔ جدید", - "placeholder": "گذرواژهٔ جدید خود را وارد کنید" - }, - "password_confirmation": { - "label": "تأیید گذرواژه", - "placeholder": "گذرواژهٔ جدید خود را تأیید کنید" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "نام کامل" - }, - "email": { - "label": "رایانامه" - }, - "language": { - "label": "زبان" - }, - "role": { - "label": "نقش" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "نام کامل", - "placeholder": "نام کامل کاربر را وارد کنید" - }, - "email": { - "label": "رایانامه", - "placeholder": "رایانامهٔ کاربر را وارد کنید" - }, - "password": { - "label": "گذرواژه", - "placeholder": "گذرواژهٔ کاربر را وارد کنید" - }, - "password_confirmation": { - "label": "تأیید گذرواژه", - "placeholder": "تأیید گذرواژه" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "رایانامه‌ها" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "پیوند را این‌جا وارد کنید...", - "text_placeholder": "متن را این‌جا وارد کنید" - } - } - }, - "roles": { - "fields": { - "name": { - "label": "نام نقش", - "placeholder": "نام نقش را وارد کنید..." - } - } - } - } - } -} diff --git a/app/assets/locales/fr.json b/app/assets/locales/fr.json deleted file mode 100644 index f54c3b85f1..0000000000 --- a/app/assets/locales/fr.json +++ /dev/null @@ -1,735 +0,0 @@ -{ - "start": "Démarrer", - "search": "Rechercher", - "home": "Accueil", - "previous": "Précédent", - "back": "Retour", - "next": "Suivant", - "view": "Voir", - "join": "Rejoindre", - "edit": "Modifier", - "save": "Enregistrer", - "save_changes": "Enregistrer les modifications", - "update": "Mettre à jour", - "report": "Signaler", - "share": "Partager", - "cancel": "Annuler", - "reset": "Réinitialiser", - "close": "Fermer", - "delete": "Supprimer", - "copy": "Copier", - "copy_viewer_code": "Copie du code pour les participants", - "copy_moderator_code": "Copie du code pour les modérateurs", - "or": "Ou", - "online": "En ligne", - "help_center": "Aide", - "are_you_sure": "Etes-vous sûr?", - "return_home": "Retourner à l'accueil", - "created_at": "Créé à", - "view_recordings": "Voir les enregistrements", - "join_session": "Rejoindre une session.", - "no_result_search_input": "Aucun résultat trouvé pour {{ searchInput }}", - "action_permanent": "Cette action ne peut être annulée", - "homepage": { - "welcome_bbb": "Bienvenue sur BigBlueButton.", - "bigbluebutton_description": "BigBlueButton est un système de webconférence dont le code source ouvert et qui est destinée à l'enseignement en ligne. La plateforme permet de profiter au mieux du temps dédié à la formation en favorisant la collaboration et une supervision en temps réel. ", - "greenlight_description": "Créez vos salles et sessions ou rejoignez celles des autres grâce à un lien court et pratique.", - "learn_more": "En apprendre plus sur BigBlueButton", - "explore_features": "Découvrez les fonctionnalités", - "meeting_title": "Commencer une réunion", - "meeting_description": "Démarrez une classe virtuelles avec de la vidéo, de l'audio, du partage d'écran, un chat et tous les outils nécessaires à une formation.", - "recording_title": "Enregistrez vos réunions", - "recording_description": "Enregistrez des conférences dans BigBlueButton et partagez les avec les étudiants pour en étudier les contenus.", - "settings_title": "Gérez vos salles", - "settings_description": "Paramétrez vos salles et chaque réunion pour une salle de classe optimale", - "and_more_title": "Et plus encore!", - "and_more_description": "BigBlueButton propose de outils intégrés pour la formation et est conçu pour vous faire gagner du temps pendant le cours", - "enter_meeting_url": "Veuillez saisir l'URL de votre réunion sur BigBlueButton dans le champ ci-dessous", - "enter_meeting_url_instruction": "Veuillez saisir l'URL de votre réunion BigBlueButton dans le champ ci-dessous." - }, - "authentication": { - "sign_in": "S'identifier", - "sign_up": "S'inscrire", - "sign_out": "Se déconnecter", - "email": "Courriel", - "password": "Mot de passe", - "confirm_password": "Confirmer le mot de passe", - "enter_email": "Saisissez votre courriel", - "enter_name": "Saisissez votre nom complet", - "remember_me": "Se souvenir de moi", - "forgot_password": "Mot de passe oublié ?", - "dont_have_account": "Vous n'avez pas de compte ?", - "create_account": "Créez un compte", - "create_an_account": "Création d'un compte", - "already_have_account": "Vous avez déjà un compte ?" - }, - "user": { - "user": "Utilisateur", - "users": "Utilisateurs", - "name": "Nom", - "email_address": "Adresse de courriel", - "authenticator": "Authentifiant", - "full_name": "Nom complet", - "no_user_found": "Aucun utilisateur trouvé ", - "type_three_characters": "Veuillez taper trois (3) lettres ou plus pour voir d'autres utilisateurs", - "search_not_found": "Aucun utilisateur trouvé", - "profile": { - "profile": "Profil", - "language": "Langue", - "role": "Rôle", - "administrator": "Administrateur", - "guest": "Invité" - }, - "account": { - "account_info": "Informations sur le compte", - "delete_account": "Supprimer le compte", - "change_password": "Changer de mot de passe", - "set_password": "Définissez votre nouveau mot de passe", - "reset_password": "Réinitialiser le mot de passe", - "update_account_info": "Mettre à jour les informations du compte", - "current_password": "Mot de passe actuel", - "new_password": "Nouveau mot de passe", - "confirm_password": "Confirmez le mot de passe", - "permanently_delete_account": "Supprimer définitivement votre compte", - "delete_account_description": "Si vous choisissez de supprimer votre compte, il NE pourra PAS être rétabli. Toutes les informations de votre compte, y compris les paramètres, les salles, et les enregistrements, seront effacés.", - "delete_account_confirmation": "Oui, je veux supprimer mon compte", - "are_you_sure_delete_account": "Etes-vous sûr de vouloir supprimer votre compte ?" - }, - "avatar": { - "upload_avatar": "Téléverser un avatar", - "delete_avatar": "Effacer l'avatar", - "crop_avatar": "Recadrer votre avatar" - }, - "pending": { - "title": "Inscription en attente", - "message": "Merci pour votre inscription! Votre compte et en attente d'approbation par un administrateur." - } - }, - "room": { - "room": "Salle", - "rooms": "Salles", - "room_name": "Nom de la salle", - "add_new_room": "+ Nouvelle salle", - "create_room": "Créer une salle", - "delete_room": "Supprimer une salle", - "create_new_room": "Créer une nouvelle salle", - "enter_room_name": "Saisissez le nom de la salle", - "shared_by": "partagé par", - "last_session": "Dernière session : {{ localizedTime }}", - "no_last_session": "Il n'y a aucune session précédente", - "search_not_found": "Aucune salle trouvée", - "rooms_list_is_empty": "Vous n'avez pas encore de salles!", - "rooms_list_empty_create_room": "Créez votre première salle en cliquant sur le bouton ci-dessous puis en lui donnant un nom", - "meeting": { - "start_meeting": "Commencer la réunion", - "join_meeting": "Rejoindre la réunion", - "meeting_invitation": "Vous avez été invité à rejoindre la réunion", - "meeting_not_started": "La réunion n'a pas encore commencé.", - "join_meeting_automatically": "Vous rejoindrez automatiquement la réunion quand elle débutera", - "recording_consent": "Je reconnais savoir que cette session peut être enregistrée. Le cas échéant ma voix et mon image vidéo pourront apparaître lors de la captation." - }, - "presentation": { - "presentation": "Documents", - "click_to_upload": "Cliquez pour téléverser", - "drag_and_drop": "ou glissez-déposez", - "upload_description": "Téléverser tout document Office ou fichier PDF (d'un volume inférieur à {{size}}). Le délai avant de pouvoir utiliser le fichier varie en fonction de son volume.", - "delete_presentation": "Effacer la présentation", - "are_you_sure_delete_presentation": "Etes-vous sûr de vouloir supprimer cet enregistrement ?" - }, - "shared_access": { - "access": "Accès", - "add_share_access": "+ Partager l'accès", - "share_room_access": "Partager l'accès à la salle", - "add_some_users": "Il est temps d'ajouter quelques utilisateurs !", - "add_some_users_description": "Pour partager cette salle avec de nouveaux utilisateurs, cliquez sur le bouton ci-dessous pour les rechercher ou les sélectionner.", - "delete_shared_access": "Supprimer l'accès partagé", - "are_you_sure_delete_shared_access": "Êtes-vous sûr de vouloir supprimer cet accès partagé ?" - }, - "settings": { - "settings": "Paramètres", - "room_name": "Nom de la salle", - "user_settings": "Paramètres de l'utilisateur", - "allow_room_to_be_recorded": "Permettre les enregistrements dans cette salle", - "require_signed_in": "Seuls les utilisateurs authentifiés peuvent rejoindre la salle", - "require_signed_in_message": "Vous devez vous identifier pour rejoindre la salle", - "require_mod_approval": "L'approbation d'un modérateur est nécessaire pour rejoindre la réunion.", - "allow_any_user_to_start": "Tout utilisateur peut démarrer la réunion", - "all_users_join_as_mods": "Tout utilisateur rejoint la salle en tant que modérateur", - "mute_users_on_join": "Les utilisateurs rejoignent la salle en mode silencieux", - "generate": "Générer", - "access_code": "Code d'accès", - "mod_access_code": "Code d'accès des modérateurs", - "mod_access_code_optional": "Code d'accès des modérateurs (facultatif)", - "access_code_required": "Veuillez saisir le code d'accès", - "wrong_access_code": "Code d'accès erroné", - "generate_viewers_access_code": "Générer un code d'accès pour les auditeurs", - "generate_mods_access_code": "Générer un code d'accès pour les modérateurs", - "server_tag": "Choisir un type de serveur pour cette salle", - "default_tag_name": "Par défaut", - "server_tag_desired": "Demandé", - "server_tag_required": "Exigé", - "are_you_sure_delete_room": "Êtes vous sur de vouloir supprimer cette salle?" - } - }, - "recording": { - "recording": "Enregistrement", - "recordings": "Enregistrements", - "processing": "Enregistrements en cours de traitement...", - "name": "Nom", - "length": "Durée", - "users": "Utilisateurs", - "visibility": "État", - "formats": "Lecture", - "formats_help": "Affiche les types de lecture disponibles (par exemple Présentation ou Vidéo). Cliquer sur un format ouvre l'enregistrement BigBlueButton dans un nouvel onglet.", - "published": "Publiée", - "unpublished": "Non publiée", - "protected": "Protégé", - "public": "Public", - "public_protected": "Public/Protégé", - "visibility_help": { - "title": "Options de visibilité de l'enregistrement", - "public_protected": "Public/Protégé - L'enregistrement est disponible sur la page des enregistrements publics accessible depuis la page Rejoindre la salle. Le lien ne peut être consulté que depuis Greenlight", - "public": "Public - L'enregistrement est disponible sur la page des enregistrements publics accessible depuis la page Rejoindre la salle. Le lien peut être partagé avec n'importe qui", - "protected": "Protégé - L'enregistrement doit être consulté depuis Greenlight", - "published": "Publiée - L'enregistrement est accessible à toute personne disposant du lien", - "unpublished": "Non publiée - L'enregistrement n'est accessible à personne" - }, - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "L'enregistrement est en cours de traitement, cela peu prendre quelques minutes...", - "copy_recording_urls": "Copier l'URL de l'enregistrement", - "recordings_list_empty": "Vous n'avez pas encore d'enregistrements!", - "public_recordings_list_empty": "Il n'y pas encore d'enregistrements publics !", - "recordings_list_empty_description": "Les enregistrements apparaîtront ici dès que vous aurez réalisé la captation d'une réunion", - "public_recordings_list_empty_description": "Les enregistrements apparaitront ici dès qu'ils seront disponibles.", - "delete_recording": "Effacer l'enregistrement", - "are_you_sure_delete_recording": "Etes-vous sûr·e de vouloir supprimer cet enregistrement ?", - "search_not_found": "Aucun enregistrement trouvé" - }, - "admin": { - "admin_panel": "Panneau d'administration", - "manage_users": { - "manage_users": "Gestion des utilisateurs", - "active": "Actif", - "approve": "Approuver", - "decline": "Refuser", - "pending": "En attente", - "banned": "Exclu·e", - "ban": "Exclure", - "unban": "Autoriser le retour", - "unverified": "Non vérifié", - "verify": "Vérifier", - "deleted": "Révoqué", - "invited_tab": "Invité", - "invite_user": "Inviter un utilisateur", - "send_invitation": "Envoyer une invitation", - "enter_user_email": "Saisir le courriel de l'utilisateur", - "new_user": "Nouvel utilisateur", - "add_new_user": "Nouvel utilisateur", - "create_new_user": "Créer un compte utilisateur", - "edit_user": "Modifier le compte utilisateur", - "delete_user": "Supprimer le compte de l'utilisateur", - "users_edit_path": "Utilisateurs/Modifier", - "create_account": "Créer un compte", - "create_room": "Créer une salle", - "create_new_room": "Créer une nouvelle salle", - "user_created_at": "Créé: {{localizedTime}}", - "are_you_sure_delete_account": "Etes vous sûr de vouloir supprimer le compte de {{user.name}} ?", - "delete_account_warning": "Une fois ce compte supprimé il NE pourra PAS être rétabli", - "empty_active_users": "Il n'y pas encore d'utilisateur actif sur ce serveur!", - "empty_active_users_subtext": "Lorsque le statut d'un utilisateur passe à actif, il apparaîtra ici.", - "empty_pending_users": "Il n'y a pas encore d'utilisateur en attente sur ce serveur!", - "empty_pending_users_subtext": "Lorsque le statut d'un utilisateur passe à en attente, il apparaîtra ici.", - "empty_banned_users": "Il n'y pas encore d'utilisateur exclu sur ce serveur!", - "empty_banned_users_subtext": "Lorsque le statut d'un utilisateur passe à exclu, il apparaîtra ici.", - "empty_unverified_users": "Pour l'instant il n'y a aucun utilisateur non vérifié sur ce serveur", - "empty_unverified_users_subtext": "Les utilisateurs non vérifiés apparaîtront ici", - "empty_invited_users": "Il n'y pas encore d'utilisateur invité sur ce serveur!", - "empty_invited_users_subtext": "Lorsque le statut d'un utilisateur passe à invité, il apparaîtra ici.", - "invited": { - "time_sent": "Heure d'envoi", - "valid": "Valide", - "revoke": "Révoquer" - } - }, - "server_rooms": { - "server_rooms": "Salles serveur", - "name": "Nom", - "owner": "Propriétaire", - "room_id": "ID de la salle", - "participants": "Participants", - "status": "Statut", - "running": "En activité", - "not_running": "Inactif", - "active": "Actif", - "current_session": "Session en cours: {{lastSession}}", - "last_session": "Dernière Session: {{localizedTime}}", - "no_meeting_yet": "Pas de réunion pour l'instant", - "delete_server_rooms": "Supprimer la salle du serveur", - "resync_recordings": "Resynchronisation des enregistrements", - "empty_room_list": "Il n'y pas encore de salles sur le serveur!", - "empty_room_list_subtext": "Après leur création, les salles apparaîtront ici." - }, - "server_recordings": { - "server_recordings": "Enregistrements du serveur", - "latest_recordings": "Derniers enregistrements", - "no_recordings_found": "Aucun enregistrement trouvé" - }, - "site_settings": { - "site_settings": "Paramètres du site", - "customize_greenlight": "Personnaliser Greenlight", - "appearance": { - "appearance": "Aspect", - "brand_color": "Couleur du logo", - "regular": "Standard", - "lighten": "Plus clair", - "brand_image": "Logo", - "click_to_upload": "Cliquez pour téléverser", - "drag_and_drop": "ou glissez-déposez", - "upload_brand_image_description": "Téléversez tout fichier PNG, JPG ou SVG (d'un volume inférieur à {{size}}). Le délai avant de pouvoir utiliser le fichier varie en fonction de son volume.", - "remove_branding_image": "Retirer le logo" - }, - "administration": { - "administration": "Administration", - "terms": "Conditions générales", - "privacy": "Règles de confidentialité", - "privacy_policy": "Règles de confidentialité", - "change_term_links": "Modifier les liens vers les conditions générales présentés en bas de page", - "change_privacy_link": "Modifier le lien vers les règles de confidentialité présenté en bas de page", - "helpcenter": "Centre d'aide", - "change_helpcenter_link": " Dans le menu déroulant du profil, modifier le lien vers le centre d'aide", - "maintenance": "Bandeau de maintenance", - "change_maintenance_text": "Modifier le texte du bandeau de maintenance qui apparaît en entête", - "change_url": "Modifier l'URL", - "set_text": "Définir le texte", - "clear_banner": "Effacer le bandeau", - "enter_link": "Saisir le lien ici" - }, - "settings": { - "settings": "Paramètres", - "allow_users_to_share_rooms": "Permettre aux utilisateurs de partager les salles", - "allow_users_to_share_rooms_description": "En réglant sur inactivé, le bouton sera supprimé des options du menu paramètres de chaque salle et cela empêchera les utilisateurs de les partager.", - "allow_users_to_preupload_presentation": "Permettre aux utilisateurs de téléverser les documents de présentations en avance", - "allow_users_to_preupload_presentation_description": "Pour cette salle, les utilisateurs peuvent téléverser un document de présentation à l'avance et l'utiliser par défaut ", - "show_sign_in_on_room_join": "Apposer le lien S'identifier dans Rejoindre la salle", - "show_sign_in_on_room_join_description": "Si l'utilisateur ne s'est pas identifié, un lien pour ce faire apparaît en entrant dans la salle", - "default_visibility": "Lisibilité par défaut des enregistrements", - "default_visibility_description": "La lisibilité choisie s'appliquera à tous les enregistrements ultérieurs", - "session_timeout": "Durée maximum d'une session", - "session_timeout_description": "Vous pouvez configurer la durée max d'une session avec un cookie de connexion de 1 jour, par défaut, ou l'étendre à 7 jours", - "default_session_timeout": "Défaut (1 jour)", - "extended_session_timeout": "Etendu (7 jours)" - }, - "registration": { - "registration": "Inscription", - "role_mapping_by_email": "Configuration des rôles par courriel", - "role_mapping_by_email_description": "Configurer le rôle d'un utilisateur en se servant de son courriel. Doit être au format suivant: role1=email1, role2=email2", - "enter_role_mapping_rule": "Saisir une règle de configuration des rôles", - "resync_on_login": "Resynchroniser les données utilisateur à chaque authentification", - "resync_on_login_description": "Resynchroniser les données utilisateur de Greenlight à chacune de ses connexions, afin qu'elles correspondent toujours avec celles du service d'authentification", - "default_role": "Rôle par défaut", - "default_role_description": "Le rôle par défaut a été attribué aux nouveaux utilisateurs", - "registration_method": "Mode d'inscription", - "registration_method_description": "Modifier la façon dont les utilisateurs s'inscrivent sur le site web", - "registration_methods" : { - "open": "Inscription libre", - "invite": "Rejoindre sur invitation", - "approval": "Approuver/Refuser" - }, - "allowed_domains": "Domaines de courriels autorisés", - "allowed_domains_signup_description": "Pour les connexions, autoriser des domaines de courriels spécifiques", - "enter_allowed_domains_rule" : "Saisissez les domaines autorisés" - } - }, - "room_configuration": { - "room_configuration": "Paramétrage de la salle", - "default": "Optionnel (par défaut: activé)", - "optional": "Optionnel (par défaut: désactivé)", - "enabled": "Forcer l'activation", - "disabled": "Désactivé", - "configurations": { - "allow_room_to_be_recorded": "Autoriser les enregistrements pour cette salle", - "allow_room_to_be_recorded_description": "Permettre aux propriétaires de la salle de préciser s'ils veulent ou non disposer de l'enregistrement. S'ils l'activent ils devront tout de même cliquer sur le bouton \"Enregistrer\" une fois que la session à débuté.", - "require_user_signed_in": "Demander l'identification des utilisateurs pour rejoindre une salle", - "require_user_signed_in_description": "Autoriser uniquement les utilisateurs disposant d'un compte Greenlight à se joindre à une réunion. S'ils ne sont pas authentifiés, ils seront redirigés vers la page d'identification quand ils essayent de rejoindre une salle", - "require_mod_approval": "L'approbation d'un modérateur est nécessaire pour se joindre à une réunion.", - "require_mod_approval_description": "Notifie le modérateur quand un utilisateur tente de rejoindre la salle. Après approbation, l'utilisateur pourra se joindre à la réunion", - "allow_any_user_to_start_meeting": "Permettre à tout utilisateur de lancer une réunion", - "allow_any_user_to_start_meeting_description": "Permettre tout utilisateur de commencer la réunion à tout moment. Par défaut, seul le propriétaire de la salle peut commencer la réunion.", - "allow_users_to_join_as_mods": "Tous les utilisateurs rejoignent la réunion en tant que modérateurs", - "allow_users_to_join_as_mods_description": "Donne à tous les utilisateurs qui se joignent à la réunion les droits de modération", - "mute_users_on_join": "Les utilisateurs se joignent à la réunion en mode silencieux", - "mute_users_on_join_description": "L'utilisateur est mis automatiquement en mode silencieux quand il se joint à une réunion", - "viewer_access_code": "Code d'accès pour un auditeur", - "viewer_access_code_description": "Permet aux propriétaires d'une salle d'obtenir un code alphanumérique qu'ils peuvent partager avec les utilisateurs. S'il est généré, le code sera demandé aux utilisateurs lorsqu'il veulent rejoindre une salle", - "mod_access_code": "Code d'accès pour un modérateur", - "mod_access_code_description": "Autorise les propriétaires de salles à disposer d'un code alphanumérique aléatoire qui peut être partagé avec les utilisateurs. Ce code, s'il est créé, ne sera pas requis et lorsqu'il sera utilisé dans toute conférence de la salle permettra aux utilisateurs de rejoindre comme modérateur." - } - }, - "roles": { - "role": "Rôle", - "roles": "Rôles", - "administrator": "Administrateur", - "guest": "Invité", - "manage_roles": "Gérer les rôles", - "delete_role": "Supprimer le rôle", - "are_you_sure_delete_role": "Êtes-vous sûr de vouloir supprimer ce rôle ?", - "enter_role_name": "Saisissez un nom pour le rôle", - "add_role": "+ Créer un rôle", - "create_role": "Créer un rôle", - "create_new_role": "Créer un nouveau rôle", - "no_role_found": "Aucun rôle trouvé.", - "search_not_found": "Aucun rôle trouvé", - "edit": { - "create_room": "Permettre aux utilisateurs avec ce rôle de créer des salles", - "record": "Permettre aux utilisateurs avec ce rôle d'enregistrer leurs réunions", - "manage_users": "Permettre aux utilisateurs avec ce rôle de gérer les autres utilisateurs", - "manage_rooms": "Permettre aux utilisateurs avec ce rôle de gérer les salles au serveur", - "manage_recordings": "Permettre aux utilisateurs avec ce rôle de gérer les enregistrements au serveur", - "manage_site_settings": "Permettre aux utilisateurs avec ce rôle de gérer les paramètres du site", - "manage_roles": "Permettre aux utilisateurs avec ce rôle de modifier les autres rôles", - "shared_list": "Inclure les utilisateurs avec ce rôle dans le menu déroulant du partage des salles", - "room_limit": "Limite pour la salle", - "email_on_signup": "Recevoir un email quand un nouvel utilisateur s'inscrit", - "allowed_recording_visibility": "Enregistrements autorisés pour la lecture" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Compte utilisateur créé ", - "user_updated": "L'utilisateur a été mis à jour.", - "user_deleted": "L'utilisateur a été supprimé.", - "avatar_updated": "L'avatar a été mis à jour.", - "password_changed": "Votre mot de passe a été mis à jour. Veuillez vous identifier à nouveau.", - "password_updated": "Le mot de passe a été changé.", - "account_activated": "Le compte a été activé avec succès. Veuillez vous connecter à votre compte.", - "activation_email_sent": "Un courriel d'activation a été envoyé.", - "reset_pwd_email_sent": "Un courriel a été envoyé pour une réinitialisation du mot de passe, vérifiez votre boîte de réception." - }, - "session": { - "signed_out": "Vous vous êtes déconnecté avec succès." - }, - "room": { - "room_created": "La salle a été créée.", - "room_updated": "La salle a été mise à jour.", - "room_deleted": "La salle a été supprimée.", - "room_shared": "La salle a été partagée", - "room_unshared": "La salle n'est plus partagée", - "recordings_synced": "Les enregistrements de la salle sont désormais synchronisés", - "room_configuration_updated": "La configuration de la salle a été mise à jour.", - "room_setting_updated": "La configuration de la salle a été mise à jour.", - "presentation_updated": "La présentation a été mise à jour.", - "presentation_deleted": "La présentation a été supprimée.", - "joining_meeting": "En cours de connexion à la conférence...", - "meeting_started": "La conférence a été démarrée.", - "access_code_copied": "Le code d'accès a été copié.", - "access_code_generated": "Le code d'accès a été créé.", - "access_code_deleted": "Le code d'accès a été supprimé.", - "copied_meeting_url": "L'URL de la réunion a été copiée. Le lien peut être utilisé pour rejoindre la réunion.", - "copied_viewer_code": "Le code d'accès du participant est copié", - "copied_moderator_code": "Le code d'accès des modérateurs est copié" - }, - "site_settings": { - "site_setting_updated": "La configuration du site a été mise à jour.", - "brand_color_updated": "La couleur de la marque a été mise à jour.", - "brand_image_updated": "L'image de marque a été actualisée.", - "brand_image_deleted": "L'image de marque a été supprimée.", - "privacy_policy_updated": "Les règles de confidentialité ont été mises à jour", - "helpcenter_updated": "Le lien vers le centre d'aide a été mis à jour", - "terms_of_service_updated": "Les conditions de service ont été mises à jour.", - "maintenance_updated": "Le bandeau de maintenance a été mis à jour", - "allowed_domains_signup_updated": "Les noms de domaines autorisés ont été mis à jour" - }, - "recording": { - "recording_visibility_updated": "La visibilité de l'enregistrement a été mise à jour.", - "recording_name_updated": "Le nom de l'enregistrement a été mis à jour.", - "recording_deleted": "L'enregistrement a été supprimé.", - "copied_urls": "Les URL d'enregistrement ont été copiés." - }, - "role": { - "role_created": "Le rôle a été créé", - "role_updated": "Le rôle a été modifié", - "role_deleted": "Le rôle a été supprimé", - "role_permission_updated": "L'autorisation pour ce rôle a été modifiée" - }, - "invitations": { - "invitation_sent": "L'invitation a été envoyée", - "invitation_revoked": "Une invitation a été révoquée." - } - }, - "error": { - "problem_completing_action": "L'action que vous voulez réaliser n'aboutit pas. Veuillez réessayer", - "server_type_unavailable": "Le type de serveur demandé n'est pas disponible. Veuillez choisir un type de serveur différent dans les paramètres de la salle.", - "file_type_not_supported": "Ce type de fichier n'est pas pris en charge", - "file_size_too_large": "La taille du fichier est trop importante", - "file_upload_error": "Le fichier ne peut pas être téléversé", - "signin_required": "Vous devez vous identifier pour avoir accès à cette page.", - "malware_detected": "Un programme malveillant a été détecté! Le fichier que vous avez téléversé pourrait contenir un programme malveillant. Veuillez vérifier le fichier avant de recommencer.", - "roles": { - "role_assigned": "Ce rôle ne peut être supprimé car il est assigné à au moins un utilisateur." - }, - "users": { - "signup_error": "Une erreur est survenue lors de votre connexion. Veuillez contacter votre administrateur.", - "invalid_invite": "Votre jeton d'invitation est soit non valide soit erroné. Veuillez contacter votre administrateur pour en recevoir un nouveau", - "email_exists": "Il existe déjà un compte avec cette adresse. Veuillez réessayer avec une autre adresse de courriel.", - "old_password": "Le mot de passe que vous avez saisi est erroné", - "pending": "Votre inscription est en attente d'approbation par l'administrateur", - "banned": "Vous n'êtes pas autorisé à accéder à cette application. Veuillez contacter l'administrateur si vous pensez qu'il s'agit d'une erreur." - }, - "rooms": { - "room_limit": "La salle ne peut être créée car la limite du nombre de salles a été atteint." - }, - "session": { - "invalid_credentials": "Le nom d'utilisateur·rice ou le mot de passe sont incorrects. Veuillez vérifier vos identifiants et essayer à nouveau." - } - } - }, - "global_error_page": { - "title": "Erreur", - "message": "Oups ! Quelque chose s'est mal passé. Si l'incident se réitère, veuillez contacter l'administrateur·rice." - }, - "not_found_error_page": { - "title": "404", - "message": "Oups ! La page à laquelle vous voulez accéder n'a pas été trouvée" - }, - "account_activation_page": { - "title": "Activation du compte", - "account_unverified": "Votre compte n'a pas encore été validé.", - "message": "Pour pouvoir utiliser Greenlight, veuillez valider votre compte en suivant les instructions présentes dans le courriel d'activation qui vous a été envoyé.", - "resend_activation_link": "Si vous n'avez pas reçu de courriel d'activation ou si son contenu pose problème, cliquez sur le bouton renvoyer pour le recevoir à nouveau", - "resend_btn_lbl": "Renvoyer la demande de validation" - }, - "forms": { - "validations": { - "full_name": { - "required": "Veuillez saisir un nom complet.", - "min": "Le nom doit comporter 2 caractères au minimum .", - "max": "Le nom ne doit pas comporter plus de 255 caractères." - }, - "email": { - "required": "Veuillez saisir une adresse de courriel.", - "email": "La saisie ne correspond pas au format d'une adresse de courriel.", - "min": "L'adresse de courriel doit comporter 6 caractères au minimum.", - "max": "L'adresse de courriel ne peut contenir plus de 255 caractères." - }, - "password": { - "required": "Veuillez saisir un mot de passe", - "match": "Le mot de passe doit contenir au minimum:", - "min": "- Huit caractères", - "lower": "- Une minuscule", - "upper": "- Une majuscule", - "digit": "- Un chiffre", - "symbol": "- Un caractère spécial", - "max": "Le mot de passe doit contenir 255 caractères au maximum" - }, - "password_confirmation": { - "required": "Veuillez confirmer le mot de passe", - "match": "Les mots de passe sont erronés" - }, - "emails": { - "required": "Veuillez saisir au minimum une adresse de courriel valide", - "list": "Veuillez saisir une liste d'adresses de courriel en séparant chaque adresse par une virgule (utilisateur@utilisateurs.com,utilisateur1@utilisateurs.com,utilisateur2@utilisateurs.com)" - }, - "role_name": { - "required": "Veuillez saisir la dénomination du rôle" - }, - "role": { - "limit": { - "required": "Veuillez saisir le nombre limite pour la salle", - "min": "Le minimum autorisé est 0", - "max": "Le maximum autorisé est 100" - }, - "type": { - "error": "Vous devez stipuler un nombre" - } - }, - "room": { - "name": { - "required": "Veuillez saisir le nom de la salle", - "min": "Le nom doit comporter 2 caractères au minimum " - } - }, - "room_join": { - "name": { - "required": "Veuillez saisir votre nom." - } - }, - "url": { - "invalid": "URL non valide" - }, - "text_form": { - "value": { - "required": "Veuillez saisir un message" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Nom de la salle", - "placeholder": "Saisissez un nom pour la salle..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Nom", - "placeholder": "Saisissez votre nom complet" - }, - "access_code": { - "label": "Code d'accès", - "placeholder": "Saisissez le code d'accès" - }, - "recording_consent": { - "label": "Je reconnais savoir que cette session peut être enregistrée. Le cas échéant ma voix et mon image vidéo pourront apparaître lors de la captation." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Nom complet", - "placeholder": "Saisissez votre nom complet" - }, - "email": { - "label": "Courriel", - "placeholder": "Saisissez votre adresse de courriel" - }, - "password": { - "label": "Mot de passe", - "placeholder": "Créer un mot de passe" - }, - "password_confirmation": { - "label": "Confirmer le mot de passe", - "placeholder": "Confirmer le mot de passe" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Courriel", - "placeholder": "Courriel" - }, - "password": { - "label": "Mot de passe", - "placeholder": "Mot de passe" - }, - "remember_me": { - "label": "Se souvenir de moi" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Mot de passe actuel", - "placeholder": "Saisissez votre mot de passe" - }, - "new_password": { - "label": "Nouveau mot de passe", - "placeholder": "Saisissez votre nouveau de passe" - }, - "password_confirmation": { - "label": "Confirmer le mot de passe", - "placeholder": "Confirmez votre nouveau mot de passe" - } - }, - "validations": { - "old_password": { - "required": "Veuillez saisir votre mot de passe actuel" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Courriel", - "placeholder": "Saisissez l'adresse courriel du compte" - } - }, - "validations": { - "email": { - "required": "Veuillez saisir l'adresse courriel du compte" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Nouveau mot de passe.", - "placeholder": "Saisissez le nouveau mot de passe" - }, - "password_confirmation": { - "label": "Confirmez le mot de passe", - "placeholder": "Confirmez votre nouveau mot de passe" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Nom complet" - }, - "email": { - "label": "Courriel" - }, - "language": { - "label": "Langue" - }, - "role": { - "label": "Rôle" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Nom complet", - "placeholder": "Saisissez le nom complet de l'utilisateur" - }, - "email": { - "label": "Courriel", - "placeholder": "Saisissez l'adresse de courriel de l'utilisateur" - }, - "password": { - "label": "Mot de passe", - "placeholder": "Saisissez le mot de passe de l'utilisateur" - }, - "password_confirmation": { - "label": "Confirmez le mot de passe", - "placeholder": "Confirmez le mot de passe" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Courriels" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Saisir le lien ici...", - "text_placeholder": "Saisissez le texte ici..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Dénomination du rôle", - "placeholder": "Saisir une dénomination pour le rôle..." - } - } - } - } - } -} diff --git a/app/assets/locales/gl.json b/app/assets/locales/gl.json deleted file mode 100644 index a37ef4aed5..0000000000 --- a/app/assets/locales/gl.json +++ /dev/null @@ -1,720 +0,0 @@ -{ - "start": "Comezar", - "search": "Buscar", - "home": "Inicio", - "previous": "Anterior", - "back": "Atrás", - "next": "Seguinte", - "view": "Ver", - "join": "Unirse", - "edit": "Editar", - "save": "Gardar", - "save_changes": "Gardar os cambios", - "update": "Actualizar", - "report": "Informar", - "share": "Compartir", - "cancel": "Cancelar", - "reset": "Restabelecer", - "close": "Pechar", - "delete": "Eliminar", - "copy": "Copiar a ligazón para unirse", - "copy_viewer_code": "Copiar o código do espectador", - "copy_moderator_code": "Copiar o código do moderador", - "or": "Ou", - "online": "En liña", - "help_center": "Centro de axuda", - "are_you_sure": "Confirma isto?", - "return_home": "Volver ao inicio", - "created_at": "Creado en", - "view_recordings": "Ver as gravacións", - "join_session": "Únase á sesión", - "no_result_search_input": "Non foi posíbel atopar ningún resultado para «{{ searchInput }}»", - "action_permanent": "Esta acción non se pode desfacer.", - "homepage": { - "welcome_bbb": "Dámoslle a benvida a BigBlueButton!", - "bigbluebutton_description": "BigBlueButton é un sistema de conferencias web de código aberto para clases en liña. A plataforma maximiza o tempo para a aprendizaxe aplicada ao permitir que o alumnado colabore e reciba comentarios en tempo real.", - "greenlight_description": "Cree as súas propias salas para organizar sesións ou xúntese con outras persoas mediante unha ligazón breve e cómoda.", - "learn_more": "Saiba máis sobre BigBlueButton", - "explore_features": "Coñeza as nosas características", - "meeting_title": "Inicie unha xuntanza", - "meeting_description": "Inicie unha clase virtual con vídeo, son, pantalla compartida, parola e todas as ferramentas necesarias para a aprendizaxe aplicada.", - "recording_title": "Grave as súas xuntanzas", - "recording_description": "Grave as xuntanzas de BigBlueButton e compártaas co alumnado para revisar e reflexionar sobre o material.", - "settings_title": "Xestione as súas salas", - "settings_description": "Configure as súas salas e o os axustes das xuntanzas para estar a cargo dunha aula eficaz.", - "and_more_title": "E máis!", - "and_more_description": "BigBlueButton ofrece ferramentas integradas para a aprendizaxe aplicada e está deseñada para aforrarlle tempo durante as clases.", - "enter_meeting_url": "Introduza o URL da xuntanza", - "enter_meeting_url_instruction": "Introduza o URL da súa xuntanza en BigBlueButton no campo seguinte." - }, - "authentication": { - "sign_in": "Acceder", - "sign_up": "Rexistrarse", - "sign_out": "Saír", - "email": "Correo-e", - "password": "Contrasinal", - "confirm_password": "Confirme o contrasinal", - "enter_email": "Introduza o seu correo-e", - "enter_name": "Introduza o seu nome", - "remember_me": "Lembrarme", - "forgot_password": "Esqueceu o contrasinal?", - "dont_have_account": "Non ten unha conta?", - "create_account": "Cree unha conta", - "create_an_account": "Crear unha conta", - "already_have_account": "Xa ten unha conta?" - }, - "user": { - "user": "Usuario", - "users": "Usuarios", - "name": "Nome", - "email_address": "Enderezo de correo-e", - "authenticator": "Autenticador", - "full_name": "Nome completo", - "no_user_found": "Non se atopou ningún usuario", - "type_three_characters": "Escriba tres (3) caracteres ou máis para amosar os outros usuarios.", - "search_not_found": "Non se atopou ningún usuario", - "profile": { - "profile": "Perfil", - "language": "Idioma", - "role": "Rol", - "administrator": "Administrador", - "guest": "Convidado" - }, - "account": { - "account_info": "Información da conta", - "delete_account": "Eliminar a conta", - "change_password": "Cambiar o contrasinal", - "set_password": "Defina o seu novo contrasinal", - "reset_password": "Restabelecer o contrasinal", - "update_account_info": "Actualizar a información da conta", - "current_password": "Contrasinal actual", - "new_password": "Novo contrasinal", - "confirm_password": "Confirmar o contrasinal", - "permanently_delete_account": "Eliminar definitivamente a súa conta", - "delete_account_description": "Se decide eliminar a súa conta, NON será recuperábel. \n Eliminarase toda a información relativa á súa conta, incluídos os axustes, as salas e as gravacións.", - "delete_account_confirmation": "Si, quero eliminar a miña conta", - "are_you_sure_delete_account": "Confirma que quere eliminar a súa conta?" - }, - "avatar": { - "upload_avatar": "Enviar o avatar", - "delete_avatar": "Eliminar o avatar", - "crop_avatar": "Recortar o seu avatar" - }, - "pending": { - "title": "Agardando polo rexistro", - "message": "Grazas por rexistrarse! A súa conta está pendente da aprobación por un administrador." - } - }, - "room": { - "room": "Sala", - "rooms": "Salas", - "room_name": "Nome da sala", - "add_new_room": "+ Nova sala", - "create_room": "Crear unha sala", - "delete_room": "Eliminar a sala", - "create_new_room": "Crear unha nova sala", - "enter_room_name": "Introduza o nome da sala", - "shared_by": "compartida por ", - "last_session": "Última sesión: {{ localizedTime }}", - "no_last_session": "Non foi creada creou ningunha sesión anterior", - "search_not_found": "Non se atopou ningunha sala", - "rooms_list_is_empty": "Vde. aínda non ten salas!", - "rooms_list_empty_create_room": "Cree a súa primeira sala premendo no botón de embaixo e introducindo o nome da sala.", - "meeting": { - "start_meeting": "Comezar a xuntanza", - "join_meeting": "Unirse á xuntanza", - "meeting_invitation": "Convidárono a unirse", - "meeting_not_started": "A xuntanza aínda non comezou", - "join_meeting_automatically": "Unirase automaticamente cando comece a xuntanza", - "recording_consent": "Recoñezo que esta sesión pode ser gravada. Isto pode incluír a miña voz e vídeo se está activado." - }, - "presentation": { - "presentation": "Presentación", - "click_to_upload": "Prema para enviar", - "drag_and_drop": " ou arrastre e solte", - "upload_description": "Envíe calquera documento de oficina ou ficheiro PDF (non maior que {{size}}). Dependendo do tamaño do ficheiro, pode requirir un tempo adicional para envialo antes de poder utilizalo", - "delete_presentation": "Eliminar presentación", - "are_you_sure_delete_presentation": "Confirma que quere eliminar esta presentación?" - }, - "shared_access": { - "access": "Acceso", - "add_share_access": "+ Compartir o acceso", - "share_room_access": "Compartir o acceso á sala", - "add_some_users": "É o momento de engadir algúns usuarios!", - "add_some_users_description": "Para engadir novos usuarios, prema no botón de embaixo e busque ou seleccione os usuarios cos que quere compartir esta sala.", - "delete_shared_access": "Eliminar o acceso compartido", - "are_you_sure_delete_shared_access": "Confirma que quere eliminar este acceso compartido?" - }, - "settings": { - "settings": "Axustes", - "room_name": "Nome da sala", - "user_settings": "Axustes de usuario", - "allow_room_to_be_recorded": "Permitir que se grave a sala", - "require_signed_in": "Precisar que os usuarios se autentiquen antes de unirse", - "require_signed_in_message": "Ten que autenticarse para unirse a esta sala.", - "require_mod_approval": "Precisar a aprobación do moderador antes de unirse", - "allow_any_user_to_start": "Permitir que calquera usuario inicie esta xuntanza", - "all_users_join_as_mods": "Todos os usuarios únense como moderadores", - "mute_users_on_join": "Silenciar os usuarios cando se unan", - "generate": "Xerar", - "access_code": "Código de acceso", - "mod_access_code": "Código de acceso de moderador", - "mod_access_code_optional": "Código de acceso de moderador (opcional)", - "access_code_required": "Introduza o código de acceso", - "wrong_access_code": "Código de acceso incorrecto", - "generate_viewers_access_code": "Xerar un código de acceso para os espectadores", - "generate_mods_access_code": "Xerar un código de acceso para os moderadores", - "server_tag": "Seleccione un tipo de servidor para esta sala", - "default_tag_name": "Predeterminado", - "server_tag_desired": "Desexado", - "server_tag_required": "Obrigatorio", - "are_you_sure_delete_room": "Confirma que quere eliminar esta sala?" - } - }, - "recording": { - "recording": "Gravación", - "recordings": "Gravacións", - "processing": "Procesando as gravacións…", - "name": "Nome", - "length": "Duración", - "users": "Usuarios", - "visibility": "Visibilidade", - "formats": "Formatos", - "published": "Publicada", - "unpublished": "Sen publicar", - "protected": "Protexida", - "public": "Publica", - "public_protected": "Publica/protexida", - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "Procesando a gravación, isto pode levar varios minutos…", - "copy_recording_urls": "Copiar o(s) URL da(s) gravación(s)", - "recordings_list_empty": "Vde. aínda non ten ningunha gravación!", - "public_recordings_list_empty": "Aínda non hai gravacións públicas!", - "recordings_list_empty_description": "As gravacións aparecerán aquí após iniciar unha xuntanza e gravala.", - "public_recordings_list_empty_description": "As gravacións aparecerán aquí cando estean dispoñíbeis.", - "delete_recording": "Eliminar a gravación", - "are_you_sure_delete_recording": "Confirma que quere eliminar esta gravación?", - "search_not_found": "Non se atopou ningunha gravación" - }, - "admin": { - "admin_panel": "Panel de administración", - "manage_users": { - "manage_users": "Xestionar os usuarios", - "active": "Activo", - "approve": "Aprobar", - "decline": "Declinar", - "pending": "Pendente", - "banned": "Expulsado", - "ban": "Expulsar", - "unban": "Anular a expulsión", - "deleted": "Eliminado", - "invited_tab": "Convidado", - "invite_user": "Convidar a usuario", - "send_invitation": "Enviar convite", - "enter_user_email": "Introduza o correo do usuario", - "new_user": "Novo usuario", - "add_new_user": "Novo usuario", - "create_new_user": "Crear un novo usuario", - "edit_user": "Editar o usuario", - "delete_user": "Eliminar o usuario", - "users_edit_path": "Usuarios/editar", - "create_account": "Cree unha conta", - "create_room": "Crear unha sala", - "create_new_room": "Crear unha nova sala", - "user_created_at": "Creada: {{localizedTime}}", - "are_you_sure_delete_account": "Confirma que quere eliminar a conta de {{user.name}}?", - "delete_account_warning": "Se decide eliminar esta conta, NON será recuperábel.", - "empty_active_users": "Aínda non hai usuarios activos neste servidor!", - "empty_active_users_subtext": "Cando o estado dun usuario cambia a activo, aparece aquí.", - "empty_pending_users": "Aínda non hai usuarios pendentes neste servidor!", - "empty_pending_users_subtext": "Cando o estado dun usuario cambia a pendente, aparece aquí.", - "empty_banned_users": "Aínda non hai usuarios expulsados neste servidor!", - "empty_banned_users_subtext": "Cando o estado dun usuario cambia a expulsado, aparece aquí.", - "empty_invited_users": "Aínda non hai usuarios convidados neste servidor!", - "empty_invited_users_subtext": "Cando o estado dun usuario cambia a convidado, aparece aquí.", - "invited": { - "time_sent": "Hora de envío", - "valid": "Valida", - "revoke": "Revogar" - } - }, - "server_rooms": { - "server_rooms": "Salas no servidor", - "name": "Nome", - "owner": "Propietario", - "room_id": "ID da sala", - "participants": "Participantes", - "status": "Estado", - "running": "En progreso", - "not_running": "Sen actividade", - "active": "Activa", - "current_session": "Sesión actual: {{lastSession}}", - "last_session": "Última sesión: {{localizedTime}}", - "no_meeting_yet": "Aínda non hai xuntanzas.", - "delete_server_rooms": "Eliminar a sala do servidor", - "resync_recordings": "Volver sincronizar as gravacións", - "empty_room_list": "Aínda non hai salas no servidor!", - "empty_room_list_subtext": "As salas aparecerán aquí após crear a súa primeira sala." - }, - "server_recordings": { - "server_recordings": "Gravacións no servidor", - "latest_recordings": "Últimas gravacións", - "no_recordings_found": "Non se atopou ningunha gravación" - }, - "site_settings": { - "site_settings": "Axustes do sitio", - "customize_greenlight": "Personalizar Greenlight", - "appearance": { - "appearance": "Aparencia", - "brand_color": "Cor corporativa", - "regular": "Normal", - "lighten": "Claro", - "brand_image": "Imaxe corporativa", - "click_to_upload": "Prema para enviar", - "drag_and_drop": " ou arrastre e solte", - "upload_brand_image_description": "Envíe calquera ficheiro PNG, JPG, ou SVG (non maior que {{size}}). Dependendo do tamaño do ficheiro, pode requirir un tempo adicional para envialo antes de poder utilizalo", - "remove_branding_image": "Retirar a imaxe corporativa" - }, - "administration": { - "administration": "Administración", - "terms": "Terms & Conditions", - "privacy": "Aviso de privacidade", - "privacy_policy": "Aviso de privacidade", - "change_term_links": "Cambiar as ligazóns das condicións que aparecen na parte inferior da páxina", - "change_privacy_link": "Cambiar a ligazón de privacidade que aparece na parte inferior da páxina", - "helpcenter": "Centro de axuda", - "change_helpcenter_link": "Cambiar a ligazón do centro de axuda que aparece baixo o menú despregábel do perfil", - "maintenance": "Báner de mantemento", - "change_maintenance_text": "Cambiar o texto do báner de mantemento que aparece na cabeceira", - "change_url": "Cambiar o URL", - "set_text": "Definir o texto", - "clear_banner": "Limpar o báner", - "enter_link": "Introduza aquí a ligazón" - }, - "settings": { - "settings": "Axustes", - "allow_users_to_share_rooms": "Permitir aos usuarios compartir salas", - "allow_users_to_share_rooms_description": "Se o axusta como desactivado, o botón desaparecerá do menú despregábel de opcións de sala, o que impedirá que os usuarios compartan salas", - "allow_users_to_preupload_presentation": "Permitir aos usuarios enviar previamente presentacións", - "allow_users_to_preupload_presentation_description": "Os usuarios poden enviar previamente unha presentación para utilizala como presentación predeterminada para esa sala específica", - "default_visibility": "Visibilidade de gravación predeterminada", - "default_visibility_description": "Todas as gravacións creadas recentemente terán esta visibilidade de xeito predeterminado defecto", - "session_timeout": "Tempo de espera da sesión", - "session_timeout_description": "Pode configurar o tempo de espera da sesión cunha cookie predeterminada de 1 día ou unha cookie de sesión ampliada de 7 días", - "default_session_timeout": "Predeterminada (1 día)", - "extended_session_timeout": "Ampliada (7 días)" - }, - "registration": { - "registration": "Rexistro", - "role_mapping_by_email": "Asignación de roles por correo", - "role_mapping_by_email_description": "Asigne o usuario a un rol usando o seu correo-e. Debe ter o formato: rol1=correo-e1, rol2=correo-e2", - "enter_role_mapping_rule": "Introduza unha regra de asignación de roles", - "resync_on_login": "Volver sincronizar os datos do usuario en cada acceso", - "resync_on_login_description": "Volver sincronizar a información dun usuario cada vez que acceda, facendo que o provedor de autenticación externo coincida sempre coa información en Greenlight", - "default_role": "Rol predeterminado", - "default_role_description": "O rol predeterminado que se asignará aos usuarios que vén de crear", - "registration_method": "Método de rexistro", - "registration_method_description": "Cambiar o xeito no que os usuarios se rexistran no sitio web", - "registration_methods" : { - "open": "Rexistro aberto", - "invite": "Unirse por convite", - "approval": "Aceptar/declinar" - }, - "allowed_domains": "Dominios de correo-e permitidos", - "allowed_domains_signup_description": "Permitir o rexistro con dominios de correo-e específicos. O formato debe ser: @proba.com,dominio.com", - "enter_allowed_domains_rule" : "Introduza os dominios permitidos" - } - }, - "room_configuration": { - "room_configuration": "Configuración da sala", - "default": "Opcional (predeterminado: activado)", - "optional": "Opcional (predeterminado: desactivado)", - "enabled": "Forzar a activado", - "disabled": "Desactivado", - "configurations": { - "allow_room_to_be_recorded": "Permitir que se grave a sala", - "allow_room_to_be_recorded_description": "Permite aos propietarios das salas especificar se queren a opción de gravar unha sala ou non. Se está activado, o moderador aínda debe premer no botón «Gravar» unha vez que comece a xuntanza.", - "require_user_signed_in": "Precisar que os usuarios se autentiquen antes de unirse", - "require_user_signed_in_description": "Só permite que os usuarios cunha conta Greenlight se unan á reunión. Se non se autenticaron, serán redirixidos á páxina de acceso cando tenten unirse a unha sala.", - "require_mod_approval": "Precisar a aprobación do moderador antes de unirse", - "require_mod_approval_description": "Avisar ao moderador da xuntanza de BigBlueButton cando un usuario tenta unirse. Se o usuario é aprobado, poderá unirse á reunión.", - "allow_any_user_to_start_meeting": "Permitir que calquera usuario inicie unha xuntanza", - "allow_any_user_to_start_meeting_description": "Permitir que calquera usuario inicie a xuntanza en calquera momento. De xeito predeterminado, só o propietario da sala pode iniciar a xuntanza.", - "allow_users_to_join_as_mods": "Todos os usuarios únense como moderadores", - "allow_users_to_join_as_mods_description": "Concede a todos os usuarios os privilexios de moderador en BigBlueButton cando se unen á xuntanza", - "mute_users_on_join": "Silenciar os usuarios cando se unan", - "mute_users_on_join_description": "Silenciar automaticamente ao usuario cando se une á xuntanza de BigBlueButton", - "viewer_access_code": "Código de acceso de espectador", - "viewer_access_code_description": "Permite aos propietarios das salas ter un código alfanumérico ao chou que poden compartir cos usuarios. O código, se se xera, será necesario para que os usuarios se unan ás xuntanzas da sala.", - "mod_access_code": "Código de acceso de moderador", - "mod_access_code_description": "Permite aos propietarios das salas ter un código alfanumérico ao chou que poden compartir cos usuarios. O código, se se xera, non será necesario para unirse e, cando se use en calquera xuntanza da sala, o usuario será promovido a moderador." - } - }, - "roles": { - "role": "Rol", - "roles": "Roles", - "administrator": "Administrador", - "guest": "Convidado", - "manage_roles": "Xestionar os roles", - "delete_role": "Eliminar o rol", - "are_you_sure_delete_role": "Confirma que quere eliminar este rol?", - "enter_role_name": "Introduza un nome de rol", - "add_role": "+ Crear un rol", - "create_role": "Crear un rol", - "create_new_role": "Crear un novo rol", - "no_role_found": "Non se atopou ningún rol", - "search_not_found": "Non se atopou ningún rol", - "edit": { - "create_room": "Permitir que os usuarios con este rol creen salas", - "record": "Permitir que os usuarios con este rol graven as súas xuntanzas", - "manage_users": "Permitir que usuarios con este rol xestionen os usuarios", - "manage_rooms": "Permitir que os usuarios con este rol xestionen salas de servidores", - "manage_recordings": "Permitir que os usuarios con este rol xestionen as gravacións do servidor", - "manage_site_settings": "Permitir que os usuarios con este rol xestionen os axustes do sitio", - "manage_roles": "Permitir que os usuarios con este rol editen outros roles", - "shared_list": "Incluir os usuarios con este rol no menú despregábel para compartir salas", - "room_limit": "Límite de salas", - "email_on_signup": "Recibir un correo-e cando se rexistre un novo usuario", - "allowed_recording_visibility": "Visibilidades de gravación permitidas" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Creouse un novo usuario.", - "user_updated": "O usuario foi actualizado.", - "user_deleted": "O usuario foi eliminado.", - "avatar_updated": "O avatar foi actualizado.", - "password_changed": "O seu contrasinal foi actualizado correctamente. Acceda de novo.", - "password_updated": "O contrasinal foi actualizado.", - "account_activated": "A súa conta foi activada.", - "activation_email_sent": "Enviouse un correo que contén as instrucións para activar a súa conta.", - "reset_pwd_email_sent": "Enviouse un correo que contén as instrucións para restabelecer o seu contrasinal." - }, - "session": { - "signed_out": "Vde. saíu da sesión." - }, - "room": { - "room_created": "Creouse unha nova sala.", - "room_updated": "A sala foi actualizada", - "room_deleted": "A sala foi eliminada.", - "room_shared": "A sala foi compartida", - "room_unshared": "A sala non está compartida", - "recordings_synced": "Sincronizáronse as gravacións da sala.", - "room_configuration_updated": "Foi actualizada a configuración da sala.", - "room_setting_updated": "Foron actualizados os axustes da sala. ", - "presentation_updated": "Foi actualizada a presentación", - "presentation_deleted": "A presentación foi eliminada", - "joining_meeting": "Uníndose á xuntanza…", - "meeting_started": "Comezou a xuntanza", - "access_code_copied": "O código de acceso foi copiado.", - "access_code_generated": "Xerouse un novo código de acceso.", - "access_code_deleted": "O código de acceso foi eliminado.", - "copied_meeting_url": "Copiouse o URL da xuntanza. Pódese empregar a ligazón para unirse á xuntanza.", - "copied_viewer_code": "Copiouse o código de acceso do espectador.", - "copied_moderator_code": "Copiouse o código de acceso do moderador." - }, - "site_settings": { - "site_setting_updated": "Foron actualizados os axustes do sitio.", - "brand_color_updated": "A cor corporativa foi actualizada.", - "brand_image_updated": "A imaxe corporativa foi actualizada.", - "brand_image_deleted": "A imaxe corporativa foi eliminada.", - "privacy_policy_updated": "O aviso de pivacidade foi actualizado.", - "helpcenter_updated": "Actualizouse a ligazón do centro de axuda.", - "terms_of_service_updated": "Actualizáronse as condicións do servizo.", - "maintenance_updated": "Actualizouse o báner de mantemento.", - "allowed_domains_signup_updated": "Foron actualizados os dominios de correo-e permitidos." - }, - "recording": { - "recording_visibility_updated": "Foi actualizada a visibilidade da gravación.", - "recording_name_updated": "Foi actualizado o nome da gravación.", - "recording_deleted": "A gravación foi eliminada.", - "copied_urls": "Copiáronse os URL das gravacións." - }, - "role": { - "role_created": "Creouse un novo rol", - "role_updated": "O rol foi actualizado.", - "role_deleted": "O rol foi eliminado.", - "role_permission_updated": "Foron actualizados os permisos de rol." - }, - "invitations": { - "invitation_sent": "Enviouse un convite", - "invitation_revoked": "Foi revogado un convite" - } - }, - "error": { - "problem_completing_action": "Non é posíbel completar a acción.\n Tenteo de novo.", - "server_type_unavailable": "O tipo de servidor requirido non está dispoñíbel. Seleccione un tipo diferente nos axustes da sala.", - "file_type_not_supported": "O tipo de ficheiro non é compatible.", - "file_size_too_large": "O ficheiro é demasiado grande.", - "file_upload_error": "Non é posíbel enviar o ficheiro.", - "signin_required": "Ten que autenticarse para acceder a esta páxina.", - "malware_detected": "Detectouse código malicioso! O ficheiro que enviou pode conter códio malicioso. Comprobe o seu ficheiro e ténteo de novo.", - "roles": { - "role_assigned": "Non é posíbel eliminar este rol porque está asignado a polo menos un usuario." - }, - "users": { - "signup_error": "Non é posíbel autenticalo. Póñase en contacto coa administración do sitio.", - "invalid_invite": "O seu testemuño de convite non é válido ou é incorrecto. Póñase en contacto coa administración do sitio para recibir un novo testemuño.", - "email_exists": "Xa existe unha conta con este correo Ténteo de novo con outro correo.", - "old_password": "O contrasinal que introduciu non é correcto.", - "pending": "O seu rexistro está pendente da aprobación pola administración. Volva tentalo máis adiante.", - "banned": "Non ten acceso a esta aplicación. Póñase en contacto coa administración do sitio se cree que se trata dun erro." - }, - "rooms": { - "room_limit": "Non é posíbel crear a sala porque se alcanzou o límite de salas." - }, - "session": { - "invalid_credentials": "Ou o nome de usuario ou o contrasinal non é válido. Verifique as súas credenciais e ténteo de novo." - } - } - }, - "global_error_page": { - "title": "Erro", - "message": "Sentímolo, algo foi mal. Se o incidente ocorre de novo, póñase en contacto coa administración do sitio." - }, - "not_found_error_page": { - "title": "Non se atopou a páxina", - "message": "Sentímolo, non é posíbel atopar a páxina á que está tentando acceder." - }, - "account_activation_page": { - "title": "Activación da conta", - "account_unverified": "A súa conta aínda non foi verificada.", - "message": "Para usar Greenlight, verifique a súa conta seguindo as instrucións do correo de activación que se lle enviou.", - "resend_activation_link": "Se non recibiu un correo de activación ou ten problemas para usalo, prema no botón de embaixo para solicitar un novo correo de activación.", - "resend_btn_lbl": "Volver enviar a verificación" - }, - "forms": { - "validations": { - "full_name": { - "required": "Introduza un nome completo", - "min": "O nome debe ter polo menos 2 caracteres", - "max": "O nome pode ter como máximo 255 caracteres" - }, - "email": { - "required": "Introduza un correo", - "email": "O valor introducido non coincide co formato de correo-e", - "min": "O correo electrónico debe ter polo menos 6 caracteres", - "max": "O nome correo ter como máximo 255 caracteres" - }, - "password": { - "required": "Introduza un contrasinal", - "match": "O contrasinal debe ter polo menos:", - "min": "– Oito caracteres", - "lower": "– Unha letra minúscula", - "upper": "– Unha letra maiúscula", - "digit": "– Un número", - "symbol": "– Un símbolo", - "max": "O contrasinal pode ter como máximo 255 caracteres" - }, - "password_confirmation": { - "required": "Introduza unha confirmación do contrasinal", - "match": "Os contrasinais non coinciden" - }, - "emails": { - "required": "Introduza polo menos un correo-e válido", - "list": "Forneza unha lista de correos válidos separados por comas (usuario@usuarios.com, usuario1@usuarios.com, usuario2@usuarios.com)" - }, - "role_name": { - "required": "Introduza o nome do rol" - }, - "role": { - "limit": { - "required": "Introduza o límite do número de salas", - "min": "O mínimo permitido é 0", - "max": "O máximo permitido é 100" - }, - "type": { - "error": "Debes especificar un número" - } - }, - "room": { - "name": { - "required": "Introduza o nome da sala.", - "min": "O nome debe ter polo menos 2 caracteres" - } - }, - "room_join": { - "name": { - "required": "Introduza o seu nome." - } - }, - "url": { - "invalid": "URL incorrecto" - }, - "text_form": { - "value": { - "required": "Introduza algunha mensaxe" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Nome da sala", - "placeholder": "Introduza un nome de sala…" - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Nome", - "placeholder": "Introduza o seu nome" - }, - "access_code": { - "label": "Código de acceso", - "placeholder": "Introduza o código de acceso" - }, - "recording_consent": { - "label": "Recoñezo que esta sesión pode ser gravada. Isto pode incluír a miña voz e vídeo se está activado." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Nome completo", - "placeholder": "Introduza o seu nome completo" - }, - "email": { - "label": "Correo-e", - "placeholder": "Introduza o seu correo-e" - }, - "password": { - "label": "Contrasinal", - "placeholder": "Crear un contrasinal" - }, - "password_confirmation": { - "label": "Confirmar o contrasinal", - "placeholder": "Confirmar o contrasinal" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Correo-e", - "placeholder": "Correo-e" - }, - "password": { - "label": "Contrasinal", - "placeholder": "Contrasinal" - }, - "remember_me": { - "label": "Lembrarme" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Contrasinal actual", - "placeholder": "Introduza o seu contrasinal" - }, - "new_password": { - "label": "Novo contrasinal", - "placeholder": "Introduza o seu contrasinal" - }, - "password_confirmation": { - "label": "Confirmar o contrasinal", - "placeholder": "Confirmar o seu novo contrasinal" - } - }, - "validations": { - "old_password": { - "required": "Introduza o seu contrasinal actual" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Correo-e", - "placeholder": "Introduza o correo da conta" - } - }, - "validations": { - "email": { - "required": "Introduza o correo da conta" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Novo contrasinal", - "placeholder": "Introduza o seu novo contrasinal" - }, - "password_confirmation": { - "label": "Confirmar o contrasinal", - "placeholder": "Confirmar o seu novo contrasinal" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Nome completo" - }, - "email": { - "label": "Correo-e" - }, - "language": { - "label": "Idioma" - }, - "role": { - "label": "Rol" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Nome completo", - "placeholder": "Introduza o nome completo do usuario" - }, - "email": { - "label": "Correo-e", - "placeholder": "Introduza o correo do usuario" - }, - "password": { - "label": "Contrasinal", - "placeholder": "Introduza o contrasinal do usuario" - }, - "password_confirmation": { - "label": "Confirmar o contrasinal", - "placeholder": "Confirmar o contrasinal" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Correos-e" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Introduza aquí a ligazón…", - "text_placeholder": "Introduza aquí o texto…" - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Nome do rol", - "placeholder": "Introduza un nome de rol…" - } - } - } - } - } -} diff --git a/app/assets/locales/hu.json b/app/assets/locales/hu.json deleted file mode 100644 index 9a1fef7ed6..0000000000 --- a/app/assets/locales/hu.json +++ /dev/null @@ -1,726 +0,0 @@ -{ - "start": "Indítás", - "search": "Keresés", - "home": "Kezdőlap", - "previous": "Előző", - "back": "Vissza", - "next": "Következő", - "view": "Nézet", - "join": "Csatlakozás", - "edit": "Szerkesztés", - "save": "Mentés", - "save_changes": "Változások mentése", - "update": "Frissítés", - "report": "Jelentés", - "share": "Megosztás", - "cancel": "Mégse", - "reset": "Reszetelés", - "close": "Bezárás", - "delete": "Törlés", - "copy": "Másolás", - "copy_viewer_code": "Megtekintési kód másolása", - "copy_moderator_code": "Moderátor kód másolása", - "or": "Vagy", - "online": "Online", - "help_center": "Súgóközpont", - "are_you_sure": "Biztos benne?", - "return_home": "Vissza a kezdőlapra", - "created_at": "Létrehozva:", - "view_recordings": "Felvételek megtekintése", - "join_session": "Csatlakozás a munkamenethez", - "no_result_search_input": "Nincs találat a következőre: „{{ searchInput }}”", - "action_permanent": "Ez a művelet nem vonható vissza.", - "homepage": { - "welcome_bbb": "Üdvözli a BigBlueButton.", - "bigbluebutton_description": "A BigBlueButton egy nyílt forráskódú webes konferencia-rendszer online órákhoz. A platform maximalizálja a tanulásra fordított időt azáltal, hogy lehetővé teszi, hogy a tanulók együttműködjenek és valós idejű visszajelzést kapjanak.", - "greenlight_description": "Hozza létre a saját szobáit, hogy munkameneteket hozzon létre, vagy csatlakozzon másokhoz egy rövid és kényelmes hivatkozással", - "learn_more": "Tudjon meg többet a BigBlueButtonről", - "explore_features": "Fedezze fel a funkcióinkat", - "meeting_title": "Indítson egy találkozót", - "meeting_description": "Indítson egy virtuális órát videóval, hanggal, képernyőmegosztással, csevegéssel és az alkalmazott tanuláshoz szükséges összes eszközzel.", - "recording_title": "Vegye fel a találkozóit", - "recording_description": "Vegye fel a BigBlueButton-találkozókat és ossza meg őket a tanulókkal, hogy átnézzék és átgondolják az anyagot.", - "settings_title": "Kezelje a szobáit", - "settings_description": "Állítsa be úgy a szobáit és a találkozókat, mintha egy valódi osztályterem vezetője legyen.", - "and_more_title": "És még sok más!", - "and_more_description": "A BigBlueButton az alkalmazott tanuláshoz használható beépített eszközöket tartalmaz, melyekkel időt spórolhat meg az órák során.", - "enter_meeting_url": "Adja meg a találkozó webcímét", - "enter_meeting_url_instruction": "Adja meg a BigBlueButton-találkozó webcímét a lenti mezőbe." - }, - "authentication": { - "sign_in": "Bejelentkezés", - "sign_up": "Regisztráció", - "sign_out": "Kijelentkezés", - "email": "E-mail", - "password": "Jelszó", - "confirm_password": "Jelszó megerősítése", - "enter_email": "Adja meg az e-mail-címét", - "enter_name": "Adja meg a nevét", - "remember_me": "Bejelentkezés megjegyzése", - "forgot_password": "Elfelejtette a jelszavát?", - "dont_have_account": "Nincs fiókja?", - "create_account": "Fiók létrehozása", - "create_an_account": "Egy fiók létrehozása", - "already_have_account": "Már van fiókja?" - }, - "user": { - "user": "Felhasználó", - "users": "Felhasználók", - "name": "Név", - "email_address": "E-mail-cím", - "authenticator": "Hitelesítő", - "full_name": "Teljes név", - "no_user_found": "Nem található felhasználó", - "type_three_characters": "Írjon be három (3) vagy annál több karaktert, hogy megjelenítse a többi felhasználót.", - "search_not_found": "Nem találhatók felhasználók", - "profile": { - "profile": "Profil", - "language": "Nyelv", - "role": "Szerepkör", - "administrator": "Adminisztrátor", - "guest": "Vendég" - }, - "account": { - "account_info": "Fiókinformációk", - "delete_account": "Fiók törlése", - "change_password": "Jelszó módosítása", - "set_password": "Adja meg új jelszavát", - "reset_password": "Jelszó visszaállítása", - "update_account_info": "Saját fiókinformációk frissítése", - "current_password": "Jelenlegi jelszó", - "new_password": "Új jelszót", - "confirm_password": "Jelszó megerősítése", - "permanently_delete_account": "Saját fiók végleges törlése", - "delete_account_description": "Ha a fiókja törlését választja, akkor többé NEM állítható helyre. \n Az összes fiókkal kapcsolatos információja, a beállításokkal és szobákkal együtt, el lesz távolítva.", - "delete_account_confirmation": "Igen, törlöm a saját fiókomat", - "are_you_sure_delete_account": "Biztos, hogy törli a saját fiókját?" - }, - "avatar": { - "upload_avatar": "Profilkép feltöltése", - "delete_avatar": "Profilkép törlése", - "crop_avatar": "Profilkép levágása" - }, - "pending": { - "title": "Függőben lévő regisztráció", - "message": "Köszönjük, hogy regisztrált! A fiókja jelenleg adminisztrátori jóváhagyásra vár." - } - }, - "room": { - "room": "Szoba", - "rooms": "Szobák", - "room_name": "Szoba neve", - "add_new_room": "+ Új szoba", - "create_room": "Szoba létrehozása", - "delete_room": "Szoba törlése", - "create_new_room": "Új szoba létrehozása", - "enter_room_name": "Adja meg a szoba nevét", - "shared_by": "megosztotta", - "last_session": "Legutóbbi munkamenet: {{ room.last_session }}", - "no_last_session": "Nem voltak munkamenetek létrehozva", - "search_not_found": "Nem találhatók szobák", - "rooms_list_is_empty": "Még nincs egy szobája sem.", - "rooms_list_empty_create_room": "Hozzá létre az első szobáját a lenti gombra kattintással és a szoba nevének megadásával.", - "meeting": { - "start_meeting": "Találkozó elindítása", - "join_meeting": "Csatlakozás a találkozóhoz", - "meeting_invitation": "Meghívták, hogy csatlakozzon", - "meeting_not_started": "A találkozó még nem indult el", - "join_meeting_automatically": "Automatikusan csatlakozni fog, amint a találkozó elkezdődik", - "recording_consent": "Tudomásul veszem, hogy a munkamenetet rögzíthetik. Ez tartalmazhatja a hangját és a képet, ha az engedélyezett." - }, - "presentation": { - "presentation": "Bemutató", - "click_to_upload": "Kattintson a feltöltéshez", - "drag_and_drop": "vagy húzza és ejtse ide", - "upload_description": "Tetszőleges dokumentum- vagy PDF-fájl (nem nagyobb, mint {{size}}). A használata előtt a fájl méretétől függően idő szükséges a feltöltéséhez.", - "delete_presentation": "Bemutató törlése", - "are_you_sure_delete_presentation": "Biztos, hogy törli ezt a bemutatót?" - }, - "shared_access": { - "access": "Hozzáférés", - "add_share_access": "+ Hozzáférés megosztása", - "share_room_access": "Szobahozzáférés megosztása", - "add_some_users": "Ideje hozzáadni néhány felhasználót!", - "add_some_users_description": "Az új felhasználók hozzáadásához kattintson a lenti gombra, és keresse ki vagy válassza ki azokat a felhasználókat, akikkel megosztja ezt a szobát.", - "delete_shared_access": "Megosztott hozzáférés törlése", - "are_you_sure_delete_shared_access": "Biztos, hogy törli a megosztott hozzáférést?" - }, - "settings": { - "settings": "Beállítások", - "room_name": "Szoba neve", - "user_settings": "Felhasználói beállítások", - "allow_room_to_be_recorded": "A szoba felvételének engedélyezése", - "require_signed_in": "A felhasználóknak csatlakozás előtt be kell jelentkezniük", - "require_signed_in_message": "Be kell jelentkeznie, hogy a szobához csatlakozhasson.", - "require_mod_approval": "A csatlakozás előtt moderátori jóváhagyás szükség", - "allow_any_user_to_start": "Bármely felhasználó elindíthatja a találkozót", - "all_users_join_as_mods": "Az összes felhasználó moderátorként csatlakozik", - "mute_users_on_join": "A felhasználók némítása csatlakozáskor", - "generate": "Előállítás", - "access_code": "Hozzáférési kód", - "mod_access_code": "Moderátori hozzáférési kód", - "mod_access_code_optional": "Moderátori hozzáférési kód (nem kötelező)", - "access_code_required": "Adja meg a hozzáférési kódját", - "wrong_access_code": "Hibás hozzáférési kód", - "generate_viewers_access_code": "Hozzáférési kód előállítása a látogatók számára", - "generate_mods_access_code": "Hozzáférési kód előállítása a moderátorok számára", - "server_tag": "Válasszon szervertípust a szobához", - "default_tag_name": "Alapértelmezett", - "server_tag_desired": "Kívánt", - "server_tag_required": "Kötelező", - "are_you_sure_delete_room": "Biztos, hogy törli ezt a szobát?" - } - }, - "recording": { - "recording": "Felvétel", - "recordings": "Felvételek", - "processing": "Felvétel folyamatban...", - "name": "Név", - "length": "Hossz", - "users": "Felhasználók", - "visibility": "Láthatóság", - "formats": "Formátumok", - "published": "Közzétéve", - "unpublished": "Nincs közzétéve", - "protected": "Védett", - "public": "Nyilvános", - "public_protected": "Nyilvános /Védett", - "length_in_minutes": "{{recording.length}} perc", - "processing_recording": "A felvétel feldolgozása néhány percig eltarthat...", - "copy_recording_urls": "Felvételek webcímének másolása", - "recordings_list_empty": "Még nincs egy felvétele sem.", - "public_recordings_list_empty": "Még egy nyilvános felvétel sincs!", - "recordings_list_empty_description": "A felvételek itt fognak megjelenni, ha indít és felvesz egy találkozót.", - "public_recordings_list_empty_description": "Az elérhető felvételek itt jelennek meg.", - "delete_recording": "Felvétel törlése", - "are_you_sure_delete_recording": "Biztos, hogy törli ezt a felvételt?", - "search_not_found": "Nem található felvétel" - }, - "admin": { - "admin_panel": "Üzemeltetői panel", - "manage_users": { - "manage_users": "Felhasználók kezelése", - "active": "Aktív", - "approve": "Elfogadás", - "decline": "Elutasítás", - "pending": "Függőben", - "banned": "Kitiltott", - "ban": "Kitiltás", - "unban": "Kitiltás visszavonása", - "unverified": "Ellenőrizetlen", - "verify": "Ellenőrzés", - "deleted": "Törölve", - "invited_tab": "Meghívva", - "invite_user": "Felhasználó meghívása", - "send_invitation": "Meghívás küldése", - "enter_user_email": "Adja meg a felhasználó e-mail-címét", - "new_user": "Új felhasználó", - "add_new_user": "Új felhasználó", - "create_new_user": "Új felhasználó létrehozása", - "edit_user": "Felhasználó szerkesztése", - "delete_user": "Felhasználó törlése", - "users_edit_path": "Felhasználók/szerkesztés", - "create_account": "Fiók létrehozása", - "create_room": "Szoba létrehozása", - "create_new_room": "Új szoba létrehozása", - "user_created_at": "Létrehozva: {{user.created_at}}", - "are_you_sure_delete_account": "Biztos, hogy törli {{user.name}} fiókját?", - "delete_account_warning": "Ha a fiók törlését választja, akkor az NEM állítható helyre.", - "empty_active_users": "Még nincs aktív felhasználó ezen a kiszolgálón.", - "empty_active_users_subtext": "Ha egy felhasználó állapota aktívvá válik, akkor itt fog megjelenni.", - "empty_pending_users": "Még nincs függőben lévő felhasználó ezen a kiszolgálón.", - "empty_pending_users_subtext": "Ha egy felhasználó állapota függőben lévővé válik, akkor itt fog megjelenni.", - "empty_banned_users": "Még nincs kitiltott felhasználó ezen a kiszolgálón.", - "empty_banned_users_subtext": "Ha egy felhasználó állapota kitiltottá válik, akkor itt fog megjelenni.", - "empty_unverified_users": "Egy ellenőrizetlen felhasználó sincs még a szerveren!", - "empty_unverified_users_subtext": "Az ellenőrizetlen felhasználók itt jelennek meg.", - "empty_invited_users": "Még nincs meghívott felhasználó ezen a kiszolgálón.", - "empty_invited_users_subtext": "Ha egy felhasználó állapota meghívottá válik, akkor itt fog megjelenni.", - "invited": { - "time_sent": "Küldési idő", - "valid": "Érvényes", - "revoke": "Visszavonás" - } - }, - "server_rooms": { - "server_rooms": "Kiszolgáló szobái", - "name": "Név", - "owner": "Tulajdonos", - "room_id": "Szobaazonosító", - "participants": "Résztvevők", - "status": "Állapot", - "running": "Fut", - "not_running": "Nem fut", - "active": "Aktív", - "current_session": "Jelenlegi munkamenet: {{lastSession}}", - "last_session": "Legutóbbi munkamenet: {{lastSession}}", - "no_meeting_yet": "Még nincsenek találkozók.", - "delete_server_rooms": "Kiszolgáló szobájának törlése", - "resync_recordings": "Felvételek újraszinkronizálása", - "empty_room_list": "Még nincs szoba a kiszolgálón.", - "empty_room_list_subtext": "A szobák itt fognak megjelenni az első szoba létrehozása után." - }, - "server_recordings": { - "server_recordings": "Kiszolgáló felvételei", - "latest_recordings": "Legutóbbi felvételek", - "no_recordings_found": "Nem található felvétel." - }, - "site_settings": { - "site_settings": "Oldalbeállítások", - "customize_greenlight": "A Greenlight testreszabása", - "appearance": { - "appearance": "Megjelenés", - "brand_color": "Márkaszín", - "regular": "Szokásos", - "lighten": "Világosítás", - "brand_image": "Márkakép", - "click_to_upload": "Kattintson a feltöltéshez", - "drag_and_drop": "vagy húzza és ejtse ide", - "upload_brand_image_description": "Tetszőleges PNG, JPG, vagy SVG fájl (nem nagyobb, mint {{size}}). A használata előtt a fájl méretétől függően idő szükséges a feltöltéséhez.", - "remove_branding_image": "Márkakép eltávolítása" - }, - "administration": { - "administration": "Üzemeltetés", - "terms": "Felhasználási feltételek", - "privacy": "Adatvédelmi közlemény", - "privacy_policy": "Adatvédelmi közlemény", - "change_term_links": "A lap alján megjelenő felhasználási feltételek hivatkozásának módosítása", - "change_privacy_link": "A lap alján megjelenő adatvédelmi hivatkozás módosítása", - "helpcenter": "Súgóközpont", - "change_helpcenter_link": "A profil legördülő alatt megjelenő Súgóközpont link módosítsa", - "maintenance": "Karbantartási szalaghirdetés", - "change_maintenance_text": "A fejlécben megjelenő karbantartási szalaghirdetés szövegének módosítása.", - "change_url": "Webcím módosítása", - "set_text": "Szöveg beállítása", - "clear_banner": "Szalaghirdetés törlése", - "enter_link": "Itt adja meg a hivatkozást" - }, - "settings": { - "settings": "Beállítások", - "allow_users_to_share_rooms": "A felhasználók megoszthatják a szobákat", - "allow_users_to_share_rooms_description": "A letiltása eltávolítja a gombot a szobák legördülő menüjében, így a felhasználók nem tudják megosztani a szobákat", - "allow_users_to_preupload_presentation": "A felhasználók előre feltöltheti a bemutatójukat", - "allow_users_to_preupload_presentation_description": "A felhasználók előre feltöltheti a használandó bemutatójukat az adott szoba alapértelmezett bemutatójaként", - "show_sign_in_on_room_join": "A Csapatszobába csatlakozáskor a Bejelentkezés link megjelenítése", - "show_sign_in_on_room_join_description": "A még be nem jelentkezett felhasználóknak a szobába belépéskor a kártya alján megjelenik a Bejelentkezés link", - "default_visibility": "Felvétel alapértelmezett láthatósága", - "default_visibility_description": "Alapértelmezés szerint minden újonnan létrehozott felvételnél ez lesz a láthatóság", - "session_timeout": "Munkamenet időtúllépése", - "session_timeout_description": "A munkamenet időtúllépését az alapértelmezett 1 napos vagy a kiterjesztett 7 napos munkamenet sütire konfigurálhatja", - "default_session_timeout": "Alapértelmezett (1 nap)", - "extended_session_timeout": "Kiterjesztett (7 nap)" - }, - "registration": { - "registration": "Regisztráció", - "role_mapping_by_email": "Szerepkörkiosztás e-mail-cím alapján", - "role_mapping_by_email_description": "A felhasználó szerepkörhöz rendelése az e-mail-címe alapján. A következő formátumban kell lennie: szerepkör1=e-mail1,szerepkör2=e-mail2", - "enter_role_mapping_rule": "Adja meg a szerepkörkiosztási szabályt", - "resync_on_login": "Felhasználói adatok újraszinkronizálása minden bejelentkezéskor", - "resync_on_login_description": "Újraszinkronizálja a felhasználók adatait minden bejelentkezésnél, így a külső hitelesítésszolgáltató adatai mindig megegyeznek a Greenlightban találhatókkal", - "default_role": "Alapértelmezett szerepkör", - "default_role_description": "A frissen létrehozott felhasználókhoz rendelt alapértelmezett szerepkör", - "registration_method": "Regisztrációs mód", - "registration_method_description": "A felhasználók regisztrációs módjának módosítása", - "registration_methods" : { - "open": "Nyílt regisztráció", - "invite": "Csatlakozás meghívással", - "approval": "Engedélyezés/elutasítás" - }, - "allowed_domains": "Engedélyezett e-mail domainek", - "allowed_domains_signup_description": "Meghatározott e-mail domainek regisztrációjának engedélyezése. A helyes formátum: @test.hu, domain.hu", - "enter_allowed_domains_rule" : "Adja meg az engedélyezett domaineket" - } - }, - "room_configuration": { - "room_configuration": "Szoba beállításai", - "default": "Nem kötelező (alapértelmezett: engedélyezve)", - "optional": "Nem kötelező (alapértelmezett: letiltva)", - "enabled": "Kényszerített engedélyezés", - "disabled": "Letiltva", - "configurations": { - "allow_room_to_be_recorded": "A szoba felvételének engedélyezése", - "allow_room_to_be_recorded_description": "A szoba tulajdonosai adhatják meg, hogy az rögzíthető legyen-e vagy sem. Ha be van kapcsolva, egy moderátornak akkor is rá kell kattintania a „Felvétel” gombra a találkozó indulásakor.", - "require_user_signed_in": "A felhasználóknak csatlakozás előtt be kell jelentkezniük", - "require_user_signed_in_description": "Csak a Greenlight-fiókkal rendelkező felhasználókat engedi csatlakozni a találkozóhoz. Ha nincsenek bejelentkezve, akkor át lesznek irányítva a bejelentkezési oldalra, ha megpróbálnak csatlakozni a szobához.", - "require_mod_approval": "A csatlakozás előtt moderátori jóváhagyás szükséges", - "require_mod_approval_description": "Ha egy felhasználó megpróbál csatlakozni, akkor megkérdezi a BigBlueButton moderátorát. Ha engedélyezi, akkor csatlakozhat a találkozóhoz.", - "allow_any_user_to_start_meeting": "Bármely felhasználó elindíthat egy találkozót", - "allow_any_user_to_start_meeting_description": "Bármely felhasználó elindíthat egy találkozót, bármikor. Alapértelmezés szerint csak a szoba tulajdonosa tud elindítani egy találkozót.", - "allow_users_to_join_as_mods": "Az összes felhasználó moderátorként csatlakozik", - "allow_users_to_join_as_mods_description": "A találkozóhoz csatlakozáskor megadja a felhasználóknak az összes moderátori jogosultságot a BigBlueButtonban", - "mute_users_on_join": "A felhasználók némítása csatlakozáskor", - "mute_users_on_join_description": "A felhasználó automatikus némítása amikor csatlakozik a BigBlueButton találkozóhoz.", - "viewer_access_code": "Nézői hozzáférési kód", - "viewer_access_code_description": "A szoba tulajdonosai véletlenszerű alfanumerikus kódot kapnak, amely megosztható másokkal. Az előállított kódra lesz szükség, hogy a felhasználók csatlakozhassanak a szoba találkozóihoz", - "mod_access_code": "Moderátori hozzáférési kód", - "mod_access_code_description": "A szoba tulajdonosai véletlenszerű alfanumerikus kódot kapnak, amely megosztható másokkal. Az előállított kódra nem lesz szükség, és a felhasználók moderátorként fognak csatlakozni a szoba találkozóihoz." - } - }, - "roles": { - "role": "Szerepkör", - "roles": "Szerepkörök", - "administrator": "Üzemeltető", - "guest": "Vendég", - "manage_roles": "Szerepkörök kezelése", - "delete_role": "Szerepkör törlése", - "are_you_sure_delete_role": "Biztos, hogy törli ezt a szerepkört?", - "enter_role_name": "Adja meg egy szerepkör nevét", - "add_role": "+ Szerepkör létrehozása", - "create_role": "Szerepkör létrehozása", - "create_new_role": "Új szerepkör létrehozása", - "no_role_found": "Nem található szerepkör.", - "search_not_found": "Nem található szerepkör", - "edit": { - "create_room": "Az ezzel a szerepkörrel rendelkező felhasználók létrehozhatnak szobákat", - "record": "Az ezzel a szerepkörrel rendelkező felhasználók felvehetik a találkozóikat", - "manage_users": "Az ezzel a szerepkörrel rendelkező felhasználók kezelhetik a felhasználókat", - "manage_rooms": "Az ezzel a szerepkörrel rendelkező felhasználók kezelhetik a kiszolgáló szobáit", - "manage_recordings": "Az ezzel a szerepkörrel rendelkező felhasználók kezelhetik a kiszolgáló felvételeit", - "manage_site_settings": "Az ezzel a szerepkörrel rendelkező felhasználók kezelhetik az oldal beállításait", - "manage_roles": "Az ezzel a szerepkörrel rendelkező felhasználók kezelhetik a többi szerepkört", - "shared_list": "Az ezzel a szerepkörrel rendelkezők felhasználók belevétele a szoba megosztásakor megjelenő legördülő listába", - "room_limit": "Szobakorlát", - "email_on_signup": "E-mail küldése új felhasználó regisztrációjakor", - "allowed_recording_visibility": "Felvétel engedélyezett láthatóságai" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Új felhasználó létrehozva.", - "user_updated": "Felhasználó frissítve.", - "user_deleted": "A felhasználót sikeresen törölte.", - "avatar_updated": "Profilkép frissítve.", - "password_changed": "Jelszavát sikeresen módosította, kérem, jelentkezzen be.", - "password_updated": "Jelszó frissítve.", - "account_activated": "A fiókját aktiválták.", - "activation_email_sent": "Aktiváló e-mail elküldve", - "reset_pwd_email_sent": "A jelszava visszaállítási utasításait tartalmazó e-mail elküldve." - }, - "session": { - "signed_out": "Sikeresen kijelentkezett." - }, - "room": { - "room_created": "Szoba létrehozva.", - "room_updated": "A szobát sikeresen módosította.", - "room_deleted": "A szobát sikeresen törölte.", - "room_shared": "A szobát sikeresen megosztotta.", - "room_unshared": "Szoba megosztása visszavonva", - "recordings_synced": "A szoba felvételei most már szinkronizálva vannak", - "room_configuration_updated": "Szoba beállításai frissítve.", - "room_setting_updated": "Szoba beállítása frissítve.", - "presentation_updated": "Bemutató frissítve.", - "presentation_deleted": "Bemutató törölve.", - "joining_meeting": "Csatlakozás a találkozóhoz…", - "meeting_started": "Találkozó elindítva.", - "access_code_copied": "A hozzáférési kódot sikeresen lemásolta.", - "access_code_generated": "Hozzáférési kód előállítva.", - "access_code_deleted": "Hozzáférési kódot sikeresen törölte.", - "copied_meeting_url": "A találkozó webcíme másolva. A hivatkozás a találkozóhoz csatlakozáshoz használható", - "copied_viewer_code": "A megtekintési kódot sikeresen lemásolta.", - "copied_moderator_code": "A moderátori hozzáférési kódot sikeresen lemásolta." - }, - "site_settings": { - "site_setting_updated": "Oldalbeállítás frissítve.", - "brand_color_updated": "A márkaszín sikerese módosította.", - "brand_image_updated": "A márkaképet sikeresen módosította.", - "brand_image_deleted": "A márkakép sikeresen törölte.", - "privacy_policy_updated": "Az adatvédelmi közleményt frissítették.", - "helpcenter_updated": "A Súgóközpont linkjét sikeresen módosította.", - "terms_of_service_updated": "A szolgáltatási feltételek frissítésre kerültek.", - "maintenance_updated": "A karbantartási szalaghirdetést frissítettük.", - "allowed_domains_signup_updated": "Az engedélyezett email domaineket sikeresen módosította." - }, - "recording": { - "recording_visibility_updated": "Felvétel láthatósága frissítve.", - "recording_name_updated": "Felvétel neve frissítve.", - "recording_deleted": "A felvételt sikeresen törölte.", - "copied_urls": "A felvétel webcímei másolva." - }, - "role": { - "role_created": "Szerepkör létrehozva.", - "role_updated": "A szerepkört sikeresen módosította.", - "role_deleted": "A szerepkört sikeresen törölte.", - "role_permission_updated": "Szerepkör jogosultsága frissítve" - }, - "invitations": { - "invitation_sent": "Meghívó elküldve", - "invitation_revoked": "A meghívást visszautasították" - } - }, - "error": { - "problem_completing_action": "Probléma lépett fel a művelet befejezése során. \n Próbálja újra.", - "server_type_unavailable": "A kiválasztott szervertípus nem érhető el. Kérem, válasszon másikat.", - "file_type_not_supported": "A fájltípus nem támogatott.", - "file_size_too_large": "A fájl túl nagy.", - "file_upload_error": "A fájlt nem sikerült feltölteni.", - "signin_required": "Be kell jelentkeznie, hogy elérje ezt az oldalt", - "malware_detected": "Rosszindulatú kódot érzékeltünk! A feltöltött fájl valószínű Rosszindulatú kódot tartalmaz. Kérem, ellenőrizze a fájlt és próbálja újra feltölteni.", - "roles": { - "role_assigned": "Ez a szerepkör nem törölhető, mert legalább egy felhasználóhoz hozzá van rendelve." - }, - "users": { - "signup_error": "Nem hitelesíthető. Lépjen kapcsolatba a rendszergazdával.", - "invalid_invite": "A meghívási token érvénytelen vagy helytelen. Lépjen kapcsolatba a rendszergazdával, hogy újat kapjon.", - "email_exists": "Már létezik fiók ezzel ez e-mail-címmel. Próbálja újra másik címmel.", - "old_password": "A megadott jelszó helytelen.", - "pending": "A fiókja adminisztrátori jóváhagyásra vár. Próbálja újra később.", - "banned": "Nincs hozzáférési jogosultsága ehhez az alkalmazáshoz. Ha úgy gondolja, hogy ez hiba, akkor lépjen kapcsolatba a rendszergazdával." - }, - "rooms": { - "room_limit": "A szobakorlát miatt a szoba nem hozható létre" - }, - "session": { - "invalid_credentials": "A felhasználónév és a jelszó helytelen. Ellenőrizze a hitelesítési adatait és próbálja újra." - } - } - }, - "global_error_page": { - "title": "Hiba", - "message": "Hoppá! Valami nem sikerült. Ha ez az eset újra előfordul, akkor lépjen kapcsolatba a rendszergazdával." - }, - "not_found_error_page": { - "title": "404", - "message": "Hoppá! A keresett oldal nem található." - }, - "account_activation_page": { - "title": "Fiók aktiválása", - "account_unverified": "Fiókját még nem ellenőrizték.", - "message": "A Greenlight használatához kérem, a megküldött aktiváló e-mailben lévő utasítások alapján ellenőrizze a fiókját.", - "resend_activation_link": "Amennyiben nem kapta meg az aktiváló e-mailt vagy problémája akad annak használatával, kattintson az újraküldés gombra egy új aktiváló e-mail kéréséhez.", - "resend_btn_lbl": "Megerősítés újraküldése" - }, - "forms": { - "validations": { - "full_name": { - "required": "Adja meg a teljes nevét", - "min": "A névnek legalább 2 karakteresnek kell lennie", - "max": "A név legfeljebb 255 karakteres lehet" - }, - "email": { - "required": "Adja meg az e-mail-címét", - "email": "A megadott érték nem e-mail formátumú", - "min": "Az e-mail-címnek legalább 6 karakteresnek kell lennie", - "max": "Az e-mail-cím legfeljebb 255 karakteres lehet" - }, - "password": { - "required": "Adja meg a jelszavát", - "match": "A jelszónak legalább az alábbi feltételeknek kell megfelelnie:", - "min": "- Nyolc karakter", - "lower": "- Egy kisbetű", - "upper": "- Egy nagybetű", - "digit": "- Egy számjegy", - "symbol": "- Egy szimbólum", - "max": "A jelszó legfeljebb 255 karakteres lehet" - }, - "password_confirmation": { - "required": "Adja meg a jelszó megerősítését", - "match": "A jelszavak nem egyeznek" - }, - "emails": { - "required": "Adjon meg legalább egy érvényes e-mail-címet", - "list": "Az e-mail-címeket vesszővel elválasztva adja meg (user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "Adja meg a szerepkör nevét" - }, - "role": { - "limit": { - "required": "Adja meg a szobakorlátot", - "min": "A megengedett legkisebb érték 0", - "max": "A megengedett legnagyobb érték 100" - }, - "type": { - "error": "Meg kell adnia egy számot" - } - }, - "room": { - "name": { - "required": "Adja meg a szoba nevét.", - "min": "A névnek legalább 2 karakteresnek kell lennie" - } - }, - "room_join": { - "name": { - "required": "Adja meg a nevét." - } - }, - "url": { - "invalid": "Érvénytelen webcím" - }, - "text_form": { - "value": { - "required": "Írjon egy üzenetet" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Szoba neve", - "placeholder": "Adja meg a szoba nevét…" - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Név", - "placeholder": "Adja meg a nevét" - }, - "access_code": { - "label": "Hozzáférési kód", - "placeholder": "Adja meg a hozzáférési kódot" - }, - "recording_consent": { - "label": "Tudomásul veszem, hogy ez a munkamenet rögzíthető. Ez vonatkozik a hangomra és a videómra, ha be van kapcsolva." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Teljes név", - "placeholder": "Adja meg a teljes nevét" - }, - "email": { - "label": "E-mail cím", - "placeholder": "Adja meg az e-mail-címét" - }, - "password": { - "label": "Jelszó", - "placeholder": "Jelszó létrehozása" - }, - "password_confirmation": { - "label": "Jelszó megerősítése", - "placeholder": "Jelszó megerősítése" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "E-mail-cím", - "placeholder": "E-mail-cím" - }, - "password": { - "label": "Jelszó", - "placeholder": "Jelszó" - }, - "remember_me": { - "label": "Emlékezzen rám" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Jelenlegi jelszó", - "placeholder": "Adja meg a jelszavát" - }, - "new_password": { - "label": "Új jelszó", - "placeholder": "Adja meg az új jelszavát" - }, - "password_confirmation": { - "label": "Jelszó megerősítése", - "placeholder": "Az új jelszava megerősítése" - } - }, - "validations": { - "old_password": { - "required": "Adja meg az új jelszavát" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "E-mail-cím", - "placeholder": "Adja meg a fiók e-mail-címét" - } - }, - "validations": { - "email": { - "required": "Adja meg a fiók e-mail-címét" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Új jelszó", - "placeholder": "Adja meg az új jelszót" - }, - "password_confirmation": { - "label": "Jelszó megerősítése", - "placeholder": "Erősítse meg az új jelszavát" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Teljes név" - }, - "email": { - "label": "E-mail-cím" - }, - "language": { - "label": "Nyelv" - }, - "role": { - "label": "Szerepkör" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Teljes név", - "placeholder": "Adja meg a felhasználó teljes nevét" - }, - "email": { - "label": "E-mail-cím", - "placeholder": "Adja meg a felhasználó e-mail-címét " - }, - "password": { - "label": "Jelszó", - "placeholder": "Adja meg a felhasználó jelszavát" - }, - "password_confirmation": { - "label": "Jelszó megerősítése", - "placeholder": "Jelszó megerősítése" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "E-mailek" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Adja meg a hivatkozást itt…", - "text_placeholder": "Ide írjon..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Szerepkör neve", - "placeholder": "Adja meg a szerepkör nevét…" - } - } - } - } - } -} diff --git a/app/assets/locales/it.json b/app/assets/locales/it.json deleted file mode 100644 index ea8618daf6..0000000000 --- a/app/assets/locales/it.json +++ /dev/null @@ -1,726 +0,0 @@ -{ - "start": "Inizio", - "search": "Cerca", - "home": "Home", - "previous": "Precedente", - "back": "Indietro", - "next": "Successivo", - "view": "Visualizza", - "join": "Partecipa", - "edit": "Modifica", - "save": "Salva", - "save_changes": "Salva modifiche", - "update": "Aggiorna", - "report": "Riepilogo", - "share": "Condividi", - "cancel": "Annulla", - "reset": "Resetta", - "close": "Chiudi", - "delete": "Elimina", - "copy": "Copia l'Indirizzo di accesso", - "copy_viewer_code": "Copia il Codice partecipante", - "copy_moderator_code": "Copia il Codice moderatore", - "or": "O", - "online": "Online", - "help_center": "Aiuto", - "are_you_sure": "Sei sicuro?", - "return_home": "Torna alla pagina principale", - "created_at": "Creato il", - "view_recordings": "Guarda le registrazioni", - "join_session": "Partecipa alla sessione", - "no_result_search_input": "Nessun risultato per \"{{ searchInput }}\"", - "action_permanent": "Questa azione non può essere annullata.", - "homepage": { - "welcome_bbb": "Benvenuto su BigBlueButton.", - "bigbluebutton_description": "BigBlueButton è un sistema di aule virtuali open source per lezioni online. La piattaforma ottimizza il tempo dedicato all'apprendimento applicato, consentendo ai discenti di collaborare e ricevere feedback in tempo reale.", - "greenlight_description": "Crea aule per ospitare le tue sessioni, oppure unisciti a quelle degli altri utilizzando un pratico link.", - "learn_more": "Per saperne di più su BigBlueButton", - "explore_features": "Esplora le funzionalità", - "meeting_title": "Avvia una sessione", - "meeting_description": "Avvia una lezione virtuale con video, audio, condivisione dello schermo, chat e tutti gli strumenti utili per l'apprendimento applicato.", - "recording_title": "Registra le sessioni", - "recording_description": "Registra le sessioni BigBlueButton e condividile con i discenti per rivedere e riflettere sul materiale.", - "settings_title": "Gestisci le tue aule", - "settings_description": "Configura le aule e le impostazioni delle sessioni per gestire al meglio la tua aula.", - "and_more_title": "E altro ancora!", - "and_more_description": "BigBlueButton offre strumenti integrati per l'apprendimento applicato ed è progettato per farti risparmiare tempo durante le lezioni.", - "enter_meeting_url": "Inserisci l'URL dell'incontro", - "enter_meeting_url_instruction": "Inserisci l'URL della sessione BigBlueButton nel campo sottostante." - }, - "authentication": { - "sign_in": "Accedi", - "sign_up": "Registrati", - "sign_out": "Esci", - "email": "Email", - "password": "Password", - "confirm_password": "Conferma password", - "enter_email": "Inserisci la tua email", - "enter_name": "Inserisci il tuo nome", - "remember_me": "Ricordami", - "forgot_password": "Password dimenticata?", - "dont_have_account": "Non hai un'utenza?", - "create_account": "Crea utenza", - "create_an_account": "Crea un'utenza", - "already_have_account": "Hai già un'utenza?" - }, - "user": { - "user": "Utente", - "users": "Utenti", - "name": "Nome", - "email_address": "Indirizzo email", - "authenticator": "Authenticator", - "full_name": "Nome e cognome", - "no_user_found": "Nessun utente trovato", - "type_three_characters": "Digita tre (3) o più caratteri per mostrare gli altri utenti", - "search_not_found": "Nessun utente trovato", - "profile": { - "profile": "Profilo", - "language": "Lingua", - "role": "Ruolo", - "administrator": "Amministratore", - "guest": "Ospite" - }, - "account": { - "account_info": "Informazioni utenza", - "delete_account": "Elimina utenza", - "change_password": "Modifica password", - "set_password": "Imposta la tua nuova password", - "reset_password": "Reimposta la password", - "update_account_info": "Aggiorna le informazioni utente", - "current_password": "Password attuale", - "new_password": "Nuova Password", - "confirm_password": "Conferma Password", - "permanently_delete_account": "Elimina definitivamente l'utenza", - "delete_account_description": "Se scegli di eliminare l'utenza, NON potrai più recuperarla.\nTutte le informazioni relative alla tua utenza, incluse le impostazioni, le aule e le registrazioni, verranno cancellate.", - "delete_account_confirmation": "Sì, voglio eliminare la mia utenza", - "are_you_sure_delete_account": "Sicuro di voler eliminare la tua utenza?" - }, - "avatar": { - "upload_avatar": "Carica immagine profilo", - "delete_avatar": "Elimina immagine profilo", - "crop_avatar": "Ritaglia la tua immagine profilo" - }, - "pending": { - "title": "Registrazione in sospeso", - "message": "Grazie per esserti registrato! La tua utenza è in attesa di approvazione da parte di un amministratore." - } - }, - "room": { - "room": "Aula", - "rooms": "Aule", - "room_name": "Nome dell'aula", - "add_new_room": "+ Nuova aula", - "create_room": "Crea aula", - "delete_room": "Elimina aula", - "create_new_room": "Crea una nuova aula", - "enter_room_name": "Inserisci il nome dell'aula", - "shared_by": "condiviso da", - "last_session": "Ultima sessione: {{ localizedTime }}", - "no_last_session": "Nessuna sessione precedente creata", - "search_not_found": "Nessuna aula trovata", - "rooms_list_is_empty": "Non hai ancora creato nessuna aula.", - "rooms_list_empty_create_room": "Crea la tua prima aula cliccando sul pulsante in basso e inserendo il nome.", - "meeting": { - "start_meeting": "Avvia sessione", - "join_meeting": "Partecipa alla sessione", - "meeting_invitation": "Sei stato invitato a partecipare", - "meeting_not_started": "La sessione non è ancora iniziata", - "join_meeting_automatically": "Quando la sessione inizierà parteciperai automaticamente", - "recording_consent": "Sono consapevole che questa sessione potrebbe essere registrata includendo la mia voce e il mio video, se abilitati." - }, - "presentation": { - "presentation": "Presentazione", - "click_to_upload": "Clicca per caricare", - "drag_and_drop": " o trascina qui", - "upload_description": "Puoi caricare qualsiasi documento Office o file PDF (non più grande di {{size}}). A seconda delle dimensioni del file, potrebbe essere necessario del tempo per il caricamento prima di poterlo utilizzare", - "delete_presentation": "Elimina presentazione", - "are_you_sure_delete_presentation": "Sicuro di voler eliminare la presentazione?" - }, - "shared_access": { - "access": "Accesso", - "add_share_access": "+ Condividi accesso", - "share_room_access": "Condividi l'accesso all'aula", - "add_some_users": "È ora di aggiungere gli utenti!", - "add_some_users_description": "Per aggiungere nuovi utenti, clicca sul pulsante in basso e cerca o seleziona gli utenti con cui desideri condividere quest'aula", - "delete_shared_access": "Elimina l'Accesso condiviso", - "are_you_sure_delete_shared_access": "Sicuro di voler eliminare questo Accesso condiviso?" - }, - "settings": { - "settings": "Impostazioni", - "room_name": "Nome dell'aula", - "user_settings": "Impostazioni utente", - "allow_room_to_be_recorded": "Consenti le registrazioni nell'aula", - "require_signed_in": "Gli utenti devono effettuare l'accesso per partecipare", - "require_signed_in_message": "Devi effettuare l'accesso per partecipare", - "require_mod_approval": "Il moderatore deve approvare l'accesso", - "allow_any_user_to_start": "Consenti a qualsiasi utente di avviare la sessione", - "all_users_join_as_mods": "Tutti gli utenti partecipano come moderatori", - "mute_users_on_join": "Silenzia gli utenti all'ingresso", - "generate": "Genera", - "access_code": "Codice di accesso", - "mod_access_code": "Codice di accesso moderatore", - "mod_access_code_optional": "Codice di accesso moderatore (opzionale)", - "access_code_required": "Inserisci il codice di accesso", - "wrong_access_code": "Codice di accesso errato", - "generate_viewers_access_code": "Genera codice di accesso per uditori", - "generate_mods_access_code": "Genera codice di accesso per moderatori", - "server_tag": "Seleziona un tipo di server per questa stanza", - "default_tag_name": "Predefinito", - "server_tag_desired": "Desiderato", - "server_tag_required": "Richiesto", - "are_you_sure_delete_room": "Sicuro di voler eliminare quest'aula?" - } - }, - "recording": { - "recording": "Registrazione", - "recordings": "Registrazioni", - "processing": "Registrazioni in elaborazione...", - "name": "Nome", - "length": "Durata", - "users": "Utenti", - "visibility": "Visibilità", - "formats": "Formati", - "published": "Pubblicata", - "unpublished": "Non pubblicata", - "protected": "Protetta", - "public": "Pubblica", - "public_protected": "Pubblica/Protetta", - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "Registrazione in elaborazione, può richiedere del tempo...", - "copy_recording_urls": "Copia URL Registrazione", - "recordings_list_empty": "Non ci sono registrazioni.", - "public_recordings_list_empty": "Non ci sono registrazioni pubbliche.", - "recordings_list_empty_description": "Le registrazioni verranno visualizzate qui dopo aver avviato una riunione e averla registrata.", - "public_recordings_list_empty_description": "Le registrazioni verranno visualizzate qui, quando disponibili.", - "delete_recording": "Elimina registrazione", - "are_you_sure_delete_recording": "Sicuro di voler eliminare la registrazione?", - "search_not_found": "Nessuna registrazione trovata" - }, - "admin": { - "admin_panel": "Pannello di amministrazione", - "manage_users": { - "manage_users": "Gestisci utenti", - "active": "Attivo", - "approve": "Approva", - "decline": "Rifiuta", - "pending": "In sospeso", - "banned": "Bloccato", - "ban": "Blocca", - "unban": "Sblocca", - "unverified": "Non verificato", - "verify": "Verifica", - "deleted": "Eliminato", - "invited_tab": "Invitato", - "invite_user": "Invita utente", - "send_invitation": "Invia invito", - "enter_user_email": "Digita l'email dell'utente", - "new_user": "Nuovo utente", - "add_new_user": "Nuovo utente", - "create_new_user": "Crea un nuovo utente", - "edit_user": "Modifica utente", - "delete_user": "Elimina utente", - "users_edit_path": "Utenti/Modifica", - "create_account": "Crea utenza", - "create_room": "Crea aula", - "create_new_room": "Crea una nuova aula", - "user_created_at": "Creato: {{localizedTime}}", - "are_you_sure_delete_account": "Sicuro di vole eliminare l'utenza {{user.name}}?", - "delete_account_warning": "Se decidi di eliminare questa utenza, NON sarà più recuperabile.", - "empty_active_users": "Non ci sono ancora utenti attivi in questo server!", - "empty_active_users_subtext": "Quando ci sarà un utente attivo, apparirà qui.", - "empty_pending_users": "Non ci sono ancora utenti in attesa in questo server!", - "empty_pending_users_subtext": "Quando ci sarà un utente in attesa, apparirà qui.", - "empty_banned_users": "Non ci sono ancora utenti bloccati in questo server!", - "empty_banned_users_subtext": "Quando ci sarà un utente bloccato, apparirà qui.", - "empty_unverified_users": "Non ci sono ancora utenti non verificati su questo server!", - "empty_unverified_users_subtext": "Tutti gli utenti non verificati appariranno qui.", - "empty_invited_users": "Non ci sono ancora utenti invitati in questo server!", - "empty_invited_users_subtext": "Quando ci sarà un utente invitato, apparirà qui.", - "invited": { - "time_sent": "Ora di invio", - "valid": "Valido", - "revoke": "Revoca" - } - }, - "server_rooms": { - "server_rooms": "Aule sul server", - "name": "Nome", - "owner": "Proprietario", - "room_id": "ID aula", - "participants": "Partecipanti", - "status": "Stato", - "running": "In esecuzione", - "not_running": "Non in esecuzione", - "active": "Attivo", - "current_session": "Sessione corrente: {{lastSession}}", - "last_session": "Ultima sessione: {{localizedTime}}", - "no_meeting_yet": "Ancora nessun meeting.", - "delete_server_rooms": "Elimina l'aula dal server", - "resync_recordings": "Sincronizza le registrazioni", - "empty_room_list": "Non ci sono ancora aule su questo server!", - "empty_room_list_subtext": "Le aule appariranno qui dopo che avrai creato la prima." - }, - "server_recordings": { - "server_recordings": "Registrazioni sul server", - "latest_recordings": "Ultime registrazioni", - "no_recordings_found": "Nessuna registrazione trovata." - }, - "site_settings": { - "site_settings": "Impostazioni del sito", - "customize_greenlight": "Personalizza Greenlight", - "appearance": { - "appearance": "Aspetto", - "brand_color": "Colore del marchio", - "regular": "Primario", - "lighten": "Secondario", - "brand_image": "Logo", - "click_to_upload": "Clicca per caricare", - "drag_and_drop": "o trascina qui", - "upload_brand_image_description": "Puoi caricare un file PNG, JPG o SVG (non più grande di {{size}}). A seconda della dimensione del file, ci potrebbe volere del tempo prima che possa essere usato", - "remove_branding_image": "Rimuovi logo" - }, - "administration": { - "administration": "Amministrazione", - "terms": "Termini e condizioni", - "privacy": "Informativa sulla privacy", - "privacy_policy": "Informativa sulla privacy", - "change_term_links": "Modifica il link di termini e condizioni in calce alla pagina", - "change_privacy_link": "Modifica il link dell'informativa dati sensibili in calce alla pagina", - "helpcenter": "Aiuto", - "change_helpcenter_link": "Modifica il link di aiuto nel menù di profilo", - "maintenance": "Immagine per la manutenzione", - "change_maintenance_text": "Modifica il testo dell'immagine per la manutenzione che appare nell'intestazione", - "change_url": "Modifica URL", - "set_text": "Inserisci testo", - "clear_banner": "Elimina l'immagine", - "enter_link": "Inserisci qui il link" - }, - "settings": { - "settings": "Impostazioni", - "allow_users_to_share_rooms": "Consenti agli utenti di condividere l'aula", - "allow_users_to_share_rooms_description": "Impostando su disattivato verrà rimosso il bottone dalla tendina delle opzioni dell'aula, impedendo agli utenti di condividere le aule", - "allow_users_to_preupload_presentation": "Permette agli utenti di caricare le presentazioni in anticipo", - "allow_users_to_preupload_presentation_description": "Gli utenti possono caricare in anticipo una presentazione da usare come predefinita una data aula", - "show_sign_in_on_room_join": "Mostra il collegamento di accesso quando ti unisci alla stanza", - "show_sign_in_on_room_join_description": "Se l'utente non ha effettuato l'accesso, un collegamento di accesso viene visualizzato nella parte inferiore della scheda quando si entra in una stanza", - "default_visibility": "Visibilità predefinita delle registrazioni", - "default_visibility_description": "Ogni nuova registrazione avrà questa visibilità per impostazione predefinita", - "session_timeout": "Scadenza sessione", - "session_timeout_description": "Puoi configurare la scadenza della sessione con un cookie predefinito di un giorno o un cookie di sessione esteso da 7 giorni", - "default_session_timeout": "Predefinita (1 giorno)", - "extended_session_timeout": "Estesa (7 giorni)" - }, - "registration": { - "registration": "Iscrizione", - "role_mapping_by_email": "Mappatura dei ruoli per email", - "role_mapping_by_email_description": "Assegna l'utente a un ruolo utilizzando il suo indirizzo email. Il formato deve essere: ruolo1=email1, ruolo2=email2", - "enter_role_mapping_rule": "Inserisci una regola di mappatura dei ruoli", - "resync_on_login": "Sincronizza i dati utente ad ogni accesso", - "resync_on_login_description": "Sincronizza le informazioni dell'utente ogni volta che accede, allineando sempre il provider esterno alle informazioni su Greenlight", - "default_role": "Ruolo predefinito", - "default_role_description": "Il ruolo predefinito assegnato ai nuovi utenti", - "registration_method": "Modalità di iscrizione", - "registration_method_description": "Modifica come gli utenti si registrano al sito", - "registration_methods" : { - "open": "Iscrizione aperta", - "invite": "Su invito", - "approval": "Approva/Rifiuta" - }, - "allowed_domains": "Domini di posta elettronica consentiti", - "allowed_domains_signup_description": "Consenti la registrazione a domini email specifici. Il formato deve essere: @test.com,dominio.com", - "enter_allowed_domains_rule" : "Inserisci i domini consentiti" - } - }, - "room_configuration": { - "room_configuration": "Configurazione aula", - "default": "Facoltativo (predefinito: attivo)", - "optional": "Facoltativo (predefinito: disattivato)", - "enabled": "Sempre attivo", - "disabled": "Disattivato", - "configurations": { - "allow_room_to_be_recorded": "Permetti la registrazione per l'aula", - "allow_room_to_be_recorded_description": "Permetti ai proprietari dell'aula di specificare se vogliono la possibilità di registrare l'aula o no. Se attivato, il moderatore deve comunque premere il pulsante 'Registra' dopo l'avvio della sessione.", - "require_user_signed_in": "Richiedi l'iscrizione degli utenti prima di partecipare", - "require_user_signed_in_description": "Permetti solo a chi ha un'utenza su Greenlight di partecipare all'incontro. Se non ha fatto accesso, verrà rimandato alla pagina di login quando proverà ad accedere a un'aula.", - "require_mod_approval": "Richiedi l'approvazione di un moderatore prima di accedere", - "require_mod_approval_description": "Chiede al moderatore dell'incontro su BigBlueButton quando un utente prova ad accedere. Se l'utente viene approvato, potrà partecipare all'incontro.", - "allow_any_user_to_start_meeting": "Permette a tutti gli utenti di avviare la sessione", - "allow_any_user_to_start_meeting_description": "Permette a tutti gli utenti di avviare l'incontro in qualsiasi momento. Normalmente solo il proprietario dell'aula può avviare l'incontro.", - "allow_users_to_join_as_mods": "Tutti gli utenti sono moderatori all'accesso", - "allow_users_to_join_as_mods_description": "Assegna a tutti gli utenti i privilegi di moderatore in BigBlueButton quando accedono all'incontro", - "mute_users_on_join": "Silenzia gli utenti all'accesso", - "mute_users_on_join_description": "Silenzia automaticamente l'utente quando accede all'incontro BigBlueButton", - "viewer_access_code": "Codice accesso partecipante", - "viewer_access_code_description": "Permette ai proprietari dell'aula di avere un codice alfanumerico casuale da condividere con gli utenti. Il codice, se generato, verrà richiesto agli utenti per accedere agli incontri dell'aula.", - "mod_access_code": "Codice accesso moderatore", - "mod_access_code_description": "Permette ai proprietari dell'aula di avere un codice alfanumerico casuale da condividere con gli utenti. Il codice, se generato, non verrà richiesto e quando inserito in un incontro dell'aula farà accedere l'utente come moderatore." - } - }, - "roles": { - "role": "Ruolo", - "roles": "Ruoli", - "administrator": "Amministratore", - "guest": "Ospite", - "manage_roles": "Gestisci ruoli", - "delete_role": "Elimina ruolo", - "are_you_sure_delete_role": "Sei sicuro di voler eliminare questo ruolo?", - "enter_role_name": "Inserisci un nome per il ruolo", - "add_role": "+ Crea ruolo", - "create_role": "Crea ruolo", - "create_new_role": "Crea un nuovo ruolo", - "no_role_found": "Nessun ruolo trovato.", - "search_not_found": "Ruoli non trovati", - "edit": { - "create_room": "Permetti agli utenti con questo ruolo di creare delle aule", - "record": "Permetti agli utenti con questo ruolo di registrare i propri incontri", - "manage_users": "Permetti agli utenti con questo ruolo di gestire gli utenti", - "manage_rooms": "Permetti agli utenti con questo ruolo di gestire le aule del server", - "manage_recordings": "Permetti agli utenti con questo ruolo di gestire le registrazioni del server", - "manage_site_settings": "Permetti agli utenti con questo ruolo di gestire le configurazioni del sito", - "manage_roles": "Permetti agli utenti con questo ruolo di modificare gli altri ruoli", - "shared_list": "Includi gli utenti con questo ruolo nella tendina di condivisione delle aule", - "room_limit": "Limite sale", - "email_on_signup": "Ricevi una mail all'iscrizione di un nuovo utente", - "allowed_recording_visibility": "Visibilità consentite per le registrazioni" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "È stato creato un nuovo utente.", - "user_updated": "L'utente è stato aggiornato.", - "user_deleted": "L'utente è stato cancellato.", - "avatar_updated": "L'immagine del profilo è stata aggiornata.", - "password_changed": "Password modificata con successo. Si prega di accedere nuovamente.", - "password_updated": "La password è stata aggiornata.", - "account_activated": "La tua utenza è stata attivata.", - "activation_email_sent": "Ti abbiamo inviato un'email con le istruzioni per attivare l'utenza.", - "reset_pwd_email_sent": "Ti abbiamo inviato un'email con le istruzioni per ripristinare la password." - }, - "session": { - "signed_out": "Sei stato disconnesso." - }, - "room": { - "room_created": "Nuova aula creata.", - "room_updated": "L'aula è stata aggiornata.", - "room_deleted": "L'aula è stata cancellata.", - "room_shared": "L'aula è stata condivisa.", - "room_unshared": "L'aula non è più condivisa.", - "recordings_synced": "Le registrazioni dell'aula sono state sincronizzate.", - "room_configuration_updated": "La configurazione dell'aula è stata aggiornata.", - "room_setting_updated": "L'impostazione dell'aula è stata aggiornata.", - "presentation_updated": "La presentazione è stata aggiornata.", - "presentation_deleted": "La presentazione è stata cancellata.", - "joining_meeting": "Accesso all'incontro...", - "meeting_started": "Incontro avviato.", - "access_code_copied": "Il codice d'accesso è stato copiato.", - "access_code_generated": "È stato generato un nuovo codice d'accesso.", - "access_code_deleted": "Il codice d'accesso è stato cancellato.", - "copied_meeting_url": "L'URL dell'incontro è stato copiato. Si può usare il collegamento per accedere alla sessione.", - "copied_viewer_code": "Il codice d'accesso partecipante è stato copiato.", - "copied_moderator_code": "Il codice d'accesso moderatore è stato copiato." - }, - "site_settings": { - "site_setting_updated": "Impostazione del sito aggiornata.", - "brand_color_updated": "Il colore di marchio è stato aggiornato.", - "brand_image_updated": "L'immagine di marchio è stata aggiornata.", - "brand_image_deleted": "L'immagine di marchio è stata cancellata.", - "privacy_policy_updated": "L'informativa sulla privacy è stata aggiornata.", - "helpcenter_updated": "L'indirizzo di assistenza è stato aggiornato.", - "terms_of_service_updated": "Le condizioni di servizio sono state aggiornate.", - "maintenance_updated": "L'immagine per la manutenzione è stata aggiornata.", - "allowed_domains_signup_updated": "I domini di posta elettronica consentiti sono stati aggiornati." - }, - "recording": { - "recording_visibility_updated": "La visibilità della registrazione è stata aggiornata.", - "recording_name_updated": "Il nome della registrazione è stato aggiornato.", - "recording_deleted": "La registrazione è stata cancellata.", - "copied_urls": "Gli URL delle registrazioni sono stati copiati." - }, - "role": { - "role_created": "È stato creato un nuovo ruolo.", - "role_updated": "Il ruolo è stato aggiornato.", - "role_deleted": "Il ruolo è stato cancellato.", - "role_permission_updated": "I permessi del ruolo sono stati aggiornati." - }, - "invitations": { - "invitation_sent": "Ti abbiamo inviato un invito", - "invitation_revoked": "Un invito è stato revocato" - } - }, - "error": { - "problem_completing_action": "L'azione non può essere completata.\nSi prega di riprovare.", - "server_type_unavailable": "Il tipo di server richiesto non è disponibile. Seleziona un tipo diverso nelle impostazioni della stanza.", - "file_type_not_supported": "Tipo di documento non supportato.", - "file_size_too_large": "Documento troppo grande.", - "file_upload_error": "Il documento non può essere caricato.", - "signin_required": "Devi aver fatto accesso per vedere questa pagina.", - "malware_detected": "Rilevato Malware! Il documento che hai caricato potrebbe essere dannoso. Si prega di verificare il file e riprovare.", - "roles": { - "role_assigned": "Questo ruolo non può essere cancellato perché assegnato ad almeno un utente." - }, - "users": { - "signup_error": "Impossibile autenticare l'utente. Si prega di contattare un amministratore.", - "invalid_invite": "Il vostro codice di invito è non valido o non corretto. Si prega di contattare un amministratore per ricevere un nuovo codice.", - "email_exists": "È già presente un'utenza con l'email specificata. Si prega di riprovare con un'altra email.", - "old_password": "La password inserita non è corretta.", - "pending": "La tua iscrizione deve essere verificata da un amministratore. Si prega di riprovare più tardi.", - "banned": "Non hai accesso a questo servizio. Si prega di contattare un amministratore se ritieni si tratti di un errore." - }, - "rooms": { - "room_limit": "Non è possibile creare l'aula perché il limite aule è stato raggiunto." - }, - "session": { - "invalid_credentials": "Il nome utente o la password non sono validi. Si prega di verificare le credenziali e riprovare." - } - } - }, - "global_error_page": { - "title": "Errore", - "message": "Spiacente, qualcosa non ha funzionato. Se il problema si ripresentasse, si prega di contattare un amministratore." - }, - "not_found_error_page": { - "title": "Pagina non trovata", - "message": "Spiacente, la pagina che state cercando di aprire non è disponibile." - }, - "account_activation_page": { - "title": "Attivazione utenza", - "account_unverified": "L'utenza non è ancora stata verificata.", - "message": "Per usare Greenlight, si prega di verificare l'utenza seguendo le istruzioni dell'email di attivazione che abbiamo inviato.", - "resend_activation_link": "Se non hai ricevuto un'email di attivazione o se hai un problema nell'usarla, premi il pulsante qui sotto per richiederne una nuova.", - "resend_btn_lbl": "Invia una nuova email di verifica" - }, - "forms": { - "validations": { - "full_name": { - "required": "Si prega di inserire il nome completo", - "min": "Il nome deve essere lungo almeno 2 caratteri", - "max": "Il nome deve essere lungo al più 255 caratteri" - }, - "email": { - "required": "Si prega di inserire un'email", - "email": "Il formato del valore inserito non è valido", - "min": "L'email deve essere lunga almeno 6 caratteri", - "max": "L'email deve essere lunga al più 255 caratteri" - }, - "password": { - "required": "Si prega di inserire una password", - "match": "La password deve contenere almeno", - "min": "- Otto caratteri", - "lower": "- Una lettera minuscola", - "upper": "- Una lettera maiuscola", - "digit": "- Un numero", - "symbol": "- Un carattere non alfanumerico", - "max": "La password deve essere lunga al più 255 caratteri" - }, - "password_confirmation": { - "required": "Si prega di inserire la password per conferma", - "match": "Le password non coincidono" - }, - "emails": { - "required": "Si prega di inserire almeno un'email valida", - "list": "Si prega di inserire una lista di email separate da virgole (utente@utenti.com,utente1@utenti.com,utente2@utenti.com)" - }, - "role_name": { - "required": "Si prega di inserire il nome di un ruolo" - }, - "role": { - "limit": { - "required": "Si prega di inserire il numero massimo di aule", - "min": "Minimo 0", - "max": "Massimo 100" - }, - "type": { - "error": "Occorre specificare un numero" - } - }, - "room": { - "name": { - "required": "Si prega di inserire un nome per l'aula.", - "min": "Il nome deve essere lungo almeno 2 caratteri" - } - }, - "room_join": { - "name": { - "required": "Prego, inserisci il tuo nome." - } - }, - "url": { - "invalid": "URL non valido" - }, - "text_form": { - "value": { - "required": "Inserisci un messaggio" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Nome aula", - "placeholder": "Inserisci un nome aula..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Nome", - "placeholder": "Inserisci il tuo nome" - }, - "access_code": { - "label": "Codice di accesso", - "placeholder": "Inserisci il codice di accesso" - }, - "recording_consent": { - "label": "Accetto che questa sessione possa essere registrata. La registrazione può includere il mio audio e video se abilitati." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Nome completo", - "placeholder": "Inserisci il tuo nome completo" - }, - "email": { - "label": "Email", - "placeholder": "Inserisci la tua email" - }, - "password": { - "label": "Password", - "placeholder": "Crea una password" - }, - "password_confirmation": { - "label": "Conferma password", - "placeholder": "Conferma password" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Email" - }, - "password": { - "label": "Password", - "placeholder": "Password" - }, - "remember_me": { - "label": "Ricordami" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Password attuale", - "placeholder": "Inserisci la tua password" - }, - "new_password": { - "label": "Nuova password", - "placeholder": "Inserisci la nuova password" - }, - "password_confirmation": { - "label": "Conferma password", - "placeholder": "Conferma la nuova password" - } - }, - "validations": { - "old_password": { - "required": "Per favore inserisci la password attuale" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Inserisci l'email della tua utenza" - } - }, - "validations": { - "email": { - "required": "Per favore inserisci l'email della tua utenza" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Nuova password", - "placeholder": "Inserisci la tua nuova password" - }, - "password_confirmation": { - "label": "Conferma password", - "placeholder": "Conferma la tua nuova password" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Nome completo" - }, - "email": { - "label": "Email" - }, - "language": { - "label": "Lingua" - }, - "role": { - "label": "Ruolo" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Nome completo", - "placeholder": "Inserisci il nome completo dell'utente" - }, - "email": { - "label": "Email", - "placeholder": "Inserisci l'email dell'utente" - }, - "password": { - "label": "Password", - "placeholder": "Inserisci la password dell'utente" - }, - "password_confirmation": { - "label": "Conferma password", - "placeholder": "Conferma la password" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Email" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Inserisci qui l'indirizzo...", - "text_placeholder": "Inserisci qui il testo..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Nome del ruolo", - "placeholder": "Inserisci il nome del ruolo..." - } - } - } - } - } -} diff --git a/app/assets/locales/ja.json b/app/assets/locales/ja.json deleted file mode 100644 index 4dbf63359b..0000000000 --- a/app/assets/locales/ja.json +++ /dev/null @@ -1,726 +0,0 @@ -{ - "start": "開始", - "search": "検索", - "home": "ホーム", - "previous": "前", - "back": "戻る", - "next": "次", - "view": "情報を見る", - "join": "参加", - "edit": "編集", - "save": "保存", - "save_changes": "変更を保存", - "update": "更新", - "report": "報告", - "share": "共有", - "cancel": "キャンセル", - "reset": "リセット", - "close": "閉じる", - "delete": "削除", - "copy": "参加リンクをコピー", - "copy_viewer_code": "視聴者用コードをコピーする", - "copy_moderator_code": "司会者用コードをコピーする", - "or": "もしくは", - "online": "オンライン", - "help_center": "ヘルプセンター", - "are_you_sure": "本当によろしいですか?", - "return_home": "ホームに戻る", - "created_at": "作成時", - "view_recordings": "録画を視聴", - "join_session": "会議に参加", - "no_result_search_input": "\"{{ searchInput }}\"は見つかりませんでした", - "action_permanent": "この操作は取り消すことができません", - "homepage": { - "welcome_bbb": "BigBlueButton へようこそ", - "bigbluebutton_description": "BigBlueButtonは、オンライン授業に最適化された、オープンソースのウェブ会議システムです。生徒や学生が協働し、すぐにフィードバックが得られるようにすることで、より多くの時間を実践的な学びにあてることができます。", - "greenlight_description": "自分の会議室を作成し、会議を開いてみてください。簡単なリンクを使って手軽に他人を招待することもできます。", - "learn_more": "BigBlueButtonについてもっと知る", - "explore_features": "基本的な機能", - "meeting_title": "会議を立ち上げる", - "meeting_description": "ビデオ、音声、画面共有、チャットなど、実践的な学びに必要な全てのツールを備えた、仮想授業を立ちあげることができます。", - "recording_title": "会議を録画する", - "recording_description": "BigBlueButtonの会議を録画し、それを生徒や学生と共有することで、教材を効果的に復習させることができます。", - "settings_title": "会議室を管理する", - "settings_description": "自分の会議室や会議方法の設定を変更し、効果的な学びの場を作り上げることができます。", - "and_more_title": "それだけではありません", - "and_more_description": "BigBlueButtonには実践的な学びのためのさまざまなツールが用意されており、授業を効率的に行うことができるようデザインされています。", - "enter_meeting_url": "会議URLを入力", - "enter_meeting_url_instruction": "下の欄にBigBlueButtonの会議のURLを記入してください。" - }, - "authentication": { - "sign_in": "サインイン", - "sign_up": "登録する", - "sign_out": "サインアウト", - "email": "メールアドレス", - "password": "パスワード", - "confirm_password": "パスワード確認", - "enter_email": "メールアドレスを入力してください", - "enter_name": "名前を入力してください", - "remember_me": "ログイン状態を保存", - "forgot_password": "パスワードをお忘れですか?", - "dont_have_account": "アカウントをお持ちではありませんか?", - "create_account": "アカウント作成", - "create_an_account": "アカウントを作成します", - "already_have_account": "すでにアカウントをお持ちですか?" - }, - "user": { - "user": "ユーザー", - "users": "ユーザー", - "name": "名前", - "email_address": "メールアドレス", - "authenticator": "承認者", - "full_name": "フルネーム", - "no_user_found": "該当ユーザーは存在しません", - "type_three_characters": "他のユーザーを表示させるには、3文字以上入力してください。", - "search_not_found": "ユーザーが見つかりません", - "profile": { - "profile": "個人設定", - "language": "言語", - "role": "役割", - "administrator": "管理者", - "guest": "ゲスト" - }, - "account": { - "account_info": "アカウント情報", - "delete_account": "アカウント削除", - "change_password": "パスワード変更", - "set_password": "新しいパスワードを入力", - "reset_password": "パスワード再設定", - "update_account_info": "アカウント情報の更新", - "current_password": "現在のパスワード", - "new_password": "新規パスワード", - "confirm_password": "パスワード確認", - "permanently_delete_account": "アカウントを完全に削除", - "delete_account_description": "削除したアカウントは二度と元に戻せません。 \n アカウントに関するすべての情報、すなわち設定、会議室、録画などが消去されます。", - "delete_account_confirmation": "はい、アカウントを削除します", - "are_you_sure_delete_account": "本当にこのアカウントを削除しますか?" - }, - "avatar": { - "upload_avatar": "アバターのアップロード", - "delete_avatar": "アバターの削除", - "crop_avatar": "アバター画像の切り出し" - }, - "pending": { - "title": "登録保留中", - "message": "登録していただきありがとうございます。現在、アカウント作成の可否について管理者の判断を待っています。" - } - }, - "room": { - "room": "会議室", - "rooms": "会議室", - "room_name": "会議室名", - "add_new_room": "+新しい会議室", - "create_room": "会議室の作成", - "delete_room": "この会議室を削除", - "create_new_room": "新しい会議室を作成する", - "enter_room_name": "会議室名を入力してください", - "shared_by": "共有者", - "last_session": "最後の会議: {{ localizedTime }}", - "no_last_session": "会議はまだ開かれていません", - "search_not_found": "会議室が見つかりません", - "rooms_list_is_empty": "まだ会議室はありません!", - "rooms_list_empty_create_room": "下のボタンをクリックし、部屋の名前を入力して最初の会議室を作成しましょう。", - "meeting": { - "start_meeting": "会議を開始", - "join_meeting": "会議に参加", - "meeting_invitation": "会議に招待されました", - "meeting_not_started": "会議はまだ始まっていません", - "join_meeting_automatically": "会議が始まれば自動的に参加します", - "recording_consent": "私はこの会議が録画される可能性があること、また自分の音声とビデオもそれに含まれうることを理解しています。" - }, - "presentation": { - "presentation": "プレゼンファイル", - "click_to_upload": "クリックしてアップロード", - "drag_and_drop": "またはドラッグ&ドロップ", - "upload_description": "OfficeドキュメントかPDFファイル(サイズ{{size}}以下)をアップロードしてください。ファイルの大きさによっては、使用可能になるまでに少し時間がかかるかもしれません。", - "delete_presentation": "プレゼンファイルを削除", - "are_you_sure_delete_presentation": "本当にこのプレゼンファイルを削除しますか?" - }, - "shared_access": { - "access": "接続", - "add_share_access": "+接続を共有", - "share_room_access": "会議室への接続を共有", - "add_some_users": "ユーザーを追加しましょう!", - "add_some_users_description": "ユーザーを追加するには下のボタンをクリックし、この会議室を共有したいユーザーを探して選択してください。", - "delete_shared_access": "共有アクセスを消去", - "are_you_sure_delete_shared_access": "本当にこの共有アクセスを消去しますか?" - }, - "settings": { - "settings": "設定", - "room_name": "会議室名", - "user_settings": "ユーザー設定", - "allow_room_to_be_recorded": "会議室の録画を許可", - "require_signed_in": "参加前にユーザーのサインインを求める", - "require_signed_in_message": "この会議への入室にはサインインが必要です。", - "require_mod_approval": "参加に司会者の許可を必須とする", - "allow_any_user_to_start": "誰でもこの会議を開始可能とする", - "all_users_join_as_mods": "全てのユーザーが司会者として参加する", - "mute_users_on_join": "参加時にユーザーをミュートする", - "generate": "作成", - "access_code": "接続コード", - "mod_access_code": "司会者接続コード", - "mod_access_code_optional": "司会者用接続コード(任意で設定)", - "access_code_required": "接続コードを入力してください", - "wrong_access_code": "誤った接続コード", - "generate_viewers_access_code": "視聴者用接続コードを作成する", - "generate_mods_access_code": "司会者用接続コードを作成する", - "server_tag": "この会議室のサーバタイプを選択", - "default_tag_name": "通常", - "server_tag_desired": "最適", - "server_tag_required": "最小", - "are_you_sure_delete_room": "本当にこの会議室を削除しますか?" - } - }, - "recording": { - "recording": "録画", - "recordings": "録画", - "processing": "録画を処理しています...", - "name": "名前", - "length": "長さ", - "users": "参加者", - "visibility": "公開度", - "formats": "フォーマット", - "published": "限定公開", - "unpublished": "閲覧不可", - "protected": "保護", - "public": "公開", - "public_protected": "公開 / 保護", - "length_in_minutes": "{{recording.length}}分", - "processing_recording": "録画を処理中。数分かかることがあります...", - "copy_recording_urls": "録画のURLをコピー", - "recordings_list_empty": "まだ録画がありません!", - "public_recordings_list_empty": "公開された録画はまだありません!", - "recordings_list_empty_description": "会議を開始し、それを録画すると、ここに録画データが表示されます。", - "public_recordings_list_empty_description": "視聴が許可されると、ここに録画データが表示されます。", - "delete_recording": "この録画を削除", - "are_you_sure_delete_recording": "本当にこの録画を削除しますか?", - "search_not_found": "録画が見つかりません" - }, - "admin": { - "admin_panel": "管理者設定", - "manage_users": { - "manage_users": "ユーザー管理", - "active": "活動中", - "approve": "承認", - "decline": "却下", - "pending": "保留", - "banned": "ロック", - "ban": "ロックする", - "unban": "ロックを解除する", - "unverified": "未承認", - "verify": "承認", - "deleted": "削除", - "invited_tab": "招待", - "invite_user": "ユーザーを招待", - "send_invitation": "招待状を送る", - "enter_user_email": "ユーザーのメールアドレスを入力", - "new_user": "新規ユーザー", - "add_new_user": "新規ユーザー", - "create_new_user": "ユーザーを新しく作成する", - "edit_user": "ユーザーの編集", - "delete_user": "このユーザーを削除", - "users_edit_path": "ユーザー/編集", - "create_account": "アカウント作成", - "create_room": "会議室作成", - "create_new_room": "新しい会議室を作成", - "user_created_at": "作成日時: {{localizedTime}}", - "are_you_sure_delete_account": "本当に{{user.name}}のアカウントを削除しますか?", - "delete_account_warning": "このアカウントを削除すると、二度と元にもどすことはできません。", - "empty_active_users": "このサーバーでは、活動中のユーザーはまだいません!", - "empty_active_users_subtext": "ユーザーの状態が「活動中」に変わると、こちらに表示されます。", - "empty_pending_users": "このサーバーには、保留中のユーザーはまだいません!", - "empty_pending_users_subtext": "ユーザーの状態が「保留」に変わると、こちらに表示されます。", - "empty_banned_users": "このサーバーには、ロックされているユーザーはまだいません!", - "empty_banned_users_subtext": "ユーザーの状態がロックに変わると、こちらに表示されます。", - "empty_unverified_users": "このサーバーには、未承認のユーザーはまだ一人もいません!", - "empty_unverified_users_subtext": "未承認のユーザーがいる場合はここに表示されます。", - "empty_invited_users": "このサーバーには、招待されているユーザーはまだいません!", - "empty_invited_users_subtext": "ユーザーの状態が招待中に変わると、こちらに表示されます。", - "invited": { - "time_sent": "送付日時", - "valid": "有効", - "revoke": "取り消す" - } - }, - "server_rooms": { - "server_rooms": "全ての会議室", - "name": "名前", - "owner": "オーナー", - "room_id": "会議室ID", - "participants": "参加者", - "status": "状況", - "running": "会議中", - "not_running": "使われていません", - "active": "アクティブ", - "current_session": "現在の会議: {{lastSession}}", - "last_session": "最後の会議: {{localizedTime}}", - "no_meeting_yet": "会議は一度も行われていません。", - "delete_server_rooms": "全ての会議室を削除", - "resync_recordings": "録画の再同期", - "empty_room_list": "まだ会議室はひとつもありません!", - "empty_room_list_subtext": "最初の会議室が作成されると、こちらに表示されます。" - }, - "server_recordings": { - "server_recordings": "全ての録画", - "latest_recordings": "最近の録画", - "no_recordings_found": "録画がありません" - }, - "site_settings": { - "site_settings": "サイトの設定", - "customize_greenlight": "Greenlightのカスタマイズ", - "appearance": { - "appearance": "外観", - "brand_color": "サイトの基調色", - "regular": "標準色", - "lighten": "明色", - "brand_image": "ブランド画像", - "click_to_upload": "クリックしてアップロード", - "drag_and_drop": "あるいはドラッグ&ドロップ", - "upload_brand_image_description": "PNG、JPG、SVGファイル(サイズ{{size}}以下)をアップロードしてください。ファイルの大きさによっては、使用可能になるまでに少し時間がかかるかもしれません。", - "remove_branding_image": "ブランド画像の削除" - }, - "administration": { - "administration": "法的根拠", - "terms": "利用規約", - "privacy": "プライバシーに関する告知", - "privacy_policy": "プライバシーに関する告知", - "change_term_links": "ページ下方の利用規約へのリンクを変更する", - "change_privacy_link": "ページ下方のプライバシーポリシーへのリンクを変更する", - "helpcenter": "ヘルプセンター", - "change_helpcenter_link": "プロフィールのドロップダウンメニュー内に表示されるヘルプセンターのリンクを変更", - "maintenance": "メンテナンスバナー", - "change_maintenance_text": "ヘッダーに表示されるメンテナンスバナーの文章を変更する", - "change_url": "URL変更", - "set_text": "文章を設定", - "clear_banner": "バナーを消去", - "enter_link": "リンクをここに入力" - }, - "settings": { - "settings": "設定", - "allow_users_to_share_rooms": "ユーザーに会議室の共有を許可", - "allow_users_to_share_rooms_description": "無効に設定した場合、各会議室のドロップダウンからボタンが削除され、ユーザーが会議室を共有できなくなります", - "allow_users_to_preupload_presentation": "ユーザーにプレゼンファイルの事前アップロードを許可", - "allow_users_to_preupload_presentation_description": "ユーザーがプレゼンファイルを事前にアップロードし、この会議室専用の標準プレゼンとして使用できるようになります", - "show_sign_in_on_room_join": "入室時にサインインリンクを表示する", - "show_sign_in_on_room_join_description": "もしユーザーがサインインしていない場合、入室時にウィンドウ下部にサインインのためのリンクが現れます", - "default_visibility": "デフォルトの録画公開度", - "default_visibility_description": "新しい録画は、まずは全てこの公開度となります。", - "session_timeout": "セッションの継続時間", - "session_timeout_description": "セッションの継続時間は、通常のクッキー設定では1日ですが、7日間の延長設定とすることもできます", - "default_session_timeout": "通常(1日)", - "extended_session_timeout": "延長(7日間)" - }, - "registration": { - "registration": "ユーザー登録", - "role_mapping_by_email": "メールアドレスによる役割の割り当て", - "role_mapping_by_email_description": "メールアドレスによって、割り当てられる役割を固定します。役割1=メール1, 役割2=メール2、の形式にしてください。", - "enter_role_mapping_rule": "役割割り当てルールを入力", - "resync_on_login": "サインインごとにユーザーのデーターを再同期", - "resync_on_login_description": "サインインのたびにユーザーの情報を再同期し、外部の承認提供者の情報とGreenlightの情報とを常に一致させます", - "default_role": "標準の役割", - "default_role_description": "新しく作成されたユーザーにはこの役割が自動的に割り当てられます", - "registration_method": "登録方法", - "registration_method_description": "ユーザーがこのサイトに登録する方法を変更します", - "registration_methods" : { - "open": "誰でも自由に登録", - "invite": "招待制", - "approval": "承認制" - }, - "allowed_domains": "許可するEmailのドメイン", - "allowed_domains_signup_description": "特定のEmailドメインのみからのサインアップを許可します。@test.com や domain.com のような形式で記入してください。", - "enter_allowed_domains_rule" : "許可するドメインを入力" - } - }, - "room_configuration": { - "room_configuration": "会議室の設定", - "default": "選択(通常は有効)", - "optional": "選択(通常は無効)", - "enabled": "常に許可", - "disabled": "無効", - "configurations": { - "allow_room_to_be_recorded": "会議室の録画を許可", - "allow_room_to_be_recorded_description": "会議室のオーナーが、会議の録画機能の有無を決められるようになります。これをオンにしたとしても、録画を開始するためには、司会者が\"録画\"ボタンを押す必要があります。", - "require_user_signed_in": "参加前にユーザーのサインインを求める", - "require_user_signed_in_description": "Greenlightのアカウントを持つユーザーのみが会議に参加できます。もしサインインなしで参加しようとした場合、ログインページに差し戻されます。", - "require_mod_approval": "参加に司会者の許可を必須とする", - "require_mod_approval_description": "会議への参加希望に対し、許可するかどうか、司会者にその都度問い合わせます。許可されてはじめてユーザーは参加できます。", - "allow_any_user_to_start_meeting": "誰でもこの会議を開始可能とする", - "allow_any_user_to_start_meeting_description": "全てのユーザーがいつでも会議を開始することを許可します。通常は、会議室のオーナーだけが会議を開始できます。", - "allow_users_to_join_as_mods": "全てのユーザーを司会者として参加させる", - "allow_users_to_join_as_mods_description": "全てのユーザーに、会議に参加した時点で司会者の権限をあたえます", - "mute_users_on_join": "参加時にユーザーをミュートする", - "mute_users_on_join_description": "ユーザーが会議に参加した時、自動的にミュートします。", - "viewer_access_code": "視聴者用接続コード", - "viewer_access_code_description": "会議室のオーナーに、ユーザーと共有可能な、ランダムな英数字コードの発行を許可します。このコードが発行されると、ユーザーが会議に参加するにはその入力が必須となります。", - "mod_access_code": "司会者用接続コード", - "mod_access_code_description": "会議室のオーナーに、ユーザーと共有可能な、ランダムな英数字コードの発行を許可します。このコードは、ユーザーが会議に参加する際には必要ありませんが、使用するとユーザーが司会者として会議に参加できるようになります。" - } - }, - "roles": { - "role": "役割", - "roles": "役割", - "administrator": "管理者", - "guest": "ゲスト", - "manage_roles": "役割管理", - "delete_role": "この役割を削除", - "are_you_sure_delete_role": "本当にこの役割を削除しますか?", - "enter_role_name": "役割の名前を入力", - "add_role": "+ 役割作成", - "create_role": "役割作成", - "create_new_role": "役割を新しく作成", - "no_role_found": "役割が見つかりません。", - "search_not_found": "役割が見つかりません", - "edit": { - "create_room": "この役割のユーザーに、会議室の作成を許可する", - "record": "この役割のユーザーに、会議の録画を許可する", - "manage_users": "この役割のユーザーに、ユーザーの管理を許可する", - "manage_rooms": "この役割のユーザーに、全ての会議室の管理を許可する", - "manage_recordings": "この役割のユーザーに、全ての録画の管理を許可する", - "manage_site_settings": "この役割のユーザーに、サイト全体の設定を許可する", - "manage_roles": "この役割のユーザーに、他の役割の内容を変更することを許可する", - "shared_list": "この役割のユーザーを、会議室を共有できるユーザーのリストに含める", - "room_limit": "作成できる会議室数の制限", - "email_on_signup": "新しいユーザーが登録したときメールを受け取る", - "allowed_recording_visibility": "許可する公開度" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "ユーザーが作成されました。", - "user_updated": "ユーザーが更新されました。", - "user_deleted": "ユーザーが削除されました。", - "avatar_updated": "アバターが更新されました。", - "password_changed": "パスワードが更新されました。もう一度サインインしてください。", - "password_updated": "パスワードが更新されました。", - "account_activated": "アカウントが有効化されました。サインインしてみてください。", - "activation_email_sent": "アクチベーションメールが送信されました", - "reset_pwd_email_sent": "パスワードの再設定のためのメールが送付されましたので、ご自分のメールボックスをチェックしてみてください" - }, - "session": { - "signed_out": "無事サインアウトできました。" - }, - "room": { - "room_created": "会議室が作成されました。", - "room_updated": "会議室が更新されました。", - "room_deleted": "会議室が削除されました。", - "room_shared": "会議室が共有されました。", - "room_unshared": "会議室の共有が解除されました。", - "recordings_synced": "会議室の録画が同期されました", - "room_configuration_updated": "会議室の設定が更新されました。", - "room_setting_updated": "会議室の設定が更新されました。", - "presentation_updated": "プレゼンファイルが更新されました。", - "presentation_deleted": "プレゼンファイルが削除されました。", - "joining_meeting": "会議に参加しようとしています...", - "meeting_started": "会議が開始されました。", - "access_code_copied": "接続コードがコピーされました。", - "access_code_generated": "接続コードが作成されました。", - "access_code_deleted": "アクセスコードが消去されました。", - "copied_meeting_url": "会議のURLがコピーされました。このリンクを使用すると会議に参加できます。", - "copied_viewer_code": "視聴者用のアクセスコードがコピーされました。", - "copied_moderator_code": "司会者用のアクセスコードがコピーされました。" - }, - "site_settings": { - "site_setting_updated": "サイトの設定が更新されました。", - "brand_color_updated": "サイトの基調色がアップデートされました。", - "brand_image_updated": "ブランド画像がアップデートされました。", - "brand_image_deleted": "ブランド画像が消去されました。", - "privacy_policy_updated": "プライバシーに関する告知がアップデートされました。", - "helpcenter_updated": "ヘルプセンターのリンクが更新されました。", - "terms_of_service_updated": "利用規約が更新されました。", - "maintenance_updated": "メンテナンスバナーが更新されました。", - "allowed_domains_signup_updated": "許可するEmailのドメインが更新されました。" - }, - "recording": { - "recording_visibility_updated": "録画の公開度が更新されました。", - "recording_name_updated": "録画名が更新されました。", - "recording_deleted": "録画が削除されました。", - "copied_urls": "録画のURLがコピーされました。" - }, - "role": { - "role_created": "役割が作成されました。", - "role_updated": "役割が更新されました。", - "role_deleted": "役割が削除されました。", - "role_permission_updated": "この役割の権限が更新されました。" - }, - "invitations": { - "invitation_sent": "招待状が送付されました", - "invitation_revoked": "招待状を取り消しました" - } - }, - "error": { - "problem_completing_action": "操作をうまく完了できませんでした。\nもう一度やってみてください。", - "server_type_unavailable": "希望されたサーバタイプは利用できません。別のタイプを部屋の設定から選んでください。", - "file_type_not_supported": "ファイルの形式がサポートされていません。", - "file_size_too_large": "ファイルが大きすぎます。", - "file_upload_error": "ファイルがアップロードできません。", - "signin_required": "このページに接続するにはサインインが必要です", - "malware_detected": "マルウェアが検出されました!アップロードしたファイルにはマルウェアが含まれている可能性があります。ファイルを確認して、もう一度試してください。", - "roles": { - "role_assigned": "この役割はすでにユーザーに割り当てられているため、削除できません。" - }, - "users": { - "signup_error": "サインインでエラーが生じました。管理者に連絡してください。", - "invalid_invite": "あなたの招待トークンはすでに無効か、誤ったものです。管理者に連絡して、新しいものを受け取ってください。", - "email_exists": "このメールアドレスで作成されたアカウントが既に存在します。他のメールアドレスでもう一度試してみてください。", - "old_password": "入力された現パスワードは正しくありません", - "pending": "あなたの登録申請は、管理者の許可待ちです", - "banned": "このアプリケーションに接続できません。もし何かの間違いであると思われたら、管理者に直接連絡してみてください" - }, - "rooms": { - "room_limit": "会議室の数が上限に達したため、新たに作成することができません" - }, - "session": { - "invalid_credentials": "ユーザー名とパスワードが正しくありません。確認の上、もう一度入力してみてください。" - } - } - }, - "global_error_page": { - "title": "エラー", - "message": "問題が発生したようです!同じことが起きるようでしたら、管理者に連絡してください。" - }, - "not_found_error_page": { - "title": "ページが見つかりません", - "message": "接続しようとしているページが見つかりません!" - }, - "account_activation_page": { - "title": "アカウントの有効化", - "account_unverified": "あなたのアカウントはまだ認証されていません。", - "message": "Greenlightを使用するために、送付されたアクチベーションメールの指示に従い、アカウントの認証を行ってください。", - "resend_activation_link": "アクチベーションメールが届かない、もしくはメールに問題がある場合、下の再送ボタンをクリックして新しいメールを送付してみてください。", - "resend_btn_lbl": "認証メールの再送" - }, - "forms": { - "validations": { - "full_name": { - "required": "名前を入力してください", - "min": "名前は少なくとも2文字必要です", - "max": "名前は最大255文字です" - }, - "email": { - "required": "メールアドレスを入力してください", - "email": "入力された文字列はメールアドレスの形式と一致しません", - "min": "メールアドレスは少なくとも6文字必要です", - "max": "メールアドレスは最大で255文字です" - }, - "password": { - "required": "パスワードを入力してください", - "match": "パスワードの条件は:", - "min": "- 全長8文字以上", - "lower": "- 1文字以上の英小文字", - "upper": "- 1文字以上の英大文字", - "digit": "- 1文字以上の数字", - "symbol": "- 1文字以上の記号", - "max": "パスワードは最大255文字です" - }, - "password_confirmation": { - "required": "確認のためパスワードを再入力してください", - "match": "2つのパスワードが一致しません" - }, - "emails": { - "required": "有効なメールアドレスを少なくとも一つ入力してください", - "list": "有効なメールアドレスのリストをコンマで区切って入力してください(例:user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "役割名を入力してください" - }, - "role": { - "limit": { - "required": "作成可能な会議室数を入力してください", - "min": "最小は0です", - "max": "最大は100です" - }, - "type": { - "error": "半角数字で指定してください" - } - }, - "room": { - "name": { - "required": "会議室名を入力してください", - "min": "名前は2文字以上必要です" - } - }, - "room_join": { - "name": { - "required": "名前を入力してください。" - } - }, - "url": { - "invalid": "無効なURL" - }, - "text_form": { - "value": { - "required": "何かメッセージを入力してください" - } - } - }, - "room": { - "fields": { - "name": { - "label": "会議室名", - "placeholder": "会議室名を入力..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "名前", - "placeholder": "名前を入力してください" - }, - "access_code": { - "label": "アクセスコード", - "placeholder": "アクセスコードを入力してください" - }, - "recording_consent": { - "label": "私はこの会議が録画される可能性があること、また自分の音声とビデオもそれに含まれうることを理解しています。" - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "名前", - "placeholder": "フルネームを入力" - }, - "email": { - "label": "メールアドレス", - "placeholder": "メールアドレス入力" - }, - "password": { - "label": "パスワード", - "placeholder": "パスワード作成" - }, - "password_confirmation": { - "label": "パスワード確認", - "placeholder": "パスワード確認" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "メールアドレス", - "placeholder": "メールアドレス入力" - }, - "password": { - "label": "パスワード", - "placeholder": "パスワード入力" - }, - "remember_me": { - "label": "ログイン状態を維持" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "現在のパスワード", - "placeholder": "パスワードを入力" - }, - "new_password": { - "label": "新しいパスワード", - "placeholder": "新しいパスワードを入力" - }, - "password_confirmation": { - "label": "パスワード確認", - "placeholder": "新しいパスワードを確認" - } - }, - "validations": { - "old_password": { - "required": "現在のパスワードを入力してください" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "メールアドレス", - "placeholder": "アカウントのメールアドレスを入力" - } - }, - "validations": { - "email": { - "required": "アカウント作成に使用したメールアドレスを入力してください" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "新しいパスワード", - "placeholder": "新しいパスワードを入力してください" - }, - "password_confirmation": { - "label": "パスワード確認", - "placeholder": "新しいパスワードをもう一度確認してください" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "名前" - }, - "email": { - "label": "メールアドレス" - }, - "language": { - "label": "言語" - }, - "role": { - "label": "役割" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "名前", - "placeholder": "フルネームを入力" - }, - "email": { - "label": "メールアドレス", - "placeholder": "メールアドレスを入力" - }, - "password": { - "label": "パスワード", - "placeholder": "パスワードを入力" - }, - "password_confirmation": { - "label": "パスワード確認", - "placeholder": "入力したパスワードを確認" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "メールアドレス" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "ここにリンクを入力...", - "text_placeholder": "文章をここに入力..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "役割名", - "placeholder": "役割名を入力..." - } - } - } - } - } -} diff --git a/app/assets/locales/ko_KR.json b/app/assets/locales/ko_KR.json deleted file mode 100644 index 2cbe00fcec..0000000000 --- a/app/assets/locales/ko_KR.json +++ /dev/null @@ -1,720 +0,0 @@ -{ - "start": "시작", - "search": "검색", - "home": "홈", - "previous": "이전", - "back": "뒤로", - "next": "다음", - "view": "보기", - "join": "참여하기", - "edit": "편집", - "save": "저장하기", - "save_changes": "변경사항 저장", - "update": "업데이트", - "report": "보고서", - "share": "공유", - "cancel": "취소", - "reset": "리셋", - "close": "닫기", - "delete": "삭제", - "copy": "참여 링크 복사", - "copy_viewer_code": "뷰어 코드 복사", - "copy_moderator_code": "모데라토 코드 복사", - "or": "또는", - "online": "온라인", - "help_center": "도움말 센터", - "are_you_sure": "확실합니까?", - "return_home": "홈으로 돌아가기", - "created_at": "에서 생성", - "view_recordings": "레코딩 보기", - "join_session": "세션에 참여", - "no_result_search_input": "\"{{ searchInput }}\"에 대한 결과를 찾을 수 없습니다.", - "action_permanent": "이 작업은 실행 취소할 수 없습니다.", - "homepage": { - "welcome_bbb": "BigBlueButton에 오신 것을 환영합니다.", - "bigbluebutton_description": "BigBlueButton은 온라인 수업을 위한 오픈 소스 웹 회의 시스템입니다. 이 플랫폼은 학생들이 실시간으로 협업하고 피드백을 받을 수 있도록 함으로써 응용 학습 시간을 극대화합니다.", - "greenlight_description": "세션을 호스트할 자신의 룸을 만들거나 짧고 편리한 연결을 사용하여 다른 룸에 참여합니다.", - "learn_more": "BigBlueButton에 대해 자세히 알아보기", - "explore_features": "당사의 기능을 살펴보십시오", - "meeting_title": "미팅 시작", - "meeting_description": "비디오, 오디오, 화면 공유, 채팅 및 적용된 학습에 필요한 모든 도구로 가상 수업을 시작합니다.", - "recording_title": "미팅 녹화", - "recording_description": "BigBlueButton의 미팅을 기록하고 학생들과 공유하여 자료를 검토하고 성찰합니다.", - "settings_title": "룸 관리", - "settings_description": "효율적인 강의실을 구성하도록 회의실 및 회의 설정을 설정합니다.", - "and_more_title": "그리고 더!", - "and_more_description": "BigBlueButton은 응용 학습을 위한 내장된 도구를 제공하여 수업 시간을 절약할 수 있도록 설계되었습니다.", - "enter_meeting_url": "미팅 URL 입력", - "enter_meeting_url_instruction": "아래 필드에 BigBlueButton 미팅룸의 URL을 입력하십시오." - }, - "authentication": { - "sign_in": "로그인", - "sign_up": "등록하기", - "sign_out": "로그아웃", - "email": "이메일", - "password": "패스워드", - "confirm_password": "패스워드 확인", - "enter_email": "이메일 입력", - "enter_name": "이름 입력", - "remember_me": "기억하기", - "forgot_password": "패스워드를 잊어버렸습니까?", - "dont_have_account": "계정이 없습니까?", - "create_account": "계정 생성", - "create_an_account": "계정 생성", - "already_have_account": "이미 계정이 있습니까?" - }, - "user": { - "user": "사용자", - "users": "사용자들", - "name": "이름", - "email_address": "이메일 주소", - "authenticator": "인증", - "full_name": "전체 이름", - "no_user_found": "사용자를 찾을 수 없습니다.", - "type_three_characters": "다른 사용자를 표시하려면 세(3)자 이상을 입력하십시오.", - "search_not_found": "사용자를 찾을 수 없습니다.", - "profile": { - "profile": "프로필", - "language": "언어", - "role": "역할", - "administrator": "관리자", - "guest": "손님" - }, - "account": { - "account_info": "계정 정보", - "delete_account": "계정 삭제", - "change_password": "패스워드 변경", - "set_password": "새로운 패스워드 설정", - "reset_password": "패스워드 초기화", - "update_account_info": "계정 정보 업데이트", - "current_password": "현재 패스워드", - "new_password": "새로운 패스워드", - "confirm_password": "패스워드 확인", - "permanently_delete_account": "계정 영구 삭제", - "delete_account_description": "계정을 삭제하도록 선택하면 복구할 수 없습니다. \n설정, 회의실 및 기록을 포함한 계정에 대한 모든 정보가 제거됩니다.", - "delete_account_confirmation": "예, 제 계정을 삭제하고 싶습니다", - "are_you_sure_delete_account": "계정을 삭제하시겠습니까?" - }, - "avatar": { - "upload_avatar": "업데이트 아바타", - "delete_avatar": "아바타 삭제", - "crop_avatar": "아바타 자르기" - }, - "pending": { - "title": "등록 대기", - "message": "등록해 주셔서 감사합니다! 계정이 현재 관리자의 승인 대기 중입니다." - } - }, - "room": { - "room": "Room", - "rooms": "Room들", - "room_name": "Room 이름", - "add_new_room": "새로운 Room", - "create_room": "Room 생성", - "delete_room": "Room 삭제", - "create_new_room": "새로운 Room 생성", - "enter_room_name": "Room 이름 입력", - "shared_by": "에 의해 공유", - "last_session": "마지막 세션: {{ localizedTime }}", - "no_last_session": "이전 세션이 생성되지 않았습니다", - "search_not_found": "Room을 찾을 수 없음", - "rooms_list_is_empty": "아직 소유한 Room이 없습니다.", - "rooms_list_empty_create_room": "아래 단추를 누른 후 Room 이름을 입력하여 첫 번째 Room을 생성할 수 있습니다.", - "meeting": { - "start_meeting": "미팅 시작", - "join_meeting": "미팅 참여", - "meeting_invitation": "가입 초대를 받았습니다.", - "meeting_not_started": "미팅이 아직 시작되지 않았습니다", - "join_meeting_automatically": "미팅이 시작될 때 자동으로 참여합니다", - "recording_consent": "이 세션이 녹화될 수 있고 이를 허락합니다. 이 세션에서 녹화가 진행될 경우 내 음성 및 비디오가 포함될 수 있습니다." - }, - "presentation": { - "presentation": "프레젠테이션", - "click_to_upload": "업로드하려면 클릭하세요.", - "drag_and_drop": "또는 드래그 앤 드롭", - "upload_description": "사무실 문서 또는 PDF 파일({{size}}이하)을 업로드합니다. 파일 크기에 따라 파일을 사용하려면 업로드하는 데 추가 시간이 필요할 수 있습니다", - "delete_presentation": "프레젠테이션 삭제", - "are_you_sure_delete_presentation": "이 프레젠테이션을 삭제하시겠습니까?" - }, - "shared_access": { - "access": "액세스", - "add_share_access": "+ 액세스 공유", - "share_room_access": "공유 Room 액세스", - "add_some_users": "사용자를 추가할 시간입니다!", - "add_some_users_description": "새 사용자를 추가하려면 아래 단추를 누른 후 Room을 공유할 사용자를 검색하거나 선택하십시오.", - "delete_shared_access": "공유 액세스 삭제", - "are_you_sure_delete_shared_access": "이 공유 액세스를 삭제하시겠습니까?" - }, - "settings": { - "settings": "설정", - "room_name": "Room 이름", - "user_settings": "사용자 설정", - "allow_room_to_be_recorded": "Room 녹화 허용", - "require_signed_in": "가입하기 전에 사용자가 로그인하도록 요구", - "require_signed_in_message": "이 Room에 참가하려면 로그인해야 합니다.", - "require_mod_approval": "참가하기 전에 진행자 승인 필요", - "allow_any_user_to_start": "모든 사용자가 이 미팅을 시작할 수 있도록 허용", - "all_users_join_as_mods": "모든 사용자가 진행자로 참가", - "mute_users_on_join": "사용자가 참가할 때 음소거", - "generate": "생성", - "access_code": "액세스 코드", - "mod_access_code": "진행자용 액세스 코드", - "mod_access_code_optional": "진행자용 액세스 코드 (선택)", - "access_code_required": "액세스 코드를 입력하세요", - "wrong_access_code": "잘못된 액세스 코드입니다.", - "generate_viewers_access_code": "참여자용 액세스 코드 생성", - "generate_mods_access_code": "진행자용 액세스 코드 생성", - "server_tag": "이 방에 대한 서버 유형 선택", - "default_tag_name": "기본", - "server_tag_desired": "요청", - "server_tag_required": "필수", - "are_you_sure_delete_room": "이 Room을 삭제 하시겠습니까?" - } - }, - "recording": { - "recording": "녹화", - "recordings": "녹화", - "processing": "레코딩 처리 중...", - "name": "이름", - "length": "길이", - "users": "사용자", - "visibility": "가시성", - "formats": "형식", - "published": "게시됨", - "unpublished": "게시되지 않음", - "protected": "보호", - "public": "공개", - "public_protected": "공개/보호", - "length_in_minutes": "{{recording.length}} 분.", - "processing_recording": "녹화를 인코딩 중입니다. 몇 분 정도 걸릴 수 있습니다...", - "copy_recording_urls": "녹화 Url(S) 복사", - "recordings_list_empty": "아직 녹화되지 않았습니다!", - "public_recordings_list_empty": "아직 공개된 녹음이 없습니다!", - "recordings_list_empty_description": "미팅을 중 녹화된 기록이 여기에 나타납니다.", - "public_recordings_list_empty_description": "사용 가능할 때 녹음이 여기에 나타납니다.", - "delete_recording": "녹화 삭제", - "are_you_sure_delete_recording": "이 녹화를 삭제하시겠습니까?", - "search_not_found": "녹화된 기록을 찾을 수 없음" - }, - "admin": { - "admin_panel": "관리자 패널", - "manage_users": { - "manage_users": "사용자 관리", - "active": "활성", - "approve": "승인", - "decline": "거절", - "pending": "대기", - "banned": "금지", - "ban": "금지", - "unban": "금지 해제", - "deleted": "삭제", - "invited_tab": "초대", - "invite_user": "사용자 초대", - "send_invitation": "초대장 보내기", - "enter_user_email": "사용자 이메일 입력", - "new_user": "새로운 사용자", - "add_new_user": "새로운 사용자", - "create_new_user": "새로운 사용자 생성", - "edit_user": "사용자 편집", - "delete_user": "사용자 삭제", - "users_edit_path": "사용자 / 편집", - "create_account": "계정 생성", - "create_room": "Room 생성", - "create_new_room": "새로운 Room 생성", - "user_created_at": "생성됨: {{localizedTime}}", - "are_you_sure_delete_account": "{{user.name}}의 계정을 삭제하시겠습니까?", - "delete_account_warning": "이 계정을 삭제하면 복구할 수 없습니다.", - "empty_active_users": "이 서버에 아직 활성 사용자가 없습니다!", - "empty_active_users_subtext": "사용자 상태가 활성으로 변경되면 사용자 상태가 여기에 나타납니다.", - "empty_pending_users": "이 서버에는 아직 대기 중인 사용자가 없습니다!", - "empty_pending_users_subtext": "사용자 상태가 대기 중으로 변경되면 사용자 상태가 여기에 나타납니다.", - "empty_banned_users": "이 서버에는 아직 금지된 사용자가 없습니다!", - "empty_banned_users_subtext": "사용자 상태가 금지됨으로 변경되면 사용자 상태가 여기에 나타납니다.", - "empty_invited_users": "이 서버에는 아직 초대된 사용자가 없습니다!", - "empty_invited_users_subtext": "사용자의 상태가 초대됨으로 변경되면 여기에 나타납니다.", - "invited": { - "time_sent": "보낸 시간", - "valid": "유효한", - "revoke": "취소" - } - }, - "server_rooms": { - "server_rooms": "서버 Rooms", - "name": "이름", - "owner": "소유자", - "room_id": "Room ID", - "participants": "참가자", - "status": "상태", - "running": "실행중", - "not_running": "실행 중이 아님", - "active": "활성", - "current_session": "현재 세션: {{lastSession}}", - "last_session": "마지막 세션: {{localizedTime}}", - "no_meeting_yet": "아직 미팅이 없습니다.", - "delete_server_rooms": "Server Room 삭제", - "resync_recordings": "녹화 재동기화", - "empty_room_list": "아직 Server Room이 없습니다!", - "empty_room_list_subtext": "첫 번째 Room을 생성하면 Room이 여기에 나타납니다." - }, - "server_recordings": { - "server_recordings": "Server 녹화", - "latest_recordings": "마지막 녹화", - "no_recordings_found": "녹화 기록을 찾을 수 없습니다." - }, - "site_settings": { - "site_settings": "사이트 설정", - "customize_greenlight": "그린라이트 사용자화", - "appearance": { - "appearance": "외모", - "brand_color": "브랜드 컬러", - "regular": "보통", - "lighten": "얇게", - "brand_image": "브랜드 이미지", - "click_to_upload": "클릭하여 업로드", - "drag_and_drop": "또는 드래그 앤 드롭", - "upload_brand_image_description": "PNG, JPG 또는 SVG 파일({{size}} 이하)을 업로드합니다. 파일 크기에 따라 업로드하는 데 시간이 걸릴 수 있습니다.", - "remove_branding_image": "브랜딩 이미지 삭제" - }, - "administration": { - "administration": "관리", - "terms": "이용 약관", - "privacy": "개인 정보 보호 정책", - "privacy_policy": "개인 정보 보호 정책", - "change_term_links": "페이지 하단에 나타나는 용어 링크 변경", - "change_privacy_link": "페이지 하단에 나타나는 용어 링크 변경", - "helpcenter": "도움말 센터", - "change_helpcenter_link": "프로필 드롭다운 아래에 표시되는 도움말 센터 링크 변경", - "maintenance": "유지 관리 배너", - "change_maintenance_text": "헤더에 표시되는 유지 관리 배너 텍스트 변경", - "change_url": "URL 변경", - "set_text": "텍스트 설정", - "clear_banner": "배너 삭제", - "enter_link": "링크 입력" - }, - "settings": { - "settings": "설정", - "allow_users_to_share_rooms": "사용자의 Room 공유 허용", - "allow_users_to_share_rooms_description": "사용 불가능으로 설정하면 Room 선택사항 드롭다운 메뉴에서 버튼이 제거되어 사용자가 Room을 공유할 수 없습니다", - "allow_users_to_preupload_presentation": "사용자에게 프레젠테이션 발표자료 사전 업로드 허용", - "allow_users_to_preupload_presentation_description": "사용자는 특정 Room에서 발표자료로 사용할 프리젠테이션을 미리 업로드할 수 있습니다", - "default_visibility": "기본 녹음 가시성", - "default_visibility_description": "새로 생성된 모든 녹음은 기본적으로 이 가시성을 갖습니다.", - "session_timeout": "세션 타임아웃", - "session_timeout_description": "기본 쿠키 1일 또는 확장 세션 쿠키 7일로 세션 타임아웃을 구성할 수 있습니다", - "default_session_timeout": "기본 (1일)", - "extended_session_timeout": "확장 (7일)" - }, - "registration": { - "registration": "등록", - "role_mapping_by_email": "전자 메일별 역할 매핑", - "role_mapping_by_email_description": "전자 메일을 사용하여 사용자를 역할에 매핑합니다. role1=email1, role2=email2 형식이어야 합니다", - "enter_role_mapping_rule": "역할 매핑 규칙 입력", - "resync_on_login": "로그인할 때마다 사용자 데이터 다시 동기화", - "resync_on_login_description": "사용자가 로그인할 때마다 사용자의 정보를 다시 동기화하여 외부 인증 공급자가 항상 Greenlight의 정보와 일치하도록 합니다", - "default_role": "기본 역할", - "default_role_description": "새로 생성된 사용자에게 할당할 기본 역할", - "registration_method": "등록 방법", - "registration_method_description": "사용자가 웹 사이트에 등록하는 방법 변경", - "registration_methods" : { - "open": "공개 등록", - "invite": "초대로 참여", - "approval": "승인/거부" - }, - "allowed_domains": "허용된 이메일 도메인", - "allowed_domains_signup_description": "특정 이메일 도메인이 가입할 수 있도록 허용합니다. 형식은 @test.com,domain.com 이어야 합니다", - "enter_allowed_domains_rule" : "허용된 도메인을 입력하세요" - } - }, - "room_configuration": { - "room_configuration": "Room 구성", - "default": "선택 사항(기본값: 사용)", - "optional": "선택 사항(기본값: 사용 안 함)", - "enabled": "강제 실행", - "disabled": "사용 안함", - "configurations": { - "allow_room_to_be_recorded": "Room 녹화 허용", - "allow_room_to_be_recorded_description": "Room 소유자가 녹화 기능의 사용 여부를 지정할 수 있습니다. 활성화된 경우 진행자는 미팅이 시작된 후 Room 상단에 '녹화' 버튼이 활성화 되고 이 버튼을 클릭하면 녹화를 진행할 수 있습니다.", - "require_user_signed_in": "가입하기 전에 사용자가 로그인해야 함", - "require_user_signed_in_description": "Greenlight 계정을 가진 사용자만 미팅에 참여할 수 있습니다. 로그인하지 않은 경우, Room에 참여할 때 로그인 페이지로 되돌아 갑니다..", - "require_mod_approval": "가입하기 전에 진행자 승인 필요", - "require_mod_approval_description": "사용자가 참여하려고 할 때 BigBlueButton 미팅의 진행자에게 메시지를 표시합니다. 진행자에 의해 사용자가 승인된 경우, 사용자는 미팅에 참여할 수 있습니다.", - "allow_any_user_to_start_meeting": "누구나 미팅을 시작할 수 있도록 허용", - "allow_any_user_to_start_meeting_description": "누구나 언제든지 미팅을 시작할 수 있도록 허용합니다. 기본적으로는 Room 소유자만 미팅을 시작할 수 있습니다.", - "allow_users_to_join_as_mods": "모든 사용자가 진행자로 참여", - "allow_users_to_join_as_mods_description": "모든 사용자가 미팅에 참여할 때 진행자 권한을 부여합니다", - "mute_users_on_join": "사용자가 미팅에 참여할 때 음소거", - "mute_users_on_join_description": "사용자가 미팅에 참여할 때 자동으로 음소거됨", - "viewer_access_code": "참여자 액세스 코드", - "viewer_access_code_description": "Room 소유자가 참여자와 공유할 수 있는 임의의 영문,숫자 코드를 가질 수 있습니다. 생성된 코드는 사용자가 Room 미팅에 참여하는 데 필요합니다.", - "mod_access_code": "진행자 액세스 코드", - "mod_access_code_description": "Room 소유자는 참여자와 공유할 수 있는 임의의 영문, 숫자 코드를 가질 수 있습니다. Room 미팅에서 사용자가 처음부터 진행자로 참여하면 작성된 코드는 필요하지 않습니다. " - } - }, - "roles": { - "role": "역할", - "roles": "역할", - "administrator": "관리자", - "guest": "손님", - "manage_roles": "역할 관리", - "delete_role": "역할 삭제", - "are_you_sure_delete_role": "이 역할을 삭제하시겠습니까?", - "enter_role_name": "역할 이름 입력", - "add_role": "+ 역할 생성", - "create_role": "역할 생성", - "create_new_role": "새로운 역할 생성", - "no_role_found": "역할을 찾을 수 없습니다.", - "search_not_found": "역할을 찾을 수 없음", - "edit": { - "create_room": "이 역할을 가진 사용자에게 Room 생성 허용", - "record": "이 역할을 가진 사용자에게 미팅 녹화 허용", - "manage_users": "이 역할을 가진 사용자에게 사용자 관리 허용", - "manage_rooms": "이 역할을 가진 사용자에게 서버 Room 관리 허용", - "manage_recordings": "이 역할을 가진 사용자에게 서버 녹화 관리 허용", - "manage_site_settings": "이 역할을 가진 사용자에게 사이트 설정 관리 허용", - "manage_roles": "이 역할을 가진 사용자가 다른 역할을 편집하도록 허용", - "shared_list": "Room 공유 드롭다운 메뉴에 이 역할을 가진 사용자 포함", - "room_limit": "Room 제한", - "email_on_signup": "새 사용자가 가입하면 이메일을 받습니다.", - "allowed_recording_visibility": "허용된 녹음 가시성" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "새 사용자가 생성되었습니다.", - "user_updated": "사용자가 업데이트되었습니다.", - "user_deleted": "사용자가 삭제되었습니다.", - "avatar_updated": "아바타가 업데이트되었습니다.", - "password_changed": "비밀번호가 성공적으로 업데이트되었습니다. 다시 로그인하십시오.", - "password_updated": "암호가 업데이트되었습니다.", - "account_activated": "계정이 활성화되었습니다.", - "activation_email_sent": "계정을 활성화하기 위한 지침이 포함된 이메일이 전송되었습니다.", - "reset_pwd_email_sent": "암호를 재설정하는 방법이 포함된 이메일이 전송되었습니다." - }, - "session": { - "signed_out": "로그아웃되었습니다." - }, - "room": { - "room_created": "새 Room이 생성되었습니다.", - "room_updated": "Room이 업데이트되었습니다.", - "room_deleted": "Room이 삭제되었습니다.", - "room_shared": "Room이 공유되었습니다.", - "room_unshared": "Room 공유가 해제되었습니다.", - "recordings_synced": "Room 녹화가 동기화되었습니다.", - "room_configuration_updated": "Room 환경설정이 업데이트되었습니다.", - "room_setting_updated": "Room 설정이 업데이트되었습니다.", - "presentation_updated": "프레젠테이션이 업데이트되었습니다.", - "presentation_deleted": "프레젠테이션이 삭제되었습니다.", - "joining_meeting": "미팅에 참여하는 중...", - "meeting_started": "미팅이 시작되었습니다.", - "access_code_copied": "액세스 코드가 복사되었습니다.", - "access_code_generated": "새 액세스 코드가 생성되었습니다.", - "access_code_deleted": "액세스 코드가 삭제되었습니다.", - "copied_meeting_url": "미팅 URL이 복사되었습니다. 링크를 통하여 미팅에 참여할 수 있습니다.", - "copied_viewer_code": "뷰어 액세스 코드가 복사되었습니다.", - "copied_moderator_code": "모데라토의 액세스 코드가 복사되었습니다." - }, - "site_settings": { - "site_setting_updated": "사이트 설정이 업데이트되었습니다.", - "brand_color_updated": "브랜드 색상이 업데이트되었습니다.", - "brand_image_updated": "브랜드 이미지가 업데이트되었습니다.", - "brand_image_deleted": "브랜드 이미지가 삭제되었습니다.", - "privacy_policy_updated": "개인 정보 보호 정책이 업데이트되었습니다.", - "helpcenter_updated": "도움말 센터 링크가 업데이트되었습니다.", - "terms_of_service_updated": "서비스 약관이 업데이트되었습니다.", - "maintenance_updated": "유지 관리 배너가 업데이트되었습니다.", - "allowed_domains_signup_updated": "허용된 이메일 도메인이 업데이트되었습니다." - }, - "recording": { - "recording_visibility_updated": "녹화 가시성이 업데이트되었습니다.", - "recording_name_updated": "녹화명이 업데이트되었습니다.", - "recording_deleted": "녹화가 삭제되었습니다.", - "copied_urls": "녹화 URL이 복사되었습니다." - }, - "role": { - "role_created": "새 역할이 생성되었습니다.", - "role_updated": "역할이 업데이트되었습니다.", - "role_deleted": "역할이 삭제되었습니다.", - "role_permission_updated": "역할의 권한이 업데이트되었습니다." - }, - "invitations": { - "invitation_sent": "초대장을 보냈습니다.", - "invitation_revoked": "초대가 취소되었습니다." - } - }, - "error": { - "problem_completing_action": "작업을 완료할 수 없습니다. \n다시 시도하십시오.", - "server_type_unavailable": "요구된 서버 유형을 사용할 수 없습니다. room 설정에서 다른 유형을 선택하십시오.", - "file_type_not_supported": "파일 형식이 지원되지 않습니다.", - "file_size_too_large": "파일 크기가 너무 큽니다.", - "file_upload_error": "파일을 업로드할 수 없습니다.", - "signin_required": "이 페이지에 액세스하려면 로그인해야 합니다.", - "malware_detected": "악성 소프트웨어가 감지됨! 업로드한 파일에 악성 소프트웨어가 포함될 수 있습니다. 파일을 확인하고 다시 시도하십시오.", - "roles": { - "role_assigned": "이 역할은 적어도 한 명의 사용자에게 할당되어 있으므로 삭제할 수 없습니다." - }, - "users": { - "signup_error": "인증할 수 없습니다. 관리자에게 문의하십시오.", - "invalid_invite": "초대 토큰이 유효하지 않거나 올바르지 않습니다. 새 토큰을 받으려면 관리자에게 문의하십시오.", - "email_exists": "이 이메일의 계정이 이미 존재합니다. 다른 이메일로 다시 시도하십시오.", - "old_password": "입력하신 비밀번호가 올바르지 않습니다.", - "pending": "귀하의 등록은 관리자의 승인을 기다리고 있습니다. 나중에 다시 시도 해주십시오.", - "banned": "이 애플리케이션에 대한 액세스 권한이 없습니다. 이것이 오류라고 생각되면 관리자에게 문의하십시오." - }, - "rooms": { - "room_limit": "Room 생성 한도에 도달하여 Room을 더 이상 만들 수 없습니다." - }, - "session": { - "invalid_credentials": "사용자 이름 또는 비밀번호가 유효하지 않습니다. 자격 증명을 확인하고 다시 시도하십시오." - } - } - }, - "global_error_page": { - "title": "에러", - "message": "죄송합니다. 문제가 발생했습니다. 해당 현상이 다시 발생하면 관리자에게 문의하시기 바랍니다." - }, - "not_found_error_page": { - "title": "페이지를 찾을 수 없음", - "message": "죄송합니다. 액세스하려는 페이지를 찾을 수 없습니다." - }, - "account_activation_page": { - "title": "계정 활성화", - "account_unverified": "귀하의 계정이 아직 확인되지 않았습니다.", - "message": "Greenlight를 사용하려면 귀하에게 전송된 활성화 이메일의 지침에 따라 귀하의 계정을 확인하십시오.", - "resend_activation_link": "활성화 이메일을 받지 못하셨거나 사용에 문제가 있는 경우 아래 버튼을 클릭하여 새 활성화 이메일을 요청하십시오.", - "resend_btn_lbl": "인증 재전송" - }, - "forms": { - "validations": { - "full_name": { - "required": "이름을 입력하세요.", - "min": "이름은 2자 이상이어야 합니다.", - "max": "이름은 최대 255자여야 합니다." - }, - "email": { - "required": "이메일을 입력하세요", - "email": "입력한 값이 이메일 형식과 일치하지 않습니다.", - "min": "이메일 주소는 최소 6자 이상이어야 합니다.", - "max": "이메일 주소는 최대 255자 길이여야 합니다." - }, - "password": { - "required": "비밀번호를 입력하세요", - "match": "암호는 최소한 다음을 포함해야 합니다 :", - "min": "- 최소 8자 이상", - "lower": "- 영문 소문자 1개 이상", - "upper": "- 영문 대문자 1개 이상", - "digit": "- 최소 숫자 1개 이상", - "symbol": "- 특수 기호 최소 1개 이상", - "max": "비밀번호는 최대 255자 이하여야 합니다." - }, - "password_confirmation": { - "required": "비밀번호 확인을 입력하세요", - "match": "암호가 일치하지 않습니다" - }, - "emails": { - "required": "유효한 이메일 주소를 하나 이상 입력하세요.", - "list": "유효한 이메일 목록을 쉼표로 구분하여 제공해야 합니다(user@users.com,user1@users.com,user2@users.com )" - }, - "role_name": { - "required": "역할명을 입력하세요." - }, - "role": { - "limit": { - "required": "Romm 개수 제한을 입력하세요.", - "min": "허용되는 최소값은 0입니다.", - "max": "허용되는 최대값은 100입니다." - }, - "type": { - "error": "숫자를 지정해야 합니다." - } - }, - "room": { - "name": { - "required": "Room 이름을 입력해주세요.", - "min": "이름은 최소 2자 이상이어야 합니다." - } - }, - "room_join": { - "name": { - "required": "당신의 이름을 입력 해주세요." - } - }, - "url": { - "invalid": "잘못된 URL" - }, - "text_form": { - "value": { - "required": "메시지를 입력해주세요" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Room 이름", - "placeholder": "Room 이름을 입력하세요..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "이름", - "placeholder": "이름을 입력하세요" - }, - "access_code": { - "label": "액세스 코드", - "placeholder": "액세스 코드를 입력하세요" - }, - "recording_consent": { - "label": "이 세션이 녹화될 수 있고 이를 허락합니다. 이 세션에서 녹화가 진행될 경우 내 음성 및 비디오가 포함될 수 있습니다." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "전체 이름", - "placeholder": "이름을 입력하십시오" - }, - "email": { - "label": "이메일", - "placeholder": "이메일 입력" - }, - "password": { - "label": "패스워드", - "placeholder": "패스워드 생성" - }, - "password_confirmation": { - "label": "패스워드 확인", - "placeholder": "패스워드 확인" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "이메일", - "placeholder": "이메일" - }, - "password": { - "label": "패스워드", - "placeholder": "패스워드" - }, - "remember_me": { - "label": "기억하기" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "현재 패스워드", - "placeholder": "패스워드를 입력하세요" - }, - "new_password": { - "label": "새로운 패스워드", - "placeholder": "새로운 패스워드를 입력하세요" - }, - "password_confirmation": { - "label": "패스워드 확인", - "placeholder": "새로운 패스워드 확인" - } - }, - "validations": { - "old_password": { - "required": "현재 비밀번호를 입력하세요" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "이메일", - "placeholder": "계정 이메일 입력" - } - }, - "validations": { - "email": { - "required": "계정 이메일을 입력해주세요" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "새로운 패스워드", - "placeholder": "새로운 패스워드를 입력하세요" - }, - "password_confirmation": { - "label": "패스워드 확인", - "placeholder": "새로운 패스워드 확인" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "전체 이름" - }, - "email": { - "label": "이메일" - }, - "language": { - "label": "언어" - }, - "role": { - "label": "역할" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "전체 이름", - "placeholder": "이름을 입력하세요" - }, - "email": { - "label": "이메일", - "placeholder": "사용자 이메일 입력" - }, - "password": { - "label": "패스워드", - "placeholder": "패스워드를 입력하세요" - }, - "password_confirmation": { - "label": "패스워드 확인", - "placeholder": "패스워드 확인" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "이메일" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "링크 입력...", - "text_placeholder": "여기에 텍스트를 입력하세요." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "역할명", - "placeholder": "역할명 입력" - } - } - } - } - } -} diff --git a/app/assets/locales/nl.json b/app/assets/locales/nl.json deleted file mode 100644 index 971f253fe0..0000000000 --- a/app/assets/locales/nl.json +++ /dev/null @@ -1,651 +0,0 @@ -{ - "start": "Start", - "search": "Zoek", - "home": "Startpagina", - "previous": "Vorige", - "back": "Terug", - "next": "Volgende", - "view": "Bekijk", - "join": "Deelnemen", - "edit": "Bewerk", - "save": "Bewaar", - "save_changes": "Bewaar wijzigingen", - "update": "Pas aan", - "report": "Rapport", - "share": "Deel", - "cancel": "Annuleer", - "close": "Sluit", - "delete": "Verwijder", - "copy": "Kopieer deelnamelink", - "or": "Of", - "online": "Online", - "help_center": "Help centrum", - "are_you_sure": "Ben je zeker?", - "return_home": "Terug naar startpagina", - "created_at": "Gemaakt op", - "no_result_search_input": "Kon geen resultaten vinden voor \"{{ searchInput }}\"", - "action_permanent": "Deze actie kan niet ongedaan gemaakt worden", - "homepage": { - "welcome_bbb": "Welkom bij BigBlueButton", - "bigbluebutton_description": "BigBlueButton is een vrije software web conferentiesysteem voor online lessen. Het platform maximaliseert de tijd voor toegepast leren door het voor studenten mogelijk te maken om samen te werken en feedback te krijgen in real-time.", - "greenlight_description": "Maak je eigen kamers om vergaderingen te organiseren, of neem deel aan vergaderingen van anderen via een korte, makkelijke link.", - "learn_more": "Meer leren over BigBlueButton", - "explore_features": "Verken de mogelijkheden", - "meeting_title": "Start een vergadering", - "meeting_description": "Start een virtueel klaslokaal met video, audio, scherm delen, chat en alle tools nodig voor toegepast leren.", - "recording_title": "Neem je vergaderingen op", - "recording_description": "Neem BigBlueButton-vergaderingen op en deel ze met je studenten om ze te herbekijken en te reflecteren op het materiaal.", - "settings_title": "Beheer je kamers", - "settings_description": "Configureer je kamer- en vergaderingsinstellingen voor een effectief klasmanagement.", - "and_more_title": "En meer!", - "and_more_description": "BigBlueButton heeft ingebouwde tools voor toegepast leren en is ontworpen om tijd te besparen tijdens de les.", - "enter_meeting_url": "Geef vergaderings-URL", - "enter_meeting_url_instruction": "Geef de URL van je BigBlueButton-vergadering in het onderstaand veld." - }, - "authentication": { - "sign_in": "Inloggen", - "sign_up": "Registreren", - "sign_out": "Uitloggen", - "email": "E-mail", - "password": "Wachtwoord", - "confirm_password": "Bevestig wachtwoord", - "enter_email": "Geef je e-mailadres", - "enter_name": "Geef je naam", - "remember_me": "Aanmelding onthouden", - "forgot_password": "Wachtwoord vergeten?", - "dont_have_account": "Nog geen account?", - "create_account": "Maak een account", - "create_an_account": "Maak een account", - "already_have_account": "Heb je al een account?" - }, - "user": { - "user": "Gebruiker", - "users": "Gebruikers", - "name": "Naam", - "email_address": "E-mailadres", - "authenticator": "Authenticator", - "full_name": "Volledige naam", - "no_user_found": "Geen gebruiker gevonden", - "type_three_characters": "Typ 3 of meer tekens om andere gebruikers te tonen.", - "search_not_found": "Geen gebruikers gevonden", - "profile": { - "profile": "Profiel", - "language": "Taal", - "role": "Rol", - "administrator": "Beheerder", - "guest": "Gast" - }, - "account": { - "account_info": "Account-info", - "delete_account": "Verwijder account", - "change_password": "Wijzig wachtwoord", - "reset_password": "Wachtwoord opnieuw instellen", - "update_account_info": "Accountinfo aanpassen", - "current_password": "Huidig wachtwoord", - "new_password": "Nieuw wachtwoord", - "confirm_password": "Bevestig wachtwoord", - "permanently_delete_account": "Verwijder je account definitief", - "delete_account_description": "Als je er voor kiest om je account te verwijderen, dan zal die niet hersteld kunnen worden. Alle informatie over jouw account, ook je instellingen, kamers en opnames zullen verwijderd worden.", - "delete_account_confirmation": "Ja, ik wil mijn account verwijderen", - "are_you_sure_delete_account": "Weet je zeker dat je je account wil verwijderen?" - }, - "avatar": { - "upload_avatar": "Upload avatar", - "delete_avatar": "Verwijder avatar", - "crop_avatar": "Verklein je avatar" - }, - "pending": { - "title": "Registratie in afwachting", - "message": "Bedankt voor je registratie! Je account staat momenteel in de wachtrij voor goedkeuring door een beheerder." - } - }, - "room": { - "room": "Kamer", - "rooms": "Kamers", - "room_name": "Kamernaam", - "add_new_room": "+ nieuwe kamer", - "create_room": "Maak kamer", - "delete_room": "Verwijder kamer", - "create_new_room": "Maak nieuwe kamer", - "enter_room_name": "Geef de kamernaam", - "shared_by": "gedeeld door", - "last_session": "Laatste sessie {{ localizedTime }}", - "no_last_session": "Geen vorige sessie gemaakt", - "search_not_found": "Geen kamers gevonden", - "rooms_list_is_empty": "Je hebt nog geen kamers!", - "rooms_list_empty_create_room": "Maak je eerste kamer door te klikken op de knop onderaan en je kamer een naam te geven.", - "meeting": { - "start_meeting": "Start vergadering", - "join_meeting": "Neem deel aan vergadering", - "meeting_invitation": "Je bent uitgenodigd om deel te nemen", - "meeting_not_started": "De vergadering is nog niet begonnen", - "join_meeting_automatically": "Je zult automatisch deelnemen wanneer de vergadering begint", - "recording_consent": "Ik bevestig dat deze sessie opgenomen mag worden. Die opname kan mijn stem en beeld bevatten wanneer dit ingeschakeld is." - }, - "presentation": { - "presentation": "Presentatie", - "click_to_upload": "Klik om te uploaden", - "drag_and_drop": "of sleep en zet neer", - "upload_description": "Upload gelijk welk office-document of PDF-bestand. Afhankelijk van de grootte van het bestand kan dit wat tijd vragen voor het gebruikt kan worden.", - "are_you_sure_delete_presentation": "Weet je zeker dat je deze presentatie wil verwijderen?" - }, - "shared_access": { - "access": "Toegang", - "add_share_access": "+ Deel toegang", - "share_room_access": "Deel kamertoegang", - "add_some_users": "Tijd om wat gebruikers toe te voegen!", - "add_some_users_description": "Klik om nieuwe gebruikers toe te voegen op de knop onderaan en zoek of selecteer de gebruikers waarmee je deze kamer wil delen.", - "delete_shared_access": "Verwijder gedeelde toegang", - "are_you_sure_delete_shared_access": "Weet je zeker dat je deze gedeelde toegang wil verwijderen?" - }, - "settings": { - "settings": "Instellingen", - "room_name": "Kamernaam", - "user_settings": "Gebruikersinstellingen", - "allow_room_to_be_recorded": "Toestaan dat de kamer opgenomen wordt", - "require_signed_in": "Vereis dat gebruikers aangemeld zijn voor ze mogen deelnemen", - "require_signed_in_message": "Je moet ingelogd zijn om deze kamer te kunnen betreden.", - "require_mod_approval": "Vereis goedkeuring door een moderator voor gebruikers mogen deelnemen", - "allow_any_user_to_start": "Laat elke gebruiker toe om deze vergadering te beginnen", - "all_users_join_as_mods": "Alle gebruikers nemen deel als moderators", - "mute_users_on_join": "Demp gebruikers wanneer ze deelnemen", - "generate": "Genereer", - "access_code": "Toegangscode", - "mod_access_code": "Moderator toegangscode", - "mod_access_code_optional": "Moderator toegangscode (optioneel)", - "access_code_required": "Geef de toegangscode", - "wrong_access_code": "Foute toegangscode", - "generate_viewers_access_code": "Genereer toegangscode voor kijkers", - "generate_mods_access_code": "Genereer toegangscode voor moderators", - "are_you_sure_delete_room": "Weet je zeker dat je deze kamer wil verwijderen?" - } - }, - "recording": { - "recording": "Opname", - "recordings": "Opnames", - "name": "Naam", - "length": "Lengte", - "users": "Gebruikers", - "visibility": "Zichtbaarheid", - "formats": "Formaten", - "published": "Gepubliceerd", - "unpublished": "Niet gepubliceerd", - "protected": "Beschermd", - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "Opname wordt verwerkt. Dit kan enkele minuten duren...", - "copy_recording_urls": "Kopieer opname-URL(s)", - "recordings_list_empty": "Je hebt nog geen opnames!", - "recordings_list_empty_description": "Opnames zullen hier verschijnen nadat je een vergadering gestart en die opgenomen hebt.", - "delete_recording": "Verwijder opname", - "are_you_sure_delete_recording": "Weet je zeker dat je deze opname wil verwijderen?", - "search_not_found": "Geen opnames gevonden" - }, - "admin": { - "admin_panel": "Beheerderspaneel", - "manage_users": { - "manage_users": "Beheer gebruikers", - "active": "Actief", - "approve": "Keur goed", - "decline": "Wijs af", - "pending": "In afwachting", - "banned": "Geband", - "ban": "Ban", - "unban": "Ban niet", - "deleted": "Verwijderd", - "invited_tab": "Uitgenodigd", - "invite_user": "Gebruiker uitnodigen", - "send_invitation": "Stuur uitnodiging", - "enter_user_email": "Geef e-mailadres van de gebruiker", - "new_user": "Nieuwe gebruiker", - "add_new_user": "Nieuwe gebruiker", - "create_new_user": "Maak nieuwe gebruiker", - "edit_user": "Bewerk gebruiker", - "delete_user": "Verwijder gebruiker", - "users_edit_path": "Gebruikers/bewerk", - "create_account": "Maak account", - "create_room": "Maak kamer", - "create_new_room": "Maak nieuwe kamer", - "user_created_at": "Gemaakt:{{ localizedTime }}", - "are_you_sure_delete_account": "Weet je zeker dat je {{username}}'s account wil verwijderen?", - "delete_account_warning": "Als je deze account verwijderd, kun je die niet herstellen.", - "empty_active_users": "Er zijn nog geen actieve gebruikers op deze server!", - "empty_active_users_subtext": "Wanneer de status van een gebruiker wijzigt naar actief, dan zal die hier verschijnen.", - "empty_pending_users": "Er zijn nog geen gebruikers in de wachtrij op deze server!", - "empty_pending_users_subtext": "Wanneer de status van een gebruiker naar in de wachtrij wijzigt, dan zal die hier verschijnen.", - "empty_banned_users": "Er zijn nog geen gebande gebruikers op deze server!", - "empty_banned_users_subtext": "Wanneer de status van een gebruiker naar geband wijzigt, dan zal die hier verschijnen.", - "empty_invited_users": "Er zijn nog geen uitgenodigde gebruikers op deze server!", - "empty_invited_users_subtext": "Wanneer de status van een gebruiker naar uitgenodigt wijzigt, dan zal die hier verschijnen.", - "invited": { - "time_sent": "Tijd verstuurd", - "valid": "Geldig" - } - }, - "server_rooms": { - "server_rooms": "Serverkamers", - "name": "Naam", - "owner": "Eigenaar", - "room_id": "Kamer ID", - "participants": "Deelnemers", - "status": "Status", - "running": "Loopt", - "not_running": "Loopt niet", - "active": "Actief", - "current_session": "Huidige sessie: {{lastSession}}", - "last_session": "Laatste sessie: {{localizedTime}}", - "no_meeting_yet": "Nog geen vergadering.", - "delete_server_rooms": "Verwijder serverkamer", - "resync_recordings": "Hersynchroniseer opnames", - "empty_room_list": "Er zijn nog geen serverkamers!", - "empty_room_list_subtext": "Kamers zullen hier verschijnen nadat je eerste kamer gemaakt hebt." - }, - "server_recordings": { - "server_recordings": "Serveropnames", - "latest_recordings": "Laatste opnames", - "no_recordings_found": "Nog geen opnames gevonden" - }, - "site_settings": { - "site_settings": "Site-instellingen", - "customize_greenlight": "Greenlight aanpassen", - "appearance": { - "appearance": "Uiterlijk", - "brand_color": "Merkkleur", - "regular": "Gewoon", - "lighten": "Lichter", - "brand_image": "Logo", - "click_to_upload": "Klik om te uploaden", - "drag_and_drop": "of sleep en zet neer", - "upload_brand_image_description": "Upload gelijk welk PNG-, JPG- of SVG-bestand. Afhankelijk van de grootte van het bestand kan dit wat tijd vragen voor het gebruikt kan worden.", - "remove_branding_image": "Verwijder logo" - }, - "administration": { - "administration": "Beheer", - "terms": "Gebruikersvoorwaarden", - "privacy": "Privacybeleid", - "privacy_policy": "Privacybeleid", - "change_term_links": "Wijzig de links voor gebruikersvoorwaarden die onderaan de pagina verschijnen", - "change_privacy_link": "Wijzig de privacy-link die onderaan de pagina verschijnen", - "change_url": "Wijzig URL", - "enter_link": "Zet hier een link" - }, - "settings": { - "settings": "Instellingen", - "allow_users_to_share_rooms": "Sta toe dat gebruikers kamers delen", - "allow_users_to_share_rooms_description": "Dit op uitschakelen zetten zal de knop doen verdwijnen uit de kameropties zodat gebruikers geen kamers meer kunnen delen", - "allow_users_to_preupload_presentation": "Sta toe dat gebruikers presentaties op voorhand uploaden", - "allow_users_to_preupload_presentation_description": "Gebruikers kunnen een presentatie op voorhand uploaden om als standaardpresentatie te gebruiken voor die bepaalde kamer" - }, - "registration": { - "registration": "Registratie", - "role_mapping_by_email": "Rollen koppelen op e-mail", - "role_mapping_by_email_description": "Koppel de gebruiker aan een rol op basis van het e-mailadres. Moet in het formaat: role1=email1, role2=email2", - "enter_role_mapping_rule": "Geef een regel om rollen te koppelen", - "resync_on_login": "Hersynchroniseer gebruikersgegevens bij elke aanmelding", - "resync_on_login_description": "Hersynchroniseer gebruikersinformatie elke keer een gebruiker aanmeldt, zodat de externe authenticatieprovider en Greenlight altijd dezelfde informatie bevatten", - "default_role": "Standaard rol", - "default_role_description": "De standaardrol die toegewezen wordt aan nieuwe gebruikers", - "registration_method": "Registratiemethode", - "registration_method_description": "Wijzig de manier waarop gebruikers registreren bij de website", - "registration_methods" : { - "open": "Open registratie", - "invite": "Deelnemen op uitnodiging", - "approval": "Goedkeuren/afwijzen" - } - } - }, - "room_configuration": { - "room_configuration": "Kamerconfiguratie", - "default": "Optioneel (standaard ingeschakeld)", - "optional": "Optioneel (standaard uitgeschakeld)", - "enabled": "Verplicht ingeschakeld", - "disabled": "Uitgeschakeld", - "configurations": { - "allow_room_to_be_recorded": "Toestaan dat kamer opgenomen wordt", - "allow_room_to_be_recorded_description": "Sta kamereigenaars toe om op te geven of ze de optie willen om een kamer op te nemen of niet. Indien ingeschakeld moet de moderator nog steeds klikken op de opname-knop als de vergadering begonnen is.", - "require_user_signed_in": "Vereis dat gebruikers aangemeld zijn voor ze mogen deelnemen", - "require_user_signed_in_description": "Enkel gebruikers met een account bij Greenlight mogen deelnemen aan de vergadering. Als ze niet ingelogd zijn, dan zullen ze doorverwezen worden naar de aanmeldingspagina wanneer ze proberen deel te nemen aan een vergadering.", - "require_mod_approval": "Vereis goedkeuring door een moderator voor gebruikers mogen deelnemen", - "require_mod_approval_description": "Geeft een signaal aan de moderator van de BigBlueButton-vergadering wanneer een gebruiker probeert de kamer te betreden. Wanneer de moderator dit goedkeurt, zal de gebruiker binnen kunnen.", - "allow_any_user_to_start_meeting": "Laat elke gebruiker toe om deze vergadering te beginnen", - "allow_any_user_to_start_meeting_description": "Laat elke gebruiker toe om de vergadering te beginnen op gelijk welk moment. Standaard kan enkel de kamereigenaar een vergadering starten.", - "allow_users_to_join_as_mods": "Alle gebruikers nemen deel als moderators", - "allow_users_to_join_as_mods_description": "Geeft alle gebruikers moderatorrechten in BigBlueButton wanneer ze deelnemen aan de vergadering", - "mute_users_on_join": "Demp gebruikers wanneer ze deelnemen", - "mute_users_on_join_description": "Dempt automatisch de gebruiker wanneer die deelneemt aan de BigBlueButton-vergadering", - "viewer_access_code": "Kijker toegangscode", - "viewer_access_code_description": "Maakt dat kamereigenaars een willekeurige alfanumerieke code kunnen delen met gebruikers. Gebruikers zullen dan deze gegenereerde code nodig hebben om deel te kunnen nemen aan de vergaderingen in deze kamer.", - "mod_access_code": "Moderator toegangscode", - "mod_access_code_description": "Maakt dat kamereigenaars een willekeurige alfanumerieke code kunnen delen met gebruikers. Gebruikers zullen dan deze gegenereerde code nodig hebben om deel te kunnen nemen aan de vergaderingen in deze kamer als moderator." - } - }, - "roles": { - "role": "Rol", - "roles": "Rollen", - "administrator": "Beheerder", - "guest": "Gas", - "manage_roles": "Beheer rollen", - "delete_role": "Verwijder ro", - "are_you_sure_delete_role": "Weet je zeker dat je deze rol wil verwijderen?", - "enter_role_name": "Geef de naam van een rol", - "add_role": "+ Maak rol", - "create_role": "Maak ro", - "create_new_role": "Maak een nieuwe ro", - "no_role_found": "Geen rol gevonden.", - "search_not_found": "Geen rollen gevonden", - "edit": { - "create_room": "Sta toe dat gebruikers met deze rol kamers maken", - "record": "Sta toe dat gebruikers met deze rol hun vergaderingen opnemen", - "manage_users": "Sta toe dat gebruikers met deze rol gebruikers te beheren", - "manage_rooms": "Sta toe dat gebruikers met deze rol serverkamers te beheren", - "manage_recordings": "Sta toe dat gebruikers met deze rol serveropnames te beheren", - "manage_site_settings": "Sta toe dat gebruikers met deze rol site-instellingen te beheren", - "manage_roles": "Sta toe dat gebruikers met deze rol andere rollen te beheren", - "shared_list": "Neem gebruikers met deze rol mee op in het rolmenu om kamers te delen", - "room_limit": "Kamerlimiet" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Er is een nieuwe gebruiker gemaakt", - "user_updated": "De gebruiker is aangepast", - "user_deleted": "De gebruiker is verwijderd.", - "avatar_updated": "De avatar is aangepast.", - "password_updated": "Het wachtwoord is aangepast.", - "account_activated": "Je account is geactiveerd.", - "activation_email_sent": "Er is een e-mail met instructies om je account te activeren verstuurd.", - "reset_pwd_email_sent": "Er is een e-mail met instructies om je wachtwoord opnieuw in te stellen verstuurd." - }, - "session": { - "signed_out": "Je bent uitgelogd." - }, - "room": { - "room_created": "Er is een nieuwe kamer gemaakt.", - "room_updated": "De kamer is aangepast.", - "room_deleted": "De kamer is verwijderd.", - "room_shared": "De kamer is gedeeld.", - "room_unshared": "De kamer is niet meer gedeeld.", - "recordings_synced": "De kameropnames zijn gesynchroniseerd.", - "room_configuration_updated": "De kamerconfiguratie is aangepast.", - "room_setting_updated": "De kamerinstellingen zijn aangepast.", - "presentation_updated": "De presentatie is aangepast.", - "presentation_deleted": "De presentatie is verwijderd.", - "joining_meeting": "Deelnemen aan de vergadering...", - "meeting_started": "Vergadering gestart.", - "access_code_copied": "De toegangscode is gekopieerd.", - "access_code_generated": "Er is een nieuwe toegangscode gegenereerd.", - "access_code_deleted": "De toegangscode is verwijderd.", - "copied_meeting_url": "De vergaderings-URL is gekopieerd. De link kan gebruikt worden om deel te nemen aan de vergadering." - }, - "site_settings": { - "site_setting_updated": "De site-instellingen zijn aangepast.", - "brand_color_updated": "De merkkleur is aangepast.", - "brand_image_updated": "Het logo is aangepast.", - "brand_image_deleted": "Het logo is verwijderd.", - "privacy_policy_updated": "Het privacybeleid is aangepast.", - "terms_of_service_updated": "De gebruikersvoorwaarden zijn aangepast." - }, - "recording": { - "recording_visibility_updated": "De zichtbaarheid van de opname is aangepast.", - "recording_name_updated": "De opnamenaam is aangepast.", - "recording_deleted": "De opname is verwijderd.", - "copied_urls": "De opname-URL is gekopieerd." - }, - "role": { - "role_created": "Er is een nieuwe rol gemaakt.", - "role_updated": "De rol is aangepast.", - "role_deleted": "De rol is verwijderd.", - "role_permission_updated": "De rolrechten zijn aangepast." - }, - "invitations": { - "invitation_sent": "Er is een uitnodiging verstuurd." - } - }, - "error": { - "problem_completing_action": "De actie kan niet voltooid worden. Probeer opnieuw.", - "file_type_not_supported": "Het bestandstype wordt niet ondersteund.", - "file_size_too_large": "Het bestand is te groot.", - "file_upload_error": "Het bestand kan niet geüpload worden.", - "signin_required": "Je moet ingelogd zijn om deze pagina te kunnen bezoeken.", - "roles": { - "role_assigned": "Deze rol kan niet verwijderd worden omdat die minstens aan één gebruiker toegewezen is." - }, - "users": { - "signup_error": "Je kunt niet geauthenticeerd worden. Neem contact op met je beheerder.", - "invalid_invite": "Je uitnodiging is niet geldig of fout. Neem contact op met je beheerder om een nieuwe uitnodiging te ontvangen.", - "email_exists": "Er bestaat al een account met dit e-mailadres. Probeer opnieuw met een ander adres.", - "old_password": "Het ingegeven wachtwoord is fout.", - "pending": "Je registratie wacht op goedkeuring door de beheerder. Probeer later opnieuw.", - "banned": "Je hebt geen toegang tot deze applicatie. Neem contact op met je beheerder als je denkt dat dit een vergissing is." - }, - "rooms": { - "room_limit": "De kamer kan niet gemaakt worden omdat de limiet op het aantal kamers bereikt is." - }, - "session": { - "invalid_credentials": "De gebruikersnaam of het wachtwoord zijn fout. Controleer ze en probeer opnieuw." - } - } - }, - "global_error_page": { - "title": "Fout", - "message": "Sorry, er ging wat mis. Als dit opnieuw gebeurt, neem dan contact op met je beheerder." - }, - "not_found_error_page": { - "title": "Pagina niet gevonden", - "message": "Sorry, de pagina die je probeert te bezoeken kon niet gevonden worden." - }, - "account_activation_page": { - "title": "Account-activatie", - "account_unverified": "Je account is nog niet geverifieerd.", - "message": "Om Greenlight te kunnen gebruiker moet je je account verifiëren met de instructies in de activatiemail die naar jou verstuurd is.", - "resend_activation_link": "Als je geen activatiemail gekregen hebt of als je een probleem hebt om die te gebruiken, klik dan op onderstaande knop om een nieuwe activatiemail te ontvangen.", - "resend_btn_lbl": "Verificatie opnieuw versturen" - }, - "forms": { - "validations": { - "full_name": { - "required": "Geef je volledige naam", - "min": "Naam moet minstens 2 tekens lang zijn", - "max": "Naam mag maximaal 255 tekens lang zijn" - }, - "email": { - "required": "Geef een e-mailadres", - "email": "De ingevoerde tekst is geen e-mailadres", - "min": "E-mail moet minstens 6 tekens lang zijn", - "max": "E-mail mag maximaal 255 tekens lang zijn" - }, - "password": { - "required": "Geef een wachtwoord", - "match": "Wachtwoord moet minstens het volgende bevatten:", - "min": "- Acht tekens", - "lower": "- Eén kleine letter", - "upper": "- Eén hoofdletter", - "digit": "- Eén cijfer", - "symbol": "- Een symbool", - "max": "Wachtwoord mag maximaal 255 tekens lang zijn" - }, - "password_confirmation": { - "required": "Bevestig je wachtwoord", - "match": "De wachtwoorden komen niet overeen" - }, - "emails": { - "required": "Geef minstens één geldig e-mailadres", - "list": "Geef een door komma's gescheiden lijst van geldige e-mailadressen (user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "Geef de rolnaam" - }, - "role": { - "limit": { - "required": "Geef het maximaal aantal kamers", - "min": "Minimaal toegestaan is 0", - "max": "Maximaal toegestaan is 100" - }, - "type": { - "error": "Je moet een aantal opgeven" - } - }, - "room": { - "name": { - "required": "Geef de kamernaam.", - "min": "Naam moet minstens 2 tekens lang zijn" - } - }, - "url": { - "invalid": "Ongeldige URL" - } - }, - "room": { - "fields": { - "name": { - "label": "Kamernaam", - "placeholder": "Geef een kamernaam..." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Volledige naam", - "placeholder": "Geef je volledige naam" - }, - "email": { - "label": "E-mail", - "placeholder": "Geef je e-mailadres" - }, - "password": { - "label": "Wachtwoord", - "placeholder": "Maak een wachtwoord" - }, - "password_confirmation": { - "label": "Bevestig wachtwoord", - "placeholder": "Bevestig wachtwoord" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "E-mail", - "placeholder": "E-mail" - }, - "password": { - "label": "Wachtwoord", - "placeholder": "Wachtwoord" - }, - "remember_me": { - "label": "Aanmelding onthouden" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Huidig wachtwoord", - "placeholder": "Geef je wachtwoord" - }, - "new_password": { - "label": "Nieuw wachtwoord", - "placeholder": "Geef je wachtwoord" - }, - "password_confirmation": { - "label": "Bevestig wachtwoord", - "placeholder": "Bevestig je nieuwe wachtwoord" - } - }, - "validations": { - "old_password": { - "required": "Geef je huidige wachtwoord" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "E-mail", - "placeholder": "Geef het e-mailadres van de account" - } - }, - "validations": { - "email": { - "required": "Geef het e-mailadres van de account" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Nieuw wachtwoord", - "placeholder": "Geef je nieuwe wachtwoord" - }, - "password_confirmation": { - "label": "Bevestig wachtwoord", - "placeholder": "Bevestig je nieuwe wachtwoord" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Volledige naam" - }, - "email": { - "label": "E-mail" - }, - "language": { - "label": "Taal" - }, - "role": { - "label": "Rol" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Volledige naam", - "placeholder": "Geef de volledige naam van de gebruiker" - }, - "email": { - "label": "E-mail", - "placeholder": "Geef het e-mailadres van de gebruiker" - }, - "password": { - "label": "Wachtwoord", - "placeholder": "Geef het wachtwoord van de gebruiker" - }, - "password_confirmation": { - "label": "Bevestig wachtwoord", - "placeholder": "Bevestig het wachtwoord" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "E-mails" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Zet hier een link..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Rolnaam", - "placeholder": "Geef een rolnaam..." - } - } - } - } - } -} diff --git a/app/assets/locales/pl_PL.json b/app/assets/locales/pl_PL.json deleted file mode 100644 index d13b42ca28..0000000000 --- a/app/assets/locales/pl_PL.json +++ /dev/null @@ -1,703 +0,0 @@ -{ - "start": "Start", - "search": "Wyszukaj", - "home": "Główna", - "previous": "Poprzedni", - "back": "Wstecz", - "next": "Następny", - "view": "Widok", - "join": "Dołącz", - "edit": "Edytuj", - "save": "Zapisz", - "save_changes": "Zapisz Zmiany", - "update": "Aktualizuj", - "report": "Raport", - "share": "Udostępnij", - "cancel": "Anuluj", - "close": "Zamknij", - "delete": "Usuń", - "copy": "Skopiuj Link Dołączenia", - "copy_viewer_code": "Skopiuj Kod Uczestnika", - "copy_moderator_code": "Skopiuj Kod Moderatora", - "or": "Lub", - "online": "Online", - "help_center": "Centrum Pomocy", - "are_you_sure": "Czy na pewno?", - "return_home": "Powrót na Główną", - "created_at": "Utworzono o", - "view_recordings": "Przeglądaj Nagrania", - "join_session": "Dołącz do Sesji", - "no_result_search_input": "Nie można znaleźć wyników dla \"{{ searchInput }}\"", - "action_permanent": "Ta akcja nie może zostać cofnięta.", - "homepage": { - "welcome_bbb": "Witaj w BigBlueButton.", - "bigbluebutton_description": "BigBlueButton to system konferencji internetowych typu open source dla zajęć online. Platforma maksymalizuje czas uczenia się stosowanego, umożliwiając uczniom współpracę i otrzymywanie informacji zwrotnych w czasie rzeczywistym.", - "greenlight_description": "Utwórz własne pokoje, aby hostować sesje lub dołącz do innych za pomocą krótkiego i wygodnego linku.", - "learn_more": "Dowiedz się więcej o BigBlueButton", - "explore_features": "Przeglądaj nasze funkcje", - "meeting_title": "Uruchom spotkanie", - "meeting_description": "Uruchom klasę wirtualną z wideo, audio, udostępnianiem ekranu, czatem i wszystkimi narzędziami wymaganymi do nauczania.", - "recording_title": "Nagrywaj swoje spotkania", - "recording_description": "Nagrywaj spotkania BigBlueButton i dziel się nimi ze uczniami aby przejrzeć i zastanowić się nad materiałem.", - "settings_title": "Zarządzaj Pokojami", - "settings_description": "Skonfiguruj swoje pokoje i ustawienia spotkań, aby wspierały efektywność klasy.", - "and_more_title": "I Więcej!", - "and_more_description": "BigBlueButton oferuje wbudowane narzędzia do stosowanego uczenia się i ma na celu oszczędzanie czasu podczas zajęć.", - "enter_meeting_url": "pisz URL Spotkania", - "enter_meeting_url_instruction": "Należy wpisać URL spotkania BigBlueButton w pole poniżej." - }, - "authentication": { - "sign_in": "Zarejestruj się", - "sign_up": "Zaloguj się", - "sign_out": "Wyloguj się", - "email": "E-mail", - "password": "Hasło", - "confirm_password": "Potwierdź Hasło", - "enter_email": "Wpisz swój adres e-mail", - "enter_name": "Wpisz swoją nazwę", - "remember_me": "Pamiętaj Mnie", - "forgot_password": "Zapomniałeś hasła?", - "dont_have_account": "Nie masz konta?", - "create_account": "Utwórz Konto", - "create_an_account": "Utwórz Konto", - "already_have_account": "Czy masz już konto?" - }, - "user": { - "user": "Użytkownik", - "users": "Użytkownicy", - "name": "Nazwa", - "email_address": "Adres E-mail", - "authenticator": "Autentykator", - "full_name": "Pełna Nazwa", - "no_user_found": "Nie znaleziono użytkowników", - "type_three_characters": "Należy wpisać trzy (3) znaki lub więcej by pokazać innych użytkowników.", - "search_not_found": "Nie Znaleziono Użytkowników", - "profile": { - "profile": "Profil", - "language": "Język", - "role": "Rola", - "administrator": "Administrator", - "guest": "Gość" - }, - "account": { - "account_info": "Informacje o Koncie", - "delete_account": "Usuń Konto", - "change_password": "Zmień Hasło", - "set_password": "Ustaw Swoje Nowe Hasło", - "reset_password": "Resetuj Hasło", - "update_account_info": "Zaktualizuj Informacje o Koncie", - "current_password": "Aktualne Hasło", - "new_password": "Nowe Hasło", - "confirm_password": "Potwierdź Hasło", - "permanently_delete_account": "Trwale Usuń Swoje Konto", - "delete_account_description": "Jeśli wybierzesz usunięcie konta, NIE da się tego wycofać. \n Wzystkie informacje związane z Twoim kontem, takie jak ustawienia, pokoje i nagrania zostaną usunięte.", - "delete_account_confirmation": "Tak, chcę usunąć swoje konto", - "are_you_sure_delete_account": "Czy na pewno usunąć Twoje konto?" - }, - "avatar": { - "upload_avatar": "Prześlij Awatar", - "delete_avatar": "Usuń Awatar", - "crop_avatar": "Przytnij Awatar" - }, - "pending": { - "title": "Oczekująca Rejestracja", - "message": "Dziękujemy za rejestrację! Twoje konto oczekuje teraz na zatwierdzenie przez administratora." - } - }, - "room": { - "room": "Pokój", - "rooms": "Pokoje", - "room_name": "Nazwa Pokoju", - "add_new_room": "+ Nowy Pokój", - "create_room": "Utwórz Pokój", - "delete_room": "Usuń Pokój", - "create_new_room": "Utwórz Nowy Pokój", - "enter_room_name": "Wpisz nazwę pokoju", - "shared_by": "udostępniono przez", - "last_session": "Ostatnia sesja: {{ localizedTime }}", - "no_last_session": "Nie utworzono poprzedniej sesji", - "search_not_found": "Nie znaleziono pokojów", - "rooms_list_is_empty": "Nie masz jeszcze żadnych pokojów!", - "rooms_list_empty_create_room": "Otwórz swój pierwszy pokój klikając przycisk poniżej i wprowadzając nazwę pokoju.", - "meeting": { - "start_meeting": "Rozpocznij Spotkanie", - "join_meeting": "Dołącz do Spotkania", - "meeting_invitation": "Zaproszono Cię do dołączenia", - "meeting_not_started": "Spotkanie jeszcze się nie rozpoczęło", - "join_meeting_automatically": "Dołączysz automatycznie, gdy spotkanie się rozpocznie", - "recording_consent": "Przyjmuję do wiadomości, że ta sesja może zostać zarejestrowana. Może to obejmować mój głos i wideo, jeśli jest włączone." - }, - "presentation": { - "presentation": "Prezentacja", - "click_to_upload": "Kliknij by Przesłać", - "drag_and_drop": " lub przeciągnij i upuść", - "upload_description": "Prześlij dowolny dokument office lub plik PDF (nie większy niż {{size}}). W zależności od rozmiaru pliku, może to wymagać dodatkowego czasu przesyłania zanim może zostać użyty", - "delete_presentation": "Usuń Prezentację", - "are_you_sure_delete_presentation": "Czy na pewno usunąć tą prezentację?" - }, - "shared_access": { - "access": "Dostęp", - "add_share_access": "+ Udostępnij Dostęp", - "share_room_access": "Udostępnij Dostęp do Pokoju", - "add_some_users": "Czas dodać użytkowników!", - "add_some_users_description": "By dodać nowych użytkowników, kliknij przycisk poniżej i wyszukaj lub wybierz użytkowników z którymi chcesz współdzielić pokój.", - "delete_shared_access": "Usuń Udostępniony Dostęp", - "are_you_sure_delete_shared_access": "Czy na pewno usunąć ten Udostępniony Dostęp?" - }, - "settings": { - "settings": "Ustawienia", - "room_name": "Nazwa Pokoju", - "user_settings": "Ustawienia Użytkownika", - "allow_room_to_be_recorded": "Zezwól by pokój mógł być nagrywany", - "require_signed_in": "Wymaga się by użytkownicy byli zarejestrowani przed dołączeniem", - "require_signed_in_message": "Musisz być zarejestrowany by dołączyć do pokoju.", - "require_mod_approval": "Wymagaj zgody moderatora przed dołączeniem", - "allow_any_user_to_start": "Pozwól dowolnemu użytkownikowi rozpocząć spotkanie", - "all_users_join_as_mods": "Wszyscy użytkownicy dołączają jako moderatorzy", - "mute_users_on_join": "Wycisz użytkowników podczas dołączania", - "generate": "Generuj", - "access_code": "Kod Dostępu", - "mod_access_code": "Kod Dostępu Moderatora", - "mod_access_code_optional": "Kod Dostępu Moderatora (opcjonalny)", - "access_code_required": "Należy wprowadzić kod dostępu", - "wrong_access_code": "Niepoprawny kod dostępu", - "generate_viewers_access_code": "Generuj kod dostępu dla uczestników", - "generate_mods_access_code": "Generuj kod dostępu dla moderatorów", - "are_you_sure_delete_room": "Czy na pewno usunąć ten pokój?" - } - }, - "recording": { - "recording": "Nagranie", - "recordings": "Nagrania", - "processing": "Procesowanie Nagrań...", - "name": "Nazwa", - "length": "Długość", - "users": "Użytkownicy", - "visibility": "Widoczność", - "formats": "Formaty", - "published": "Opublikowane", - "unpublished": "Nieopublikowane", - "protected": "Chronione", - "public": "Publiczne", - "public_protected": "Publiczne/Chronione", - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "Procesowanie nagrania, może to potrwać kilka minut...", - "copy_recording_urls": "Skopiuj Adres(y) URL Nagrań", - "recordings_list_empty": "Nie masz jeszcze nagrań!", - "public_recordings_list_empty": "Nie ma jeszcze publicznych nagrań!", - "recordings_list_empty_description": "Nagrania pojawią się tutaj gdy rozpoczniesz spotkanie i zaczniesz je nagrywać.", - "public_recordings_list_empty_description": "Nagrania pojawią się tutaj w miarę dostępności.", - "delete_recording": "Usuń Nagranie", - "are_you_sure_delete_recording": "Czy na pewno usunąć to nagranie?", - "search_not_found": "Nie Znaleziono Nagrań" - }, - "admin": { - "admin_panel": "Panel Administratora", - "manage_users": { - "manage_users": "Zarządzaj Użytkownikami", - "active": "Aktywni", - "approve": "Zatwierdź", - "decline": "Odrzuć", - "pending": "Oczekujący", - "banned": "Zbanowani", - "ban": "Zbanuj", - "unban": "Odbanuj", - "deleted": "Usunięty", - "invited_tab": "Zaproszony", - "invite_user": "Zaproś Użytkownika", - "send_invitation": "Wyślij Zaproszenie", - "enter_user_email": "Wpisz e-mail użytkownika", - "new_user": "Nowy Użytkownik", - "add_new_user": "Nowy Użytkownik", - "create_new_user": "\"Utwórz Nowego Użytkownika", - "edit_user": "Edytuj Użytkownika", - "delete_user": "Usuń Użytkownika", - "users_edit_path": "Użytkownicy/Edycja", - "create_account": "Utwórz Konto", - "create_room": "Utwórz Pokój", - "create_new_room": "Utwórz Nowy Pokój", - "user_created_at": "Utworzono: {{localizedTime}}", - "are_you_sure_delete_account": "Czy na pewno usunąć konto {{user.name}}?", - "delete_account_warning": "Jeśli zdecydujesz się usunąć to konto, NIE będzie to odwracalne.", - "empty_active_users": "Nie ma jeszcze aktywnych użytkowników na tym serwerze!", - "empty_active_users_subtext": "Gdy stan użytkowników zmieni się na aktywny, pojawią się tutaj.", - "empty_pending_users": "Nie ma jeszcze oczekujących użytkowników na serwerze!", - "empty_pending_users_subtext": "Gdy stan użytkowników zmieni się na oczekujący, pojawią się tutaj.", - "empty_banned_users": "Nie ma jeszcze zbanowanych użytkowników na tym serwerze!", - "empty_banned_users_subtext": "Gdy stan użytkownika zmieni się na zbanowany, pojawią się tutaj.", - "empty_invited_users": "Nie ma jeszcze zaproszonych użytkowników na tym serwerze!", - "empty_invited_users_subtext": "Gdy stan użytkowników zmieni się na zaproszony, pojawią się tutaj.", - "invited": { - "time_sent": "Czas Wysłania", - "valid": "Poprawny" - } - }, - "server_rooms": { - "server_rooms": "Pokoje na Serwerze", - "name": "Nazwa", - "owner": "Właściciel", - "room_id": "ID Pokoju", - "participants": "Uczestnicy", - "status": "Stan", - "running": "Działająca", - "not_running": "Niedziałająca", - "active": "Aktywna", - "current_session": "Bieżąca sesja: {{lastSession}}", - "last_session": "Ostatnia sesja: {{localizedTime}}", - "no_meeting_yet": "Nie ma jeszcze spotkań.", - "delete_server_rooms": "Usuń Pokój na Serwerze", - "resync_recordings": "Synchronizuj Ponownie Nagrania", - "empty_room_list": "Nie ma jeszcze pokojów na serwerze!", - "empty_room_list_subtext": "Pokoje będą pojawiać się tutaj po utworzeniu pierwszego pokoju." - }, - "server_recordings": { - "server_recordings": "Nagrania na Serwerze", - "latest_recordings": "Ostatnie Nagrania", - "no_recordings_found": "Nie znaleziono nagrań." - }, - "site_settings": { - "site_settings": "Ustawienia Witryny", - "customize_greenlight": "Dostosuj Greenlight", - "appearance": { - "appearance": "Wygląd", - "brand_color": "Kolor Marki", - "regular": "Regularny", - "lighten": "Rozjaśniony", - "brand_image": "Obraz Marki", - "click_to_upload": "Kliknij by Przesłać", - "drag_and_drop": " lub przeciągnij i upuść", - "upload_brand_image_description": "Prześlij dowolny plik PNG, JPG lub SVG (nie większy niż {{size}}). Zależnie od rozmiaru pliku, może to wymagać dodatkowego czasu przesyłania zanim będzie on mógł zostać użyty", - "remove_branding_image": "Usuń Obraz Marki" - }, - "administration": { - "administration": "Administracja", - "terms": "Zasady i Warunki", - "privacy": "Polityka Prywatności", - "privacy_policy": "Polityka Prywatności", - "change_term_links": "Zmień link do zasad i warunków, który pojawia się na dole strony", - "change_privacy_link": "Zmień link polityki prywatności, który pojawia się na dole strony", - "helpcenter": "Centrum Pomocy", - "change_helpcenter_link": "Zmień link centrum pomocy, który pojawia się poniżej menu rozwijanego profilu", - "maintenance": "Banner konserwacyjny", - "change_maintenance_text": "Zmień tekst banera konserwacji, który pojawia się w nagłówku", - "change_url": "Zmień URL", - "set_text": "Wstaw Text", - "clear_banner": "Usuń Banner", - "enter_link": "Wprowadź tu link" - }, - "settings": { - "settings": "Ustawienia", - "allow_users_to_share_rooms": "Pozwól Użytkownikom Udostępniać Pokoje", - "allow_users_to_share_rooms_description": "Ustawienie na wyłączone spowoduje usunięcie przycisku z opcji rozwijanych pokoju, blokując udostępnianie pokoi przez użytkowników", - "allow_users_to_preupload_presentation": "Pozwól Użytkownikom Uprzednio Przesyłać Prezentacje", - "allow_users_to_preupload_presentation_description": "Użytkownicy mogą uprzednio przesłać prezentację do wykorzystania jako domyślna prezentacja wskazanego pokoju", - "default_visibility": "Domyślna Widoczność Nagrań", - "default_visibility_description": "Wszystkie nowoutworzone nagrania będą miały domyślnie taką widoczność", - "session_timeout": "Limit Czasowy Sesji", - "session_timeout_description": "Możesz skonfigurować limit czasu trwania sesji używając domyślnego ciasteczka na 1 dzień lub rozszerzonego ciasteczka sesji na 7 dni", - "default_session_timeout": "Domyślne (1 dzień)", - "extended_session_timeout": "Rozszerzone (7 dni)" - }, - "registration": { - "registration": "Rejestracja", - "role_mapping_by_email": "Mapowanie ról według e-maila", - "role_mapping_by_email_description": "Mapuj użytkownika do roli używając jego adresu e-mail. Musi być wpisane w formacie: role1=email1, role2=email2", - "enter_role_mapping_rule": "Wprowadź regułę mapowania ról", - "resync_on_login": "Synchronizuj Dane Użytkownika Przy Każdym Logowaniu", - "resync_on_login_description": "Synchronizuj ponownie informacje o użytkowniku za każdym razem gdy się loguje, by zewnętrzny dostawca uwierzytelnienia zawsze był zgodny z informacjami w Greenlight", - "default_role": "Domyślna Rola", - "default_role_description": "Domyślna rola przypisana nowozarejestrowanym użytkownikom", - "registration_method": "Metoda Rejestracji", - "registration_method_description": "Zmień sposób w jaki użytkownicy rejestrują się w witrynie", - "registration_methods" : { - "open": "Otwarta Rejestracja", - "invite": "Dołączanie przez Zaproszenie", - "approval": "Zatwierdzenie/Odrzucenie" - } - } - }, - "room_configuration": { - "room_configuration": "Konfiguracja Pokoju", - "default": "Opcjonalnie (domyślnie: włączone)", - "optional": "Opcjonalnie (domyślnie: wyłaczone)", - "enabled": "Wymuś Włączenie", - "disabled": "Wyłączone", - "configurations": { - "allow_room_to_be_recorded": "Pozwól by pokój mógł być nagrywany", - "allow_room_to_be_recorded_description": "Pozwala właścicielom pokoi określić, czy chcą, opcji nagrywania pokoju, czy nie. Jeśli jest włączona, moderator musi dodatkowo kliknąć przycisk 'Nagrywaj' po rozpoczęciu spotkania.", - "require_user_signed_in": "Wymagaj, by do spotkania dołączali tylko zarejestrowani", - "require_user_signed_in_description": "Dopuszcza tylko użytkowników z kontem Greenlight do spotkania. Jeśli nie są zarejestrowani, zostaną przeniesieni na stronę logowania podczas próby wejścia do pokoju.", - "require_mod_approval": "Wymagaj zgody moderatora przed dołączeniem", - "require_mod_approval_description": "Powiadamia moderatora spotkania BigBlueButton, gdy użytkownik próbuje dołączyć. Jeśli użytkownik zostanie zatwierdzony, będzie mógł dołączyć do spotkania.", - "allow_any_user_to_start_meeting": "Zezwól dowolnemu użytkownikowi rozpocząć spotkanie", - "allow_any_user_to_start_meeting_description": "Dowolny użytkownik w każdym momencie może rozpocząć spotkanie. Domyślnie tylko właściciel pokoju może zacząć spotkanie.", - "allow_users_to_join_as_mods": "Wszyscy użytkownicy dołączają jako moderatorzy", - "allow_users_to_join_as_mods_description": "Daje wszystkim uczestnikom przywileje moderatora w BigBlueButton gdu dołączają do spotkania", - "mute_users_on_join": "Wyciszaj Użytkowników podczas dołączania", - "mute_users_on_join_description": "Automatycznie wycisza użytkownika, gdy ten dołącza do spotkania BigBlueButton", - "viewer_access_code": "Kod Dostępu Uczestnika", - "viewer_access_code_description": "Oddaje do dyspozycji właścicielom pokoi losowy kod alfanumeryczny, który można udostępniać użytkownikom. Kod, jeśli zostanie wygenerowany, będzie wymaganypodczas dołączania użytkowników do spotkań w pokoju.", - "mod_access_code": "Kod Dostępu Moderatora", - "mod_access_code_description": "Oddaje do dyspozycji właścicielom pokoi losowy kod alfanumeryczny, który można udostępniać użytkownikom. Kod, jeśli zostanie wygenerowany, nie będzie wymagany, a gdy będzie używany na żadnym spotkaniu w pokoju, dołączy do użytkownika jako moderator." - } - }, - "roles": { - "role": "Rola", - "roles": "Role", - "administrator": "Administrator", - "guest": "Gość", - "manage_roles": "Zarządzaj Rolami", - "delete_role": "Usuń Rolę", - "are_you_sure_delete_role": "Czy na pewno usunąć tę rolę?", - "enter_role_name": "Wpisz nazwę roli", - "add_role": "+ Utwórz Rolę", - "create_role": "Utwórz Rolę", - "create_new_role": "Utwórz nową rolę", - "no_role_found": "Nie znaleziono roli.", - "search_not_found": "Nie Znaleziono Ról", - "edit": { - "create_room": "Pozwól użytkownikom z tą rolą tworzyć pokoje", - "record": "Pozwól użytkownikom z tą rolą nagrywać własne spotkania", - "manage_users": "Pozwól użytkownikom z tą rolą zarządzać użytkownikami", - "manage_rooms": "Pozwól użytkownikom z tą rolą zarządzać pokojami na serwerze", - "manage_recordings": "Pozwól użytkownikom z tą rolą zarządzać nagraniami na serwerze", - "manage_site_settings": "Pozwól użytkownikom z tą rolą zarządzać ustawieniami witryny", - "manage_roles": "Pozwól użytkownikom z tą rolą edytować inne role", - "shared_list": "Dołącz użytkowników z tą rolą na liście do udostępniania pokoi", - "room_limit": "Ograniczenie Pokoi", - "email_on_signup": "Otrzymuj e-mail gdy rejestruje się nowy użytkownik", - "allowed_recording_visibility": "Dostępne widoczności nagrań" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Nowy użytkownik został utworzony.", - "user_updated": "Użytkownik został zmieniony.", - "user_deleted": "Użytkownik został usunięty.", - "avatar_updated": "Awatar został zaktualizowany.", - "password_changed": "Zmieniono Twoje hasło z powodzeniem. Zaloguj się ponownie.", - "password_updated": "Twoje hasło zostało zmienione.", - "account_activated": "Twoje konto zostało aktywowane.", - "activation_email_sent": "Wysłano wiadomość e-mail zawierającą instrukcje aktywacji konta.", - "reset_pwd_email_sent": "Wysłano e-mail zawierający instrukcje zresetowania hasła." - }, - "session": { - "signed_out": "Wyrejestrowano Cię." - }, - "room": { - "room_created": "Nowy pokój został utworzony.", - "room_updated": "Pokój został zmieniony.", - "room_deleted": "Pokój został usunięty.", - "room_shared": "Włączono udostępnienie pokoju.", - "room_unshared": "Anulowano udostępnienie pokoju.", - "recordings_synced": "Nagrania pokoju zostały zsynchronizowane.", - "room_configuration_updated": "Konfiguracja pokoju została zmieniona.", - "room_setting_updated": "Ustawienie pokoju zostało zmienione.", - "presentation_updated": "Prezentacja została zmieniona.", - "presentation_deleted": "Prezentacja została usunięta.", - "joining_meeting": "Dołączanie do spotkania...", - "meeting_started": "Spotkanie rozpoczęło się.", - "access_code_copied": "Kod dostępu został skopiowany.", - "access_code_generated": "Nowy kod dostępu został wygenerowany.", - "access_code_deleted": "Kod dostępu został usunięty.", - "copied_meeting_url": "Adres URL spotkania został skopiowany. Link może być użyty by dołączyć do spotkania.", - "copied_viewer_code": "Kod dostępu uczestnika został skopiowany.", - "copied_moderator_code": "Kod dostępu moderatora został skopiowany." - }, - "site_settings": { - "site_setting_updated": "Ustawienia witryny zostały zaktualizowane.", - "brand_color_updated": "Kolor marki został zaktualizowany.", - "brand_image_updated": "Obraz marki został zaktualizowany.", - "brand_image_deleted": "Obraz marki został usunięty.", - "privacy_policy_updated": "Polityka prywatności została zaktualizowana.", - "helpcenter_updated": "Link Centrum Pomocy został zaktualizowany.", - "terms_of_service_updated": "Warunki usług zostały zaktualizowane.", - "maintenance_updated": "Baner konserwacyjny został zaktualizowany." - }, - "recording": { - "recording_visibility_updated": "Widoczność nagrania została zmieniona.", - "recording_name_updated": "Nazwa nagrania została zmieniona.", - "recording_deleted": "Nagranie zostało usunięte.", - "copied_urls": "URLe z nagraniami zostały skopiowane." - }, - "role": { - "role_created": "Utworzono nową rolę.", - "role_updated": "Rola została zmieniona.", - "role_deleted": "Rola została usunięta.", - "role_permission_updated": "Uprawnienia roli zostały zaktualizowane." - }, - "invitations": { - "invitation_sent": "Wysłano zaproszenie." - } - }, - "error": { - "problem_completing_action": "Akcja nie może być zakończona. \n Spróbuj jeszcze raz.", - "file_type_not_supported": "Typ pliku nie jest wspierany.", - "file_size_too_large": "Rozmiar pliku jest za duży.", - "file_upload_error": "Plik nie może zostać przesłany.", - "signin_required": "Musisz być zarejestrowany by wejść na tę stronę.", - "malware_detected": "Wykryto szkodliwe oprogramowanie! Przesłany plik może zawierać złośliwe oprogramowanie. Sprawdź swój plik i spróbuj ponownie.", - "roles": { - "role_assigned": "Ta rola nie może zostać usunięta ponieważ jest przypisana do co najmniej jednego użytkownika." - }, - "users": { - "signup_error": "Autoryzacja nie powiodła się. Skontaktuj się ze swoim administratorem.", - "invalid_invite": "Token Twojego zaproszenia jest nieważny albo niepoprawny. Skontaktuj się ze swoim administratorem by otrzymać nowy token.", - "email_exists": "Konto z tym adresem e-mail już istnieje. Spróbuj jeszcze raz z innym adresem.", - "old_password": "Wpisane hasło jest niepoprawne.", - "pending": "Twoja rejestracja oczekuje na zatwierdzenie administratora. Spróbuj ponownie później.", - "banned": "Nie masz dostępu do tej aplikacji. Skontaktuj się ze swoim administratorem jeśli uważasz że to pomyłka." - }, - "rooms": { - "room_limit": "Pokój nie może zostać utworzony, gdyż osiągnęto maksymalną liczbę pokoi." - }, - "session": { - "invalid_credentials": "Nazwa użytkownika jest niepoprawna. Sprawdź swoje poświadczenia i spróbuj ponownie." - } - } - }, - "global_error_page": { - "title": "Błąd", - "message": "Przepraszamy, coś poszło nie tak. Jeśli incydent się powtórzy, skontaktuj się z administratorem." - }, - "not_found_error_page": { - "title": "Nie Znaleziono Strony", - "message": "Przepraszamy, ale strona na którą próbujesz się dostać nie została znaleziona." - }, - "account_activation_page": { - "title": "Aktywacja Konta", - "account_unverified": "Twoje konto nie zostało jeszcze zweryfikowane.", - "message": "Aby korzystać z Greenlight, zweryfikuj swoje konto, postępując zgodnie z instrukcjami w e-mailu aktywacyjnym, który został do Ciebie wysłany.", - "resend_activation_link": "Jeśli nie otrzymałeś e-maila aktywacyjnego lub masz problem z nim, kliknij przycisk poniżej, aby poprosić o nowy e-mail aktywacyjny.", - "resend_btn_lbl": "Ponowna Weryfikacja" - }, - "forms": { - "validations": { - "full_name": { - "required": "Proszę wpisać nazwę", - "min": "Nazwa musi mieć co najmniej 2 znaki", - "max": "Nazwa musi mieć co najwyżej 255 znaków" - }, - "email": { - "required": "Proszę wpisać adres e-mail", - "email": "Wprowadzona wartość nie jest poprawnym adresem e-mail", - "min": "E-mail musi mieć co najmniej 6 znaków", - "max": "E-mail musi mieć co najwyżej 255 znaków" - }, - "password": { - "required": "Proszę wpisać hasło", - "match": "Hasło musi zawierać co najmniej:", - "min": "- Osiem znaków", - "lower": "- Jedną małą literę", - "upper": "- Jedną dużą literę", - "digit": "- Jedną cyfrę", - "symbol": "- Jeden znak specjalny", - "max": "Hasło może mieć co najwyżej 255 znaków" - }, - "password_confirmation": { - "required": "Należy wpisać potwierdzenie hasła", - "match": "Hasła nie są takie same" - }, - "emails": { - "required": "Należy wpisać co najmniej jeden poprawny e-mail", - "list": "Należy wpisać listę poprawnych e-maili rozdzielonych przecinkami (user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "Proszę wpisać nazwę roli" - }, - "role": { - "limit": { - "required": "Wpisz ograniczenie na liczbę pokoi", - "min": "Dozwolone minimum to 0", - "max": "Dozwolone maksimum to 100" - }, - "type": { - "error": "Musisz podać liczbę" - } - }, - "room": { - "name": { - "required": "Należy wpisać nazwę pokoju.", - "min": "Nazwa musi mieć co najmniej 2 znaki" - } - }, - "room_join": { - "name": { - "required": "Proszę wpisać swoją nazwę." - } - }, - "url": { - "invalid": "Niepoprawny URL" - } - }, - "room": { - "fields": { - "name": { - "label": "Nazwa Pokoju", - "placeholder": "Wpisz nazwę pokoju..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Nazwa", - "placeholder": "Wprowadź swoją nazwę" - }, - "access_code": { - "label": "Kod Dostępu", - "placeholder": "Wprowadź kod dostępu" - }, - "recording_consent": { - "label": "Przyjmuję do wiadomości, że ta sesja może zostać zarejestrowana. Może to obejmować mój głos i wideo, jeśli jest włączone." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Pełna Nazwa", - "placeholder": "Wpisz swoją pełną nazwę" - }, - "email": { - "label": "E-mail", - "placeholder": "Wpisz swój e-mail" - }, - "password": { - "label": "Hasło", - "placeholder": "Utwórz hasło" - }, - "password_confirmation": { - "label": "Potwierdź Hasło", - "placeholder": "Potwierdź Hasło" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "E-mail", - "placeholder": "E-mail" - }, - "password": { - "label": "Hasło", - "placeholder": "Hasło" - }, - "remember_me": { - "label": "Zapamiętaj mnie" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Aktualne Hasło", - "placeholder": "Wpisz swoje hasło" - }, - "new_password": { - "label": "Nowe Hasło", - "placeholder": "Wpisz swoje nowe hasło" - }, - "password_confirmation": { - "label": "Potwierdź hasło", - "placeholder": "Potwierdź swoje nowe hasło" - } - }, - "validations": { - "old_password": { - "required": "Należy wpisać swoje obecne hasło" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "E-mail", - "placeholder": "Wpisz e-mail dla konta" - } - }, - "validations": { - "email": { - "required": "Należy wpisać e-mail powiązany z kontem" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Nowe Hasło", - "placeholder": "Wpisz nowe hasło" - }, - "password_confirmation": { - "label": "Potwierdź hasło", - "placeholder": "Potwierdź swoje nowe hasło" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Pełna nazwa" - }, - "email": { - "label": "E-mail" - }, - "language": { - "label": "Język" - }, - "role": { - "label": "Rola" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Pełna nazwa", - "placeholder": "Wpisz pełną nazwę użytkownika" - }, - "email": { - "label": "E-mail", - "placeholder": "Wpisz e-mail użytkownika" - }, - "password": { - "label": "Hasło", - "placeholder": "Wpisz hasło użytkownika" - }, - "password_confirmation": { - "label": "Potwierdź hasło", - "placeholder": "Potwierdź wpisane hasło" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "E-maile" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Wpisz tu link...", - "text_placeholder": "Wpisz tu tekst..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Nazwa roli", - "placeholder": "Wpisz nazwę roli..." - } - } - } - } - } -} diff --git a/app/assets/locales/pt.json b/app/assets/locales/pt.json deleted file mode 100644 index 9c80073fd6..0000000000 --- a/app/assets/locales/pt.json +++ /dev/null @@ -1,651 +0,0 @@ -{ - "start": "Iniciar", - "search": "Procurar", - "home": "Página Inicial", - "previous": "Anterior", - "back": "Voltar", - "next": "Próximo", - "view": "Ver", - "join": "Participar", - "edit": "Editar", - "save": "Gravar", - "save_changes": "Gravar alterações", - "update": "Atualizar", - "report": "Reportar", - "share": "Partilhar", - "cancel": "Cancelar", - "close": "Fechar", - "delete": "Apagar", - "copy": "Copiar link de participação", - "or": "Ou", - "online": "Online", - "help_center": "Central de Ajuda", - "are_you_sure": "Tem a certeza?", - "return_home": "Voltar para Página Inicial", - "created_at": "Criado em", - "no_result_search_input": "Não foi possível encontrar nenhum resultado para \"{{ searchInput }}\"", - "action_permanent": "Esta ação não pode ser desfeita.", - "homepage": { - "welcome_bbb": "Bem-vindo/a ao BigBlueButton.", - "bigbluebutton_description": "BigBlueButton é um sistema de videoconferência de código aberto para aulas online. A plataforma maximiza o tempo para a aprendizagem aplicada, permitindo que os alunos colaborem e recebam feedback em tempo real.", - "greenlight_description": "Crie suas próprias salas para hospedar sessões ou junte-se a outras usando um link curto e conveniente.", - "learn_more": "Saiba mais sobre o BigBlueButton", - "explore_features": "Explore nossos recursos", - "meeting_title": "Iniciar uma reunião", - "meeting_description": "Inicie uma aula virtual com vídeo, áudio, partilha de ecrã, chat e todas as ferramentas necessárias para a aprendizagem aplicada.", - "recording_title": "Grave as suas reuniões", - "recording_description": "Grave as reuniões do BigBlueButton e partilhe com os alunos para rever e refletir sobre o material.", - "settings_title": "Gerir as suas salas", - "settings_description": "Configure as suas salas e as configurações de reunião para estar no controlo de uma sala de aula efetiva.", - "and_more_title": "E mais!", - "and_more_description": "O BigBlueButton oferece ferramentas integradas para aprendizagem aplicada e é projetado para economizar tempo durante a aula.", - "enter_meeting_url": "Digite a URL da Reunião", - "enter_meeting_url_instruction": "Por favor, insira a URL da sua reunião do BigBlueButton no campo abaixo." - }, - "authentication": { - "sign_in": "Entrar", - "sign_up": "Inscrever-se", - "sign_out": "Sair", - "email": "E-mail", - "password": "Senha", - "confirm_password": "Confirmar Senha", - "enter_email": "Insira o seu e-mail", - "enter_name": "Insira o seu nome", - "remember_me": "Lembrar-me", - "forgot_password": "Esqueceu a senha?", - "dont_have_account": "Não tem uma conta?", - "create_account": "Criar Conta", - "create_an_account": "Criar uma conta", - "already_have_account": "Já tem uma conta?" - }, - "user": { - "user": "Utilizador", - "users": "Utilizadores", - "name": "Nome", - "email_address": "Endereço de e-mail", - "authenticator": "Autenticador", - "full_name": "Nome Completo", - "no_user_found": "Não foi encontrado nenhum utilizador", - "type_three_characters": "Por favor, insira três (3) caracteres ou mais para mostrar aos outros utilizadores.", - "search_not_found": "Não foram encontrados utilizadores", - "profile": { - "profile": "Perfil", - "language": "Idioma", - "role": "Papel", - "administrator": "Administrador", - "guest": "Convidado" - }, - "account": { - "account_info": "Informações da Conta", - "delete_account": "Excluir Conta", - "change_password": "Alterar Senha", - "reset_password": "Redefinir a senha", - "update_account_info": "Atualizar informações da conta", - "current_password": "Senha Atual", - "new_password": "Nova Senha", - "confirm_password": "Confirmar Senha", - "permanently_delete_account": "Excluir a sua conta permanentemente", - "delete_account_description": "Se você optar por excluir sua conta, ela NÃO poderá ser recuperada. \nTodas as informações relacionadas à sua conta, incluindo configurações, salas e gravações, serão removidas.", - "delete_account_confirmation": "Sim, gostaria de excluir a minha conta.", - "are_you_sure_delete_account": "Tem a certeza de que deseja excluir sua conta?" - }, - "avatar": { - "upload_avatar": "Carregar avatar", - "delete_avatar": "Apagar avatar", - "crop_avatar": "Cortar avatar" - }, - "pending": { - "title": "Registo pendente", - "message": "Obrigado por se registar! A sua conta está atualmente a aguardar a aprovação de um administrador." - } - }, - "room": { - "room": "Sala", - "rooms": "Salas", - "room_name": "Nome da sala", - "add_new_room": "+ Nova sala", - "create_room": "Criar sala", - "delete_room": "Apagar sala", - "create_new_room": "Criar nova sala", - "enter_room_name": "Introduza o nome da sala", - "shared_by": "Partilhada por", - "last_session": "Última sessão: {{ localizedTime }}", - "no_last_session": "Não existem sessões anteriores", - "search_not_found": "Não foram encontradas salas", - "rooms_list_is_empty": "Ainda não tem nenhuma sala!", - "rooms_list_empty_create_room": "Crie a sua primeira sala clicando no botão abaixo e inserindo um nome para a sala.", - "meeting": { - "start_meeting": "Começar reunião", - "join_meeting": "Participe na reunião", - "meeting_invitation": "Foi convidado/a para participar", - "meeting_not_started": "A reunião ainda não começou", - "join_meeting_automatically": "Será automaticamente conectado quando a reunião começar.", - "recording_consent": "Eu reconheço que esta sessão pode ser gravada. Isso pode incluir minha voz e vídeo, se habilitados." - }, - "presentation": { - "presentation": "Apresentação", - "click_to_upload": "Clique para enviar", - "drag_and_drop": "ou arraste e largue", - "upload_description": "Carregue qualquer documento do Office ou arquivo PDF. Dependendo do tamanho do ficheiro, pode ser necessário mais tempo para carregar antes de poder ser usado.", - "are_you_sure_delete_presentation": "Você tem a certeza que deseja excluir esta apresentação?" - }, - "shared_access": { - "access": "Acesso", - "add_share_access": "+ Partilhar acesso", - "share_room_access": "Partilhar acesso à sala", - "add_some_users": "Está na hora de adicionar utilizadores!", - "add_some_users_description": "Para adicionar novos utilizadores, clique no botão abaixo e pesquise ou selecione os utilizadores com os quais deseja partilhar esta sala.", - "delete_shared_access": "Eliminar acesso partilhado", - "are_you_sure_delete_shared_access": "Tem a certeza que deseja excluir este acesso partilhado?" - }, - "settings": { - "settings": "Definições", - "room_name": "Nome da sala", - "user_settings": "Definições do utilizador", - "allow_room_to_be_recorded": "Permitir que a reunião seja gravada", - "require_signed_in": "Exigir que os utilizadores façam login antes de entrar.", - "require_signed_in_message": "Precisa fazer login para entrar nesta sala", - "require_mod_approval": "Exigir aprovação do moderador antes de entrar", - "allow_any_user_to_start": "Permitir que qualquer utilizador inicie a reunião", - "all_users_join_as_mods": "Todos os utilizadores participam como moderadores", - "mute_users_on_join": "Silenciar utilizadores ao entrar", - "generate": "Gerar", - "access_code": "Gerar código de acesso", - "mod_access_code": "Código de acesso de moderador", - "mod_access_code_optional": "Código de acesso de moderador (opcional)", - "access_code_required": "Por favor coloque o código de acesso", - "wrong_access_code": "Código de acesso errado", - "generate_viewers_access_code": "Gerar código de acesso para visualizadores", - "generate_mods_access_code": "Gerar código de acesso para moderadores", - "are_you_sure_delete_room": "Você tem a certeza que deseja excluir esta sala?" - } - }, - "recording": { - "recording": "Gravação", - "recordings": "Gravações", - "name": "Nome", - "length": "Duração", - "users": "Utilizadores", - "visibility": "Visibilidade", - "formats": "Formatos", - "published": "Publicada", - "unpublished": "Não publicada", - "protected": "Protegida", - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "A processar a gravação. Isto pode demorar alguns minutos...", - "copy_recording_urls": "Copiar link da gravação", - "recordings_list_empty": "Ainda não possui nenhuma gravação!", - "recordings_list_empty_description": "As gravações aparecerão aqui depois que iniciar uma reunião e gravá-la.", - "delete_recording": "Excluir gravação", - "are_you_sure_delete_recording": "Tem a certeza de que deseja excluir esta gravação?", - "search_not_found": "Gravações não encontradas" - }, - "admin": { - "admin_panel": "Painel de administração", - "manage_users": { - "manage_users": "Gerir utilizadores", - "active": "Novo utilizador", - "approve": "Aprovar", - "decline": "Rejeitar", - "pending": "Pendente", - "banned": "Expulso", - "ban": "Expulsar", - "unban": "Anular expulsão", - "deleted": "Apagar", - "invited_tab": "Convidado/a", - "invite_user": "Convidar utilizador", - "send_invitation": "Enviar convite", - "enter_user_email": "Introduza o e-mail do utilizador", - "new_user": "Novo utilizador", - "add_new_user": "Novo utilizador", - "create_new_user": "Criar novo utilizador", - "edit_user": "Editar utilizador", - "delete_user": "Excluir utilizador", - "users_edit_path": "Editar utilizadores", - "create_account": "Criar conta", - "create_room": "Criar sala", - "create_new_room": "Criar nova sala", - "user_created_at": "Criada: {{localizedTime}}", - "are_you_sure_delete_account": "Tem a certeza que deseja excluir a conta de {{user.name}}?", - "delete_account_warning": "Se você escolher excluir esta conta, ela NÃO poderá ser recuperada.", - "empty_active_users": "Não há utilizadores ativos neste servidor ainda!", - "empty_active_users_subtext": "Quando o estado de um utilizador é alterado para ativo, ele aparecerá aqui.", - "empty_pending_users": "Não há utilizadores pendentes neste servidor ainda!", - "empty_pending_users_subtext": "Quando o estado de um utilizador for alterado para pendente, ele aparecerá aqui.", - "empty_banned_users": "Não há utilizadores banidos neste servidor ainda!", - "empty_banned_users_subtext": "Quando o estado de um utilizador for alterado para banido, ele aparecerá aqui.", - "empty_invited_users": "Não há utilizadores convidados neste servidor ainda!", - "empty_invited_users_subtext": "Quando o estado de um utilizador é alterado para convidado, ele aparecerá aqui.", - "invited": { - "time_sent": "Tempo enviado", - "valid": "Válido" - } - }, - "server_rooms": { - "server_rooms": "Salas no servidor", - "name": "Nome", - "owner": "Proprietário", - "room_id": "ID da sala", - "participants": "Participantes", - "status": "Estado", - "running": "A decorrer", - "not_running": "Não está a decorrer", - "active": "Ativa", - "current_session": "Reunião atual: {{lastSession}}", - "last_session": "Última sessão: {{localizedTime}}", - "no_meeting_yet": "Ainda sem sessões.", - "delete_server_rooms": "Excluir sala do servidor", - "resync_recordings": "Resincronizar gravações", - "empty_room_list": "Ainda sem salas!", - "empty_room_list_subtext": "Salas aparecerão aqui após criar a sua primeira sala." - }, - "server_recordings": { - "server_recordings": "Gravações no servidor", - "latest_recordings": "Últimas gravações", - "no_recordings_found": "Gravações não encontradas" - }, - "site_settings": { - "site_settings": "Definições do Site", - "customize_greenlight": "Personalizar site", - "appearance": { - "appearance": "Aparência", - "brand_color": "Cor da marca", - "regular": "Normal", - "lighten": "Mais claro", - "brand_image": "Logotipo", - "click_to_upload": "Clique para enviar", - "drag_and_drop": "ou assaste e solte", - "upload_brand_image_description": "Carregue qualquer ficheiro PNG, JPG ou SVG. Dependendo do tamanho do ficheiro, pode ser necessário tempo adicional para carregar antes que possa ser usado.", - "remove_branding_image": "Excluir logotipo" - }, - "administration": { - "administration": "Administração", - "terms": "Termos e Condições", - "privacy": "Política de Privacidade", - "privacy_policy": "Política de Privacidade", - "change_term_links": "Altere os links dos Termos que aparecem no rodapé da página.", - "change_privacy_link": "Mudar a ligação para a Política de Privacidade que aparece no rodapé da página", - "change_url": "Alterar URL", - "enter_link": "Coloque o link aqui" - }, - "settings": { - "settings": "Definições", - "allow_users_to_share_rooms": "Permitir que os utilizadores partilhem salas", - "allow_users_to_share_rooms_description": "Definir como desativado removerá o botão do menu suspenso de opções da sala, impedindo que os utilizadores partilhem salas", - "allow_users_to_preupload_presentation": "Permitir que os utilizadores enviem apresentações previamente", - "allow_users_to_preupload_presentation_description": "Os utilizadores podem pré-carregar uma apresentação para ser usada como apresentação padrão para aquela sala específica" - }, - "registration": { - "registration": "Registo", - "role_mapping_by_email": "Mapeamento de papel por e-mail", - "role_mapping_by_email_description": "Mapeie o utilizador para uma função usando seu e-mail. Deve estar no formato: função1=email1, função2=email2", - "enter_role_mapping_rule": "Insira uma regra de mapeamento de papel", - "resync_on_login": "Re-sincronizar os dados do utilizador a cada entrada", - "resync_on_login_description": "Resincronizar novamente as informações de um utilizador sempre que ele fizer login fazendo com que o provedor de autenticação externo sempre corresponda às informações no Greenlight", - "default_role": "Papel padrão", - "default_role_description": "O papel padrão a ser atribuído a utilizadores recém-criados", - "registration_method": "Método de registo", - "registration_method_description": "Alterar o modo como os utilizadores se registam no site", - "registration_methods" : { - "open": "Registo aberto", - "invite": "Juntar-se por convite", - "approval": "Aprovar/Rejeitar" - } - } - }, - "room_configuration": { - "room_configuration": "Configuração da sala", - "default": "Opcional (padrão: habilitado)", - "optional": "Opcional (padrão: desabilitado)", - "enabled": "Forçar habilitado", - "disabled": "Desabilitado", - "configurations": { - "allow_room_to_be_recorded": "Permitir que a sala seja gravada", - "allow_room_to_be_recorded_description": "Permite que os proprietários da sala especifiquem se desejam a opção de gravar uma sala ou não. Se ativado, o moderador ainda deve clicar no botão 'Gravar' após o início da reunião.", - "require_user_signed_in": "Exigir que os utilizadores façam login antes de participar", - "require_user_signed_in_description": "Permite apenas que utilizadores com uma conta Greenlight participem da reunião. Se eles não estiverem conectados, eles serão redirecionados para a página de login ao tentar entrar numa sala.", - "require_mod_approval": "Exigir aprovação do moderador antes de entrar", - "require_mod_approval_description": "Solicita ao moderador da reunião do BigBlueButton quando um usuário tenta se juntar. Se o usuário for aprovado, ele poderá entrar na reunião.", - "allow_any_user_to_start_meeting": "Permitir que qualquer utilizador inicie uma reunião", - "allow_any_user_to_start_meeting_description": "Permitir que qualquer utilizador inicie a reunião a qualquer momento. Por padrão, apenas o proprietário da sala pode iniciar a reunião.", - "allow_users_to_join_as_mods": "Todos os utilizadores participam como moderadores", - "allow_users_to_join_as_mods_description": "Permite que todos os utilizadores tenham privilégios de moderador no BigBlueButton quando entrarem na reunião", - "mute_users_on_join": "Silenciar utilizadores quando eles entrarem", - "mute_users_on_join_description": "Automaticamente coloca o utilizador no mudo quando ele entra na reunião do BigBlueButton.", - "viewer_access_code": "Código de acesso do visualizador", - "viewer_access_code_description": "Permite que os proprietários de salas tenham um código alfanumérico aleatório que pode ser partilhado com os utilizadores. Se gerado, o código será exigido para que os utilizadores participem das reuniões da sala.", - "mod_access_code": "Código de acesso do moderador", - "mod_access_code_description": "Permite que os proprietários da sala tenham um código alfanumérico aleatório que pode ser partilhado com os utilizadores. O código, se gerado, não será exigido e, quando usado em qualquer reunião de sala, fará com que o utilizador entre como moderador." - } - }, - "roles": { - "role": "Papel", - "roles": "Papéis", - "administrator": "Administrador", - "guest": "Convidado", - "manage_roles": "Gerir papéis", - "delete_role": "Excluir Papel", - "are_you_sure_delete_role": "Tem a certeza de que deseja excluir este papel?", - "enter_role_name": "Insira um nome de Papel", - "add_role": "+ Criar Papel", - "create_role": "Criar Papel", - "create_new_role": "Criar um novo Papel", - "no_role_found": "Nenhum papel encontrado.", - "search_not_found": "Papéis não encontrados.", - "edit": { - "create_room": "Permitir que utilizadores com este papel criem salas", - "record": "Permitir que os utilizadores com este papel gravem as suas reuniões", - "manage_users": "Permitir que utilizadores com este papel façam a gestão de utilizadores", - "manage_rooms": "Permitir que utilizadores com este papel façam a gestão de salas", - "manage_recordings": "Permitir que utilizadores com este papel façam a gestão de gravações", - "manage_site_settings": "Permitir que utilizadores com este papel façam a gestão das configurações do site", - "manage_roles": "Permitir que utilizadores com este papel possam editar outros papéis", - "shared_list": "Incluir utilizadores com este papel no menu suspenso para partilhar salas ", - "room_limit": "Limite da sala" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Um novo utilizador foi criado", - "user_updated": "O utilizador foi actualizado", - "user_deleted": "O utilizador foi excluído", - "avatar_updated": "O avatar foi actualizado", - "password_updated": "A senha foi actualizada.", - "account_activated": "A sua conta foi ativada.", - "activation_email_sent": "Um e-mail que contém as instruções para ativar a sua conta foi enviado.", - "reset_pwd_email_sent": "Um e-mail contendo as instruções para redefinir a sua senha foi enviado." - }, - "session": { - "signed_out": "Foi desconectado." - }, - "room": { - "room_created": "Uma nova sala foi criada.", - "room_updated": "A sala foi atualizada.", - "room_deleted": "A sala foi excluída..", - "room_shared": "A sala foi partilhada.", - "room_unshared": "A sala deixou de ser partilhada.", - "recordings_synced": "As gravações da sala foram sincronizadas.", - "room_configuration_updated": "A configuração da sala foi atualizada.", - "room_setting_updated": "As configurações da sala foram atualizadas.", - "presentation_updated": "A apresentação foi atualizada.", - "presentation_deleted": "A apresentação foi excluída.", - "joining_meeting": "Entrar na reunião...", - "meeting_started": "Reunião iniciada.", - "access_code_copied": "O código de acesso foi copiado.", - "access_code_generated": "Um novo código de acesso foi gerado.", - "access_code_deleted": "O código de acesso foi excluído.", - "copied_meeting_url": "A URL da reunião foi copiada. O link pode ser usado para entrar na reunião." - }, - "site_settings": { - "site_setting_updated": "A configuração do site foi atualizada.", - "brand_color_updated": "A cor da marca foi atualizada.", - "brand_image_updated": "O logotipo foi atualizado.", - "brand_image_deleted": "O logotipo foi excluído.", - "privacy_policy_updated": "A Política de Privacidade foi atualizada.", - "terms_of_service_updated": "Os Termos e Condições foram atualizados." - }, - "recording": { - "recording_visibility_updated": "A visibilidade da gravação foi atualizada.", - "recording_name_updated": "O nome da gravação foi atualizado.", - "recording_deleted": "A gravação foi excluída.", - "copied_urls": "Os URLs de gravação foram copiados." - }, - "role": { - "role_created": "Um novo Papel foi criado.", - "role_updated": "O Papel foi atualizado.", - "role_deleted": "O Papel foi excluído.", - "role_permission_updated": "A permissão do Papel foi atualizada." - }, - "invitations": { - "invitation_sent": "Um convite foi enviado." - } - }, - "error": { - "problem_completing_action": "A ação não pode ser concluída. Tente novamente.", - "file_type_not_supported": "O tipo de ficheiro não é suportado.", - "file_size_too_large": "O tamanho do ficheiro é muito grande.", - "file_upload_error": "O ficheiro não pode ser carregado.", - "signin_required": "Deve fazer login para aceder a esta página.", - "roles": { - "role_assigned": "Este Papel não pode ser excluído porque está atribuído a pelo menos um utilizador." - }, - "users": { - "signup_error": "Não pode ser autenticado. Entre em contato com o administrador.", - "invalid_invite": "O seu token de convite é inválido ou incorreto. Entre em contato com o seu administrador para receber um novo token.", - "email_exists": "Já existe uma conta com este e-mail. Tente novamente com outro e-mail.", - "old_password": "A senha que inseriu está incorreta.", - "pending": "O seu registo está pendente de aprovação do administrador. Por favor, tente novamente mais tarde.", - "banned": "Não tem acesso a este aplicativo. Entre em contato com o seu administrador se acredita que isto é um erro." - }, - "rooms": { - "room_limit": "A sala não pode ser criada devido ao limite de salas." - }, - "session": { - "invalid_credentials": "O nome de utilizador ou senha é inválido. Verifique os seus dados de acesso e tente novamente." - } - } - }, - "global_error_page": { - "title": "Erro", - "message": "Desculpe, algo deu errado. Se o incidente ocorrer novamente, entre em contato com o administrador." - }, - "not_found_error_page": { - "title": "Página não encontrada", - "message": "Desculpe, a página que está a tentar aceder não pode ser encontrada." - }, - "account_activation_page": { - "title": "Ativação de conta", - "account_unverified": "A sua conta ainda não foi verificada.", - "message": "Para usar o Greenlight, verifique a sua conta seguindo as instruções no e-mail de ativação que foi lhe foi enviado.", - "resend_activation_link": "Se não recebeu um e-mail de ativação ou está a ter problemas para usá-lo, clique no botão abaixo para solicitar um novo e-mail de ativação.", - "resend_btn_lbl": "Reenviar verificação" - }, - "forms": { - "validations": { - "full_name": { - "required": "Por favor insira o nome completo", - "min": "O nome deve ter pelo menos 2 caracteres", - "max": "O nome deve ter no máximo 255 caracteres" - }, - "email": { - "required": "Por favor insira um endereço de e-mail", - "email": "O valor inserido não corresponde ao formato de e-mail", - "min": "O e-mail deve ter pelo menos 6 caracteres", - "max": "O e-mail deve ter no máximo 255 caracteres" - }, - "password": { - "required": "Por favor insira a senha", - "match": "A senha deve ter pelo menos:", - "min": "- Oito caracteres", - "lower": "- Uma letra minúscula", - "upper": "- Uma letra maiúscula", - "digit": "- Um dígito", - "symbol": "- Um símbolo ", - "max": "A senha deve ter no máximo 255 caracteres" - }, - "password_confirmation": { - "required": "Insira a confirmação de senha", - "match": "As senhas não conferem" - }, - "emails": { - "required": "Por favor digite ao menos um endereço de email válido", - "list": "Forneça uma lista separada por vírgulas de e-mails válidos (user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "Insira o nome do Papel" - }, - "role": { - "limit": { - "required": "Insira o limite de utilizadores na sala", - "min": "O mínimo permitido é 0", - "max": "O máximo permitido é 100" - }, - "type": { - "error": "Deve especificar um número" - } - }, - "room": { - "name": { - "required": "Por favor digite o nome da sala.", - "min": "O nome deve conter ao menos 2 caracteres" - } - }, - "url": { - "invalid": "URL Inválida" - } - }, - "room": { - "fields": { - "name": { - "label": "Nome da Sala", - "placeholder": "Digite o nome da sala..." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Nome Completo", - "placeholder": "Digite seu nome completo" - }, - "email": { - "label": "Email", - "placeholder": "Digite seu email" - }, - "password": { - "label": "Senha", - "placeholder": "Criar senha" - }, - "password_confirmation": { - "label": "Confirmar Senha", - "placeholder": "Confirmar Senha" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Email" - }, - "password": { - "label": "Senha", - "placeholder": "Senha" - }, - "remember_me": { - "label": "Lembrar-me" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Senha Atual", - "placeholder": "Digite sua senha" - }, - "new_password": { - "label": "Nova Senha", - "placeholder": "Digite sua nova senha" - }, - "password_confirmation": { - "label": "Confirmar Senha", - "placeholder": "Confirme sua nova senha" - } - }, - "validations": { - "old_password": { - "required": "Por favor digite sua senha atual" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Digite a conta de email" - } - }, - "validations": { - "email": { - "required": "Por favor digite a conta de email" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Nova Senha", - "placeholder": "Digite sua nova senha" - }, - "password_confirmation": { - "label": "Confirmar Senha", - "placeholder": "Confirme sua nova senha" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Nome Completo" - }, - "email": { - "label": "Email" - }, - "language": { - "label": "Idioma" - }, - "role": { - "label": "Papel" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Nome Completo", - "placeholder": "Insira o nome completo do utilizador" - }, - "email": { - "label": "Email", - "placeholder": "Insira o e-mail do utilizador" - }, - "password": { - "label": "Senha", - "placeholder": "Insira a senha do utilizador" - }, - "password_confirmation": { - "label": "Confirmar Senha", - "placeholder": "Confirme a senha" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Emails" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Digite o endereço aqui..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Nome do Papel", - "placeholder": "Insira um nome de Papel..." - } - } - } - } - } -} diff --git a/app/assets/locales/ru.json b/app/assets/locales/ru.json deleted file mode 100644 index 6f0c4d9148..0000000000 --- a/app/assets/locales/ru.json +++ /dev/null @@ -1,720 +0,0 @@ -{ - "start": "Начать", - "search": "Поиск", - "home": "Личный кабинет", - "previous": "Предыдущий", - "back": "Назад", - "next": "Следующий", - "view": "Просмотр", - "join": "Присоединиться", - "edit": "Править", - "save": "Сохранить", - "save_changes": "Сохранить изменения", - "update": "Обновить", - "report": "Отчет", - "share": "Предоставить доступ", - "cancel": "Отмена", - "reset": "Сбросить", - "close": "Закрыть", - "delete": "Удалить", - "copy": "Скопировать ссылку", - "copy_viewer_code": "Скопировать код участника", - "copy_moderator_code": "Скопировать код модератора", - "or": "Или", - "online": "Онлайн", - "help_center": "Центр поддержки", - "are_you_sure": "Вы уверены?", - "return_home": "Вернуться Домой", - "created_at": "Создано", - "view_recordings": "Посмотреть записи", - "join_session": "Присоединиться к вебинару", - "no_result_search_input": "Не удалось найти никаких результатов для \"{{ searchInput }}\"", - "action_permanent": "Это действие не может быть отменено.", - "homepage": { - "welcome_bbb": "Добро пожаловать в BigBlueButton", - "bigbluebutton_description": "BigBlueButton — это система веб-конференций с открытым исходным кодом для онлайн-классов. Платформа максимизирует время для прикладного обучения, позволяя учащимся взаимодействовать между собой в режиме реального времени.", - "greenlight_description": "Создавайте свои собственные комнаты для проведения сеансов или присоединяйтесь к другим, используя короткую и удобную ссылку.", - "learn_more": "Узнайте больше о BigBlueButton", - "explore_features": "Ознакомьтесь с нашими возможностями", - "meeting_title": "Начать вебинар", - "meeting_description": "Запустите виртуальный класс с видео, аудио, демонстрацией экрана, чатом и всеми инструментами, необходимыми для прикладного обучения.", - "recording_title": "Ведите запись вебинаров", - "recording_description": "Записывайте встречи BigBlueButton и делитесь ими со студентами, чтобы просмотреть и обдумать материал.", - "settings_title": "Управление комнатами", - "settings_description": "Настройте свои комнаты и конференции, чтобы повысить эффективность своего класса.", - "and_more_title": "И более!", - "and_more_description": "BigBlueButton предлагает встроенные инструменты для прикладного обучения и разработан так, чтобы сэкономить ваше время во время занятий.", - "enter_meeting_url": "Пожалуйста, введите URL вашей встречи BigBlueButton в поле ниже.", - "enter_meeting_url_instruction": "Пожалуйста, введите ссылку вашей конференции BigBlueButton в поле ниже." - }, - "authentication": { - "sign_in": "Войти", - "sign_up": "Зарегистрироваться", - "sign_out": "Выйти", - "email": "Email", - "password": "Пароль", - "confirm_password": "Подтвердите пароль", - "enter_email": "Введите Ваш email", - "enter_name": "Введите Ваше имя", - "remember_me": "Запомнить меня", - "forgot_password": "Забыли пароль?", - "dont_have_account": "Нет аккаунта?", - "create_account": "Создать аккаунт", - "create_an_account": "Создать аккаунт", - "already_have_account": "Уже есть аккаунт?" - }, - "user": { - "user": "Пользователь", - "users": "Пользователи", - "name": "Имя", - "email_address": "Адрес email", - "authenticator": "Аутентификатор", - "full_name": "Полное имя", - "no_user_found": "Ни один пользователь не найден", - "type_three_characters": "Пожалуйста, введите три (3) или более символов для показа других пользователей.", - "search_not_found": "Пользователи не найдены", - "profile": { - "profile": "Профиль", - "language": "Язык", - "role": "Роль", - "administrator": "Администратор", - "guest": "Гость" - }, - "account": { - "account_info": "Информация об аккаунте", - "delete_account": "Удалить аккаунт", - "change_password": "Сменить пароль", - "set_password": "Установить новый пароль", - "reset_password": "Сбросить пароль", - "update_account_info": "Обновить информацию об аккаунте", - "current_password": "Текущий пароль", - "new_password": "Новый пароль", - "confirm_password": "Подтвердите пароль", - "permanently_delete_account": "Полностью удалить Ваш аккаунт", - "delete_account_description": "Если вы решите удалить свой аккаунт, его будет НЕВОЗМОЖНО восстановить. Вся информация, касающаяся вашего аккаунта, включая настройки, комнаты и записи, будет удалена.", - "delete_account_confirmation": "Да, я бы хотел удалить свой аккаунт", - "are_you_sure_delete_account": "Вы уверены, что вы хотите удалить свой аккаунт?" - }, - "avatar": { - "upload_avatar": "Загрузить аватар", - "delete_avatar": "Удалить аватар", - "crop_avatar": "Обрезать ваш аватар" - }, - "pending": { - "title": "В ожидании регистрации", - "message": "Спасибо за регистрацию! Ваша учетная запись в настоящее время ожидает утверждения администратором." - } - }, - "room": { - "room": "Комната", - "rooms": "Комнаты", - "room_name": "Имя комнаты", - "add_new_room": "+ Новая комната", - "create_room": "Создать комнату", - "delete_room": "Удалить комнату", - "create_new_room": "Создать новую комнату", - "enter_room_name": "Введите название комнаты", - "shared_by": "опубликовано", - "last_session": "Последний сеанс: {{ localizedTime }}", - "no_last_session": "Предыдущие сеансы отсутствуют", - "search_not_found": "Комнаты не найдены", - "rooms_list_is_empty": "У вас ещё нет комнат!", - "rooms_list_empty_create_room": "Создайте свою первую комнату, нажав на кнопку ниже и введя название комнаты.", - "meeting": { - "start_meeting": "Начать встречу", - "join_meeting": "Присоединиться к встрече", - "meeting_invitation": "Вы были приглашены на встречу", - "meeting_not_started": "Встреча еще не началась", - "join_meeting_automatically": "Вы автоматически присоединитесь, когда встреча начнется", - "recording_consent": "Я осознаю, что этот сеанс может быть записан. Запись может содержать мой голос и видео, если они включены." - }, - "presentation": { - "presentation": "Презентация", - "click_to_upload": "Нажмите, чтобы загрузить ", - "drag_and_drop": "или перетащите и отпустите", - "upload_description": "Загрузите любой офисный документ или PDF (размером не более {{size}}). В зависимости от размера файла, для загрузки может потребоваться дополнительное время, прежде чем его можно будет использовать", - "delete_presentation": "Удалить презентацию", - "are_you_sure_delete_presentation": "Вы уверены, что хотите удалить эту презентацию?" - }, - "shared_access": { - "access": "Доступ", - "add_share_access": "+ Предоставить доступ", - "share_room_access": "Предоставить доступ к комнате", - "add_some_users": "Время, чтобы добавить пользователей!", - "add_some_users_description": "Чтобы добавить новых пользователей, нажмите кнопку ниже и выполните поиск или выберите пользователей для предоставления доступа к комнате.", - "delete_shared_access": "Удалить общий доступ", - "are_you_sure_delete_shared_access": "Вы уверены, что хотите удалить этот общий доступ?" - }, - "settings": { - "settings": "Настройки", - "room_name": "Название комнаты", - "user_settings": "Настройки пользователя", - "allow_room_to_be_recorded": "Разрешить запись комнаты", - "require_signed_in": "Перед присоединением пользователи должны авторизоваться", - "require_signed_in_message": "Для присоединения к комнате вы должны авторизоваться в системе. ", - "require_mod_approval": "Подключать только с одобрения модератора", - "allow_any_user_to_start": "Любой пользователь может начать эту встречу", - "all_users_join_as_mods": "Все пользователи подключаются как модераторы", - "mute_users_on_join": "Выключить микрофон пользователей при присоединении", - "generate": "Создать", - "access_code": "Код доступа", - "mod_access_code": "Код доступа модератора", - "mod_access_code_optional": "Код доступа модератора (опционально)", - "access_code_required": "Пожалуйста, введите код доступа", - "wrong_access_code": "Неверный код доступа", - "generate_viewers_access_code": "Код доступа для участников", - "generate_mods_access_code": "Код доступа для модераторов", - "server_tag": "Выберите тип сервера для этой комнаты", - "default_tag_name": "По умолчанию", - "server_tag_desired": "Желаемый", - "server_tag_required": "Обязательный", - "are_you_sure_delete_room": "Вы уверены, что хотите удалить эту комнату?" - } - }, - "recording": { - "recording": "Запись", - "recordings": "Записи", - "processing": "Записи обрабатываются...", - "name": "Имя", - "length": "Продолжительность", - "users": "Пользователи", - "visibility": "Видимость", - "formats": "Форматы", - "published": "Опубликована", - "unpublished": "Не опубликована", - "protected": "Защищенные", - "public": "Публичная", - "public_protected": "Публичная/Защищенная", - "length_in_minutes": "{{recording.length}} мин.", - "processing_recording": "Обработка записи, это может занять несколько минут...", - "copy_recording_urls": "Скопировать ссылку на запись", - "recordings_list_empty": "У вас еще нет записей!", - "public_recordings_list_empty": "Публичных записей нет!", - "recordings_list_empty_description": "Записи появятся здесь после того, как вы начнете встречу и запишете ее.", - "public_recordings_list_empty_description": "Записи будут появляться здесь по мере поступления.", - "delete_recording": "Удалить запись", - "are_you_sure_delete_recording": "Вы уверены, что хотите удалить эту запись?", - "search_not_found": "Записи не найдены" - }, - "admin": { - "admin_panel": "Панель администратора", - "manage_users": { - "manage_users": "Управление пользователями", - "active": "Активен", - "approve": "Одобрить", - "decline": "Отклонить", - "pending": "В ожидании", - "banned": "Заблокирован", - "ban": "Заблокировать", - "unban": "Разблокировать", - "deleted": "Удален", - "invited_tab": "Приглашен", - "invite_user": "Пригласить пользователя", - "send_invitation": "Отправить приглашение", - "enter_user_email": "Введите email", - "new_user": "Новый пользователь", - "add_new_user": "Новый пользователь", - "create_new_user": "Создать нового пользователя", - "edit_user": "Изменить пользователя", - "delete_user": "Удалить пользователя", - "users_edit_path": "Пользователи/Изменить", - "create_account": "Создать аккаунт", - "create_room": "Создать комнату", - "create_new_room": "Создать новую комнату", - "user_created_at": "Создан: {{localizedTime}}", - "are_you_sure_delete_account": "Вы уверены, что хотите удалить аккаунт {{user.name}}?", - "delete_account_warning": "Если вы решите удалить этот аккаунт, его будет НЕВОЗМОЖНО восстановить. ", - "empty_active_users": "На этом сервере пока нет активных пользователей!", - "empty_active_users_subtext": "Когда статус пользователя изменится на «активный», он появится здесь.", - "empty_pending_users": "На этом сервере еще нет ожидающих пользователей!", - "empty_pending_users_subtext": "Когда статус пользователя изменится на «ожидает рассмотрения», он появится здесь.", - "empty_banned_users": "На этом сервере пока нет забаненных пользователей!", - "empty_banned_users_subtext": "Когда статус пользователя изменится на «забанен» он появится здесь.", - "empty_invited_users": "На этом сервере еще нет приглашенных пользователей!", - "empty_invited_users_subtext": "Когда статус пользователя изменится на «приглашенный», он появится здесь.", - "invited": { - "time_sent": "Время отправки", - "valid": "Действителен", - "revoke": "Отозвать" - } - }, - "server_rooms": { - "server_rooms": "Комнаты сервера", - "name": "Имя", - "owner": "Владелец", - "room_id": "ID комнаты", - "participants": "Участники", - "status": "Статус", - "running": "Запущена", - "not_running": "Остановлена", - "active": "Активные", - "current_session": "Текущий сеанс: {{lastSession}}", - "last_session": "Последний сеанс: {{localizedTime}}", - "no_meeting_yet": "Встреч пока нет.", - "delete_server_rooms": "Удалить комнату сервера", - "resync_recordings": "Повторно синхронизировать записи", - "empty_room_list": "Серверных комнат еще нет!", - "empty_room_list_subtext": "Комнаты появятся здесь после создания вашей первой комнаты." - }, - "server_recordings": { - "server_recordings": "Записи сервера", - "latest_recordings": "Последние записи", - "no_recordings_found": "Записи не найдены." - }, - "site_settings": { - "site_settings": "Настройки сайта", - "customize_greenlight": "Настроить внешний вид Greenlight", - "appearance": { - "appearance": "Внешний вид", - "brand_color": "Фирменный цвет", - "regular": "Основной", - "lighten": "Светлый", - "brand_image": "Фирменное изображение", - "click_to_upload": "Нажмите для загрузки", - "drag_and_drop": "или перетащите и отпустите", - "upload_brand_image_description": "Загрузите любой файл в формате PNG, JPG или SVG (размером не более {{size}}). В зависимости от размера файла, для загрузки может потребоваться дополнительное время, прежде чем его можно будет использовать", - "remove_branding_image": "Удалить фирменное изображение" - }, - "administration": { - "administration": "Администрирование", - "terms": "Условия и Правила", - "privacy": "Политика конфиденциальности", - "privacy_policy": "Политика конфиденциальности", - "change_term_links": "Изменить ссылку на правила, которая появляется внизу страницы", - "change_privacy_link": "Изменить ссылку на политику конфиденциальности, которая появляется внизу страницы", - "helpcenter": "Справочный центр", - "change_helpcenter_link": "Измените ссылку Справочного центра, которая появляется под раскрывающимся списком профиля", - "maintenance": "Баннер технического обслуживания", - "change_maintenance_text": "Измените текст баннера технического обслуживания, который отображается в заголовке", - "change_url": "Изменить URL", - "set_text": "Задать текст", - "clear_banner": "Очистить баннер", - "enter_link": "Введите ссылку здесь" - }, - "settings": { - "settings": "Настройки", - "allow_users_to_share_rooms": "Разрешить пользователям совместное использование комнат", - "allow_users_to_share_rooms_description": "Отключение опции удалит кнопку из выпадающего меню опций комнаты и не позволит пользователям совместно использовать комнаты", - "allow_users_to_preupload_presentation": "Разрешить пользователям предварительно загружать презентации", - "allow_users_to_preupload_presentation_description": "Пользователи могут предварительно загрузить презентацию, которая будет использоваться в качестве презентации по умолчанию для этой комнаты", - "default_visibility": "Статус видимости записи по умолчанию", - "default_visibility_description": "Все вновь созданные записи будут иметь этот статус видимости по умолчанию.", - "session_timeout": "Время ожидания сеанса", - "session_timeout_description": "Вы можете настроить время ожидания сеанса с помощью стандартного куки на 1 день или расширенного куки сеанса на 7 дней", - "default_session_timeout": "Стандартный (1 день)", - "extended_session_timeout": "Расширенный (7 дней)" - }, - "registration": { - "registration": "Регистрация", - "role_mapping_by_email": "Сопоставление ролей по электронной почте", - "role_mapping_by_email_description": "Сопоставьте пользователей с ролями, используя их электронную почту. Следует придерживаться формата: email1=role1,email2=role2", - "enter_role_mapping_rule": "Введите правило сопоставления роли", - "resync_on_login": "Синхронизировать данные пользователя при каждом входе", - "resync_on_login_description": "Повторно синхронизировать информацию о пользователе при каждом входе, обеспечивая согласованность данных между внешним сервисом аутентификации и Greenlight.", - "default_role": "Роль по умолчанию", - "default_role_description": "Роль, по умолчанию назначаемая новым пользователям", - "registration_method": "Метод регистрации", - "registration_method_description": "Изменение способа регистрации пользователей на сайте", - "registration_methods" : { - "open": "Открытая регистрация", - "invite": "Вход по приглашению", - "approval": "Одобрить/отклонить" - }, - "allowed_domains": "Разрешенные домены электронной почты", - "allowed_domains_signup_description": "Разрешить определенные домены электронной почты для регистрации. Формат должен быть: @test.com,domain.com", - "enter_allowed_domains_rule" : "Введите разрешенные домены" - } - }, - "room_configuration": { - "room_configuration": "Конфигурация комнаты", - "default": "Необязательно (по умолчанию: включено)", - "optional": "Необязательно (по умолчанию: отключено)", - "enabled": "Принудительно включено", - "disabled": "Выключено", - "configurations": { - "allow_room_to_be_recorded": "Разрешить запись комнаты", - "allow_room_to_be_recorded_description": "Позволяет владельцу комнаты указать, предоставлять ли возможность записи комнаты. Если разрешение дано, модератор все равно должен нажать кнопку «Запись» после начала встречи. ", - "require_user_signed_in": "Перед присоединением пользователи должны авторизоваться", - "require_user_signed_in_description": "Позволяет присоединять к встрече только пользователей с аккаунтом Greenlight. Если пользователь не аутентифицирован, при попытке подключения к комнате он будет перенаправлен на страницу входа.", - "require_mod_approval": "Подключать только с одобрения модератора", - "require_mod_approval_description": "Запрашивает модератора встречи BigBlueButton при попытке пользователя присоединиться. Если запрос одобренен, пользователь получает возможность подключиться. ", - "allow_any_user_to_start_meeting": "Любой пользователь может начать встречу", - "allow_any_user_to_start_meeting_description": "Позволить любому пользователю начать встречу в любое время. По умолчанию только владелец комнаты может начинать встречу.", - "allow_users_to_join_as_mods": "Все пользователи присоединяются в качестве модераторов", - "allow_users_to_join_as_mods_description": "Дать всем пользователям права модератора, когда они подключаются к встрече", - "mute_users_on_join": "Выключить микрофон пользователей при присоединении", - "mute_users_on_join_description": "Автоматически отключает микрофон пользователю, присоединяющемуся к встрече BigBlueButton", - "viewer_access_code": "Код доступа участника", - "viewer_access_code_description": "Позволяет владельцу комнаты задать произвольный буквенно-цифровой код и поделиться им с участниками. Если код задан, для подключения участникам будет необходимо ввести его.", - "mod_access_code": "Код доступа модератора", - "mod_access_code_description": "Позволяет владельцу комнаты задать произвольный буквенно-цифровой код и поделиться им с участниками. Код, если задан, не будет требоваться для подключения, а при использовании подключит участника в роли модератора." - } - }, - "roles": { - "role": "Роль", - "roles": "Роли", - "administrator": "Администратор", - "guest": "Гость", - "manage_roles": "Управление пользователями", - "delete_role": "Удалить роль", - "are_you_sure_delete_role": "Вы уверены, что хотите удалить эту роль?", - "enter_role_name": "Введите название роли", - "add_role": "+ Создать роль", - "create_role": "Создать роль", - "create_new_role": "Создать новую роль", - "no_role_found": "Роль не найдена.", - "search_not_found": "Роли не найдены", - "edit": { - "create_room": "Разрешить пользователям с этой ролью создавать комнаты", - "record": "Разрешить пользователям с этой ролью записывать свои встречи", - "manage_users": "Разрешить пользователям с этой ролью управлять пользователями", - "manage_rooms": "Разрешить пользователям с этой ролью управлять серверными комнатами", - "manage_recordings": "Разрешить пользователям с этой ролью управлять записями сервера", - "manage_site_settings": "Разрешить пользователям с этой ролью управлять настройками сайта", - "manage_roles": "Разрешить пользователям с этой ролью изменять другие роли", - "shared_list": "Включите пользователей с этой ролью в раскрывающийся список для совместного использования комнат.", - "room_limit": "Ограничение комнаты", - "email_on_signup": "Отправлять email, когда новый пользователь зарегистрируется", - "allowed_recording_visibility": "Разрешённый статус видимости записи" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Пользователь создан.", - "user_updated": "Пользователь обновлен.", - "user_deleted": "Пользователь удален.", - "avatar_updated": "Аватар обновлен.", - "password_changed": "Пароль успешно обновлен. Пожалуйста, войдите в систему еще раз.", - "password_updated": "Пароль обновлен.", - "account_activated": "Учетная запись успешно активирована. Пожалуйста, войдите в ваш аккаунт.", - "activation_email_sent": "Письмо активации было выслано", - "reset_pwd_email_sent": "Электронное письмо для сброса пароля должно быть отправлено, пожалуйста, проверьте свой почтовый ящик" - }, - "session": { - "signed_out": "Вы успешно вышли." - }, - "room": { - "room_created": "Комната создана.", - "room_updated": "Комната обновлена.", - "room_deleted": "Комната удалена.", - "room_shared": "Совместный доступ к комнате предоставлен", - "room_unshared": "Cовместный доступ к комнате прекращен", - "recordings_synced": "Происходит синхронизация записей комнаты", - "room_configuration_updated": "Настройки комнаты обновлены.", - "room_setting_updated": "Настройки комнаты обновлены.", - "presentation_updated": "Презентация обновлена", - "presentation_deleted": "Презентация удалена", - "joining_meeting": "Подключаемся к встрече...", - "meeting_started": "Встреча началась.", - "access_code_copied": "Код доступа скопирован.", - "access_code_generated": "Код доступа создан.", - "access_code_deleted": "Код доступа удален.", - "copied_meeting_url": "Ссылка встречи скопирована. Ссылку можно использовать для присоединения к встрече.", - "copied_viewer_code": "Код доступа участника вебинара был скопирован.", - "copied_moderator_code": "Код доступа модератора вебинара был скопирован." - }, - "site_settings": { - "site_setting_updated": "Настройки сайта обновлены.", - "brand_color_updated": "Фирменный цвет обновлен.", - "brand_image_updated": "Фирменное изображение обновлено.", - "brand_image_deleted": "Фирменное изображение удалено.", - "privacy_policy_updated": "Политика конфиденциальности обновлена.", - "helpcenter_updated": "Ссылка на Справочный центр обновлена", - "terms_of_service_updated": "Условия использования обновлены.", - "maintenance_updated": "Баннер технического обслуживания обновлен.", - "allowed_domains_signup_updated": "Разрешенные домены электронной почты были обновлены" - }, - "recording": { - "recording_visibility_updated": "Видимость записи обновлена.", - "recording_name_updated": "Имя записи обновлено.", - "recording_deleted": "Запись удалена.", - "copied_urls": "Ссылка на запись скопирована." - }, - "role": { - "role_created": "Роль создана", - "role_updated": "Роль обновлена", - "role_deleted": "Роль удалена.", - "role_permission_updated": "Права роли обновлены." - }, - "invitations": { - "invitation_sent": "Выслать приглашение", - "invitation_revoked": "Приглашение было отозвано" - } - }, - "error": { - "problem_completing_action": "Не удалось завершить данное действие. \n Пожалуйста, попробуйте еще раз.", - "server_type_unavailable": "Требуемый тип сервера недоступен. Пожалуйста, выберите другой тип в настройках комнаты", - "file_type_not_supported": "Тип файла не поддерживается", - "file_size_too_large": "Размер файла слишком большой", - "file_upload_error": "Файл не может быть загружен.", - "signin_required": "Для доступа к странице вы должны авторизоваться в системе. ", - "malware_detected": "Обнаружена вредоносная программа! Файл, который вы загрузили, может содержать вредоносное ПО. Пожалуйста, проверьте ваш файл и попробуйте снова.", - "roles": { - "role_assigned": "Эту роль нельзя удалить, т.к. она назначена как минимум одному пользователю." - }, - "users": { - "signup_error": "При входе произошла ошибка. Обратитесь к администратору.", - "invalid_invite": "Ваше приглашение недействительно или неверно. Пожалуйста, свяжитесь с администратором для получения нового.", - "email_exists": "Учетная запись с этим email уже существует. Пожалуйста, попробуйте войти в учетную запись с этим email или запросите сброс пароля", - "old_password": "Текущий пароль, который вы ввели, неверен", - "pending": "Ваша регистрация ожидает одобрения администратора", - "banned": "У вас нет доступа к этому приложению. Если вы считаете, что это ошибка, обратитесь к администратору." - }, - "rooms": { - "room_limit": "Не удается создать комнату, т.к. достигнут разрешенный предел" - }, - "session": { - "invalid_credentials": "Неверное имя пользователя или пароль. Пожалуйста, проверьте свои учетные данные и повторите попытку." - } - } - }, - "global_error_page": { - "title": "Ошибка", - "message": "Ой, что-то пошло не так. Если проблема повторится, пожалуйста, свяжитесь с администратором." - }, - "not_found_error_page": { - "title": "Страница не найдена", - "message": "К сожалению, страница, к которой вы пытаетесь получить доступ, не найдена." - }, - "account_activation_page": { - "title": "Активация аккаунта", - "account_unverified": "Ваш аккаунт еще не был проверен.", - "message": "Чтобы использовать Greenlight, пожалуйста, пройдите проверку, следуя инструкциям в направленном вам письме активации аккаунта.", - "resend_activation_link": "Если вы не получили письмо активации или у вас возникли сложности его использования, нажмите ниже кнопку повторного запроса письма.", - "resend_btn_lbl": "Отправить повторно" - }, - "forms": { - "validations": { - "full_name": { - "required": "Введите полное имя", - "min": "Длина имени должна быть не менее 2 символов", - "max": "Длина имени должна быть не более 255 символов" - }, - "email": { - "required": "Введите email", - "email": "Введенное значение не соответствует формату электронной почты", - "min": "Длина email должна быть не менее 6 символов", - "max": "Длина email должна быть не более 255 символов" - }, - "password": { - "required": "Введите пароль", - "match": "Пароль должен содержать не менее:", - "min": "- Восемь символов", - "lower": "- Одна строчная буква", - "upper": "- Одна заглавная буква", - "digit": "- Одна цифра", - "symbol": "- Один символ", - "max": "Длина пароля должна быть не более 255 символов" - }, - "password_confirmation": { - "required": "Пожалуйста, повторите пароль", - "match": "Пароли не совпадают" - }, - "emails": { - "required": "Пожалуйста, введите хотя бы один действующий адрес электронной почты", - "list": "Укажите через запятую список действующих адресов электронной почты (user@users.com, user1@users.com, user2@users.com)" - }, - "role_name": { - "required": "Пожалуйста, введите название роли" - }, - "role": { - "limit": { - "required": "Пожалуйста, введите ограничение на количество комнат", - "min": "Минимально допустимое значение – 0.", - "max": "Максимально допустимое значение – 100." - }, - "type": { - "error": "Вы должны указать номер" - } - }, - "room": { - "name": { - "required": "Пожалуйста, введите название комнаты.", - "min": "Имя должно содержать не менее 2 символов" - } - }, - "room_join": { - "name": { - "required": "Введите свое имя." - } - }, - "url": { - "invalid": "Неверная ссылка" - }, - "text_form": { - "value": { - "required": "Пожалуйста, введите сообщение" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Название комнаты", - "placeholder": "Введите название комнаты..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Имя", - "placeholder": "Введите свое имя" - }, - "access_code": { - "label": "Код доступа", - "placeholder": "Введите код доступа" - }, - "recording_consent": { - "label": "Я уведомлен, что может вестись запись вебинара. Запись будет включать мой голос и видео." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Полное имя", - "placeholder": "Введите Ваше полное имя" - }, - "email": { - "label": "Email", - "placeholder": "Введите Ваш email" - }, - "password": { - "label": "Пароль", - "placeholder": "Создать пароль" - }, - "password_confirmation": { - "label": "Подтвердите пароль", - "placeholder": "Подтвердите пароль" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Email" - }, - "password": { - "label": "Пароль", - "placeholder": "Пароль" - }, - "remember_me": { - "label": "Запомнить меня" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Текущий пароль", - "placeholder": "Введите пароль" - }, - "new_password": { - "label": "Новый пароль", - "placeholder": "Введите новый пароль" - }, - "password_confirmation": { - "label": "Подтвердите пароль", - "placeholder": "Подтвердите новый пароль" - } - }, - "validations": { - "old_password": { - "required": "Пожалуйста, введите текущий пароль" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Введите Email" - } - }, - "validations": { - "email": { - "required": "Введите Email" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Новый пароль", - "placeholder": "Введите новый пароль" - }, - "password_confirmation": { - "label": "Подтвердите пароль", - "placeholder": "Подтвердите новый пароль" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Полное имя" - }, - "email": { - "label": "Электронная почта" - }, - "language": { - "label": "Язык" - }, - "role": { - "label": "Роль" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Полное имя", - "placeholder": "Введите полное имя" - }, - "email": { - "label": "Email", - "placeholder": "Введите email" - }, - "password": { - "label": "Пароль", - "placeholder": "Введите пароль" - }, - "password_confirmation": { - "label": "Подтвердите пароль", - "placeholder": "Подтвердите пароль" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Электронные письма" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Введите ссылку сюда...", - "text_placeholder": "Введите текст здесь..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Имя роли", - "placeholder": "Введите имя роли..." - } - } - } - } - } -} diff --git a/app/assets/locales/sv_SE.json b/app/assets/locales/sv_SE.json deleted file mode 100644 index ba40a49511..0000000000 --- a/app/assets/locales/sv_SE.json +++ /dev/null @@ -1,651 +0,0 @@ -{ - "start": "Start", - "search": "Sök", - "home": "Hem", - "previous": "Föregående", - "back": "Tillbaka", - "next": "Nästa", - "view": "Se", - "join": "Ansluta sig", - "edit": "Redigera", - "save": "Spara", - "save_changes": "Spara ändringar", - "update": "Uppdatera", - "report": "Rapportera", - "share": "Dela", - "cancel": "Avbryt", - "close": "Stänga", - "delete": "Radera", - "copy": "Kopiera möteslänk", - "or": "Eller", - "online": "Online", - "help_center": "Hjälpcenter", - "are_you_sure": "Är du säker?", - "return_home": "Återvända Hem", - "created_at": "Skapad vid", - "no_result_search_input": "Kunde inte hitta några resultat för \"{{ searchInput }}\"", - "action_permanent": "Denna åtgärd kan inte ångras.", - "homepage": { - "welcome_bbb": "Välkommen till BigBlueButton.", - "bigbluebutton_description": "BigBlueButton är ett webbkonferenssystem med öppen källkod för online klasser. Plattformen maximerar tiden för tillämpat lärande genom att göra det möjligt för studenter att samarbeta och få feedback i realtid.", - "greenlight_description": "Skapa dina egna rum för att hantera dina sessioner, eller gå med i andra med hjälp av en kort och bekväm länk.", - "learn_more": "Läs mer om BigBlueButton", - "explore_features": "Läs mer om BigBlueButton", - "meeting_title": "Starta ett möte", - "meeting_description": "Starta ett virtuellt klassrum med video, ljud, skärmdelning, chatt och alla verktyg som krävs för tillämpad inlärning.", - "recording_title": "Spela in dina möten", - "recording_description": "Spela in BigBlueButton-mötena och dela dem med eleverna för att granska och reflektera över materialet.", - "settings_title": "Hantera dina rum", - "settings_description": "Konfigurera dina rum och mötesinställningar för att ha kontroll över ett effektivt klassrum.", - "and_more_title": "Och mer!", - "and_more_description": "BigBlueButton erbjuder inbyggda verktyg för tillämpad inlärning och är designad för att spara tid under möten.", - "enter_meeting_url": "Ange mötes-URL", - "enter_meeting_url_instruction": "Ange länken till ditt BigBlueButton-möte i fältet nedan." - }, - "authentication": { - "sign_in": "Logga in", - "sign_up": "Bli Medlem", - "sign_out": "Logga ut", - "email": "Email", - "password": "Lösenord", - "confirm_password": "Bekräfta lösenordet", - "enter_email": "Ange din e-postadress", - "enter_name": "Ange ditt namn", - "remember_me": "Kom ihåg mig", - "forgot_password": "Glömt ditt lösenord?", - "dont_have_account": "Har du inget konto?", - "create_account": "Skapa konto", - "create_an_account": "Skapa ett konto", - "already_have_account": "Har du redan ett konto?" - }, - "user": { - "user": "Användare", - "users": "Användare", - "name": "Namn", - "email_address": "E-postadress", - "authenticator": "Autentisering", - "full_name": "Fullständiga namn", - "no_user_found": "Ingen användare hittades", - "type_three_characters": "Skriv tre (3) tecken eller fler för att visa de andra användarna.", - "search_not_found": "Inga användare hittades", - "profile": { - "profile": "Profil", - "language": "Språk", - "role": "Roll", - "administrator": "Administratör", - "guest": "Gäst" - }, - "account": { - "account_info": "Konto information", - "delete_account": "Radera konto", - "change_password": "Ändra lösenordet", - "reset_password": "Återställ lösenordet", - "update_account_info": "Uppdatera kontouppgifter", - "current_password": "Nuvarande lösenord", - "new_password": "Nytt lösenord", - "confirm_password": "Bekräfta lösenordet", - "permanently_delete_account": "Ta bort ditt konto permanent", - "delete_account_description": "Om du väljer att ta bort ditt konto kommer det INTE att kunna återställas.\nAll information om ditt konto, inklusive inställningar, rum och inspelningar kommer att tas bort.", - "delete_account_confirmation": "Ja, jag skulle vilja ta bort mitt konto", - "are_you_sure_delete_account": "Är du säker på att du vill ta bort ditt konto?" - }, - "avatar": { - "upload_avatar": "Ladda upp Avatar", - "delete_avatar": "Ta bort Avatar", - "crop_avatar": "Beskär din avatar" - }, - "pending": { - "title": "Väntar på registrering", - "message": "Tack för din registrering! Ditt konto väntar för närvarande på godkännande av en administratör." - } - }, - "room": { - "room": "Rum", - "rooms": "Rum", - "room_name": "Rumsnamn", - "add_new_room": "+ Nytt rum", - "create_room": "Skapa rum", - "delete_room": "Ta bort rum", - "create_new_room": "Skapa nytt rum", - "enter_room_name": "Ange rummets namn", - "shared_by": "delad av", - "last_session": "Senaste session: {{ localizedTime }}", - "no_last_session": "Ingen tidigare session skapad", - "search_not_found": "Inga rum hittades", - "rooms_list_is_empty": "Du har inga rum än!", - "rooms_list_empty_create_room": "Skapa ditt första rum genom att klicka på knappen nedan och ange ett rumsnamn.", - "meeting": { - "start_meeting": "Börja möte", - "join_meeting": "Gå med i mötet", - "meeting_invitation": "Du har blivit inbjuden att gå med", - "meeting_not_started": "Mötet har inte börjat än", - "join_meeting_automatically": "Du går automatiskt med när mötet startar", - "recording_consent": "Jag accepterar att denna session kan spelas in. Detta kan inkludera min röst och bild om de är aktiverade." - }, - "presentation": { - "presentation": "Presentation", - "click_to_upload": "Klicka för att ladda upp", - "drag_and_drop": "eller dra och släpp", - "upload_description": "Du kan ladda upp alla typer av Office-dokument eller PDF-filer. Beroende på filens storlek kan det ta lite extra tid att ladda upp innan den kan användas", - "are_you_sure_delete_presentation": "Är du säker på att du vill ta bort den här presentationen?" - }, - "shared_access": { - "access": "Tillgång", - "add_share_access": "+ Dela åtkomst", - "share_room_access": "Dela Rums Tillgång", - "add_some_users": "Dags att lägga till några användare!", - "add_some_users_description": "För att lägga till nya användare, klicka på knappen nedan och sök eller välj de användare du vill dela detta rum med.", - "delete_shared_access": "Ta bort delad åtkomst", - "are_you_sure_delete_shared_access": "Är du säker på att du vill ta bort denna delade åtkomst?" - }, - "settings": { - "settings": "Inställningar", - "room_name": "Rumsnamn", - "user_settings": "Användarinställningar", - "allow_room_to_be_recorded": "Aktivera inspelning", - "require_signed_in": "Kräv att användare är inloggade innan de går med i mötet", - "require_signed_in_message": "Du måste vara inloggad för att gå med i det här rummet.", - "require_mod_approval": "Kräv moderatorgodkännande innan någon kan gå med i mötet", - "allow_any_user_to_start": "Tillåt vilken användare som helst att starta detta möte", - "all_users_join_as_mods": "Alla användare går med som moderatorer", - "mute_users_on_join": "Stäng automatiskt av användarnas mikrofoner när de går med i mötet", - "generate": "Generera", - "access_code": "Åtkomstkod", - "mod_access_code": "Moderator åtkomstkod", - "mod_access_code_optional": "Moderatoråtkomstkod (valfritt)", - "access_code_required": "Vänligen ange åtkomstkoden", - "wrong_access_code": "Fel åtkomstkod", - "generate_viewers_access_code": "Generera åtkomstkod för mötesdeltagare", - "generate_mods_access_code": "Generera åtkomstkod för moderatorer", - "are_you_sure_delete_room": "Är du säker på att du vill ta bort det här rummet?" - } - }, - "recording": { - "recording": "Inspelning", - "recordings": "Inspelningar", - "name": "Namn", - "length": "Längd", - "users": "Användare", - "visibility": "Synlighet", - "formats": "Format", - "published": "Publicerad", - "unpublished": "Opublicerad", - "protected": "Skyddad", - "length_in_minutes": "{{recording.length}} min.", - "processing_recording": "Bearbetar inspelning, detta kan ta flera minuter...", - "copy_recording_urls": "Kopiera inspelningslänk(ar)", - "recordings_list_empty": "Du har inga inspelningar än!", - "recordings_list_empty_description": "Eventuella inspelningar av rummet kommer att delas här så snart de har bearbetats och publicerats.", - "delete_recording": "Ta bort inspelning", - "are_you_sure_delete_recording": "Är du säker på att du vill ta bort den här inspelningen?", - "search_not_found": "Inga inspelningar hittades" - }, - "admin": { - "admin_panel": "Administratörspanel", - "manage_users": { - "manage_users": "Hantera användare", - "active": "Aktiva", - "approve": "Godkänna", - "decline": "Avvisa", - "pending": "Väntar", - "banned": "Förbjudna", - "ban": "Förbjuda", - "unban": "Förbjuda ej", - "deleted": "Raderade", - "invited_tab": "Inbjudna", - "invite_user": "Bjud in användare", - "send_invitation": "Skicka inbjudan", - "enter_user_email": "Ange användarens e-postadress", - "new_user": "Ny användare", - "add_new_user": "Ny användare", - "create_new_user": "Skapa ny användare", - "edit_user": "Redigera användare", - "delete_user": "Ta bort användare", - "users_edit_path": "Användare/Redigera", - "create_account": "Skapa konto", - "create_room": "Skapa rum", - "create_new_room": "Skapa nytt rum", - "user_created_at": "Skapad: {{localizedTime}}", - "are_you_sure_delete_account": "Är du säker på att du vill ta bort {{user.name}}s konto?", - "delete_account_warning": "Om du väljer att ta bort det här kontot kommer det INTE att kunna återställas.", - "empty_active_users": "Det finns inga aktiva användare på denna server än!", - "empty_active_users_subtext": "När en användares status ändras till aktiv visas de här.", - "empty_pending_users": "Det finns inga väntande användare på denna server än!", - "empty_pending_users_subtext": "När en användares status ändras till väntande visas de här.", - "empty_banned_users": "Det finns inga förbjudna användare på denna server än!", - "empty_banned_users_subtext": "När en användares status ändras till förbjuden kommer de att visas här.", - "empty_invited_users": "Det finns inga inbjudna användare på denna server än!", - "empty_invited_users_subtext": "När en användares status ändras till inbjuden kommer de att visas här.", - "invited": { - "time_sent": "Tid skickad", - "valid": "Giltig" - } - }, - "server_rooms": { - "server_rooms": "Serverrum", - "name": "Namn", - "owner": "Ägare", - "room_id": "Rums-ID", - "participants": "Deltagare", - "status": "Status", - "running": "Pågående", - "not_running": "Pågår inte", - "active": "Aktiva", - "current_session": "Aktuell session: {{lastSession}}", - "last_session": "Senaste session: {{localizedTime}}", - "no_meeting_yet": "Inget möte ännu.", - "delete_server_rooms": "Ta bort serverrum", - "resync_recordings": "Synkronisera om inspelningar", - "empty_room_list": "Det finns inga serverrum än!", - "empty_room_list_subtext": "Rummen man skapar kommer att visas här." - }, - "server_recordings": { - "server_recordings": "Serverinspelningar", - "latest_recordings": "Senaste inspelningarna", - "no_recordings_found": "Inga inspelningar hittades." - }, - "site_settings": { - "site_settings": "Webbplatsinställningar", - "customize_greenlight": "Anpassa Greenlight", - "appearance": { - "appearance": "Utseende", - "brand_color": "Märkesfärg", - "regular": "Vanligt", - "lighten": "Ljusna", - "brand_image": "Märkesbild", - "click_to_upload": "Klicka för att ladda upp", - "drag_and_drop": " eller dra och släpp", - "upload_brand_image_description": "Man kan ladda upp vilken PNG-, JPG- eller SVG-fil som helst. Beroende på filens storlek kan det ta lite extra tid att ladda upp innan den kan användas", - "remove_branding_image": "Ta bort Märke Bild" - }, - "administration": { - "administration": "Administrering", - "terms": "Allmänna villkor", - "privacy": "Integritetspolicy", - "privacy_policy": "Integritetspolicy", - "change_term_links": "Ändra länken till villkoren som visas längst ner på sidan", - "change_privacy_link": "Ändra länken till integritetspolicyn som visas längst ner på sidan", - "change_url": "Ändra URL", - "enter_link": "Ange länk här" - }, - "settings": { - "settings": "Inställningar", - "allow_users_to_share_rooms": "Tillåt användare att dela rum", - "allow_users_to_share_rooms_description": "När den är inställd på \"inaktiverad\" kommer knappen från rumsalternativmenyn att tas bort, vilket förhindrar användare från att dela rum", - "allow_users_to_preupload_presentation": "Tillåt användare att ladda upp presentationer i förväg", - "allow_users_to_preupload_presentation_description": "Användare kan ladda upp en presentation i förväg för att användas som standardpresentation för det valda rummet" - }, - "registration": { - "registration": "Registrering", - "role_mapping_by_email": "Role-Mapping via e-post", - "role_mapping_by_email_description": "Mappa användaren till en roll via deras e-post. Måste vara i formatet: role1=email1, role2=email2", - "enter_role_mapping_rule": "Ange en rollmappningsregel", - "resync_on_login": "Synkronisera om användardata vid varje inloggning", - "resync_on_login_description": "Synkronisera om en användares uppgifter varje gång de loggar in, vilket gör att den externa autentiseringsleverantören alltid matchar uppgifternai Greenlight", - "default_role": "Standardroll", - "default_role_description": "Standardrollen som ska tilldelas nyskapade användare", - "registration_method": "Registreringsmetod", - "registration_method_description": "Ändra hur användare registrerar sig på webbplatsen", - "registration_methods" : { - "open": "Öppen registering", - "invite": "Registrera via inbjudan", - "approval": "Godkänn/Neka" - } - } - }, - "room_configuration": { - "room_configuration": "Rumskonfiguration", - "default": "Valfritt (standard: aktiverat)", - "optional": "Valfritt (standard: inaktiverad)", - "enabled": "Tvinga Aktiverad", - "disabled": "Inaktiverad", - "configurations": { - "allow_room_to_be_recorded": "Gör rummet inspelningsbart", - "allow_room_to_be_recorded_description": "Tillåter rumsägare att göra ett rum inspelningsbart eller inte. Om det är aktiverat måste moderatorn fortfarande klicka på knappen \"Spela in\" när mötet har startat.", - "require_user_signed_in": "Kräv att användare är inloggade innan de kan gå med i mötet", - "require_user_signed_in_description": "Tillåter endast användare med ett Greenlight-konto att gå med i mötet. Om de inte är inloggade kommer de att omdirigeras till inloggningssidan när de försöker gå med i ett rum.", - "require_mod_approval": "Kräv moderators godkännande innan man kan gå med i mötet", - "require_mod_approval_description": "Moderatorn uppmanas att antingen tillåta eller neka en användare att gå med i mötet när ett försök görs.", - "allow_any_user_to_start_meeting": "Tillåt alla användare att starta ett möte", - "allow_any_user_to_start_meeting_description": "Tillåt alla användare att starta mötet när som helst. Som standard kan bara rumsägaren starta mötet.", - "allow_users_to_join_as_mods": "Alla användare går med som moderatorer", - "allow_users_to_join_as_mods_description": "Ger alla användare moderatorprivilegier i BigBlueButton när de går med i mötet", - "mute_users_on_join": "Stäng automatiskt av användarnas mikrofoner när de går med", - "mute_users_on_join_description": "Stäng automatiskt av användarnas mikrofoner när de går med i ett BigBlueButton-möte", - "viewer_access_code": "Åtkomstkod för tittare", - "viewer_access_code_description": "Tillåter rumsägare att ha en slumpmässig alfanumerisk kod som kan delas med användare. Koden, om den genereras, kommer att krävas för att användare ska gå med i rumsmötena.", - "mod_access_code": "Moderator åtkomstkod", - "mod_access_code_description": "Tillåter rumsägare att ha en slumpmässig alfanumerisk kod som kan delas med användare. När den här koden används tillåter den användaren att gå med i mötet med moderatorprivilegier." - } - }, - "roles": { - "role": "Roll", - "roles": "Roller", - "administrator": "Administratör", - "guest": "Gäst", - "manage_roles": "Hantera roller", - "delete_role": "Ta bort roll", - "are_you_sure_delete_role": "Är du säker på att du vill ta bort den här rollen?", - "enter_role_name": "Ange ett rollnamn", - "add_role": "+ Skapa roll", - "create_role": "Skapa roll", - "create_new_role": "Skapa en ny roll", - "no_role_found": "Ingen roll hittades.", - "search_not_found": "Inga roller hittades", - "edit": { - "create_room": "Tillåt användare med den här rollen att skapa rum", - "record": "Tillåt användare med den här rollen att spela in sina möten", - "manage_users": "Tillåt användare med den här rollen att hantera användare", - "manage_rooms": "Tillåt användare med den här rollen att hantera serverrum", - "manage_recordings": "Tillåt användare med den här rollen att hantera serverinspelningar", - "manage_site_settings": "Tillåt användare med den här rollen att hantera webbplatsinställningar", - "manage_roles": "Tillåt användare med den här rollen att redigera andra roller", - "shared_list": "Inkludera användare med denna roll i rullgardinsmenyn för att dela rum", - "room_limit": "Rumsgräns" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "En ny användare har skapats.", - "user_updated": "Användaren har uppdaterats.", - "user_deleted": "Användaren har tagits bort.", - "avatar_updated": "Avataren har uppdaterats.", - "password_updated": "Lösenordet har uppdaterats.", - "account_activated": "Ditt konto har aktiverats.", - "activation_email_sent": "Ett e-postmeddelande med instruktioner för att aktivera ditt konto har skickats.", - "reset_pwd_email_sent": "Ett e-postmeddelande med instruktioner för att återställa ditt lösenord har skickats." - }, - "session": { - "signed_out": "Du har blivit utloggad." - }, - "room": { - "room_created": "Ett nytt rum har skapats.", - "room_updated": "Rummet har uppdaterats.", - "room_deleted": "Rummet har tagits bort.", - "room_shared": "Rummet har delats.", - "room_unshared": "Rummet har slutat delats.", - "recordings_synced": "Rumsinspelningarna har synkroniserats.", - "room_configuration_updated": "Rumskonfigurationen har uppdaterats.", - "room_setting_updated": "Rumsinställningen har uppdaterats.", - "presentation_updated": "Presentationen har uppdaterats.", - "presentation_deleted": "Presentationen har tagits bort.", - "joining_meeting": "Anslutar...", - "meeting_started": "Mötet började.", - "access_code_copied": "Åtkomstkoden har kopierats.", - "access_code_generated": "En ny åtkomstkod har genererats.", - "access_code_deleted": "Åtkomstkoden har raderats.", - "copied_meeting_url": "Möteslänken har kopierats. Länken kan användas för att gå med i mötet." - }, - "site_settings": { - "site_setting_updated": "Webbplatsinställningen har uppdaterats.", - "brand_color_updated": "Märkesfärgen har uppdaterats.", - "brand_image_updated": "Märkesbilden har uppdaterats.", - "brand_image_deleted": "Märkesbilden har tagits bort.", - "privacy_policy_updated": "Integritetspolicyn har uppdaterats.", - "terms_of_service_updated": "Användarvillkoren har uppdaterats." - }, - "recording": { - "recording_visibility_updated": "Inspelningens synlighet har uppdaterats.", - "recording_name_updated": "Inspelningsnamnet har uppdaterats.", - "recording_deleted": "Inspelningen har raderats.", - "copied_urls": "Inspelningslänkarna har kopierats." - }, - "role": { - "role_created": "En ny roll har skapats.", - "role_updated": "Rollen har uppdaterats.", - "role_deleted": "Rollen har tagits bort.", - "role_permission_updated": "Rollbehörigheten har uppdaterats." - }, - "invitations": { - "invitation_sent": "En inbjudan har skickats." - } - }, - "error": { - "problem_completing_action": "Åtgärden kan inte slutföras.\nVänligen försök igen.", - "file_type_not_supported": "Filtypen stöds inte.", - "file_size_too_large": "Filstorleken är för stor.", - "file_upload_error": "Filen kan inte laddas upp.", - "signin_required": "Du måste vara inloggad för att komma åt den här sidan.", - "roles": { - "role_assigned": "Den här rollen kan inte tas bort eftersom den är tilldelad till minst en användare." - }, - "users": { - "signup_error": "Du kan inte autentiseras. Kontakta administratören.", - "invalid_invite": "Din inbjudanstoken är antingen ogiltig eller felaktig. Kontakta administratören för att få en ny token.", - "email_exists": "Ett konto med samma e-postadress finns redan. Försök igen med ett annat e-postmeddelande.", - "old_password": "Lösenordet du har angett är felaktigt.", - "pending": "Din registrering väntar på godkännande från administratören. Vänligen försök igen senare.", - "banned": "Du har inte tillgång till denna applikation. Kontakta administratören om du tror att detta är ett misstag." - }, - "rooms": { - "room_limit": "Rummet kan inte skapas på grund av att rumsgränsen har nåtts." - }, - "session": { - "invalid_credentials": "Användarnamnet eller lösenordet är ogiltigt. Verifiera dina uppgifter och försök igen." - } - } - }, - "global_error_page": { - "title": "Fel", - "message": "Förlåt, något gick fel. Om incidenten inträffar igen, kontakta administratören." - }, - "not_found_error_page": { - "title": "Sidan hittas inte", - "message": "Tyvärr, sidan du försöker komma åt kan inte hittas." - }, - "account_activation_page": { - "title": "Kontoaktivering", - "account_unverified": "Ditt konto har inte verifierats ännu.", - "message": "För att använda Greenlight, vänligen verifiera ditt konto genom att följa instruktionerna i aktiveringsmailet som har skickats till dig.", - "resend_activation_link": "Om du inte har fått ett aktiveringsmail eller om du har problem med att använda det, klicka på knappen nedan för att begära ett nytt aktiveringsmail.", - "resend_btn_lbl": "Skicka Verifiering igen" - }, - "forms": { - "validations": { - "full_name": { - "required": "Vänligen ange ett fullständigt namn", - "min": "Namnet måste vara minst 2 tecken långt", - "max": "Namnet får vara högst 255 tecken långt" - }, - "email": { - "required": "Vänligen ange en e-postadress", - "email": "Det angivna texten matchar inte e-postformatet", - "min": "E-postadressen måste vara minst 6 tecken lång", - "max": "E-postadressen får vara högst 255 tecken lång" - }, - "password": { - "required": "Vänligen ange ett lösenord", - "match": "Lösenordet måste ha minst:", - "min": "- Åtta karaktärer", - "lower": "- En liten bokstav", - "upper": "- En stor bokstav", - "digit": "- En siffra", - "symbol": "- En symbol", - "max": "Lösenordet måste vara högst 255 tecken långt" - }, - "password_confirmation": { - "required": "Vänligen ange en lösenordsbekräftelse", - "match": "Lösenorden stämmer inte överens" - }, - "emails": { - "required": "Vänligen ange minst en giltig e-postadress", - "list": "Vänligen ange en lista över giltiga e-postadresser separerade med kommatecken (user@users.com, user1@users.com, user2@users.com)" - }, - "role_name": { - "required": "Vänligen ange rollens namn" - }, - "role": { - "limit": { - "required": "Vänligen ange gränsen för antal rum", - "min": "Tillåtet minimum är 0", - "max": "Tillåtet max är 100" - }, - "type": { - "error": "Du måste ange ett nummer" - } - }, - "room": { - "name": { - "required": "Vänligen ange rummets namn.", - "min": "Namnet måste vara minst 2 tecken långt" - } - }, - "url": { - "invalid": "Ogiltig URL" - } - }, - "room": { - "fields": { - "name": { - "label": "Rumsnamn", - "placeholder": "Ange ett rumsnamn..." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Fullständigt Namn", - "placeholder": "Ange ditt fullständiga namn" - }, - "email": { - "label": "Email", - "placeholder": "Ange din e-postadress" - }, - "password": { - "label": "Lösenord", - "placeholder": "Skapa ett lösenord" - }, - "password_confirmation": { - "label": "Bekräfta lösenordet", - "placeholder": "Bekräfta lösenordet" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Email" - }, - "password": { - "label": "Lösenord", - "placeholder": "Lösenord" - }, - "remember_me": { - "label": "Kom ihåg mig" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Nuvarande lösenord", - "placeholder": "Ange ditt lösenord" - }, - "new_password": { - "label": "Nytt lösenord", - "placeholder": "Ange ditt nya lösenord" - }, - "password_confirmation": { - "label": "Bekräfta lösenordet", - "placeholder": "Bekräfta ditt nya lösenord" - } - }, - "validations": { - "old_password": { - "required": "Vänligen ange ditt nuvarande lösenord" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Email", - "placeholder": "Vänligen ange kontots e-postadress" - } - }, - "validations": { - "email": { - "required": "Vänligen ange kontots e-postadress" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Nytt lösenord", - "placeholder": "Ange ditt nya lösenord" - }, - "password_confirmation": { - "label": "Bekräfta lösenordet", - "placeholder": "Bekräfta ditt nya lösenord" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Fullständigt namn" - }, - "email": { - "label": "Email" - }, - "language": { - "label": "Språk" - }, - "role": { - "label": "Roll" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Fullständigt namn", - "placeholder": "Ange användarens fullständiga namn" - }, - "email": { - "label": "Email", - "placeholder": "Ange användarens e-postadress" - }, - "password": { - "label": "Lösenord", - "placeholder": "Ange användarlösenordet" - }, - "password_confirmation": { - "label": "Bekräfta lösenordet", - "placeholder": "Bekräfta lösenordet" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Mejladresser" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Ange länk här..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Rollnamn", - "placeholder": "Ange ett rollnamn..." - } - } - } - } - } -} diff --git a/app/assets/locales/tr.json b/app/assets/locales/tr.json deleted file mode 100644 index 3e6d02e101..0000000000 --- a/app/assets/locales/tr.json +++ /dev/null @@ -1,726 +0,0 @@ -{ - "start": "Başlat", - "search": "Arama", - "home": "Giriş", - "previous": "Önceki", - "back": "Geri", - "next": "Sonraki", - "view": "Görüntüle", - "join": "Katıl", - "edit": "Düzenle", - "save": "Kaydet", - "save_changes": "Değişiklikleri kaydet", - "update": "Güncelle", - "report": "Bildir", - "share": "Paylaş", - "cancel": "İptal", - "reset": "Sıfırla", - "close": "Kapat", - "delete": "Sil", - "copy": "Kopyala", - "copy_viewer_code": "İzleyici kodunu kopyala", - "copy_moderator_code": "Sorumlu kodunu kopyala", - "or": "Veya", - "online": "Çevrim içi", - "help_center": "Yardım merkezi", - "are_you_sure": "Emin misiniz?", - "return_home": "Girişe dön", - "created_at": "Oluşturulma", - "view_recordings": "Kayıtları görüntüle", - "join_session": "Oturuma katıl", - "no_result_search_input": "\"{{ searchInput }}\" için herhangi bir sonuç bulunamadı", - "action_permanent": "Bu işlem geri alınamaz.", - "homepage": { - "welcome_bbb": "BigBlueButton uygulamasına hoş geldiniz.", - "bigbluebutton_description": "BigBlueButton, çevrim içi sınıflar için açık kaynaklı bir internet konferansı sistemidir. Platform, öğrencilerin gerçek zamanlı olarak işbirliği yapmalarını ve geri bildirim almalarını sağlayarak uygulamalı öğrenme zamanının en iyi şekilde kullanılmasını sağlar.", - "greenlight_description": "Oturumları başlatmak için kendi odalarınızı oluşturun ya da kısa ve kullanışlı bir bağlantı ile başkalarının odalarına katılın.", - "learn_more": "BigBlueButton hakkında ayrıntılı bilgi alın", - "explore_features": "Özelliklerimizi keşfedin", - "meeting_title": "Bir toplantı başlatın", - "meeting_description": "Görüntü, ses, ekran paylaşımı, sohbet ve uygulamalı öğrenim için gerekli tüm araçları kapsayan bir sanal sınıf oluşturun.", - "recording_title": "Toplantılarınızı kaydedin", - "recording_description": "BigBlueButton toplantılarını kaydedin. İncelemek ve üzerinde düşünmek için öğrencilerle çeşitli eğitim materyallerini paylaşın.", - "settings_title": "Odalarınızı yönetin", - "settings_description": "Etkili bir sınıfın sorumluluğunu almak için odalarınızı ve toplantı ayarlarınızı yapılandırın.", - "and_more_title": "Ve diğer özellikler!", - "and_more_description": "BigBlueButton, ders sırasında size zaman kazandırmak için yerleşik uygulamalı öğrenim araçları sağlar.", - "enter_meeting_url": "Lütfen aşağıdaki alana BigBlueButton toplantınızın adresini yazın.", - "enter_meeting_url_instruction": "Lütfen aşağıdaki alana BigBlueButton toplantınızın adresini yazın." - }, - "authentication": { - "sign_in": "Oturum aç", - "sign_up": "Hesap aç", - "sign_out": "Oturumu kapat", - "email": "E-posta", - "password": "Parola", - "confirm_password": "Parola onayı", - "enter_email": "E-posta adresinizi yazın", - "enter_name": "Adınızı yazın", - "remember_me": "Beni hatırla", - "forgot_password": "Parolamı unuttum", - "dont_have_account": "Hesabınız yok mu?", - "create_account": "Hesap aç", - "create_an_account": "Bir hesap açın", - "already_have_account": "Zaten hesabınız var mı?" - }, - "user": { - "user": "Kullanıcı", - "users": "Kullanıcılar", - "name": "Ad", - "email_address": "E-posta adresi", - "authenticator": "Kimlik doğrulayıcı", - "full_name": "Tam ad", - "no_user_found": "Herhangi bir kullanıcı bulunamadı.", - "type_three_characters": "Diğer kullanıcıları görebilmek için lütfen en az üç (3) karakter yazın.", - "search_not_found": "Herhangi bir kullanıcı bulunamadı", - "profile": { - "profile": "Profil", - "language": "Dil", - "role": "Rol", - "administrator": "Yönetici", - "guest": "Konuk" - }, - "account": { - "account_info": "Hesap bilgileri", - "delete_account": "Hesabı sil", - "change_password": "Parolayı değiştir", - "set_password": "Yeni parolanızı ayarlayın", - "reset_password": "Parolayı sıfırla", - "update_account_info": "Hesap bilgilerinizi güncelleyin", - "current_password": "Geçerli parola", - "new_password": "Yeni parola", - "confirm_password": "Parola onayı", - "permanently_delete_account": "Hesabı kalıcı olarak sil", - "delete_account_description": "Hesabınızı silmeyi seçerseniz bu işlem geri alınamaz.\nAyarlar odalar ve kayıtlar gibi hesabınızla ilgili tüm bilgiler de silinir.", - "delete_account_confirmation": "Evet, hesabımı silmek istiyorum", - "are_you_sure_delete_account": "Hesabınızı silmek istediğinize emin misiniz?" - }, - "avatar": { - "upload_avatar": "Avatar yükle", - "delete_avatar": "Avatarı sil", - "crop_avatar": "Avatarınızı kırpın" - }, - "pending": { - "title": "Açılan hesabın onaylanması bekleniyor", - "message": "Hesap açtığınız için teşekkürler. Hesabınız bir yönetici tarafından onaylanmayı bekliyor" - } - }, - "room": { - "room": "Oda", - "rooms": "Odalar", - "room_name": "Oda adı", - "add_new_room": "+ Yeni oda", - "create_room": "Oda ekle", - "delete_room": "Odayı sil", - "create_new_room": "Yeni oda ekle", - "enter_room_name": "Oda adını yazın", - "shared_by": "şununla paylaşılmış", - "last_session": "Son oturum: {{ localizedTime }}", - "no_last_session": "Daha önce bir oturum yapılmamış", - "search_not_found": "Herhangi bir kullanıcı bulunamadı.", - "rooms_list_is_empty": "Henüz bir oda oluşturmamışsınız!", - "rooms_list_empty_create_room": "Aşağıdaki düğmeye tıklayıp bir oda adı yazarak ilk odanızı oluşturabilirsiniz.", - "meeting": { - "start_meeting": "Toplantıyı başlat", - "join_meeting": "Toplantıya katıl", - "meeting_invitation": "Katılmak üzere çağrıldınız", - "meeting_not_started": "Toplantı henüz başlamadı", - "join_meeting_automatically": "Toplantı başladığında otomatik olarak katılacaksınız", - "recording_consent": "Bu oturumun kaydedildiğini ve etkinleştirilmiş ise sesim ve görüntümün de kaydedileceğini anladım." - }, - "presentation": { - "presentation": "Sunum", - "click_to_upload": "Yüklemek için tıklayın", - "drag_and_drop": "ya da sürükleyip bırakın", - "upload_description": "Herhangi bir Office belgesi ya da PDF dosyası ({{size}} boyutundan büyük olmayan) yükleyin. Dosyanın boyutuna bağlı olarak, kullanılmadan önce karşıya yüklenmesi biraz sürebilir.", - "delete_presentation": "Sunumu sil", - "are_you_sure_delete_presentation": "Bu sunumu silmek istediğinize emin misiniz?" - }, - "shared_access": { - "access": "Erişim", - "add_share_access": "+ Erişimi paylaş", - "share_room_access": "Oda erişimini paylaş", - "add_some_users": "Şimdi bazı kullanıcılar ekleyin!", - "add_some_users_description": "Yeni kullanıcılar eklemek için aşağıdaki düğmeye tıklayın ve bu odayı paylaşmak istediğiniz kullanıcıları arayın ya da seçin.", - "delete_shared_access": "Paylaşılmış erişimi sil", - "are_you_sure_delete_shared_access": "Bu paylaşılmış erişimi silmek istediğinize emin misiniz?" - }, - "settings": { - "settings": "Ayarlar", - "room_name": "Oda adı", - "user_settings": "Kullanıcı ayarları", - "allow_room_to_be_recorded": "Odanın kaydı alınabilsin", - "require_signed_in": "Kullanıcıların katılmadan önce oturum açması zorunlu olsun", - "require_signed_in_message": "Bu odaya katılmak için oturum açmalısınız.", - "require_mod_approval": "Katılmadan önce sorumlu onayı gereksin", - "allow_any_user_to_start": "Herhangi bir kullanıcı bu toplantıyı başlatabilsin", - "all_users_join_as_mods": "Tüm kullanıcılar sorumlu olarak katılsın", - "mute_users_on_join": "Katılırken kullanıcıların sesi kapatılsın", - "generate": "Oluştur", - "access_code": "Erişim kodu", - "mod_access_code": "Sorumlu erişim kodu", - "mod_access_code_optional": "Sorumlu erişim kodu (isteğe bağlı)", - "access_code_required": "Lütfen erişim kodunu yazın", - "wrong_access_code": "Erişim kodu yanlış", - "generate_viewers_access_code": "İzleyiciler için erişim kodu oluştur", - "generate_mods_access_code": "Sorumlular için erişim kodu oluştur", - "server_tag": "Bu oda için bir sunucu türü seçin", - "default_tag_name": "Varsayılan", - "server_tag_desired": "İstenilen", - "server_tag_required": "Zorunlu", - "are_you_sure_delete_room": "Bu odayı silmek istediğinize emin misiniz?" - } - }, - "recording": { - "recording": "Kaydediliyor", - "recordings": "Kayıtlar", - "processing": "Kayıtlar işleniyor...", - "name": "Ad", - "length": "Süre", - "users": "Kullanıcılar", - "visibility": "Görünürlük", - "formats": "Biçimler", - "published": "Yayınlanmış", - "unpublished": "Yayınlanmamış", - "protected": "Korunmuş", - "public": "Herkese açık", - "public_protected": "Herkese açık / Korunmuş", - "length_in_minutes": "{{recording.length}} dakika", - "processing_recording": "Kayıt işleniyor. Bu işlem birkaç dakika sürebilir...", - "copy_recording_urls": "Kayıt adreslerini kopyala", - "recordings_list_empty": "Henüz bir kaydınız yok!", - "public_recordings_list_empty": "Henüz herkese açık bir kayıt yok!", - "recordings_list_empty_description": "Toplantıları başlatıp kayıt ettikten sonra kayıtlarınız burada görüntülenecek.", - "public_recordings_list_empty_description": "Kayıtlar yayınlandığında burada görüntülenecek.", - "delete_recording": "Kaydı sil", - "are_you_sure_delete_recording": "Bu kaydı silmek istediğinize emin misiniz?", - "search_not_found": "Herhangi bir kayıt bulunamadı" - }, - "admin": { - "admin_panel": "Yönetim panosu", - "manage_users": { - "manage_users": "Kullanıcı yönetimi", - "active": "Etkin", - "approve": "Onayla", - "decline": "Reddet", - "pending": "Bekliyor", - "banned": "Yasaklanmış", - "ban": "Yasakla", - "unban": "Yasaklamayı kaldır", - "unverified": "Doğrulanmamış", - "verify": "Doğrula", - "deleted": "Silinmiş", - "invited_tab": "Çağrılmış", - "invite_user": "Kullanıcıyı çağır", - "send_invitation": "Çağır", - "enter_user_email": "Kullanıcının e-posta adresini yazın", - "new_user": "Yeni kullanıcı", - "add_new_user": "Yeni kullanıcı", - "create_new_user": "Yeni kullanıcı ekle", - "edit_user": "Kullanıcıyı düzenle", - "delete_user": "Kullanıcıyı sil", - "users_edit_path": "Kullanıcılar/Düzenle", - "create_account": "Hesap ekle", - "create_room": "Oda ekle", - "create_new_room": "Yeni oda ekle", - "user_created_at": "Oluşturulma: {{localizedTime}}", - "are_you_sure_delete_account": "{{user.name}} kullanıcısının hesabını silmek istediğinize emin misiniz?", - "delete_account_warning": "Bu hesabı silmeyi seçerseniz, bu işlem geri alınamaz.", - "empty_active_users": "Bu sunucuda henüz etkin bir kullanıcı yok!", - "empty_active_users_subtext": "Durumu etkin olarak değiştirilen kullanıcılar burada görüntülenir.", - "empty_pending_users": "Bu sunucuda henüz bekleyen bir kullanıcı yok!", - "empty_pending_users_subtext": "Durumu bekliyor olarak değiştirilen kullanıcılar burada görüntülenir.", - "empty_banned_users": "Bu sunucuda henüz yasaklanmış bir kullanıcı yok!", - "empty_banned_users_subtext": "Durumu yasaklanmış olarak değiştirilen kullanıcılar burada görüntülenir.", - "empty_unverified_users": "Bu sunucuda henüz doğrulanmamış bir kullanıcı yok!", - "empty_unverified_users_subtext": "Doğrulanmamış kullanıcılar burada görüntülenir.", - "empty_invited_users": "Bu sunucuda henüz çağrılmış bir kullanıcı yok!", - "empty_invited_users_subtext": "Durumu çağrılmış olarak değiştirilen kullanıcılar burada görüntülenir.", - "invited": { - "time_sent": "Gönderilme zamanı", - "valid": "Geçerli", - "revoke": "Geçersiz kıl" - } - }, - "server_rooms": { - "server_rooms": "Sunucu odaları", - "name": "Ad", - "owner": "Sahip", - "room_id": "Oda kodu", - "participants": "Katılımcılar", - "status": "Durum", - "running": "Yapılıyor", - "not_running": "Yapılmıyor", - "active": "Etkin", - "current_session": "Geçerli oturum: {{lastSession}}", - "last_session": "Son oturum: {{lastSession}}", - "no_meeting_yet": "Henüz bir toplantı yok.", - "delete_server_rooms": "Sunucu odasını sil", - "resync_recordings": "Kayıtları yeniden eşitle", - "empty_room_list": "Henüz bir sunucu odası yok!", - "empty_room_list_subtext": "Oluşturulan odalar burada görüntülenir. " - }, - "server_recordings": { - "server_recordings": "Sunucu kayıtları", - "latest_recordings": "Son kayıtlar", - "no_recordings_found": "Herhangi bir kayıt bulunamadı." - }, - "site_settings": { - "site_settings": "Site ayarları", - "customize_greenlight": "Greenlight özelleştirmesi", - "appearance": { - "appearance": "Görünüm", - "brand_color": "Marka rengi", - "regular": "Normal", - "lighten": "Açık", - "brand_image": "Marka görseli", - "click_to_upload": "Yüklemek için tıklayın", - "drag_and_drop": "ya da sürükleyip bırakın", - "upload_brand_image_description": "Herhangi bir PNG, JPG ya da SVG dosyası ({{size}} boyutundan büyük olmayan) yükleyin. Dosyanın boyutuna bağlı olarak, kullanılmadan önce karşıya yüklenmesi biraz sürebilir.", - "remove_branding_image": "Marka görselini kaldır" - }, - "administration": { - "administration": "Yönetim", - "terms": "Hüküm ve koşullar", - "privacy": "Gizlilik bildirimi", - "privacy_policy": "Gizlilik bildirimi", - "change_term_links": "Sayfanın altında görüntülenecek koşullar bağlantısını değiştir", - "change_privacy_link": "Sayfanın altında görüntülenecek gizlilik bağlantısını değiştir", - "helpcenter": "Yardım merkezi", - "change_helpcenter_link": "Profil açılır menüsünde görüntülenecek yardım merkezi bağlantısını değiştirin", - "maintenance": "Bakım duyurusu", - "change_maintenance_text": "Üst bilgide görüntülecek bakım duyurusu metnini değiştirin", - "change_url": "Adresi değiştir", - "set_text": "Metni ayarla", - "clear_banner": "Duyuruyu temizle", - "enter_link": "Bağlantıyı buraya yazın" - }, - "settings": { - "settings": "Ayarlar", - "allow_users_to_share_rooms": "Kullanıcılar odayı paylaşabilsin", - "allow_users_to_share_rooms_description": "Bu seçenek kapatıldığında, düğme oda seçenekleri açılır menüsünden kaldırılır ve kullanıcıların odaları paylaşması engellenir.", - "allow_users_to_preupload_presentation": "Kullanıcılar önceden sunum yükleyebilsin", - "allow_users_to_preupload_presentation_description": "Kullanıcılar, bu odada varsayılan olarak kullanılacak bir sunumu önceden yükleyebilir", - "show_sign_in_on_room_join": "Odaya katılırken oturum açma bağlantısı görüntülensin", - "show_sign_in_on_room_join_description": "Kullanıcı oturum açmamışsa, bir odaya girişte kartın alt kısmında oturum açma bağlantısı görüntülenir", - "default_visibility": "Varsayılan kaydetme görünürlüğü", - "default_visibility_description": "Yeni oluşturulan tüm kayıtların varsayılan görünürlüğünü belirler", - "session_timeout": "Oturum zaman aşımı", - "session_timeout_description": "Oturum zaman aşımı süresini varsayılan çerez ile 1 gün ile uzatılmış çerez ile 7 gün arasında yapılandırabilirsiniz", - "default_session_timeout": "Varsayılan (1 gün)", - "extended_session_timeout": "Uzatılmış (7 gün)" - }, - "registration": { - "registration": "Hesap açma", - "role_mapping_by_email": "Roller e-postaya göre eşleştirilsin", - "role_mapping_by_email_description": "Kullanıcı rollerini e-postalarına göre belirler. rol1?e-posta1,rol2=e-posta2 biçiminde olmalıdır", - "enter_role_mapping_rule": "Bir rol eşleştirme kuralı yazın", - "resync_on_login": "Kullanıcı verileri her oturum açıldığında eşitlensin", - "resync_on_login_description": "Bir kullanıcının bilgilerini her oturum açtığından yeniden eşitleyerek, Greenlight üzerindeki bilgilerin her zaman dış kimlik doğrulama hizmeti sağlayıcısındakiler ile aynı olmasını sağlar", - "default_role": "Varsayılan rol", - "default_role_description": "Yeni eklenen kullanıcılara atanacak varsayılan rol", - "registration_method": "Hesap açma yöntemi", - "registration_method_description": "Kullanıcıların sitede hesap açma yöntemini değiştirin", - "registration_methods" : { - "open": "Serbest hesap açma", - "invite": "Çağrı ile katılma", - "approval": "Onayla/Reddet" - }, - "allowed_domains": "İzin verilen e-posta etki alanları", - "allowed_domains_signup_description": "Belirli e-posta etki alanlarından hesap açılmasına izin verir. Şu biçimde yazılmalıdır: @deneme.com,etkialani.com", - "enter_allowed_domains_rule" : "İzin verilen etki alanlarını yazın" - } - }, - "room_configuration": { - "room_configuration": "Oda yapılandırması", - "default": "İsteğe bağlı (varsayılan olarak açık)", - "optional": "İsteğe bağlı (varsayılan olarak kapalı)", - "enabled": "Zorla açılsın", - "disabled": "Kapalı", - "configurations": { - "allow_room_to_be_recorded": "Odanın kaydı alınabilsin", - "allow_room_to_be_recorded_description": "Oda sahiplerinin, bir odanın kaydedilmesi hakkında bir seçenek sunmak isteyip istemediklerini belirtmelerini sağlar. Bu seçenek açılsa bile, sorumlu, toplantı başladıktan sonra “Kaydet düğmesine tıklamalıdır.", - "require_user_signed_in": "Kullanıcıların katılmadan önce oturum açması zorunlu olsun", - "require_user_signed_in_description": "Bu seçenek etkinleştirildiğinde, yalnızca Greenlight hesabı olan kullanıcılar toplantıya katılabilir. Oturum açmamış kullanıcılar, bir odaya katılmaya çalışırken oturum açma sayfasına yönlendirilir.", - "require_mod_approval": "Katılmadan önce sorumlu onayı gereksin", - "require_mod_approval_description": "Bu seçenek etkinleştirildiğinde, bir kullanıcının katılmaya çalıştığı BigBlueButton toplantısının sorumlusuna bildirilir. Kullanıcı onaylanırsa toplantıya katılabilir.", - "allow_any_user_to_start_meeting": "Herhangi bir kullanıcı bu toplantıyı başlatabilsin", - "allow_any_user_to_start_meeting_description": "Bu seçenek etkinleştirildiğinde, herhangi bir kullanıcı herhangi bir zamanda toplantıyı başlatabilir. Varsayılan olarak, yalnızca oda sahibi toplantıyı başlatabilir.", - "allow_users_to_join_as_mods": "Tüm kullanıcılar sorumlu olarak katılsın", - "allow_users_to_join_as_mods_description": "Bu seçenek etkinleştirildiğinde, toplantıya katılan tüm kullanıcılara BigBlueButton sorumlu yetkileri verilir", - "mute_users_on_join": "Katılırken kullanıcıların sesi kapatılsın", - "mute_users_on_join_description": "Bu seçenek etkinleştirildiğinde, BigBlueButton toplantısına katılırken kullanıcının sesi otomatik olarak kapatılır", - "viewer_access_code": "İzleyici erişim kodu", - "viewer_access_code_description": "Oda sahiplerinin, kullanıcılarla paylaşılabileceği rastgele bir alfasayısal kod oluşturmasını sağlar. Oluşturulmuş ise, kullanıcıların oda toplantılarına katılması için bu kodu kullanması gerekir.", - "mod_access_code": "Sorumlu erişim kodu", - "mod_access_code_description": "Oda sahiplerinin, kullanıcılarla paylaşılabileceği rastgele bir alfasayısal kod oluşturmasını sağlar. Oluşturulmuş ise, kullanıcıların oda toplantılarına katılması için bir kod kullanması gerekmez. Ancak bu kodu kullanan kullanıcılar toplantıya sorumlu olarak katılır." - } - }, - "roles": { - "role": "Rol", - "roles": "Roller", - "administrator": "Yönetici", - "guest": "Konuk", - "manage_roles": "Rol yönetimi", - "delete_role": "Rolü sil", - "are_you_sure_delete_role": "Bu rolü silmek istediğinize emin misiniz?", - "enter_role_name": "Bir rol adı yazın", - "add_role": "+ Rol ekle", - "create_role": "+ Rol ekle", - "create_new_role": "Yeni rol ekle", - "no_role_found": "Herhangi bir rol bulunamadı", - "search_not_found": "Herhangi bir rol bulunamadı.", - "edit": { - "create_room": "Bu roldeki kullanıcılar oda oluşturabilsin", - "record": "Bu roldeki kullanıcılar toplantılarını kaydedebilsin", - "manage_users": "Bu roldeki kullanıcılar kullanıcıları yönetebilsin", - "manage_rooms": "Bu roldeki kullanıcılar sunucu odalarını yönetebilsin", - "manage_recordings": "Bu roldeki kullanıcılar sunucu kayıtlarını yönetebilsin", - "manage_site_settings": "Bu roldeki kullanıcılar site ayarlarını yönetebilsin", - "manage_roles": "Bu roldeki kullanıcılar diğer kullanıcı rollerini düzenleyebilsin", - "shared_list": "Bu roldeki kullanıcılar oda paylaşma açılan kutularında görüntülensin", - "room_limit": "Oda sayısı sınırı", - "email_on_signup": "Yeni bir kullanıcı hesap açtığında e-posta alın", - "allowed_recording_visibility": "İzin verilen kaydetme görünürlükleri" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Kullanıcı eklendi.", - "user_updated": "Kullanıcı güncellendi.", - "user_deleted": "Kullanıcı silindi.", - "avatar_updated": "Avatar güncellendi.", - "password_changed": "Parolanız güncellendi. Lütfen yeniden oturum açın.", - "password_updated": "Parola güncellendi.", - "account_activated": "Hesap etkinleştirildi. Lütfen hesabınızla oturum açın.", - "activation_email_sent": "Etkinleştirme e-postası gönderildi.", - "reset_pwd_email_sent": "Parola sıfırlama e-postası gönderildi. Lütfen gelen kutunuza bakın" - }, - "session": { - "signed_out": "Oturumunuz kapatıldı." - }, - "room": { - "room_created": "Oda eklendi.", - "room_updated": "Oda güncellendi.", - "room_deleted": "Oda silindi.", - "room_shared": "Oda paylaşıldı", - "room_unshared": "Oda paylaşımdan kaldırıldı", - "recordings_synced": "Oda kayıtları eşitlendi", - "room_configuration_updated": "Oda yapılandırması güncellendi.", - "room_setting_updated": "Oda ayarları güncellendi.", - "presentation_updated": "Sunum güncellendi.", - "presentation_deleted": "Sunum silindi.", - "joining_meeting": "Toplantıya alınıyorsunuz...", - "meeting_started": "Toplantı başladı.", - "access_code_copied": "Erişim kodu kopyalandı.", - "access_code_generated": "Erişim kodu oluşturuldu.", - "access_code_deleted": "Erişim kodu silindi.", - "copied_meeting_url": "Toplantı adresi kopyalandı. Bu adres toplantıya katılmak için kullanılabilir.", - "copied_viewer_code": "İzleyici erişim kodu kopyalandı.", - "copied_moderator_code": "Sorumlu erişim kodu kopyalandı." - }, - "site_settings": { - "site_setting_updated": "Site ayarları güncellendi.", - "brand_color_updated": "Marka rengi güncellendi.", - "brand_image_updated": "Marka görseli güncellendi.", - "brand_image_deleted": "Marka görseli silindi.", - "privacy_policy_updated": "Gizlilik bildirimi güncellendi.", - "helpcenter_updated": "Yardım merkezi bağlantısı güncellendi.", - "terms_of_service_updated": "Hizmet koşulları güncellendi.", - "maintenance_updated": "Bakım duyurusu güncellendi.", - "allowed_domains_signup_updated": "İzin verilen e-posta etki alanları güncellendi." - }, - "recording": { - "recording_visibility_updated": "Kayıt görünürlüğü güncellendi.", - "recording_name_updated": "Kayıt adı güncellendi.", - "recording_deleted": "Kayıt silindi.", - "copied_urls": "Kayıt adresi kopyalandı." - }, - "role": { - "role_created": "Rol eklendi.", - "role_updated": "Rol güncellendi.", - "role_deleted": "Rol silindi.", - "role_permission_updated": "Rol yetkileri güncellendi." - }, - "invitations": { - "invitation_sent": "Çağrı gönderildi", - "invitation_revoked": "Bir çağrı geçersiz kılındı" - } - }, - "error": { - "problem_completing_action": "Bu işlem yapılırken bir sorun çıktı.\nLütfen yeniden deneyin.", - "server_type_unavailable": "İstenilen sunucu türü kullanılamıyor. Lütfen oda ayarlarında başka bir tür seçin.", - "file_type_not_supported": "Dosya türü desteklenmiyor.", - "file_size_too_large": "Dosya boyutu çok büyük.", - "file_upload_error": "Dosya yüklenemedi.", - "signin_required": "Bu sayfaya erişebilmek için oturum açmalısınız", - "malware_detected": "Zararlı yazılım algılandı! Yüklediğiniz dosyada zararlı yazılım bulunuyor. Lütfen dosyayı denetleyip yeniden deneyin.", - "roles": { - "role_assigned": "Bu rol, en az bir kullanıcıya atanmış olduğundan silinemez." - }, - "users": { - "signup_error": "Oturumunuz açılırken bir sorun çıktı. Lütfen yöneticiniz ile görüşün. ", - "invalid_invite": "Çağrı kodunuz geçersiz ya da yanlış. Yeni bir tane almak için yöneticinizle görüşün", - "email_exists": "Bu e-posta adresi ile açılmış bir hesap zaten vafr. Lütfen başka bir e-posta adresi ile yeniden deneyin", - "old_password": "Yazdığınız geçerli parola doğru değil", - "pending": "Hesabınız yöneticiniz tarafından onaylanmayı bekliyor", - "banned": "Bu uygulamaya erişme izniniz yok. Bir yanlışlık olduğunu düşünüyorsanız yöneticiniz ile görüşün." - }, - "rooms": { - "room_limit": "Oda sayısı sınırına ulaşıldığından oda eklenemedi" - }, - "session": { - "invalid_credentials": "Kullanıcı adı ya da parola geçersiz. Lütfen kimlik doğrulama bilgilerinizi denetleyip yeniden deneyin." - } - } - }, - "global_error_page": { - "title": "Hata", - "message": "Bir sorun çıktı. Sorun sürerse yönetici ile görüşün." - }, - "not_found_error_page": { - "title": "404", - "message": "Erişmeye çalıştığınız sayfa bulunamadı." - }, - "account_activation_page": { - "title": "Hesap etkinleştirme", - "account_unverified": "Hesabınız henüz doğrulanmamış.", - "message": "Greenlight kullanmak için lütfen size gönderilen etkinleştirme e-postasındaki yönergeleri izleyerek hesabınızı doğrulayın.", - "resend_activation_link": "Etkinleştirme e-postasını almadıysanız ya da gelen e-posta ile sorun yaşıyorsanız aşağıdaki Yeniden gönder düğmesine tıklayarak yeni bir etkinleştirme e-postası alabilirsiniz.", - "resend_btn_lbl": "Doğrulamayı yeniden gönder" - }, - "forms": { - "validations": { - "full_name": { - "required": "Lütfen bir ad yazın", - "min": "Ad en az 2 karakter uzunluğunda olabilir", - "max": "Ad en fazla 255 karakter uzunluğunda olabilir" - }, - "email": { - "required": "Lütfen bir e-posta adresi yazın", - "email": "Yazılan e-posta adresi biçimi geçersiz", - "min": "E-posta adresi en az 6 karakter uzunluğunda olabilir", - "max": "E-posta adresi en fazla 255 karakter uzunluğunda olabilir" - }, - "password": { - "required": "Lütfen bir parola yazın", - "match": "Parolanın en az özellikleri şunlar olmalıdır:", - "min": "- Sekiz karakter", - "lower": "- Bir küçük harf", - "upper": "- Bir büyük harf", - "digit": "- Bir rakam", - "symbol": "- Bir simge", - "max": "Parola en fazla 255 karakter uzunluğunda olabilir" - }, - "password_confirmation": { - "required": "Lütfen parolayı onaylamak için yeniden yazın", - "match": "Parola ile onayı aynı değil" - }, - "emails": { - "required": "Lütfen en az bir geçerli e-posta adresi yazın", - "list": "Lütfen virgül ile ayırarak e-posta adresleri listesini yazın (kullanici@site.com,kullanici1@site.com,kullanici2@site.com)" - }, - "role_name": { - "required": "Lütfen rolün adını yazın" - }, - "role": { - "limit": { - "required": "Lütfen bir oda sayısı sınırı yazın", - "min": "En az 0 olabilir", - "max": "En fazla 100 olabilir" - }, - "type": { - "error": "Bir sayı belirtmelisiniz" - } - }, - "room": { - "name": { - "required": "Lütfen bir oda adı yazın.", - "min": "Ad en az 2 karakter uzunluğunda olabilir" - } - }, - "room_join": { - "name": { - "required": "Lütfen adınızı yazın." - } - }, - "url": { - "invalid": "Adres geçersiz" - }, - "text_form": { - "value": { - "required": "Lütfen bir ileti yazın" - } - } - }, - "room": { - "fields": { - "name": { - "label": "Oda adı", - "placeholder": "Bir oda adı yazın..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Ad", - "placeholder": "Adınızı yazın" - }, - "access_code": { - "label": "Erişim kodu", - "placeholder": "Erişim kodunu yazın" - }, - "recording_consent": { - "label": "Bu oturumun kaydedildiğini ve açılmış ise sesim ve görüntümün de kaydedileceğini anladım." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Tam ad", - "placeholder": "Tam adınızı yazın" - }, - "email": { - "label": "E-posta adresi", - "placeholder": "E-posta adresinizi yazın" - }, - "password": { - "label": "Parola", - "placeholder": "Bir parola yazın" - }, - "password_confirmation": { - "label": "Parola onayı", - "placeholder": "Parolayı yeniden yazın" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "E-posta", - "placeholder": "E-posta" - }, - "password": { - "label": "Parola", - "placeholder": "Parola" - }, - "remember_me": { - "label": "Beni hatırla" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Geçerli parola", - "placeholder": "Parolanızı yazın" - }, - "new_password": { - "label": "Yeni parola", - "placeholder": "Yeni parolanızı yazın" - }, - "password_confirmation": { - "label": "Parola onayı", - "placeholder": "Yeni parolanızı yeniden yazın" - } - }, - "validations": { - "old_password": { - "required": "Lütfen geçerli parolanızı yazın" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "E-posta", - "placeholder": "Hesabın e-posta adresini yazın" - } - }, - "validations": { - "email": { - "required": "Lütfen hesabın e-posta adresini yazın" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Yeni parola", - "placeholder": "Yeni parolanızı yazın" - }, - "password_confirmation": { - "label": "Parola onayı", - "placeholder": "Yeni parolanızı yeniden yazın" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Tam ad" - }, - "email": { - "label": "E-posta" - }, - "language": { - "label": "Dil" - }, - "role": { - "label": "Rol" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Tam ad", - "placeholder": "Kullanıcının tam adını yazın" - }, - "email": { - "label": "E-posta adresi", - "placeholder": "Kullanıcının e-posta adresini yazın" - }, - "password": { - "label": "Parola", - "placeholder": "Kullanıcının parolasını yazın" - }, - "password_confirmation": { - "label": "Parola onayı", - "placeholder": "Kullanıcının parolasını yeniden yazın" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "E-posta adresleri" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Bağlantıyı buraya yazın...", - "text_placeholder": "Metni buraya yazın..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Rol adı", - "placeholder": "Bir rol adı yazın..." - } - } - } - } - } -} diff --git a/app/assets/locales/uk.json b/app/assets/locales/uk.json deleted file mode 100644 index 08a0894af4..0000000000 --- a/app/assets/locales/uk.json +++ /dev/null @@ -1,689 +0,0 @@ -{ - "start": "Розпочати", - "search": "Пошук", - "home": "До початкової сторінки", - "previous": "Попередня", - "back": "Назад", - "next": "Наступна", - "view": "Перегляд", - "join": "Приєднатись", - "edit": "Редагувати", - "save": "Зберегти", - "save_changes": "Зберегти зміни", - "update": "Оновити", - "report": "Повідомити", - "share": "Поділитись", - "cancel": "Скасувати", - "close": "Закрити", - "delete": "Видалити", - "copy": "Скопіювати посилання на приєднання", - "or": "Або", - "online": "Онлайн", - "help_center": "Довідка", - "are_you_sure": "Ви впевнені?", - "return_home": "Повернутись на початкову сторінку", - "created_at": "Створено о", - "view_recordings": "Переглянути записи", - "join_session": "Приєднатись до сеансу", - "no_result_search_input": "Нічого не знайдено за запитом \"{{ searchInput }}\"", - "action_permanent": "Цю дію не можна скасувати.", - "homepage": { - "welcome_bbb": "Вітаємо в BigBlueButton.", - "bigbluebutton_description": "BigBlueButton — це система веб-конференцій з відкритим кодом для онлайн-навчання. Платформа максимізує час для прикладного навчання, дозволяючи студентам співпрацювати та отримувати відгуки в режимі реального часу.", - "greenlight_description": "Створіть власні кімнати для проведення сеансів або приєднайтеся до інших за допомогою короткого та зручного посилання.", - "learn_more": "Дізнайтесь більше про BigBlueButton", - "explore_features": "Перегляньте наші можливості", - "meeting_title": "Розпочати зустріч", - "meeting_description": "Запустіть віртуальний клас із відео, аудіо, спільним переглядом екрана, чатом і всіма інструментами, необхідними для прикладного навчання.", - "recording_title": "Записати ваші зустрічі", - "recording_description": "Записуйте зустрічі BigBlueButton і діліться ними зі студентами, щоб переглянути та обміркувати матеріал.", - "settings_title": "Керуйте вашими зустрічами", - "settings_description": "Налаштуйте свої кімнати та зустрічі, щоб ефективніше керувати класом.", - "and_more_title": "Та багато іншого!", - "and_more_description": "BigBlueButton пропонує вбудовані інструменти для прикладного навчання та призначений для економії вашого часу під час уроку.", - "enter_meeting_url": "Будь ласка, введіть ваше посилання на зустріч у полі нижче:", - "enter_meeting_url_instruction": "Будь ласка, введіть ваше посилання на зустріч у полі нижче:" - }, - "authentication": { - "sign_in": "Вхід", - "sign_up": "Реєстрація", - "sign_out": "Вийти", - "email": "Електронна пошта", - "password": "Пароль", - "confirm_password": "Підтвердіть пароль", - "enter_email": "Вкажіть електронну пошту", - "enter_name": "Вкажіть ім'я", - "remember_me": "Запам'ятати мене", - "forgot_password": "Забули пароль?", - "dont_have_account": "Не маєте облікового запису?", - "create_account": "Створити обліковий запис", - "create_an_account": "Створити обліковий запис", - "already_have_account": "Вже маєте обліковий запис?" - }, - "user": { - "user": "Користувач", - "users": "Користувачі", - "name": "Ім'я", - "email_address": "Поштова адреса:", - "authenticator": "Автентифікатор", - "full_name": "Повне ім'я", - "no_user_found": "Такого користувача не знайдено", - "type_three_characters": "Надрукуйте перших три символи для пошуку користувача.", - "search_not_found": "Користувачів не знайдено", - "profile": { - "profile": "Профіль", - "language": "Мова", - "role": "Роль", - "administrator": "Адміністратор", - "guest": "Гість" - }, - "account": { - "account_info": "Інформація про обліковий запис", - "delete_account": "Видалити обліковий запис", - "change_password": "Змінити пароль", - "set_password": "Встановіть свій новий пароль", - "reset_password": "Скинути пароль", - "update_account_info": "Оновити дані облікового запису", - "current_password": "Чинний пароль", - "new_password": "Новий пароль", - "confirm_password": "Підтвердіть пароль", - "permanently_delete_account": "Назавжди видалити обліковий запис", - "delete_account_description": "Якщо ви вирішили видалити обліковий запис, його потім не відновити.\nВся пов'язана інформація щодо вашого профілю, налаштувань, кімнат, записіи зустрічей будуть теж видалені.", - "delete_account_confirmation": "Так, я хочу видалити обліковий запис", - "are_you_sure_delete_account": "Ви певні, що слід видалити обліковий запис?" - }, - "avatar": { - "upload_avatar": "Оновити аватар", - "delete_avatar": "Видалити аватар", - "crop_avatar": "Обрізати аватар" - }, - "pending": { - "title": "Очікувана реєстрація", - "message": "Дякуємо за реєстрацію. Ваш обліковий запис очікує схвалення адміністратором." - } - }, - "room": { - "room": "Кімната", - "rooms": "Кімнати", - "room_name": "Назва кімнати", - "add_new_room": "+ Нова кімната", - "create_room": "Створити кімнату", - "delete_room": "Видалити кімнату", - "create_new_room": "Створити нову кімнату", - "enter_room_name": "Введіть назву кімнати", - "shared_by": "поділився", - "last_session": "Останній сеанс: {{ localizedTime }}", - "no_last_session": "Попередніх сесій не створено", - "search_not_found": "Кімнати не знайдено", - "rooms_list_is_empty": "Ви ще поки не маєте кімнат!", - "rooms_list_empty_create_room": "Створіть свою першу кімнату натискаючи кнопку нижче та введіть назву кімнати.", - "meeting": { - "start_meeting": "Розпочати зустріч", - "join_meeting": "Приєднатись до зустрічі", - "meeting_invitation": "Вас запросили приєднатись ", - "meeting_not_started": "Зустріч ще поки не розпочалась", - "join_meeting_automatically": "Ви автоматично приєднаєтесь коли зустріч розпочнеться", - "recording_consent": "Я розумію, що ця сесія може бути записана. Вона може містити мій голос та відео, якщо моя камера увімкнена." - }, - "presentation": { - "presentation": "Презентація", - "click_to_upload": "Натисніть, щоб додати", - "drag_and_drop": ", або перетягніть сюди файл", - "upload_description": "Завантажте документ у офісному форматі, чи PDF файл (обсягом не більше, ніж {{size}}). Залежно від розміру файлу, потрібен певний час для його завантаження, перш ніж він буде доступним для використання", - "delete_presentation": "Видалити презентацію", - "are_you_sure_delete_presentation": "Ви певні, що слід видалити цю презентацію?" - }, - "shared_access": { - "access": "Доступ", - "add_share_access": "+ Надати спільний доступ", - "share_room_access": "Надати доступ до кімнати", - "add_some_users": "Час додати користувачів!", - "add_some_users_description": "Щоб додати користувачів, натисніть на кнопку нижче, пошукайте та оберіть користувачів, з якими ви бажаєте спільно використовувати цю кімнату.", - "delete_shared_access": "Видалити спільний доступ", - "are_you_sure_delete_shared_access": "Ви певні, що слід скасувати спільний доступ?" - }, - "settings": { - "settings": "Налаштування", - "room_name": "Назва кімнати", - "user_settings": "Налаштування користувачів", - "allow_room_to_be_recorded": "Дозволити запис у кімнаті", - "require_signed_in": "Вимагати реєстарцію користувачів для приєднання", - "require_signed_in_message": "Вимагається реєстрація для приєднання до кімнати.", - "require_mod_approval": "Вимагати схвалення модератором перед приєднанням", - "allow_any_user_to_start": "Дозволити будь-якому користувачу розпочати зустріч", - "all_users_join_as_mods": "Всі користувачі приєднуються як модератори", - "mute_users_on_join": "Вимикати мікрофони користувачів при приєднанні", - "generate": "Створити", - "access_code": "Код доступу", - "mod_access_code": "Код доступу модератора", - "mod_access_code_optional": "Код доступу модератора (вибірково)", - "access_code_required": "Будь ласка введіть код доспуту", - "wrong_access_code": "Неправильний код доступу", - "generate_viewers_access_code": "Створити код доступу для глядачів", - "generate_mods_access_code": "Створити код доступу для модераторів", - "are_you_sure_delete_room": "Ви певні, що слід видалити цю кімнату?" - } - }, - "recording": { - "recording": "Запис", - "recordings": "Записи", - "processing": "Обробка запису...", - "name": "Назва", - "length": "Тривалість", - "users": "Користувачі", - "visibility": "Видимість", - "formats": "Формати", - "published": "Опубліковано", - "unpublished": "Знято з публікації", - "protected": "Захищено", - "public": "Загальнодоступне", - "public_protected": "Загальнодоступне/Захищене", - "length_in_minutes": "{{recording.length}} хв.", - "processing_recording": "Обробка запису, це може зайняти декілька хвилин...", - "copy_recording_urls": "Скопіювати посилання запису", - "recordings_list_empty": "У вас наразі немає записів!", - "public_recordings_list_empty": "Поки що немає загальнодоступних записів", - "recordings_list_empty_description": "Записи зявляться тут після того як ви запишете зустріч.", - "public_recordings_list_empty_description": "Тут буде перелік записів, коли вони стануть доступними.", - "delete_recording": "Видалити запис", - "are_you_sure_delete_recording": "Ви певні, що слід видалити цей запис?", - "search_not_found": "Записів не знайдено" - }, - "admin": { - "admin_panel": "Панель адміністратора", - "manage_users": { - "manage_users": "Керування користувачами", - "active": "Активні", - "approve": "Схвалити", - "decline": "Відхилити", - "pending": "Очікується", - "banned": "Заблоковані", - "ban": "Заблокувати", - "unban": "Розблокувати", - "deleted": "Видалені", - "invited_tab": "Запрошені", - "invite_user": "Запросити користувача", - "send_invitation": "Надіслати запрошення", - "enter_user_email": "Введіть email користувача", - "new_user": "Новий користувач", - "add_new_user": "Новий користувач", - "create_new_user": "Створити нового користувача", - "edit_user": "Редагувати користувача", - "delete_user": "Видалити користувача", - "users_edit_path": "Користувачі/Редагувати", - "create_account": "Створити обліковий запис", - "create_room": "Створити кімнату", - "create_new_room": "Створити нову кімнату", - "user_created_at": "Створено: {{localizedTime}}", - "are_you_sure_delete_account": "Ви певні, що слід видалити обліковий запис {{user.name}}?", - "delete_account_warning": "Якщо ви оберете видалення облікового запису, ця дія буде незворотна.", - "empty_active_users": "Немає наразі активних користувачів на цьому сервері!", - "empty_active_users_subtext": "Коли статус користувачів зміниться на активний, вони з'являться тут.", - "empty_pending_users": "Відсутні користувачі для схвалення на цьому сервері!", - "empty_pending_users_subtext": "Коли статус користувача зміниться на очікування, вони з'являться тут.", - "empty_banned_users": "Відсутні заблоковані користувачі на цьому сервері!", - "empty_banned_users_subtext": "Коли статус користувача зміниться на заблокований, вони з'являться тут.", - "empty_invited_users": "Відсутні запрошені користувачі на цьому сервері!", - "empty_invited_users_subtext": "Коли статус користувача зміниться на запрошений, вони з'являться тут.", - "invited": { - "time_sent": "Час надсилання", - "valid": "Валідний" - } - }, - "server_rooms": { - "server_rooms": "Кімнати на сервері", - "name": "Назва", - "owner": "Власник", - "room_id": "Ідентифікатор кімнати", - "participants": "Учасники", - "status": "Статус", - "running": "Працюють", - "not_running": "Не працюють", - "active": "Активні", - "current_session": "Поточна сесія: {{lastSession}}", - "last_session": "Останній сеанс: {{localizedTime}}", - "no_meeting_yet": "Наразі немає зустрічей.", - "delete_server_rooms": "Видалити серверну кімнату", - "resync_recordings": "Пересинхронізувати записи", - "empty_room_list": "Відсутні кімати на цьому сервері!", - "empty_room_list_subtext": "Коли буде створена перша кімната, вона з'явиться тут." - }, - "server_recordings": { - "server_recordings": "Записи на сервері", - "latest_recordings": "Останній запис", - "no_recordings_found": "Не знайдено записів." - }, - "site_settings": { - "site_settings": "Налаштування сайту", - "customize_greenlight": "Налаштування Greenlight", - "appearance": { - "appearance": "Вигляд", - "brand_color": "Колір оформлення", - "regular": "Звичайний", - "lighten": "Світліший", - "brand_image": "Зображення логотипу", - "click_to_upload": "Натисніть, щоб додати", - "drag_and_drop": ", або перетягніть сюди файл", - "upload_brand_image_description": "Завантажте файл зображення у форматі PNG, JPG, чи SVG (не більший, ніжnot larger than {{size}}). Залежно від розміру файлу, його завантаження може потребувати певного часу, перш ніж він стане доступним", - "remove_branding_image": "Видалити зображення логотипу" - }, - "administration": { - "administration": "Адміністрування", - "terms": "Умови використання", - "privacy": "Політика приватності", - "privacy_policy": "Політика приватності", - "change_term_links": "Змінити посилання на умови використання внизу сторінки", - "change_privacy_link": "Змінити посилання на політику приватності внизу сторінки", - "helpcenter": "Центр допомоги", - "change_helpcenter_link": "Змініть посилання на центр довідки, яке з'являється під розкривним списком профілю.", - "change_url": "Змінити URL", - "enter_link": "Введіть посилання тут" - }, - "settings": { - "settings": "Налаштування", - "allow_users_to_share_rooms": "Добволити спільне використання кімнат", - "allow_users_to_share_rooms_description": "Якщо вимкнено, у меню налаштувань кімнати буде вилучено кнопку для надання спільного доступу до кімнати", - "allow_users_to_preupload_presentation": "Дозволити користувачам попереднє завантаження презентацій", - "allow_users_to_preupload_presentation_description": "Користувач може заздалегідь завантажити презентацію, яка буде використовуватись як стандартна для даної кімнати", - "default_visibility": "За замовчуванням видимість запису", - "default_visibility_description": "Усі новостворені записи матимуть цю видимість за замовчуванням." - }, - "registration": { - "registration": "Реєстрація", - "role_mapping_by_email": "Призначення ролей за електронною адресою", - "role_mapping_by_email_description": "Призначати користувачам ролей за їх електронними адресами. Слід вказувати у форматі: role1=email1, role2=email2", - "enter_role_mapping_rule": "Вкажіть правило призначення ролей", - "resync_on_login": "Синхронізувати персональні дані при кожному вході", - "resync_on_login_description": "Синхронізувати інформацію про користувача при кожному вході. щоб інформція із зовнішнього джерела автентифікації завжди відповідала інформації у Greenlight", - "default_role": "Роль за замовчуванням", - "default_role_description": "Роль, що автоматично буде надаватись новоствореним користувачам", - "registration_method": "Метод реєстрації", - "registration_method_description": "Змінити спосіб реєстрації користувачів на сайті", - "registration_methods" : { - "open": "Відкрита реєстрація", - "invite": "Приєднання за запрошенням", - "approval": "Прийняти/Відхилити" - } - } - }, - "room_configuration": { - "room_configuration": "Налаштування кімнати", - "default": "На вибір (стандартно: увімкнено)", - "optional": "На вибір (стандартно: вимкнено)", - "enabled": "Примусово увімкнено", - "disabled": "Вимкнено", - "configurations": { - "allow_room_to_be_recorded": "Дозволити вмикати запис", - "allow_room_to_be_recorded_description": "Дозволяє власникам кімнати вказувати, чи хочуть вони дозволити записувати кімнату чи ні. Якщо ввімкнено, модератор все одно має натиснути кнопку «Запис» після початку зустрічі.", - "require_user_signed_in": "Вимагати реєстарцію користувачів для приєднання", - "require_user_signed_in_description": "Дозволяє приєднуватися до зустрічі лише користувачам із обліковим записом Greenlight. Якщо вони не ввійшли, вони будуть перенаправлені на сторінку входу під час спроби приєднатися до кімнати.", - "require_mod_approval": "Вимагати схвалення модератором перед приєднанням", - "require_mod_approval_description": "Передавати запит модератору, коли користувач намагається приєднатися. Якщо запит схвалено, користувач зможе приєднатися до зустрічі.", - "allow_any_user_to_start_meeting": "Дозволити будь-якому користувачу розпочати зустріч", - "allow_any_user_to_start_meeting_description": "Дозволити будь-якому користувачеві почати зустріч у будь-який час. За замовчуванням лише власник кімнати може почати зустріч.", - "allow_users_to_join_as_mods": "Всі користувачі приєднуються як модератори", - "allow_users_to_join_as_mods_description": "Надає повноваження модератора усім користувачам, що приєднуються до зустрічі", - "mute_users_on_join": "Вимикати мікрофони користувачів при приєднанні", - "mute_users_on_join_description": "Автоматично вимикає мікрофони всім користувачам, які приєднуються до зустрічі", - "viewer_access_code": "Код доступу глядача", - "viewer_access_code_description": "Дозволяє власникам кімнат створити випадковий код, який можна повідомити користувачам. Якщо цей код буде створений, його потрібно буде вказувати для приєднання до зустрічі у кімнаті.", - "mod_access_code": "Код доступу модератора", - "mod_access_code_description": "Дозволяє власникам кімнат створити випадковий код, який можна повідомити користувачам. Якщо цей код буде створений, його використання не є обов'язковим, проте користувач, котрий його вкаже, буде приєднаний до зустрічі з повноваженнями модератора." - } - }, - "roles": { - "role": "Роль", - "roles": "Ролі", - "administrator": "Адміністратор", - "guest": "Гість", - "manage_roles": "Керування ролями", - "delete_role": "Видалити роль", - "are_you_sure_delete_role": "Ви певні, що слід видалити цю роль?", - "enter_role_name": "Вкажіть назву ролі", - "add_role": "+ Створити роль", - "create_role": "Створити роль", - "create_new_role": "Створити нову роль", - "no_role_found": "Роль не знайдено", - "search_not_found": "Ролей не знайдено", - "edit": { - "create_room": "Дозволити користувачам з цією роллю створювати кімнати", - "record": "Дозволити користувачам з цією роллю записувати свої зустрічі", - "manage_users": "Дозволити користувачам з цією роллю керувати користувачами", - "manage_rooms": "Дозволити користувачам з цією роллю курувати кімнатами сервера", - "manage_recordings": "Дозволити користувачам з цією роллю керувати записами сервера", - "manage_site_settings": "Дозволити користувачам з цією роллю керувати налаштуваннями сайту", - "manage_roles": "Дозволити користувачам з цією роллю редагувати інші ролі", - "shared_list": "Дозволити спільне використання кімнат з користувачами з цією роллю", - "room_limit": "Обмеження на кількість кімнат", - "email_on_signup": "Отримувати електронного листа, коли новий користувач реєструється", - "allowed_recording_visibility": "Видимість дозволених записів" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "Створено нового користувача.", - "user_updated": "Дані користувача оновлено.", - "user_deleted": "Користувача видалено.", - "avatar_updated": "Аватар оновлено.", - "password_changed": "Успішно оновлено ваш пароль. Будь ласка, увійдіть знову.", - "password_updated": "Пароль оновлено.", - "account_activated": "Обліковий запис активовано.", - "activation_email_sent": "Вам надіслано електронного листа з вказівками щодо активації вашого облікового запису.", - "reset_pwd_email_sent": "Вам надіслано електронного листа з вказівками щодо скидання вашого паролю." - }, - "session": { - "signed_out": "Ви вийшли з системи." - }, - "room": { - "room_created": "Створено нову кімнату.", - "room_updated": "Дані кімнати оновлено.", - "room_deleted": "Кімнату видалено.", - "room_shared": "Встановлено спільний доступ до кімнати.", - "room_unshared": "Спільний доступ до кімнати скасовано.", - "recordings_synced": "Записи кімнати синхронізовано.", - "room_configuration_updated": "Налаштування кімнати оновлено.", - "room_setting_updated": "Параметри кімнати оновлено.", - "presentation_updated": "Презентацію оновлено.", - "presentation_deleted": "Презентацію видалено.", - "joining_meeting": "Приєднання до зустрічі...", - "meeting_started": "Зустріч розпочато.", - "access_code_copied": "Код доступу скпійовано.", - "access_code_generated": "Створено новий код доступу.", - "access_code_deleted": "Код доступу видалено.", - "copied_meeting_url": "Посилання на зустріч цкопійовано. Це посилання можна використати для приєднання до зустрічі." - }, - "site_settings": { - "site_setting_updated": "Налаштування сайту оновлено.", - "brand_color_updated": "Колір оформлення оновлено.", - "brand_image_updated": "Зобрадення логотипу оновлено.", - "brand_image_deleted": "Колір оформлення видалено.", - "privacy_policy_updated": "Політику приватності оновлено.", - "helpcenter_updated": "Посилання на центр допомоги було оновлено.", - "terms_of_service_updated": "Умови використання оновлено." - }, - "recording": { - "recording_visibility_updated": "Видимість запису оновлено.", - "recording_name_updated": "Назву запису оновлено.", - "recording_deleted": "Запис видалено.", - "copied_urls": "Посилання на запис скопійовано." - }, - "role": { - "role_created": "Створено нову роль.", - "role_updated": "Дані ролі оновлено.", - "role_deleted": "Роль видалено.", - "role_permission_updated": "Повноваження ролі оновлено." - }, - "invitations": { - "invitation_sent": "Запрошення надіслано." - } - }, - "error": { - "problem_completing_action": "Дію не вдалось виконати\nБудь ласка, спробуйте ще раз.", - "file_type_not_supported": "Цей тип файлу не підтримується.", - "file_size_too_large": "Файл надто великий.", - "file_upload_error": "Файл не може бути завантажено.", - "signin_required": "Для доступу до цієї сторінки слід увійти в систему.", - "malware_detected": "Виявлено шкідливе програмне забезпечення! Файл, який ви завантажили, може містити шкідливе програмне забезпечення. Будь ласка, перевірте свій файл і спробуйте ще раз.", - "roles": { - "role_assigned": "Цю роль неможливо видалити, бо її надано принаймні одному користувачу." - }, - "users": { - "signup_error": "Вас неможливо автентифікувати. Будь ласка, зверніться до вашого адміністратора.", - "invalid_invite": "Ваш маркер запрошення недійсний або неправильний. Щоб отримати новий маркер, зверніться до свого адміністратора.", - "email_exists": "Обліковий запис з тако. адресою електронної пошти вже існує. Будь ласка, спробуйте ще раз з іншою адресою.", - "old_password": "Вказаний пароль невірний.", - "pending": "Ваша реєстрація очікує схвалення від адміністратора. Будь ласка, спробуйте пізніше.", - "banned": "Ви не маєте доступу до цієї системи. Будь ласка, зверніться до свого адміністратора, якщо ви вважаєте це помилкою." - }, - "rooms": { - "room_limit": "Неможливо створити кімнату, оскільки досягнуто обмеження на кількість кімнат." - }, - "session": { - "invalid_credentials": "Ім'я користувача чи пароль недійсні. Перевірте свої облікові дані та повторіть спробу." - } - } - }, - "global_error_page": { - "title": "Помилка", - "message": "Вибачте, щось пішло не так. Якщо інцидент повториться, зверніться до адміністратора." - }, - "not_found_error_page": { - "title": "Сторінку не знайдено.", - "message": "На жаль, сторінку, до якої ви намагаєтеся звернутись, неможливо знайти." - }, - "account_activation_page": { - "title": "Актвація облікового запису", - "account_unverified": "Ваш обліковий запис ще не перевірено.", - "message": "Щоб використовувати Greenlight, підтвердьте свій обліковий запис згідно до інструкцій щодо активації, надісланих вам електронним листом.", - "resend_activation_link": "Якщо ви не отримали листа для активації облікового запису, натисніть кнопку нижче для запиту на отримання нового листа.", - "resend_btn_lbl": "Повторно надіслати лист підтвердження" - }, - "forms": { - "validations": { - "full_name": { - "required": "Будь ласка, вкажіть повне ім'я", - "min": "Довжина імені повинна бути не меншою 2 символів", - "max": "Довжина імені не повинна перевищувати 255 символів" - }, - "email": { - "required": "Будь ласка, вкажіть адресу електронної пошти", - "email": "Вказане значення не відповідає формату електронної адреси", - "min": "Довжина електронної адреси повинна бути принаймні 6 символів", - "max": "Довжина електронної адреси повинна бути не більшою 255 символів" - }, - "password": { - "required": "Будь ласка, вкажіть пароль", - "match": "Пароль повинен мати принаймні:", - "min": "- Вісім символів", - "lower": "- Одну малу літеру", - "upper": "- Одну валику літеру", - "digit": "- Одну цифру", - "symbol": "- Один символ", - "max": "Довжина паролю не повинна бути більшою 255 символів" - }, - "password_confirmation": { - "required": "Будь ласка, вкажіть пароль ще раз для підтвердження", - "match": "Паролі не співпадають." - }, - "emails": { - "required": "Будь ласка, вкажіть хоча б одну дійсну адресу електронної пошти", - "list": "Будь ласка, вкажіть список дійсних електронних адрес, розділених комою (user@users.com,user1@users.com,user2@users.com)" - }, - "role_name": { - "required": "Будь ласка, вкажіть назу ролі" - }, - "role": { - "limit": { - "required": "Будь ласка, вкажіть обмеження на кількість кімнат", - "min": "Дозволений мінімум 0", - "max": "Дозволений максимум 100" - }, - "type": { - "error": "Потрібно вказати число" - } - }, - "room": { - "name": { - "required": "Будь ласка, вкажіть назву кімнати", - "min": "Назва повинна містити принаймні 2 символи" - } - }, - "room_join": { - "name": { - "required": "Буль ласка, вкажіть ваше ім'я." - } - }, - "url": { - "invalid": "Недійсне посилання" - } - }, - "room": { - "fields": { - "name": { - "label": "Назва кімнати", - "placeholder": "Вкажіть назву кімнати..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "Ім'я", - "placeholder": "Вкажіть ваше ім'я" - }, - "access_code": { - "label": "Код доступу", - "placeholder": "Вкажіть код доступу" - }, - "recording_consent": { - "label": "Я поголжуюсь з тим, що ця зустріч може бути записана. Запис може містити мій голос та відео, якщо вони будуть увімкнені." - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "Повне ім'я", - "placeholder": "Вкажіть ваше повне ім'я" - }, - "email": { - "label": "Електронна пошта", - "placeholder": "Вкажіть електронну пошту" - }, - "password": { - "label": "Пароль", - "placeholder": "Створіть пароль" - }, - "password_confirmation": { - "label": "Підтвердіть пароль", - "placeholder": "Підтвердіть пароль" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "Електронна пошта", - "placeholder": "Електронна пошта" - }, - "password": { - "label": "Пароль", - "placeholder": "Пароль" - }, - "remember_me": { - "label": "Запам'ятати мене" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "Чинний пароль", - "placeholder": "Вкажіть пароль" - }, - "new_password": { - "label": "Новий пароль", - "placeholder": "Вкажіть новий пароль" - }, - "password_confirmation": { - "label": "Підтвердіть пароль", - "placeholder": "Вкажіть новий пароль ще раз" - } - }, - "validations": { - "old_password": { - "required": "Будь ласка, вкажіть ваш чинний пароль" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "Електронна пошта", - "placeholder": "Електронна пошта облікового запису" - } - }, - "validations": { - "email": { - "required": "Будь ласка, вкажіть електронну пошту для цього облікового запису" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "Новий пароль", - "placeholder": "Вкажіть новий пароль" - }, - "password_confirmation": { - "label": "Підтвердіть пароль", - "placeholder": "Вкажіть новий пароль ще раз" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "Повне ім'я" - }, - "email": { - "label": "Електронна пошта" - }, - "language": { - "label": "Мова" - }, - "role": { - "label": "Роль" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "Повне ім'я", - "placeholder": "Вкажіть повне ім'я користувача" - }, - "email": { - "label": "Електронна пошта", - "placeholder": "Вкажіть адресу електронної пошти користувача" - }, - "password": { - "label": "Пароль", - "placeholder": "Вкажіть пароль користувача" - }, - "password_confirmation": { - "label": "Підтвердіть пароль", - "placeholder": "Вкажіть пароль ще раз" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "Адреси електронної пошти" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "Вкажіть посилання..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "Назва ролі", - "placeholder": "Вкажіть назву ролі" - } - } - } - } - } -} diff --git a/app/assets/locales/zh_TW.json b/app/assets/locales/zh_TW.json deleted file mode 100644 index 0e83e20ae8..0000000000 --- a/app/assets/locales/zh_TW.json +++ /dev/null @@ -1,677 +0,0 @@ -{ - "start": "開始", - "search": "搜尋", - "home": "首頁", - "previous": "上一頁", - "back": "返回", - "next": "下一頁", - "view": "檢視", - "join": "加入", - "edit": "編輯", - "save": "儲存", - "save_changes": "儲存變更", - "update": "更新", - "report": "回報", - "share": "分享", - "cancel": "取消", - "close": "關閉", - "delete": "刪除", - "copy": "複製參加連結", - "or": "或", - "online": "線上", - "help_center": "幫助中心", - "are_you_sure": "您確定嗎?", - "return_home": "返回首頁", - "created_at": "建立時間", - "view_recordings": "檢視錄影", - "join_session": "參加會議", - "no_result_search_input": "找不到\\\"{{ searchInput }}\\\"的任何結果", - "action_permanent": "此操作無法撤銷", - "homepage": { - "welcome_bbb": "歡迎使用 BigBlueButton", - "bigbluebutton_description": "BigBlueButton 是一個針對線上課程優化的開源網路會議系統。透過學生間的協作和即時的回饋,能夠將更多時間投入實際的學習中。", - "greenlight_description": "建立您自己的會議室,主持會議,或使用簡短便捷的連結加入其他人的會議。", - "learn_more": "了解更多關於 BigBlueButton", - "explore_features": "探索我們的功能", - "meeting_title": "開始會議", - "meeting_description": "啟動一個虛擬課堂,擁有視訊、音訊、畫面分享、聊天等工具,滿足實踐學習所需的一切。", - "recording_title": "錄製您的會議", - "recording_description": "錄製 BigBlueButton 的會議並與學生分享,以便回顧和反思教材。", - "settings_title": "管理您的會議室", - "settings_description": "配置您的會議室和會議設定,管理一個有效的課堂。", - "and_more_title": "還有更多!", - "and_more_description": "BigBlueButton 提供了實踐學習所需的內建工具,並設計節省您上課時間。", - "enter_meeting_url": "輸入會議網址", - "enter_meeting_url_instruction": "請在下方輸入您的 BigBlueButton 會議的網址。" - }, - "authentication": { - "sign_in": "登入", - "sign_up": "註冊", - "sign_out": "登出", - "email": "電子郵件", - "password": "密碼", - "confirm_password": "確認密碼", - "enter_email": "輸入您的電子郵件", - "enter_name": "輸入您的姓名", - "remember_me": "記住我", - "forgot_password": "忘記密碼?", - "dont_have_account": "還沒有帳號?", - "create_account": "建立帳號", - "create_an_account": "建立帳號", - "already_have_account": "已經有帳號?" - }, - "user": { - "user": "使用者", - "users": "使用者", - "name": "姓名", - "email_address": "電子郵件地址", - "authenticator": "認證者", - "full_name": "全名", - "no_user_found": "找不到使用者", - "type_three_characters": "請輸入(3個或以上的字元)以顯示其他使用者。", - "search_not_found": "找不到使用者", - "profile": { - "profile": "個人檔案", - "language": "語言", - "role": "角色", - "administrator": "管理員", - "guest": "訪客" - }, - "account": { - "account_info": "帳號資訊", - "delete_account": "刪除帳號", - "change_password": "修改密碼", - "reset_password": "重設密碼", - "update_account_info": "更新帳號資訊", - "current_password": "目前密碼", - "new_password": "新密碼", - "confirm_password": "確認密碼", - "permanently_delete_account": "永久刪除您的帳號", - "delete_account_description": "如果您選擇刪除帳號,將無法恢復。\n您帳號的所有相關資訊,包括設定、房間和錄影將被刪除。", - "delete_account_confirmation": "是,我要刪除我的帳號", - "are_you_sure_delete_account": "您確定要刪除帳號嗎?" - }, - "avatar": { - "upload_avatar": "上傳頭像", - "delete_avatar": "刪除頭像", - "crop_avatar": "裁剪您的頭像" - }, - "pending": { - "title": "待審核註冊", - "message": "感謝您的註冊!您的帳號目前正在等待管理員的審核。" - } - }, - "room": { - "room": "房間", - "rooms": "房間", - "room_name": "房間名稱", - "add_new_room": "+ 新增房間", - "create_room": "建立房間", - "delete_room": "刪除房間", - "create_new_room": "建立新房間", - "enter_room_name": "輸入房間名稱", - "shared_by": "分享者:", - "last_session": "上次會議:{{ localizedTime }}", - "no_last_session": "尚未建立先前的會議", - "search_not_found": "找不到房間", - "rooms_list_is_empty": "您尚未擁有任何房間!", - "rooms_list_empty_create_room": "請點擊下方的按鈕並輸入房間名稱來建立您的第一個房間。", - "meeting": { - "start_meeting": "開始會議", - "join_meeting": "加入會議", - "meeting_invitation": "您已被邀請加入", - "meeting_not_started": "會議尚未開始", - "join_meeting_automatically": "會議開始時,您將自動加入", - "recording_consent": "我確認此次會議可能會被錄製。若啟用,可能會包含我的語音和影像。" - }, - "presentation": { - "presentation": "簡報", - "click_to_upload": "點擊上傳", - "drag_and_drop": " 或拖放", - "upload_description": "上傳任何辦公室文件或 PDF 檔案(不超過 {{size}})。根據檔案大小,可能需要額外的時間上傳才能使用。", - "are_you_sure_delete_presentation": "您確定要刪除此簡報嗎?" - }, - "shared_access": { - "access": "存取權限", - "add_share_access": "+ 分享存取權限", - "share_room_access": "分享房間存取權限", - "add_some_users": "該添加一些使用者了!", - "add_some_users_description": "要添加新使用者,請點擊下方的按鈕,搜尋或選擇您想與之分享此房間的使用者。", - "delete_shared_access": "刪除分享的存取權限", - "are_you_sure_delete_shared_access": "您確定要刪除此分享的存取權限嗎?" - }, - "settings": { - "settings": "設定", - "room_name": "房間名稱", - "user_settings": "使用者設定", - "allow_room_to_be_recorded": "允許錄製房間", - "require_signed_in": "要求使用者在加入前登入", - "require_signed_in_message": "您必須先登入才能加入此房間。", - "require_mod_approval": "要求在加入前經過主持人批准", - "allow_any_user_to_start": "允許任何使用者開始會議", - "all_users_join_as_mods": "所有使用者以主持人身份加入", - "mute_users_on_join": "使用者加入時靜音", - "generate": "生成", - "access_code": "存取代碼", - "mod_access_code": "主持人存取代碼", - "mod_access_code_optional": "主持人存取代碼(選填)", - "access_code_required": "請輸入存取代碼", - "wrong_access_code": "存取代碼錯誤", - "generate_viewers_access_code": "為觀眾生成存取代碼", - "generate_mods_access_code": "為主持人生成存取代碼", - "are_you_sure_delete_room": "您確定要刪除此房間嗎?" - } - }, - "recording": { - "recording": "錄製", - "recordings": "錄製", - "name": "名稱", - "length": "長度", - "users": "使用者", - "visibility": "可見性", - "formats": "格式", - "published": "已發佈", - "unpublished": "未發佈", - "protected": "受保護", - "public": "公開", - "public_protected": "公開/受保護", - "length_in_minutes": "{{recording.length}} 分鐘", - "processing_recording": "正在處理錄製,這可能需要幾分鐘時間...", - "copy_recording_urls": "複製錄製的 URL(s)", - "recordings_list_empty": "您尚未擁有任何錄製!", - "public_recordings_list_empty": "目前沒有公開的錄製!", - "recordings_list_empty_description": "在您開始會議並錄製後,錄製將出現在此處。", - "public_recordings_list_empty_description": "當錄製可用時,將在此處顯示。", - "delete_recording": "刪除錄製", - "are_you_sure_delete_recording": "您確定要刪除此錄製嗎?", - "search_not_found": "找不到錄製" - }, - "admin": { - "admin_panel": "管理員面板", - "manage_users": { - "manage_users": "管理使用者", - "active": "啟用", - "approve": "批准", - "decline": "拒絕", - "pending": "待處理", - "banned": "已封禁", - "ban": "封禁", - "unban": "解封", - "deleted": "已刪除", - "invited_tab": "已邀請", - "invite_user": "邀請使用者", - "send_invitation": "發送邀請", - "enter_user_email": "輸入使用者的電子郵件", - "new_user": "新使用者", - "add_new_user": "新增使用者", - "create_new_user": "建立新使用者", - "edit_user": "編輯使用者", - "delete_user": "刪除使用者", - "users_edit_path": "Users/Edit", - "create_account": "建立帳號", - "create_room": "建立房間", - "create_new_room": "建立新房間", - "user_created_at": "建立於:{{localizedTime}}", - "are_you_sure_delete_account": "您確定要刪除{{user.name}}的帳號嗎?", - "delete_account_warning": "如果您選擇刪除此帳號,將無法恢復。", - "empty_active_users": "此伺服器上尚未有啟用的使用者!", - "empty_active_users_subtext": "當使用者的狀態更改為啟用時,他們將出現在這裡。", - "empty_pending_users": "此伺服器上尚未有待處理的使用者!", - "empty_pending_users_subtext": "當使用者的狀態更改為待處理時,他們將出現在這裡。", - "empty_banned_users": "此伺服器上尚未有封禁的使用者!", - "empty_banned_users_subtext": "當使用者的狀態更改為已封禁時,他們將出現在這裡。", - "empty_invited_users": "此伺服器上尚未有已邀請的使用者!", - "empty_invited_users_subtext": "當使用者的狀態更改為已邀請時,他們將出現在這裡。", - "invited": { - "time_sent": "發送時間", - "valid": "有效" - } - }, - "server_rooms": { - "server_rooms": "伺服器房間", - "name": "名稱", - "owner": "擁有者", - "room_id": "房間 ID", - "participants": "參與者", - "status": "狀態", - "running": "運行中", - "not_running": "未運行", - "active": "啟用", - "current_session": "當前會議:{{lastSession}}", - "last_session": "上次會議:{{localizedTime}}", - "no_meeting_yet": "尚未有會議", - "delete_server_rooms": "刪除伺服器房間", - "resync_recordings": "重新同步錄製", - "empty_room_list": "目前沒有伺服器房間!", - "empty_room_list_subtext": "在建立您的第一個房間後,房間將顯示在此處。" - }, - "server_recordings": { - "server_recordings": "伺服器錄製", - "latest_recordings": "最新錄製", - "no_recordings_found": "找不到錄製。" - }, - "site_settings": { - "site_settings": "網站設定", - "customize_greenlight": "自訂 Greenlight", - "appearance": { - "appearance": "外觀", - "brand_color": "品牌顏色", - "regular": "常規", - "lighten": "變亮", - "brand_image": "品牌圖片", - "click_to_upload": "點擊上傳", - "drag_and_drop": "或拖放", - "upload_brand_image_description": "上傳任何 PNG、JPG 或 SVG 檔案(大小不超過 {{size}})。根據檔案大小,可能需要額外的時間才能上傳並使用。", - "remove_branding_image": "移除品牌圖片" - }, - "administration": { - "administration": "管理", - "terms": "條款與條件", - "privacy": "隱私政策", - "privacy_policy": "隱私政策", - "change_term_links": "更改顯示在頁面底部的條款連結", - "change_privacy_link": "更改顯示在頁面底部的隱私連結", - "change_url": "更改 URL", - "enter_link": "在此輸入連結" - }, - "settings": { - "settings": "設定", - "allow_users_to_share_rooms": "允許使用者共享房間", - "allow_users_to_share_rooms_description": "禁用此設定將從房間選項下拉清單中移除按鈕,防止使用者共享房間", - "allow_users_to_preupload_presentation": "允許使用者預先上傳簡報", - "allow_users_to_preupload_presentation_description": "使用者可以預先上傳一份簡報,作為該特定房間的預設簡報" - }, - "registration": { - "registration": "註冊", - "role_mapping_by_email": "使用電子郵件進行角色映射", - "role_mapping_by_email_description": "使用電子郵件將使用者映射到角色。必須使用以下格式:role1=email1, role2=email2", - "enter_role_mapping_rule": "輸入角色映射規則", - "resync_on_login": "每次登入時重新同步使用者資料", - "resync_on_login_description": "每次使用者登入時,重新同步其資訊,使外部身份驗證提供者始終與 Greenlight 中的資訊匹配", - "default_role": "預設角色", - "default_role_description": "新建立使用者時要分配的預設角色", - "registration_method": "註冊方法", - "registration_method_description": "更改使用者註冊網站的方式", - "registration_methods" : { - "open": "開放註冊", - "invite": "邀請加入", - "approval": "核准/拒絕" - } - } - }, - "room_configuration": { - "room_configuration": "房間配置", - "default": "可選(默認:啟用)", - "optional": "可選(默認:禁用)", - "enabled": "強制啟用", - "disabled": "已禁用", - "configurations": { - "allow_room_to_be_recorded": "允許錄製房間", - "allow_room_to_be_recorded_description": "允許房間擁有者指定是否要啟用房間錄製功能。如果啟用,主持人在會議開始後仍需點擊「錄製」按鈕。", - "require_user_signed_in": "要求使用者在加入前登錄", - "require_user_signed_in_description": "只允許擁有 Greenlight 帳戶的使用者加入會議。如果使用者未登錄,嘗試加入房間時將被重定向到登錄頁面。", - "require_mod_approval": "要求主持人批准後才能加入", - "require_mod_approval_description": "當使用者嘗試加入 BigBlueButton 會議時,提示 BigBlueButton 會議的主持人。如果使用者獲准,他們將能夠加入會議。", - "allow_any_user_to_start_meeting": "允許任何使用者開始會議", - "allow_any_user_to_start_meeting_description": "允許任何使用者隨時開始會議。預設情況下,只有房間擁有者可以開始會議。", - "allow_users_to_join_as_mods": "所有使用者以主持人身份加入", - "allow_users_to_join_as_mods_description": "使所有使用者在加入會議時具有 BigBlueButton 的主持人權限", - "mute_users_on_join": "使用者加入時將其靜音", - "mute_users_on_join_description": "使用者加入 BigBlueButton 會議時自動將其靜音", - "viewer_access_code": "觀眾存取碼", - "viewer_access_code_description": "允許房間擁有者擁有一個隨機的英數字串碼,可與使用者共享。如果生成了存取碼,使用者必須在加入房間會議時輸入該碼。", - "mod_access_code": "主持人存取碼", - "mod_access_code_description": "允許房間擁有者擁有一個隨機的英數字串碼,可與使用者共享。如果生成了存取碼,使用該碼加入任何房間會議時,使用者將以主持人身份加入。" - } - }, - "roles": { - "role": "角色", - "roles": "角色", - "administrator": "管理員", - "guest": "訪客", - "manage_roles": "管理角色", - "delete_role": "刪除角色", - "are_you_sure_delete_role": "您確定要刪除此角色嗎?", - "enter_role_name": "輸入角色名稱", - "add_role": "+ 建立角色", - "create_role": "建立角色", - "create_new_role": "建立新角色", - "no_role_found": "找不到角色。", - "search_not_found": "找不到角色", - "edit": { - "create_room": "允許擁有此角色的使用者建立房間", - "record": "允許擁有此角色的使用者錄製會議", - "manage_users": "允許擁有此角色的使用者管理使用者", - "manage_rooms": "允許擁有此角色的使用者管理伺服器房間", - "manage_recordings": "允許擁有此角色的使用者管理伺服器錄製", - "manage_site_settings": "允許擁有此角色的使用者管理網站設定", - "manage_roles": "允許擁有此角色的使用者編輯其他角色", - "shared_list": "將擁有此角色的使用者包含在共享房間的下拉清單中", - "room_limit": "房間限制數量" - } - } - }, - "toast": { - "success": { - "user": { - "user_created": "已成功建立新使用者。", - "user_updated": "使用者已成功更新。", - "user_deleted": "使用者已成功刪除。", - "avatar_updated": "頭像已成功更新。", - "password_updated": "密碼已成功更新。", - "account_activated": "您的帳戶已成功啟用。", - "activation_email_sent": "已發送一封包含啟用帳戶指示的郵件。", - "reset_pwd_email_sent": "已發送一封包含重設密碼指示的郵件。" - }, - "session": { - "signed_out": "您已成功登出" - }, - "room": { - "room_created": "已成功建立新房間。", - "room_updated": "房間已成功更新", - "room_deleted": "房間已成功刪除。", - "room_shared": "房間已成功共享。", - "room_unshared": "房間已取消共享。", - "recordings_synced": "房間錄製已成功同步。", - "room_configuration_updated": "房間配置已成功更新。", - "room_setting_updated": "房間設定已成功更新。", - "presentation_updated": "簡報已成功更新。", - "presentation_deleted": "簡報已成功刪除。", - "joining_meeting": "正在加入會議...", - "meeting_started": "會議已開始。", - "access_code_copied": "存取碼已成功複製。", - "access_code_generated": "已成功生成新的存取碼", - "access_code_deleted": "存取碼已成功刪除。", - "copied_meeting_url": "會議連結已成功複製。該連結可用於加入會議" - }, - "site_settings": { - "site_setting_updated": "網站設定已成功更新。", - "brand_color_updated": "品牌顏色已成功更新。", - "brand_image_updated": "品牌圖片已成功更新。", - "brand_image_deleted": "品牌圖片已成功刪除。", - "privacy_policy_updated": "隱私政策已成功更新。", - "terms_of_service_updated": "服務條款已成功更新。" - }, - "recording": { - "recording_visibility_updated": "錄製的可見性已成功更新。", - "recording_name_updated": "錄製名稱已成功更新。", - "recording_deleted": "錄製已成功刪除。", - "copied_urls": "錄製連結已成功複製。" - }, - "role": { - "role_created": "已成功建立新角色。", - "role_updated": "角色已成功更新。", - "role_deleted": "角色已成功刪除。", - "role_permission_updated": "角色權限已成功更新。" - }, - "invitations": { - "invitation_sent": "已成功發送邀請。" - } - }, - "error": { - "problem_completing_action": "無法完成動作。\n請重試。", - "file_type_not_supported": "不支援的檔案類型。", - "file_size_too_large": "檔案大小超過限制。", - "file_upload_error": "無法上傳檔案", - "signin_required": "您必須登入才能訪問此頁面。", - "roles": { - "role_assigned": "無法刪除此角色,因為它已分配給至少一個使用者。" - }, - "users": { - "signup_error": "您無法通過驗證。請聯繫您的管理員。", - "invalid_invite": "您的邀請令牌無效或不正確。請聯繫您的管理員以獲取新的令牌。", - "email_exists": "使用該電子郵件的帳戶已存在。請嘗試使用其他電子郵件。", - "old_password": "您輸入的密碼不正確。", - "pending": "您的註冊正在等待管理員的批准。請稍後再試。", - "banned": "您無權訪問此應用程式。如果您認為這是一個錯誤,請聯繫您的管理員。" - }, - "rooms": { - "room_limit": "無法建立房間,因為已達到房間數量限制。" - }, - "session": { - "invalid_credentials": "使用者名稱或密碼無效。請驗證您的憑證並重試。" - } - } - }, - "global_error_page": { - "title": "錯誤", - "message": "抱歉,發生了一些錯誤。如果這個問題再次發生,請聯繫管理員。" - }, - "not_found_error_page": { - "title": "找不到頁面", - "message": "抱歉,無法找到您要訪問的頁面。" - }, - "account_activation_page": { - "title": "帳戶啟用", - "account_unverified": "您的帳戶尚未驗證。", - "message": "為了使用Greenlight,請按照已發送給您的啟用郵件中的說明進行帳戶驗證。", - "resend_activation_link": "如果您未收到啟用郵件,或者無法使用它,請點擊下面的按鈕重新請求新的啟用郵件。", - "resend_btn_lbl": "重新發送驗證郵件" - }, - "forms": { - "validations": { - "full_name": { - "required": "請輸入全名。", - "min": "名稱至少需含2個字元。", - "max": "名稱最多只能含255個字元。" - }, - "email": { - "required": "請輸入電子郵件。", - "email": "輸入的值不符合電子郵件格式。", - "min": "電子郵件至少需含6個字元。", - "max": "電子郵件最多只能含255個字元。" - }, - "password": { - "required": "請輸入密碼。", - "match": "密碼必須包含以下條件:", - "min": "- 至少八個字元", - "lower": "- 至少一個小寫字母", - "upper": "- 至少一個大寫字母", - "digit": "- 至少一個數字", - "symbol": "- 至少一個符號", - "max": "密碼最多只能含255個字元" - }, - "password_confirmation": { - "required": "請輸入密碼確認。", - "match": "兩次輸入的密碼不相符。" - }, - "emails": { - "required": "請輸入至少一個有效的電子郵件。", - "list": "請提供一個以逗號分隔的有效電子郵件列表(user@users.com,user1@users.com,user2@users.com)。" - }, - "role_name": { - "required": "請輸入角色名稱。" - }, - "role": { - "limit": { - "required": "請輸入房間數量限制。", - "min": "允許的最小值為0。", - "max": "允許的最大值為100。" - }, - "type": { - "error": "您必須指定一個數字。" - } - }, - "room": { - "name": { - "required": "請輸入房間名稱。", - "min": "名稱至少需含2個字元" - } - }, - "room_join": { - "name": { - "required": "請輸入您的名稱" - } - }, - "url": { - "invalid": "無效的網址。" - } - }, - "room": { - "fields": { - "name": { - "label": "房間名稱", - "placeholder": "輸入房間名稱..." - } - } - }, - "room_join": { - "fields": { - "name": { - "label": "名稱", - "placeholder": "輸入您的名稱" - }, - "access_code": { - "label": "存取代碼", - "placeholder": "輸入存取代碼" - }, - "recording_consent": { - "label": "我同意此次會議可能會被錄製。如果啟用,可能包含我的聲音和影像。" - } - } - }, - "user": { - "signup": { - "fields": { - "full_name": { - "label": "全名", - "placeholder": "輸入您的全名" - }, - "email": { - "label": "電子郵件", - "placeholder": "輸入您的電子郵件" - }, - "password": { - "label": "密碼", - "placeholder": "建立一個密碼" - }, - "password_confirmation": { - "label": "確認密碼", - "placeholder": "確認密碼" - } - } - }, - "signin": { - "fields": { - "email": { - "label": "電子郵件", - "placeholder": "電子郵件" - }, - "password": { - "label": "密碼", - "placeholder": "密碼" - }, - "remember_me": { - "label": "記住我" - } - } - }, - "change_password": { - "fields": { - "old_password": { - "label": "目前密碼", - "placeholder": "輸入您的密碼" - }, - "new_password": { - "label": "新密碼", - "placeholder": "輸入您的新密碼" - }, - "password_confirmation": { - "label": "確認新密碼", - "placeholder": "確認您的新密碼" - } - }, - "validations": { - "old_password": { - "required": "請輸入您的目前密碼" - } - } - }, - "forget_password": { - "fields": { - "email": { - "label": "電子郵件", - "placeholder": "輸入帳戶電子郵件" - } - }, - "validations": { - "email": { - "required": "請輸入帳戶電子郵件" - } - } - }, - "reset_password": { - "fields": { - "new_password": { - "label": "新密碼", - "placeholder": "輸入您的新密碼" - }, - "password_confirmation": { - "label": "確認新密碼", - "placeholder": "確認您的新密碼" - } - } - }, - "update_user": { - "fields": { - "full_name": { - "label": "全名" - }, - "email": { - "label": "電子郵件" - }, - "language": { - "label": "語言" - }, - "role": { - "label": "角色" - } - } - } - }, - "admin": { - "createUser": { - "fields": { - "full_name": { - "label": "全名", - "placeholder": "輸入使用者全名" - }, - "email": { - "label": "電子郵件", - "placeholder": "輸入使用者電子郵件" - }, - "password": { - "label": "密碼", - "placeholder": "輸入使用者密碼" - }, - "password_confirmation": { - "label": "確認密碼", - "placeholder": "確認密碼" - } - } - }, - "invite_user": { - "fields": { - "emails": { - "label": "電子郵件" - } - } - }, - "site_settings": { - "fields": { - "value": { - "placeholder": "在此輸入連結..." - } - } - }, - "roles": { - "fields": { - "name": { - "label": "角色名稱", - "placeholder": "輸入角色名稱..." - } - } - } - } - } -} diff --git a/app/assets/stylesheets/_tabler-custom.scss b/app/assets/stylesheets/_tabler-custom.scss new file mode 100644 index 0000000000..9df7c337ef --- /dev/null +++ b/app/assets/stylesheets/_tabler-custom.scss @@ -0,0 +1,81 @@ +/* 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 . +*/ + +@import "tabler/functions"; + +@import "tabler/core"; +@import "tabler/type"; +@import "tabler/grid"; + +@import "tabler/layout"; +@import "tabler/aside"; +@import "tabler/header"; +@import "tabler/footer"; +@import "tabler/colors"; +@import "tabler/text"; +@import "tabler/utilities"; + +@import "tabler/nav"; +@import "tabler/button"; +@import "tabler/alert"; +//@import "tabler/close"; +//@import "tabler/badge"; +@import "tabler/tables"; +//@import "tabler/breadcrumb"; +//@import "tabler/pagination"; +@import "tabler/cards"; +//@import "tabler/popover"; +@import "tabler/dropdown"; +@import "tabler/list"; +@import "tabler/list-group"; +@import "tabler/avatar"; +//@import "tabler/product"; +@import "tabler/progress"; +@import "tabler/icon"; +//@import "tabler/image"; +//@import "tabler/link"; +//@import "tabler/media"; +@import "tabler/form"; +//@import "tabler/sparkline"; +@import "tabler/social"; +//@import "tabler/maps"; +//@import "tabler/statuses"; +//@import "tabler/charts"; +//@import "tabler/chips"; +@import "tabler/stamp"; +//@import "tabler/chat"; +//@import "tabler/example"; +@import "tabler/tag"; +//@import "tabler/syntax"; +//@import "tabler/infobox"; +//@import "tabler/carousel"; + +//@import "tabler/forms/custom-range"; +//@import "tabler/forms/custom-selectgroup"; +@import "tabler/forms/custom-switch"; +//@import "tabler/forms/custom-imagecheck"; +@import "tabler/forms/custom-colorinput"; + +//@import "tabler/timeline"; + +//@import "tabler/browser"; +//@import "tabler/flag"; +//@import "tabler/payments"; +//@import "tabler/jvectormap"; +//@import "tabler/selectize"; + +//@import "tabler/fonts/feather"; diff --git a/app/assets/stylesheets/admin_panel.scss b/app/assets/stylesheets/admin_panel.scss deleted file mode 100644 index 036277514e..0000000000 --- a/app/assets/stylesheets/admin_panel.scss +++ /dev/null @@ -1,235 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . - -#admin-panel { - #admin-sidebar { - height: 100%; - border-right: 2px solid whitesmoke; - padding: 1rem; - min-height: $admin-card-height; - } - - .admin-panel-card { - min-height: $admin-card-height; - } - - .tab-content { - display: flex; - } - - .tab-content > .tab-pane { - display: block; - visibility: hidden; - margin-right: -100%; - width: 100%; - } - - .tab-content > .tab-pane:dir(rtl) { - margin-right: 0; - margin-left: -100%; - } - - .tab-content > .active { - visibility: visible; - } - - input.search-bar { - max-width: $input-max-width; - } - - .admin-table { - table, td, tr { - border-color: whitesmoke !important; - } - .dropdown { - position: static; - } - } - - .dropdown-item { - color: $muted; - &:hover { - color: var(--brand-color); - } - &:active { - background-color: white !important; - } - } - - .dropdown-toggle::after { - display: none !important; - } - - @include media-breakpoint-down(md) { - .dropdown-menu { - transform: none !important; - } - } -} - -#manage-users-table { - @include media-breakpoint-down(md) { - td, tr { - // Full name and creation date - &:nth-child(1) { - min-width: $column-lg-width; - } - // Email address - &:nth-child(2) { - min-width: $column-lg-width; - } - // Role - &:nth-child(3) { - min-width: $column-md-width; - } - // Dropdown button - &:nth-child(4) { - min-width: $column-sm-width; - } - } - } -} - -#server-rooms-table { - @include media-breakpoint-down(xl) { - td, tr { - // Full name and last meeting date - &:nth-child(1) { - min-width: $column-lg-width; - } - // Owner name - &:nth-child(2) { - min-width: $column-md-width; - } - // Room ID - &:nth-child(3) { - min-width: $column-md-width; - } - // # of participants - &:nth-child(4) { - min-width: $column-sm-width; - } - // Status - &:nth-child(5) { - min-width: $column-sm-width; - } - // Dropdown button - &:nth-child(6) { - min-width: $column-xs-width; - } - } - } -} - -#recordings-table { - @include media-breakpoint-down(xl) { - td, tr { - // Name and recording date - &:nth-child(1) { - min-width: $column-lg-width; - } - // Length - &:nth-child(2) { - min-width: $column-sm-width; - } - // # of users - &:nth-child(3) { - min-width: $column-xs-width; - } - // Visibility dropdown - &:nth-child(4) { - min-width: $column-md-width; - } - // Format badges - &:nth-child(4) { - min-width: $column-lg-width; - } - // Dropdown button - &:nth-child(4) { - min-width: $column-xs-width; - } - } - } -} - -.color-picker { - width: 200px; - min-height: 330px; - - .react-colorful__hue { - border-radius: 0 !important; - } -} - -.color-preview { - display: inline-block; - width: 50%; - height: 15px; -} - -.popover-arrow { - display: none !important; -} - -.room-limit{ - width: 100px; -} - -#edit-role-form { - .invalid-feedback{ - width: 200px; - } -} - -.role-badge { - background-color: whitesmoke !important; - height: 24px; - line-height: 18px; - color: gray; -} - -.role-color-dot { - width: 10px; - height: 10px; - display: inline-block; - border-radius: 100%; -} - -#role-breadcrumb { - height: 8px; - a { - color: $muted; - text-decoration: none !important; - } -} - -#edit-role-form { - input { - max-width: $input-max-width; - } -} - -#server-recordings { - .card { - box-shadow: none !important; - } -} - -#list-empty { - svg { - padding-top: 2rem; - } -} diff --git a/app/assets/stylesheets/admins.scss b/app/assets/stylesheets/admins.scss new file mode 100644 index 0000000000..38c40afcde --- /dev/null +++ b/app/assets/stylesheets/admins.scss @@ -0,0 +1,101 @@ +// 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 . + +#users-table { + .user-role { + color: white !important; + } + + .user-email { + max-width: 250px; + } +} + +#clear-search { + z-index: 9; + position: absolute; + right: 55px; + top: 8px; + + &:hover { + cursor: pointer; + } +} + +.tag i { + color: white !important; +} + +#branding-image{ + z-index: auto; +} + +.authentication-required{ + padding-top: 2px; +} + +#site_settings { + .colorinput-color { + text-align: center; + padding-top: 4px; + height: 2rem; + width: 2rem; + } +} + +.sort-disabled{ + background: #e6e6e6 !important; + color: rgb(110, 118, 135) !important; + opacity: 0.75; + &:hover{ + opacity: 0.9; + } +} + +.form-disable{ + background-color: #e6e6e6; +} + +.role-colour-picker{ + color: white !important; +} + +.custom-role-tag{ + color: white !important; + // Make it consistent with the manage users tab tags + padding-top: 1px; + padding-bottom: 1px; +} + +.user-role-tag{ + color: white !important; +} + +#manage-users-nav.nav-tabs .nav-item { + margin-bottom: -1px; +} + +#merge-account-arrow { + position: absolute; + top: 47%; + right: 47%; + z-index: 999; + background: white; +} + +.admin-tabs { + justify-content: space-around; +} \ No newline at end of file diff --git a/app/assets/stylesheets/application.bootstrap.scss b/app/assets/stylesheets/application.bootstrap.scss deleted file mode 100644 index 9702f2eb9f..0000000000 --- a/app/assets/stylesheets/application.bootstrap.scss +++ /dev/null @@ -1,808 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . - -@import 'bootstrap/scss/bootstrap'; -@import 'react-toastify/dist/ReactToastify'; -@import 'variables'; - -@import 'helpers'; -@import 'rooms'; -@import 'recordings'; -@import 'profile'; -@import 'shared_accesses'; -@import 'presentation'; -@import 'admin_panel'; -@import 'pagination'; -@import 'fonts'; - -html, -body { - overflow-x: hidden; -} - -body { - background: whitesmoke; - font-family: "Inter"; -} - -#navbar { - height: $header-height; - background: white; - - .navbar-toggler { - &:active { - outline: none !important; - box-shadow: none; - } - &:focus { - outline: none !important; - box-shadow: none; - } - } -} - -#navbar-menu { - z-index: 10; - top: 100%; - - a { - color: $black !important; - } -} - -.bg-placeholder { - color: silver; -} - -.btn { - white-space: nowrap; - - @include media-breakpoint-up(sm) { - min-width: $button-min-width; - } -} - -.btn-sm { - min-width: 0 !important; -} - -.btn-xlg { - font-size: 1.5rem; - padding: 0.75rem 5rem; - border-radius: $border-radius-lg; -} - -// Replace a button with a children icon -.btn-icon { - background: none; - color: inherit; - border: none; - padding: 0; - font: inherit; - cursor: pointer; - outline: inherit; - min-width: auto; - - &:focus { - box-shadow: none; - } -} - -// Bootstrap btn-link overwrite -.btn-link { - font-weight: 400; - color: $black; - text-decoration: none !important; -} -.btn-link:hover { - color: $black !important; - text-decoration: underline !important; -} -.btn-link:disabled, .btn-link.disabled { - color: #6c757d; -} -.btn-link:focus { - box-shadow: none; -} - -// aligns the "Copy Join" btn with the "Start Meeting" btn -.start-meeting-btn { - min-height: 2.56rem; -} - -// Smoothen bootstrap transition -.fade { - transition: opacity 0.3s ease !important; - - & .modal-dialog { - transition: opacity 0.3s ease !important; - transform: none !important; - } -} - -.modal-open { - padding-right: 0 !important; -} - -//TODO: samuel - need to confirm for Browsers compatibility (maybe Scope this a bit more?) -input[type='search']::-webkit-search-cancel-button { - -webkit-appearance: none; - cursor: pointer; - height: 20px; - width: 20px; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px'%0Awidth='20' height='20'%0AviewBox='0 0 24 24'%0Astyle=' fill:%23747474;'%3E%3Cpath d='M 4.9902344 3.9902344 A 1.0001 1.0001 0 0 0 4.2929688 5.7070312 L 10.585938 12 L 4.2929688 18.292969 A 1.0001 1.0001 0 1 0 5.7070312 19.707031 L 12 13.414062 L 18.292969 19.707031 A 1.0001 1.0001 0 1 0 19.707031 18.292969 L 13.414062 12 L 19.707031 5.7070312 A 1.0001 1.0001 0 0 0 18.980469 3.9902344 A 1.0001 1.0001 0 0 0 18.292969 4.2929688 L 12 10.585938 L 5.7070312 4.2929688 A 1.0001 1.0001 0 0 0 4.9902344 3.9902344 z'%3E%3C/path%3E%3C/svg%3E"); -} - -input.search-bar { - min-width: 19.5rem; - padding: 9px 9px 9px 40px; - background: white url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px'%0Awidth='20' height='20'%0AviewBox='0 0 30 30'%0Astyle=' fill:%23747474;'%3E%3Cpath d='M 13 3 C 7.4889971 3 3 7.4889971 3 13 C 3 18.511003 7.4889971 23 13 23 C 15.396508 23 17.597385 22.148986 19.322266 20.736328 L 25.292969 26.707031 A 1.0001 1.0001 0 1 0 26.707031 25.292969 L 20.736328 19.322266 C 22.148986 17.597385 23 15.396508 23 13 C 23 7.4889971 18.511003 3 13 3 z M 13 5 C 17.430123 5 21 8.5698774 21 13 C 21 17.430123 17.430123 21 13 21 C 8.5698774 21 5 17.430123 5 13 C 5 8.5698774 8.5698774 5 13 5 z'%3E%3C/path%3E%3C/svg%3E") no-repeat 13px center; - - @include media-breakpoint-down(sm) { - min-width: $button-min-width; - } - - &:focus { - border-color: #DEE2E6 !important; - } -} - -.icon-circle { - width: 100px; - height: 100px; - background-color: var(--brand-color-light); -} - -//default Heroicon width -.hi-xs { - width:16px; -} - -.hi-s { - width: 24px; - padding-bottom: 1px; -} - -.hi-m { - width: 32px; -} - -.hi-l { - width: 48px; -} - -.hi-xl { - width: 72px; -} - -.hi-xxl { - width: 100px; -} - -.card-shadow { - box-shadow: 0px 4px 8px -2px rgba(16, 24, 40, 0.1), 0px 2px 4px -2px rgba(16, 24, 40, 0.06) !important; -} - -#footer { - #footer-container { - border-top: 1px solid #d0d5dd; - } - - a { - color: var(--brand-color) !important; - text-decoration: none !important; - } - - @include media-breakpoint-up(sm) { - max-height: $footer-height; - } -} - -.danger-light-button{ - color: red; - background-color: white; - border: none; -} - -.nav-pills .nav-link.active { - color: var(--brand-color) !important; - background-color: var(--brand-color-light); - font-weight: 600; - - svg { - color: var(--brand-color) !important; - } -} - -.nav-link { - color: $muted; - - &:hover { - color: var(--brand-color); - } -} - -#nav-user-dropdown { - padding: 6px 0px 6px 6px; - border-radius: $border-radius; - - &:hover { - background-color: white; - color: black !important; - } - &:active { - background-color: white !important; - } - &:focus { - background-color: white !important; - } - &::after { - display: none; - } - #chevron-profile { - padding-top: 2px; - } -} - -.dropdown-menu.show { - margin-top: 0px; -} - -.dropdown { - a { - color: $black !important; - &:hover { - color: var(--brand-color) !important; - } - &:active { - background-color: whitesmoke !important; - } - &:focus { - background-color: whitesmoke !important; - } - } -} - -// Custom Select component. -.select{ - .dropdown-item.active, .dropdown-item:active { - background-color: var(--brand-color-light) !important; - color: var(--brand-color) !important; - } -} - -.custom-select { - .select-brand-control { - border-color: var(--brand-color) !important; - box-shadow: 0 0 0 1px var(--brand-color) !important; - } - - .select-brand-option { - background-color: whitesmoke; - color: var(--brand-color) !important; - &:active { - background-color: var(--brand-color-light) !important; - } - } -} - -//Brand -:root { - --brand-color: ''; - --brand-color-light: ''; -} - -.text-brand { - color: var(--brand-color); -} - -//Brand button -.btn-brand { - background-color: var(--brand-color); - border-color: var(--brand-color); - color: white; - - &:active { - background-color: var(--brand-color) !important; - border-color: var(--brand-color) !important; - color: white !important; - } - - &:hover { - background-color: var(--brand-color); - border-color: var(--brand-color); - color: white; - box-shadow: inset 0 0 200px 200px rgba(0, 0, 0, 0.1); - } - - &:focus { - box-shadow: 0 0 0 0.25rem var(--brand-color-light); - } -} - -.btn-brand-outline { - border: 2px solid gainsboro; - color: var(--brand-color); - background-color: white; - box-shadow: var(--brand-color-light); - - &:active { - border-color: var(--brand-color) !important; - background-color: white !important; - color: var(--brand-color) !important; - } - - &:hover { - border-color: var(--brand-color); - background-color: white; - color: var(--brand-color); - } - - &:focus { - box-shadow: 0 0 0 0.25rem var(--brand-color-light); - } - - &:disabled { - color: gray !important; - pointer-events: none !important; - cursor: not-allowed !important; - } -} - -.btn-brand-outline-color { - border: 2px solid var(--brand-color); - color: var(--brand-color); - background-color: white; - box-shadow: var(--brand-color-light); - - &:hover { - box-shadow: inset 0 0 200px 200px rgba(0, 0, 0, 0.03); - color: var(--brand-color); - } - - &:focus { - box-shadow: 0 0 0 0.25rem var(--brand-color-light); - } -} - -.btn-brand-light { - background-color: var(--brand-color-light); - color: var(--brand-color); - border: 2px solid var(--brand-color-light); - - &:hover { - box-shadow: inset 0 0 200px 200px rgba(0, 0, 0, 0.03); - color: var(--brand-color); - } - - &:focus { - box-shadow: 0 0 0 0.25rem var(--brand-color); - } -} - -.btn-delete { - border: 2px solid $danger; - color: $danger; - background-color: white; - - &:hover { - box-shadow: inset 0 0 200px 200px rgba(0, 0, 0, 0.03); - color: $danger; - } - - &:focus { - box-shadow: none; - } -} - -.btn-neutral { - border: 2px solid gainsboro; - color: gray; - background-color: white; - - &:hover { - box-shadow: inset 0 0 200px 200px rgba(0, 0, 0, 0.03); - color: gray; - } - - &:focus { - box-shadow: none; - } -} - -.btn-link { - background-color: transparent; - border: 0; - color: #0d6efd; - - &:hover { - color: #0a58ca !important; - text-decoration: none !important; - } - - &:focus { - box-shadow: none; - } -} - -.btn-dropdown { - border: 2px solid gainsboro; - box-shadow: var(--brand-color-light); - - &:hover { - border-color: gainsboro !important; - } - - &:focus { - box-shadow: 0 0 0 0.25rem var(--brand-color-light); - } -} - -.badge-brand-outline { - font-size: 0.8rem; - border: 2px solid gainsboro; - color: var(--brand-color); - background-color: white !important; - box-shadow: var(--brand-color-light); -} - -.setting-select { - button { - background: white !important; - color: black !important; - border-color: gainsboro !important; - text-align: left; - - &:hover, &:focus, &:active { - background: white !important; - color: black !important; - border-color: gainsboro !important; - } - &:focus { - box-shadow: 0 0 0 0.25rem var(--brand-color-light) !important; - } - } - - button, .dropdown-menu { - @include media-breakpoint-up(sm) { - min-width: 300px; - } - } -} - -.simple-select { - button { - background: white !important; - color: black !important; - border-color: gainsboro !important; - text-align: left; - width: 220px; - - &:hover, &:focus, &:active { - background: white !important; - color: black !important; - border-color: gainsboro !important; - } - &:focus { - box-shadow: 0 0 0 0.25rem var(--brand-color-light) !important; - } - &::after { - display: none !important; - } - } - - .dropdown-menu { - min-width: 220px; - } -} - -@media (max-width: 767px) { - .table-responsive .dropdown-menu { - position: static !important; - } -} -@media (min-width: 768px) { - .table-responsive { - overflow: visible; - } -} - -input[type='text']:focus { - border-color: whitesmoke !important; - box-shadow: 0 0 0 2px var(--brand-color-light) !important; -} - -input[type='checkbox'] { - &:checked { - background-color: var(--brand-color) !important; - border-color: var(--brand-color) !important; - color: white !important; - } - - &:focus { - border-color: var(--brand-color) !important; - box-shadow: 0 0 0 0.25rem var(--brand-color-light) !important; - } - -} - -//Bootstrap overwrite -.form-switch .form-check-input:focus { - border-color: rgba(0, 0, 0, 0.25); - outline: 0; - box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); - background-image: url("data:image/svg+xml,"); -} -.form-switch .form-check-input:checked { - background-color: var(--brand-color) !important;; - border-color: var(--brand-color) !important;; - border: none; - background-image: url("data:image/svg+xml,"); -} - -.form-check-input:hover { - cursor: pointer; -} - -.form-control:focus { - border-color: whitesmoke !important; - box-shadow: 0 0 0 2px var(--brand-color-light) !important; -} - -//Logo -.small-logo { - max-width: 200px; - max-height: $header-height; -} - -.logo { - max-width: 250px; - max-height: 125px; -} - -.logo-wrapper { - width: 250px; - height: 125px; -} - -/********** Range Input Styles **********/ -/*Range Reset*/ -input[type="range"] { - -webkit-appearance: none; - appearance: none; - background: transparent; - cursor: pointer; - width: 15rem; -} - -/* Removes default focus */ -input[type="range"]:focus { - outline: none; -} - -/***** Chrome, Safari, Opera and Edge Chromium styles *****/ -/* slider track */ -input[type="range"]::-webkit-slider-runnable-track { - background: var(--brand-color); - border-radius: 0.5rem; - height: 0.5rem; -} - -/* slider thumb */ -input[type="range"]::-webkit-slider-thumb { - -webkit-appearance: none; /* Override default look */ - appearance: none; - margin-top: -12px; /* Centers thumb on the track */ - - /*custom styles*/ - background: var(--brand-color); - height: 2rem; - width: 1rem; - border-radius: 4px; -} - -input[type="range"]:focus::-webkit-slider-thumb { - border: 1px solid var(--brand-color); - outline-offset: 0.125rem; -} - -/******** Firefox styles ********/ -/* slider track */ -input[type="range"]::-moz-range-track { - background-color: var(--brand-color); - border-radius: 0.5rem; - height: 0.5rem; -} - -/* slider thumb */ -input[type="range"]::-moz-range-thumb { - border: none; /*Removes extra border that FF applies*/ - border-radius: 0; /*Removes default border-radius that FF applies*/ - - /*custom styles*/ - accent-color: var(--brand-color); - height: 2rem; - width: 1rem; -} - -input[type="range"]:focus::-moz-range-thumb { - border: 1px solid var(--brand-color); - outline-offset: 0.125rem; -} - -.nav-tabs { - .nav-link.active { - border-bottom: 2px solid var(--brand-color) !important; - } - - .nav-link { - padding-left: 8px !important; - padding-right: 8px !important; - &:hover { - border-bottom: 2px solid var(--brand-color) !important; - } - } -} - -//GG spinner -.gg-spinner { - transform: scale(var(--ggs,1)) -} -.gg-spinner, -.gg-spinner::after, -.gg-spinner::before { - box-sizing: border-box; - position: relative; - display: block; - width: 40px; - height: 40px -} -.gg-spinner::after, -.gg-spinner::before { - content: ""; - position: absolute; - border-radius: 100px -} -.gg-spinner::before { - animation: spinner 1s - cubic-bezier(.6,0,.4,1) infinite; - border: 5px solid transparent; - border-top-color: var(--brand-color); -} -.gg-spinner::after { - border: 5px solid; - opacity: .2 -} -@keyframes spinner { - 0% { transform: rotate(0deg) } - to { transform: rotate(359deg) } -} - -/* Scrollbar Styling */ -::-webkit-scrollbar { - width: 10px; -} - -::-webkit-scrollbar-thumb { - -webkit-border-radius: 10px; - border-radius: 10px; - background: #c4c4c4; -} - -.placeholder { - border-radius: 2px; -} - -.placeholder-xlg { - border-radius: 3px; - min-height: 2.5em; -} - -// Homepage -#homepage-hero { - margin-top: 4.5rem; - margin-bottom: 4.5rem; - - @include media-breakpoint-down(md) { - margin-top: 3rem; - margin-bottom: 3rem; - } -} - -.homepage-card { - min-height: 16.5rem; - min-width: 16.5rem; -} - -.homepage-card-icon-circle { - width: 50px; - height: 50px; - background-color: var(--brand-color); - box-shadow: 0 0 0 8px whitesmoke; -} - -// Table Placeholders length -.xs-td-placeholder { - min-width: $column-xs-width; -} - -.sm-td-placeholder { - min-width: $column-sm-width; -} - -.md-td-placeholder { - min-width: $column-md-width; -} - -.lg-td-placeholder { - min-width: $column-lg-width -} - -// Circles & Avatars -.xs-circle { - width: 20px; - height: 20px; -} - -.small-circle { - width: 40px; - height: 40px; -} - -.medium-circle { - width: 100px; - height: 100px; -} - -.large-circle { - width: 150px; - height: 150px; -} - -.back-button { - &:hover { - color: var(--brand-color) !important; - } -} - -.tenants-icons { - svg:hover { - color: var(--brand-color) !important; - } -} - -.Toastify { - .Toastify__toast-icon { - width: 25px; - } -} - -.Toastify__toast.maintenance-toast { - width: 1000px; - max-width: 1000px; -} - -.Toastify__toast-container--top-center { - .Toastify__toast.maintenance-toast { - margin-left: calc((var(--toastify-toast-width) - 1000px) / 2); - } -} - -#rooms-list-empty, #recordings-list-empty { - .card-body { - min-height: 20rem; - } -} diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss new file mode 100644 index 0000000000..fb85489f2d --- /dev/null +++ b/app/assets/stylesheets/application.scss @@ -0,0 +1,193 @@ +/* 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 . +*/ + +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + *= require_self + */ + +@import "tabler/variables"; +@import "bootstrap"; +@import "jquery-ui/sortable"; +@import "tabler-custom"; +@import "font-awesome-sprockets"; +@import "font-awesome"; +@import "monolith.min.scss"; +@import "bootstrap-select.min"; + +@import "utilities/variables"; +@import "admins"; +@import "main"; +@import "rooms"; +@import "sessions"; +@import "utilities/fonts"; +@import "users"; + +* { + outline: none !important; +} + +html, body { + font-family: "Source Sans Pro" !important; + position: relative; + width: 100%; + height: 100%; + background-color: white; +} + +a { + text-decoration: none !important; + cursor: pointer; +} + +.dotted_underline { + border-bottom: 3px dashed #d3d3d3; + width: 100%; +} + +.disable-click { + pointer-events: none; +} + +.header { + height: $header-height; +} + +.wrapper { + position: relative; + height: auto; + min-height: calc(100% - #{$header-height} - #{$footer-height}); +} + +.footer { + height: $footer-height; + width: 100%; +} + +.background { + background-color: $background-color; +} + +.error-section { + background-color: $error-background-color; +} + +.font-weight-400 { + font-weight: 400; +} + +.subtitle { + font-size: 25px; +} + +.force-bottom { + display: flex; + justify-content: flex-end; + flex-direction: column; +} + +.invite-link-input { + width: 100%; +} + +.no-border-top { + td { + border-top: none; + } +} + +.force-text-normal { + color: #495057; +} + +.terms { + overflow: scroll; + height: 55vh; +} + +[contenteditable]:focus { + outline: 0px solid transparent; +} + +.cookies-banner { + color: white; + background-color: $button-color-blue; + #cookies-agree-button { + margin: 0; + } +} + +input:focus { + border-color: $primary !important; +} + +.input-group button:focus { + box-shadow: none !important; +} + +.list-group-item-action.active { + color: $primary; +} + +.header .header-nav { + color: $text-muted !important; + + &:hover { + padding-bottom: 21px; + border-bottom: 1px solid $primary; + } + + &.active { + color: $primary !important; + padding-bottom: 21px; + border-bottom: 1px solid $primary; + } +} + +table { + thead { + th[data-order]:hover { + cursor: pointer; + } + } +} + +.cursor-pointer{ + cursor: pointer; +} + +#delete-confirm:disabled { + cursor: not-allowed; +} + +.btn i { + transition: all .15s; +} + +.nav-icon i { + width: 35px; +} diff --git a/app/assets/stylesheets/errors.scss b/app/assets/stylesheets/errors.scss new file mode 100644 index 0000000000..56650224ca --- /dev/null +++ b/app/assets/stylesheets/errors.scss @@ -0,0 +1,20 @@ +/* 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 . +*/ + +// Place all the styles related to the Errors controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/fonts.scss b/app/assets/stylesheets/fonts.scss deleted file mode 100644 index 62263896ba..0000000000 --- a/app/assets/stylesheets/fonts.scss +++ /dev/null @@ -1,21 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . - -/*** FONTS ***/ -@font-face { - font-family: 'Inter'; - src: url('Inter-Regular.ttf'); -} diff --git a/app/assets/stylesheets/helpers.scss b/app/assets/stylesheets/helpers.scss deleted file mode 100644 index 9a30d9c17e..0000000000 --- a/app/assets/stylesheets/helpers.scss +++ /dev/null @@ -1,75 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . - -.text-link { - text-decoration: none !important; - color: var(--brand-color) !important; -} - -.wide-white { - background: white; - box-shadow: 0 0 0 100vmax white; - clip-path: inset(0 -100vmax); -} - -.vertical-center { - min-height: calc(100vh - $header-height - $footer-height - $footer-buffer-height); - display: flex; - align-items: stretch; - flex-direction: column; - justify-content: center; -} - -.no-header-height { - min-height: calc(100vh - $footer-height); -} - -.regular-height { - min-height: calc(100vh - $header-height - $footer-height); - - .vertical-center { - min-height: calc(100vh - $header-height - $header-height - $footer-height); - } -} - -.cursor-pointer { - cursor: pointer; -} - -.nav-tabs { - border-bottom: 0; - padding-bottom: 1px; - - .nav-link { - transition: none; - border: 0; - - &.active, &:hover { - color: var(--brand-color); - border-bottom: 1.5px solid var(--brand-color) !important; - } - } -} - -.border-whitesmoke { - border-color: whitesmoke !important; -} - -.background-whitesmoke { - background: whitesmoke !important; - box-shadow: 0 0 0 100vmax whitesmoke; - clip-path: inset(0 -100vmax); -} diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss new file mode 100755 index 0000000000..e8230e2a44 --- /dev/null +++ b/app/assets/stylesheets/main.scss @@ -0,0 +1,178 @@ +/* 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 . +*/ + +// Place all the styles related to the Main controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ + +.responsive-header { + font-size: 3.3vw; +} + +.landing-section { + position: relative; + height: 40%; +} + +.lead { + font-size:18px; +} + +.feature-stamp { + .stamp { + padding:1em 1.5em; + height:auto; + } +} + +.or-line { + div { + width: 100%; + height: 16px; + border-bottom: 1px solid #d3d3d3; + text-align: center; + span { + font-size: 120%; + background-color: #ffffff; + padding: 0 10px; + color: #d3d3d3 + } + } +} + +.display-4 { + font-weight: normal; +} + +.customBtn { + display: block; + text-align: center; + background: #cccccc; + color: #ffffff; + box-shadow: 0 2px 4px 0 rgba(0,0,0,.25); + -webkit-transition: background-color .218s,border-color .218s,box-shadow .218s; + transition: background-color .218s,border-color .218s,box-shadow .218s; + white-space: nowrap; + border-radius: 2px; + border: 1px solid transparent; + margin-bottom:20px; + &:hover { + cursor: pointer; + color: #ffffff; + -webkit-box-shadow: 0 0 3px 3px rgba(66,133,244,.3); + box-shadow: 0 0 3px 3px rgba(66,133,244,.3); + } + + .customBtn-icon { + display: inline-block; + vertical-align: middle; + padding:13px 15px 13px 15px; + float:left; + background: #ffffff; + } + + .customBtn-text { + font-size: 19px; + line-height: 48px; + font-weight: 600; + letter-spacing: .21px; + padding:0 25px; + } + + .customBtn-image { + background: #ffffff; + background-size: 18px 18px; + padding:10px 10px 10px 10px; + } +} + +.customBtn-google { + @extend .customBtn; + background: #4688f1; + + .customBtn-image { + background: #ffffff image-url("google-logo.png") no-repeat left top; + background-size: 18px 18px; + padding:10px 10px 10px 10px; + } +} + +.customBtn-twitter { + @extend .customBtn; + background: #1da1f2; + + .customBtn-image { + background: #ffffff image-url("twitter-logo.png") no-repeat left top; + background-size: 18px 18px; + padding:10px 10px 10px 10px; + } +} + +.customBtn-office365 { + @extend .customBtn; + background: #f65314; + + .customBtn-image { + background: #ffffff image-url("office365-logo.jpeg") no-repeat left top; + background-size: 18px 18px; + padding:10px 10px 10px 10px; + } +} + +.customBtn-microsoft_windows { + @extend .customBtn; + background: #00a1f1; + + .customBtn-image { + background: #ffffff image-url("windows-logo.png") no-repeat left top; + background-size: 18px 18px; + padding:10px 10px 10px 10px; + } +} + +.customBtn-ldap { + @extend .customBtn; + background: #d61515; + + .customBtn-image { + background: #ffffff image-url("ldap-logo.png") no-repeat left top; + background-size: 18px 18px; + padding:10px 10px 10px 10px; + } +} + +.customBtn-openid_connect { + @extend .customBtn; + background: #ef8e1f; + + .customBtn-image { + background: #ffffff image-url("openid-logo.png") no-repeat left top; + background-size: 18px 18px; + padding:10px 10px 10px 10px; + } +} + +.signin-button { + font-size: 16px; +} + +.table-responsive tbody td:first-child > *:first-child { + max-height: 3em; + overflow: hidden; + max-width: 200px; + display: flex; +} diff --git a/app/assets/stylesheets/pagination.scss b/app/assets/stylesheets/pagination.scss deleted file mode 100644 index b6be433502..0000000000 --- a/app/assets/stylesheets/pagination.scss +++ /dev/null @@ -1,61 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . - -// From https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.2/components/menu.min.css -.ui.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1rem 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#FFF;font-weight:400;border:1px solid rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem;min-height:2.85714286em}.ui.menu:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.menu:first-child{margin-top:0}.ui.menu:last-child{margin-bottom:0}.ui.menu .menu{margin:0}.ui.menu:not(.vertical)>.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui.menu:not(.vertical) .item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui.menu .item{position:relative;vertical-align:middle;line-height:1;text-decoration:none;-webkit-tap-highlight-color:transparent;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:0 0;padding:.92857143em 1.14285714em;text-transform:none;color:rgba(0,0,0,.87);font-weight:400;-webkit-transition:background .1s ease,box-shadow .1s ease,color .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease}.ui.menu>.item:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui.menu .item:before{position:absolute;content:'';top:0;right:0;height:100%;width:1px;background:rgba(34,36,38,.1)}.ui.menu .item>a:not(.ui),.ui.menu .item>p:only-child,.ui.menu .text.item>*{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;line-height:1.3}.ui.menu .item>p:first-child{margin-top:0}.ui.menu .item>p:last-child{margin-bottom:0}.ui.menu .item>i.icon{opacity:.9;float:none;margin:0 .35714286em 0 0}.ui.menu:not(.vertical) .item>.button{position:relative;top:0;margin:-.5em 0;padding-bottom:.78571429em;padding-top:.78571429em;font-size:1em}.ui.menu>.container,.ui.menu>.grid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:inherit;-webkit-align-items:inherit;-ms-flex-align:inherit;align-items:inherit;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.menu .item>.input{width:100%}.ui.menu:not(.vertical) .item>.input{position:relative;top:0;margin:-.5em 0}.ui.menu .item>.input input{font-size:1em;padding-top:.57142857em;padding-bottom:.57142857em}.ui.menu .header.item,.ui.vertical.menu .header.item{margin:0;background:0 0;text-transform:normal;font-weight:700}.ui.vertical.menu .item>.header:not(.ui){margin:0 0 .5em;font-size:1em;font-weight:700}.ui.menu .ui.popup{display:none}.ui.menu .ui.visible.popup{display:block}.ui.menu .item>i.dropdown.icon{padding:0;float:right;margin:0 0 0 1em}.ui.menu .dropdown.item .menu{left:0;min-width:calc(100% - 1px);border-radius:0 0 .28571429rem .28571429rem;background:#FFF;margin:0;box-shadow:0 1px 3px 0 rgba(0,0,0,.08);-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.ui.menu .ui.dropdown .menu>.item{margin:0;text-align:left;font-size:1em!important;padding:.78571429em 1.14285714em!important;background:0 0!important;color:rgba(0,0,0,.87)!important;text-transform:none!important;font-weight:400!important;box-shadow:none!important;-webkit-transition:none!important;transition:none!important}.ui.menu .ui.dropdown .menu>.item:hover,.ui.menu .ui.dropdown .menu>.selected.item{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.active.item{background:rgba(0,0,0,.03)!important;font-weight:700!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown.item .menu .item:not(.filtered){display:block}.ui.menu .ui.dropdown .menu>.item .icon:not(.dropdown){display:inline-block;font-size:1em!important;float:none;margin:0 .75em 0 0}.ui.secondary.menu .dropdown.item>.menu,.ui.text.menu .dropdown.item>.menu{border-radius:.28571429rem;margin-top:.35714286em}.ui.menu .pointing.dropdown.item .menu{margin-top:.75em}.ui.inverted.menu .search.dropdown.item>.search,.ui.inverted.menu .search.dropdown.item>.text{color:rgba(255,255,255,.9)}.ui.vertical.menu .dropdown.item>.icon{float:right;content:"\f0da";margin-left:1em}.ui.vertical.menu .dropdown.item .menu{top:0!important;left:100%;min-width:0;margin:0;box-shadow:0 1px 3px 0 rgba(0,0,0,.08);border-radius:0 .28571429rem .28571429rem}.ui.vertical.menu .active.dropdown.item{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.menu .dropdown.active.item{box-shadow:none}.ui.item.menu .dropdown .menu .item{width:100%}.ui.menu .item>.label{background:#999;color:#FFF;margin-left:1em;padding:.3em .78571429em}.ui.vertical.menu .item>.label{background:#999;color:#FFF;margin-top:-.15em;margin-bottom:-.15em;padding:.3em .78571429em;float:right;text-align:center}.ui.menu .item>.floating.label{padding:.3em .78571429em}.ui.menu .item>img:not(.ui){display:inline-block;vertical-align:middle;margin:-.3em 0;width:2.5em}.ui.vertical.menu .item>img:not(.ui):only-child{display:block;max-width:100%;width:auto}.ui.vertical.sidebar.menu>.item:first-child:before{display:block!important}.ui.vertical.sidebar.menu>.item::before{top:auto;bottom:0}@media only screen and (max-width:767px){.ui.menu>.ui.container{width:100%!important;margin-left:0!important;margin-right:0!important}}@media only screen and (min-width:768px){.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.item:not(.right):not(.borderless):first-child{border-left:1px solid rgba(34,36,38,.1)}}.ui.link.menu .item:hover,.ui.menu .dropdown.item:hover,.ui.menu .link.item:hover,.ui.menu a.item:hover{cursor:pointer;background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.link.menu .item:active,.ui.menu .link.item:active,.ui.menu a.item:active{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.menu .active.item{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);font-weight:400;box-shadow:none}.ui.menu .active.item>i.icon{opacity:1}.ui.menu .active.item:hover,.ui.vertical.menu .active.item:hover{background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.menu .item.disabled,.ui.menu .item.disabled:hover{cursor:default;background-color:transparent!important;color:rgba(40,40,40,.3)}.ui.menu:not(.vertical) .left.item,.ui.menu:not(.vertical) .left.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:auto!important}.ui.menu:not(.vertical) .right.item,.ui.menu:not(.vertical) .right.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-left:auto!important}.ui.menu .right.item::before,.ui.menu .right.menu>.item::before{right:auto;left:0}.ui.vertical.menu{display:block;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background:#FFF;box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui.vertical.menu .item{display:block;background:0 0;border-top:none;border-right:none}.ui.vertical.menu>.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu .item>i.icon{width:1.18em;float:right;margin:0 0 0 .5em}.ui.vertical.menu .item>.label+i.icon{float:none;margin:0 .5em 0 0}.ui.vertical.menu .item:before{position:absolute;content:'';top:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.vertical.menu .item:first-child:before{display:none!important}.ui.vertical.menu .item>.menu{margin:.5em -1.14285714em 0}.ui.vertical.menu .menu .item{background:0 0;padding:.5em 1.33333333em;font-size:.85714286em;color:rgba(0,0,0,.5)}.ui.vertical.menu .item .menu .link.item:hover,.ui.vertical.menu .item .menu a.item:hover{color:rgba(0,0,0,.85)}.ui.vertical.menu .menu .item:before{display:none}.ui.vertical.menu .active.item{background:rgba(0,0,0,.05);border-radius:0;box-shadow:none}.ui.vertical.menu>.active.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.active.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu>.active.item:only-child{border-radius:.28571429rem}.ui.vertical.menu .active.item .menu .active.item{border-left:none}.ui.vertical.menu .item .menu .active.item{background-color:transparent;font-weight:700;color:rgba(0,0,0,.95)}.ui.tabular.menu{border-radius:0;box-shadow:none!important;border:none;background:none;border-bottom:1px solid #D4D4D5}.ui.tabular.fluid.menu{width:calc(100% + 2px)!important}.ui.tabular.menu .item{background:0 0;border-bottom:none;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;padding:.92857143em 1.42857143em;color:rgba(0,0,0,.87)}.ui.tabular.menu .item:before{display:none}.ui.tabular.menu .item:hover{background-color:transparent;color:rgba(0,0,0,.8)}.ui.tabular.menu .active.item{background:#FFF;color:rgba(0,0,0,.95);border-top-width:1px;border-color:#D4D4D5;font-weight:700;margin-bottom:-1px;box-shadow:none;border-radius:.28571429rem .28571429rem 0 0!important}.ui.tabular.menu+.attached:not(.top).segment,.ui.tabular.menu+.attached:not(.top).segment+.attached:not(.top).segment{border-top:none;margin-left:0;margin-top:0;margin-right:0;width:100%}.top.attached.segment+.ui.bottom.tabular.menu{position:relative;width:calc(100% + 2px);left:-1px}.ui.bottom.tabular.menu{background:none;border-radius:0;box-shadow:none!important;border-bottom:none;border-top:1px solid #D4D4D5}.ui.bottom.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:none}.ui.bottom.tabular.menu .active.item{background:#FFF;color:rgba(0,0,0,.95);border-color:#D4D4D5;margin:-1px 0 0;border-radius:0 0 .28571429rem .28571429rem!important}.ui.vertical.tabular.menu{background:none;border-radius:0;box-shadow:none!important;border-bottom:none;border-right:1px solid #D4D4D5}.ui.vertical.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-right:none}.ui.vertical.tabular.menu .active.item{background:#FFF;color:rgba(0,0,0,.95);border-color:#D4D4D5;margin:0 -1px 0 0;border-radius:.28571429rem 0 0 .28571429rem!important}.ui.vertical.right.tabular.menu{background:none;border-radius:0;box-shadow:none!important;border-bottom:none;border-right:none;border-left:1px solid #D4D4D5}.ui.vertical.right.tabular.menu .item{background:0 0;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-left:none}.ui.vertical.right.tabular.menu .active.item{background:#FFF;color:rgba(0,0,0,.95);border-color:#D4D4D5;margin:0 0 0 -1px;border-radius:0 .28571429rem .28571429rem 0!important}.ui.tabular.menu .active.dropdown.item{margin-bottom:0;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;border-bottom:none}.ui.pagination.menu{margin:0;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.ui.pagination.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.pagination.menu .item:last-child:before{display:none}.ui.pagination.menu .item{min-width:3em;text-align:center}.ui.pagination.menu .icon.item i.icon{vertical-align:top}.ui.pagination.menu .active.item{border-top:none;padding-top:.92857143em;background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95);box-shadow:none}.ui.secondary.menu{background:0 0;margin-left:-.35714286em;margin-right:-.35714286em;border-radius:0;border:none;box-shadow:none}.ui.secondary.menu .item{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;box-shadow:none;border:none;padding:.78571429em .92857143em;margin:0 .35714286em;background:0 0;-webkit-transition:color .1s ease;transition:color .1s ease;border-radius:.28571429rem}.ui.secondary.menu .item:before{display:none!important}.ui.secondary.menu .header.item{border-radius:0;border-right:none;background:none}.ui.secondary.menu .item>img:not(.ui){margin:0}.ui.secondary.menu .dropdown.item:hover,.ui.secondary.menu .link.item:hover,.ui.secondary.menu a.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.menu .active.item{box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);border-radius:.28571429rem}.ui.secondary.menu .active.item:hover{box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.inverted.menu .link.item,.ui.secondary.inverted.menu a.item{color:rgba(255,255,255,.7)!important}.ui.secondary.inverted.menu .dropdown.item:hover,.ui.secondary.inverted.menu .link.item:hover,.ui.secondary.inverted.menu a.item:hover{background:rgba(255,255,255,.08);color:#fff!important}.ui.secondary.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff!important}.ui.secondary.item.menu{margin-left:0;margin-right:0}.ui.secondary.item.menu .item:last-child{margin-right:0}.ui.secondary.attached.menu{box-shadow:none}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu{margin:0 -.92857143em}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 1.33333333em}.ui.secondary.vertical.menu>.item{border:none;margin:0 0 .35714286em;border-radius:.28571429rem!important}.ui.secondary.vertical.menu>.header.item{border-radius:0}.ui.secondary.inverted.menu,.ui.vertical.secondary.menu .item>.menu .item{background-color:transparent}.ui.secondary.pointing.menu{margin-left:0;margin-right:0;border-bottom:2px solid rgba(34,36,38,.15)}.ui.secondary.pointing.menu .item{border-bottom-color:transparent;border-bottom-style:solid;border-radius:0;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 0 -2px;padding:.85714286em 1.14285714em;border-bottom-width:2px;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.secondary.pointing.menu .header.item{color:rgba(0,0,0,.85)!important}.ui.secondary.pointing.menu .text.item{box-shadow:none!important}.ui.secondary.pointing.menu .item:after{display:none}.ui.secondary.pointing.menu .dropdown.item:hover,.ui.secondary.pointing.menu .link.item:hover,.ui.secondary.pointing.menu a.item:hover{background-color:transparent;color:rgba(0,0,0,.87)}.ui.secondary.pointing.menu .dropdown.item:active,.ui.secondary.pointing.menu .link.item:active,.ui.secondary.pointing.menu a.item:active{background-color:transparent;border-color:rgba(34,36,38,.15)}.ui.secondary.pointing.menu .active.item{background-color:transparent;box-shadow:none;border-color:#1B1C1D;font-weight:700;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.item:hover{border-color:#1B1C1D;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.dropdown.item{border-color:transparent}.ui.secondary.vertical.pointing.menu{border-bottom-width:0;border-right-width:2px;border-right-style:solid;border-right-color:rgba(34,36,38,.15)}.ui.secondary.vertical.pointing.menu .item{border-bottom:none;border-right-style:solid;border-right-color:transparent;border-radius:0!important;margin:0 -2px 0 0;border-right-width:2px}.ui.secondary.vertical.pointing.menu .active.item{border-color:#1B1C1D}.ui.secondary.inverted.pointing.menu{border-width:2px;border-color:rgba(34,36,38,.15)}.ui.secondary.inverted.pointing.menu .item{color:rgba(255,255,255,.9)}.ui.secondary.inverted.pointing.menu .header.item{color:#FFF!important}.ui.secondary.inverted.pointing.menu .link.item:hover,.ui.secondary.inverted.pointing.menu a.item:hover{color:rgba(0,0,0,.95)}.ui.secondary.inverted.pointing.menu .active.item{border-color:#FFF;color:#fff}.ui.text.menu{background:none;border-radius:0;box-shadow:none;border:none;margin:1em -.5em}.ui.text.menu .item{border-radius:0;box-shadow:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;margin:0;padding:.35714286em .5em;font-weight:400;color:rgba(0,0,0,.6);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.text.menu .item:before,.ui.text.menu .menu .item:before{display:none!important}.ui.text.menu .header.item{background-color:transparent;opacity:1;color:rgba(0,0,0,.85);font-size:.92857143em;text-transform:uppercase;font-weight:700}.ui.text.item.menu .item,.ui.text.menu .item>img:not(.ui){margin:0}.ui.vertical.text.menu{margin:1em 0}.ui.vertical.text.menu:first-child{margin-top:0}.ui.vertical.text.menu:last-child{margin-bottom:0}.ui.vertical.text.menu .item{margin:.57142857em 0;padding-left:0;padding-right:0}.ui.vertical.text.menu .item>i.icon{float:none;margin:0 .35714286em 0 0}.ui.vertical.text.menu .header.item{margin:.57142857em 0 .71428571em}.ui.vertical.text.menu .item:not(.dropdown)>.menu{margin:0}.ui.vertical.text.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 0}.ui.text.menu .item:hover{opacity:1;background-color:transparent}.ui.text.menu .active.item{background-color:transparent;border:none;box-shadow:none;font-weight:400;color:rgba(0,0,0,.95)}.ui.text.menu .active.item:hover{background-color:transparent}.ui.text.attached.menu,.ui.text.pointing.menu .active.item:after{box-shadow:none}.ui.inverted.text.menu,.ui.inverted.text.menu .active.item,.ui.inverted.text.menu .item,.ui.inverted.text.menu .item:hover{background-color:transparent!important}.ui.fluid.text.menu{margin-left:0;margin-right:0}.ui.vertical.icon.menu{display:inline-block;width:auto}.ui.icon.menu .item{height:auto;text-align:center;color:#1B1C1D}.ui.icon.menu .item>.icon:not(.dropdown){margin:0;opacity:1}.ui.icon.menu .icon:before{opacity:1}.ui.menu .icon.item>.icon{width:auto;margin:0 auto}.ui.vertical.icon.menu .item>.icon:not(.dropdown){display:block;opacity:1;margin:0 auto;float:none}.ui.inverted.icon.menu .item{color:#FFF}.ui.labeled.icon.menu{text-align:center}.ui.labeled.icon.menu .item{min-width:6em;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui.labeled.icon.menu .item>.icon:not(.dropdown){height:1em;display:block;font-size:1.71428571em!important;margin:0 auto .5rem!important}.ui.fluid.labeled.icon.menu>.item{min-width:0}@media only screen and (max-width:767px){.ui.stackable.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui.stackable.menu .item{width:100%!important}.ui.stackable.menu .item:before{position:absolute;content:'';top:auto;bottom:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.stackable.menu .left.item,.ui.stackable.menu .left.menu{margin-right:0!important}.ui.stackable.menu .right.item,.ui.stackable.menu .right.menu{margin-left:0!important}}.ui.menu .red.active.item,.ui.red.menu .active.item{border-color:#DB2828!important;color:#DB2828!important}.ui.menu .orange.active.item,.ui.orange.menu .active.item{border-color:#F2711C!important;color:#F2711C!important}.ui.menu .yellow.active.item,.ui.yellow.menu .active.item{border-color:#FBBD08!important;color:#FBBD08!important}.ui.menu .olive.active.item,.ui.olive.menu .active.item{border-color:#B5CC18!important;color:#B5CC18!important}.ui.green.menu .active.item,.ui.menu .green.active.item{border-color:#21BA45!important;color:#21BA45!important}.ui.menu .teal.active.item,.ui.teal.menu .active.item{border-color:#00B5AD!important;color:#00B5AD!important}.ui.blue.menu .active.item,.ui.menu .blue.active.item{border-color:#2185D0!important;color:#2185D0!important}.ui.menu .violet.active.item,.ui.violet.menu .active.item{border-color:#6435C9!important;color:#6435C9!important}.ui.menu .purple.active.item,.ui.purple.menu .active.item{border-color:#A333C8!important;color:#A333C8!important}.ui.menu .pink.active.item,.ui.pink.menu .active.item{border-color:#E03997!important;color:#E03997!important}.ui.brown.menu .active.item,.ui.menu .brown.active.item{border-color:#A5673F!important;color:#A5673F!important}.ui.grey.menu .active.item,.ui.menu .grey.active.item{border-color:#767676!important;color:#767676!important}.ui.inverted.menu{border:0 solid transparent;background:#1B1C1D;box-shadow:none}.ui.inverted.menu .item,.ui.inverted.menu .item>a:not(.ui){background:0 0;color:rgba(255,255,255,.9)}.ui.inverted.menu .item.menu{background:0 0}.ui.inverted.menu .item:before,.ui.vertical.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .menu .item,.ui.vertical.inverted.menu .menu .item a:not(.ui){color:rgba(255,255,255,.5)}.ui.inverted.menu .header.item{margin:0;background:0 0;box-shadow:none}.ui.inverted.menu .item.disabled,.ui.inverted.menu .item.disabled:hover{color:rgba(225,225,225,.3)}.ui.inverted.menu .dropdown.item:hover,.ui.inverted.menu .link.item:hover,.ui.inverted.menu a.item:hover,.ui.link.inverted.menu .item:hover{background:rgba(255,255,255,.08);color:#fff}.ui.vertical.inverted.menu .item .menu .link.item:hover,.ui.vertical.inverted.menu .item .menu a.item:hover{background:0 0;color:#fff}.ui.inverted.menu .link.item:active,.ui.inverted.menu a.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff!important}.ui.inverted.vertical.menu .item .menu .active.item{background:0 0;color:#FFF}.ui.inverted.pointing.menu .active.item:after{background:#3D3E3F!important;margin:0!important;box-shadow:none!important;border:none!important}.ui.inverted.menu .active.item:hover{background:rgba(255,255,255,.15);color:#FFF!important}.ui.inverted.pointing.menu .active.item:hover:after{background:#3D3E3F!important}.ui.floated.menu{float:left;margin:0 .5rem 0 0}.ui.floated.menu .item:last-child:before{display:none}.ui.right.floated.menu{float:right;margin:0 0 0 .5rem}.ui.inverted.menu .red.active.item,.ui.inverted.red.menu{background-color:#DB2828}.ui.inverted.red.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.red.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .orange.active.item,.ui.inverted.orange.menu{background-color:#F2711C}.ui.inverted.orange.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.orange.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .yellow.active.item,.ui.inverted.yellow.menu{background-color:#FBBD08}.ui.inverted.yellow.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.yellow.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .olive.active.item,.ui.inverted.olive.menu{background-color:#B5CC18}.ui.inverted.olive.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.olive.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.green.menu,.ui.inverted.menu .green.active.item{background-color:#21BA45}.ui.inverted.green.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.green.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .teal.active.item,.ui.inverted.teal.menu{background-color:#00B5AD}.ui.inverted.teal.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.teal.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.blue.menu,.ui.inverted.menu .blue.active.item{background-color:#2185D0}.ui.inverted.blue.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.blue.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .violet.active.item,.ui.inverted.violet.menu{background-color:#6435C9}.ui.inverted.violet.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.violet.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .purple.active.item,.ui.inverted.purple.menu{background-color:#A333C8}.ui.inverted.purple.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.purple.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .pink.active.item,.ui.inverted.pink.menu{background-color:#E03997}.ui.inverted.pink.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.pink.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.brown.menu,.ui.inverted.menu .brown.active.item{background-color:#A5673F}.ui.inverted.brown.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.brown.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.grey.menu,.ui.inverted.menu .grey.active.item{background-color:#767676}.ui.inverted.grey.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.grey.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.fitted.menu .item,.ui.fitted.menu .item .menu .item,.ui.menu .fitted.item{padding:0}.ui.horizontally.fitted.menu .item,.ui.horizontally.fitted.menu .item .menu .item,.ui.menu .horizontally.fitted.item{padding-top:.92857143em;padding-bottom:.92857143em}.ui.menu .vertically.fitted.item,.ui.vertically.fitted.menu .item,.ui.vertically.fitted.menu .item .menu .item{padding-left:1.14285714em;padding-right:1.14285714em}.ui.borderless.menu .item .menu .item:before,.ui.borderless.menu .item:before,.ui.menu .borderless.item:before{background:0 0!important}.ui.compact.menu{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;margin:0;vertical-align:middle}.ui.compact.vertical.menu{display:inline-block;width:auto!important}.ui.compact.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child:before{display:none}.ui.compact.vertical.menu .item:last-child::before{display:block}.ui.menu.fluid,.ui.vertical.menu.fluid{width:100%!important}.ui.item.menu,.ui.item.menu .item{width:100%;padding-left:0!important;padding-right:0!important;margin-left:0!important;margin-right:0!important;text-align:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui.item.menu .item:last-child:before{display:none}.ui.menu.two.item .item{width:50%}.ui.menu.three.item .item{width:33.333%}.ui.menu.four.item .item{width:25%}.ui.menu.five.item .item{width:20%}.ui.menu.six.item .item{width:16.666%}.ui.menu.seven.item .item{width:14.285%}.ui.menu.eight.item .item{width:12.5%}.ui.menu.nine.item .item{width:11.11%}.ui.menu.ten.item .item{width:10%}.ui.menu.eleven.item .item{width:9.09%}.ui.menu.twelve.item .item{width:8.333%}.ui.menu.fixed{position:fixed;z-index:101;margin:0;width:100%}.ui.menu.fixed,.ui.menu.fixed .item:first-child,.ui.menu.fixed .item:last-child{border-radius:0!important}.ui.fixed.menu,.ui[class*="top fixed"].menu{top:0;left:0;right:auto;bottom:auto}.ui[class*="top fixed"].menu{border-top:none;border-left:none;border-right:none}.ui[class*="right fixed"].menu{border-top:none;border-bottom:none;border-right:none;top:0;right:0;left:auto;bottom:auto;width:auto;height:100%}.ui[class*="bottom fixed"].menu{border-bottom:none;border-left:none;border-right:none;bottom:0;left:0;top:auto;right:auto}.ui[class*="left fixed"].menu{border-top:none;border-bottom:none;border-left:none;top:0;left:0;right:auto;bottom:auto;width:auto;height:100%}.ui.fixed.menu+.ui.grid{padding-top:2.75rem}.ui.pointing.menu .item:after{visibility:hidden;position:absolute;content:'';top:100%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);-ms-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);background:0 0;margin:.5px 0 0;width:.57142857em;height:.57142857em;border:none;border-bottom:1px solid #D4D4D5;border-right:1px solid #D4D4D5;z-index:2;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.vertical.pointing.menu .item:after{position:absolute;top:50%;right:0;bottom:auto;left:auto;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);-ms-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);margin:0 -.5px 0 0;border:none;border-top:1px solid #D4D4D5;border-right:1px solid #D4D4D5}.ui.pointing.menu .active.item:after{visibility:visible}.ui.pointing.menu .active.dropdown.item:after{visibility:hidden}.ui.pointing.menu .active.item .menu .active.item:after,.ui.pointing.menu .dropdown.active.item:after{display:none}.ui.pointing.menu .active.item:after,.ui.pointing.menu .active.item:hover:after,.ui.vertical.pointing.menu .active.item:after,.ui.vertical.pointing.menu .active.item:hover:after{background-color:#F2F2F2}.ui.vertical.pointing.menu .menu .active.item:after{background-color:#FFF}.ui.attached.menu{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);box-shadow:none}.ui.attached+.ui.attached.menu:not(.top){border-top:none}.ui[class*="top attached"].menu{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.menu[class*="top attached"]:first-child{margin-top:0}.ui[class*="bottom attached"].menu{bottom:0;margin-top:0;top:0;margin-bottom:1rem;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].menu:last-child{margin-bottom:0}.ui.top.attached.menu>.item:first-child{border-radius:.28571429rem 0 0}.ui.bottom.attached.menu>.item:first-child{border-radius:0 0 0 .28571429rem}.ui.attached.menu:not(.tabular){border:1px solid #D4D4D5}.ui.attached.inverted.menu{border:none}.ui.attached.tabular.menu{margin-left:0;margin-right:0;width:100%}.ui.mini.menu{font-size:.78571429rem}.ui.mini.vertical.menu{width:9rem}.ui.tiny.menu{font-size:.85714286rem}.ui.tiny.vertical.menu{width:11rem}.ui.small.menu{font-size:.92857143rem}.ui.small.vertical.menu{width:13rem}.ui.menu{font-size:1rem}.ui.vertical.menu{width:15rem}.ui.large.menu{font-size:1.07142857rem}.ui.large.vertical.menu{width:18rem}.ui.huge.menu{font-size:1.14285714rem}.ui.huge.vertical.menu{width:20rem}.ui.big.menu{font-size:1.21428571rem}.ui.big.vertical.menu{width:22rem}.ui.massive.menu{font-size:1.28571429rem}.ui.massive.vertical.menu{width:25rem} - -.semantic-ui-pagination { - .ui.menu { - position: relative; - padding: 8px 12px 8px 16px; - } - - .ui.menu .item { - justify-content: center; - } - - .ui.secondary.menu .active.item { - color: var(--brand-color); - border-radius: $border-radius; - } - - .ui.secondary.menu .item { - border-radius: $border-radius; - - &:hover { - color: var(--brand-color) !important; - } - } - - .ui.menu > .item:first-child { - display: block; - margin-right: auto; - padding: 0 !important; - } - - .ui.menu > .item:last-child { - display: block; - margin-left: auto; - margin-right: 0 !important; - padding: 0 !important; - } - - .ui.pagination { - width: 100%; - border: none; - box-shadow: none; - } -} diff --git a/app/assets/stylesheets/presentation.scss b/app/assets/stylesheets/presentation.scss deleted file mode 100644 index 196f209fc3..0000000000 --- a/app/assets/stylesheets/presentation.scss +++ /dev/null @@ -1,20 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . - -.preview-image { - width: 225px; - height: 125px; -} diff --git a/app/assets/stylesheets/profile.scss b/app/assets/stylesheets/profile.scss deleted file mode 100644 index ad8d00035e..0000000000 --- a/app/assets/stylesheets/profile.scss +++ /dev/null @@ -1,79 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . - -#profile { - - #profile-sidebar { - height: 100%; - border-right: 2px solid whitesmoke; - padding: 1rem; - } - - #delete-account { - max-width: 500px; - } - - .tab-content { - display: flex; - } - - .tab-content > .tab-pane { - display: block; - visibility: hidden; - margin-right: -100%; - width: 100%; - } - - .tab-content > .tab-pane:dir(rtl) { - margin-right: 0; - margin-left: -100%; - } - - .tab-content > .active { - visibility: visible; - } -} - -#profile-avatar { - max-width: 200px; - - .avatar-icon-circle { - top: 5px; - right: 5px; - width: 35px; - height: 35px; - color: gray; - background-color: whitesmoke; - box-shadow: 0 0 0 2px rgba(0,0,0,0.1); - - svg { - margin-top: 5px; - margin-left: 5px; - } - } -} - -#edit-user-dropdown { - &::after { - display: none; - } -} - -#updateUserFormLanguage .dropdown-menu { - max-height: 20vh; - overflow-y: auto; - background-clip: border-box; -} diff --git a/app/assets/stylesheets/recordings.scss b/app/assets/stylesheets/recordings.scss deleted file mode 100644 index ab3b27ef65..0000000000 --- a/app/assets/stylesheets/recordings.scss +++ /dev/null @@ -1,154 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . -#user-recordings { - min-height: 699px; -} - -#room-recordings { - min-height: 491px; -} - -#user-recordings, #room-recordings { - table { - border-top-right-radius: $border-radius-lg; - border-top-left-radius: $border-radius-lg; - border-spacing: 0; - border-top-width: 0 !important; - } - - tr { - border-color: whitesmoke !important; - border-right: 0 !important; - border-left: 0 !important; - } - - tbody { - tr { - &:nth-child(10):not(.no-recordings-found) { - border-bottom: 4px solid whitesmoke !important; - } - } - } - - .dropdown-item { - color: $muted; - &:hover { - color: var(--brand-color); - } - &:active { - background-color: white !important; - } - } - - .pagination-wrapper { - border: 0 !important; - } - - .no-recordings-found { - border-bottom: 0 !important; - } -} - -#room-recordings { - .search-bar { - margin-top: 1rem; - } -} - -#user-recordings { - padding-top: 0 !important; - - .search-bar { - margin-top: 3rem; - } -} - -.recordings-list, .popover-body { - .recording-icon-circle { - min-width: 40px; - min-height: 40px; - background-color: var(--brand-color-light); - } - - [class*="btn-format-"]:hover { - background-image: linear-gradient(rgb(0 0 0/5%) 0 0); - } - - .btn-format-presentation { - background-color: #f8f5fe; - color: #6941c6; - } - .btn-format-video { - background-color: #eff8ff; - color: #165dd3; - } - - .btn-format-podcast { - background-color:#eff5ff; - color: #3539cc; - } - .btn-format-statistics { - background-color:#eff5ff; - color: #3539cc; - } - .btn-format-notes { - background-color: #f3f4f6; - color: #344154; - } - .btn-format-capture { - background-color: #f3f4f6; - color: #1e81b0; - } -} - -.visibility-dropdown { - width: 150px; - height: 40px; - cursor: pointer; -} - -.recordings-count-badge { - background-color: whitesmoke !important; -} - -.recordings-icons:first-child { - .dropdown-item:hover, .dropdown-item:focus { - background-color: transparent !important; - } - - svg:hover { - color: var(--brand-color) !important; - } -} - -.simple-select { - .recording-info { - display: inline-flex; - align-items: center; - } - - .dropdown-toggle .recording-info { - visibility: hidden; - pointer-events: none; - min-width: 1.25rem; - justify-content: center; - } - - .dropdown-menu .recording-info { - visibility: visible; - pointer-events: auto; - } -} diff --git a/app/assets/stylesheets/rooms.scss b/app/assets/stylesheets/rooms.scss index efdefe7dc3..573ec5c478 100644 --- a/app/assets/stylesheets/rooms.scss +++ b/app/assets/stylesheets/rooms.scss @@ -1,136 +1,146 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . - -#room-card { - border: 2px solid transparent !important; - width: 305px; - - @include media-breakpoint-down(xxl) { - width: 261px; - } +/* 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 . +*/ + +// Place all the styles related to the Rooms controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ + +.start-button { + font-size: 26px !important; +} - @include media-breakpoint-down(xl) { - width: 216px; - } +.thumbnail { + height: 60px !important; + width: auto; +} - @include media-breakpoint-down(md) { - width: 245px; - } +.join-form { + font-size: 20px !important; +} - @include media-breakpoint-down(sm) { - min-width: 245px; - width: 100%; - } +.moderator-code-label { + margin-top: 150px !important; +} - &:hover { - box-shadow: 0 0 10px rgba(33,33,33,.2) !important; - } +.home-indicator { + font-size: 22px !important; +} - .room-icon { - width: 75px; - height: 75px; - background-color: var(--brand-color-light); - } +.btn-del-room { + width: 70% !important; +} - .card-body { - &:hover { - cursor: pointer; +.edit_hover_class a{ + visibility: hidden; +} + +.edit_hover_class:hover a { + visibility: visible; +} + +#room-settings-dropdown-label { + vertical-align: middle; + padding-top: 12px; +} + +.room-block { + &:not(.current) { + .stamp { + opacity: 0.5; } } +} - .room-card-badges { - margin-bottom: auto; - margin-left: auto; - } +#create-room-block { + border: 1px dashed lightgray; - .card-footer { - svg { - &:hover { - color: var(--brand-color) !important; - } - } + &:hover { + cursor: pointer; + background-color: rgba(0, 0, 0, 0.04); } } -.tab-content { - padding: 0%; +.allow-icon-click{ + pointer-events: auto; } +.cant-create-rooms-title{ + align-items: center; + justify-content: center; +} -.room-settings-row { - line-height: 28px; +.avatar-xxxl{ + width: 8rem; + height: 8rem; + line-height: 8rem; + max-width: 8rem; + margin-top: -6rem; + font-size: 5rem; } -#room-settings { - .access-code-input { - position: relative; - button { - position: absolute; - right: 5px; - top: 0px; - } - } +.bootstrap-select .dropdown-menu li.active small.text-muted{ + color: #9aa0ac !important } -// Room Online Badges -.participants-badge { - background-color: whitesmoke !important; - color: gray; - height: 24px; +.not-saved { + color: grey; + background: rgba(0, 40, 100, 0.12); +} - svg { - padding-bottom: 2px; - } +.dropdown-menu.show { + min-height: 0px !important; } -.online-badge { - background-color: whitesmoke !important; - height: 24px; - line-height: 18px; +.remove-shared { + text-decoration: line-through; } -.shared-badge { - background-color: whitesmoke !important; - height: 24px; - line-height: 18px; - font-weight: normal; - color: gray; +.enabled-setting { + background: lightgray; + pointer-events: none; } -.blinking-green-dot { - animation: blinker 2s linear infinite; - width: 10px; - height: 10px; - display: inline-block; - border: 1px solid green; - background-color: green; - border-radius: 100%; +#recording-table .edit_hover_class { + word-break: break-word; + white-space: normal; } -@keyframes blinker { - 50% { - opacity: 0.6; - } + +#room-owner-name { + line-height: 12px; } -#rooms-list-empty { - svg { - padding-top: 2rem; - } +.create-room-button { + width: 49%; } -#dropdown-toggle { - min-width: 2px; +#presentation-upload-label { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + padding-right: 75px; } + +#clear-room-search { + z-index: 9; + position: absolute; + right: 15px; + top: 8px; + + &:hover { + cursor: pointer; + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/sessions.scss b/app/assets/stylesheets/sessions.scss new file mode 100644 index 0000000000..3760286fc4 --- /dev/null +++ b/app/assets/stylesheets/sessions.scss @@ -0,0 +1,66 @@ +/* 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 . +*/ + +// Place all the styles related to the Sessions controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ + +.login { + .center-panel { + .center-panel-size { + max-width: 400px; + } + } +} + +a.signin-link { + &:hover, &:focus { + cursor: pointer; + text-decoration: none; + } +} + +.signin-link { + .signin-icon { + vertical-align: middle; + width: 35px; + height: 35px; + } + .signin-button { + background: white; + width: 250px; + border: thin solid #888; + border-radius: 2px; + white-space: nowrap; + padding: 5px; + margin-bottom: 14px; + } + .signin-icon-wrapper { + display: inline-block; + width: 40px; + } + .signin-text-wrapper { + display: inline-block; + width: 200px; + } + .signin-text { + vertical-align: middle; + font-size: 14px; + font-weight: bold; + color: #444; + } +} diff --git a/app/assets/stylesheets/shared_accesses.scss b/app/assets/stylesheets/shared_accesses.scss deleted file mode 100644 index 3127fa7ffd..0000000000 --- a/app/assets/stylesheets/shared_accesses.scss +++ /dev/null @@ -1,45 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . - -#shared-access-form { - .table-scrollbar-wrapper { - overflow: auto; - // Height of +/- 4 rows of users in xxl screen - max-height: 365px; - } - - input.search-bar { - width: 100%; - margin-bottom: 8px; - } -} - -#shared-access-modal { - .modal-header { - margin-left: 0 !important; - } - - // Height of Modal with 4 rows of users in xxl screen - .modal-content { - min-height: 554px; - } - - #shared-access-modal-buttons { - position: absolute; - bottom: 16px; - right: 16px; - } -} diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss new file mode 100644 index 0000000000..8d44447a74 --- /dev/null +++ b/app/assets/stylesheets/users.scss @@ -0,0 +1,32 @@ +/* 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 . +*/ + +// Place all the styles related to the Users controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ + +.user-role-tag{ + color: white !important; +} + +.shared-user { + line-height: 30px; +} + +.bootstrap-select { + border: 1px solid rgba(0, 40, 100, 0.12); +} \ No newline at end of file diff --git a/app/assets/stylesheets/utilities/_fonts.scss b/app/assets/stylesheets/utilities/_fonts.scss new file mode 100644 index 0000000000..fbab4386e2 --- /dev/null +++ b/app/assets/stylesheets/utilities/_fonts.scss @@ -0,0 +1,504 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-LightItalic.ttf')) format('truetype'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-LightItalic.ttf')) format('truetype'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-LightItalic.ttf')) format('truetype'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-LightItalic.ttf')) format('truetype'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-LightItalic.ttf')) format('truetype'); + unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-LightItalic.ttf')) format('truetype'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-LightItalic.ttf')) format('truetype'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Italic.ttf')) format('truetype'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Italic.ttf')) format('truetype'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Italic.ttf')) format('truetype'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Italic.ttf')) format('truetype'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Italic.ttf')) format('truetype'); + unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Italic.ttf')) format('truetype'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Italic.ttf')) format('truetype'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBoldItalic.ttf')) format('truetype'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBoldItalic.ttf')) format('truetype'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBoldItalic.ttf')) format('truetype'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBoldItalic.ttf')) format('truetype'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBoldItalic.ttf')) format('truetype'); + unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBoldItalic.ttf')) format('truetype'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBoldItalic.ttf')) format('truetype'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-BoldItalic.ttf')) format('truetype'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-BoldItalic.ttf')) format('truetype'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-BoldItalic.ttf')) format('truetype'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-BoldItalic.ttf')) format('truetype'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-BoldItalic.ttf')) format('truetype'); + unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-BoldItalic.ttf')) format('truetype'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-BoldItalic.ttf')) format('truetype'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Light.ttf')) format('truetype'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Light.ttf')) format('truetype'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Light.ttf')) format('truetype'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Light.ttf')) format('truetype'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Light.ttf')) format('truetype'); + unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Light.ttf')) format('truetype'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Light.ttf')) format('truetype'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Regular.ttf')) format('truetype'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Regular.ttf')) format('truetype'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Regular.ttf')) format('truetype'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Regular.ttf')) format('truetype'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Regular.ttf')) format('truetype'); + unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Regular.ttf')) format('truetype'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Regular.ttf')) format('truetype'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBold.ttf')) format('truetype'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBold.ttf')) format('truetype'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBold.ttf')) format('truetype'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBold.ttf')) format('truetype'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBold.ttf')) format('truetype'); + unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBold.ttf')) format('truetype'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-SemiBold.ttf')) format('truetype'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Bold.ttf')) format('truetype'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Bold.ttf')) format('truetype'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Bold.ttf')) format('truetype'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Bold.ttf')) format('truetype'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Bold.ttf')) format('truetype'); + unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Bold.ttf')) format('truetype'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: asset-url(font-path('SourceSansPro/SourceSansPro-Bold.ttf')) format('truetype'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/app/assets/stylesheets/utilities/_variables.scss b/app/assets/stylesheets/utilities/_variables.scss new file mode 100644 index 0000000000..700d93254b --- /dev/null +++ b/app/assets/stylesheets/utilities/_variables.scss @@ -0,0 +1,24 @@ +/* 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 . +*/ +// Declare all variables here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ +$background-color: #F5F7FB; +$error-background-color: #EFE6E6; +$button-color-blue: #467FCF; +$header-height: 65px; +$footer-height: 65px; diff --git a/app/assets/stylesheets/variables.scss b/app/assets/stylesheets/variables.scss deleted file mode 100644 index 86b9a01ed4..0000000000 --- a/app/assets/stylesheets/variables.scss +++ /dev/null @@ -1,47 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . - -$secondary: #4B4B4B; - -$border-radius-sm: 8px; -$border-radius: 8px; -$border-radius-lg: 10px; -$border-radius-pill: 8px; - -$muted: #6c757d; -$black: #212529; - -$header-height: 70px; -$footer-buffer-height: 15px; -$footer-height: 57px; - -$table-hover-bg: #F8F8F8; - -$admin-card-height: 650px; - -$button-min-width: 120px; - -$column-xs-width: 50px; -$column-sm-width: 100px; -$column-md-width: 150px; -$column-lg-width: 325px; - -$input-max-width: 300px; - -:root { - --toastify-color-error: #dc3545; - --toastify-font-family: "Inter"; -} diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb index fac15cc7cf..885480e79b 100644 --- a/app/channels/application_cable/channel.rb +++ b/app/channels/application_cable/channel.rb @@ -1,20 +1,20 @@ +# frozen_string_literal: true + # BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. # -# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +# 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. # -# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +# 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 Greenlight; if not, see . - -# frozen_string_literal: true +# with BigBlueButton; if not, see . module ApplicationCable class Channel < ActionCable::Channel::Base diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb index f31a7e9306..3f6bdad58b 100644 --- a/app/channels/application_cable/connection.rb +++ b/app/channels/application_cable/connection.rb @@ -1,20 +1,20 @@ +# frozen_string_literal: true + # BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. # -# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +# 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. # -# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +# 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 Greenlight; if not, see . - -# frozen_string_literal: true +# with BigBlueButton; if not, see . module ApplicationCable class Connection < ActionCable::Connection::Base diff --git a/app/channels/rooms_channel.rb b/app/channels/waiting_channel.rb similarity index 66% rename from app/channels/rooms_channel.rb rename to app/channels/waiting_channel.rb index c3b583e5c2..64056388ff 100644 --- a/app/channels/rooms_channel.rb +++ b/app/channels/waiting_channel.rb @@ -1,25 +1,23 @@ +# frozen_string_literal: true + # BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. # -# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +# 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. # -# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +# 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 Greenlight; if not, see . +# with BigBlueButton; if not, see . -# frozen_string_literal: true - -class RoomsChannel < ApplicationCable::Channel +class WaitingChannel < ApplicationCable::Channel def subscribed - stream_from "#{params[:friendly_id]}_rooms_channel" + stream_from "#{params[:roomuid]}_waiting_channel" end - - def unsubscribed; end end diff --git a/app/controllers/account_activations_controller.rb b/app/controllers/account_activations_controller.rb new file mode 100644 index 0000000000..7fa4f1dc11 --- /dev/null +++ b/app/controllers/account_activations_controller.rb @@ -0,0 +1,78 @@ +# 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 . + +class AccountActivationsController < ApplicationController + include Emailer + include Authenticator + + before_action :ensure_unauthenticated + before_action :find_user_by_token, only: :edit + before_action :find_user_by_digest, only: :resend + + # GET /account_activations + def show + end + + # GET /account_activations/edit + def edit + # If the user exists and is not verified and provided the correct token + if @user && !@user.activated? + # Verify user + @user.set_role(initial_user_role(@user.email)) if @user.role.nil? + @user.activate + + # Redirect user to root with account pending flash if account is still pending + return redirect_to root_path, + 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')}" } + else + redirect_to root_path, flash: { alert: I18n.t("verify.invalid") } + end + end + + # POST /account_activations/resend + def resend + if @user.activated? + # User is already verified + flash[:alert] = I18n.t("verify.already_verified") + else + # Resend + send_activation_email(@user, @user.create_activation_token) + end + + redirect_to root_path + end + + private + + def find_user_by_token + return redirect_to root_path, flash: { alert: I18n.t("verify.invalid") } unless params[:token].present? + + @user = User.find_by!(activation_digest: User.hash_token(params[:token]), provider: @user_domain) + end + + def find_user_by_digest + @user = User.find_by!(activation_digest: params[:digest], provider: @user_domain) + end + + def ensure_unauthenticated + redirect_to current_user.main_room || root_path if current_user + end +end diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb new file mode 100644 index 0000000000..ce7529993d --- /dev/null +++ b/app/controllers/admins_controller.rb @@ -0,0 +1,379 @@ +# 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 . + +class AdminsController < ApplicationController + include Pagy::Backend + include Themer + include Emailer + include Recorder + include Rolify + include Populator + + manage_users = [:edit_user, :promote, :demote, :ban_user, :unban_user, :approve, :reset, :merge_user] + manage_deleted_users = [:undelete] + authorize_resource class: false + before_action :find_user, only: manage_users + before_action :find_deleted_user, only: manage_deleted_users + before_action :verify_admin_of_user, only: [manage_users, manage_deleted_users] + + # GET /admins + def index + # Initializa the data manipulation variables + @search = params[:search] || "" + @order_column = params[:column] && params[:direction] != "none" ? params[:column] : "created_at" + @order_direction = params[:direction] && params[:direction] != "none" ? params[:direction] : "DESC" + @tab = params[:tab] || "active" + @role = params[:role] ? Role.find_by(name: params[:role], provider: @user_domain) : nil + + users = if @tab == "invited" + invited_users_list + else + manage_users_list + end + + @pagy, @users = pagy(users) + end + + # GET /admins/site_settings + def site_settings + @tab = params[:tab] || "appearance" + end + + # GET /admins/server_recordings + def server_recordings + @search = params[:search] || "" + + if @search.present? + if @search.include? "@" + user_email = @search + else + room_uid = @search + end + else + @latest = true + end + + @pagy, @recordings = pagy_array(recordings_to_show(user_email, room_uid)) + end + + # GET /admins/rooms + def server_rooms + @search = params[:search] || "" + @order_column = params[:column] && params[:direction] != "none" ? params[:column] : "status" + @order_direction = params[:direction] && params[:direction] != "none" ? params[:direction] : "DESC" + + begin + meetings = all_running_meetings[:meetings] + rescue BigBlueButton::BigBlueButtonException + flash[:alert] = I18n.t("administrator.rooms.timeout", server: I18n.t("bigbluebutton")) + meetings = [] + end + + @order_column = "created_at" if meetings.empty? + @running_room_bbb_ids = meetings.pluck(:meetingID) + + @participants_count = {} + meetings.each do |meet| + @participants_count[meet[:meetingID]] = meet[:participantCount] + end + + @pagy, @rooms = pagy_array(server_rooms_list) + end + + # GET /admins/room_configuration + def room_configuration + end + + # MANAGE USERS + + # GET /admins/edit/:user_uid + def edit_user + session[:prev_url] = request.referer if request.referer.present? + end + + # POST /admins/ban/:user_uid + def ban_user + @user.set_role :denied + + redirect_back fallback_location: admins_path, flash: { success: I18n.t("administrator.flash.banned") } + end + + # POST /admins/unban/:user_uid + def unban_user + @user.set_role :user + + redirect_back fallback_location: admins_path, flash: { success: I18n.t("administrator.flash.unbanned") } + end + + # POST /admins/approve/:user_uid + def approve + @user.set_role :user + + send_user_approved_email(@user) + + redirect_back fallback_location: admins_path, flash: { success: I18n.t("administrator.flash.approved") } + end + + # POST /admins/approve/:user_uid + def undelete + # Undelete the user and all of his rooms + @user.undelete! + @user.rooms.deleted.each(&:undelete!) + + redirect_back fallback_location: admins_path, flash: { success: I18n.t("administrator.flash.restored") } + end + + # POST /admins/invite + def invite + emails = params[:invite_user][:email].split(",") + + emails.each do |email| + invitation = create_or_update_invite(email) + + send_invitation_email(current_user.name, email, invitation) + end + + redirect_back fallback_location: admins_path, + flash: { success: I18n.t("administrator.flash.invite", email: emails.join(", ")) } + end + + # GET /admins/reset + def reset + send_password_reset_email(@user, @user.create_reset_digest) + + if session[:prev_url].present? + redirect_path = session[:prev_url] + session.delete(:prev_url) + else + redirect_path = admins_path + end + + redirect_to redirect_path, flash: { success: I18n.t("administrator.flash.reset_password") } + end + + # POST /admins/merge/:user_uid + def merge_user + begin + # Get uid of user that will be merged into the other account + uid_to_merge = params[:merge] + logger.info "#{current_user.uid} is attempting to merge #{uid_to_merge} into #{@user.uid}" + + # Check to make sure the 2 users are unique + raise "Can not merge the user into themself" if uid_to_merge == @user.uid + + # Find user to merge + user_to_merge = User.find_by(uid: uid_to_merge) + + # Move over user's rooms + user_to_merge.rooms.each do |room| + room.owner = @user + + room.name = "(#{I18n.t('merged')}) #{room.name}" + + room.save! + end + + # Reload user to update merge rooms + user_to_merge.reload + + # Delete merged user + user_to_merge.destroy(true) + rescue => e + logger.info "Failed to merge #{uid_to_merge} into #{@user.uid}: #{e}" + flash[:alert] = I18n.t("administrator.flash.merge_fail") + else + logger.info "#{current_user.uid} successfully merged #{uid_to_merge} into #{@user.uid}" + flash[:success] = I18n.t("administrator.flash.merge_success") + end + + redirect_back fallback_location: admins_path + end + + # GET /admins/merge_list + def merge_list + # Returns a list of users that can merged into another user + initial_list = User.without_role(:super_admin) + .where.not(uid: current_user.uid) + .merge_list_search(params[:search]) + + 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.pluck_to_hash(:uid, :name, :email).to_json } + end + end + + # SITE SETTINGS + + # POST /admins/update_settings + def update_settings + tab = params[:tab] || "settings" + @settings.update_value(params[:setting], params[:value]) + + flash_message = I18n.t("administrator.flash.settings") + + if params[:value] == "Default Recording Visibility" + flash_message += ". #{I18n.t('administrator.site_settings.recording_visibility.warning')}" + end + + redirect_to admin_site_settings_path(tab: tab), flash: { success: flash_message } + end + + # POST /admins/color + def coloring + @settings.update_value("Primary Color", params[:value]) + @settings.update_value("Primary Color Lighten", color_lighten(params[:value])) + @settings.update_value("Primary Color Darken", color_darken(params[:value])) + redirect_to admin_site_settings_path(tab: "appearance"), flash: { success: I18n.t("administrator.flash.settings") } + end + + # POST /admins/registration_method/:method + def registration_method + new_method = Rails.configuration.registration_methods[params[:value].to_sym] + + # Only allow change to Join by Invitation if user has emails enabled + if !Rails.configuration.enable_email_verification && new_method == Rails.configuration.registration_methods[:invite] + redirect_to admin_site_settings_path(tab: "settings"), + flash: { alert: I18n.t("administrator.flash.invite_email_verification") } + else + @settings.update_value("Registration Method", new_method) + redirect_to admin_site_settings_path(tab: "settings"), + flash: { success: I18n.t("administrator.flash.registration_method_updated") } + end + end + + # POST /admins/clear_auth + def clear_auth + User.include_deleted.where(provider: @user_domain).update_all(social_uid: nil) + + redirect_to admin_site_settings_path(tab: "settings"), flash: { success: I18n.t("administrator.flash.settings") } + end + + # POST /admins/clear_cache + def clear_cache + Rails.cache.delete("#{@user_domain}/getUser") + Rails.cache.delete("#{@user_domain}/getUserGreenlightCredentials") + + redirect_to admin_site_settings_path(tab: "settings"), flash: { success: I18n.t("administrator.flash.settings") } + end + + # POST /admins/log_level + def log_level + Rails.logger.level = params[:value].to_i + + redirect_to admin_site_settings_path(tab: "administration"), flash: { success: I18n.t("administrator.flash.settings") } + end + + # ROOM CONFIGURATION + # POST /admins/update_room_configuration + def update_room_configuration + @settings.update_value(params[:setting], params[:value]) + + flash_message = I18n.t("administrator.flash.room_configuration") + + redirect_to admin_room_configuration_path, flash: { success: flash_message } + end + + # ROLES + + # GET /admins/roles + def roles + @roles = all_roles(params[:selected_role]) + end + + # POST /admins/role + # This method creates a new role scoped to the users provider + def new_role + new_role = create_role(params[:role][:name]) + + return redirect_to admin_roles_path, flash: { alert: I18n.t("administrator.roles.invalid_create") } if new_role.nil? + + redirect_to admin_roles_path(selected_role: new_role.id) + end + + # PATCH /admin/roles/order + # This updates the priority of a site's roles + # Note: A lower priority role will always get used before a higher priority one + def change_role_order + unless update_priority(params[:role]) + redirect_to admin_roles_path, flash: { alert: I18n.t("administrator.roles.invalid_order") } + end + end + + # POST /admin/role/:role_id + # This method updates the permissions assigned to a role + def update_role + role = Role.find(params[:role_id]) + flash[:alert] = I18n.t("administrator.roles.invalid_update") unless update_permissions(role) + redirect_to admin_roles_path(selected_role: role.id) + end + + # DELETE admins/role/:role_id + # This deletes a role + def delete_role + role = Role.find(params[:role_id]) + + # Make sure no users are assigned to the role and the role isn't a reserved role + # before deleting + if role.users.count.positive? + flash[:alert] = I18n.t("administrator.roles.role_has_users", user_count: role.users.count) + return redirect_to admin_roles_path(selected_role: role.id) + elsif Role::RESERVED_ROLE_NAMES.include?(role) || role.provider != @user_domain || + role.priority <= current_user.role.priority + return redirect_to admin_roles_path(selected_role: role.id) + else + role.role_permissions.delete_all + role.delete + end + + redirect_to admin_roles_path + end + + private + + def find_user + @user = User.find_by(uid: params[:user_uid]) + end + + def find_deleted_user + @user = User.deleted.find_by(uid: params[:user_uid]) + end + + # Verifies that admin is an administrator of the user in the action + def verify_admin_of_user + redirect_to admins_path, + flash: { alert: I18n.t("administrator.flash.unauthorized") } unless current_user.admin_of?(@user, "can_manage_users") + end + + # Creates the invite if it doesn't exist, or updates the updated_at time if it does + def create_or_update_invite(email) + invite = Invitation.find_by(email: email, provider: @user_domain) + + # Invite already exists + if invite.present? + # Updates updated_at to now + invite.touch + else + # Creates invite + invite = Invitation.create(email: email, provider: @user_domain) + end + + invite + end +end diff --git a/app/controllers/api/v1/admin/invitations_controller.rb b/app/controllers/api/v1/admin/invitations_controller.rb deleted file mode 100644 index 0ecaaf4ea6..0000000000 --- a/app/controllers/api/v1/admin/invitations_controller.rb +++ /dev/null @@ -1,75 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - module Admin - class InvitationsController < ApiController - before_action do - ensure_authorized('ManageUsers') - end - - # GET /api/v1/admin/invitations - # Returns a list of all invitations that have not been "redeemed/used" - def index - sort_config = config_sorting(allowed_columns: %w[email]) - - invitations = Invitation.where(provider: current_provider)&.order(sort_config, updated_at: :desc)&.search(params[:search]) - pagy, invitations = pagy(invitations) - - render_data data: invitations, meta: pagy_metadata(pagy), status: :ok - end - - # POST /api/v1/admin/invitations - # Creates an invitation for the specified emails (comma separated) and sends them an email - def create - params[:invitations][:emails].split(',').each do |email| - invitation = Invitation.find_or_initialize_by(email: email.downcase, provider: current_provider).tap do |i| - i.updated_at = Time.zone.now - i.save! - end - - UserMailer.with( - email:, - name: current_user.name, - signup_url: root_url(inviteToken: invitation.token), - base_url: request.base_url, - provider: current_provider - ).invitation_email.deliver_later - rescue StandardError => e - logger.error "Failed to send invitation to #{email} - #{e}" - end - - render_data status: :ok - rescue StandardError => e - logger.error "Failed to send invitations to #{params[:invitations][:emails]} - #{e}" - render_error status: :bad_request - end - - def destroy - invitation = Invitation.find(params[:id]) - if invitation.destroy - render_data status: :ok - else - render_error status: :not_found - end - end - end - end - end -end diff --git a/app/controllers/api/v1/admin/role_permissions_controller.rb b/app/controllers/api/v1/admin/role_permissions_controller.rb deleted file mode 100644 index f1cf0f30ca..0000000000 --- a/app/controllers/api/v1/admin/role_permissions_controller.rb +++ /dev/null @@ -1,71 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - module Admin - class RolePermissionsController < ApiController - before_action do - ensure_authorized('ManageRoles') - end - - # GET /api/v1/admin/role_permissions - # Returns a hash of all Role Permissions - def index - roles_permissions = RolePermission.joins(:permission) - .where(role_id: params[:role_id]) - .pluck(:name, :value) - .to_h - - render_data data: roles_permissions, status: :ok - end - - # POST /api/v1/admin/role_permissions - # Updates the permission for the specified role - def update - role_permission = RolePermission.joins(:permission).find_by(role_id: role_params[:role_id], permission: { name: role_params[:name] }) - - return render_error status: :not_found unless role_permission - return render_error status: :bad_request unless role_permission.update(value: role_params[:value].to_s) - - create_default_room # Create default room if 'CreateRoom' permission is enabled - render_data status: :ok - end - - private - - def role_params - params.require(:role).permit(:role_id, :name, :value, value: []) - end - - def create_default_room - return unless role_params[:name] == 'CreateRoom' && role_params[:value] == true - - User.includes(:rooms) - .with_provider(current_provider) - .where(role_id: role_params[:role_id]) - .where(rooms: { id: nil }).find_in_batches do |group| - group.each do |user| - Room.create(name: t('room.new_room_name', username: user.name, locale: user.language), user_id: user.id) - end - end - end - end - end - end -end diff --git a/app/controllers/api/v1/admin/roles_controller.rb b/app/controllers/api/v1/admin/roles_controller.rb deleted file mode 100644 index 7c5c377c0d..0000000000 --- a/app/controllers/api/v1/admin/roles_controller.rb +++ /dev/null @@ -1,88 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - module Admin - class RolesController < ApiController - before_action :find_role, only: %i[update show destroy] - before_action only: %i[index] do - ensure_authorized(%w[ManageUsers ManageRoles]) - end - before_action except: %i[index] do - ensure_authorized('ManageRoles') - end - - # GET /api/v1/admin/roles.json - # Fetches and returns the list of roles - def index - sort_config = config_sorting(allowed_columns: %w[name]) - - roles = Role.with_provider(current_provider)&.order(sort_config)&.search(params[:search]) - - render_data data: roles, status: :ok - end - - # GET /api/v1/admin/roles/:role_id.json - # Fetches and returns a role's data - def show - render_data data: @role, status: :ok - end - - # POST /api/v1/roles.json - # Creates a role - def create - role = Role.new(name: role_params[:name], provider: current_provider) - - return render_error errors: role.errors.to_a, status: :bad_request unless role.save - - render_data status: :created - end - - # POST /api/v1/:id/roles.json - # Updates a role - def update - return render_error errors: @role.errors.to_a, status: :bad_request unless @role.update role_params - - render_data status: :ok - end - - # DELETE /api/v1/admin/roles.json - # Deletes a role - def destroy - undeletable_roles = %w[User Administrator Guest] - return render_error errors: @role.errors.to_a, status: :method_not_allowed if undeletable_roles.include?(@role.name) - - @role.destroy! - - render_data status: :ok - end - - private - - def role_params - params.require(:role).permit(:name) - end - - def find_role - @role = Role.find params[:id] - end - end - end - end -end diff --git a/app/controllers/api/v1/admin/rooms_configurations_controller.rb b/app/controllers/api/v1/admin/rooms_configurations_controller.rb deleted file mode 100644 index 16da40ebfc..0000000000 --- a/app/controllers/api/v1/admin/rooms_configurations_controller.rb +++ /dev/null @@ -1,47 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - module Admin - class RoomsConfigurationsController < ApiController - before_action do - ensure_authorized('ManageSiteSettings') - end - - # PUT /api/v1/admin/rooms_configurations/:name.json - # Update a rooms configuration value - def update - return render_error status: :bad_request unless params[:RoomsConfig] && params[:RoomsConfig][:value] - - rooms_config = RoomsConfiguration.joins(:meeting_option) - .find_by( - provider: current_provider, - meeting_option: { name: params[:name] } - ) - - return render_error status: :not_found unless rooms_config - - return render_error status: :bad_request unless rooms_config.update(value: params[:RoomsConfig][:value]) - - render_data status: :ok - end - end - end - end -end diff --git a/app/controllers/api/v1/admin/server_recordings_controller.rb b/app/controllers/api/v1/admin/server_recordings_controller.rb deleted file mode 100644 index 84c93abbc4..0000000000 --- a/app/controllers/api/v1/admin/server_recordings_controller.rb +++ /dev/null @@ -1,43 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - module Admin - class ServerRecordingsController < ApiController - before_action do - ensure_authorized('ManageRecordings') - end - - # GET /api/v1/admin/server_recordings.json - # Fetches and returns the list of all server recordings - def index - sort_config = config_sorting(allowed_columns: %w[name length visibility]) - - recordings = Recording.includes(:user) - .with_provider(current_provider) - .order(sort_config, recorded_at: :desc) - &.server_search(params[:search]) - pagy, recordings = pagy(recordings) - - render_data data: recordings, serializer: ServerRecordingSerializer, meta: pagy_metadata(pagy), status: :ok - end - end - end - end -end diff --git a/app/controllers/api/v1/admin/server_rooms_controller.rb b/app/controllers/api/v1/admin/server_rooms_controller.rb deleted file mode 100644 index f509982642..0000000000 --- a/app/controllers/api/v1/admin/server_rooms_controller.rb +++ /dev/null @@ -1,60 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - module Admin - class ServerRoomsController < ApiController - before_action do - ensure_authorized('ManageRooms') - end - - before_action :find_room, only: %i[resync] - - # GET /api/v1/admin/server_rooms.json - # Fetches a list of all server rooms - def index - sort_config = config_sorting(allowed_columns: %w[name users.name]) - - rooms = Room.includes(:user).where(users: { provider: current_provider }).order(sort_config, online: :desc) - .order('last_session DESC NULLS LAST')&.admin_search(params[:search]) - - pagy, paged_rooms = pagy(rooms) - - RunningMeetingChecker.new(rooms: paged_rooms.select(&:online)).call if paged_rooms.any?(&:online) - - render_data data: paged_rooms, meta: pagy_metadata(pagy), serializer: ServerRoomSerializer, status: :ok - end - - # GET /api/v1/admin/server_rooms/:friendly_id/resync.json - # Re-syncs a room recordings. - def resync - RecordingsSync.new(room: @room, provider: current_provider).call - - render_data status: :ok - end - - private - - def find_room - @room = Room.find_by!(friendly_id: params[:friendly_id]) - end - end - end - end -end diff --git a/app/controllers/api/v1/admin/site_settings_controller.rb b/app/controllers/api/v1/admin/site_settings_controller.rb deleted file mode 100644 index 1a7a9d608c..0000000000 --- a/app/controllers/api/v1/admin/site_settings_controller.rb +++ /dev/null @@ -1,74 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - module Admin - class SiteSettingsController < ApiController - before_action do - ensure_authorized('ManageSiteSettings') - end - - # GET /api/v1/admin/site_settings.json - # Returns a list of all site settings - def index - site_settings = Setting.joins(:site_settings) - .where(name: params[:names], site_settings: { provider: current_provider }) - .pluck(:name, :value) - .to_h - - render_data data: site_settings, status: :ok - end - - # PATCH /api/v1/admin/site_settings/:name.json - # Updates the value of the specified Site Setting - def update - site_setting = SiteSetting.joins(:setting) - .find_by( - provider: current_provider, - setting: { name: params[:name] } - ) - return render_error status: :not_found unless site_setting - - update = if params[:name] == 'BrandingImage' - site_setting.image.attach params[:site_setting][:value] - else - site_setting.update(value: params[:site_setting][:value].to_s) - end - - return render_error status: :bad_request, errors: site_setting.errors.to_a unless update - - render_data status: :ok - end - - # DELETE /api/v1/admin/site_settings/purge_branding_image.json - # Removes the custom branding image back to bbb default - def purge_branding_image - site_setting = SiteSetting.joins(:setting) - .find_by( - provider: current_provider, - setting: { name: 'BrandingImage' } - ) - site_setting.image.purge - - render_data status: :ok - end - end - end - end -end diff --git a/app/controllers/api/v1/admin/tenants_controller.rb b/app/controllers/api/v1/admin/tenants_controller.rb deleted file mode 100644 index bcb516d461..0000000000 --- a/app/controllers/api/v1/admin/tenants_controller.rb +++ /dev/null @@ -1,85 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - module Admin - class TenantsController < ApiController - before_action do - ensure_super_admin - end - - # GET /api/v1/admin/tenants - def index - sort_config = config_sorting(allowed_columns: %w[name]) - - tenants = Tenant.order(sort_config, created_at: :desc)&.search(params[:search]) - - pagy, tenants = pagy(tenants) - - render_data data: tenants, meta: pagy_metadata(pagy), status: :ok - end - - # POST /api/v1/admin/tenants - def create - name = tenant_params[:name] - tenant = Tenant.new(name:, client_secret: tenant_params[:client_secret]) - - if tenant.save - TenantSetup.new(name).call - render_data status: :created - else - render_error errors: tenant.errors.to_a, status: :bad_request - end - end - - # DELETE /api/v1/admin/tenants/:id - def destroy - tenant = Tenant.find(params[:id]) - - if tenant.destroy - delete_roles(tenant.name) - delete_site_settings(tenant.name) - delete_rooms_configs_options(tenant.name) - render_data status: :ok - else - render_error errors: tenant.errors.to_a, status: :bad_request - end - end - - def cache; end - - def delete_roles(provider) - Role.where(provider:).destroy_all - end - - def delete_site_settings(provider) - SiteSetting.where(provider:).destroy_all - end - - def delete_rooms_configs_options(provider) - RoomsConfiguration.where(provider:).destroy_all - end - - def tenant_params - params.require(:tenant).permit(:name, :client_secret) - end - end - end - end -end diff --git a/app/controllers/api/v1/admin/users_controller.rb b/app/controllers/api/v1/admin/users_controller.rb deleted file mode 100644 index 10b9484056..0000000000 --- a/app/controllers/api/v1/admin/users_controller.rb +++ /dev/null @@ -1,108 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - module Admin - class UsersController < ApiController - before_action do - ensure_authorized('ManageUsers') - end - - # GET /api/v1/admin/users/:id.json - # Updates the specified user's status - def update - user = User.find(params[:id]) - initial_status = user.status - - if user.update(user_params) - user.generate_session_token! if user.status == 'banned' && initial_status == 'active' - render_data status: :ok - else - render_error errors: user.errors.to_a - end - end - - # GET /api/v1/admin/users/pending.json - # Fetches the list of all users in the pending state - def pending - pending_users = User.includes(:role) - .with_provider(current_provider) - .where(status: 'pending') - .order(created_at: :desc) - .search(params[:search]) - - pagy, pending_users = pagy(pending_users) - - render_data data: pending_users, meta: pagy_metadata(pagy), serializer: UserSerializer, status: :ok - end - - # GET /api/v1/admin/users/verified.json - # Fetches all verified users - def verified - sort_config = config_sorting(allowed_columns: %w[name roles.name]) - - users = User.includes(:role) - .with_provider(current_provider) - .where(status: 'active', verified: true) - .with_attached_avatar - .order(sort_config, created_at: :desc)&.search(params[:search]) - - pagy, users = pagy(users) - - render_data data: users, meta: pagy_metadata(pagy), serializer: UserSerializer, status: :ok - end - - # GET /api/v1/admin/users/unverified.json - # Fetches all unverified users - def unverified - sort_config = config_sorting(allowed_columns: %w[name roles.name]) - - users = User.includes(:role) - .with_provider(current_provider) - .where(verified: false) - .order(sort_config, created_at: :desc)&.search(params[:search]) - - pagy, users = pagy(users) - - render_data data: users, meta: pagy_metadata(pagy), serializer: UserSerializer, status: :ok - end - - # GET /api/v1/admin/users/banned.json - # Fetches all banned users - def banned - users = User.includes(:role) - .with_provider(current_provider) - .with_attached_avatar - .where(status: :banned) - .order(created_at: :desc)&.search(params[:search]) - - pagy, users = pagy(users) - - render_data data: users, meta: pagy_metadata(pagy), serializer: UserSerializer, status: :ok - end - - private - - def user_params - params.require(:user).permit(:status, :verified) - end - end - end - end -end diff --git a/app/controllers/api/v1/api_controller.rb b/app/controllers/api/v1/api_controller.rb deleted file mode 100644 index 0ebbe53fa1..0000000000 --- a/app/controllers/api/v1/api_controller.rb +++ /dev/null @@ -1,100 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class ApiController < ApplicationController - include Authorizable - - serialization_scope :view_context - before_action :ensure_valid_request, :ensure_authenticated - - # For requests that raised an unkown exception. - # Note: The order of each rescue is important (The highest has the lowest priority). - rescue_from StandardError do |exception| - log_exception exception - render_error errors: [Rails.configuration.custom_error_msgs[:server_error]], status: :internal_server_error - end - - rescue_from ActionController::ParameterMissing do |exception| - log_exception exception - render_error errors: [Rails.configuration.custom_error_msgs[:missing_params]], status: :bad_request - end - - rescue_from ActiveRecord::RecordNotFound do |exception| - log_exception exception - render_error errors: [Rails.configuration.custom_error_msgs[:record_not_found]], status: :not_found - end - - # TODO: amir - Better Error handling. - - def log_exception(exception) - logger.error exception.message - logger.error exception.backtrace.join("\n") # TODO: amir - Revisit this. - end - - def render_data(status:, serializer: nil, data: {}, meta: {}, options: {}) - # Manually add the data root if passing in a simple (non-serialized) object - data = { data: } if data.is_a?(Hash) || data.is_a?(String) || data.is_a?(Integer) || [true, false].include?(data) - - args = { - json: data, - root: 'data', - status:, - meta:, - options: - } - - if serializer.present? && (data.is_a?(Array) || data.is_a?(ActiveRecord::Relation)) - args[:each_serializer] = serializer - else - args[:serializer] = serializer - end - - render args - end - - def render_error(data: nil, errors: [], status: :bad_request) - render json: { - data:, - errors: - }.compact, status: - end - - def config_sorting(allowed_columns: []) - return {} unless params.key?(:sort) - - allowed_directions = %w[ASC DESC] - - sort_column = params[:sort][:column] - sort_direction = params[:sort][:direction] - - return {} unless allowed_columns.include?(sort_column) && allowed_directions.include?(sort_direction) - - { sort_column => sort_direction } - end - - # Checks if external authentication is enabled (currently only OIDC is implemented) - def external_auth? - return ENV['OPENID_CONNECT_ISSUER'].present? if ENV['LOADBALANCER_ENDPOINT'].blank? - - !Tenant.exists?(name: current_provider, client_secret: 'local') - end - end - end -end diff --git a/app/controllers/api/v1/env_controller.rb b/app/controllers/api/v1/env_controller.rb deleted file mode 100644 index 4982b208e0..0000000000 --- a/app/controllers/api/v1/env_controller.rb +++ /dev/null @@ -1,37 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class EnvController < ApiController - skip_before_action :ensure_authenticated - - # GET /api/v1/env - # Returns basic NON-CONFIDENTIAL information on the environment variables - def index - render_data data: { - EXTERNAL_AUTH: external_auth?, - HCAPTCHA_KEY: ENV.fetch('HCAPTCHA_SITE_KEY', nil), - VERSION_TAG: ENV.fetch('VERSION_TAG', ''), - CURRENT_PROVIDER: current_provider, - SMTP_ENABLED: ENV.fetch('SMTP_SERVER', nil) - }, status: :ok - end - end - end -end diff --git a/app/controllers/api/v1/locales_controller.rb b/app/controllers/api/v1/locales_controller.rb deleted file mode 100644 index f86af3b2eb..0000000000 --- a/app/controllers/api/v1/locales_controller.rb +++ /dev/null @@ -1,63 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class LocalesController < ApiController - skip_before_action :ensure_authenticated, only: :show - skip_before_action :ensure_valid_request, only: :show - - # GET /api/v1/locales - # Returns a cached list of locales available - def index - language_with_name = Rails.cache.fetch('v3/locales/list', expires_in: 24.hours) do - language_hash = {} - - languages = Dir.entries(Rails.root.join('app/assets/locales')).select { |file_name| file_name.ends_with?('.json') } - language_list = I18n::Language::Mapping.language_mapping_list - - languages.each do |lang| - language = lang.split('.').first.tr('_', '-') - native_name = language_list.dig(language, 'nativeName') - - language_hash[language] = native_name if native_name.present? - end - - language_hash - end - - render_data data: language_with_name, status: :ok - end - - # GET /api/v1/locales/:name - # Returns the requested language's locale strings (returns 406 if locale doesn't exist) - def show - language = params[:name].tr('-', '_') - language_file = Dir.entries('app/assets/locales').select { |f| f.starts_with?(language) } - final_language = language_file.min&.gsub('.json', '') - - # Serve locales files directly in development (not through asset pipeline) - return render file: Rails.root.join('app', 'assets', 'locales', "#{final_language}.json") if Rails.env.development? - - redirect_to ActionController::Base.helpers.asset_path("#{final_language}.json") - rescue StandardError - head :not_acceptable - end - end - end -end diff --git a/app/controllers/api/v1/meetings_controller.rb b/app/controllers/api/v1/meetings_controller.rb deleted file mode 100644 index a0dddd6657..0000000000 --- a/app/controllers/api/v1/meetings_controller.rb +++ /dev/null @@ -1,167 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class MeetingsController < ApiController - before_action :find_room, only: %i[start status running] - skip_before_action :ensure_authenticated, only: %i[status] - before_action only: %i[start running] do - ensure_authorized(%w[ManageRooms SharedRoom], friendly_id: params[:friendly_id]) - end - - # POST /api/v1/meetings/:friendly_id/start.json - # Starts a BigBlueButton meetings and joins in the meeting starter - def start - begin - MeetingStarter.new(room: @room, base_url: request.base_url, current_user:, provider: current_provider).call - rescue BigBlueButton::BigBlueButtonException => e - return render_error status: :bad_request, errors: e.key unless e.key == 'idNotUnique' - end - - render_data data: BigBlueButtonApi.new(provider: current_provider).join_meeting( - room: @room, - name: current_user.name, - user_id: fetch_bbb_user_id, - avatar_url: current_user.avatar.attached? ? url_for(current_user.avatar) : nil, - role: 'Moderator' - ), status: :created - end - - # POST /api/v1/meetings/:friendly_id/status.json - # Checks if the meeting is running and either returns that value, or starts the meeting (if glAnyoneCanStart) - # then joins the meeting starter into the BigBlueButton meeting - def status - settings = RoomSettingsGetter.new( - room_id: @room.id, - provider: current_provider, - current_user:, - show_codes: true, - settings: %w[glRequireAuthentication glViewerAccessCode glModeratorAccessCode glAnyoneCanStart glAnyoneJoinAsModerator] - ).call - - return render_error status: :unauthorized if unauthorized_access?(settings) - - bbb_role = infer_bbb_role(mod_code: settings['glModeratorAccessCode'], - viewer_code: settings['glViewerAccessCode'], - anyone_join_as_mod: settings['glAnyoneJoinAsModerator'] == 'true') - - return render_error status: :forbidden if bbb_role.nil? - - data = { - status: BigBlueButtonApi.new(provider: current_provider).meeting_running?(room: @room) - } - - # Starts meeting if meeting is not running and glAnyoneCanStart is enabled or user is a moderator - if !data[:status] && authorized_to_start_meeting?(settings) - begin - MeetingStarter.new(room: @room, base_url: request.base_url, current_user:, provider: current_provider).call - rescue BigBlueButton::BigBlueButtonException => e - return render_error status: :bad_request unless e.key == 'idNotUnique' - end - - data[:status] = true - end - - if data[:status] - data[:joinUrl] = BigBlueButtonApi.new(provider: current_provider).join_meeting( - room: @room, - name: current_user ? current_user.name : params[:name], - user_id: fetch_bbb_user_id, - avatar_url: current_user&.avatar&.attached? ? url_for(current_user.avatar) : nil, - role: bbb_role - ) - end - - render_data data:, status: :ok - end - - # GET /api/v1/meetings/:friendly_id/running.json - # Returns whether the meeting is running in BigBlueButton or not - def running - render_data data: BigBlueButtonApi.new(provider: current_provider).meeting_running?(room: @room), status: :ok - end - - private - - def find_room - @room = Room.find_by!(friendly_id: params[:friendly_id]) - end - - def authorized_as_viewer?(viewer_code:) - return true if viewer_code.blank? && params[:access_code].blank? - - access_code_validator(access_code: viewer_code) - end - - # Five scenarios where a user is authorized to join a BBB meeting as a moderator: - # The user joins - # 1. its own room - # 2. a shared room - # 3. a room that requires a moderator access code and the access code input is correct - # 4. a room that has the AnyoneJoinAsModerator setting enabled and does not require an access code - # 5. a room that has the AnyoneJoinAsModerator setting enabled and requires a moderator or a viewer access code - # and the access code input correspond to either - def authorized_as_moderator?(mod_code:, viewer_code:, anyone_join_as_mod:) - @room.user_id == current_user&.id || - current_user&.shared_rooms&.include?(@room) || - access_code_validator(access_code: mod_code) || - (anyone_join_as_mod && viewer_code.blank? && mod_code.blank?) || - (anyone_join_as_mod && (access_code_validator(access_code: mod_code) || access_code_validator(access_code: viewer_code))) - end - - def authorized_to_start_meeting?(settings) - settings['glAnyoneCanStart'] == 'true' || - @room.user_id == current_user&.id || - current_user&.shared_rooms&.include?(@room) || - access_code_validator(access_code: settings['glModeratorAccessCode']) - end - - def unauthorized_access?(settings) - !current_user && settings['glRequireAuthentication'] == 'true' - end - - def access_code_validator(access_code:) - access_code.present? && params[:access_code].present? && access_code == params[:access_code] - end - - def infer_bbb_role(mod_code:, viewer_code:, anyone_join_as_mod:) - if authorized_as_moderator?(mod_code:, viewer_code:, anyone_join_as_mod:) - 'Moderator' - elsif authorized_as_viewer?(viewer_code:) && !anyone_join_as_mod - 'Viewer' - end - end - - def fetch_bbb_user_id - return "gl-#{current_user.id}" if current_user - - return cookies[:guest_id] if cookies[:guest_id].present? - - guest_id = "gl-guest-#{SecureRandom.hex(12)}" - - cookies[:guest_id] = { - value: guest_id, - expires: 1.day.from_now - } - - guest_id - end - end - end -end diff --git a/app/controllers/api/v1/migrations/external_controller.rb b/app/controllers/api/v1/migrations/external_controller.rb deleted file mode 100644 index 23d15c6e7f..0000000000 --- a/app/controllers/api/v1/migrations/external_controller.rb +++ /dev/null @@ -1,273 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - module Migrations - class ExternalController < ApiController - include ClientRoutable - - CHARS = { - degits: [*'0'..'9'], - lower_letters: [*'a'..'z'], - upper_letters: [*'A'..'Z'], - symbols: [*' '..'/', *'{'..'~'] - }.freeze - - skip_before_action :verify_authenticity_token - skip_before_action :ensure_authenticated - - rescue_from ActiveSupport::MessageEncryptor::InvalidMessage do |exception| - log_exception exception - render_error errors: [Rails.configuration.custom_error_msgs[:missing_params]], status: :bad_request - end - - # POST /api/v1/migrations/roles.json - # Expects: - # { role: { :name, - # role_permissions: { :CreateRoom, :CanRecord, :ManageUsers, :ManageRoles, :ManageRooms, :ManageRecordings, :ManageSiteSettings }}} - # Returns: { data: Array[serializable objects(recordings)] , errors: Array[String] } - # Does: Creates a role. - def create_role - role_hash = role_params.to_h - - # Returns an error if the provider does not exist - unless role_hash[:provider] == 'greenlight' || Tenant.exists?(name: role_hash[:provider]) - return render_error(status: :bad_request, errors: 'Provider does not exist') - end - - # Returns created if the Role exists and the RolePermissions have default values - if Role.exists?(name: role_hash[:name], provider: role_hash[:provider]) && role_hash[:role_permissions].empty? - return render_data status: :created - end - - role = Role.find_or_initialize_by(name: role_hash[:name], provider: role_hash[:provider]) - - return render_error(status: :bad_request, errors: role&.errors&.to_a) unless role.save - - # Finds all the RolePermissions that need to be updated - role_permissions_joined = RolePermission.includes(:permission) - .where(role_id: role.id, 'permissions.name': role_hash[:role_permissions].keys) - - okay = true - role_permissions_joined.each do |role_permission| - permission_name = role_permission.permission.name - okay = false unless role_permission.update(value: role_hash[:role_permissions][permission_name]) - end - - return render_error status: :bad_request, errors: 'Something went wrong when migrating the role permissions.' unless okay - - render_data status: :created - end - - # POST /api/v1/migrations/users.json - # Expects: { user: { :name, :email, :password_digest, :provider, :external_id, :language, :role } } - # Returns: { data: Array[serializable objects] , errors: Array[String] } - # Does: Creates a user. - def create_user - user_hash = user_params.to_h - - # Re-write LDAP and Google to greenlight - user_hash[:provider] = %w[greenlight ldap google openid_connect].include?(user_hash[:provider]) ? 'greenlight' : user_hash[:provider] - - # Returns an error if the provider does not exist - unless user_hash[:provider] == 'greenlight' || Tenant.exists?(name: user_hash[:provider]) - return render_error(status: :bad_request, errors: 'Provider does not exist') - end - - return render_data status: :created if User.exists?(email: user_hash[:email].downcase, provider: user_hash[:provider]) - - user_hash[:language] = I18n.default_locale if user_hash[:language].blank? || user_hash[:language] == 'default' - - role = Role.find_by(name: user_hash[:role], provider: user_hash[:provider]) - - return render_error(status: :bad_request, errors: 'The user role does not exist.') unless role - - user_hash[:password] = generate_secure_pwd if user_hash[:external_id].blank? - - user = User.new(user_hash.merge(verified: true, role:)) - - return render_error(status: :bad_request, errors: user&.errors&.to_a) unless user.save - - user.password_digest = user_hash[:provider] == 'greenlight' ? user_hash[:password_digest] : nil - user.save(validations: false) - - render_data status: :created - end - - # POST /api/v1/migrations/rooms.json - # Expects: { room: { :name, :friendly_id, :meeting_id, :last_session, :owner_email, - # room_settings: { :record, :muteOnStart, :glAnyoneCanStart, :glAnyoneJoinAsModerator, :guestPolicy }, - # shared_users_emails: [ ] }} - # Returns: { data: Array[serializable objects] , errors: Array[String] } - # Does: Creates a Room and its RoomMeetingOptions. - def create_room - room_hash = room_params.to_h - - # Re-write LDAP and Google to greenlight - room_hash[:provider] = %w[greenlight ldap google openid_connect].include?(room_hash[:provider]) ? 'greenlight' : room_hash[:provider] - - unless room_hash[:provider] == 'greenlight' || Tenant.exists?(name: room_hash[:provider]) - return render_error(status: :bad_request, errors: 'Provider does not exist') - end - - user = User.find_by(email: room_hash[:owner_email], provider: room_hash[:provider]) - - return render_error(status: :bad_request, errors: 'The room owner does not exist.') unless user - - room = if Room.exists?(friendly_id: room_hash[:friendly_id]) - Room.find_by(friendly_id: room_hash[:friendly_id]) - else - Room.new(room_hash.except(:owner_email, :provider, :room_settings, :shared_users_emails, :presentation).merge({ user: })) - end - - # Redefines the validations method to do nothing - # rubocop:disable Lint/EmptyBlock - room.define_singleton_method(:set_friendly_id) {} - room.define_singleton_method(:set_meeting_id) {} - # rubocop:enable Lint/EmptyBlock - - if room_hash[:presentation] - attachment_blob_io = StringIO.new(Base64.decode64(room_hash[:presentation][:blob])) - attachment = ActiveStorage::Blob.create_and_upload!(io: attachment_blob_io, filename: room_hash[:presentation][:filename]) - room.presentation.attach(attachment) - end - - return render_error(status: :bad_request, errors: room&.errors&.to_a) unless room.save - - if room_hash[:room_settings].any? - # Finds all the RoomMeetingOptions that need to be updated - room_meeting_options_joined = RoomMeetingOption.includes(:meeting_option) - .where(room_id: room.id, 'meeting_options.name': room_hash[:room_settings].keys) - - return render_error status: :bad_request, errors: 'Something went wrong when migrating the room settings.' unless - room_meeting_options_joined.collect { |o| o.update(value: room_hash[:room_settings][o.meeting_option.name]) }.all? - end - - return render_data status: :created unless room_hash[:shared_users_emails].any? - - # Finds all the users that have a SharedAccess to the Room - shared_with_users = User.where(email: room_hash[:shared_users_emails], provider: room_hash[:provider]) - - return render_error status: :bad_request, errors: 'Something went wrong when sharing the room.' unless - shared_with_users.collect { |u| SharedAccess.new(room_id: room.id, user_id: u.id).save }.all? - - render_data status: :created - end - - # POST /api/v1/migrations/site_settings.json - # Expects: { settings: { site_settings: { :PrimaryColor, :PrimaryColorLight, :PrimaryColorDark, - # :Terms, :PrivacyPolicy, :RegistrationMethod, :ShareRooms, :PreuploadPresentation }, - # rooms_configurations: { :record, :muteOnStart, :guestPolicy, :glAnyoneCanStart, - # :glAnyoneJoinAsModerator, :glRequireAuthentication } } } - # Returns: { data: Array[serializable objects] , errors: Array[String] } - # Does: Creates a SiteSettings or a RoomsConfiguration. - def create_settings - settings_hash = settings_params.to_h - - unless settings_hash[:provider] == 'greenlight' || Tenant.exists?(name: settings_hash[:provider]) - return render_error(status: :bad_request, errors: 'Provider does not exist') - end - - render_data status: :created unless settings_hash.any? - - # Finds all the SiteSettings that need to be updated - site_settings_joined = SiteSetting.joins(:setting) - .where('settings.name': settings_hash[:site_settings].keys, provider: settings_hash[:provider]) - - okay = true - site_settings_joined.each do |site_setting| - site_setting_name = site_setting.setting.name - okay = false unless site_setting.update(value: settings_hash[:site_settings][site_setting_name]) - end - - return render_error status: :bad_request, errors: 'Something went wrong when migrating site settings.' unless okay - - # Finds all the RoomsConfiguration that need to be updated - rooms_configurations_joined = RoomsConfiguration.joins(:meeting_option) - .where('meeting_options.name': settings_hash[:rooms_configurations].keys, - provider: settings_hash[:provider]) - - okay = true - rooms_configurations_joined.each do |rooms_configuration| - rooms_configuration_name = rooms_configuration.meeting_option.name - okay = false unless rooms_configuration.update(value: settings_hash[:rooms_configurations][rooms_configuration_name]) - end - - return render_error status: :bad_request, errors: 'Something went wrong when migrating room configurations.' unless okay - - render_data status: :created - end - - private - - def role_params - decrypted_params.require(:role).permit(:name, - :provider, - role_permissions: %w[CreateRoom CanRecord ManageUsers ManageRoles ManageRooms ManageRecordings - ManageSiteSettings]) - end - - def user_params - decrypted_params.require(:user).permit(:name, :email, :password_digest, :provider, :external_id, :language, :role, :created_at) - end - - def room_params - decrypted_params.require(:room).permit(:name, :friendly_id, :meeting_id, :last_session, :owner_email, :provider, - shared_users_emails: [], - room_settings: %w[record muteOnStart guestPolicy glAnyoneCanStart glAnyoneJoinAsModerator - glViewerAccessCode glModeratorAccessCode], - presentation: %w[blob filename]) - end - - def settings_params - decrypted_params.require(:settings).permit(:provider, - site_settings: %w[PrimaryColor PrimaryColorLight Terms PrivacyPolicy RegistrationMethod - ShareRooms PreloadPresentation], - rooms_configurations: %w[record muteOnStart guestPolicy glAnyoneCanStart glAnyoneJoinAsModerator - glRequireAuthentication]) - end - - def decrypted_params - return @decrypted_params unless @decrypted_params.nil? - - encrypted_params = params.require(:v2).require(:encrypted_params) - - raise ActiveSupport::MessageEncryptor::InvalidMessage unless encrypted_params.is_a? String - - crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secret_key_base[0..31], cipher: 'aes-256-gcm', serializer: Marshal) - decrypted_params = crypt.decrypt_and_verify(encrypted_params) || {} - - raise ActiveSupport::MessageEncryptor::InvalidMessage unless decrypted_params.is_a? Hash - - @decrypted_params = ActionController::Parameters.new(decrypted_params) - end - - def generate_secure_pwd - base = SecureRandom.alphanumeric(22) - extra = [ - CHARS[:degits].sample(random: SecureRandom), CHARS[:symbols].sample(random: SecureRandom), - CHARS[:lower_letters].sample(random: SecureRandom), CHARS[:upper_letters].sample(random: SecureRandom) - ].shuffle(random: SecureRandom) - - base[0..5] + extra.first + base[6..11] + extra.second + base[12..17] + extra.third + base[18..21] + extra.fourth - end - end - end - end -end diff --git a/app/controllers/api/v1/recordings_controller.rb b/app/controllers/api/v1/recordings_controller.rb deleted file mode 100644 index 37a664022e..0000000000 --- a/app/controllers/api/v1/recordings_controller.rb +++ /dev/null @@ -1,129 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class RecordingsController < ApiController - skip_before_action :ensure_authenticated, only: :recording_url - - before_action :find_recording, only: %i[update update_visibility recording_url] - before_action only: %i[destroy] do - ensure_authorized('ManageRecordings', record_id: params[:id]) - end - before_action only: %i[update update_visibility recording_url] do - ensure_authorized(%w[ManageRecordings SharedRoom PublicRecordings], record_id: params[:id]) - end - - # GET /api/v1/recordings.json - # Returns all of the current_user's recordings - def index - sort_config = config_sorting(allowed_columns: %w[name length visibility]) - - pagy, recordings = pagy(current_user.recordings&.order(sort_config, recorded_at: :desc)&.search(params[:search]), items: 5) - render_data data: recordings, meta: pagy_metadata(pagy), status: :ok - end - - # PUT/PATCH /api/v1/recordings/:id.json - # Updates a recording's name in both BigBlueButton and Greenlight - def update - new_name = recording_params[:name] - return render_error errors: [Rails.configuration.custom_error_msgs[:missing_params]] if new_name.blank? - - BigBlueButtonApi.new(provider: current_provider).update_recordings record_id: @recording.record_id, meta_hash: { meta_name: new_name } - @recording.update! name: new_name - - render_data data: @recording, status: :ok - end - - # DELETE /api/v1/recordings/:id.json - # Deletes a recording in both BigBlueButton and Greenlight - def destroy - Recording.destroy_by(record_id: params[:id]) - - render_data status: :ok - end - - # POST /api/v1/recordings/update_visibility.json - # Update's a recordings visibility by setting publish/unpublish and protected/unprotected - def update_visibility - new_visibility = params[:visibility].to_s - - allowed_visibilities = JSON.parse(RolePermission.joins(:permission) - .find_by(role_id: current_user.role_id, permission: { name: 'AccessToVisibilities' }) - .value) - - return render_error status: :forbidden unless allowed_visibilities.include?(new_visibility) - - protected_visibilities = [Recording::VISIBILITIES[:protected], Recording::VISIBILITIES[:public_protected]] - return render_error status: :forbidden if protected_visibilities.include?(new_visibility) && !@recording.protectable - - BigBlueButtonApi.new(provider: current_provider).update_recording_visibility(record_id: @recording.record_id, visibility: new_visibility) - - @recording.update!(visibility: new_visibility) - - render_data status: :ok - end - - # GET /api/v1/recordings/recordings_count.json - # Returns the total number of recordings for the current_user - def recordings_count - count = current_user.recordings.count - render_data data: count, status: :ok - end - - # POST /api/v1/recordings/recording_url.json - def recording_url - record_format = params[:recording_format] - - urls = if [Recording::VISIBILITIES[:protected], Recording::VISIBILITIES[:public_protected]].include? @recording.visibility - recording = BigBlueButtonApi.new(provider: current_provider).get_recording(record_id: @recording.record_id) - formats = recording[:playback][:format] - formats = [formats] unless formats.is_a? Array - - if record_format.present? - found_format = formats.find { |format| format[:type] == record_format } - return render_error status: :not_found unless found_format - - found_format[:url] - else - formats.pluck(:url) - end - elsif record_format.present? - found_format = @recording.formats.find_by(recording_type: record_format) - return render_error status: :not_found unless found_format - - found_format[:url] - else - @recording.formats.pluck(:url) - end - - render_data data: urls, status: :ok - end - - private - - def recording_params - params.require(:recording).permit(:name) - end - - def find_recording - @recording = Recording.find_by! record_id: params[:id] - end - end - end -end diff --git a/app/controllers/api/v1/reset_password_controller.rb b/app/controllers/api/v1/reset_password_controller.rb deleted file mode 100644 index 2384fd832d..0000000000 --- a/app/controllers/api/v1/reset_password_controller.rb +++ /dev/null @@ -1,83 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class ResetPasswordController < ApiController - include ClientRoutable - - before_action :verify_reset_request, only: %i[reset verify] - skip_before_action :ensure_authenticated, only: %i[create reset verify] - - # POST /api/v1/reset_password.json - # Creates a unique token, saves its digest to the user and emails it - def create - # TODO: Log events. - return render_error unless params[:user] - - user = User.find_by email: params[:user][:email].downcase, provider: current_provider - - # Silently fail for unfound or external users. - return render_data status: :ok unless user && !user.external_id? - - token = user.generate_reset_token! - - UserMailer.with(user:, - reset_url: reset_password_url(token), base_url: request.base_url, - provider: current_provider).reset_password_email.deliver_later - - render_data status: :ok - end - - # POST /api/v1/reset_password/reset.json - # Validates the token and resets the user's password - def reset - new_password = params[:user][:new_password] - - return render_error status: :bad_request if new_password.blank? - - # Invalidating token and changing the password. - # TODO: Amir - optimise this. - return render_error status: :internal_server_error unless @user.invalidate_reset_token - - @user.update! password: new_password - - render_data status: :ok - end - - # POST /api/v1/reset_password/verify.json - # Validates the token - def verify - render_data status: :ok - end - - private - - def verify_reset_request - return render_error status: :bad_request if params[:user].blank? - - token = params[:user][:token] - - return render_error status: :bad_request if token.blank? - - @user = User.verify_reset_token(token) - render_error status: :forbidden unless @user - end - end - end -end diff --git a/app/controllers/api/v1/room_settings_controller.rb b/app/controllers/api/v1/room_settings_controller.rb deleted file mode 100644 index c696de52b6..0000000000 --- a/app/controllers/api/v1/room_settings_controller.rb +++ /dev/null @@ -1,85 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class RoomSettingsController < ApiController - before_action :find_room, only: %i[show update] - - before_action only: %i[show update] do - ensure_authorized(%w[ManageRooms SharedRoom], friendly_id: params[:friendly_id]) - end - - # GET /api/v1/room_settings/:friendly_id - # Returns all room settings including the access codes but without those disabled through room configs - def show - options = RoomSettingsGetter.new(room_id: @room.id, provider: current_provider, current_user:, show_codes: true, - only_enabled: true).call - - render_data data: options, status: :ok - end - - # PATCH /api/v1/room_settings/:friendly_id - # Updates a room's settings if the room config is set to optional or default - def update - name = room_setting_params[:settingName] - value = room_setting_params[:settingValue].to_s - - config = MeetingOption.get_config_value(name:, provider: current_provider) - config_value = config[name] - - return render_error status: :bad_request unless config_value - - is_access_code = %w[glViewerAccessCode glModeratorAccessCode].include? name - - # Only allow the settings to update if the room config is default or optional / if it is an access_code regeneration - unless %w[optional default_enabled].include?(config_value) || (config_value == 'true' && is_access_code && value != 'false') - return render_error status: :forbidden - end - - value = infer_access_code(value:) if is_access_code # Handling access code update. - - option = @room.get_setting(name:) - - return render_error status: :bad_request unless option&.update(value:) - - render_data status: :ok - end - - private - - def find_room - @room = Room.find_by!(friendly_id: params[:friendly_id]) - end - - def room_setting_params - params.require(:room_setting).permit(:settingValue, :settingName) - end - - def infer_access_code(value:) - # Access code update logic maps 'false' -> removing a code & -> generating a code. - value == 'false' ? '' : generate_code - end - - # TODO: Amir - Check if we could extract all GL3 codes generation into a service. - def generate_code - SecureRandom.alphanumeric(6).downcase - end - end - end -end diff --git a/app/controllers/api/v1/rooms_configurations_controller.rb b/app/controllers/api/v1/rooms_configurations_controller.rb deleted file mode 100644 index 10266f5c9c..0000000000 --- a/app/controllers/api/v1/rooms_configurations_controller.rb +++ /dev/null @@ -1,53 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class RoomsConfigurationsController < ApiController - before_action only: %i[index] do - ensure_authorized(%w[CreateRoom ManageSiteSettings ManageRoles ManageRooms], friendly_id: params[:friendly_id]) - end - skip_before_action :ensure_authenticated, only: %i[show] - - # GET /api/v1/rooms_configurations.json - # Fetches and returns all rooms configurations. - def index - rooms_configs = MeetingOption.joins(:rooms_configurations) - .where(rooms_configurations: { provider: current_provider }) - .pluck(:name, :value) - .to_h - - render_data data: rooms_configs, status: :ok - end - - # GET /api/v1/rooms_configurations/:name.json - # Fetches and returns the value of the passed in configuration - def show - config_value = RoomsConfiguration.joins(:meeting_option) - .find_by( - provider: current_provider, - meeting_option: { name: params[:name] } - ).value - - render_data data: config_value, status: :ok - rescue StandardError - render_error status: :not_found unless config_value - end - end - end -end diff --git a/app/controllers/api/v1/rooms_controller.rb b/app/controllers/api/v1/rooms_controller.rb deleted file mode 100644 index d777f1334f..0000000000 --- a/app/controllers/api/v1/rooms_controller.rb +++ /dev/null @@ -1,167 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class RoomsController < ApiController - skip_before_action :ensure_authenticated, only: %i[public_show public_recordings] - - before_action :find_room, only: %i[show update destroy recordings recordings_processing purge_presentation public_show public_recordings] - - before_action only: %i[create] do - ensure_authorized('CreateRoom') - end - before_action only: %i[create] do - ensure_authorized('ManageUsers', user_id: room_params[:user_id]) - end - before_action only: %i[show update recordings recordings_processing purge_presentation] do - ensure_authorized(%w[ManageRooms SharedRoom], friendly_id: params[:friendly_id]) - end - before_action only: %i[destroy] do - ensure_authorized('ManageRooms', friendly_id: params[:friendly_id]) - end - - # GET /api/v1/rooms.json - # Returns a list of the current_user's rooms and shared rooms - def index - shared_rooms = SharedAccess.where(user_id: current_user.id).select(:room_id) - rooms = Room.includes(:user) - .where(user_id: current_user.id) - .or(Room.where(id: shared_rooms)) - .order(online: :desc) - .order('last_session DESC NULLS LAST') - .search(params[:search]) - - rooms.map do |room| - room.shared = true if room.user_id != current_user.id - end - - RunningMeetingChecker.new(rooms: rooms.select(&:online)).call if rooms.any?(&:online) - - render_data data: rooms, status: :ok - end - - # GET /api/v1/rooms/:friendly_id.json - # Returns the info on a specific room - def show - RunningMeetingChecker.new(rooms: @room).call if @room.online - - @room.shared = current_user.shared_rooms.include?(@room) - - render_data data: @room, serializer: CurrentRoomSerializer, status: :ok - end - - # GET /api/v1/rooms/:friendly_id/public.json - # Returns all publicly available information required for a room to be joined - def public_show - settings = RoomSettingsGetter.new( - room_id: @room.id, - provider: current_provider, - current_user:, - show_codes: false, - settings: %w[glRequireAuthentication glViewerAccessCode glModeratorAccessCode record glAnyoneJoinAsModerator] - ).call - - render_data data: @room, serializer: PublicRoomSerializer, options: { settings: }, status: :ok - end - - # POST /api/v1/rooms.json - # Creates a room for the specified user if they are allowed to - def create - return render_error status: :bad_request, errors: Rails.configuration.custom_error_msgs[:room_limit] unless PermissionsChecker.new( - permission_names: 'RoomLimit', - user_id: room_params[:user_id], current_user:, current_provider: - ).call - - # TODO: amir - ensure accessibility for authenticated requests only. - # The created room will be the current user's unless a user_id param is provided with the request. - room = Room.new(name: room_params[:name], user_id: room_params[:user_id]) - - if room.save - logger.info "room(friendly_id):#{room.friendly_id} created for user(id):#{room.user_id}" - render_data data: "/rooms/#{room.friendly_id}", status: :created - else - render_error errors: room.errors.to_a, status: :bad_request - end - end - - # PATCH /api/v1/rooms/:friendly_id.json - # Updates the values of the specified room - def update - if @room.update(room_params.except(:user_id)) - render_data status: :ok - else - render_error errors: @room.errors.to_a, status: :bad_request - end - end - - # DELETE /api/v1/rooms.json - # Updates the specified room - def destroy - if @room.destroy - render_data status: :ok - else - render_error errors: @room.errors.to_a, status: :bad_request - end - end - - # DELETE /api/v1/rooms/${friendlyId}/purge_presentation.json - # Removes the presentation attached to the room - def purge_presentation - @room.presentation.purge - - render_data status: :ok - end - - # GET /api/v1/rooms/:friendly_id/recordings.json - # Returns all of a specific room's recordings - def recordings - sort_config = config_sorting(allowed_columns: %w[name length visibility]) - - pagy, room_recordings = pagy(@room.recordings&.order(sort_config, recorded_at: :desc)&.search(params[:search]), items: 3) - render_data data: room_recordings, meta: pagy_metadata(pagy), status: :ok - end - - # GET /api/v1/rooms/:friendly_id/public_recordings.json - # Returns all of a specific room's PUBLIC recordings - def public_recordings - sort_config = config_sorting(allowed_columns: %w[name length]) - - pagy, recordings = pagy(@room.public_recordings.order(sort_config, recorded_at: :desc).public_search(params[:search])) - - render_data data: recordings, meta: pagy_metadata(pagy), serializer: PublicRecordingSerializer, status: :ok - end - - # GET /api/v1/rooms/:friendly_id/recordings_processing.json - # Returns the total number of processing recordings for a specific room - def recordings_processing - render_data data: @room.recordings_processing, status: :ok - end - - private - - def find_room - @room = Room.find_by!(friendly_id: params[:friendly_id]) - end - - def room_params - params.require(:room).permit(:name, :user_id, :presentation) - end - end - end -end diff --git a/app/controllers/api/v1/server_tags_controller.rb b/app/controllers/api/v1/server_tags_controller.rb deleted file mode 100644 index 7de92b0d92..0000000000 --- a/app/controllers/api/v1/server_tags_controller.rb +++ /dev/null @@ -1,43 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class ServerTagsController < ApiController - # GET /api/v1/server_tags/:friendly_id - # Returns a list of all allowed tags&names for the room's owner - def show - tag_names = Rails.configuration.server_tag_names - tag_roles = Rails.configuration.server_tag_roles - return render_data data: {}, status: :ok if tag_names.blank? - - room = Room.find_by(friendly_id: params[:friendly_id]) - return render_data data: {}, status: :ok if room.nil? - - allowed_tag_names = tag_names.reject { |tag, _| tag_roles.key?(tag) && tag_roles[tag].exclude?(room.user.role_id) } - render_data data: allowed_tag_names, status: :ok - end - - # GET /api/v1/server_tags/fallback_mode.json - # Returns global tag fallback mode (user config or global desired/required) - def fallback_mode - render_data data: Rails.configuration.server_tag_fallback_mode, status: :ok - end - end - end -end diff --git a/app/controllers/api/v1/sessions_controller.rb b/app/controllers/api/v1/sessions_controller.rb deleted file mode 100644 index 213f986881..0000000000 --- a/app/controllers/api/v1/sessions_controller.rb +++ /dev/null @@ -1,128 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class SessionsController < ApiController - skip_before_action :ensure_authenticated, only: %i[index create] - before_action :ensure_unauthenticated, only: :create - - # GET /api/v1/sessions - # Returns the current_user - def index - return render_data data: current_user, serializer: CurrentUserSerializer, status: :ok if current_user - - render_data data: { signed_in: false, default_locale: ENV.fetch('DEFAULT_LOCALE', nil) }, status: :ok - end - - # POST /api/v1/sessions - # Signs a user in and updates the session cookie - def create - if hcaptcha_enabled? && !verify_hcaptcha(response: params[:token]) - return render_error errors: Rails.configuration.custom_error_msgs[:hcaptcha_invalid] - end - - # Search for a user within the current provider and, if not found, search for a super admin within bn provider - user = User.find_by(email: session_params[:email].downcase, provider: current_provider) || - User.find_by(email: session_params[:email].downcase, provider: 'bn') - - # Return an error if the user is not found - return render_error if user.blank? - - # Will return an error if the user is NOT from the current provider and if the user is NOT a super admin - return render_error status: :forbidden if !user.super_admin? && (user.provider != current_provider || external_auth?) - - # Password is not set (local user migrated from v2) - if user.external_id.blank? && user.password_digest.blank? - token = user.generate_reset_token! - return render_error data: token, errors: 'PasswordNotSet' - end - - if user.authenticate(session_params[:password]) - return render_error data: user.id, errors: Rails.configuration.custom_error_msgs[:unverified_user] unless user.verified? - return render_error errors: Rails.configuration.custom_error_msgs[:pending_user] if user.pending? - return render_error errors: Rails.configuration.custom_error_msgs[:banned_user] if user.banned? - - sign_in user - render_data data: current_user, serializer: CurrentUserSerializer, status: :ok - else - render_error - end - end - - # DELETE /api/v1/sessions/signout - # Clears the session cookie and signs the user out - def destroy - id_token = session.delete(:oidc_id_token) - logout_path = ENV.fetch('OPENID_CONNECT_LOGOUT_PATH', '') - - # Make logout request to OIDC - if logout_path.present? && id_token.present? && external_auth? - issuer_url = if ENV.fetch('LOADBALANCER_ENDPOINT', nil).present? - File.join(ENV.fetch('OPENID_CONNECT_ISSUER'), "/#{current_provider}") - else - ENV.fetch('OPENID_CONNECT_ISSUER') - end - - end_session = File.join(issuer_url, logout_path) - - url = "#{end_session}?client_id=#{ENV.fetch('OPENID_CONNECT_CLIENT_ID', nil)}" \ - "&id_token_hint=#{id_token}" \ - "&post_logout_redirect_uri=#{CGI.escape(root_url(success: 'LogoutSuccessful'))}" - - sign_out - render_data data: url, status: :ok - else - sign_out - render_data status: :ok - end - end - - private - - def session_params - params.require(:session).permit(:email, :password, :extend_session) - end - - def sign_in(user) - user.generate_session_token!(extended_session: session_params[:extend_session]) - user.update(last_login: DateTime.now) - - # Creates an extended_session cookie if extend_session is selected in sign in form. - if session_params[:extend_session] - cookies.encrypted[:_extended_session] = { - value: { - session_token: user.session_token - }, - expires: 7.days, - httponly: true, - secure: true - } - end - - session[:session_token] = user.session_token - end - - def sign_out - current_user.generate_session_token! - session[:session_token] = nil - cookies.delete :_extended_session - end - end - end -end diff --git a/app/controllers/api/v1/shared_accesses_controller.rb b/app/controllers/api/v1/shared_accesses_controller.rb deleted file mode 100644 index c8260bd0bd..0000000000 --- a/app/controllers/api/v1/shared_accesses_controller.rb +++ /dev/null @@ -1,92 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class SharedAccessesController < ApiController - before_action :find_room - - before_action only: %i[create destroy shareable_users] do - ensure_authorized('ManageRooms', friendly_id: params[:friendly_id]) - end - before_action only: %i[show unshare_room] do - ensure_authorized(%w[ManageRooms SharedRoom], friendly_id: params[:friendly_id]) - end - - # GET /api/v1/shared_accesses/:friendly_id.json - # Returns a list of all of the room's shared users - def show - render_data data: @room.shared_users.search(params[:search]), serializer: SharedAccessSerializer, status: :ok - end - - # POST /api/v1/shared_accesses.json - # Shares the room with all of the specified users - def create - shared_users_ids = Array(params[:shared_users]) - # Only allow sharing with users of current tenant - filtered_ids = User.with_provider(current_provider).where(id: shared_users_ids).pluck(:id) - - filtered_ids.each do |shared_user_id| - SharedAccess.create(user_id: shared_user_id, room_id: @room.id) - end - - render_data status: :ok - end - - # DELETE /api/v1/shared_accesses/friendly_id.json - # Unshares a room with the specified user - def destroy - SharedAccess.delete_by(user_id: params[:user_id], room_id: @room.id) - - render_data status: :ok - end - - # DELETE /api/v1/shared_accesses/friendly_id.json - # Similar to the destroy action - # Unshares a room that is shared with the current user as a the current user - def unshare_room - SharedAccess.delete_by(user_id: current_user.id, room_id: @room.id) - - render_data status: :ok - end - - # GET /api/v1/shared_accesses/friendly_id/shareable_users.json - # Returns a list of users with whom a room can be shared with (based on role permissions) - def shareable_users - return render_data data: [], status: :ok unless params[:search].present? && params[:search].length >= 3 - - # role_id of roles that have SharedList permission set to true - role_ids = RolePermission.joins(:permission).where(permission: { name: 'SharedList' }).where(value: 'true').pluck(:role_id) - - # Can't share the room if it's already shared or it's the room owner - shareable_users = User.with_attached_avatar - .with_provider(current_provider) - .where.not(id: [@room.shared_users.pluck(:id) << @room.user_id]) - .where(role_id: [role_ids]) - .shared_access_search(params[:search]) - render_data data: shareable_users, serializer: SharedAccessSerializer, status: :ok - end - - private - - def find_room - @room = Room.find_by(friendly_id: params[:friendly_id]) - end - end - end -end diff --git a/app/controllers/api/v1/site_settings_controller.rb b/app/controllers/api/v1/site_settings_controller.rb deleted file mode 100644 index ecbd947284..0000000000 --- a/app/controllers/api/v1/site_settings_controller.rb +++ /dev/null @@ -1,44 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class SiteSettingsController < ApiController - skip_before_action :ensure_authenticated, only: :index - FORBIDDEN_SETTINGS = %w[RoleMapping ResyncOnLogin DefaultRole].freeze # Should not be accessible to the frontend - - # GET /api/v1/site_settings - # Returns the values of 1 or multiple site_settings that are not forbidden to access - def index - return render_error status: :forbidden if forbidden_settings(params[:names]) - - settings = SettingGetter.new(setting_name: params[:names], provider: current_provider).call - - render_data data: settings, status: :ok - end - - private - - # Prevents front-end from accessing sensitive site settings - def forbidden_settings(names) - # Check if the 2 arrays have any values in common - !!Array(names).intersect?(FORBIDDEN_SETTINGS) - end - end - end -end diff --git a/app/controllers/api/v1/users_controller.rb b/app/controllers/api/v1/users_controller.rb deleted file mode 100644 index d17ebc3834..0000000000 --- a/app/controllers/api/v1/users_controller.rb +++ /dev/null @@ -1,204 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class UsersController < ApiController - include ClientRoutable - - skip_before_action :ensure_authenticated, only: %i[create] - - before_action except: %i[create change_password] do - ensure_authorized('ManageUsers', user_id: params[:id]) - end - - # GET /api/v1/users/:id.json - # Returns the details of a specific user - def show - user = User.find(params[:id]) - - render_data data: user, status: :ok - end - - # POST /api/v1/users.json - # Creates and saves a new user record in the database with the provided parameters - def create - return render_error status: :forbidden if external_auth? - - # Check if this is an admin creating a user - admin_create = current_user && PermissionsChecker.new(current_user:, permission_names: 'ManageUsers', current_provider:).call - - # Allow only administrative access for authenticated requests - return render_error status: :forbidden if current_user && !admin_create - - registration_method = SettingGetter.new(setting_name: 'RegistrationMethod', provider: current_provider).call - - if registration_method == SiteSetting::REGISTRATION_METHODS[:invite] && !valid_invite_token && !admin_create - return render_error errors: Rails.configuration.custom_error_msgs[:invite_token_invalid] - end - - if !admin_create && hcaptcha_enabled? && !verify_hcaptcha(response: params[:token]) - return render_error errors: Rails.configuration.custom_error_msgs[:hcaptcha_invalid] - end - - # Users created by a user will have the creator language by default with a fallback to the server configured default_locale. - create_user_params[:language] = current_user&.language || I18n.default_locale if create_user_params[:language].blank? - - # renders an error if the user is signing up with an invalid domain based off site settings - return render_error errors: Rails.configuration.custom_error_msgs[:banned_user], status: :forbidden unless valid_domain? - - user = UserCreator.new(user_params: create_user_params.except(:invite_token), provider: current_provider, role: default_role).call - - smtp_enabled = ENV['SMTP_SERVER'].present? - - user.verify! unless smtp_enabled - - # Set to pending if registration method is approval - user.pending! if !admin_create && registration_method == SiteSetting::REGISTRATION_METHODS[:approval] - - if user.save - if smtp_enabled - token = user.generate_activation_token! - UserMailer.with(user:, - activation_url: activate_account_url(token), base_url: request.base_url, - provider: current_provider).activate_account_email.deliver_later - - UserMailer.with(user:, admin_panel_url:, base_url: request.base_url, provider: current_provider).new_user_signup_email.deliver_later - end - - create_default_room(user) - - return render_data data: user, serializer: CurrentUserSerializer, status: :created unless user.verified? - - user.generate_session_token! - session[:session_token] = user.session_token unless admin_create # if this is NOT an admin creating a user - - render_data data: user, serializer: CurrentUserSerializer, status: :created - elsif user.errors.size == 1 && user.errors.of_kind?(:email, :taken) - render_error errors: Rails.configuration.custom_error_msgs[:email_exists], status: :bad_request - else - render_error errors: Rails.configuration.custom_error_msgs[:record_invalid], status: :bad_request - end - end - - # PATCH /api/v1/users/:id.json - # Updates the values of a user - def update - user = User.find(params[:id]) - - # User can't change their own role - if params[:user][:role_id].present? && current_user == user && params[:user][:role_id] != user.role_id - return render_error errors: Rails.configuration.custom_error_msgs[:unauthorized], status: :forbidden - end - - original_avatar = params['user']['original_avatar'] - if ENV.fetch('CLAMAV_SCANNING', 'false') == 'true' && original_avatar.present? && !Clamby.safe?(original_avatar.tempfile.path) - user.errors.add(:avatar, 'MalwareDetected') - return render_error errors: user.errors.to_a - end - - if user.update(update_user_params) - create_default_room(user) - render_data status: :ok - else - render_error errors: user.errors.to_a - end - end - - # DELETE /api/v1/users/:id.json - # Deletes a user - def destroy - user = User.find(params[:id]) - if user.destroy - render_data status: :ok - else - render_error errors: Rails.configuration.custom_error_msgs[:record_invalid] - end - end - - # DELETE /api/v1/users/:id/purge_avatar.json - # Removes the avatar attached to the user - def purge_avatar - user = User.find(params[:id]) - user.avatar.purge - - render_data status: :ok - end - - # POST /api/v1/users/change_password.json - # Validates and change the user's password - def change_password - return render_error status: :forbidden if current_user.external_id? - - old_password = change_password_params[:old_password] - new_password = change_password_params[:new_password] - - return render_error status: :bad_request if new_password.blank? || old_password.blank? - - unless current_user.authenticate old_password - return render_error status: :bad_request, - errors: Rails.configuration.custom_error_msgs[:incorrect_old_password] - end - - current_user.update! password: new_password - render_data status: :ok - end - - private - - def create_user_params - @create_user_params ||= params.require(:user).permit(:name, :email, :password, :avatar, :language, :invite_token) - end - - def update_user_params - @update_user_params ||= params.require(:user).permit(permitted_params) - end - - def change_password_params - params.require(:user).permit(:old_password, :new_password) - end - - def valid_invite_token - return false if create_user_params[:invite_token].blank? - - # Try to delete the invitation and return true if it succeeds - Invitation.destroy_by(email: create_user_params[:email].downcase, provider: current_provider, - token: create_user_params[:invite_token]).present? - end - - def valid_domain? - allowed_domains_emails = SettingGetter.new(setting_name: 'AllowedDomains', provider: current_provider).call - return true if allowed_domains_emails.blank? - - domains = allowed_domains_emails.split(',') - domains.each do |domain| - return true if create_user_params[:email].end_with?(domain) - end - false - end - - def permitted_params - is_admin = PermissionsChecker.new(current_user:, permission_names: 'ManageUsers', current_provider:).call - - return %i[password avatar language role_id invite_token] if external_auth? && !is_admin - - %i[name password avatar language role_id invite_token] - end - end - end -end diff --git a/app/controllers/api/v1/verify_account_controller.rb b/app/controllers/api/v1/verify_account_controller.rb deleted file mode 100644 index 876eb3014d..0000000000 --- a/app/controllers/api/v1/verify_account_controller.rb +++ /dev/null @@ -1,68 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Api - module V1 - class VerifyAccountController < ApiController - include ClientRoutable - - skip_before_action :ensure_authenticated, only: %i[create activate] - before_action :find_user_and_authorize, only: :create - - # POST /api/v1/verify_account.json - # Creates a unique token, saves its digest to the user and emails it - def create - token = @user.generate_activation_token! - - UserMailer.with(user: @user, activation_url: activate_account_url(token), - base_url: request.base_url, provider: current_provider).activate_account_email.deliver_later - - render_data status: :ok - end - - # POST /api/v1/verify_account/activate.json - # Validates the token and activates the account - def activate - return render_error status: :bad_request if params[:user].blank? - - token = params[:user][:token] - - return render_error status: :bad_request if token.blank? - - user = User.verify_activation_token(token) - return render_error status: :forbidden unless user - - # TODO: Amir - optimise this. - return render_error status: :internal_server_error unless user.invalidate_activation_token - - user.verify! - - render_data status: :ok - end - - private - - def find_user_and_authorize - return render_error status: :bad_request unless params[:user] - - @user = User.find_by id: params[:user][:id], provider: current_provider - render_data status: :ok unless @user && !@user.verified? - end - end - end -end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 9cb854771a..cfdd66c8b7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,93 +1,311 @@ +# frozen_string_literal: true + # BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. # -# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +# 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. # -# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +# 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 Greenlight; if not, see . - -# frozen_string_literal: true +# with BigBlueButton; if not, see . class ApplicationController < ActionController::Base - include Pagy::Backend + include BbbServer + include Errors + + before_action :block_unknown_hosts, :redirect_to_https, :set_user_domain, :set_user_settings, :maintenance_mode?, + :migration_error?, :user_locale, :check_admin_password, :check_user_role - # Returns the current signed in User (if any) + protect_from_forgery with: :exceptions + + # Retrieves the current user. def current_user - return @current_user if @current_user + @current_user ||= User.includes(:role, :main_room).find_by(id: session[:user_id]) + + if Rails.configuration.loadbalanced_configuration && (@current_user && !@current_user.has_role?(:super_admin) && + @current_user.provider != @user_domain) + @current_user = nil + session.clear + end + + @current_user + end + helper_method :current_user + + def bbb_server + @bbb_server ||= Rails.configuration.loadbalanced_configuration ? bbb(@user_domain) : bbb("greenlight") + end + + # Block unknown hosts to mitigate host header injection attacks + def block_unknown_hosts + return if Rails.configuration.hosts.blank? + raise UnsafeHostError, "#{request.host} is not a safe host" unless Rails.configuration.hosts.include?(request.host) + end + + # Force SSL + def redirect_to_https + if Rails.configuration.loadbalanced_configuration && request.headers["X-Forwarded-Proto"] == "http" + redirect_to protocol: "https://" + end + end + + # Sets the user domain variable + def set_user_domain + if Rails.env.test? || !Rails.configuration.loadbalanced_configuration + @user_domain = "greenlight" + else + @user_domain = parse_user_domain(request.host) + + check_provider_exists + end + end + + # Sets the settinfs variable + def set_user_settings + @settings = Setting.includes(:features).find_or_create_by(provider: @user_domain) + end + + # Redirects the user to a Maintenance page if turned on + def maintenance_mode? + if ENV["MAINTENANCE_MODE"] == "true" + render "errors/greenlight_error", status: 503, formats: :html, + locals: { + status_code: 503, + message: I18n.t("errors.maintenance.message"), + help: I18n.t("errors.maintenance.help"), + } + end + + maintenance_string = @settings.get_value("Maintenance Banner").presence || Rails.configuration.maintenance_window + if maintenance_string.present? && cookies[:maintenance_window] != maintenance_string + flash.now[:maintenance] = maintenance_string + end + end + + # Show an information page when migration fails and there is a version error. + def migration_error? + 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' + user.language + else + Rails.configuration.default_locale.presence || http_accept_language.language_region_compatible_from(I18n.available_locales) + end + + begin + I18n.locale = locale.tr('-', '_') unless locale.nil? + rescue + # Default to English if there are any issues in language + logger.error("Support: User locale is not supported (#{locale}") + I18n.locale = "en" + end + end + + # Checks to make sure that the admin has changed his password from the default + def check_admin_password + if current_user&.has_role?(:admin) && current_user.email == "admin@example.com" && + current_user&.greenlight_account? && current_user&.authenticate(Rails.configuration.admin_password_default) + + flash.now[:alert] = I18n.t("default_admin", + edit_link: change_password_path(user_uid: current_user.uid)).html_safe + end + end + + # Checks if the user is banned and logs him out if he is + def check_user_role + if current_user&.has_role? :denied + session.delete(:user_id) + redirect_to root_path, flash: { alert: I18n.t("registration.banned.fail") } + elsif current_user&.has_role? :pending + session.delete(:user_id) + redirect_to root_path, flash: { alert: I18n.t("registration.approval.fail") } + end + end + + # Relative root helper (when deploying to subdirectory). + def relative_root + Rails.configuration.relative_url_root || "" + end + helper_method :relative_root + + # Determines if the BigBlueButton endpoint is configured (or set to default). + def bigbluebutton_endpoint_default? + return false if Rails.configuration.loadbalanced_configuration + Rails.configuration.bigbluebutton_endpoint_default == Rails.configuration.bigbluebutton_endpoint + end + helper_method :bigbluebutton_endpoint_default? - # Overwrites the session cookie if an extended_session cookie exists - session[:session_token] ||= cookies.encrypted[:_extended_session]['session_token'] if cookies.encrypted[:_extended_session].present? + def allow_greenlight_accounts? + return Rails.configuration.allow_user_signup unless Rails.configuration.loadbalanced_configuration + return false unless @user_domain && !@user_domain.empty? && Rails.configuration.allow_user_signup + return false if @user_domain == "greenlight" + # Proceed with retrieving the provider info + begin + provider_info = retrieve_provider_info(@user_domain, 'api2', 'getUserGreenlightCredentials') + provider_info['provider'] == 'greenlight' + rescue => e + logger.error "Error in checking if greenlight accounts are allowed: #{e}" + false + end + end + helper_method :allow_greenlight_accounts? - user = User.find_by(session_token: session[:session_token]) + # Determine if Greenlight is configured to allow user signups. + def allow_user_signup? + Rails.configuration.allow_user_signup + end + helper_method :allow_user_signup? - if user && invalid_session?(user) - session[:session_token] = nil - cookies.delete :_extended_session - return nil + # Gets all configured omniauth providers. + def configured_providers + Rails.configuration.providers.select do |provider| + Rails.configuration.send("omniauth_#{provider}") end + end + helper_method :configured_providers - @current_user = user + # Indicates whether users are allowed to share rooms + def shared_access_allowed + @settings.get_value("Shared Access") == "true" end + helper_method :shared_access_allowed - # Returns whether hcaptcha is enabled by checking if ENV variables are set - def hcaptcha_enabled? - ENV['HCAPTCHA_SITE_KEY'].present? && ENV['HCAPTCHA_SECRET_KEY'].present? + # Indicates whether users are allowed to share rooms + def recording_consent_required? + @settings.get_value("Require Recording Consent") == "true" end + helper_method :recording_consent_required? - # Returns the current provider value - def current_provider - @current_provider ||= if ENV['LOADBALANCER_ENDPOINT'].present? - parse_user_domain(request.host) - else - 'greenlight' - end + # 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 :current_provider + helper_method :moderator_code_allowed? - # Returns the default role - def default_role - default_role_setting = SettingGetter.new(setting_name: 'DefaultRole', provider: current_provider).call - @default_role = Role.find_by(name: default_role_setting, provider: current_provider) || Role.find_by(name: 'User', provider: current_provider) + # Returns a list of allowed file types + def allowed_file_types + Rails.configuration.allowed_file_types end + helper_method :allowed_file_types - # Creates the default room for the user if they don't already have one - def create_default_room(user) - return unless user.rooms.count <= 0 - return unless PermissionsChecker.new(permission_names: 'CreateRoom', user_id: user.id, current_user: user, current_provider:).call + # Allows admins to edit a user's details + def can_edit_user?(user_to_edit, editting_user) + return user_to_edit.greenlight_account? if user_to_edit == editting_user - Room.create(name: t('room.new_room_name', username: user.name, locale: user.language), user_id: user.id) + editting_user.admin_of?(user_to_edit, "can_manage_users") + end + helper_method :can_edit_user? + + # Returns the page that the logo redirects to when clicked on + def home_page + return admins_path if current_user.has_role? :super_admin + return current_user.main_room if current_user.role.get_permission("can_create_rooms") + cant_create_rooms_path + end + helper_method :home_page + + # Parses the url for the user domain + def parse_user_domain(hostname) + return hostname.split('.').first if Rails.configuration.url_host.empty? + Rails.configuration.url_host.split(',').each do |url_host| + return hostname.chomp(url_host).chomp('.') if hostname.include?(url_host) + end + '' end # Include user domain in lograge logs def append_info_to_payload(payload) super - payload[:host] = @current_provider + payload[:host] = @user_domain end - private + # Manually handle BigBlueButton errors + rescue_from BigBlueButton::BigBlueButtonException do |ex| + logger.error "BigBlueButtonException: #{ex}" + render "errors/bigbluebutton_error" + end + + # Manually deal with 401 errors + rescue_from CanCan::AccessDenied do |_exception| + if current_user + render "errors/greenlight_error" + else + # Store the current url as a cookie to redirect to after sigining in + cookies[:return_to] = request.url - # Checks if the user's session_token matches the session and that it is not expired - def invalid_session?(user) - return true if user&.session_token != session[:session_token] - return true if user&.session_expiry && DateTime.now > user&.session_expiry - return true if !user.super_admin? && user.provider != current_provider + # Get the correct signin path + path = if allow_greenlight_accounts? + signin_path + elsif Rails.configuration.loadbalanced_configuration + "#{Rails.configuration.relative_url_root}/auth/bn_launcher" + else + signin_path + end - false + redirect_to path + end end - # Parses the url for the user domain - def parse_user_domain(hostname) - tenant = hostname&.split('.')&.first - raise 'Invalid domain' unless Tenant.exists?(name: tenant) + private + + def check_provider_exists + # Checks to see if the user exists + begin + # Check if the session has already checked that the user exists + # and return true if they did for this domain + return if session[:provider_exists] == @user_domain + + retrieve_provider_info(@user_domain, 'api2', 'getUserGreenlightCredentials') + + # Add a session variable if the provider exists + session[:provider_exists] = @user_domain + rescue => e + logger.error "Error in retrieve provider info: #{e}" + @hide_signin = true + 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") } + 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") } + when "That user has no configured provider." + if Setting.exists?(provider: @user_domain) + # Keep the branding + @settings = Setting.find_by(provider: @user_domain) + else + set_default_settings + end + + render "errors/greenlight_error", locals: { status_code: 501, + message: I18n.t("errors.no_provider.message"), + help: I18n.t("errors.no_provider.help") } + else + set_default_settings + + render "errors/greenlight_error", locals: { status_code: 500, message: I18n.t("errors.internal.message"), + help: I18n.t("errors.internal.help"), display_back: true } + end + end + end - tenant + def set_default_settings + # Use the default site settings + @user_domain = "greenlight" + @settings = Setting.find_or_create_by(provider: @user_domain) end end diff --git a/app/controllers/concerns/authenticator.rb b/app/controllers/concerns/authenticator.rb new file mode 100644 index 0000000000..10b1eee6e3 --- /dev/null +++ b/app/controllers/concerns/authenticator.rb @@ -0,0 +1,130 @@ +# 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 . + +module Authenticator + extend ActiveSupport::Concern + + # Logs a user into GreenLight. + def login(user) + migrate_twitter_user(user) + + session[:user_id] = user.id + user.update(last_login: Time.zone.now) + + logger.info("Support: #{user.email} has successfully logged in.") + + # If there are not terms, or the user has accepted them, check for email verification + if !Rails.configuration.terms || user.accepted_terms + check_email_verified(user) + else + redirect_to terms_path + end + end + + # If email verification is disabled, or the user has verified, go to their room + def check_email_verified(user) + # Admin users should be redirected to the admin page + if user.has_role? :super_admin + redirect_to admins_path + elsif user.activated? + # 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") + user.main_room + else + cant_create_rooms_path + end + + # Delete the cookie if it exists + cookies.delete :return_to if cookies[:return_to] + + redirect_to url + else + session[:user_id] = nil + user.create_activation_token + redirect_to account_activation_path(digest: user.activation_digest) + end + end + + def ensure_unauthenticated_except_twitter + redirect_to current_user.main_room || root_path if current_user && params[:old_twitter_user_id].nil? + end + + # Logs current user out of GreenLight. + def logout + session.delete(:user_id) if current_user + end + + # Check if the user is using local accounts + def auth_changed_to_local?(user) + Rails.configuration.loadbalanced_configuration && user.social_uid.present? && allow_greenlight_accounts? + end + + # Check if the user exists under the same email with no social uid and that social accounts are allowed + def auth_changed_to_social?(email) + Rails.configuration.loadbalanced_configuration && + User.exists?(email: email, provider: @user_domain, social_uid: nil) && + !allow_greenlight_accounts? + end + + # Sets the initial user role based on the email mapping + def initial_user_role(email) + mapping = @settings.get_value("Email Mapping") + return "user" unless mapping.present? + + mapping.split(",").each do |map| + email_role = map.split("=") + return email_role[1] if email.ends_with?(email_role[0]) + end + + "user" # default to user if role not found + end + + private + + # Migrates all of the twitter users rooms to the new account + def migrate_twitter_user(user) + if !session["old_twitter_user_id"].nil? && user.provider != "twitter" + old_user = User.find(session["old_twitter_user_id"]) + + old_user.rooms.each do |room| + room.owner = user + + room.name = "Old #{room.name}" if room.id == old_user.main_room.id + + room.save! + end + + # Query for the old user again so the migrated rooms don't get deleted + old_user.reload + old_user.destroy! + + session["old_twitter_user_id"] = nil + + flash[:success] = I18n.t("registration.deprecated.merge_success") + end + end +end diff --git a/app/controllers/concerns/authorizable.rb b/app/controllers/concerns/authorizable.rb deleted file mode 100644 index 4b8b404975..0000000000 --- a/app/controllers/concerns/authorizable.rb +++ /dev/null @@ -1,59 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Authorizable - extend ActiveSupport::Concern - - # Unless the request format is explicitly json Rails will mitigate the responsibility to CSR to handle it. - def ensure_valid_request - render 'components/index' if !Rails.env.development? && !valid_api_request? - end - - # Ensures that the user is logged in - def ensure_authenticated - render_error status: :unauthorized unless current_user - end - - # Ensures that the user is NOT logged in - def ensure_unauthenticated - render_error status: :unauthorized if current_user - end - - # PermissionsChecker service will return a true or false depending on whether the current_user's role has the provided permission_name - def ensure_authorized(permission_names, user_id: nil, friendly_id: nil, record_id: nil) - render_error status: :forbidden unless PermissionsChecker.new( - current_user:, - permission_names:, - user_id:, - friendly_id:, - record_id:, - current_provider: - ).call - end - - def ensure_super_admin - render_error status: :forbidden unless current_user.super_admin? - end - - private - - # Ensures that requests to the API are explicit enough. - def valid_api_request? - request.format == :json && request.headers['Accept']&.include?('application/json') - end -end diff --git a/app/controllers/concerns/bbb_server.rb b/app/controllers/concerns/bbb_server.rb new file mode 100644 index 0000000000..39a0f08674 --- /dev/null +++ b/app/controllers/concerns/bbb_server.rb @@ -0,0 +1,121 @@ +# 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 'bigbluebutton_api' + +module BbbServer + extend ActiveSupport::Concern + include BbbApi + + META_LISTED = "gl-listed" + + # Checks if a room is running on the BigBlueButton server. + def room_running?(bbb_id) + bbb_server.is_meeting_running?(bbb_id) + end + + # Returns a list of all running meetings + def all_running_meetings + bbb_server.get_meetings + end + + def get_recordings(meeting_id) + bbb_server.get_recordings(meetingID: meeting_id) + end + + def get_multiple_recordings(meeting_ids) + bbb_server.get_recordings(meetingID: meeting_ids) + end + + # Returns a URL to join a user into a meeting. + def join_path(room, name, options = {}, uid = nil) + # Create the meeting, even if it's running + start_session(room, options) + + # Determine the password to use when joining. + password = options[:user_is_moderator] ? room.moderator_pw : room.attendee_pw + + # Generate the join URL. + join_opts = {} + join_opts[:userID] = uid if uid + join_opts[:join_via_html5] = true + 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 + + # Creates a meeting on the BigBlueButton server. + def start_session(room, options = {}) + create_options = { + record: options[:record].to_s, + logoutURL: options[:meeting_logout_url] || '', + moderatorPW: room.moderator_pw, + attendeePW: room.attendee_pw, + moderatorOnlyMessage: options[:moderator_message], + "meta_#{META_LISTED}": options[:recording_default_visibility] || false, + "meta_bbb-origin-version": Greenlight::Application::VERSION, + "meta_bbb-origin": "Greenlight", + "meta_bbb-origin-server-name": options[:host] + } + + create_options[:muteOnStart] = options[:mute_on_start] if options[:mute_on_start] + create_options[:guestPolicy] = "ASK_MODERATOR" if options[:require_moderator_approval] + + # Send the create request. + begin + meeting = if room.presentation.attached? + modules = BigBlueButton::BigBlueButtonModules.new + url = rails_blob_url(room.presentation).gsub("&", "%26") + logger.info("Support: Room #{room.uid} starting using presentation: #{url}") + modules.add_presentation(:url, url) + bbb_server.create_meeting(room.name, room.bbb_id, create_options, modules) + else + bbb_server.create_meeting(room.name, room.bbb_id, create_options) + end + + unless meeting[:messageKey] == 'duplicateWarning' + 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}" + raise e + end + end + + # Gets the number of recordings for this room + def recording_count(bbb_id) + bbb_server.get_recordings(meetingID: bbb_id)[:recordings].length + end + + # Update a recording from a room + def update_recording(record_id, meta) + meta[:recordID] = record_id + 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) + end + + # Deletes all recordings associated with the room. + def delete_all_recordings(bbb_id) + record_ids = bbb_server.get_recordings(meetingID: bbb_id)[:recordings].pluck(:recordID) + bbb_server.delete_recordings(record_ids) unless record_ids.empty? + end +end diff --git a/app/controllers/concerns/client_routable.rb b/app/controllers/concerns/client_routable.rb deleted file mode 100644 index f9fc4f3bbd..0000000000 --- a/app/controllers/concerns/client_routable.rb +++ /dev/null @@ -1,40 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module ClientRoutable - extend ActiveSupport::Concern - - # Generates a client side activate account url. - def activate_account_url(token) - "#{root_url}activate_account/#{token}" - end - - # Generates a client side reset password url. - def reset_password_url(token) - "#{root_url}reset_password/#{token}" - end - - # Generates a client side pending url. - def pending_path - "#{root_path}pending" - end - - def admin_panel_url - "#{root_url}admin/users" - end -end diff --git a/app/controllers/concerns/emailer.rb b/app/controllers/concerns/emailer.rb new file mode 100644 index 0000000000..bd87287c03 --- /dev/null +++ b/app/controllers/concerns/emailer.rb @@ -0,0 +1,150 @@ +# 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 . + +module Emailer + extend ActiveSupport::Concern + + # Sends account activation email. + def send_activation_email(user, token) + begin + return unless Rails.configuration.enable_email_verification + + UserMailer.verify_email(user, user_verification_link(token), @settings).deliver + 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("email_sent", email_type: t("verify.verification")) + end + end + + # Sends password reset email. + def send_password_reset_email(user, token) + begin + return unless Rails.configuration.enable_email_verification + + UserMailer.password_reset(user, reset_link(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("email_sent", email_type: t("reset_password.subtitle")) + end + end + + def send_user_promoted_email(user, role) + begin + return unless Rails.configuration.enable_email_verification + + UserMailer.user_promoted(user, role, root_url, @settings).deliver_now + rescue => e + logger.error "Support: Error in email delivery: #{e}" + flash[:alert] = I18n.t(params[:message], default: I18n.t("delivery_error")) + end + end + + def send_user_demoted_email(user, role) + begin + return unless Rails.configuration.enable_email_verification + + UserMailer.user_demoted(user, role, root_url, @settings).deliver_now + rescue => e + logger.error "Support: Error in email delivery: #{e}" + flash[:alert] = I18n.t(params[:message], default: I18n.t("delivery_error")) + end + end + + # Sends inivitation to join + def send_invitation_email(name, email, invite) + begin + return unless Rails.configuration.enable_email_verification + + 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")) + end + end + + def send_user_approved_email(user) + begin + return unless Rails.configuration.enable_email_verification + + UserMailer.approve_user(user, root_url, @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("email_sent", email_type: t("verify.verification")) + end + end + + def send_approval_user_signup_email(user) + begin + return unless Rails.configuration.enable_email_verification + admin_emails = admin_emails() + UserMailer.approval_user_signup(user, admins_url(tab: "pending"), + admin_emails, @settings).deliver_now unless admin_emails.empty? + rescue => e + logger.error "Support: Error in email delivery: #{e}" + flash[:alert] = I18n.t(params[:message], default: I18n.t("delivery_error")) + end + end + + def send_invite_user_signup_email(user) + begin + return unless Rails.configuration.enable_email_verification + + admin_emails = admin_emails() + UserMailer.invite_user_signup(user, admins_url, admin_emails, @settings).deliver_now unless admin_emails.empty? + rescue => e + logger.error "Support: Error in email delivery: #{e}" + flash[:alert] = I18n.t(params[:message], default: I18n.t("delivery_error")) + end + end + + private + + # Returns the link the user needs to click to verify their account + def user_verification_link(token) + edit_account_activation_url(token: token) + end + + def admin_emails + roles = Role.where(provider: @user_domain, role_permissions: { name: "can_manage_users", value: "true" }) + .pluck(:name) + + admins = User.with_role(roles - ["super_admin"]) + + admins = admins.where(provider: @user_domain) if Rails.configuration.loadbalanced_configuration + + admins.collect(&:email).join(",") + end + + def reset_link(token) + edit_password_reset_url(token) + end + + def invitation_link(token) + if allow_greenlight_accounts? + signup_url(invite_token: token) + else + root_url(invite_token: token) + end + end +end diff --git a/app/controllers/concerns/errors.rb b/app/controllers/concerns/errors.rb new file mode 100644 index 0000000000..9bb9f0c65a --- /dev/null +++ b/app/controllers/concerns/errors.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Errors + class UnsafeHostError < StandardError; end +end diff --git a/app/controllers/concerns/joiner.rb b/app/controllers/concerns/joiner.rb new file mode 100644 index 0000000000..6c6b016e0b --- /dev/null +++ b/app/controllers/concerns/joiner.rb @@ -0,0 +1,111 @@ +# 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 . + +module Joiner + extend ActiveSupport::Concern + + # Displays the join room page to the user + def show_user_join + # Get users name + @name = if current_user + current_user.name + elsif cookies.encrypted[:greenlight_name] + cookies.encrypted[:greenlight_name] + else + "" + end + + @search, @order_column, @order_direction, pub_recs = + public_recordings(@room.bbb_id, params.permit(:search, :column, :direction), true) + + @pagy, @public_recordings = pagy_array(pub_recs) + + render :join + end + + # create or update cookie to track the three most recent rooms a user joined + def save_recent_rooms + if current_user + recently_joined_rooms = cookies.encrypted["#{current_user.uid}_recently_joined_rooms"].to_a + cookies.encrypted["#{current_user.uid}_recently_joined_rooms"] = + recently_joined_rooms.prepend(@room.id).uniq[0..2] + end + end + + def join_room(opts) + @room_settings = JSON.parse(@room[:room_settings]) + + 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_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 + redirect_to join_path(@room, current_user.name, opts, current_user.uid) + else + join_name = params[:join_name] || params[@room.invite_path][:join_name] + + redirect_to join_path(@room, join_name, opts, fetch_guest_id) + end + else + search_params = params[@room.invite_path] || params + @search, @order_column, @order_direction, pub_recs = + public_recordings(@room.bbb_id, search_params.permit(:search, :column, :direction), true) + + @pagy, @public_recordings = pagy_array(pub_recs) + + # They need to wait until the meeting begins. + render :wait + end + end + + def incorrect_user_domain + Rails.configuration.loadbalanced_configuration && @room.owner.provider != @user_domain + end + + # Default, unconfigured meeting options. + def default_meeting_options + invite_msg = I18n.t("invite_message") + { + user_is_moderator: false, + meeting_logout_url: request.base_url + logout_room_path(@room), + moderator_message: "#{invite_msg}
    #{request.base_url + room_path(@room)}", + host: request.host, + recording_default_visibility: @settings.get_value("Default Recording Visibility") == "public" + } + end + + private + + def fetch_guest_id + return cookies[:guest_id] if cookies[:guest_id].present? + + guest_id = "gl-guest-#{SecureRandom.hex(12)}" + + cookies[:guest_id] = { + value: guest_id, + expires: 1.day.from_now + } + + guest_id + end +end diff --git a/app/controllers/concerns/populator.rb b/app/controllers/concerns/populator.rb new file mode 100644 index 0000000000..dd86d314ad --- /dev/null +++ b/app/controllers/concerns/populator.rb @@ -0,0 +1,120 @@ +# 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 . + +module Populator + extend ActiveSupport::Concern + + # Returns a list of users that are in the same context of the current user + def manage_users_list + initial_list = case @tab + when "active" + User.without_role([:pending, :denied]) + when "deleted" + User.deleted + when "pending" + User.with_role(:pending) + when "denied" + User.with_role(:denied) + else + User.all + end + + initial_list = initial_list.with_role(@role.name) if @role.present? + + initial_list = initial_list.without_role(:super_admin) + + initial_list = initial_list.where(provider: @user_domain) if Rails.configuration.loadbalanced_configuration + + initial_list.where.not(id: current_user.id) + .admins_search(@search) + .admins_order(@order_column, @order_direction) + end + + # Returns a list of rooms that are in the same context of the current user + def server_rooms_list + if Rails.configuration.loadbalanced_configuration + Room.includes(:owner).where(users: { provider: @user_domain }) + .admins_search(@search) + .admins_order(@order_column, @order_direction, @running_room_bbb_ids) + else + Room.includes(:owner).admins_search(@search).admins_order(@order_column, @order_direction, @running_room_bbb_ids) + end + end + + # 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 + latest_recordings + end + end + + # Returns a list off all current invitations + def invited_users_list + list = if Rails.configuration.loadbalanced_configuration + Invitation.where(provider: @user_domain) + else + Invitation.all + end + + 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_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(return_length) + .offset(counter * return_length) + .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/presentable.rb b/app/controllers/concerns/presentable.rb deleted file mode 100644 index 06a59f201e..0000000000 --- a/app/controllers/concerns/presentable.rb +++ /dev/null @@ -1,31 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Presentable - extend ActiveSupport::Concern - - def presentation_file_name(room) - room.presentation.filename if room.presentation.attached? - end - - def presentation_thumbnail(room) - return if !room.presentation.attached? || !room.presentation.representable? - - view_context.rails_representation_url(room.presentation.representation(resize: ['225x125']).processed) - end -end diff --git a/app/controllers/concerns/recorder.rb b/app/controllers/concerns/recorder.rb new file mode 100644 index 0000000000..0365fb2dd5 --- /dev/null +++ b/app/controllers/concerns/recorder.rb @@ -0,0 +1,132 @@ +# 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 . + +module Recorder + extend ActiveSupport::Concern + include RecordingsHelper + + # Fetches all recordings for a room. + def recordings(room_bbb_id, search_params = {}, ret_search_params = false) + res = get_recordings(room_bbb_id) + + format_recordings(res, search_params, ret_search_params) + end + + # Fetches a rooms public recordings. + def public_recordings(room_bbb_id, search_params = {}, ret_search_params = false) + search, order_col, order_dir, recs = recordings(room_bbb_id, search_params, ret_search_params) + [search, order_col, order_dir, recs.select { |r| r[:metadata][:"gl-listed"] == "true" }] + end + + # Makes paginated API calls to get recordings + def all_recordings(room_bbb_ids, search_params = {}, ret_search_params = false, search_name = false) + res = { recordings: [] } + + until room_bbb_ids.empty? || res[:recordings].length > Rails.configuration.pagination_number + # bbb.get_recordings returns an object + # take only the array portion of the object that is returned + full_res = get_multiple_recordings(room_bbb_ids.pop(Rails.configuration.pagination_number)) + res[:recordings].push(*full_res[:recordings]) + end + + format_recordings(res, search_params, ret_search_params, search_name) + end + + # Format, filter, and sort recordings to match their current use in the app + def format_recordings(api_res, search_params, ret_search_params, search_name = false) + search = search_params[:search] || "" + order_col = search_params[:column] && search_params[:direction] != "none" ? search_params[:column] : "end_time" + order_dir = search_params[:column] && search_params[:direction] != "none" ? search_params[:direction] : "desc" + + search = search.downcase + + api_res[:recordings].each do |r| + next if r.key?(:error) + # Format playbacks in a more pleasant way. + r[:playbacks] = if !r[:playback] || !r[:playback][:format] + [] + elsif r[:playback][:format].is_a?(Array) + r[:playback][:format] + else + [r[:playback][:format]] + end + r.delete(:playback) + end + + recs = filter_recordings(api_res, search, search_name) + recs = sort_recordings(recs, order_col, order_dir) + + if ret_search_params + [search, order_col, order_dir, recs] + else + recs + end + end + + def filter_recordings(api_res, search, search_name = false) + api_res[:recordings].select do |r| + (!r[:metadata].nil? && ((!r[:metadata][:name].nil? && + r[:metadata][:name].downcase.include?(search)) || + (r[:metadata][:"gl-listed"] == "true" && search == "public") || + (r[:metadata][:"gl-listed"] == "false" && search == "unlisted"))) || + ((r[:metadata].nil? || r[:metadata][:name].nil?) && + r[:name].downcase.include?(search)) || + r[:participants].include?(search) || + !r[:playbacks].select { |p| p[:type].downcase.include?(search) }.empty? || + (search_name && recording_owner(r[:meetingID]).downcase.include?(search)) + end + end + + def sort_recordings(recs, order_col, order_dir) + recs = case order_col + when "end_time" + recs.sort_by { |r| r[:endTime] } + when "name" + recs.sort_by do |r| + if !r[:metadata].nil? && !r[:metadata][:name].nil? + r[:metadata][:name].downcase + else + r[:name].downcase + end + end + when "length" + recs.sort_by { |r| r[:playbacks].reject { |p| p[:type] == "statistics" }.first[:length] } + when "users" + recs.sort_by { |r| r[:participants] } + when "visibility" + recs.sort_by { |r| r[:metadata][:"gl-listed"] } + when "formats" + recs.sort_by { |r| r[:playbacks].first[:type].downcase } + else + recs.sort_by { |r| r[:endTime] } + end + + if order_dir == 'asc' + recs + else + recs.reverse + end + end + + private + + # Gets the email of the room owner to which the recording belongs to + def recording_owner(room_id) + Room.find_by(bbb_id: room_id).owner.email.presence || Room.find_by(bbb_id: room_id).owner.username + end +end diff --git a/app/controllers/concerns/registrar.rb b/app/controllers/concerns/registrar.rb new file mode 100644 index 0000000000..98c38a0812 --- /dev/null +++ b/app/controllers/concerns/registrar.rb @@ -0,0 +1,75 @@ +# 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 . + +module Registrar + extend ActiveSupport::Concern + + def approval_registration + @settings.get_value("Registration Method") == Rails.configuration.registration_methods[:approval] + end + + def invite_registration + @settings.get_value("Registration Method") == Rails.configuration.registration_methods[:invite] + end + + # Returns a hash containing whether the user has been invited and if they + # signed up with the same email that they were invited with + def check_user_invited(email, token, domain) + return { present: true, verified: false } unless invite_registration + return { present: false, verified: false } if token.nil? + + invite = Invitation.valid.find_by(invite_token: token, provider: domain) + if invite.present? + # Check if they used the same email to sign up + same_email = email.casecmp(invite.email).zero? + invite.destroy + { present: true, verified: same_email } + else + { present: false, verified: false } + end + end + + # Checks if the user passes the requirements to be invited + def passes_invite_reqs + # check if user needs to be invited and IS invited + invitation = check_user_invited(@user.email, session[:invite_token], @user_domain) + + @user.email_verified = true if invitation[:verified] + + invitation[:present] + end + + # Add validation errors to model if they exist + def valid_user_or_captcha + valid_user = @user.valid? + valid_captcha = Rails.configuration.recaptcha_enabled ? verify_recaptcha(model: @user) : true + + logger.error("Support: #{@user.email} creation failed: User params are not valid.") unless valid_user + + valid_user && valid_captcha + end + + # Checks if the user trying to sign in with twitter account + def check_if_twitter_account(log_out = false) + unless params[:old_twitter_user_id].nil? && session[:old_twitter_user_id].nil? + logout if log_out + flash.now[:alert] = I18n.t("registration.deprecated.new_signin") + session[:old_twitter_user_id] = params[:old_twitter_user_id] unless params[:old_twitter_user_id].nil? + end + end +end diff --git a/app/controllers/concerns/rolify.rb b/app/controllers/concerns/rolify.rb new file mode 100644 index 0000000000..a49092f818 --- /dev/null +++ b/app/controllers/concerns/rolify.rb @@ -0,0 +1,164 @@ +# 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 . + +module Rolify + extend ActiveSupport::Concern + + # Gets all roles + def all_roles(selected_role) + @roles = Role.editable_roles(@user_domain).by_priority + + if @roles.count.zero? + Role.create_default_roles(@user_domain) + @roles = Role.editable_roles(@user_domain) + end + + @selected_role = if selected_role.nil? + @roles.find_by(name: 'user') + else + @roles.find(selected_role) + end + + @roles + end + + # Creates a new role + def create_role(new_role_name) + # Make sure that the role name isn't a duplicate or a reserved name like super_admin or empty + return nil if Role.duplicate_name(new_role_name, @user_domain) || new_role_name.strip.empty? + + Role.create_new_role(new_role_name, @user_domain) + end + + # Updates a user's roles + def update_roles(role_id) + return true if role_id.blank? + # Check to make sure user can edit roles + return false unless current_user.role.get_permission("can_manage_users") + + return true if @user.role_id == role_id.to_i + + new_role = Role.find_by(id: role_id, provider: @user_domain) + # Return false if new role doesn't exist + return false if new_role.nil? + + return false if new_role.priority < current_user.role.priority + + # Send promoted/demoted emails + send_user_promoted_email(@user, new_role) if new_role.get_permission("send_promoted_email") + + @user.set_role(new_role.name) + end + + # Updates a roles priority + def update_priority(role_to_update) + user_role = Role.find_by(name: "user", provider: @user_domain) + admin_role = Role.find_by(name: "admin", provider: @user_domain) + + current_user_role = current_user.role + + # Users aren't allowed to update the priority of the admin or user roles + return false if role_to_update.include?(user_role.id.to_s) || role_to_update.include?(admin_role.id.to_s) + + # Restrict users to only updating the priority for roles in their domain with a higher + # priority + role_to_update.each do |id| + role = Role.find(id) + return false if role.priority <= current_user_role.priority || role.provider != @user_domain + end + + # Get the priority of the current user's role and start with 1 higher + new_priority = [current_user_role.priority, 0].max + 1 + + begin + # Save the old priorities incase something fails + old_priority = Role.where(id: role_to_update).select(:id, :priority).index_by(&:id) + + # Set all the priorities to nil to avoid unique column issues + Role.where(id: role_to_update).update_all(priority: nil) + + # Starting at the starting priority, increase by 1 every time + role_to_update.each_with_index do |id, index| + Role.find(id).update_attribute(:priority, new_priority + index) + end + + true + rescue => e + # Reset to old prorities + role_to_update.each_with_index do |id, _index| + Role.find(id).update_attribute(:priority, old_priority[id.to_i].priority) + end + + logger.error "#{current_user} failed to update role priorities: #{e}" + + false + end + end + + # Update Permissions + def update_permissions(role) + current_user_role = current_user.role + + # Checks that it is valid for the provider to update the role + return false if role.priority <= current_user_role.priority || role.provider != @user_domain + + 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) + + permission_params.transform_values! do |v| + case v + when "0" + "false" + when "1" + "true" + else + v + end + end + + # Role is a default role so users can't change the name + role_params[:name] = role.name if Role::RESERVED_ROLE_NAMES.include?(role.name) + + # Make sure if the user is updating the role name that the role name is valid + if role.name != role_params[:name] && !Role.duplicate_name(role_params[:name], @user_domain) && + !role_params[:name].strip.empty? + role.name = role_params[:name] + elsif role.name != role_params[:name] + return false + end + + role.update(colour: permission_params[:colour]) + role.update_all_role_permissions(permission_params) + + # Create home rooms for all users with this role if users with this role are now able to create rooms + create_home_rooms(role.name) if !role.get_permission("can_create_rooms") && permission_params["can_create_rooms"] == "true" + + role.save! + end + + private + + # Create home rooms for users since they are now able to create rooms + def create_home_rooms(role_name) + User.with_role(role_name).each do |user| + user.create_home_room if user.main_room.nil? + end + end +end diff --git a/app/controllers/concerns/themer.rb b/app/controllers/concerns/themer.rb new file mode 100644 index 0000000000..132e3bbf36 --- /dev/null +++ b/app/controllers/concerns/themer.rb @@ -0,0 +1,45 @@ +# 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 . + +module Themer + extend ActiveSupport::Concern + + # Lightens a color by 40% + def color_lighten(color) + # Uses the built in Sass Engine to lighten the color + generate_sass("lighten", color, "40%") + end + + # Darkens a color by 10% + def color_darken(color) + # Uses the built in Sass Engine to darken the color + generate_sass("darken", color, "10%") + end + + private + + def generate_sass(action, color, percentage) + dummy_scss = "h1 { color: $#{action}; }" + compiled = SassC::Engine.new("$#{action}:#{action}(#{color}, #{percentage});" + dummy_scss, syntax: :scss).render + + string_locater = 'color: ' + color_start = compiled.index(string_locater) + string_locater.length + + compiled[color_start..color_start + 6] + end +end diff --git a/app/controllers/errors_controller.rb b/app/controllers/errors_controller.rb new file mode 100644 index 0000000000..365955d3bf --- /dev/null +++ b/app/controllers/errors_controller.rb @@ -0,0 +1,39 @@ +# 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 . + +class ErrorsController < ApplicationController + def not_found + render "greenlight_error", status: 404, formats: :html + end + + def internal_error + render "errors/greenlight_error", status: 500, formats: :html, + locals: { + status_code: 500, + message: I18n.t("errors.internal.message"), + help: I18n.t("errors.internal.help"), + display_back: true, + report_issue: true + } + end + + def unauthorized + render "errors/greenlight_error", status: 401, formats: :html, locals: { status_code: 401, + message: I18n.t("errors.unauthorized.message"), help: I18n.t("errors.unauthorized.help"), display_back: true } + end +end diff --git a/app/controllers/external_controller.rb b/app/controllers/external_controller.rb deleted file mode 100644 index 5873d1d9f2..0000000000 --- a/app/controllers/external_controller.rb +++ /dev/null @@ -1,212 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -class ExternalController < ApplicationController - include ClientRoutable - - skip_before_action :verify_authenticity_token - - # GET 'auth/:provider/callback' - # Creates the user using the information received through the external auth method - def create_user - provider = current_provider - - credentials = request.env['omniauth.auth'] - - user_info = build_user_info(credentials) - - user = User.find_by(external_id: credentials['uid'], provider:) - - # Fallback mechanism to search by email - if user.blank? && ENV.fetch('USE_EMAIL_AS_EXTERNAL_ID_FALLBACK', 'false') == 'true' - user = User.find_by(email: credentials['info']['email'], provider:) - # Update the user's external id to the latest value to avoid using the fallback - user.update(external_id: credentials['uid']) if user.present? && credentials['uid'].present? - end - - new_user = user.blank? - - registration_method = SettingGetter.new(setting_name: 'RegistrationMethod', provider: current_provider).call - - # Check if they have a valid token only if a new sign up - if new_user && registration_method == SiteSetting::REGISTRATION_METHODS[:invite] && !valid_invite_token(email: user_info[:email]) - return redirect_to root_path(error: Rails.configuration.custom_error_msgs[:invite_token_invalid]) - end - - # Redirect to root if the user doesn't exist and has an invalid domain - return redirect_to root_path(error: Rails.configuration.custom_error_msgs[:banned_user]) if new_user && !valid_domain?(user_info[:email]) - - # Create the user if they don't exist - if new_user - user = UserCreator.new(user_params: user_info, provider: current_provider, role: default_role).call - handle_avatar(user, credentials['info']['image']) - user.save! - create_default_room(user) - - # Send admins an email if smtp is enabled - if ENV['SMTP_SERVER'].present? - UserMailer.with(user:, admin_panel_url:, base_url: request.base_url, - provider: current_provider).new_user_signup_email.deliver_later - end - end - - if !new_user && SettingGetter.new(setting_name: 'ResyncOnLogin', provider:).call - user.assign_attributes(user_info.except(:language)) # Don't reset the user's language - handle_avatar(user, credentials['info']['image']) - user.save! if user.changed? - end - - # Set to pending if registration method is approval - if registration_method == SiteSetting::REGISTRATION_METHODS[:approval] - user.pending! if new_user - return redirect_to pending_path if user.pending? - end - - # set the cookie based on session timeout setting - session_timeout = SettingGetter.new(setting_name: 'SessionTimeout', provider: current_provider).call - user.generate_session_token!(extended_session: session_timeout) - user.update(last_login: DateTime.now) - handle_session_timeout(session_timeout.to_i, user) if session_timeout - - session[:session_token] = user.session_token - session[:oidc_id_token] = credentials.dig('credentials', 'id_token') if ENV['OPENID_CONNECT_LOGOUT_PATH'].present? - - # TODO: - Ahmad: deal with errors - - redirect_location = cookies.delete(:location) - - return redirect_to redirect_location, allow_other_host: false if redirect_location&.match?('\/rooms\/\w{3}-\w{3}-\w{3}(-\w{3})?\/join\z') - - redirect_to root_path - rescue ActionController::Redirecting::UnsafeRedirectError => e - Rails.logger.error("Unsafe redirection attempt: #{e}") - redirect_to root_path - rescue StandardError => e - Rails.logger.error("Error during authentication: #{e}") - redirect_to root_path(error: Rails.configuration.custom_error_msgs[:external_signup_error]) - end - - # POST /recording_ready - # Creates the recording in Greenlight using information received from BigBlueButton - def recording_ready - response = BigBlueButtonApi.new(provider: current_provider).decode_jwt(params[:signed_parameters]) - record_id = response[0]['record_id'] - recording = BigBlueButtonApi.new(provider: current_provider).get_recording(record_id:) - - # Only decrement if the recording doesn't already exist - # This is needed to handle duplicate requests - unless Recording.exists?(record_id:) - @room = Room.find_by(meeting_id: response[0]['meeting_id']) - @room.update(recordings_processing: @room.recordings_processing - 1) unless @room.recordings_processing.zero? - end - - RecordingCreator.new(recording:, first_creation: true).call - - render json: {}, status: :ok - rescue JWT::DecodeError - render json: {}, status: :unauthorized - end - - # GET /meeting_ended - # Increments a rooms recordings_processing if the meeting was recorded - def meeting_ended - # TODO: - ahmad: Add some sort of validation - @room = Room.find_by(meeting_id: extract_meeting_id) - return render json: {}, status: :ok unless @room - - recordings_processing = params[:recordingmarks] == 'true' ? @room.recordings_processing + 1 : @room.recordings_processing - - unless @room.update(recordings_processing:, online: false) - Rails.logger.error "Failed to update room(id): #{@room.id}, model errors: #{@room.errors}" - end - - render json: {}, status: :ok - end - - private - - def handle_session_timeout(session_timeout, user) - # Creates a cookie based on session timeout site setting - cookies.encrypted[:_extended_session] = { - value: { - session_token: user.session_token - }, - expires: session_timeout.days, - httponly: true, - secure: true - } - end - - def extract_language_code(locale) - locale.try(:scan, /^[a-z]{2}/)&.first || I18n.default_locale - end - - def extract_meeting_id - meeting_id = params[:meetingID] - meeting_id = meeting_id.split('_')[0] if meeting_id.end_with?('_') - meeting_id - end - - def valid_invite_token(email:) - token = cookies[:inviteToken] - - return false if token.blank? - - # Try to delete the invitation and return true if it succeeds - Invitation.destroy_by(email: email.downcase, provider: current_provider, token:).present? - end - - def build_user_info(credentials) - { - name: credentials['info']['name'], - email: credentials['info']['email'], - language: extract_language_code(credentials['info']['locale']), - external_id: credentials['uid'], - verified: true - } - end - - # Downloads the image and correctly attaches it to the user - def handle_avatar(user, image) - return if image.blank? || !user.valid? # return if no image passed or user isnt valid - - profile_file = URI.parse(image) - - filename = File.basename(profile_file.path) - return if user.avatar&.filename&.to_s == filename # return if the filename is the same - - file = profile_file.open - user.avatar.attach( - io: file, filename:, content_type: file.content_type - ) - rescue StandardError => e - Rails.logger.error("Failed to upload avatar for #{user.id}: #{e}") - nil - end - - def valid_domain?(email) - allowed_domain_emails = SettingGetter.new(setting_name: 'AllowedDomains', provider: current_provider).call - return true if allowed_domain_emails.blank? - - domains = allowed_domain_emails.split(',') - domains.each do |domain| - return true if email.end_with?(domain) - end - false - end -end diff --git a/app/controllers/health_check_controller.rb b/app/controllers/health_check_controller.rb new file mode 100644 index 0000000000..8ecc0414d2 --- /dev/null +++ b/app/controllers/health_check_controller.rb @@ -0,0 +1,74 @@ +# 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 . + +class HealthCheckController < ApplicationController + skip_before_action :redirect_to_https, :set_user_domain, :set_user_settings, :maintenance_mode?, :migration_error?, + :user_locale, :check_admin_password, :check_user_role + + # GET /health_check + def all + response = "success" + @cache_expire = 10.seconds + + begin + cache_check + database_check + email_check + rescue => e + response = "Health Check Failure: #{e}" + end + + render plain: response + end + + private + + def cache_check + if Rails.cache.write("__health_check_cache_write__", "true", expires_in: @cache_expire) + raise "Unable to read from cache" unless Rails.cache.read("__health_check_cache_write__") == "true" + else + raise "Unable to write to cache" + end + end + + def database_check + raise "Database not responding" if defined?(ActiveRecord) && !ActiveRecord::Migrator.current_version + raise "Pending migrations" unless ActiveRecord::Migration.check_pending!.nil? + end + + def email_check + test_smtp if Rails.configuration.action_mailer.delivery_method == :smtp + end + + def test_smtp + settings = ActionMailer::Base.smtp_settings + + smtp = Net::SMTP.new(settings[:address], settings[:port]) + 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| + s.authenticate(settings[:user_name], settings[:password], settings[:authentication]) + end + else + smtp.start(settings[:domain]) + end + rescue => e + raise "Unable to connect to SMTP Server - #{e}" + end +end diff --git a/app/controllers/health_checks_controller.rb b/app/controllers/health_checks_controller.rb deleted file mode 100644 index cb5b2f39cf..0000000000 --- a/app/controllers/health_checks_controller.rb +++ /dev/null @@ -1,81 +0,0 @@ -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2022 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. -# -# Greenlight 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 Greenlight; if not, see . - -# frozen_string_literal: true - -class HealthChecksController < ApplicationController - skip_before_action :verify_authenticity_token - - def check - response = 'success' - - begin - check_database unless ENV.fetch('DATABASE_HEALTH_CHECK_DISABLED', false) == 'true' - check_redis unless ENV.fetch('REDIS_HEALTH_CHECK_DISABLED', false) == 'true' - check_smtp unless ENV.fetch('SMTP_HEALTH_CHECK_DISABLED', false) == 'true' - check_big_blue_button unless ENV.fetch('BBB_HEALTH_CHECK_DISABLED', false) == 'true' - end - - render plain: response, status: :ok - rescue StandardError => e - logger.error "Health check failed: #{e}" - render plain: e, status: :internal_server_error - end - - private - - def check_database - raise 'Unable to connect to Database' unless ActiveRecord::Base.connection.active? - raise 'Unable to connect to Database - pending migrations' unless ActiveRecord::Migration.check_all_pending!.nil? - rescue StandardError => e - raise "Unable to connect to Database - #{e}" - end - - def check_redis - Redis.new.ping - rescue StandardError => e - raise "Unable to connect to Redis - #{e}" - end - - def check_smtp - settings = ActionMailer::Base.smtp_settings - - smtp = Net::SMTP.new(settings[:address], settings[:port]) - smtp.enable_starttls_auto if settings[:openssl_verify_mode] != OpenSSL::SSL::VERIFY_NONE && smtp.respond_to?(:enable_starttls_auto) - - if settings[:authentication].present? && settings[:authentication] != 'none' - smtp.start(settings[:domain]) do |s| - s.authenticate(settings[:user_name], settings[:password], settings[:authentication]) - end - else - smtp.start(settings[:domain]) - end - smtp.finish - rescue StandardError => e - raise "Unable to connect to SMTP Server - #{e}" - end - - def check_big_blue_button - checksum = Digest::SHA1.hexdigest("isMeetingRunningmeetingID=0#{Rails.configuration.bigbluebutton_secret}") - uri = URI("#{Rails.configuration.bigbluebutton_endpoint}isMeetingRunning?meetingID=0&checksum=#{checksum}") - res = Net::HTTP.get(uri) - doc = Nokogiri::XML(res) - - raise "Unable to connect to BigBlueButton - #{res}" unless doc.css('returncode').text == 'SUCCESS' - rescue StandardError => e - raise "Unable to connect to BigBlueButton - #{e}" - end -end diff --git a/app/controllers/concerns/avatarable.rb b/app/controllers/main_controller.rb similarity index 58% rename from app/controllers/concerns/avatarable.rb rename to app/controllers/main_controller.rb index 8347bfad0f..a747f8d317 100644 --- a/app/controllers/concerns/avatarable.rb +++ b/app/controllers/main_controller.rb @@ -1,27 +1,28 @@ +# frozen_string_literal: true + # BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. # -# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +# 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. # -# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +# 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 Greenlight; if not, see . - -# frozen_string_literal: true - -module Avatarable - extend ActiveSupport::Concern +# with BigBlueButton; if not, see . - def user_avatar(user) - return view_context.url_for(user.avatar) if user.avatar.attached? +class MainController < ApplicationController + include Registrar + # GET / + def index + # Store invite token + session[:invite_token] = params[:invite_token] if params[:invite_token] && invite_registration - view_context.image_url('default-avatar.png') + redirect_to home_page if current_user end end diff --git a/app/controllers/password_resets_controller.rb b/app/controllers/password_resets_controller.rb new file mode 100644 index 0000000000..cd95b13c13 --- /dev/null +++ b/app/controllers/password_resets_controller.rb @@ -0,0 +1,93 @@ +# 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 . + +class PasswordResetsController < ApplicationController + include Emailer + + before_action :disable_password_reset, unless: -> { Rails.configuration.enable_email_verification } + before_action :find_user, only: [:edit, :update] + before_action :check_expiration, only: [:edit, :update] + + # GET /password_resets/new + def new + end + + # POST /password_resets + def create + return redirect_to new_password_reset_path, flash: { alert: I18n.t("reset_password.captcha") } unless valid_captcha + + # 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 + def edit + end + + # PATCH /password_resets/:id + def update + # Check if password is valid + if params[:user][:password].empty? + flash.now[:alert] = I18n.t("password_empty_notice") + elsif params[:user][:password] != params[:user][:password_confirmation] + # Password does not match password confirmation + flash.now[:alert] = I18n.t("password_different_notice") + elsif @user.update_attributes(user_params) + # Clear the user's social uid if they are switching from a social to a local account + @user.update_attribute(:social_uid, nil) if @user.social_uid.present? + # Successfully reset password + return redirect_to root_path, flash: { success: I18n.t("password_reset_success") } + end + + render 'edit' + end + + private + + def find_user + @user = User.find_by(reset_digest: User.hash_token(params[:id]), provider: @user_domain) + + return redirect_to new_password_reset_url, alert: I18n.t("reset_password.invalid_token") unless @user + end + + def user_params + params.require(:user).permit(:password, :password_confirmation) + end + + # Checks expiration of reset token. + def check_expiration + redirect_to new_password_reset_url, alert: I18n.t("expired_reset_token") if @user.password_reset_expired? + end + + # Redirects to 404 if emails are not enabled + 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 new file mode 100644 index 0000000000..93912b4679 --- /dev/null +++ b/app/controllers/recordings_controller.rb @@ -0,0 +1,62 @@ +# 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 + +class RecordingsController < ApplicationController + before_action :find_room + before_action :verify_room_ownership + + META_LISTED = "gl-listed" + + # POST /:meetingID/:record_id + def update + meta = { + "meta_#{META_LISTED}" => (params[:state] == "public"), + } + + res = update_recording(params[:record_id], meta) + + # Redirects to the page that made the initial request + redirect_back fallback_location: root_path if res[:updated] + end + + # PATCH /:meetingID/:record_id + def rename + update_recording(params[:record_id], "meta_name" => params[:record_name]) + + redirect_back fallback_location: room_path(@room) + end + + # DELETE /:meetingID/:record_id + def delete + delete_recording(params[:record_id]) + + # Redirects to the page that made the initial request + redirect_back fallback_location: root_path + end + + private + + def find_room + @room = Room.find_by!(bbb_id: params[:meetingID]) + end + + # Ensure the user is logged into the room they are accessing. + def verify_room_ownership + redirect_to root_path if !@room.owned_by?(current_user) && !current_user&.role&.get_permission("can_manage_rooms_recordings") + end +end diff --git a/app/controllers/rooms_controller.rb b/app/controllers/rooms_controller.rb new file mode 100644 index 0000000000..fd4233c10a --- /dev/null +++ b/app/controllers/rooms_controller.rb @@ -0,0 +1,476 @@ +# 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 . + +class RoomsController < ApplicationController + include Pagy::Backend + include Recorder + include Joiner + include Populator + + before_action :validate_accepted_terms, unless: -> { !Rails.configuration.terms } + before_action :validate_verified_email, except: [:show, :join], + unless: -> { !Rails.configuration.enable_email_verification } + before_action :find_room, except: [:create, :join_specific_room, :cant_create_rooms] + before_action :verify_room_ownership_or_admin_or_shared, only: [:start, :shared_access] + before_action :verify_room_ownership_or_admin, only: [:update_settings, :destroy, :preupload_presentation, :remove_presentation] + before_action :verify_room_ownership_or_shared, only: [:remove_shared_access] + before_action :verify_room_owner_verified, only: [:show, :join], + unless: -> { !Rails.configuration.enable_email_verification } + before_action :verify_room_owner_valid, only: [:show, :join] + before_action :verify_user_not_admin, only: [:show] + skip_before_action :verify_authenticity_token, only: [:join] + + # POST / + def create + # Return to root if user is not signed in + return redirect_to root_path unless current_user + + # Check if the user has not exceeded the room limit + 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], + moderator_access_code: room_params[:moderator_access_code]) + @room.owner = current_user + @room.room_settings = create_room_settings_string(room_params) + + # Save the room and redirect if it fails + return redirect_to current_user.main_room, flash: { alert: I18n.t("room.create_room_error") } unless @room.save + + logger.info "Support: #{current_user.email} has created a new room #{@room.uid}." + + # Redirect to room is auto join was not turned on + return redirect_to @room, + flash: { success: I18n.t("room.create_room_success") } unless room_params[:auto_join] == "1" + + # Start the room if auto join was turned on + start + end + + # GET /:room_uid + def show + @room_settings = JSON.parse(@room[:room_settings]) + @anyone_can_start = room_setting_with_config("anyoneCanStart") + @room_running = room_running?(@room.bbb_id) + @shared_room = room_shared_with_user + + # If its the current user's room + if current_user && (@room.owned_by?(current_user) || @shared_room) + # If the user is trying to access their own room but is not allowed to + if @room.owned_by?(current_user) && !current_user.role.get_permission("can_create_rooms") + return redirect_to cant_create_rooms_path + end + + # User is allowed to have rooms + @search, @order_column, @order_direction, recs = + recordings(@room.bbb_id, params.permit(:search, :column, :direction), true) + + @pagy, @recordings = pagy_array(recs) + else + return redirect_to root_path, flash: { alert: I18n.t("room.invalid_provider") } if incorrect_user_domain + + show_user_join + end + end + + # GET /rooms + def cant_create_rooms + return redirect_to root_path unless current_user + shared_rooms = current_user.shared_rooms + + if current_user.shared_rooms.empty? + # Render view for users that cant create rooms + @recent_rooms = Room.where(id: cookies.encrypted["#{current_user.uid}_recently_joined_rooms"]) + render :cant_create_rooms + else + redirect_to shared_rooms[0] + end + end + + # POST /:room_uid + def join + return redirect_to root_path, + flash: { alert: I18n.t("administrator.site_settings.authentication.user-info") } if auth_required + + @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 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 + + # Assign join name if passed. + if params[@room.invite_path] + @join_name = params[@room.invite_path][:join_name] + elsif !params[:join_name] + # Join name not passed. + return redirect_to root_path + end + end + + # create or update cookie with join name + cookies.encrypted[:greenlight_name] = @join_name unless cookies.encrypted[:greenlight_name] == @join_name + + save_recent_rooms + + logger.info "Support: #{current_user.present? ? current_user.email : @join_name} is joining room #{@room.uid}" + join_room(default_meeting_options) + end + + # DELETE /:room_uid + def destroy + begin + # Don't delete the users home room. + raise I18n.t("room.delete.home_room") if @room == @room.owner.main_room + + # Destroy all recordings then permanently delete the room + delete_all_recordings(@room.bbb_id) + @room.destroy(true) + rescue => e + flash[:alert] = I18n.t("room.delete.fail", error: e) + else + flash[:success] = I18n.t("room.delete.success") + end + + # Redirect to home room if the redirect_back location is the deleted room + return redirect_to @current_user.main_room if request.referer == room_url(@room) + + # Redirect to the location that the user deleted the room from + redirect_back fallback_location: current_user.main_room + end + + # POST /room/join + def join_specific_room + room_uid = params[:join_room][:url].split('/').last + + @room = Room.find_by(uid: room_uid) + return redirect_to cant_create_rooms_path, alert: I18n.t("room.no_room.invalid_room_uid") unless @room + + redirect_to room_path(@room) + end + + # POST /:room_uid/start + def start + logger.info "Support: #{current_user.email} is starting room #{@room.uid}" + + # Join the user in and start the meeting. + opts = default_meeting_options + opts[:user_is_moderator] = true + + # Include the user's choices for the room settings + @room_settings = JSON.parse(@room[:room_settings]) + opts[:mute_on_start] = room_setting_with_config("muteOnStart") + opts[:require_moderator_approval] = room_setting_with_config("requireModeratorApproval") + opts[:record] = record_meeting + + begin + redirect_to join_path(@room, current_user.name, opts, current_user.uid) + rescue BigBlueButton::BigBlueButtonException => e + logger.error("Support: #{@room.uid} start failed: #{e}") + + redirect_to room_path, alert: I18n.t(e.key.to_s.underscore, default: I18n.t("bigbluebutton_exception")) + end + + # Notify users that the room has started. + # Delay 5 seconds to allow for server start, although the request will retry until it succeeds. + NotifyUserWaitingJob.set(wait: 5.seconds).perform_later(@room) + end + + # POST /:room_uid/update_settings + def update_settings + begin + options = params[:room].nil? ? params : params[:room] + raise "Room name can't be blank" if options[:name].blank? + + # Update the rooms values + room_settings_string = create_room_settings_string(options) + + attributes = { + name: options[:name], + } + + 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 + logger.error "Support: Error in updating room settings: #{e}" + flash[:alert] = I18n.t("room.update_settings_error") + end + + redirect_back fallback_location: room_path(@room) + end + + # GET /:room_uid/current_presentation + def current_presentation + attached = @room.presentation.attached? + + # Respond with JSON object of presentation name + respond_to do |format| + format.json { render body: { attached: attached, name: attached ? @room.presentation.filename.to_s : "" }.to_json } + end + end + + # POST /:room_uid/preupload_presenstation + def preupload_presentation + begin + raise "Invalid file type" unless valid_file_type + @room.presentation.attach(room_params[:presentation]) + + flash[:success] = I18n.t("room.preupload_success") + rescue => e + logger.error "Support: Error in updating room presentation: #{e}" + flash[:alert] = I18n.t("room.preupload_error") + end + + redirect_back fallback_location: room_path(@room) + end + + # POST /:room_uid/remove_presenstation + def remove_presentation + begin + @room.presentation.purge + + flash[:success] = I18n.t("room.preupload_remove_success") + rescue => e + logger.error "Support: Error in removing room presentation: #{e}" + flash[:alert] = I18n.t("room.preupload_remove_error") + end + + redirect_back fallback_location: room_path(@room) + end + + # POST /:room_uid/update_shared_access + def shared_access + begin + current_list = @room.shared_users.pluck(:id) + new_list = User.where(uid: params[:add]).pluck(:id) + + # Get the list of users that used to be in the list but were removed + users_to_remove = current_list - new_list + # Get the list of users that are in the new list but not in the current list + users_to_add = new_list - current_list + + # Remove users that are removed + SharedAccess.where(room_id: @room.id, user_id: users_to_remove).delete_all unless users_to_remove.empty? + + # Add users that are added + users_to_add.each do |id| + SharedAccess.create(room_id: @room.id, user_id: id) + end + + flash[:success] = I18n.t("room.shared_access_success") + rescue => e + logger.error "Support: Error in updating room shared access: #{e}" + flash[:alert] = I18n.t("room.shared_access_error") + end + + redirect_back fallback_location: room_path + end + + # POST /:room_uid/remove_shared_access + def remove_shared_access + begin + SharedAccess.find_by!(room_id: @room.id, user_id: current_user).destroy + flash[:success] = I18n.t("room.remove_shared_access_success") + rescue => e + logger.error "Support: Error in removing room shared access: #{e}" + flash[:alert] = I18n.t("room.remove_shared_access_error") + end + + redirect_to current_user.main_room + end + + # GET /:room_uid/shared_users + 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.pluck_to_hash(:uid, :name, :image).to_json } + end + end + + # GET /:room_uid/room_settings + def room_settings + # Respond with JSON object of the room_settings + respond_to do |format| + format.json { render body: @room.room_settings } + end + end + + # GET /:room_uid/logout + def logout + logger.info "Support: #{current_user.present? ? current_user.email : 'Guest'} has left room #{@room.uid}" + + # Redirect the correct page. + redirect_to @room + end + + # POST /:room_uid/login + def login + # 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 + + 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 + + private + + 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", + } + + room_settings.to_json + end + + 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, :moderator_access_code) + end + + # Find the room from the uid. + def find_room + @room = Room.includes(:owner).find_by!(uid: params[:room_uid]) + end + + # Ensure the user either owns the room or is an admin of the room owner or the room is shared with him + def verify_room_ownership_or_admin_or_shared + return redirect_to root_path unless @room.owned_by?(current_user) || + room_shared_with_user || + current_user&.admin_of?(@room.owner, "can_manage_rooms_recordings") + end + + # Ensure the user either owns the room or is an admin of the room owner + def verify_room_ownership_or_admin + return redirect_to root_path if !@room.owned_by?(current_user) && + !current_user&.admin_of?(@room.owner, "can_manage_rooms_recordings") + end + + # Ensure the user owns the room or is allowed to start it + def verify_room_ownership_or_shared + return redirect_to root_path unless @room.owned_by?(current_user) || room_shared_with_user + end + + def validate_accepted_terms + redirect_to terms_path if current_user && !current_user&.accepted_terms + end + + def validate_verified_email + redirect_to account_activation_path(digest: current_user.activation_digest) if current_user && !current_user&.activated? + end + + def verify_room_owner_verified + redirect_to root_path, alert: t("room.unavailable") unless @room.owner.activated? + end + + # Check to make sure the room owner is not pending or banned + def verify_room_owner_valid + redirect_to root_path, alert: t("room.owner_banned") if @room.owner.has_role?(:pending) || @room.owner.has_role?(:denied) + end + + def verify_user_not_admin + redirect_to admins_path if current_user&.has_role?(:super_admin) + end + + def auth_required + @settings.get_value("Room Authentication") == "true" && current_user.nil? + end + + # Checks if the room is shared with the user and room sharing is enabled + def room_shared_with_user + shared_access_allowed ? @room.shared_with?(current_user) : false + end + + def room_limit_exceeded + limit = @settings.get_value("Room Limit").to_i + + # Does not apply to admin or users that aren't signed in + # 15+ option is used as unlimited + return false if current_user&.has_role?(:admin) || limit == 15 + + current_user.rooms.length >= limit + 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 + if recording_consent_required? + room_setting_with_config("recording") + else + true + end + end + + # Checks if the file extension is allowed + def valid_file_type + Rails.configuration.allowed_file_types.split(",") + .include?(File.extname(room_params[:presentation].original_filename.downcase)) + end + + # Gets the room setting based on the option set in the room configuration + def room_setting_with_config(name) + config = case name + when "muteOnStart" + "Room Configuration Mute On Join" + when "requireModeratorApproval" + "Room Configuration Require Moderator" + when "joinModerator" + "Room Configuration All Join Moderator" + when "anyoneCanStart" + "Room Configuration Allow Any Start" + when "recording" + "Room Configuration Recording" + end + + case @settings.get_value(config) + when "enabled" + true + when "optional" + @room_settings[name] + when "disabled" + false + end + end + helper_method :room_setting_with_config +end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 0000000000..2e04ac764a --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,270 @@ +# 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 . + +class SessionsController < ApplicationController + include Authenticator + include Registrar + include Emailer + include LdapAuthenticator + + skip_before_action :verify_authenticity_token, only: [:omniauth, :fail] + before_action :check_user_signup_allowed, only: [:new] + before_action :ensure_unauthenticated_except_twitter, only: [:new, :signin, :ldap_signin] + + # GET /signin + def signin + check_if_twitter_account + + @providers = configured_providers + + if one_provider + provider_path = if Rails.configuration.omniauth_ldap + ldap_signin_path + else + "#{Rails.configuration.relative_url_root}/auth/#{@providers.first}" + end + + redirect_to provider_path + end + end + + # GET /ldap_signin + def ldap_signin + end + + # GET /signup + def new + # Check if the user needs to be invited + if invite_registration + redirect_to root_path, flash: { alert: I18n.t("registration.invite.no_invite") } unless params[:invite_token] + + session[:invite_token] = params[:invite_token] + end + + check_if_twitter_account(true) + + @user = User.new + end + + # POST /users/login + def create + logger.info "Support: #{session_params[:email]} is attempting to login." + + user = User.include_deleted.find_by(email: session_params[:email].downcase) + + is_super_admin = user&.has_role? :super_admin + + # Scope user to domain if the user is not a super admin + user = User.include_deleted.find_by(email: session_params[:email].downcase, provider: @user_domain) unless is_super_admin + + # Check user with that email exists + return redirect_to(signin_path, alert: I18n.t("invalid_credentials")) unless user + + # Check if authenticators have switched + 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]) + # Check that the user is not deleted + return redirect_to root_path, flash: { alert: I18n.t("registration.banned.fail") } if user.deleted? + + unless is_super_admin + # 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 + 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) + end + + # POST /users/logout + def destroy + logout + redirect_to root_path + end + + # GET/POST /auth/:provider/callback + def omniauth + @auth = request.env['omniauth.auth'] + + begin + process_signin + rescue => e + logger.error "Error authenticating via omniauth: #{e}" + omniauth_fail + end + end + + # POST /auth/failure + def omniauth_fail + if params[:message].nil? + redirect_to root_path, alert: I18n.t("omniauth_error") + else + redirect_to root_path, alert: I18n.t("omniauth_specific_error", error: params["message"]) + end + end + + # GET /auth/ldap + def ldap + ldap_config = {} + ldap_config[:host] = ENV['LDAP_SERVER'] + 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] = case ENV['LDAP_METHOD'] + when 'ssl' + 'simple_tls' + when 'tls' + 'start_tls' + end + ldap_config[:base] = ENV['LDAP_BASE'] + ldap_config[:filter] = ENV['LDAP_FILTER'] + 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")) + end + + result = send_ldap_request(params[:session], ldap_config) + + return redirect_to(ldap_signin_path, alert: I18n.t("invalid_credentials")) unless result + + @auth = parse_auth(result.first, ENV['LDAP_ROLE_FIELD'], ENV['LDAP_ATTRIBUTE_MAPPING']) + + begin + process_signin + rescue => e + logger.error "Support: Error authenticating via omniauth: #{e}" + omniauth_fail + end + end + + private + + # Verify that GreenLight is configured to allow user signup. + def check_user_signup_allowed + redirect_to root_path unless Rails.configuration.allow_user_signup + end + + def session_params + params.require(:session).permit(:email, :password) + end + + def one_provider + (!allow_user_signup? || !allow_greenlight_accounts?) && @providers.count == 1 && + !Rails.configuration.loadbalanced_configuration + end + + def check_user_exists + User.exists?(social_uid: @auth['uid'], provider: current_provider) + end + + def check_user_deleted(email) + User.deleted.exists?(email: email, provider: @user_domain) + end + + def check_auth_deleted + User.deleted.exists?(social_uid: @auth['uid'], provider: current_provider) + end + + def current_provider + @auth['provider'] == "bn_launcher" ? @auth['info']['customer'] : @auth['provider'] + end + + # Check if the user already exists, if not then check for invitation + def passes_invite_reqs + return true if @user_exists + + invitation = check_user_invited("", session[:invite_token], @user_domain) + invitation[:present] + end + + def process_signin + @user_exists = check_user_exists + + if !@user_exists && @auth['provider'] == "twitter" + return redirect_to root_path, flash: { alert: I18n.t("registration.deprecated.twitter_signup") } + end + + # Check if user is deleted + return redirect_to root_path, flash: { alert: I18n.t("registration.banned.fail") } if check_auth_deleted + + # If using invitation registration method, make sure user is invited + return redirect_to root_path, flash: { alert: I18n.t("registration.invite.no_invite") } unless passes_invite_reqs + + # Switch the user to a social account if they exist under the same email with no social uid + switch_account_to_social if !@user_exists && auth_changed_to_social?(@auth['info']['email']) + + user = User.from_omniauth(@auth) + + logger.info "Support: Auth user #{user.email} is attempting to login." + + # Add pending role if approval method and is a new user + if approval_registration && !@user_exists + user.set_role :pending + + # Inform admins that a user signed up if emails are turned on + send_approval_user_signup_email(user) + + return redirect_to root_path, flash: { success: I18n.t("registration.approval.signup") } + end + + send_invite_user_signup_email(user) if invite_registration && !@user_exists + + user.set_role(initial_user_role(user.email)) if !@user_exists && user.role.nil? + + login(user) + + if @auth['provider'] == "twitter" + flash[:alert] = if allow_user_signup? && allow_greenlight_accounts? + I18n.t("registration.deprecated.twitter_signin", link: signup_path(old_twitter_user_id: user.id)) + else + I18n.t("registration.deprecated.twitter_signin", link: signin_path(old_twitter_user_id: user.id)) + end + end + end + + # Send the user a password reset email to allow them to set their password + def switch_account_to_local(user) + logger.info "Switching social account to local account for #{user.uid}" + + # Send the user a reset password email + send_password_reset_email(user, user.create_reset_digest) + + # Overwrite the flash with a more descriptive message if successful + flash[:success] = I18n.t("reset_password.auth_change") if flash[:success].present? + + redirect_to signin_path + end + + # Set the user's social id to the new id being passed + def switch_account_to_social + user = User.find_by(email: @auth['info']['email'], provider: @user_domain, social_uid: nil) + + logger.info "Switching account to social account for #{user.uid}" + + # Set the user's social id to the one being returned from auth + user.update_attribute(:social_uid, @auth['uid']) + end +end diff --git a/app/controllers/themes_controller.rb b/app/controllers/themes_controller.rb new file mode 100644 index 0000000000..de38a8bc8e --- /dev/null +++ b/app/controllers/themes_controller.rb @@ -0,0 +1,42 @@ +# 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 . + +class ThemesController < ApplicationController + skip_before_action :block_unknown_hosts, :redirect_to_https, :maintenance_mode?, :migration_error?, :user_locale, + :check_admin_password, :check_user_role + + # GET /primary + def index + color = @settings.get_value("Primary Color") || Rails.configuration.primary_color_default + lighten_color = @settings.get_value("Primary Color Lighten") || Rails.configuration.primary_color_lighten_default + darken_color = @settings.get_value("Primary Color Darken") || Rails.configuration.primary_color_darken_default + + file_name = Rails.root.join('lib', 'assets', '_primary_themes.scss') + @file_contents = File.read(file_name) + + # Include the variables and covert scss file to css + @compiled = SassC::Engine.new("$primary-color:#{color};" \ + "$primary-color-lighten:#{lighten_color};" \ + "$primary-color-darken:#{darken_color};" + + @file_contents, syntax: :scss).render + + respond_to do |format| + format.css { render body: @compiled } + end + end +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 0000000000..008de47792 --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,254 @@ +# 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 . + +class UsersController < ApplicationController + include Pagy::Backend + include Authenticator + include Emailer + include Registrar + include Recorder + include Rolify + + before_action :find_user, only: [:edit, :change_password, :delete_account, :update, :update_password] + before_action :ensure_unauthenticated_except_twitter, only: [:create] + before_action :check_user_signup_allowed, only: [:create] + before_action :check_admin_of, only: [:edit, :change_password, :delete_account] + + # POST /u + def create + @user = User.new(user_params) + @user.provider = @user_domain + + # User or recpatcha is not valid + render("sessions/new") && return unless valid_user_or_captcha + + # Redirect to root if user token is either invalid or expired + return redirect_to root_path, flash: { alert: I18n.t("registration.invite.fail") } unless passes_invite_reqs + + # User has passed all validations required + @user.save + + logger.info "Support: #{@user.email} user has been created." + + # Set user to pending and redirect if Approval Registration is set + if approval_registration + @user.set_role :pending + + return redirect_to root_path, + flash: { success: I18n.t("registration.approval.signup") } unless Rails.configuration.enable_email_verification + end + + send_registration_email + + # Sign in automatically if email verification is disabled or if user is already verified. + if !Rails.configuration.enable_email_verification || @user.email_verified + @user.set_role(initial_user_role(@user.email)) + + login(@user) && return + end + + send_activation_email(@user, @user.create_activation_token) + + redirect_to root_path + end + + # GET /u/:user_uid/edit + def edit + redirect_to root_path unless current_user + end + + # GET /u/:user_uid/change_password + def change_password + redirect_to edit_user_path unless current_user.greenlight_account? + end + + # GET /u/:user_uid/delete_account + def delete_account + end + + # POST /u/:user_uid/edit + def update + if session[:prev_url].present? + path = session[:prev_url] + session.delete(:prev_url) + else + path = admins_path + end + + redirect_path = current_user.admin_of?(@user, "can_manage_users") ? path : edit_user_path(@user) + + unless can_edit_user?(@user, current_user) + params[:user][:name] = @user.name + params[:user][:email] = @user.email + end + + if @user.update_attributes(user_params) + @user.update_attributes(email_verified: false) if user_params[:email] != @user.email + + user_locale(@user) + + if update_roles(params[:user][:role_id]) + return redirect_to redirect_path, flash: { success: I18n.t("info_update_success") } + else + flash[:alert] = I18n.t("administrator.roles.invalid_assignment") + end + end + + render :edit + end + + # POST /u/:user_uid/change_password + def update_password + # Update the users password. + if @user.authenticate(user_params[:password]) + # Verify that the new passwords match. + if user_params[:new_password] == user_params[:password_confirmation] + @user.password = user_params[:new_password] + else + # New passwords don't match. + @user.errors.add(:password_confirmation, "doesn't match") + end + else + # Original password is incorrect, can't update. + @user.errors.add(:password, "is incorrect") + end + + # Notify the user that their account has been updated. + return redirect_to change_password_path, + flash: { success: I18n.t("info_update_success") } if @user.errors.empty? && @user.save + + # redirect_to change_password_path + render :change_password + end + + # DELETE /u/:user_uid + def destroy + # Include deleted users in the check + admin_path = request.referer.present? ? request.referer : admins_path + @user = User.include_deleted.find_by(uid: params[:user_uid]) + + logger.info "Support: #{current_user.email} is deleting #{@user.email}." + + self_delete = current_user == @user + redirect_url = self_delete ? root_path : admin_path + + begin + if current_user && (self_delete || current_user.admin_of?(@user, "can_manage_users")) + # Permanently delete if the user is deleting themself + perm_delete = self_delete || (params[:permanent].present? && params[:permanent] == "true") + + # Permanently delete the rooms under the user if they have not been reassigned + if perm_delete + @user.rooms.include_deleted.each do |room| + # Destroy all recordings then permanently delete the room + delete_all_recordings(room.bbb_id) + room.destroy(true) + end + end + + @user.destroy(perm_delete) + + # Log the user out if they are deleting themself + session.delete(:user_id) if self_delete + + return redirect_to redirect_url, flash: { success: I18n.t("administrator.flash.delete") } unless self_delete + else + flash[:alert] = I18n.t("administrator.flash.delete_fail") + end + rescue => e + logger.error "Support: Error in user deletion: #{e}" + flash[:alert] = I18n.t(params[:message], default: I18n.t("administrator.flash.delete_fail")) + end + + redirect_to redirect_url + end + + # GET /u/:user_uid/recordings + def recordings + if current_user && current_user.uid == params[:user_uid] + @search, @order_column, @order_direction, recs = + all_recordings(current_user.rooms.pluck(:bbb_id), params.permit(:search, :column, :direction), true) + @pagy, @recordings = pagy_array(recs) + else + redirect_to root_path + end + end + + # GET | POST /terms + def terms + redirect_to '/404' unless Rails.configuration.terms + + if params[:accept] == "true" + current_user.update_attributes(accepted_terms: true) + login(current_user) + end + end + + # GET /shared_access_list + def shared_access_list + # Don't allow searchs unless atleast 3 characters are passed + return redirect_to '/404' if params[:search].length < 3 + + roles_can_appear = [] + Role.where(provider: @user_domain).each do |role| + roles_can_appear << role.name if role.get_permission("can_appear_in_share_list") && role.priority >= 0 + end + + initial_list = User.where.not(uid: params[:owner_uid]) + .with_role(roles_can_appear) + .shared_list_search(params[:search]) + + 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.pluck_to_hash(:uid, :name).to_json } + end + end + + private + + def find_user + @user = User.find_by(uid: params[:user_uid]) + end + + # Verify that GreenLight is configured to allow user signup. + def check_user_signup_allowed + redirect_to root_path unless Rails.configuration.allow_user_signup + end + + def user_params + params.require(:user).permit(:name, :email, :image, :password, :password_confirmation, + :new_password, :provider, :accepted_terms, :language) + end + + def send_registration_email + if invite_registration + send_invite_user_signup_email(@user) + elsif approval_registration + send_approval_user_signup_email(@user) + end + end + + # Checks that the user is allowed to edit this user + def check_admin_of + redirect_to root_path if current_user && + @user != current_user && + !current_user.admin_of?(@user, "can_manage_users") + end +end diff --git a/app/helpers/admins_helper.rb b/app/helpers/admins_helper.rb new file mode 100644 index 0000000000..f21f877b05 --- /dev/null +++ b/app/helpers/admins_helper.rb @@ -0,0 +1,147 @@ +# 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 . + +module AdminsHelper + include Pagy::Frontend + + # Server Rooms + + # Gets the email of the room owner to which the recording belongs to + def recording_owner_email(room_id) + Room.find_by(bbb_id: room_id).owner.email.presence || Room.find_by(bbb_id: room_id).owner.username + end + + # Get the room status to display in the Server Rooms table + def room_is_running(id) + @running_room_bbb_ids.include?(id) + end + + # Site Settings + + def admin_invite_registration + controller_name == "admins" && action_name == "index" && + @settings.get_value("Registration Method") == Rails.configuration.registration_methods[:invite] + end + + def room_authentication_string + if @settings.get_value("Room Authentication") == "true" + I18n.t("administrator.site_settings.authentication.enabled") + else + I18n.t("administrator.site_settings.authentication.disabled") + end + end + + def shared_access_string + if @settings.get_value("Shared Access") == "true" + I18n.t("administrator.site_settings.authentication.enabled") + else + I18n.t("administrator.site_settings.authentication.disabled") + end + end + + def preupload_string + if @settings.get_value("Preupload Presentation") == "true" + I18n.t("administrator.site_settings.authentication.enabled") + else + I18n.t("administrator.site_settings.authentication.disabled") + end + end + + def recording_default_visibility_string + if @settings.get_value("Default Recording Visibility") == "public" + I18n.t("recording.visibility.public") + else + I18n.t("recording.visibility.unlisted") + end + end + + def registration_method_string + case @settings.get_value("Registration Method") + when Rails.configuration.registration_methods[:open] + I18n.t("administrator.site_settings.registration.methods.open") + when Rails.configuration.registration_methods[:invite] + I18n.t("administrator.site_settings.registration.methods.invite") + when Rails.configuration.registration_methods[:approval] + I18n.t("administrator.site_settings.registration.methods.approval") + end + end + + def require_consent_string + if @settings.get_value("Require Recording Consent") == "true" + I18n.t("administrator.site_settings.authentication.enabled") + else + I18n.t("administrator.site_settings.authentication.disabled") + 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 + t("administrator.site_settings.log_level.debug") + when 1 + t("administrator.site_settings.log_level.info") + when 2 + t("administrator.site_settings.log_level.warn") + when 3 + t("administrator.site_settings.log_level.error") + when 4 + t("administrator.site_settings.log_level.fatal") + when 5 + t("administrator.site_settings.log_level.unknown") + end + end + + def show_log_dropdown + current_user.has_role?(:super_admin) || !Rails.configuration.loadbalanced_configuration + end + + def room_limit_number + @settings.get_value("Room Limit").to_i + end + + def email_mapping + @settings.get_value("Email Mapping") + end + + # Room Configuration + + def room_configuration_string(name) + case @settings.get_value(name) + when "enabled" + t("administrator.room_configuration.options.enabled") + when "optional" + t("administrator.room_configuration.options.optional") + when "disabled" + t("administrator.room_configuration.options.disabled") + end + end + + # Roles + + def edit_disabled + @edit_disabled ||= @selected_role.priority <= current_user.role.priority + end +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 2d1a833794..238cddf3ca 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,31 +1,140 @@ +# frozen_string_literal: true + # BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. # -# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below). +# 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. # -# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY +# 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 Greenlight; if not, see . +# with BigBlueButton; if not, see . -# frozen_string_literal: true +require 'bbb_api' +require 'uri' module ApplicationHelper - def branding_image - SettingGetter.new(setting_name: 'BrandingImage', provider: current_provider).call + # Determines which providers can show a login button in the login modal. + def iconset_providers + providers = configured_providers & [:google, :twitter, :office365, :openid_connect, :ldap] + + providers.delete(:twitter) if session[:old_twitter_user_id] + + providers + end + + # Generates the login URL for a specific provider. + def omniauth_login_url(provider) + if provider == :ldap + ldap_signin_path + else + "#{Rails.configuration.relative_url_root}/auth/#{provider}" + end + end + + # Determines if a form field needs the is-invalid class. + def form_is_invalid?(obj, key) + 'is-invalid' unless obj.errors.messages[key].empty? + end + + # Return all the translations available in the client side through javascript + def current_translations + @translations ||= I18n.backend.send(:translations) + @translations[I18n.locale] + end + + # Return the fallback translations available in the client side through javascript + def fallback_translations + @fallback_translations ||= I18n.backend.send(:translations) + @fallback_translations[I18n.default_locale] + end + + # 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 controller_name == "admins" && action_name == "index" && current_user.has_role?(:super_admin) + return "active" if controller_name == "rooms" && home_actions.include?(action_name) + "" + end + + def role_colour(role) + role.colour || Rails.configuration.primary_color_default end - def page_title - match = request&.url&.match('\/rooms\/(\w{3}-\w{3}-\w{3}-\w{3})') - return 'BigBlueButton' if match.blank? + def translated_role_name(role) + case role.name + when "denied" + I18n.t("roles.banned") + when "pending" + I18n.t("roles.pending") + when "admin" + I18n.t("roles.admin") + when "user" + I18n.t("roles.user") + else + role.name + end + end + + def can_reset_password + # Check if admin is editting user and user is a greenlight account + Rails.configuration.enable_email_verification && + Rails.application.routes.recognize_path(request.env['PATH_INFO'])[:action] == "edit_user" && + @user.greenlight_account? + end + + def google_analytics_url + "https://www.googletagmanager.com/gtag/js?id=#{ENV['GOOGLE_ANALYTICS_TRACKING_ID']}" + end + + # Checks to make sure the image url returns 200 and is of type image + def valid_url?(input) + url = URI.parse(input) + + # Don't allow reference to own site + return false if url.host == request.host + + # 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) + return response.code == "200" && response['Content-Type'].start_with?('image') + end + rescue + false + end + + # Specifies which title should be the tab title and returns original string + def title(page_title) + # Only set the content_for if not already set on the page so that only the first title appears as the tab title + content_for(:page_title) { page_title } if content_for(:page_title).blank? + page_title + end + + # Indicates whether the recording tables should be hidden + def hide_recording_tables + return false unless recording_consent_required? + @settings.get_value("Room Configuration Recording") == "disabled" + end + + # Hide the signin buttons if there is an error on the page + def show_signin + !@hide_signin.present? + end - room_name = Room.find_by(friendly_id: match[1])&.name - room_name || 'BigBlueButton' + # Returns a more friendly/readable date time object + def view_date(date) + return "" if date.nil? # Handle invalid dates + local_time(date, "%b %d, %Y %-I:%M%P") end end diff --git a/app/helpers/recordings_helper.rb b/app/helpers/recordings_helper.rb new file mode 100644 index 0000000000..30784485ed --- /dev/null +++ b/app/helpers/recordings_helper.rb @@ -0,0 +1,55 @@ +# 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 . + +module RecordingsHelper + # 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 + playbacks.each do |playback| + length = playback[:length] + return recording_length_string(length) unless length.zero? + end + # Return '< 1 min' if length values are zero + "< 1 min" + end + + # Prevents single images from erroring when not passed as an array. + def safe_recording_images(images) + Array.wrap(images) + end + + def room_uid_from_bbb(bbb_id) + Room.find_by(bbb_id: bbb_id)[:uid] + end + + # returns whether recording thumbnails are enabled on the server + def recording_thumbnails? + Rails.configuration.recording_thumbnails + end + + private + + # Returns length of the recording as a string + def recording_length_string(len) + if len > 60 + "#{(len / 60).to_i} h #{len % 60} min" + else + "#{len} min" + end + end +end diff --git a/app/helpers/rooms_helper.rb b/app/helpers/rooms_helper.rb new file mode 100644 index 0000000000..229577ca83 --- /dev/null +++ b/app/helpers/rooms_helper.rb @@ -0,0 +1,69 @@ +# 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 . + +module RoomsHelper + # Helper to generate the path to a Google Calendar event creation + # It will have its title set as the room name, and the location as the URL to the room + def google_calendar_path + "http://calendar.google.com/calendar/r/eventedit?text=#{@room.name}&location=#{request.base_url + request.fullpath}" + end + + def room_authentication_required + @settings.get_value("Room Authentication") == "true" && + current_user.nil? + end + + def current_room_exceeds_limit(room) + # Get how many rooms need to be deleted to reach allowed room number + limit = @settings.get_value("Room Limit").to_i + + return false if current_user&.has_role?(:admin) || limit == 15 + + @diff = current_user.rooms.count - limit + @diff.positive? && current_user.rooms.pluck(:id).index(room.id) + 1 > limit + end + + def room_configuration(name) + @settings.get_value(name) + end + + def preupload_allowed? + @settings.get_value("Preupload Presentation") == "true" + end + + def display_joiner_consent + # If the require consent setting is checked, then check the room setting, else, set to false + if recording_consent_required? + room_setting_with_config("recording") + else + false + end + end + + # Array of recording formats not to show for public recordings + 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/theming_helper.rb b/app/helpers/theming_helper.rb new file mode 100644 index 0000000000..f6754f3116 --- /dev/null +++ b/app/helpers/theming_helper.rb @@ -0,0 +1,43 @@ +# 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 . + +module ThemingHelper + # Returns the logo based on user's provider + def logo_image + @settings.get_value("Branding Image") || Rails.configuration.branding_image_default + end + + # Returns the legal URL based on user's provider + def legal_url + @settings.get_value("Legal URL") || "" + end + + # Returns the privacy policy URL based on user's provider + def privpolicy_url + @settings.get_value("Privacy Policy URL") || "" + end + + # Returns the primary color based on user's provider + def user_color + @settings.get_value("Primary Color") || Rails.configuration.primary_color_default + end + + def maintenance_banner + @settings.get_value("Maintenance Banner") + end +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 0000000000..7cc0198405 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,73 @@ +# 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 'i18n/language/mapping' + +module UsersHelper + include I18n::Language::Mapping + + def recaptcha_enabled? + Rails.configuration.recaptcha_enabled + end + + def disabled_roles(user) + current_user_role = current_user.role + + # Admins are able to remove the admin role from other admins + # For all other roles they can only add/remove roles with a higher priority + disallowed_roles = if current_user_role.name == "admin" + Role.editable_roles(@user_domain).where("priority < #{current_user_role.priority}") + .pluck(:id) + else + Role.editable_roles(@user_domain).where("priority <= #{current_user_role.priority}") + .pluck(:id) + end + + [user.role.id] + disallowed_roles + end + + # Returns language selection options for user edit + def language_options + locales = I18n.available_locales + language_opts = [["<<<< #{t('language_default')} >>>>", "default"]] + 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 + end + + # Returns a list of roles that the user can have + def role_options + Role.editable_roles(@user_domain).where("priority >= ?", current_user.role.priority).by_priority + end + + # Parses markdown for rendering. + def markdown(text) + markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, + no_intra_emphasis: true, + fenced_code_blocks: true, + disable_indented_code_blocks: true, + autolink: true, + tables: true, + underline: true, + highlight: true) + + markdown.render(text).html_safe + end +end diff --git a/app/javascript/App.jsx b/app/javascript/App.jsx deleted file mode 100644 index f8a33f3400..0000000000 --- a/app/javascript/App.jsx +++ /dev/null @@ -1,131 +0,0 @@ -// BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -// -// Copyright (c) 2022 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. -// -// Greenlight 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 Greenlight; if not, see . - -import React, { useCallback, useEffect, useState } from 'react'; -import { Container, Form, Spinner } from 'react-bootstrap'; -import { - Outlet, useLocation, useNavigate, useSearchParams, -} from 'react-router-dom'; -import i18next from 'i18next'; -import { useTranslation } from 'react-i18next'; -import { ToastContainer, toast } from 'react-toastify'; -import Header from './components/shared_components/Header'; -import { useAuth } from './contexts/auth/AuthProvider'; -import Footer from './components/shared_components/Footer'; -import useSiteSetting from './hooks/queries/site_settings/useSiteSetting'; -import Title from './components/shared_components/utilities/Title'; -import useEnv from './hooks/queries/env/useEnv'; - -export default function App() { - const currentUser = useAuth(); - const location = useLocation(); - const navigate = useNavigate(); - const [searchParams] = useSearchParams(); - const { data: env } = useEnv(); - const autoSignIn = searchParams.get('sso'); - const [formElement, setFormElement] = useState(null); - - // check for the maintenance banner - const maintenanceBanner = useSiteSetting(['Maintenance']); - - // useEffect hook for running notify maintenance banner on page load - useEffect(() => { - if (maintenanceBanner.data) { - const toastId = toast.info(maintenanceBanner.data, { - position: 'top-center', - autoClose: false, - hideProgressBar: true, - closeOnClick: true, - pauseOnHover: true, - draggable: true, - progress: undefined, - theme: 'light', - className: 'text-center maintenance-toast', - }); - localStorage.setItem('maintenanceBannerId', toastId); - } - }, [maintenanceBanner.data]); - - const formRef = useCallback((node) => { - if (node) { - setFormElement(node); - } - }, []); - - // Handle sso login through parameter - useEffect(() => { - if (autoSignIn && currentUser.signed_in) { navigate('/', { replace: true }); } - if (!env || !autoSignIn || !formElement) return; - - if (env.EXTERNAL_AUTH) { - // eslint-disable-next-line no-unused-expressions - formElement.requestSubmit?.() || formElement.submit(); - } else { - navigate('/signin', { replace: true }); - } - }, [autoSignIn, env, formElement]); - - // Pages that do not need a header: SignIn, SignUp and JoinMeeting (if the user is not signed in) - const homePage = location.pathname === '/'; - const pageHeight = (homePage || currentUser.signed_in) ? 'regular-height' : 'no-header-height'; - - // i18n - const { i18n } = useTranslation(); - useEffect(() => { - i18n.changeLanguage(currentUser?.language); - }, [currentUser?.language]); - - // Greenlight V3 brand-color theming - const { isLoading, data: brandColors } = useSiteSetting(['PrimaryColor', 'PrimaryColorLight']); - - if (isLoading) return null; - - document.documentElement.style.setProperty('--brand-color', brandColors.PrimaryColor); - document.documentElement.style.setProperty('--brand-color-light', brandColors.PrimaryColorLight); - document.documentElement.style.setProperty('--toastify-color-success', brandColors.PrimaryColor); - - return ( - <> - BigBlueButton - { autoSignIn - ? ( - - - Signing you in… - - -
    - - -
    -
    - ) : ( - <> - {(homePage || currentUser.signed_in) &&
    } - - - - -